public override bool Visit(RoutineCall node) { Visit((LvalueExpression)node); TraversePrint(node.func); TraversePrint(node.args); return(true); }
public override bool Visit(RoutineCall node) { //Visit((LvalueExpression) node); // string name = (node.func as Identifier).name; traverse(node.func); outputCode("(", false, false); int i = 0; foreach (Expression n in node.args) { if (i > 0) { outputCode(", ", false, false); } traverse(n); i++; } outputCode(")", false, false); if (node.func.Type is MethodType) { MethodType met = (node.func.Type as MethodType); if (met.IsDestructor) { outputCode(";", false, true); ObjectAccess oa = node.func as ObjectAccess; Identifier obj = oa.obj as Identifier; outputCode("delete " + obj.name, true, false); } } return(true); }
public virtual T Visit(RoutineCall node) { Visit((LvalueExpression)node); T t = traverse(node.func); traverse(node.args); return(t); }
private RoutineCall ParseCall() { var id = ParseIdentifier(false); if (id == null) { return(null); } var node = new RoutineCall(); node.AddChild(id); var t = NextToken(false); if (t.IsDelimiter(Delimiter.Dot)) { _stream.Next(); id = ParseIdentifier(); node.AddChild(id); } else if (!t.IsDelimiter(Delimiter.ParenthesisOpen)) { _stream.Previous(); // undo identifier read return(null); } var args = ParseCallArgs(); node.AddChild(args); t = NextToken(); AssertDelimiter(Delimiter.Semicolon, t); return(node); }
public override Value Visit(RoutineCall node) { Function func = (Function)traverse(node.func); Debug.Assert(func != null); int i = 0; Value[] args = new Value[func.ArgCount]; foreach (var arg in node.args) { args[i++] = traverse(arg); } Value funcretval = builder.BuildCall(func, args); if (func.ReturnType.TypeKind == LLVMTypeKind.VoidTypeKind) { // procedure return(Value.NonNull); } // Create temp alloca to hold address of value return(builder.BuildAlloca(func.ReturnType, "tmpcallret")); }
public Statement(RoutineCall routineCall) { RoutineCall = routineCall; }