/// <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); } }
/// <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); } }
/// <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); } }
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); }
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); } }