[Bug #19597] Freeze script name
This commit is contained in:
parent
0e5aecea11
commit
2d9bc3efe5
Notes:
git
2023-05-10 08:14:50 +00:00
15
ruby.c
15
ruby.c
@ -2616,12 +2616,18 @@ external_str_new_cstr(const char *p)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_progname(VALUE name)
|
||||||
|
{
|
||||||
|
rb_orig_progname = rb_progname = name;
|
||||||
|
rb_vm_set_progname(rb_progname);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ruby_script(const char *name)
|
ruby_script(const char *name)
|
||||||
{
|
{
|
||||||
if (name) {
|
if (name) {
|
||||||
rb_orig_progname = rb_progname = external_str_new_cstr(name);
|
set_progname(rb_str_freeze(external_str_new_cstr(name)));
|
||||||
rb_vm_set_progname(rb_progname);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2632,8 +2638,7 @@ ruby_script(const char *name)
|
|||||||
void
|
void
|
||||||
ruby_set_script_name(VALUE name)
|
ruby_set_script_name(VALUE name)
|
||||||
{
|
{
|
||||||
rb_orig_progname = rb_progname = rb_str_dup(name);
|
set_progname(rb_str_new_frozen(name));
|
||||||
rb_vm_set_progname(rb_progname);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -2757,7 +2762,7 @@ ruby_process_options(int argc, char **argv)
|
|||||||
origarg.argc = argc;
|
origarg.argc = argc;
|
||||||
origarg.argv = argv;
|
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_argv0 = rb_str_new4(rb_progname);
|
||||||
rb_gc_register_mark_object(rb_argv0);
|
rb_gc_register_mark_object(rb_argv0);
|
||||||
iseq = process_options(argc, argv, cmdline_options_init(&opt));
|
iseq = process_options(argc, argv, cmdline_options_init(&opt));
|
||||||
|
@ -13,8 +13,10 @@ describe "Process.argv0" do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
it "returns a non frozen object" do
|
ruby_bug "#19597", ""..."3.3" do
|
||||||
Process.argv0.should_not.frozen?
|
it "returns a frozen object" do
|
||||||
|
Process.argv0.should.frozen?
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
it "returns every time the same object" do
|
it "returns every time the same object" do
|
||||||
|
@ -1424,6 +1424,11 @@ class TestProcess < Test::Unit::TestCase
|
|||||||
REPRO
|
REPRO
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_argv0_frozen
|
||||||
|
assert_predicate Process.argv0, :frozen?
|
||||||
|
assert_predicate $0, :frozen?
|
||||||
|
end
|
||||||
|
|
||||||
def test_status
|
def test_status
|
||||||
with_tmpchdir do
|
with_tmpchdir do
|
||||||
s = run_in_child("exit 1")
|
s = run_in_child("exit 1")
|
||||||
|
3
vm.c
3
vm.c
@ -3979,7 +3979,8 @@ rb_vm_set_progname(VALUE filename)
|
|||||||
rb_control_frame_t *cfp = (void *)(th->ec->vm_stack + th->ec->vm_stack_size);
|
rb_control_frame_t *cfp = (void *)(th->ec->vm_stack + th->ec->vm_stack_size);
|
||||||
--cfp;
|
--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;
|
extern const struct st_hash_type rb_fstring_hash_type;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user