Skip to content
This repository has been archived by the owner on Jan 7, 2020. It is now read-only.

Commit

Permalink
fixed [#28] - added try/catch with unlock in finally block
Browse files Browse the repository at this point in the history
  • Loading branch information
andresteingress committed May 19, 2011
1 parent 58826bf commit 37bab03
Showing 1 changed file with 7 additions and 8 deletions.
Expand Up @@ -24,10 +24,7 @@

import org.codehaus.groovy.ast.*;
import org.codehaus.groovy.ast.expr.*;
import org.codehaus.groovy.ast.stmt.BlockStatement;
import org.codehaus.groovy.ast.stmt.ExpressionStatement;
import org.codehaus.groovy.ast.stmt.IfStatement;
import org.codehaus.groovy.ast.stmt.TryCatchStatement;
import org.codehaus.groovy.ast.stmt.*;
import org.codehaus.groovy.control.io.ReaderSource;
import org.codehaus.groovy.syntax.Token;
import org.codehaus.groovy.syntax.Types;
Expand All @@ -36,6 +33,7 @@
import org.gcontracts.util.AnnotationUtils;

import java.lang.annotation.Annotation;
import java.util.Arrays;
import java.util.List;

/**
Expand Down Expand Up @@ -75,7 +73,7 @@ public static MethodNode getInvariantMethodNode(final ClassNode classNode) {
}

protected BlockStatement wrapAssertionBooleanExpression(ClassNode type, MethodNode methodNode, BooleanExpression classInvariantExpression) {
final BlockStatement assertBlockStatement = new BlockStatement();

final ClassNode violationTrackerClassNode = ClassHelper.makeWithoutCaching(ViolationTracker.class);

final String $_gc_proxy = "$_gc_proxy";
Expand All @@ -85,6 +83,9 @@ protected BlockStatement wrapAssertionBooleanExpression(ClassNode type, MethodNo
final VariableExpression proxyVariableExpression = new VariableExpression($_gc_proxy, ClassHelper.DYNAMIC_TYPE);
final FieldExpression lockFieldExpression = new FieldExpression(type.getField(LOCK_FIELD_NAME));

final BlockStatement assertBlockStatement = new BlockStatement();
final TryCatchStatement lockTryCatchStatement = new TryCatchStatement(assertBlockStatement, new BlockStatement(Arrays.<Statement>asList(new ExpressionStatement(new MethodCallExpression(lockFieldExpression, "unlock", ArgumentListExpression.EMPTY_ARGUMENTS))), new VariableScope()));

assertBlockStatement.addStatement(new ExpressionStatement(new MethodCallExpression(lockFieldExpression, "lock", ArgumentListExpression.EMPTY_ARGUMENTS)));

assertBlockStatement.addStatement(new ExpressionStatement(new DeclarationExpression($_gc_result, Token.newSymbol(Types.ASSIGN, -1, -1), ConstantExpression.FALSE)));
Expand Down Expand Up @@ -122,10 +123,8 @@ protected BlockStatement wrapAssertionBooleanExpression(ClassNode type, MethodNo
)
);

assertBlockStatement.addStatement(new ExpressionStatement(new MethodCallExpression(lockFieldExpression, "unlock", ArgumentListExpression.EMPTY_ARGUMENTS)));

final BlockStatement blockStatement = new BlockStatement();
blockStatement.addStatement(new IfStatement(new BooleanExpression(new VariableExpression(BaseVisitor.GCONTRACTS_ENABLED_VAR)), assertBlockStatement, new BlockStatement()));
blockStatement.addStatement(new IfStatement(new BooleanExpression(new VariableExpression(BaseVisitor.GCONTRACTS_ENABLED_VAR)), lockTryCatchStatement, new BlockStatement()));

return blockStatement;
}
Expand Down

0 comments on commit 37bab03

Please sign in to comment.