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

Unified 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 r30897. 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 side-by-side diff with in-line comments
Download patch
Index: dart/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
diff --git a/dart/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart b/dart/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
index e13b16dc249f452ded8a400df2e156c97cc2f8f3..736ced4786c18ffb43ae58d182b3d758f36e8574 100644
--- a/dart/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
+++ b/dart/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
@@ -68,6 +68,11 @@ abstract class HVisitor<R> {
R visitTry(HTry node);
R visitTypeConversion(HTypeConversion node);
R visitTypeKnown(HTypeKnown node);
+ R visitReadTypeVariable(HReadTypeVariable node);
+ R visitFunctionType(HFunctionType node);
+ R visitVoidType(HVoidType node);
+ R visitInterfaceType(HInterfaceType node);
+ R visitDynamicType(HDynamicType node);
}
abstract class HGraphVisitor {
@@ -330,6 +335,11 @@ class HBaseVisitor extends HGraphVisitor implements HVisitor {
visitIs(HIs node) => visitInstruction(node);
visitTypeConversion(HTypeConversion node) => visitCheck(node);
visitTypeKnown(HTypeKnown node) => visitCheck(node);
+ visitReadTypeVariable(HReadTypeVariable node) => visitInstruction(node);
+ visitFunctionType(HFunctionType node) => visitInstruction(node);
+ visitVoidType(HVoidType node) => visitInstruction(node);
+ visitInterfaceType(HInterfaceType node) => visitInstruction(node);
+ visitDynamicType(HDynamicType node) => visitInstruction(node);
}
class SubGraph {
@@ -783,6 +793,11 @@ abstract class HInstruction implements Spannable {
static const int IS_TYPECODE = 28;
static const int INVOKE_DYNAMIC_TYPECODE = 29;
static const int SHIFT_RIGHT_TYPECODE = 30;
+ static const int READ_TYPE_VARIABLE_TYPECODE = 31;
+ static const int FUNCTION_TYPE_TYPECODE = 32;
+ static const int VOID_TYPE_TYPECODE = 33;
+ static const int INTERFACE_TYPE_TYPECODE = 34;
+ static const int DYNAMIC_TYPE_TYPECODE = 35;
HInstruction(this.inputs, this.instructionType)
: id = idCounter++, usedBy = <HInstruction>[] {
@@ -966,7 +981,7 @@ abstract class HInstruction implements Spannable {
}
/**
- * Type of the unstruction.
+ * Type of the instruction.
*/
TypeMask instructionType;
@@ -2747,8 +2762,6 @@ class HTryBlockInformation implements HStatementInformation {
visitor.visitTryInfo(this);
}
-
-
class HSwitchBlockInformation implements HStatementInformation {
final HExpressionInformation expression;
final List<HStatementInformation> statements;
@@ -2770,3 +2783,111 @@ class HSwitchBlockInformation implements HStatementInformation {
bool accept(HStatementInformationVisitor visitor) =>
visitor.visitSwitchInfo(this);
}
+
+class HReadTypeVariable extends HInstruction {
+ /// The type variable being read.
+ final TypeVariableType dartType;
+
+ final bool hasReceiver;
+
+ HReadTypeVariable(this.dartType,
+ HInstruction receiver,
+ TypeMask instructionType)
+ : hasReceiver = true,
+ super(<HInstruction>[receiver], instructionType) {
+ setUseGvn();
+ }
+
+ HReadTypeVariable.noReceiver(this.dartType,
+ HInstruction typeArgument,
+ TypeMask instructionType)
+ : hasReceiver = false,
+ super(<HInstruction>[typeArgument], instructionType) {
+ setUseGvn();
+ }
+
+ accept(HVisitor visitor) => visitor.visitReadTypeVariable(this);
+
+ bool canThrow() => false;
+
+ int typeCode() => HInstruction.READ_TYPE_VARIABLE_TYPECODE;
+ bool typeEquals(HInstruction other) => other is HReadTypeVariable;
+
+ bool dataEquals(HReadTypeVariable other) {
+ return dartType.element == other.dartType.element
+ && hasReceiver == other.hasReceiver;
+ }
+}
+
+abstract class HRuntimeType extends HInstruction {
+ final DartType dartType;
+
+ HRuntimeType(List<HInstruction> inputs,
+ this.dartType,
+ TypeMask instructionType)
+ : super(inputs, instructionType) {
+ setUseGvn();
+ }
+
+ bool canThrow() => false;
+
+ int typeCode() {
+ throw 'abstract method';
+ }
+
+ bool typeEquals(HInstruction other) {
+ throw 'abstract method';
+ }
+
+ bool dataEquals(HRuntimeType other) {
+ return dartType == other.dartType;
+ }
+}
+
+class HFunctionType extends HRuntimeType {
+ HFunctionType(List<HInstruction> inputs,
+ FunctionType dartType,
+ TypeMask instructionType)
+ : super(inputs, dartType, instructionType);
+
+ accept(HVisitor visitor) => visitor.visitFunctionType(this);
+
+ int typeCode() => HInstruction.FUNCTION_TYPE_TYPECODE;
+
+ bool typeEquals(HInstruction other) => other is HFunctionType;
+}
+
+class HVoidType extends HRuntimeType {
+ HVoidType(VoidType dartType, TypeMask instructionType)
+ : super(const <HInstruction>[], dartType, instructionType);
+
+ accept(HVisitor visitor) => visitor.visitVoidType(this);
+
+ int typeCode() => HInstruction.VOID_TYPE_TYPECODE;
+
+ bool typeEquals(HInstruction other) => other is HVoidType;
+}
+
+class HInterfaceType extends HRuntimeType {
+ HInterfaceType(List<HInstruction> inputs,
+ InterfaceType dartType,
+ TypeMask instructionType)
+ : super(inputs, dartType, instructionType);
+
+ accept(HVisitor visitor) => visitor.visitInterfaceType(this);
+
+ int typeCode() => HInstruction.INTERFACE_TYPE_TYPECODE;
+
+ bool typeEquals(HInstruction other) => other is HInterfaceType;
+}
+
+class HDynamicType extends HRuntimeType {
+ HDynamicType(DynamicType dartType, TypeMask instructionType)
+ : super(const <HInstruction>[], dartType, instructionType);
+
+ accept(HVisitor visitor) => visitor.visitDynamicType(this);
+
+ int typeCode() => HInstruction.DYNAMIC_TYPE_TYPECODE;
+
+ bool typeEquals(HInstruction other) => other is HDynamicType;
+}

Powered by Google App Engine
This is Rietveld 408576698