diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-12-27 05:58:23 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-12-27 05:58:23 +0000 |
commit | 6c08b4522d4b9173dcbada62c6d218452d103b4a (patch) | |
tree | 9c1d61c48ed6842d7bf5e582cfca85aca80005f2 | |
parent | 5effdad2cdd0807eca83ea2cdbddc70f4f3fe02f (diff) |
* iseq.h, iseq.c (rb_iseq_new_main): add a type ISEQ_TYPE_MAIN.
[ruby-dev:37619]
* compile.c (rb_dvar_defined, ruby_iseq_compile): ditto.
* iseq.c (iseq_data_to_ary, iseq_load): ditto.
* compile.c (iseq_compile_each): fix to check ip->compile_data.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@21088 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | compile.c | 23 | ||||
-rw-r--r-- | iseq.c | 6 | ||||
-rw-r--r-- | iseq.h | 3 |
4 files changed, 40 insertions, 3 deletions
@@ -1,3 +1,14 @@ +Sat Dec 27 14:48:26 2008 Koichi Sasada <ko1@atdot.net> + + * iseq.h, iseq.c (rb_iseq_new_main): add a type ISEQ_TYPE_MAIN. + [ruby-dev:37619] + + * compile.c (rb_dvar_defined, ruby_iseq_compile): ditto. + + * iseq.c (iseq_data_to_ary, iseq_load): ditto. + + * compile.c (iseq_compile_each): fix to check ip->compile_data. + Sat Dec 27 14:29:33 2008 Tanaka Akira <akr@fsij.org> * lib/open-uri.rb (OpenURI.redirectable?): permit https redirection. @@ -469,6 +469,7 @@ ruby_iseq_compile(VALUE self, NODE *node) case ISEQ_TYPE_CLASS: case ISEQ_TYPE_BLOCK: case ISEQ_TYPE_EVAL: + case ISEQ_TYPE_MAIN: case ISEQ_TYPE_TOP: rb_compile_error(ERROR_ARGS "compile/should not be reached: %s:%d", __FILE__, __LINE__); @@ -3265,6 +3266,11 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) else { rb_iseq_t *ip = iseq->parent_iseq; while (ip) { + if (!ip->compile_data) { + ip = 0; + break; + } + level++; if (ip->compile_data->redo_label != 0) { level = 0x8000; @@ -3281,6 +3287,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) else if (ip->type == ISEQ_TYPE_EVAL) { goto break_in_eval; } + ip = ip->parent_iseq; } COMPILE_ERROR((ERROR_ARGS "Invalid break")); @@ -3322,6 +3329,11 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) rb_iseq_t *ip; ip = iseq; while (ip) { + if (!ip->compile_data) { + ip = 0; + break; + } + level = 0x8000 | 0x4000; if (ip->compile_data->redo_label != 0) { /* while loop */ @@ -3333,6 +3345,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) else if (ip->type == ISEQ_TYPE_EVAL) { goto next_in_eval; } + ip = ip->parent_iseq; } if (ip != 0) { @@ -3383,6 +3396,11 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) level = 0x8000 | 0x4000; ip = iseq; while (ip) { + if (!ip->compile_data) { + ip = 0; + break; + } + if (ip->compile_data->redo_label != 0) { break; } @@ -3392,6 +3410,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) else if (ip->type == ISEQ_TYPE_EVAL) { goto redo_in_eval; } + ip = ip->parent_iseq; } if (ip != 0) { @@ -5291,7 +5310,9 @@ rb_dvar_defined(ID id) while (iseq->type == ISEQ_TYPE_BLOCK || iseq->type == ISEQ_TYPE_RESCUE || iseq->type == ISEQ_TYPE_ENSURE || - iseq->type == ISEQ_TYPE_EVAL) { + iseq->type == ISEQ_TYPE_EVAL || + iseq->type == ISEQ_TYPE_MAIN + ) { int i; for (i = 0; i < iseq->local_table_size; i++) { @@ -316,7 +316,7 @@ rb_iseq_new_main(NODE *node, VALUE filename) rb_thread_t *th = GET_THREAD(); VALUE parent = th->base_block->iseq->self; return rb_iseq_new_with_opt(node, rb_str_new2("<main>"), filename, - parent, ISEQ_TYPE_EVAL, &COMPILE_OPTION_DEFAULT); + parent, ISEQ_TYPE_MAIN, &COMPILE_OPTION_DEFAULT); } static VALUE @@ -411,6 +411,7 @@ iseq_load(VALUE self, VALUE data, VALUE parent, VALUE opt) st_insert(type_map, ID2SYM(rb_intern("rescue")), ISEQ_TYPE_RESCUE); st_insert(type_map, ID2SYM(rb_intern("ensure")), ISEQ_TYPE_ENSURE); st_insert(type_map, ID2SYM(rb_intern("eval")), ISEQ_TYPE_EVAL); + st_insert(type_map, ID2SYM(rb_intern("main")), ISEQ_TYPE_MAIN); st_insert(type_map, ID2SYM(rb_intern("defined_guard")), ISEQ_TYPE_DEFINED_GUARD); } @@ -1028,6 +1029,7 @@ iseq_data_to_ary(rb_iseq_t *iseq) DECL_SYMBOL(rescue); DECL_SYMBOL(ensure); DECL_SYMBOL(eval); + DECL_SYMBOL(main); DECL_SYMBOL(defined_guard); if (sym_top == 0) { @@ -1042,6 +1044,7 @@ iseq_data_to_ary(rb_iseq_t *iseq) INIT_SYMBOL(rescue); INIT_SYMBOL(ensure); INIT_SYMBOL(eval); + INIT_SYMBOL(main); INIT_SYMBOL(defined_guard); } @@ -1054,6 +1057,7 @@ iseq_data_to_ary(rb_iseq_t *iseq) case ISEQ_TYPE_RESCUE: type = sym_rescue; break; case ISEQ_TYPE_ENSURE: type = sym_ensure; break; case ISEQ_TYPE_EVAL: type = sym_eval; break; + case ISEQ_TYPE_MAIN: type = sym_main; break; case ISEQ_TYPE_DEFINED_GUARD: type = sym_defined_guard; break; default: rb_bug("unsupported iseq type"); }; @@ -30,7 +30,8 @@ struct st_table *ruby_insn_make_insn_table(void); #define ISEQ_TYPE_RESCUE INT2FIX(5) #define ISEQ_TYPE_ENSURE INT2FIX(6) #define ISEQ_TYPE_EVAL INT2FIX(7) -#define ISEQ_TYPE_DEFINED_GUARD INT2FIX(8) +#define ISEQ_TYPE_MAIN INT2FIX(8) +#define ISEQ_TYPE_DEFINED_GUARD INT2FIX(9) #define CATCH_TYPE_RESCUE INT2FIX(1) #define CATCH_TYPE_ENSURE INT2FIX(2) |