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 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 1052 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1063 } | 1063 } |
1064 | 1064 |
1065 void registerSetRuntimeType(TreeElements elements) { | 1065 void registerSetRuntimeType(TreeElements elements) { |
1066 enqueueInResolution(getSetRuntimeTypeInfo(), elements); | 1066 enqueueInResolution(getSetRuntimeTypeInfo(), elements); |
1067 } | 1067 } |
1068 | 1068 |
1069 void registerGetRuntimeTypeArgument(TreeElements elements) { | 1069 void registerGetRuntimeTypeArgument(TreeElements elements) { |
1070 enqueueInResolution(getGetRuntimeTypeArgument(), elements); | 1070 enqueueInResolution(getGetRuntimeTypeArgument(), elements); |
1071 } | 1071 } |
1072 | 1072 |
| 1073 void registerGenericClosure(Enqueuer enqueuer, TreeElements elements) { |
| 1074 enqueue(enqueuer, getSetRuntimeTypeInfo(), elements); |
| 1075 enqueue(enqueuer, getGetRuntimeTypeInfo(), elements); |
| 1076 enqueue(enqueuer, getForwardRuntimeTypeInfo(), elements); |
| 1077 enqueuer.registerInstantiatedClass(compiler.listClass, elements); |
| 1078 } |
| 1079 |
1073 void registerRuntimeType(TreeElements elements) { | 1080 void registerRuntimeType(TreeElements elements) { |
1074 enqueueInResolution(getSetRuntimeTypeInfo(), elements); | 1081 enqueueInResolution(getSetRuntimeTypeInfo(), elements); |
1075 enqueueInResolution(getGetRuntimeTypeInfo(), elements); | 1082 enqueueInResolution(getGetRuntimeTypeInfo(), elements); |
1076 enqueueInResolution(getGetRuntimeTypeArgument(), elements); | 1083 enqueueInResolution(getGetRuntimeTypeArgument(), elements); |
1077 compiler.enqueuer.resolution.registerInstantiatedClass( | 1084 compiler.enqueuer.resolution.registerInstantiatedClass( |
1078 compiler.listClass, elements); | 1085 compiler.listClass, elements); |
1079 } | 1086 } |
1080 | 1087 |
1081 void registerTypeVariableExpression(TreeElements elements) { | 1088 void registerTypeVariableExpression(TreeElements elements) { |
1082 registerRuntimeType(elements); | 1089 registerRuntimeType(elements); |
1083 enqueueInResolution(getRuntimeTypeToString(), elements); | 1090 enqueueInResolution(getRuntimeTypeToString(), elements); |
1084 enqueueInResolution(getCreateRuntimeType(), elements); | 1091 enqueueInResolution(getCreateRuntimeType(), elements); |
1085 } | 1092 } |
1086 | 1093 |
1087 void registerIsCheck(DartType type, Enqueuer world, TreeElements elements) { | 1094 void registerIsCheck(DartType type, Enqueuer world, TreeElements elements) { |
| 1095 if (type.isMalformed) { |
| 1096 registerThrowRuntimeError(elements); |
| 1097 return; |
| 1098 } |
1088 world.registerInstantiatedClass(compiler.boolClass, elements); | 1099 world.registerInstantiatedClass(compiler.boolClass, elements); |
1089 bool isTypeVariable = type.kind == TypeKind.TYPE_VARIABLE; | 1100 bool isTypeVariable = type.kind == TypeKind.TYPE_VARIABLE; |
1090 if (!type.isRaw || isTypeVariable) { | 1101 if (!type.isRaw || type.containsTypeVariables) { |
1091 enqueueInResolution(getSetRuntimeTypeInfo(), elements); | 1102 enqueueInResolution(getSetRuntimeTypeInfo(), elements); |
1092 enqueueInResolution(getGetRuntimeTypeInfo(), elements); | 1103 enqueueInResolution(getGetRuntimeTypeInfo(), elements); |
1093 enqueueInResolution(getGetRuntimeTypeArgument(), elements); | 1104 enqueueInResolution(getGetRuntimeTypeArgument(), elements); |
1094 enqueueInResolution(getCheckArguments(), elements); | 1105 enqueueInResolution(getCheckArguments(), elements); |
1095 if (isTypeVariable) { | 1106 if (isTypeVariable) { |
1096 enqueueInResolution(getGetObjectIsSubtype(), elements); | 1107 enqueueInResolution(getGetObjectIsSubtype(), elements); |
1097 } | 1108 } |
1098 world.registerInstantiatedClass(compiler.listClass, elements); | 1109 world.registerInstantiatedClass(compiler.listClass, elements); |
1099 } | 1110 } |
| 1111 if (type is FunctionType) { |
| 1112 enqueueInResolution(getCheckFunctionSubtype(), elements); |
| 1113 } |
1100 // [registerIsCheck] is also called for checked mode checks, so we | 1114 // [registerIsCheck] is also called for checked mode checks, so we |
1101 // need to register checked mode helpers. | 1115 // need to register checked mode helpers. |
1102 if (compiler.enableTypeAssertions) { | 1116 if (compiler.enableTypeAssertions) { |
1103 Element e = getCheckedModeHelper(type, typeCast: false); | 1117 Element e = getCheckedModeHelper(type, typeCast: false); |
1104 if (e != null) world.addToWorkList(e); | 1118 if (e != null) world.addToWorkList(e); |
1105 // We also need the native variant of the check (for DOM types). | 1119 // We also need the native variant of the check (for DOM types). |
1106 e = getNativeCheckedModeHelper(type, typeCast: false); | 1120 e = getNativeCheckedModeHelper(type, typeCast: false); |
1107 if (e != null) world.addToWorkList(e); | 1121 if (e != null) world.addToWorkList(e); |
1108 } | 1122 } |
1109 if (type.element.isNative()) { | 1123 if (type.element.isNative()) { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1141 | 1155 |
1142 void registerSuperNoSuchMethod(TreeElements elements) { | 1156 void registerSuperNoSuchMethod(TreeElements elements) { |
1143 enqueueInResolution(getCreateInvocationMirror(), elements); | 1157 enqueueInResolution(getCreateInvocationMirror(), elements); |
1144 enqueueInResolution( | 1158 enqueueInResolution( |
1145 compiler.objectClass.lookupLocalMember(Compiler.NO_SUCH_METHOD), | 1159 compiler.objectClass.lookupLocalMember(Compiler.NO_SUCH_METHOD), |
1146 elements); | 1160 elements); |
1147 compiler.enqueuer.resolution.registerInstantiatedClass( | 1161 compiler.enqueuer.resolution.registerInstantiatedClass( |
1148 compiler.listClass, elements); | 1162 compiler.listClass, elements); |
1149 } | 1163 } |
1150 | 1164 |
| 1165 void enqueue(Enqueuer enqueuer, Element e, TreeElements elements) { |
| 1166 enqueuer.addToWorkList(e); |
| 1167 elements.registerDependency(e); |
| 1168 } |
| 1169 |
1151 void enqueueInResolution(Element e, TreeElements elements) { | 1170 void enqueueInResolution(Element e, TreeElements elements) { |
1152 if (e == null) return; | 1171 if (e == null) return; |
1153 ResolutionEnqueuer enqueuer = compiler.enqueuer.resolution; | 1172 ResolutionEnqueuer enqueuer = compiler.enqueuer.resolution; |
1154 enqueuer.addToWorkList(e); | 1173 enqueue(enqueuer, e, elements); |
1155 elements.registerDependency(e); | |
1156 } | 1174 } |
1157 | 1175 |
1158 void registerConstantMap(TreeElements elements) { | 1176 void registerConstantMap(TreeElements elements) { |
1159 Element e = compiler.findHelper(const SourceString('ConstantMap')); | 1177 Element e = compiler.findHelper(const SourceString('ConstantMap')); |
1160 if (e != null) { | 1178 if (e != null) { |
1161 compiler.enqueuer.resolution.registerInstantiatedClass(e, elements); | 1179 compiler.enqueuer.resolution.registerInstantiatedClass(e, elements); |
1162 } | 1180 } |
1163 e = compiler.findHelper(const SourceString('ConstantProtoMap')); | 1181 e = compiler.findHelper(const SourceString('ConstantProtoMap')); |
1164 if (e != null) { | 1182 if (e != null) { |
1165 compiler.enqueuer.resolution.registerInstantiatedClass(e, elements); | 1183 compiler.enqueuer.resolution.registerInstantiatedClass(e, elements); |
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1540 } | 1558 } |
1541 | 1559 |
1542 Element getMapMaker() { | 1560 Element getMapMaker() { |
1543 return compiler.findHelper(const SourceString('makeLiteralMap')); | 1561 return compiler.findHelper(const SourceString('makeLiteralMap')); |
1544 } | 1562 } |
1545 | 1563 |
1546 Element getSetRuntimeTypeInfo() { | 1564 Element getSetRuntimeTypeInfo() { |
1547 return compiler.findHelper(const SourceString('setRuntimeTypeInfo')); | 1565 return compiler.findHelper(const SourceString('setRuntimeTypeInfo')); |
1548 } | 1566 } |
1549 | 1567 |
| 1568 Element getForwardRuntimeTypeInfo() { |
| 1569 return compiler.findHelper(const SourceString('forwardRuntimeTypeInfo')); |
| 1570 } |
| 1571 |
1550 Element getGetRuntimeTypeInfo() { | 1572 Element getGetRuntimeTypeInfo() { |
1551 return compiler.findHelper(const SourceString('getRuntimeTypeInfo')); | 1573 return compiler.findHelper(const SourceString('getRuntimeTypeInfo')); |
1552 } | 1574 } |
1553 | 1575 |
1554 Element getGetRuntimeTypeArgument() { | 1576 Element getGetRuntimeTypeArgument() { |
1555 return compiler.findHelper(const SourceString('getRuntimeTypeArgument')); | 1577 return compiler.findHelper(const SourceString('getRuntimeTypeArgument')); |
1556 } | 1578 } |
1557 | 1579 |
1558 Element getRuntimeTypeToString() { | 1580 Element getRuntimeTypeToString() { |
1559 return compiler.findHelper(const SourceString('runtimeTypeToString')); | 1581 return compiler.findHelper(const SourceString('runtimeTypeToString')); |
1560 } | 1582 } |
1561 | 1583 |
1562 Element getCheckArguments() { | 1584 Element getCheckArguments() { |
1563 return compiler.findHelper(const SourceString('checkArguments')); | 1585 return compiler.findHelper(const SourceString('checkArguments')); |
1564 } | 1586 } |
1565 | 1587 |
1566 Element getGetObjectIsSubtype() { | 1588 Element getGetObjectIsSubtype() { |
1567 return compiler.findHelper(const SourceString('objectIsSubtype')); | 1589 return compiler.findHelper(const SourceString('objectIsSubtype')); |
1568 } | 1590 } |
1569 | 1591 |
| 1592 Element getCheckFunctionSubtype() { |
| 1593 return compiler.findHelper(const SourceString('checkFunctionSubtype')); |
| 1594 } |
| 1595 |
1570 Element getThrowNoSuchMethod() { | 1596 Element getThrowNoSuchMethod() { |
1571 return compiler.findHelper(const SourceString('throwNoSuchMethod')); | 1597 return compiler.findHelper(const SourceString('throwNoSuchMethod')); |
1572 } | 1598 } |
1573 | 1599 |
1574 Element getCreateRuntimeType() { | 1600 Element getCreateRuntimeType() { |
1575 return compiler.findHelper(const SourceString('createRuntimeType')); | 1601 return compiler.findHelper(const SourceString('createRuntimeType')); |
1576 } | 1602 } |
1577 | 1603 |
1578 Element getFallThroughError() { | 1604 Element getFallThroughError() { |
1579 return compiler.findHelper(const SourceString("getFallThroughError")); | 1605 return compiler.findHelper(const SourceString("getFallThroughError")); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1612 ClassElement get constListImplementation => jsArrayClass; | 1638 ClassElement get constListImplementation => jsArrayClass; |
1613 ClassElement get fixedListImplementation => jsFixedArrayClass; | 1639 ClassElement get fixedListImplementation => jsFixedArrayClass; |
1614 ClassElement get growableListImplementation => jsExtendableArrayClass; | 1640 ClassElement get growableListImplementation => jsExtendableArrayClass; |
1615 ClassElement get mapImplementation => mapLiteralClass; | 1641 ClassElement get mapImplementation => mapLiteralClass; |
1616 ClassElement get constMapImplementation => constMapLiteralClass; | 1642 ClassElement get constMapImplementation => constMapLiteralClass; |
1617 ClassElement get functionImplementation => jsFunctionClass; | 1643 ClassElement get functionImplementation => jsFunctionClass; |
1618 ClassElement get typeImplementation => typeLiteralClass; | 1644 ClassElement get typeImplementation => typeLiteralClass; |
1619 ClassElement get boolImplementation => jsBoolClass; | 1645 ClassElement get boolImplementation => jsBoolClass; |
1620 ClassElement get nullImplementation => jsNullClass; | 1646 ClassElement get nullImplementation => jsNullClass; |
1621 } | 1647 } |
OLD | NEW |