From 08c8605de91d2f04dcb53672a2eca6bd3f77bb18 Mon Sep 17 00:00:00 2001 From: ko1 Date: Thu, 4 Oct 2012 13:52:20 +0000 Subject: * insns.def (getlocal, setlocal): remove old getlocal/setlocal instructions and rename getdaynmic/setdynamic instructions to getlocal/setlocal. * compile.c: ditto. * iseq.c: remove TS_DINDEX. * vm_exec.h (dindex_t): remove type definition of `dindex_t'. * tool/instruction.rb: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37087 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 14 +++++++++++ compile.c | 50 +++++++++++++++++++++---------------- insns.def | 72 ++++++++++++++++------------------------------------- iseq.c | 15 +++-------- tool/instruction.rb | 5 +--- vm_exec.h | 1 - 6 files changed, 69 insertions(+), 88 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2461a9f82b..93f46263c2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +Thu Oct 4 22:39:27 2012 Koichi Sasada + + * insns.def (getlocal, setlocal): remove old getlocal/setlocal + instructions and rename getdaynmic/setdynamic instructions + to getlocal/setlocal. + + * compile.c: ditto. + + * iseq.c: remove TS_DINDEX. + + * vm_exec.h (dindex_t): remove type definition of `dindex_t'. + + * tool/instruction.rb: ditto. + Thu Oct 4 21:44:17 2012 Koichi Sasada * vm.c (vm_analysis_insn|operand|register): use st_insert diff --git a/compile.c b/compile.c index 535084b8b7..1d943ed0bb 100644 --- a/compile.c +++ b/compile.c @@ -535,7 +535,7 @@ rb_iseq_compile_node(VALUE self, NODE *node) } if (iseq->type == ISEQ_TYPE_RESCUE || iseq->type == ISEQ_TYPE_ENSURE) { - ADD_INSN2(ret, 0, getdynamic, INT2FIX(2), INT2FIX(0)); + ADD_INSN2(ret, 0, getlocal, INT2FIX(2), INT2FIX(0)); ADD_INSN1(ret, 0, throw, INT2FIX(0) /* continue throw */ ); } else { @@ -1031,6 +1031,17 @@ iseq_set_exception_local_table(rb_iseq_t *iseq) return COMPILE_OK; } +static int +get_lvar_level(rb_iseq_t *iseq) +{ + int lev = 0; + while (iseq != iseq->local_iseq) { + lev++; + iseq = iseq->parent_iseq; + } + return lev; +} + static int get_dyna_var_idx_at_raw(rb_iseq_t *iseq, ID id) { @@ -1458,7 +1469,6 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *anchor) break; } case TS_LINDEX: - case TS_DINDEX: case TS_NUM: /* ulong */ generated_iseq[pos + 1 + j] = FIX2INT(operands[j]); break; @@ -3686,7 +3696,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) switch (nd_type(narg)) { case NODE_ARRAY: while (narg) { - ADD_INSN2(ret, nd_line(node), getdynamic, INT2FIX(2), INT2FIX(0)); + ADD_INSN2(ret, nd_line(node), getlocal, INT2FIX(2), INT2FIX(0)); COMPILE(ret, "rescue arg", narg->nd_head); ADD_INSN1(ret, nd_line(node), checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_RESCUE)); ADD_INSNL(ret, nd_line(node), branchif, label_hit); @@ -3696,7 +3706,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) case NODE_SPLAT: case NODE_ARGSCAT: case NODE_ARGSPUSH: - ADD_INSN2(ret, nd_line(node), getdynamic, INT2FIX(2), INT2FIX(0)); + ADD_INSN2(ret, nd_line(node), getlocal, INT2FIX(2), INT2FIX(0)); COMPILE(ret, "rescue/cond splat", narg); ADD_INSN1(ret, nd_line(node), checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_RESCUE | VM_CHECKMATCH_ARRAY)); ADD_INSNL(ret, nd_line(node), branchif, label_hit); @@ -3707,7 +3717,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) } } else { - ADD_INSN2(ret, nd_line(node), getdynamic, INT2FIX(2), INT2FIX(0)); + ADD_INSN2(ret, nd_line(node), getlocal, INT2FIX(2), INT2FIX(0)); ADD_INSN1(ret, nd_line(node), putobject, rb_eStandardError); ADD_INSN1(ret, nd_line(node), checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_RESCUE)); ADD_INSNL(ret, nd_line(node), branchif, label_hit); @@ -3804,7 +3814,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) if (!poped) { ADD_INSN(ret, nd_line(node), dup); } - ADD_INSN1(ret, nd_line(node), setlocal, INT2FIX(idx)); + ADD_INSN2(ret, nd_line(node), setlocal, INT2FIX(idx), INT2FIX(get_lvar_level(iseq))); break; } @@ -3824,8 +3834,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) rb_bug("NODE_DASGN(_CURR): unknown id (%s)", rb_id2name(node->nd_vid)); } - ADD_INSN2(ret, nd_line(node), setdynamic, - INT2FIX(ls - idx), INT2FIX(lv)); + ADD_INSN2(ret, nd_line(node), setlocal, INT2FIX(ls - idx), INT2FIX(lv)); break; } case NODE_GASGN:{ @@ -4277,13 +4286,14 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) /* NODE_ZSUPER */ int i; rb_iseq_t *liseq = iseq->local_iseq; + int lvar_level = get_lvar_level(iseq); argc = INT2FIX(liseq->argc); /* normal arguments */ for (i = 0; i < liseq->argc; i++) { int idx = liseq->local_size - i; - ADD_INSN1(args, nd_line(node), getlocal, INT2FIX(idx)); + ADD_INSN2(args, nd_line(node), getlocal, INT2FIX(idx), INT2FIX(lvar_level)); } if (!liseq->arg_simple) { @@ -4292,7 +4302,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) int j; for (j = 0; j < liseq->arg_opts - 1; j++) { int idx = liseq->local_size - (i + j); - ADD_INSN1(args, nd_line(node), getlocal, INT2FIX(idx)); + ADD_INSN2(args, nd_line(node), getlocal, INT2FIX(idx), INT2FIX(lvar_level)); } i += j; argc = INT2FIX(i); @@ -4301,7 +4311,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) if (liseq->arg_rest != -1) { /* rest argument */ int idx = liseq->local_size - liseq->arg_rest; - ADD_INSN1(args, nd_line(node), getlocal, INT2FIX(idx)); + ADD_INSN2(args, nd_line(node), getlocal, INT2FIX(idx), INT2FIX(lvar_level)); argc = INT2FIX(liseq->arg_rest + 1); flag |= VM_CALL_ARGS_SPLAT_BIT; } @@ -4315,7 +4325,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) int j; for (j=0; jlocal_size - (post_start + j); - ADD_INSN1(args, nd_line(node), getlocal, INT2FIX(idx)); + ADD_INSN2(args, nd_line(node), getlocal, INT2FIX(idx), INT2FIX(lvar_level)); } ADD_INSN1(args, nd_line(node), newarray, INT2FIX(j)); ADD_INSN (args, nd_line(node), concatarray); @@ -4325,7 +4335,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) int j; for (j=0; jlocal_size - (post_start + j); - ADD_INSN1(args, nd_line(node), getlocal, INT2FIX(idx)); + ADD_INSN2(args, nd_line(node), getlocal, INT2FIX(idx), INT2FIX(lvar_level)); } argc = INT2FIX(post_len + post_start); } @@ -4460,7 +4470,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) int idx = iseq->local_iseq->local_size - get_local_var_idx(iseq, id); debugs("id: %s idx: %d\n", rb_id2name(id), idx); - ADD_INSN1(ret, nd_line(node), getlocal, INT2FIX(idx)); + ADD_INSN2(ret, nd_line(node), getlocal, INT2FIX(idx), INT2FIX(get_lvar_level(iseq))); } break; } @@ -4472,7 +4482,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) if (idx < 0) { rb_bug("unknown dvar (%s)", rb_id2name(node->nd_vid)); } - ADD_INSN2(ret, nd_line(node), getdynamic, INT2FIX(ls - idx), INT2FIX(lv)); + ADD_INSN2(ret, nd_line(node), getlocal, INT2FIX(ls - idx), INT2FIX(lv)); } break; } @@ -4976,7 +4986,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) case NODE_ERRINFO:{ if (!poped) { if (iseq->type == ISEQ_TYPE_RESCUE) { - ADD_INSN2(ret, nd_line(node), getdynamic, INT2FIX(2), INT2FIX(0)); + ADD_INSN2(ret, nd_line(node), getlocal, INT2FIX(2), INT2FIX(0)); } else { rb_iseq_t *ip = iseq; @@ -4989,7 +4999,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) level++; } if (ip) { - ADD_INSN2(ret, nd_line(node), getdynamic, INT2FIX(2), INT2FIX(level)); + ADD_INSN2(ret, nd_line(node), getlocal, INT2FIX(2), INT2FIX(level)); } else { ADD_INSN(ret, nd_line(node), putnil); @@ -5050,12 +5060,12 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped) switch (nd_type(node->nd_body)) { case NODE_LASGN: idx = iseq->local_iseq->local_size - get_local_var_idx(iseq, id); - ADD_INSN1(ret, nd_line(node), setlocal, INT2FIX(idx)); + ADD_INSN2(ret, nd_line(node), setlocal, INT2FIX(idx), INT2FIX(get_lvar_level(iseq))); break; case NODE_DASGN: case NODE_DASGN_CURR: idx = get_dyna_var_idx(iseq, id, &lv, &ls); - ADD_INSN2(ret, nd_line(node), setdynamic, INT2FIX(ls - idx), INT2FIX(lv)); + ADD_INSN2(ret, nd_line(node), setlocal, INT2FIX(ls - idx), INT2FIX(lv)); break; default: rb_bug("iseq_compile_each (NODE_KW_ARG): unknown node: %s", ruby_node_name(nd_type(node->nd_body))); @@ -5211,7 +5221,6 @@ insn_data_to_s_detail(INSN *iobj) } break; case TS_LINDEX: - case TS_DINDEX: case TS_NUM: /* ulong */ case TS_VALUE: /* VALUE */ rb_str_concat(str, rb_inspect(OPERAND_AT(iobj, j))); @@ -5458,7 +5467,6 @@ iseq_build_from_ary_body(rb_iseq_t *iseq, LINK_ANCHOR *anchor, break; } case TS_LINDEX: - case TS_DINDEX: case TS_NUM: (void)NUM2INT(op); argv[j] = op; diff --git a/insns.def b/insns.def index a5d97ad0a4..b331de5786 100644 --- a/insns.def +++ b/insns.def @@ -46,30 +46,44 @@ nop /** @c variable - @e Get value of local variable (pointed to by idx). - @j idx で指定されたローカル変数をスタックに置く。 + @e Get local variable (pointed by `idx' and `level'). + 'level' indicates the nesting depth from the current block. + @j level, idx で指定されたローカル変数の値をスタックに置く。 + level はブロックのネストレベルで、何段上かを示す。 */ DEFINE_INSN getlocal -(lindex_t idx) +(lindex_t idx, rb_num_t level) () (VALUE val) { - val = *(GET_LEP() - idx); + rb_num_t i; + VALUE *ep = GET_EP(); + for (i = 0; i < level; i++) { + ep = GET_PREV_EP(ep); + } + val = *(ep - idx); } /** @c variable - @e Set value of local variable (pointed to by idx) to val. - @j idx で指定されたローカル変数を val に設定する。 + @e Set a local variable (pointed to by 'idx') as val. + 'level' indicates the nesting depth from the current block. + @j level, idx で指定されたローカル変数の値を val にする。 + level はブロックのネストレベルで、何段上かを示す。 */ DEFINE_INSN setlocal -(lindex_t idx) +(lindex_t idx, rb_num_t level) (VALUE val) () { - *(GET_LEP() - idx) = val; + rb_num_t i; + VALUE *ep = GET_EP(); + for (i = 0; i < level; i++) { + ep = GET_PREV_EP(ep); + } + *(ep - idx) = val; } /** @@ -100,48 +114,6 @@ setspecial lep_svar_set(th, GET_LEP(), key, obj); } -/** - @c variable - @e Get value of block local variable (pointed to by idx and level). - 'level' indicates the nesting depth from the current block. - @j level, idx で指定されたブロックローカル変数の値をスタックに置く。 - level はブロックのネストレベルで、何段上かを示す。 - */ -DEFINE_INSN -getdynamic -(dindex_t idx, rb_num_t level) -() -(VALUE val) -{ - rb_num_t i; - VALUE *ep = GET_EP(); - for (i = 0; i < level; i++) { - ep = GET_PREV_EP(ep); - } - val = *(ep - idx); -} - -/** - @c variable - @e Set block local variable (pointed to by 'idx') as val. - 'level' indicates the nesting depth from the current block. - @j level, idx で指定されたブロックローカル変数の値を val にする。 - level はブロックのネストレベルで、何段上かを示す。 - */ -DEFINE_INSN -setdynamic -(dindex_t idx, rb_num_t level) -(VALUE val) -() -{ - rb_num_t i; - VALUE *ep = GET_EP(); - for (i = 0; i < level; i++) { - ep = GET_PREV_EP(ep); - } - *(ep - idx) = val; -} - /** @c variable @e Get value of instance variable id of self. diff --git a/iseq.c b/iseq.c index a6f39bc1f7..9313f6f80e 100644 --- a/iseq.c +++ b/iseq.c @@ -981,16 +981,8 @@ insn_operand_intern(rb_iseq_t *iseq, ret = rb_sprintf("%"PRIuVALUE, op); break; - case TS_LINDEX: - { - rb_iseq_t *liseq = iseq->local_iseq; - int lidx = liseq->local_size - (int)op; - - ret = id_to_name(liseq->local_table[lidx], INT2FIX('*')); - break; - } - case TS_DINDEX:{ - if (insn == BIN(getdynamic) || insn == BIN(setdynamic)) { + case TS_LINDEX:{ + if (insn == BIN(getlocal) || insn == BIN(setlocal)) { if (pnop) { rb_iseq_t *diseq = iseq; VALUE level = *pnop, i; @@ -1312,7 +1304,7 @@ rb_iseq_disasm(VALUE self) * 0004 putobject 2 * 0006 opt_plus * 0008 dup - * 0009 setdynamic num, 0 + * 0009 setlocal num, 0 * 0012 leave * */ @@ -1516,7 +1508,6 @@ iseq_data_to_ary(rb_iseq_t *iseq) break; } case TS_LINDEX: - case TS_DINDEX: case TS_NUM: rb_ary_push(ary, INT2FIX(*seq)); break; diff --git a/tool/instruction.rb b/tool/instruction.rb index 43b26b5c97..38318a435c 100755 --- a/tool/instruction.rb +++ b/tool/instruction.rb @@ -930,8 +930,6 @@ class RubyVM "TS_NUM" when /^lindex_t/ "TS_LINDEX" - when /^dindex_t/ - "TS_DINDEX" when /^VALUE/ "TS_VALUE" when /^ID/ @@ -957,7 +955,6 @@ class RubyVM 'TS_OFFSET' => 'O', 'TS_NUM' => 'N', 'TS_LINDEX' => 'L', - 'TS_DINDEX' => 'D', 'TS_VALUE' => 'V', 'TS_ID' => 'I', 'TS_GENTRY' => 'G', @@ -1064,7 +1061,7 @@ class RubyVM val = op[1] case type - when /^long/, /^rb_num_t/, /^lindex_t/, /^dindex_t/ + when /^long/, /^rb_num_t/, /^lindex_t/ "INT2FIX(#{val})" when /^VALUE/ val diff --git a/vm_exec.h b/vm_exec.h index 863f7c055c..75797e02c1 100644 --- a/vm_exec.h +++ b/vm_exec.h @@ -14,7 +14,6 @@ typedef long OFFSET; typedef unsigned long lindex_t; -typedef unsigned long dindex_t; typedef rb_num_t GENTRY; typedef rb_iseq_t *ISEQ; -- cgit v1.2.3