@Override public void writeBlockStatement(BlockStatement statement) { StatementMeta meta = statement.getNodeMetaData(StatementMeta.class); FastPathData fastPathData = writeGuards(meta, statement); if (fastPathData==null) { // normal mode with different paths // important is to not to have a fastpathblock here, // otherwise the per expression statement improvement // is impossible super.writeBlockStatement(statement); } else { // fast/slow path generation boolean oldFastPathBlock = fastPathBlocked; fastPathBlocked = true; super.writeBlockStatement(statement); fastPathBlocked = oldFastPathBlock; writeFastPathPrelude(fastPathData); super.writeBlockStatement(statement); writeFastPathEpilogue(fastPathData); } }
/** * Injects a postcondition assertion statement in the given <tt>method</tt>, based on the <tt>booleanExpression</tt>. * * @param method the {@link org.codehaus.groovy.ast.MethodNode} for assertion injection * @param postcondition the {@link org.gcontracts.domain.Postcondition} the assertion statement should be generated from */ public void generatePostconditionAssertionStatement(MethodNode method, org.gcontracts.domain.Postcondition postcondition) { final BooleanExpression postconditionBooleanExpression = addCallsToSuperMethodNodeAnnotationClosure(method.getDeclaringClass(), method, Postcondition.class, postcondition.booleanExpression(), true); BlockStatement blockStatement; final BlockStatement originalBlockStatement = postcondition.originalBlockStatement(); // if use execution tracker flag is found in the meta-data the annotation closure visitor discovered // method calls which might be subject to cycling boolean expressions -> no inline mode possible final boolean useExecutionTracker = originalBlockStatement == null || Boolean.TRUE.equals(originalBlockStatement.getNodeMetaData(AnnotationClosureVisitor.META_DATA_USE_EXECUTION_TRACKER)); if (!useExecutionTracker && Boolean.TRUE.equals(method.getNodeMetaData(META_DATA_USE_INLINE_MODE))) { blockStatement = getInlineModeBlockStatement(originalBlockStatement); } else { blockStatement = wrapAssertionBooleanExpression(method.getDeclaringClass(), method, postconditionBooleanExpression, "postcondition"); } addPostcondition(method, blockStatement); }
/** * Injects a precondition assertion statement in the given <tt>method</tt>, based on the given <tt>annotation</tt> of * type {@link org.gcontracts.annotations.Requires}. * * @param method the {@link org.codehaus.groovy.ast.MethodNode} for assertion injection * @param precondition the {@link org.gcontracts.domain.Precondition} the assertion statement should be generated from */ public void generatePreconditionAssertionStatement(final MethodNode method, final org.gcontracts.domain.Precondition precondition) { final BooleanExpression preconditionBooleanExpression = addCallsToSuperMethodNodeAnnotationClosure(method.getDeclaringClass(), method, Precondition.class, precondition.booleanExpression(), false); BlockStatement blockStatement; final BlockStatement originalBlockStatement = precondition.originalBlockStatement(); // if use execution tracker flag is found in the meta-data the annotation closure visitor discovered // method calls which might be subject to cycling boolean expressions -> no inline mode possible final boolean useExecutionTracker = originalBlockStatement == null || Boolean.TRUE.equals(originalBlockStatement.getNodeMetaData(AnnotationClosureVisitor.META_DATA_USE_EXECUTION_TRACKER)); if (!useExecutionTracker && Boolean.TRUE.equals(method.getNodeMetaData(META_DATA_USE_INLINE_MODE))) { blockStatement = getInlineModeBlockStatement(precondition.originalBlockStatement()); } else { blockStatement = wrapAssertionBooleanExpression(method.getDeclaringClass(), method, preconditionBooleanExpression, "precondition"); } addPrecondition(method, blockStatement); }
@Override public void writeBlockStatement(BlockStatement statement) { StatementMeta meta = (StatementMeta) statement.getNodeMetaData(StatementMeta.class); FastPathData fastPathData = writeGuards(meta, statement); if (fastPathData==null) { // normal mode with different paths // important is to not to have a fastpathblock here, // otherwise the per expression statement improvement // is impossible super.writeBlockStatement(statement); } else { // fast/slow path generation boolean oldFastPathBlock = fastPathBlocked; fastPathBlocked = true; super.writeBlockStatement(statement); fastPathBlocked = oldFastPathBlock; writeFastPathPrelude(fastPathData); super.writeBlockStatement(statement); writeFastPathEpilogue(fastPathData); } }