diff options
Diffstat (limited to 'src/lj_frame.h')
-rw-r--r-- | src/lj_frame.h | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/src/lj_frame.h b/src/lj_frame.h index 1c03e3e1..14d640cd 100644 --- a/src/lj_frame.h +++ b/src/lj_frame.h | |||
@@ -58,12 +58,28 @@ enum { | |||
58 | 58 | ||
59 | /* These definitions must match with the arch-specific *.dasc files. */ | 59 | /* These definitions must match with the arch-specific *.dasc files. */ |
60 | #if LJ_TARGET_X86 | 60 | #if LJ_TARGET_X86 |
61 | #define CFRAME_OFS_ERRF (15*sizeof(void *)) | 61 | #define CFRAME_OFS_ERRF (15*4) |
62 | #define CFRAME_OFS_NRES (14*sizeof(void *)) | 62 | #define CFRAME_OFS_NRES (14*4) |
63 | #define CFRAME_OFS_PREV (13*sizeof(void *)) | 63 | #define CFRAME_OFS_PREV (13*4) |
64 | #define CFRAME_OFS_L (12*sizeof(void *)) | 64 | #define CFRAME_OFS_L (12*4) |
65 | #define CFRAME_OFS_PC (6*sizeof(void *)) | 65 | #define CFRAME_OFS_PC (6*4) |
66 | #define CFRAME_SIZE (12*sizeof(void *)) | 66 | #define CFRAME_SIZE (12*4) |
67 | #elif LJ_TARGET_X64 | ||
68 | #if _WIN64 | ||
69 | #define CFRAME_OFS_ERRF (23*4) | ||
70 | #define CFRAME_OFS_NRES (22*4) | ||
71 | #define CFRAME_OFS_PREV (13*8) | ||
72 | #define CFRAME_OFS_L (24*4) | ||
73 | #define CFRAME_OFS_PC (25*4) | ||
74 | #define CFRAME_SIZE (10*8) | ||
75 | #else | ||
76 | #define CFRAME_OFS_ERRF (3*4) | ||
77 | #define CFRAME_OFS_NRES (2*4) | ||
78 | #define CFRAME_OFS_PREV (4*8) | ||
79 | #define CFRAME_OFS_L (4*4) | ||
80 | #define CFRAME_OFS_PC (5*4) | ||
81 | #define CFRAME_SIZE (10*8) | ||
82 | #endif | ||
67 | #else | 83 | #else |
68 | #error "Missing CFRAME_* definitions for this architecture" | 84 | #error "Missing CFRAME_* definitions for this architecture" |
69 | #endif | 85 | #endif |
@@ -72,11 +88,15 @@ enum { | |||
72 | #define CFRAME_CANYIELD ((intptr_t)(CFRAME_RESUME)) | 88 | #define CFRAME_CANYIELD ((intptr_t)(CFRAME_RESUME)) |
73 | #define CFRAME_RAWMASK (~CFRAME_CANYIELD) | 89 | #define CFRAME_RAWMASK (~CFRAME_CANYIELD) |
74 | 90 | ||
75 | #define cframe_errfunc(cf) (*(ptrdiff_t *)(((char *)cf)+CFRAME_OFS_ERRF)) | 91 | #define cframe_errfunc(cf) (*(int32_t *)(((char *)(cf))+CFRAME_OFS_ERRF)) |
76 | #define cframe_nres(cf) (*(ptrdiff_t *)(((char *)cf)+CFRAME_OFS_NRES)) | 92 | #define cframe_nres(cf) (*(int32_t *)(((char *)(cf))+CFRAME_OFS_NRES)) |
77 | #define cframe_prev(cf) (*(void **)(((char *)cf)+CFRAME_OFS_PREV)) | 93 | #define cframe_prev(cf) (*(void **)(((char *)(cf))+CFRAME_OFS_PREV)) |
78 | #define cframe_L(cf) (*(lua_State **)(((char *)cf)+CFRAME_OFS_L)) | 94 | #define cframe_L(cf) \ |
79 | #define cframe_pc(cf) (*(const BCIns **)(((char *)cf)+CFRAME_OFS_PC)) | 95 | (&gcref(*(GCRef *)(((char *)(cf))+CFRAME_OFS_L))->th) |
96 | #define cframe_pc(cf) \ | ||
97 | (mref(*(MRef *)(((char *)(cf))+CFRAME_OFS_PC), const BCIns)) | ||
98 | #define setcframe_pc(cf, pc) \ | ||
99 | (setmref(*(MRef *)(((char *)(cf))+CFRAME_OFS_PC), (pc))) | ||
80 | #define cframe_canyield(cf) ((intptr_t)(cf) & CFRAME_CANYIELD) | 100 | #define cframe_canyield(cf) ((intptr_t)(cf) & CFRAME_CANYIELD) |
81 | #define cframe_raw(cf) ((void *)((intptr_t)(cf) & CFRAME_RAWMASK)) | 101 | #define cframe_raw(cf) ((void *)((intptr_t)(cf) & CFRAME_RAWMASK)) |
82 | #define cframe_Lpc(L) cframe_pc(cframe_raw(L->cframe)) | 102 | #define cframe_Lpc(L) cframe_pc(cframe_raw(L->cframe)) |