ClassDescriptor cd = (ClassDescriptor) obj;
toanalyze.remove(cd);
- if (!cd.isInterface()) {
+ if (!ssjava.isSSJavaUtil(cd) && !cd.isInterface()) {
for (Iterator method_it = cd.getMethods(); method_it.hasNext();) {
MethodDescriptor md = (MethodDescriptor) method_it.next();
checkTrustworthyMethodAnnotation(md);
for (Iterator iterator = annotatedMDSet.iterator(); iterator.hasNext();) {
MethodDescriptor md = (MethodDescriptor) iterator.next();
- ssjava.addAnnotationRequire(md);
+ if (!ssjava.isTrustMethod(md)) {
+ ssjava.addAnnotationRequire(md);
+ }
}
Set<Pair> visited = new HashSet<Pair>();
if (!visited.contains(p)) {
visited.add(p);
- if (!ssjava.isTrustMethod(calleeMD)) {
+ if (!ssjava.isTrustMethod(callerMD) && !ssjava.isTrustMethod(calleeMD)) {
// if method is annotated as "TRUST", do not need to check for
// linear type & flow-down rule
tovisit.add(calleeMD);
for (Iterator iterator2 = possibleCalleeSet.iterator(); iterator2.hasNext();) {
MethodDescriptor possibleCallee = (MethodDescriptor) iterator2.next();
- if (!possibleCallee.isAbstract()) {
+ if (!possibleCallee.isAbstract() && !possibleCallee.getModifiers().isNative()) {
ssjava.addAnnotationRequire(possibleCallee);
tovisit.add(possibleCallee);
}
private void checkBlockNode(MethodDescriptor md, SymbolTable nametable, BlockNode bn, boolean flag) {
bn.getVarTable().setParent(nametable);
- String label = bn.getLabel();
- boolean isSSJavaLoop = flag;
- if (label != null && label.equals(ssjava.SSJAVA)) {
- if (isSSJavaLoop) {
- throw new Error("Only outermost loop can be the self-stabilizing loop.");
- } else {
- annotatedMDSet.add(md);
- isSSJavaLoop = true;
- }
- }
for (int i = 0; i < bn.size(); i++) {
BlockStatementNode bsn = bn.get(i);
- checkBlockStatementNode(md, bn.getVarTable(), bsn, isSSJavaLoop);
+ checkBlockStatementNode(md, bn.getVarTable(), bsn, flag);
}
}
}
private void checkLoopNode(MethodDescriptor md, SymbolTable nametable, LoopNode ln, boolean flag) {
+
+ String label = ln.getLabel();
+ boolean isSSJavaLoop = flag;
+ if (label != null && label.equals(ssjava.SSJAVA)) {
+ if (isSSJavaLoop) {
+ throw new Error("Only outermost loop can be the self-stabilizing loop.");
+ } else {
+ ssjava.setMethodContainingSSJavaLoop(md);
+ annotatedMDSet.add(md);
+ isSSJavaLoop = true;
+ }
+ }
+
if (ln.getType() == LoopNode.WHILELOOP || ln.getType() == LoopNode.DOWHILELOOP) {
- checkExpressionNode(md, nametable, ln.getCondition(), flag);
- checkBlockNode(md, nametable, ln.getBody(), flag);
+ checkExpressionNode(md, nametable, ln.getCondition(), isSSJavaLoop);
+ checkBlockNode(md, nametable, ln.getBody(), isSSJavaLoop);
} else {
// For loop case
/* Link in the initializer naming environment */
bn.getVarTable().setParent(nametable);
for (int i = 0; i < bn.size(); i++) {
BlockStatementNode bsn = bn.get(i);
- checkBlockStatementNode(md, bn.getVarTable(), bsn, flag);
+ checkBlockStatementNode(md, bn.getVarTable(), bsn, isSSJavaLoop);
}
// check the condition
- checkExpressionNode(md, bn.getVarTable(), ln.getCondition(), flag);
- checkBlockNode(md, bn.getVarTable(), ln.getBody(), flag);
- checkBlockNode(md, bn.getVarTable(), ln.getUpdate(), flag);
+ checkExpressionNode(md, bn.getVarTable(), ln.getCondition(), isSSJavaLoop);
+ checkBlockNode(md, bn.getVarTable(), ln.getBody(), isSSJavaLoop);
+ checkBlockNode(md, bn.getVarTable(), ln.getUpdate(), isSSJavaLoop);
}
}