Index: runtime/vm/stub_code_x64.cc |
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc |
index 4dd6e9fa0ed6e661eb92fef6c391c1fc1f65def8..bfec0631a2ebc6f0a34b454497d8a6c4ad1ce53c 100644 |
--- a/runtime/vm/stub_code_x64.cc |
+++ b/runtime/vm/stub_code_x64.cc |
@@ -591,6 +591,10 @@ void StubCode::GenerateAllocateArrayStub(Assembler* assembler) { |
// R13: Points to new space object. |
__ movq(Address(R13, Scavenger::top_offset()), R12); |
__ addq(RAX, Immediate(kHeapObjectTag)); |
+ // R13: Size of allocation in bytes. |
+ __ movq(R13, R12); |
+ __ subq(R13, RAX); |
+ __ UpdateAllocationStatsWithSize(kArrayCid, R13); |
// RAX: new object start as a tagged pointer. |
// R12: new object end address. |
@@ -945,6 +949,9 @@ void StubCode::GenerateAllocateContextStub(Assembler* assembler) { |
__ movq(RDI, Immediate(heap->TopAddress())); |
__ movq(Address(RDI, 0), R13); |
__ addq(RAX, Immediate(kHeapObjectTag)); |
+ // R13: Size of allocation in bytes. |
+ __ subq(R13, RAX); |
+ __ UpdateAllocationStatsWithSize(context_class.id(), R13); |
// Calculate the size tag. |
// RAX: new object. |
@@ -1144,6 +1151,7 @@ void StubCode::GenerateAllocationStubForClass(Assembler* assembler, |
// next object start and initialize the object. |
__ movq(RDI, Immediate(heap->TopAddress())); |
__ movq(Address(RDI, 0), RBX); |
+ __ UpdateAllocationStats(cls.id()); |
if (is_cls_parameterized) { |
// Initialize the type arguments field in the object. |
@@ -1310,6 +1318,17 @@ void StubCode::GenerateAllocationStubForClosure(Assembler* assembler, |
// RAX: new closure object. |
// RBX: new context object (only if is_implicit_closure). |
+ if (is_implicit_instance_closure) { |
+ // This closure allocates a context, update allocation stats. |
+ // RDI: context size. |
+ __ movq(RDI, Immediate(context_size)); |
+ __ UpdateAllocationStatsWithSize(kContextCid, RDI); |
+ } |
+ // The closure allocation is attributed to the signature class. |
+ __ UpdateAllocationStats(cls.id()); |
+ |
+ // RAX: new closure object. |
+ // RBX: new context object (only if is_implicit_closure). |
// Set the tags. |
uword tags = 0; |
tags = RawObject::SizeTag::update(closure_size, tags); |