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