1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* eval.c (is_defined): call is_defined() before invoking

rb_eval().  [ruby-talk:107867]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6723 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2004-07-30 16:38:03 +00:00
parent b079f859b9
commit d21727bdc5
2 changed files with 15 additions and 5 deletions

View file

@ -1,3 +1,8 @@
Sat Jul 31 01:25:11 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
* eval.c (is_defined): call is_defined() before invoking
rb_eval(). [ruby-talk:107867]
Fri Jul 30 16:10:54 2004 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
* ext/tcltklib/tcltklib.c (lib_fromUTF8_core): raise ArgumentError when

15
eval.c
View file

@ -2159,7 +2159,7 @@ copy_node_scope(node, rval)
#define MATCH_DATA *rb_svar(node->nd_cnt)
static char* is_defined _((VALUE, NODE*, char*));
static const char* is_defined _((VALUE, NODE*, char*));
static char*
arg_defined(self, node, buf, type)
@ -2200,7 +2200,7 @@ search_iclass(self, klass)
return k;
}
static char*
static const char*
is_defined(self, node, buf)
VALUE self;
NODE *node; /* OK */
@ -2208,9 +2208,10 @@ is_defined(self, node, buf)
{
VALUE val; /* OK */
int state;
static const char *ex = "expression";
again:
if (!node) return "expression";
if (!node) return ex;
switch (nd_type(node)) {
case NODE_SUPER:
case NODE_ZSUPER:
@ -2238,6 +2239,7 @@ 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;
val = rb_eval(self, node->nd_recv);
check_bound:
{
@ -2329,6 +2331,7 @@ 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);
switch (TYPE(val)) {
case T_CLASS:
@ -2351,6 +2354,7 @@ is_defined(self, node, buf)
case NODE_NTH_REF:
if (RTEST(rb_reg_nth_defined(node->nd_nth, MATCH_DATA))) {
if (!buf) return ex;
sprintf(buf, "$%d", (int)node->nd_nth);
return buf;
}
@ -2358,6 +2362,7 @@ is_defined(self, node, buf)
case NODE_BACK_REF:
if (RTEST(rb_reg_nth_defined(0, MATCH_DATA))) {
if (!buf) return ex;
sprintf(buf, "$%c", (char)node->nd_nth);
return buf;
}
@ -2370,7 +2375,7 @@ is_defined(self, node, buf)
}
POP_TAG();
if (!state) {
return "expression";
return ex;
}
ruby_errinfo = Qnil;
break;
@ -3865,7 +3870,7 @@ rb_eval(self, n)
case NODE_DEFINED:
{
char buf[20];
char *desc = is_defined(self, node->nd_head, buf);
const char *desc = is_defined(self, node->nd_head, buf);
if (desc) result = rb_str_new2(desc);
else result = Qnil;