diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2008-08-26 10:27:42 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2008-08-26 10:27:42 -0300 |
| commit | f94cd2201c3a8d341db448f2719dfb0ae4338adf (patch) | |
| tree | 34f49a3e607098699b1f9e3af9358c062ec8425e /lvm.c | |
| parent | fdbb243ff9980870c54676f3b2597b110ab82864 (diff) | |
| download | lua-f94cd2201c3a8d341db448f2719dfb0ae4338adf.tar.gz lua-f94cd2201c3a8d341db448f2719dfb0ae4338adf.tar.bz2 lua-f94cd2201c3a8d341db448f2719dfb0ae4338adf.zip | |
better control of call status through CallInfo
Diffstat (limited to '')
| -rw-r--r-- | lvm.c | 21 |
1 files changed, 12 insertions, 9 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lvm.c,v 2.74 2008/04/02 16:16:06 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 2.75 2008/08/13 17:02:42 roberto Exp roberto $ |
| 3 | ** Lua virtual machine | 3 | ** Lua virtual machine |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -280,11 +280,14 @@ void luaV_concat (lua_State *L, int total, int last) { | |||
| 280 | if (!(ttisstring(top-2) || ttisnumber(top-2)) || !tostring(L, top-1)) { | 280 | if (!(ttisstring(top-2) || ttisnumber(top-2)) || !tostring(L, top-1)) { |
| 281 | if (!call_binTM(L, top-2, top-1, top-2, TM_CONCAT)) | 281 | if (!call_binTM(L, top-2, top-1, top-2, TM_CONCAT)) |
| 282 | luaG_concaterror(L, top-2, top-1); | 282 | luaG_concaterror(L, top-2, top-1); |
| 283 | } else if (tsvalue(top-1)->len == 0) { /* second operand is empty? */ | 283 | } |
| 284 | else if (tsvalue(top-1)->len == 0) { /* second operand is empty? */ | ||
| 284 | (void)tostring(L, top - 2); /* result is first operand */ ; | 285 | (void)tostring(L, top - 2); /* result is first operand */ ; |
| 285 | } else if (ttisstring(top-2) && tsvalue(top-2)->len == 0) { | 286 | } |
| 287 | else if (ttisstring(top-2) && tsvalue(top-2)->len == 0) { | ||
| 286 | setsvalue2s(L, top-2, rawtsvalue(top-1)); /* result is second op. */ | 288 | setsvalue2s(L, top-2, rawtsvalue(top-1)); /* result is second op. */ |
| 287 | } else { | 289 | } |
| 290 | else { | ||
| 288 | /* at least two (non-empty) string values; get as many as possible */ | 291 | /* at least two (non-empty) string values; get as many as possible */ |
| 289 | size_t tl = tsvalue(top-1)->len; | 292 | size_t tl = tsvalue(top-1)->len; |
| 290 | char *buffer; | 293 | char *buffer; |
| @@ -397,7 +400,7 @@ static void Arith (lua_State *L, StkId ra, const TValue *rb, | |||
| 397 | 400 | ||
| 398 | 401 | ||
| 399 | 402 | ||
| 400 | void luaV_execute (lua_State *L, int nexeccalls) { | 403 | void luaV_execute (lua_State *L) { |
| 401 | LClosure *cl; | 404 | LClosure *cl; |
| 402 | StkId base; | 405 | StkId base; |
| 403 | TValue *k; | 406 | TValue *k; |
| @@ -601,7 +604,7 @@ void luaV_execute (lua_State *L, int nexeccalls) { | |||
| 601 | continue; | 604 | continue; |
| 602 | } | 605 | } |
| 603 | else { /* Lua function */ | 606 | else { /* Lua function */ |
| 604 | nexeccalls++; | 607 | L->ci->callstatus |= CIST_REENTRY; |
| 605 | goto reentry; /* restart luaV_execute over new Lua function */ | 608 | goto reentry; /* restart luaV_execute over new Lua function */ |
| 606 | } | 609 | } |
| 607 | } | 610 | } |
| @@ -636,9 +639,9 @@ void luaV_execute (lua_State *L, int nexeccalls) { | |||
| 636 | if (b != 0) L->top = ra+b-1; | 639 | if (b != 0) L->top = ra+b-1; |
| 637 | if (L->openupval) luaF_close(L, base); | 640 | if (L->openupval) luaF_close(L, base); |
| 638 | b = luaD_poscall(L, ra); | 641 | b = luaD_poscall(L, ra); |
| 639 | if (--nexeccalls == 0) /* was previous function running `here'? */ | 642 | if (!((L->ci + 1)->callstatus & CIST_REENTRY)) |
| 640 | return; /* no: return */ | 643 | return; /* external invocation: return */ |
| 641 | else { /* yes: continue its execution */ | 644 | else { /* invocation via reentry: continue execution */ |
| 642 | if (b) L->top = L->ci->top; | 645 | if (b) L->top = L->ci->top; |
| 643 | lua_assert(isLua(L->ci)); | 646 | lua_assert(isLua(L->ci)); |
| 644 | lua_assert(GET_OPCODE(*((L->ci)->savedpc - 1)) == OP_CALL); | 647 | lua_assert(GET_OPCODE(*((L->ci)->savedpc - 1)) == OP_CALL); |
