static value compare_with_stack()

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);
  }
}