int prim_IntInf_cmp(sml_intinf_t *x, sml_intinf_t *y) { ASSERT(OBJ_TYPE(x) == OBJTYPE_INTINF); ASSERT(OBJ_TYPE(y) == OBJTYPE_INTINF); return sml_intinf_cmp(x, y); }
SML_PRIMITIVE int sml_obj_equal(void *obj1, void *obj2) { unsigned int i, tag; unsigned int *bitmap1, *bitmap2; void **p1, **p2; if (obj1 == obj2) return 1; if (obj1 == NULL || obj2 == NULL) return 0; if (OBJ_SIZE(obj1) != OBJ_SIZE(obj2)) return 0; if (OBJ_TYPE(obj1) != OBJ_TYPE(obj2)) { if (OBJ_TYPE(obj1) == OBJTYPE_RECORD) { void *tmp = obj1; obj1 = obj2, obj2 = tmp; } else if (OBJ_TYPE(obj2) != OBJTYPE_RECORD) return 0; if (OBJ_TYPE(obj1) == OBJTYPE_UNBOXED_VECTOR) tag = TAG_UNBOXED; else if (OBJ_TYPE(obj1) == OBJTYPE_BOXED_VECTOR) tag = TAG_BOXED; else return 0; assert(OBJ_SIZE(obj2) % sizeof(void*) == 0); bitmap2 = OBJ_BITMAP(obj2); for (i = 0; i < OBJ_SIZE(obj2) / sizeof(void*); i++) { if (BITMAP_BIT(bitmap2, i) != tag) return 0; } } switch (OBJ_TYPE(obj1)) { case OBJTYPE_UNBOXED_ARRAY: case OBJTYPE_BOXED_ARRAY: return 0; case OBJTYPE_UNBOXED_VECTOR: return memcmp(obj1, obj2, OBJ_SIZE(obj1)) == 0; case OBJTYPE_BOXED_VECTOR: p1 = obj1; p2 = obj2; assert(OBJ_SIZE(obj1) % sizeof(void*) == 0); for (i = 0; i < OBJ_SIZE(obj1) / sizeof(void*); i++) { if (!sml_obj_equal(p1[i], p2[i])) return 0; } return 1; case OBJTYPE_INTINF: return sml_intinf_cmp((sml_intinf_t*)obj1, (sml_intinf_t*)obj2) == 0; case OBJTYPE_RECORD: bitmap1 = OBJ_BITMAP(obj1); bitmap2 = OBJ_BITMAP(obj2); p1 = obj1; p2 = obj2; assert(OBJ_NUM_BITMAPS(obj1) == OBJ_NUM_BITMAPS(obj2)); assert(OBJ_SIZE(obj1) % sizeof(void*) == 0); for (i = 0; i < OBJ_NUM_BITMAPS(obj1); i++) { if (bitmap1[i] != bitmap2[i]) return 0; } for (i = 0; i < OBJ_SIZE(obj1) / sizeof(void*); i++) { if (BITMAP_BIT(bitmap1, i) == TAG_UNBOXED) { if (p1[i] != p2[i]) return 0; } else { if (!sml_obj_equal(p1[i], p2[i])) return 0; } } return 1; default: sml_fatal(0, "BUG: invalid object type : %d", OBJ_TYPE(obj1)); } }