summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2001-11-21 15:36:37 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2001-11-21 15:36:37 +0000
commitda795859595f66e01b9504acf2e89377761d5e4b (patch)
treedfeb713542ea1303aa073390965b6e2b284dd35d /parse.y
parent904c9d27cedee45de9c3af0561cc1b5a66d3920e (diff)
* parse.y (str_extend): should check nesting parentheses in #{}.
* eval.c (rb_thread_select): tv_sec and tv_usec should not be negative. * signal.c (posix_signal): do not set SA_RESTART for SIGVTALRM. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_6@1851 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y26
1 files changed, 14 insertions, 12 deletions
diff --git a/parse.y b/parse.y
index 834ce3115e..6280f8e47e 100644
--- a/parse.y
+++ b/parse.y
@@ -1878,7 +1878,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
@@ -2346,7 +2346,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;
@@ -2475,7 +2475,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;
}
@@ -3689,15 +3689,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) {
@@ -3812,13 +3813,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;
@@ -3826,8 +3827,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;
@@ -3843,9 +3844,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_warning("bad substitution in string");