예제 #1
0
        void InitialCall(Executable exe)
        {
            _callStack.Clear();
            _dataStack.Clear();

            Constants = exe.Constants;

            // 为了防止用户在Executable new之后添加其他的函数
            // 所以链接过程在第一次调用时, 虽然耗时
            _entryList = exe.GenEntryList();

            // 将指令中所有的entry互相链接
            exe.LinkEntryPoint();

            // 依赖包按依赖顺序初始化
            for (int i = 0; i < exe.PackageCount; i++)
            {
                var pkg = exe.GetPackage(i);

                // 已经创建过了
                if (i < _package.Count)
                {
                    continue;
                }

                var rtPkg = new RuntimePackage(pkg);

                _package.Add(rtPkg);

                if (pkg.InitEntry != null)
                {
                    // 执行包的全局入口( 只会还行一次)
                    ExecuteFunc(exe, rtPkg, pkg.InitEntry, 0, 0);
                }
            }
        }
예제 #2
0
        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 ============");
            }
        }