diff options
| -rw-r--r-- | lapi.c | 58 | ||||
| -rw-r--r-- | ldo.c | 31 | ||||
| -rw-r--r-- | ldo.h | 5 | ||||
| -rw-r--r-- | lua.c | 49 | ||||
| -rw-r--r-- | lua.h | 3 |
5 files changed, 105 insertions, 41 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lapi.c,v 1.223 2002/11/25 11:16:48 roberto Exp roberto $ | 2 | ** $Id: lapi.c,v 1.224 2002/11/25 17:50:14 roberto Exp roberto $ |
| 3 | ** Lua API | 3 | ** Lua API |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -649,12 +649,66 @@ LUA_API void lua_call (lua_State *L, int nargs, int nresults) { | |||
| 649 | } | 649 | } |
| 650 | 650 | ||
| 651 | 651 | ||
| 652 | |||
| 653 | /* | ||
| 654 | ** Execute a protected call. | ||
| 655 | */ | ||
| 656 | struct CallS { /* data to `f_call' */ | ||
| 657 | StkId func; | ||
| 658 | int nresults; | ||
| 659 | }; | ||
| 660 | |||
| 661 | |||
| 662 | static void f_call (lua_State *L, void *ud) { | ||
| 663 | struct CallS *c = cast(struct CallS *, ud); | ||
| 664 | luaD_call(L, c->func, c->nresults); | ||
| 665 | } | ||
| 666 | |||
| 667 | |||
| 668 | |||
| 652 | LUA_API int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc) { | 669 | LUA_API int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc) { |
| 670 | struct CallS c; | ||
| 653 | int status; | 671 | int status; |
| 654 | ptrdiff_t func; | 672 | ptrdiff_t func; |
| 655 | lua_lock(L); | 673 | lua_lock(L); |
| 656 | func = (errfunc == 0) ? 0 : savestack(L, luaA_index(L, errfunc)); | 674 | func = (errfunc == 0) ? 0 : savestack(L, luaA_index(L, errfunc)); |
| 657 | status = luaD_pcall(L, nargs, nresults, func); | 675 | c.func = L->top - (nargs+1); /* function to be called */ |
| 676 | c.nresults = nresults; | ||
| 677 | status = luaD_pcall(L, &f_call, &c, savestack(L, c.func), func); | ||
| 678 | lua_unlock(L); | ||
| 679 | return status; | ||
| 680 | } | ||
| 681 | |||
| 682 | |||
| 683 | /* | ||
| 684 | ** Execute a protected C call. | ||
| 685 | */ | ||
| 686 | struct CCallS { /* data to `f_Ccall' */ | ||
| 687 | lua_CFunction func; | ||
| 688 | void *ud; | ||
| 689 | }; | ||
| 690 | |||
| 691 | |||
| 692 | static void f_Ccall (lua_State *L, void *ud) { | ||
| 693 | struct CCallS *c = cast(struct CCallS *, ud); | ||
| 694 | Closure *cl; | ||
| 695 | cl = luaF_newCclosure(L, 0); | ||
| 696 | cl->c.f = c->func; | ||
| 697 | setclvalue(L->top, cl); /* push function */ | ||
| 698 | incr_top(L); | ||
| 699 | setpvalue(L->top, c->ud); /* push only argument */ | ||
| 700 | incr_top(L); | ||
| 701 | luaD_call(L, L->top - 2, 0); | ||
| 702 | } | ||
| 703 | |||
| 704 | |||
| 705 | LUA_API int lua_cpcall (lua_State *L, lua_CFunction func, void *ud) { | ||
| 706 | struct CCallS c; | ||
| 707 | int status; | ||
| 708 | lua_lock(L); | ||
| 709 | c.func = func; | ||
| 710 | c.ud = ud; | ||
| 711 | status = luaD_pcall(L, &f_Ccall, &c, savestack(L, L->top), 0); | ||
| 658 | lua_unlock(L); | 712 | lua_unlock(L); |
| 659 | return status; | 713 | return status; |
| 660 | } | 714 | } |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ldo.c,v 1.208 2002/11/22 17:16:52 roberto Exp roberto $ | 2 | ** $Id: ldo.c,v 1.209 2002/11/22 18:01:46 roberto Exp roberto $ |
| 3 | ** Stack and Call structure of Lua | 3 | ** Stack and Call structure of Lua |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -378,35 +378,17 @@ LUA_API int lua_yield (lua_State *L, int nresults) { | |||
| 378 | } | 378 | } |
| 379 | 379 | ||
| 380 | 380 | ||
| 381 | /* | 381 | int luaD_pcall (lua_State *L, Pfunc func, void *u, |
| 382 | ** Execute a protected call. | 382 | ptrdiff_t old_top, ptrdiff_t ef) { |
| 383 | */ | ||
| 384 | struct CallS { /* data to `f_call' */ | ||
| 385 | StkId func; | ||
| 386 | int nresults; | ||
| 387 | }; | ||
| 388 | |||
| 389 | |||
| 390 | static void f_call (lua_State *L, void *ud) { | ||
| 391 | struct CallS *c = cast(struct CallS *, ud); | ||
| 392 | luaD_call(L, c->func, c->nresults); | ||
| 393 | } | ||
| 394 | |||
| 395 | |||
| 396 | int luaD_pcall (lua_State *L, int nargs, int nresults, ptrdiff_t errfunc) { | ||
| 397 | struct CallS c; | ||
| 398 | int status; | 383 | int status; |
| 399 | unsigned short oldnCcalls = L->nCcalls; | 384 | unsigned short oldnCcalls = L->nCcalls; |
| 400 | ptrdiff_t old_top = savestack(L, L->top); | ||
| 401 | ptrdiff_t old_ci = saveci(L, L->ci); | 385 | ptrdiff_t old_ci = saveci(L, L->ci); |
| 402 | lu_byte old_allowhooks = L->allowhook; | 386 | lu_byte old_allowhooks = L->allowhook; |
| 403 | ptrdiff_t old_errfunc = L->errfunc; | 387 | ptrdiff_t old_errfunc = L->errfunc; |
| 404 | L->errfunc = errfunc; | 388 | L->errfunc = ef; |
| 405 | c.func = L->top - (nargs+1); /* function to be called */ | 389 | status = luaD_rawrunprotected(L, func, u); |
| 406 | c.nresults = nresults; | ||
| 407 | status = luaD_rawrunprotected(L, &f_call, &c); | ||
| 408 | if (status != 0) { /* an error occurred? */ | 390 | if (status != 0) { /* an error occurred? */ |
| 409 | StkId oldtop = restorestack(L, old_top) - (nargs+1); | 391 | StkId oldtop = restorestack(L, old_top); |
| 410 | luaF_close(L, oldtop); /* close eventual pending closures */ | 392 | luaF_close(L, oldtop); /* close eventual pending closures */ |
| 411 | seterrorobj(L, status, oldtop); | 393 | seterrorobj(L, status, oldtop); |
| 412 | L->nCcalls = oldnCcalls; | 394 | L->nCcalls = oldnCcalls; |
| @@ -420,6 +402,7 @@ int luaD_pcall (lua_State *L, int nargs, int nresults, ptrdiff_t errfunc) { | |||
| 420 | } | 402 | } |
| 421 | 403 | ||
| 422 | 404 | ||
| 405 | |||
| 423 | /* | 406 | /* |
| 424 | ** Execute a protected parser. | 407 | ** Execute a protected parser. |
| 425 | */ | 408 | */ |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ldo.h,v 1.54 2002/11/21 17:19:11 roberto Exp roberto $ | 2 | ** $Id: ldo.h,v 1.55 2002/11/21 17:41:25 roberto Exp roberto $ |
| 3 | ** Stack and Call structure of Lua | 3 | ** Stack and Call structure of Lua |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -46,7 +46,8 @@ int luaD_protectedparser (lua_State *L, ZIO *z, int bin); | |||
| 46 | void luaD_callhook (lua_State *L, int event, int line); | 46 | void luaD_callhook (lua_State *L, int event, int line); |
| 47 | StkId luaD_precall (lua_State *L, StkId func); | 47 | StkId luaD_precall (lua_State *L, StkId func); |
| 48 | void luaD_call (lua_State *L, StkId func, int nResults); | 48 | void luaD_call (lua_State *L, StkId func, int nResults); |
| 49 | int luaD_pcall (lua_State *L, int nargs, int nresults, ptrdiff_t errfunc); | 49 | int luaD_pcall (lua_State *L, Pfunc func, void *u, |
| 50 | ptrdiff_t oldtop, ptrdiff_t ef); | ||
| 50 | void luaD_poscall (lua_State *L, int wanted, StkId firstResult); | 51 | void luaD_poscall (lua_State *L, int wanted, StkId firstResult); |
| 51 | void luaD_reallocCI (lua_State *L, int newsize); | 52 | void luaD_reallocCI (lua_State *L, int newsize); |
| 52 | void luaD_reallocstack (lua_State *L, int newsize); | 53 | void luaD_reallocstack (lua_State *L, int newsize); |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lua.c,v 1.110 2002/11/25 17:47:13 roberto Exp roberto $ | 2 | ** $Id: lua.c,v 1.111 2002/12/04 15:38:25 roberto Exp roberto $ |
| 3 | ** Lua stand-alone interpreter | 3 | ** Lua stand-alone interpreter |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -388,19 +388,44 @@ static int handle_luainit (void) { | |||
| 388 | } | 388 | } |
| 389 | 389 | ||
| 390 | 390 | ||
| 391 | int main (int argc, char *argv[]) { | 391 | struct Smain { |
| 392 | int argc; | ||
| 393 | char **argv; | ||
| 394 | int status; | ||
| 395 | }; | ||
| 396 | |||
| 397 | |||
| 398 | static int pmain (lua_State *l) { | ||
| 399 | struct Smain *s = (struct Smain *)lua_touserdata(l, 1); | ||
| 392 | int status; | 400 | int status; |
| 393 | int interactive = 0; | 401 | int interactive = 0; |
| 394 | (void)argc; /* to avoid warnings */ | 402 | progname = s->argv[0]; |
| 395 | progname = argv[0]; | 403 | L = l; |
| 396 | L = lua_open(); /* create state */ | 404 | lua_userinit(l); /* open libraries */ |
| 397 | lua_atpanic(L, l_panic); | ||
| 398 | lua_userinit(L); /* open libraries */ | ||
| 399 | status = handle_luainit(); | 405 | status = handle_luainit(); |
| 400 | if (status != 0) return status; | 406 | if (status == 0) { |
| 401 | status = handle_argv(argv, &interactive); | 407 | status = handle_argv(s->argv, &interactive); |
| 402 | if (status == 0 && interactive) manual_input(); | 408 | if (status == 0 && interactive) manual_input(); |
| 403 | lua_close(L); | 409 | } |
| 404 | return status; | 410 | s->status = status; |
| 411 | return 0; | ||
| 412 | } | ||
| 413 | |||
| 414 | |||
| 415 | int main (int argc, char *argv[]) { | ||
| 416 | int status; | ||
| 417 | struct Smain s; | ||
| 418 | lua_State *l = lua_open(); /* create state */ | ||
| 419 | if (l == NULL) { | ||
| 420 | l_message(argv[0], "cannot create state: not enough memory"); | ||
| 421 | return EXIT_FAILURE; | ||
| 422 | } | ||
| 423 | s.argc = argc; | ||
| 424 | s.argv = argv; | ||
| 425 | lua_atpanic(l, l_panic); | ||
| 426 | status = lua_cpcall(l, &pmain, &s); | ||
| 427 | report(status); | ||
| 428 | lua_close(l); | ||
| 429 | return (status || s.status) ? EXIT_FAILURE : EXIT_SUCCESS; | ||
| 405 | } | 430 | } |
| 406 | 431 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lua.h,v 1.167 2002/11/25 17:50:14 roberto Exp roberto $ | 2 | ** $Id: lua.h,v 1.168 2002/11/26 12:53:29 roberto Exp roberto $ |
| 3 | ** Lua - An Extensible Extension Language | 3 | ** Lua - An Extensible Extension Language |
| 4 | ** Tecgraf: Computer Graphics Technology Group, PUC-Rio, Brazil | 4 | ** Tecgraf: Computer Graphics Technology Group, PUC-Rio, Brazil |
| 5 | ** http://www.lua.org mailto:info@lua.org | 5 | ** http://www.lua.org mailto:info@lua.org |
| @@ -186,6 +186,7 @@ LUA_API int lua_setglobals (lua_State *L, int idx); | |||
| 186 | */ | 186 | */ |
| 187 | LUA_API void lua_call (lua_State *L, int nargs, int nresults); | 187 | LUA_API void lua_call (lua_State *L, int nargs, int nresults); |
| 188 | LUA_API int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc); | 188 | LUA_API int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc); |
| 189 | LUA_API int lua_cpcall (lua_State *L, lua_CFunction func, void *ud); | ||
| 189 | LUA_API int lua_load (lua_State *L, lua_Chunkreader reader, void *dt, | 190 | LUA_API int lua_load (lua_State *L, lua_Chunkreader reader, void *dt, |
| 190 | const char *chunkname); | 191 | const char *chunkname); |
| 191 | 192 | ||
