FFI: Don't load PC from non-function object in FFI continuation.

Reported by Yichun Zhang. #743
This commit is contained in:
Mike Pall 2021-09-20 14:36:52 +02:00
parent a622e2eb55
commit 68ffbd318b
3 changed files with 3 additions and 3 deletions

View File

@ -524,13 +524,13 @@ static void build_subroutines(BuildCtx *ctx)
| cmp CARG1, #1 | cmp CARG1, #1
|.endif |.endif
| ldr PC, [CARG4, #-12] // Restore PC from [cont|PC]. | ldr PC, [CARG4, #-12] // Restore PC from [cont|PC].
| ldr CARG3, LFUNC:CARG3->field_pc
| mvn INS, #~LJ_TNIL | mvn INS, #~LJ_TNIL
| add CARG2, RA, RC | add CARG2, RA, RC
| str INS, [CARG2, #-4] // Ensure one valid arg. | str INS, [CARG2, #-4] // Ensure one valid arg.
|.if FFI |.if FFI
| bls >1 | bls >1
|.endif |.endif
| ldr CARG3, LFUNC:CARG3->field_pc
| ldr KBASE, [CARG3, #PC2PROTO(k)] | ldr KBASE, [CARG3, #PC2PROTO(k)]
| // BASE = base, RA = resultptr, CARG4 = meta base | // BASE = base, RA = resultptr, CARG4 = meta base
| bx CARG1 | bx CARG1

View File

@ -603,11 +603,11 @@ static void build_subroutines(BuildCtx *ctx)
|.endif |.endif
| lw PC, -16+HI(RB) // Restore PC from [cont|PC]. | lw PC, -16+HI(RB) // Restore PC from [cont|PC].
| addu TMP2, RA, RD | addu TMP2, RA, RD
| lw TMP1, LFUNC:TMP1->pc
|.if FFI |.if FFI
| bnez AT, >1 | bnez AT, >1
|.endif |.endif
|. sw TISNIL, -8+HI(TMP2) // Ensure one valid arg. |. sw TISNIL, -8+HI(TMP2) // Ensure one valid arg.
| lw TMP1, LFUNC:TMP1->pc
| // BASE = base, RA = resultptr, RB = meta base | // BASE = base, RA = resultptr, RB = meta base
| jr TMP0 // Jump to continuation. | jr TMP0 // Jump to continuation.
|. lw KBASE, PC2PROTO(k)(TMP1) |. lw KBASE, PC2PROTO(k)(TMP1)

View File

@ -819,11 +819,11 @@ static void build_subroutines(BuildCtx *ctx)
|.endif |.endif
| lwz PC, -16(RB) // Restore PC from [cont|PC]. | lwz PC, -16(RB) // Restore PC from [cont|PC].
| subi TMP2, RD, 8 | subi TMP2, RD, 8
| lwz TMP1, LFUNC:TMP1->pc
| stwx TISNIL, RA, TMP2 // Ensure one valid arg. | stwx TISNIL, RA, TMP2 // Ensure one valid arg.
|.if FFI |.if FFI
| ble >1 | ble >1
|.endif |.endif
| lwz TMP1, LFUNC:TMP1->pc
| lwz KBASE, PC2PROTO(k)(TMP1) | lwz KBASE, PC2PROTO(k)(TMP1)
| // BASE = base, RA = resultptr, RB = meta base | // BASE = base, RA = resultptr, RB = meta base
| mtctr TMP0 | mtctr TMP0