summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-06-12 09:22:20 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-06-12 09:22:20 +0000
commit91511afa9ca2b4ebaa751bc1f53e89faab6b3701 (patch)
treee77af50bc09359cf3eabaaf525bce377df29cbe3 /parse.y
parent94f86651d6bef5b2ce67da290ded50adf9d2e7ca (diff)
* parse.y (yylex): 'do' should return kDO_BLOCK on EXPR_ENDARG.
* parse.y (singleton): "def (()).a end" dumped core. * parse.y (range_op): node may be null. * parse.y (match_gen): ditto. * parse.y (arg): void value check for "..", "...", "!", and "not". * parse.y (match_gen): void value check for "=~". * parse.y (value_expr): check NODE_AND and NODE_OR recursively. * parse.y (cond0): void value check added for conditionals. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2558 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y82
1 files changed, 51 insertions, 31 deletions
diff --git a/parse.y b/parse.y
index fae59ab91d..72fc1183a0 100644
--- a/parse.y
+++ b/parse.y
@@ -898,10 +898,14 @@ arg : lhs '=' arg
}
| arg tDOT2 arg
{
+ value_expr($1);
+ value_expr($3);
$$ = NEW_DOT2($1, $3);
}
| arg tDOT3 arg
{
+ value_expr($1);
+ value_expr($3);
$$ = NEW_DOT3($1, $3);
}
| arg '+' arg
@@ -1003,7 +1007,6 @@ arg : lhs '=' arg
}
| '!' arg
{
- value_expr($2);
$$ = NEW_NOT(cond($2));
}
| '~' arg
@@ -1292,7 +1295,7 @@ primary : literal
}
| tLPAREN_ARG expr {lex_state = EXPR_ENDARG;} ')'
{
- rb_warning("%s (...) interpreted as grouped expression", rb_id2name($<id>1));
+ rb_warning("(...) interpreted as grouped expression");
$$ = $2;
}
| tLPAREN compstmt ')'
@@ -1983,19 +1986,24 @@ singleton : var_ref
}
| '(' {lex_state = EXPR_BEG;} expr opt_nl ')'
{
- switch (nd_type($3)) {
- case NODE_STR:
- case NODE_DSTR:
- case NODE_XSTR:
- case NODE_DXSTR:
- case NODE_DREGX:
- case NODE_LIT:
- case NODE_ARRAY:
- case NODE_ZARRAY:
- yyerror("can't define single method for literals.");
- default:
- value_expr($3);
- break;
+ if ($3 == 0) {
+ yyerror("can't define single method for ().");
+ }
+ else {
+ switch (nd_type($3)) {
+ case NODE_STR:
+ case NODE_DSTR:
+ case NODE_XSTR:
+ case NODE_DXSTR:
+ case NODE_DREGX:
+ case NODE_LIT:
+ case NODE_ARRAY:
+ case NODE_ZARRAY:
+ yyerror("can't define single method for literals");
+ default:
+ value_expr($3);
+ break;
+ }
}
$$ = $3;
}
@@ -3980,6 +3988,8 @@ yylex()
if (COND_P()) return kDO_COND;
if (CMDARG_P() && state != EXPR_CMDARG)
return kDO_BLOCK;
+ if (state == EXPR_ENDARG)
+ return kDO_BLOCK;
return kDO;
}
if (state == EXPR_BEG)
@@ -4380,25 +4390,31 @@ match_gen(node1, node2)
{
local_cnt('~');
- switch (nd_type(node1)) {
- case NODE_DREGX:
- case NODE_DREGX_ONCE:
- return NEW_MATCH2(node1, node2);
-
- case NODE_LIT:
- if (TYPE(node1->nd_lit) == T_REGEXP) {
+ value_expr(node1);
+ value_expr(node2);
+ if (node1) {
+ switch (nd_type(node1)) {
+ case NODE_DREGX:
+ case NODE_DREGX_ONCE:
return NEW_MATCH2(node1, node2);
+
+ case NODE_LIT:
+ if (TYPE(node1->nd_lit) == T_REGEXP) {
+ return NEW_MATCH2(node1, node2);
+ }
}
}
- switch (nd_type(node2)) {
- case NODE_DREGX:
- case NODE_DREGX_ONCE:
- return NEW_MATCH3(node2, node1);
-
- case NODE_LIT:
- if (TYPE(node2->nd_lit) == T_REGEXP) {
+ if (node2) {
+ switch (nd_type(node2)) {
+ case NODE_DREGX:
+ case NODE_DREGX_ONCE:
return NEW_MATCH3(node2, node1);
+
+ case NODE_LIT:
+ if (TYPE(node2->nd_lit) == T_REGEXP) {
+ return NEW_MATCH3(node2, node1);
+ }
}
}
@@ -4519,7 +4535,6 @@ aryset(recv, idx)
NODE *recv, *idx;
{
value_expr(recv);
-
return NEW_CALL(recv, tASET, idx);
}
@@ -4538,7 +4553,6 @@ attrset(recv, id)
ID id;
{
value_expr(recv);
-
return NEW_CALL(recv, rb_id_attrset(id), 0);
}
@@ -4647,6 +4661,10 @@ value_expr(node)
case NODE_IF:
return value_expr(node->nd_body) && value_expr(node->nd_else);
+ case NODE_AND:
+ case NODE_OR:
+ return value_expr(node->nd_2nd);
+
case NODE_NEWLINE:
return value_expr(node->nd_next);
@@ -4843,6 +4861,7 @@ range_op(node)
enum node_type type;
if (!e_option_supplied()) return node;
+ if (node == 0) return 0;
node = cond0(node);
type = nd_type(node);
@@ -4861,6 +4880,7 @@ cond0(node)
enum node_type type = nd_type(node);
assign_in_cond(node);
+ value_expr(node);
switch (type) {
case NODE_DSTR: