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 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 Element jsArrayAdd; | 95 Element jsArrayAdd; |
96 Element jsStringSplit; | 96 Element jsStringSplit; |
97 Element jsStringToString; | 97 Element jsStringToString; |
98 Element jsStringOperatorAdd; | 98 Element jsStringOperatorAdd; |
99 Element objectEquals; | 99 Element objectEquals; |
100 | 100 |
101 ClassElement typeLiteralClass; | 101 ClassElement typeLiteralClass; |
102 ClassElement mapLiteralClass; | 102 ClassElement mapLiteralClass; |
103 ClassElement constMapLiteralClass; | 103 ClassElement constMapLiteralClass; |
104 ClassElement typeVariableClass; | 104 ClassElement typeVariableClass; |
| 105 Element mapLiteralConstructor; |
| 106 Element mapLiteralConstructorEmpty; |
105 | 107 |
106 ClassElement noSideEffectsClass; | 108 ClassElement noSideEffectsClass; |
107 ClassElement noThrowsClass; | 109 ClassElement noThrowsClass; |
108 ClassElement noInlineClass; | 110 ClassElement noInlineClass; |
109 ClassElement irRepresentationClass; | 111 ClassElement irRepresentationClass; |
110 | 112 |
111 Element getInterceptorMethod; | 113 Element getInterceptorMethod; |
112 Element interceptedNames; | 114 Element interceptedNames; |
113 | 115 |
114 /** | 116 /** |
(...skipping 606 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
721 } else if (cls == compiler.functionClass) { | 723 } else if (cls == compiler.functionClass) { |
722 enqueueClass(enqueuer, compiler.closureClass, elements); | 724 enqueueClass(enqueuer, compiler.closureClass, elements); |
723 } else if (cls == compiler.mapClass) { | 725 } else if (cls == compiler.mapClass) { |
724 // The backend will use a literal list to initialize the entries | 726 // The backend will use a literal list to initialize the entries |
725 // of the map. | 727 // of the map. |
726 enqueueClass(enqueuer, compiler.listClass, elements); | 728 enqueueClass(enqueuer, compiler.listClass, elements); |
727 enqueueClass(enqueuer, mapLiteralClass, elements); | 729 enqueueClass(enqueuer, mapLiteralClass, elements); |
728 // For map literals, the dependency between the implementation class | 730 // For map literals, the dependency between the implementation class |
729 // and [Map] is not visible, so we have to add it manually. | 731 // and [Map] is not visible, so we have to add it manually. |
730 rti.registerRtiDependency(mapLiteralClass, cls); | 732 rti.registerRtiDependency(mapLiteralClass, cls); |
731 enqueueInResolution(getMapMaker(), elements); | |
732 } else if (cls == compiler.boundClosureClass) { | 733 } else if (cls == compiler.boundClosureClass) { |
733 // TODO(ngeoffray): Move the bound closure class in the | 734 // TODO(ngeoffray): Move the bound closure class in the |
734 // backend. | 735 // backend. |
735 enqueueClass(enqueuer, compiler.boundClosureClass, elements); | 736 enqueueClass(enqueuer, compiler.boundClosureClass, elements); |
736 } else if (Elements.isNativeOrExtendsNative(cls)) { | 737 } else if (Elements.isNativeOrExtendsNative(cls)) { |
737 enqueue(enqueuer, getNativeInterceptorMethod, elements); | 738 enqueue(enqueuer, getNativeInterceptorMethod, elements); |
738 enqueueClass(enqueuer, jsInterceptorClass, compiler.globalDependencies); | 739 enqueueClass(enqueuer, jsInterceptorClass, compiler.globalDependencies); |
739 enqueueClass(enqueuer, jsPlainJavaScriptObjectClass, elements); | 740 enqueueClass(enqueuer, jsPlainJavaScriptObjectClass, elements); |
| 741 } else if (cls == mapLiteralClass) { |
| 742 // For map literals, the dependency between the implementation class |
| 743 // and [Map] is not visible, so we have to add it manually. |
| 744 Element getFactory(String name, int arity) { |
| 745 return mapLiteralClass.patch.lookupConstructor( |
| 746 new Selector.callConstructor( |
| 747 name, mapLiteralClass.getLibrary(), arity), |
| 748 (element) { |
| 749 compiler.internalError(mapLiteralClass, |
| 750 "Map literal class $mapLiteralClass missing " |
| 751 "'$name' constructor" |
| 752 " ${mapLiteralClass.constructors}"); |
| 753 }); |
| 754 } |
| 755 mapLiteralConstructor = getFactory('_literal', 1); |
| 756 mapLiteralConstructorEmpty = getFactory('_empty', 0); |
| 757 enqueueInResolution(mapLiteralConstructor, elements); |
| 758 enqueueInResolution(mapLiteralConstructorEmpty, elements); |
740 } | 759 } |
741 } | 760 } |
742 if (cls == compiler.closureClass) { | 761 if (cls == compiler.closureClass) { |
743 enqueue(enqueuer, | 762 enqueue(enqueuer, |
744 compiler.findHelper('closureFromTearOff'), | 763 compiler.findHelper('closureFromTearOff'), |
745 elements); | 764 elements); |
746 } | 765 } |
747 ClassElement result = null; | 766 ClassElement result = null; |
748 if (cls == compiler.stringClass || cls == jsStringClass) { | 767 if (cls == compiler.stringClass || cls == jsStringClass) { |
749 addInterceptors(jsStringClass, enqueuer, elements); | 768 addInterceptors(jsStringClass, enqueuer, elements); |
(...skipping 691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1441 } | 1460 } |
1442 | 1461 |
1443 Element getClosureConverter() { | 1462 Element getClosureConverter() { |
1444 return compiler.findHelper('convertDartClosureToJS'); | 1463 return compiler.findHelper('convertDartClosureToJS'); |
1445 } | 1464 } |
1446 | 1465 |
1447 Element getTraceFromException() { | 1466 Element getTraceFromException() { |
1448 return compiler.findHelper('getTraceFromException'); | 1467 return compiler.findHelper('getTraceFromException'); |
1449 } | 1468 } |
1450 | 1469 |
1451 Element getMapMaker() { | |
1452 return compiler.findHelper('makeLiteralMap'); | |
1453 } | |
1454 | |
1455 Element getSetRuntimeTypeInfo() { | 1470 Element getSetRuntimeTypeInfo() { |
1456 return compiler.findHelper('setRuntimeTypeInfo'); | 1471 return compiler.findHelper('setRuntimeTypeInfo'); |
1457 } | 1472 } |
1458 | 1473 |
1459 Element getGetRuntimeTypeInfo() { | 1474 Element getGetRuntimeTypeInfo() { |
1460 return compiler.findHelper('getRuntimeTypeInfo'); | 1475 return compiler.findHelper('getRuntimeTypeInfo'); |
1461 } | 1476 } |
1462 | 1477 |
1463 Element getGetTypeArgumentByIndex() { | 1478 Element getGetTypeArgumentByIndex() { |
1464 return compiler.findHelper('getTypeArgumentByIndex'); | 1479 return compiler.findHelper('getTypeArgumentByIndex'); |
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1879 } | 1894 } |
1880 } | 1895 } |
1881 | 1896 |
1882 /// Records that [constant] is used by [user.element]. | 1897 /// Records that [constant] is used by [user.element]. |
1883 class Dependency { | 1898 class Dependency { |
1884 final Constant constant; | 1899 final Constant constant; |
1885 final TreeElements user; | 1900 final TreeElements user; |
1886 | 1901 |
1887 const Dependency(this.constant, this.user); | 1902 const Dependency(this.constant, this.user); |
1888 } | 1903 } |
1889 | |
OLD | NEW |