public override void execute(StackFrame frame) { Object val2 = frame.popOperand(); Object val1 = frame.popOperand(); //Heap.HeapReference val2 = (Heap.HeapReference) frame.popOperand(); //Heap.HeapReference val1 = (Heap.HeapReference) frame.popOperand(); bool eval = false; switch (opval){ case OP_EQ:{ eval = (val1 == val2); break; } case OP_NE:{ eval = (val1 != val2); break; } default: throw new ToyVMException("Not handling " + opval,frame); } if (eval){ int pc = frame.getProgramCounter(); frame.setProgramCounter(pc + branch - size); } }
public override void execute(StackFrame frame) { int pc = frame.getProgramCounter(); frame.pushOperand(pc + size); frame.setProgramCounter(pc + branch - size); }
public override void execute(StackFrame frame) { Object oper = frame.popOperand(); if (log.IsDebugEnabled) log.DebugFormat("Oper is {0}",oper); int pc = frame.getProgramCounter(); bool eval = false; switch (opval){ case OP_NULL:{ eval = (oper is NullValue); break; } case OP_GE:{ eval = ((int) oper >= 0); break; } case OP_G: { eval = ((int) oper > 0); break; } case OP_NE: { eval = ((int) oper != 0); break; } case OP_NOTNULL: { eval = ! (oper is NullValue); break; } case OP_EQUALS: { eval = ((int)oper == 0); break; } case OP_LT: { eval = ((int) oper == -1); break; } case OP_LE: { eval = ((int) oper <= 0); break; } default:throw new ToyVMException("Don't know how to handle",frame); } if (eval){ frame.setProgramCounter(pc + branch - size); if (log.IsDebugEnabled) log.DebugFormat("Jumping to " + (frame.getProgramCounter() + size)); } }
/** * Value at index should be of type returnAddress, but we just use int */ public override void execute(StackFrame frame) { int pc = (int) frame.getLocalVariables()[index]; frame.setProgramCounter(pc - size); // we have to decrement because executor will add }
public override void execute(StackFrame frame) { int pc = frame.getProgramCounter(); frame.setProgramCounter(pc + branch - size); if (log.IsDebugEnabled) log.DebugFormat("Going to {0}",frame.getProgramCounter() + size); }