summaryrefslogtreecommitdiff
path: root/marshal.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-09-28 06:21:46 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-09-28 06:21:46 +0000
commit5c0e68c39c3fc7717311826549a30d1615eb2007 (patch)
treeddf952542b46d0c180ed6200fcdb7b3e00036b32 /marshal.c
parent041fbcbf50993925b2d61fbfca4d16b766d8ea5d (diff)
* include/ruby/intern.h: export rb_ivar_foreach.
* include/ruby/ruby.h: modify struct RObject and RClass for optimizing T_OBJECT space. [ruby-dev:31853] (ROBJECT_LEN, ROBJECT_PTR) (RCLASS_IV_TBL, RCLASS_M_TBL, RCLASS_SUPER, RCLASS_IV_INDEX_TBL) (RMODULE_IV_TBL, RMODULE_M_TBL, RMODULE_SUPER): abstract accessor defined. * variable.c: support the modified RObject and RClass. * object.c: ditto. * class.c: ditto. * gc.c: ditto. * marshal.c: ditto. * eval_method.ci: use the abstract accessor. * insns.def: ditto. * proc.c: ditto. * struct.c: ditto. * eval.c: ditto. * error.c: ditto. * vm.c: ditto. * insnhelper.ci: ditto. * ext/digest/digest.c: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13543 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'marshal.c')
-rw-r--r--marshal.c29
1 files changed, 24 insertions, 5 deletions
diff --git a/marshal.c b/marshal.c
index 6b7108e4df..f4cc37942e 100644
--- a/marshal.c
+++ b/marshal.c
@@ -404,17 +404,17 @@ w_extended(VALUE klass, struct dump_arg *arg, int check)
char *path;
if (check && FL_TEST(klass, FL_SINGLETON)) {
- if (RCLASS(klass)->m_tbl->num_entries ||
- (RCLASS(klass)->iv_tbl && RCLASS(klass)->iv_tbl->num_entries > 1)) {
+ if (RCLASS_M_TBL(klass)->num_entries ||
+ (RCLASS_IV_TBL(klass) && RCLASS_IV_TBL(klass)->num_entries > 1)) {
rb_raise(rb_eTypeError, "singleton can't be dumped");
}
- klass = RCLASS(klass)->super;
+ klass = RCLASS_SUPER(klass);
}
while (BUILTIN_TYPE(klass) == T_ICLASS) {
path = rb_class2name(RBASIC(klass)->klass);
w_byte(TYPE_EXTENDED, arg);
w_unique(path, arg);
- klass = RCLASS(klass)->super;
+ klass = RCLASS_SUPER(klass);
}
}
@@ -471,6 +471,25 @@ w_ivar(st_table *tbl, struct dump_call_arg *arg)
}
static void
+w_objivar(VALUE obj, struct dump_call_arg *arg)
+{
+ VALUE *ptr;
+ long i, len, num;
+
+ len = ROBJECT_LEN(obj);
+ ptr = ROBJECT_PTR(obj);
+ num = 0;
+ for (i = 0; i < len; i++)
+ if (ptr[i] != Qundef)
+ num += 1;
+
+ w_long(num, arg->arg);
+ if (num != 0) {
+ rb_ivar_foreach(obj, w_obj_each, (st_data_t)arg);
+ }
+}
+
+static void
w_object(VALUE obj, struct dump_arg *arg, int limit)
{
struct dump_call_arg c_arg;
@@ -682,7 +701,7 @@ w_object(VALUE obj, struct dump_arg *arg, int limit)
case T_OBJECT:
w_class(TYPE_OBJECT, obj, arg, Qtrue);
- w_ivar(ROBJECT(obj)->iv_tbl, &c_arg);
+ w_objivar(obj, &c_arg);
break;
case T_DATA: