[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