Index: src/ic/accessor-assembler.h |
diff --git a/src/ic/accessor-assembler.h b/src/ic/accessor-assembler.h |
index e7505f7d3c6a87050f351e1299c83d1f2e1b22eb..81d5a3ca4fa747c80740f42a6550f4ada7efe758 100644 |
--- a/src/ic/accessor-assembler.h |
+++ b/src/ic/accessor-assembler.h |
@@ -24,6 +24,7 @@ class AccessorAssembler : public CodeStubAssembler { |
: CodeStubAssembler(state) {} |
void GenerateLoadIC(); |
+ void GenerateLoadIC_Noninlined(); |
void GenerateLoadIC_Uninitialized(); |
void GenerateLoadField(); |
void GenerateLoadICTrampoline(); |
@@ -76,6 +77,22 @@ class AccessorAssembler : public CodeStubAssembler { |
ExitPoint* exit_point, Label* miss); |
void LoadGlobalIC_MissCase(const LoadICParameters* p, ExitPoint* exit_point); |
+ // Checks monomorphic case. There are two variants: the first returns a |
+ // ({feedback}, {handler}) pair and falls through on success, while the second |
+ // stores {handler} in the given variable and jumps to {if_handler} on |
+ // success. |
+ std::pair<Node*, Node*> TryMonomorphicCase(Node* slot, Node* vector, |
+ Node* receiver_map, |
+ Label* if_miss); |
+ Node* TryMonomorphicCase(Node* slot, Node* vector, Node* receiver_map, |
+ Label* if_handler, Variable* var_handler, |
+ Label* if_miss); |
+ |
+ enum ElementSupport { kOnlyProperties, kSupportElements }; |
+ void HandleLoadICHandlerCase( |
+ const LoadICParameters* p, Node* handler, Label* miss, |
+ ExitPoint* exit_point, ElementSupport support_elements = kOnlyProperties); |
+ |
protected: |
struct StoreICParameters : public LoadICParameters { |
StoreICParameters(Node* context, Node* receiver, Node* name, Node* value, |
@@ -85,7 +102,6 @@ class AccessorAssembler : public CodeStubAssembler { |
Node* value; |
}; |
- enum ElementSupport { kOnlyProperties, kSupportElements }; |
void HandleStoreICHandlerCase( |
const StoreICParameters* p, Node* handler, Label* miss, |
ElementSupport support_elements = kOnlyProperties); |
@@ -94,7 +110,13 @@ class AccessorAssembler : public CodeStubAssembler { |
private: |
// Stub generation entry points. |
+ // LoadIC contains the full LoadIC logic, while LoadIC_Noninlined contains |
+ // logic not inlined into Ignition bytecode handlers. |
void LoadIC(const LoadICParameters* p); |
+ void LoadIC_Noninlined(const LoadICParameters* p, Node* receiver_map, |
+ Node* feedback, Variable* var_handler, |
+ Label* if_handler, Label* miss, ExitPoint* exit_point); |
+ |
void LoadIC_Uninitialized(const LoadICParameters* p); |
void LoadICProtoArray(const LoadICParameters* p, Node* handler, |
bool throw_reference_error_if_nonexistent); |
@@ -105,11 +127,6 @@ class AccessorAssembler : public CodeStubAssembler { |
void KeyedStoreIC(const StoreICParameters* p, LanguageMode language_mode); |
// IC dispatcher behavior. |
- |
- // Checks monomorphic case. Returns {feedback} entry of the vector. |
- Node* TryMonomorphicCase(Node* slot, Node* vector, Node* receiver_map, |
- Label* if_handler, Variable* var_handler, |
- Label* if_miss); |
void HandlePolymorphicCase(Node* receiver_map, Node* feedback, |
Label* if_handler, Variable* var_handler, |
Label* if_miss, int unroll_count); |
@@ -121,10 +138,6 @@ class AccessorAssembler : public CodeStubAssembler { |
// LoadIC implementation. |
- void HandleLoadICHandlerCase( |
- const LoadICParameters* p, Node* handler, Label* miss, |
- ElementSupport support_elements = kOnlyProperties); |
- |
void HandleLoadICSmiHandlerCase(const LoadICParameters* p, Node* holder, |
Node* smi_handler, Label* miss, |
ExitPoint* exit_point, |
@@ -186,6 +199,8 @@ class AccessorAssembler : public CodeStubAssembler { |
Representation representation, Node* transition, |
Node* value, Label* bailout); |
+ Node* LoadFeedbackSlot(Node* vector, Node* slot, int additional_offset); |
+ |
// Extends properties backing store by JSObject::kFieldsAdded elements. |
void ExtendPropertiesBackingStore(Node* object); |