Skip to content

Commit 309deaa

Browse files
committed
Merge branch 'maint'
* maint: erts: fix term ordering of multi-field native records erts: fix term ordering of multi-field native records
2 parents 1868de6 + 54c0547 commit 309deaa

2 files changed

Lines changed: 25 additions & 0 deletions

File tree

erts/emulator/beam/utils.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2717,6 +2717,7 @@ Sint erts_cmp_compound(Eterm a, Eterm b, int exact, int eq_only)
27172717

27182718
case RECORD_VALUE_PAIR:
27192719
a = (Eterm)WSTACK_POP(stack);
2720+
b = (Eterm)WSTACK_POP(stack);
27202721
goto tailrecur_ne;
27212722

27222723
default:

erts/emulator/test/native_record_SUITE.erl

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ term_order(_Config) ->
160160
term_order_num_fields(),
161161
term_order_keys(),
162162
term_order_values(),
163+
term_order_fields(),
163164

164165
ok.
165166

@@ -245,6 +246,29 @@ term_order_values() ->
245246
fake_record(r, false, [{b,{10}}, {a,{5}}])),
246247
ok.
247248

249+
%% Records that only differ in a non-first field.
250+
term_order_fields() ->
251+
%% 2-field record, difference in second field.
252+
true = is_lt(id(#bb{a=1, b=2}), id(#bb{a=1, b=3})),
253+
254+
%% 3-field record, difference in middle field.
255+
true = is_lt(id(#b{x=1, y=1, z=1}), id(#b{x=1, y=2, z=1})),
256+
257+
%% 3-field record, difference in last field.
258+
true = is_lt(id(#b{x=1, y=1, z=1}), id(#b{x=1, y=1, z=2})),
259+
260+
%% Multiple differing fields where the first sorted field is equal
261+
%% (exercises the push-multiple path in the value comparator).
262+
true = is_lt(id(#b{x=1, y=1, z=1}), id(#b{x=1, y=2, z=2})),
263+
264+
%% lists:sort/1 uses term order under the hood.
265+
L0 = [id(#b{x=1, y=3, z=1}),
266+
id(#b{x=1, y=1, z=1}),
267+
id(#b{x=1, y=2, z=1})],
268+
[#b{y=1}, #b{y=2}, #b{y=3}] = lists:sort(L0),
269+
270+
ok.
271+
248272
is_gt(A, B) ->
249273
Res = id(A > B),
250274
Res = id(B < A),

0 commit comments

Comments
 (0)