| Index: sdk/lib/_internal/js_runtime/lib/js_rti.dart
|
| diff --git a/sdk/lib/_internal/js_runtime/lib/js_rti.dart b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
|
| index 2e1c8d702e10323a682f5e01728c27a65a5eab79..161c47e89abf511690b2b615305b11eccbff7f22 100644
|
| --- a/sdk/lib/_internal/js_runtime/lib/js_rti.dart
|
| +++ b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
|
| @@ -165,6 +165,9 @@ String runtimeTypeToString(var rti, {String onTypeVariable(int i)}) {
|
| if (rti == null) {
|
| return 'dynamic';
|
| }
|
| + if (isVoidType(rti)) {
|
| + return "void";
|
| + }
|
| if (isJsArray(rti)) {
|
| // A list representing a type with arguments.
|
| return getRuntimeTypeAsString(rti, onTypeVariable: onTypeVariable);
|
| @@ -194,15 +197,10 @@ String runtimeTypeToString(var rti, {String onTypeVariable(int i)}) {
|
|
|
| String _functionRtiToString(var rti, String onTypeVariable(int i)) {
|
| String returnTypeText;
|
| - String voidTag = JS_GET_NAME(JsGetName.FUNCTION_TYPE_VOID_RETURN_TAG);
|
| - if (JS('bool', '!!#[#]', rti, voidTag)) {
|
| - returnTypeText = 'void';
|
| - } else {
|
| - String returnTypeTag = JS_GET_NAME(JsGetName.FUNCTION_TYPE_RETURN_TYPE_TAG);
|
| - var returnRti = JS('', '#[#]', rti, returnTypeTag);
|
| - returnTypeText =
|
| - runtimeTypeToString(returnRti, onTypeVariable: onTypeVariable);
|
| - }
|
| + String returnTypeTag = JS_GET_NAME(JsGetName.FUNCTION_TYPE_RETURN_TYPE_TAG);
|
| + var returnRti = JS('', '#[#]', rti, returnTypeTag);
|
| + returnTypeText =
|
| + runtimeTypeToString(returnRti, onTypeVariable: onTypeVariable);
|
|
|
| String argumentsText = '';
|
| String sep = '';
|
| @@ -462,7 +460,10 @@ computeSignature(var signature, var context, var contextName) {
|
| */
|
| bool isSupertypeOfNull(var type) {
|
| // `null` means `dynamic`.
|
| - return type == null || isDartObjectTypeRti(type) || isNullTypeRti(type);
|
| + return type == null ||
|
| + isVoidType(type) ||
|
| + isDartObjectTypeRti(type) ||
|
| + isNullTypeRti(type);
|
| }
|
|
|
| /**
|
| @@ -474,7 +475,7 @@ bool isSupertypeOfNull(var type) {
|
| */
|
| bool checkSubtypeOfRuntimeType(o, t) {
|
| if (o == null) return isSupertypeOfNull(t);
|
| - if (t == null) return true;
|
| + if (t == null || isVoidType(t)) return true;
|
| // Get the runtime type information from the object here, because we may
|
| // overwrite o with the interceptor below.
|
| var rti = getRuntimeTypeInfo(o);
|
| @@ -539,6 +540,9 @@ bool isSubtype(var s, var t) {
|
| // If either type is dynamic, [s] is a subtype of [t].
|
| if (s == null || t == null) return true;
|
| if (isNullType(s)) return true;
|
| + if (isVoidType(t)) return true;
|
| + if (isVoidType(s)) return isDartObjectTypeRti(t);
|
| +
|
| if (isDartFunctionType(t)) {
|
| return isFunctionSubtype(s, t);
|
| }
|
| @@ -633,17 +637,13 @@ bool areAssignableMaps(var s, var t) {
|
| bool isFunctionSubtype(var s, var t) {
|
| assert(isDartFunctionType(t));
|
| if (!isDartFunctionType(s)) return false;
|
| - var voidReturnTag = JS_GET_NAME(JsGetName.FUNCTION_TYPE_VOID_RETURN_TAG);
|
| +
|
| var returnTypeTag = JS_GET_NAME(JsGetName.FUNCTION_TYPE_RETURN_TYPE_TAG);
|
| - if (hasField(s, voidReturnTag)) {
|
| - if (hasNoField(t, voidReturnTag) && hasField(t, returnTypeTag)) {
|
| - return false;
|
| - }
|
| - } else if (hasNoField(t, voidReturnTag)) {
|
| - var sReturnType = getField(s, returnTypeTag);
|
| - var tReturnType = getField(t, returnTypeTag);
|
| - if (!isAssignable(sReturnType, tReturnType)) return false;
|
| - }
|
| + var sReturnType = getField(s, returnTypeTag);
|
| + var tReturnType = getField(t, returnTypeTag);
|
| + if (!isAssignable(sReturnType, tReturnType)) return false;
|
| + if (isVoidType(sReturnType) && !isVoidType(tReturnType)) return false;
|
| +
|
| var requiredParametersTag =
|
| JS_GET_NAME(JsGetName.FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG);
|
| var sParameterTypes = getField(s, requiredParametersTag);
|
|
|