aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-11-07 16:19:13 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-11-07 16:19:13 -0200
commitc957b270d23941df8ca533dfbf4c9da672a429b4 (patch)
treec556f944f02eb65f12b477069b1bdf5fb07674ea
parent92791b9dd651b439de85bd761b47c837b78414fd (diff)
downloadlua-c957b270d23941df8ca533dfbf4c9da672a429b4.tar.gz
lua-c957b270d23941df8ca533dfbf4c9da672a429b4.tar.bz2
lua-c957b270d23941df8ca533dfbf4c9da672a429b4.zip
"call" now handles errors (instead of "dostring")
-rw-r--r--lbuiltin.c49
1 files changed, 29 insertions, 20 deletions
diff --git a/lbuiltin.c b/lbuiltin.c
index 8418da29..b9d81621 100644
--- a/lbuiltin.c
+++ b/lbuiltin.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lbuiltin.c,v 1.5 1997/10/24 17:17:24 roberto Exp roberto $ 2** $Id: lbuiltin.c,v 1.6 1997/11/04 15:27:53 roberto Exp roberto $
3** Built-in functions 3** Built-in functions
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -126,18 +126,11 @@ static void foreach (void)
126 126
127static void internaldostring (void) 127static void internaldostring (void)
128{ 128{
129 lua_Object err = lua_getparam(2); 129 if (lua_getparam(2) != LUA_NOOBJECT)
130 if (err != LUA_NOOBJECT) { /* set new error method */ 130 lua_error("invalid 2nd argument (probably obsolete code)");
131 lua_pushobject(err);
132 err = lua_seterrormethod();
133 }
134 if (lua_dostring(luaL_check_string(1)) == 0) 131 if (lua_dostring(luaL_check_string(1)) == 0)
135 if (luaA_passresults() == 0) 132 if (luaA_passresults() == 0)
136 lua_pushuserdata(NULL); /* at least one result to signal no errors */ 133 lua_pushuserdata(NULL); /* at least one result to signal no errors */
137 if (err != LUA_NOOBJECT) { /* restore old error method */
138 lua_pushobject(err);
139 lua_seterrormethod();
140 }
141} 134}
142 135
143 136
@@ -259,32 +252,48 @@ static int getnarg (lua_Object table)
259{ 252{
260 lua_Object temp; 253 lua_Object temp;
261 /* temp = table.n */ 254 /* temp = table.n */
262 lua_pushobject(table); lua_pushstring("n"); temp = lua_gettable(); 255 lua_pushobject(table); lua_pushstring("n"); temp = lua_rawgettable();
263 return (lua_isnumber(temp) ? lua_getnumber(temp) : MAX_WORD); 256 return (lua_isnumber(temp) ? lua_getnumber(temp) : MAX_WORD);
264} 257}
265 258
266static void luaI_call (void) 259static void luaI_call (void)
267{ 260{
268 lua_Object f = functionarg(1); 261 lua_Object f = luaL_nonnullarg(1);
269 lua_Object arg = tablearg(2); 262 lua_Object arg = tablearg(2);
270 char *options = luaL_opt_string(3, ""); 263 char *options = luaL_opt_string(3, "");
264 lua_Object err = lua_getparam(4);
271 int narg = getnarg(arg); 265 int narg = getnarg(arg);
272 int i; 266 int i, status;
267 if (err != LUA_NOOBJECT) { /* set new error method */
268 lua_pushobject(err);
269 err = lua_seterrormethod();
270 }
273 /* push arg[1...n] */ 271 /* push arg[1...n] */
274 for (i=0; i<narg; i++) { 272 for (i=0; i<narg; i++) {
275 lua_Object temp; 273 lua_Object temp;
276 /* temp = arg[i+1] */ 274 /* temp = arg[i+1] */
277 lua_pushobject(arg); lua_pushnumber(i+1); temp = lua_gettable(); 275 lua_pushobject(arg); lua_pushnumber(i+1); temp = lua_rawgettable();
278 if (narg == MAX_WORD && lua_isnil(temp)) 276 if (narg == MAX_WORD && lua_isnil(temp))
279 break; 277 break;
280 lua_pushobject(temp); 278 lua_pushobject(temp);
281 } 279 }
282 if (lua_callfunction(f)) 280 status = lua_callfunction(f);
283 lua_error(NULL); 281 if (err != LUA_NOOBJECT) { /* restore old error method */
284 else if (strchr(options, 'p')) 282 lua_pushobject(err);
285 luaA_packresults(); 283 lua_seterrormethod();
286 else 284 }
287 luaA_passresults(); 285 if (status != 0) { /* error in call? */
286 if (strchr(options, 'x'))
287 return; /* return nil to signal the error */
288 else
289 lua_error(NULL);
290 }
291 else { /* no errors */
292 if (strchr(options, 'p'))
293 luaA_packresults();
294 else
295 luaA_passresults();
296 }
288} 297}
289 298
290 299