diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-04-22 11:40:23 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-04-22 11:40:23 -0300 |
| commit | f388ee4a822b3d8027ed7c28aa21e9406e4a11eb (patch) | |
| tree | 33053e6e31ac1dee0fe27ff7fdba64325a624fe1 | |
| parent | 30ad4c75db38639f52fb1c8be1c5a3f5b58e776f (diff) | |
| download | lua-f388ee4a822b3d8027ed7c28aa21e9406e4a11eb.tar.gz lua-f388ee4a822b3d8027ed7c28aa21e9406e4a11eb.tar.bz2 lua-f388ee4a822b3d8027ed7c28aa21e9406e4a11eb.zip | |
new way to handle errors
| -rw-r--r-- | lbaselib.c | 12 | ||||
| -rw-r--r-- | ldebug.c | 4 | ||||
| -rw-r--r-- | lmem.c | 8 | ||||
| -rw-r--r-- | lobject.c | 4 | ||||
| -rw-r--r-- | lstate.c | 4 | ||||
| -rw-r--r-- | ltable.c | 8 | ||||
| -rw-r--r-- | lua.h | 10 | ||||
| -rw-r--r-- | lvm.c | 16 |
8 files changed, 32 insertions, 34 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lbaselib.c,v 1.67 2002/04/12 19:57:29 roberto Exp roberto $ | 2 | ** $Id: lbaselib.c,v 1.68 2002/04/15 20:54:41 roberto Exp roberto $ |
| 3 | ** Basic library | 3 | ** Basic library |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -280,7 +280,7 @@ static int aux_unpack (lua_State *L, int arg) { | |||
| 280 | int n, i; | 280 | int n, i; |
| 281 | luaL_check_type(L, arg, LUA_TTABLE); | 281 | luaL_check_type(L, arg, LUA_TTABLE); |
| 282 | n = lua_getn(L, arg); | 282 | n = lua_getn(L, arg); |
| 283 | luaL_check_stack(L, n, "table too big to unpack"); | 283 | luaL_check_stack(L, n+LUA_MINSTACK, "table too big to unpack"); |
| 284 | for (i=1; i<=n; i++) /* push arg[1...n] */ | 284 | for (i=1; i<=n; i++) /* push arg[1...n] */ |
| 285 | lua_rawgeti(L, arg, i); | 285 | lua_rawgeti(L, arg, i); |
| 286 | return n; | 286 | return n; |
| @@ -299,10 +299,10 @@ static int luaB_call (lua_State *L) { | |||
| 299 | int status; | 299 | int status; |
| 300 | int n; | 300 | int n; |
| 301 | if (!lua_isnone(L, 4)) { /* set new error method */ | 301 | if (!lua_isnone(L, 4)) { /* set new error method */ |
| 302 | lua_getglobal(L, LUA_ERRORMESSAGE); | 302 | lua_getglobal(L, "_ERRORMESSAGE"); |
| 303 | err = lua_gettop(L); /* get index */ | 303 | err = lua_gettop(L); /* get index */ |
| 304 | lua_pushvalue(L, 4); | 304 | lua_pushvalue(L, 4); |
| 305 | lua_setglobal(L, LUA_ERRORMESSAGE); | 305 | lua_setglobal(L, "_ERRORMESSAGE"); |
| 306 | } | 306 | } |
| 307 | oldtop = lua_gettop(L); /* top before function-call preparation */ | 307 | oldtop = lua_gettop(L); /* top before function-call preparation */ |
| 308 | /* push function */ | 308 | /* push function */ |
| @@ -311,7 +311,7 @@ static int luaB_call (lua_State *L) { | |||
| 311 | status = lua_call(L, n, LUA_MULTRET); | 311 | status = lua_call(L, n, LUA_MULTRET); |
| 312 | if (err != 0) { /* restore old error method */ | 312 | if (err != 0) { /* restore old error method */ |
| 313 | lua_pushvalue(L, err); | 313 | lua_pushvalue(L, err); |
| 314 | lua_setglobal(L, LUA_ERRORMESSAGE); | 314 | lua_setglobal(L, "_ERRORMESSAGE"); |
| 315 | } | 315 | } |
| 316 | if (status != 0) { /* error in call? */ | 316 | if (status != 0) { /* error in call? */ |
| 317 | if (strchr(options, 'x')) | 317 | if (strchr(options, 'x')) |
| @@ -460,7 +460,7 @@ static int luaB_require (lua_State *L) { | |||
| 460 | 460 | ||
| 461 | static const luaL_reg base_funcs[] = { | 461 | static const luaL_reg base_funcs[] = { |
| 462 | {LUA_ALERT, luaB__ALERT}, | 462 | {LUA_ALERT, luaB__ALERT}, |
| 463 | {LUA_ERRORMESSAGE, luaB__ERRORMESSAGE}, | 463 | {"_ERRORMESSAGE", luaB__ERRORMESSAGE}, |
| 464 | {"error", luaB_error}, | 464 | {"error", luaB_error}, |
| 465 | {"metatable", luaB_metatable}, | 465 | {"metatable", luaB_metatable}, |
| 466 | {"globals", luaB_globals}, | 466 | {"globals", luaB_globals}, |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ldebug.c,v 1.107 2002/04/09 19:47:44 roberto Exp roberto $ | 2 | ** $Id: ldebug.c,v 1.108 2002/04/10 12:11:07 roberto Exp roberto $ |
| 3 | ** Debug Interface | 3 | ** Debug Interface |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -144,7 +144,7 @@ static void funcinfo (lua_State *L, lua_Debug *ar, StkId func) { | |||
| 144 | if (ttype(func) == LUA_TFUNCTION) | 144 | if (ttype(func) == LUA_TFUNCTION) |
| 145 | cl = clvalue(func); | 145 | cl = clvalue(func); |
| 146 | else { | 146 | else { |
| 147 | luaD_error(L, "value for `lua_getinfo' is not a function"); | 147 | luaD_runerror(L, "value for `lua_getinfo' is not a function"); |
| 148 | cl = NULL; /* to avoid warnings */ | 148 | cl = NULL; /* to avoid warnings */ |
| 149 | } | 149 | } |
| 150 | if (cl->c.isC) { | 150 | if (cl->c.isC) { |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lmem.c,v 1.51 2001/10/25 19:13:33 roberto Exp $ | 2 | ** $Id: lmem.c,v 1.52 2001/11/28 20:13:13 roberto Exp roberto $ |
| 3 | ** Interface to Memory Manager | 3 | ** Interface to Memory Manager |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -34,7 +34,7 @@ void *luaM_growaux (lua_State *L, void *block, int *size, int size_elems, | |||
| 34 | else if (*size >= limit/2) { /* cannot double it? */ | 34 | else if (*size >= limit/2) { /* cannot double it? */ |
| 35 | if (*size < limit - MINSIZEARRAY) /* try something smaller... */ | 35 | if (*size < limit - MINSIZEARRAY) /* try something smaller... */ |
| 36 | newsize = limit; /* still have at least MINSIZEARRAY free places */ | 36 | newsize = limit; /* still have at least MINSIZEARRAY free places */ |
| 37 | else luaD_error(L, errormsg); | 37 | else luaD_runerror(L, errormsg); |
| 38 | } | 38 | } |
| 39 | newblock = luaM_realloc(L, block, | 39 | newblock = luaM_realloc(L, block, |
| 40 | cast(lu_mem, *size)*cast(lu_mem, size_elems), | 40 | cast(lu_mem, *size)*cast(lu_mem, size_elems), |
| @@ -53,12 +53,12 @@ void *luaM_realloc (lua_State *L, void *block, lu_mem oldsize, lu_mem size) { | |||
| 53 | block = NULL; | 53 | block = NULL; |
| 54 | } | 54 | } |
| 55 | else if (size >= MAX_SIZET) | 55 | else if (size >= MAX_SIZET) |
| 56 | luaD_error(L, "memory allocation error: block too big"); | 56 | luaD_runerror(L, "memory allocation error: block too big"); |
| 57 | else { | 57 | else { |
| 58 | block = l_realloc(block, oldsize, size); | 58 | block = l_realloc(block, oldsize, size); |
| 59 | if (block == NULL) { | 59 | if (block == NULL) { |
| 60 | if (L) | 60 | if (L) |
| 61 | luaD_breakrun(L, LUA_ERRMEM); /* break run without error message */ | 61 | luaD_error(L, NULL, LUA_ERRMEM); /* break run without error message */ |
| 62 | else return NULL; /* error before creating state! */ | 62 | else return NULL; /* error before creating state! */ |
| 63 | } | 63 | } |
| 64 | } | 64 | } |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lobject.c,v 1.75 2002/02/07 17:25:12 roberto Exp roberto $ | 2 | ** $Id: lobject.c,v 1.76 2002/04/05 18:54:31 roberto Exp roberto $ |
| 3 | ** Some generic functions over Lua objects | 3 | ** Some generic functions over Lua objects |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -97,7 +97,7 @@ void luaO_verror (lua_State *L, const char *fmt, ...) { | |||
| 97 | va_start(argp, fmt); | 97 | va_start(argp, fmt); |
| 98 | vsprintf(buff, fmt, argp); | 98 | vsprintf(buff, fmt, argp); |
| 99 | va_end(argp); | 99 | va_end(argp); |
| 100 | luaD_error(L, buff); | 100 | luaD_runerror(L, buff); |
| 101 | } | 101 | } |
| 102 | 102 | ||
| 103 | 103 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lstate.c,v 1.88 2002/03/20 12:52:32 roberto Exp roberto $ | 2 | ** $Id: lstate.c,v 1.89 2002/04/16 17:08:28 roberto Exp roberto $ |
| 3 | ** Global State | 3 | ** Global State |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -124,7 +124,7 @@ LUA_API lua_State *lua_open (void) { | |||
| 124 | preinit_state(L); | 124 | preinit_state(L); |
| 125 | L->l_G = NULL; | 125 | L->l_G = NULL; |
| 126 | L->next = L->previous = L; | 126 | L->next = L->previous = L; |
| 127 | if (luaD_runprotected(L, f_luaopen, NULL) != 0) { | 127 | if (luaD_runprotected(L, f_luaopen, &luaO_nilobject, NULL) != 0) { |
| 128 | /* memory allocation error: free partial state */ | 128 | /* memory allocation error: free partial state */ |
| 129 | close_state(L); | 129 | close_state(L); |
| 130 | L = NULL; | 130 | L = NULL; |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ltable.c,v 1.102 2002/03/18 18:18:35 roberto Exp roberto $ | 2 | ** $Id: ltable.c,v 1.103 2002/04/05 18:54:31 roberto Exp roberto $ |
| 3 | ** Lua tables (hash) | 3 | ** Lua tables (hash) |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -111,7 +111,7 @@ static int luaH_index (lua_State *L, Table *t, const TObject *key) { | |||
| 111 | else { | 111 | else { |
| 112 | const TObject *v = luaH_get(t, key); | 112 | const TObject *v = luaH_get(t, key); |
| 113 | if (v == &luaO_nilobject) | 113 | if (v == &luaO_nilobject) |
| 114 | luaD_error(L, "invalid key for `next'"); | 114 | luaD_runerror(L, "invalid key for `next'"); |
| 115 | i = cast(int, (cast(const lu_byte *, v) - | 115 | i = cast(int, (cast(const lu_byte *, v) - |
| 116 | cast(const lu_byte *, val(node(t, 0)))) / sizeof(Node)); | 116 | cast(const lu_byte *, val(node(t, 0)))) / sizeof(Node)); |
| 117 | return i + t->sizearray; /* hash elements are numbered after array ones */ | 117 | return i + t->sizearray; /* hash elements are numbered after array ones */ |
| @@ -220,7 +220,7 @@ static void setnodevector (lua_State *L, Table *t, int lsize) { | |||
| 220 | int size; | 220 | int size; |
| 221 | if (lsize < MINHASHSIZE) lsize = MINHASHSIZE; | 221 | if (lsize < MINHASHSIZE) lsize = MINHASHSIZE; |
| 222 | else if (lsize > MAXBITS) | 222 | else if (lsize > MAXBITS) |
| 223 | luaD_error(L, "table overflow"); | 223 | luaD_runerror(L, "table overflow"); |
| 224 | size = twoto(lsize); | 224 | size = twoto(lsize); |
| 225 | t->node = luaM_newvector(L, size, Node); | 225 | t->node = luaM_newvector(L, size, Node); |
| 226 | for (i=0; i<size; i++) { | 226 | for (i=0; i<size; i++) { |
| @@ -441,7 +441,7 @@ void luaH_set (lua_State *L, Table *t, const TObject *key, const TObject *val) { | |||
| 441 | settableval(p, val); | 441 | settableval(p, val); |
| 442 | } | 442 | } |
| 443 | else { | 443 | else { |
| 444 | if (ttype(key) == LUA_TNIL) luaD_error(L, "table index is nil"); | 444 | if (ttype(key) == LUA_TNIL) luaD_runerror(L, "table index is nil"); |
| 445 | newkey(L, t, key, val); | 445 | newkey(L, t, key, val); |
| 446 | } | 446 | } |
| 447 | t->flags = 0; | 447 | t->flags = 0; |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lua.h,v 1.126 2002/04/05 18:54:31 roberto Exp roberto $ | 2 | ** $Id: lua.h,v 1.127 2002/04/16 17:08:28 roberto Exp roberto $ |
| 3 | ** Lua - An Extensible Extension Language | 3 | ** Lua - An Extensible Extension Language |
| 4 | ** TeCGraf: Grupo de Tecnologia em Computacao Grafica, PUC-Rio, Brazil | 4 | ** TeCGraf: Grupo de Tecnologia em Computacao Grafica, PUC-Rio, Brazil |
| 5 | ** e-mail: info@lua.org | 5 | ** e-mail: info@lua.org |
| @@ -22,9 +22,6 @@ | |||
| 22 | #define LUA_AUTHORS "W. Celes, R. Ierusalimschy & L. H. de Figueiredo" | 22 | #define LUA_AUTHORS "W. Celes, R. Ierusalimschy & L. H. de Figueiredo" |
| 23 | 23 | ||
| 24 | 24 | ||
| 25 | /* name of global variable with error handler */ | ||
| 26 | #define LUA_ERRORMESSAGE "_ERRORMESSAGE" | ||
| 27 | |||
| 28 | 25 | ||
| 29 | /* option for multiple returns in `lua_call' */ | 26 | /* option for multiple returns in `lua_call' */ |
| 30 | #define LUA_MULTRET (-1) | 27 | #define LUA_MULTRET (-1) |
| @@ -173,11 +170,12 @@ LUA_API void lua_setmetatable (lua_State *L, int objindex); | |||
| 173 | */ | 170 | */ |
| 174 | LUA_API int lua_call (lua_State *L, int nargs, int nresults); | 171 | LUA_API int lua_call (lua_State *L, int nargs, int nresults); |
| 175 | LUA_API void lua_rawcall (lua_State *L, int nargs, int nresults); | 172 | LUA_API void lua_rawcall (lua_State *L, int nargs, int nresults); |
| 173 | LUA_API int lua_pcall (lua_State *L, int nargs, int nresults, int errf); | ||
| 176 | LUA_API int lua_loadfile (lua_State *L, const char *filename); | 174 | LUA_API int lua_loadfile (lua_State *L, const char *filename); |
| 177 | LUA_API int lua_dofile (lua_State *L, const char *filename); | ||
| 178 | LUA_API int lua_dostring (lua_State *L, const char *str); | ||
| 179 | LUA_API int lua_loadbuffer (lua_State *L, const char *buff, size_t size, | 175 | LUA_API int lua_loadbuffer (lua_State *L, const char *buff, size_t size, |
| 180 | const char *name); | 176 | const char *name); |
| 177 | LUA_API int lua_dofile (lua_State *L, const char *filename); | ||
| 178 | LUA_API int lua_dostring (lua_State *L, const char *str); | ||
| 181 | LUA_API int lua_dobuffer (lua_State *L, const char *buff, size_t size, | 179 | LUA_API int lua_dobuffer (lua_State *L, const char *buff, size_t size, |
| 182 | const char *name); | 180 | const char *name); |
| 183 | 181 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lvm.c,v 1.224 2002/04/09 19:47:44 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 1.225 2002/04/10 12:11:07 roberto Exp roberto $ |
| 3 | ** Lua virtual machine | 3 | ** Lua virtual machine |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -134,7 +134,7 @@ void luaV_gettable (lua_State *L, const TObject *t, TObject *key, StkId res) { | |||
| 134 | if (ttype(tm) == LUA_TFUNCTION) | 134 | if (ttype(tm) == LUA_TFUNCTION) |
| 135 | callTMres(L, tm, t, key, res); | 135 | callTMres(L, tm, t, key, res); |
| 136 | else { | 136 | else { |
| 137 | if (++loop == MAXTAGLOOP) luaD_error(L, "loop in gettable"); | 137 | if (++loop == MAXTAGLOOP) luaD_runerror(L, "loop in gettable"); |
| 138 | t = tm; | 138 | t = tm; |
| 139 | goto init; /* return luaV_gettable(L, tm, key, res); */ | 139 | goto init; /* return luaV_gettable(L, tm, key, res); */ |
| 140 | } | 140 | } |
| @@ -164,7 +164,7 @@ void luaV_settable (lua_State *L, const TObject *t, TObject *key, StkId val) { | |||
| 164 | if (ttype(tm) == LUA_TFUNCTION) | 164 | if (ttype(tm) == LUA_TFUNCTION) |
| 165 | callTM(L, tm, t, key, val); | 165 | callTM(L, tm, t, key, val); |
| 166 | else { | 166 | else { |
| 167 | if (++loop == MAXTAGLOOP) luaD_error(L, "loop in settable"); | 167 | if (++loop == MAXTAGLOOP) luaD_runerror(L, "loop in settable"); |
| 168 | t = tm; | 168 | t = tm; |
| 169 | goto init; /* luaV_settable(L, tm, key, val); */ | 169 | goto init; /* luaV_settable(L, tm, key, val); */ |
| 170 | } | 170 | } |
| @@ -241,7 +241,7 @@ void luaV_strconc (lua_State *L, int total, int last) { | |||
| 241 | tl += tsvalue(top-n-1)->tsv.len; | 241 | tl += tsvalue(top-n-1)->tsv.len; |
| 242 | n++; | 242 | n++; |
| 243 | } | 243 | } |
| 244 | if (tl > MAX_SIZET) luaD_error(L, "string size overflow"); | 244 | if (tl > MAX_SIZET) luaD_runerror(L, "string size overflow"); |
| 245 | buffer = luaO_openspace(L, tl, char); | 245 | buffer = luaO_openspace(L, tl, char); |
| 246 | tl = 0; | 246 | tl = 0; |
| 247 | for (i=n; i>0; i--) { /* concat all strings */ | 247 | for (i=n; i>0; i--) { /* concat all strings */ |
| @@ -266,7 +266,7 @@ static void powOp (lua_State *L, StkId ra, StkId rb, StkId rc) { | |||
| 266 | setsvalue(&o, luaS_newliteral(L, "pow")); | 266 | setsvalue(&o, luaS_newliteral(L, "pow")); |
| 267 | luaV_gettable(L, gt(L), &o, &f); | 267 | luaV_gettable(L, gt(L), &o, &f); |
| 268 | if (ttype(&f) != LUA_TFUNCTION) | 268 | if (ttype(&f) != LUA_TFUNCTION) |
| 269 | luaD_error(L, "`pow' (for `^' operator) is not a function"); | 269 | luaD_runerror(L, "`pow' (for `^' operator) is not a function"); |
| 270 | callTMres(L, &f, b, c, ra); | 270 | callTMres(L, &f, b, c, ra); |
| 271 | } | 271 | } |
| 272 | else | 272 | else |
| @@ -535,11 +535,11 @@ StkId luaV_execute (lua_State *L) { | |||
| 535 | const TObject *plimit = ra+1; | 535 | const TObject *plimit = ra+1; |
| 536 | const TObject *pstep = ra+2; | 536 | const TObject *pstep = ra+2; |
| 537 | if (ttype(ra) != LUA_TNUMBER) | 537 | if (ttype(ra) != LUA_TNUMBER) |
| 538 | luaD_error(L, "`for' initial value must be a number"); | 538 | luaD_runerror(L, "`for' initial value must be a number"); |
| 539 | if (!tonumber(plimit, ra+1)) | 539 | if (!tonumber(plimit, ra+1)) |
| 540 | luaD_error(L, "`for' limit must be a number"); | 540 | luaD_runerror(L, "`for' limit must be a number"); |
| 541 | if (!tonumber(pstep, ra+2)) | 541 | if (!tonumber(pstep, ra+2)) |
| 542 | luaD_error(L, "`for' step must be a number"); | 542 | luaD_runerror(L, "`for' step must be a number"); |
| 543 | step = nvalue(pstep); | 543 | step = nvalue(pstep); |
| 544 | index = nvalue(ra) + step; /* increment index */ | 544 | index = nvalue(ra) + step; /* increment index */ |
| 545 | limit = nvalue(plimit); | 545 | limit = nvalue(plimit); |
