summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--load.c2
-rw-r--r--parse.y4
-rw-r--r--test/ruby/test_eval.rb11
-rw-r--r--version.h2
-rw-r--r--vm_eval.c3
5 files changed, 17 insertions, 5 deletions
diff --git a/load.c b/load.c
index 544357daba..57a9c9c287 100644
--- a/load.c
+++ b/load.c
@@ -1016,7 +1016,7 @@ rb_require_internal(VALUE fname, int safe)
RUBY_DTRACE_HOOK(FIND_REQUIRE_RETURN, RSTRING_PTR(fname));
if (found) {
- if (!path || !(ftptr = load_lock(RSTRING_PTR(path)))) {
+ if (!path || !(path = rb_fstring(path), ftptr = load_lock(RSTRING_PTR(path)))) {
result = 0;
}
else if (!*ftptr) {
diff --git a/parse.y b/parse.y
index 473ae0e216..b81dbbc373 100644
--- a/parse.y
+++ b/parse.y
@@ -4941,7 +4941,7 @@ yycompile(VALUE vparser, struct parser_params *p, VALUE fname, int line)
p->ruby_sourcefile = "(none)";
}
else {
- p->ruby_sourcefile_string = rb_str_new_frozen(fname);
+ p->ruby_sourcefile_string = rb_fstring(fname);
p->ruby_sourcefile = StringValueCStr(fname);
}
p->ruby_sourceline = line - 1;
@@ -8760,7 +8760,7 @@ gettable(struct parser_params *p, ID id, const YYLTYPE *loc)
if (NIL_P(file))
file = rb_str_new(0, 0);
else
- file = rb_str_dup(rb_fstring(file));
+ file = rb_str_dup(file);
node = NEW_STR(add_mark_object(p, file), loc);
}
return node;
diff --git a/test/ruby/test_eval.rb b/test/ruby/test_eval.rb
index 8900b4f165..9cb69ddc37 100644
--- a/test/ruby/test_eval.rb
+++ b/test/ruby/test_eval.rb
@@ -497,6 +497,17 @@ class TestEval < Test::Unit::TestCase
}, '[Bug #10368]'
end
+ def test_gced_eval_location
+ Dir.mktmpdir do |d|
+ File.write("#{d}/2.rb", "")
+ File.write("#{d}/1.rb", "require_relative '2'\n""__FILE__\n")
+ file = "1.rb"
+ path = File.expand_path(file, d)
+ assert_equal(path, eval(File.read(path), nil, File.expand_path(file, d)))
+ assert_equal(path, eval(File.read(path), nil, File.expand_path(file, d)))
+ end
+ end
+
def orphan_proc
proc {eval("return :ng")}
end
diff --git a/version.h b/version.h
index d5cc0572c7..3af9fe51a7 100644
--- a/version.h
+++ b/version.h
@@ -1,6 +1,6 @@
#define RUBY_VERSION "2.6.3"
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
-#define RUBY_PATCHLEVEL 86
+#define RUBY_PATCHLEVEL 87
#define RUBY_RELEASE_YEAR 2019
#define RUBY_RELEASE_MONTH 8
diff --git a/vm_eval.c b/vm_eval.c
index 0e7047af65..e759197182 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -1266,6 +1266,7 @@ eval_make_iseq(VALUE src, VALUE fname, int line, const rb_binding_t *bind,
}
if (fname != Qundef) {
+ if (!NIL_P(fname)) fname = rb_fstring(fname);
realpath = fname;
}
else if (bind) {
@@ -1275,7 +1276,7 @@ eval_make_iseq(VALUE src, VALUE fname, int line, const rb_binding_t *bind,
rb_parser_warn_location(parser, TRUE);
}
else {
- fname = rb_usascii_str_new_cstr("(eval)");
+ fname = rb_fstring_lit("(eval)");
}
rb_parser_set_context(parser, base_block, FALSE);