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 part of js_backend; | 5 part of js_backend; |
6 | 6 |
7 const VERBOSE_OPTIMIZER_HINTS = false; | 7 const VERBOSE_OPTIMIZER_HINTS = false; |
8 | 8 |
9 class JavaScriptItemCompilationContext extends ItemCompilationContext { | 9 class JavaScriptItemCompilationContext extends ItemCompilationContext { |
10 final Set<HInstruction> boundsChecked = new Set<HInstruction>(); | 10 final Set<HInstruction> boundsChecked = new Set<HInstruction>(); |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 assert(_membersNeededForReflection != null); | 319 assert(_membersNeededForReflection != null); |
320 return _membersNeededForReflection; | 320 return _membersNeededForReflection; |
321 } | 321 } |
322 | 322 |
323 /// List of symbols that the user has requested for reflection. | 323 /// List of symbols that the user has requested for reflection. |
324 final Set<String> symbolsUsed = new Set<String>(); | 324 final Set<String> symbolsUsed = new Set<String>(); |
325 | 325 |
326 /// List of elements that the backend may use. | 326 /// List of elements that the backend may use. |
327 final Set<Element> helpersUsed = new Set<Element>(); | 327 final Set<Element> helpersUsed = new Set<Element>(); |
328 | 328 |
| 329 /// Set of typedefs that are used as type literals. |
| 330 final Set<TypedefElement> typedefTypeLiterals = new Set<TypedefElement>(); |
| 331 |
329 /// All the checked mode helpers. | 332 /// All the checked mode helpers. |
330 static const checkedModeHelpers = CheckedModeHelper.helpers; | 333 static const checkedModeHelpers = CheckedModeHelper.helpers; |
331 | 334 |
332 // Checked mode helpers indexed by name. | 335 // Checked mode helpers indexed by name. |
333 Map<String, CheckedModeHelper> checkedModeHelperByName = | 336 Map<String, CheckedModeHelper> checkedModeHelperByName = |
334 new Map<String, CheckedModeHelper>.fromIterable( | 337 new Map<String, CheckedModeHelper>.fromIterable( |
335 checkedModeHelpers, | 338 checkedModeHelpers, |
336 key: (helper) => helper.name); | 339 key: (helper) => helper.name); |
337 | 340 |
338 TypeVariableHandler typeVariableHandler; | 341 TypeVariableHandler typeVariableHandler; |
(...skipping 1561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1900 reflectableMembers.add(closure); | 1903 reflectableMembers.add(closure); |
1901 foundClosure = true; | 1904 foundClosure = true; |
1902 } | 1905 } |
1903 } | 1906 } |
1904 } | 1907 } |
1905 // As we do not think about closures as classes, yet, we have to make sure | 1908 // As we do not think about closures as classes, yet, we have to make sure |
1906 // their superclasses are available for reflection manually. | 1909 // their superclasses are available for reflection manually. |
1907 if (foundClosure) { | 1910 if (foundClosure) { |
1908 reflectableMembers.add(closureClass); | 1911 reflectableMembers.add(closureClass); |
1909 } | 1912 } |
| 1913 // It would be nice to have a better means to select |
1910 Set<Element> closurizedMembers = compiler.resolverWorld.closurizedMembers; | 1914 Set<Element> closurizedMembers = compiler.resolverWorld.closurizedMembers; |
1911 if (closurizedMembers.any(reflectableMembers.contains)) { | 1915 if (closurizedMembers.any(reflectableMembers.contains)) { |
1912 reflectableMembers.add(boundClosureClass); | 1916 reflectableMembers.add(boundClosureClass); |
1913 } | 1917 } |
1914 // Add typedefs. | |
1915 reflectableMembers | |
1916 .addAll(compiler.world.allTypedefs.where(referencedFromMirrorSystem)); | |
1917 // Register all symbols of reflectable elements | 1918 // Register all symbols of reflectable elements |
1918 for (Element element in reflectableMembers) { | 1919 for (Element element in reflectableMembers) { |
1919 symbolsUsed.add(element.name); | 1920 symbolsUsed.add(element.name); |
1920 } | 1921 } |
1921 _membersNeededForReflection = reflectableMembers; | 1922 _membersNeededForReflection = reflectableMembers; |
1922 } | 1923 } |
1923 | 1924 |
1924 jsAst.Call generateIsJsIndexableCall(jsAst.Expression use1, | 1925 jsAst.Call generateIsJsIndexableCall(jsAst.Expression use1, |
1925 jsAst.Expression use2) { | 1926 jsAst.Expression use2) { |
1926 String dispatchPropertyName = 'init.dispatchPropertyName'; | 1927 String dispatchPropertyName = 'init.dispatchPropertyName'; |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2127 } | 2128 } |
2128 | 2129 |
2129 void onTypeLiteral(DartType type, Registry registry) { | 2130 void onTypeLiteral(DartType type, Registry registry) { |
2130 assert(registry.isForResolution); | 2131 assert(registry.isForResolution); |
2131 registerBackendInstantiation(backend.typeImplementation, registry); | 2132 registerBackendInstantiation(backend.typeImplementation, registry); |
2132 registerBackendStaticInvocation(backend.getCreateRuntimeType(), registry); | 2133 registerBackendStaticInvocation(backend.getCreateRuntimeType(), registry); |
2133 // TODO(ahe): Might want to register [element] as an instantiated class | 2134 // TODO(ahe): Might want to register [element] as an instantiated class |
2134 // when reflection is used. However, as long as we disable tree-shaking | 2135 // when reflection is used. However, as long as we disable tree-shaking |
2135 // eagerly it doesn't matter. | 2136 // eagerly it doesn't matter. |
2136 if (type.isTypedef) { | 2137 if (type.isTypedef) { |
2137 backend.compiler.world.allTypedefs.add(type.element); | 2138 backend.typedefTypeLiterals.add(type.element); |
2138 } | 2139 } |
2139 backend.customElementsAnalysis.registerTypeLiteral(type, registry); | 2140 backend.customElementsAnalysis.registerTypeLiteral(type, registry); |
2140 } | 2141 } |
2141 | 2142 |
2142 void onStackTraceInCatch(Registry registry) { | 2143 void onStackTraceInCatch(Registry registry) { |
2143 assert(registry.isForResolution); | 2144 assert(registry.isForResolution); |
2144 registerBackendStaticInvocation(backend.getTraceFromException(), registry); | 2145 registerBackendStaticInvocation(backend.getTraceFromException(), registry); |
2145 } | 2146 } |
2146 | 2147 |
2147 | 2148 |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2274 } | 2275 } |
2275 | 2276 |
2276 /// Records that [constant] is used by the element behind [registry]. | 2277 /// Records that [constant] is used by the element behind [registry]. |
2277 class Dependency { | 2278 class Dependency { |
2278 final Constant constant; | 2279 final Constant constant; |
2279 // TODO(johnniwinther): Change to [Element] when dependency nodes are added. | 2280 // TODO(johnniwinther): Change to [Element] when dependency nodes are added. |
2280 final Registry registry; | 2281 final Registry registry; |
2281 | 2282 |
2282 const Dependency(this.constant, this.registry); | 2283 const Dependency(this.constant, this.registry); |
2283 } | 2284 } |
OLD | NEW |