Пример #1
0
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);
		}
	}
}
Пример #2
0
/*---------------------------------------------------------------------*/
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 );
}
Пример #3
0
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;
	}
}
Пример #4
0
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;
    }
}