private static Ast.Macro ForStepMacro() { var def = Macro.GetMacroDefinition(typeof(Macro <int, int, int, T, Macro <int, T, T>, T>)); var ind = Macro.GenUniqueVar(typeof(int), "ind"); var init = Ast.MPRef(def.Parameters[0]); var cond = Ast.Op("{0} != {1}", Ast.VRef(ind), Ast.MPRef(def.Parameters[1])); var incr = Ast.Op("{0} += {1}", Ast.VRef(ind), Ast.MPRef(def.Parameters[2])); var body = (def.Parameters[4] as Ast.MacroDefParam).Definition; return(Ast.Mac(def.Parameters, def.Result, Ast.Blk( Ast.Ass(Ast.VRef(def.Result), Ast.MPRef(def.Parameters[3])), Ast.For(ind, init, cond, incr, Ast.MCall(body, def.Result, Ast.VRef(ind), Ast.VRef(def.Result)))))); }
private void ReturnArrayOfVertices(Expression expr) { var nai = expr.Expect <NewArrayExpression> (ExpressionType.NewArrayInit); foreach (var subExpr in nai.Expressions) { var mie = subExpr.Expect <MemberInitExpression> (ExpressionType.MemberInit); foreach (MemberAssignment assign in mie.Bindings) { _currentScope.CodeOut(Ast.Ass( Ast.VRef(_globalVars [assign.Member.Name]), Expr(assign.Expression))); } _currentScope.CodeOut(Ast.CallS(Ast.Call("EmitVertex ()"))); } _currentScope.CodeOut(Ast.CallS(Ast.Call("EndPrimitive ()"))); }
protected override void OutputReturn(Expression expr) { var lie = expr.Expect <ListInitExpression> (ExpressionType.ListInit); var res = _function.Arguments.Last(); foreach (var init in lie.Initializers) { var assign = init.Arguments[0].Expect <MethodCallExpression> (ExpressionType.Call); var args = assign.Arguments; if (assign.Method.Name == "Buffer") { var buf = args[0].Expect <ParameterExpression> (ExpressionType.Parameter); var bufVar = _currentScope.FindLocalVar(buf.Name); _currentScope.CodeOut(Ast.Ass(Ast.ARef(bufVar, Expr(args[1])), Expr(args[2]))); } else { throw new ParseException("Invalid assign method."); } } }