Index: sdk/lib/_internal/compiler/implementation/ssa/codegen.dart |
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart |
index a050e26535ea9ecf23eaa525b3fb48ac56a2ee4b..71a3de97bebd0d29671776dcc0b04dc9a30d1e4e 100644 |
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart |
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart |
@@ -2214,7 +2214,6 @@ abstract class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
assert(invariant(input, !type.isMalformed, |
message: 'Attempt to check malformed type $type')); |
Element element = type.element; |
- |
if (element == backend.jsArrayClass) { |
checkArray(input, negative ? '!==': '==='); |
return; |
@@ -2518,6 +2517,7 @@ abstract class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
assert(node.isCheckedModeCheck || node.isCastTypeCheck); |
DartType type = node.typeExpression; |
+ assert(type.kind != TypeKind.TYPEDEF); |
if (type.kind == TypeKind.FUNCTION) { |
// TODO(5022): We currently generate $isFunction checks for |
// function types. |
@@ -2526,53 +2526,17 @@ abstract class SsaCodeGenerator implements HVisitor, HBlockInformationVisitor { |
} |
world.registerIsCheck(type, work.resolutionTree); |
+ CheckedModeHelper helper; |
FunctionElement helperElement; |
if (node.isBooleanConversionCheck) { |
- helperElement = |
- compiler.findHelper(const SourceString('boolConversionCheck')); |
+ helper = |
+ const CheckedModeHelper(const SourceString('boolConversionCheck')); |
} else { |
- helperElement = backend.getCheckedModeHelper(type, |
- typeCast: node.isCastTypeCheck); |
+ helper = |
+ backend.getCheckedModeHelper(type, typeCast: node.isCastTypeCheck); |
} |
- world.registerStaticUse(helperElement); |
- List<js.Expression> arguments = <js.Expression>[]; |
- use(node.checkedInput); |
- arguments.add(pop()); |
- int parameterCount = |
- helperElement.computeSignature(compiler).parameterCount; |
- // TODO(johnniwinther): Refactor this to avoid using the parameter count |
- // to determine how the helper should be called. |
- if (node.typeExpression.kind == TypeKind.TYPE_VARIABLE) { |
- assert(parameterCount == 2); |
- use(node.typeRepresentation); |
- arguments.add(pop()); |
- } else if (parameterCount == 2) { |
- // 2 arguments implies that the method is either [propertyTypeCheck], |
- // [propertyTypeCast] or [assertObjectIsSubtype]. |
- assert(!type.isMalformed); |
- String additionalArgument = backend.namer.operatorIs(type.element); |
- arguments.add(js.string(additionalArgument)); |
- } else if (parameterCount == 3) { |
- // 3 arguments implies that the method is [malformedTypeCheck]. |
- assert(type.isMalformed); |
- String reasons = Types.fetchReasonsFromMalformedType(type); |
- arguments.add(js.string('$type')); |
- // TODO(johnniwinther): Handle escaping correctly. |
- arguments.add(js.string(reasons)); |
- } else if (parameterCount == 4) { |
- Element element = type.element; |
- String isField = backend.namer.operatorIs(element); |
- arguments.add(js.string(isField)); |
- use(node.typeRepresentation); |
- arguments.add(pop()); |
- String asField = backend.namer.substitutionName(element); |
- arguments.add(js.string(asField)); |
- } else { |
- assert(!type.isMalformed); |
- // No additional arguments needed. |
- } |
- String helperName = backend.namer.isolateAccess(helperElement); |
- push(new js.Call(new js.VariableUse(helperName), arguments)); |
+ |
+ push(helper.generateCall(this, node)); |
} |
} |