| Index: runtime/vm/stub_code.cc
|
| diff --git a/runtime/vm/stub_code.cc b/runtime/vm/stub_code.cc
|
| index f7116e320371bc3d51e99a1beef1747e0462a4cb..6738a259e013a45f22462378ff8130e586e52a2a 100644
|
| --- a/runtime/vm/stub_code.cc
|
| +++ b/runtime/vm/stub_code.cc
|
| @@ -124,8 +124,11 @@ RawCode* StubCode::GetAllocationStubForClass(const Class& cls) {
|
|
|
| if (thread->IsMutatorThread()) {
|
| stub ^= Code::FinalizeCode(name, &assembler, false /* optimized */);
|
| - stub.set_owner(cls);
|
| - cls.set_allocation_stub(stub);
|
| + // Check if background compilation thread has not already added the stub.
|
| + if (cls.allocation_stub() == Code::null()) {
|
| + stub.set_owner(cls);
|
| + cls.set_allocation_stub(stub);
|
| + }
|
| } else {
|
| // This part of stub code generation must be at a safepoint.
|
| // Stop mutator thread before creating the instruction object and
|
| @@ -136,6 +139,11 @@ RawCode* StubCode::GetAllocationStubForClass(const Class& cls) {
|
| // executable).
|
| {
|
| SafepointOperationScope safepoint_scope(thread);
|
| + stub = cls.allocation_stub();
|
| + // Check if stub was already generated.
|
| + if (!stub.IsNull()) {
|
| + return stub.raw();
|
| + }
|
| // Do not Garbage collect during this stage and instead allow the
|
| // heap to grow.
|
| NoHeapGrowthControlScope no_growth_control;
|
|
|