aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2020-05-08 13:50:41 +0200
committerMike Pall <mike>2020-05-08 13:50:41 +0200
commitcc4bbec483d3f3250b519ccb7cc22f1a8e6fe6f0 (patch)
treed0194b811af58504b68e91f673e6e27852e82b5d
parent179cf2eb84fef2b9a524469c3c8cc49363b8fb10 (diff)
downloadluajit-cc4bbec483d3f3250b519ccb7cc22f1a8e6fe6f0.tar.gz
luajit-cc4bbec483d3f3250b519ccb7cc22f1a8e6fe6f0.tar.bz2
luajit-cc4bbec483d3f3250b519ccb7cc22f1a8e6fe6f0.zip
FFI: Always fall back to metamethods for cdata length/concat.
Thanks to Egor Skriptunoff.
-rw-r--r--src/lib_ffi.c2
-rw-r--r--src/lj_carith.c11
-rw-r--r--src/lj_carith.h1
-rw-r--r--src/lj_crecord.c6
4 files changed, 6 insertions, 14 deletions
diff --git a/src/lib_ffi.c b/src/lib_ffi.c
index 5851eea5..c7a26f56 100644
--- a/src/lib_ffi.c
+++ b/src/lib_ffi.c
@@ -193,7 +193,7 @@ LJLIB_CF(ffi_meta___eq) LJLIB_REC(cdata_arith MM_eq)
193 193
194LJLIB_CF(ffi_meta___len) LJLIB_REC(cdata_arith MM_len) 194LJLIB_CF(ffi_meta___len) LJLIB_REC(cdata_arith MM_len)
195{ 195{
196 return lj_carith_len(L); 196 return ffi_arith(L);
197} 197}
198 198
199LJLIB_CF(ffi_meta___lt) LJLIB_REC(cdata_arith MM_lt) 199LJLIB_CF(ffi_meta___lt) LJLIB_REC(cdata_arith MM_lt)
diff --git a/src/lj_carith.c b/src/lj_carith.c
index b33b1f36..530d5ddb 100644
--- a/src/lj_carith.c
+++ b/src/lj_carith.c
@@ -263,7 +263,7 @@ int lj_carith_op(lua_State *L, MMS mm)
263{ 263{
264 CTState *cts = ctype_cts(L); 264 CTState *cts = ctype_cts(L);
265 CDArith ca; 265 CDArith ca;
266 if (carith_checkarg(L, cts, &ca)) { 266 if (carith_checkarg(L, cts, &ca) && mm != MM_len && mm != MM_concat) {
267 if (carith_int64(L, cts, &ca, mm) || carith_ptr(L, cts, &ca, mm)) { 267 if (carith_int64(L, cts, &ca, mm) || carith_ptr(L, cts, &ca, mm)) {
268 copyTV(L, &G(L)->tmptv2, L->top-1); /* Remember for trace recorder. */ 268 copyTV(L, &G(L)->tmptv2, L->top-1); /* Remember for trace recorder. */
269 return 1; 269 return 1;
@@ -272,15 +272,6 @@ int lj_carith_op(lua_State *L, MMS mm)
272 return lj_carith_meta(L, cts, &ca, mm); 272 return lj_carith_meta(L, cts, &ca, mm);
273} 273}
274 274
275/* No built-in functionality for length of cdata. */
276int lj_carith_len(lua_State *L)
277{
278 CTState *cts = ctype_cts(L);
279 CDArith ca;
280 carith_checkarg(L, cts, &ca);
281 return lj_carith_meta(L, cts, &ca, MM_len);
282}
283
284/* -- 64 bit integer arithmetic helpers ----------------------------------- */ 275/* -- 64 bit integer arithmetic helpers ----------------------------------- */
285 276
286#if LJ_32 && LJ_HASJIT 277#if LJ_32 && LJ_HASJIT
diff --git a/src/lj_carith.h b/src/lj_carith.h
index bac3e1a4..207809df 100644
--- a/src/lj_carith.h
+++ b/src/lj_carith.h
@@ -11,7 +11,6 @@
11#if LJ_HASFFI 11#if LJ_HASFFI
12 12
13LJ_FUNC int lj_carith_op(lua_State *L, MMS mm); 13LJ_FUNC int lj_carith_op(lua_State *L, MMS mm);
14LJ_FUNC int lj_carith_len(lua_State *L);
15 14
16#if LJ_32 && LJ_HASJIT 15#if LJ_32 && LJ_HASJIT
17LJ_FUNC int64_t lj_carith_mul64(int64_t x, int64_t k); 16LJ_FUNC int64_t lj_carith_mul64(int64_t x, int64_t k);
diff --git a/src/lj_crecord.c b/src/lj_crecord.c
index 99344b79..6e3c36a1 100644
--- a/src/lj_crecord.c
+++ b/src/lj_crecord.c
@@ -1443,8 +1443,10 @@ void LJ_FASTCALL recff_cdata_arith(jit_State *J, RecordFFData *rd)
1443 } 1443 }
1444 { 1444 {
1445 TRef tr; 1445 TRef tr;
1446 if (!(tr = crec_arith_int64(J, sp, s, (MMS)rd->data)) && 1446 MMS mm = (MMS)rd->data;
1447 !(tr = crec_arith_ptr(J, sp, s, (MMS)rd->data)) && 1447 if ((mm == MM_len || mm == MM_concat ||
1448 (!(tr = crec_arith_int64(J, sp, s, mm)) &&
1449 !(tr = crec_arith_ptr(J, sp, s, mm)))) &&
1448 !(tr = crec_arith_meta(J, sp, s, cts, rd))) 1450 !(tr = crec_arith_meta(J, sp, s, cts, rd)))
1449 return; 1451 return;
1450 J->base[0] = tr; 1452 J->base[0] = tr;