| 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 class JavaScriptItemCompilationContext extends ItemCompilationContext { | 7 class JavaScriptItemCompilationContext extends ItemCompilationContext { |
| 8 final Set<HInstruction> boundsChecked; | 8 final Set<HInstruction> boundsChecked; |
| 9 | 9 |
| 10 JavaScriptItemCompilationContext() | 10 JavaScriptItemCompilationContext() |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 Element jsStringConcat; | 193 Element jsStringConcat; |
| 194 Element jsStringToString; | 194 Element jsStringToString; |
| 195 Element objectEquals; | 195 Element objectEquals; |
| 196 | 196 |
| 197 ClassElement typeLiteralClass; | 197 ClassElement typeLiteralClass; |
| 198 ClassElement mapLiteralClass; | 198 ClassElement mapLiteralClass; |
| 199 ClassElement constMapLiteralClass; | 199 ClassElement constMapLiteralClass; |
| 200 | 200 |
| 201 Element getInterceptorMethod; | 201 Element getInterceptorMethod; |
| 202 Element interceptedNames; | 202 Element interceptedNames; |
| 203 Element mapTypeToInterceptor; |
| 203 | 204 |
| 204 HType stringType; | 205 HType stringType; |
| 205 HType indexablePrimitiveType; | 206 HType indexablePrimitiveType; |
| 206 HType readableArrayType; | 207 HType readableArrayType; |
| 207 HType mutableArrayType; | 208 HType mutableArrayType; |
| 208 HType fixedArrayType; | 209 HType fixedArrayType; |
| 209 HType extendableArrayType; | 210 HType extendableArrayType; |
| 210 | 211 |
| 211 // TODO(9577): Make it so that these are not needed when there are no native | 212 // TODO(9577): Make it so that these are not needed when there are no native |
| 212 // classes. | 213 // classes. |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 349 } | 350 } |
| 350 | 351 |
| 351 static Namer determineNamer(Compiler compiler) { | 352 static Namer determineNamer(Compiler compiler) { |
| 352 return compiler.enableMinification ? | 353 return compiler.enableMinification ? |
| 353 new MinifyNamer(compiler) : | 354 new MinifyNamer(compiler) : |
| 354 new Namer(compiler); | 355 new Namer(compiler); |
| 355 } | 356 } |
| 356 | 357 |
| 357 bool isInterceptorClass(ClassElement element) { | 358 bool isInterceptorClass(ClassElement element) { |
| 358 if (element == null) return false; | 359 if (element == null) return false; |
| 359 if (element.isNative()) return true; | 360 if (Elements.isNativeOrExtendsNative(element)) return true; |
| 360 if (interceptedClasses.contains(element)) return true; | 361 if (interceptedClasses.contains(element)) return true; |
| 361 if (classesMixedIntoNativeClasses.contains(element)) return true; | 362 if (classesMixedIntoNativeClasses.contains(element)) return true; |
| 362 return false; | 363 return false; |
| 363 } | 364 } |
| 364 | 365 |
| 365 String registerOneShotInterceptor(Selector selector) { | 366 String registerOneShotInterceptor(Selector selector) { |
| 366 Set<ClassElement> classes = getInterceptedClassesOn(selector.name); | 367 Set<ClassElement> classes = getInterceptedClassesOn(selector.name); |
| 367 String name = namer.getOneShotInterceptorName(selector, classes); | 368 String name = namer.getOneShotInterceptorName(selector, classes); |
| 368 if (!oneShotInterceptors.containsKey(name)) { | 369 if (!oneShotInterceptors.containsKey(name)) { |
| 369 registerSpecializedGetInterceptor(classes); | 370 registerSpecializedGetInterceptor(classes); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 405 */ | 406 */ |
| 406 Set<ClassElement> getInterceptedClassesOn(SourceString name) { | 407 Set<ClassElement> getInterceptedClassesOn(SourceString name) { |
| 407 Set<Element> intercepted = interceptedElements[name]; | 408 Set<Element> intercepted = interceptedElements[name]; |
| 408 if (intercepted == null) return null; | 409 if (intercepted == null) return null; |
| 409 return interceptedClassesCache.putIfAbsent(name, () { | 410 return interceptedClassesCache.putIfAbsent(name, () { |
| 410 // Populate the cache by running through all the elements and | 411 // Populate the cache by running through all the elements and |
| 411 // determine if the given selector applies to them. | 412 // determine if the given selector applies to them. |
| 412 Set<ClassElement> result = new Set<ClassElement>(); | 413 Set<ClassElement> result = new Set<ClassElement>(); |
| 413 for (Element element in intercepted) { | 414 for (Element element in intercepted) { |
| 414 ClassElement classElement = element.getEnclosingClass(); | 415 ClassElement classElement = element.getEnclosingClass(); |
| 415 if (classElement.isNative() | 416 if (Elements.isNativeOrExtendsNative(classElement) |
| 416 || interceptedClasses.contains(classElement)) { | 417 || interceptedClasses.contains(classElement)) { |
| 417 result.add(classElement); | 418 result.add(classElement); |
| 418 } | 419 } |
| 419 if (classesMixedIntoNativeClasses.contains(classElement)) { | 420 if (classesMixedIntoNativeClasses.contains(classElement)) { |
| 420 Set<ClassElement> nativeSubclasses = | 421 Set<ClassElement> nativeSubclasses = |
| 421 nativeSubclassesOfMixin(classElement); | 422 nativeSubclassesOfMixin(classElement); |
| 422 if (nativeSubclasses != null) result.addAll(nativeSubclasses); | 423 if (nativeSubclasses != null) result.addAll(nativeSubclasses); |
| 423 } | 424 } |
| 424 } | 425 } |
| 425 return result; | 426 return result; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 447 bool operatorEqHandlesNullArgument(FunctionElement operatorEqfunction) { | 448 bool operatorEqHandlesNullArgument(FunctionElement operatorEqfunction) { |
| 448 return specialOperatorEqClasses.contains( | 449 return specialOperatorEqClasses.contains( |
| 449 operatorEqfunction.getEnclosingClass()); | 450 operatorEqfunction.getEnclosingClass()); |
| 450 } | 451 } |
| 451 | 452 |
| 452 void initializeHelperClasses() { | 453 void initializeHelperClasses() { |
| 453 getInterceptorMethod = | 454 getInterceptorMethod = |
| 454 compiler.findInterceptor(const SourceString('getInterceptor')); | 455 compiler.findInterceptor(const SourceString('getInterceptor')); |
| 455 interceptedNames = | 456 interceptedNames = |
| 456 compiler.findInterceptor(const SourceString('interceptedNames')); | 457 compiler.findInterceptor(const SourceString('interceptedNames')); |
| 458 mapTypeToInterceptor = |
| 459 compiler.findInterceptor(const SourceString('mapTypeToInterceptor')); |
| 457 dispatchPropertyName = | 460 dispatchPropertyName = |
| 458 compiler.findInterceptor(const SourceString('dispatchPropertyName')); | 461 compiler.findInterceptor(const SourceString('dispatchPropertyName')); |
| 459 getDispatchPropertyMethod = | 462 getDispatchPropertyMethod = |
| 460 compiler.findInterceptor(const SourceString('getDispatchProperty')); | 463 compiler.findInterceptor(const SourceString('getDispatchProperty')); |
| 461 setDispatchPropertyMethod = | 464 setDispatchPropertyMethod = |
| 462 compiler.findInterceptor(const SourceString('setDispatchProperty')); | 465 compiler.findInterceptor(const SourceString('setDispatchProperty')); |
| 463 getNativeInterceptorMethod = | 466 getNativeInterceptorMethod = |
| 464 compiler.findInterceptor(const SourceString('getNativeInterceptor')); | 467 compiler.findInterceptor(const SourceString('getNativeInterceptor')); |
| 465 initializeDispatchPropertyMethod = | 468 initializeDispatchPropertyMethod = |
| 466 compiler.findInterceptor( | 469 compiler.findInterceptor( |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 587 if (enqueuer.isResolutionQueue) { | 590 if (enqueuer.isResolutionQueue) { |
| 588 cls.ensureResolved(compiler); | 591 cls.ensureResolved(compiler); |
| 589 cls.forEachMember((ClassElement classElement, Element member) { | 592 cls.forEachMember((ClassElement classElement, Element member) { |
| 590 if (member.isSynthesized) return; | 593 if (member.isSynthesized) return; |
| 591 // All methods on [Object] are shadowed by [Interceptor]. | 594 // All methods on [Object] are shadowed by [Interceptor]. |
| 592 if (classElement == compiler.objectClass) return; | 595 if (classElement == compiler.objectClass) return; |
| 593 Set<Element> set = interceptedElements.putIfAbsent( | 596 Set<Element> set = interceptedElements.putIfAbsent( |
| 594 member.name, () => new Set<Element>()); | 597 member.name, () => new Set<Element>()); |
| 595 set.add(member); | 598 set.add(member); |
| 596 if (classElement == jsInterceptorClass) return; | 599 if (classElement == jsInterceptorClass) return; |
| 597 if (!classElement.isNative()) { | 600 if (classElement.isMixinApplication) { |
| 598 MixinApplicationElement mixinApplication = classElement; | 601 MixinApplicationElement mixinApplication = classElement; |
| 599 assert(member.getEnclosingClass() == mixinApplication.mixin); | 602 assert(member.getEnclosingClass() == mixinApplication.mixin); |
| 600 classesMixedIntoNativeClasses.add(mixinApplication.mixin); | 603 classesMixedIntoNativeClasses.add(mixinApplication.mixin); |
| 601 } | 604 } |
| 602 }, | 605 }, |
| 603 includeSuperAndInjectedMembers: true); | 606 includeSuperAndInjectedMembers: true); |
| 604 } | 607 } |
| 605 } | 608 } |
| 606 | 609 |
| 607 void addInterceptors(ClassElement cls, | 610 void addInterceptors(ClassElement cls, |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 696 } else if (cls == compiler.nullClass || cls == jsNullClass) { | 699 } else if (cls == compiler.nullClass || cls == jsNullClass) { |
| 697 addInterceptors(jsNullClass, enqueuer, elements); | 700 addInterceptors(jsNullClass, enqueuer, elements); |
| 698 } else if (cls == compiler.numClass || cls == jsNumberClass) { | 701 } else if (cls == compiler.numClass || cls == jsNumberClass) { |
| 699 addInterceptors(jsIntClass, enqueuer, elements); | 702 addInterceptors(jsIntClass, enqueuer, elements); |
| 700 addInterceptors(jsDoubleClass, enqueuer, elements); | 703 addInterceptors(jsDoubleClass, enqueuer, elements); |
| 701 addInterceptors(jsNumberClass, enqueuer, elements); | 704 addInterceptors(jsNumberClass, enqueuer, elements); |
| 702 } else if (cls == jsPlainJavaScriptObjectClass) { | 705 } else if (cls == jsPlainJavaScriptObjectClass) { |
| 703 addInterceptors(jsPlainJavaScriptObjectClass, enqueuer, elements); | 706 addInterceptors(jsPlainJavaScriptObjectClass, enqueuer, elements); |
| 704 } else if (cls == jsUnknownJavaScriptObjectClass) { | 707 } else if (cls == jsUnknownJavaScriptObjectClass) { |
| 705 addInterceptors(jsUnknownJavaScriptObjectClass, enqueuer, elements); | 708 addInterceptors(jsUnknownJavaScriptObjectClass, enqueuer, elements); |
| 706 } else if (cls.isNative()) { | 709 //} else if (cls.isNative()) { |
| 710 } else if (Elements.isNativeOrExtendsNative(cls)) { |
| 707 addInterceptorsForNativeClassMembers(cls, enqueuer); | 711 addInterceptorsForNativeClassMembers(cls, enqueuer); |
| 708 } | 712 } |
| 709 } | 713 } |
| 710 | 714 |
| 711 void registerUseInterceptor(Enqueuer enqueuer) { | 715 void registerUseInterceptor(Enqueuer enqueuer) { |
| 712 assert(!enqueuer.isResolutionQueue); | 716 assert(!enqueuer.isResolutionQueue); |
| 713 if (!enqueuer.nativeEnqueuer.hasInstantiatedNativeClasses()) return; | 717 if (!enqueuer.nativeEnqueuer.hasInstantiatedNativeClasses()) return; |
| 714 enqueuer.registerStaticUse(getNativeInterceptorMethod); | 718 enqueuer.registerStaticUse(getNativeInterceptorMethod); |
| 715 enqueuer.registerStaticUse(defineNativeMethodsFinishMethod); | 719 enqueuer.registerStaticUse(defineNativeMethodsFinishMethod); |
| 716 enqueuer.registerStaticUse(initializeDispatchPropertyMethod); | 720 enqueuer.registerStaticUse(initializeDispatchPropertyMethod); |
| (...skipping 800 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1517 } | 1521 } |
| 1518 } | 1522 } |
| 1519 | 1523 |
| 1520 /// Records that [type] is used by [user.element]. | 1524 /// Records that [type] is used by [user.element]. |
| 1521 class Dependency { | 1525 class Dependency { |
| 1522 final DartType type; | 1526 final DartType type; |
| 1523 final TreeElements user; | 1527 final TreeElements user; |
| 1524 | 1528 |
| 1525 const Dependency(this.type, this.user); | 1529 const Dependency(this.type, this.user); |
| 1526 } | 1530 } |
| OLD | NEW |