ruby-changes:72770
From: Koichi <ko1@a...>
Date: Mon, 1 Aug 2022 18:02:17 +0900 (JST)
Subject: [ruby-changes:72770] 5bbba76489 (master): respect current frame of `rb_eval_string`
https://git.ruby-lang.org/ruby.git/commit/?id=5bbba76489 From 5bbba76489628f4509495ebf4ba0a7aad4c0b560 Mon Sep 17 00:00:00 2001 From: Koichi Sasada <ko1@a...> Date: Fri, 29 Jul 2022 16:02:10 +0900 Subject: respect current frame of `rb_eval_string` `self` is nearest Ruby method's `self`. If there is no ruby frame, use toplevel `self` (`main`). https://bugs.ruby-lang.org/issues/18780 --- ext/-test-/eval/eval.c | 13 +++++++++++++ ext/-test-/eval/extconf.rb | 2 ++ test/-ext-/eval/test_eval.rb | 12 ++++++++++++ vm_eval.c | 5 ++++- 4 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 ext/-test-/eval/eval.c create mode 100644 ext/-test-/eval/extconf.rb create mode 100644 test/-ext-/eval/test_eval.rb diff --git a/ext/-test-/eval/eval.c b/ext/-test-/eval/eval.c new file mode 100644 index 0000000000..983468fc34 --- /dev/null +++ b/ext/-test-/eval/eval.c @@ -0,0 +1,13 @@ https://github.com/ruby/ruby/blob/trunk/ext/-test-/eval/eval.c#L1 +#include "ruby/ruby.h" + +static VALUE +eval_string(VALUE self, VALUE str) +{ + return rb_eval_string(StringValueCStr(str)); +} + +void +Init_eval(void) +{ + rb_define_global_function("rb_eval_string", eval_string, 1); +} diff --git a/ext/-test-/eval/extconf.rb b/ext/-test-/eval/extconf.rb new file mode 100644 index 0000000000..cdbf6a8597 --- /dev/null +++ b/ext/-test-/eval/extconf.rb @@ -0,0 +1,2 @@ https://github.com/ruby/ruby/blob/trunk/ext/-test-/eval/extconf.rb#L1 +require 'mkmf' +create_makefile('-test-/eval') diff --git a/test/-ext-/eval/test_eval.rb b/test/-ext-/eval/test_eval.rb new file mode 100644 index 0000000000..27952996e2 --- /dev/null +++ b/test/-ext-/eval/test_eval.rb @@ -0,0 +1,12 @@ https://github.com/ruby/ruby/blob/trunk/test/-ext-/eval/test_eval.rb#L1 +# frozen_string_literal: false +require 'test/unit' +require "-test-/eval" + +class EvalTest < Test::Unit::TestCase + def test_rb_eval_string + a = 1 + assert_equal [self, 1, __method__], rb_eval_string(%q{ + [self, a, __method__] + }) + end +end diff --git a/vm_eval.c b/vm_eval.c index e490e4e32d..c7669cbb85 100644 --- a/vm_eval.c +++ b/vm_eval.c @@ -1828,7 +1828,10 @@ VALUE https://github.com/ruby/ruby/blob/trunk/vm_eval.c#L1828 ruby_eval_string_from_file(const char *str, const char *filename) { VALUE file = filename ? rb_str_new_cstr(filename) : 0; - return eval_string_with_cref(rb_vm_top_self(), rb_str_new2(str), NULL, file, 1); + rb_execution_context_t *ec = GET_EC(); + rb_control_frame_t *cfp = ec ? rb_vm_get_ruby_level_next_cfp(ec, ec->cfp) : NULL; + VALUE self = cfp ? cfp->self : rb_vm_top_self(); + return eval_string_with_cref(self, rb_str_new2(str), NULL, file, 1); } VALUE -- cgit v1.2.1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/