in src/hack_forked/utils/core/fast_compare.c [153:192]
static value compare_with_stack(value v1, value v2, stack* stk, item* sp) {
while (1) {
if (v1 != v2) {
MAYBE_LONG_COMPARE(v1, v2);
tag_t t1 = Tag_val(v1);
tag_t t2 = Tag_val(v2);
SIMPLE_COMPARE(t1, t2);
switch (t1) {
case String_tag: {
STRING_VAL_COMPARE(v1, v2);
break;
}
case Double_tag: {
DOUBLE_VAL_COMPARE(v1, v2);
break;
}
default: {
mlsize_t sz1 = Wosize_val(v1);
mlsize_t sz2 = Wosize_val(v2);
// when tag is the same while
// size is different -- this seems only possible for array
// v1 != v2 && sz1 = sz2 = 0 && Tag(v1) = Tag(v2) holds, since Atom
// are preallocated
SIMPLE_COMPARE(sz1, sz2);
if (--sz1 > 0) {
sp++;
if (sp >= stk->limit)
resize_stack(stk, &sp);
PUSH_STACK(sp, v1, v2, sz1);
}
v1 = Field(v1, 0);
v2 = Field(v2, 0);
continue;
}
}
}
POP_STACK(sp, stk, v1, v2);
}
}