Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 class EnqueueTask extends CompilerTask { | 5 class EnqueueTask extends CompilerTask { |
| 6 final Enqueuer codegen; | 6 final Enqueuer codegen; |
| 7 final Enqueuer resolution; | 7 final Enqueuer resolution; |
| 8 | 8 |
| 9 String get name() => 'Enqueue'; | 9 String get name() => 'Enqueue'; |
| 10 | 10 |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 141 // when resolveType is called. | 141 // when resolveType is called. |
| 142 compiler.resolveClass(cls); | 142 compiler.resolveClass(cls); |
| 143 cls.members.forEach(processInstantiatedClassMember); | 143 cls.members.forEach(processInstantiatedClassMember); |
| 144 cls = cls.superclass; | 144 cls = cls.superclass; |
| 145 } | 145 } |
| 146 }); | 146 }); |
| 147 } | 147 } |
| 148 | 148 |
| 149 void registerNewSelector(SourceString name, | 149 void registerNewSelector(SourceString name, |
| 150 Selector selector, | 150 Selector selector, |
| 151 Map<SourceString, Set<Selector>> selectorsMap) { | 151 Map<SourceString, Set<Selector>> selectorsMap, |
| 152 [bool inLoop]) { | |
|
ngeoffray
2012/06/12 09:17:40
I wouldn't let the enqueuer be aware of such consi
Mads Ager (google)
2012/06/12 11:01:56
Good point. Removed.
| |
| 152 Set<Selector> selectors = | 153 Set<Selector> selectors = |
| 153 selectorsMap.putIfAbsent(name, () => new Set<Selector>()); | 154 selectorsMap.putIfAbsent(name, () => new Set<Selector>()); |
| 154 if (!selectors.contains(selector)) { | 155 if (!selectors.contains(selector)) { |
| 155 selectors.add(selector); | 156 selectors.add(selector); |
| 156 handleUnseenSelector(name, selector); | 157 handleUnseenSelector(name, selector, inLoop); |
| 157 } | 158 } |
| 158 } | 159 } |
| 159 | 160 |
| 160 void registerInvocation(SourceString methodName, Selector selector) { | 161 void registerInvocation(SourceString methodName, |
| 162 Selector selector, | |
| 163 [bool inLoop]) { | |
| 161 task.measure(() { | 164 task.measure(() { |
| 162 registerNewSelector(methodName, selector, universe.invokedNames); | 165 registerNewSelector(methodName, selector, universe.invokedNames, inLoop); |
| 163 }); | 166 }); |
| 164 } | 167 } |
| 165 | 168 |
| 166 void registerGetter(SourceString getterName, Selector selector) { | 169 void registerGetter(SourceString getterName, Selector selector) { |
| 167 task.measure(() { | 170 task.measure(() { |
| 168 registerNewSelector(getterName, selector, universe.invokedGetters); | 171 registerNewSelector(getterName, selector, universe.invokedGetters); |
| 169 }); | 172 }); |
| 170 } | 173 } |
| 171 | 174 |
| 172 void registerSetter(SourceString setterName, Selector selector) { | 175 void registerSetter(SourceString setterName, Selector selector) { |
| 173 task.measure(() { | 176 task.measure(() { |
| 174 registerNewSelector(setterName, selector, universe.invokedSetters); | 177 registerNewSelector(setterName, selector, universe.invokedSetters); |
| 175 }); | 178 }); |
| 176 } | 179 } |
| 177 | 180 |
| 178 processInstanceMembers(SourceString n, bool f(Element e)) { | 181 processInstanceMembers(SourceString n, bool f(Element e)) { |
| 179 String memberName = n.slowToString(); | 182 String memberName = n.slowToString(); |
| 180 Link<Element> members = instanceMembersByName[memberName]; | 183 Link<Element> members = instanceMembersByName[memberName]; |
| 181 if (members !== null) { | 184 if (members !== null) { |
| 182 LinkBuilder<Element> remaining = new LinkBuilder<Element>(); | 185 LinkBuilder<Element> remaining = new LinkBuilder<Element>(); |
| 183 for (; !members.isEmpty(); members = members.tail) { | 186 for (; !members.isEmpty(); members = members.tail) { |
| 184 if (!f(members.head)) remaining.addLast(members.head); | 187 if (!f(members.head)) remaining.addLast(members.head); |
| 185 } | 188 } |
| 186 instanceMembersByName[memberName] = remaining.toLink(); | 189 instanceMembersByName[memberName] = remaining.toLink(); |
| 187 } | 190 } |
| 188 } | 191 } |
| 189 | 192 |
| 190 void handleUnseenSelector(SourceString methodName, Selector selector) { | 193 void handleUnseenSelector(SourceString methodName, |
| 194 Selector selector, | |
| 195 [bool inLoop]) { | |
| 191 processInstanceMembers(methodName, (Element member) { | 196 processInstanceMembers(methodName, (Element member) { |
| 192 if (selector.applies(member, compiler)) { | 197 if (selector.applies(member, compiler)) { |
| 198 if (inLoop && member is FunctionElement) member.calledInLoop = true; | |
| 193 addToWorkList(member); | 199 addToWorkList(member); |
| 194 return true; | 200 return true; |
| 195 } | 201 } |
| 196 return false; | 202 return false; |
| 197 }); | 203 }); |
| 198 } | 204 } |
| 199 | 205 |
| 200 void registerStaticUse(Element element) { | 206 void registerStaticUse(Element element) { |
| 201 addToWorkList(element); | 207 addToWorkList(element); |
| 202 } | 208 } |
| 203 | 209 |
| 204 void registerGetOfStaticFunction(FunctionElement element) { | 210 void registerGetOfStaticFunction(FunctionElement element) { |
| 205 registerStaticUse(element); | 211 registerStaticUse(element); |
| 206 universe.staticFunctionsNeedingGetter.add(element); | 212 universe.staticFunctionsNeedingGetter.add(element); |
| 207 } | 213 } |
| 208 | 214 |
| 209 void registerDynamicInvocation(SourceString methodName, Selector selector) { | 215 void registerDynamicInvocation(SourceString methodName, |
| 216 Selector selector, | |
| 217 [bool inLoop]) { | |
| 210 assert(selector !== null); | 218 assert(selector !== null); |
| 211 registerInvocation(methodName, selector); | 219 registerInvocation(methodName, selector, inLoop); |
| 212 } | 220 } |
| 213 | 221 |
| 214 void registerDynamicInvocationOf(Element element) { | 222 void registerDynamicInvocationOf(Element element) { |
| 215 addToWorkList(element); | 223 addToWorkList(element); |
| 216 } | 224 } |
| 217 | 225 |
| 218 void registerDynamicGetter(SourceString methodName, Selector selector) { | 226 void registerDynamicGetter(SourceString methodName, Selector selector) { |
| 219 registerGetter(methodName, selector); | 227 registerGetter(methodName, selector); |
| 220 } | 228 } |
| 221 | 229 |
| 222 void registerDynamicSetter(SourceString methodName, Selector selector) { | 230 void registerDynamicSetter(SourceString methodName, Selector selector) { |
| 223 registerSetter(methodName, selector); | 231 registerSetter(methodName, selector); |
| 224 } | 232 } |
| 225 | 233 |
| 226 // TODO(ngeoffray): This should get a type. | 234 // TODO(ngeoffray): This should get a type. |
| 227 void registerIsCheck(Element element) { | 235 void registerIsCheck(Element element) { |
| 228 universe.isChecks.add(element); | 236 universe.isChecks.add(element); |
| 229 } | 237 } |
| 230 } | 238 } |
| OLD | NEW |