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

ruby-changes:22770

From: nobu <ko1@a...>
Date: Sun, 26 Feb 2012 11:27:02 +0900 (JST)
Subject: [ruby-changes:22770] nobu:r34819 (trunk): * compile.c (iseq_compile_each): call on special object instead of

nobu	2012-02-26 11:26:49 +0900 (Sun, 26 Feb 2012)

  New Revision: 34819

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=34819

  Log:
    * compile.c (iseq_compile_each): call on special object instead of
      self.  since stabby lambda is a syntax, so it should not be
      affected by the context.  [ruby-core:42349][Bug #5966]
    * insns.def (send): no special deal for FCALL.  self should be put
      on TOS instead.

  Modified files:
    trunk/ChangeLog
    trunk/compile.c
    trunk/insns.def
    trunk/test/ruby/test_lambda.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 34818)
+++ ChangeLog	(revision 34819)
@@ -1,3 +1,12 @@
+Sun Feb 26 11:26:44 2012  Nobuyoshi Nakada  <nobu@r...>
+
+	* compile.c (iseq_compile_each): call on special object instead of
+	  self.  since stabby lambda is a syntax, so it should not be
+	  affected by the context.  [ruby-core:42349][Bug #5966]
+
+	* insns.def (send): no special deal for FCALL.  self should be put
+	  on TOS instead.
+
 Sun Feb 26 05:35:43 2012  NARUSE, Yui  <naruse@r...>
 
 	* error.c (report_bug): use buf and snprintf to avoid consuming stack.
Index: insns.def
===================================================================
--- insns.def	(revision 34818)
+++ insns.def	(revision 34819)
@@ -1012,7 +1012,7 @@
     ID id = op_id;
 
     /* get receiver */
-    recv = (flag & VM_CALL_FCALL_BIT) ? GET_SELF() : TOPN(num);
+    recv = TOPN(num);
     klass = CLASS_OF(recv);
     me = vm_method_search(id, klass, ic);
     CALL_METHOD(num, blockptr, flag, id, me, recv);
Index: compile.c
===================================================================
--- compile.c	(revision 34818)
+++ compile.c	(revision 34819)
@@ -208,7 +208,7 @@
   ADD_SEND_R((seq), (line), (id), (argc), (VALUE)Qfalse, (VALUE)INT2FIX(0))
 
 #define ADD_CALL_RECEIVER(seq, line) \
-  ADD_INSN((seq), (line), putnil)
+  ADD_INSN((seq), (line), putself)
 
 #define ADD_CALL(seq, line, id, argc) \
   ADD_SEND_R((seq), (line), (id), (argc), (VALUE)Qfalse, (VALUE)INT2FIX(VM_CALL_FCALL_BIT))
@@ -5098,7 +5098,7 @@
 	/* compile same as lambda{...} */
 	VALUE block = NEW_CHILD_ISEQVAL(node->nd_body, make_name_for_block(iseq), ISEQ_TYPE_BLOCK, nd_line(node));
 	VALUE argc = INT2FIX(0);
-	ADD_CALL_RECEIVER(ret, nd_line(node));
+	ADD_INSN1(ret, nd_line(node), putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
 	ADD_CALL_WITH_BLOCK(ret, nd_line(node), ID2SYM(idLambda), argc, block);
 
 	if (poped) {
Index: test/ruby/test_lambda.rb
===================================================================
--- test/ruby/test_lambda.rb	(revision 34818)
+++ test/ruby/test_lambda.rb	(revision 34819)
@@ -63,4 +63,11 @@
   def foo
     assert_equal(nil, ->(&b){ b }.call)
   end
+
+  def test_in_basic_object
+    bug5966 = '[ruby-core:42349]'
+    called = false
+    BasicObject.new.instance_eval {->() {called = true}.()}
+    assert_equal(true, called, bug5966)
+  end
 end

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

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