Common: CallLambdaTrampoline can return a value

As it is currently written, CallLambdaTrampoline does not return a
value. However, some of the functions that are being wrapped may
return a value that the JIT is expected to understand. A compiler
*cough cough clang* may opt to alter %rax after the wrapped lambda
returns, e.g. popping a previous value, which can clobber the
return value. If we actually have a return value, then the compiler
must not clobber it.
This commit is contained in:
Jeffrey Pfau 2015-07-03 22:27:36 -07:00
parent 3fc070c4fc
commit c9a25f9484
2 changed files with 4 additions and 6 deletions

View file

@ -711,10 +711,9 @@ public:
// (this method might be a thunk in the case of multi-inheritance) so we
// have to go through a trampoline function.
template <typename T, typename... Args>
static void CallLambdaTrampoline(const std::function<T(Args...)>* f,
Args... args)
static T CallLambdaTrampoline(const std::function<T(Args...)>* f, Args... args)
{
(*f)(args...);
return (*f)(args...);
}
// This function expects you to have set up the state.

View file

@ -971,10 +971,9 @@ public:
// (this method might be a thunk in the case of multi-inheritance) so we
// have to go through a trampoline function.
template <typename T, typename... Args>
static void CallLambdaTrampoline(const std::function<T(Args...)>* f,
Args... args)
static T CallLambdaTrampoline(const std::function<T(Args...)>* f, Args... args)
{
(*f)(args...);
return (*f)(args...);
}
template <typename T, typename... Args>