diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-11-09 23:08:01 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-11-09 23:08:01 +0000 |
commit | 324b6d306d7da4fd3fc109e4e9781c782b64369f (patch) | |
tree | eca108813add390a09d49f8c2214fc1711f6f895 /iseq.c | |
parent | 6820727a907d047b4c8ae989c69ad8397661ef75 (diff) | |
download | ruby-324b6d306d7da4fd3fc109e4e9781c782b64369f.tar.gz |
iseq.c: operand lvar
* iseq.c (rb_insn_operand_intern): show local variable operand
name in unified instructions.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60732 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'iseq.c')
-rw-r--r-- | iseq.c | 31 |
1 files changed, 21 insertions, 10 deletions
@@ -1289,6 +1289,22 @@ id_to_name(ID id, VALUE default_value) return str; } +static VALUE +local_var_name(const rb_iseq_t *diseq, VALUE level, VALUE op) +{ + VALUE i; + ID lid; + + for (i = 0; i < level; i++) { + diseq = diseq->body->parent_iseq; + } + lid = diseq->body->local_table[diseq->body->local_table_size + + VM_ENV_DATA_SIZE - 1 - op]; + return id_to_name(lid, INT2FIX('*')); +} + +int rb_insn_unified_local_var_level(VALUE); + VALUE rb_insn_operand_intern(const rb_iseq_t *iseq, VALUE insn, int op_no, VALUE op, @@ -1308,23 +1324,18 @@ rb_insn_operand_intern(const rb_iseq_t *iseq, break; case TS_LINDEX:{ + int level; if (insn == BIN(getlocal) || insn == BIN(setlocal)) { if (pnop) { - const rb_iseq_t *diseq = iseq; - VALUE level = *pnop, i; - ID lid; - - for (i = 0; i < level; i++) { - diseq = diseq->body->parent_iseq; - } - lid = diseq->body->local_table[diseq->body->local_table_size + - VM_ENV_DATA_SIZE - 1 - op]; - ret = id_to_name(lid, INT2FIX('*')); + ret = local_var_name(iseq, *pnop, op); } else { ret = rb_sprintf("%"PRIuVALUE, op); } } + else if ((level = rb_insn_unified_local_var_level(insn)) >= 0) { + ret = local_var_name(iseq, (VALUE)level, op); + } else { ret = rb_inspect(INT2FIX(op)); } |