public static DynValue rawequal(ScriptExecutionContext executionContext, CallbackArguments args) { DynValue v1 = args[0]; DynValue v2 = args[1]; return(DynValue.NewBoolean(v1.Equals(v2))); }
private int ExecEq(Instruction i, int instructionPtr) { DynValue r = m_ValueStack.Pop().ToScalar(); DynValue l = m_ValueStack.Pop().ToScalar(); if (object.ReferenceEquals(r, l)) { m_ValueStack.Push(DynValue.True); } else if (r.Type != l.Type) { if ((l.Type == DataType.Nil && r.Type == DataType.Void) || (l.Type == DataType.Void && r.Type == DataType.Nil)) { m_ValueStack.Push(DynValue.True); } else { m_ValueStack.Push(DynValue.False); } } else if ((l.Type == DataType.Table || l.Type == DataType.UserData) && (GetMetatable(l) != null) && (GetMetatable(l) == GetMetatable(r))) { int ip = Internal_InvokeBinaryMetaMethod(l, r, "__eq", instructionPtr); if (ip < 0) { m_ValueStack.Push(DynValue.NewBoolean(r.Equals(l))); } else { return(ip); } } else { m_ValueStack.Push(DynValue.NewBoolean(r.Equals(l))); } return(instructionPtr); }
private bool EvalComparison(DynValue l, DynValue r, Operator op) { switch (op) { case Operator.Less: if (l.Type == DataType.Number && r.Type == DataType.Number) { return (l.Number < r.Number); } else if (l.Type == DataType.String && r.Type == DataType.String) { return (l.String.CompareTo(r.String) < 0); } else { throw new DynamicExpressionException("Attempt to compare non-numbers, non-strings."); } case Operator.LessOrEqual: if (l.Type == DataType.Number && r.Type == DataType.Number) { return (l.Number <= r.Number); } else if (l.Type == DataType.String && r.Type == DataType.String) { return (l.String.CompareTo(r.String) <= 0); } else { throw new DynamicExpressionException("Attempt to compare non-numbers, non-strings."); } case Operator.Equal: if (object.ReferenceEquals(r, l)) { return true; } else if (r.Type != l.Type) { if ((l.Type == DataType.Nil && r.Type == DataType.Void) || (l.Type == DataType.Void && r.Type == DataType.Nil)) return true; else return false; } else { return r.Equals(l); } case Operator.Greater: return !EvalComparison(l, r, Operator.LessOrEqual); case Operator.GreaterOrEqual: return !EvalComparison(l, r, Operator.Less); case Operator.NotEqual: return !EvalComparison(l, r, Operator.Equal); default: throw new DynamicExpressionException("Unsupported operator {0}", op); } }
private bool EvalComparison(DynValue l, DynValue r, Operator op) { switch (op) { case Operator.Less: if (l.Type == DataType.Number && r.Type == DataType.Number) { return(l.Number < r.Number); } else if (l.Type == DataType.String && r.Type == DataType.String) { return(l.String.CompareTo(r.String) < 0); } else { throw new DynamicExpressionException("Attempt to compare non-numbers, non-strings."); } case Operator.LessOrEqual: if (l.Type == DataType.Number && r.Type == DataType.Number) { return(l.Number <= r.Number); } else if (l.Type == DataType.String && r.Type == DataType.String) { return(l.String.CompareTo(r.String) <= 0); } else { throw new DynamicExpressionException("Attempt to compare non-numbers, non-strings."); } case Operator.Equal: if (object.ReferenceEquals(r, l)) { return(true); } else if (r.Type != l.Type) { if ((l.Type == DataType.Nil && r.Type == DataType.Void) || (l.Type == DataType.Void && r.Type == DataType.Nil)) { return(true); } else { return(false); } } else { return(r.Equals(l)); } case Operator.Greater: return(!EvalComparison(l, r, Operator.LessOrEqual)); case Operator.GreaterOrEqual: return(!EvalComparison(l, r, Operator.Less)); case Operator.NotEqual: return(!EvalComparison(l, r, Operator.Equal)); default: throw new DynamicExpressionException("Unsupported operator {0}", op); } }