diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2018-09-11 14:24:14 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2018-09-11 14:24:14 -0300 |
| commit | b114c7d4871051cbdd7af185a61f35fe4028da79 (patch) | |
| tree | 6ee42a4b6a4af27789329c8a65c75bba508e8258 | |
| parent | 9cbf17b0f1bb4001b237c4027b271f0db9bde62c (diff) | |
| download | lua-github-b114c7d4871051cbdd7af185a61f35fe4028da79.tar.gz | |
Added "cost" for the use of C stack by a coroutine invocation.
Resuming a coroutine uses more C stack than other operations (such as
function calls or recursive syntax). So, to avoid stack overflow
in recursive coroutine invocations, either LUAI_MAXCCALLS must be
too small or a coroutine invocation must "pay" a higher price.
New constant LUAL_COROCSTK ("COROutine C STaK") defines how much
is this price.
| -rw-r--r-- | ldo.c | 10 |
1 files changed, 8 insertions, 2 deletions
@@ -611,6 +611,13 @@ static int resume_error (lua_State *L, const char *msg, int narg) { /* +** "Cost" in the C stack for a coroutine invocation. +*/ +#if !defined(LUAL_COROCSTK) +#define LUAL_COROCSTK 3 +#endif + +/* ** Do the work for 'lua_resume' in protected mode. Most of the work ** depends on the status of the coroutine: initial state, suspended ** inside a hook, or regularly suspended (optionally with a continuation @@ -642,7 +649,6 @@ static void resume (lua_State *L, void *ud) { } } - LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs, int *nresults) { int status; @@ -657,7 +663,7 @@ LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs, if (from == NULL) L->nCcalls = 1; else /* correct 'nCcalls' for this thread */ - L->nCcalls = from->nCcalls - from->nci + L->nci + 1; + L->nCcalls = from->nCcalls - from->nci + L->nci + LUAL_COROCSTK; if (L->nCcalls >= LUAI_MAXCCALLS) return resume_error(L, "C stack overflow", nargs); luai_userstateresume(L, nargs); |
