in compiler/src/main/java/org/apache/royale/abc/models/FrameModelEncoder.java [100:624]
public void visitInstruction(Instruction i)
{
switch (i.getOpcode())
{
case OP_iflt:
case OP_ifle:
case OP_ifnlt:
case OP_ifnle:
case OP_ifgt:
case OP_ifge:
case OP_ifngt:
case OP_ifnge:
case OP_ifeq:
case OP_ifstricteq:
case OP_ifne:
case OP_ifstrictne:
visitor.consumeValue(i, 2);
visitor.branch(i, cfg.getBlock(i.getTarget()));
break;
case OP_iftrue:
case OP_iffalse:
visitor.consumeValue(i, 1);
visitor.branch(i, cfg.getBlock(i.getTarget()));
break;
case OP_jump:
visitor.branch(i, cfg.getBlock(i.getTarget()));
break;
case OP_lookupswitch:
{
visitor.consumeValue(i,1);
ArrayList<IBasicBlock> targets = new ArrayList<IBasicBlock>();
for ( int j = 0; j < i.getOperandCount(); j++ )
if( i.getOperand(j) instanceof Label )
{
targets.add(cfg.getBlock((Label)i.getOperand(j)));
}
visitor.multiwayBranch(i, targets);
}
break;
case OP_throw:
visitor.consumeValue(i, 1);
break;
case OP_returnvalue:
visitor.consumeValue(i, 1);
break;
case OP_returnvoid:
visitor.noFrameEffect(i);
break;
case OP_pushnull:
visitor.produceValue(i);
break;
case OP_pushundefined:
visitor.produceValue(i);
break;
case OP_pushtrue:
case OP_pushfalse:
visitor.produceValue(i);
break;
case OP_pushnan:
visitor.produceValue(i);
break;
case OP_pushbyte:
case OP_pushshort:
case OP_pushint:
visitor.produceValue(i);
break;
case OP_debugfile:
visitor.noFrameEffect(i);
break;
case OP_dxns:
visitor.noFrameEffect(i);
break;
case OP_dxnslate:
visitor.consumeValue(i, 1);
break;
case OP_pushstring:
visitor.produceValue(i);
break;
case OP_pushuint:
visitor.produceValue(i);
break;
case OP_pushdouble:
visitor.produceValue(i);
break;
case OP_pushnamespace:
visitor.produceValue(i);
break;
case OP_setlocal0:
visitor.setlocal(i, 0);
break;
case OP_setlocal1:
visitor.setlocal(i, 1);
break;
case OP_setlocal2:
visitor.setlocal(i, 2);
break;
case OP_setlocal3:
visitor.setlocal(i, 3);
break;
case OP_setlocal:
visitor.setlocal(i, i.getImmediate());
break;
case OP_getlocal0:
visitor.getlocal(i, 0);
break;
case OP_getlocal1:
visitor.getlocal(i, 1);
break;
case OP_getlocal2:
visitor.getlocal(i, 2);
break;
case OP_getlocal3:
visitor.getlocal(i, 3);
break;
case OP_getlocal:
visitor.getlocal(i, i.getImmediate());
break;
case OP_kill:
visitor.modifyLocal(i, i.getImmediate());
break;
case OP_inclocal:
case OP_inclocal_i:
case OP_declocal:
case OP_declocal_i:
visitor.modifyLocal(i, i.getImmediate());
break;
case OP_newfunction:
visitor.produceValue(i);
break;
case OP_getlex:
visitor.produceValue(i);
break;
case OP_findpropstrict:
case OP_findproperty:
visitor.consumeAndProduceValue(i, runtimeNameAllowance(i.getOperand(0)));
break;
case OP_newclass:
visitor.consumeAndProduceValue(i, 1);
break;
case OP_finddef:
visitor.consumeAndProduceValue(i, runtimeNameAllowance(i.getOperand(0)));
break;
case OP_setproperty:
case OP_initproperty:
visitor.consumeValue(i, 2 + runtimeNameAllowance(i.getOperand(0)));
break;
case OP_getproperty:
visitor.consumeAndProduceValue(i, 1 + runtimeNameAllowance(i.getOperand(0)));
break;
case OP_getdescendants:
visitor.consumeAndProduceValue(i, 1 + runtimeNameAllowance(i.getOperand(0)));
break;
case OP_checkfilter:
visitor.consumeAndProduceValue(i, 1);
break;
case OP_deleteproperty:
visitor.consumeAndProduceValue(i, 1 + runtimeNameAllowance(i.getOperand(0)));
break;
case OP_astype:
visitor.consumeAndProduceValue(i, 1);
break;
case OP_astypelate:
visitor.consumeAndProduceValue(i, 2);
break;
case OP_coerce:
visitor.consumeAndProduceValue(i, 1);
break;
case OP_convert_b:
case OP_coerce_b:
visitor.consumeAndProduceValue(i, 1);
break;
case OP_coerce_o:
visitor.consumeAndProduceValue(i, 1);
break;
case OP_coerce_a:
visitor.consumeAndProduceValue(i, 1);
break;
case OP_convert_i:
case OP_coerce_i:
visitor.consumeAndProduceValue(i, 1);
break;
case OP_convert_u:
case OP_coerce_u:
visitor.consumeAndProduceValue(i, 1);
break;
case OP_convert_d:
case OP_coerce_d:
visitor.consumeAndProduceValue(i, 1);
break;
case OP_unplus:
visitor.consumeAndProduceValue(i, 1);
break;
case OP_coerce_s:
visitor.consumeAndProduceValue(i, 1);
break;
case OP_istype:
visitor.consumeAndProduceValue(i, 1 + runtimeNameAllowance(i.getOperand(0)));
break;
case OP_istypelate:
visitor.consumeAndProduceValue(i, 2);
break;
case OP_convert_o:
visitor.consumeAndProduceValue(i, 1);
break;
case OP_convert_s:
case OP_esc_xelem:
case OP_esc_xattr:
visitor.consumeAndProduceValue(i, 1);
break;
case OP_callstatic:
{
int argc = (Integer)i.getOperand(1);
visitor.consumeAndProduceValue(i, argc+1);
}
break;
case OP_call:
visitor.consumeAndProduceValue(i, 2 + i.getImmediate());
break;
case OP_construct:
visitor.consumeAndProduceValue(i, 1 + i.getImmediate());
break;
case OP_callmethod:
visitor.consumeAndProduceValue(i, 1 + i.getImmediate());
break;
case OP_callproperty:
case OP_callproplex:
visitor.consumeAndProduceValue(i, 1 + runtimeNameAllowance(i.getOperand(0)) + (Integer)i.getOperand(1));
break;
case OP_callpropvoid:
visitor.consumeValue(i, 1 + runtimeNameAllowance(i.getOperand(0)) + (Integer)i.getOperand(1));
break;
case OP_constructprop:
visitor.consumeAndProduceValue(i, 1 + runtimeNameAllowance(i.getOperand(0)) + (Integer)i.getOperand(1));
break;
case OP_applytype:
visitor.consumeAndProduceValue(i, 1);
break;
case OP_callsuper:
visitor.consumeAndProduceValue(i, 1 + runtimeNameAllowance(i.getOperand(0)) + (Integer)i.getOperand(1));
break;
case OP_callsupervoid:
visitor.consumeValue(i, 1 + runtimeNameAllowance(i.getOperand(0)) + (Integer)i.getOperand(1));
break;
case OP_getsuper:
visitor.consumeAndProduceValue(i, 1 + runtimeNameAllowance(i.getOperand(0)));
break;
case OP_setsuper:
visitor.consumeValue(i, 2 + runtimeNameAllowance(i.getOperand(0)));
break;
case OP_constructsuper:
visitor.consumeAndProduceValue(i, 1 + i.getImmediate());
break;
case OP_newobject:
visitor.consumeAndProduceValue(i, 2*i.getImmediate());
break;
case OP_newarray:
visitor.consumeAndProduceValue(i, i.getImmediate());
break;
case OP_pushscope:
case OP_pushwith:
visitor.moveValueToScopeStack(i);
break;
case OP_newactivation:
visitor.produceValue(i);
break;
case OP_newcatch:
visitor.produceValue(i);
break;
case OP_popscope:
visitor.popscope(i);
break;
case OP_getscopeobject:
visitor.getScopeobject(i, i.getImmediate());
break;
case OP_getouterscope:
// TODO: Need to model this correctly.
visitor.getScopeobject(i, i.getImmediate());
break;
case OP_getglobalscope:
visitor.getScopeobject(i, 0);
break;
case OP_getglobalslot:
visitor.produceValue(i);
break;
case OP_setglobalslot:
visitor.consumeValue(i, 1);
break;
case OP_getslot:
visitor.consumeAndProduceValue(i, 1);
break;
case OP_setslot:
visitor.consumeValue(i, 2);
break;
case OP_pop:
visitor.consumeValue(i, 1);
break;
case OP_dup:
visitor.dup(i);
break;
case OP_swap:
visitor.swap(i);
break;
case OP_lessthan:
case OP_greaterthan:
case OP_lessequals:
case OP_greaterequals:
case OP_equals:
case OP_strictequals:
case OP_instanceof:
case OP_in:
visitor.consumeAndProduceValue(i, 2);
break;
case OP_not:
visitor.consumeAndProduceValue(i, 1);
break;
case OP_add:
visitor.consumeAndProduceValue(i, 2);
break;
case OP_modulo:
case OP_subtract:
case OP_divide:
case OP_multiply:
visitor.consumeAndProduceValue(i, 2);
break;
case OP_negate:
case OP_increment:
case OP_decrement:
visitor.consumeAndProduceValue(i, 1);
break;
case OP_increment_i:
case OP_decrement_i:
visitor.consumeAndProduceValue(i, 1);
break;
case OP_add_i:
case OP_subtract_i:
case OP_multiply_i:
visitor.consumeAndProduceValue(i, 2);
break;
case OP_negate_i:
visitor.consumeAndProduceValue(i, 1);
break;
case OP_bitand:
case OP_bitor:
case OP_bitxor:
visitor.consumeAndProduceValue(i, 2);
break;
case OP_lshift:
case OP_rshift:
visitor.consumeAndProduceValue(i, 2);
break;
case OP_urshift:
visitor.consumeAndProduceValue(i, 2);
break;
case OP_bitnot:
visitor.consumeAndProduceValue(i, 1);
break;
case OP_typeof:
visitor.consumeAndProduceValue(i, 1);
break;
case OP_nop:
case OP_bkpt:
case OP_bkptline:
case OP_timestamp:
case OP_debug:
case OP_label:
case OP_debugline:
visitor.noFrameEffect(i);
break;
case OP_nextvalue:
case OP_nextname:
visitor.consumeAndProduceValue(i, 2);
break;
case OP_hasnext:
visitor.consumeAndProduceValue(i, 2);
break;
case OP_hasnext2:
visitor.hasnext2(i);
visitor.produceValue(i);
break;
case OP_sxi1:
case OP_sxi8:
case OP_sxi16:
visitor.consumeAndProduceValue(i, 1);
break;
case OP_li8:
case OP_li16:
case OP_li32:
visitor.consumeAndProduceValue(i, 1);
break;
case OP_lf32:
case OP_lf64:
visitor.consumeAndProduceValue(i, 1);
break;
/*
case OP_lf32x4:
visitor.consumeAndProduceValue(i, 1);
break;
*/
case OP_si8:
case OP_si16:
case OP_si32:
case OP_sf32:
case OP_sf64:
visitor.consumeValue(i, 2);
break;
/*
case OP_sf32x4:
visitor.consumeValue(i, 2);
break;
*/
case OP_callinterface:
case OP_callsuperid:
case OP_deletepropertylate:
case OP_setpropertylate:
assert false : "internal only instruction:" + i; //$NON-NLS-1$
break;
default:
assert false : "unknown instruction:" + i; //$NON-NLS-1$
break;
}
this.instructionIndex++;
}