diff --git a/vm/slot_visitor.hpp b/vm/slot_visitor.hpp index 7bd7a1c7ea..1bef9b8803 100644 --- a/vm/slot_visitor.hpp +++ b/vm/slot_visitor.hpp @@ -191,12 +191,7 @@ void slot_visitor::visit_stack_elements(segment* region, cell* top) { } template void slot_visitor::visit_data_roots() { - std::vector::const_iterator iter = - parent->data_roots.begin(); - std::vector::const_iterator end = - parent->data_roots.end(); - - for (; iter < end; iter++) { + FACTOR_FOR_EACH(parent->data_roots) { visit_handle(*iter); } } @@ -218,27 +213,19 @@ template void slot_visitor::visit_callback_roots() { template void slot_visitor::visit_literal_table_roots() { - std::map* uninitialized_blocks = - &parent->code->uninitialized_blocks; - std::map::iterator iter = - uninitialized_blocks->begin(); - std::map::iterator end = uninitialized_blocks->end(); - - for (; iter != end; iter++) { + FACTOR_FOR_EACH(parent->code->uninitialized_blocks) { iter->second = visit_pointer(iter->second); } } template void slot_visitor::visit_sample_callstacks() { - for (std::vector::iterator iter = parent->sample_callstacks.begin(); - iter != parent->sample_callstacks.end(); ++iter) { + FACTOR_FOR_EACH(parent->sample_callstacks) { visit_handle(&*iter); } } template void slot_visitor::visit_sample_threads() { - for (std::vector::iterator iter = parent->samples.begin(); - iter != parent->samples.end(); ++iter) { + FACTOR_FOR_EACH(parent->samples) { visit_handle(&iter->thread); } } @@ -397,11 +384,8 @@ void slot_visitor::visit_context(context* ctx) { } template void slot_visitor::visit_contexts() { - std::set::const_iterator begin = parent->active_contexts.begin(); - std::set::const_iterator end = parent->active_contexts.end(); - while (begin != end) { - visit_context(*begin); - begin++; + FACTOR_FOR_EACH(parent->active_contexts) { + visit_context(*iter); } } @@ -474,28 +458,18 @@ void slot_visitor::visit_object_code_block(object* obj) { template void slot_visitor::visit_context_code_blocks() { call_frame_code_block_visitor call_frame_visitor(fixup); - std::set::const_iterator begin = parent->active_contexts.begin(); - std::set::const_iterator end = parent->active_contexts.end(); - while (begin != end) { - parent->iterate_callstack(*begin, call_frame_visitor, fixup); - begin++; + FACTOR_FOR_EACH(parent->active_contexts) { + parent->iterate_callstack(*iter, call_frame_visitor, fixup); } } template void slot_visitor::visit_uninitialized_code_blocks() { - std::map* uninitialized_blocks = - &parent->code->uninitialized_blocks; - std::map::const_iterator iter = - uninitialized_blocks->begin(); - std::map::const_iterator end = uninitialized_blocks->end(); - std::map new_uninitialized_blocks; - for (; iter != end; iter++) { + FACTOR_FOR_EACH(parent->code->uninitialized_blocks) { new_uninitialized_blocks.insert( std::make_pair(fixup.fixup_code(iter->first), iter->second)); } - parent->code->uninitialized_blocks = new_uninitialized_blocks; } diff --git a/vm/utilities.hpp b/vm/utilities.hpp index dcd717657b..72f27dbf80 100644 --- a/vm/utilities.hpp +++ b/vm/utilities.hpp @@ -1,5 +1,11 @@ namespace factor { +// Poor mans range-based for loops. +#define FACTOR_FOR_EACH(iterable) \ + for (typeof(iterable.begin()) iter = iterable.begin(); \ + iter != iterable.end(); \ + iter++) + inline static void memset_2(void* dst, uint16_t pattern, size_t size) { #ifdef __APPLE__ cell cell_pattern = (pattern | (pattern << 16));