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

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: Address comments. Created 6 years, 4 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 322 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698