| OLD | NEW | 
|---|
| 1 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file | 
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a | 
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. | 
| 4 | 4 | 
| 5 import '../common.dart'; | 5 import '../common.dart'; | 
| 6 import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem; | 6 import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem; | 
| 7 import '../common/tasks.dart' show CompilerTask; | 7 import '../common/tasks.dart' show CompilerTask; | 
| 8 import '../compiler.dart' show Compiler; | 8 import '../compiler.dart' show Compiler; | 
| 9 import '../constants/constant_system.dart'; | 9 import '../constants/constant_system.dart'; | 
| 10 import '../constants/values.dart'; | 10 import '../constants/values.dart'; | 
| (...skipping 2837 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2848     } else { | 2848     } else { | 
| 2849       var arguments = [ | 2849       var arguments = [ | 
| 2850         returnType, | 2850         returnType, | 
| 2851         new js.ArrayInitializer(parameterTypes), | 2851         new js.ArrayInitializer(parameterTypes), | 
| 2852         new js.ObjectInitializer(namedParameters) | 2852         new js.ObjectInitializer(namedParameters) | 
| 2853       ]; | 2853       ]; | 
| 2854       push(js.js('#(#)', [accessHelper('buildNamedFunctionType'), arguments])); | 2854       push(js.js('#(#)', [accessHelper('buildNamedFunctionType'), arguments])); | 
| 2855     } | 2855     } | 
| 2856   } | 2856   } | 
| 2857 | 2857 | 
|  | 2858   void visitTypeInfoReadRaw(HTypeInfoReadRaw node) { | 
|  | 2859     use(node.inputs[0]); | 
|  | 2860     js.Expression receiver = pop(); | 
|  | 2861     push(js.js(r'#.$builtinTypeInfo', receiver)); | 
|  | 2862   } | 
|  | 2863 | 
|  | 2864   void visitTypeInfoReadVariable(HTypeInfoReadVariable node) { | 
|  | 2865     TypeVariableElement element = node.variable.element; | 
|  | 2866     ClassElement context = element.enclosingClass; | 
|  | 2867 | 
|  | 2868     int index = element.index; | 
|  | 2869     use(node.inputs[0]); | 
|  | 2870     js.Expression receiver = pop(); | 
|  | 2871 | 
|  | 2872     if (needsSubstitutionForTypeVariableAccess(context)) { | 
|  | 2873       js.Expression typeName = | 
|  | 2874           js.quoteName(backend.namer.runtimeTypeName(context)); | 
|  | 2875       Element helperElement = helpers.getRuntimeTypeArgument; | 
|  | 2876       registry.registerStaticUse( | 
|  | 2877           new StaticUse.staticInvoke(helperElement, CallStructure.THREE_ARGS)); | 
|  | 2878       js.Expression helper = | 
|  | 2879           backend.emitter.staticFunctionAccess(helperElement); | 
|  | 2880       push(js.js( | 
|  | 2881           r'#(#, #, #)', [helper, receiver, typeName, js.js.number(index)])); | 
|  | 2882     } else { | 
|  | 2883       Element helperElement = helpers.getTypeArgumentByIndex; | 
|  | 2884       registry.registerStaticUse( | 
|  | 2885           new StaticUse.staticInvoke(helperElement, CallStructure.TWO_ARGS)); | 
|  | 2886       js.Expression helper = | 
|  | 2887           backend.emitter.staticFunctionAccess(helperElement); | 
|  | 2888       push(js.js(r'#(#, #)', [helper, receiver, js.js.number(index)])); | 
|  | 2889     } | 
|  | 2890   } | 
|  | 2891 | 
|  | 2892   void visitTypeInfoExpression(HTypeInfoExpression node) { | 
|  | 2893     List<js.Expression> arguments = <js.Expression>[]; | 
|  | 2894     for (HInstruction input in node.inputs) { | 
|  | 2895       use(input); | 
|  | 2896       arguments.add(pop()); | 
|  | 2897     } | 
|  | 2898 | 
|  | 2899     switch (node.kind) { | 
|  | 2900       case TypeInfoExpressionKind.COMPLETE: | 
|  | 2901         int index = 0; | 
|  | 2902         js.Expression result = backend.rtiEncoder.getTypeRepresentation( | 
|  | 2903             node.dartType, (TypeVariableType variable) => arguments[index++]); | 
|  | 2904         assert(index == node.inputs.length); | 
|  | 2905         push(result); | 
|  | 2906         return; | 
|  | 2907 | 
|  | 2908       case TypeInfoExpressionKind.INSTANCE: | 
|  | 2909         // We expect only flat types for the INSTANCE representation. | 
|  | 2910         assert( | 
|  | 2911             node.dartType == (node.dartType.element as ClassElement).thisType); | 
|  | 2912         registry.registerInstantiatedClass(coreClasses.listClass); | 
|  | 2913         push(new js.ArrayInitializer(arguments) | 
|  | 2914             .withSourceInformation(node.sourceInformation)); | 
|  | 2915     } | 
|  | 2916   } | 
|  | 2917 | 
|  | 2918   bool needsSubstitutionForTypeVariableAccess(ClassElement cls) { | 
|  | 2919     ClassWorld classWorld = compiler.world; | 
|  | 2920     if (classWorld.isUsedAsMixin(cls)) return true; | 
|  | 2921 | 
|  | 2922     return compiler.world.anyStrictSubclassOf(cls, (ClassElement subclass) { | 
|  | 2923       return !backend.rti.isTrivialSubstitution(subclass, cls); | 
|  | 2924     }); | 
|  | 2925   } | 
|  | 2926 | 
| 2858   void visitReadTypeVariable(HReadTypeVariable node) { | 2927   void visitReadTypeVariable(HReadTypeVariable node) { | 
| 2859     TypeVariableElement element = node.dartType.element; | 2928     TypeVariableElement element = node.dartType.element; | 
| 2860     Element helperElement = helpers.convertRtiToRuntimeType; | 2929     Element helperElement = helpers.convertRtiToRuntimeType; | 
| 2861     registry.registerStaticUse( | 2930     registry.registerStaticUse( | 
| 2862         new StaticUse.staticInvoke(helperElement, CallStructure.ONE_ARG)); | 2931         new StaticUse.staticInvoke(helperElement, CallStructure.ONE_ARG)); | 
| 2863 | 2932 | 
| 2864     use(node.inputs[0]); | 2933     use(node.inputs[0]); | 
| 2865     if (node.hasReceiver) { | 2934     if (node.hasReceiver) { | 
| 2866       if (backend.isInterceptorClass(element.enclosingClass)) { | 2935       if (backend.isInterceptorClass(element.enclosingClass)) { | 
| 2867         int index = element.index; | 2936         int index = element.index; | 
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2914     registry.registerStaticUse(new StaticUse.staticInvoke( | 2983     registry.registerStaticUse(new StaticUse.staticInvoke( | 
| 2915         helper, new CallStructure.unnamed(argumentCount))); | 2984         helper, new CallStructure.unnamed(argumentCount))); | 
| 2916     return backend.emitter.staticFunctionAccess(helper); | 2985     return backend.emitter.staticFunctionAccess(helper); | 
| 2917   } | 2986   } | 
| 2918 | 2987 | 
| 2919   @override | 2988   @override | 
| 2920   void visitRef(HRef node) { | 2989   void visitRef(HRef node) { | 
| 2921     visit(node.value); | 2990     visit(node.value); | 
| 2922   } | 2991   } | 
| 2923 } | 2992 } | 
| OLD | NEW | 
|---|