summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-07-31 04:40:11 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-07-31 04:40:11 +0000
commit021b336535e0db9c807abe9cb5c04f558bee1d5c (patch)
tree5ee655f2c631cb26c89120897197e69f7980ebd5 /eval.c
parent45942bdbc6a7dba1caa36c160b734c359881fd25 (diff)
* eval.c (is_defined): avoid unnecessary method invocations.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6728 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/eval.c b/eval.c
index a04aecf0df..a402af1e64 100644
--- a/eval.c
+++ b/eval.c
@@ -2159,7 +2159,7 @@ copy_node_scope(node, rval)
#define MATCH_DATA *rb_svar(node->nd_cnt)
-static const char* is_defined _((VALUE, NODE*, char*));
+static const char* is_defined _((VALUE, NODE*, char*, int));
static char*
arg_defined(self, node, buf, type)
@@ -2176,13 +2176,13 @@ arg_defined(self, node, buf, type)
argc=node->nd_alen;
if (argc > 0) {
for (i=0;i<argc;i++) {
- if (!is_defined(self, node->nd_head, buf))
+ if (!is_defined(self, node->nd_head, buf, 0))
return 0;
node = node->nd_next;
}
}
}
- else if (!is_defined(self, node, buf)) {
+ else if (!is_defined(self, node, buf, 0)) {
return 0;
}
return type;
@@ -2201,10 +2201,11 @@ search_iclass(self, klass)
}
static const char*
-is_defined(self, node, buf)
+is_defined(self, node, buf, noeval)
VALUE self;
NODE *node; /* OK */
char *buf;
+ int noeval;
{
VALUE val; /* OK */
int state;
@@ -2239,7 +2240,8 @@ is_defined(self, node, buf)
val = self;
if (node->nd_recv == (NODE *)1) goto check_bound;
case NODE_CALL:
- if (!is_defined(self, node->nd_recv, buf)) return 0;
+ if (noeval) return ex;
+ if (!is_defined(self, node->nd_recv, buf, Qtrue)) return 0;
val = rb_eval(self, node->nd_recv);
check_bound:
{
@@ -2331,8 +2333,8 @@ is_defined(self, node, buf)
break;
case NODE_COLON2:
- if (!is_defined(self, node->nd_recv, buf)) return 0;
- val = rb_eval(self, node->nd_head);
+ if (noeval) return ex;
+ if (!is_defined(self, node->nd_recv, buf, Qtrue)) return 0;
switch (TYPE(val)) {
case T_CLASS:
case T_MODULE:
@@ -3379,7 +3381,7 @@ rb_eval(self, n)
goto again;
case NODE_OP_ASGN_OR:
- if ((node->nd_aid && !is_defined(self, node->nd_head, 0)) ||
+ if ((node->nd_aid && !is_defined(self, node->nd_head, 0, 0)) ||
!RTEST(result = rb_eval(self, node->nd_head))) {
node = node->nd_value;
goto again;
@@ -3870,7 +3872,7 @@ rb_eval(self, n)
case NODE_DEFINED:
{
char buf[20];
- const char *desc = is_defined(self, node->nd_head, buf);
+ const char *desc = is_defined(self, node->nd_head, buf, 0);
if (desc) result = rb_str_new2(desc);
else result = Qnil;