summaryrefslogtreecommitdiff
path: root/compile.c
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-02-06 05:22:17 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-02-06 05:22:17 +0000
commit42ce75cdff741d69927e407ac57b68dd58408111 (patch)
tree23c31bb9a51e489645b42457e69ac9a50fd5014d /compile.c
parentd4d5f27077dd356fb2bef031991864777cc54ef6 (diff)
* compile.c, insns.def: remove (get|set)instancevariable2 and add a
operand is_local to (get|set)instancevariable. * yarvtest/test_class.rb: add a test for class local instance variable. * parse.y (rb_decompose_ivar2): remove unused variable oid. * tool/insns2vm.rb: remove needless require. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11639 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'compile.c')
-rw-r--r--compile.c30
1 files changed, 9 insertions, 21 deletions
diff --git a/compile.c b/compile.c
index 54a806ed99..0329a0ef1d 100644
--- a/compile.c
+++ b/compile.c
@@ -3323,22 +3323,15 @@ iseq_compile_each(yarv_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
(((long)node->nd_entry) | 1));
break;
}
- case NODE_IASGN:{
- COMPILE(ret, "lvalue", node->nd_value);
- if (!poped) {
- ADD_INSN(ret, nd_line(node), dup);
- }
- ADD_INSN1(ret, nd_line(node), setinstancevariable,
- ID2SYM(node->nd_vid));
- break;
- }
+ case NODE_IASGN:
case NODE_IASGN2:{
+ int is_local = (nd_type(node) == NODE_IVAR2) ? 1 : 0;
COMPILE(ret, "lvalue", node->nd_value);
if (!poped) {
ADD_INSN(ret, nd_line(node), dup);
}
- ADD_INSN1(ret, nd_line(node), setinstancevariable2,
- ID2SYM(node->nd_vid));
+ ADD_INSN2(ret, nd_line(node), setinstancevariable,
+ ID2SYM(node->nd_vid), INT2FIX(is_local));
break;
}
case NODE_CDECL:{
@@ -3909,19 +3902,14 @@ iseq_compile_each(yarv_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
}
break;
}
- case NODE_IVAR:{
- debugi("nd_vid", node->nd_vid);
- if (!poped) {
- ADD_INSN1(ret, nd_line(node), getinstancevariable,
- ID2SYM(node->nd_vid));
- }
- break;
- }
+ case NODE_IVAR:
case NODE_IVAR2:{
+ int is_local = (nd_type(node) == NODE_IVAR2) ? 1 : 0;
+
debugi("nd_vid", node->nd_vid);
if (!poped) {
- ADD_INSN1(ret, nd_line(node), getinstancevariable2,
- ID2SYM(node->nd_vid));
+ ADD_INSN2(ret, nd_line(node), getinstancevariable,
+ ID2SYM(node->nd_vid), INT2FIX(is_local));
}
break;
}