Index: pkg/compiler/lib/src/js_backend/runtime_types.dart |
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart |
index 9b54dcd33f539775817e284b82318634206d2440..6343d7c529c820d6b40c46b4bce91c7e03763c5a 100644 |
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart |
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart |
@@ -134,6 +134,8 @@ abstract class RuntimeTypesEncoder { |
[ShouldEncodeTypedefCallback shouldEncodeTypedef]); |
String getTypeRepresentationForTypeConstant(ResolutionDartType type); |
+ |
+ jsAst.Template get templateForIsVoidRti; |
} |
/// Common functionality for [_RuntimeTypesNeedBuilder] and [_RuntimeTypes]. |
@@ -770,10 +772,10 @@ class _RuntimeTypes extends _RuntimeTypesBase |
class _RuntimeTypesEncoder implements RuntimeTypesEncoder { |
final Namer namer; |
final CommonElements commonElements; |
- final TypeRepresentationGenerator _representationGenerator; |
+ final _TypeRepresentationGenerator _representationGenerator; |
_RuntimeTypesEncoder(this.namer, this.commonElements) |
- : _representationGenerator = new TypeRepresentationGenerator(namer); |
+ : _representationGenerator = new _TypeRepresentationGenerator(namer); |
@override |
bool isSimpleFunctionType(ResolutionFunctionType type) { |
@@ -926,15 +928,22 @@ class _RuntimeTypesEncoder implements RuntimeTypesEncoder { |
String arguments = new List.filled(variables.length, 'dynamic').join(', '); |
return '$name<$arguments>'; |
} |
+ |
+ static jsAst.Expression get _voidRti => js('1'); |
+ |
+ @override |
+ jsAst.Template get templateForIsVoidRti { |
+ return jsAst.js.expressionTemplateFor("# === 1"); |
+ } |
} |
-class TypeRepresentationGenerator implements ResolutionDartTypeVisitor { |
+class _TypeRepresentationGenerator implements ResolutionDartTypeVisitor { |
final Namer namer; |
OnVariableCallback onVariable; |
ShouldEncodeTypedefCallback shouldEncodeTypedef; |
Map<ResolutionTypeVariableType, jsAst.Expression> typedefBindings; |
- TypeRepresentationGenerator(this.namer); |
+ _TypeRepresentationGenerator(this.namer); |
/** |
* Creates a type representation for [type]. [onVariable] is called to provide |
@@ -1024,9 +1033,7 @@ class TypeRepresentationGenerator implements ResolutionDartTypeVisitor { |
// Type representations for functions have a property which is a tag marking |
// them as function types. The value is not used, so '1' is just a dummy. |
addProperty(namer.functionTypeTag, js.number(1)); |
- if (type.returnType.isVoid) { |
- addProperty(namer.functionTypeVoidReturnTag, js('true')); |
- } else if (!type.returnType.treatAsDynamic) { |
+ if (!type.returnType.treatAsDynamic) { |
addProperty( |
namer.functionTypeReturnTypeTag, visit(type.returnType, emitter)); |
} |
@@ -1060,8 +1067,7 @@ class TypeRepresentationGenerator implements ResolutionDartTypeVisitor { |
} |
visitVoidType(ResolutionVoidType type, Emitter emitter) { |
- // TODO(ahe): Reify void type ("null" means "dynamic"). |
- return js('null'); |
+ return _RuntimeTypesEncoder._voidRti; |
} |
visitTypedefType(ResolutionTypedefType type, Emitter emitter) { |