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 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
187 ClassElement jsBoolClass; | 187 ClassElement jsBoolClass; |
188 ClassElement jsPlainJavaScriptObjectClass; | 188 ClassElement jsPlainJavaScriptObjectClass; |
189 ClassElement jsUnknownJavaScriptObjectClass; | 189 ClassElement jsUnknownJavaScriptObjectClass; |
190 | 190 |
191 ClassElement jsIndexableClass; | 191 ClassElement jsIndexableClass; |
192 ClassElement jsMutableIndexableClass; | 192 ClassElement jsMutableIndexableClass; |
193 | 193 |
194 ClassElement jsMutableArrayClass; | 194 ClassElement jsMutableArrayClass; |
195 ClassElement jsFixedArrayClass; | 195 ClassElement jsFixedArrayClass; |
196 ClassElement jsExtendableArrayClass; | 196 ClassElement jsExtendableArrayClass; |
| 197 ClassElement jsUInt32Class; |
| 198 ClassElement jsUInt31Class; |
197 | 199 |
198 Element jsIndexableLength; | 200 Element jsIndexableLength; |
199 Element jsArrayTypedConstructor; | 201 Element jsArrayTypedConstructor; |
200 Element jsArrayRemoveLast; | 202 Element jsArrayRemoveLast; |
201 Element jsArrayAdd; | 203 Element jsArrayAdd; |
202 Element jsStringSplit; | 204 Element jsStringSplit; |
203 Element jsStringToString; | 205 Element jsStringToString; |
204 Element jsStringOperatorAdd; | 206 Element jsStringOperatorAdd; |
205 Element objectEquals; | 207 Element objectEquals; |
206 | 208 |
(...skipping 13 matching lines...) Expand all Loading... |
220 * This element is a top-level variable (in generated output) that the | 222 * This element is a top-level variable (in generated output) that the |
221 * compiler initializes to a datastructure used to map from a Type to the | 223 * compiler initializes to a datastructure used to map from a Type to the |
222 * interceptor. See declaration of `mapTypeToInterceptor` in | 224 * interceptor. See declaration of `mapTypeToInterceptor` in |
223 * `interceptors.dart`. | 225 * `interceptors.dart`. |
224 */ | 226 */ |
225 Element mapTypeToInterceptor; | 227 Element mapTypeToInterceptor; |
226 | 228 |
227 TypeMask get stringType => compiler.typesTask.stringType; | 229 TypeMask get stringType => compiler.typesTask.stringType; |
228 TypeMask get doubleType => compiler.typesTask.doubleType; | 230 TypeMask get doubleType => compiler.typesTask.doubleType; |
229 TypeMask get intType => compiler.typesTask.intType; | 231 TypeMask get intType => compiler.typesTask.intType; |
| 232 TypeMask get uint32Type => compiler.typesTask.uint32Type; |
| 233 TypeMask get uint31Type => compiler.typesTask.uint31Type; |
230 TypeMask get numType => compiler.typesTask.numType; | 234 TypeMask get numType => compiler.typesTask.numType; |
231 TypeMask get boolType => compiler.typesTask.boolType; | 235 TypeMask get boolType => compiler.typesTask.boolType; |
232 TypeMask get dynamicType => compiler.typesTask.dynamicType; | 236 TypeMask get dynamicType => compiler.typesTask.dynamicType; |
233 TypeMask get nullType => compiler.typesTask.nullType; | 237 TypeMask get nullType => compiler.typesTask.nullType; |
234 TypeMask get emptyType => const TypeMask.nonNullEmpty(); | 238 TypeMask get emptyType => const TypeMask.nonNullEmpty(); |
235 TypeMask indexablePrimitiveType; | 239 TypeMask indexablePrimitiveType; |
236 TypeMask readableArrayType; | 240 TypeMask readableArrayType; |
237 TypeMask mutableArrayType; | 241 TypeMask mutableArrayType; |
238 TypeMask fixedArrayType; | 242 TypeMask fixedArrayType; |
239 TypeMask extendableArrayType; | 243 TypeMask extendableArrayType; |
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
569 inlineCache.markAsNonInlinable(getInterceptorMethod, insideLoop: true); | 573 inlineCache.markAsNonInlinable(getInterceptorMethod, insideLoop: true); |
570 | 574 |
571 List<ClassElement> classes = [ | 575 List<ClassElement> classes = [ |
572 jsInterceptorClass = | 576 jsInterceptorClass = |
573 compiler.findInterceptor('Interceptor'), | 577 compiler.findInterceptor('Interceptor'), |
574 jsStringClass = compiler.findInterceptor('JSString'), | 578 jsStringClass = compiler.findInterceptor('JSString'), |
575 jsArrayClass = compiler.findInterceptor('JSArray'), | 579 jsArrayClass = compiler.findInterceptor('JSArray'), |
576 // The int class must be before the double class, because the | 580 // The int class must be before the double class, because the |
577 // emitter relies on this list for the order of type checks. | 581 // emitter relies on this list for the order of type checks. |
578 jsIntClass = compiler.findInterceptor('JSInt'), | 582 jsIntClass = compiler.findInterceptor('JSInt'), |
| 583 jsUInt32Class = compiler.findInterceptor('JSUInt32'), |
| 584 jsUInt31Class = compiler.findInterceptor('JSUInt31'), |
579 jsDoubleClass = compiler.findInterceptor('JSDouble'), | 585 jsDoubleClass = compiler.findInterceptor('JSDouble'), |
580 jsNumberClass = compiler.findInterceptor('JSNumber'), | 586 jsNumberClass = compiler.findInterceptor('JSNumber'), |
581 jsNullClass = compiler.findInterceptor('JSNull'), | 587 jsNullClass = compiler.findInterceptor('JSNull'), |
582 jsBoolClass = compiler.findInterceptor('JSBool'), | 588 jsBoolClass = compiler.findInterceptor('JSBool'), |
583 jsMutableArrayClass = compiler.findInterceptor('JSMutableArray'), | 589 jsMutableArrayClass = compiler.findInterceptor('JSMutableArray'), |
584 jsFixedArrayClass = compiler.findInterceptor('JSFixedArray'), | 590 jsFixedArrayClass = compiler.findInterceptor('JSFixedArray'), |
585 jsExtendableArrayClass = compiler.findInterceptor('JSExtendableArray'), | 591 jsExtendableArrayClass = compiler.findInterceptor('JSExtendableArray'), |
586 jsPlainJavaScriptObjectClass = | 592 jsPlainJavaScriptObjectClass = |
587 compiler.findInterceptor('PlainJavaScriptObject'), | 593 compiler.findInterceptor('PlainJavaScriptObject'), |
588 jsUnknownJavaScriptObjectClass = | 594 jsUnknownJavaScriptObjectClass = |
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
840 } else if (cls == compiler.listClass | 846 } else if (cls == compiler.listClass |
841 || cls == jsArrayClass | 847 || cls == jsArrayClass |
842 || cls == jsFixedArrayClass | 848 || cls == jsFixedArrayClass |
843 || cls == jsExtendableArrayClass) { | 849 || cls == jsExtendableArrayClass) { |
844 addInterceptors(jsArrayClass, enqueuer, elements); | 850 addInterceptors(jsArrayClass, enqueuer, elements); |
845 addInterceptors(jsMutableArrayClass, enqueuer, elements); | 851 addInterceptors(jsMutableArrayClass, enqueuer, elements); |
846 addInterceptors(jsFixedArrayClass, enqueuer, elements); | 852 addInterceptors(jsFixedArrayClass, enqueuer, elements); |
847 addInterceptors(jsExtendableArrayClass, enqueuer, elements); | 853 addInterceptors(jsExtendableArrayClass, enqueuer, elements); |
848 } else if (cls == compiler.intClass || cls == jsIntClass) { | 854 } else if (cls == compiler.intClass || cls == jsIntClass) { |
849 addInterceptors(jsIntClass, enqueuer, elements); | 855 addInterceptors(jsIntClass, enqueuer, elements); |
| 856 addInterceptors(jsUInt32Class, enqueuer, elements); |
| 857 addInterceptors(jsUInt31Class, enqueuer, elements); |
850 addInterceptors(jsNumberClass, enqueuer, elements); | 858 addInterceptors(jsNumberClass, enqueuer, elements); |
851 } else if (cls == compiler.doubleClass || cls == jsDoubleClass) { | 859 } else if (cls == compiler.doubleClass || cls == jsDoubleClass) { |
852 addInterceptors(jsDoubleClass, enqueuer, elements); | 860 addInterceptors(jsDoubleClass, enqueuer, elements); |
853 addInterceptors(jsNumberClass, enqueuer, elements); | 861 addInterceptors(jsNumberClass, enqueuer, elements); |
854 } else if (cls == compiler.boolClass || cls == jsBoolClass) { | 862 } else if (cls == compiler.boolClass || cls == jsBoolClass) { |
855 addInterceptors(jsBoolClass, enqueuer, elements); | 863 addInterceptors(jsBoolClass, enqueuer, elements); |
856 } else if (cls == compiler.nullClass || cls == jsNullClass) { | 864 } else if (cls == compiler.nullClass || cls == jsNullClass) { |
857 addInterceptors(jsNullClass, enqueuer, elements); | 865 addInterceptors(jsNullClass, enqueuer, elements); |
858 } else if (cls == compiler.numClass || cls == jsNumberClass) { | 866 } else if (cls == compiler.numClass || cls == jsNumberClass) { |
859 addInterceptors(jsIntClass, enqueuer, elements); | 867 addInterceptors(jsIntClass, enqueuer, elements); |
| 868 addInterceptors(jsUInt32Class, enqueuer, elements); |
| 869 addInterceptors(jsUInt31Class, enqueuer, elements); |
860 addInterceptors(jsDoubleClass, enqueuer, elements); | 870 addInterceptors(jsDoubleClass, enqueuer, elements); |
861 addInterceptors(jsNumberClass, enqueuer, elements); | 871 addInterceptors(jsNumberClass, enqueuer, elements); |
862 } else if (cls == jsPlainJavaScriptObjectClass) { | 872 } else if (cls == jsPlainJavaScriptObjectClass) { |
863 addInterceptors(jsPlainJavaScriptObjectClass, enqueuer, elements); | 873 addInterceptors(jsPlainJavaScriptObjectClass, enqueuer, elements); |
864 } else if (cls == jsUnknownJavaScriptObjectClass) { | 874 } else if (cls == jsUnknownJavaScriptObjectClass) { |
865 addInterceptors(jsUnknownJavaScriptObjectClass, enqueuer, elements); | 875 addInterceptors(jsUnknownJavaScriptObjectClass, enqueuer, elements); |
866 } else if (Elements.isNativeOrExtendsNative(cls)) { | 876 } else if (Elements.isNativeOrExtendsNative(cls)) { |
867 addInterceptorsForNativeClassMembers(cls, enqueuer); | 877 addInterceptorsForNativeClassMembers(cls, enqueuer); |
868 } else if (cls == jsIndexingBehaviorInterface) { | 878 } else if (cls == jsIndexingBehaviorInterface) { |
869 // These two helpers are used by the emitter and the codegen. | 879 // These two helpers are used by the emitter and the codegen. |
(...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1408 } else if (element == jsNumberClass || element == compiler.numClass) { | 1418 } else if (element == jsNumberClass || element == compiler.numClass) { |
1409 if (nativeCheckOnly) return null; | 1419 if (nativeCheckOnly) return null; |
1410 return typeCast | 1420 return typeCast |
1411 ? 'numTypeCast' | 1421 ? 'numTypeCast' |
1412 : 'numTypeCheck'; | 1422 : 'numTypeCheck'; |
1413 } else if (element == jsBoolClass || element == compiler.boolClass) { | 1423 } else if (element == jsBoolClass || element == compiler.boolClass) { |
1414 if (nativeCheckOnly) return null; | 1424 if (nativeCheckOnly) return null; |
1415 return typeCast | 1425 return typeCast |
1416 ? 'boolTypeCast' | 1426 ? 'boolTypeCast' |
1417 : 'boolTypeCheck'; | 1427 : 'boolTypeCheck'; |
1418 } else if (element == jsIntClass || element == compiler.intClass) { | 1428 } else if (element == jsIntClass || element == compiler.intClass |
| 1429 || element == jsUInt32Class || element == jsUInt31Class) { |
1419 if (nativeCheckOnly) return null; | 1430 if (nativeCheckOnly) return null; |
1420 return typeCast | 1431 return typeCast |
1421 ? 'intTypeCast' | 1432 ? 'intTypeCast' |
1422 : 'intTypeCheck'; | 1433 : 'intTypeCheck'; |
1423 } else if (Elements.isNumberOrStringSupertype(element, compiler)) { | 1434 } else if (Elements.isNumberOrStringSupertype(element, compiler)) { |
1424 if (nativeCheck) { | 1435 if (nativeCheck) { |
1425 return typeCast | 1436 return typeCast |
1426 ? 'numberOrStringSuperNativeTypeCast' | 1437 ? 'numberOrStringSuperNativeTypeCast' |
1427 : 'numberOrStringSuperNativeTypeCheck'; | 1438 : 'numberOrStringSuperNativeTypeCheck'; |
1428 } else { | 1439 } else { |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1626 | 1637 |
1627 Element getCyclicThrowHelper() { | 1638 Element getCyclicThrowHelper() { |
1628 return compiler.findHelper("throwCyclicInit"); | 1639 return compiler.findHelper("throwCyclicInit"); |
1629 } | 1640 } |
1630 | 1641 |
1631 bool isNullImplementation(ClassElement cls) { | 1642 bool isNullImplementation(ClassElement cls) { |
1632 return cls == jsNullClass; | 1643 return cls == jsNullClass; |
1633 } | 1644 } |
1634 | 1645 |
1635 ClassElement get intImplementation => jsIntClass; | 1646 ClassElement get intImplementation => jsIntClass; |
| 1647 ClassElement get uint32Implementation => jsUInt32Class; |
| 1648 ClassElement get uint31Implementation => jsUInt31Class; |
1636 ClassElement get doubleImplementation => jsDoubleClass; | 1649 ClassElement get doubleImplementation => jsDoubleClass; |
1637 ClassElement get numImplementation => jsNumberClass; | 1650 ClassElement get numImplementation => jsNumberClass; |
1638 ClassElement get stringImplementation => jsStringClass; | 1651 ClassElement get stringImplementation => jsStringClass; |
1639 ClassElement get listImplementation => jsArrayClass; | 1652 ClassElement get listImplementation => jsArrayClass; |
1640 ClassElement get constListImplementation => jsArrayClass; | 1653 ClassElement get constListImplementation => jsArrayClass; |
1641 ClassElement get fixedListImplementation => jsFixedArrayClass; | 1654 ClassElement get fixedListImplementation => jsFixedArrayClass; |
1642 ClassElement get growableListImplementation => jsExtendableArrayClass; | 1655 ClassElement get growableListImplementation => jsExtendableArrayClass; |
1643 ClassElement get mapImplementation => mapLiteralClass; | 1656 ClassElement get mapImplementation => mapLiteralClass; |
1644 ClassElement get constMapImplementation => constMapLiteralClass; | 1657 ClassElement get constMapImplementation => constMapLiteralClass; |
1645 ClassElement get typeImplementation => typeLiteralClass; | 1658 ClassElement get typeImplementation => typeLiteralClass; |
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1982 copy(constant.values); | 1995 copy(constant.values); |
1983 copy(constant.protoValue); | 1996 copy(constant.protoValue); |
1984 copy(constant); | 1997 copy(constant); |
1985 } | 1998 } |
1986 | 1999 |
1987 void visitConstructed(ConstructedConstant constant) { | 2000 void visitConstructed(ConstructedConstant constant) { |
1988 copy(constant.fields); | 2001 copy(constant.fields); |
1989 copy(constant); | 2002 copy(constant); |
1990 } | 2003 } |
1991 } | 2004 } |
OLD | NEW |