| 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 class JavaScriptItemCompilationContext extends ItemCompilationContext { | 7 class JavaScriptItemCompilationContext extends ItemCompilationContext { |
| 8 final Set<HInstruction> boundsChecked; | 8 final Set<HInstruction> boundsChecked; |
| 9 | 9 |
| 10 JavaScriptItemCompilationContext() | 10 JavaScriptItemCompilationContext() |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 codegen.use(node.checkedInput); | 26 codegen.use(node.checkedInput); |
| 27 arguments.add(codegen.pop()); | 27 arguments.add(codegen.pop()); |
| 28 generateAdditionalArguments(codegen, node, arguments); | 28 generateAdditionalArguments(codegen, node, arguments); |
| 29 String helperName = codegen.backend.namer.isolateAccess(helperElement); | 29 String helperName = codegen.backend.namer.isolateAccess(helperElement); |
| 30 return new jsAst.Call(new jsAst.VariableUse(helperName), arguments); | 30 return new jsAst.Call(new jsAst.VariableUse(helperName), arguments); |
| 31 } | 31 } |
| 32 | 32 |
| 33 void generateAdditionalArguments(SsaCodeGenerator codegen, | 33 void generateAdditionalArguments(SsaCodeGenerator codegen, |
| 34 HTypeConversion node, | 34 HTypeConversion node, |
| 35 List<jsAst.Expression> arguments) { | 35 List<jsAst.Expression> arguments) { |
| 36 assert(!node.typeExpression.isMalformed); | |
| 37 // No additional arguments needed. | 36 // No additional arguments needed. |
| 38 } | 37 } |
| 39 } | 38 } |
| 40 | 39 |
| 41 class PropertyCheckedModeHelper extends CheckedModeHelper { | 40 class PropertyCheckedModeHelper extends CheckedModeHelper { |
| 42 const PropertyCheckedModeHelper(SourceString name) : super(name); | 41 const PropertyCheckedModeHelper(SourceString name) : super(name); |
| 43 | 42 |
| 44 void generateAdditionalArguments(SsaCodeGenerator codegen, | 43 void generateAdditionalArguments(SsaCodeGenerator codegen, |
| 45 HTypeConversion node, | 44 HTypeConversion node, |
| 46 List<jsAst.Expression> arguments) { | 45 List<jsAst.Expression> arguments) { |
| 47 DartType type = node.typeExpression; | 46 DartType type = node.typeExpression; |
| 48 assert(!type.isMalformed); | |
| 49 String additionalArgument = codegen.backend.namer.operatorIsType(type); | 47 String additionalArgument = codegen.backend.namer.operatorIsType(type); |
| 50 arguments.add(js.string(additionalArgument)); | 48 arguments.add(js.string(additionalArgument)); |
| 51 } | 49 } |
| 52 } | 50 } |
| 53 | 51 |
| 54 class TypeVariableCheckedModeHelper extends CheckedModeHelper { | 52 class TypeVariableCheckedModeHelper extends CheckedModeHelper { |
| 55 const TypeVariableCheckedModeHelper(SourceString name) : super(name); | 53 const TypeVariableCheckedModeHelper(SourceString name) : super(name); |
| 56 | 54 |
| 57 void generateAdditionalArguments(SsaCodeGenerator codegen, | 55 void generateAdditionalArguments(SsaCodeGenerator codegen, |
| 58 HTypeConversion node, | 56 HTypeConversion node, |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 codegen.use(node.context); | 98 codegen.use(node.context); |
| 101 arguments.add(codegen.pop()); | 99 arguments.add(codegen.pop()); |
| 102 } else { | 100 } else { |
| 103 codegen.use(node.context); | 101 codegen.use(node.context); |
| 104 arguments.add(codegen.pop()); | 102 arguments.add(codegen.pop()); |
| 105 } | 103 } |
| 106 } | 104 } |
| 107 } | 105 } |
| 108 } | 106 } |
| 109 | 107 |
| 110 class MalformedCheckedModeHelper extends CheckedModeHelper { | 108 class AmbiguousTypeCheckedModeHelper extends CheckedModeHelper { |
| 111 const MalformedCheckedModeHelper(SourceString name) : super(name); | 109 const AmbiguousTypeCheckedModeHelper(SourceString name) : super(name); |
| 112 | 110 |
| 113 void generateAdditionalArguments(SsaCodeGenerator codegen, | 111 void generateAdditionalArguments(SsaCodeGenerator codegen, |
| 114 HTypeConversion node, | 112 HTypeConversion node, |
| 115 List<jsAst.Expression> arguments) { | 113 List<jsAst.Expression> arguments) { |
| 116 DartType type = node.typeExpression; | 114 DartType type = node.typeExpression; |
| 117 assert(type.isMalformed); | 115 assert(type.containsAmbiguousTypes); |
| 118 String reasons = Types.fetchReasonsFromMalformedType(type); | 116 String reasons = Types.fetchReasonsFromAmbiguousType(type); |
| 119 | 117 |
| 120 arguments.add(js.string(quote('$type'))); | 118 arguments.add(js.string(quote('$type'))); |
| 121 arguments.add(js.string(quote(reasons))); | 119 arguments.add(js.string(quote(reasons))); |
| 122 } | 120 } |
| 123 | 121 |
| 124 String quote(String string) => string.replaceAll('"', r'\"'); | 122 String quote(String string) => string.replaceAll('"', r'\"'); |
| 125 } | 123 } |
| 126 | 124 |
| 127 /* | 125 /* |
| 128 * Invariants: | 126 * Invariants: |
| (...skipping 719 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 848 world.registerInstantiatedClass(compiler.boolClass, elements); | 846 world.registerInstantiatedClass(compiler.boolClass, elements); |
| 849 bool inCheckedMode = compiler.enableTypeAssertions; | 847 bool inCheckedMode = compiler.enableTypeAssertions; |
| 850 // [registerIsCheck] is also called for checked mode checks, so we | 848 // [registerIsCheck] is also called for checked mode checks, so we |
| 851 // need to register checked mode helpers. | 849 // need to register checked mode helpers. |
| 852 if (inCheckedMode) { | 850 if (inCheckedMode) { |
| 853 CheckedModeHelper helper = getCheckedModeHelper(type, typeCast: false); | 851 CheckedModeHelper helper = getCheckedModeHelper(type, typeCast: false); |
| 854 if (helper != null) world.addToWorkList(helper.getElement(compiler)); | 852 if (helper != null) world.addToWorkList(helper.getElement(compiler)); |
| 855 // We also need the native variant of the check (for DOM types). | 853 // We also need the native variant of the check (for DOM types). |
| 856 helper = getNativeCheckedModeHelper(type, typeCast: false); | 854 helper = getNativeCheckedModeHelper(type, typeCast: false); |
| 857 if (helper != null) world.addToWorkList(helper.getElement(compiler)); | 855 if (helper != null) world.addToWorkList(helper.getElement(compiler)); |
| 858 if (type.isMalformed) { | 856 if (type.containsAmbiguousTypes) { |
| 859 enqueueInResolution(getThrowMalformedSubtypeError(), elements); | 857 enqueueInResolution(getThrowMalformedSubtypeError(), elements); |
| 860 return; | 858 return; |
| 861 } | 859 } |
| 862 } else if (type.isMalformed) { | 860 } else if (type.containsAmbiguousTypes) { |
| 863 registerThrowRuntimeError(elements); | 861 registerThrowRuntimeError(elements); |
| 864 return; | 862 return; |
| 865 } | 863 } |
| 866 bool isTypeVariable = type.kind == TypeKind.TYPE_VARIABLE; | 864 bool isTypeVariable = type.kind == TypeKind.TYPE_VARIABLE; |
| 867 if (!type.isRaw || type.containsTypeVariables) { | 865 if (!type.isRaw || type.containsTypeVariables) { |
| 868 enqueueInResolution(getSetRuntimeTypeInfo(), elements); | 866 enqueueInResolution(getSetRuntimeTypeInfo(), elements); |
| 869 enqueueInResolution(getGetRuntimeTypeInfo(), elements); | 867 enqueueInResolution(getGetRuntimeTypeInfo(), elements); |
| 870 enqueueInResolution(getGetRuntimeTypeArgument(), elements); | 868 enqueueInResolution(getGetRuntimeTypeArgument(), elements); |
| 871 if (inCheckedMode) { | 869 if (inCheckedMode) { |
| 872 enqueueInResolution(getAssertSubtype(), elements); | 870 enqueueInResolution(getAssertSubtype(), elements); |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1115 * Returns the checked mode helper for the type check/type cast for [type]. If | 1113 * Returns the checked mode helper for the type check/type cast for [type]. If |
| 1116 * [nativeCheckOnly] is [:true:], only names for native helpers are returned. | 1114 * [nativeCheckOnly] is [:true:], only names for native helpers are returned. |
| 1117 */ | 1115 */ |
| 1118 CheckedModeHelper getCheckedModeHelperInternal(DartType type, | 1116 CheckedModeHelper getCheckedModeHelperInternal(DartType type, |
| 1119 {bool typeCast, | 1117 {bool typeCast, |
| 1120 bool nativeCheckOnly}) { | 1118 bool nativeCheckOnly}) { |
| 1121 assert(type.kind != TypeKind.TYPEDEF); | 1119 assert(type.kind != TypeKind.TYPEDEF); |
| 1122 Element element = type.element; | 1120 Element element = type.element; |
| 1123 bool nativeCheck = nativeCheckOnly || | 1121 bool nativeCheck = nativeCheckOnly || |
| 1124 emitter.nativeEmitter.requiresNativeIsCheck(element); | 1122 emitter.nativeEmitter.requiresNativeIsCheck(element); |
| 1125 if (type.isMalformed) { | 1123 if (type.containsAmbiguousTypes) { |
| 1126 // Check for malformed types first, because the type may be a list type | 1124 // Check for malformed types first, because the type may be a list type |
| 1127 // with a malformed argument type. | 1125 // with a malformed argument type. |
| 1128 if (nativeCheckOnly) return null; | 1126 if (nativeCheckOnly) return null; |
| 1129 return typeCast | 1127 return typeCast |
| 1130 ? const MalformedCheckedModeHelper( | 1128 ? const AmbiguousTypeCheckedModeHelper( |
| 1131 const SourceString('malformedTypeCast')) | 1129 const SourceString('malformedTypeCast')) |
| 1132 : const MalformedCheckedModeHelper( | 1130 : const AmbiguousTypeCheckedModeHelper( |
| 1133 const SourceString('malformedTypeCheck')); | 1131 const SourceString('malformedTypeCheck')); |
| 1134 } else if (type == compiler.types.voidType) { | 1132 } else if (type == compiler.types.voidType) { |
| 1135 assert(!typeCast); // Cannot cast to void. | 1133 assert(!typeCast); // Cannot cast to void. |
| 1136 if (nativeCheckOnly) return null; | 1134 if (nativeCheckOnly) return null; |
| 1137 return const CheckedModeHelper(const SourceString('voidTypeCheck')); | 1135 return const CheckedModeHelper(const SourceString('voidTypeCheck')); |
| 1138 } else if (element == jsStringClass || element == compiler.stringClass) { | 1136 } else if (element == jsStringClass || element == compiler.stringClass) { |
| 1139 if (nativeCheckOnly) return null; | 1137 if (nativeCheckOnly) return null; |
| 1140 return typeCast | 1138 return typeCast |
| 1141 ? const CheckedModeHelper(const SourceString("stringTypeCast")) | 1139 ? const CheckedModeHelper(const SourceString("stringTypeCast")) |
| 1142 : const CheckedModeHelper(const SourceString('stringTypeCheck')); | 1140 : const CheckedModeHelper(const SourceString('stringTypeCheck')); |
| (...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1488 } | 1486 } |
| 1489 } | 1487 } |
| 1490 | 1488 |
| 1491 /// Records that [type] is used by [user.element]. | 1489 /// Records that [type] is used by [user.element]. |
| 1492 class Dependency { | 1490 class Dependency { |
| 1493 final DartType type; | 1491 final DartType type; |
| 1494 final TreeElements user; | 1492 final TreeElements user; |
| 1495 | 1493 |
| 1496 const Dependency(this.type, this.user); | 1494 const Dependency(this.type, this.user); |
| 1497 } | 1495 } |
| OLD | NEW |