internal void MoveArgStack2Local(int argCount) { // 将栈转为被调用函数的寄存器 for (int i = 0; i < argCount; i++) { var arg = DataStack.Get(-i - 1); LocalReg.Set(argCount - i - 1, arg); } }
internal void EnterFrame(ValuePhoFunc func) { CallHook(DebugHook.Call); var newFrame = new RuntimeFrame(func); _currFrame = newFrame; _callStack.Push(_currFrame); LocalReg.SetCount(newFrame.Func.RegCount); LocalReg.AttachScope(func.Scope); }
internal void ExecuteFunc(Executable exe, RuntimePackage rtpkg, ValuePhoFunc func, int argCount, int retValueCount) { if (func.Commands.Count == 0) { return; } if (ShowDebugInfo) { Logger.DebugLine(string.Format("============ Run '{0}' ============", func.Name)); } rtpkg.Reg.SetCount(func.RegCount); EnterFrame(func); CurrFrame.ReceiverCount = retValueCount; // 数据栈转寄存器 if (argCount > 0) { MoveArgStack2Local(argCount); _dataStack.Clear(); } int currSrcLine = 0; _state = State.Running; while (true) { var cmd = CurrFrame.GetCurrCommand(); if (cmd == null) { break; } if (ShowDebugInfo) { Logger.DebugLine("{0}|{1}", cmd.CodePos, exe.QuerySourceLine(cmd.CodePos)); Logger.DebugLine("---------------------"); Logger.DebugLine("{0,5} {1,2}| {2} {3}", _currFrame.Func.Name, _currFrame.PC, cmd.Op.ToString(), _insset.InstructToString(cmd)); } // 源码行有变化时 if (currSrcLine == 0 || currSrcLine != cmd.CodePos.Line) { if (currSrcLine != 0) { CallHook(DebugHook.SourceLine); } currSrcLine = cmd.CodePos.Line; } // 每条指令执行前 CallHook(DebugHook.AssemblyLine); if (_insset.ExecCode(this, cmd)) { if (_currFrame == null) { break; } _currFrame.PC++; } // 打印执行完后的信息 if (ShowDebugInfo) { rtpkg.Reg.DebugPrint(); // 寄存器信息 LocalReg.DebugPrint(); // 数据栈信息 DataStack.DebugPrint(); Logger.DebugLine(""); } } if (ShowDebugInfo) { Logger.DebugLine("============ VM End ============"); } }