Ejemplo n.º 1
0
 private IEnumerable <Expression> Convert(IEnumerable <LinqExp.Expression> linqExpressions)
 {
     return(linqExpressions.Project(arg =>
                                    (arg.NodeType == LinqExp.ExpressionType.Quote)
             ? Expression.Constant(((LinqExp.UnaryExpression)arg).Operand, arg.Type)
             : ConvertExp(arg)));
 }
Ejemplo n.º 2
0
 public override Expression asCLRSetValueExpression(Expression newValue)
 {
     return(Expression.Condition(
                isMutable,
                Expression.Assign(Expression.ArrayAccess(namedSlots, slotIndex), newValue),
                Expression.Block(
                    TypeGuru.objectType,
                    Expression.Throw(Expression.Constant(new ImmutableObjectException())),
                    newValue)));
 }
Ejemplo n.º 3
0
        public override Expression Bind(Object[] args, ReadOnlyCollection <ParameterExpression> parameters, LabelTarget returnLabel)
        {
            Expression testRuleValidityExpression = null;
            Expression getVariableValueExpression = null;

            doAllButFinalBinding(
                args,
                (BindingHandle handle) => {
                testRuleValidityExpression = Expression.Constant(true);
                var handleConstant         = Expression.Constant(handle);
                getVariableValueExpression = handle.IsDirect ?
                                             Expression.Field(handleConstant, TypeGuru.directBindingHandleType, "value") :
                                             Expression.Property(handleConstant, "Value");
            });
            return(Expression
                   .IfThen(
                       testRuleValidityExpression,
                       Expression.Return(returnLabel, getVariableValueExpression)));
        }
Ejemplo n.º 4
0
        public override Expression Bind(Object[] args, ReadOnlyCollection <ParameterExpression> parameters, LabelTarget returnLabel)
        {
            Expression          testRuleValidityExpression = null;
            Expression          setVariableValueExpression = null;
            ParameterExpression value = parameters[1];

            doAllButFinalBinding(
                args,
                (BindingHandle handle) => {
                testRuleValidityExpression = Expression.Constant(true);
                setVariableValueExpression =
                    Expression.Assign(
                        Expression.Property(Expression.Constant(handle), "Value"),
                        value);
            });

            return(Expression
                   .IfThen(
                       testRuleValidityExpression,
                       Expression.Return(returnLabel, setVariableValueExpression)));
        }
Ejemplo n.º 5
0
        public override DynamicMetaObject BindUnaryOperation(UnaryOperationBinder binder)
        {
            DynamicMetaObject messageSendMO;
            Expression        value;
            DynamicMetaObject arg;

            switch (binder.Operation)
            {
            case ExpressionType.Negate:
                if (createMetaObjectToSendMessage("negated", DynamicBindingGuru.emptyArgArray, out messageSendMO))
                {
                    return(messageSendMO);
                }
                break;

            case ExpressionType.UnaryPlus:
                if (createMetaObjectToSendMessage("abs", DynamicBindingGuru.emptyArgArray, out messageSendMO))
                {
                    return(messageSendMO);
                }
                break;

            case ExpressionType.Not:
                if (createMetaObjectToSendMessage("not", DynamicBindingGuru.emptyArgArray, out messageSendMO))
                {
                    return(messageSendMO);
                }
                break;

            case ExpressionType.Decrement:
                if (createMetaObjectToSendMessage("decrement", DynamicBindingGuru.emptyArgArray, out messageSendMO))
                {
                    return(messageSendMO);
                }
                break;

            case ExpressionType.Increment:
                if (createMetaObjectToSendMessage("increment", DynamicBindingGuru.emptyArgArray, out messageSendMO))
                {
                    return(messageSendMO);
                }
                break;

            case ExpressionType.OnesComplement:
                if (createMetaObjectToSendMessage("bitInvert", DynamicBindingGuru.emptyArgArray, out messageSendMO))
                {
                    return(messageSendMO);
                }
                break;

            case ExpressionType.IsTrue:
                value = Expression.Constant(true);
                arg   = value.asDynamicMetaObject(BindingRestrictions.Empty, true);
                if (createMetaObjectToSendMessage("=", argArrayFor(arg), out messageSendMO))
                {
                    return(messageSendMO);
                }
                break;

            case ExpressionType.IsFalse:
                value = Expression.Constant(false);
                arg   = value.asDynamicMetaObject(BindingRestrictions.Empty, false);
                if (createMetaObjectToSendMessage("=", argArrayFor(arg), out messageSendMO))
                {
                    return(messageSendMO);
                }
                break;

            default:
            case ExpressionType.Extension:
                messageSendMO = null;
                break;
            }

            if (messageSendMO == null)
            {
                var esClass  = ValueClass;
                var kernel   = esClass.ObjectSpace;
                var selector = kernel.symbolFor("??");
                messageSendMO = metaObjectToSendDoesNotUnderstand(selector, DynamicBindingGuru.emptyArgArray);
            }
            return(binder.FallbackUnaryOperation(this, messageSendMO));
        }
Ejemplo n.º 6
0
        public override DynamicMetaObject BindDeleteMember(DeleteMemberBinder binder)
        {
            DynamicMetaObject messageSendMO;
            var kernel     = ValueClass.ObjectSpace;
            var memberName = kernel.symbolFor(binder.Name);

            if (createMetaObjectToSendMessage("removeKey:", DynamicBindingGuru.argArrayFor(Expression.Constant(memberName).asDynamicMetaObject(BindingRestrictions.Empty, memberName)), out messageSendMO))
            {
                return(messageSendMO);
            }
            return(binder.FallbackDeleteMember(this, messageSendMO));
        }
Ejemplo n.º 7
0
 public override Expression asCLRSetValueExpression(Expression newValue)
 {
     return(Expression.Throw(Expression.Constant("Method and block parameters are not assignable (" + NameString + ")"), typeof(ImmutableBindingException)));
 }
Ejemplo n.º 8
0
        public ConstantExpression messageSendCallSiteConstantFor(MessageReceiverKind receiverKind, BehavioralObject selfReceiverClass, ESSymbol messageSelector)
        {
            switch (receiverKind)
            {
            case MessageReceiverKind.General:
                logMessageSent(messageSelector);
                break;

            case MessageReceiverKind.Self:
                logMessageSentToSelf(messageSelector);
                break;

            case MessageReceiverKind.Super:
                logMessageSentToSuper(messageSelector);
                break;

            case MessageReceiverKind.ThisContext:
                logMessageSentToThisContext(messageSelector);
                break;
            }
            var binder = MessageSendBinderRegistry.canonicalBinderFor(receiverKind, selfReceiverClass, messageSelector);

            switch (messageSelector.NumArgs)
            {
            case 0:
                return(Expression.Constant(CallSite <Functor2 <Object, CallSite, Object> > .Create(binder)));

            case 1:
                return(Expression.Constant(CallSite <Functor3 <Object, CallSite, Object, Object> > .Create(binder)));

            case 2:
                return(Expression.Constant(CallSite <Functor4 <Object, CallSite, Object, Object, Object> > .Create(binder)));

            case 3:
                return(Expression.Constant(CallSite <Functor5 <Object, CallSite, Object, Object, Object, Object> > .Create(binder)));

            case 4:
                return(Expression.Constant(CallSite <Functor6 <Object, CallSite, Object, Object, Object, Object, Object> > .Create(binder)));

            case 5:
                return(Expression.Constant(CallSite <Functor7 <Object, CallSite, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 6:
                return(Expression.Constant(CallSite <Functor8 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 7:
                return(Expression.Constant(CallSite <Functor9 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 8:
                return(Expression.Constant(CallSite <Functor10 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 9:
                return(Expression.Constant(CallSite <Functor11 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 10:
                return(Expression.Constant(CallSite <Functor12 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 11:
                return(Expression.Constant(CallSite <Functor13 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 12:
                return(Expression.Constant(CallSite <Functor14 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 13:
                return(Expression.Constant(CallSite <Functor15 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 14:
                return(Expression.Constant(CallSite <Functor16 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 15:
                return(Expression.Constant(CallSite <Functor17 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 16:
                return(Expression.Constant(CallSite <Functor18 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 17:
                return(Expression.Constant(CallSite <Functor19 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 18:
                return(Expression.Constant(CallSite <Functor20 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 19:
                return(Expression.Constant(CallSite <Functor21 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 20:
                return(Expression.Constant(CallSite <Functor22 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 21:
                return(Expression.Constant(CallSite <Functor23 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 22:
                return(Expression.Constant(CallSite <Functor24 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 23:
                return(Expression.Constant(CallSite <Functor25 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 24:
                return(Expression.Constant(CallSite <Functor26 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 25:
                return(Expression.Constant(CallSite <Functor27 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 26:
                return(Expression.Constant(CallSite <Functor28 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 27:
                return(Expression.Constant(CallSite <Functor29 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 28:
                return(Expression.Constant(CallSite <Functor30 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 29:
                return(Expression.Constant(CallSite <Functor31 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 30:
                return(Expression.Constant(CallSite <Functor32 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 31:
                return(Expression.Constant(CallSite <Functor33 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            case 32:
                return(Expression.Constant(CallSite <Functor34 <Object, CallSite, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object> > .Create(binder)));

            default:
                return(null);
            }
        }
Ejemplo n.º 9
0
 public ConstantExpression setVariableValueCallSiteConstantFor(NamespaceObject environment, ESSymbol variableName)
 {
     return(Expression.Constant(CallSite <Functor3 <Object, CallSite, Object, Object> > .Create(canonicalSetVariableBinderFor(environment, variableName))));
 }
Ejemplo n.º 10
0
 public CodeGenerationContext(ESCompiler compiler)
 {
     identityExpression = Expression.Constant(identity);
     objectSpace        = compiler.ObjectSpace;
     bindToKernel();
 }
Ejemplo n.º 11
0
 private static Expression Convert(LinqExp.ConstantExpression linqConstant)
 => Expression.Constant(linqConstant.Value, linqConstant.Type);