static Scheme_Object *unsafe_struct_ref (int argc, Scheme_Object *argv[]) { if (SCHEME_CHAPERONEP(argv[0])) return scheme_struct_ref(argv[0], SCHEME_INT_VAL(argv[1])); else return ((Scheme_Structure *)argv[0])->slots[SCHEME_INT_VAL(argv[1])]; }
int struct_equal (Scheme_Object *s1, Scheme_Object *orig_s1, Scheme_Object *s2, Scheme_Object *orig_s2, Equal_Info *eql) { Scheme_Object *v1, *v2; int i; for (i = SCHEME_STRUCT_NUM_SLOTS(((Scheme_Structure *)s1)); i--; ) { if (SAME_OBJ(s1, orig_s1)) v1 = ((Scheme_Structure *)s1)->slots[i]; else v1 = scheme_struct_ref(orig_s1, i); if (SAME_OBJ(s2, orig_s2)) v2 = ((Scheme_Structure *)s2)->slots[i]; else v2 = scheme_struct_ref(orig_s2, i); if (!is_equal(v1, v2, eql)) return 0; } return 1; }