diff options
author | Mike Pall <mike> | 2021-09-20 14:39:26 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2021-09-20 14:39:26 +0200 |
commit | 003f68565d2f06b2ad2029db002e393d020c034c (patch) | |
tree | 9a76e6e1ea49459f91f4714ce8a6374b3835f43b | |
parent | 98b7d9a3b2a18175a7c60ef6e53f47dec918e856 (diff) | |
download | luajit-003f68565d2f06b2ad2029db002e393d020c034c.tar.gz luajit-003f68565d2f06b2ad2029db002e393d020c034c.tar.bz2 luajit-003f68565d2f06b2ad2029db002e393d020c034c.zip |
FFI: Don't load PC from non-function object in FFI continuation.
Reported by Yichun Zhang. #743
Diffstat (limited to '')
-rw-r--r-- | src/vm_arm64.dasc | 2 | ||||
-rw-r--r-- | src/vm_mips64.dasc | 2 |
2 files changed, 2 insertions, 2 deletions
diff --git a/src/vm_arm64.dasc b/src/vm_arm64.dasc index 1abc6ecc..304e4544 100644 --- a/src/vm_arm64.dasc +++ b/src/vm_arm64.dasc | |||
@@ -562,12 +562,12 @@ static void build_subroutines(BuildCtx *ctx) | |||
562 | | cmp CARG1, #1 | 562 | | cmp CARG1, #1 |
563 | |.endif | 563 | |.endif |
564 | | ldr PC, [CARG4, #-24] // Restore PC from [cont|PC]. | 564 | | ldr PC, [CARG4, #-24] // Restore PC from [cont|PC]. |
565 | | ldr CARG3, LFUNC:CARG3->pc | ||
566 | | add TMP0, RA, RC | 565 | | add TMP0, RA, RC |
567 | | str TISNIL, [TMP0, #-8] // Ensure one valid arg. | 566 | | str TISNIL, [TMP0, #-8] // Ensure one valid arg. |
568 | |.if FFI | 567 | |.if FFI |
569 | | bls >1 | 568 | | bls >1 |
570 | |.endif | 569 | |.endif |
570 | | ldr CARG3, LFUNC:CARG3->pc | ||
571 | | ldr KBASE, [CARG3, #PC2PROTO(k)] | 571 | | ldr KBASE, [CARG3, #PC2PROTO(k)] |
572 | | // BASE = base, RA = resultptr, CARG4 = meta base | 572 | | // BASE = base, RA = resultptr, CARG4 = meta base |
573 | | br CARG1 | 573 | | br CARG1 |
diff --git a/src/vm_mips64.dasc b/src/vm_mips64.dasc index 5c5d761c..4ddb2f9c 100644 --- a/src/vm_mips64.dasc +++ b/src/vm_mips64.dasc | |||
@@ -728,11 +728,11 @@ static void build_subroutines(BuildCtx *ctx) | |||
728 | | ld PC, -24(RB) // Restore PC from [cont|PC]. | 728 | | ld PC, -24(RB) // Restore PC from [cont|PC]. |
729 | | cleartp LFUNC:TMP1 | 729 | | cleartp LFUNC:TMP1 |
730 | | daddu TMP2, RA, RD | 730 | | daddu TMP2, RA, RD |
731 | | ld TMP1, LFUNC:TMP1->pc | ||
732 | |.if FFI | 731 | |.if FFI |
733 | | bnez AT, >1 | 732 | | bnez AT, >1 |
734 | |.endif | 733 | |.endif |
735 | |. sd TISNIL, -8(TMP2) // Ensure one valid arg. | 734 | |. sd TISNIL, -8(TMP2) // Ensure one valid arg. |
735 | | ld TMP1, LFUNC:TMP1->pc | ||
736 | | // BASE = base, RA = resultptr, RB = meta base | 736 | | // BASE = base, RA = resultptr, RB = meta base |
737 | | jr TMP0 // Jump to continuation. | 737 | | jr TMP0 // Jump to continuation. |
738 | |. ld KBASE, PC2PROTO(k)(TMP1) | 738 | |. ld KBASE, PC2PROTO(k)(TMP1) |