diff options
author | Robin Gareus <robin@gareus.org> | 2016-07-18 23:30:20 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2016-07-18 23:52:40 +0200 |
commit | 520dcf8cdf0e6cf36210fa7826b63fe2c64ec218 (patch) | |
tree | db61180e4c0b65a98ccb502b907ffe56a3ceac11 /gtk2_ardour/luainstance.cc | |
parent | bb29478aa2739f985cc7d41ae48340a85f0b89cb (diff) |
rework lua-bridge C++ variable references
Since lua functions are closures, C++ methods that pass arguments by
reference cannot be used directly. The previous approach (boost::ref)
failed with clang. Assume the following:
void foo (float&) { }
static inline float& bar () {
boost::reference_wrapper<float> r (42);
return r.get ();
}
foo ( bar () );
With gcc, "r" goes out of scope after foo's arguments are processed
and all is well.
But with clang, "r" already leave scope when *inlined* bar() returns.
Solution: allocate some user-data on the lua-stack to hold the reference.
There is no reference to this user-data so lua will eventually
garbage collect it.
(theoretically, creating the table which holds the return-values
could trigger an emergency garbage collection when memory is low and
free the reference just while they're being pushed to the table, then
gain FuncArgs<Params> already dereferenced them all as variable on the
C stack -- probably again compiler specific)
Diffstat (limited to 'gtk2_ardour/luainstance.cc')
0 files changed, 0 insertions, 0 deletions