Пример #1
0
        protected override Expression BuildAfterExpression(ExpressionBuilderArgs args, ParameterExpression innerResultVar)
        {
            var expressions = new List <Expression>();

            expressions.Add(base.BuildAfterExpression(args, innerResultVar));
            if (_convertValue != null)
            {
                expressions.Add(Expression.Assign(innerResultVar, Invoke(_convertValue, args, innerResultVar)));
            }
            if (_assertValue != null)
            {
                expressions.Add(Expression.IfThen(
                                    Expression.Not(Invoke(_assertValue, args, innerResultVar)),
                                    Expression.Throw(Expression.New(
                                                         typeof(BinaryReadingAssertException).GetConstructor(new[] { typeof(Object), typeof(Object), typeof(String) }),
                                                         Expression.TypeAs(args.InstanceVar, typeof(Object)),
                                                         Expression.TypeAs(innerResultVar, typeof(Object)),
                                                         Expression.Constant(MemberName)))));
            }
            if (_positionAfter != null)
            {
                expressions.Add(Expression.Assign(AdvancedExpression.Position(args.BrParameter), Invoke(_positionAfter, args, innerResultVar)));
            }
            return(Expression.Block(expressions));
        }
Пример #2
0
        private Expression <ReadDelegate <T> > GetLambdaExpression <T>()
        {
            var brParameter = Expression.Parameter(typeof(BitsReader), "br");

            Dictionary <Type, Expression <ReadFunc> > typeReaders = Types.ToDictionary(pair => pair.Key, pair =>
            {
                var args         = new ExpressionBuilderArgs();
                args.BrParameter = brParameter;
                args.InstanceVar = Expression.Parameter(typeof(Object));
                args.TypeReaders = Expression.Parameter(typeof(Dictionary <Type, Expression <ReadFunc> >));
                args.Endianness  = Expression.Constant(_endianness);
                var expression   = pair.Value.BuildExpression(args);
                return(Expression.Lambda <ReadFunc>(expression, string.Format("Read_{0}", pair.Key.Name),
                                                    new[] { args.BrParameter, args.InstanceVar, args.TypeReaders }));
            });

            var resultVar         = Expression.Variable(typeof(T), "root");
            var brCheckExpression = Expression.IfThen(Expression.Equal(brParameter, Expression.Constant(null)),
                                                      Expression.Throw(Expression.New(typeof(ArgumentNullException).GetConstructor(new[] { typeof(String) }), Expression.Constant(brParameter.Name, typeof(String)))));
            var ctorExpression     = Expression.Assign(resultVar, Expression.New(typeof(T)));
            var typeReadersVar     = Expression.Variable(typeof(Dictionary <Type, Expression <ReadFunc> >));
            var typeReadExpression = Expression.Block(new[] { resultVar, typeReadersVar },
                                                      brCheckExpression,
                                                      CreateTypeReaders(typeReadersVar, typeReaders),
                                                      ctorExpression,
                                                      Expression.Invoke(AdvancedExpression.GetTypeBuilder(typeReadersVar, Expression.Constant(typeof(T))),
                                                                        brParameter, resultVar, typeReadersVar),
                                                      resultVar);

            return(Expression.Lambda <ReadDelegate <T> >(typeReadExpression, string.Format("Read_Root", typeof(T).Name), new[] { brParameter }));
        }
Пример #3
0
 protected override Expression BuildBodyExpression(ExpressionBuilderArgs args, ParameterExpression innerResultVar, ParameterExpression typeVar)
 {
     if (_size == null)
     {
         throw new InvalidMappingException("Size of skipped member must be set.");
     }
     return(Expression.AddAssign(AdvancedExpression.Position(args.BrParameter), Expression.Convert(Invoke(_size, args), typeof(BinaryOffset))));
 }
Пример #4
0
 protected override Expression BuildCtorExpression(ExpressionBuilderArgs args)
 {
     if (_factory != null)
     {
         return(Expression.Convert(Expression.Invoke(_factory, AdvancedExpression.Context <T>(args.BrParameter, args.InstanceVar)), MemberType));
     }
     else
     {
         return(Expression.New(MemberType));
     }
 }
Пример #5
0
        protected override Expression BuildBeforeExpression(ExpressionBuilderArgs args)
        {
            var expressions = new List <Expression>();

            if (_position != null)
            {
                expressions.Add(Expression.Assign(AdvancedExpression.Position(args.BrParameter), Invoke(_position, args)));
            }
            expressions.Add(base.BuildBeforeExpression(args));
            return(Expression.Block(expressions));
        }
Пример #6
0
        protected override Expression BuildCtorExpression(ExpressionBuilderArgs args)
        {
            var elementType = MemberType.GetElementType();
            var lengthVar   = Expression.Variable(typeof(UInt64), "length");
            var ctorExp     = Expression.NewArrayBounds(
                elementType,
                lengthVar);

            return(Expression.Block(new [] { lengthVar },
                                    Expression.Assign(lengthVar, Invoke(_length, args)),
                                    AdvancedExpression.Debug(string.Format("Array {0} initialized. ({{0}} elements).", MemberName), lengthVar),
                                    ctorExp));
        }
        protected override Expression BuildBodyExpression(ExpressionBuilderArgs args, ParameterExpression innerResultVar, ParameterExpression typeVar)
        {
            var elementType = typeof(TElement);
            //IExpressionBuilder typeBuilder = FileFormatBuilder.Types[elementType];
            var iVar           = Expression.Variable(typeof(int), "i");
            var elementVar     = Expression.Variable(elementType, "iterator");
            var loopEndLabel   = Expression.Label();
            var elementBuilder = MemberBuilder <TMember, TElement> .Create("[i]");

            if (_elementBuilderConfiguration != null)
            {
                _elementBuilderConfiguration(elementBuilder);
            }
            var innerArgs = args.Clone();

            innerArgs.InstanceVar = innerResultVar;
            return(Expression.Block(
                       new[] { iVar, elementVar },
                       Expression.Assign(iVar, Expression.Constant(0)),
                       AdvancedExpression.Debug("Reading collection {0}...", Expression.Constant(MemberName)),
                       Expression.Loop(
                           Expression.IfThenElse(
                               GetLoopCondition(args, innerResultVar, iVar, elementVar),
                               Expression.Block(
                                   AdvancedExpression.Debug("Reading {0}[{1}]...", Expression.Constant(MemberName), iVar),
                                   Expression.Assign(elementVar, elementBuilder.BuildExpression(innerArgs)),

/*
 *                          Expression.Assign(elementVar, elementCtor),
 *                          typeBuilder.BuildExpression(brParameter, elementVar, typeReaders),
 */
                                   InsertElement(args, innerResultVar, iVar, elementVar),
                                   Expression.PostIncrementAssign(iVar)),
                               Expression.Break(loopEndLabel)),
                           loopEndLabel)));
        }
Пример #8
0
 protected Expression Invoke <TResult>(Expression <Func <IMemberContext <T, TMember>, TResult> > expression, ExpressionBuilderArgs args, ParameterExpression innerResultVar)
 {
     return(Expression.Invoke(expression, AdvancedExpression.MemberContext <T, TMember>(args.BrParameter, args.InstanceVar, innerResultVar)));
 }
Пример #9
0
 protected override Expression BuildBodyExpression(ExpressionBuilderArgs args, ParameterExpression innerResultVar, ParameterExpression typeVar)
 {
     return(Expression.Block(AdvancedExpression.Debug("Type: {0}", typeVar),
                             Expression.Invoke(AdvancedExpression.GetTypeBuilder(args.TypeReaders, typeVar),
                                               args.BrParameter, innerResultVar, args.TypeReaders)));
 }