diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2020-07-06 12:09:44 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2020-07-06 12:09:44 -0300 |
| commit | b57574d6fb9071b2f8f261b32c9378ed72db7023 (patch) | |
| tree | 41c6503788b696b6056c2d954da84843eebe321e /lapi.c | |
| parent | bfcf06d91a87b7ffb8c83e290db0cb6176a167f8 (diff) | |
| download | lua-b57574d6fb9071b2f8f261b32c9378ed72db7023.tar.gz lua-b57574d6fb9071b2f8f261b32c9378ed72db7023.tar.bz2 lua-b57574d6fb9071b2f8f261b32c9378ed72db7023.zip | |
Keep memory errors as memory errors
Allow memory errors to be raised through the API (throwing the
error with the memory error message); error in external allocations
raises a memory error; memory errors in coroutines are re-raised
as memory errors.
Diffstat (limited to 'lapi.c')
| -rw-r--r-- | lapi.c | 8 |
1 files changed, 7 insertions, 1 deletions
| @@ -1195,9 +1195,15 @@ LUA_API int lua_gc (lua_State *L, int what, ...) { | |||
| 1195 | 1195 | ||
| 1196 | 1196 | ||
| 1197 | LUA_API int lua_error (lua_State *L) { | 1197 | LUA_API int lua_error (lua_State *L) { |
| 1198 | TValue *errobj; | ||
| 1198 | lua_lock(L); | 1199 | lua_lock(L); |
| 1200 | errobj = s2v(L->top - 1); | ||
| 1199 | api_checknelems(L, 1); | 1201 | api_checknelems(L, 1); |
| 1200 | luaG_errormsg(L); | 1202 | /* error object is the memory error message? */ |
| 1203 | if (ttisshrstring(errobj) && eqshrstr(tsvalue(errobj), G(L)->memerrmsg)) | ||
| 1204 | luaM_error(L); /* raise a memory error */ | ||
| 1205 | else | ||
| 1206 | luaG_errormsg(L); /* raise a regular error */ | ||
| 1201 | /* code unreachable; will unlock when control actually leaves the kernel */ | 1207 | /* code unreachable; will unlock when control actually leaves the kernel */ |
| 1202 | return 0; /* to avoid warnings */ | 1208 | return 0; /* to avoid warnings */ |
| 1203 | } | 1209 | } |
