Browse Source

Fix return from pcall within active hook.

Mike Pall 15 years ago
parent
commit
be19218a6c
4 changed files with 1796 additions and 1785 deletions
  1. 670 668
      src/buildvm_x64.h
  2. 676 674
      src/buildvm_x64win.h
  3. 14 8
      src/buildvm_x86.dasc
  4. 436 435
      src/buildvm_x86.h

File diff suppressed because it is too large
+ 670 - 668
src/buildvm_x64.h


File diff suppressed because it is too large
+ 676 - 674
src/buildvm_x64win.h


+ 14 - 8
src/buildvm_x86.dasc

@@ -437,8 +437,9 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
   |
   |
   |->vm_return:
   |->vm_return:
   |  // BASE = base, RA = resultofs, RD = nresults+1 (= MULTRES), PC = return
   |  // BASE = base, RA = resultofs, RD = nresults+1 (= MULTRES), PC = return
-  |  test PC, FRAME_C
-  |  jz ->vm_returnp
+  |  xor PC, FRAME_C
+  |  test PC, FRAME_TYPE
+  |  jnz ->vm_returnp
   |
   |
   |  // Return to C.
   |  // Return to C.
   |  set_vmstate C
   |  set_vmstate C
@@ -4412,12 +4413,16 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
     |  jmp <4
     |  jmp <4
     |
     |
     |7:  // Tailcall from a vararg function.
     |7:  // Tailcall from a vararg function.
-    |  jnp <1				// Vararg frame below?
-    |  and PC, -8
+    |  sub PC, FRAME_VARG
+    |  test PC, FRAME_TYPEP
+    |  jnz >8				// Vararg frame below?
     |  sub BASE, PC			// Need to relocate BASE/KBASE down.
     |  sub BASE, PC			// Need to relocate BASE/KBASE down.
     |  mov KBASE, BASE
     |  mov KBASE, BASE
     |  mov PC, [BASE-4]
     |  mov PC, [BASE-4]
     |  jmp <1
     |  jmp <1
+    |8:
+    |  add PC, FRAME_VARG
+    |  jmp <1
     break;
     break;
 
 
   case BC_ITERC:
   case BC_ITERC:
@@ -4587,12 +4592,13 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse)
     |  jmp <5
     |  jmp <5
     |
     |
     |7:  // Non-standard return case.
     |7:  // Non-standard return case.
-    |  jnp ->vm_return
+    |  lea RB, [PC-FRAME_VARG]
+    |  test RB, FRAME_TYPEP
+    |  jnz ->vm_return
     |  // Return from vararg function: relocate BASE down and RA up.
     |  // Return from vararg function: relocate BASE down and RA up.
-    |  and PC, -8
-    |  sub BASE, PC
+    |  sub BASE, RB
     if (op != BC_RET0) {
     if (op != BC_RET0) {
-      |  add RA, PC
+      |  add RA, RB
     }
     }
     |  jmp <1
     |  jmp <1
     break;
     break;

File diff suppressed because it is too large
+ 436 - 435
src/buildvm_x86.h


Some files were not shown because too many files changed in this diff