aboutsummaryrefslogtreecommitdiffstats
path: root/iseq.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-11-09 23:08:01 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-11-09 23:08:01 +0000
commitdde9a8755fd40c3e7053da21de68a241bba4ef54 (patch)
treeeca108813add390a09d49f8c2214fc1711f6f895 /iseq.c
parent5646d665aa4f2b1ab65d27067ecad6f5c3268dbf (diff)
downloadruby-dde9a8755fd40c3e7053da21de68a241bba4ef54.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.c31
1 files changed, 21 insertions, 10 deletions
diff --git a/iseq.c b/iseq.c
index ac926b7a18..6f16be8525 100644
--- a/iseq.c
+++ b/iseq.c
@@ -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));
}