| 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 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 333 assert(_membersNeededForReflection != null); | 333 assert(_membersNeededForReflection != null); |
| 334 return _membersNeededForReflection; | 334 return _membersNeededForReflection; |
| 335 } | 335 } |
| 336 | 336 |
| 337 /// List of symbols that the user has requested for reflection. | 337 /// List of symbols that the user has requested for reflection. |
| 338 final Set<String> symbolsUsed = new Set<String>(); | 338 final Set<String> symbolsUsed = new Set<String>(); |
| 339 | 339 |
| 340 /// List of elements that the backend may use. | 340 /// List of elements that the backend may use. |
| 341 final Set<Element> helpersUsed = new Set<Element>(); | 341 final Set<Element> helpersUsed = new Set<Element>(); |
| 342 | 342 |
| 343 /// Set of typedefs that are used as type literals. | |
| 344 final Set<TypedefElement> typedefTypeLiterals = new Set<TypedefElement>(); | |
| 345 | |
| 346 /// All the checked mode helpers. | 343 /// All the checked mode helpers. |
| 347 static const checkedModeHelpers = CheckedModeHelper.helpers; | 344 static const checkedModeHelpers = CheckedModeHelper.helpers; |
| 348 | 345 |
| 349 // Checked mode helpers indexed by name. | 346 // Checked mode helpers indexed by name. |
| 350 Map<String, CheckedModeHelper> checkedModeHelperByName = | 347 Map<String, CheckedModeHelper> checkedModeHelperByName = |
| 351 new Map<String, CheckedModeHelper>.fromIterable( | 348 new Map<String, CheckedModeHelper>.fromIterable( |
| 352 checkedModeHelpers, | 349 checkedModeHelpers, |
| 353 key: (helper) => helper.name); | 350 key: (helper) => helper.name); |
| 354 | 351 |
| 355 TypeVariableHandler typeVariableHandler; | 352 TypeVariableHandler typeVariableHandler; |
| (...skipping 1574 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1930 reflectableMembers.add(closure); | 1927 reflectableMembers.add(closure); |
| 1931 foundClosure = true; | 1928 foundClosure = true; |
| 1932 } | 1929 } |
| 1933 } | 1930 } |
| 1934 } | 1931 } |
| 1935 // As we do not think about closures as classes, yet, we have to make sure | 1932 // As we do not think about closures as classes, yet, we have to make sure |
| 1936 // their superclasses are available for reflection manually. | 1933 // their superclasses are available for reflection manually. |
| 1937 if (foundClosure) { | 1934 if (foundClosure) { |
| 1938 reflectableMembers.add(closureClass); | 1935 reflectableMembers.add(closureClass); |
| 1939 } | 1936 } |
| 1940 // It would be nice to have a better means to select | |
| 1941 Set<Element> closurizedMembers = compiler.resolverWorld.closurizedMembers; | 1937 Set<Element> closurizedMembers = compiler.resolverWorld.closurizedMembers; |
| 1942 if (closurizedMembers.any(reflectableMembers.contains)) { | 1938 if (closurizedMembers.any(reflectableMembers.contains)) { |
| 1943 reflectableMembers.add(boundClosureClass); | 1939 reflectableMembers.add(boundClosureClass); |
| 1944 } | 1940 } |
| 1941 // Add typedefs. |
| 1942 reflectableMembers |
| 1943 .addAll(compiler.world.allTypedefs.where(referencedFromMirrorSystem)); |
| 1945 // Register all symbols of reflectable elements | 1944 // Register all symbols of reflectable elements |
| 1946 for (Element element in reflectableMembers) { | 1945 for (Element element in reflectableMembers) { |
| 1947 symbolsUsed.add(element.name); | 1946 symbolsUsed.add(element.name); |
| 1948 } | 1947 } |
| 1949 _membersNeededForReflection = reflectableMembers; | 1948 _membersNeededForReflection = reflectableMembers; |
| 1950 } | 1949 } |
| 1951 | 1950 |
| 1952 jsAst.Call generateIsJsIndexableCall(jsAst.Expression use1, | 1951 jsAst.Call generateIsJsIndexableCall(jsAst.Expression use1, |
| 1953 jsAst.Expression use2) { | 1952 jsAst.Expression use2) { |
| 1954 String dispatchPropertyName = 'init.dispatchPropertyName'; | 1953 String dispatchPropertyName = 'init.dispatchPropertyName'; |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2163 } | 2162 } |
| 2164 | 2163 |
| 2165 void onTypeLiteral(DartType type, Registry registry) { | 2164 void onTypeLiteral(DartType type, Registry registry) { |
| 2166 assert(registry.isForResolution); | 2165 assert(registry.isForResolution); |
| 2167 registerBackendInstantiation(backend.typeImplementation, registry); | 2166 registerBackendInstantiation(backend.typeImplementation, registry); |
| 2168 registerBackendStaticInvocation(backend.getCreateRuntimeType(), registry); | 2167 registerBackendStaticInvocation(backend.getCreateRuntimeType(), registry); |
| 2169 // TODO(ahe): Might want to register [element] as an instantiated class | 2168 // TODO(ahe): Might want to register [element] as an instantiated class |
| 2170 // when reflection is used. However, as long as we disable tree-shaking | 2169 // when reflection is used. However, as long as we disable tree-shaking |
| 2171 // eagerly it doesn't matter. | 2170 // eagerly it doesn't matter. |
| 2172 if (type.isTypedef) { | 2171 if (type.isTypedef) { |
| 2173 backend.typedefTypeLiterals.add(type.element); | 2172 backend.compiler.world.allTypedefs.add(type.element); |
| 2174 } | 2173 } |
| 2175 backend.customElementsAnalysis.registerTypeLiteral(type, registry); | 2174 backend.customElementsAnalysis.registerTypeLiteral(type, registry); |
| 2176 } | 2175 } |
| 2177 | 2176 |
| 2178 void onStackTraceInCatch(Registry registry) { | 2177 void onStackTraceInCatch(Registry registry) { |
| 2179 assert(registry.isForResolution); | 2178 assert(registry.isForResolution); |
| 2180 registerBackendStaticInvocation(backend.getTraceFromException(), registry); | 2179 registerBackendStaticInvocation(backend.getTraceFromException(), registry); |
| 2181 } | 2180 } |
| 2182 | 2181 |
| 2183 | 2182 |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2311 } | 2310 } |
| 2312 | 2311 |
| 2313 /// Records that [constant] is used by the element behind [registry]. | 2312 /// Records that [constant] is used by the element behind [registry]. |
| 2314 class Dependency { | 2313 class Dependency { |
| 2315 final Constant constant; | 2314 final Constant constant; |
| 2316 // TODO(johnniwinther): Change to [Element] when dependency nodes are added. | 2315 // TODO(johnniwinther): Change to [Element] when dependency nodes are added. |
| 2317 final Registry registry; | 2316 final Registry registry; |
| 2318 | 2317 |
| 2319 const Dependency(this.constant, this.registry); | 2318 const Dependency(this.constant, this.registry); |
| 2320 } | 2319 } |
| OLD | NEW |