[macruby-changes] [5103] MacRuby/trunk/parse.y

source_changes at macosforge.org source_changes at macosforge.org
Sun Jan 2 21:07:22 PST 2011


Revision: 5103
          http://trac.macosforge.org/projects/ruby/changeset/5103
Author:   lsansonetti at apple.com
Date:     2011-01-02 21:07:18 -0800 (Sun, 02 Jan 2011)
Log Message:
-----------
add support for variadic objc method dispatch (patch by kouji at takao7.net)

Modified Paths:
--------------
    MacRuby/trunk/parse.y

Modified: MacRuby/trunk/parse.y
===================================================================
--- MacRuby/trunk/parse.y	2011-01-03 03:44:03 UTC (rev 5102)
+++ MacRuby/trunk/parse.y	2011-01-03 05:07:18 UTC (rev 5103)
@@ -2387,6 +2387,33 @@
 			$$ = arg_add_optblock(arg_add_assocs($1, $3), $4);
 		    %*/
 		    }
+		| args ',' assocs ',' args opt_block_arg
+		    {
+		    /*%%%*/
+#if WITH_OBJC
+			NODE *n;
+			unsigned all_symbol_pairs = 1;
+			if ($1->nd_alen != 1)
+			    yyerror("invalid use of named arguments in method call");
+			for (n = $3; n != NULL; 
+			     n = n->nd_next->nd_next) {
+			    if (nd_type(n->nd_head) != NODE_LIT
+			        || TYPE(n->nd_head->nd_head) != T_SYMBOL) {
+			        all_symbol_pairs = 0;
+			        break;
+			    }
+			}
+			if (!all_symbol_pairs)
+			    yyerror("invalid use of named arguments in method call");
+                        $$ = arg_append($1, $3);
+                        $3->flags |= NODE_ARRAY_NAMED_ARGS;
+			$$ = arg_append($1, $5);
+			$$ = arg_blk_pass($$, $6);
+		    /*%
+			$$ = arg_add_optblock(arg_add_star(arg_add_assocs($1, $3), $5), $6);
+		    %*/
+#endif
+		    }
 		| block_arg
 		    /*%c%*/
 		    /*%c
@@ -8808,7 +8835,7 @@
 {
     NODE *args = n->nd_args;
     if (args != NULL 
-	&& args->nd_argc == 2 
+	&& (args->nd_argc == 2 || args->nd_argc == 3)
 	&& nd_type(args->u3.node->u1.node) == NODE_ARRAY
 	&& args->u3.node->u1.node->flags & NODE_ARRAY_NAMED_ARGS) {
 
@@ -8838,6 +8865,12 @@
 	}
 
 	n->nd_mid = rb_intern(buf);
+        if (args->nd_argc == 3) {
+            NODE *variadic_args = args->nd_next->nd_next->nd_head;
+            for (p = variadic_args; p != NULL; p = p->nd_next) {
+		list_append(new_argv, p->nd_head);
+            }
+	}
 	GC_WB(&n->nd_args, new_argv);
     }
     return n;
@@ -9883,7 +9916,7 @@
     struct lex_get_str_context *ctx = (struct lex_get_str_context *)
 	xmalloc(sizeof(struct lex_get_str_context));
     GC_WB(&ctx->str, src);
-    ctx->chars = chars;
+    ctx->chars = chars; // FIXME need write barrier?
     ctx->chars_len = chars_len;
 
     parser->parser_lex_gets = lex_get_str;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20110102/43b8fcd3/attachment.html>


More information about the macruby-changes mailing list