Actions
Bug #22090
closedEnabling Ruby::Box breaks Marshal.load
Bug #22090:
Enabling Ruby::Box breaks Marshal.load
ruby -v:
ruby 4.1.0dev (2026-05-31T10:35:05Z master 12c8599ffa) +PRISM [x86_64-linux]
Description
Actions
Added by joker1007 (Tomohiro Hashidate) 4 months ago. Updated 13 days ago.
Description
The root cause is that Marshal.load is a builtin method written in Ruby (marshal.rb), so it is defined in the master box. The box resolution stops at that frame and looks up the dumped class names there, where user-defined classes are invisible. Marshal.dump is a plain C function and already operates on the caller's box, which is why only loading fails.
I proposed a fix in https://github.com/ruby/ruby/pull/18544: it adds Primitive.attr! :caller_box, which makes a builtin Ruby method operate on its caller's box like C functions do, and applies it to Marshal.load.
Applied in changeset git|60d29cd2d39f10b02e8cc73e0e767e6c55a05ece.
[Bug #22090] Resolve classes in the caller's box in Marshal.load
Marshal.load is a builtin Ruby method, so with Ruby::Box enabled it
looked up dumped class names in the master box and failed even for a
same-process round-trip. Mark it :caller_box to resolve the class
names in the caller's box, which Marshal.dump (a C function) already
does.
Co-Authored-By: Claude Fable 5 noreply@anthropic.com