Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Cleanup/documentation for simgrid::mc::Frame
[simgrid.git] / src / mc / mc_member.cpp
index 2dc276b..683f82f 100644 (file)
@@ -6,9 +6,14 @@
 
 #include <xbt/misc.h>
 
-#include "mc_object_info.h"
-#include "mc_private.h"
-#include "mc/Type.hpp"
+#include "src/mc/mc_object_info.h"
+#include "src/mc/mc_private.h"
+#include "src/mc/Type.hpp"
+#include "src/mc/mc_dwarf.hpp"
+
+
+namespace simgrid {
+namespace dwarf {
 
 /** Resolve snapshot in the process address space
  *
@@ -18,7 +23,7 @@
  * @param snapshot Snapshot (or NULL)
  * @return Process address of the given member of the 'object' struct/class
  */
-void *mc_member_resolve(
+void *resolve_member(
     const void *base, simgrid::mc::Type* type, simgrid::mc::Member* member,
     simgrid::mc::AddressSpace* address_space, int process_index)
 {
@@ -26,20 +31,17 @@ void *mc_member_resolve(
   if (!member->has_offset_location())
     return ((char *) base) + member->offset();
 
-  s_mc_expression_state_t state;
-  memset(&state, 0, sizeof(s_mc_expression_state_t));
+  ExpressionContext state;
   state.frame_base = NULL;
   state.cursor = NULL;
   state.address_space = address_space;
-  state.stack_size = 1;
-  state.stack[0] = (uintptr_t) base;
   state.process_index = process_index;
 
-  if (simgrid::mc::execute(
-      member->location_expression, &state))
-    xbt_die("Error evaluating DWARF expression");
-  if (state.stack_size == 0)
-    xbt_die("No value on the stack");
-  else
-    return (void *) state.stack[state.stack_size - 1];
+  ExpressionStack stack;
+  stack.push((ExpressionStack::value_type) base);
+  simgrid::dwarf::execute(member->location_expression, state, stack);
+  return (void*) stack.top();
+}
+
+}
 }