summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-11-01 23:53:50 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-11-01 23:53:50 +0000
commit9c56a298e8b83371977cf7412236844b28b9448d (patch)
treee802993291d0ba418f5fac6f27e80e43bc30cb9d /eval.c
parent7e1850fd5da088395c9730627ae8b7868514091a (diff)
* eval.c (proc_invoke): nail down dyna_var node when Proc object
or continuation is created. [ruby-dev:24671] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@7175 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c59
1 files changed, 17 insertions, 42 deletions
diff --git a/eval.c b/eval.c
index be4cb91d65..043f349bbd 100644
--- a/eval.c
+++ b/eval.c
@@ -412,7 +412,6 @@ rb_get_method_body(klassp, idp, noexp)
if (ruby_running) {
/* store in cache */
- if (BUILTIN_TYPE(origin) == T_ICLASS) origin = RBASIC(origin)->klass;
ent = cache + EXPR1(klass, id);
ent->klass = klass;
ent->noex = body->nd_noex;
@@ -2170,18 +2169,6 @@ arg_defined(self, node, buf, type)
return type;
}
-static VALUE
-search_iclass(self, klass)
- VALUE self, klass;
-{
- VALUE k = CLASS_OF(self);
-
- while (k && !(BUILTIN_TYPE(k) == T_ICLASS && RBASIC(k)->klass == klass)) {
- k = RCLASS(k)->super;
- }
- return k;
-}
-
static char*
is_defined(self, node, buf)
VALUE self;
@@ -2199,10 +2186,6 @@ is_defined(self, node, buf)
if (ruby_frame->orig_func == 0) return 0;
else if (ruby_frame->last_class == 0) return 0;
val = ruby_frame->last_class;
- if (BUILTIN_TYPE(val) == T_MODULE) {
- val = search_iclass(self, val);
- if (!val) return 0;
- }
if (rb_method_boundp(RCLASS(val)->super, ruby_frame->orig_func, 0)) {
if (nd_type(node) == NODE_SUPER) {
return arg_defined(self, node->nd_args, buf, "super");
@@ -5861,20 +5844,6 @@ rb_call_super(argc, argv)
self = ruby_frame->self;
klass = ruby_frame->last_class;
- if (BUILTIN_TYPE(klass) == T_MODULE) {
- k = search_iclass(self, klass);
- if (!k) {
- rb_raise(rb_eTypeError, "%s is not included in %s",
- rb_class2name(klass),
- rb_class2name(CLASS_OF(self)));
- }
- if (RCLASS(k)->super == 0) {
- rb_name_error(ruby_frame->last_func,
- "super: no superclass method `%s'",
- rb_id2name(ruby_frame->last_func));
- }
- klass = k;
- }
PUSH_ITER(ruby_iter->iter ? ITER_PRE : ITER_NOT);
result = rb_call(RCLASS(klass)->super, self, ruby_frame->orig_func, argc, argv, 3);
@@ -6628,7 +6597,21 @@ int
rb_provided(feature)
const char *feature;
{
- return rb_feature_p(feature, 0, Qfalse) ? Qtrue : Qfalse;
+ int i;
+ char *buf;
+
+ if (rb_feature_p(feature, 0, Qfalse))
+ return Qtrue;
+ if (!loading_tbl) return Qfalse;
+ if (st_lookup(loading_tbl, (st_data_t)feature, 0)) return Qtrue;
+ buf = ALLOCA_N(char, strlen(feature)+8);
+ strcpy(buf, feature);
+ for (i=0; ; i++) {
+ if (!loadable_ext[i]) break;
+ strcpy(buf+strlen(feature), loadable_ext[i]);
+ if (st_lookup(loading_tbl, (st_data_t)buf, 0)) return Qtrue;
+ }
+ return Qfalse;
}
static void
@@ -8099,7 +8082,6 @@ proc_invoke(proc, args, self, klass)
int state;
volatile int safe = ruby_safe_level;
volatile VALUE old_wrapper = ruby_wrapper;
- struct RVarmap * volatile old_dvars = ruby_dyna_vars;
volatile int pcall, avalue = Qtrue;
if (rb_block_given_p() && ruby_frame->last_func) {
@@ -8117,6 +8099,7 @@ proc_invoke(proc, args, self, klass)
args = RARRAY(args)->ptr[0];
}
+ PUSH_VARS();
ruby_wrapper = data->wrapper;
ruby_dyna_vars = data->dyna_vars;
/* PUSH BLOCK from data */
@@ -8141,15 +8124,7 @@ proc_invoke(proc, args, self, klass)
POP_ITER();
ruby_block = old_block;
ruby_wrapper = old_wrapper;
- if (FL_TEST(ruby_dyna_vars, DVAR_DONT_RECYCLE)) {
- struct RVarmap *vars;
-
- for (vars = old_dvars; vars; vars = vars->next) {
- if (FL_TEST(vars, DVAR_DONT_RECYCLE)) break;
- FL_SET(vars, DVAR_DONT_RECYCLE);
- }
- }
- ruby_dyna_vars = old_dvars;
+ POP_VARS();
ruby_safe_level = safe;
switch (state) {