diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2009-09-21 09:09:52 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2009-09-21 09:09:52 -0300 |
| commit | a650378822f48e81978e626329bbd96373035eb2 (patch) | |
| tree | 67a2595d55e90b0c13db752f70d19b3731e90566 /lapi.c | |
| parent | 99182c6872f173e8e91426a0dba1468769818681 (diff) | |
| download | lua-a650378822f48e81978e626329bbd96373035eb2.tar.gz lua-a650378822f48e81978e626329bbd96373035eb2.tar.bz2 lua-a650378822f48e81978e626329bbd96373035eb2.zip | |
'cpcall' reimplemented as a predefined value in the registry
Diffstat (limited to 'lapi.c')
| -rw-r--r-- | lapi.c | 44 |
1 files changed, 9 insertions, 35 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lapi.c,v 2.89 2009/08/31 14:26:28 roberto Exp roberto $ | 2 | ** $Id: lapi.c,v 2.90 2009/09/17 18:04:21 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 | */ |
| @@ -854,40 +854,6 @@ LUA_API int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc, | |||
| 854 | } | 854 | } |
| 855 | 855 | ||
| 856 | 856 | ||
| 857 | /* | ||
| 858 | ** Execute a protected C call. | ||
| 859 | */ | ||
| 860 | struct CCallS { /* data to `f_Ccall' */ | ||
| 861 | lua_CFunction func; | ||
| 862 | void *ud; | ||
| 863 | }; | ||
| 864 | |||
| 865 | |||
| 866 | static void f_Ccall (lua_State *L, void *ud) { | ||
| 867 | struct CCallS *c = cast(struct CCallS *, ud); | ||
| 868 | Closure *cl; | ||
| 869 | cl = luaF_newCclosure(L, 0, getcurrenv(L)); | ||
| 870 | cl->c.f = c->func; | ||
| 871 | setclvalue(L, L->top, cl); /* push function */ | ||
| 872 | api_incr_top(L); | ||
| 873 | setpvalue(L->top, c->ud); /* push only argument */ | ||
| 874 | api_incr_top(L); | ||
| 875 | luaD_call(L, L->top - 2, 0, 0); | ||
| 876 | } | ||
| 877 | |||
| 878 | |||
| 879 | LUA_API int lua_cpcall (lua_State *L, lua_CFunction func, void *ud) { | ||
| 880 | struct CCallS c; | ||
| 881 | int status; | ||
| 882 | lua_lock(L); | ||
| 883 | c.func = func; | ||
| 884 | c.ud = ud; | ||
| 885 | status = luaD_pcall(L, f_Ccall, &c, savestack(L, L->top), 0); | ||
| 886 | lua_unlock(L); | ||
| 887 | return status; | ||
| 888 | } | ||
| 889 | |||
| 890 | |||
| 891 | LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data, | 857 | LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data, |
| 892 | const char *chunkname) { | 858 | const char *chunkname) { |
| 893 | ZIO z; | 859 | ZIO z; |
| @@ -1113,3 +1079,11 @@ LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) { | |||
| 1113 | return name; | 1079 | return name; |
| 1114 | } | 1080 | } |
| 1115 | 1081 | ||
| 1082 | |||
| 1083 | LUA_API int lua_cpcall (lua_State *L, lua_CFunction func, void *ud) { | ||
| 1084 | lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_CPCALL); | ||
| 1085 | lua_pushlightuserdata(L, &func); | ||
| 1086 | lua_pushlightuserdata(L, ud); | ||
| 1087 | return lua_pcall(L, 2, 0, 0); | ||
| 1088 | } | ||
| 1089 | |||
