OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 dart2js.js_backend.helpers; | 5 library dart2js.js_backend.helpers; |
6 | 6 |
7 import '../common.dart'; | 7 import '../common.dart'; |
8 import '../common/names.dart' show | 8 import '../common/names.dart' show Identifiers, Uris; |
9 Identifiers, | 9 import '../common/resolution.dart' show Resolution; |
10 Uris; | 10 import '../compiler.dart' show Compiler; |
11 import '../common/resolution.dart' show | 11 import '../core_types.dart' show CoreClasses; |
12 Resolution; | 12 import '../elements/elements.dart' |
13 import '../compiler.dart' show | 13 show |
14 Compiler; | 14 AbstractFieldElement, |
15 import '../core_types.dart' show | 15 ClassElement, |
16 CoreClasses; | 16 ConstructorElement, |
17 import '../elements/elements.dart' show | 17 Element, |
18 AbstractFieldElement, | 18 EnumClassElement, |
19 ClassElement, | 19 FunctionElement, |
20 ConstructorElement, | 20 LibraryElement, |
21 Element, | 21 MethodElement; |
22 EnumClassElement, | 22 import '../library_loader.dart' show LoadedLibraries; |
23 FunctionElement, | |
24 LibraryElement, | |
25 MethodElement; | |
26 import '../library_loader.dart' show | |
27 LoadedLibraries; | |
28 | 23 |
29 import 'js_backend.dart'; | 24 import 'js_backend.dart'; |
30 | 25 |
31 /// Helper classes and functions for the JavaScript backend. | 26 /// Helper classes and functions for the JavaScript backend. |
32 class BackendHelpers { | 27 class BackendHelpers { |
33 static final Uri DART_JS_HELPER = new Uri(scheme: 'dart', path: '_js_helper'); | 28 static final Uri DART_JS_HELPER = new Uri(scheme: 'dart', path: '_js_helper'); |
34 static final Uri DART_INTERCEPTORS = | 29 static final Uri DART_INTERCEPTORS = |
35 new Uri(scheme: 'dart', path: '_interceptors'); | 30 new Uri(scheme: 'dart', path: '_interceptors'); |
36 static final Uri DART_FOREIGN_HELPER = | 31 static final Uri DART_FOREIGN_HELPER = |
37 new Uri(scheme: 'dart', path: '_foreign_helper'); | 32 new Uri(scheme: 'dart', path: '_foreign_helper'); |
38 static final Uri DART_JS_MIRRORS = | 33 static final Uri DART_JS_MIRRORS = |
39 new Uri(scheme: 'dart', path: '_js_mirrors'); | 34 new Uri(scheme: 'dart', path: '_js_mirrors'); |
40 static final Uri DART_JS_NAMES = | 35 static final Uri DART_JS_NAMES = new Uri(scheme: 'dart', path: '_js_names'); |
41 new Uri(scheme: 'dart', path: '_js_names'); | |
42 static final Uri DART_EMBEDDED_NAMES = | 36 static final Uri DART_EMBEDDED_NAMES = |
43 new Uri(scheme: 'dart', path: '_js_embedded_names'); | 37 new Uri(scheme: 'dart', path: '_js_embedded_names'); |
44 static final Uri DART_ISOLATE_HELPER = | 38 static final Uri DART_ISOLATE_HELPER = |
45 new Uri(scheme: 'dart', path: '_isolate_helper'); | 39 new Uri(scheme: 'dart', path: '_isolate_helper'); |
46 static final Uri PACKAGE_JS = | 40 static final Uri PACKAGE_JS = new Uri(scheme: 'package', path: 'js/js.dart'); |
47 new Uri(scheme: 'package', path: 'js/js.dart'); | |
48 | 41 |
49 static const String INVOKE_ON = '_getCachedInvocation'; | 42 static const String INVOKE_ON = '_getCachedInvocation'; |
50 static const String START_ROOT_ISOLATE = 'startRootIsolate'; | 43 static const String START_ROOT_ISOLATE = 'startRootIsolate'; |
51 | 44 |
52 final Compiler compiler; | 45 final Compiler compiler; |
53 | 46 |
54 Element cachedCheckConcurrentModificationError; | 47 Element cachedCheckConcurrentModificationError; |
55 | 48 |
56 BackendHelpers(this.compiler); | 49 BackendHelpers(this.compiler); |
57 | 50 |
58 JavaScriptBackend get backend => compiler.backend; | 51 JavaScriptBackend get backend => compiler.backend; |
59 | 52 |
60 Resolution get resolution => backend.resolution; | 53 Resolution get resolution => backend.resolution; |
61 | 54 |
62 CoreClasses get coreClasses => compiler.coreClasses; | 55 CoreClasses get coreClasses => compiler.coreClasses; |
63 | 56 |
64 DiagnosticReporter get reporter => compiler.reporter; | 57 DiagnosticReporter get reporter => compiler.reporter; |
65 | 58 |
66 MethodElement assertTest; | 59 MethodElement assertTest; |
67 MethodElement assertThrow; | 60 MethodElement assertThrow; |
68 MethodElement assertHelper; | 61 MethodElement assertHelper; |
69 | 62 |
70 | |
71 LibraryElement jsHelperLibrary; | 63 LibraryElement jsHelperLibrary; |
72 LibraryElement asyncLibrary; | 64 LibraryElement asyncLibrary; |
73 LibraryElement interceptorsLibrary; | 65 LibraryElement interceptorsLibrary; |
74 LibraryElement foreignLibrary; | 66 LibraryElement foreignLibrary; |
75 LibraryElement isolateHelperLibrary; | 67 LibraryElement isolateHelperLibrary; |
76 | 68 |
77 /// Reference to the internal library to lookup functions to always inline. | 69 /// Reference to the internal library to lookup functions to always inline. |
78 LibraryElement internalLibrary; | 70 LibraryElement internalLibrary; |
79 | 71 |
80 ClassElement closureClass; | 72 ClassElement closureClass; |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 } | 188 } |
197 | 189 |
198 void onLibraryCreated(LibraryElement library) { | 190 void onLibraryCreated(LibraryElement library) { |
199 Uri uri = library.canonicalUri; | 191 Uri uri = library.canonicalUri; |
200 if (uri == DART_JS_HELPER) { | 192 if (uri == DART_JS_HELPER) { |
201 jsHelperLibrary = library; | 193 jsHelperLibrary = library; |
202 } else if (uri == Uris.dart_async) { | 194 } else if (uri == Uris.dart_async) { |
203 asyncLibrary = library; | 195 asyncLibrary = library; |
204 } else if (uri == Uris.dart__internal) { | 196 } else if (uri == Uris.dart__internal) { |
205 internalLibrary = library; | 197 internalLibrary = library; |
206 } else if (uri == DART_INTERCEPTORS) { | 198 } else if (uri == DART_INTERCEPTORS) { |
207 interceptorsLibrary = library; | 199 interceptorsLibrary = library; |
208 } else if (uri == DART_FOREIGN_HELPER) { | 200 } else if (uri == DART_FOREIGN_HELPER) { |
209 foreignLibrary = library; | 201 foreignLibrary = library; |
210 } else if (uri == DART_ISOLATE_HELPER) { | 202 } else if (uri == DART_ISOLATE_HELPER) { |
211 isolateHelperLibrary = library; | 203 isolateHelperLibrary = library; |
212 } | 204 } |
213 } | 205 } |
214 | 206 |
215 void initializeHelperClasses(DiagnosticReporter reporter) { | 207 void initializeHelperClasses(DiagnosticReporter reporter) { |
216 final List missingHelperClasses = []; | 208 final List missingHelperClasses = []; |
217 ClassElement lookupHelperClass(String name) { | 209 ClassElement lookupHelperClass(String name) { |
218 ClassElement result = findHelper(name); | 210 ClassElement result = findHelper(name); |
219 if (result == null) { | 211 if (result == null) { |
220 missingHelperClasses.add(name); | 212 missingHelperClasses.add(name); |
221 } | 213 } |
222 return result; | 214 return result; |
223 } | 215 } |
224 jsInvocationMirrorClass = lookupHelperClass('JSInvocationMirror'); | 216 jsInvocationMirrorClass = lookupHelperClass('JSInvocationMirror'); |
225 boundClosureClass = lookupHelperClass('BoundClosure'); | 217 boundClosureClass = lookupHelperClass('BoundClosure'); |
226 closureClass = lookupHelperClass('Closure'); | 218 closureClass = lookupHelperClass('Closure'); |
227 if (!missingHelperClasses.isEmpty) { | 219 if (!missingHelperClasses.isEmpty) { |
228 reporter.internalError(jsHelperLibrary, | 220 reporter.internalError( |
| 221 jsHelperLibrary, |
229 'dart:_js_helper library does not contain required classes: ' | 222 'dart:_js_helper library does not contain required classes: ' |
230 '$missingHelperClasses'); | 223 '$missingHelperClasses'); |
231 } | 224 } |
232 } | 225 } |
233 | 226 |
234 void onLibraryScanned(LibraryElement library) { | 227 void onLibraryScanned(LibraryElement library) { |
235 Uri uri = library.canonicalUri; | 228 Uri uri = library.canonicalUri; |
236 | 229 |
237 FunctionElement findMethod(String name) { | 230 FunctionElement findMethod(String name) { |
238 return find(library, name); | 231 return find(library, name); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
302 jsBuiltinEnum = find(library, 'JsBuiltin'); | 295 jsBuiltinEnum = find(library, 'JsBuiltin'); |
303 } else if (uri == Uris.dart__native_typed_data) { | 296 } else if (uri == Uris.dart__native_typed_data) { |
304 typedArrayClass = findClass('NativeTypedArray'); | 297 typedArrayClass = findClass('NativeTypedArray'); |
305 typedArrayOfIntClass = findClass('NativeTypedArrayOfInt'); | 298 typedArrayOfIntClass = findClass('NativeTypedArrayOfInt'); |
306 } else if (uri == PACKAGE_JS) { | 299 } else if (uri == PACKAGE_JS) { |
307 jsAnnotationClass = find(library, 'JS'); | 300 jsAnnotationClass = find(library, 'JS'); |
308 jsAnonymousClass = find(library, '_Anonymous'); | 301 jsAnonymousClass = find(library, '_Anonymous'); |
309 } | 302 } |
310 } | 303 } |
311 | 304 |
312 | |
313 void onLibrariesLoaded(LoadedLibraries loadedLibraries) { | 305 void onLibrariesLoaded(LoadedLibraries loadedLibraries) { |
314 assert(loadedLibraries.containsLibrary(Uris.dart_core)); | 306 assert(loadedLibraries.containsLibrary(Uris.dart_core)); |
315 assert(loadedLibraries.containsLibrary(DART_INTERCEPTORS)); | 307 assert(loadedLibraries.containsLibrary(DART_INTERCEPTORS)); |
316 assert(loadedLibraries.containsLibrary(DART_JS_HELPER)); | 308 assert(loadedLibraries.containsLibrary(DART_JS_HELPER)); |
317 | 309 |
318 if (jsInvocationMirrorClass != null) { | 310 if (jsInvocationMirrorClass != null) { |
319 jsInvocationMirrorClass.ensureResolved(resolution); | 311 jsInvocationMirrorClass.ensureResolved(resolution); |
320 invokeOnMethod = jsInvocationMirrorClass.lookupLocalMember(INVOKE_ON); | 312 invokeOnMethod = jsInvocationMirrorClass.lookupLocalMember(INVOKE_ON); |
321 } | 313 } |
322 | 314 |
(...skipping 10 matching lines...) Expand all Loading... |
333 jsFixedArrayClass.ensureResolved(resolution); | 325 jsFixedArrayClass.ensureResolved(resolution); |
334 } | 326 } |
335 if (jsExtendableArrayClass != null) { | 327 if (jsExtendableArrayClass != null) { |
336 jsExtendableArrayClass.ensureResolved(resolution); | 328 jsExtendableArrayClass.ensureResolved(resolution); |
337 } | 329 } |
338 if (jsUnmodifiableArrayClass != null) { | 330 if (jsUnmodifiableArrayClass != null) { |
339 jsUnmodifiableArrayClass.ensureResolved(resolution); | 331 jsUnmodifiableArrayClass.ensureResolved(resolution); |
340 } | 332 } |
341 | 333 |
342 jsIndexableClass.ensureResolved(resolution); | 334 jsIndexableClass.ensureResolved(resolution); |
343 jsIndexableLength = compiler.lookupElementIn( | 335 jsIndexableLength = compiler.lookupElementIn(jsIndexableClass, 'length'); |
344 jsIndexableClass, 'length'); | |
345 if (jsIndexableLength != null && jsIndexableLength.isAbstractField) { | 336 if (jsIndexableLength != null && jsIndexableLength.isAbstractField) { |
346 AbstractFieldElement element = jsIndexableLength; | 337 AbstractFieldElement element = jsIndexableLength; |
347 jsIndexableLength = element.getter; | 338 jsIndexableLength = element.getter; |
348 } | 339 } |
349 | 340 |
350 jsArrayClass.ensureResolved(resolution); | 341 jsArrayClass.ensureResolved(resolution); |
351 jsArrayTypedConstructor = compiler.lookupElementIn(jsArrayClass, 'typed'); | 342 jsArrayTypedConstructor = compiler.lookupElementIn(jsArrayClass, 'typed'); |
352 jsArrayRemoveLast = compiler.lookupElementIn(jsArrayClass, 'removeLast'); | 343 jsArrayRemoveLast = compiler.lookupElementIn(jsArrayClass, 'removeLast'); |
353 jsArrayAdd = compiler.lookupElementIn(jsArrayClass, 'add'); | 344 jsArrayAdd = compiler.lookupElementIn(jsArrayClass, 'add'); |
354 | 345 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 } | 380 } |
390 | 381 |
391 FunctionElement get closureFromTearOff { | 382 FunctionElement get closureFromTearOff { |
392 return findHelper('closureFromTearOff'); | 383 return findHelper('closureFromTearOff'); |
393 } | 384 } |
394 | 385 |
395 Element get isJsIndexable { | 386 Element get isJsIndexable { |
396 return findHelper('isJsIndexable'); | 387 return findHelper('isJsIndexable'); |
397 } | 388 } |
398 | 389 |
399 | |
400 Element get throwIllegalArgumentException { | 390 Element get throwIllegalArgumentException { |
401 return findHelper('iae'); | 391 return findHelper('iae'); |
402 } | 392 } |
403 | 393 |
404 Element get throwIndexOutOfRangeException { | 394 Element get throwIndexOutOfRangeException { |
405 return findHelper('ioore'); | 395 return findHelper('ioore'); |
406 } | 396 } |
407 | 397 |
408 Element get exceptionUnwrapper { | 398 Element get exceptionUnwrapper { |
409 return findHelper('unwrapException'); | 399 return findHelper('unwrapException'); |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
601 return classElement.lookupConstructor(""); | 591 return classElement.lookupConstructor(""); |
602 } | 592 } |
603 | 593 |
604 Element get syncCompleterConstructor { | 594 Element get syncCompleterConstructor { |
605 ClassElement classElement = find(compiler.asyncLibrary, "Completer"); | 595 ClassElement classElement = find(compiler.asyncLibrary, "Completer"); |
606 classElement.ensureResolved(resolution); | 596 classElement.ensureResolved(resolution); |
607 return classElement.lookupConstructor("sync"); | 597 return classElement.lookupConstructor("sync"); |
608 } | 598 } |
609 | 599 |
610 Element get asyncStarController { | 600 Element get asyncStarController { |
611 ClassElement classElement = | 601 ClassElement classElement = findAsyncHelper("_AsyncStarStreamController"); |
612 findAsyncHelper("_AsyncStarStreamController"); | |
613 classElement.ensureResolved(resolution); | 602 classElement.ensureResolved(resolution); |
614 return classElement; | 603 return classElement; |
615 } | 604 } |
616 | 605 |
617 Element get asyncStarControllerConstructor { | 606 Element get asyncStarControllerConstructor { |
618 ClassElement classElement = asyncStarController; | 607 ClassElement classElement = asyncStarController; |
619 return classElement.lookupConstructor(""); | 608 return classElement.lookupConstructor(""); |
620 } | 609 } |
621 | 610 |
622 Element get streamIteratorConstructor { | 611 Element get streamIteratorConstructor { |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
684 MethodElement _objectNoSuchMethod; | 673 MethodElement _objectNoSuchMethod; |
685 | 674 |
686 MethodElement get objectNoSuchMethod { | 675 MethodElement get objectNoSuchMethod { |
687 if (_objectNoSuchMethod == null) { | 676 if (_objectNoSuchMethod == null) { |
688 _objectNoSuchMethod = | 677 _objectNoSuchMethod = |
689 coreClasses.objectClass.lookupLocalMember(Identifiers.noSuchMethod_); | 678 coreClasses.objectClass.lookupLocalMember(Identifiers.noSuchMethod_); |
690 } | 679 } |
691 return _objectNoSuchMethod; | 680 return _objectNoSuchMethod; |
692 } | 681 } |
693 } | 682 } |
OLD | NEW |