示例#1
0
        public Expression GenCode(RHC rhc, ObjExpr objx, GenContext context)
        {
            List <Expression> exprs = new List <Expression>();

            ParameterExpression parm = Expression.Parameter(typeof(Var), "v");

            Expression varExpr = objx.GenVar(context, _var);

            if (_isDynamic)
            {
                varExpr = Expression.Call(varExpr, Compiler.Method_Var_setDynamic0);
            }

            exprs.Add(Expression.Assign(parm, varExpr));

            if (_meta != null)
            {
                if (_initProvided || true) //IncludesExplicitMetadata((MapExpr)_meta))
                {
                    exprs.Add(Expression.Call(parm, Compiler.Method_Var_setMeta, Expression.Convert(_meta.GenCode(RHC.Expression, objx, context), typeof(IPersistentMap))));
                }
            }

            if (_initProvided)
            {
                // RETYPE: get rid of Box?
                // Java doesn't Box here, but we have to deal with unboxed bool values
                exprs.Add(Expression.Call(parm, Compiler.Method_Var_bindRoot, Compiler.MaybeBox(_init.GenCode(RHC.Expression, objx, context))));
            }

            exprs.Add(parm);

            return(Expression.Block(new ParameterExpression[] { parm }, exprs));
        }
示例#2
0
        public Expression GenAssign(RHC rhc, ObjExpr objx, GenContext context, Expr val)
        {
            // RETYPE: Get rid of Box?
            Expression varExpr = objx.GenVar(context, _var);
            Expression valExpr = val.GenCode(RHC.Expression, objx, context);

            return(Expression.Call(varExpr, Compiler.Method_Var_set, Compiler.MaybeBox(valExpr)));
        }
示例#3
0
        // TODO: remove duplicate code between GenProtoLight and GenProtoFull

        private Expression GenProtoLight(RHC rhc, ObjExpr objx, GenContext context, Expression fn)
        {
            Var  v = ((VarExpr)_fexpr).Var;
            Expr e = (Expr)_args.nth(0);

            ParameterExpression targetParam     = Expression.Parameter(typeof(Object), "target");
            ParameterExpression targetTypeParam = Expression.Parameter(typeof(Type), "targetType");
            ParameterExpression vpfnParam       = Expression.Parameter(typeof(AFunction), "vpfn");
            //ParameterExpression thisParam = objx.ThisParam;

            Expression targetParamAssign     = Expression.Assign(targetParam, Compiler.MaybeBox(e.GenCode(RHC.Expression, objx, context)));
            Expression targetTypeParamAssign =
                Expression.Assign(
                    targetTypeParam,
                    Expression.Call(null, Compiler.Method_Util_classOf, targetParam));

            Expression vpfnParamAssign =
                Expression.Assign(
                    vpfnParam,
                    Expression.Convert(Expression.Call(objx.GenVar(context, v), Compiler.Method_Var_getRawRoot), typeof(AFunction)));

            if (_protocolOn == null)
            {
                return(Expression.Block(
                           new ParameterExpression[] { targetParam, targetTypeParam, vpfnParam },
                           targetParamAssign,
                           targetTypeParamAssign,
                           vpfnParamAssign,
                           GenerateArgsAndCall(rhc, objx, context, vpfnParam, targetParam)));
            }
            else
            {
                Expression[] args = new Expression[_args.count() - 1];
                for (int i = 1; i < _args.count(); i++)
                {
                    Expression bare = ((Expr)_args.nth(i)).GenCode(RHC.Expression, objx, context);
                    args[i - 1] = Compiler.MaybeBox(bare);
                }

                return(Expression.Block(
                           new ParameterExpression[] { targetParam, targetTypeParam, vpfnParam },
                           targetParamAssign,
                           targetTypeParamAssign,
                           Expression.Condition(
                               Expression.Not(Expression.TypeIs(targetParam, _protocolOn)),
                               Expression.Block(
                                   vpfnParamAssign,
                                   GenerateArgsAndCall(rhc, objx, context, vpfnParam, targetParam)),
                               Compiler.MaybeBox(Expression.Call(Expression.Convert(targetParam, _protocolOn), _onMethod, args)))));
            }
        }
示例#4
0
        public Expression GenCode(RHC rhc, ObjExpr objx, GenContext context)
        {
            List<Expression> exprs = new List<Expression>();

            ParameterExpression parm = Expression.Parameter(typeof(Var), "v");

            Expression varExpr = objx.GenVar(context,_var);

            if (_isDynamic)
                varExpr = Expression.Call(varExpr, Compiler.Method_Var_setDynamic0);

            exprs.Add(Expression.Assign(parm, varExpr));

            if (_meta != null)
            {
                if (_initProvided || true) //IncludesExplicitMetadata((MapExpr)_meta))
                {
                    exprs.Add(Expression.Call(parm, Compiler.Method_Var_setMeta, Expression.Convert(_meta.GenCode(RHC.Expression, objx, context), typeof(IPersistentMap))));
                }
            }

            if (_initProvided )
                // RETYPE: get rid of Box?
                // Java doesn't Box here, but we have to deal with unboxed bool values
                exprs.Add(Expression.Call(parm, Compiler.Method_Var_bindRoot, Compiler.MaybeBox(_init.GenCode(RHC.Expression,objx,context))));

            exprs.Add(parm);

            return Expression.Block(new ParameterExpression[] { parm }, exprs);
        }
示例#5
0
 public Expression GenCode(RHC rhc, ObjExpr objx, GenContext context)
 {
     return objx.GenVar(context,_var);
 }
示例#6
0
        public Expression GenCode(RHC rhc, ObjExpr objx, GenContext context)
        {
            List<Expression> exprs = new List<Expression>();

            ParameterExpression parm = Expression.Parameter(typeof(Var), "v");

            Expression varExpr = objx.GenVar(context,_var);

            exprs.Add(Expression.Assign(parm, varExpr));

            // The Java code does the following in the opposite order (as modified in commit #430dd4f, Jan 19, 2010)
            // However, the call to bindRoot sets :macro to False.  I'm not sure how it works now in the JVM version.

            if (_initProvided )
                // Java doesn't Box here, but we have to deal with unboxed bool values
                exprs.Add(Expression.Call(parm, Compiler.Method_Var_bindRoot, Compiler.MaybeBox(_init.GenCode(RHC.Expression,objx,context))));

            if (_meta != null)
            {
                if (_initProvided || IncludesExplicitMetadata((MapExpr)_meta))
                {
                    // Java casts to IPersistentMap on the _meta, but Expression.Call can handle that for us.
                    exprs.Add(Expression.Call(parm, Compiler.Method_Var_setMeta, _meta.GenCode(RHC.Expression,objx,context)));
                }
            }

            exprs.Add(parm);

            return Expression.Block(new ParameterExpression[] { parm }, exprs);
        }
示例#7
0
        // TODO: remove duplicate code between GenProtoLight and GenProtoFull
        private Expression GenProtoLight(RHC rhc, ObjExpr objx, GenContext context, Expression fn)
        {
            Var v = ((VarExpr)_fexpr).Var;
            Expr e = (Expr)_args.nth(0);

            ParameterExpression targetParam = Expression.Parameter(typeof(Object), "target");
            ParameterExpression targetTypeParam = Expression.Parameter(typeof(Type), "targetType");
            ParameterExpression vpfnParam = Expression.Parameter(typeof(AFunction), "vpfn");
            ParameterExpression thisParam = objx.ThisParam;

            Expression targetParamAssign = Expression.Assign(targetParam, Compiler.MaybeBox(e.GenCode(RHC.Expression,objx,context)));
            Expression targetTypeParamAssign =
                Expression.Assign(
                    targetTypeParam,
                    Expression.Call(null, Compiler.Method_Util_classOf, targetParam));

            Expression vpfnParamAssign =
                Expression.Assign(
                    vpfnParam,
                    Expression.Convert(Expression.Call(objx.GenVar(context, v), Compiler.Method_Var_getRawRoot), typeof(AFunction)));

            if (_protocolOn == null)
            {
                return Expression.Block(
                    new ParameterExpression[] { targetParam, targetTypeParam, vpfnParam },
                    targetParamAssign,
                    targetTypeParamAssign,
                    vpfnParamAssign,
                    GenerateArgsAndCall(rhc, objx, context, vpfnParam, targetParam));
            }
            else
            {
                Expression[] args = new Expression[_args.count() - 1];
                for (int i = 1; i < _args.count(); i++)
                {
                    Expression bare = ((Expr)_args.nth(i)).GenCode(RHC.Expression,objx,context);
                    args[i - 1] = Compiler.MaybeBox(bare);
                }

                return Expression.Block(
                     new ParameterExpression[] { targetParam, targetTypeParam, vpfnParam },
                     targetParamAssign,
                     targetTypeParamAssign,
                     Expression.Condition(
                        Expression.Not(Expression.TypeIs(targetParam, _protocolOn)),
                        Expression.Block(
                            vpfnParamAssign,
                            GenerateArgsAndCall(rhc, objx, context, vpfnParam, targetParam)),
                         Compiler.MaybeBox(Expression.Call(Expression.Convert(targetParam, _protocolOn), _onMethod, args))));
            }
        }
示例#8
0
 public Expression GenCode(RHC rhc, ObjExpr objx, GenContext context)
 {
     Expression varExpr = objx.GenVar(context,_var);
     return Expression.Call(varExpr, Compiler.Method_Var_get);
 }
示例#9
0
 public Expression GenAssign(RHC rhc, ObjExpr objx, GenContext context, Expr val)
 {
     Expression varExpr = objx.GenVar(context, _var);
     Expression valExpr = val.GenCode(RHC.Expression,objx,context);
     return Expression.Call(varExpr, Compiler.Method_Var_set, Compiler.MaybeBox(valExpr));
 }
示例#10
0
 public Expression GenCode(RHC rhc, ObjExpr objx, GenContext context)
 {
     return(objx.GenVar(context, _var));
 }