#include <lauxlib.h>
#include <lualib.h>
-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(lua_state_cloner, lua, "Lua state management");
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(lua_state_cloner, bindings, "Lua state management");
static void sglua_add_maestro_table(lua_State* L, int index, void* maestro_table_ptr);
static void* sglua_get_maestro_table_ptr(lua_State* L, int index);
* @param src the source state (not necessarily maestro)
* @param dst the destination state
*/
-void sglua_move_value(lua_State* src, lua_State *dst) {
+void sglua_move_value(lua_State* src, lua_State* dst) {
+
+ sglua_copy_value(src, dst);
+ lua_pop(src, 1);
+}
+
+/**
+ * @brief Pushes onto the stack a copy of the value on top another stack.
+ * If the value is a table, its content is copied recursively.
+ *
+ * This function allows to move a value between two different global states.
+ *
+ * @param src the source state (not necessarily maestro)
+ * @param dst the destination state
+ */
+void sglua_copy_value(lua_State* src, lua_State* dst) {
luaL_checkany(src, -1); /* check the value to copy */
break;
}
- /* the value has been copied to dst: remove it from src */
- lua_pop(src, 1);
-
indent -= 2;
XBT_DEBUG("%sData copied", sglua_get_spaces(indent));
- sglua_stack_dump("src after copying a value (should be ...): ", src);
+ sglua_stack_dump("src after copying a value (should be ... value): ", src);
sglua_stack_dump("dst after copying a value (should be ... value): ", dst);
}
/* it's a Lua function: dump it from src */
s_sglua_buffer_t buffer;
- buffer.capacity = 64;
+ buffer.capacity = 128; /* an empty function uses 77 bytes */
buffer.size = 0;
buffer.data = xbt_new(char, buffer.capacity);
/* copy the binary chunk from src into a buffer */
- int error = lua_dump(src, sglua_memory_writer, &buffer);
+ _XBT_GNUC_UNUSED int error = lua_dump(src, sglua_memory_writer, &buffer);
xbt_assert(!error, "Failed to dump the function from the source state: error %d",
error);
+ XBT_DEBUG("Fonction dumped: %zu bytes", buffer.size);
+
+ /*
+ fwrite(buffer.data, buffer.size, buffer.size, stderr);
+ fprintf(stderr, "\n");
+ */
/* load the chunk into dst */
error = luaL_loadbuffer(dst, buffer.data, buffer.size, "(dumped function)");
/* create the table of known tables from maestro */
lua_pushstring(L, "simgrid.maestro_tables");
/* "simgrid.maestro_tables" */
- lua_newtable(L); /* "simgrid.maestro_tables" maestrotbs*/
+ lua_newtable(L); /* "simgrid.maestro_tables" maestrotbs */
lua_rawset(L, LUA_REGISTRYINDEX);
/* -- */
/* opening the standard libs is not necessary as they are
- * be inherited like any global values */
+ * inherited like any global values */
/* luaL_openlibs(L); */
XBT_DEBUG("New state created");