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