예제 #1
0
        Expression GenImmediateCode(RHC rhc, ObjExpr objx, GenContext context)
        {
            ParameterExpression p1 = Expression.Parameter(CompiledType, "__x__");

            _thisParam = p1;

            List <Expression> exprs = new List <Expression>();

            if (CompiledType == typeof(RestFnImpl))
            {
                exprs.Add(Expression.Assign(p1,
                                            Expression.New(Compiler.Ctor_RestFnImpl_1, Expression.Constant(_variadicMethod.RequiredArity))));
            }
            else
            {
                exprs.Add(Expression.Assign(p1, Expression.New(p1.Type)));
            }

            for (ISeq s = RT.seq(Methods); s != null; s = s.next())
            {
                FnMethod         method    = (FnMethod)s.first();
                LambdaExpression lambda    = method.GenerateImmediateLambda(rhc, this, context);
                string           fieldName = IsVariadic && method.IsVariadic
                    ? "_fnDo" + method.RequiredArity
                    : "_fn" + method.NumParams;
                exprs.Add(Expression.Assign(Expression.Field(p1, fieldName), lambda));
            }

            exprs.Add(p1);

            Expression expr = Expression.Block(new ParameterExpression[] { p1 }, exprs);

            return(expr);
        }
예제 #2
0
파일: FnExpr.cs 프로젝트: ryrency/Misc
        private Expression GenerateImmediateLambda(GenContext context, Type baseClass)
        {
            //   ParameterExpression p1 = ThisParam ?? Expression.Parameter(baseClass, "____x");
            ParameterExpression p1 = Expression.Parameter(baseClass, "____x");

            _thisParam = p1;
            List <Expression> exprs = new List <Expression>();

            if (baseClass == typeof(RestFnImpl))
            {
                exprs.Add(Expression.Assign(p1,
                                            Expression.New(Compiler.Ctor_RestFnImpl_1, Expression.Constant(_variadicMethod.RequiredArity))));
            }
            else
            {
                exprs.Add(Expression.Assign(p1, Expression.New(p1.Type)));
            }

            GenContext newContext = CreateContext(context, null, baseClass);

            for (ISeq s = RT.seq(_methods); s != null; s = s.next())
            {
                FnMethod         method    = (FnMethod)s.first();
                LambdaExpression lambda    = method.GenerateImmediateLambda(newContext);
                string           fieldName = IsVariadic && method.IsVariadic
                    ? "_fnDo" + method.RequiredArity
                    : "_fn" + method.NumParams;
                exprs.Add(Expression.Assign(Expression.Field(p1, fieldName), lambda));
            }

            exprs.Add(p1);

            Expression expr = Expression.Block(new ParameterExpression[] { p1 }, exprs);

            return(expr);
        }