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

ruby-changes:16648

From: nobu <ko1@a...>
Date: Wed, 14 Jul 2010 20:24:08 +0900 (JST)
Subject: [ruby-changes:16648] Ruby:r28642 (trunk): * eval.c (frame_func_id), vm_eval.c (rb_iterate),

nobu	2010-07-14 20:23:10 +0900 (Wed, 14 Jul 2010)

  New Revision: 28642

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

  Log:
    * eval.c (frame_func_id), vm_eval.c (rb_iterate),
      vm_insnhelper.c (vm_yield_with_cfunc): as the name of a C-level
      block, use the current method ID at the creation point.
      [ruby-dev:41852]

  Added directories:
    trunk/ext/-test-/
    trunk/ext/-test-/bug-3571/
    trunk/test/-ext-/
  Added files:
    trunk/ext/-test-/bug-3571/bug.c
    trunk/ext/-test-/bug-3571/extconf.rb
    trunk/test/-ext-/test_bug-3571.rb
  Modified files:
    trunk/ChangeLog
    trunk/eval.c
    trunk/vm_eval.c
    trunk/vm_insnhelper.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 28641)
+++ ChangeLog	(revision 28642)
@@ -1,3 +1,10 @@
+Wed Jul 14 20:23:08 2010  Nobuyoshi Nakada  <nobu@r...>
+
+	* eval.c (frame_func_id), vm_eval.c (rb_iterate),
+	  vm_insnhelper.c (vm_yield_with_cfunc): as the name of a C-level
+	  block, use the current method ID at the creation point.
+	  [ruby-dev:41852]
+
 Wed Jul 14 18:18:05 2010  NARUSE, Yui  <naruse@r...>
 
 	* regexec.c (match_at): add end point to enclen's argument.
Index: vm_eval.c
===================================================================
--- vm_eval.c	(revision 28641)
+++ vm_eval.c	(revision 28642)
@@ -832,6 +832,7 @@
     rb_thread_t *th = GET_THREAD();
     rb_control_frame_t *volatile cfp = th->cfp;
 
+    node->nd_aid = rb_frame_this_func();
     TH_PUSH_TAG(th);
     state = TH_EXEC_TAG();
     if (state == 0) {
Index: eval.c
===================================================================
--- eval.c	(revision 28641)
+++ eval.c	(revision 28642)
@@ -756,10 +756,13 @@
 {
     rb_iseq_t *iseq = cfp->iseq;
     if (!iseq) {
+	if (!cfp->me) return 0;
 	return cfp->me->def->original_id;
     }
     while (iseq) {
 	if (RUBY_VM_IFUNC_P(iseq)) {
+	    NODE *ifunc = (NODE *)iseq;
+	    if (ifunc->nd_aid) return ifunc->nd_aid;
 	    return rb_intern("<ifunc>");
 	}
 	if (iseq->defined_method_id) {
Index: ext/-test-/bug-3571/extconf.rb
===================================================================
--- ext/-test-/bug-3571/extconf.rb	(revision 0)
+++ ext/-test-/bug-3571/extconf.rb	(revision 28642)
@@ -0,0 +1 @@
+create_makefile("-test-/bug-3571/bug")

Property changes on: ext/-test-/bug-3571/extconf.rb
___________________________________________________________________
Name: svn:eol-style
   + LF

Index: ext/-test-/bug-3571/bug.c
===================================================================
--- ext/-test-/bug-3571/bug.c	(revision 0)
+++ ext/-test-/bug-3571/bug.c	(revision 28642)
@@ -0,0 +1,23 @@
+#include <ruby.h>
+
+static VALUE
+bug_i(VALUE i, VALUE arg)
+{
+    rb_notimplement();
+    return ID2SYM(rb_frame_this_func());
+}
+
+static VALUE
+bug_start(VALUE self, VALUE hash)
+{
+    VALUE ary = rb_ary_new3(1, Qnil);
+    rb_block_call(ary, rb_intern("map"), 0, 0, bug_i, self);
+    return ary;
+}
+
+void
+Init_bug(void)
+{
+    VALUE mBug = rb_define_module("Bug");
+    rb_define_module_function(mBug, "start", bug_start, 0);
+}

Property changes on: ext/-test-/bug-3571/bug.c
___________________________________________________________________
Name: svn:eol-style
   + LF

Index: vm_insnhelper.c
===================================================================
--- vm_insnhelper.c	(revision 28641)
+++ vm_insnhelper.c	(revision 28642)
@@ -717,7 +717,7 @@
 	blockarg = Qnil;
     }
 
-    vm_push_frame(th, 0, VM_FRAME_MAGIC_IFUNC,
+    vm_push_frame(th, (rb_iseq_t *)ifunc, VM_FRAME_MAGIC_IFUNC,
 		  self, (VALUE)block->dfp,
 		  0, th->cfp->sp, block->lfp, 1);
 
Index: test/-ext-/test_bug-3571.rb
===================================================================
--- test/-ext-/test_bug-3571.rb	(revision 0)
+++ test/-ext-/test_bug-3571.rb	(revision 28642)
@@ -0,0 +1,21 @@
+require 'test/unit'
+require_relative '../ruby/envutil'
+
+class Test_BUG_3571 < Test::Unit::TestCase
+  def test_block_call_id
+    bug3571 = '[ruby-dev:41852]'
+    src = <<SRC
+begin
+  Bug.start
+rescue NotImplementedError => e
+  STDERR.puts e.message, e.backtrace[$0.size..-1]
+end
+SRC
+    out = [
+      "start() function is unimplemented on this machine",
+      "-:2:in `start'",
+      "-:2:in `<main>'",
+    ]
+    assert_in_out_err(%w"-r-test-/bug-3571/bug", src, [], out, bug3571)
+  end
+end

Property changes on: test/-ext-/test_bug-3571.rb
___________________________________________________________________
Name: svn:eol-style
   + LF


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

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