diff --git a/libs/ardour/luabindings.cc b/libs/ardour/luabindings.cc index cef4bfc9a8..a42aee18d3 100644 --- a/libs/ardour/luabindings.cc +++ b/libs/ardour/luabindings.cc @@ -672,7 +672,6 @@ LuaBindings::common (lua_State* L) .endClass () .beginWSPtrClass ("PluginInfo") - .addVoidConstructor () .addData ("name", &PluginInfo::name, false) .addData ("category", &PluginInfo::category, false) .addData ("creator", &PluginInfo::creator, false) @@ -1388,6 +1387,7 @@ LuaBindings::common (lua_State* L) // boost::shared_ptr .beginPtrStdList > ("RouteListPtr") + .addVoidPtrConstructor > > () .endClass () // typedef std::list > WeakRouteList @@ -1412,6 +1412,7 @@ LuaBindings::common (lua_State* L) // boost::shared_ptr > > .beginPtrStdList > ("RegionListPtr") + .addVoidPtrConstructor > > () .endClass () //std::list > PortList; diff --git a/libs/lua/LuaBridge/detail/Namespace.h b/libs/lua/LuaBridge/detail/Namespace.h index 1670660367..98383a4f6c 100644 --- a/libs/lua/LuaBridge/detail/Namespace.h +++ b/libs/lua/LuaBridge/detail/Namespace.h @@ -473,6 +473,15 @@ private: return 1; } + template + static int ctorPtrPlacementProxy (lua_State* L) + { + ArgList args (L); + T newobject (Constructor ::call (args)); + Stack::push (L, newobject); + return 1; + } + //-------------------------------------------------------------------------- /** Pop the Lua stack. @@ -1037,11 +1046,28 @@ private: return *this; } + template + Class & addPtrConstructor () + { + FUNDOC("Constructor", "", MemFn) + lua_pushcclosure (L, + &ctorPtrPlacementProxy ::Params, T, PT>, 0); + rawsetfield(L, -2, "__call"); + + return *this; + } + Class & addVoidConstructor () { return addConstructor (); } + template + Class & addVoidPtrConstructor () + { + return addPtrConstructor (); + } + Class & addEqualCheck () { PRINTDOC("Member Function", _name << "sameinstance", std::string("bool"), std::string("void (*)(" + type_name () + ")")) @@ -1235,13 +1261,15 @@ private: { FUNDOC ("Weak/Shared Pointer Constructor", "", MemFn) set_weak_class (); + // NOTE: this constructs an empty weak-ptr, + // ideally we'd construct a weak-ptr from a referenced shared-ptr lua_pushcclosure (L, &weak. template ctorPlacementProxy ::Params, boost::weak_ptr >, 0); rawsetfield(L, -2, "__call"); set_shared_class (); lua_pushcclosure (L, - &shared. template ctorPlacementProxy ::Params, boost::shared_ptr >, 0); + &shared. template ctorPtrPlacementProxy ::Params, boost::shared_ptr, T >, 0); rawsetfield(L, -2, "__call"); return *this; } @@ -1831,9 +1859,8 @@ public: Class > > beginPtrStdList (char const* name) { typedef std::list LT; - return beginClass > (name) - .addVoidConstructor () + //.addVoidPtrConstructor () .addPtrFunction ("empty", <::empty) .addPtrFunction ("size", <::size) .addPtrFunction ("reverse", <::reverse) @@ -1852,7 +1879,7 @@ public: typedef typename std::vector::size_type T_SIZE; return beginClass > (name) - .addVoidConstructor () + //.addVoidPtrConstructor () .addPtrFunction ("empty", <::empty) .addPtrFunction ("empty", <::empty) .addPtrFunction ("size", <::size)