| Index: src/code-stub-assembler.cc
|
| diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc
|
| index 4e1c4a44f701bc3e879f1788334428e5a578402d..18b4e5ff83968d9f80ff6808e0ea4f09943fa501 100644
|
| --- a/src/code-stub-assembler.cc
|
| +++ b/src/code-stub-assembler.cc
|
| @@ -3886,7 +3886,8 @@ void CodeStubAssembler::TryPrototypeChainLookup(
|
| }
|
|
|
| Node* CodeStubAssembler::OrdinaryHasInstance(Node* context, Node* callable,
|
| - Node* object) {
|
| + Node* object,
|
| + VectorSlotPair feedback) {
|
| Variable var_result(this, MachineRepresentation::kTagged);
|
| Label return_false(this), return_true(this),
|
| return_runtime(this, Label::kDeferred), return_result(this);
|
| @@ -4011,6 +4012,17 @@ Node* CodeStubAssembler::OrdinaryHasInstance(Node* context, Node* callable,
|
| {
|
| // Invalidate the global instanceof cache.
|
| StoreRoot(Heap::kInstanceofCacheFunctionRootIndex, SmiConstant(0));
|
| +
|
| + // Record megamorphic {feedback} if requested; we use this feedback to
|
| + // guard a bunch of speculative optimizations in TurboFand (and Crankshaft)
|
| + // that just deoptimize in case of funny inputs to instanceof.
|
| + if (feedback.IsValid()) {
|
| + Node* megamorphic_sentinel =
|
| + HeapConstant(TypeFeedbackVector::MegamorphicSentinel(isolate()));
|
| + StoreFixedArrayElement(feedback.vector(), feedback.index(),
|
| + megamorphic_sentinel, SKIP_WRITE_BARRIER);
|
| + }
|
| +
|
| // Fallback to the runtime implementation.
|
| var_result.Bind(
|
| CallRuntime(Runtime::kOrdinaryHasInstance, context, callable, object));
|
|
|