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

Side by Side Diff: dart/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart

Issue 50313007: Implement dynamic function checks. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Merged with r30787 Created 7 years 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 | Annotate | Revision Log
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 part of ssa; 5 part of ssa;
6 6
7 abstract class HVisitor<R> { 7 abstract class HVisitor<R> {
8 R visitAdd(HAdd node); 8 R visitAdd(HAdd node);
9 R visitBitAnd(HBitAnd node); 9 R visitBitAnd(HBitAnd node);
10 R visitBitNot(HBitNot node); 10 R visitBitNot(HBitNot node);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 R visitStringConcat(HStringConcat node); 61 R visitStringConcat(HStringConcat node);
62 R visitStringify(HStringify node); 62 R visitStringify(HStringify node);
63 R visitSubtract(HSubtract node); 63 R visitSubtract(HSubtract node);
64 R visitSwitch(HSwitch node); 64 R visitSwitch(HSwitch node);
65 R visitThis(HThis node); 65 R visitThis(HThis node);
66 R visitThrow(HThrow node); 66 R visitThrow(HThrow node);
67 R visitThrowExpression(HThrowExpression node); 67 R visitThrowExpression(HThrowExpression node);
68 R visitTry(HTry node); 68 R visitTry(HTry node);
69 R visitTypeConversion(HTypeConversion node); 69 R visitTypeConversion(HTypeConversion node);
70 R visitTypeKnown(HTypeKnown node); 70 R visitTypeKnown(HTypeKnown node);
71 R visitReadTypeVariable(HReadTypeVariable node);
72 R visitFunctionType(HFunctionType node);
73 R visitVoidType(HVoidType node);
74 R visitInterfaceType(HInterfaceType node);
75 R visitDynamicType(HDynamicType node);
71 } 76 }
72 77
73 abstract class HGraphVisitor { 78 abstract class HGraphVisitor {
74 visitDominatorTree(HGraph graph) { 79 visitDominatorTree(HGraph graph) {
75 void visitBasicBlockAndSuccessors(HBasicBlock block) { 80 void visitBasicBlockAndSuccessors(HBasicBlock block) {
76 visitBasicBlock(block); 81 visitBasicBlock(block);
77 List dominated = block.dominatedBlocks; 82 List dominated = block.dominatedBlocks;
78 for (int i = 0; i < dominated.length; i++) { 83 for (int i = 0; i < dominated.length; i++) {
79 visitBasicBlockAndSuccessors(dominated[i]); 84 visitBasicBlockAndSuccessors(dominated[i]);
80 } 85 }
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
323 visitStaticStore(HStaticStore node) => visitInstruction(node); 328 visitStaticStore(HStaticStore node) => visitInstruction(node);
324 visitStringConcat(HStringConcat node) => visitInstruction(node); 329 visitStringConcat(HStringConcat node) => visitInstruction(node);
325 visitStringify(HStringify node) => visitInstruction(node); 330 visitStringify(HStringify node) => visitInstruction(node);
326 visitThis(HThis node) => visitParameterValue(node); 331 visitThis(HThis node) => visitParameterValue(node);
327 visitThrow(HThrow node) => visitControlFlow(node); 332 visitThrow(HThrow node) => visitControlFlow(node);
328 visitThrowExpression(HThrowExpression node) => visitInstruction(node); 333 visitThrowExpression(HThrowExpression node) => visitInstruction(node);
329 visitTry(HTry node) => visitControlFlow(node); 334 visitTry(HTry node) => visitControlFlow(node);
330 visitIs(HIs node) => visitInstruction(node); 335 visitIs(HIs node) => visitInstruction(node);
331 visitTypeConversion(HTypeConversion node) => visitCheck(node); 336 visitTypeConversion(HTypeConversion node) => visitCheck(node);
332 visitTypeKnown(HTypeKnown node) => visitCheck(node); 337 visitTypeKnown(HTypeKnown node) => visitCheck(node);
338 visitReadTypeVariable(HReadTypeVariable node) => visitInstruction(node);
339 visitFunctionType(HFunctionType node) => visitInstruction(node);
340 visitVoidType(HVoidType node) => visitInstruction(node);
341 visitInterfaceType(HInterfaceType node) => visitInstruction(node);
342 visitDynamicType(HDynamicType node) => visitInstruction(node);
333 } 343 }
334 344
335 class SubGraph { 345 class SubGraph {
336 // The first and last block of the sub-graph. 346 // The first and last block of the sub-graph.
337 final HBasicBlock start; 347 final HBasicBlock start;
338 final HBasicBlock end; 348 final HBasicBlock end;
339 349
340 const SubGraph(this.start, this.end); 350 const SubGraph(this.start, this.end);
341 351
342 bool contains(HBasicBlock block) { 352 bool contains(HBasicBlock block) {
(...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after
776 static const int STATIC_TYPECODE = 21; 786 static const int STATIC_TYPECODE = 21;
777 static const int STATIC_STORE_TYPECODE = 22; 787 static const int STATIC_STORE_TYPECODE = 22;
778 static const int FIELD_GET_TYPECODE = 23; 788 static const int FIELD_GET_TYPECODE = 23;
779 static const int TYPE_CONVERSION_TYPECODE = 24; 789 static const int TYPE_CONVERSION_TYPECODE = 24;
780 static const int TYPE_KNOWN_TYPECODE = 25; 790 static const int TYPE_KNOWN_TYPECODE = 25;
781 static const int INVOKE_STATIC_TYPECODE = 26; 791 static const int INVOKE_STATIC_TYPECODE = 26;
782 static const int INDEX_TYPECODE = 27; 792 static const int INDEX_TYPECODE = 27;
783 static const int IS_TYPECODE = 28; 793 static const int IS_TYPECODE = 28;
784 static const int INVOKE_DYNAMIC_TYPECODE = 29; 794 static const int INVOKE_DYNAMIC_TYPECODE = 29;
785 static const int SHIFT_RIGHT_TYPECODE = 30; 795 static const int SHIFT_RIGHT_TYPECODE = 30;
796 static const int READ_TYPE_VARIABLE_TYPECODE = 31;
797 static const int FUNCTION_TYPE_TYPECODE = 32;
798 static const int VOID_TYPE_TYPECODE = 33;
799 static const int INTERFACE_TYPE_TYPECODE = 34;
800 static const int DYNAMIC_TYPE_TYPECODE = 35;
786 801
787 HInstruction(this.inputs, this.instructionType) 802 HInstruction(this.inputs, this.instructionType)
788 : id = idCounter++, usedBy = <HInstruction>[] { 803 : id = idCounter++, usedBy = <HInstruction>[] {
789 assert(inputs.every((e) => e != null)); 804 assert(inputs.every((e) => e != null));
790 } 805 }
791 806
792 int get hashCode => id; 807 int get hashCode => id;
793 808
794 bool useGvn() => _useGvn; 809 bool useGvn() => _useGvn;
795 void setUseGvn() { _useGvn = true; } 810 void setUseGvn() { _useGvn = true; }
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
964 } 979 }
965 980
966 bool isPrimitiveOrNull(Compiler compiler) { 981 bool isPrimitiveOrNull(Compiler compiler) {
967 return isIndexablePrimitive(compiler) 982 return isIndexablePrimitive(compiler)
968 || isNumberOrNull(compiler) 983 || isNumberOrNull(compiler)
969 || isBooleanOrNull(compiler) 984 || isBooleanOrNull(compiler)
970 || isNull(); 985 || isNull();
971 } 986 }
972 987
973 /** 988 /**
974 * Type of the unstruction. 989 * Type of the instruction.
975 */ 990 */
976 TypeMask instructionType; 991 TypeMask instructionType;
977 992
978 Selector get selector => null; 993 Selector get selector => null;
979 HInstruction getDartReceiver(Compiler compiler) => null; 994 HInstruction getDartReceiver(Compiler compiler) => null;
980 bool onlyThrowsNSM() => false; 995 bool onlyThrowsNSM() => false;
981 996
982 bool isInBasicBlock() => block != null; 997 bool isInBasicBlock() => block != null;
983 998
984 String inputsToString() { 999 String inputsToString() {
(...skipping 1832 matching lines...) Expand 10 before | Expand all | Expand 10 after
2817 this.finallyBlock); 2832 this.finallyBlock);
2818 2833
2819 HBasicBlock get start => body.start; 2834 HBasicBlock get start => body.start;
2820 HBasicBlock get end => 2835 HBasicBlock get end =>
2821 finallyBlock == null ? catchBlock.end : finallyBlock.end; 2836 finallyBlock == null ? catchBlock.end : finallyBlock.end;
2822 2837
2823 bool accept(HStatementInformationVisitor visitor) => 2838 bool accept(HStatementInformationVisitor visitor) =>
2824 visitor.visitTryInfo(this); 2839 visitor.visitTryInfo(this);
2825 } 2840 }
2826 2841
2827
2828
2829 class HSwitchBlockInformation implements HStatementInformation { 2842 class HSwitchBlockInformation implements HStatementInformation {
2830 final HExpressionInformation expression; 2843 final HExpressionInformation expression;
2831 final List<HStatementInformation> statements; 2844 final List<HStatementInformation> statements;
2832 final TargetElement target; 2845 final TargetElement target;
2833 final List<LabelElement> labels; 2846 final List<LabelElement> labels;
2834 2847
2835 HSwitchBlockInformation(this.expression, 2848 HSwitchBlockInformation(this.expression,
2836 this.statements, 2849 this.statements,
2837 this.target, 2850 this.target,
2838 this.labels); 2851 this.labels);
2839 2852
2840 HBasicBlock get start => expression.start; 2853 HBasicBlock get start => expression.start;
2841 HBasicBlock get end { 2854 HBasicBlock get end {
2842 // We don't create a switch block if there are no cases. 2855 // We don't create a switch block if there are no cases.
2843 assert(!statements.isEmpty); 2856 assert(!statements.isEmpty);
2844 return statements.last.end; 2857 return statements.last.end;
2845 } 2858 }
2846 2859
2847 bool accept(HStatementInformationVisitor visitor) => 2860 bool accept(HStatementInformationVisitor visitor) =>
2848 visitor.visitSwitchInfo(this); 2861 visitor.visitSwitchInfo(this);
2849 } 2862 }
2863
2864 class HReadTypeVariable extends HInstruction {
2865 /// The type variable being read.
2866 final TypeVariableType dartType;
2867
2868 final bool hasReceiver;
2869
2870 HReadTypeVariable(this.dartType,
2871 HInstruction receiver,
2872 TypeMask instructionType)
2873 : hasReceiver = true,
2874 super(<HInstruction>[receiver], instructionType) {
2875 setUseGvn();
2876 }
2877
2878 HReadTypeVariable.noReceiver(this.dartType,
2879 HInstruction typeArguments,
Johnni Winther 2013/12/03 10:33:16 typeArguments -> typeArgument.
ahe 2013/12/05 14:24:23 Done.
2880 TypeMask instructionType)
2881 : hasReceiver = false,
2882 super(<HInstruction>[typeArguments], instructionType) {
2883 setUseGvn();
2884 }
2885
2886 accept(HVisitor visitor) => visitor.visitReadTypeVariable(this);
2887
2888 bool canThrow() => false;
2889
2890 int typeCode() => HInstruction.READ_TYPE_VARIABLE_TYPECODE;
2891 bool typeEquals(HInstruction other) => other is HReadTypeVariable;
2892
2893 bool dataEquals(HReadTypeVariable other) {
2894 return dartType.element == other.dartType.element
2895 && hasReceiver == other.hasReceiver;
2896 }
2897 }
2898
2899 abstract class HRuntimeType extends HInstruction {
2900 final DartType dartType;
2901
2902 HRuntimeType(List<HInstruction> inputs,
2903 this.dartType,
2904 TypeMask instructionType)
2905 : super(inputs, instructionType) {
2906 setUseGvn();
2907 }
2908
2909 bool canThrow() => false;
2910
2911 int typeCode() {
2912 throw 'abstract method';
2913 }
2914
2915 bool typeEquals(HInstruction other) {
2916 throw 'abstract method';
2917 }
2918
2919 bool dataEquals(HRuntimeType other) {
2920 return dartType == other.dartType;
2921 }
2922 }
2923
2924 class HFunctionType extends HRuntimeType {
2925 HFunctionType(List<HInstruction> inputs,
2926 FunctionType dartType,
2927 TypeMask instructionType)
2928 : super(inputs, dartType, instructionType);
2929
2930 accept(HVisitor visitor) => visitor.visitFunctionType(this);
2931
2932 int typeCode() => HInstruction.FUNCTION_TYPE_TYPECODE;
2933
2934 bool typeEquals(HInstruction other) => other is HFunctionType;
2935 }
2936
2937 class HVoidType extends HRuntimeType {
2938 HVoidType(VoidType dartType, TypeMask instructionType)
2939 : super(const <HInstruction>[], dartType, instructionType);
2940
2941 accept(HVisitor visitor) => visitor.visitVoidType(this);
2942
2943 int typeCode() => HInstruction.VOID_TYPE_TYPECODE;
2944
2945 bool typeEquals(HInstruction other) => other is HVoidType;
2946 }
2947
2948 class HInterfaceType extends HRuntimeType {
2949 HInterfaceType(List<HInstruction> inputs,
2950 InterfaceType dartType,
2951 TypeMask instructionType)
2952 : super(inputs, dartType, instructionType);
2953
2954 accept(HVisitor visitor) => visitor.visitInterfaceType(this);
2955
2956 int typeCode() => HInstruction.INTERFACE_TYPE_TYPECODE;
2957
2958 bool typeEquals(HInstruction other) => other is HInterfaceType;
2959 }
2960
2961 class HDynamicType extends HRuntimeType {
2962 HDynamicType(DynamicType dartType, TypeMask instructionType)
2963 : super(const <HInstruction>[], dartType, instructionType);
2964
2965 accept(HVisitor visitor) => visitor.visitDynamicType(this);
2966
2967 int typeCode() => HInstruction.DYNAMIC_TYPE_TYPECODE;
2968
2969 bool typeEquals(HInstruction other) => other is HDynamicType;
2970 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698