summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-06-11 07:02:23 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-06-11 07:02:23 +0000
commit22010642b24f2b3f2bfef1324c61764dcd8cc2fd (patch)
treedd8a8256032a8c6ef07ac3ae8c6464c11282f104 /parse.y
parenta5fd4cec841d2ae50d2aaff8f564da4842d0984c (diff)
* eval.c (rb_eval): ruby_frame->last_func may be null, if it's
called outside of a method. * parse.y (arg): use INT2NUM, not INT2FIX for tUMINUS. * parse.y (arg): unnecessary negative tPOW treatment. * parse.y (tokadd_escape): wrong backslash escapement. * parse.y (stmt,arg): too much void value check. * parse.y (stmt,arg): need to check void value on rules which does not use node_assign(). * ext/socket/socket.c (ipaddr): need not to taint hostnames. * range.c (range_include): should be based on "<=>", whereas member? still is based on "each". * range.c (range_min,range_max): redefine methods based on "<=>". git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2548 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y41
1 files changed, 17 insertions, 24 deletions
diff --git a/parse.y b/parse.y
index f32dafebf1..44f40a2de0 100644
--- a/parse.y
+++ b/parse.y
@@ -435,7 +435,6 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem
}
| lhs '=' command_call
{
- value_expr($3);
$$ = node_assign($1, $3);
}
| mlhs '=' command_call
@@ -446,6 +445,7 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem
}
| var_lhs tOP_ASGN command_call
{
+ value_expr($3);
if ($1) {
ID vid = $1->nd_vid;
if ($2 == tOROP) {
@@ -471,8 +471,10 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem
}
| primary_value '[' aref_args ']' tOP_ASGN command_call
{
- NODE *args = NEW_LIST($6);
+ NODE *args;
+ value_expr($5);
+ args = NEW_LIST($6);
$3 = list_append($3, NEW_NIL());
list_concat(args, $3);
if ($5 == tOROP) {
@@ -486,6 +488,7 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem
}
| primary_value '.' tIDENTIFIER tOP_ASGN command_call
{
+ value_expr($5);
if ($4 == tOROP) {
$4 = 0;
}
@@ -497,6 +500,7 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem
}
| primary_value '.' tCONSTANT tOP_ASGN command_call
{
+ value_expr($5);
if ($4 == tOROP) {
$4 = 0;
}
@@ -508,6 +512,7 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem
}
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call
{
+ value_expr($5);
if ($4 == tOROP) {
$4 = 0;
}
@@ -805,11 +810,11 @@ reswords : k__LINE__ | k__FILE__ | klBEGIN | klEND
arg : lhs '=' arg
{
- value_expr($3);
$$ = node_assign($1, $3);
}
| var_lhs tOP_ASGN arg
{
+ value_expr($3);
if ($1) {
ID vid = $1->nd_vid;
if ($2 == tOROP) {
@@ -835,8 +840,10 @@ arg : lhs '=' arg
}
| primary_value '[' aref_args ']' tOP_ASGN arg
{
- NODE *args = NEW_LIST($6);
+ NODE *args;
+ value_expr($6);
+ args = NEW_LIST($6);
$3 = list_append($3, NEW_NIL());
list_concat(args, $3);
if ($5 == tOROP) {
@@ -850,6 +857,7 @@ arg : lhs '=' arg
}
| primary_value '.' tIDENTIFIER tOP_ASGN arg
{
+ value_expr($5);
if ($4 == tOROP) {
$4 = 0;
}
@@ -861,6 +869,7 @@ arg : lhs '=' arg
}
| primary_value '.' tCONSTANT tOP_ASGN arg
{
+ value_expr($5);
if ($4 == tOROP) {
$4 = 0;
}
@@ -872,6 +881,7 @@ arg : lhs '=' arg
}
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg
{
+ value_expr($5);
if ($4 == tOROP) {
$4 = 0;
}
@@ -916,25 +926,7 @@ arg : lhs '=' arg
}
| arg tPOW arg
{
- int need_negate = Qfalse;
-
- if (nd_type($1) == NODE_LIT) {
- switch (TYPE($1->nd_lit)) {
- case T_FIXNUM:
- case T_FLOAT:
- case T_BIGNUM:
- if (RTEST(rb_funcall($1->nd_lit,'<',1,INT2FIX(0)))) {
- $1->nd_lit = rb_funcall($1->nd_lit,rb_intern("-@"),0,0);
- need_negate = Qtrue;
- }
- default:
- break;
- }
- }
$$ = call_op($1, tPOW, 1, $3);
- if (need_negate) {
- $$ = call_op($$, tUMINUS, 0, 0);
- }
}
| tUPLUS arg
{
@@ -950,7 +942,7 @@ arg : lhs '=' arg
if ($2 && nd_type($2) == NODE_LIT && FIXNUM_P($2->nd_lit)) {
long i = FIX2LONG($2->nd_lit);
- $2->nd_lit = INT2FIX(-i);
+ $2->nd_lit = INT2NUM(-i);
$$ = $2;
}
else {
@@ -2540,7 +2532,7 @@ tokadd_escape(term)
return -1;
default:
- if (c != '/' || c != term)
+ if (c != '\\' || c != term)
tokadd('\\');
tokadd(c);
}
@@ -5517,3 +5509,4 @@ rb_lastline_set(val)
special_local_set('_', val);
}
}
+%%