@Override public Void visitFor(ByteCodeNode parent, ForLoop forLoop) { if (forLoop.getComment() != null) { printLine(); printLine("// %s", forLoop.getComment()); } printLine("for {"); indentLevel++; visitNestedNode("initialize", forLoop.initialize(), forLoop); visitNestedNode("condition", forLoop.condition(), forLoop); visitNestedNode("update", forLoop.update(), forLoop); visitNestedNode("body", forLoop.body(), forLoop); indentLevel--; printLine("}"); return null; }
private void generateFilterAndProjectCursorMethod( ClassDefinition classDefinition, List<RowExpression> projections) { MethodDefinition filterAndProjectMethod = classDefinition.declareMethod( new CompilerContext(BOOTSTRAP_METHOD), a(PUBLIC), "filterAndProjectRowOriented", type(int.class), arg("cursor", RecordCursor.class), arg("pageBuilder", PageBuilder.class)); CompilerContext compilerContext = filterAndProjectMethod.getCompilerContext(); LocalVariableDefinition completedPositionsVariable = compilerContext.declareVariable(int.class, "completedPositions"); filterAndProjectMethod .getBody() .comment("int completedPositions = 0;") .putVariable(completedPositionsVariable, 0); // // for loop loop body // LabelNode done = new LabelNode("done"); ForLoopBuilder forLoop = ForLoop.forLoopBuilder(compilerContext) .initialize(NOP) .condition( new Block(compilerContext) .comment("completedPositions < 16384") .getVariable(completedPositionsVariable) .push(16384) .invokeStatic( CompilerOperations.class, "lessThan", boolean.class, int.class, int.class)) .update( new Block(compilerContext) .comment("completedPositions++") .incrementVariable(completedPositionsVariable, (byte) 1)); Block forLoopBody = new Block(compilerContext); forLoop.body(forLoopBody); forLoopBody .comment("if (pageBuilder.isFull()) break;") .append( new Block(compilerContext) .getVariable("pageBuilder") .invokeVirtual(PageBuilder.class, "isFull", boolean.class) .ifTrueGoto(done)); forLoopBody .comment("if (!cursor.advanceNextPosition()) break;") .append( new Block(compilerContext) .getVariable("cursor") .invokeInterface(RecordCursor.class, "advanceNextPosition", boolean.class) .ifFalseGoto(done)); // if (filter(cursor)) IfStatementBuilder ifStatement = new IfStatementBuilder(compilerContext); ifStatement.condition( new Block(compilerContext) .pushThis() .getVariable("cursor") .invokeVirtual( classDefinition.getType(), "filter", type(boolean.class), type(RecordCursor.class))); Block trueBlock = new Block(compilerContext); ifStatement.ifTrue(trueBlock); if (projections.isEmpty()) { // pageBuilder.declarePosition(); trueBlock .getVariable("pageBuilder") .invokeVirtual(PageBuilder.class, "declarePosition", void.class); } else { // project_43(block..., pageBuilder.getBlockBuilder(42))); for (int projectionIndex = 0; projectionIndex < projections.size(); projectionIndex++) { trueBlock.pushThis(); trueBlock.getVariable("cursor"); // pageBuilder.getBlockBuilder(0) trueBlock .getVariable("pageBuilder") .push(projectionIndex) .invokeVirtual(PageBuilder.class, "getBlockBuilder", BlockBuilder.class, int.class); // project(block..., blockBuilder) trueBlock.invokeVirtual( classDefinition.getType(), "project_" + projectionIndex, type(void.class), type(RecordCursor.class), type(BlockBuilder.class)); } } forLoopBody.append(ifStatement.build()); filterAndProjectMethod .getBody() .append(forLoop.build()) .visitLabel(done) .comment("return completedPositions;") .getVariable("completedPositions") .retInt(); }