| 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 library js_backend.backend; | 5 library js_backend.backend; |
| 6 | 6 |
| 7 import 'dart:async' show Future; | 7 import 'dart:async' show Future; |
| 8 | 8 |
| 9 import 'package:js_runtime/shared/embedded_names.dart' as embeddedNames; | 9 import 'package:js_runtime/shared/embedded_names.dart' as embeddedNames; |
| 10 | 10 |
| (...skipping 1274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1285 return impactBuilder; | 1285 return impactBuilder; |
| 1286 } | 1286 } |
| 1287 | 1287 |
| 1288 onResolutionComplete( | 1288 onResolutionComplete( |
| 1289 ClosedWorld closedWorld, ClosedWorldRefiner closedWorldRefiner) { | 1289 ClosedWorld closedWorld, ClosedWorldRefiner closedWorldRefiner) { |
| 1290 for (Entity entity in compiler.enqueuer.resolution.processedEntities) { | 1290 for (Entity entity in compiler.enqueuer.resolution.processedEntities) { |
| 1291 processAnnotations(entity, closedWorldRefiner); | 1291 processAnnotations(entity, closedWorldRefiner); |
| 1292 } | 1292 } |
| 1293 computeMembersNeededForReflection(closedWorld); | 1293 computeMembersNeededForReflection(closedWorld); |
| 1294 rti.computeClassesNeedingRti( | 1294 rti.computeClassesNeedingRti( |
| 1295 compiler.enqueuer.resolution.universe, closedWorld); | 1295 compiler.enqueuer.resolution.worldBuilder, closedWorld); |
| 1296 _registeredMetadata.clear(); | 1296 _registeredMetadata.clear(); |
| 1297 } | 1297 } |
| 1298 | 1298 |
| 1299 onTypeInferenceComplete() { | 1299 onTypeInferenceComplete() { |
| 1300 super.onTypeInferenceComplete(); | 1300 super.onTypeInferenceComplete(); |
| 1301 noSuchMethodRegistry.onTypeInferenceComplete(); | 1301 noSuchMethodRegistry.onTypeInferenceComplete(); |
| 1302 } | 1302 } |
| 1303 | 1303 |
| 1304 /// Called to register that an instantiated generic class has a call method. | 1304 /// Called to register that an instantiated generic class has a call method. |
| 1305 /// Any backend specific [WorldImpact] of this is returned. | 1305 /// Any backend specific [WorldImpact] of this is returned. |
| (...skipping 736 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2042 void computeMembersNeededForReflection(ClosedWorld closedWorld) { | 2042 void computeMembersNeededForReflection(ClosedWorld closedWorld) { |
| 2043 if (_membersNeededForReflection != null) return; | 2043 if (_membersNeededForReflection != null) return; |
| 2044 if (closedWorld.commonElements.mirrorsLibrary == null) { | 2044 if (closedWorld.commonElements.mirrorsLibrary == null) { |
| 2045 _membersNeededForReflection = const ImmutableEmptySet<Element>(); | 2045 _membersNeededForReflection = const ImmutableEmptySet<Element>(); |
| 2046 return; | 2046 return; |
| 2047 } | 2047 } |
| 2048 // Compute a mapping from class to the closures it contains, so we | 2048 // Compute a mapping from class to the closures it contains, so we |
| 2049 // can include the correct ones when including the class. | 2049 // can include the correct ones when including the class. |
| 2050 Map<ClassElement, List<LocalFunctionElement>> closureMap = | 2050 Map<ClassElement, List<LocalFunctionElement>> closureMap = |
| 2051 new Map<ClassElement, List<LocalFunctionElement>>(); | 2051 new Map<ClassElement, List<LocalFunctionElement>>(); |
| 2052 for (LocalFunctionElement closure in compiler.resolverWorld.allClosures) { | 2052 for (LocalFunctionElement closure |
| 2053 in compiler.resolutionWorldBuilder.allClosures) { |
| 2053 closureMap.putIfAbsent(closure.enclosingClass, () => []).add(closure); | 2054 closureMap.putIfAbsent(closure.enclosingClass, () => []).add(closure); |
| 2054 } | 2055 } |
| 2055 bool foundClosure = false; | 2056 bool foundClosure = false; |
| 2056 Set<Element> reflectableMembers = new Set<Element>(); | 2057 Set<Element> reflectableMembers = new Set<Element>(); |
| 2057 ResolutionEnqueuer resolution = compiler.enqueuer.resolution; | 2058 ResolutionEnqueuer resolution = compiler.enqueuer.resolution; |
| 2058 for (ClassElement cls in resolution.universe.directlyInstantiatedClasses) { | 2059 for (ClassElement cls |
| 2060 in resolution.worldBuilder.directlyInstantiatedClasses) { |
| 2059 // Do not process internal classes. | 2061 // Do not process internal classes. |
| 2060 if (cls.library.isInternalLibrary || cls.isInjected) continue; | 2062 if (cls.library.isInternalLibrary || cls.isInjected) continue; |
| 2061 if (referencedFromMirrorSystem(cls)) { | 2063 if (referencedFromMirrorSystem(cls)) { |
| 2062 Set<Name> memberNames = new Set<Name>(); | 2064 Set<Name> memberNames = new Set<Name>(); |
| 2063 // 1) the class (should be resolved) | 2065 // 1) the class (should be resolved) |
| 2064 assert(invariant(cls, cls.isResolved)); | 2066 assert(invariant(cls, cls.isResolved)); |
| 2065 reflectableMembers.add(cls); | 2067 reflectableMembers.add(cls); |
| 2066 // 2) its constructors (if resolved) | 2068 // 2) its constructors (if resolved) |
| 2067 cls.constructors.forEach((Element constructor) { | 2069 cls.constructors.forEach((Element constructor) { |
| 2068 if (resolution.hasBeenProcessed(constructor)) { | 2070 if (resolution.hasBeenProcessed(constructor)) { |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2151 reflectableMembers.add(closure); | 2153 reflectableMembers.add(closure); |
| 2152 foundClosure = true; | 2154 foundClosure = true; |
| 2153 } | 2155 } |
| 2154 } | 2156 } |
| 2155 } | 2157 } |
| 2156 // As we do not think about closures as classes, yet, we have to make sure | 2158 // As we do not think about closures as classes, yet, we have to make sure |
| 2157 // their superclasses are available for reflection manually. | 2159 // their superclasses are available for reflection manually. |
| 2158 if (foundClosure) { | 2160 if (foundClosure) { |
| 2159 reflectableMembers.add(helpers.closureClass); | 2161 reflectableMembers.add(helpers.closureClass); |
| 2160 } | 2162 } |
| 2161 Set<Element> closurizedMembers = compiler.resolverWorld.closurizedMembers; | 2163 Set<Element> closurizedMembers = |
| 2164 compiler.resolutionWorldBuilder.closurizedMembers; |
| 2162 if (closurizedMembers.any(reflectableMembers.contains)) { | 2165 if (closurizedMembers.any(reflectableMembers.contains)) { |
| 2163 reflectableMembers.add(helpers.boundClosureClass); | 2166 reflectableMembers.add(helpers.boundClosureClass); |
| 2164 } | 2167 } |
| 2165 // Add typedefs. | 2168 // Add typedefs. |
| 2166 reflectableMembers | 2169 reflectableMembers |
| 2167 .addAll(closedWorld.allTypedefs.where(referencedFromMirrorSystem)); | 2170 .addAll(closedWorld.allTypedefs.where(referencedFromMirrorSystem)); |
| 2168 // Register all symbols of reflectable elements | 2171 // Register all symbols of reflectable elements |
| 2169 for (Element element in reflectableMembers) { | 2172 for (Element element in reflectableMembers) { |
| 2170 symbolsUsed.add(element.name); | 2173 symbolsUsed.add(element.name); |
| 2171 } | 2174 } |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2387 message: "ClosedWorld has not be set yet.")); | 2390 message: "ClosedWorld has not be set yet.")); |
| 2388 return _closedWorldCache; | 2391 return _closedWorldCache; |
| 2389 } | 2392 } |
| 2390 | 2393 |
| 2391 void set _closedWorld(ClosedWorld value) { | 2394 void set _closedWorld(ClosedWorld value) { |
| 2392 _closedWorldCache = value; | 2395 _closedWorldCache = value; |
| 2393 } | 2396 } |
| 2394 | 2397 |
| 2395 WorldImpact onCodegenStart(ClosedWorld closedWorld) { | 2398 WorldImpact onCodegenStart(ClosedWorld closedWorld) { |
| 2396 _closedWorld = closedWorld; | 2399 _closedWorld = closedWorld; |
| 2397 _namer = determineNamer(_closedWorld, compiler.codegenWorld); | 2400 _namer = determineNamer(_closedWorld, compiler.codegenWorldBuilder); |
| 2398 tracer = new Tracer(_closedWorld, namer, compiler.outputProvider); | 2401 tracer = new Tracer(_closedWorld, namer, compiler.outputProvider); |
| 2399 emitter.createEmitter(_namer, _closedWorld); | 2402 emitter.createEmitter(_namer, _closedWorld); |
| 2400 lookupMapAnalysis.onCodegenStart(); | 2403 lookupMapAnalysis.onCodegenStart(); |
| 2401 if (hasIsolateSupport) { | 2404 if (hasIsolateSupport) { |
| 2402 return enableIsolateSupport(forResolution: false); | 2405 return enableIsolateSupport(forResolution: false); |
| 2403 } | 2406 } |
| 2404 return const WorldImpact(); | 2407 return const WorldImpact(); |
| 2405 } | 2408 } |
| 2406 | 2409 |
| 2407 void onCodegenEnd() { | 2410 void onCodegenEnd() { |
| (...skipping 869 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3277 @override | 3280 @override |
| 3278 bool isNativeClass(ClassElement element) { | 3281 bool isNativeClass(ClassElement element) { |
| 3279 return helpers.backend.isNative(element); | 3282 return helpers.backend.isNative(element); |
| 3280 } | 3283 } |
| 3281 | 3284 |
| 3282 @override | 3285 @override |
| 3283 bool isNativeMember(MemberElement element) { | 3286 bool isNativeMember(MemberElement element) { |
| 3284 return helpers.backend.isNative(element); | 3287 return helpers.backend.isNative(element); |
| 3285 } | 3288 } |
| 3286 } | 3289 } |
| OLD | NEW |