Example #1
0
        /// <summary>
        /// Convert StackValue to boolean typed StackValue. Returns
        /// StackValue.Null if not able to do conversion.
        /// </summary>
        /// <param name="core"></param>
        /// <returns></returns>
        public StackValue ToBoolean(RuntimeCore runtimeCore)
        {
            switch (optype)
            {
            case AddressType.Boolean:
                return(this);

            case AddressType.Int:
                return(BuildBoolean(opdata != 0));

            case AddressType.Null:
                return(StackValue.Null);

            case AddressType.Double:
                bool b = !Double.IsNaN(RawDoubleValue) && !RawDoubleValue.Equals(0.0);
                return(BuildBoolean(b));

            case AddressType.Pointer:
                return(StackValue.BuildBoolean(true));

            case AddressType.String:
                string str = runtimeCore.RuntimeMemory.Heap.ToHeapObject <DSString>(this).Value;
                return(string.IsNullOrEmpty(str) ? StackValue.False : StackValue.True);

            case AddressType.Char:
                char c = Convert.ToChar(opdata);
                return((c == 0) ? StackValue.False : StackValue.True);

            default:
                return(StackValue.Null);
            }
        }
Example #2
0
        /// <summary>
        /// Convert StackValue to boolean typed StackValue. Returns
        /// StackValue.Null if not able to do conversion.
        /// </summary>
        /// <param name="core"></param>
        /// <returns></returns>
        public StackValue ToBoolean(Core core)
        {
            switch (optype)
            {
            case AddressType.Boolean:
                return(this);

            case AddressType.Int:
                return(BuildBoolean(opdata != 0));

            case AddressType.Null:
                return(StackValue.Null);

            case AddressType.Double:
                bool b = !Double.IsNaN(RawDoubleValue) && !RawDoubleValue.Equals(0.0);
                return(BuildBoolean(b));

            case AddressType.Pointer:
                return(StackValue.BuildBoolean(true));

            case AddressType.String:
                string str = core.Heap.GetString(this);
                return(string.IsNullOrEmpty(str) ? StackValue.False : StackValue.True);

            case AddressType.Char:
                char c = EncodingUtils.ConvertInt64ToCharacter(opdata);
                return((c == 0) ? StackValue.False : StackValue.True);

            default:
                return(StackValue.Null);
            }
        }
Example #3
0
        /// <summary>
        /// Convert StackValue to boolean typed StackValue. Returns
        /// StackValue.Null if not able to do conversion.
        /// </summary>
        /// <param name="core"></param>
        /// <returns></returns>
        public StackValue ToBoolean(Core core)
        {
            switch (optype)
            {
            case AddressType.Boolean:
                return(this);

            case AddressType.Int:
                return(BuildBoolean(opdata != 0));

            case AddressType.Null:
                return(StackValue.Null);

            case AddressType.Double:
                bool b = !Double.IsNaN(RawDoubleValue) && !RawDoubleValue.Equals(0.0);
                return(BuildBoolean(b));

            case AddressType.Pointer:
                return(StackValue.BuildBoolean(true));

            case AddressType.String:
                int size = ArrayUtils.GetElementSize(this, core);
                return((size == 0) ? StackValue.False : StackValue.True);

            case AddressType.Char:
                char c = EncodingUtils.ConvertInt64ToCharacter(opdata);
                return((c == 0) ? StackValue.False : StackValue.True);

            default:
                return(StackValue.Null);
            }
        }
Example #4
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]         = StackValue.BuildInt(framePointer);
            Frame[(int)AbsoluteIndex.kStackFrameType]       = StackValue.BuildFrameType((int)type);
            Frame[(int)AbsoluteIndex.kCallerStackFrameType] = StackValue.BuildFrameType((int)callerType);
            Frame[(int)AbsoluteIndex.kStackFrameDepth]      = StackValue.BuildInt(depth);
            Frame[(int)AbsoluteIndex.kFunctionCallerBlock]  = StackValue.BuildBlockIndex(functionBlockCaller);
            Frame[(int)AbsoluteIndex.kFunctionBlock]        = StackValue.BuildBlockIndex(functionBlockDecl);
            Frame[(int)AbsoluteIndex.kReturnAddress]        = StackValue.BuildInt(pc);
            Frame[(int)AbsoluteIndex.kFunction]             = StackValue.BuildInt(funcIndex);
            Frame[(int)AbsoluteIndex.kClass]   = StackValue.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] = StackValue.BuildBoolean(execStates[n]);
                }
            }

            Frame[(int)AbsoluteIndex.kExecutionStates] = StackValue.BuildInt(execStateSize);
            Frame[(int)AbsoluteIndex.kLocalVariables]  = StackValue.BuildInt(0);

            Validity.Assert(kStackFrameSize == Frame.Length);
        }
Example #5
0
        public static StackValue AsBoolean(this StackValue operand, Core core)
        {
            switch (operand.optype)
            {
            case AddressType.Boolean:
            case AddressType.Int:
                return(StackValue.BuildBoolean(operand.opdata != 0));

            case AddressType.Null:
                return(StackValue.Null);    //BuildBoolean(false);

            case AddressType.Double:
                bool b = !(Double.IsNaN(operand.opdata_d) || operand.opdata_d.Equals(0.0));
                return(StackValue.BuildBoolean(b));

            case AddressType.Pointer:
                return(StackValue.BuildBoolean(true));

            case AddressType.String:
                if (ArrayUtils.GetElementSize(operand, core) == 0)
                {
                    return(StackValue.BuildBoolean(false));
                }
                return(StackValue.BuildBoolean(true));

            case AddressType.Char:
                if (EncodingUtils.ConvertInt64ToCharacter(operand.opdata) == 0)
                {
                    return(StackValue.BuildBoolean(false));
                }
                return(StackValue.BuildBoolean(true));

            default:
                return(StackValue.Null);
            }
        }