Skip to content

Commit

Permalink
[Bug #19597] Freeze script name
Browse files Browse the repository at this point in the history
  • Loading branch information
nobu committed Apr 13, 2023
1 parent 02a7e12 commit 4ed1949
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 6 deletions.
15 changes: 10 additions & 5 deletions ruby.c
Original file line number Diff line number Diff line change
Expand Up @@ -2610,12 +2610,18 @@ external_str_new_cstr(const char *p)
#endif
}

static void
set_progname(VALUE name)
{
rb_orig_progname = rb_progname = name;
rb_vm_set_progname(rb_progname);
}

void
ruby_script(const char *name)
{
if (name) {
rb_orig_progname = rb_progname = external_str_new_cstr(name);
rb_vm_set_progname(rb_progname);
set_progname(rb_str_freeze(external_str_new_cstr(name)));
}
}

Expand All @@ -2626,8 +2632,7 @@ ruby_script(const char *name)
void
ruby_set_script_name(VALUE name)
{
rb_orig_progname = rb_progname = rb_str_dup(name);
rb_vm_set_progname(rb_progname);
set_progname(rb_str_new_frozen(name));
}

static void
Expand Down Expand Up @@ -2751,7 +2756,7 @@ ruby_process_options(int argc, char **argv)
origarg.argc = argc;
origarg.argv = argv;
}
ruby_script(script_name); /* for the time being */
set_progname(external_str_new_cstr(script_name)); /* for the time being */
rb_argv0 = rb_str_new4(rb_progname);
rb_gc_register_mark_object(rb_argv0);
iseq = process_options(argc, argv, cmdline_options_init(&opt));
Expand Down
5 changes: 5 additions & 0 deletions test/ruby/test_process.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1424,6 +1424,11 @@ def test_argv0_keep_alive
REPRO
end

def test_argv0_frozen
assert_predicate Process.argv0, :frozen?
assert_predicate $0, :frozen?
end

def test_status
with_tmpchdir do
s = run_in_child("exit 1")
Expand Down
3 changes: 2 additions & 1 deletion vm.c
Original file line number Diff line number Diff line change
Expand Up @@ -3963,7 +3963,8 @@ rb_vm_set_progname(VALUE filename)
rb_control_frame_t *cfp = (void *)(th->ec->vm_stack + th->ec->vm_stack_size);
--cfp;

rb_iseq_pathobj_set(cfp->iseq, rb_str_dup(filename), rb_iseq_realpath(cfp->iseq));
filename = rb_str_new_frozen(filename);
rb_iseq_pathobj_set(cfp->iseq, filename, rb_iseq_realpath(cfp->iseq));
}

extern const struct st_hash_type rb_fstring_hash_type;
Expand Down

0 comments on commit 4ed1949

Please sign in to comment.