Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(170)

Side by Side Diff: pkg/compiler/lib/src/ssa/codegen.dart

Issue 2352913003: Use indexing for type variable access when the receiver type constrains the substitution(s) (Closed)
Patch Set: rebase and fix Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 2840 matching lines...) Expand 10 before | Expand all | Expand 10 after
2851 } 2851 }
2852 2852
2853 void visitTypeInfoReadRaw(HTypeInfoReadRaw node) { 2853 void visitTypeInfoReadRaw(HTypeInfoReadRaw node) {
2854 use(node.inputs[0]); 2854 use(node.inputs[0]);
2855 js.Expression receiver = pop(); 2855 js.Expression receiver = pop();
2856 push(js.js(r'#.#', [receiver, backend.namer.rtiFieldName])); 2856 push(js.js(r'#.#', [receiver, backend.namer.rtiFieldName]));
2857 } 2857 }
2858 2858
2859 void visitTypeInfoReadVariable(HTypeInfoReadVariable node) { 2859 void visitTypeInfoReadVariable(HTypeInfoReadVariable node) {
2860 TypeVariableElement element = node.variable.element; 2860 TypeVariableElement element = node.variable.element;
2861 ClassElement context = element.enclosingClass;
2862 2861
2863 int index = element.index; 2862 int index = element.index;
2864 use(node.inputs[0]); 2863 HInstruction object = node.object;
2864 use(object);
2865 js.Expression receiver = pop(); 2865 js.Expression receiver = pop();
2866 2866
2867 if (needsSubstitutionForTypeVariableAccess(context)) { 2867 if (typeVariableAccessNeedsSubstitution(element, object.instructionType)) {
2868 js.Expression typeName = 2868 js.Expression typeName =
2869 js.quoteName(backend.namer.runtimeTypeName(context)); 2869 js.quoteName(backend.namer.runtimeTypeName(element.enclosingClass));
2870 Element helperElement = helpers.getRuntimeTypeArgument; 2870 Element helperElement = helpers.getRuntimeTypeArgument;
2871 registry.registerStaticUse( 2871 registry.registerStaticUse(
2872 new StaticUse.staticInvoke(helperElement, CallStructure.THREE_ARGS)); 2872 new StaticUse.staticInvoke(helperElement, CallStructure.THREE_ARGS));
2873 js.Expression helper = 2873 js.Expression helper =
2874 backend.emitter.staticFunctionAccess(helperElement); 2874 backend.emitter.staticFunctionAccess(helperElement);
2875 push(js.js( 2875 push(js.js(
2876 r'#(#, #, #)', [helper, receiver, typeName, js.js.number(index)])); 2876 r'#(#, #, #)', [helper, receiver, typeName, js.js.number(index)]));
2877 } else { 2877 } else {
2878 Element helperElement = helpers.getTypeArgumentByIndex; 2878 Element helperElement = helpers.getTypeArgumentByIndex;
2879 registry.registerStaticUse( 2879 registry.registerStaticUse(
(...skipping 23 matching lines...) Expand all
2903 case TypeInfoExpressionKind.INSTANCE: 2903 case TypeInfoExpressionKind.INSTANCE:
2904 // We expect only flat types for the INSTANCE representation. 2904 // We expect only flat types for the INSTANCE representation.
2905 assert( 2905 assert(
2906 node.dartType == (node.dartType.element as ClassElement).thisType); 2906 node.dartType == (node.dartType.element as ClassElement).thisType);
2907 registry.registerInstantiatedClass(coreClasses.listClass); 2907 registry.registerInstantiatedClass(coreClasses.listClass);
2908 push(new js.ArrayInitializer(arguments) 2908 push(new js.ArrayInitializer(arguments)
2909 .withSourceInformation(node.sourceInformation)); 2909 .withSourceInformation(node.sourceInformation));
2910 } 2910 }
2911 } 2911 }
2912 2912
2913 bool needsSubstitutionForTypeVariableAccess(ClassElement cls) { 2913 bool typeVariableAccessNeedsSubstitution(
2914 TypeVariableElement element, TypeMask receiverMask) {
2915 ClassElement cls = element.enclosingClass;
2914 ClassWorld classWorld = compiler.closedWorld; 2916 ClassWorld classWorld = compiler.closedWorld;
2917
2918 // See if the receiver type narrows the set of classes to ones that can be
2919 // indexed.
2920 // TODO(sra): Currently the only convenient query is [singleClass]. We
2921 // should iterate over all the concrete classes in [receiverMask].
2922 ClassElement receiverClass = receiverMask.singleClass(classWorld);
2923 if (receiverClass != null) {
2924 if (backend.rti.isTrivialSubstitution(receiverClass, cls)) {
2925 return false;
2926 }
2927 }
2928
2915 if (classWorld.isUsedAsMixin(cls)) return true; 2929 if (classWorld.isUsedAsMixin(cls)) return true;
2916 2930
2917 return compiler.closedWorld.anyStrictSubclassOf(cls, 2931 return classWorld.anyStrictSubclassOf(cls, (ClassElement subclass) {
2918 (ClassElement subclass) {
2919 return !backend.rti.isTrivialSubstitution(subclass, cls); 2932 return !backend.rti.isTrivialSubstitution(subclass, cls);
2920 }); 2933 });
2921 } 2934 }
2922 2935
2923 void visitReadTypeVariable(HReadTypeVariable node) { 2936 void visitReadTypeVariable(HReadTypeVariable node) {
2924 TypeVariableElement element = node.dartType.element; 2937 TypeVariableElement element = node.dartType.element;
2925 Element helperElement = helpers.convertRtiToRuntimeType; 2938 Element helperElement = helpers.convertRtiToRuntimeType;
2926 registry.registerStaticUse( 2939 registry.registerStaticUse(
2927 new StaticUse.staticInvoke(helperElement, CallStructure.ONE_ARG)); 2940 new StaticUse.staticInvoke(helperElement, CallStructure.ONE_ARG));
2928 2941
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
2986 registry.registerStaticUse(new StaticUse.staticInvoke( 2999 registry.registerStaticUse(new StaticUse.staticInvoke(
2987 helper, new CallStructure.unnamed(argumentCount))); 3000 helper, new CallStructure.unnamed(argumentCount)));
2988 return backend.emitter.staticFunctionAccess(helper); 3001 return backend.emitter.staticFunctionAccess(helper);
2989 } 3002 }
2990 3003
2991 @override 3004 @override
2992 void visitRef(HRef node) { 3005 void visitRef(HRef node) {
2993 visit(node.value); 3006 visit(node.value);
2994 } 3007 }
2995 } 3008 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698