Ejemplo n.º 1
0
        protected override object DoEvaluate(CodeContext context)
        {
            if (NodeType == AstNodeType.AndAlso)
            {
                object ret = _left.Evaluate(context);
                return(((bool)ret) ? _right.Evaluate(context) : ret);
            }
            else if (NodeType == AstNodeType.OrElse)
            {
                object ret = _left.Evaluate(context);
                return(((bool)ret) ? ret : _right.Evaluate(context));
            }

            object l = _left.Evaluate(context);
            object r = _right.Evaluate(context);

            switch (NodeType)
            {
            case AstNodeType.GreaterThan:
                return(RuntimeHelpers.BooleanToObject(((IComparable)l).CompareTo(r) > 0));

            case AstNodeType.LessThan:
                return(RuntimeHelpers.BooleanToObject(((IComparable)l).CompareTo(r) < 0));

            case AstNodeType.GreaterThanOrEqual:
                return(RuntimeHelpers.BooleanToObject(((IComparable)l).CompareTo(r) >= 0));

            case AstNodeType.LessThanOrEqual:
                return(RuntimeHelpers.BooleanToObject(((IComparable)l).CompareTo(r) <= 0));

            case AstNodeType.Equal:
                return(RuntimeHelpers.BooleanToObject(TestEquals(l, r)));

            case AstNodeType.NotEqual:
                return(RuntimeHelpers.BooleanToObject(!TestEquals(l, r)));

            case AstNodeType.MultiplyChecked:
            case AstNodeType.Multiply: return(EvalMultiply(l, r));

            case AstNodeType.AddChecked:
            case AstNodeType.Add: return(EvalAdd(l, r));

            case AstNodeType.SubtractChecked:
            case AstNodeType.Subtract: return(EvalSub(l, r));

            case AstNodeType.Divide: return(EvalDiv(l, r));

            case AstNodeType.Modulo: return(EvalMod(l, r));

            case AstNodeType.And: return(EvalAnd(l, r));

            case AstNodeType.Or: return(EvalOr(l, r));

            case AstNodeType.ExclusiveOr: return(EvalXor(l, r));

            default:
                throw new NotImplementedException(NodeType.ToString());
            }
        }
Ejemplo n.º 2
0
 protected static object ConvertToObject(object ret)
 {
     if (ret is bool)
     {
         return(RuntimeHelpers.BooleanToObject((bool)ret));
     }
     else if (ret is int)
     {
         return(RuntimeHelpers.Int32ToObject((int)ret));
     }
     return(ret);
 }
Ejemplo n.º 3
0
 static object Box <T>(T o)
 {
     if (typeof(T) == typeof(bool))
     {
         return(RuntimeHelpers.BooleanToObject((bool)(object)o));
     }
     if (typeof(T) == typeof(SymbolId))
     {
         var s = (SymbolId)(object)o;
         return(SymbolTable.Intern(s));
     }
     return(o);
 }
Ejemplo n.º 4
0
 protected override object DoEvaluate(CodeContext context)
 {
     return(RuntimeHelpers.BooleanToObject(
                _typeOperand.IsInstanceOfType(_expression.Evaluate(context))));
 }
Ejemplo n.º 5
0
 public static object StrictMode()
 {
     return(RuntimeHelpers.BooleanToObject(ScriptDomainManager.Options.StrictMode));
 }
Ejemplo n.º 6
0
 public static object CompressConstants()
 {
     return(RuntimeHelpers.BooleanToObject(compressConstants));
 }
Ejemplo n.º 7
0
        protected override object DoEvaluate(CodeContext context)
        {
            object instance = null;

            // Evaluate the instance first (if the method is non-static)
            if (!Method.IsStatic)
            {
                instance = EvaluateInstance(context);
            }

            object[]            parameters = new object[_parameterInfos.Length];
            EvaluationAddress[] paramAddrs = new EvaluationAddress[_parameterInfos.Length];
            if (_parameterInfos.Length > 0)
            {
                int last = parameters.Length;
                for (int i = 0; i < last; i++)
                {
                    ParameterInfo pi = _parameterInfos[i];

                    if (pi.ParameterType.IsByRef)
                    {
                        paramAddrs[i] = _arguments[i].EvaluateAddress(context);

                        object value = paramAddrs[i].GetValue(context, !IsInputParameter(i));
                        if (IsInputParameter(i))
                        {
                            parameters[i] = context.LanguageContext.Binder.Convert(
                                value,
                                _parameterInfos[i].ParameterType.GetElementType()
                                );
                        }
                    }
                    else if (IsInputParameter(i))
                    {
                        Expression arg = _arguments[i];
                        parameters[i] = arg != null?arg.Evaluate(context) : null;
                    }
                }
            }

            try {
                object res;
                try {
                    // Call the method
                    res = InvokeMethod(instance, parameters);

                    // Return the singleton True or False object
                    if (Type == typeof(Boolean))
                    {
                        res = RuntimeHelpers.BooleanToObject((bool)res);
                    }
                } finally {
                    // expose by-ref args
                    for (int i = 0; i < _parameterInfos.Length; i++)
                    {
                        if (_parameterInfos[i].ParameterType.IsByRef)
                        {
                            paramAddrs[i].AssignValue(context, parameters[i]);
                        }
                    }
                }

                // back propagate instance on value types if the instance supports it.
                if (_method.DeclaringType != null && _method.DeclaringType.IsValueType && !_method.IsStatic)
                {
                    _instance.EvaluateAssign(context, instance);
                }

                return(res);
            } catch (TargetInvocationException e) {
                // Unwrap the real (inner) exception and raise it
                throw ExceptionHelpers.UpdateForRethrow(e.InnerException);
            }
        }