marshal.c: shallow freeze user objects
When `freeze: true` argument is passed. [Bug #19427]
This commit is contained in:
parent
78be6696d8
commit
6339cb70c3
Notes:
git
2023-04-26 14:54:54 +00:00
10
marshal.c
10
marshal.c
@ -2155,7 +2155,12 @@ r_object_for(struct load_arg *arg, bool partial, int *ivp, VALUE extmod, int typ
|
|||||||
marshal_compat_t *compat = (marshal_compat_t*)d;
|
marshal_compat_t *compat = (marshal_compat_t*)d;
|
||||||
v = compat->loader(klass, v);
|
v = compat->loader(klass, v);
|
||||||
}
|
}
|
||||||
if (!partial) v = r_post_proc(v, arg);
|
if (!partial) {
|
||||||
|
if (arg->freeze) {
|
||||||
|
OBJ_FREEZE(v);
|
||||||
|
}
|
||||||
|
v = r_post_proc(v, arg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -2180,6 +2185,9 @@ r_object_for(struct load_arg *arg, bool partial, int *ivp, VALUE extmod, int typ
|
|||||||
load_funcall(arg, v, s_mload, 1, &data);
|
load_funcall(arg, v, s_mload, 1, &data);
|
||||||
v = r_fixup_compat(v, arg);
|
v = r_fixup_compat(v, arg);
|
||||||
v = r_copy_ivar(v, data);
|
v = r_copy_ivar(v, data);
|
||||||
|
if (arg->freeze) {
|
||||||
|
OBJ_FREEZE(v);
|
||||||
|
}
|
||||||
v = r_post_proc(v, arg);
|
v = r_post_proc(v, arg);
|
||||||
if (!NIL_P(extmod)) {
|
if (!NIL_P(extmod)) {
|
||||||
if (oldclass) append_extmod(v, extmod);
|
if (oldclass) append_extmod(v, extmod);
|
||||||
|
@ -141,7 +141,6 @@ describe :marshal_load, shared: true do
|
|||||||
end
|
end
|
||||||
|
|
||||||
ruby_bug "#19427", "3.1"..."3.3" do
|
ruby_bug "#19427", "3.1"..."3.3" do
|
||||||
ruby_bug "#19427", "3.1"..."3.4" do # https://bugs.ruby-lang.org/issues/19427#note-15
|
|
||||||
it "returns frozen object having #_dump method" do
|
it "returns frozen object having #_dump method" do
|
||||||
object = Marshal.send(@method, Marshal.dump(UserDefined.new), freeze: true)
|
object = Marshal.send(@method, Marshal.dump(UserDefined.new), freeze: true)
|
||||||
object.should.frozen?
|
object.should.frozen?
|
||||||
@ -151,7 +150,6 @@ describe :marshal_load, shared: true do
|
|||||||
object = Marshal.send(@method, Marshal.dump(UserMarshal.new), freeze: true)
|
object = Marshal.send(@method, Marshal.dump(UserMarshal.new), freeze: true)
|
||||||
object.should.frozen?
|
object.should.frozen?
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
it "returns frozen object extended by a module" do
|
it "returns frozen object extended by a module" do
|
||||||
object = Object.new
|
object = Object.new
|
||||||
|
Loading…
x
Reference in New Issue
Block a user