Hi John,
Latest CVS, but still not :-(
John Labenski wrote:
> It is normal that it can't find the object when you're registering the
> bindings since it's being push for the first time. The whole idea
> behind the check for wxluaO_istrackedweakobject() is that we don't
> want to create multiple Lua userdata wrapping our C++ object, but push
> the same one again. However, just like in C++ the object can be cast
> to different types and wxLua must create new userdata for each type to
> distinguish them (for wxObject::DynamicCast()).
Oke, i thought it would be something like that ;-)
>
> Exactly, the second time through it finds that the object was already
> pushed, but with a different type so as far as wxLua is concerned,
> it's not what we want and returns false.
oke.
>
>> ===============Stack ================
>>
>> luaO_rawequalObj(const lua_TValue * 0x4d6584b1, const lua_TValue *
>> 0x02006608)
>> line 73 + 6 bytes
>> luaH_get(Table * 0x02174b60, const lua_TValue * 0x02006608) line 484 + 16
>> bytes
>> luaH_set(lua_State * 0x02006318, Table * 0x02174b60, const lua_TValue *
>> 0x02006608) line 495 + 13 bytes
>> lua_rawset(lua_State * 0x02006318, int -3) line 673 + 37 bytes
>
> ??? What happens here?
LUA_API void lua_rawset (lua_State *L, int idx) {
.......... In the next liene it goes to luaH_set, where you can see above it
goes a bit further and generates the exception. I examined L and t.
setobj2t(L, luaH_set(L, hvalue(t), L->top-2), L->top-1);
..........
}
But in luaH_set calls luaH_get
const TValue *luaH_get (Table *t, const TValue *key) {
These input parameters here e.g parameter t is weird, so i think L->top-2 is
not oke. It contains a lots of "expression cannot be evaluated" when i
QuickWatch it.
}
So i think the lua stack is already not oke before calling lua_rawset.
>
> wxLuaBinding::DoRegisterBinding
> ...
> if (wxlObject->objPtr != 0)
> wxluaT_pushuserdatatype(L, wxlObject->objPtr,
> *wxlObject->wxluatype, true);
NO it goes into the else of the if, because its a pointer i think.
if (wxlObject->objPtr != 0)
wxluaT_pushuserdatatype(L, wxlObject->objPtr,
*wxlObject->wxluatype, true);
else //HERE
wxluaT_pushuserdatatype(L, *wxlObject->pObjPtr,
*wxlObject->wxluatype, true);
AND IN THE NEXT LINE ALL IS WRONG
lua_rawset(L, -3);
>
> then
>
> bool LUACALL wxluaT_pushuserdatatype
> ...
> if (wxluaR_getref(L, wxl_type, &wxlua_lreg_types_key))
> {
> // pop the table and set it as the metatable for the
> newuserdata
> lua_setmetatable(L, -2);
>
> if (track)
> wxluaO_trackweakobject(L, -1, (void*)obj_ptr, wxl_type);
It goes in here.
>
> return true; // leave value on the stack
And returns here.
> }
>
> Does it crash in wxluaO_trackweakobject() or wxluaR_getref()?
Euuh, no it crashes exactly as the stack above shows, luaO_rawequalObj, put i
think the damage is already done at/before that moment.
For some reason i think what is done in wxluaT_pushuserdatatype is ruining the
rest.
Thanks,
Klaas
--
Unclassified
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
wxlua-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/wxlua-users