| 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 |