[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