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 |