From: John L. <jr...@us...> - 2008-01-24 00:18:23
|
Update of /cvsroot/wxlua/wxLua/modules/wxlua/src In directory sc8-pr-cvs9.sourceforge.net:/tmp/cvs-serv5955/wxLua/modules/wxlua/src Modified Files: wxlbind.cpp wxlstate.cpp wxlua_bind.cpp Log Message: * The wxLua type numbers are now generated when the first wxLuaState is created rather then when the bindings are registered into Lua. This means that each wxLua type stays the same for the life of the program no matter what bindings are installed or in what order. - The copy of the wxLuaBindingList in the wxLuaState was removed since it is no longer needed. Renamed the functions static wxLuaBinding::GetBindXXX() to FindBindXXX() since they no longer needed the extra wxLuaBindingList parameter and they had the same signature as the existing GetBindXXX() functions. - Added wxLuaState::RegisterBinding(wxLuaBinding*) function to register single bindings at a time. You may also reregister bindings, which means that their metatable functions are simple rewritten. Index: wxlstate.cpp =================================================================== RCS file: /cvsroot/wxlua/wxLua/modules/wxlua/src/wxlstate.cpp,v retrieving revision 1.165 retrieving revision 1.166 diff -C2 -d -r1.165 -r1.166 *** wxlstate.cpp 23 Jan 2008 06:43:39 -0000 1.165 --- wxlstate.cpp 24 Jan 2008 00:18:18 -0000 1.166 *************** *** 32,35 **** --- 32,36 ---- const char* wxlua_lreg_derivedmethods_key = "wxLua derived class methods"; const char* wxlua_lreg_wxluastate_key = "wxLuaState"; + const char* wxlua_lreg_wxluabindings_key = "wxLuaBindings"; const char* wxlua_lreg_weakobjects_key = "wxLua objects pushed"; const char* wxlua_lreg_gcobjects_key = "wxLua gc objects to delete"; *************** *** 39,43 **** const char* wxlua_lreg_callbaseclassfunc_key = "wxLua CallBaseClassFunc"; const char* wxlua_lreg_wxeventtype_key = "wxLua wxEventType"; ! const char* wxlua_lreg_wxluadebughookdata_key = "wxLuaDebugHookData"; const char* wxlua_lreg_regtable_key = "wxLua LUA_REGISTRYINDEX tables"; --- 40,44 ---- const char* wxlua_lreg_callbaseclassfunc_key = "wxLua CallBaseClassFunc"; const char* wxlua_lreg_wxeventtype_key = "wxLua wxEventType"; ! const char* wxlua_lreg_wxluastatedata_key = "wxLuaStateData"; const char* wxlua_lreg_regtable_key = "wxLua LUA_REGISTRYINDEX tables"; *************** *** 99,104 **** { // NULL when shutting down. ! wxLuaDebugHookData* hookData = wxlua_getwxluadebughookdata(L); ! if (!hookData) return; // FIXME - for select event types we don't want to do anything --- 100,105 ---- { // NULL when shutting down. ! wxLuaStateData* wxlStateData = wxlua_getwxluastatedata(L); ! if (!wxlStateData) return; // FIXME - for select event types we don't want to do anything *************** *** 110,114 **** // they want to break the program, restore old debug hook, then error out ! if (hookData->m_debug_hook_break) { // It's ok that we get the wxLuaState here since we're stopping anyway. --- 111,115 ---- // they want to break the program, restore old debug hook, then error out ! if (wxlStateData->m_debug_hook_break) { // It's ok that we get the wxLuaState here since we're stopping anyway. *************** *** 117,121 **** // restore hook to previous state wxlState.ClearDebugHookBreak(); ! wxlua_error(L, hookData->m_debug_hook_break_msg); return; } --- 118,122 ---- // restore hook to previous state wxlState.ClearDebugHookBreak(); ! wxlua_error(L, wxlStateData->m_debug_hook_break_msg); return; } *************** *** 123,127 **** // Assume they've set the wxEvtHandler, ok if not, but it wouldn't make sense // We use wxLuaState::SendEvent() because it sets wxEvent::SetEventObject() for us. ! if (hookData->m_lua_debug_hook_send_evt) { wxLuaState wxlState(L); --- 124,128 ---- // Assume they've set the wxEvtHandler, ok if not, but it wouldn't make sense // We use wxLuaState::SendEvent() because it sets wxEvent::SetEventObject() for us. ! if (wxlStateData->m_lua_debug_hook_send_evt) { wxLuaState wxlState(L); *************** *** 139,152 **** // Try to yield *after* sending event to allow C++ gui update ! if (hookData->m_lua_debug_hook_yield > 0) { // yield based on number of ms passed NOT every hook event ! unsigned long last_time = hookData->m_last_debug_hook_time; unsigned long cur_time = wxGetLocalTimeMillis().GetLo(); ! if ((cur_time > last_time + hookData->m_lua_debug_hook_yield) || (cur_time < last_time)) // wrapped { ! hookData->m_last_debug_hook_time = cur_time; bool painting = (evtType == wxEVT_PAINT); --- 140,153 ---- // Try to yield *after* sending event to allow C++ gui update ! if (wxlStateData->m_lua_debug_hook_yield > 0) { // yield based on number of ms passed NOT every hook event ! unsigned long last_time = wxlStateData->m_last_debug_hook_time; unsigned long cur_time = wxGetLocalTimeMillis().GetLo(); ! if ((cur_time > last_time + wxlStateData->m_lua_debug_hook_yield) || (cur_time < last_time)) // wrapped { ! wxlStateData->m_last_debug_hook_time = cur_time; bool painting = (evtType == wxEVT_PAINT); *************** *** 308,317 **** // check if this method is part of a class ! const wxLuaBindClass* wxlClass = wxLuaBinding::GetBindClass(wxlMethod, NULL); // if not, check if it's a global C style function wxLuaBinding* binding = NULL; if (wxlClass == NULL) ! binding = wxLuaBinding::GetFunctionBinding(wxlMethod, NULL); if ((wxlClass != NULL) || (binding != NULL)) --- 309,318 ---- // check if this method is part of a class ! const wxLuaBindClass* wxlClass = wxLuaBinding::FindBindClass(wxlMethod); // if not, check if it's a global C style function wxLuaBinding* binding = NULL; if (wxlClass == NULL) ! binding = wxLuaBinding::FindMethodBinding(wxlMethod); if ((wxlClass != NULL) || (binding != NULL)) *************** *** 1869,1878 **** } ! wxLuaDebugHookData* LUACALL wxlua_getwxluadebughookdata(lua_State* L) { ! lua_pushlightuserdata(L, &wxlua_lreg_wxluadebughookdata_key); lua_rawget( L, LUA_REGISTRYINDEX ); // pop key, push bool ! wxLuaDebugHookData* data = (wxLuaDebugHookData*)lua_touserdata(L, -1); lua_pop(L, 1); // pop udata --- 1870,1879 ---- } ! wxLuaStateData* LUACALL wxlua_getwxluastatedata(lua_State* L) { ! lua_pushlightuserdata(L, &wxlua_lreg_wxluastatedata_key); lua_rawget( L, LUA_REGISTRYINDEX ); // pop key, push bool ! wxLuaStateData* data = (wxLuaStateData*)lua_touserdata(L, -1); lua_pop(L, 1); // pop udata *************** *** 2026,2045 **** wxLuaStateData::wxLuaStateData() ! :m_bindings_registered(false), ! m_is_running(false), m_is_closing(false), m_evtHandler(NULL), m_id(wxID_ANY) { - // we add "new" copies of the bindings, let the list delete them - m_bindingList.DeleteContents(true); - - wxLuaBindingList::compatibility_iterator node = wxLuaBinding::GetBindingList()->GetFirst(); - while (node) - { - wxLuaBinding* binding = node->GetData(); - m_bindingList.Append(binding->Clone()); // append the "new" binding - node = node->GetNext(); - } } --- 2027,2039 ---- wxLuaStateData::wxLuaStateData() ! :m_is_running(false), m_is_closing(false), + m_lua_debug_hook_count(100), m_lua_debug_hook_yield(50), + m_lua_debug_hook(0), m_lua_debug_hook_send_evt(false), + m_last_debug_hook_time(0), m_debug_hook_break(false), + m_debug_hook_break_msg(wxT("Break")), m_evtHandler(NULL), m_id(wxID_ANY) { } *************** *** 2048,2059 **** // no events here, the handler may already be gone m_evtHandler = NULL; - - wxLuaBindingList::compatibility_iterator node = m_bindingList.GetFirst(); - while (node) - { - wxLuaBindingList::compatibility_iterator next_node = node->GetNext(); - m_bindingList.DeleteNode(node); // see m_bindingList.DeleteContents(true) - node = next_node; - } } --- 2042,2045 ---- *************** *** 2138,2144 **** } ! // clear the wxlua_lreg_wxluadebughookdata_key which we test for in the debug hook // to know if the lua_State is being closed ! lua_pushlightuserdata(m_lua_State, &wxlua_lreg_wxluadebughookdata_key); lua_pushnil(m_lua_State); lua_rawset( m_lua_State, LUA_REGISTRYINDEX ); // pop key, push bool --- 2124,2130 ---- } ! // clear the wxlua_lreg_wxluastatedata_key which we test for in the debug hook // to know if the lua_State is being closed ! lua_pushlightuserdata(m_lua_State, &wxlua_lreg_wxluastatedata_key); lua_pushnil(m_lua_State); lua_rawset( m_lua_State, LUA_REGISTRYINDEX ); // pop key, push bool *************** *** 2328,2334 **** wxlua_setwxeventtype(L, wxEVT_NULL); ! // Push our debug hook data ! lua_pushlightuserdata(L, &wxlua_lreg_wxluadebughookdata_key); ! lua_pushlightuserdata(L, &M_WXLSTATEDATA->m_wxlStateData->m_debugHookData); lua_rawset(L, LUA_REGISTRYINDEX); // set the value --- 2314,2320 ---- wxlua_setwxeventtype(L, wxEVT_NULL); ! // Push our wxLuaStateData ! lua_pushlightuserdata(L, &wxlua_lreg_wxluastatedata_key); ! lua_pushlightuserdata(L, M_WXLSTATEDATA->m_wxlStateData); lua_rawset(L, LUA_REGISTRYINDEX); // set the value *************** *** 2361,2364 **** --- 2347,2353 ---- wxlua_lreg_createtable(L, &wxlua_lreg_derivedmethods_key); + // Create a table for the wxLuaBindings we've installed + wxlua_lreg_createtable(L, &wxlua_lreg_wxluabindings_key); + // Create a table for the userdata that we've pushed into Lua wxlua_lreg_createtable(L, &wxlua_lreg_weakobjects_key); *************** *** 2543,2547 **** wxCHECK_MSG(!M_WXLSTATEDATA->m_wxlStateData->m_is_running, LUA_ERRRUN, wxT("Lua interpreter is already running")); ! M_WXLSTATEDATA->m_wxlStateData->m_debugHookData.m_debug_hook_break = false; M_WXLSTATEDATA->m_wxlStateData->m_is_running = true; --- 2532,2536 ---- wxCHECK_MSG(!M_WXLSTATEDATA->m_wxlStateData->m_is_running, LUA_ERRRUN, wxT("Lua interpreter is already running")); ! M_WXLSTATEDATA->m_wxlStateData->m_debug_hook_break = false; M_WXLSTATEDATA->m_wxlStateData->m_is_running = true; *************** *** 2555,2559 **** lua_SetTop(top); // restore original top (removes err msg) ! M_WXLSTATEDATA->m_wxlStateData->m_debugHookData.m_debug_hook_break = false; M_WXLSTATEDATA->m_wxlStateData->m_is_running = false; --- 2544,2548 ---- lua_SetTop(top); // restore original top (removes err msg) ! M_WXLSTATEDATA->m_wxlStateData->m_debug_hook_break = false; M_WXLSTATEDATA->m_wxlStateData->m_is_running = false; *************** *** 2572,2576 **** wxCHECK_MSG(!M_WXLSTATEDATA->m_wxlStateData->m_is_running, LUA_ERRRUN, wxT("Lua interpreter is already running")); ! M_WXLSTATEDATA->m_wxlStateData->m_debugHookData.m_debug_hook_break = false; M_WXLSTATEDATA->m_wxlStateData->m_is_running = true; --- 2561,2565 ---- wxCHECK_MSG(!M_WXLSTATEDATA->m_wxlStateData->m_is_running, LUA_ERRRUN, wxT("Lua interpreter is already running")); ! M_WXLSTATEDATA->m_wxlStateData->m_debug_hook_break = false; M_WXLSTATEDATA->m_wxlStateData->m_is_running = true; *************** *** 2584,2588 **** lua_SetTop(top); // restore original top (removes err msg) ! M_WXLSTATEDATA->m_wxlStateData->m_debugHookData.m_debug_hook_break = false; M_WXLSTATEDATA->m_wxlStateData->m_is_running = false; --- 2573,2577 ---- lua_SetTop(top); // restore original top (removes err msg) ! M_WXLSTATEDATA->m_wxlStateData->m_debug_hook_break = false; M_WXLSTATEDATA->m_wxlStateData->m_is_running = false; *************** *** 2690,2695 **** // recursion asserts if you call wxlua_Error() within another wxYield, i.e. from a gui button ! M_WXLSTATEDATA->m_wxlStateData->m_debugHookData.m_debug_hook_break_msg = msg; ! M_WXLSTATEDATA->m_wxlStateData->m_debugHookData.m_debug_hook_break = true; lua_sethook(GetLuaState(), wxlua_debugHookFunction, LUA_MASKCALL|LUA_MASKRET|LUA_MASKLINE|LUA_MASKCOUNT, 1); M_WXLSTATEDATA->m_wxlStateData->m_is_running = false; --- 2679,2684 ---- // recursion asserts if you call wxlua_Error() within another wxYield, i.e. from a gui button ! M_WXLSTATEDATA->m_wxlStateData->m_debug_hook_break_msg = msg; ! M_WXLSTATEDATA->m_wxlStateData->m_debug_hook_break = true; lua_sethook(GetLuaState(), wxlua_debugHookFunction, LUA_MASKCALL|LUA_MASKRET|LUA_MASKLINE|LUA_MASKCOUNT, 1); M_WXLSTATEDATA->m_wxlStateData->m_is_running = false; *************** *** 2700,2704 **** wxCHECK_RET(Ok(), wxT("Invalid wxLuaState")); ! M_WXLSTATEDATA->m_wxlStateData->m_debugHookData.m_debug_hook_break = false; SetLuaDebugHook(GetLuaDebugHookCount(), GetLuaDebugHookYield(), --- 2689,2693 ---- wxCHECK_RET(Ok(), wxT("Invalid wxLuaState")); ! M_WXLSTATEDATA->m_wxlStateData->m_debug_hook_break = false; SetLuaDebugHook(GetLuaDebugHookCount(), GetLuaDebugHookYield(), *************** *** 2710,2719 **** { wxCHECK_MSG(Ok(), false, wxT("Invalid wxLuaState")); ! return M_WXLSTATEDATA->m_wxlStateData->m_debugHookData.m_debug_hook_break; } wxString wxLuaState::GetDebugHookBreakMessage() const { wxCHECK_MSG(Ok(), wxEmptyString, wxT("Invalid wxLuaState")); ! return M_WXLSTATEDATA->m_wxlStateData->m_debugHookData.m_debug_hook_break_msg; } --- 2699,2708 ---- { wxCHECK_MSG(Ok(), false, wxT("Invalid wxLuaState")); ! return M_WXLSTATEDATA->m_wxlStateData->m_debug_hook_break; } wxString wxLuaState::GetDebugHookBreakMessage() const { wxCHECK_MSG(Ok(), wxEmptyString, wxT("Invalid wxLuaState")); ! return M_WXLSTATEDATA->m_wxlStateData->m_debug_hook_break_msg; } *************** *** 2724,2731 **** wxCHECK_RET(Ok(), wxT("Invalid wxLuaState")); ! M_WXLSTATEDATA->m_wxlStateData->m_debugHookData.m_lua_debug_hook = hook; ! M_WXLSTATEDATA->m_wxlStateData->m_debugHookData.m_lua_debug_hook_count = count; ! M_WXLSTATEDATA->m_wxlStateData->m_debugHookData.m_lua_debug_hook_yield = yield_ms; ! M_WXLSTATEDATA->m_wxlStateData->m_debugHookData.m_lua_debug_hook_send_evt = send_debug_evt; // These are the various hooks you can install --- 2713,2720 ---- wxCHECK_RET(Ok(), wxT("Invalid wxLuaState")); ! M_WXLSTATEDATA->m_wxlStateData->m_lua_debug_hook = hook; ! M_WXLSTATEDATA->m_wxlStateData->m_lua_debug_hook_count = count; ! M_WXLSTATEDATA->m_wxlStateData->m_lua_debug_hook_yield = yield_ms; ! M_WXLSTATEDATA->m_wxlStateData->m_lua_debug_hook_send_evt = send_debug_evt; // These are the various hooks you can install *************** *** 2737,2756 **** { wxCHECK_MSG(Ok(), 0, wxT("Invalid wxLuaState")); ! return M_WXLSTATEDATA->m_wxlStateData->m_debugHookData.m_lua_debug_hook; } int wxLuaState::GetLuaDebugHookCount() const { wxCHECK_MSG(Ok(), 0, wxT("Invalid wxLuaState")); ! return M_WXLSTATEDATA->m_wxlStateData->m_debugHookData.m_lua_debug_hook_count; } int wxLuaState::GetLuaDebugHookYield() const { wxCHECK_MSG(Ok(), 0, wxT("Invalid wxLuaState")); ! return M_WXLSTATEDATA->m_wxlStateData->m_debugHookData.m_lua_debug_hook_yield; } bool wxLuaState::GetLuaDebugHookSendEvt() const { wxCHECK_MSG(Ok(), false, wxT("Invalid wxLuaState")); ! return M_WXLSTATEDATA->m_wxlStateData->m_debugHookData.m_lua_debug_hook_send_evt; } --- 2726,2745 ---- { wxCHECK_MSG(Ok(), 0, wxT("Invalid wxLuaState")); ! return M_WXLSTATEDATA->m_wxlStateData->m_lua_debug_hook; } int wxLuaState::GetLuaDebugHookCount() const { wxCHECK_MSG(Ok(), 0, wxT("Invalid wxLuaState")); ! return M_WXLSTATEDATA->m_wxlStateData->m_lua_debug_hook_count; } int wxLuaState::GetLuaDebugHookYield() const { wxCHECK_MSG(Ok(), 0, wxT("Invalid wxLuaState")); ! return M_WXLSTATEDATA->m_wxlStateData->m_lua_debug_hook_yield; } bool wxLuaState::GetLuaDebugHookSendEvt() const { wxCHECK_MSG(Ok(), false, wxT("Invalid wxLuaState")); ! return M_WXLSTATEDATA->m_wxlStateData->m_lua_debug_hook_send_evt; } *************** *** 2758,2767 **** { wxCHECK_MSG(Ok(), 0, wxT("Invalid wxLuaState")); ! return M_WXLSTATEDATA->m_wxlStateData->m_debugHookData.m_last_debug_hook_time; } void wxLuaState::SetLastLuaDebugHookTime(unsigned long t) { wxCHECK_RET(Ok(), wxT("Invalid wxLuaState")); ! M_WXLSTATEDATA->m_wxlStateData->m_debugHookData.m_last_debug_hook_time = t; } --- 2747,2756 ---- { wxCHECK_MSG(Ok(), 0, wxT("Invalid wxLuaState")); ! return M_WXLSTATEDATA->m_wxlStateData->m_last_debug_hook_time; } void wxLuaState::SetLastLuaDebugHookTime(unsigned long t) { wxCHECK_RET(Ok(), wxT("Invalid wxLuaState")); ! M_WXLSTATEDATA->m_wxlStateData->m_last_debug_hook_time = t; } *************** *** 2774,2788 **** } ! void wxLuaState::RegisterBindings() { ! wxCHECK_RET(Ok(), wxT("Invalid wxLuaState")); ! // Note: It may be possible to allow this in the future if there is a need. ! wxCHECK_RET(!GetBindingsRegistered(), wxT("wxLua bindings already registered")); wxLuaBinding::InitAllBindings(); // only runs the first time through // Register bindings ! wxLuaBindingList::compatibility_iterator node = M_WXLSTATEDATA->m_wxlStateData->m_bindingList.GetFirst(); while (node) { --- 2763,2785 ---- } ! bool wxLuaState::RegisterBinding(wxLuaBinding* binding) { ! wxCHECK_MSG(Ok(), false, wxT("Invalid wxLuaState")); ! wxCHECK_MSG(binding, false, wxT("Invalid wxLuaState")); ! wxLuaBinding::InitAllBindings(); // only runs the first time through ! ! binding->RegisterBinding(*this); + return true; + } + + bool wxLuaState::RegisterBindings() + { + wxCHECK_MSG(Ok(), false, wxT("Invalid wxLuaState")); wxLuaBinding::InitAllBindings(); // only runs the first time through // Register bindings ! wxLuaBindingList::compatibility_iterator node = wxLuaBinding::GetBindingList()->GetFirst(); while (node) { *************** *** 2792,2796 **** } ! M_WXLSTATEDATA->m_wxlStateData->m_bindings_registered = true; } --- 2789,2793 ---- } ! return true; } *************** *** 2798,2802 **** { wxCHECK_MSG(GetRefData() != NULL, NULL, wxT("Invalid wxLuaState")); ! return wxLuaBinding::GetLuaBinding(bindingName, &M_WXLSTATEDATA->m_wxlStateData->m_bindingList); } --- 2795,2799 ---- { wxCHECK_MSG(GetRefData() != NULL, NULL, wxT("Invalid wxLuaState")); ! return wxLuaBinding::GetLuaBinding(bindingName); } *************** *** 2810,2814 **** // we shouldn't ever need this code if (wxlClass == NULL) ! wxlClass = wxLuaBinding::GetBindClass(wxluatype, &M_WXLSTATEDATA->m_wxlStateData->m_bindingList); return wxlClass; --- 2807,2811 ---- // we shouldn't ever need this code if (wxlClass == NULL) ! wxlClass = wxLuaBinding::FindBindClass(wxluatype); return wxlClass; *************** *** 2822,2831 **** { wxCHECK_MSG(GetRefData() != NULL, NULL, wxT("Invalid wxLuaState")); ! return wxLuaBinding::GetBindClass(wxlMethod, &M_WXLSTATEDATA->m_wxlStateData->m_bindingList); } const wxLuaBindClass* wxLuaState::GetBindClass(const wxLuaBindCFunc* wxlClass) const { wxCHECK_MSG(GetRefData() != NULL, NULL, wxT("Invalid wxLuaState")); ! return wxLuaBinding::GetBindClass(wxlClass, &M_WXLSTATEDATA->m_wxlStateData->m_bindingList); } --- 2819,2828 ---- { wxCHECK_MSG(GetRefData() != NULL, NULL, wxT("Invalid wxLuaState")); ! return wxLuaBinding::FindBindClass(wxlMethod); } const wxLuaBindClass* wxLuaState::GetBindClass(const wxLuaBindCFunc* wxlClass) const { wxCHECK_MSG(GetRefData() != NULL, NULL, wxT("Invalid wxLuaState")); ! return wxLuaBinding::FindBindClass(wxlClass); } *************** *** 2839,2854 **** { wxCHECK_MSG(Ok(), NULL, wxT("Invalid wxLuaState")); ! return wxLuaBinding::GetBindEvent(eventType, &M_WXLSTATEDATA->m_wxlStateData->m_bindingList); ! } ! ! wxLuaBindingList* wxLuaState::GetLuaBindingList() const ! { ! wxCHECK_MSG(GetRefData() != NULL, NULL, wxT("Invalid wxLuaState")); ! return &M_WXLSTATEDATA->m_wxlStateData->m_bindingList; ! } ! bool wxLuaState::GetBindingsRegistered() const ! { ! wxCHECK_MSG(GetRefData() != NULL, false, wxT("Invalid wxLuaState")); ! return M_WXLSTATEDATA->m_wxlStateData->m_bindings_registered; } --- 2836,2840 ---- { wxCHECK_MSG(Ok(), NULL, wxT("Invalid wxLuaState")); ! return wxLuaBinding::FindBindEvent(eventType); } Index: wxlbind.cpp =================================================================== RCS file: /cvsroot/wxlua/wxLua/modules/wxlua/src/wxlbind.cpp,v retrieving revision 1.117 retrieving revision 1.118 diff -C2 -d -r1.117 -r1.118 *** wxlbind.cpp 23 Jan 2008 06:43:39 -0000 1.117 --- wxlbind.cpp 24 Jan 2008 00:18:17 -0000 1.118 *************** *** 815,819 **** wxString className; ! const wxLuaBindClass* wxlClass = wxLuaBinding::GetBindClass(method, NULL); if (wxlClass) className = lua2wx(wxlClass->name) + wxT("::"); --- 815,819 ---- wxString className; ! const wxLuaBindClass* wxlClass = wxLuaBinding::FindBindClass(method); if (wxlClass) className = lua2wx(wxlClass->name) + wxT("::"); *************** *** 942,946 **** wxLuaBindingList wxLuaBinding::sm_bindingList; bool wxLuaBinding::sm_bindingList_initialized = false; ! int wxLuaBinding::sm_wxluatype_counter = WXLUA_T_MAX+1; wxLuaBinding::wxLuaBinding() --- 942,946 ---- wxLuaBindingList wxLuaBinding::sm_bindingList; bool wxLuaBinding::sm_bindingList_initialized = false; ! int wxLuaBinding::sm_wxluatype_max = WXLUA_T_MAX; wxLuaBinding::wxLuaBinding() *************** *** 951,958 **** m_objectCount(0), m_objectArray(NULL), m_functionCount(0), m_functionArray(NULL), ! m_bindings_registered(false), ! m_first_wxluatype(0), ! m_last_wxluatype(0), ! m_luaTable_ref(-1) { } --- 951,956 ---- m_objectCount(0), m_objectArray(NULL), m_functionCount(0), m_functionArray(NULL), ! m_first_wxluatype(WXLUA_TUNKNOWN), ! m_last_wxluatype(WXLUA_TUNKNOWN) { } *************** *** 964,967 **** --- 962,969 ---- if (m_classArray && (m_classCount > 0)) { + // initialize types only once, we don't need to resort them either + if (*m_classArray[0].wxluatype != WXLUA_TUNKNOWN) + return; + qsort(m_classArray, m_classCount, sizeof(wxLuaBindClass), wxLuaBindClassArrayCompareFn); *************** *** 969,975 **** for (size_t i = 0; i < m_classCount; ++i, ++wxlClass) { ! // initialize types only once ! if (*wxlClass->wxluatype == WXLUA_TUNKNOWN) ! *wxlClass->wxluatype = wxLuaBinding::sm_wxluatype_counter++; // Also sort the member functions for each class --- 971,975 ---- for (size_t i = 0; i < m_classCount; ++i, ++wxlClass) { ! *wxlClass->wxluatype = ++wxLuaBinding::sm_wxluatype_max; // Also sort the member functions for each class *************** *** 980,983 **** --- 980,987 ---- qsort(wxlClass->enums, wxlClass->enums_n, sizeof(wxLuaBindNumber), wxLuaBindNumberArrayCompareFn); } + + // these mark what types numbers are declared in this binding + m_first_wxluatype = *m_classArray[0].wxluatype; + m_last_wxluatype = *m_classArray[m_classCount-1].wxluatype; } *************** *** 1001,1014 **** lua_State *L = wxlState.GetLuaState(); - if (m_bindings_registered) - { - wxString s; - s.Printf(wxT("wxLua: Bindings '%s' in Lua namespace '%s' are already registered."), - m_bindingName.c_str(), m_nameSpace.c_str()); - - wxlua_error(L, s); - return false; - } - // Let Lua create a new table for us and add it to these places. // We use an empty luaL_Reg since we just want luaI_openlib to create the --- 1005,1008 ---- *************** *** 1034,1059 **** // Find a registered binding with the same namespace, if any, ! // and share the m_luaTable_ref to that of the previously loaded binding ! wxLuaBindingList::compatibility_iterator node = wxlState.GetLuaBindingList()->GetFirst(); ! while (node) { ! wxLuaBinding* binding = node->GetData(); ! if ((binding->GetLuaNamespace() == m_nameSpace) && (binding->m_luaTable_ref >= 0)) { ! m_luaTable_ref = binding->m_luaTable_ref; break; } ! node = node->GetNext(); } // first time adding this namespace table ! if (m_luaTable_ref < 1) { // create a ref for the wxLua table we're filling ! m_luaTable_ref = wxluaR_ref(L, -1, &wxlua_lreg_refs_key); } PreRegister(wxlState, bind_table_idx); // register all our classes etc. in the wxLua table --- 1028,1073 ---- // Find a registered binding with the same namespace, if any, ! // and share the table with that of the previously loaded binding ! int luaTable_ref = -1; ! ! lua_pushlightuserdata(L, &wxlua_lreg_wxluabindings_key); // push key ! lua_rawget(L, LUA_REGISTRYINDEX); // pop key, push value (the bindings table) ! ! lua_pushnil(L); ! while (lua_next(L, -2) != 0) { ! // value = -1, key = -2, table = -3 ! wxLuaBinding* binding = (wxLuaBinding*)lua_touserdata(L, -2); ! if (binding->GetLuaNamespace() == m_nameSpace) { ! luaTable_ref = (int)lua_tonumber(L, -1); ! lua_pop(L, 2); // pop key and value break; } ! lua_pop(L, 1); // pop value, lua_next will pop key at end } + lua_pop(L, 1); // pop table + + // first time adding this namespace table ! if (luaTable_ref < 1) { // create a ref for the wxLua table we're filling ! luaTable_ref = wxluaR_ref(L, -1, &wxlua_lreg_refs_key); } + // Add us to the LUA_REGISTRYINDEX table of bindings + lua_pushlightuserdata(L, &wxlua_lreg_wxluabindings_key); // push key + lua_rawget(L, LUA_REGISTRYINDEX); // pop key, push value (the bindings table) + + lua_pushlightuserdata(L, this); // push key + lua_pushnumber(L, luaTable_ref); // push value + lua_rawset(L, -3); // set t[key] = value; pop key and value + lua_pop(L, 1); // pop table + + // Call the binding functions PreRegister(wxlState, bind_table_idx); // register all our classes etc. in the wxLua table *************** *** 1063,1068 **** lua_pop(L, 1); // pop the table created above - m_bindings_registered = true; - return true; } --- 1077,1080 ---- *************** *** 1084,1088 **** size_t n; ! int wxl_type = m_first_wxluatype; // install the classes, functions and methods, creating new wxLua types --- 1096,1100 ---- size_t n; ! int wxl_type = WXLUA_TUNKNOWN; // install the classes, functions and methods, creating new wxLua types *************** *** 1102,1109 **** // ------------------------------------------------------------------ // Create a new metatable for this class with a numerical wxLua type index - wxl_type = wxluaT_newmetatable(L, *wxlClass->wxluatype); // create metatable, is on top of stack ! if (n == 0) ! m_first_wxluatype = wxl_type; // store a lookup in the class metatable to the wxLuaBindClass struct --- 1114,1123 ---- // ------------------------------------------------------------------ // Create a new metatable for this class with a numerical wxLua type index ! wxl_type = *wxlClass->wxluatype; ! ! // we may be reregistering this binding, get the old metatable, we'll rewrite it ! if (!wxluaT_getmetatable(L, wxl_type)) ! wxluaT_newmetatable(L, wxl_type); // create metatable, is on top of stack // store a lookup in the class metatable to the wxLuaBindClass struct *************** *** 1250,1255 **** } - m_last_wxluatype = wxl_type; - // register the global C style functions wxLuaBindMethod* wxlMethod = m_functionArray; --- 1264,1267 ---- *************** *** 1405,1412 **** // static ! wxLuaBinding* wxLuaBinding::GetLuaBinding(const wxString& bindingName, const wxLuaBindingList* bindingList_) { ! const wxLuaBindingList* bindingList = bindingList_ ? bindingList_ : &sm_bindingList; ! wxLuaBindingList::compatibility_iterator node = bindingList->GetFirst(); while (node) --- 1417,1423 ---- // static ! wxLuaBinding* wxLuaBinding::GetLuaBinding(const wxString& bindingName) { ! wxLuaBindingList::compatibility_iterator node = sm_bindingList.GetFirst(); while (node) *************** *** 1423,1430 **** // static ! const wxLuaBindClass* wxLuaBinding::GetBindClass(int wxluatype, const wxLuaBindingList* bindingList_) { ! const wxLuaBindingList* bindingList = bindingList_ ? bindingList_ : &sm_bindingList; ! wxLuaBindingList::compatibility_iterator node = bindingList->GetFirst(); while (node) --- 1434,1440 ---- // static ! const wxLuaBindClass* wxLuaBinding::FindBindClass(int wxluatype) { ! wxLuaBindingList::compatibility_iterator node = sm_bindingList.GetFirst(); while (node) *************** *** 1443,1450 **** // static ! const wxLuaBindClass* wxLuaBinding::GetBindClass(const wxLuaBindMethod* wxlMethod, const wxLuaBindingList* bindingList_) { ! const wxLuaBindingList* bindingList = bindingList_ ? bindingList_ : &sm_bindingList; ! wxLuaBindingList::compatibility_iterator node = bindingList->GetFirst(); while (node) --- 1453,1459 ---- // static ! const wxLuaBindClass* wxLuaBinding::FindBindClass(const wxLuaBindMethod* wxlMethod) { ! wxLuaBindingList::compatibility_iterator node = sm_bindingList.GetFirst(); while (node) *************** *** 1463,1470 **** // static ! const wxLuaBindClass* wxLuaBinding::GetBindClass(const wxLuaBindCFunc* wxlCFunc, const wxLuaBindingList* bindingList_) { ! const wxLuaBindingList* bindingList = bindingList_ ? bindingList_ : &sm_bindingList; ! wxLuaBindingList::compatibility_iterator node = bindingList->GetFirst(); while (node) --- 1472,1478 ---- // static ! const wxLuaBindClass* wxLuaBinding::FindBindClass(const wxLuaBindCFunc* wxlCFunc) { ! wxLuaBindingList::compatibility_iterator node = sm_bindingList.GetFirst(); while (node) *************** *** 1483,1490 **** // static ! const wxLuaBindEvent* wxLuaBinding::GetBindEvent(wxEventType eventType, const wxLuaBindingList* bindingList_) { ! const wxLuaBindingList* bindingList = bindingList_ ? bindingList_ : &sm_bindingList; ! wxLuaBindingList::compatibility_iterator node = bindingList->GetFirst(); while (node) --- 1491,1497 ---- // static ! const wxLuaBindEvent* wxLuaBinding::FindBindEvent(wxEventType eventType) { ! wxLuaBindingList::compatibility_iterator node = sm_bindingList.GetFirst(); while (node) *************** *** 1503,1510 **** // static ! wxLuaBinding* wxLuaBinding::GetFunctionBinding(const wxLuaBindMethod* wxlMethod, const wxLuaBindingList* bindingList_) { ! const wxLuaBindingList* bindingList = bindingList_ ? bindingList_ : &sm_bindingList; ! wxLuaBindingList::compatibility_iterator node = bindingList->GetFirst(); while (node) --- 1510,1516 ---- // static ! wxLuaBinding* wxLuaBinding::FindMethodBinding(const wxLuaBindMethod* wxlMethod) { ! wxLuaBindingList::compatibility_iterator node = sm_bindingList.GetFirst(); while (node) *************** *** 1577,1584 **** if (sm_bindingList_initialized && !force_update) return; ! // setup base class wxLua types wxLuaBindingList::compatibility_iterator node = sm_bindingList.GetFirst(); while (node) { wxLuaBinding* binding = node->GetData(); wxLuaBindClass* wxlClass = binding->GetClassArray(); --- 1583,1600 ---- if (sm_bindingList_initialized && !force_update) return; ! // Initialize the bindings, sort and set the wxLua types wxLuaBindingList::compatibility_iterator node = sm_bindingList.GetFirst(); while (node) { + wxLuaBinding* binding = node->GetData(); + binding->InitBinding(); + + node = node->GetNext(); + } + + // setup base class wxLua types + node = sm_bindingList.GetFirst(); + while (node) + { wxLuaBinding* binding = node->GetData(); wxLuaBindClass* wxlClass = binding->GetClassArray(); Index: wxlua_bind.cpp =================================================================== RCS file: /cvsroot/wxlua/wxLua/modules/wxlua/src/wxlua_bind.cpp,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** wxlua_bind.cpp 23 Jan 2008 06:43:40 -0000 1.21 --- wxlua_bind.cpp 24 Jan 2008 00:18:18 -0000 1.22 *************** *** 74,77 **** --- 74,78 ---- { "WXLUA_TNIL", WXLUA_TNIL }, { "WXLUA_TNONE", WXLUA_TNONE }, + { "WXLUA_TNULL", WXLUA_TNULL }, { "WXLUA_TNUMBER", WXLUA_TNUMBER }, { "WXLUA_TSTRING", WXLUA_TSTRING }, *************** *** 79,82 **** --- 80,84 ---- { "WXLUA_TTHREAD", WXLUA_TTHREAD }, { "WXLUA_TUSERDATA", WXLUA_TUSERDATA }, + { "WXLUA_T_MAX", WXLUA_T_MAX }, { "wxLUAOBJECT_ARRAYINT", wxLUAOBJECT_ARRAYINT }, { "wxLUAOBJECT_BOOL", wxLUAOBJECT_BOOL }, *************** *** 161,170 **** static int LUACALL wxLua_function_GetBindings(lua_State *L) { - wxLuaState wxlState(L); lua_newtable(L); // the table that we return int idx = 1; wxLuaBindingList::compatibility_iterator node; ! for (node = wxlState.GetLuaBindingList()->GetFirst(); node; node = node->GetNext(), idx++) { wxLuaBinding* binding = node->GetData(); --- 163,171 ---- static int LUACALL wxLua_function_GetBindings(lua_State *L) { lua_newtable(L); // the table that we return int idx = 1; wxLuaBindingList::compatibility_iterator node; ! for (node = wxLuaBinding::GetBindingList()->GetFirst(); node; node = node->GetNext(), idx++) { wxLuaBinding* binding = node->GetData(); *************** *** 966,970 **** m_objectArray = wxLuaGetObjectList_wxlua(m_objectCount); m_functionArray = wxLuaGetFunctionList_wxlua(m_functionCount); - InitBinding(); } --- 967,970 ---- *************** *** 984,1004 **** // --------------------------------------------------------------------------- - bool wxLuaBinding_wxlua_bind(const wxLuaState& wxlState_) - { - wxLuaState wxlState(wxlState_); - wxCHECK_MSG(wxlState.Ok(), false, wxT("Invalid wxLuaState")); - - wxASSERT(!wxlState.GetLuaStateData()->m_bindings_registered); - wxASSERT(!wxlState.GetLuaBinding(wxT("wxlua"))); - - // ignore binding request when we already have wxlua registered - if (wxlState.GetLuaBinding(wxT("wxlua"))) - return false; - - wxlState.GetLuaStateData()->m_bindingList.Append(new wxLuaBinding_wxlua()); - - return true; - } - bool wxLuaBinding_wxlua_init() { --- 984,987 ---- |