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 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 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 static final Uri DART_FOREIGN_HELPER = | 226 static final Uri DART_FOREIGN_HELPER = |
227 new Uri(scheme: 'dart', path: '_foreign_helper'); | 227 new Uri(scheme: 'dart', path: '_foreign_helper'); |
228 static final Uri DART_JS_MIRRORS = | 228 static final Uri DART_JS_MIRRORS = |
229 new Uri(scheme: 'dart', path: '_js_mirrors'); | 229 new Uri(scheme: 'dart', path: '_js_mirrors'); |
230 static final Uri DART_JS_NAMES = | 230 static final Uri DART_JS_NAMES = |
231 new Uri(scheme: 'dart', path: '_js_names'); | 231 new Uri(scheme: 'dart', path: '_js_names'); |
232 static final Uri DART_EMBEDDED_NAMES = | 232 static final Uri DART_EMBEDDED_NAMES = |
233 new Uri(scheme: 'dart', path: '_js_embedded_names'); | 233 new Uri(scheme: 'dart', path: '_js_embedded_names'); |
234 static final Uri DART_ISOLATE_HELPER = | 234 static final Uri DART_ISOLATE_HELPER = |
235 new Uri(scheme: 'dart', path: '_isolate_helper'); | 235 new Uri(scheme: 'dart', path: '_isolate_helper'); |
| 236 static final Uri PACKAGE_JS = |
| 237 new Uri(scheme: 'package', path: 'js/js.dart'); |
236 static final Uri PACKAGE_LOOKUP_MAP = | 238 static final Uri PACKAGE_LOOKUP_MAP = |
237 new Uri(scheme: 'package', path: 'lookup_map/lookup_map.dart'); | 239 new Uri(scheme: 'package', path: 'lookup_map/lookup_map.dart'); |
238 | 240 |
239 static const String INVOKE_ON = '_getCachedInvocation'; | 241 static const String INVOKE_ON = '_getCachedInvocation'; |
240 static const String START_ROOT_ISOLATE = 'startRootIsolate'; | 242 static const String START_ROOT_ISOLATE = 'startRootIsolate'; |
241 | 243 |
242 | 244 |
243 String get patchVersion => emitter.patchVersion; | 245 String get patchVersion => emitter.patchVersion; |
244 | 246 |
245 bool get supportsReflection => emitter.emitter.supportsReflection; | 247 bool get supportsReflection => emitter.emitter.supportsReflection; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
284 ClassElement jsInterceptorClass; | 286 ClassElement jsInterceptorClass; |
285 ClassElement jsStringClass; | 287 ClassElement jsStringClass; |
286 ClassElement jsArrayClass; | 288 ClassElement jsArrayClass; |
287 ClassElement jsNumberClass; | 289 ClassElement jsNumberClass; |
288 ClassElement jsIntClass; | 290 ClassElement jsIntClass; |
289 ClassElement jsDoubleClass; | 291 ClassElement jsDoubleClass; |
290 ClassElement jsNullClass; | 292 ClassElement jsNullClass; |
291 ClassElement jsBoolClass; | 293 ClassElement jsBoolClass; |
292 ClassElement jsPlainJavaScriptObjectClass; | 294 ClassElement jsPlainJavaScriptObjectClass; |
293 ClassElement jsUnknownJavaScriptObjectClass; | 295 ClassElement jsUnknownJavaScriptObjectClass; |
| 296 ClassElement jsJavaScriptFunctionClass; |
| 297 ClassElement jsJavaScriptObjectClass; |
294 | 298 |
295 ClassElement jsIndexableClass; | 299 ClassElement jsIndexableClass; |
296 ClassElement jsMutableIndexableClass; | 300 ClassElement jsMutableIndexableClass; |
297 | 301 |
298 ClassElement jsMutableArrayClass; | 302 ClassElement jsMutableArrayClass; |
299 ClassElement jsFixedArrayClass; | 303 ClassElement jsFixedArrayClass; |
300 ClassElement jsExtendableArrayClass; | 304 ClassElement jsExtendableArrayClass; |
301 ClassElement jsUnmodifiableArrayClass; | 305 ClassElement jsUnmodifiableArrayClass; |
302 ClassElement jsPositiveIntClass; | 306 ClassElement jsPositiveIntClass; |
303 ClassElement jsUInt32Class; | 307 ClassElement jsUInt32Class; |
(...skipping 16 matching lines...) Expand all Loading... |
320 ConstructorElement mapLiteralConstructorEmpty; | 324 ConstructorElement mapLiteralConstructorEmpty; |
321 Element mapLiteralUntypedMaker; | 325 Element mapLiteralUntypedMaker; |
322 Element mapLiteralUntypedEmptyMaker; | 326 Element mapLiteralUntypedEmptyMaker; |
323 | 327 |
324 ClassElement noSideEffectsClass; | 328 ClassElement noSideEffectsClass; |
325 ClassElement noThrowsClass; | 329 ClassElement noThrowsClass; |
326 ClassElement noInlineClass; | 330 ClassElement noInlineClass; |
327 ClassElement forceInlineClass; | 331 ClassElement forceInlineClass; |
328 ClassElement irRepresentationClass; | 332 ClassElement irRepresentationClass; |
329 | 333 |
| 334 ClassElement jsAnnotationClass; |
| 335 |
330 Element getInterceptorMethod; | 336 Element getInterceptorMethod; |
331 | 337 |
332 ClassElement jsInvocationMirrorClass; | 338 ClassElement jsInvocationMirrorClass; |
333 | 339 |
334 ClassElement typedArrayClass; | 340 ClassElement typedArrayClass; |
335 ClassElement typedArrayOfIntClass; | 341 ClassElement typedArrayOfIntClass; |
336 | 342 |
337 /// If [true], the compiler will emit code that logs whenever a method is | 343 /// If [true], the compiler will emit code that logs whenever a method is |
338 /// called. When TRACE_METHOD is 'console' this will be logged | 344 /// called. When TRACE_METHOD is 'console' this will be logged |
339 /// directly in the JavaScript console. When TRACE_METHOD is 'post' the | 345 /// directly in the JavaScript console. When TRACE_METHOD is 'post' the |
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
609 /// Number of methods compiled before considering reflection. | 615 /// Number of methods compiled before considering reflection. |
610 int preMirrorsMethodCount = 0; | 616 int preMirrorsMethodCount = 0; |
611 | 617 |
612 /// Resolution and codegen support for generating table of interceptors and | 618 /// Resolution and codegen support for generating table of interceptors and |
613 /// constructors for custom elements. | 619 /// constructors for custom elements. |
614 CustomElementsAnalysis customElementsAnalysis; | 620 CustomElementsAnalysis customElementsAnalysis; |
615 | 621 |
616 /// Codegen support for tree-shaking entries of `LookupMap`. | 622 /// Codegen support for tree-shaking entries of `LookupMap`. |
617 LookupMapAnalysis lookupMapAnalysis; | 623 LookupMapAnalysis lookupMapAnalysis; |
618 | 624 |
| 625 /// Codegen support for typed JavaScript interop. |
| 626 JsInteropAnalysis jsInteropAnalysis; |
| 627 |
619 /// Support for classifying `noSuchMethod` implementations. | 628 /// Support for classifying `noSuchMethod` implementations. |
620 NoSuchMethodRegistry noSuchMethodRegistry; | 629 NoSuchMethodRegistry noSuchMethodRegistry; |
621 | 630 |
622 JavaScriptConstantTask constantCompilerTask; | 631 JavaScriptConstantTask constantCompilerTask; |
623 | 632 |
624 JavaScriptResolutionCallbacks resolutionCallbacks; | 633 JavaScriptResolutionCallbacks resolutionCallbacks; |
625 | 634 |
626 PatchResolverTask patchResolverTask; | 635 PatchResolverTask patchResolverTask; |
627 | 636 |
628 bool enabledNoSuchMethod = false; | 637 bool enabledNoSuchMethod = false; |
(...skipping 20 matching lines...) Expand all Loading... |
649 : const StartEndSourceInformationStrategy()) | 658 : const StartEndSourceInformationStrategy()) |
650 : const JavaScriptSourceInformationStrategy(), | 659 : const JavaScriptSourceInformationStrategy(), |
651 helpers = new BackendHelpers(compiler), | 660 helpers = new BackendHelpers(compiler), |
652 impacts = new BackendImpacts(compiler), | 661 impacts = new BackendImpacts(compiler), |
653 super(compiler) { | 662 super(compiler) { |
654 emitter = new CodeEmitterTask( | 663 emitter = new CodeEmitterTask( |
655 compiler, namer, generateSourceMap, useStartupEmitter); | 664 compiler, namer, generateSourceMap, useStartupEmitter); |
656 typeVariableHandler = new TypeVariableHandler(compiler); | 665 typeVariableHandler = new TypeVariableHandler(compiler); |
657 customElementsAnalysis = new CustomElementsAnalysis(this); | 666 customElementsAnalysis = new CustomElementsAnalysis(this); |
658 lookupMapAnalysis = new LookupMapAnalysis(this, reporter); | 667 lookupMapAnalysis = new LookupMapAnalysis(this, reporter); |
| 668 jsInteropAnalysis = new JsInteropAnalysis(this); |
| 669 |
659 noSuchMethodRegistry = new NoSuchMethodRegistry(this); | 670 noSuchMethodRegistry = new NoSuchMethodRegistry(this); |
660 constantCompilerTask = new JavaScriptConstantTask(compiler); | 671 constantCompilerTask = new JavaScriptConstantTask(compiler); |
661 resolutionCallbacks = new JavaScriptResolutionCallbacks(this); | 672 resolutionCallbacks = new JavaScriptResolutionCallbacks(this); |
662 patchResolverTask = new PatchResolverTask(compiler); | 673 patchResolverTask = new PatchResolverTask(compiler); |
663 functionCompiler = compiler.useCpsIr | 674 functionCompiler = compiler.useCpsIr |
664 ? new CpsFunctionCompiler( | 675 ? new CpsFunctionCompiler( |
665 compiler, this, sourceInformationStrategy) | 676 compiler, this, sourceInformationStrategy) |
666 : new SsaFunctionCompiler(this, sourceInformationStrategy); | 677 : new SsaFunctionCompiler(this, sourceInformationStrategy); |
667 } | 678 } |
668 | 679 |
669 ConstantSystem get constantSystem => constants.constantSystem; | 680 ConstantSystem get constantSystem => constants.constantSystem; |
670 | 681 |
671 DiagnosticReporter get reporter => compiler.reporter; | 682 DiagnosticReporter get reporter => compiler.reporter; |
672 | 683 |
673 Resolution get resolution => compiler.resolution; | 684 Resolution get resolution => compiler.resolution; |
674 | 685 |
675 /// Returns constant environment for the JavaScript interpretation of the | 686 /// Returns constant environment for the JavaScript interpretation of the |
676 /// constants. | 687 /// constants. |
677 JavaScriptConstantCompiler get constants { | 688 JavaScriptConstantCompiler get constants { |
678 return constantCompilerTask.jsConstantCompiler; | 689 return constantCompilerTask.jsConstantCompiler; |
679 } | 690 } |
680 | 691 |
681 FunctionElement resolveExternalFunction(FunctionElement element) { | 692 FunctionElement resolveExternalFunction(FunctionElement element) { |
682 if (isForeign(element)) return element; | 693 if (isForeign(element) || element.isJsInterop) return element; |
683 return patchResolverTask.measure(() { | 694 return patchResolverTask.measure(() { |
684 return patchResolverTask.resolveExternalFunction(element); | 695 return patchResolverTask.resolveExternalFunction(element); |
685 }); | 696 }); |
686 } | 697 } |
687 | 698 |
688 // TODO(karlklose): Split into findHelperFunction and findHelperClass and | 699 // TODO(karlklose): Split into findHelperFunction and findHelperClass and |
689 // add a check that the element has the expected kind. | 700 // add a check that the element has the expected kind. |
690 Element findHelper(String name) => find(jsHelperLibrary, name); | 701 Element findHelper(String name) => find(jsHelperLibrary, name); |
691 Element findAsyncHelper(String name) => find(asyncLibrary, name); | 702 Element findAsyncHelper(String name) => find(asyncLibrary, name); |
692 Element findInterceptor(String name) => find(interceptorsLibrary, name); | 703 Element findInterceptor(String name) => find(interceptorsLibrary, name); |
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1075 enqueueClass(enqueuer, mapLiteralClass, registry); | 1086 enqueueClass(enqueuer, mapLiteralClass, registry); |
1076 // For map literals, the dependency between the implementation class | 1087 // For map literals, the dependency between the implementation class |
1077 // and [Map] is not visible, so we have to add it manually. | 1088 // and [Map] is not visible, so we have to add it manually. |
1078 rti.registerRtiDependency(mapLiteralClass, cls); | 1089 rti.registerRtiDependency(mapLiteralClass, cls); |
1079 } else if (cls == boundClosureClass) { | 1090 } else if (cls == boundClosureClass) { |
1080 // TODO(johnniwinther): Is this a noop? | 1091 // TODO(johnniwinther): Is this a noop? |
1081 enqueueClass(enqueuer, boundClosureClass, registry); | 1092 enqueueClass(enqueuer, boundClosureClass, registry); |
1082 } else if (Elements.isNativeOrExtendsNative(cls)) { | 1093 } else if (Elements.isNativeOrExtendsNative(cls)) { |
1083 enqueue(enqueuer, getNativeInterceptorMethod, registry); | 1094 enqueue(enqueuer, getNativeInterceptorMethod, registry); |
1084 enqueueClass(enqueuer, jsInterceptorClass, compiler.globalDependencies); | 1095 enqueueClass(enqueuer, jsInterceptorClass, compiler.globalDependencies); |
| 1096 enqueueClass(enqueuer, jsJavaScriptObjectClass, registry); |
1085 enqueueClass(enqueuer, jsPlainJavaScriptObjectClass, registry); | 1097 enqueueClass(enqueuer, jsPlainJavaScriptObjectClass, registry); |
| 1098 enqueueClass(enqueuer, jsJavaScriptFunctionClass, registry); |
1086 } else if (cls == mapLiteralClass) { | 1099 } else if (cls == mapLiteralClass) { |
1087 // For map literals, the dependency between the implementation class | 1100 // For map literals, the dependency between the implementation class |
1088 // and [Map] is not visible, so we have to add it manually. | 1101 // and [Map] is not visible, so we have to add it manually. |
1089 Element getFactory(String name, int arity) { | 1102 Element getFactory(String name, int arity) { |
1090 // The constructor is on the patch class, but dart2js unit tests don't | 1103 // The constructor is on the patch class, but dart2js unit tests don't |
1091 // have a patch class. | 1104 // have a patch class. |
1092 ClassElement implementation = cls.patch != null ? cls.patch : cls; | 1105 ClassElement implementation = cls.patch != null ? cls.patch : cls; |
1093 ConstructorElement ctor = implementation.lookupConstructor(name); | 1106 ConstructorElement ctor = implementation.lookupConstructor(name); |
1094 if (ctor == null | 1107 if (ctor == null |
1095 || (Name.isPrivateName(name) | 1108 || (Name.isPrivateName(name) |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1152 addInterceptors(jsBoolClass, enqueuer, registry); | 1165 addInterceptors(jsBoolClass, enqueuer, registry); |
1153 } else if (cls == compiler.nullClass || cls == jsNullClass) { | 1166 } else if (cls == compiler.nullClass || cls == jsNullClass) { |
1154 addInterceptors(jsNullClass, enqueuer, registry); | 1167 addInterceptors(jsNullClass, enqueuer, registry); |
1155 } else if (cls == compiler.numClass || cls == jsNumberClass) { | 1168 } else if (cls == compiler.numClass || cls == jsNumberClass) { |
1156 addInterceptors(jsIntClass, enqueuer, registry); | 1169 addInterceptors(jsIntClass, enqueuer, registry); |
1157 addInterceptors(jsPositiveIntClass, enqueuer, registry); | 1170 addInterceptors(jsPositiveIntClass, enqueuer, registry); |
1158 addInterceptors(jsUInt32Class, enqueuer, registry); | 1171 addInterceptors(jsUInt32Class, enqueuer, registry); |
1159 addInterceptors(jsUInt31Class, enqueuer, registry); | 1172 addInterceptors(jsUInt31Class, enqueuer, registry); |
1160 addInterceptors(jsDoubleClass, enqueuer, registry); | 1173 addInterceptors(jsDoubleClass, enqueuer, registry); |
1161 addInterceptors(jsNumberClass, enqueuer, registry); | 1174 addInterceptors(jsNumberClass, enqueuer, registry); |
| 1175 } else if (cls == jsJavaScriptObjectClass) { |
| 1176 addInterceptors(jsJavaScriptObjectClass, enqueuer, registry); |
1162 } else if (cls == jsPlainJavaScriptObjectClass) { | 1177 } else if (cls == jsPlainJavaScriptObjectClass) { |
1163 addInterceptors(jsPlainJavaScriptObjectClass, enqueuer, registry); | 1178 addInterceptors(jsPlainJavaScriptObjectClass, enqueuer, registry); |
1164 } else if (cls == jsUnknownJavaScriptObjectClass) { | 1179 } else if (cls == jsUnknownJavaScriptObjectClass) { |
1165 addInterceptors(jsUnknownJavaScriptObjectClass, enqueuer, registry); | 1180 addInterceptors(jsUnknownJavaScriptObjectClass, enqueuer, registry); |
| 1181 } else if (cls == jsJavaScriptFunctionClass) { |
| 1182 addInterceptors(jsJavaScriptFunctionClass, enqueuer, registry); |
1166 } else if (Elements.isNativeOrExtendsNative(cls)) { | 1183 } else if (Elements.isNativeOrExtendsNative(cls)) { |
1167 addInterceptorsForNativeClassMembers(cls, enqueuer); | 1184 addInterceptorsForNativeClassMembers(cls, enqueuer); |
1168 } else if (cls == jsIndexingBehaviorInterface) { | 1185 } else if (cls == jsIndexingBehaviorInterface) { |
1169 // These two helpers are used by the emitter and the codegen. | 1186 // These two helpers are used by the emitter and the codegen. |
1170 // Because we cannot enqueue elements at the time of emission, | 1187 // Because we cannot enqueue elements at the time of emission, |
1171 // we make sure they are always generated. | 1188 // we make sure they are always generated. |
1172 enqueue(enqueuer, findHelper('isJsIndexable'), registry); | 1189 enqueue(enqueuer, findHelper('isJsIndexable'), registry); |
1173 } | 1190 } |
1174 | 1191 |
1175 customElementsAnalysis.registerInstantiatedClass(cls, enqueuer); | 1192 customElementsAnalysis.registerInstantiatedClass(cls, enqueuer); |
1176 if (!enqueuer.isResolutionQueue) { | 1193 if (!enqueuer.isResolutionQueue) { |
1177 lookupMapAnalysis.registerInstantiatedClass(cls); | 1194 lookupMapAnalysis.registerInstantiatedClass(cls); |
1178 } | 1195 } |
1179 } | 1196 } |
1180 | 1197 |
1181 void registerInstantiatedType(InterfaceType type, | 1198 void registerInstantiatedType(InterfaceType type, |
1182 Enqueuer enqueuer, | 1199 Enqueuer enqueuer, |
1183 Registry registry, | 1200 Registry registry, |
1184 {bool mirrorUsage: false}) { | 1201 {bool mirrorUsage: false}) { |
1185 lookupMapAnalysis.registerInstantiatedType(type, registry); | 1202 lookupMapAnalysis.registerInstantiatedType(type, registry); |
1186 super.registerInstantiatedType( | 1203 super.registerInstantiatedType( |
1187 type, enqueuer, registry, mirrorUsage: mirrorUsage); | 1204 type, enqueuer, registry, mirrorUsage: mirrorUsage); |
1188 } | 1205 } |
1189 | 1206 |
1190 void registerUseInterceptor(Enqueuer enqueuer) { | 1207 void registerUseInterceptor(Enqueuer enqueuer) { |
1191 assert(!enqueuer.isResolutionQueue); | 1208 assert(!enqueuer.isResolutionQueue); |
1192 if (!enqueuer.nativeEnqueuer.hasInstantiatedNativeClasses()) return; | 1209 if (!enqueuer.nativeEnqueuer.hasInstantiatedNativeClasses()) return; |
1193 Registry registry = compiler.globalDependencies; | 1210 Registry registry = compiler.globalDependencies; |
1194 enqueue(enqueuer, getNativeInterceptorMethod, registry); | 1211 enqueue(enqueuer, getNativeInterceptorMethod, registry); |
| 1212 enqueueClass(enqueuer, jsJavaScriptObjectClass, registry); |
1195 enqueueClass(enqueuer, jsPlainJavaScriptObjectClass, registry); | 1213 enqueueClass(enqueuer, jsPlainJavaScriptObjectClass, registry); |
| 1214 enqueueClass(enqueuer, jsJavaScriptFunctionClass, registry); |
1196 needToInitializeIsolateAffinityTag = true; | 1215 needToInitializeIsolateAffinityTag = true; |
1197 needToInitializeDispatchProperty = true; | 1216 needToInitializeDispatchProperty = true; |
1198 } | 1217 } |
1199 | 1218 |
1200 JavaScriptItemCompilationContext createItemCompilationContext() { | 1219 JavaScriptItemCompilationContext createItemCompilationContext() { |
1201 return new JavaScriptItemCompilationContext(); | 1220 return new JavaScriptItemCompilationContext(); |
1202 } | 1221 } |
1203 | 1222 |
1204 void enqueueHelpers(ResolutionEnqueuer world, Registry registry) { | 1223 void enqueueHelpers(ResolutionEnqueuer world, Registry registry) { |
1205 assert(interceptorsLibrary != null); | 1224 assert(interceptorsLibrary != null); |
(...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1577 | 1596 |
1578 native.NativeEnqueuer nativeResolutionEnqueuer(Enqueuer world) { | 1597 native.NativeEnqueuer nativeResolutionEnqueuer(Enqueuer world) { |
1579 return new native.NativeResolutionEnqueuer(world, compiler); | 1598 return new native.NativeResolutionEnqueuer(world, compiler); |
1580 } | 1599 } |
1581 | 1600 |
1582 native.NativeEnqueuer nativeCodegenEnqueuer(Enqueuer world) { | 1601 native.NativeEnqueuer nativeCodegenEnqueuer(Enqueuer world) { |
1583 return new native.NativeCodegenEnqueuer(world, compiler, emitter); | 1602 return new native.NativeCodegenEnqueuer(world, compiler, emitter); |
1584 } | 1603 } |
1585 | 1604 |
1586 ClassElement defaultSuperclass(ClassElement element) { | 1605 ClassElement defaultSuperclass(ClassElement element) { |
| 1606 if (element.isJsInterop) return jsJavaScriptObjectClass; |
1587 // Native classes inherit from Interceptor. | 1607 // Native classes inherit from Interceptor. |
1588 return element.isNative ? jsInterceptorClass : compiler.objectClass; | 1608 return element.isNative ? jsInterceptorClass : compiler.objectClass; |
1589 } | 1609 } |
1590 | 1610 |
1591 /** | 1611 /** |
1592 * Unit test hook that returns code of an element as a String. | 1612 * Unit test hook that returns code of an element as a String. |
1593 * | 1613 * |
1594 * Invariant: [element] must be a declaration element. | 1614 * Invariant: [element] must be a declaration element. |
1595 */ | 1615 */ |
1596 String getGeneratedCode(Element element) { | 1616 String getGeneratedCode(Element element) { |
(...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1993 jsUInt31Class = findClass('JSUInt31'); | 2013 jsUInt31Class = findClass('JSUInt31'); |
1994 jsDoubleClass = findClass('JSDouble'); | 2014 jsDoubleClass = findClass('JSDouble'); |
1995 jsNumberClass = findClass('JSNumber'); | 2015 jsNumberClass = findClass('JSNumber'); |
1996 jsNullClass = findClass('JSNull'); | 2016 jsNullClass = findClass('JSNull'); |
1997 jsBoolClass = findClass('JSBool'); | 2017 jsBoolClass = findClass('JSBool'); |
1998 jsMutableArrayClass = findClass('JSMutableArray'); | 2018 jsMutableArrayClass = findClass('JSMutableArray'); |
1999 jsFixedArrayClass = findClass('JSFixedArray'); | 2019 jsFixedArrayClass = findClass('JSFixedArray'); |
2000 jsExtendableArrayClass = findClass('JSExtendableArray'); | 2020 jsExtendableArrayClass = findClass('JSExtendableArray'); |
2001 jsUnmodifiableArrayClass = findClass('JSUnmodifiableArray'); | 2021 jsUnmodifiableArrayClass = findClass('JSUnmodifiableArray'); |
2002 jsPlainJavaScriptObjectClass = findClass('PlainJavaScriptObject'); | 2022 jsPlainJavaScriptObjectClass = findClass('PlainJavaScriptObject'); |
| 2023 jsJavaScriptObjectClass = findClass('JavaScriptObject'); |
| 2024 jsJavaScriptFunctionClass = findClass('JavaScriptFunction'); |
2003 jsUnknownJavaScriptObjectClass = findClass('UnknownJavaScriptObject'); | 2025 jsUnknownJavaScriptObjectClass = findClass('UnknownJavaScriptObject'); |
2004 jsIndexableClass = findClass('JSIndexable'); | 2026 jsIndexableClass = findClass('JSIndexable'); |
2005 jsMutableIndexableClass = findClass('JSMutableIndexable'); | 2027 jsMutableIndexableClass = findClass('JSMutableIndexable'); |
2006 } else if (uri == DART_JS_HELPER) { | 2028 } else if (uri == DART_JS_HELPER) { |
2007 initializeHelperClasses(); | 2029 initializeHelperClasses(); |
2008 helpers.assertTest = findHelper('assertTest'); | 2030 helpers.assertTest = findHelper('assertTest'); |
2009 helpers.assertThrow = findHelper('assertThrow'); | 2031 helpers.assertThrow = findHelper('assertThrow'); |
2010 helpers.assertHelper = findHelper('assertHelper'); | 2032 helpers.assertHelper = findHelper('assertHelper'); |
2011 assertUnreachableMethod = findHelper('assertUnreachable'); | 2033 assertUnreachableMethod = findHelper('assertUnreachable'); |
2012 | 2034 |
(...skipping 22 matching lines...) Expand all Loading... |
2035 } else if (uri == DART_EMBEDDED_NAMES) { | 2057 } else if (uri == DART_EMBEDDED_NAMES) { |
2036 jsGetNameEnum = find(library, 'JsGetName'); | 2058 jsGetNameEnum = find(library, 'JsGetName'); |
2037 jsBuiltinEnum = find(library, 'JsBuiltin'); | 2059 jsBuiltinEnum = find(library, 'JsBuiltin'); |
2038 } else if (uri == Uris.dart_html) { | 2060 } else if (uri == Uris.dart_html) { |
2039 htmlLibraryIsLoaded = true; | 2061 htmlLibraryIsLoaded = true; |
2040 } else if (uri == PACKAGE_LOOKUP_MAP) { | 2062 } else if (uri == PACKAGE_LOOKUP_MAP) { |
2041 lookupMapAnalysis.init(library); | 2063 lookupMapAnalysis.init(library); |
2042 } else if (uri == Uris.dart__native_typed_data) { | 2064 } else if (uri == Uris.dart__native_typed_data) { |
2043 typedArrayClass = findClass('NativeTypedArray'); | 2065 typedArrayClass = findClass('NativeTypedArray'); |
2044 typedArrayOfIntClass = findClass('NativeTypedArrayOfInt'); | 2066 typedArrayOfIntClass = findClass('NativeTypedArrayOfInt'); |
| 2067 } else if (uri == PACKAGE_JS) { |
| 2068 jsAnnotationClass = find(library, 'Js'); |
2045 } | 2069 } |
2046 annotations.onLibraryScanned(library); | 2070 annotations.onLibraryScanned(library); |
2047 }); | 2071 }); |
2048 } | 2072 } |
2049 | 2073 |
2050 Future onLibrariesLoaded(LoadedLibraries loadedLibraries) { | 2074 Future onLibrariesLoaded(LoadedLibraries loadedLibraries) { |
2051 if (!loadedLibraries.containsLibrary(Uris.dart_core)) { | 2075 if (!loadedLibraries.containsLibrary(Uris.dart_core)) { |
2052 return new Future.value(); | 2076 return new Future.value(); |
2053 } | 2077 } |
2054 | 2078 |
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2489 addForEmission: false); | 2513 addForEmission: false); |
2490 } | 2514 } |
2491 metadataConstants.clear(); | 2515 metadataConstants.clear(); |
2492 } | 2516 } |
2493 } | 2517 } |
2494 return true; | 2518 return true; |
2495 } | 2519 } |
2496 | 2520 |
2497 void onQueueClosed() { | 2521 void onQueueClosed() { |
2498 lookupMapAnalysis.onQueueClosed(); | 2522 lookupMapAnalysis.onQueueClosed(); |
| 2523 jsInteropAnalysis.onQueueClosed(); |
2499 } | 2524 } |
2500 | 2525 |
2501 void onCodegenStart() { | 2526 void onCodegenStart() { |
2502 lookupMapAnalysis.onCodegenStart(); | 2527 lookupMapAnalysis.onCodegenStart(); |
2503 } | 2528 } |
2504 | 2529 |
2505 void onElementResolved(Element element, TreeElements elements) { | 2530 void onElementResolved(Element element, TreeElements elements) { |
2506 if ((element.isFunction || element.isGenerativeConstructor) && | 2531 if ((element.isFunction || element.isGenerativeConstructor) && |
2507 annotations.noInline(element)) { | 2532 annotations.noInline(element)) { |
2508 inlineCache.markAsNonInlinable(element); | 2533 inlineCache.markAsNonInlinable(element); |
(...skipping 508 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3017 } | 3042 } |
3018 | 3043 |
3019 /// Records that [constant] is used by the element behind [registry]. | 3044 /// Records that [constant] is used by the element behind [registry]. |
3020 class Dependency { | 3045 class Dependency { |
3021 final ConstantValue constant; | 3046 final ConstantValue constant; |
3022 final Element annotatedElement; | 3047 final Element annotatedElement; |
3023 | 3048 |
3024 const Dependency(this.constant, this.annotatedElement); | 3049 const Dependency(this.constant, this.annotatedElement); |
3025 } | 3050 } |
3026 | 3051 |
OLD | NEW |