internal override void DebugPrint(Executable exe) { int index = 0; int currLine = 0; foreach (var c in _cmds) { // 到新的源码行 if (c.CodePos.Line > currLine) { // 每个源码下的汇编成为一块, 块与块之间空行 if (currLine != 0) { Logger.DebugLine(""); } currLine = c.CodePos.Line; // 显示源码 Logger.DebugLine("{0}|{1}", currLine, exe.QuerySourceLine(c.CodePos)); } // 显示汇编 Logger.DebugLine("{0,2}| {1}", index, c.ToString()); index++; } Logger.DebugLine(""); }
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 ============"); } }