static void mark_function(lua_State *L, lua_State *dL) { const void *p = lua_topointer(L, -1); int i; lua_Debug ar; char used_in[128]; const char *name; if (!is_marked(dL, p)) { marked(dL, p, 0); //已经在table里头算了 lua_pushvalue(L, -1); lua_getinfo(L, ">S", &ar); snprintf(used_in, sizeof(used_in) - 1, "%s:%d~%d", ar.short_src, ar.linedefined, ar.lastlinedefined); used_in[sizeof(used_in) - 1] = 0; for (i=1;;i++) { name = lua_getupvalue(L,-1,i); if (name == NULL) break; p = lua_topointer(L, -1); if (*name != '\0' && LUA_TTABLE == lua_type(L, -1)) { make_root(dL, p, name, RT_UPVALUE, used_in, 1); lua_insert(dL, MARKED_TABLE); mark_object(L, dL); lua_remove(dL, MARKED_TABLE); } else if (LUA_TFUNCTION == lua_type(L, -1)) { mark_function(L, dL); } lua_pop(L, 1); } } }
/*---------------------------------------------------------------------*/ void bgl_init_objects() { /* initialize the preloading */ bmem_init(); /* initialize the runtime system */ ____bgl_init_objects(); unknown_ident = string_to_symbol( "unknown_function" ); mark_function( unknown_ident, 0, ante_bgl_init_dsz, 0, -1, -1, -1 ); bgl_socket_accept_symbol = string_to_symbol( "$socket-accept" ); ((esymbol_t *)(CREF(bgl_socket_accept_symbol)))->class_alloc = HOSTENT_TYPE_NUM; bgl_socket_accept_many_symbol = string_to_symbol( "$socket-accept-many" ); ((esymbol_t *)(CREF(bgl_socket_accept_many_symbol)))->class_alloc = HOSTENT_TYPE_NUM; bgl_make_input_port_symbol = string_to_symbol( "$make-input-port" ); ((esymbol_t *)(CREF(bgl_make_input_port_symbol)))->class_alloc = UNKNOWN_ATOMIC_TYPE_NUM; /* signal registration */ signal( 2, bmem_dump ); /* exit registration */ atexit( (void (*)(void))bmem_dump ); }
static void mark_object(lua_State *L, lua_State *dL) { switch (lua_type(L, -1)) { case LUA_TTABLE: mark_table(L, dL); break; case LUA_TFUNCTION: mark_function(L, dL); break; default: break; } }
static void mark_object(lua_State *L, lua_State *dL, const void * parent, const char *desc) { int t = lua_type(L, -1); switch (t) { case LUA_TTABLE: mark_table(L, dL, parent, desc); break; case LUA_TUSERDATA: mark_userdata(L, dL, parent, desc); break; case LUA_TFUNCTION: mark_function(L, dL, parent, desc); break; case LUA_TTHREAD: mark_thread(L, dL, parent, desc); break; default: lua_pop(L,1); break; } }