summaryrefslogtreecommitdiff
path: root/marshal.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-09-09 16:23:27 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-09-09 16:23:27 +0000
commitc19fafb0a45cc30b04fdeb9eb5b5fb8a6d80be79 (patch)
tree0ac21acf6cbd7aee6de599b916649ce5c4ab6651 /marshal.c
parent3ee33a6dbc636a16ff1aa89f070e428842ed1f32 (diff)
* marshal.c (r_object0): struct allocation first to check if a
class is a struct. compatibility check should come next. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13423 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'marshal.c')
-rw-r--r--marshal.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/marshal.c b/marshal.c
index f540e52f37..8d0f91c7f3 100644
--- a/marshal.c
+++ b/marshal.c
@@ -1254,18 +1254,18 @@ r_object0(struct load_arg *arg, int *ivp, VALUE extmod)
ID slot;
klass = path2class(r_unique(arg));
- mem = rb_struct_s_members(klass);
len = r_long(arg);
+ v = rb_obj_alloc(klass);
+ if (TYPE(v) != T_STRUCT) {
+ rb_raise(rb_eTypeError, "class %s not a struct", rb_class2name(klass));
+ }
+ mem = rb_struct_s_members(klass);
if (RARRAY_LEN(mem) != len) {
rb_raise(rb_eTypeError, "struct %s not compatible (struct size differs)",
rb_class2name(klass));
}
- v = rb_obj_alloc(klass);
- if (TYPE(v) != T_STRUCT) {
- rb_raise(rb_eArgError, "dump format error");
- }
v = r_entry(v, arg);
values = rb_ary_new2(len);
for (i=0; i<len; i++) {