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

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

Issue 2260223002: Add SSA instructions for reified type information (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 4 years, 4 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
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 2837 matching lines...) Expand 10 before | Expand all | Expand 10 after
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));
Siggi Cherem (dart-lang) 2016/08/19 18:21:46 I thought $builtinTypeInfo was replaced by $ti, is
sra1 2016/08/19 18:47:43 Yes, the renaming is part of the other CL
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));
Siggi Cherem (dart-lang) 2016/08/19 18:21:46 I'm surprised we never registered this before (eve
sra1 2016/08/19 18:47:43 No bug. It was registered via being lowered to a H
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,
2904 (TypeVariableType variable) => arguments[index++]);
2905 if (index != node.inputs.length) {
2906 print('$node $index ${node.inputs}');
Siggi Cherem (dart-lang) 2016/08/19 18:21:46 delete debug code?
sra1 2016/08/19 18:47:43 Done. That was from debugging https://codereview.c
2907 }
2908 assert(index == node.inputs.length);
2909 push(result);
2910 return;
2911
2912 case TypeInfoExpressionKind.INSTANCE:
2913 // We expect only flat types for the INSTANCE representation.
2914 assert(
2915 node.dartType == (node.dartType.element as ClassElement).thisType);
2916 registry.registerInstantiatedClass(coreClasses.listClass);
2917 push(new js.ArrayInitializer(arguments)
2918 .withSourceInformation(node.sourceInformation));
2919 }
2920 }
2921
2922 bool needsSubstitutionForTypeVariableAccess(ClassElement cls) {
2923 ClassWorld classWorld = compiler.world;
2924 if (classWorld.isUsedAsMixin(cls)) return true;
2925
2926 return compiler.world.anyStrictSubclassOf(cls, (ClassElement subclass) {
2927 return !backend.rti.isTrivialSubstitution(subclass, cls);
2928 });
2929 }
2930
2858 void visitReadTypeVariable(HReadTypeVariable node) { 2931 void visitReadTypeVariable(HReadTypeVariable node) {
2859 TypeVariableElement element = node.dartType.element; 2932 TypeVariableElement element = node.dartType.element;
2860 Element helperElement = helpers.convertRtiToRuntimeType; 2933 Element helperElement = helpers.convertRtiToRuntimeType;
2861 registry.registerStaticUse( 2934 registry.registerStaticUse(
2862 new StaticUse.staticInvoke(helperElement, CallStructure.ONE_ARG)); 2935 new StaticUse.staticInvoke(helperElement, CallStructure.ONE_ARG));
2863 2936
2864 use(node.inputs[0]); 2937 use(node.inputs[0]);
2865 if (node.hasReceiver) { 2938 if (node.hasReceiver) {
2866 if (backend.isInterceptorClass(element.enclosingClass)) { 2939 if (backend.isInterceptorClass(element.enclosingClass)) {
2867 int index = element.index; 2940 int index = element.index;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
2914 registry.registerStaticUse(new StaticUse.staticInvoke( 2987 registry.registerStaticUse(new StaticUse.staticInvoke(
2915 helper, new CallStructure.unnamed(argumentCount))); 2988 helper, new CallStructure.unnamed(argumentCount)));
2916 return backend.emitter.staticFunctionAccess(helper); 2989 return backend.emitter.staticFunctionAccess(helper);
2917 } 2990 }
2918 2991
2919 @override 2992 @override
2920 void visitRef(HRef node) { 2993 void visitRef(HRef node) {
2921 visit(node.value); 2994 visit(node.value);
2922 } 2995 }
2923 } 2996 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698