[macruby-changes] [4768] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Fri Oct 8 15:02:46 PDT 2010


Revision: 4768
          http://trac.macosforge.org/projects/ruby/changeset/4768
Author:   lsansonetti at apple.com
Date:     2010-10-08 15:02:44 -0700 (Fri, 08 Oct 2010)
Log Message:
-----------
define our own version of method_getNumberOfArguments() since the system one is broken on SnowLeopard for Block types8~8~

Modified Paths:
--------------
    MacRuby/trunk/dispatcher.cpp
    MacRuby/trunk/objc.h
    MacRuby/trunk/objc.m
    MacRuby/trunk/vm.cpp

Modified: MacRuby/trunk/dispatcher.cpp
===================================================================
--- MacRuby/trunk/dispatcher.cpp	2010-10-08 22:01:39 UTC (rev 4767)
+++ MacRuby/trunk/dispatcher.cpp	2010-10-08 22:02:44 UTC (rev 4768)
@@ -530,7 +530,7 @@
     if (cache->as.ocall.bs_method != NULL
 	    && cache->as.ocall.bs_method->variadic && method != NULL) {
 	// TODO honor printf_format
-	const int real_argc = method_getNumberOfArguments(method) - 2;
+	const int real_argc = rb_method_getNumberOfArguments(method) - 2;
 	if (real_argc < argc) {
 	    const size_t s = strlen(types);
 	    assert(s + argc - real_argc < sizeof types);
@@ -986,7 +986,7 @@
 		    expected_argc = node->arity.min;
 		}
 		else {
-		    expected_argc = method_getNumberOfArguments(m);
+		    expected_argc = rb_method_getNumberOfArguments(m);
 		    expected_argc -= 2; // removing receiver and selector
 		}
 		rb_raise(rb_eArgError, "wrong number of arguments (%d for %d)",
@@ -1434,7 +1434,7 @@
     int arity;
     rb_vm_method_node_t *new_node;
     if (node == NULL) {
-	arity = method_getNumberOfArguments(method) - 2;
+	arity = rb_method_getNumberOfArguments(method) - 2;
 	new_node = NULL;
     }
     else {

Modified: MacRuby/trunk/objc.h
===================================================================
--- MacRuby/trunk/objc.h	2010-10-08 22:01:39 UTC (rev 4767)
+++ MacRuby/trunk/objc.h	2010-10-08 22:02:44 UTC (rev 4768)
@@ -145,6 +145,12 @@
             case 'V':   /* oneway */
                 break;
 
+	    case _C_ID:
+		if (*type == _C_UNDEF) {
+		    type++;  /* Blocks */
+		}
+		return type;
+
                 /* arrays */
             case _C_ARY_B:
                 return type + SubtypeUntil (type, _C_ARY_E) + 1;
@@ -191,6 +197,16 @@
     return arity;
 }
 
+// We do not use method_getNumberOfArguments since it's broken on 
+// SnowLeopard for signatures containing Block objects.
+static inline unsigned int
+rb_method_getNumberOfArguments(Method m)
+{
+    const unsigned int arity = TypeArity(method_getTypeEncoding(m));
+    assert(arity >= 2);
+    return arity - 1; // Skip return type.
+}
+
 id rb_objc_numeric2nsnumber(VALUE obj);
 VALUE rb_objc_convert_immediate(id obj);
 

Modified: MacRuby/trunk/objc.m
===================================================================
--- MacRuby/trunk/objc.m	2010-10-08 22:01:39 UTC (rev 4767)
+++ MacRuby/trunk/objc.m	2010-10-08 22:02:44 UTC (rev 4768)
@@ -33,6 +33,8 @@
     const char *type;
     unsigned i;
 
+    memset(buf, 0, buflen);
+
     if (method != NULL) {
 	if (bs_method == NULL) {
 	    type = method_getTypeEncoding(method);
@@ -44,8 +46,6 @@
 		type = SkipStackSize(type2);
 	    }
 	    while (*type != '\0');
-	    //strlcpy(buf, method_getTypeEncoding(method), buflen);
-	    //sig->argc = method_getNumberOfArguments(method);
 	}
 	else {
 	    char buf2[100];
@@ -58,8 +58,7 @@
 		strlcpy(buf, buf2, buflen);
 	    }
 
-	    //sig->argc = method_getNumberOfArguments(method);
-	    int argc = method_getNumberOfArguments(method);
+	    const unsigned int argc = rb_method_getNumberOfArguments(method);
 	    for (i = 0; i < argc; i++) {
 		if (i >= 2 && (type = rb_get_bs_method_type(bs_method, i - 2))
 			!= NULL) {
@@ -84,8 +83,7 @@
 	    }
 	    strlcpy(buf, type, buflen);
 
-	    //sig->argc = [msig numberOfArguments];
-	    int argc = [msig numberOfArguments];
+	    const int argc = [msig numberOfArguments];
 	    for (i = 0; i < argc; i++) {
 		if (i < 2 || (type = rb_get_bs_method_type(bs_method, i - 2))
 			== NULL) {

Modified: MacRuby/trunk/vm.cpp
===================================================================
--- MacRuby/trunk/vm.cpp	2010-10-08 22:01:39 UTC (rev 4767)
+++ MacRuby/trunk/vm.cpp	2010-10-08 22:02:44 UTC (rev 4768)
@@ -1782,7 +1782,7 @@
     }
     else {
 	assert(strlen(buf) >= 3);
-	for (unsigned int i = method_getNumberOfArguments(m) + 1;
+	for (unsigned int i = rb_method_getNumberOfArguments(m) + 1;
 		i < types_count; i++) {
 	    strlcat(buf, "@", buflen);
 	}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20101008/960b3d65/attachment.html>


More information about the macruby-changes mailing list