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

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

Issue 2711783006: Remove HRuntimeType scheme for function types. (Closed)
Patch Set: fix mock library Created 3 years, 9 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 '../closure.dart'; 5 import '../closure.dart';
6 import '../common.dart'; 6 import '../common.dart';
7 import '../common/backend_api.dart' show BackendClasses; 7 import '../common/backend_api.dart' show BackendClasses;
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 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 R visitSubtract(HSubtract node); 90 R visitSubtract(HSubtract node);
91 R visitSwitch(HSwitch node); 91 R visitSwitch(HSwitch node);
92 R visitThis(HThis node); 92 R visitThis(HThis node);
93 R visitThrow(HThrow node); 93 R visitThrow(HThrow node);
94 R visitThrowExpression(HThrowExpression node); 94 R visitThrowExpression(HThrowExpression node);
95 R visitTruncatingDivide(HTruncatingDivide node); 95 R visitTruncatingDivide(HTruncatingDivide node);
96 R visitTry(HTry node); 96 R visitTry(HTry node);
97 R visitTypeConversion(HTypeConversion node); 97 R visitTypeConversion(HTypeConversion node);
98 R visitTypeKnown(HTypeKnown node); 98 R visitTypeKnown(HTypeKnown node);
99 R visitYield(HYield node); 99 R visitYield(HYield node);
100 R visitReadTypeVariable(HReadTypeVariable node);
101 R visitFunctionType(HFunctionType node);
102 R visitVoidType(HVoidType node);
103 R visitInterfaceType(HInterfaceType node);
104 R visitDynamicType(HDynamicType node);
105 100
106 R visitTypeInfoReadRaw(HTypeInfoReadRaw node); 101 R visitTypeInfoReadRaw(HTypeInfoReadRaw node);
107 R visitTypeInfoReadVariable(HTypeInfoReadVariable node); 102 R visitTypeInfoReadVariable(HTypeInfoReadVariable node);
108 R visitTypeInfoExpression(HTypeInfoExpression node); 103 R visitTypeInfoExpression(HTypeInfoExpression node);
109 } 104 }
110 105
111 abstract class HGraphVisitor { 106 abstract class HGraphVisitor {
112 visitDominatorTree(HGraph graph) { 107 visitDominatorTree(HGraph graph) {
113 void visitBasicBlockAndSuccessors(HBasicBlock block) { 108 void visitBasicBlockAndSuccessors(HBasicBlock block) {
114 visitBasicBlock(block); 109 visitBasicBlock(block);
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 visitStringify(HStringify node) => visitInstruction(node); 404 visitStringify(HStringify node) => visitInstruction(node);
410 visitThis(HThis node) => visitParameterValue(node); 405 visitThis(HThis node) => visitParameterValue(node);
411 visitThrow(HThrow node) => visitControlFlow(node); 406 visitThrow(HThrow node) => visitControlFlow(node);
412 visitThrowExpression(HThrowExpression node) => visitInstruction(node); 407 visitThrowExpression(HThrowExpression node) => visitInstruction(node);
413 visitTruncatingDivide(HTruncatingDivide node) => visitBinaryArithmetic(node); 408 visitTruncatingDivide(HTruncatingDivide node) => visitBinaryArithmetic(node);
414 visitTry(HTry node) => visitControlFlow(node); 409 visitTry(HTry node) => visitControlFlow(node);
415 visitIs(HIs node) => visitInstruction(node); 410 visitIs(HIs node) => visitInstruction(node);
416 visitIsViaInterceptor(HIsViaInterceptor node) => visitInstruction(node); 411 visitIsViaInterceptor(HIsViaInterceptor node) => visitInstruction(node);
417 visitTypeConversion(HTypeConversion node) => visitCheck(node); 412 visitTypeConversion(HTypeConversion node) => visitCheck(node);
418 visitTypeKnown(HTypeKnown node) => visitCheck(node); 413 visitTypeKnown(HTypeKnown node) => visitCheck(node);
419 visitReadTypeVariable(HReadTypeVariable node) => visitInstruction(node);
420 visitFunctionType(HFunctionType node) => visitInstruction(node);
421 visitVoidType(HVoidType node) => visitInstruction(node);
422 visitInterfaceType(HInterfaceType node) => visitInstruction(node);
423 visitDynamicType(HDynamicType node) => visitInstruction(node);
424 visitAwait(HAwait node) => visitInstruction(node); 414 visitAwait(HAwait node) => visitInstruction(node);
425 visitYield(HYield node) => visitInstruction(node); 415 visitYield(HYield node) => visitInstruction(node);
426 416
427 visitTypeInfoReadRaw(HTypeInfoReadRaw node) => visitInstruction(node); 417 visitTypeInfoReadRaw(HTypeInfoReadRaw node) => visitInstruction(node);
428 visitTypeInfoReadVariable(HTypeInfoReadVariable node) => 418 visitTypeInfoReadVariable(HTypeInfoReadVariable node) =>
429 visitInstruction(node); 419 visitInstruction(node);
430 visitTypeInfoExpression(HTypeInfoExpression node) => visitInstruction(node); 420 visitTypeInfoExpression(HTypeInfoExpression node) => visitInstruction(node);
431 } 421 }
432 422
433 class SubGraph { 423 class SubGraph {
(...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after
873 static const int STATIC_TYPECODE = 21; 863 static const int STATIC_TYPECODE = 21;
874 static const int STATIC_STORE_TYPECODE = 22; 864 static const int STATIC_STORE_TYPECODE = 22;
875 static const int FIELD_GET_TYPECODE = 23; 865 static const int FIELD_GET_TYPECODE = 23;
876 static const int TYPE_CONVERSION_TYPECODE = 24; 866 static const int TYPE_CONVERSION_TYPECODE = 24;
877 static const int TYPE_KNOWN_TYPECODE = 25; 867 static const int TYPE_KNOWN_TYPECODE = 25;
878 static const int INVOKE_STATIC_TYPECODE = 26; 868 static const int INVOKE_STATIC_TYPECODE = 26;
879 static const int INDEX_TYPECODE = 27; 869 static const int INDEX_TYPECODE = 27;
880 static const int IS_TYPECODE = 28; 870 static const int IS_TYPECODE = 28;
881 static const int INVOKE_DYNAMIC_TYPECODE = 29; 871 static const int INVOKE_DYNAMIC_TYPECODE = 29;
882 static const int SHIFT_RIGHT_TYPECODE = 30; 872 static const int SHIFT_RIGHT_TYPECODE = 30;
883 static const int READ_TYPE_VARIABLE_TYPECODE = 31; 873
884 static const int FUNCTION_TYPE_TYPECODE = 32;
885 static const int VOID_TYPE_TYPECODE = 33;
886 static const int INTERFACE_TYPE_TYPECODE = 34;
887 static const int DYNAMIC_TYPE_TYPECODE = 35;
888 static const int TRUNCATING_DIVIDE_TYPECODE = 36; 874 static const int TRUNCATING_DIVIDE_TYPECODE = 36;
889 static const int IS_VIA_INTERCEPTOR_TYPECODE = 37; 875 static const int IS_VIA_INTERCEPTOR_TYPECODE = 37;
890 876
891 static const int TYPE_INFO_READ_RAW_TYPECODE = 38; 877 static const int TYPE_INFO_READ_RAW_TYPECODE = 38;
892 static const int TYPE_INFO_READ_VARIABLE_TYPECODE = 39; 878 static const int TYPE_INFO_READ_VARIABLE_TYPECODE = 39;
893 static const int TYPE_INFO_EXPRESSION_TYPECODE = 40; 879 static const int TYPE_INFO_EXPRESSION_TYPECODE = 40;
894 880
895 static const int FOREIGN_CODE_TYPECODE = 41; 881 static const int FOREIGN_CODE_TYPECODE = 41;
896 static const int REMAINDER_TYPECODE = 42; 882 static const int REMAINDER_TYPECODE = 42;
897 static const int GET_LENGTH_TYPECODE = 43; 883 static const int GET_LENGTH_TYPECODE = 43;
(...skipping 1972 matching lines...) Expand 10 before | Expand all | Expand 10 after
2870 assert(kind == CHECKED_MODE_CHECK || kind == CAST_TYPE_CHECK); 2856 assert(kind == CHECKED_MODE_CHECK || kind == CAST_TYPE_CHECK);
2871 sourceElement = input.sourceElement; 2857 sourceElement = input.sourceElement;
2872 } 2858 }
2873 2859
2874 bool get hasTypeRepresentation { 2860 bool get hasTypeRepresentation {
2875 return typeExpression.isInterfaceType && inputs.length > 1; 2861 return typeExpression.isInterfaceType && inputs.length > 1;
2876 } 2862 }
2877 2863
2878 HInstruction get typeRepresentation => inputs[1]; 2864 HInstruction get typeRepresentation => inputs[1];
2879 2865
2880 bool get usesMethodOnType => 2866 HInstruction get checkedInput => super.checkedInput;
2881 typeExpression != null && typeExpression.isFunctionType;
2882
2883 HInstruction get checkedInput =>
2884 usesMethodOnType ? inputs[1] : super.checkedInput;
2885 2867
2886 HInstruction convertType(ClosedWorld closedWorld, DartType type, int kind) { 2868 HInstruction convertType(ClosedWorld closedWorld, DartType type, int kind) {
2887 if (typeExpression == type) { 2869 if (typeExpression == type) {
2888 // Don't omit a boolean conversion (which doesn't allow `null`) unless 2870 // Don't omit a boolean conversion (which doesn't allow `null`) unless
2889 // this type conversion is already a boolean conversion. 2871 // this type conversion is already a boolean conversion.
2890 if (kind != BOOLEAN_CONVERSION_CHECK || isBooleanConversionCheck) { 2872 if (kind != BOOLEAN_CONVERSION_CHECK || isBooleanConversionCheck) {
2891 return this; 2873 return this;
2892 } 2874 }
2893 } 2875 }
2894 return super.convertType(closedWorld, type, kind); 2876 return super.convertType(closedWorld, type, kind);
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after
3398 3380
3399 String get kindAsString { 3381 String get kindAsString {
3400 switch (kind) { 3382 switch (kind) {
3401 case TypeInfoExpressionKind.COMPLETE: 3383 case TypeInfoExpressionKind.COMPLETE:
3402 return 'COMPLETE'; 3384 return 'COMPLETE';
3403 case TypeInfoExpressionKind.INSTANCE: 3385 case TypeInfoExpressionKind.INSTANCE:
3404 return 'INSTANCE'; 3386 return 'INSTANCE';
3405 } 3387 }
3406 } 3388 }
3407 } 3389 }
3408
3409 class HReadTypeVariable extends HInstruction {
3410 /// The type variable being read.
3411 final TypeVariableType dartType;
3412
3413 final bool hasReceiver;
3414
3415 HReadTypeVariable(
3416 this.dartType, HInstruction receiver, TypeMask instructionType)
3417 : hasReceiver = true,
3418 super(<HInstruction>[receiver], instructionType) {
3419 setUseGvn();
3420 }
3421
3422 HReadTypeVariable.noReceiver(
3423 this.dartType, HInstruction typeArgument, TypeMask instructionType)
3424 : hasReceiver = false,
3425 super(<HInstruction>[typeArgument], instructionType) {
3426 setUseGvn();
3427 }
3428
3429 accept(HVisitor visitor) => visitor.visitReadTypeVariable(this);
3430
3431 bool canThrow() => false;
3432
3433 int typeCode() => HInstruction.READ_TYPE_VARIABLE_TYPECODE;
3434 bool typeEquals(HInstruction other) => other is HReadTypeVariable;
3435
3436 bool dataEquals(HReadTypeVariable other) {
3437 return dartType == other.dartType && hasReceiver == other.hasReceiver;
3438 }
3439 }
3440
3441 abstract class HRuntimeType extends HInstruction {
3442 final DartType dartType;
3443
3444 HRuntimeType(
3445 List<HInstruction> inputs, this.dartType, TypeMask instructionType)
3446 : super(inputs, instructionType) {
3447 setUseGvn();
3448 }
3449
3450 bool canThrow() => false;
3451
3452 int typeCode() {
3453 throw 'abstract method';
3454 }
3455
3456 bool typeEquals(HInstruction other) {
3457 throw 'abstract method';
3458 }
3459
3460 bool dataEquals(HRuntimeType other) {
3461 return dartType == other.dartType;
3462 }
3463 }
3464
3465 class HFunctionType extends HRuntimeType {
3466 HFunctionType(List<HInstruction> inputs, FunctionType dartType,
3467 TypeMask instructionType)
3468 : super(inputs, dartType, instructionType);
3469
3470 accept(HVisitor visitor) => visitor.visitFunctionType(this);
3471
3472 int typeCode() => HInstruction.FUNCTION_TYPE_TYPECODE;
3473
3474 bool typeEquals(HInstruction other) => other is HFunctionType;
3475 }
3476
3477 class HVoidType extends HRuntimeType {
3478 HVoidType(VoidType dartType, TypeMask instructionType)
3479 : super(const <HInstruction>[], dartType, instructionType);
3480
3481 accept(HVisitor visitor) => visitor.visitVoidType(this);
3482
3483 int typeCode() => HInstruction.VOID_TYPE_TYPECODE;
3484
3485 bool typeEquals(HInstruction other) => other is HVoidType;
3486 }
3487
3488 class HInterfaceType extends HRuntimeType {
3489 HInterfaceType(List<HInstruction> inputs, InterfaceType dartType,
3490 TypeMask instructionType)
3491 : super(inputs, dartType, instructionType);
3492
3493 accept(HVisitor visitor) => visitor.visitInterfaceType(this);
3494
3495 int typeCode() => HInstruction.INTERFACE_TYPE_TYPECODE;
3496
3497 bool typeEquals(HInstruction other) => other is HInterfaceType;
3498 }
3499
3500 class HDynamicType extends HRuntimeType {
3501 HDynamicType(DynamicType dartType, TypeMask instructionType)
3502 : super(const <HInstruction>[], dartType, instructionType);
3503
3504 accept(HVisitor visitor) => visitor.visitDynamicType(this);
3505
3506 int typeCode() => HInstruction.DYNAMIC_TYPE_TYPECODE;
3507
3508 bool typeEquals(HInstruction other) => other is HDynamicType;
3509 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698