Index: pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart |
diff --git a/pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart b/pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart |
index ab44766eea8b877bb925bed00bd66f5f0e6e846d..b05fe1fac1da9d366a768d23ed52dc3858f7f67d 100644 |
--- a/pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart |
+++ b/pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart |
@@ -89,6 +89,18 @@ class TypeVariableCheckedModeHelper extends CheckedModeHelper { |
} |
} |
+class FunctionWithRepresentationCheckedModeHelper extends CheckedModeHelper { |
Emily Fortuna
2017/02/25 00:26:02
Can you add a comment here to explain what you mea
sra1
2017/02/28 05:16:03
Done.
|
+ const FunctionWithRepresentationCheckedModeHelper(String name) : super(name); |
+ |
+ CallStructure get callStructure => CallStructure.TWO_ARGS; |
+ |
+ void generateAdditionalArguments(SsaCodeGenerator codegen, |
+ HTypeConversion node, List<jsAst.Expression> arguments) { |
+ codegen.use(node.typeRepresentation); |
+ arguments.add(codegen.pop()); |
+ } |
+} |
+ |
class SubtypeCheckedModeHelper extends CheckedModeHelper { |
const SubtypeCheckedModeHelper(String name) : super(name); |
@@ -149,6 +161,8 @@ class CheckedModeHelpers { |
const TypeVariableCheckedModeHelper('assertSubtypeOfRuntimeType'), |
const PropertyCheckedModeHelper('propertyTypeCast'), |
const PropertyCheckedModeHelper('propertyTypeCheck'), |
+ const FunctionWithRepresentationCheckedModeHelper('functionTypeCast'), |
+ const FunctionWithRepresentationCheckedModeHelper('functionTypeCheck'), |
]; |
// Checked mode helpers indexed by name. |
@@ -212,7 +226,9 @@ class CheckedModeHelpers { |
: 'assertSubtypeOfRuntimeType'; |
} |
- if (type.isFunctionType) return null; |
+ if (type.isFunctionType) { |
+ return typeCast ? 'functionTypeCast' : 'functionTypeCheck'; |
+ } |
assert(invariant(NO_LOCATION_SPANNABLE, type.isInterfaceType, |
message: "Unexpected type: $type")); |