Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(168)

Side by Side Diff: sdk/lib/_internal/compiler/implementation/js_backend/backend.dart

Issue 360493002: Emit declarations for typedefs that are needed by reflection. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Adapt to new way of computing elements needed for reflection. Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698