public object[] Execute(Executable exe, string pkgname, string entryName, object[] paramToExec = null, int retValueCount = 0) { Execute(exe); // 找到包入口 var func = exe.GetFuncByName(new ObjectName(pkgname, entryName)) as ValuePhoFunc; if (func == null) { throw new RuntimeException("unknown start package name: " + pkgname); } // 参数转到栈上 ObjectListToDataStack(paramToExec); var rtpkg = GetRuntimePackageByName(pkgname); var argCount = paramToExec != null ? paramToExec.Length:0; ExecuteFunc(exe, rtpkg, func, argCount, retValueCount); if (retValueCount > 0) { var retValue = new object[retValueCount]; for (int i = 0; i < retValueCount; i++) { retValue[i] = Convertor.ValueToNativeValue(DataStack.Get(-(i + 1))); } return(retValue); } return(null); }
internal void MoveArgStack2Local(int argCount) { // 将栈转为被调用函数的寄存器 for (int i = 0; i < argCount; i++) { var arg = DataStack.Get(-i - 1); LocalReg.Set(argCount - i - 1, arg); } }