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

Side by Side Diff: pkg/compiler/lib/src/js_backend/backend.dart

Issue 2760923004: Eliminate multi-callback structure for LibraryLoader. (Closed)
Patch Set: . Created 3 years, 9 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
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 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 28 matching lines...) Expand all
39 import '../io/position_information.dart' show PositionSourceInformationStrategy; 39 import '../io/position_information.dart' show PositionSourceInformationStrategy;
40 import '../io/source_information.dart' show SourceInformationStrategy; 40 import '../io/source_information.dart' show SourceInformationStrategy;
41 import '../io/start_end_information.dart' 41 import '../io/start_end_information.dart'
42 show StartEndSourceInformationStrategy; 42 show StartEndSourceInformationStrategy;
43 import '../js/js.dart' as jsAst; 43 import '../js/js.dart' as jsAst;
44 import '../js/js.dart' show js; 44 import '../js/js.dart' show js;
45 import '../js/js_source_mapping.dart' show JavaScriptSourceInformationStrategy; 45 import '../js/js_source_mapping.dart' show JavaScriptSourceInformationStrategy;
46 import '../js/rewrite_async.dart'; 46 import '../js/rewrite_async.dart';
47 import '../js_emitter/js_emitter.dart' show CodeEmitterTask; 47 import '../js_emitter/js_emitter.dart' show CodeEmitterTask;
48 import '../kernel/task.dart'; 48 import '../kernel/task.dart';
49 import '../library_loader.dart' show LibraryLoader, LoadedLibraries; 49 import '../library_loader.dart' show LoadedLibraries;
50 import '../native/native.dart' as native; 50 import '../native/native.dart' as native;
51 import '../native/resolver.dart'; 51 import '../native/resolver.dart';
52 import '../ssa/ssa.dart' show SsaFunctionCompiler; 52 import '../ssa/ssa.dart' show SsaFunctionCompiler;
53 import '../tracer.dart'; 53 import '../tracer.dart';
54 import '../tree/tree.dart'; 54 import '../tree/tree.dart';
55 import '../types/types.dart'; 55 import '../types/types.dart';
56 import '../universe/call_structure.dart' show CallStructure; 56 import '../universe/call_structure.dart' show CallStructure;
57 import '../universe/selector.dart' show Selector; 57 import '../universe/selector.dart' show Selector;
58 import '../universe/world_builder.dart'; 58 import '../universe/world_builder.dart';
59 import '../universe/use.dart' show ConstantUse, StaticUse; 59 import '../universe/use.dart' show ConstantUse, StaticUse;
(...skipping 1030 matching lines...) Expand 10 before | Expand all | Expand 10 after
1090 element == commonElements.intClass || 1090 element == commonElements.intClass ||
1091 element == commonElements.doubleClass || 1091 element == commonElements.doubleClass ||
1092 element == helpers.jsArrayClass || 1092 element == helpers.jsArrayClass ||
1093 element == helpers.jsMutableArrayClass || 1093 element == helpers.jsMutableArrayClass ||
1094 element == helpers.jsExtendableArrayClass || 1094 element == helpers.jsExtendableArrayClass ||
1095 element == helpers.jsFixedArrayClass || 1095 element == helpers.jsFixedArrayClass ||
1096 element == helpers.jsUnmodifiableArrayClass; 1096 element == helpers.jsUnmodifiableArrayClass;
1097 } 1097 }
1098 1098
1099 /// This method is called immediately after the [library] and its parts have 1099 /// This method is called immediately after the [library] and its parts have
1100 /// been scanned. 1100 /// been loaded.
1101 Future onLibraryScanned(LibraryElement library, LibraryLoader loader) { 1101 void setAnnotations(LibraryElement library) {
1102 if (!compiler.serialization.isDeserialized(library)) { 1102 if (!compiler.serialization.isDeserialized(library)) {
1103 if (canLibraryUseNative(library)) { 1103 if (canLibraryUseNative(library)) {
1104 library.forEachLocalMember((Element element) { 1104 library.forEachLocalMember((Element element) {
1105 if (element.isClass) { 1105 if (element.isClass) {
1106 checkNativeAnnotation(compiler, element, nativeBaseDataBuilder); 1106 checkNativeAnnotation(compiler, element, nativeBaseDataBuilder);
1107 } 1107 }
1108 }); 1108 });
1109 } 1109 }
1110 checkJsInteropClassAnnotations(compiler, library, nativeBaseDataBuilder); 1110 checkJsInteropClassAnnotations(compiler, library, nativeBaseDataBuilder);
1111 } 1111 }
1112 if (library.isPlatformLibrary &&
1113 // Don't patch library currently disallowed.
1114 !library.isSynthesized &&
1115 !library.isPatched &&
1116 // Don't patch deserialized libraries.
1117 !compiler.serialization.isDeserialized(library)) {
1118 // Apply patch, if any.
1119 Uri patchUri = compiler.resolvePatchUri(library.canonicalUri.path);
1120 if (patchUri != null) {
1121 return compiler.patchParser.patchLibrary(loader, patchUri, library);
1122 }
1123 }
1124 Uri uri = library.canonicalUri; 1112 Uri uri = library.canonicalUri;
1125 if (uri == Uris.dart_html) { 1113 if (uri == Uris.dart_html) {
1126 htmlLibraryIsLoaded = true; 1114 htmlLibraryIsLoaded = true;
1127 } else if (uri == LookupMapResolutionAnalysis.PACKAGE_LOOKUP_MAP) { 1115 } else if (uri == LookupMapResolutionAnalysis.PACKAGE_LOOKUP_MAP) {
1128 lookupMapResolutionAnalysis.init(library); 1116 lookupMapResolutionAnalysis.init(library);
1129 } 1117 }
1130 annotations.onLibraryScanned(library); 1118 annotations.onLibraryLoaded(library);
1131 return new Future.value();
1132 } 1119 }
1133 1120
1134 /// This method is called when all new libraries loaded through 1121 /// This method is called when all new libraries loaded through
1135 /// [LibraryLoader.loadLibrary] has been loaded and their imports/exports 1122 /// [LibraryLoader.loadLibrary] has been loaded and their imports/exports
1136 /// have been computed. 1123 /// have been computed.
1137 Future onLibrariesLoaded(LoadedLibraries loadedLibraries) { 1124 void onLibrariesLoaded(LoadedLibraries loadedLibraries) {
1138 if (!loadedLibraries.containsLibrary(Uris.dart_core)) { 1125 if (loadedLibraries.containsLibrary(Uris.dart_core)) {
1139 return new Future.value(); 1126 helpers.onLibrariesLoaded(loadedLibraries);
1127
1128 // These methods are overwritten with generated versions.
1129 inlineCache.markAsNonInlinable(helpers.getInterceptorMethod,
1130 insideLoop: true);
1131
1132 specialOperatorEqClasses
1133 ..add(commonElements.objectClass)
1134 ..add(helpers.jsInterceptorClass)
1135 ..add(helpers.jsNullClass);
1140 } 1136 }
1141
1142 helpers.onLibrariesLoaded(loadedLibraries);
1143
1144 // These methods are overwritten with generated versions.
1145 inlineCache.markAsNonInlinable(helpers.getInterceptorMethod,
1146 insideLoop: true);
1147
1148 specialOperatorEqClasses
1149 ..add(commonElements.objectClass)
1150 ..add(helpers.jsInterceptorClass)
1151 ..add(helpers.jsNullClass);
1152
1153 return new Future.value();
1154 } 1137 }
1155 1138
1156 jsAst.Call generateIsJsIndexableCall( 1139 jsAst.Call generateIsJsIndexableCall(
1157 jsAst.Expression use1, jsAst.Expression use2) { 1140 jsAst.Expression use1, jsAst.Expression use2) {
1158 String dispatchPropertyName = embeddedNames.DISPATCH_PROPERTY_NAME; 1141 String dispatchPropertyName = embeddedNames.DISPATCH_PROPERTY_NAME;
1159 jsAst.Expression dispatchProperty = 1142 jsAst.Expression dispatchProperty =
1160 emitter.generateEmbeddedGlobalAccess(dispatchPropertyName); 1143 emitter.generateEmbeddedGlobalAccess(dispatchPropertyName);
1161 1144
1162 // We pass the dispatch property record to the isJsIndexable 1145 // We pass the dispatch property record to the isJsIndexable
1163 // helper rather than reading it inside the helper to increase the 1146 // helper rather than reading it inside the helper to increase the
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
1390 emitter.staticFunctionAccess(helpers.yieldStar), 1373 emitter.staticFunctionAccess(helpers.yieldStar),
1391 bodyName: namer.deriveAsyncBodyName(name)); 1374 bodyName: namer.deriveAsyncBodyName(name));
1392 break; 1375 break;
1393 default: 1376 default:
1394 assert(element.asyncMarker == AsyncMarker.SYNC); 1377 assert(element.asyncMarker == AsyncMarker.SYNC);
1395 return code; 1378 return code;
1396 } 1379 }
1397 return rewriter.rewrite(code); 1380 return rewriter.rewrite(code);
1398 } 1381 }
1399 1382
1400 /// The locations of js patch-files relative to the sdk-descriptors.
1401 static const _patchLocations = const <String, String>{
1402 "async": "_internal/js_runtime/lib/async_patch.dart",
1403 "collection": "_internal/js_runtime/lib/collection_patch.dart",
1404 "convert": "_internal/js_runtime/lib/convert_patch.dart",
1405 "core": "_internal/js_runtime/lib/core_patch.dart",
1406 "developer": "_internal/js_runtime/lib/developer_patch.dart",
1407 "io": "_internal/js_runtime/lib/io_patch.dart",
1408 "isolate": "_internal/js_runtime/lib/isolate_patch.dart",
1409 "math": "_internal/js_runtime/lib/math_patch.dart",
1410 "mirrors": "_internal/js_runtime/lib/mirrors_patch.dart",
1411 "typed_data": "_internal/js_runtime/lib/typed_data_patch.dart",
1412 "_internal": "_internal/js_runtime/lib/internal_patch.dart"
1413 };
1414
1415 /// Returns the location of the patch-file associated with [libraryName]
1416 /// resolved from [plaformConfigUri].
1417 ///
1418 /// Returns null if there is none.
1419 Uri resolvePatchUri(String libraryName, Uri platformConfigUri) {
1420 String patchLocation = _patchLocations[libraryName];
1421 if (patchLocation == null) return null;
1422 return platformConfigUri.resolve(patchLocation);
1423 }
1424
1425 /// Creates an impact strategy to use for compilation. 1383 /// Creates an impact strategy to use for compilation.
1426 ImpactStrategy createImpactStrategy( 1384 ImpactStrategy createImpactStrategy(
1427 {bool supportDeferredLoad: true, 1385 {bool supportDeferredLoad: true,
1428 bool supportDumpInfo: true, 1386 bool supportDumpInfo: true,
1429 bool supportSerialization: true}) { 1387 bool supportSerialization: true}) {
1430 return new JavaScriptImpactStrategy(resolution, compiler.dumpInfoTask, 1388 return new JavaScriptImpactStrategy(resolution, compiler.dumpInfoTask,
1431 supportDeferredLoad: supportDeferredLoad, 1389 supportDeferredLoad: supportDeferredLoad,
1432 supportDumpInfo: supportDumpInfo, 1390 supportDumpInfo: supportDumpInfo,
1433 supportSerialization: supportSerialization); 1391 supportSerialization: supportSerialization);
1434 } 1392 }
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
1603 return _backend.defaultSuperclass(element); 1561 return _backend.defaultSuperclass(element);
1604 } 1562 }
1605 1563
1606 @override 1564 @override
1607 bool isNativeClass(ClassEntity element) => 1565 bool isNativeClass(ClassEntity element) =>
1608 _backend.nativeBaseData.isNativeClass(element); 1566 _backend.nativeBaseData.isNativeClass(element);
1609 1567
1610 @override 1568 @override
1611 bool isForeign(Element element) => _backend.isForeign(element); 1569 bool isForeign(Element element) => _backend.isForeign(element);
1612 } 1570 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698