| Index: runtime/vm/object.cc
|
| diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
|
| index b1c28aba81f2603a35d78499f7d873d65b55382d..3bf036e706a098b07a7addf4fd0500ab83b97df0 100644
|
| --- a/runtime/vm/object.cc
|
| +++ b/runtime/vm/object.cc
|
| @@ -2736,7 +2736,7 @@ void Class::SetTraceAllocation(bool trace_allocation) const {
|
| set_state_bits(
|
| TraceAllocationBit::update(trace_allocation, raw_ptr()->state_bits_));
|
| if (changed) {
|
| - // TODO(johnmccutchan): Deoptimize the world?
|
| + DisableAllocationStub();
|
| }
|
| }
|
|
|
| @@ -3633,6 +3633,14 @@ void Class::set_allocation_stub(const Code& value) const {
|
|
|
|
|
| void Class::DisableAllocationStub() const {
|
| + const Code& existing_stub = Code::Handle(allocation_stub());
|
| + if (existing_stub.IsNull()) {
|
| + return;
|
| + }
|
| + ASSERT(!CodePatcher::IsEntryPatched(existing_stub));
|
| + // Patch the stub so that the next caller will regenerate the stub.
|
| + CodePatcher::PatchEntry(existing_stub);
|
| + // Disassociate the existing stub from class.
|
| StorePointer(&raw_ptr()->allocation_stub_, Code::null());
|
| }
|
|
|
|
|