[405] MacRuby/branches/lrz_unstable
Revision: 405 http://trac.macosforge.org/projects/ruby/changeset/405 Author: lsansonetti@apple.com Date: 2008-08-03 22:38:19 -0700 (Sun, 03 Aug 2008) Log Message: ----------- wip Modified Paths: -------------- MacRuby/branches/lrz_unstable/class.c MacRuby/branches/lrz_unstable/gc.c MacRuby/branches/lrz_unstable/include/ruby/ruby.h MacRuby/branches/lrz_unstable/sample/test.rb Modified: MacRuby/branches/lrz_unstable/class.c =================================================================== --- MacRuby/branches/lrz_unstable/class.c 2008-08-03 21:08:32 UTC (rev 404) +++ MacRuby/branches/lrz_unstable/class.c 2008-08-04 05:38:19 UTC (rev 405) @@ -35,14 +35,17 @@ do { if (ocsuper == (Class)rb_cArray) { rb_objc_install_array_primitives(ocklass); + RCLASS_SET_VERSION_FLAG(ocklass, RCLASS_IS_ARRAY_SUBCLASS); return true; } if (ocsuper == (Class)rb_cHash) { rb_objc_install_hash_primitives(ocklass); + RCLASS_SET_VERSION_FLAG(ocklass, RCLASS_IS_HASH_SUBCLASS); return true; } if (ocsuper == (Class)rb_cString) { rb_objc_install_string_primitives(ocklass); + RCLASS_SET_VERSION_FLAG(ocklass, RCLASS_IS_STRING_SUBCLASS); return true; } ocsuper = class_getSuperclass(ocsuper); Modified: MacRuby/branches/lrz_unstable/gc.c =================================================================== --- MacRuby/branches/lrz_unstable/gc.c 2008-08-03 21:08:32 UTC (rev 404) +++ MacRuby/branches/lrz_unstable/gc.c 2008-08-04 05:38:19 UTC (rev 405) @@ -2251,6 +2251,48 @@ int count; }; +static int +rb_objc_yield_classes(VALUE of) +{ + int i, count, rcount; + Class *buf; + + count = objc_getClassList(NULL, 0); + assert(count > 0); + + buf = (Class *)alloca(sizeof(Class) * count); + objc_getClassList(buf, count); + + for (i = rcount = 0; i < count; i++) { + Class sk, k = buf[i]; + bool nsobject_based; + + if (class_getName(k)[0] == '_') + continue; + + if (of == rb_cModule && !RCLASS_MODULE(k)) + continue; + + nsobject_based = false; + sk = k; + do { + sk = (Class)RCLASS_SUPER(sk); + if (sk == (Class)rb_cNSObject) { + nsobject_based = true; + break; + } + } + while (sk != NULL); + + if (nsobject_based) { + rb_yield((VALUE)k); + rcount++; + } + } + + return rcount; +} + static void rb_objc_recorder(task_t task, void *context, unsigned type_mask, vm_range_t *ranges, unsigned range_count) @@ -2266,48 +2308,29 @@ auto_zone_get_layout_type_no_lock(__auto_zone, (void *)r->address); if (type != AUTO_OBJECT_SCANNED && type != AUTO_OBJECT_UNSCANNED) continue; + if (*(Class *)r->address == NULL) + continue; if (ctx->class_of != 0) { -#if 0 - if (ctx->class_of == rb_cClass || ctx->class_of == rb_cModule) { - /* Class/Module are a special case. */ - if (NATIVE(r->address) - || FL_TEST(r->address, FL_SINGLETON)) - continue; - if (ctx->class_of == rb_cClass) { - /* Only match classes. */ - if (BUILTIN_TYPE(r->address) != T_CLASS) - continue; + bool ok = false; + for (c = *(Class *)r->address; c != NULL; + c = class_getSuperclass(c)) { + if (c ==(Class)ctx->class_of) { + ok = true; + break; } - else { - /* Match classes & modules. */ - if (BUILTIN_TYPE(r->address) != T_CLASS - && BUILTIN_TYPE(r->address) != T_MODULE) - continue; - } } - else -#endif - { - unsigned ok = 0; - for (c = *(Class *)r->address; c != NULL; - c = class_getSuperclass(c)) { - if (c ==(Class)ctx->class_of) { - ok = 1; - break; - } - } - if (!ok) - continue; - } + if (!ok) + continue; } - switch (BUILTIN_TYPE(r->address)) { + switch (TYPE(r->address)) { case T_NONE: - case T_ICLASS: case T_NODE: continue; + case T_ICLASS: case T_CLASS: - if (RCLASS_SINGLETON(r->address)) - continue; + case T_MODULE: + rb_bug("object %p of type %d should not be recorded", + (void *)r->address, TYPE(r->address)); case T_NATIVE: if (rb_objc_is_placeholder((void *)r->address)) continue; @@ -2408,11 +2431,20 @@ } RETURN_ENUMERATOR(os, 1, &of); #if WITH_OBJC - struct rb_objc_recorder_context ctx = {of, 0}; - (((malloc_zone_t *)__auto_zone)->introspect->enumerator)( + /* Class/Module are a special case, because they are not auto objects */ + int count = rb_objc_yield_classes(of); + + if (of != rb_cClass && of != rb_cModule) { + struct rb_objc_recorder_context ctx = {of, count}; + + (((malloc_zone_t *)__auto_zone)->introspect->enumerator)( mach_task_self(), (void *)&ctx, MALLOC_PTR_IN_USE_RANGE_TYPE, (vm_address_t)__auto_zone, NULL, rb_objc_recorder); - return INT2FIX(ctx.count); + + count = ctx.count; + } + + return INT2FIX(count); #else return os_obj_of(&rb_objspace, of); #endif Modified: MacRuby/branches/lrz_unstable/include/ruby/ruby.h =================================================================== --- MacRuby/branches/lrz_unstable/include/ruby/ruby.h 2008-08-03 21:08:32 UTC (rev 404) +++ MacRuby/branches/lrz_unstable/include/ruby/ruby.h 2008-08-04 05:38:19 UTC (rev 405) @@ -502,6 +502,9 @@ # define RCLASS_IS_SINGLETON 0x800 /* class represents a singleton/metaclass */ # define RCLASS_IS_FROZEN 0x1000 /* class is frozen */ # define RCLASS_IS_TAINTED 0x2000 /* class is tainted */ +# define RCLASS_IS_STRING_SUBCLASS 0x10000 /* class is a subclass of NSCFString */ +# define RCLASS_IS_ARRAY_SUBCLASS 0x20000 /* class is a subclass of NSCFArray */ +# define RCLASS_IS_HASH_SUBCLASS 0x40000 /* class is a subclass of NSCFDictionary */ # if __OBJC2__ # define RCLASS_VERSION(m) (class_getVersion((Class)m)) # define RCLASS_SET_VERSION_FLAG(m,f) (class_setVersion((Class)m, (RCLASS_VERSION(m) | f))) @@ -1198,9 +1201,18 @@ else return T_CLASS; } if (k == (Class)rb_cSymbol) return T_SYMBOL; - if (k == (Class)rb_cCFString) return T_STRING; - if (k == (Class)rb_cCFArray) return T_ARRAY; - if (k == (Class)rb_cCFHash) return T_HASH; + if (k == (Class)rb_cCFString + || (RCLASS_VERSION(k) & RCLASS_IS_STRING_SUBCLASS) + == RCLASS_IS_STRING_SUBCLASS) + return T_STRING; + if (k == (Class)rb_cCFArray + || (RCLASS_VERSION(k) & RCLASS_IS_ARRAY_SUBCLASS) + == RCLASS_IS_ARRAY_SUBCLASS) + return T_ARRAY; + if (k == (Class)rb_cCFHash + || (RCLASS_VERSION(k) & RCLASS_IS_HASH_SUBCLASS) + == RCLASS_IS_HASH_SUBCLASS) + return T_HASH; if (NATIVE(obj)) return T_NATIVE; } #endif Modified: MacRuby/branches/lrz_unstable/sample/test.rb =================================================================== --- MacRuby/branches/lrz_unstable/sample/test.rb 2008-08-03 21:08:32 UTC (rev 404) +++ MacRuby/branches/lrz_unstable/sample/test.rb 2008-08-04 05:38:19 UTC (rev 405) @@ -1879,7 +1879,6 @@ false end -=begin for script in Dir["#{dir}{lib,sample,ext,test}/**/*.rb"] unless valid_syntax? IO::read(script), script STDERR.puts script @@ -1887,7 +1886,6 @@ end end test_ok(!$bad) -=end test_check "const" TEST1 = 1
participants (1)
-
source_changes@macosforge.org