mirror of
https://github.com/Ardour/ardour.git
synced 2026-01-08 06:35:46 +01:00
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)
|
||
|---|---|---|
| .. | ||
| appleutility | ||
| ardour | ||
| ardouralsautil | ||
| audiographer | ||
| backends | ||
| canvas | ||
| clearlooks-newer | ||
| clearlooks-older | ||
| evoral | ||
| fst | ||
| gtkmm2ext | ||
| libltc | ||
| lua | ||
| midi++2 | ||
| panners | ||
| pbd | ||
| plugins | ||
| ptformat | ||
| qm-dsp | ||
| surfaces | ||
| timecode | ||
| vamp-plugins | ||
| vfork | ||