Re: property setters not working

seanmhogan <[email protected]>
Newsgroups gmane.comp.lang.lua.bind.user
Message-ID <[email protected]>
Following up my own issue...

I misunderstood the Luabind INSTALL instructions and so even though I built
Luabind correctly, I was not specifying LUABIND_DYNAMIC_LINK when compiling
my app.  The symptom was (to me) rather odd: when I trapped the check for
whether to use the property setter (ref. line 320 of class_rep.cpp where it
does this:

    if (lua_tocfunction(L, -1) == &property_tag) ...

), I found that the two sides were not equal, even though &property_tag is
what was originally pushed on the stack:

    Left side: 0x00411db1 luabind::detail::property_tag(struct lua_State *)
int (lua_State *)*
    Right side: 0x001a2690 luabind::detail::property_tag(lua_State *)	int
(lua_State *)*

Adding LUABIND_DYNAMIC_LINK fixes the problem but introduces a very ugly set
of compile warnings:

Warning	1	warning C4251: 'luabind::detail::class_registry::m_classes' :
class 'std::map<_Kty,_Ty,_Pr>' needs to have dll-interface to be used by
clients of struct 'luabind::detail::class_registry'
c:\saved_software\luabind-0.8.1\luabind\detail\class_registry.hpp	70	
Warning	2	warning C4251: 'luabind::detail::object_rep::m_lua_table_ref' :
struct 'luabind::detail::lua_reference' needs to have dll-interface to be
used by clients of class 'luabind::detail::object_rep'
c:\saved_software\luabind-0.8.1\luabind\detail\object_rep.hpp	79	
Warning	3	warning C4251: 'luabind::detail::object_rep::m_dependency_ref' :
struct 'luabind::detail::lua_reference' needs to have dll-interface to be
used by clients of class 'luabind::detail::object_rep'
c:\saved_software\luabind-0.8.1\luabind\detail\object_rep.hpp	82	
Warning	4	warning C4251: 'luabind::detail::class_rep::m_bases' : class
'std::vector<_Ty>' needs to have dll-interface to be used by clients of
class 'luabind::detail::class_rep'
c:\saved_software\luabind-0.8.1\luabind\detail\class_rep.hpp	327	
Warning	5	warning C4251: 'luabind::detail::class_rep::m_self_ref' : struct
'luabind::detail::lua_reference' needs to have dll-interface to be used by
clients of class 'luabind::detail::class_rep'
c:\saved_software\luabind-0.8.1\luabind\detail\class_rep.hpp	340	
Warning	6	warning C4251: 'luabind::detail::class_rep::m_table' : class
'luabind::handle' needs to have dll-interface to be used by clients of class
'luabind::detail::class_rep'
c:\saved_software\luabind-0.8.1\luabind\detail\class_rep.hpp	347	
Warning	7	warning C4251: 'luabind::detail::class_rep::m_default_table' :
class 'luabind::handle' needs to have dll-interface to be used by clients of
class 'luabind::detail::class_rep'
c:\saved_software\luabind-0.8.1\luabind\detail\class_rep.hpp	351	
Warning	8	warning C4251: 'luabind::detail::class_rep::m_getters' : class
'std::map<_Kty,_Ty,_Pr>' needs to have dll-interface to be used by clients
of class 'luabind::detail::class_rep'
c:\saved_software\luabind-0.8.1\luabind\detail\class_rep.hpp	365	
Warning	9	warning C4251: 'luabind::detail::class_rep::m_setters' : class
'std::map<_Kty,_Ty,_Pr>' needs to have dll-interface to be used by clients
of class 'luabind::detail::class_rep'
c:\saved_software\luabind-0.8.1\luabind\detail\class_rep.hpp	366	
Warning	10	warning C4251: 'luabind::detail::class_rep::m_operators' : class
'std::vector<_Ty>' needs to have dll-interface to be used by clients of
class 'luabind::detail::class_rep'
c:\saved_software\luabind-0.8.1\luabind\detail\class_rep.hpp	368	
Warning	11	warning C4251: 'luabind::detail::class_rep::m_static_constants' :
class 'std::map<_Kty,_Ty,_Pr>' needs to have dll-interface to be used by
clients of class 'luabind::detail::class_rep'
c:\saved_software\luabind-0.8.1\luabind\detail\class_rep.hpp	373	

Anyone know how to avoid those?

Thanks again,
Sean



seanmhogan wrote:
> 
> Hi.  I'm having a devil of a time binding to a class property and then
> setting that property from Lua.  I'm using Lua 5.1, Luabind 0.8.1, Boost
> 1.39 and Visual Studio 2005.
> 
> The C++ code:
> 
> struct Tough
> {
>     Tough(){}
>     ~Tough(){}
> 
>     int Tough::get_i() const { return i; }
>     void Tough::set_i(int _i) { i = _i; }
> 
>     int i;
> };
> 
> int main()
> {
>     lua_State* L = lua_open();
>     luaL_openlibs(L);
>     luabind::open(L);
> 
>     module(L) [
>         class_<Tough>("Tough")
>             .def(constructor<>())
>             .property("i", &Tough::get_i, &Tough::set_i)
>     ];
> 
>     luaL_dofile(L, "test.lua");
>     object tough1 = globals(L)["tough1"];
>     Tough* ptough = object_cast<Tough*>(tough1);
>     printf("i=%d\n", ptough->get_i());
> }
> 
> test.lua contains simply:
> 
>     tough1 = Tough()
>     tough1.i = 8
> 
> The Tough::set_i() method is never called and stough->i is left as
> -842150451 (uninitialized).  Am I missing something obvious here?
> 
> Thanks,
> Sean
> ---
> Sean Hogan
> Marport Canada
> [email protected]
> 

-- 
View this message in context: http://www.nabble.com/property-setters-not-working-tp25753482p25769237.html
Sent from the Lua C++ Bind mailing list archive at Nabble.com.


------------------------------------------------------------------------------
Come build with us! The BlackBerry&reg; Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay 
ahead of the curve. Join us from November 9&#45;12, 2009. Register now&#33;
http://p.sf.net/sfu/devconf
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.