aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2021-09-20 14:36:52 +0200
committerMike Pall <mike>2021-09-20 14:36:52 +0200
commit68ffbd318b331b988c32ecfdeee965e9683889f4 (patch)
treef8a2d4c001e975c34208b4faf5e522a99ed6f53d /src
parenta622e2eb559c823d90c7af85935ca63706e4593d (diff)
downloadluajit-68ffbd318b331b988c32ecfdeee965e9683889f4.tar.gz
luajit-68ffbd318b331b988c32ecfdeee965e9683889f4.tar.bz2
luajit-68ffbd318b331b988c32ecfdeee965e9683889f4.zip
FFI: Don't load PC from non-function object in FFI continuation.
Reported by Yichun Zhang. #743
Diffstat (limited to 'src')
-rw-r--r--src/vm_arm.dasc2
-rw-r--r--src/vm_mips.dasc2
-rw-r--r--src/vm_ppc.dasc2
3 files changed, 3 insertions, 3 deletions
diff --git a/src/vm_arm.dasc b/src/vm_arm.dasc
index 21d706d8..344147e8 100644
--- a/src/vm_arm.dasc
+++ b/src/vm_arm.dasc
@@ -524,13 +524,13 @@ static void build_subroutines(BuildCtx *ctx)
524 | cmp CARG1, #1 524 | cmp CARG1, #1
525 |.endif 525 |.endif
526 | ldr PC, [CARG4, #-12] // Restore PC from [cont|PC]. 526 | ldr PC, [CARG4, #-12] // Restore PC from [cont|PC].
527 | ldr CARG3, LFUNC:CARG3->field_pc
528 | mvn INS, #~LJ_TNIL 527 | mvn INS, #~LJ_TNIL
529 | add CARG2, RA, RC 528 | add CARG2, RA, RC
530 | str INS, [CARG2, #-4] // Ensure one valid arg. 529 | str INS, [CARG2, #-4] // Ensure one valid arg.
531 |.if FFI 530 |.if FFI
532 | bls >1 531 | bls >1
533 |.endif 532 |.endif
533 | ldr CARG3, LFUNC:CARG3->field_pc
534 | ldr KBASE, [CARG3, #PC2PROTO(k)] 534 | ldr KBASE, [CARG3, #PC2PROTO(k)]
535 | // BASE = base, RA = resultptr, CARG4 = meta base 535 | // BASE = base, RA = resultptr, CARG4 = meta base
536 | bx CARG1 536 | bx CARG1
diff --git a/src/vm_mips.dasc b/src/vm_mips.dasc
index 8cb4bd3d..03a84985 100644
--- a/src/vm_mips.dasc
+++ b/src/vm_mips.dasc
@@ -603,11 +603,11 @@ static void build_subroutines(BuildCtx *ctx)
603 |.endif 603 |.endif
604 | lw PC, -16+HI(RB) // Restore PC from [cont|PC]. 604 | lw PC, -16+HI(RB) // Restore PC from [cont|PC].
605 | addu TMP2, RA, RD 605 | addu TMP2, RA, RD
606 | lw TMP1, LFUNC:TMP1->pc
607 |.if FFI 606 |.if FFI
608 | bnez AT, >1 607 | bnez AT, >1
609 |.endif 608 |.endif
610 |. sw TISNIL, -8+HI(TMP2) // Ensure one valid arg. 609 |. sw TISNIL, -8+HI(TMP2) // Ensure one valid arg.
610 | lw TMP1, LFUNC:TMP1->pc
611 | // BASE = base, RA = resultptr, RB = meta base 611 | // BASE = base, RA = resultptr, RB = meta base
612 | jr TMP0 // Jump to continuation. 612 | jr TMP0 // Jump to continuation.
613 |. lw KBASE, PC2PROTO(k)(TMP1) 613 |. lw KBASE, PC2PROTO(k)(TMP1)
diff --git a/src/vm_ppc.dasc b/src/vm_ppc.dasc
index e2d62e00..9c1cc36f 100644
--- a/src/vm_ppc.dasc
+++ b/src/vm_ppc.dasc
@@ -819,11 +819,11 @@ static void build_subroutines(BuildCtx *ctx)
819 |.endif 819 |.endif
820 | lwz PC, -16(RB) // Restore PC from [cont|PC]. 820 | lwz PC, -16(RB) // Restore PC from [cont|PC].
821 | subi TMP2, RD, 8 821 | subi TMP2, RD, 8
822 | lwz TMP1, LFUNC:TMP1->pc
823 | stwx TISNIL, RA, TMP2 // Ensure one valid arg. 822 | stwx TISNIL, RA, TMP2 // Ensure one valid arg.
824 |.if FFI 823 |.if FFI
825 | ble >1 824 | ble >1
826 |.endif 825 |.endif
826 | lwz TMP1, LFUNC:TMP1->pc
827 | lwz KBASE, PC2PROTO(k)(TMP1) 827 | lwz KBASE, PC2PROTO(k)(TMP1)
828 | // BASE = base, RA = resultptr, RB = meta base 828 | // BASE = base, RA = resultptr, RB = meta base
829 | mtctr TMP0 829 | mtctr TMP0