summaryrefslogtreecommitdiff
path: root/marshal.c
diff options
context:
space:
mode:
Diffstat (limited to 'marshal.c')
-rw-r--r--marshal.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/marshal.c b/marshal.c
index 046729d364..45048db2f2 100644
--- a/marshal.c
+++ b/marshal.c
@@ -1622,7 +1622,21 @@ r_object0(struct load_arg *arg, int *ivp, VALUE extmod)
}
v = r_entry(v, arg);
data = r_object(arg);
+#ifndef MARSHAL_LOAD_DIRECT
rb_funcall(v, s_mload, 1, data);
+#else
+ switch (TYPE(v)) {
+ case T_COMPLEX:
+ rb_Complex_marshal_load(v, data);
+ break;
+ case T_RATIONAL:
+ rb_Rational_marshal_load(v, data);
+ break;
+ default:
+ rb_funcall(v, s_mload, 1, data);
+ break;
+ }
+#endif
check_load_arg(arg, s_mload);
v = r_leave(v, arg);
}