[#35027] [Ruby 1.9-Bug#4352][Open] [patch] Fix eval(s, b) backtrace; make eval(s, b) consistent with eval(s) — "James M. Lawrence" <redmine@...>

Bug #4352: [patch] Fix eval(s, b) backtrace; make eval(s, b) consistent w=

16 messages 2011/02/01

[#35114] [Ruby 1.9-Bug#4373][Open] http.rb:677: [BUG] Segmentation fault — Christian Fazzini <redmine@...>

Bug #4373: http.rb:677: [BUG] Segmentation fault

59 messages 2011/02/06

[#35171] [Ruby 1.9-Bug#4386][Open] encoding: directive does not affect regex expressions — mathew murphy <redmine@...>

Bug #4386: encoding: directive does not affect regex expressions

9 messages 2011/02/09

[#35237] [Ruby 1.9-Bug#4400][Open] nested at_exit hooks run in strange order — Suraj Kurapati <redmine@...>

Bug #4400: nested at_exit hooks run in strange order

12 messages 2011/02/15

[ruby-core:35139] [Ruby 1.9-Bug#4379][Open] [patch] eval(s, b, "(eval)", n) discards location

From: "James M. Lawrence" <redmine@...>
Date: 2011-02-07 18:19:37 UTC
List: ruby-core #35139
Bug #4379: [patch] eval(s, b, "(eval)", n) discards location
http://redmine.ruby-lang.org/issues/show/4379

Author: James M. Lawrence
Status: Open, Priority: Normal
Category: core, Target version: 1.9.x
ruby -v: ruby 1.9.3dev (2011-02-08 trunk 30820) [i386-darwin9.8.0]

% ruby -e 'p eval("raise", nil, "(eval)", 999)'
-e:1:in `eval': (eval):999:in `<main>':  (RuntimeError)
	from -e:1:in `eval'
	from -e:1:in `<main>'

With binding, location is ignored.

% ruby -e 'p eval("raise", binding, "(eval)", 999)'
-e:1:in `<main>': unhandled exception
	from -e:1:in `eval'
	from -e:1:in `<main>'

source_location has a similar problem.

The patch also applies cleanly to 1.9.2.


----------------------------------------
http://redmine.ruby-lang.org

Attachments (2)

test_eval_location.patch (762 Bytes, text/x-diff)
diff --git a/test/ruby/test_eval.rb b/test/ruby/test_eval.rb
index 299165f..50a58ad 100644
--- a/test/ruby/test_eval.rb
+++ b/test/ruby/test_eval.rb
@@ -430,4 +430,23 @@ class TestEval < Test::Unit::TestCase
     result = foo.instance_eval(&foo_pr)
     assert_equal(1, result, 'Bug #3786, Bug #3860, [ruby-core:32501]')
   end
+
+  def test_eval_backtrace
+    begin
+      eval("raise", binding, "(eval)", 9999)
+    rescue => e
+      assert_match /:9999:/, e.backtrace[0]
+    end
+  end
+
+  def test_eval_source_location
+    expected = ["(eval)", 9999]
+
+    source =
+      "class << Object.new ;" <<
+      "def f ; end ;" <<
+      "instance_method(:f).source_location ; end"
+
+    assert_equal expected, eval(source, binding, *expected)
+  end
 end
eval_location.patch (1.26 KB, text/x-diff)
diff --git a/vm_eval.c b/vm_eval.c
index 0dcbafa..85d6e28 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -960,10 +960,13 @@ eval_string_with_cref(VALUE self, VALUE src, VALUE scope, NODE *cref, const char
     rb_block_t block;
     volatile int parse_in_eval;
     volatile int mild_compile_error;
+    volatile int is_user_file = FALSE;
 
     if (file == 0) {
 	file = rb_sourcefile();
 	line = rb_sourceline();
+    } else {
+	is_user_file = TRUE;
     }
 
     parse_in_eval = th->parse_in_eval;
@@ -977,7 +980,7 @@ eval_string_with_cref(VALUE self, VALUE src, VALUE scope, NODE *cref, const char
 	    if (rb_obj_is_kind_of(scope, rb_cBinding)) {
 		GetBindingPtr(scope, bind);
 		envval = bind->env;
-		if (strcmp(file, "(eval)") == 0 && bind->filename != Qnil) {
+		if (!is_user_file && strcmp(file, "(eval)") == 0 && bind->filename != Qnil) {
 		    file = RSTRING_PTR(bind->filename);
 		    line = bind->line_no;
 		}
@@ -1035,7 +1038,7 @@ eval_string_with_cref(VALUE self, VALUE src, VALUE scope, NODE *cref, const char
     if (state) {
 	if (state == TAG_RAISE) {
 	    VALUE errinfo = th->errinfo;
-	    if (strcmp(file, "(eval)") == 0) {
+	    if (!is_user_file && strcmp(file, "(eval)") == 0) {
 		VALUE mesg, errat, bt2;
 		extern VALUE rb_get_backtrace(VALUE info);
 		ID id_mesg;

In This Thread

Prev Next