summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2017-01-08 00:30:41 +0100
committerRobin Gareus <robin@gareus.org>2017-01-08 00:30:41 +0100
commit134b69f26748499b24fff214dfeda86ca696d4a5 (patch)
treeb1074d71e83c95515b0b83c0a23f90da935bd785
parent9e048851c1e4629800c5ab33df7bb0a65206cfc3 (diff)
Fix shared-pointer list creation from Lua
-rw-r--r--libs/ardour/luabindings.cc3
-rw-r--r--libs/lua/LuaBridge/detail/Namespace.h35
2 files changed, 33 insertions, 5 deletions
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> ("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<RouteList>
.beginPtrStdList <boost::shared_ptr<Route> > ("RouteListPtr")
+ .addVoidPtrConstructor<std::list<boost::shared_ptr <Route> > > ()
.endClass ()
// typedef std::list<boost::weak_ptr <Route> > WeakRouteList
@@ -1412,6 +1412,7 @@ LuaBindings::common (lua_State* L)
// boost::shared_ptr <std::list<boost::shared_ptr<Region> > >
.beginPtrStdList <boost::shared_ptr<Region> > ("RegionListPtr")
+ .addVoidPtrConstructor<std::list<boost::shared_ptr <Region> > > ()
.endClass ()
//std::list<boost::shared_ptr<Port> > 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 <class Params, class T, class C>
+ static int ctorPtrPlacementProxy (lua_State* L)
+ {
+ ArgList <Params, 2> args (L);
+ T newobject (Constructor <C, Params>::call (args));
+ Stack<T>::push (L, newobject);
+ return 1;
+ }
+
//--------------------------------------------------------------------------
/**
Pop the Lua stack.
@@ -1037,11 +1046,28 @@ private:
return *this;
}
+ template <class MemFn, class PT>
+ Class <T>& addPtrConstructor ()
+ {
+ FUNDOC("Constructor", "", MemFn)
+ lua_pushcclosure (L,
+ &ctorPtrPlacementProxy <typename FuncTraits <MemFn>::Params, T, PT>, 0);
+ rawsetfield(L, -2, "__call");
+
+ return *this;
+ }
+
Class <T>& addVoidConstructor ()
{
return addConstructor <void (*) ()> ();
}
+ template <class PT>
+ Class <T>& addVoidPtrConstructor ()
+ {
+ return addPtrConstructor <void (*) (), PT> ();
+ }
+
Class <T>& addEqualCheck ()
{
PRINTDOC("Member Function", _name << "sameinstance", std::string("bool"), std::string("void (*)(" + type_name <T>() + ")"))
@@ -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 <typename FuncTraits <MemFn>::Params, boost::weak_ptr<T> >, 0);
rawsetfield(L, -2, "__call");
set_shared_class ();
lua_pushcclosure (L,
- &shared. template ctorPlacementProxy <typename FuncTraits <MemFn>::Params, boost::shared_ptr<T> >, 0);
+ &shared. template ctorPtrPlacementProxy <typename FuncTraits <MemFn>::Params, boost::shared_ptr<T>, T >, 0);
rawsetfield(L, -2, "__call");
return *this;
}
@@ -1831,9 +1859,8 @@ public:
Class<boost::shared_ptr<std::list<T> > > beginPtrStdList (char const* name)
{
typedef std::list<T> LT;
-
return beginClass<boost::shared_ptr<LT> > (name)
- .addVoidConstructor ()
+ //.addVoidPtrConstructor<LT> ()
.addPtrFunction ("empty", &LT::empty)
.addPtrFunction ("size", &LT::size)
.addPtrFunction ("reverse", &LT::reverse)
@@ -1852,7 +1879,7 @@ public:
typedef typename std::vector<T>::size_type T_SIZE;
return beginClass<boost::shared_ptr<LT> > (name)
- .addVoidConstructor ()
+ //.addVoidPtrConstructor<LT> ()
.addPtrFunction ("empty", &LT::empty)
.addPtrFunction ("empty", &LT::empty)
.addPtrFunction ("size", &LT::size)