diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-06-20 07:11:44 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-06-20 07:11:44 +0000 |
commit | 67688bf178e1fc64ff5af1b07ce834ffb3a84a38 (patch) | |
tree | d84ee3ea9c21646d38e396bb875c4bcc591a81f4 /eval.c | |
parent | d874c0dff914c7d057c86657a9961b9cc68bf5fa (diff) | |
download | ruby-67688bf178e1fc64ff5af1b07ce834ffb3a84a38.tar.gz ruby-67688bf178e1fc64ff5af1b07ce834ffb3a84a38.tar.xz ruby-67688bf178e1fc64ff5af1b07ce834ffb3a84a38.zip |
* parse.y (new_yield): distinguish "yield 1,2" and "yield [1,2]".
[ruby-dev:20360]
* eval.c (rb_eval): support new_yield() change.
* variable.c (rb_const_get_0): warn for Foo::BAR when BAR is a
toplevel constant (i.e. a constant defined under Object).
[ruby-list:36935]
* parse.y (no_blockarg): separate no block argument check and
ret_args argument processing.
* range.c (rb_range_beg_len): out_of_range check after adjusting
end point. [ruby-dev:20370]
* parse.y (call_args): the first argument to arg_cancat() should
be NODE_LIST. [ruby-core:01151]
* eval.c (rb_eval): should dispatch based on ID type.
* eval.c (rb_yield_0): should restore scope_vmode during yield.
[ruby-dev:20361]
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@3967 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 36 |
1 files changed, 23 insertions, 13 deletions
@@ -2131,7 +2131,7 @@ is_defined(self, node, buf) switch (TYPE(val)) { case T_CLASS: case T_MODULE: - if (rb_const_defined_at(val, node->nd_mid)) + if (rb_const_defined_from(val, node->nd_mid)) return "constant"; break; default: @@ -2774,14 +2774,14 @@ rb_eval(self, n) break; case NODE_YIELD: - if (node->nd_stts) { + if (node->nd_head) { result = rb_eval(self, node->nd_head); } else { result = Qundef; /* no arg */ } SET_CURRENT_SOURCE(); - result = rb_yield_0(result, 0, 0, Qfalse, Qfalse); + result = rb_yield_0(result, 0, 0, Qfalse, node->nd_state); break; case NODE_RESCUE: @@ -3235,15 +3235,22 @@ rb_eval(self, n) VALUE klass; klass = rb_eval(self, node->nd_head); - switch (TYPE(klass)) { - case T_CLASS: - case T_MODULE: - result = rb_const_get(klass, node->nd_mid); - break; - default: + if (rb_is_const_id(node->nd_mid)) { + switch (TYPE(klass)) { + case T_CLASS: + case T_MODULE: + result = rb_const_get_from(klass, node->nd_mid); + break; + default: + rb_raise(rb_eTypeError, "%s is not a class/module", + RSTRING(rb_obj_as_string(klass))->ptr); + break; + } + } + else { result = rb_funcall(klass, node->nd_mid, 0, 0); - break; } + break; } break; @@ -3506,7 +3513,7 @@ rb_eval(self, n) cbase = class_prefix(self, node->nd_cpath); cname = node->nd_cpath->nd_mid; if (rb_const_defined_at(cbase, cname)) { - klass = rb_const_get(cbase, cname); + klass = rb_const_get_at(cbase, cname); if (TYPE(klass) != T_CLASS) { rb_raise(rb_eTypeError, "%s is not a class", rb_id2name(cname)); @@ -3549,7 +3556,7 @@ rb_eval(self, n) cbase = class_prefix(self, node->nd_cpath); cname = node->nd_cpath->nd_mid; if (rb_const_defined_at(cbase, cname)) { - module = rb_const_get(cbase, cname); + module = rb_const_get_at(cbase, cname); if (TYPE(module) != T_MODULE) { rb_raise(rb_eTypeError, "%s is not a module", rb_id2name(cname)); @@ -4014,6 +4021,7 @@ rb_yield_0(val, self, klass, pcall, avalue) volatile VALUE old_wrapper; struct BLOCK * volatile block; struct SCOPE * volatile old_scope; + int old_vmode; struct FRAME frame; NODE *cnode = ruby_current_node; int state; @@ -4035,6 +4043,8 @@ rb_yield_0(val, self, klass, pcall, avalue) ruby_wrapper = block->wrapper; old_scope = ruby_scope; ruby_scope = block->scope; + old_vmode = scope_vmode; + scope_vmode = block->vmode; ruby_block = block->prev; if (block->flags & BLOCK_D_SCOPE) { /* put place holder for dynamic (in-block) local variables */ @@ -4154,6 +4164,7 @@ rb_yield_0(val, self, klass, pcall, avalue) if (ruby_scope->flags & SCOPE_DONT_RECYCLE) scope_dup(old_scope); ruby_scope = old_scope; + scope_vmode = old_vmode; ruby_current_node = cnode; if (state) { if (!block->tag) { @@ -8117,7 +8128,6 @@ rb_thread_save_context(th) th->wrapper = ruby_wrapper; th->cref = ruby_cref; th->dyna_vars = ruby_dyna_vars; - FL_SET(ruby_dyna_vars, DVAR_DONT_RECYCLE); th->block = ruby_block; th->flags &= THREAD_FLAGS_MASK; th->flags |= (rb_trap_immediate<<8) | scope_vmode; |