private void Init(StackValue svThisPtr, int classIndex, int funcIndex, int pc, int functionBlockDecl, int functionBlockCaller, StackFrameType callerType, StackFrameType type, int depth, int framePointer, List <StackValue> stack) { Validity.Assert((int)StackFrame.AbsoluteIndex.kSize == kStackFrameSize); Frame = new StackValue[kStackFrameSize]; Frame[(int)AbsoluteIndex.kFramePointer] = StackUtils.BuildInt(framePointer); Frame[(int)AbsoluteIndex.kStackFrameType] = StackUtils.BuildNode(AddressType.FrameType, (int)type); Frame[(int)AbsoluteIndex.kCallerStackFrameType] = StackUtils.BuildNode(AddressType.FrameType, (int)callerType); Frame[(int)AbsoluteIndex.kStackFrameDepth] = StackUtils.BuildInt(depth); Frame[(int)AbsoluteIndex.kFunctionCallerBlock] = StackUtils.BuildNode(AddressType.BlockIndex, functionBlockCaller); Frame[(int)AbsoluteIndex.kFunctionBlock] = StackUtils.BuildNode(AddressType.BlockIndex, functionBlockDecl); Frame[(int)AbsoluteIndex.kReturnAddress] = StackUtils.BuildInt(pc); Frame[(int)AbsoluteIndex.kFunction] = StackUtils.BuildInt(funcIndex); Frame[(int)AbsoluteIndex.kClass] = StackUtils.BuildInt(classIndex); Frame[(int)AbsoluteIndex.kThisPtr] = svThisPtr; Frame[(int)AbsoluteIndex.kRegisterAX] = stack[0]; Frame[(int)AbsoluteIndex.kRegisterBX] = stack[1]; Frame[(int)AbsoluteIndex.kRegisterCX] = stack[2]; Frame[(int)AbsoluteIndex.kRegisterDX] = stack[3]; Frame[(int)AbsoluteIndex.kRegisterEX] = stack[4]; Frame[(int)AbsoluteIndex.kRegisterFX] = stack[5]; Frame[(int)AbsoluteIndex.kRegisterLX] = stack[6]; Frame[(int)AbsoluteIndex.kRegisterRX] = stack[7]; Frame[(int)AbsoluteIndex.kRegisterSX] = stack[8]; Frame[(int)AbsoluteIndex.kRegisterTX] = stack[9]; Validity.Assert(kStackFrameSize == Frame.Length); }
private void Init(StackValue svThisPtr, int classIndex, int funcIndex, int pc, int functionBlockDecl, int functionBlockCaller, StackFrameType callerType, StackFrameType type, int depth, int framePointer, List <StackValue> stack, List <bool> execStates) { Validity.Assert((int)StackFrame.AbsoluteIndex.kSize == kStackFrameSize); Frame = new StackValue[kStackFrameSize]; Frame[(int)AbsoluteIndex.kFramePointer] = StackUtils.BuildInt(framePointer); Frame[(int)AbsoluteIndex.kStackFrameType] = StackUtils.BuildNode(AddressType.FrameType, (int)type); Frame[(int)AbsoluteIndex.kCallerStackFrameType] = StackUtils.BuildNode(AddressType.FrameType, (int)callerType); Frame[(int)AbsoluteIndex.kStackFrameDepth] = StackUtils.BuildInt(depth); Frame[(int)AbsoluteIndex.kFunctionCallerBlock] = StackUtils.BuildNode(AddressType.BlockIndex, functionBlockCaller); Frame[(int)AbsoluteIndex.kFunctionBlock] = StackUtils.BuildNode(AddressType.BlockIndex, functionBlockDecl); Frame[(int)AbsoluteIndex.kReturnAddress] = StackUtils.BuildInt(pc); Frame[(int)AbsoluteIndex.kFunction] = StackUtils.BuildInt(funcIndex); Frame[(int)AbsoluteIndex.kClass] = StackUtils.BuildInt(classIndex); Frame[(int)AbsoluteIndex.kThisPtr] = svThisPtr; Frame[(int)AbsoluteIndex.kRegisterAX] = stack[0]; Frame[(int)AbsoluteIndex.kRegisterBX] = stack[1]; Frame[(int)AbsoluteIndex.kRegisterCX] = stack[2]; Frame[(int)AbsoluteIndex.kRegisterDX] = stack[3]; Frame[(int)AbsoluteIndex.kRegisterEX] = stack[4]; Frame[(int)AbsoluteIndex.kRegisterFX] = stack[5]; Frame[(int)AbsoluteIndex.kRegisterLX] = stack[6]; Frame[(int)AbsoluteIndex.kRegisterRX] = stack[7]; Frame[(int)AbsoluteIndex.kRegisterSX] = stack[8]; Frame[(int)AbsoluteIndex.kRegisterTX] = stack[9]; int execStateSize = 0; if (null != execStates) { execStateSize = execStates.Count; ExecutionStates = new StackValue[execStateSize]; for (int n = 0; n < execStateSize; ++n) { ExecutionStates[n] = StackUtils.BuildBoolean(execStates[n]); } } Frame[(int)AbsoluteIndex.kExecutionStates] = StackUtils.BuildInt(execStateSize); Frame[(int)AbsoluteIndex.kLocalVariables] = StackUtils.BuildInt(0); Validity.Assert(kStackFrameSize == Frame.Length); }
private void GCDisposeObject(ref StackValue svPtr, Executive exe) { int classIndex = (int)svPtr.metaData.type; ClassNode cn = exe.exe.classTable.ClassNodes[classIndex]; ProcedureNode pn = null; while (pn == null) { pn = cn.GetDisposeMethod(); if (pn == null && cn.baseList != null && cn.baseList.Count != 0) // search the base class { // assume multiple inheritance is not allowed // it will only has a single base class classIndex = cn.baseList[0]; cn = exe.exe.classTable.ClassNodes[cn.baseList[0]]; } else { break; } } if (pn != null) { // TODO Jun/Jiong: Use build pointer utilities exe.rmem.Push(StackUtils.BuildNode(AddressType.ArrayDim, 0)); exe.rmem.Push(StackUtils.BuildPointer(svPtr.opdata, svPtr.metaData)); exe.rmem.Push(StackUtils.BuildNode(AddressType.BlockIndex, pn.runtimeIndex)); exe.rmem.Push(StackUtils.BuildNode(AddressType.ArrayDim, 0)); exe.rmem.Push(StackUtils.BuildStaticType((int)ProtoCore.PrimitiveType.kTypeVar)); ++exe.Core.FunctionCallDepth; // TODO: Need to move isExplicitCall to DebugProps and come up with a more elegant solution for this // fix for IDE-963 - pratapa bool explicitCall = exe.isExplicitCall; bool tempFlag = explicitCall; exe.Callr(pn.procId, classIndex, 1, ref explicitCall); exe.isExplicitCall = tempFlag; --exe.Core.FunctionCallDepth; } }