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

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

Issue 11348129: Add JSNumber, JSInt and JSDouble for the new interceptor scheme. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 1 month 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 typedef void Recompile(Element element); 7 typedef void Recompile(Element element);
8 8
9 class ReturnInfo { 9 class ReturnInfo {
10 HType returnType; 10 HType returnType;
(...skipping 630 matching lines...) Expand 10 before | Expand all | Expand 10 after
641 } 641 }
642 642
643 class JavaScriptBackend extends Backend { 643 class JavaScriptBackend extends Backend {
644 SsaBuilderTask builder; 644 SsaBuilderTask builder;
645 SsaOptimizerTask optimizer; 645 SsaOptimizerTask optimizer;
646 SsaCodeGeneratorTask generator; 646 SsaCodeGeneratorTask generator;
647 CodeEmitterTask emitter; 647 CodeEmitterTask emitter;
648 648
649 ClassElement jsStringClass; 649 ClassElement jsStringClass;
650 ClassElement jsArrayClass; 650 ClassElement jsArrayClass;
651 ClassElement jsNumberClass;
652 ClassElement jsIntClass;
653 ClassElement jsDoubleClass;
651 ClassElement objectInterceptorClass; 654 ClassElement objectInterceptorClass;
652 Element getInterceptorMethod; 655 Element getInterceptorMethod;
656 bool _interceptorsAreInitialized = false;
653 657
654 final Namer namer; 658 final Namer namer;
655 659
656 /** 660 /**
657 * Interface used to determine if an object has the JavaScript 661 * Interface used to determine if an object has the JavaScript
658 * indexing behavior. The interface is only visible to specific 662 * indexing behavior. The interface is only visible to specific
659 * libraries. 663 * libraries.
660 */ 664 */
661 ClassElement jsIndexingBehaviorInterface; 665 ClassElement jsIndexingBehaviorInterface;
662 666
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
710 } 714 }
711 715
712 static Namer determineNamer(Compiler compiler) { 716 static Namer determineNamer(Compiler compiler) {
713 return compiler.enableMinification ? 717 return compiler.enableMinification ?
714 new MinifyNamer(compiler) : 718 new MinifyNamer(compiler) :
715 new Namer(compiler); 719 new Namer(compiler);
716 } 720 }
717 721
718 bool isInterceptorClass(Element element) { 722 bool isInterceptorClass(Element element) {
719 if (element == null) return false; 723 if (element == null) return false;
720 return element == jsStringClass || element == jsArrayClass; 724 return element == jsStringClass
725 || element == jsArrayClass
726 || element == jsIntClass
727 || element == jsDoubleClass
728 || element == jsNumberClass;
721 } 729 }
722 730
723 void addInterceptedSelector(Selector selector) { 731 void addInterceptedSelector(Selector selector) {
724 usedInterceptors.add(selector); 732 usedInterceptors.add(selector);
725 } 733 }
726 734
727 bool shouldInterceptSelector(Selector selector) { 735 bool shouldInterceptSelector(Selector selector) {
728 List<Element> intercepted = interceptedElements[selector.name]; 736 List<Element> intercepted = interceptedElements[selector.name];
729 if (intercepted == null) return false; 737 if (intercepted == null) return false;
730 for (Element element in intercepted) { 738 for (Element element in intercepted) {
731 if (selector.applies(element, compiler)) return true; 739 if (selector.applies(element, compiler)) return true;
732 } 740 }
733 return false; 741 return false;
734 } 742 }
735 743
736 void initializeInterceptorElements() { 744 void initializeInterceptorElements() {
737 objectInterceptorClass = 745 objectInterceptorClass =
738 compiler.findInterceptor(const SourceString('ObjectInterceptor')); 746 compiler.findInterceptor(const SourceString('ObjectInterceptor'));
739 getInterceptorMethod = 747 getInterceptorMethod =
740 compiler.findInterceptor(const SourceString('getInterceptor')); 748 compiler.findInterceptor(const SourceString('getInterceptor'));
749 jsStringClass =
750 compiler.findInterceptor(const SourceString('JSString'));
751 jsArrayClass =
752 compiler.findInterceptor(const SourceString('JSArray'));
753 jsNumberClass =
754 compiler.findInterceptor(const SourceString('JSNumber'));
755 jsIntClass =
756 compiler.findInterceptor(const SourceString('JSInt'));
757 jsDoubleClass =
758 compiler.findInterceptor(const SourceString('JSDouble'));
741 } 759 }
742 760
761 void addInterceptors(ClassElement cls) {
762 cls.ensureResolved(compiler);
763 cls.forEachMember((ClassElement classElement, Element member) {
764 // TODO(ngeoffray): Support interceptors on Object methods.
765 if (classElement == compiler.objectClass) return;
766 List<Element> list = interceptedElements.putIfAbsent(
767 member.name, () => new List<Element>());
768 list.add(member);
769 }, includeSuperMembers: true);
770 }
743 771
744 void registerInstantiatedClass(ClassElement cls, Enqueuer enqueuer) { 772 void registerInstantiatedClass(ClassElement cls, Enqueuer enqueuer) {
745 ClassElement result = null; 773 ClassElement result = null;
774 if (!_interceptorsAreInitialized) {
775 initializeInterceptorElements();
776 _interceptorsAreInitialized = true;
777 }
746 if (cls == compiler.stringClass) { 778 if (cls == compiler.stringClass) {
747 if (jsStringClass == null) {
748 jsStringClass =
749 compiler.findInterceptor(const SourceString('JSString'));
750 initializeInterceptorElements();
751 }
752 result = jsStringClass; 779 result = jsStringClass;
753 } else if (cls == compiler.listClass) { 780 } else if (cls == compiler.listClass) {
754 if (jsArrayClass == null) {
755 jsArrayClass =
756 compiler.findInterceptor(const SourceString('JSArray'));
757 initializeInterceptorElements();
758 }
759 result = jsArrayClass; 781 result = jsArrayClass;
782 } else if (cls == compiler.intClass) {
783 result = jsIntClass;
784 } else if (cls == compiler.doubleClass) {
785 result = jsDoubleClass;
760 } 786 }
761 787
762 if (result == null) return; 788 if (result == null) return;
763 789 if (enqueuer.isResolutionQueue) addInterceptors(result);
764 result.forEachMember((_, Element member) {
765 List<Element> list = interceptedElements.putIfAbsent(
766 member.name, () => new List<Element>());
767 list.add(member);
768 });
769
770 enqueuer.registerInstantiatedClass(result); 790 enqueuer.registerInstantiatedClass(result);
771 } 791 }
772 792
773 Element get cyclicThrowHelper { 793 Element get cyclicThrowHelper {
774 return compiler.findHelper(const SourceString("throwCyclicInit")); 794 return compiler.findHelper(const SourceString("throwCyclicInit"));
775 } 795 }
776 796
777 JavaScriptItemCompilationContext createItemCompilationContext() { 797 JavaScriptItemCompilationContext createItemCompilationContext() {
778 return new JavaScriptItemCompilationContext(); 798 return new JavaScriptItemCompilationContext();
779 } 799 }
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
1036 print("Inferred return types:"); 1056 print("Inferred return types:");
1037 print("----------------------"); 1057 print("----------------------");
1038 dumpReturnTypes(); 1058 dumpReturnTypes();
1039 print(""); 1059 print("");
1040 print("Inferred field types:"); 1060 print("Inferred field types:");
1041 print("------------------------"); 1061 print("------------------------");
1042 fieldTypes.dump(); 1062 fieldTypes.dump();
1043 print(""); 1063 print("");
1044 } 1064 }
1045 } 1065 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698