[406] MacRuby/branches/lrz_unstable
Revision: 406 http://trac.macosforge.org/projects/ruby/changeset/406 Author: lsansonetti@apple.com Date: 2008-08-04 14:45:36 -0700 (Mon, 04 Aug 2008) Log Message: ----------- wip Modified Paths: -------------- MacRuby/branches/lrz_unstable/class.c MacRuby/branches/lrz_unstable/hash.c MacRuby/branches/lrz_unstable/include/ruby/node.h MacRuby/branches/lrz_unstable/include/ruby/ruby.h MacRuby/branches/lrz_unstable/objc.m MacRuby/branches/lrz_unstable/object.c MacRuby/branches/lrz_unstable/sample/test.rb MacRuby/branches/lrz_unstable/vm_eval.c MacRuby/branches/lrz_unstable/vm_insnhelper.c Modified: MacRuby/branches/lrz_unstable/class.c =================================================================== --- MacRuby/branches/lrz_unstable/class.c 2008-08-04 05:38:19 UTC (rev 405) +++ MacRuby/branches/lrz_unstable/class.c 2008-08-04 21:45:36 UTC (rev 406) @@ -566,6 +566,8 @@ rb_include_module(VALUE klass, VALUE module) { #if WITH_OBJC + Method *methods; + unsigned int i, methods_count; VALUE ary; rb_frozen_class_p(klass); @@ -580,6 +582,8 @@ ary = rb_ary_new(); rb_ivar_set(klass, idIncludedModules, ary); } + if (rb_ary_includes(ary, module)) + return; rb_ary_insert(ary, 0, module); ary = rb_ivar_get(module, idIncludedInClasses); @@ -591,9 +595,6 @@ DLOG("INCM", "%s <- %s", class_getName((Class)klass), class_getName((Class)module)); - Method *methods; - unsigned int i, methods_count; - methods = class_copyMethodList((Class)module, &methods_count); for (i = 0; i < methods_count; i++) { Method method = methods[i]; @@ -668,23 +669,29 @@ VALUE rb_mod_included_modules(VALUE mod) { - VALUE ary = rb_ary_new(); - VALUE p; + VALUE p, ary = rb_ary_new(); - for (p = RCLASS_SUPER(mod); p; p = RCLASS_SUPER(p)) { #if WITH_OBJC + for (p = mod; p; p = RCLASS_SUPER(p)) { VALUE inc_mods = rb_ivar_get(p, idIncludedModules); if (inc_mods != Qnil) { int i, count = RARRAY_LEN(inc_mods); - for (i = 0; i < count; i++) - rb_ary_push(ary, RARRAY_AT(inc_mods, i)); + for (i = 0; i < count; i++) { + VALUE imod = RARRAY_AT(inc_mods, i); + rb_ary_push(ary, imod); + rb_ary_concat(ary, rb_mod_included_modules(imod)); + } } + if (RCLASS_MODULE(p)) + break; + } #else + for (p = RCLASS_SUPER(mod); p; p = RCLASS_SUPER(p)) { if (BUILTIN_TYPE(p) == T_ICLASS) { rb_ary_push(ary, RBASIC(p)->klass); } + } #endif - } return ary; } @@ -745,19 +752,16 @@ rb_mod_ancestors(VALUE mod) { VALUE p, ary = rb_ary_new(); - + +#if WITH_OBJC for (p = mod; p; p = RCLASS_SUPER(p)) { -#if WITH_OBJC - VALUE inc_mods; - rb_ary_push(ary, p); - inc_mods = rb_ivar_get(p, idIncludedModules); - if (inc_mods != Qnil) { - int i, count; - for (i = 0, count = RARRAY_LEN(inc_mods); i < count; i++) - rb_ary_push(ary, RARRAY_AT(inc_mods, i)); - } + rb_ary_concat(ary, rb_mod_included_modules(p)); + if (RCLASS_MODULE(p)) + break; + } #else + for (p = mod; p; p = RCLASS_SUPER(p)) { if (RCLASS_SINGLETON(p)) continue; if (BUILTIN_TYPE(p) == T_ICLASS) { @@ -766,8 +770,8 @@ else { rb_ary_push(ary, p); } + } #endif - } return ary; } Modified: MacRuby/branches/lrz_unstable/hash.c =================================================================== --- MacRuby/branches/lrz_unstable/hash.c 2008-08-04 05:38:19 UTC (rev 405) +++ MacRuby/branches/lrz_unstable/hash.c 2008-08-04 21:45:36 UTC (rev 406) @@ -3032,7 +3032,10 @@ rb_include_module(rb_cHash, rb_mEnumerable); -#if !WITH_OBJC +#if WITH_OBJC + /* required because Hash.new can accept a block */ + rb_define_singleton_method(rb_cHash, "new", rb_class_new_instance, -1); +#else rb_define_alloc_func(rb_cHash, hash_alloc); #endif rb_define_singleton_method(rb_cHash, "[]", rb_hash_s_create, -1); Modified: MacRuby/branches/lrz_unstable/include/ruby/node.h =================================================================== --- MacRuby/branches/lrz_unstable/include/ruby/node.h 2008-08-04 05:38:19 UTC (rev 405) +++ MacRuby/branches/lrz_unstable/include/ruby/node.h 2008-08-04 21:45:36 UTC (rev 406) @@ -509,6 +509,7 @@ #if WITH_OBJC void rb_objc_register_ruby_method(VALUE, ID, NODE *); NODE *rb_objc_method_node(VALUE, ID, IMP *, SEL *); +NODE *rb_objc_method_node2(VALUE, SEL, IMP *); #endif NODE *rb_node_newnode(enum node_type,VALUE,VALUE,VALUE); Modified: MacRuby/branches/lrz_unstable/include/ruby/ruby.h =================================================================== --- MacRuby/branches/lrz_unstable/include/ruby/ruby.h 2008-08-04 05:38:19 UTC (rev 405) +++ MacRuby/branches/lrz_unstable/include/ruby/ruby.h 2008-08-04 21:45:36 UTC (rev 406) @@ -1203,15 +1203,15 @@ if (k == (Class)rb_cSymbol) return T_SYMBOL; if (k == (Class)rb_cCFString || (RCLASS_VERSION(k) & RCLASS_IS_STRING_SUBCLASS) - == 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) + == RCLASS_IS_ARRAY_SUBCLASS) return T_ARRAY; if (k == (Class)rb_cCFHash || (RCLASS_VERSION(k) & RCLASS_IS_HASH_SUBCLASS) - == RCLASS_IS_HASH_SUBCLASS) + == RCLASS_IS_HASH_SUBCLASS) return T_HASH; if (NATIVE(obj)) return T_NATIVE; } Modified: MacRuby/branches/lrz_unstable/objc.m =================================================================== --- MacRuby/branches/lrz_unstable/objc.m 2008-08-04 05:38:19 UTC (rev 405) +++ MacRuby/branches/lrz_unstable/objc.m 2008-08-04 21:45:36 UTC (rev 406) @@ -1020,7 +1020,7 @@ char buf[128]; void *imp; - DLOG("OCALL", "[<%s %p> %s]", class_getName((Class)klass), (void *)ocrcv, (char *)ctx->selector); + DLOG("OCALL", "%c[<%s %p> %s]", class_isMetaClass(klass) ? '+' : '-', class_getName(klass), (void *)ocrcv, (char *)ctx->selector); count = method_getNumberOfArguments(ctx->method); assert(count >= 2); Modified: MacRuby/branches/lrz_unstable/object.c =================================================================== --- MacRuby/branches/lrz_unstable/object.c 2008-08-04 05:38:19 UTC (rev 405) +++ MacRuby/branches/lrz_unstable/object.c 2008-08-04 21:45:36 UTC (rev 406) @@ -1329,9 +1329,7 @@ VALUE rb_class_inherited_p(VALUE mod, VALUE arg) { -#if !WITH_OBJC VALUE start = mod; -#endif if (mod == arg) return Qtrue; switch (TYPE(arg)) { @@ -1341,7 +1339,18 @@ default: rb_raise(rb_eTypeError, "compared with non class/module"); } -#if WITH_OBJC // TODO +#if WITH_OBJC + while (mod) { + if (mod == arg) + return Qtrue; + mod = RCLASS_SUPER(mod); + } + /* not mod < arg; check if mod > arg */ + while (arg) { + if (arg == start) + return Qfalse; + arg = RCLASS_SUPER(arg); + } #else while (mod) { if (RCLASS_M_TBL(mod) == RCLASS_M_TBL(arg)) Modified: MacRuby/branches/lrz_unstable/sample/test.rb =================================================================== --- MacRuby/branches/lrz_unstable/sample/test.rb 2008-08-04 05:38:19 UTC (rev 405) +++ MacRuby/branches/lrz_unstable/sample/test.rb 2008-08-04 21:45:36 UTC (rev 406) @@ -1910,8 +1910,8 @@ test_ok([TEST1,TEST2,TEST3,TEST4] == [1,2,6,8]) -test_ok((String <=> Object) == -1) -test_ok((Object <=> String) == 1) +test_ok((String <=> NSObject) == -1) +test_ok((NSObject <=> String) == 1) test_ok((Array <=> String) == nil) test_check "clone" Modified: MacRuby/branches/lrz_unstable/vm_eval.c =================================================================== --- MacRuby/branches/lrz_unstable/vm_eval.c 2008-08-04 05:38:19 UTC (rev 405) +++ MacRuby/branches/lrz_unstable/vm_eval.c 2008-08-04 21:45:36 UTC (rev 406) @@ -210,7 +210,7 @@ if (imp != NULL && method == NULL) return rb_objc_call(recv, sel, argc, (VALUE *)argv); - DLOG("RCALL", "[<%s %p> %s] node=%p", class_getName((Class)klass), (void *)recv, (char *)sel, method); + DLOG("RCALL", "%c[<%s %p> %s] node=%p", class_isMetaClass((Class)klass) ? '+' : '-', class_getName((Class)klass), (void *)recv, (char *)sel, method); if (method == NULL) { int missing_scope = scope == 2 ? NOEX_VCALL : scope == 3 ? NOEX_SUPER : NOEX_VCALL; Modified: MacRuby/branches/lrz_unstable/vm_insnhelper.c =================================================================== --- MacRuby/branches/lrz_unstable/vm_insnhelper.c 2008-08-04 05:38:19 UTC (rev 405) +++ MacRuby/branches/lrz_unstable/vm_insnhelper.c 2008-08-04 21:45:36 UTC (rev 406) @@ -531,13 +531,10 @@ else { #endif - NODE *rb_objc_method_node2(VALUE mod, SEL sel, IMP *pimp); + mn = sel == 0 + ? rb_objc_method_node(klass, id, &imp, &sel) + : rb_objc_method_node2(klass, sel, &imp); - if (sel == 0) - mn = rb_objc_method_node(klass, id, &imp, &sel); - else - mn = rb_objc_method_node2(klass, sel, &imp); - if (flag & VM_CALL_SEND_BIT) { vm_send_optimize(cfp, (NODE **)&mn, (rb_num_t *)&flag, (rb_num_t *)&num, (ID *)&id, klass); } @@ -571,7 +568,7 @@ return val; } - DLOG("RCALL", "[<%s %p> %s] node=%p", class_getName((Class)klass), (void *)recv, (char *)sel, mn); + DLOG("RCALL", "%c[<%s %p> %s] node=%p", class_isMetaClass((Class)klass) ? '+' : '-', class_getName((Class)klass), (void *)recv, (char *)sel, mn); #endif start_method_dispatch:
participants (1)
-
source_changes@macosforge.org