diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-04-22 11:40:50 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-04-22 11:40:50 -0300 |
commit | ee4859b3e3db6c1a3223669d15538b3852ca4791 (patch) | |
tree | a9a9532c03f0a9bc58599e34457cb618aa5f11f2 /lapi.c | |
parent | f388ee4a822b3d8027ed7c28aa21e9406e4a11eb (diff) | |
download | lua-ee4859b3e3db6c1a3223669d15538b3852ca4791.tar.gz lua-ee4859b3e3db6c1a3223669d15538b3852ca4791.tar.bz2 lua-ee4859b3e3db6c1a3223669d15538b3852ca4791.zip |
new way to handle errors (temporary version)
Diffstat (limited to 'lapi.c')
-rw-r--r-- | lapi.c | 92 |
1 files changed, 80 insertions, 12 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lapi.c,v 1.183 2002/04/05 18:54:31 roberto Exp roberto $ | 2 | ** $Id: lapi.c,v 1.184 2002/04/16 17:08:28 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 | */ |
@@ -19,6 +19,7 @@ | |||
19 | #include "lstring.h" | 19 | #include "lstring.h" |
20 | #include "ltable.h" | 20 | #include "ltable.h" |
21 | #include "ltm.h" | 21 | #include "ltm.h" |
22 | #include "lundump.h" | ||
22 | #include "lvm.h" | 23 | #include "lvm.h" |
23 | 24 | ||
24 | 25 | ||
@@ -528,30 +529,97 @@ LUA_API void lua_rawcall (lua_State *L, int nargs, int nresults) { | |||
528 | } | 529 | } |
529 | 530 | ||
530 | 531 | ||
531 | LUA_API int lua_dofile (lua_State *L, const char *filename) { | 532 | LUA_API int lua_call (lua_State *L, int nargs, int nresults) { |
532 | int status; | 533 | int status; |
533 | status = lua_loadfile(L, filename); | 534 | int errpos = lua_gettop(L) - nargs; |
534 | if (status == 0) /* parse OK? */ | 535 | lua_getglobal(L, "_ERRORMESSAGE"); |
535 | status = lua_call(L, 0, LUA_MULTRET); /* call main */ | 536 | lua_insert(L, errpos); /* put below function and args */ |
537 | status = lua_pcall(L, nargs, nresults, errpos); | ||
538 | lua_remove(L, errpos); | ||
536 | return status; | 539 | return status; |
537 | } | 540 | } |
538 | 541 | ||
539 | 542 | ||
540 | LUA_API int lua_dobuffer (lua_State *L, const char *buff, size_t size, | 543 | LUA_API int lua_pcall (lua_State *L, int nargs, int nresults, int errf) { |
541 | const char *name) { | ||
542 | int status; | 544 | int status; |
543 | status = lua_loadbuffer(L, buff, size, name); | 545 | const TObject *err; |
544 | if (status == 0) /* parse OK? */ | 546 | lua_lock(L); |
545 | status = lua_call(L, 0, LUA_MULTRET); /* call main */ | 547 | err = (errf == 0) ? &luaO_nilobject : luaA_index(L, errf); |
548 | status = luaD_pcall(L, nargs, nresults, err); | ||
549 | lua_unlock(L); | ||
550 | return status; | ||
551 | } | ||
552 | |||
553 | |||
554 | static int aux_do (lua_State *L, int status) { | ||
555 | if (status == 0) { /* parse OK? */ | ||
556 | int err = lua_gettop(L); | ||
557 | lua_getglobal(L, "_ERRORMESSAGE"); | ||
558 | lua_insert(L, err); | ||
559 | status = lua_pcall(L, 0, LUA_MULTRET, err); /* call main */ | ||
560 | lua_remove(L, err); /* remove error function */ | ||
561 | } | ||
546 | return status; | 562 | return status; |
547 | } | 563 | } |
548 | 564 | ||
549 | 565 | ||
566 | LUA_API int lua_dofile (lua_State *L, const char *filename) { | ||
567 | return aux_do(L, lua_loadfile(L, filename)); | ||
568 | } | ||
569 | |||
570 | |||
571 | LUA_API int lua_dobuffer (lua_State *L, const char *buff, size_t size, | ||
572 | const char *name) { | ||
573 | return aux_do(L, lua_loadbuffer(L, buff, size, name)); | ||
574 | } | ||
575 | |||
576 | |||
550 | LUA_API int lua_dostring (lua_State *L, const char *str) { | 577 | LUA_API int lua_dostring (lua_State *L, const char *str) { |
551 | return lua_dobuffer(L, str, strlen(str), str); | 578 | return lua_dobuffer(L, str, strlen(str), str); |
552 | } | 579 | } |
553 | 580 | ||
554 | 581 | ||
582 | LUA_API int lua_loadfile (lua_State *L, const char *filename) { | ||
583 | ZIO z; | ||
584 | int status; | ||
585 | int bin; /* flag for file mode */ | ||
586 | int nlevel; /* level on the stack of filename */ | ||
587 | FILE *f = (filename == NULL) ? stdin : fopen(filename, "r"); | ||
588 | if (f == NULL) return LUA_ERRFILE; /* unable to open file */ | ||
589 | bin = (ungetc(getc(f), f) == LUA_SIGNATURE[0]); | ||
590 | if (bin && f != stdin) { | ||
591 | fclose(f); | ||
592 | f = fopen(filename, "rb"); /* reopen in binary mode */ | ||
593 | if (f == NULL) return LUA_ERRFILE; /* unable to reopen file */ | ||
594 | } | ||
595 | if (filename == NULL) | ||
596 | lua_pushstring(L, "=stdin"); | ||
597 | else { | ||
598 | lua_pushliteral(L, "@"); | ||
599 | lua_pushstring(L, filename); | ||
600 | lua_concat(L, 2); | ||
601 | } | ||
602 | nlevel = lua_gettop(L); | ||
603 | filename = lua_tostring(L, -1); /* filename = `@'..filename */ | ||
604 | luaZ_Fopen(&z, f, filename); | ||
605 | status = luaD_protectedparser(L, &z, bin); | ||
606 | if (ferror(f)) status = LUA_ERRFILE; | ||
607 | lua_remove(L, nlevel); /* remove filename */ | ||
608 | if (f != stdin) | ||
609 | fclose(f); | ||
610 | return status; | ||
611 | } | ||
612 | |||
613 | |||
614 | LUA_API int lua_loadbuffer (lua_State *L, const char *buff, size_t size, | ||
615 | const char *name) { | ||
616 | ZIO z; | ||
617 | if (!name) name = "?"; | ||
618 | luaZ_mopen(&z, buff, size, name); | ||
619 | return luaD_protectedparser(L, &z, buff[0]==LUA_SIGNATURE[0]); | ||
620 | } | ||
621 | |||
622 | |||
555 | 623 | ||
556 | /* | 624 | /* |
557 | ** Garbage-collection functions | 625 | ** Garbage-collection functions |
@@ -595,7 +663,7 @@ LUA_API void lua_setgcthreshold (lua_State *L, int newthreshold) { | |||
595 | 663 | ||
596 | LUA_API void lua_error (lua_State *L, const char *s) { | 664 | LUA_API void lua_error (lua_State *L, const char *s) { |
597 | lua_lock(L); | 665 | lua_lock(L); |
598 | luaD_error(L, s); | 666 | luaD_runerror(L, s); |
599 | lua_unlock(L); | 667 | lua_unlock(L); |
600 | } | 668 | } |
601 | 669 | ||
@@ -662,7 +730,7 @@ LUA_API void lua_concat (lua_State *L, int n) { | |||
662 | L->top -= (n-1); | 730 | L->top -= (n-1); |
663 | luaC_checkGC(L); | 731 | luaC_checkGC(L); |
664 | } | 732 | } |
665 | else if (n == 0) { /* push null string */ | 733 | else if (n == 0) { /* push empty string */ |
666 | setsvalue(L->top, luaS_newlstr(L, NULL, 0)); | 734 | setsvalue(L->top, luaS_newlstr(L, NULL, 0)); |
667 | api_incr_top(L); | 735 | api_incr_top(L); |
668 | } | 736 | } |