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 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 ClassElement jsBoolClass; | 283 ClassElement jsBoolClass; |
284 ClassElement jsPlainJavaScriptObjectClass; | 284 ClassElement jsPlainJavaScriptObjectClass; |
285 ClassElement jsUnknownJavaScriptObjectClass; | 285 ClassElement jsUnknownJavaScriptObjectClass; |
286 | 286 |
287 ClassElement jsIndexableClass; | 287 ClassElement jsIndexableClass; |
288 ClassElement jsMutableIndexableClass; | 288 ClassElement jsMutableIndexableClass; |
289 | 289 |
290 ClassElement jsMutableArrayClass; | 290 ClassElement jsMutableArrayClass; |
291 ClassElement jsFixedArrayClass; | 291 ClassElement jsFixedArrayClass; |
292 ClassElement jsExtendableArrayClass; | 292 ClassElement jsExtendableArrayClass; |
| 293 ClassElement jsUnmodifiableArrayClass; |
293 ClassElement jsPositiveIntClass; | 294 ClassElement jsPositiveIntClass; |
294 ClassElement jsUInt32Class; | 295 ClassElement jsUInt32Class; |
295 ClassElement jsUInt31Class; | 296 ClassElement jsUInt31Class; |
296 | 297 |
297 Element jsIndexableLength; | 298 Element jsIndexableLength; |
298 Element jsArrayTypedConstructor; | 299 Element jsArrayTypedConstructor; |
299 Element jsArrayRemoveLast; | 300 Element jsArrayRemoveLast; |
300 Element jsArrayAdd; | 301 Element jsArrayAdd; |
301 Element jsStringSplit; | 302 Element jsStringSplit; |
302 Element jsStringToString; | 303 Element jsStringToString; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 | 380 |
380 TypeMask _extendableArrayTypeCache; | 381 TypeMask _extendableArrayTypeCache; |
381 TypeMask get extendableArrayType { | 382 TypeMask get extendableArrayType { |
382 if (_extendableArrayTypeCache == null) { | 383 if (_extendableArrayTypeCache == null) { |
383 _extendableArrayTypeCache = | 384 _extendableArrayTypeCache = |
384 new TypeMask.nonNullExact(jsExtendableArrayClass, compiler.world); | 385 new TypeMask.nonNullExact(jsExtendableArrayClass, compiler.world); |
385 } | 386 } |
386 return _extendableArrayTypeCache; | 387 return _extendableArrayTypeCache; |
387 } | 388 } |
388 | 389 |
| 390 TypeMask _unmodifiableArrayTypeCache; |
| 391 TypeMask get unmodifiableArrayType { |
| 392 if (_unmodifiableArrayTypeCache == null) { |
| 393 _unmodifiableArrayTypeCache = |
| 394 new TypeMask.nonNullExact(jsUnmodifiableArrayClass, compiler.world); |
| 395 } |
| 396 return _fixedArrayTypeCache; |
| 397 } |
| 398 |
389 TypeMask _nonNullTypeCache; | 399 TypeMask _nonNullTypeCache; |
390 TypeMask get nonNullType { | 400 TypeMask get nonNullType { |
391 if (_nonNullTypeCache == null) { | 401 if (_nonNullTypeCache == null) { |
392 _nonNullTypeCache = | 402 _nonNullTypeCache = |
393 compiler.typesTask.dynamicType.nonNullable(); | 403 compiler.typesTask.dynamicType.nonNullable(); |
394 } | 404 } |
395 return _nonNullTypeCache; | 405 return _nonNullTypeCache; |
396 } | 406 } |
397 | 407 |
398 /// Maps special classes to their implementation (JSXxx) class. | 408 /// Maps special classes to their implementation (JSXxx) class. |
(...skipping 649 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1048 } | 1058 } |
1049 if (cls == closureClass) { | 1059 if (cls == closureClass) { |
1050 enqueue(enqueuer, findHelper('closureFromTearOff'), registry); | 1060 enqueue(enqueuer, findHelper('closureFromTearOff'), registry); |
1051 } | 1061 } |
1052 ClassElement result = null; | 1062 ClassElement result = null; |
1053 if (cls == compiler.stringClass || cls == jsStringClass) { | 1063 if (cls == compiler.stringClass || cls == jsStringClass) { |
1054 addInterceptors(jsStringClass, enqueuer, registry); | 1064 addInterceptors(jsStringClass, enqueuer, registry); |
1055 } else if (cls == compiler.listClass || | 1065 } else if (cls == compiler.listClass || |
1056 cls == jsArrayClass || | 1066 cls == jsArrayClass || |
1057 cls == jsFixedArrayClass || | 1067 cls == jsFixedArrayClass || |
1058 cls == jsExtendableArrayClass) { | 1068 cls == jsExtendableArrayClass || |
| 1069 cls == jsUnmodifiableArrayClass) { |
1059 addInterceptors(jsArrayClass, enqueuer, registry); | 1070 addInterceptors(jsArrayClass, enqueuer, registry); |
1060 addInterceptors(jsMutableArrayClass, enqueuer, registry); | 1071 addInterceptors(jsMutableArrayClass, enqueuer, registry); |
1061 addInterceptors(jsFixedArrayClass, enqueuer, registry); | 1072 addInterceptors(jsFixedArrayClass, enqueuer, registry); |
1062 addInterceptors(jsExtendableArrayClass, enqueuer, registry); | 1073 addInterceptors(jsExtendableArrayClass, enqueuer, registry); |
| 1074 addInterceptors(jsUnmodifiableArrayClass, enqueuer, registry); |
1063 } else if (cls == compiler.intClass || cls == jsIntClass) { | 1075 } else if (cls == compiler.intClass || cls == jsIntClass) { |
1064 addInterceptors(jsIntClass, enqueuer, registry); | 1076 addInterceptors(jsIntClass, enqueuer, registry); |
1065 addInterceptors(jsPositiveIntClass, enqueuer, registry); | 1077 addInterceptors(jsPositiveIntClass, enqueuer, registry); |
1066 addInterceptors(jsUInt32Class, enqueuer, registry); | 1078 addInterceptors(jsUInt32Class, enqueuer, registry); |
1067 addInterceptors(jsUInt31Class, enqueuer, registry); | 1079 addInterceptors(jsUInt31Class, enqueuer, registry); |
1068 addInterceptors(jsNumberClass, enqueuer, registry); | 1080 addInterceptors(jsNumberClass, enqueuer, registry); |
1069 } else if (cls == compiler.doubleClass || cls == jsDoubleClass) { | 1081 } else if (cls == compiler.doubleClass || cls == jsDoubleClass) { |
1070 addInterceptors(jsDoubleClass, enqueuer, registry); | 1082 addInterceptors(jsDoubleClass, enqueuer, registry); |
1071 addInterceptors(jsNumberClass, enqueuer, registry); | 1083 addInterceptors(jsNumberClass, enqueuer, registry); |
1072 } else if (cls == compiler.boolClass || cls == jsBoolClass) { | 1084 } else if (cls == compiler.boolClass || cls == jsBoolClass) { |
(...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1632 bool hasDirectCheckFor(DartType type) { | 1644 bool hasDirectCheckFor(DartType type) { |
1633 Element element = type.element; | 1645 Element element = type.element; |
1634 return element == compiler.stringClass || | 1646 return element == compiler.stringClass || |
1635 element == compiler.boolClass || | 1647 element == compiler.boolClass || |
1636 element == compiler.numClass || | 1648 element == compiler.numClass || |
1637 element == compiler.intClass || | 1649 element == compiler.intClass || |
1638 element == compiler.doubleClass || | 1650 element == compiler.doubleClass || |
1639 element == jsArrayClass || | 1651 element == jsArrayClass || |
1640 element == jsMutableArrayClass || | 1652 element == jsMutableArrayClass || |
1641 element == jsExtendableArrayClass || | 1653 element == jsExtendableArrayClass || |
1642 element == jsFixedArrayClass; | 1654 element == jsFixedArrayClass || |
| 1655 element == jsUnmodifiableArrayClass; |
1643 } | 1656 } |
1644 | 1657 |
1645 /// Return [true] if the class is represented by a native JavaSCript type in | 1658 /// Return [true] if the class is represented by a native JavaSCript type in |
1646 /// the generated code. | 1659 /// the generated code. |
1647 bool isNativePrimitiveType(ClassElement cls ) { | 1660 bool isNativePrimitiveType(ClassElement cls ) { |
1648 // TODO(karlklose): cleanup/merge with hasDirectCheck, when the rest of the | 1661 // TODO(karlklose): cleanup/merge with hasDirectCheck, when the rest of the |
1649 // checks are implemented in the CPS IR. | 1662 // checks are implemented in the CPS IR. |
1650 return cls == compiler.intClass || | 1663 return cls == compiler.intClass || |
1651 cls == compiler.numClass || | 1664 cls == compiler.numClass || |
1652 cls == compiler.doubleClass || | 1665 cls == compiler.doubleClass || |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1864 } | 1877 } |
1865 | 1878 |
1866 ClassElement get intImplementation => jsIntClass; | 1879 ClassElement get intImplementation => jsIntClass; |
1867 ClassElement get uint32Implementation => jsUInt32Class; | 1880 ClassElement get uint32Implementation => jsUInt32Class; |
1868 ClassElement get uint31Implementation => jsUInt31Class; | 1881 ClassElement get uint31Implementation => jsUInt31Class; |
1869 ClassElement get positiveIntImplementation => jsPositiveIntClass; | 1882 ClassElement get positiveIntImplementation => jsPositiveIntClass; |
1870 ClassElement get doubleImplementation => jsDoubleClass; | 1883 ClassElement get doubleImplementation => jsDoubleClass; |
1871 ClassElement get numImplementation => jsNumberClass; | 1884 ClassElement get numImplementation => jsNumberClass; |
1872 ClassElement get stringImplementation => jsStringClass; | 1885 ClassElement get stringImplementation => jsStringClass; |
1873 ClassElement get listImplementation => jsArrayClass; | 1886 ClassElement get listImplementation => jsArrayClass; |
1874 ClassElement get constListImplementation => jsArrayClass; | 1887 ClassElement get constListImplementation => jsUnmodifiableArrayClass; |
1875 ClassElement get fixedListImplementation => jsFixedArrayClass; | 1888 ClassElement get fixedListImplementation => jsFixedArrayClass; |
1876 ClassElement get growableListImplementation => jsExtendableArrayClass; | 1889 ClassElement get growableListImplementation => jsExtendableArrayClass; |
1877 ClassElement get mapImplementation => mapLiteralClass; | 1890 ClassElement get mapImplementation => mapLiteralClass; |
1878 ClassElement get constMapImplementation => constMapLiteralClass; | 1891 ClassElement get constMapImplementation => constMapLiteralClass; |
1879 ClassElement get typeImplementation => typeLiteralClass; | 1892 ClassElement get typeImplementation => typeLiteralClass; |
1880 ClassElement get boolImplementation => jsBoolClass; | 1893 ClassElement get boolImplementation => jsBoolClass; |
1881 ClassElement get nullImplementation => jsNullClass; | 1894 ClassElement get nullImplementation => jsNullClass; |
1882 | 1895 |
1883 void registerStaticUse(Element element, Enqueuer enqueuer) { | 1896 void registerStaticUse(Element element, Enqueuer enqueuer) { |
1884 if (element == disableTreeShakingMarker) { | 1897 if (element == disableTreeShakingMarker) { |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2025 jsPositiveIntClass = findClass('JSPositiveInt'), | 2038 jsPositiveIntClass = findClass('JSPositiveInt'), |
2026 jsUInt32Class = findClass('JSUInt32'), | 2039 jsUInt32Class = findClass('JSUInt32'), |
2027 jsUInt31Class = findClass('JSUInt31'), | 2040 jsUInt31Class = findClass('JSUInt31'), |
2028 jsDoubleClass = findClass('JSDouble'), | 2041 jsDoubleClass = findClass('JSDouble'), |
2029 jsNumberClass = findClass('JSNumber'), | 2042 jsNumberClass = findClass('JSNumber'), |
2030 jsNullClass = findClass('JSNull'), | 2043 jsNullClass = findClass('JSNull'), |
2031 jsBoolClass = findClass('JSBool'), | 2044 jsBoolClass = findClass('JSBool'), |
2032 jsMutableArrayClass = findClass('JSMutableArray'), | 2045 jsMutableArrayClass = findClass('JSMutableArray'), |
2033 jsFixedArrayClass = findClass('JSFixedArray'), | 2046 jsFixedArrayClass = findClass('JSFixedArray'), |
2034 jsExtendableArrayClass = findClass('JSExtendableArray'), | 2047 jsExtendableArrayClass = findClass('JSExtendableArray'), |
| 2048 jsUnmodifiableArrayClass = findClass('JSUnmodifiableArray'), |
2035 jsPlainJavaScriptObjectClass = findClass('PlainJavaScriptObject'), | 2049 jsPlainJavaScriptObjectClass = findClass('PlainJavaScriptObject'), |
2036 jsUnknownJavaScriptObjectClass = findClass('UnknownJavaScriptObject'), | 2050 jsUnknownJavaScriptObjectClass = findClass('UnknownJavaScriptObject'), |
2037 ]; | 2051 ]; |
2038 | 2052 |
2039 jsIndexableClass = findClass('JSIndexable'); | 2053 jsIndexableClass = findClass('JSIndexable'); |
2040 jsMutableIndexableClass = findClass('JSMutableIndexable'); | 2054 jsMutableIndexableClass = findClass('JSMutableIndexable'); |
2041 } else if (uri == DART_JS_HELPER) { | 2055 } else if (uri == DART_JS_HELPER) { |
2042 initializeHelperClasses(); | 2056 initializeHelperClasses(); |
2043 assertMethod = findHelper('assertHelper'); | 2057 assertMethod = findHelper('assertHelper'); |
2044 | 2058 |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2108 | 2122 |
2109 // TODO(kasperl): Some tests do not define the special JSArray | 2123 // TODO(kasperl): Some tests do not define the special JSArray |
2110 // subclasses, so we check to see if they are defined before | 2124 // subclasses, so we check to see if they are defined before |
2111 // trying to resolve them. | 2125 // trying to resolve them. |
2112 if (jsFixedArrayClass != null) { | 2126 if (jsFixedArrayClass != null) { |
2113 jsFixedArrayClass.ensureResolved(compiler); | 2127 jsFixedArrayClass.ensureResolved(compiler); |
2114 } | 2128 } |
2115 if (jsExtendableArrayClass != null) { | 2129 if (jsExtendableArrayClass != null) { |
2116 jsExtendableArrayClass.ensureResolved(compiler); | 2130 jsExtendableArrayClass.ensureResolved(compiler); |
2117 } | 2131 } |
| 2132 if (jsUnmodifiableArrayClass != null) { |
| 2133 jsUnmodifiableArrayClass.ensureResolved(compiler); |
| 2134 } |
2118 | 2135 |
2119 jsIndexableClass.ensureResolved(compiler); | 2136 jsIndexableClass.ensureResolved(compiler); |
2120 jsIndexableLength = compiler.lookupElementIn( | 2137 jsIndexableLength = compiler.lookupElementIn( |
2121 jsIndexableClass, 'length'); | 2138 jsIndexableClass, 'length'); |
2122 if (jsIndexableLength != null && jsIndexableLength.isAbstractField) { | 2139 if (jsIndexableLength != null && jsIndexableLength.isAbstractField) { |
2123 AbstractFieldElement element = jsIndexableLength; | 2140 AbstractFieldElement element = jsIndexableLength; |
2124 jsIndexableLength = element.getter; | 2141 jsIndexableLength = element.getter; |
2125 } | 2142 } |
2126 | 2143 |
2127 jsArrayClass.ensureResolved(compiler); | 2144 jsArrayClass.ensureResolved(compiler); |
(...skipping 796 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2924 } | 2941 } |
2925 } | 2942 } |
2926 | 2943 |
2927 /// Records that [constant] is used by the element behind [registry]. | 2944 /// Records that [constant] is used by the element behind [registry]. |
2928 class Dependency { | 2945 class Dependency { |
2929 final ConstantValue constant; | 2946 final ConstantValue constant; |
2930 final Element annotatedElement; | 2947 final Element annotatedElement; |
2931 | 2948 |
2932 const Dependency(this.constant, this.annotatedElement); | 2949 const Dependency(this.constant, this.annotatedElement); |
2933 } | 2950 } |
OLD | NEW |