Revision: 430 http://trac.macosforge.org/projects/ruby/changeset/430 Author: lsansonetti@apple.com Date: 2008-08-12 21:50:29 -0700 (Tue, 12 Aug 2008) Log Message: ----------- wip Modified Paths: -------------- MacRuby/branches/lrz_unstable/class.c MacRuby/branches/lrz_unstable/object.c MacRuby/branches/lrz_unstable/vm_eval.c MacRuby/branches/lrz_unstable/vm_method.c Modified: MacRuby/branches/lrz_unstable/class.c =================================================================== --- MacRuby/branches/lrz_unstable/class.c 2008-08-13 03:43:15 UTC (rev 429) +++ MacRuby/branches/lrz_unstable/class.c 2008-08-13 04:50:29 UTC (rev 430) @@ -307,7 +307,50 @@ { VALUE klass = RBASIC(obj)->klass; #if WITH_OBJC - return klass; + if (!RCLASS_SINGLETON(klass)) { + return klass; + } + else { + /* copy singleton(unnamed) class */ + VALUE clone = rb_objc_create_class(NULL, RCLASS_SUPER(klass)); + + CFMutableDictionaryRef ivar_dict = rb_class_ivar_dict(klass); + if (ivar_dict != NULL) { + CFMutableDictionaryRef cloned_ivar_dict; + + cloned_ivar_dict = CFDictionaryCreateMutableCopy(NULL, 0, (CFDictionaryRef)ivar_dict); + rb_class_ivar_set_dict(clone, cloned_ivar_dict); + CFMakeCollectable(cloned_ivar_dict); + } + + Method *methods; + unsigned i, methods_count; + methods = class_copyMethodList((Class)klass, &methods_count); + if (methods != NULL) { + for (i = 0; i < methods_count; i++) { + Method method = methods[i], method2; + method2 = class_getInstanceMethod((Class)clone, method_getName(method)); + if (method2 != class_getInstanceMethod((Class)RCLASS_SUPER(clone), method_getName(method))) { + method_setImplementation(method2, method_getImplementation(method)); + } + else { + assert(class_addMethod((Class)clone, + method_getName(method), + method_getImplementation(method), + method_getTypeEncoding(method))); + } + } + free(methods); + } + + rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone); + if (RCLASS_SUPER(clone) == rb_cNSObject) { + RCLASS_VERSION(clone) ^= RCLASS_IS_OBJECT_SUBCLASS; + } + RCLASS_SET_VERSION_FLAG(clone, RCLASS_IS_SINGLETON); + + return clone; + } #else if (!FL_TEST(klass, FL_SINGLETON)) return klass; Modified: MacRuby/branches/lrz_unstable/object.c =================================================================== --- MacRuby/branches/lrz_unstable/object.c 2008-08-13 03:43:15 UTC (rev 429) +++ MacRuby/branches/lrz_unstable/object.c 2008-08-13 04:50:29 UTC (rev 430) @@ -309,6 +309,7 @@ switch (TYPE(obj)) { case T_NATIVE: clone = rb_obj_alloc(rb_obj_class(obj)); + RBASIC(clone)->klass = rb_singleton_class_clone(obj); break; case T_CLASS: case T_MODULE: Modified: MacRuby/branches/lrz_unstable/vm_eval.c =================================================================== --- MacRuby/branches/lrz_unstable/vm_eval.c 2008-08-13 03:43:15 UTC (rev 429) +++ MacRuby/branches/lrz_unstable/vm_eval.c 2008-08-13 04:50:29 UTC (rev 430) @@ -199,12 +199,12 @@ if (argc > 0 && mid != ID_ALLOCATOR) { const char *mid_str; - char buf[512]; + char buf[100]; size_t len; mid_str = rb_id2name(mid); len = strlen(mid_str); - if (len > 1 && mid_str[len - 1] == '=' && isalpha(mid_str[len - 2])) { + if (argc == 1 && len > 1 && mid_str[len - 1] == '=' && isalpha(mid_str[len - 2])) { assert(len + 3 < sizeof(buf)); buf[0] = 's'; buf[1] = 'e'; @@ -213,11 +213,12 @@ strlcpy(&buf[4], &mid_str[1], len - 1); buf[len + 2] = ':'; buf[len + 3] = '\0'; + mid = rb_intern(buf); } else if (mid_str[len - 1] != ':') { snprintf(buf, sizeof buf, "%s:", mid_str); + mid = rb_intern(buf); } - mid = rb_intern(buf); } method = rb_objc_method_node(klass, mid, &imp, &sel); Modified: MacRuby/branches/lrz_unstable/vm_method.c =================================================================== --- MacRuby/branches/lrz_unstable/vm_method.c 2008-08-13 03:43:15 UTC (rev 429) +++ MacRuby/branches/lrz_unstable/vm_method.c 2008-08-13 04:50:29 UTC (rev 430) @@ -316,7 +316,7 @@ { #if WITH_OBJC NODE *node = rb_objc_method_node(klass, id, NULL, NULL); - if (node == NULL) { + if (node == NULL && id != ID_ALLOCATOR) { const char *id_str = rb_id2name(id); size_t slen = strlen(id_str);
participants (1)
-
source_changes@macosforge.org