diff options
| author | Mike Pall <mike> | 2012-10-09 13:19:57 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2012-10-09 13:19:57 +0200 |
| commit | eabfdfe1aa3b4b9c37b99137e6d5fb7cadbd47e9 (patch) | |
| tree | b7cf8922d69daedd5d5733214a77439c8986f570 /src | |
| parent | da682b0e9184d4db7e8e477c682947d106790240 (diff) | |
| download | luajit-eabfdfe1aa3b4b9c37b99137e6d5fb7cadbd47e9.tar.gz luajit-eabfdfe1aa3b4b9c37b99137e6d5fb7cadbd47e9.tar.bz2 luajit-eabfdfe1aa3b4b9c37b99137e6d5fb7cadbd47e9.zip | |
Don't use stack unwinding for lua_yield().
Diffstat (limited to 'src')
| -rw-r--r-- | src/lj_api.c | 13 | ||||
| -rw-r--r-- | src/vm_arm.dasc | 8 | ||||
| -rw-r--r-- | src/vm_mips.dasc | 4 | ||||
| -rw-r--r-- | src/vm_ppc.dasc | 11 | ||||
| -rw-r--r-- | src/vm_ppcspe.dasc | 11 | ||||
| -rw-r--r-- | src/vm_x86.dasc | 5 |
6 files changed, 35 insertions, 17 deletions
diff --git a/src/lj_api.c b/src/lj_api.c index 5a0bd07a..8d35e0d0 100644 --- a/src/lj_api.c +++ b/src/lj_api.c | |||
| @@ -1103,6 +1103,9 @@ LUA_API int lua_yield(lua_State *L, int nresults) | |||
| 1103 | while (--nresults >= 0) copyTV(L, t++, f++); | 1103 | while (--nresults >= 0) copyTV(L, t++, f++); |
| 1104 | L->top = t; | 1104 | L->top = t; |
| 1105 | } | 1105 | } |
| 1106 | L->cframe = NULL; | ||
| 1107 | L->status = LUA_YIELD; | ||
| 1108 | return -1; | ||
| 1106 | } else { /* Yield from hook: add a pseudo-frame. */ | 1109 | } else { /* Yield from hook: add a pseudo-frame. */ |
| 1107 | TValue *top = L->top; | 1110 | TValue *top = L->top; |
| 1108 | hook_leave(g); | 1111 | hook_leave(g); |
| @@ -1112,14 +1115,14 @@ LUA_API int lua_yield(lua_State *L, int nresults) | |||
| 1112 | setframe_gc(top+2, obj2gco(L)); | 1115 | setframe_gc(top+2, obj2gco(L)); |
| 1113 | setframe_ftsz(top+2, (int)((char *)(top+3)-(char *)L->base)+FRAME_CONT); | 1116 | setframe_ftsz(top+2, (int)((char *)(top+3)-(char *)L->base)+FRAME_CONT); |
| 1114 | L->top = L->base = top+3; | 1117 | L->top = L->base = top+3; |
| 1115 | } | ||
| 1116 | #if LJ_TARGET_X64 | 1118 | #if LJ_TARGET_X64 |
| 1117 | lj_err_throw(L, LUA_YIELD); | 1119 | lj_err_throw(L, LUA_YIELD); |
| 1118 | #else | 1120 | #else |
| 1119 | L->cframe = NULL; | 1121 | L->cframe = NULL; |
| 1120 | L->status = LUA_YIELD; | 1122 | L->status = LUA_YIELD; |
| 1121 | lj_vm_unwind_c(cf, LUA_YIELD); | 1123 | lj_vm_unwind_c(cf, LUA_YIELD); |
| 1122 | #endif | 1124 | #endif |
| 1125 | } | ||
| 1123 | } | 1126 | } |
| 1124 | lj_err_msg(L, LJ_ERR_CYIELD); | 1127 | lj_err_msg(L, LJ_ERR_CYIELD); |
| 1125 | return 0; /* unreachable */ | 1128 | return 0; /* unreachable */ |
diff --git a/src/vm_arm.dasc b/src/vm_arm.dasc index 4909d827..f00b3028 100644 --- a/src/vm_arm.dasc +++ b/src/vm_arm.dasc | |||
| @@ -269,10 +269,12 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 269 | | sub RA, RA, #8 | 269 | | sub RA, RA, #8 |
| 270 | | | 270 | | |
| 271 | |->vm_returnc: | 271 | |->vm_returnc: |
| 272 | | add RC, RC, #8 // RC = (nresults+1)*8. | 272 | | adds RC, RC, #8 // RC = (nresults+1)*8. |
| 273 | | ands CARG1, PC, #FRAME_TYPE | 273 | | mov CRET1, #LUA_YIELD |
| 274 | | beq ->vm_unwind_c_eh | ||
| 274 | | str RC, SAVE_MULTRES | 275 | | str RC, SAVE_MULTRES |
| 275 | | beq ->BC_RET_Z // Handle regular return to Lua. | 276 | | ands CARG1, PC, #FRAME_TYPE |
| 277 | | beq ->BC_RET_Z // Handle regular return to Lua. | ||
| 276 | | | 278 | | |
| 277 | |->vm_return: | 279 | |->vm_return: |
| 278 | | // BASE = base, RA = resultptr, RC/MULTRES = (nresults+1)*8, PC = return | 280 | | // BASE = base, RA = resultptr, RC/MULTRES = (nresults+1)*8, PC = return |
diff --git a/src/vm_mips.dasc b/src/vm_mips.dasc index f82cefe8..52fc5fe1 100644 --- a/src/vm_mips.dasc +++ b/src/vm_mips.dasc | |||
| @@ -327,8 +327,10 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 327 | | addiu RA, RA, -8 | 327 | | addiu RA, RA, -8 |
| 328 | | | 328 | | |
| 329 | |->vm_returnc: | 329 | |->vm_returnc: |
| 330 | | andi TMP0, PC, FRAME_TYPE | ||
| 331 | | addiu RD, RD, 8 // RD = (nresults+1)*8. | 330 | | addiu RD, RD, 8 // RD = (nresults+1)*8. |
| 331 | | andi TMP0, PC, FRAME_TYPE | ||
| 332 | | beqz RD, ->vm_unwind_c_eh | ||
| 333 | |. li CRET1, LUA_YIELD | ||
| 332 | | beqz TMP0, ->BC_RET_Z // Handle regular return to Lua. | 334 | | beqz TMP0, ->BC_RET_Z // Handle regular return to Lua. |
| 333 | |. move MULTRES, RD | 335 | |. move MULTRES, RD |
| 334 | | | 336 | | |
diff --git a/src/vm_ppc.dasc b/src/vm_ppc.dasc index 5a6737ae..ac572ec5 100644 --- a/src/vm_ppc.dasc +++ b/src/vm_ppc.dasc | |||
| @@ -452,10 +452,13 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 452 | | stwu TMP1, FRAME_PC(RA) // Prepend true to results. | 452 | | stwu TMP1, FRAME_PC(RA) // Prepend true to results. |
| 453 | | | 453 | | |
| 454 | |->vm_returnc: | 454 | |->vm_returnc: |
| 455 | | andix. TMP0, PC, FRAME_TYPE | 455 | | addi RD, RD, 8 // RD = (nresults+1)*8. |
| 456 | | addi RD, RD, 8 // RD = (nresults+1)*8. | 456 | | andix. TMP0, PC, FRAME_TYPE |
| 457 | | mr MULTRES, RD | 457 | | cmpwi cr1, RD, 0 |
| 458 | | beq ->BC_RET_Z // Handle regular return to Lua. | 458 | | li CRET1, LUA_YIELD |
| 459 | | beq cr1, ->vm_unwind_c_eh | ||
| 460 | | mr MULTRES, RD | ||
| 461 | | beq ->BC_RET_Z // Handle regular return to Lua. | ||
| 459 | | | 462 | | |
| 460 | |->vm_return: | 463 | |->vm_return: |
| 461 | | // BASE = base, RA = resultptr, RD/MULTRES = (nresults+1)*8, PC = return | 464 | | // BASE = base, RA = resultptr, RD/MULTRES = (nresults+1)*8, PC = return |
diff --git a/src/vm_ppcspe.dasc b/src/vm_ppcspe.dasc index ab2d7670..cbd6ecdd 100644 --- a/src/vm_ppcspe.dasc +++ b/src/vm_ppcspe.dasc | |||
| @@ -294,10 +294,13 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 294 | | stwu TMP1, FRAME_PC(RA) // Prepend true to results. | 294 | | stwu TMP1, FRAME_PC(RA) // Prepend true to results. |
| 295 | | | 295 | | |
| 296 | |->vm_returnc: | 296 | |->vm_returnc: |
| 297 | | andi. TMP0, PC, FRAME_TYPE | 297 | | addi RD, RD, 8 // RD = (nresults+1)*8. |
| 298 | | addi RD, RD, 8 // RD = (nresults+1)*8. | 298 | | andi. TMP0, PC, FRAME_TYPE |
| 299 | | mr MULTRES, RD | 299 | | cmpwi cr1, RD, 0 |
| 300 | | beq ->BC_RET_Z // Handle regular return to Lua. | 300 | | li CRET1, LUA_YIELD |
| 301 | | beq cr1, ->vm_unwind_c_eh | ||
| 302 | | mr MULTRES, RD | ||
| 303 | | beq ->BC_RET_Z // Handle regular return to Lua. | ||
| 301 | | | 304 | | |
| 302 | |->vm_return: | 305 | |->vm_return: |
| 303 | | // BASE = base, RA = resultptr, RD/MULTRES = (nresults+1)*8, PC = return | 306 | | // BASE = base, RA = resultptr, RD/MULTRES = (nresults+1)*8, PC = return |
diff --git a/src/vm_x86.dasc b/src/vm_x86.dasc index 92e98f98..e2b6a078 100644 --- a/src/vm_x86.dasc +++ b/src/vm_x86.dasc | |||
| @@ -443,6 +443,7 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 443 | | | 443 | | |
| 444 | |->vm_returnc: | 444 | |->vm_returnc: |
| 445 | | add RD, 1 // RD = nresults+1 | 445 | | add RD, 1 // RD = nresults+1 |
| 446 | | jz ->vm_unwind_yield | ||
| 446 | | mov MULTRES, RD | 447 | | mov MULTRES, RD |
| 447 | | test PC, FRAME_TYPE | 448 | | test PC, FRAME_TYPE |
| 448 | | jz ->BC_RET_Z // Handle regular return to Lua. | 449 | | jz ->BC_RET_Z // Handle regular return to Lua. |
| @@ -526,6 +527,10 @@ static void build_subroutines(BuildCtx *ctx) | |||
| 526 | | mov BASE, L:RB->top // Need the (realloced) L->top in BASE. | 527 | | mov BASE, L:RB->top // Need the (realloced) L->top in BASE. |
| 527 | | jmp <3 | 528 | | jmp <3 |
| 528 | | | 529 | | |
| 530 | |->vm_unwind_yield: | ||
| 531 | | mov al, LUA_YIELD | ||
| 532 | | jmp ->vm_unwind_c_eh | ||
| 533 | | | ||
| 529 | |->vm_unwind_c@8: // Unwind C stack, return from vm_pcall. | 534 | |->vm_unwind_c@8: // Unwind C stack, return from vm_pcall. |
| 530 | | // (void *cframe, int errcode) | 535 | | // (void *cframe, int errcode) |
| 531 | |.if X64 | 536 | |.if X64 |
