Commit 1672bdc
x64: Fix __call metamethod return dispatch.
After linking new cframe to the chain KBASEa still stores the address of
the previous one. If the execution proceeds to <lj_vmeta_call> KBASE
value (i.e. low 32 bits of the stored address) might be equal to the
current BASE address value so the execution takes the invalid path. Such
address parts clashing occurs only on x86_64 platform with disabled
LJ_GC64, so 64-bit registers have to be compared in x64 build.
NB: Though there is only 32-bit load to restore BASE value prior to the
comparison, the high 32 bits of RDX are reset to zeros, according to x86
long mode semantics.
Igor Munkin:
* backported the original patch to tarantool/luajit repo
* extended the original commit message with the rationale
For more info and explanation see LuaJIT#636.
Relates to tarantool/tarantool#4518
Relates to tarantool/tarantool#4649
Reviewed-by: Sergey Kaplun <[email protected]>
Reviewed-by: Sergey Ostanevich <[email protected]>
Signed-off-by: Igor Munkin <[email protected]>1 parent 8fc103f commit 1672bdc
1 file changed
+4
-0
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1374 | 1374 | | |
1375 | 1375 | | |
1376 | 1376 | | |
| 1377 | + | |
| 1378 | + | |
| 1379 | + | |
1377 | 1380 | | |
| 1381 | + | |
1378 | 1382 | | |
1379 | 1383 | | |
1380 | 1384 | | |
| |||
0 commit comments