diff --git a/vm/code_block_visitor.hpp b/vm/code_block_visitor.hpp index 50d4a96a7d..d43daa3ad3 100644 --- a/vm/code_block_visitor.hpp +++ b/vm/code_block_visitor.hpp @@ -24,7 +24,6 @@ template struct code_block_visitor { void visit_embedded_code_pointers(code_block *compiled); void visit_context_code_blocks(); void visit_uninitialized_code_blocks(); - void visit_sample_callstacks(); void visit_code_roots(); }; @@ -136,22 +135,10 @@ void code_block_visitor::visit_uninitialized_code_blocks() parent->code->uninitialized_blocks = new_uninitialized_blocks; } -template -void code_block_visitor::visit_sample_callstacks() -{ - for (std::vector::iterator iter = parent->sample_callstacks.begin(); - iter != parent->sample_callstacks.end(); - ++iter) - { - *iter = fixup.fixup_code(*iter); - } -} - template void code_block_visitor::visit_code_roots() { visit_uninitialized_code_blocks(); - visit_sample_callstacks(); } } diff --git a/vm/sampling_profiler.cpp b/vm/sampling_profiler.cpp index 48052888fd..24ac5c8bde 100644 --- a/vm/sampling_profiler.cpp +++ b/vm/sampling_profiler.cpp @@ -50,7 +50,7 @@ void factor_vm::record_callstack_sample(cell *begin, cell *end) stack_frame *frame = ctx->bottom_frame(); while (frame >= ctx->callstack_top) { - sample_callstacks.push_back(frame_code(frame)); + sample_callstacks.push_back(frame_code(frame)->owner); frame = frame_successor(frame); } @@ -74,7 +74,7 @@ void factor_vm::clear_samples() // Swapping into temporaries releases the vector's allocated storage, // whereas clear() would leave the allocation as-is std::vector sample_graveyard; - std::vector sample_callstack_graveyard; + std::vector sample_callstack_graveyard; samples.swap(sample_graveyard); sample_callstacks.swap(sample_callstack_graveyard); } @@ -127,14 +127,14 @@ void factor_vm::primitive_get_samples() cell callstack_size = from_iter->callstack_end - from_iter->callstack_begin; data_root callstack(allot_array(callstack_size,false_object),this); - std::vector::const_iterator + std::vector::const_iterator callstacks_begin = sample_callstacks.begin(), c_from_iter = callstacks_begin + from_iter->callstack_begin, c_from_iter_end = callstacks_begin + from_iter->callstack_end; cell c_to_i = 0; for (; c_from_iter != c_from_iter_end; ++c_from_iter, ++c_to_i) - set_array_nth(callstack.untagged(),c_to_i,(*c_from_iter)->owner); + set_array_nth(callstack.untagged(),c_to_i,*c_from_iter); set_array_nth(sample.untagged(),5,callstack.value()); diff --git a/vm/slot_visitor.hpp b/vm/slot_visitor.hpp index b2dd40e582..b2fd5d3c4b 100755 --- a/vm/slot_visitor.hpp +++ b/vm/slot_visitor.hpp @@ -134,6 +134,7 @@ template struct slot_visitor { void visit_contexts(); void visit_code_block_objects(code_block *compiled); void visit_embedded_literals(code_block *compiled); + void visit_sample_callstacks(); }; template @@ -249,6 +250,17 @@ void slot_visitor::visit_literal_table_roots() parent->code->uninitialized_blocks = new_uninitialized_blocks; } +template +void slot_visitor::visit_sample_callstacks() +{ + for (std::vector::iterator iter = parent->sample_callstacks.begin(); + iter != parent->sample_callstacks.end(); + ++iter) + { + visit_handle(&*iter); + } +} + template void slot_visitor::visit_roots() { @@ -261,6 +273,7 @@ void slot_visitor::visit_roots() visit_bignum_roots(); visit_callback_roots(); visit_literal_table_roots(); + visit_sample_callstacks(); visit_object_array(parent->special_objects,parent->special_objects + special_object_count); } diff --git a/vm/vm.hpp b/vm/vm.hpp index f4c765d645..08195a81e7 100755 --- a/vm/vm.hpp +++ b/vm/vm.hpp @@ -75,7 +75,7 @@ struct factor_vm /* State kept by the sampling profiler */ std::vector samples; - std::vector sample_callstacks; + std::vector sample_callstacks; volatile profiling_sample_count safepoint_sample_counts; /* GC is off during heap walking */