diff options
author | Jean Boussier <byroot@ruby-lang.org> | 2023-04-26 14:17:27 +0200 |
---|---|---|
committer | Jean Boussier <jean.boussier@gmail.com> | 2023-04-26 16:54:25 +0200 |
commit | 6339cb70c3bcc54696e98c303dd4b26ed3d57afd (patch) | |
tree | 5890d2de94b266433b14231f2a3487275b975f18 /marshal.c | |
parent | 78be6696d864513ffad395ecd37d582143ca1216 (diff) | |
download | ruby-6339cb70c3bcc54696e98c303dd4b26ed3d57afd.tar.gz |
marshal.c: shallow freeze user objects
When `freeze: true` argument is passed.
[Bug #19427]
Diffstat (limited to 'marshal.c')
-rw-r--r-- | marshal.c | 10 |
1 files changed, 9 insertions, 1 deletions
@@ -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; 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; @@ -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); v = r_fixup_compat(v, arg); v = r_copy_ivar(v, data); + if (arg->freeze) { + OBJ_FREEZE(v); + } v = r_post_proc(v, arg); if (!NIL_P(extmod)) { if (oldclass) append_extmod(v, extmod); |