diff options
-rw-r--r-- | lcorolib.c | 3 | ||||
-rw-r--r-- | manual/manual.of | 4 | ||||
-rw-r--r-- | testes/coroutine.lua | 5 |
3 files changed, 10 insertions, 2 deletions
@@ -190,6 +190,9 @@ static int luaB_close (lua_State *L) { | |||
190 | } | 190 | } |
191 | } | 191 | } |
192 | case COS_RUN: /* running coroutine? */ | 192 | case COS_RUN: /* running coroutine? */ |
193 | lua_geti(L, LUA_REGISTRYINDEX, LUA_RIDX_MAINTHREAD); /* get main */ | ||
194 | if (lua_tothread(L, -1) == co) | ||
195 | return luaL_error(L, "cannot close main thread"); | ||
193 | lua_closethread(co, L); /* close itself */ | 196 | lua_closethread(co, L); /* close itself */ |
194 | lua_assert(0); /* previous call does not return */ | 197 | lua_assert(0); /* previous call does not return */ |
195 | return 0; | 198 | return 0; |
diff --git a/manual/manual.of b/manual/manual.of index 7c504d97..baa33d88 100644 --- a/manual/manual.of +++ b/manual/manual.of | |||
@@ -3284,8 +3284,8 @@ If @id{L} is equal to @id{from}, | |||
3284 | it corresponds to a thread closing itself. | 3284 | it corresponds to a thread closing itself. |
3285 | In that case, | 3285 | In that case, |
3286 | the call does not return; | 3286 | the call does not return; |
3287 | instead, the resume or the protected call | 3287 | instead, the resume that (re)started the thread returns. |
3288 | that (re)started the thread returns. | 3288 | The thread must be running inside a resume. |
3289 | 3289 | ||
3290 | } | 3290 | } |
3291 | 3291 | ||
diff --git a/testes/coroutine.lua b/testes/coroutine.lua index 02536ee5..4881d964 100644 --- a/testes/coroutine.lua +++ b/testes/coroutine.lua | |||
@@ -158,6 +158,11 @@ do | |||
158 | 158 | ||
159 | local main = coroutine.running() | 159 | local main = coroutine.running() |
160 | 160 | ||
161 | -- cannot close 'main' | ||
162 | local st, msg = pcall(coroutine.close, main); | ||
163 | assert(not st and string.find(msg, "main")) | ||
164 | |||
165 | |||
161 | -- cannot close a "normal" coroutine | 166 | -- cannot close a "normal" coroutine |
162 | ;(coroutine.wrap(function () | 167 | ;(coroutine.wrap(function () |
163 | local st, msg = pcall(coroutine.close, main) | 168 | local st, msg = pcall(coroutine.close, main) |