[前][次][番号順一覧][スレッド一覧]

ruby-changes:4663

From: ko1@a...
Date: Tue, 22 Apr 2008 22:52:02 +0900 (JST)
Subject: [ruby-changes:4663] knu - Ruby:r16157 (ruby_1_8): * eval.c (rb_proc_new, YIELD_FUNC_LAMBDA): Add a new nd_state

knu	2008-04-22 22:51:44 +0900 (Tue, 22 Apr 2008)

  New Revision: 16157

  Modified files:
    branches/ruby_1_8/ChangeLog
    branches/ruby_1_8/eval.c
    branches/ruby_1_8/intern.h
    branches/ruby_1_8/object.c

  Log:
    * eval.c (rb_proc_new, YIELD_FUNC_LAMBDA): Add a new nd_state
      YIELD_FUNC_LAMBDA which avoids automatic `avalue' conversion for
      arguments.  This fixes a bug where [1,[2,3]].map(&:object_id)
      fails.
    
    * intern.h, object.c: Hide rb_proc_new() from intern.h.  It should
      not be considered an official API function yet.


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/intern.h?r1=16157&r2=16156&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/ChangeLog?r1=16157&r2=16156&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/object.c?r1=16157&r2=16156&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/eval.c?r1=16157&r2=16156&diff_format=u

Index: ruby_1_8/intern.h
===================================================================
--- ruby_1_8/intern.h	(revision 16156)
+++ ruby_1_8/intern.h	(revision 16157)
@@ -194,7 +194,6 @@
 VALUE rb_class_new_instance _((int, VALUE*, VALUE));
 VALUE rb_block_proc _((void));
 VALUE rb_f_lambda _((void));
-VALUE rb_proc_new _((VALUE (*)(ANYARGS/* VALUE yieldarg[, VALUE procarg] */), VALUE));
 VALUE rb_proc_call _((VALUE, VALUE));
 VALUE rb_obj_method _((VALUE, VALUE));
 VALUE rb_protect _((VALUE (*)(VALUE), VALUE, int*));
Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog	(revision 16156)
+++ ruby_1_8/ChangeLog	(revision 16157)
@@ -1,3 +1,13 @@
+Tue Apr 22 22:43:05 2008  Akinori MUSHA  <knu@i...>
+
+	* eval.c (rb_proc_new, YIELD_FUNC_LAMBDA): Add a new nd_state
+	  YIELD_FUNC_LAMBDA which avoids automatic `avalue' conversion for
+	  arguments.  This fixes a bug where [1,[2,3]].map(&:object_id)
+	  fails.
+
+	* intern.h, object.c: Hide rb_proc_new() from intern.h.  It should
+	  not be considered an official API function yet.
+
 Tue Apr 22 21:24:32 2008  Akinori MUSHA  <knu@i...>
 
 	* eval.c (rb_proc_new): Turn the BLOCK_LAMBDA flag on.
Index: ruby_1_8/object.c
===================================================================
--- ruby_1_8/object.c	(revision 16156)
+++ ruby_1_8/object.c	(revision 16157)
@@ -1225,6 +1225,8 @@
     return rb_apply(obj, (ID)mid, args);
 }
 
+VALUE rb_proc_new _((VALUE (*)(ANYARGS/* VALUE yieldarg[, VALUE procarg] */), VALUE));
+
 /*
  * call-seq:
  *   sym.to_proc
Index: ruby_1_8/eval.c
===================================================================
--- ruby_1_8/eval.c	(revision 16156)
+++ ruby_1_8/eval.c	(revision 16157)
@@ -1111,6 +1111,7 @@
 #define YIELD_PUBLIC_DEF  4
 #define YIELD_FUNC_AVALUE 1
 #define YIELD_FUNC_SVALUE 2
+#define YIELD_FUNC_LAMBDA 3
 
 static VALUE rb_call _((VALUE,VALUE,ID,int,const VALUE*,int,VALUE));
 static VALUE module_setup _((VALUE,NODE*));
@@ -5014,12 +5015,18 @@
     if ((state = EXEC_TAG()) == 0) {
       redo:
 	if (nd_type(node) == NODE_CFUNC || nd_type(node) == NODE_IFUNC) {
-	    if (node->nd_state == YIELD_FUNC_AVALUE) {
+	    switch (node->nd_state) {
+	      case YIELD_FUNC_LAMBDA:
 		if (!avalue) {
+		    val = rb_ary_new3(1, val);
+		}
+		break;
+	      case YIELD_FUNC_AVALUE:
+		if (!avalue) {
 		    val = svalue_to_avalue(val);
 		}
-	    }
-	    else {
+		break;
+	      default:
 		if (avalue) {
 		    val = avalue_to_svalue(val);
 		}
@@ -9635,7 +9642,7 @@
     VALUE proc = rb_iterate((VALUE(*)_((VALUE)))mproc, 0, func, val);
 
     Data_Get_Struct(proc, struct BLOCK, data);
-    data->body->nd_state = YIELD_FUNC_AVALUE;
+    data->body->nd_state = YIELD_FUNC_LAMBDA;
     data->flags |= BLOCK_LAMBDA;
     return proc;
 }

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]