108 lines
3.7 KiB
Diff
108 lines
3.7 KiB
Diff
From 3699446aaf5c7a07af028b1ae43cf52d2d4dda59 Mon Sep 17 00:00:00 2001
|
|
From: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
|
|
Date: Mon, 18 Oct 2021 11:58:40 -0300
|
|
Subject: [PATCH] Removed goto's in 'luaD_precall'
|
|
|
|
(plus a detail in src/lauxlib.h.)
|
|
---
|
|
src/lauxlib.h | 2 +-
|
|
src/ldo.c | 51 +++++++++++++++++++++++++++------------------------
|
|
2 files changed, 28 insertions(+), 25 deletions(-)
|
|
|
|
diff --git a/src/lauxlib.h b/src/lauxlib.h
|
|
index 6f9695e8..5b977e2a 100644
|
|
--- a/src/lauxlib.h
|
|
+++ b/src/lauxlib.h
|
|
@@ -102,7 +102,7 @@ LUALIB_API lua_State *(luaL_newstate) (void);
|
|
|
|
LUALIB_API lua_Integer (luaL_len) (lua_State *L, int idx);
|
|
|
|
-LUALIB_API void luaL_addgsub (luaL_Buffer *b, const char *s,
|
|
+LUALIB_API void (luaL_addgsub) (luaL_Buffer *b, const char *s,
|
|
const char *p, const char *r);
|
|
LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s,
|
|
const char *p, const char *r);
|
|
diff --git a/src/ldo.c b/src/ldo.c
|
|
index 88b20f95..0ac12e74 100644
|
|
--- a/src/ldo.c
|
|
+++ b/src/ldo.c
|
|
@@ -510,6 +510,30 @@ l_sinline CallInfo *prepCallInfo (lua_State *L, StkId func, int nret,
|
|
}
|
|
|
|
|
|
+/*
|
|
+** precall for C functions
|
|
+*/
|
|
+l_sinline CallInfo *precallC (lua_State *L, StkId func, int nresults,
|
|
+ lua_CFunction f) {
|
|
+ int n; /* number of returns */
|
|
+ CallInfo *ci;
|
|
+ checkstackGCp(L, LUA_MINSTACK, func); /* ensure minimum stack size */
|
|
+ L->ci = ci = prepCallInfo(L, func, nresults, CIST_C,
|
|
+ L->top + LUA_MINSTACK);
|
|
+ lua_assert(ci->top <= L->stack_last);
|
|
+ if (l_unlikely(L->hookmask & LUA_MASKCALL)) {
|
|
+ int narg = cast_int(L->top - func) - 1;
|
|
+ luaD_hook(L, LUA_HOOKCALL, -1, 1, narg);
|
|
+ }
|
|
+ lua_unlock(L);
|
|
+ n = (*f)(L); /* do the actual call */
|
|
+ lua_lock(L);
|
|
+ api_checknelems(L, n);
|
|
+ luaD_poscall(L, ci, n);
|
|
+ return NULL;
|
|
+}
|
|
+
|
|
+
|
|
/*
|
|
** Prepares the call to a function (C or Lua). For C functions, also do
|
|
** the call. The function to be called is at '*func'. The arguments
|
|
@@ -519,32 +543,11 @@ l_sinline CallInfo *prepCallInfo (lua_State *L, StkId func, int nret,
|
|
** original function position.
|
|
*/
|
|
CallInfo *luaD_precall (lua_State *L, StkId func, int nresults) {
|
|
- lua_CFunction f;
|
|
- retry:
|
|
switch (ttypetag(s2v(func))) {
|
|
case LUA_VCCL: /* C closure */
|
|
- f = clCvalue(s2v(func))->f;
|
|
- goto Cfunc;
|
|
+ return precallC(L, func, nresults, clCvalue(s2v(func))->f);
|
|
case LUA_VLCF: /* light C function */
|
|
- f = fvalue(s2v(func));
|
|
- Cfunc: {
|
|
- int n; /* number of returns */
|
|
- CallInfo *ci;
|
|
- checkstackGCp(L, LUA_MINSTACK, func); /* ensure minimum stack size */
|
|
- L->ci = ci = prepCallInfo(L, func, nresults, CIST_C,
|
|
- L->top + LUA_MINSTACK);
|
|
- lua_assert(ci->top <= L->stack_last);
|
|
- if (l_unlikely(L->hookmask & LUA_MASKCALL)) {
|
|
- int narg = cast_int(L->top - func) - 1;
|
|
- luaD_hook(L, LUA_HOOKCALL, -1, 1, narg);
|
|
- }
|
|
- lua_unlock(L);
|
|
- n = (*f)(L); /* do the actual call */
|
|
- lua_lock(L);
|
|
- api_checknelems(L, n);
|
|
- luaD_poscall(L, ci, n);
|
|
- return NULL;
|
|
- }
|
|
+ return precallC(L, func, nresults, fvalue(s2v(func)));
|
|
case LUA_VLCL: { /* Lua function */
|
|
CallInfo *ci;
|
|
Proto *p = clLvalue(s2v(func))->p;
|
|
@@ -561,7 +564,7 @@ CallInfo *luaD_precall (lua_State *L, StkId func, int nresults) {
|
|
}
|
|
default: { /* not a function */
|
|
func = luaD_tryfuncTM(L, func); /* try to get '__call' metamethod */
|
|
- goto retry; /* try again with metamethod */
|
|
+ return luaD_precall(L, func, nresults); /* try again with metamethod */
|
|
}
|
|
}
|
|
}
|
|
--
|
|
2.33.0
|
|
|
|
|