Corrected bug in 'luaD_tryfuncTM'
The pointer to the metamethod can be invalidated by a finalizer that
can run during a GC in 'checkstackGCp'. (This commit also fixes a
detail in the manual.) Bug introduced in commit 91673a8ec.
diff --git a/ldo.c b/ldo.c
index 66f8903..f282a77 100644
--- a/ldo.c
+++ b/ldo.c
@@ -388,9 +388,10 @@
** an error if there is no '__call' metafield.
*/
StkId luaD_tryfuncTM (lua_State *L, StkId func) {
- const TValue *tm = luaT_gettmbyobj(L, s2v(func), TM_CALL);
+ const TValue *tm;
StkId p;
checkstackGCp(L, 1, func); /* space for metamethod */
+ tm = luaT_gettmbyobj(L, s2v(func), TM_CALL); /* (after previous GC) */
if (l_unlikely(ttisnil(tm)))
luaG_callerror(L, s2v(func)); /* nothing to call */
for (p = L->top; p > func; p--) /* open space for metamethod */
diff --git a/manual/manual.of b/manual/manual.of
index 9e0b883..c9e62b4 100644
--- a/manual/manual.of
+++ b/manual/manual.of
@@ -6247,7 +6247,7 @@
}
@LibEntry{error (message [, level])|
-Raises an error @see{error} with @{message} as the error object.
+Raises an error @see{error} with @id{message} as the error object.
This function never returns.
Usually, @id{error} adds some information about the error position