| Index: pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
|
| diff --git a/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart b/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
|
| index 9c48f4d82a2186b94feffa6dd68e115bb35724fa..f2997aa76738c6b71108c105a4d2ed6d9314d649 100644
|
| --- a/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
|
| +++ b/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
|
| @@ -5,8 +5,8 @@
|
| part of dart2js.js_emitter;
|
|
|
| // Function signatures used in the generation of runtime type information.
|
| -typedef void FunctionTypeSignatureEmitter(Element method,
|
| - FunctionType methodType);
|
| +typedef void FunctionTypeSignatureEmitter(
|
| + Element method, FunctionType methodType);
|
|
|
| typedef void SubstitutionEmitter(Element element, {bool emitNull});
|
|
|
| @@ -37,8 +37,7 @@ class RuntimeTypeGenerator {
|
| TypeTestRegistry get typeTestRegistry => emitterTask.typeTestRegistry;
|
| CoreClasses get coreClasses => compiler.coreClasses;
|
|
|
| - Set<ClassElement> get checkedClasses =>
|
| - typeTestRegistry.checkedClasses;
|
| + Set<ClassElement> get checkedClasses => typeTestRegistry.checkedClasses;
|
|
|
| Iterable<ClassElement> get classesUsingTypeVariableTests =>
|
| typeTestRegistry.classesUsingTypeVariableTests;
|
| @@ -56,9 +55,8 @@ class RuntimeTypeGenerator {
|
| /// type (if class has one) in the metadata object and stores its index in
|
| /// the result. This is only possible for function types that do not contain
|
| /// type variables.
|
| - TypeTestProperties generateIsTests(
|
| - ClassElement classElement,
|
| - { bool storeFunctionTypeInMetadata: true}) {
|
| + TypeTestProperties generateIsTests(ClassElement classElement,
|
| + {bool storeFunctionTypeInMetadata: true}) {
|
| assert(invariant(classElement, classElement.isDeclaration));
|
|
|
| TypeTestProperties result = new TypeTestProperties();
|
| @@ -69,14 +67,13 @@ class RuntimeTypeGenerator {
|
| /// native classes.
|
| /// TODO(herhut): Generate tests for native classes dynamically, as well.
|
| void generateIsTest(Element other) {
|
| - if (backend.isNative(classElement) ||
|
| - !classElement.isSubclassOf(other)) {
|
| + if (backend.isNative(classElement) || !classElement.isSubclassOf(other)) {
|
| result.properties[namer.operatorIs(other)] = js('1');
|
| }
|
| }
|
|
|
| - void generateFunctionTypeSignature(FunctionElement method,
|
| - FunctionType type) {
|
| + void generateFunctionTypeSignature(
|
| + FunctionElement method, FunctionType type) {
|
| assert(method.isImplementation);
|
| jsAst.Expression thisAccess = new jsAst.This();
|
| ClosureClassMap closureData =
|
| @@ -97,8 +94,7 @@ class RuntimeTypeGenerator {
|
| RuntimeTypesEncoder rtiEncoder = backend.rtiEncoder;
|
| jsAst.Expression encoding =
|
| rtiEncoder.getSignatureEncoding(type, thisAccess);
|
| - jsAst.Name operatorSignature =
|
| - namer.asName(namer.operatorSignature);
|
| + jsAst.Name operatorSignature = namer.asName(namer.operatorSignature);
|
| result.properties[operatorSignature] = encoding;
|
| }
|
| }
|
| @@ -134,9 +130,7 @@ class RuntimeTypeGenerator {
|
| }
|
|
|
| _generateIsTestsOn(classElement, generateIsTest,
|
| - generateFunctionTypeSignature,
|
| - generateSubstitution,
|
| - generateTypeCheck);
|
| + generateFunctionTypeSignature, generateSubstitution, generateTypeCheck);
|
|
|
| return result;
|
| }
|
| @@ -211,7 +205,8 @@ class RuntimeTypeGenerator {
|
| }
|
| }
|
|
|
| - void emitNothing(_, {emitNull}) {};
|
| + void emitNothing(_, {emitNull}) {}
|
| + ;
|
|
|
| generateSubstitution = emitNothing;
|
| }
|
| @@ -230,10 +225,8 @@ class RuntimeTypeGenerator {
|
| // A superclass might already implement the Function interface. In such
|
| // a case, we can avoid emiting the is test here.
|
| if (!cls.superclass.implementsFunction(coreClasses)) {
|
| - _generateInterfacesIsTests(coreClasses.functionClass,
|
| - generateIsTest,
|
| - generateSubstitution,
|
| - generated);
|
| + _generateInterfacesIsTests(coreClasses.functionClass, generateIsTest,
|
| + generateSubstitution, generated);
|
| }
|
| FunctionType callType = callFunction.computeType(compiler.resolution);
|
| generateFunctionTypeSignature(callFunction, callType);
|
| @@ -242,40 +235,42 @@ class RuntimeTypeGenerator {
|
|
|
| for (DartType interfaceType in cls.interfaces) {
|
| _generateInterfacesIsTests(interfaceType.element, generateIsTest,
|
| - generateSubstitution, generated);
|
| + generateSubstitution, generated);
|
| }
|
| }
|
|
|
| /**
|
| * Generate "is tests" where [cls] is being implemented.
|
| */
|
| - void _generateInterfacesIsTests(ClassElement cls,
|
| - void generateIsTest(ClassElement element),
|
| - SubstitutionEmitter generateSubstitution,
|
| - Set<Element> alreadyGenerated) {
|
| + void _generateInterfacesIsTests(
|
| + ClassElement cls,
|
| + void generateIsTest(ClassElement element),
|
| + SubstitutionEmitter generateSubstitution,
|
| + Set<Element> alreadyGenerated) {
|
| void tryEmitTest(ClassElement check) {
|
| if (!alreadyGenerated.contains(check) && checkedClasses.contains(check)) {
|
| alreadyGenerated.add(check);
|
| generateIsTest(check);
|
| generateSubstitution(check);
|
| }
|
| - };
|
| + }
|
| + ;
|
|
|
| tryEmitTest(cls);
|
|
|
| for (DartType interfaceType in cls.interfaces) {
|
| Element element = interfaceType.element;
|
| tryEmitTest(element);
|
| - _generateInterfacesIsTests(element, generateIsTest, generateSubstitution,
|
| - alreadyGenerated);
|
| + _generateInterfacesIsTests(
|
| + element, generateIsTest, generateSubstitution, alreadyGenerated);
|
| }
|
|
|
| // We need to also emit "is checks" for the superclass and its supertypes.
|
| ClassElement superclass = cls.superclass;
|
| if (superclass != null) {
|
| tryEmitTest(superclass);
|
| - _generateInterfacesIsTests(superclass, generateIsTest,
|
| - generateSubstitution, alreadyGenerated);
|
| + _generateInterfacesIsTests(
|
| + superclass, generateIsTest, generateSubstitution, alreadyGenerated);
|
| }
|
| }
|
|
|
| @@ -283,20 +278,20 @@ class RuntimeTypeGenerator {
|
| List<StubMethod> stubs = <StubMethod>[];
|
| ClassElement superclass = classElement;
|
| while (superclass != null) {
|
| - for (TypeVariableType parameter in superclass.typeVariables) {
|
| - if (backend.emitter.readTypeVariables.contains(parameter.element)) {
|
| - stubs.add(
|
| - _generateTypeVariableReader(classElement, parameter.element));
|
| - }
|
| + for (TypeVariableType parameter in superclass.typeVariables) {
|
| + if (backend.emitter.readTypeVariables.contains(parameter.element)) {
|
| + stubs.add(
|
| + _generateTypeVariableReader(classElement, parameter.element));
|
| }
|
| - superclass = superclass.superclass;
|
| }
|
| + superclass = superclass.superclass;
|
| + }
|
|
|
| return stubs;
|
| }
|
|
|
| - StubMethod _generateTypeVariableReader(ClassElement cls,
|
| - TypeVariableElement element) {
|
| + StubMethod _generateTypeVariableReader(
|
| + ClassElement cls, TypeVariableElement element) {
|
| jsAst.Name name = namer.nameForReadTypeVariable(element);
|
| int index = element.index;
|
| jsAst.Expression computeTypeVariable;
|
| @@ -304,21 +299,22 @@ class RuntimeTypeGenerator {
|
| Substitution substitution =
|
| backend.rti.getSubstitution(cls, element.typeDeclaration);
|
| if (substitution != null) {
|
| - computeTypeVariable =
|
| - js(r'#.apply(null, this.$builtinTypeInfo)',
|
| - backend.rtiEncoder.getSubstitutionCodeForVariable(
|
| - substitution, index));
|
| + computeTypeVariable = js(
|
| + r'#.apply(null, this.$builtinTypeInfo)',
|
| + backend.rtiEncoder
|
| + .getSubstitutionCodeForVariable(substitution, index));
|
| } else {
|
| // TODO(ahe): These can be generated dynamically.
|
| - computeTypeVariable =
|
| - js(r'this.$builtinTypeInfo && this.$builtinTypeInfo[#]',
|
| - js.number(index));
|
| + computeTypeVariable = js(
|
| + r'this.$builtinTypeInfo && this.$builtinTypeInfo[#]',
|
| + js.number(index));
|
| }
|
| jsAst.Expression convertRtiToRuntimeType = backend.emitter
|
| - .staticFunctionAccess(backend.helpers.convertRtiToRuntimeType);
|
| + .staticFunctionAccess(backend.helpers.convertRtiToRuntimeType);
|
|
|
| - return new StubMethod(name,
|
| - js('function () { return #(#) }',
|
| - [convertRtiToRuntimeType, computeTypeVariable]));
|
| + return new StubMethod(
|
| + name,
|
| + js('function () { return #(#) }',
|
| + [convertRtiToRuntimeType, computeTypeVariable]));
|
| }
|
| }
|
|
|