[macruby-changes] [415] MacRuby/branches/lrz_unstable

source_changes at macosforge.org source_changes at macosforge.org
Sun Aug 10 01:45:15 PDT 2008


Revision: 415
          http://trac.macosforge.org/projects/ruby/changeset/415
Author:   lsansonetti at apple.com
Date:     2008-08-10 01:45:15 -0700 (Sun, 10 Aug 2008)
Log Message:
-----------
wip

Modified Paths:
--------------
    MacRuby/branches/lrz_unstable/class.c
    MacRuby/branches/lrz_unstable/compile.c
    MacRuby/branches/lrz_unstable/hash.c
    MacRuby/branches/lrz_unstable/objc.m
    MacRuby/branches/lrz_unstable/object.c

Modified: MacRuby/branches/lrz_unstable/class.c
===================================================================
--- MacRuby/branches/lrz_unstable/class.c	2008-08-09 02:55:56 UTC (rev 414)
+++ MacRuby/branches/lrz_unstable/class.c	2008-08-10 08:45:15 UTC (rev 415)
@@ -152,17 +152,15 @@
 
 #endif
 
+#if !WITH_OBJC
 static VALUE
 class_alloc(VALUE flags, VALUE klass)
 {
-#if WITH_OBJC
-    return rb_objc_alloc_class(NULL, 0, flags, klass);
-#else
     NEWOBJ(obj, struct RClass);
     OBJSETUP(obj, klass, flags);
     return class_init((VALUE)obj);
+}
 #endif
-}
 
 VALUE
 rb_class_boot(VALUE super)
@@ -480,9 +478,11 @@
 VALUE
 rb_module_new(void)
 {
+#if WITH_OBJC
+    VALUE mdl = rb_objc_alloc_class(NULL, 0, T_MODULE, rb_cModule);
+    objc_registerClassPair((Class)mdl);
+#else
     VALUE mdl = class_alloc(T_MODULE, rb_cModule);
-
-#if !WITH_OBJC
     RCLASS_M_TBL(mdl) = st_init_numtable();
 #endif
 

Modified: MacRuby/branches/lrz_unstable/compile.c
===================================================================
--- MacRuby/branches/lrz_unstable/compile.c	2008-08-09 02:55:56 UTC (rev 414)
+++ MacRuby/branches/lrz_unstable/compile.c	2008-08-10 08:45:15 UTC (rev 415)
@@ -700,11 +700,29 @@
     mcache->as.rcall.klass = 0;
     mcache->as.rcall.node = NULL;
     if (FIX2INT(argc) > 0) {
-        char buf[512];
-        strlcpy(buf, rb_sym2name(id), sizeof buf);
-	if (buf[strlen(buf) - 1] != ':')
-	    strlcat(buf, ":", sizeof buf);
-	mcache->as.rcall.sel = sel_registerName(buf);
+	char *id_str;
+	size_t id_str_len;
+	char buf[100];
+
+	id_str = (char *)rb_sym2name(id);
+	id_str_len = strlen(id_str);
+
+	if (id_str[id_str_len - 1] == '=' && isalpha(id_str[id_str_len - 2]) && FIX2INT(argc) == 1) {
+	    buf[0] = 's';
+	    buf[1] = 'e';
+	    buf[2] = 't';
+	    buf[3] = toupper(id_str[0]);
+	    strncpy(&buf[4], &id_str[1], id_str_len - 2);
+	    buf[id_str_len + 2] = ':';
+	    buf[id_str_len + 3] = '\0';
+	    id_str = buf;
+	}
+	else if (id_str[id_str_len - 1] != ':') {
+	    snprintf(buf, sizeof buf, "%s:", id_str);
+	    id_str = buf;
+	}
+
+	mcache->as.rcall.sel = sel_registerName(id_str);
     }
     else {
 	mcache->as.rcall.sel = sel_registerName(rb_sym2name(id));

Modified: MacRuby/branches/lrz_unstable/hash.c
===================================================================
--- MacRuby/branches/lrz_unstable/hash.c	2008-08-09 02:55:56 UTC (rev 414)
+++ MacRuby/branches/lrz_unstable/hash.c	2008-08-10 08:45:15 UTC (rev 415)
@@ -3041,8 +3041,6 @@
     rb_include_module(rb_cHash, rb_mEnumerable);
 
 #if WITH_OBJC
-    /* required because Hash.new can accept a block */
-    rb_define_singleton_method(rb_cHash, "new", rb_class_new_instance, -1);
     /* to return a mutable copy */
     rb_define_method(rb_cHash, "dup", rb_hash_dup, 0);
 #else

Modified: MacRuby/branches/lrz_unstable/objc.m
===================================================================
--- MacRuby/branches/lrz_unstable/objc.m	2008-08-09 02:55:56 UTC (rev 414)
+++ MacRuby/branches/lrz_unstable/objc.m	2008-08-10 08:45:15 UTC (rev 415)
@@ -1007,6 +1007,11 @@
     char buf[128];
     id ocrcv;
 
+    /* XXX because Hash.new can accept a block */
+    if (recv == rb_cNSMutableHash && sel == @selector(new)) {
+	return rb_class_new_instance(0, NULL, recv);
+    }
+
     ocrcv = RB2OC(recv);
 
     DLOG("OCALL", "%c[<%s %p> %s]", class_isMetaClass((Class)klass) ? '+' : '-', class_getName((Class)klass), (void *)ocrcv, (char *)sel);
@@ -1341,10 +1346,14 @@
 	*pimp = imp;
 
     if (imp == NULL) {
-    	char buf[512];
-	strlcpy(buf, (char *)sel, sizeof buf);
-	if (buf[strlen(buf) - 1] == ':')
+    	char buf[100];
+	size_t slen;
+
+	slen = strlen((char *)sel);
+	if (((char *)sel)[slen - 1] == ':') {
 	    return NULL;
+	}
+	strlcpy(buf, (char *)sel, sizeof buf);
 	strlcat(buf, ":", sizeof buf);
 	return rb_objc_method_node2(mod, sel_registerName(buf), pimp);
     }
@@ -1359,7 +1368,6 @@
     Method method;
     char *types;
     int arity, oc_arity;
-    char *mid_str;
     IMP imp;
     bool direct_override;
     NODE *node;
@@ -1402,30 +1410,47 @@
     }
 
     if (mid == ID_ALLOCATOR) {
-	mid_str = "alloc";	
+	sel = @selector(alloc);
     }
     else {
+	char *mid_str;
+	size_t mid_str_len;
+	char buf[100];
+
 	mid_str = (char *)rb_id2name(mid);
+	mid_str_len = strlen(mid_str);
+
+	if (arity == 1 && mid_str[mid_str_len - 1] == '=' && isalpha(mid_str[mid_str_len - 2])) {
+	    assert(sizeof(buf) > mid_str_len + 3);
+	    buf[0] = 's';
+	    buf[1] = 'e';
+	    buf[2] = 't';
+	    buf[3] = toupper(mid_str[0]);
+	    strncpy(&buf[4], &mid_str[1], mid_str_len - 2);
+	    buf[mid_str_len + 2] = ':';
+	    buf[mid_str_len + 3] = '\0';
+	    sel = sel_registerName(buf);
+	}
+	else {
+	    if ((arity < 0 || arity > 0) && mid_str[mid_str_len - 1] != ':') {
+		assert(sizeof(buf) > mid_str_len + 1);
+		snprintf(buf, sizeof buf, "%s:", mid_str);
+		sel = sel_registerName(buf);
+		oc_arity = 1;
+	    }
+	    else {
+		sel = sel_registerName(mid_str);
+		if (sel == sel_ignored) {
+		    assert(sizeof(buf) > mid_str_len + 7);
+		    snprintf(buf, sizeof buf, "__rb_%s__", mid_str);
+		    sel = sel_registerName(buf);
+		}
+	    }
+	}
     }
 
     included_in_classes = RCLASS_MODULE(mod) ? rb_ivar_get(mod, idIncludedInClasses) : Qnil;
 
-    if ((arity < 0 || arity > 0) && mid_str[strlen(mid_str) - 1] != ':') {
-	char buf[100];
-	snprintf(buf, sizeof buf, "%s:", mid_str);
-	sel = sel_registerName(buf);
-	oc_arity = 1;
-    }
-    else {
-	sel = sel_registerName(mid_str);
-    }
-
-    if (sel == sel_ignored) {
-	char buf[100];
-	snprintf(buf, sizeof buf, "__rb_%s__", mid_str);
-	sel = sel_registerName(buf);
-    }
-
     direct_override = false;
     method = class_getInstanceMethod((Class)mod, sel);
 
@@ -2079,7 +2104,7 @@
 	{
 	    bs_element_function_t *bs_func = (bs_element_function_t *)value;
 	    ID name = rb_intern(bs_func->name);
-	    if (1) {
+	    if (!st_lookup(bs_functions, (st_data_t)name, NULL)) {
 		st_insert(bs_functions, (st_data_t)name, (st_data_t)bs_func);
 		do_not_free = true;
 	    }
@@ -2093,8 +2118,13 @@
 	{
 	    bs_element_function_alias_t *bs_func_alias = 
 		(bs_element_function_alias_t *)value;
-	    rb_define_alias(CLASS_OF(rb_mKernel), bs_func_alias->name,
-			    bs_func_alias->original);
+	    bs_element_function_t *bs_func_original;
+	    if (st_lookup(bs_functions, (st_data_t)rb_intern(bs_func_alias->original), (st_data_t *)&bs_func_original)) {
+		st_insert(bs_functions, (st_data_t)rb_intern(bs_func_alias->name), (st_data_t)bs_func_original);
+	    }
+	    else {
+		rb_raise(rb_eRuntimeError, "cannot alias '%s' to '%s' because it doesn't exist", bs_func_alias->name, bs_func_alias->original);
+	    }
 	    break;
 	}
 
@@ -2433,54 +2463,6 @@
 }
 #endif
 
-ID
-rb_objc_missing_sel(ID mid, int arity)
-{
-    const char *name;
-    size_t len;
-    char buf[100];
-
-    if (mid == 0)
-	return mid;
-
-    name = rb_id2name(mid);
-    if (name == NULL)
-	return mid;
-
-    len = strlen(name);
-    if (len == 0)
-	return mid;
-    
-    if (arity == 1 && name[len - 1] == '=') {
-	strlcpy(buf, "set", sizeof buf);
-	buf[3] = toupper(name[0]);
-	buf[4] = '\0';
-	strlcat(buf, &name[1], sizeof buf);
-	buf[len + 2] = ':';
-    }
-    else if (arity == 0 && name[len - 1] == '?') {
-	strlcpy(buf, "is", sizeof buf);
-	buf[2] = toupper(name[0]);
-	buf[3] = '\0';
-	strlcat(buf, &name[1], sizeof buf);
-	buf[len + 1] = '\0';
-    }
-    else if (arity >= 1 && name[len - 1] != ':' && len < sizeof buf) {
-	strlcpy(buf, name, sizeof buf);
-	buf[len] = ':';
-	buf[len + 1] = '\0';
-    }
-    else if (arity == 1 && name[len - 1] == ':' && len < sizeof buf) {
-	strlcpy(buf, name, sizeof buf);
-	buf[len - 1] = '\0';
-    }
-    else {
-	return mid;
-    }
-
-    return rb_intern(buf);	
-}
-
 static const char *
 resources_path(char *path, size_t len)
 {
@@ -2865,6 +2847,7 @@
 	bs_const_magic_cookie = rb_str_new2("bs_const_magic_cookie")));
 
     rb_cBoxed = rb_define_class("Boxed", (VALUE)objc_getClass("NSValue"));
+    RCLASS_SET_VERSION_FLAG(rb_cBoxed, RCLASS_IS_OBJECT_SUBCLASS);
     rb_define_singleton_method(rb_cBoxed, "objc_type", rb_boxed_objc_type, 0);
     rb_define_singleton_method(rb_cBoxed, "opaque?", rb_boxed_is_opaque, 0);
     rb_define_singleton_method(rb_cBoxed, "fields", rb_boxed_fields, 0);

Modified: MacRuby/branches/lrz_unstable/object.c
===================================================================
--- MacRuby/branches/lrz_unstable/object.c	2008-08-09 02:55:56 UTC (rev 414)
+++ MacRuby/branches/lrz_unstable/object.c	2008-08-10 08:45:15 UTC (rev 415)
@@ -928,18 +928,21 @@
 	return Qfalse;
     }
 #if WITH_OBJC
-    if (NATIVE(obj)) {
-	return rb_objc_is_immutable(obj) 
-	    || rb_objc_flag_check((const void *)obj, FL_FREEZE)
-	    ? Qtrue : Qfalse;
+    switch (TYPE(obj)) {
+	case T_NATIVE:
+	    return rb_objc_is_immutable(obj) 
+		|| rb_objc_flag_check((const void *)obj, FL_FREEZE)
+		? Qtrue : Qfalse;
+	case T_CLASS:
+	case T_MODULE:
+	    return (RCLASS_VERSION(obj) & RCLASS_IS_FROZEN) == RCLASS_IS_FROZEN ? Qtrue : Qfalse;
+	default:
+	    return FL_TEST(obj, FL_FREEZE) ? Qtrue : Qfalse;
     }
-    int type = TYPE(obj);
-    if (type == T_CLASS || type == T_MODULE) {
-	return (RCLASS_VERSION(obj) & RCLASS_IS_FROZEN) == RCLASS_IS_FROZEN ? Qtrue : Qfalse;
-    }
-#endif
+#else
     if (FL_TEST(obj, FL_FREEZE)) return Qtrue;
     return Qfalse;
+#endif
 }
 
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macruby-changes/attachments/20080810/d154939d/attachment.html 


More information about the macruby-changes mailing list