aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2012-10-09 13:19:57 +0200
committerMike Pall <mike>2012-10-09 13:19:57 +0200
commiteabfdfe1aa3b4b9c37b99137e6d5fb7cadbd47e9 (patch)
treeb7cf8922d69daedd5d5733214a77439c8986f570 /src
parentda682b0e9184d4db7e8e477c682947d106790240 (diff)
downloadluajit-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.c13
-rw-r--r--src/vm_arm.dasc8
-rw-r--r--src/vm_mips.dasc4
-rw-r--r--src/vm_ppc.dasc11
-rw-r--r--src/vm_ppcspe.dasc11
-rw-r--r--src/vm_x86.dasc5
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