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 |