]> gitweb.factorcode.org Git - factor.git/commitdiff
VM: macro FACTOR_FOR_EACH to make stl container iteration easier to express
authorBjörn Lindqvist <bjourne@gmail.com>
Fri, 29 May 2015 00:03:37 +0000 (02:03 +0200)
committerBjörn Lindqvist <bjourne@gmail.com>
Fri, 5 Jun 2015 00:14:48 +0000 (02:14 +0200)
vm/slot_visitor.hpp
vm/utilities.hpp

index 7bd7a1c7ea0684179fe5dca54704a908ee77890a..1bef9b88034c6087e63a0f0487b12a0055f9e72e 100644 (file)
@@ -191,12 +191,7 @@ void slot_visitor<Fixup>::visit_stack_elements(segment* region, cell* top) {
 }
 
 template <typename Fixup> void slot_visitor<Fixup>::visit_data_roots() {
-  std::vector<cell*>::const_iterator iter =
-      parent->data_roots.begin();
-  std::vector<cell*>::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 <typename Fixup> void slot_visitor<Fixup>::visit_callback_roots() {
 
 template <typename Fixup>
 void slot_visitor<Fixup>::visit_literal_table_roots() {
-  std::map<code_block*, cell>* uninitialized_blocks =
-      &parent->code->uninitialized_blocks;
-  std::map<code_block*, cell>::iterator iter =
-      uninitialized_blocks->begin();
-  std::map<code_block*, cell>::iterator end = uninitialized_blocks->end();
-
-  for (; iter != end; iter++) {
+  FACTOR_FOR_EACH(parent->code->uninitialized_blocks) {
     iter->second = visit_pointer(iter->second);
   }
 }
 
 template <typename Fixup> void slot_visitor<Fixup>::visit_sample_callstacks() {
-  for (std::vector<cell>::iterator iter = parent->sample_callstacks.begin();
-       iter != parent->sample_callstacks.end(); ++iter) {
+  FACTOR_FOR_EACH(parent->sample_callstacks) {
     visit_handle(&*iter);
   }
 }
 
 template <typename Fixup> void slot_visitor<Fixup>::visit_sample_threads() {
-  for (std::vector<profiling_sample>::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<Fixup>::visit_context(context* ctx) {
 }
 
 template <typename Fixup> void slot_visitor<Fixup>::visit_contexts() {
-  std::set<context*>::const_iterator begin = parent->active_contexts.begin();
-  std::set<context*>::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<Fixup>::visit_object_code_block(object* obj) {
 template <typename Fixup>
 void slot_visitor<Fixup>::visit_context_code_blocks() {
   call_frame_code_block_visitor<Fixup> call_frame_visitor(fixup);
-  std::set<context*>::const_iterator begin = parent->active_contexts.begin();
-  std::set<context*>::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 <typename Fixup>
 void slot_visitor<Fixup>::visit_uninitialized_code_blocks() {
-  std::map<code_block*, cell>* uninitialized_blocks =
-      &parent->code->uninitialized_blocks;
-  std::map<code_block*, cell>::const_iterator iter =
-      uninitialized_blocks->begin();
-  std::map<code_block*, cell>::const_iterator end = uninitialized_blocks->end();
-
   std::map<code_block*, cell> 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;
 }
 
index dcd717657b876f309009c2a79b55de8f07ad9650..72f27dbf809de8bc4fba57e6c190543c72c8729b 100644 (file)
@@ -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));