diff options
author | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2019-08-07 13:05:00 +0000 |
---|---|---|
committer | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2019-08-07 13:05:00 +0000 |
commit | a93a2f88d277b14818d0240ef48f2f2311933d2e (patch) | |
tree | e8f903fb0b7018930459161d4ae465f7f3c9d11e | |
parent | a3843824c455d0b0efcfc5af03cbcebaac090eda (diff) |
merge revision(s) 5931857281ce45c1c277aa86d1588119ab00a955,76e2370f132f83c16c9de39a0a9356579f364527: [Backport #16041]
Fix dangling path name from fstring
* parse.y (yycompile): make sure in advance that the `__FILE__`
object shares a fstring, to get rid of dangling path name.
Fixed up 53e9908d8afc7f03109b0aafd1698ab35f512b05. [Bug #16041]
* vm_eval.c (eval_make_iseq): ditto.
Fix dangling path name from fstring
* load.c (rb_require_internal): make sure in advance that the path
to be loaded shares a fstring, to get rid of dangling path name.
Fixed up 5931857281ce45c1c277aa86d1588119ab00a955. [Bug #16041]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_6@67736 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | load.c | 2 | ||||
-rw-r--r-- | parse.y | 4 | ||||
-rw-r--r-- | test/ruby/test_eval.rb | 11 | ||||
-rw-r--r-- | version.h | 2 | ||||
-rw-r--r-- | vm_eval.c | 3 |
5 files changed, 17 insertions, 5 deletions
@@ -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) { @@ -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 @@ -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 @@ -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); |