record which methods contain sdag syntax in symbol table
[charm.git] / src / langs / charj / src / charj / translator / MethodSymbol.java
1
2 package charj.translator;
3
4 import org.antlr.stringtemplate.StringTemplate;
5 import org.antlr.stringtemplate.language.AngleBracketTemplateLexer;
6
7 import java.util.LinkedHashMap;
8 import java.util.Map;
9
10 public class MethodSymbol
11     extends SymbolWithScope
12     implements Scope {
13     /** The enclosing class */
14     Scope enclosingScope;
15
16     /** The formal argument list scope */
17     LinkedHashMap<String, VariableSymbol> orderedArgs = new LinkedHashMap();
18
19     /** The list of local variables defined anywhere in the method */
20     LocalScope locals;
21
22     public boolean isEntry = false;
23     public boolean isStatic = false;
24     public boolean isCtor = false;
25     public boolean isTraced = false;
26     public boolean hasSDAG = false;
27
28     public MethodSymbol(SymbolTable symtab) {
29         super(symtab);
30     }
31
32     public MethodSymbol(SymbolTable symtab, String name) {
33         super(symtab, name);
34     }
35
36     public MethodSymbol(
37             SymbolTable symtab,
38             String name,
39             Scope enclosingScope,
40             Type retType)
41     {
42         super(symtab, name);
43         this.enclosingScope = enclosingScope;
44         this.type = retType;
45     }
46
47     public VariableSymbol defineArg(
48             String name,
49             ClassSymbol type)
50     {
51         if ( orderedArgs.get(name)!=null ) {
52             return null;
53         }
54         VariableSymbol vs = new VariableSymbol(symtab,name,type);
55         define(name, vs);
56         return vs;
57     }
58
59     public Scope getEnclosingScope()
60     {
61         return enclosingScope;
62     }
63
64     public LocalScope getLocalScope()
65     {
66         return locals;
67     }
68
69     public void setLocalScope(LocalScope s)
70     {
71         locals = s;
72     }
73
74     public String getScopeName()
75     {
76         return name;
77     }
78
79     public Map createMembers()
80     {
81         if ( orderedArgs==null ) {
82             orderedArgs = new LinkedHashMap();
83         }
84         return orderedArgs;
85     }
86
87     public Map getMembers()
88     {
89         return orderedArgs;
90     }
91
92     public String signature()
93     {
94         return null;
95     }
96
97     public String getTraceID()
98     {
99         // Make sure we don't have any negative or overflow values
100         int id = Math.abs(hashCode()/2);
101         return String.valueOf(id);
102     }
103
104     public String getTraceInitializer()
105     {
106         StringTemplate st = new StringTemplate(
107                 "traceRegisterUserEvent(\"<name>\", <id>);",
108                 AngleBracketTemplateLexer.class);
109         st.setAttribute("name", enclosingScope.getScopeName() + "." + name);
110         st.setAttribute("id", getTraceID());
111         return st.toString();
112     }
113
114     public String toString()
115     {
116         StringTemplate st = new StringTemplate(
117                 "<if(entry)>entry <endif><if(parent)><parent>.<endif><name>(<args; separator=\",\">)" +
118                 "<if(locals)>{<locals; separator=\",\">}<endif>",
119                 AngleBracketTemplateLexer.class);
120         st.setAttribute("entry", isEntry);
121         st.setAttribute("parent", enclosingScope.getScopeName());
122         st.setAttribute("name", name);
123         st.setAttribute("args", orderedArgs);
124         st.setAttribute("locals", locals!=null?locals.getMembers():null);
125         return st.toString();
126     }
127
128     public int hashCode()
129     {
130         return name.hashCode() + orderedArgs.size() + enclosingScope.hashCode();
131     }
132
133     /** Two methods are equals() when they have the same name and
134      *  the same number of arguments in the same scope.
135      */
136     public boolean equals(Object object)
137     {
138         return name.equals(((MethodSymbol)object).name) &&
139             orderedArgs.size()==((MethodSymbol)object).orderedArgs.size() &&
140             enclosingScope == ((MethodSymbol)object).enclosingScope;
141     }
142
143     public String getMangledName()
144     {
145         String mangled = name;
146         boolean isCtor = name.equals(enclosingScope.getScopeName());
147         if ( SymbolTable.METHOD_NAMES_TO_MANGLE.contains(name) ||
148                 (isCtor && SymbolTable.TYPE_NAMES_TO_MANGLE.contains(name)) ) {
149             mangled = "cj" + mangled;
150         }
151         int numargs = getMembers().size();
152         if ( numargs > 0 && !isCtor ) {
153             mangled += numargs;
154         }
155         return mangled;
156     }
157 }