diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-06-22 09:32:56 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-06-22 09:32:56 +0000 |
commit | c4bc9b575898ba352d0fea8289ebcaf8921dacd1 (patch) | |
tree | 5974195d1c0a004072980018cbdfda08b831e727 /ruby.c | |
parent | 471d8d2586d984fd70f6837b117d6f275201204b (diff) |
* iseq.c, vm_eval.c: set th->base_block properly.
th->base_block is information for (a) parsing, (b) compiling
and (c) setting up the frame to execute the program passed by
`eval' method. For example, (1) parser need to know up-level
variables to detect it is variable or method without paren.
Befor (a), (b) and (c), VM set th->base_block by passed bindng
(or previous frame information). After execute (a), (b) and (c),
VM should clear th->base_block. However, if (a), (b) or (c)
raises an exception, then th->base_block is not cleared.
Problem is that the uncleared value th->balo_block is used for
irrelevant iseq compilation. It causes SEGV or critical error.
I tried to solve this problem: to clear them before exception,
but finally I found out that it is difficult to do it (Ruby
program can be run in many places).
Because of this background, I set th->base_block before
compiling iseq and restore it after compiling.
Basically, th->base_block is dirty hack (similar to global
variable) and this patch is also dirty.
* bootstraptest/test_eval.rb: add a test for above.
* internal.h: remove unused decl.
* iseq.c (rb_iseq_compile_with_option): add base_block parameter.
set th->base_block before compation and restore it after
compilation.
* ruby.c (require_libraries): pass 0 as base_block instead of
setting th->base_block
* tool/compile_prelude.rb (prelude_eval): apply above changes.
* vm.c, vm_eval.c: ditto.
* vm_core.h: add comments.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36179 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ruby.c')
-rw-r--r-- | ruby.c | 3 |
1 files changed, 0 insertions, 3 deletions
@@ -479,9 +479,7 @@ require_libraries(VALUE *req_list) VALUE self = rb_vm_top_self(); ID require; rb_thread_t *th = GET_THREAD(); - rb_block_t *prev_base_block = th->base_block; int prev_parse_in_eval = th->parse_in_eval; - th->base_block = 0; th->parse_in_eval = 0; Init_ext(); /* should be called here for some reason :-( */ @@ -493,7 +491,6 @@ require_libraries(VALUE *req_list) *req_list = 0; th->parse_in_eval = prev_parse_in_eval; - th->base_block = prev_base_block; } static rb_env_t* |