c195b12dad46e22c16a025c18beac0229b12c2b1
[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
27     public MethodSymbol(SymbolTable symtab) {
28         super(symtab);
29     }
30
31     public MethodSymbol(SymbolTable symtab, String name) {
32         super(symtab, name);
33     }
34
35     public MethodSymbol(
36             SymbolTable symtab,
37             String name,
38             Scope enclosingScope,
39             Type retType)
40     {
41         super(symtab, name);
42         this.enclosingScope = enclosingScope;
43         this.type = retType;
44     }
45
46     public VariableSymbol defineArg(
47             String name,
48             ClassSymbol type)
49     {
50         if ( orderedArgs.get(name)!=null ) {
51             return null;
52         }
53         VariableSymbol vs = new VariableSymbol(symtab,name,type);
54         define(name, vs);
55         return vs;
56     }
57
58     public Scope getEnclosingScope()
59     {
60         return enclosingScope;
61     }
62
63     public LocalScope getLocalScope()
64     {
65         return locals;
66     }
67
68     public void setLocalScope(LocalScope s)
69     {
70         locals = s;
71     }
72
73     public String getScopeName()
74     {
75         return name;
76     }
77
78     public Map createMembers()
79     {
80         if ( orderedArgs==null ) {
81             orderedArgs = new LinkedHashMap();
82         }
83         return orderedArgs;
84     }
85
86     public Map getMembers()
87     {
88         return orderedArgs;
89     }
90
91     public String signature()
92     {
93         return null;
94     }
95
96     public String getTraceID()
97     {
98         // Make sure we don't have any negative or overflow values
99         int id = Math.abs(hashCode()/2);
100         return String.valueOf(id);
101     }
102
103     public String getTraceInitializer()
104     {
105         StringTemplate st = new StringTemplate(
106                 "traceRegisterUserEvent(\"<name>\", <id>);",
107                 AngleBracketTemplateLexer.class);
108         st.setAttribute("name", enclosingScope.getScopeName() + "." + name);
109         st.setAttribute("id", getTraceID());
110         return st.toString();
111     }
112
113     public String toString()
114     {
115         StringTemplate st = new StringTemplate(
116                 "<if(entry)>entry <endif><if(parent)><parent>.<endif><name>(<args; separator=\",\">)" +
117                 "<if(locals)>{<locals; separator=\",\">}<endif>",
118                 AngleBracketTemplateLexer.class);
119         st.setAttribute("entry", isEntry);
120         st.setAttribute("parent", enclosingScope.getScopeName());
121         st.setAttribute("name", name);
122         st.setAttribute("args", orderedArgs);
123         st.setAttribute("locals", locals!=null?locals.getMembers():null);
124         return st.toString();
125     }
126
127     public int hashCode()
128     {
129         return name.hashCode() + orderedArgs.size() + enclosingScope.hashCode();
130     }
131
132     /** Two methods are equals() when they have the same name and
133      *  the same number of arguments in the same scope.
134      */
135     public boolean equals(Object object)
136     {
137         return name.equals(((MethodSymbol)object).name) &&
138             orderedArgs.size()==((MethodSymbol)object).orderedArgs.size() &&
139             enclosingScope == ((MethodSymbol)object).enclosingScope;
140     }
141
142     public String getMangledName()
143     {
144         String mangled = name;
145         boolean isCtor = name.equals(enclosingScope.getScopeName());
146         if ( SymbolTable.METHOD_NAMES_TO_MANGLE.contains(name) ||
147                 (isCtor && SymbolTable.TYPE_NAMES_TO_MANGLE.contains(name)) ) {
148             mangled = "cj" + mangled;
149         }
150         int numargs = getMembers().size();
151         if ( numargs > 0 && !isCtor ) {
152             mangled += numargs;
153         }
154         return mangled;
155     }
156 }