Changeset 892 – HoverRace

Changeset 892

Show
Ignore:
Timestamp:
03/05/10 01:24:09 (5 months ago)
Author:
zoogie
Message:

Use generated references instead of a static address to store the table of callbacks.

Location:
trunk/client/Game2
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/client/Game2/SysConsole.cpp

    r887 r892  
    3939using namespace HoverRace::Script; 
    4040 
    41 namespace { 
    42     const char ON_INIT_REG_KEY = 'A'; 
    43 } 
    44  
    4541SysConsole::SysConsole() : 
    46     SUPER() 
     42    SUPER(), onInitRef(-1) 
    4743{ 
    4844} 
     
    5046SysConsole::~SysConsole() 
    5147{ 
     48    if (onInitRef >= 0) { 
     49        lua_State *state = GetScripting()->GetState(); 
     50        luaL_unref(state, LUA_REGISTRYINDEX, onInitRef); 
     51    } 
     52} 
     53 
     54void SysConsole::InitEnv(Script::Env *scripting) 
     55{ 
     56    SUPER::InitEnv(scripting); 
     57    onInitRef = luaL_ref(scripting->GetState(), LUA_REGISTRYINDEX); 
    5258} 
    5359 
     
    5864    lua_State *state = scripting->GetState(); 
    5965 
    60     lua_pushcclosure(state, SysConsole::LOnInit, 0); 
     66    lua_pushlightuserdata(state, this); 
     67    lua_pushcclosure(state, SysConsole::LOnInit, 1); 
    6168    lua_setglobal(state, "on_init"); 
    6269 
    63     lua_pushcclosure(state, SysConsole::LGetOnInit, 0); 
     70    lua_pushlightuserdata(state, this); 
     71    lua_pushcclosure(state, SysConsole::LGetOnInit, 1); 
    6472    lua_setglobal(state, "get_on_init"); 
    6573 
    6674    // Initial arrays for callbacks. 
    67     lua_pushlightuserdata(state, (void*)&ON_INIT_REG_KEY); 
    6875    lua_newtable(state); 
    69     lua_settable(state, LUA_REGISTRYINDEX); 
     76    lua_rawseti(state, LUA_REGISTRYINDEX, onInitRef); 
    7077} 
    7178 
     
    116123    lua_State *state = GetScripting()->GetState(); 
    117124 
    118     lua_pushlightuserdata(state, (void*)&ON_INIT_REG_KEY); 
    119     lua_gettable(state, LUA_REGISTRYINDEX);  // table 
     125    lua_rawgeti(state, LUA_REGISTRYINDEX, onInitRef);  // table 
    120126 
    121127    lua_pushnil(state);  // table nil 
     
    132138    // function on_init(f) 
    133139    // Register a callback function for when the game starts up. 
     140    SysConsole *self = static_cast<SysConsole*>(lua_touserdata(state, lua_upvalueindex(1))); 
    134141 
    135142    if (!lua_isfunction(state, 1)) { 
     
    138145    } 
    139146 
    140     lua_pushlightuserdata(state, (void*)&ON_INIT_REG_KEY); 
    141     lua_gettable(state, LUA_REGISTRYINDEX);  // table 
     147    lua_rawgeti(state, LUA_REGISTRYINDEX, self->onInitRef);  // table 
    142148 
    143149    lua_pushinteger(state, lua_objlen(state, -1) + 1); // table key 
     
    154160    // function get_on_init() 
    155161    // Returns the table of on_init callbacks (for debugging purposes). 
     162    SysConsole *self = static_cast<SysConsole*>(lua_touserdata(state, lua_upvalueindex(1))); 
    156163 
    157     lua_pushlightuserdata(state, (void*)&ON_INIT_REG_KEY); 
    158     lua_gettable(state, LUA_REGISTRYINDEX);  // table 
     164    lua_rawgeti(state, LUA_REGISTRYINDEX, self->onInitRef);  // table 
    159165 
    160166    return 1; 
  • trunk/client/Game2/SysConsole.h

    r880 r892  
    3737 
    3838    protected: 
     39        virtual void InitEnv(Script::Env *scripting); 
    3940        virtual void InitGlobals(Script::Env *scripting); 
    4041 
     
    5657        static int LOnInit(lua_State *state); 
    5758        static int LGetOnInit(lua_State *state); 
     59 
     60    private: 
     61        int onInitRef; 
    5862}; 
    5963