# HG changeset patch # User Christian Humer # Date 1423823833 -3600 # Node ID ef292a5bb79ddf0bbd8b3f1c9909eca7d9cd84f8 # Parent 91dea7a100d28576bbb9d7631c71076ce6195ad8 Truffle-DSL: fix findbugs comparison warnings. diff -r 91dea7a100d2 -r ef292a5bb79d graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/expression/DSLExpression.java --- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/expression/DSLExpression.java Fri Feb 13 11:37:13 2015 +0100 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/expression/DSLExpression.java Fri Feb 13 11:37:13 2015 +0100 @@ -23,6 +23,7 @@ package com.oracle.truffle.dsl.processor.expression; import java.util.*; +import java.util.concurrent.atomic.*; import javax.lang.model.element.*; import javax.lang.model.type.*; @@ -68,6 +69,19 @@ return variables; } + public boolean containsComparisons() { + final AtomicBoolean found = new AtomicBoolean(); + this.accept(new AbstractDSLExpressionVisitor() { + @Override + public void visitBinary(Binary binary) { + if (binary.isComparison()) { + found.set(true); + } + } + }); + return found.get(); + } + public void setResolvedTargetType(TypeMirror resolvedTargetType) { this.resolvedTargetType = resolvedTargetType; } @@ -131,6 +145,10 @@ this.right = right; } + public boolean isComparison() { + return DSLExpressionResolver.COMPARABLE_OPERATORS.contains(operator) || DSLExpressionResolver.IDENTITY_OPERATORS.contains(operator); + } + @Override public boolean equals(Object obj) { if (obj instanceof Binary) { diff -r 91dea7a100d2 -r ef292a5bb79d graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/expression/DSLExpressionResolver.java --- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/expression/DSLExpressionResolver.java Fri Feb 13 11:37:13 2015 +0100 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/expression/DSLExpressionResolver.java Fri Feb 13 11:37:13 2015 +0100 @@ -41,8 +41,8 @@ public class DSLExpressionResolver implements DSLExpressionVisitor { private static final List LOGIC_OPERATORS = Arrays.asList("||"); - private static final List COMPARABLE_OPERATORS = Arrays.asList("<", "<=", ">", ">="); - private static final List IDENTITY_OPERATORS = Arrays.asList("==", "!="); + public static final List COMPARABLE_OPERATORS = Arrays.asList("<", "<=", ">", ">="); + public static final List IDENTITY_OPERATORS = Arrays.asList("==", "!="); private static final String CONSTRUCTOR_KEYWORD = "new"; private final List variables = new ArrayList<>(); diff -r 91dea7a100d2 -r ef292a5bb79d graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java --- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java Fri Feb 13 11:37:13 2015 +0100 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java Fri Feb 13 11:37:13 2015 +0100 @@ -213,6 +213,8 @@ } clazz.add(createGetCostMethod()); + avoidFindbugsProblems(clazz); + if (singleSpecializable) { if (node.needsRewrites(context)) { clazz.add(createUnsupportedMethod()); @@ -236,6 +238,28 @@ return clazz; } + private void avoidFindbugsProblems(CodeTypeElement clazz) { + TypeElement type = context.getEnvironment().getElementUtils().getTypeElement("edu.umd.cs.findbugs.annotations.SuppressFBWarnings"); + if (type == null) { + return; + } + boolean foundComparison = false; + outer: for (SpecializationData specialization : node.getSpecializations()) { + for (GuardExpression guard : specialization.getGuards()) { + if (guard.getExpression().containsComparisons()) { + foundComparison = true; + break outer; + } + } + } + + if (foundComparison) { + CodeAnnotationMirror annotation = new CodeAnnotationMirror((DeclaredType) type.asType()); + annotation.setElementValue(annotation.findExecutableElement("value"), new CodeAnnotationValue("SA_LOCAL_SELF_COMPARISON")); + clazz.addAnnotationMirror(annotation); + } + } + private Element createUnsupportedMethod() { LocalContext locals = LocalContext.load(this); CodeExecutableElement method = locals.createMethod(modifiers(PROTECTED), getType(UnsupportedSpecializationException.class), "unsupported");