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

Unified Diff: pkg/compiler/lib/src/ssa/nodes.dart

Issue 1334203002: Compute Compiler.proxyConstant on demand. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Updated cf. comment Created 5 years, 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/compiler/lib/src/ssa/codegen.dart ('k') | pkg/compiler/lib/src/ssa/optimize.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/ssa/nodes.dart
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index dfcc4d367582ad41324d5bee88c4b651fb8e5c41..fdaef0179507644c4b9fdd3a92cd9c95fdf48bcd 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -882,6 +882,32 @@ abstract class HInstruction implements Spannable {
return instructionType.isEmpty && !instructionType.isNullable;
}
+ /// Returns `true` if [typeMask] contains [cls].
+ static bool containsType(
+ TypeMask typeMask,
+ ClassElement cls,
+ ClassWorld classWorld) {
+ return classWorld.isInstantiated(cls) && typeMask.contains(cls, classWorld);
+ }
+
+ /// Returns `true` if [typeMask] contains only [cls].
+ static bool containsOnlyType(
+ TypeMask typeMask,
+ ClassElement cls,
+ ClassWorld classWorld) {
+ return classWorld.isInstantiated(cls) &&
+ typeMask.containsOnly(cls);
+ }
+
+ /// Returns `true` if [typeMask] is an instance of [cls].
+ static bool isInstanceOf(
+ TypeMask typeMask,
+ ClassElement cls,
+ ClassWorld classWorld) {
+ return classWorld.isInstantiated(cls) &&
+ typeMask.satisfies(cls, classWorld);
+ }
+
bool canBePrimitive(Compiler compiler) {
return canBePrimitiveNumber(compiler)
|| canBePrimitiveArray(compiler)
@@ -895,27 +921,28 @@ abstract class HInstruction implements Spannable {
JavaScriptBackend backend = compiler.backend;
// TODO(sra): It should be possible to test only jsDoubleClass and
// jsUInt31Class, since all others are superclasses of these two.
- return instructionType.contains(backend.jsNumberClass, classWorld)
- || instructionType.contains(backend.jsIntClass, classWorld)
- || instructionType.contains(backend.jsPositiveIntClass, classWorld)
- || instructionType.contains(backend.jsUInt32Class, classWorld)
- || instructionType.contains(backend.jsUInt31Class, classWorld)
- || instructionType.contains(backend.jsDoubleClass, classWorld);
+ return containsType(instructionType, backend.jsNumberClass, classWorld)
+ || containsType(instructionType, backend.jsIntClass, classWorld)
+ || containsType(instructionType, backend.jsPositiveIntClass, classWorld)
+ || containsType(instructionType, backend.jsUInt32Class, classWorld)
+ || containsType(instructionType, backend.jsUInt31Class, classWorld)
+ || containsType(instructionType, backend.jsDoubleClass, classWorld);
}
bool canBePrimitiveBoolean(Compiler compiler) {
ClassWorld classWorld = compiler.world;
JavaScriptBackend backend = compiler.backend;
- return instructionType.contains(backend.jsBoolClass, classWorld);
+ return containsType(instructionType, backend.jsBoolClass, classWorld);
}
bool canBePrimitiveArray(Compiler compiler) {
ClassWorld classWorld = compiler.world;
JavaScriptBackend backend = compiler.backend;
- return instructionType.contains(backend.jsArrayClass, classWorld)
- || instructionType.contains(backend.jsFixedArrayClass, classWorld)
- || instructionType.contains(backend.jsExtendableArrayClass, classWorld)
- || instructionType.contains(
+ return containsType(instructionType, backend.jsArrayClass, classWorld)
+ || containsType(instructionType, backend.jsFixedArrayClass, classWorld)
+ || containsType(
+ instructionType, backend.jsExtendableArrayClass, classWorld)
+ || containsType(instructionType,
backend.jsUnmodifiableArrayClass, classWorld);
}
@@ -923,37 +950,43 @@ abstract class HInstruction implements Spannable {
ClassWorld classWorld = compiler.world;
JavaScriptBackend backend = compiler.backend;
return instructionType.containsOnlyString(classWorld)
- || instructionType.satisfies(backend.jsIndexableClass, classWorld);
+ || isInstanceOf(instructionType, backend.jsIndexableClass, classWorld);
}
bool isFixedArray(Compiler compiler) {
+ ClassWorld classWorld = compiler.world;
JavaScriptBackend backend = compiler.backend;
// TODO(sra): Recognize the union of these types as well.
- return instructionType.containsOnly(backend.jsFixedArrayClass)
- || instructionType.containsOnly(backend.jsUnmodifiableArrayClass);
+ return containsOnlyType(
+ instructionType, backend.jsFixedArrayClass, classWorld)
+ || containsOnlyType(
+ instructionType, backend.jsUnmodifiableArrayClass, classWorld);
}
bool isExtendableArray(Compiler compiler) {
+ ClassWorld classWorld = compiler.world;
JavaScriptBackend backend = compiler.backend;
- return instructionType.containsOnly(backend.jsExtendableArrayClass);
+ return containsOnlyType(
+ instructionType, backend.jsExtendableArrayClass, classWorld);
}
bool isMutableArray(Compiler compiler) {
ClassWorld classWorld = compiler.world;
JavaScriptBackend backend = compiler.backend;
- return instructionType.satisfies(backend.jsMutableArrayClass, classWorld);
+ return isInstanceOf(
+ instructionType, backend.jsMutableArrayClass, classWorld);
}
bool isReadableArray(Compiler compiler) {
ClassWorld classWorld = compiler.world;
JavaScriptBackend backend = compiler.backend;
- return instructionType.satisfies(backend.jsArrayClass, classWorld);
+ return isInstanceOf(instructionType, backend.jsArrayClass, classWorld);
}
bool isMutableIndexable(Compiler compiler) {
ClassWorld classWorld = compiler.world;
JavaScriptBackend backend = compiler.backend;
- return instructionType.satisfies(
+ return isInstanceOf(instructionType,
backend.jsMutableIndexableClass, classWorld);
}
@@ -962,7 +995,7 @@ abstract class HInstruction implements Spannable {
bool canBePrimitiveString(Compiler compiler) {
ClassWorld classWorld = compiler.world;
JavaScriptBackend backend = compiler.backend;
- return instructionType.contains(backend.jsStringClass, classWorld);
+ return containsType(instructionType, backend.jsStringClass, classWorld);
}
bool isInteger(Compiler compiler) {
@@ -975,27 +1008,28 @@ abstract class HInstruction implements Spannable {
ClassWorld classWorld = compiler.world;
JavaScriptBackend backend = compiler.backend;
return !instructionType.isNullable
- && instructionType.satisfies(backend.jsUInt32Class, classWorld);
+ && isInstanceOf(instructionType, backend.jsUInt32Class, classWorld);
}
bool isUInt31(Compiler compiler) {
ClassWorld classWorld = compiler.world;
JavaScriptBackend backend = compiler.backend;
return !instructionType.isNullable
- && instructionType.satisfies(backend.jsUInt31Class, classWorld);
+ && isInstanceOf(instructionType, backend.jsUInt31Class, classWorld);
}
bool isPositiveInteger(Compiler compiler) {
ClassWorld classWorld = compiler.world;
JavaScriptBackend backend = compiler.backend;
- return !instructionType.isNullable
- && instructionType.satisfies(backend.jsPositiveIntClass, classWorld);
+ return !instructionType.isNullable &&
+ isInstanceOf(instructionType, backend.jsPositiveIntClass, classWorld);
}
bool isPositiveIntegerOrNull(Compiler compiler) {
ClassWorld classWorld = compiler.world;
JavaScriptBackend backend = compiler.backend;
- return instructionType.satisfies(backend.jsPositiveIntClass, classWorld);
+ return isInstanceOf(
+ instructionType, backend.jsPositiveIntClass, classWorld);
}
bool isIntegerOrNull(Compiler compiler) {
« no previous file with comments | « pkg/compiler/lib/src/ssa/codegen.dart ('k') | pkg/compiler/lib/src/ssa/optimize.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698