From 2f286496fd612f93d1459f8bc1d70af1b386b3be Mon Sep 17 00:00:00 2001 From: akr Date: Fri, 28 Sep 2007 06:21:46 +0000 Subject: * 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: http://svn.ruby-lang.org/repos/ruby/trunk@13543 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- marshal.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) (limited to 'marshal.c') diff --git a/marshal.c b/marshal.c index 6b7108e4d..f4cc37942 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); } } @@ -470,6 +470,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) { @@ -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: -- cgit