aboutsummaryrefslogtreecommitdiff
path: root/ltablib.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2024-07-27 15:13:21 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2024-07-27 15:13:21 -0300
commitf2206b2abe848f65956fa48da338c2bfac599e4a (patch)
tree94c1a856ec06846ad7485648ccafb429b5ca1b9b /ltablib.c
parent0acd55898d0aaae8dbc14c8a1bc1e3bdffc8701b (diff)
downloadlua-f2206b2abe848f65956fa48da338c2bfac599e4a.tar.gz
lua-f2206b2abe848f65956fa48da338c2bfac599e4a.tar.bz2
lua-f2206b2abe848f65956fa48da338c2bfac599e4a.zip
'-Wconversion' extended to all options of Lua numbers
Diffstat (limited to 'ltablib.c')
-rw-r--r--ltablib.c32
1 files changed, 20 insertions, 12 deletions
diff --git a/ltablib.c b/ltablib.c
index 538d585d..4db3768a 100644
--- a/ltablib.c
+++ b/ltablib.c
@@ -231,10 +231,18 @@ static int tunpack (lua_State *L) {
231*/ 231*/
232 232
233 233
234/* type for array indices */ 234/*
235** Type for array indices. These indices are always limited by INT_MAX,
236** so it is safe to cast them to lua_Integer even for Lua 32 bits.
237*/
235typedef unsigned int IdxT; 238typedef unsigned int IdxT;
236 239
237 240
241/* Versions of lua_seti/lua_geti specialized for IdxT */
242#define geti(L,idt,idx) lua_geti(L, idt, l_castU2S(idx))
243#define seti(L,idt,idx) lua_seti(L, idt, l_castU2S(idx))
244
245
238/* 246/*
239** Produce a "random" 'unsigned int' to randomize pivot choice. This 247** Produce a "random" 'unsigned int' to randomize pivot choice. This
240** macro is used only when 'sort' detects a big imbalance in the result 248** macro is used only when 'sort' detects a big imbalance in the result
@@ -251,8 +259,8 @@ typedef unsigned int IdxT;
251 259
252 260
253static void set2 (lua_State *L, IdxT i, IdxT j) { 261static void set2 (lua_State *L, IdxT i, IdxT j) {
254 lua_seti(L, 1, i); 262 seti(L, 1, i);
255 lua_seti(L, 1, j); 263 seti(L, 1, j);
256} 264}
257 265
258 266
@@ -289,14 +297,14 @@ static IdxT partition (lua_State *L, IdxT lo, IdxT up) {
289 /* loop invariant: a[lo .. i] <= P <= a[j .. up] */ 297 /* loop invariant: a[lo .. i] <= P <= a[j .. up] */
290 for (;;) { 298 for (;;) {
291 /* next loop: repeat ++i while a[i] < P */ 299 /* next loop: repeat ++i while a[i] < P */
292 while ((void)lua_geti(L, 1, ++i), sort_comp(L, -1, -2)) { 300 while ((void)geti(L, 1, ++i), sort_comp(L, -1, -2)) {
293 if (l_unlikely(i == up - 1)) /* a[i] < P but a[up - 1] == P ?? */ 301 if (l_unlikely(i == up - 1)) /* a[i] < P but a[up - 1] == P ?? */
294 luaL_error(L, "invalid order function for sorting"); 302 luaL_error(L, "invalid order function for sorting");
295 lua_pop(L, 1); /* remove a[i] */ 303 lua_pop(L, 1); /* remove a[i] */
296 } 304 }
297 /* after the loop, a[i] >= P and a[lo .. i - 1] < P */ 305 /* after the loop, a[i] >= P and a[lo .. i - 1] < P */
298 /* next loop: repeat --j while P < a[j] */ 306 /* next loop: repeat --j while P < a[j] */
299 while ((void)lua_geti(L, 1, --j), sort_comp(L, -3, -1)) { 307 while ((void)geti(L, 1, --j), sort_comp(L, -3, -1)) {
300 if (l_unlikely(j < i)) /* j < i but a[j] > P ?? */ 308 if (l_unlikely(j < i)) /* j < i but a[j] > P ?? */
301 luaL_error(L, "invalid order function for sorting"); 309 luaL_error(L, "invalid order function for sorting");
302 lua_pop(L, 1); /* remove a[j] */ 310 lua_pop(L, 1); /* remove a[j] */
@@ -335,8 +343,8 @@ static void auxsort (lua_State *L, IdxT lo, IdxT up, unsigned rnd) {
335 IdxT p; /* Pivot index */ 343 IdxT p; /* Pivot index */
336 IdxT n; /* to be used later */ 344 IdxT n; /* to be used later */
337 /* sort elements 'lo', 'p', and 'up' */ 345 /* sort elements 'lo', 'p', and 'up' */
338 lua_geti(L, 1, lo); 346 geti(L, 1, lo);
339 lua_geti(L, 1, up); 347 geti(L, 1, up);
340 if (sort_comp(L, -1, -2)) /* a[up] < a[lo]? */ 348 if (sort_comp(L, -1, -2)) /* a[up] < a[lo]? */
341 set2(L, lo, up); /* swap a[lo] - a[up] */ 349 set2(L, lo, up); /* swap a[lo] - a[up] */
342 else 350 else
@@ -347,13 +355,13 @@ static void auxsort (lua_State *L, IdxT lo, IdxT up, unsigned rnd) {
347 p = (lo + up)/2; /* middle element is a good pivot */ 355 p = (lo + up)/2; /* middle element is a good pivot */
348 else /* for larger intervals, it is worth a random pivot */ 356 else /* for larger intervals, it is worth a random pivot */
349 p = choosePivot(lo, up, rnd); 357 p = choosePivot(lo, up, rnd);
350 lua_geti(L, 1, p); 358 geti(L, 1, p);
351 lua_geti(L, 1, lo); 359 geti(L, 1, lo);
352 if (sort_comp(L, -2, -1)) /* a[p] < a[lo]? */ 360 if (sort_comp(L, -2, -1)) /* a[p] < a[lo]? */
353 set2(L, p, lo); /* swap a[p] - a[lo] */ 361 set2(L, p, lo); /* swap a[p] - a[lo] */
354 else { 362 else {
355 lua_pop(L, 1); /* remove a[lo] */ 363 lua_pop(L, 1); /* remove a[lo] */
356 lua_geti(L, 1, up); 364 geti(L, 1, up);
357 if (sort_comp(L, -1, -2)) /* a[up] < a[p]? */ 365 if (sort_comp(L, -1, -2)) /* a[up] < a[p]? */
358 set2(L, p, up); /* swap a[up] - a[p] */ 366 set2(L, p, up); /* swap a[up] - a[p] */
359 else 367 else
@@ -361,9 +369,9 @@ static void auxsort (lua_State *L, IdxT lo, IdxT up, unsigned rnd) {
361 } 369 }
362 if (up - lo == 2) /* only 3 elements? */ 370 if (up - lo == 2) /* only 3 elements? */
363 return; /* already sorted */ 371 return; /* already sorted */
364 lua_geti(L, 1, p); /* get middle element (Pivot) */ 372 geti(L, 1, p); /* get middle element (Pivot) */
365 lua_pushvalue(L, -1); /* push Pivot */ 373 lua_pushvalue(L, -1); /* push Pivot */
366 lua_geti(L, 1, up - 1); /* push a[up - 1] */ 374 geti(L, 1, up - 1); /* push a[up - 1] */
367 set2(L, p, up - 1); /* swap Pivot (a[p]) with a[up - 1] */ 375 set2(L, p, up - 1); /* swap Pivot (a[p]) with a[up - 1] */
368 p = partition(L, lo, up); 376 p = partition(L, lo, up);
369 /* a[lo .. p - 1] <= a[p] == P <= a[p + 1 .. up] */ 377 /* a[lo .. p - 1] <= a[p] == P <= a[p + 1 .. up] */