Mercurial > hg > graal-compiler
changeset 19348:ef292a5bb79d
Truffle-DSL: fix findbugs comparison warnings.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Fri, 13 Feb 2015 11:37:13 +0100 |
parents | 91dea7a100d2 |
children | dd7d436a7e19 |
files | graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/expression/DSLExpression.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/expression/DSLExpressionResolver.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java |
diffstat | 3 files changed, 44 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- 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) {
--- 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<String> LOGIC_OPERATORS = Arrays.asList("||"); - private static final List<String> COMPARABLE_OPERATORS = Arrays.asList("<", "<=", ">", ">="); - private static final List<String> IDENTITY_OPERATORS = Arrays.asList("==", "!="); + public static final List<String> COMPARABLE_OPERATORS = Arrays.asList("<", "<=", ">", ">="); + public static final List<String> IDENTITY_OPERATORS = Arrays.asList("==", "!="); private static final String CONSTRUCTOR_KEYWORD = "new"; private final List<VariableElement> variables = new ArrayList<>();
--- 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");