示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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;
            }
        }