KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > soot > javaToJimple > StrictFPPropagator


1 /* Soot - a J*va Optimization Framework
2  * Copyright (C) 2004 Jennifer Lhotak
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */

19
20 package soot.javaToJimple;
21 import java.util.*;
22
23 public class StrictFPPropagator extends polyglot.visit.NodeVisitor {
24
25     boolean strict = false;
26     public StrictFPPropagator(boolean val){
27         strict = val;
28     }
29
30     public polyglot.visit.NodeVisitor enter(polyglot.ast.Node parent, polyglot.ast.Node n){
31         if (n instanceof polyglot.ast.ClassDecl){
32             if (((polyglot.ast.ClassDecl)n).flags().isStrictFP()){
33                 return new StrictFPPropagator(true);
34             }
35         }
36         if (n instanceof polyglot.ast.LocalClassDecl){
37             if (((polyglot.ast.LocalClassDecl)n).decl().flags().isStrictFP()){
38                 return new StrictFPPropagator(true);
39             }
40         }
41         if (n instanceof polyglot.ast.MethodDecl){
42             if (((polyglot.ast.MethodDecl)n).flags().isStrictFP()){
43                 return new StrictFPPropagator(true);
44             }
45         }
46         if (n instanceof polyglot.ast.ConstructorDecl){
47             if (((polyglot.ast.ConstructorDecl)n).flags().isStrictFP()){
48                 return new StrictFPPropagator(true);
49             }
50         }
51         return this;
52     }
53     
54     public polyglot.ast.Node leave(polyglot.ast.Node old, polyglot.ast.Node n, polyglot.visit.NodeVisitor nodeVisitor){
55     
56         if (n instanceof polyglot.ast.MethodDecl) {
57             polyglot.ast.MethodDecl decl = (polyglot.ast.MethodDecl)n;
58             if (strict && !decl.flags().isAbstract() && !decl.flags().isStrictFP()){
59                 // System.out.println("changing method decl "+decl);
60
decl = decl.flags(decl.flags().StrictFP());
61                 //System.out.println("changed decl: "+decl);
62
return decl;
63             }
64         }
65         if (n instanceof polyglot.ast.ConstructorDecl) {
66             polyglot.ast.ConstructorDecl decl = (polyglot.ast.ConstructorDecl)n;
67             if (strict && !decl.flags().isAbstract() && !decl.flags().isStrictFP()){
68                 return decl.flags(decl.flags().StrictFP());
69             }
70         }
71         if (n instanceof polyglot.ast.LocalClassDecl){
72             polyglot.ast.LocalClassDecl decl = (polyglot.ast.LocalClassDecl)n;
73             if (decl.decl().flags().isStrictFP()){
74                 return decl.decl().flags(decl.decl().flags().clearStrictFP());
75             }
76         }
77         if (n instanceof polyglot.ast.ClassDecl){
78             polyglot.ast.ClassDecl decl = (polyglot.ast.ClassDecl)n;
79             if (decl.flags().isStrictFP()){
80                 return decl.flags(decl.flags().clearStrictFP());
81             }
82         }
83         return n;
84     }
85
86 }
87
Popular Tags