diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2009-03-10 14:14:37 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2009-03-10 14:14:37 -0300 |
| commit | ba484b9eb16dd62a7c3a5400a66eb952b654d3f0 (patch) | |
| tree | 31692ddf85265e5a46eab0cd55a0b0757a225e68 /lapi.c | |
| parent | f9d015523ef48266cea37e13717c223c16941b23 (diff) | |
| download | lua-ba484b9eb16dd62a7c3a5400a66eb952b654d3f0.tar.gz lua-ba484b9eb16dd62a7c3a5400a66eb952b654d3f0.tar.bz2 lua-ba484b9eb16dd62a7c3a5400a66eb952b654d3f0.zip | |
yielding across lua_call (first version)
Diffstat (limited to '')
| -rw-r--r-- | lapi.c | 22 |
1 files changed, 13 insertions, 9 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lapi.c,v 2.69 2009/02/18 17:20:56 roberto Exp roberto $ | 2 | ** $Id: lapi.c,v 2.70 2009/02/19 17:15:13 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 | */ |
| @@ -757,21 +757,25 @@ LUA_API int lua_setfenv (lua_State *L, int idx) { | |||
| 757 | */ | 757 | */ |
| 758 | 758 | ||
| 759 | 759 | ||
| 760 | #define adjustresults(L,nres) \ | ||
| 761 | { if (nres == LUA_MULTRET && L->top >= L->ci->top) L->ci->top = L->top; } | ||
| 762 | |||
| 763 | |||
| 764 | #define checkresults(L,na,nr) \ | 760 | #define checkresults(L,na,nr) \ |
| 765 | api_check(L, (nr) == LUA_MULTRET || (L->ci->top - L->top >= (nr) - (na))) | 761 | api_check(L, (nr) == LUA_MULTRET || (L->ci->top - L->top >= (nr) - (na))) |
| 766 | 762 | ||
| 767 | 763 | ||
| 768 | LUA_API void lua_call (lua_State *L, int nargs, int nresults) { | 764 | LUA_API void lua_callcont (lua_State *L, int nargs, int nresults, |
| 765 | lua_CFunction cont) { | ||
| 769 | StkId func; | 766 | StkId func; |
| 770 | lua_lock(L); | 767 | lua_lock(L); |
| 768 | /* cannot use continuations inside hooks */ | ||
| 769 | api_check(L, cont == NULL || !isLua(L->ci)); | ||
| 771 | api_checknelems(L, nargs+1); | 770 | api_checknelems(L, nargs+1); |
| 772 | checkresults(L, nargs, nresults); | 771 | checkresults(L, nargs, nresults); |
| 773 | func = L->top - (nargs+1); | 772 | func = L->top - (nargs+1); |
| 774 | luaD_call(L, func, nresults); | 773 | if (cont) { |
| 774 | L->ci->u.c.cont = cont; | ||
| 775 | luaD_call(L, func, nresults, 1); | ||
| 776 | } | ||
| 777 | else | ||
| 778 | luaD_call(L, func, nresults, 0); | ||
| 775 | adjustresults(L, nresults); | 779 | adjustresults(L, nresults); |
| 776 | lua_unlock(L); | 780 | lua_unlock(L); |
| 777 | } | 781 | } |
| @@ -789,7 +793,7 @@ struct CallS { /* data to `f_call' */ | |||
| 789 | 793 | ||
| 790 | static void f_call (lua_State *L, void *ud) { | 794 | static void f_call (lua_State *L, void *ud) { |
| 791 | struct CallS *c = cast(struct CallS *, ud); | 795 | struct CallS *c = cast(struct CallS *, ud); |
| 792 | luaD_call(L, c->func, c->nresults); | 796 | luaD_call(L, c->func, c->nresults, 0); |
| 793 | } | 797 | } |
| 794 | 798 | ||
| 795 | 799 | ||
| @@ -835,7 +839,7 @@ static void f_Ccall (lua_State *L, void *ud) { | |||
| 835 | api_incr_top(L); | 839 | api_incr_top(L); |
| 836 | setpvalue(L->top, c->ud); /* push only argument */ | 840 | setpvalue(L->top, c->ud); /* push only argument */ |
| 837 | api_incr_top(L); | 841 | api_incr_top(L); |
| 838 | luaD_call(L, L->top - 2, 0); | 842 | luaD_call(L, L->top - 2, 0, 0); |
| 839 | } | 843 | } |
| 840 | 844 | ||
| 841 | 845 | ||
