summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/dfg/DFGNode.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/dfg/DFGNode.h')
-rw-r--r--Source/JavaScriptCore/dfg/DFGNode.h67
1 files changed, 67 insertions, 0 deletions
diff --git a/Source/JavaScriptCore/dfg/DFGNode.h b/Source/JavaScriptCore/dfg/DFGNode.h
index e66629ec4..bff7fe65f 100644
--- a/Source/JavaScriptCore/dfg/DFGNode.h
+++ b/Source/JavaScriptCore/dfg/DFGNode.h
@@ -62,6 +62,7 @@ struct StructureTransitionData {
struct NewArrayBufferData {
unsigned startConstant;
unsigned numConstants;
+ IndexingType indexingType;
};
// This type used in passing an immediate argument to Node constructor;
@@ -433,6 +434,32 @@ struct Node {
return newArrayBufferData()->numConstants;
}
+ bool hasIndexingType()
+ {
+ switch (op()) {
+ case NewArray:
+ case NewArrayWithSize:
+ case NewArrayBuffer:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ IndexingType indexingType()
+ {
+ ASSERT(hasIndexingType());
+ if (op() == NewArrayBuffer)
+ return newArrayBufferData()->indexingType;
+ return m_opInfo;
+ }
+
+ void setIndexingType(IndexingType indexingType)
+ {
+ ASSERT(hasIndexingType());
+ m_opInfo = indexingType;
+ }
+
bool hasRegexpIndex()
{
return op() == NewRegexp;
@@ -922,16 +949,36 @@ struct Node {
return isInt32Speculation(prediction());
}
+ bool shouldSpeculateIntegerForArithmetic()
+ {
+ return isInt32SpeculationForArithmetic(prediction());
+ }
+
+ bool shouldSpeculateIntegerExpectingDefined()
+ {
+ return isInt32SpeculationExpectingDefined(prediction());
+ }
+
bool shouldSpeculateDouble()
{
return isDoubleSpeculation(prediction());
}
+ bool shouldSpeculateDoubleForArithmetic()
+ {
+ return isDoubleSpeculationForArithmetic(prediction());
+ }
+
bool shouldSpeculateNumber()
{
return isNumberSpeculation(prediction());
}
+ bool shouldSpeculateNumberExpectingDefined()
+ {
+ return isNumberSpeculationExpectingDefined(prediction());
+ }
+
bool shouldSpeculateBoolean()
{
return isBooleanSpeculation(prediction());
@@ -1037,11 +1084,31 @@ struct Node {
return op1.shouldSpeculateInteger() && op2.shouldSpeculateInteger();
}
+ static bool shouldSpeculateIntegerForArithmetic(Node& op1, Node& op2)
+ {
+ return op1.shouldSpeculateIntegerForArithmetic() && op2.shouldSpeculateIntegerForArithmetic();
+ }
+
+ static bool shouldSpeculateIntegerExpectingDefined(Node& op1, Node& op2)
+ {
+ return op1.shouldSpeculateIntegerExpectingDefined() && op2.shouldSpeculateIntegerExpectingDefined();
+ }
+
+ static bool shouldSpeculateDoubleForArithmetic(Node& op1, Node& op2)
+ {
+ return op1.shouldSpeculateDoubleForArithmetic() && op2.shouldSpeculateDoubleForArithmetic();
+ }
+
static bool shouldSpeculateNumber(Node& op1, Node& op2)
{
return op1.shouldSpeculateNumber() && op2.shouldSpeculateNumber();
}
+ static bool shouldSpeculateNumberExpectingDefined(Node& op1, Node& op2)
+ {
+ return op1.shouldSpeculateNumberExpectingDefined() && op2.shouldSpeculateNumberExpectingDefined();
+ }
+
static bool shouldSpeculateFinalObject(Node& op1, Node& op2)
{
return op1.shouldSpeculateFinalObject() && op2.shouldSpeculateFinalObject();