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