public override VMPrimitiveExitCode Execute(VMStackFrame frame, out VMInstruction instruction) { var result = Function.Execute(frame, ref frame.InstructionPointer, frame.Args); instruction = frame.GetCurrentInstruction(); return(result ? VMPrimitiveExitCode.RETURN_TRUE : VMPrimitiveExitCode.RETURN_FALSE); }
public override VMPrimitiveExitCode Execute(VMStackFrame frame, out VMInstruction instruction) { var result = Function.Execute(frame, ref frame.InstructionPointer); instruction = frame.GetCurrentInstruction(); return(result); }
public virtual VMPrimitiveExitCode Execute(VMStackFrame frame, out VMInstruction instruction) { instruction = frame.GetCurrentInstruction(); var opcode = instruction.Opcode; if (opcode >= 256) { frame.Thread.ExecuteSubRoutine(frame, opcode, (VMSubRoutineOperand)instruction.Operand); return(VMPrimitiveExitCode.CONTINUE); } var primitive = VMContext.Primitives[opcode]; if (primitive == null) { return(VMPrimitiveExitCode.GOTO_TRUE); } VMPrimitiveHandler handler = primitive.GetHandler(); return(handler.Execute(frame, instruction.Operand)); }
private void ExecuteInstruction(VMStackFrame frame) { var instruction = frame.GetCurrentInstruction(); var opcode = instruction.Opcode; if (opcode >= 256) { BHAV bhav = null; GameIffResource CodeOwner; if (opcode >= 8192) { CodeOwner = frame.Callee.SemiGlobal.Resource; bhav = frame.Callee.SemiGlobal.Resource.Get<BHAV>(opcode); } else if (opcode >= 4096) { /** Private sub-routine call **/ CodeOwner = frame.CalleePrivate; bhav = frame.CalleePrivate.Get<BHAV>(opcode); } else { /** Global sub-routine call **/ CodeOwner = frame.Global.Resource; bhav = frame.Global.Resource.Get<BHAV>(opcode); } var operand = frame.GetCurrentOperand<VMSubRoutineOperand>(); ExecuteSubRoutine(frame, bhav, CodeOwner, operand); return; } var primitive = Context.GetPrimitive(opcode); if (primitive == null) { throw new Exception("Unknown primitive!"); //Pop(VMPrimitiveExitCode.ERROR); //return; } VMPrimitiveHandler handler = primitive.GetHandler(); var result = handler.Execute(frame); HandleResult(frame, instruction, result); }
private void ExecuteInstruction(VMStackFrame frame) { var instruction = frame.GetCurrentInstruction(); var opcode = instruction.Opcode; if (opcode >= 256) { BHAV bhav = null; GameObject CodeOwner; if (opcode >= 8192) { // Semi-Global sub-routine call bhav = frame.ScopeResource.SemiGlobal.Get<BHAV>(opcode); } else if (opcode >= 4096) { // Private sub-routine call bhav = frame.ScopeResource.Get<BHAV>(opcode); } else { // Global sub-routine call //CodeOwner = frame.Global.Resource; bhav = frame.Global.Resource.Get<BHAV>(opcode); } CodeOwner = frame.CodeOwner; var operand = (VMSubRoutineOperand)instruction.Operand; ExecuteSubRoutine(frame, bhav, CodeOwner, operand); NextInstruction(); return; } var primitive = Context.Primitives[opcode]; if (primitive == null) { //throw new Exception("Unknown primitive!"); HandleResult(frame, instruction, VMPrimitiveExitCode.GOTO_TRUE); return; //Pop(VMPrimitiveExitCode.ERROR); } VMPrimitiveHandler handler = primitive.GetHandler(); var result = handler.Execute(frame, instruction.Operand); HandleResult(frame, instruction, result); }
private void MoveToInstruction(VMStackFrame frame, byte instruction, bool continueExecution){ if (frame is VMRoutingFrame) { //TODO: Handle returning false into the pathfinder (indicates failure) return; } switch (instruction) { case 255: Pop(VMPrimitiveExitCode.RETURN_FALSE); break; case 254: Pop(VMPrimitiveExitCode.RETURN_TRUE); break; case 253: Pop(VMPrimitiveExitCode.ERROR); break; default: frame.InstructionPointer = instruction; if (frame.GetCurrentInstruction().Breakpoint || (ThreadBreak != VMThreadBreakMode.Active && ( ThreadBreak == VMThreadBreakMode.StepIn || (ThreadBreak == VMThreadBreakMode.StepOver && Stack.Count-1 <= BreakFrame) || (ThreadBreak == VMThreadBreakMode.StepOut && Stack.Count <= BreakFrame) ))) { Breakpoint(frame); } break; } ContinueExecution = (ThreadBreak != VMThreadBreakMode.Pause) && continueExecution; }
private void ExecuteInstruction(VMStackFrame frame){ var instruction = frame.GetCurrentInstruction(); var opcode = instruction.Opcode; if (opcode >= 256) { BHAV bhav = null; GameObject CodeOwner; if (opcode >= 8192) { // Semi-Global sub-routine call bhav = frame.ScopeResource.SemiGlobal.Get<BHAV>(opcode); } else if (opcode >= 4096) { // Private sub-routine call bhav = frame.ScopeResource.Get<BHAV>(opcode); } else { // Global sub-routine call //CodeOwner = frame.Global.Resource; bhav = frame.Global.Resource.Get<BHAV>(opcode); } CodeOwner = frame.CodeOwner; var operand = (VMSubRoutineOperand)instruction.Operand; ExecuteSubRoutine(frame, bhav, CodeOwner, operand); #if IDE_COMPAT if (Stack.LastOrDefault().GetCurrentInstruction().Breakpoint || ThreadBreak == VMThreadBreakMode.StepIn) { Breakpoint(frame); ContinueExecution = false; } else #endif { ContinueExecution = true; } return; } var primitive = Context.Primitives[opcode]; if (primitive == null) { HandleResult(frame, instruction, VMPrimitiveExitCode.GOTO_TRUE); return; } VMPrimitiveHandler handler = primitive.GetHandler(); var result = handler.Execute(frame, instruction.Operand); HandleResult(frame, instruction, result); }