summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y32
1 files changed, 19 insertions, 13 deletions
diff --git a/parse.y b/parse.y
index 6796d87318..1e36ca7441 100644
--- a/parse.y
+++ b/parse.y
@@ -1104,6 +1104,10 @@ call_args2 : arg ',' args opt_block_arg
{
$$ = arg_blk_pass(list_concat(NEW_LIST($1),$3), $4);
}
+ | arg ',' block_arg
+ {
+ $$ = arg_blk_pass($1, $3);
+ }
| arg ',' tSTAR arg opt_block_arg
{
value_expr($1);
@@ -2044,7 +2048,7 @@ none : /* none */
static char *tokenbuf = NULL;
static int tokidx, toksiz = 0;
-static NODE *str_extend();
+static NODE *str_extend _((NODE*,char,char));
#define LEAVE_BS 1
@@ -2513,7 +2517,7 @@ parse_regx(term, paren)
switch (c) {
case '#':
- list = str_extend(list, term);
+ list = str_extend(list, term, paren);
if (list == (NODE*)-1) goto unterminated;
continue;
@@ -2642,7 +2646,7 @@ parse_string(func, term, paren)
}
}
else if (c == '#') {
- list = str_extend(list, term);
+ list = str_extend(list, term, paren);
if (list == (NODE*)-1) goto unterm_str;
continue;
}
@@ -3873,15 +3877,16 @@ yylex()
}
static NODE*
-str_extend(list, term)
+str_extend(list, term, paren)
NODE *list;
- char term;
+ char term, paren;
{
int c;
int brace = -1;
VALUE ss;
NODE *node;
- int nest;
+ int brace_nest = 0;
+ int paren_nest = 0;
c = nextc();
switch (c) {
@@ -3996,13 +4001,13 @@ str_extend(list, term)
case '{':
if (c == '{') brace = '}';
- nest = 0;
+ brace_nest = 0;
do {
loop_again:
c = nextc();
switch (c) {
case -1:
- if (nest > 0) {
+ if (brace_nest > 0) {
yyerror("bad substitution in string");
newtok();
return list;
@@ -4010,8 +4015,8 @@ str_extend(list, term)
return (NODE*)-1;
case '}':
if (c == brace) {
- if (nest == 0) break;
- nest--;
+ if (brace_nest == 0) break;
+ brace_nest--;
}
tokadd(c);
goto loop_again;
@@ -4027,9 +4032,10 @@ str_extend(list, term)
}
break;
case '{':
- if (brace != -1) nest++;
+ if (brace != -1) brace_nest++;
default:
- if (c == term) {
+ if (c == paren) paren_nest++;
+ else if (c == term && (!paren || paren_nest-- == 0)) {
pushback(c);
list_append(list, NEW_STR(rb_str_new2("#")));
rb_warn("bad substitution in string");
@@ -4282,7 +4288,7 @@ gettable(id)
if (in_single) return NEW_CVAR2(id);
return NEW_CVAR(id);
}
- rb_bug("invalid id for gettable");
+ rb_compile_error("identifier %s is not valid", rb_id2name(id));
return 0;
}