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

Side by Side Diff: sdk/lib/_internal/compiler/implementation/js_backend/backend.dart

Issue 15026006: Support for extending native classes (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 4 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 | Annotate | Revision Log
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 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 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 203
204 /**
205 * This element is a top-level variable (in generated output) that the
206 * compiler initializes to a datastructure used to map from a Type to the
207 * interceptor. See declaration of `mapTypeToInterceptor` in
208 * `interceptors.dart`.
209 */
210 Element mapTypeToInterceptor;
211
204 HType stringType; 212 HType stringType;
205 HType indexablePrimitiveType; 213 HType indexablePrimitiveType;
206 HType readableArrayType; 214 HType readableArrayType;
207 HType mutableArrayType; 215 HType mutableArrayType;
208 HType fixedArrayType; 216 HType fixedArrayType;
209 HType extendableArrayType; 217 HType extendableArrayType;
210 218
211 // TODO(9577): Make it so that these are not needed when there are no native 219 // TODO(9577): Make it so that these are not needed when there are no native
212 // classes. 220 // classes.
213 Element dispatchPropertyName; 221 Element dispatchPropertyName;
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 } 357 }
350 358
351 static Namer determineNamer(Compiler compiler) { 359 static Namer determineNamer(Compiler compiler) {
352 return compiler.enableMinification ? 360 return compiler.enableMinification ?
353 new MinifyNamer(compiler) : 361 new MinifyNamer(compiler) :
354 new Namer(compiler); 362 new Namer(compiler);
355 } 363 }
356 364
357 bool isInterceptorClass(ClassElement element) { 365 bool isInterceptorClass(ClassElement element) {
358 if (element == null) return false; 366 if (element == null) return false;
359 if (element.isNative()) return true; 367 if (Elements.isNativeOrExtendsNative(element)) return true;
360 if (interceptedClasses.contains(element)) return true; 368 if (interceptedClasses.contains(element)) return true;
361 if (classesMixedIntoNativeClasses.contains(element)) return true; 369 if (classesMixedIntoNativeClasses.contains(element)) return true;
362 return false; 370 return false;
363 } 371 }
364 372
365 String registerOneShotInterceptor(Selector selector) { 373 String registerOneShotInterceptor(Selector selector) {
366 Set<ClassElement> classes = getInterceptedClassesOn(selector.name); 374 Set<ClassElement> classes = getInterceptedClassesOn(selector.name);
367 String name = namer.getOneShotInterceptorName(selector, classes); 375 String name = namer.getOneShotInterceptorName(selector, classes);
368 if (!oneShotInterceptors.containsKey(name)) { 376 if (!oneShotInterceptors.containsKey(name)) {
369 registerSpecializedGetInterceptor(classes); 377 registerSpecializedGetInterceptor(classes);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
405 */ 413 */
406 Set<ClassElement> getInterceptedClassesOn(SourceString name) { 414 Set<ClassElement> getInterceptedClassesOn(SourceString name) {
407 Set<Element> intercepted = interceptedElements[name]; 415 Set<Element> intercepted = interceptedElements[name];
408 if (intercepted == null) return null; 416 if (intercepted == null) return null;
409 return interceptedClassesCache.putIfAbsent(name, () { 417 return interceptedClassesCache.putIfAbsent(name, () {
410 // Populate the cache by running through all the elements and 418 // Populate the cache by running through all the elements and
411 // determine if the given selector applies to them. 419 // determine if the given selector applies to them.
412 Set<ClassElement> result = new Set<ClassElement>(); 420 Set<ClassElement> result = new Set<ClassElement>();
413 for (Element element in intercepted) { 421 for (Element element in intercepted) {
414 ClassElement classElement = element.getEnclosingClass(); 422 ClassElement classElement = element.getEnclosingClass();
415 if (classElement.isNative() 423 if (Elements.isNativeOrExtendsNative(classElement)
416 || interceptedClasses.contains(classElement)) { 424 || interceptedClasses.contains(classElement)) {
417 result.add(classElement); 425 result.add(classElement);
418 } 426 }
419 if (classesMixedIntoNativeClasses.contains(classElement)) { 427 if (classesMixedIntoNativeClasses.contains(classElement)) {
420 Set<ClassElement> nativeSubclasses = 428 Set<ClassElement> nativeSubclasses =
421 nativeSubclassesOfMixin(classElement); 429 nativeSubclassesOfMixin(classElement);
422 if (nativeSubclasses != null) result.addAll(nativeSubclasses); 430 if (nativeSubclasses != null) result.addAll(nativeSubclasses);
423 } 431 }
424 } 432 }
425 return result; 433 return result;
(...skipping 21 matching lines...) Expand all
447 bool operatorEqHandlesNullArgument(FunctionElement operatorEqfunction) { 455 bool operatorEqHandlesNullArgument(FunctionElement operatorEqfunction) {
448 return specialOperatorEqClasses.contains( 456 return specialOperatorEqClasses.contains(
449 operatorEqfunction.getEnclosingClass()); 457 operatorEqfunction.getEnclosingClass());
450 } 458 }
451 459
452 void initializeHelperClasses() { 460 void initializeHelperClasses() {
453 getInterceptorMethod = 461 getInterceptorMethod =
454 compiler.findInterceptor(const SourceString('getInterceptor')); 462 compiler.findInterceptor(const SourceString('getInterceptor'));
455 interceptedNames = 463 interceptedNames =
456 compiler.findInterceptor(const SourceString('interceptedNames')); 464 compiler.findInterceptor(const SourceString('interceptedNames'));
465 mapTypeToInterceptor =
466 compiler.findInterceptor(const SourceString('mapTypeToInterceptor'));
457 dispatchPropertyName = 467 dispatchPropertyName =
458 compiler.findInterceptor(const SourceString('dispatchPropertyName')); 468 compiler.findInterceptor(const SourceString('dispatchPropertyName'));
459 getDispatchPropertyMethod = 469 getDispatchPropertyMethod =
460 compiler.findInterceptor(const SourceString('getDispatchProperty')); 470 compiler.findInterceptor(const SourceString('getDispatchProperty'));
461 setDispatchPropertyMethod = 471 setDispatchPropertyMethod =
462 compiler.findInterceptor(const SourceString('setDispatchProperty')); 472 compiler.findInterceptor(const SourceString('setDispatchProperty'));
463 getNativeInterceptorMethod = 473 getNativeInterceptorMethod =
464 compiler.findInterceptor(const SourceString('getNativeInterceptor')); 474 compiler.findInterceptor(const SourceString('getNativeInterceptor'));
465 initializeDispatchPropertyMethod = 475 initializeDispatchPropertyMethod =
466 compiler.findInterceptor( 476 compiler.findInterceptor(
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
587 if (enqueuer.isResolutionQueue) { 597 if (enqueuer.isResolutionQueue) {
588 cls.ensureResolved(compiler); 598 cls.ensureResolved(compiler);
589 cls.forEachMember((ClassElement classElement, Element member) { 599 cls.forEachMember((ClassElement classElement, Element member) {
590 if (member.isSynthesized) return; 600 if (member.isSynthesized) return;
591 // All methods on [Object] are shadowed by [Interceptor]. 601 // All methods on [Object] are shadowed by [Interceptor].
592 if (classElement == compiler.objectClass) return; 602 if (classElement == compiler.objectClass) return;
593 Set<Element> set = interceptedElements.putIfAbsent( 603 Set<Element> set = interceptedElements.putIfAbsent(
594 member.name, () => new Set<Element>()); 604 member.name, () => new Set<Element>());
595 set.add(member); 605 set.add(member);
596 if (classElement == jsInterceptorClass) return; 606 if (classElement == jsInterceptorClass) return;
597 if (!classElement.isNative()) { 607 if (classElement.isMixinApplication) {
598 MixinApplicationElement mixinApplication = classElement; 608 MixinApplicationElement mixinApplication = classElement;
599 assert(member.getEnclosingClass() == mixinApplication.mixin); 609 assert(member.getEnclosingClass() == mixinApplication.mixin);
600 classesMixedIntoNativeClasses.add(mixinApplication.mixin); 610 classesMixedIntoNativeClasses.add(mixinApplication.mixin);
601 } 611 }
602 }, 612 },
603 includeSuperAndInjectedMembers: true); 613 includeSuperAndInjectedMembers: true);
604 } 614 }
605 } 615 }
606 616
607 void addInterceptors(ClassElement cls, 617 void addInterceptors(ClassElement cls,
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
696 } else if (cls == compiler.nullClass || cls == jsNullClass) { 706 } else if (cls == compiler.nullClass || cls == jsNullClass) {
697 addInterceptors(jsNullClass, enqueuer, elements); 707 addInterceptors(jsNullClass, enqueuer, elements);
698 } else if (cls == compiler.numClass || cls == jsNumberClass) { 708 } else if (cls == compiler.numClass || cls == jsNumberClass) {
699 addInterceptors(jsIntClass, enqueuer, elements); 709 addInterceptors(jsIntClass, enqueuer, elements);
700 addInterceptors(jsDoubleClass, enqueuer, elements); 710 addInterceptors(jsDoubleClass, enqueuer, elements);
701 addInterceptors(jsNumberClass, enqueuer, elements); 711 addInterceptors(jsNumberClass, enqueuer, elements);
702 } else if (cls == jsPlainJavaScriptObjectClass) { 712 } else if (cls == jsPlainJavaScriptObjectClass) {
703 addInterceptors(jsPlainJavaScriptObjectClass, enqueuer, elements); 713 addInterceptors(jsPlainJavaScriptObjectClass, enqueuer, elements);
704 } else if (cls == jsUnknownJavaScriptObjectClass) { 714 } else if (cls == jsUnknownJavaScriptObjectClass) {
705 addInterceptors(jsUnknownJavaScriptObjectClass, enqueuer, elements); 715 addInterceptors(jsUnknownJavaScriptObjectClass, enqueuer, elements);
706 } else if (cls.isNative()) { 716 } else if (Elements.isNativeOrExtendsNative(cls)) {
707 addInterceptorsForNativeClassMembers(cls, enqueuer); 717 addInterceptorsForNativeClassMembers(cls, enqueuer);
708 } 718 }
709 } 719 }
710 720
711 void registerUseInterceptor(Enqueuer enqueuer) { 721 void registerUseInterceptor(Enqueuer enqueuer) {
712 assert(!enqueuer.isResolutionQueue); 722 assert(!enqueuer.isResolutionQueue);
713 if (!enqueuer.nativeEnqueuer.hasInstantiatedNativeClasses()) return; 723 if (!enqueuer.nativeEnqueuer.hasInstantiatedNativeClasses()) return;
714 enqueuer.registerStaticUse(getNativeInterceptorMethod); 724 enqueuer.registerStaticUse(getNativeInterceptorMethod);
715 enqueuer.registerStaticUse(defineNativeMethodsFinishMethod); 725 enqueuer.registerStaticUse(defineNativeMethodsFinishMethod);
716 enqueuer.registerStaticUse(initializeDispatchPropertyMethod); 726 enqueuer.registerStaticUse(initializeDispatchPropertyMethod);
(...skipping 860 matching lines...) Expand 10 before | Expand all | Expand 10 after
1577 copy(constant.values); 1587 copy(constant.values);
1578 copy(constant.protoValue); 1588 copy(constant.protoValue);
1579 copy(constant); 1589 copy(constant);
1580 } 1590 }
1581 1591
1582 void visitConstructed(ConstructedConstant constant) { 1592 void visitConstructed(ConstructedConstant constant) {
1583 copy(constant.fields); 1593 copy(constant.fields);
1584 copy(constant); 1594 copy(constant);
1585 } 1595 }
1586 } 1596 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698