[macruby-changes] [4033] MacRuby/trunk/NSString.m

source_changes at macosforge.org source_changes at macosforge.org
Thu May 6 15:01:37 PDT 2010


Revision: 4033
          http://trac.macosforge.org/projects/ruby/changeset/4033
Author:   lsansonetti at apple.com
Date:     2010-05-06 15:01:33 -0700 (Thu, 06 May 2010)
Log Message:
-----------
register the forwarders with the correct arity to avoid recursive dispatch

Modified Paths:
--------------
    MacRuby/trunk/NSString.m

Modified: MacRuby/trunk/NSString.m
===================================================================
--- MacRuby/trunk/NSString.m	2010-05-06 09:39:09 UTC (rev 4032)
+++ MacRuby/trunk/NSString.m	2010-05-06 22:01:33 UTC (rev 4033)
@@ -195,15 +195,35 @@
 }
 
 static VALUE
-nsstr_forward(id rcv, SEL sel, int argc, VALUE *argv)
+nsstr_forward_m1(id rcv, SEL sel, int argc, VALUE *argv)
 {
     return rb_vm_call_with_cache2(rb_vm_get_call_cache(sel),
 	    rb_vm_current_block(), nsstr_to_rstr(rcv), 0, sel, argc, argv);
 }
 
 static VALUE
-nsstr_forward_bang(id rcv, SEL sel, int argc, VALUE *argv)
+nsstr_forward_1(id rcv, SEL sel, VALUE arg1)
 {
+    return nsstr_forward_m1(rcv, sel, 1, &arg1);
+}
+
+static VALUE
+nsstr_forward_2(id rcv, SEL sel, VALUE arg1, VALUE arg2)
+{
+    VALUE args[2] = {arg1, arg2};
+    return nsstr_forward_m1(rcv, sel, 2, args);
+}
+
+static VALUE
+nsstr_forward_3(id rcv, SEL sel, VALUE arg1, VALUE arg2, VALUE arg3)
+{
+    VALUE args[3] = {arg1, arg2, arg3};
+    return nsstr_forward_m1(rcv, sel, 3, args);
+}
+
+static VALUE
+nsstr_forward_bang_m1(id rcv, SEL sel, int argc, VALUE *argv)
+{
     CHECK_MUTABLE(rcv);
     VALUE rcv_rstr = nsstr_to_rstr(rcv);
     VALUE ret = rb_vm_call_with_cache2(rb_vm_get_call_cache(sel),
@@ -212,6 +232,26 @@
     return ret;
 }
 
+static VALUE
+nsstr_forward_bang_1(id rcv, SEL sel, VALUE arg1)
+{
+    return nsstr_forward_bang_m1(rcv, sel, 1, &arg1);    
+}
+
+static VALUE
+nsstr_forward_bang_2(id rcv, SEL sel, VALUE arg1, VALUE arg2)
+{
+    VALUE args[2] = {arg1, arg2};
+    return nsstr_forward_bang_m1(rcv, sel, 2, args);
+}
+
+static VALUE
+nsstr_forward_bang_3(id rcv, SEL sel, VALUE arg1, VALUE arg2, VALUE arg3)
+{
+    VALUE args[3] = {arg1, arg2, arg3};
+    return nsstr_forward_bang_m1(rcv, sel, 3, args);
+}
+
 void
 rb_str_NSCoder_encode(void *coder, VALUE str, const char *key)
 {
@@ -252,87 +292,96 @@
     rb_objc_define_method(rb_cString, "casecmp", nsstr_casecmp, 1);
     rb_objc_define_method(rb_cString, "include?", nsstr_include, 1);
 
-#define forward(msg) \
-	rb_objc_define_method(rb_cString, msg, nsstr_forward, -1)
-#define forward_bang(msg) \
-	rb_objc_define_method(rb_cString, msg, nsstr_forward_bang, -1)
+#define pick_forwarder(arity, bang) \
+    (arity == -1 ? (bang ? nsstr_forward_bang_m1 : nsstr_forward_m1)  \
+     : (arity == 0) ? (bang ? nsstr_forward_bang_1 : nsstr_forward_1) \
+     : (arity == 1) ? (bang ? nsstr_forward_bang_1 : nsstr_forward_1) \
+     : (arity == 2) ? (bang ? nsstr_forward_bang_2 : nsstr_forward_2) \
+     : (arity == 3) ? (bang ? nsstr_forward_bang_3 : nsstr_forward_3) \
+     : (abort(),NULL))
+
+#define forward(msg, arity) \
+    rb_objc_define_method(rb_cString, msg, pick_forwarder(arity, false), arity)
+
+#define forward_bang(msg, arity) \
+    rb_objc_define_method(rb_cString, msg, pick_forwarder(arity, true), arity)
     
     // These methods are implemented as forwarders.
-    forward("[]");
-    forward_bang("[]=");
-    forward("slice");
-    forward_bang("slice!");
-    forward_bang("insert");
-    forward("index");
-    forward("rindex");
-    forward("+");
-    forward("*");
-    forward("%");
-    forward("start_with?");
-    forward("end_with?");
-    forward("to_sym");
-    forward("intern");
-    forward("inspect");
-    forward("dump");
-    forward("match");
-    forward("=~");
-    forward("scan");
-    forward("split");
-    forward("to_i");
-    forward("hex");
-    forward("oct");
-    forward("ord");
-    forward("chr");
-    forward("to_f");
-    forward("chomp");
-    forward_bang("chomp!");
-    forward("chop");
-    forward_bang("chop!");
-    forward("sub");
-    forward_bang("sub!");
-    forward("gsub");
-    forward_bang("gsub!");
-    forward("downcase");
-    forward_bang("downcase!");
-    forward("upcase");
-    forward_bang("upcase!");
-    forward("swapcase");
-    forward_bang("swapcase!");
-    forward("capitalize");
-    forward_bang("capitalize!");
-    forward("ljust");
-    forward("rjust");
-    forward("center");
-    forward("strip");
-    forward("lstrip");
-    forward("rstrip");
-    forward_bang("strip!");
-    forward_bang("lstrip!");
-    forward_bang("rstrip!");
-    forward("lines");
-    forward("each_line");
-    forward("chars");
-    forward("each_char");
-    forward("succ");
-    forward_bang("succ!");
-    forward("next");
-    forward_bang("next!");
-    forward("upto");
-    forward("reverse");
-    forward_bang("reverse!");
-    forward("count");
-    forward("delete");
-    forward_bang("delete!");
-    forward("squeeze");
-    forward_bang("squeeze!");
-    forward("tr");
-    forward_bang("tr!");
-    forward("tr_s");
-    forward_bang("tr_s!");
-    forward("sum");
-    forward("partition");
-    forward("rpartition");
-    forward("crypt");
+    forward("[]", -1);
+    forward_bang("[]=", -1);
+    forward("slice", -1);
+    forward_bang("slice!", -1);
+    forward_bang("insert", 3);
+    forward("index", -1);
+    forward("rindex", -1);
+    forward("+", 1);
+    forward("*", 1);
+    forward("%", 1);
+    forward("start_with?", -1);
+    forward("end_with?", -1);
+    forward("to_sym", 0);
+    forward("intern", 0);
+    forward("inspect", 0);
+    forward("dump", 0);
+    forward("match", -1);
+    forward("=~", 1);
+    forward("scan", 1);
+    forward("split", -1);
+    forward("to_i", -1);
+    forward("hex", 0);
+    forward("oct", 0);
+    forward("ord", 0);
+    forward("chr", 0);
+    forward("to_f", 0);
+    forward("chomp", -1);
+    forward_bang("chomp!", -1);
+    forward("chop", -1);
+    forward_bang("chop!", -1);
+    forward("sub", -1);
+    forward_bang("sub!", -1);
+    forward("gsub", -1);
+    forward_bang("gsub!", -1);
+    forward("downcase", 0);
+    forward_bang("downcase!", 0);
+    forward("upcase", 0);
+    forward_bang("upcase!", 0);
+    forward("swapcase", 0);
+    forward_bang("swapcase!", 0);
+    forward("capitalize", 0);
+    forward_bang("capitalize!", 0);
+    forward("ljust", -1);
+    forward("rjust", -1);
+    forward("center", -1);
+    forward("strip", -1);
+    forward("lstrip", -1);
+    forward("rstrip", -1);
+    forward_bang("strip!", 0);
+    forward_bang("lstrip!", 0);
+    forward_bang("rstrip!", 0);
+    forward("lines", -1);
+    forward("each_line", -1);
+    forward("chars", 0);
+    forward("each_char", 0);
+    forward("succ", 0);
+    forward_bang("succ!", 0);
+    forward("next", 0);
+    forward_bang("next!", 0);
+    forward("upto", -1);
+    forward("reverse", 0);
+    forward_bang("reverse!", 0);
+    forward("count", -1);
+    forward("delete", -1);
+    forward_bang("delete!", -1);
+    forward("squeeze", -1);
+    forward_bang("squeeze!", -1);
+    forward("tr", 2);
+    forward_bang("tr!", 2);
+    forward("tr_s", 2);
+    forward_bang("tr_s!", 2);
+    forward("sum", -1);
+    forward("partition", 1);
+    forward("rpartition", 1);
+    forward("crypt", 1);
 
 #undef forward
 #undef forward_bang
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100506/ae1e514e/attachment.html>


More information about the macruby-changes mailing list