summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2000-12-27 05:59:03 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2000-12-27 05:59:03 +0000
commitceec42bf8c4e350d02d11b84adf9b8ebf7b4af47 (patch)
tree6f9e1b9a22f7b1f58a4d23e6e44b3c3cff16c6b0 /parse.y
parent8369164408f2f9aa2984257f428f957876a84ced (diff)
matz
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1081 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y52
1 files changed, 27 insertions, 25 deletions
diff --git a/parse.y b/parse.y
index da7bba3578..94fafdd841 100644
--- a/parse.y
+++ b/parse.y
@@ -4436,69 +4436,71 @@ assign_in_cond(node)
}
static NODE*
-cond0(node)
+cond0(node, log)
NODE *node;
+ int log;
{
enum node_type type = nd_type(node);
assign_in_cond(node);
switch (type) {
+ case NODE_DSTR:
+ if (log) break;
+ nd_set_type(node, NODE_DREGX);
+ /* fall through */
case NODE_DREGX:
case NODE_DREGX_ONCE:
local_cnt('_');
local_cnt('~');
+ rb_warn("string/regex literal in condition");
return NEW_MATCH2(node, NEW_GVAR(rb_intern("$_")));
case NODE_DOT2:
case NODE_DOT3:
- node->nd_beg = cond2(node->nd_beg);
- node->nd_end = cond2(node->nd_end);
+ node->nd_beg = cond0(node->nd_beg, log);
+ node->nd_end = cond0(node->nd_end, log);
if (type == NODE_DOT2) nd_set_type(node,NODE_FLIP2);
else if (type == NODE_DOT3) nd_set_type(node, NODE_FLIP3);
node->nd_cnt = local_append(0);
+ rb_warn("range literal in condition");
return node;
+ case NODE_STR:
+ if (log) break;
+ node->nd_lit = rb_reg_new(RSTRING(node->nd_lit)->ptr,RSTRING(node->nd_lit)->len,0);
+ goto regexp;
+
case NODE_LIT:
if (TYPE(node->nd_lit) == T_REGEXP) {
+ regexp:
+ nd_set_type(node, NODE_MATCH);
local_cnt('_');
local_cnt('~');
- return NEW_MATCH(node);
+ rb_warn("string/regex literal in condition");
+ return node;
}
- if (TYPE(node->nd_lit) == T_STRING) {
- local_cnt('_');
- local_cnt('~');
- return NEW_MATCH(rb_reg_new(RSTRING(node)->ptr,RSTRING(node)->len,0));
- }
- default:
- return node;
}
+ return node;
}
static NODE*
-cond(node)
+cond1(node, log)
NODE *node;
+ int log;
{
if (node == 0) return 0;
if (nd_type(node) == NODE_NEWLINE){
- node->nd_next = cond0(node->nd_next);
+ node->nd_next = cond0(node->nd_next, log);
return node;
}
- return cond0(node);
+ return cond0(node, log);
}
static NODE*
-cond2(node)
+cond(node)
NODE *node;
{
- enum node_type type;
-
- node = cond(node);
- type = nd_type(node);
- if (type == NODE_NEWLINE) node = node->nd_next;
- if (type == NODE_LIT && FIXNUM_P(node->nd_lit)) {
- return call_op(node,tEQ,1,NEW_GVAR(rb_intern("$.")));
- }
- return node;
+ return cond1(node, 0);
}
static NODE*
@@ -4507,7 +4509,7 @@ logop(type, left, right)
NODE *left, *right;
{
value_expr(left);
- return rb_node_newnode(type, cond(left), cond(right), 0);
+ return rb_node_newnode(type, cond1(left, 1), cond1(right, 1), 0);
}
static NODE *