1 #include <objc/encoding.h>
4 void print_ivars (Class class)
6 struct objc_ivar_list* ivars = class->ivars;
9 for (i = 0; i < ivars->ivar_count; i++) {
10 struct objc_ivar *ivar = &(ivars->ivar_list[i]);
11 printf ("ivar '%s', type '%s', offset %d\n",
12 ivar->ivar_name, ivar->ivar_type, ivar->ivar_offset);
16 void compare_structures (Class class, const char* type)
18 struct objc_struct_layout layout;
19 struct objc_ivar_list* ivars = class->ivars;
23 objc_layout_structure (type, &layout);
25 while (objc_layout_structure_next_member (&layout))
27 struct objc_ivar *ivar;
28 const char *ivar_type;
30 if (i > ivars->ivar_count)
32 printf ("too many ivars in type %s, layout = %s\n",
37 ivar = &(ivars->ivar_list[i]);
38 objc_layout_structure_get_info (&layout, &position, NULL, &ivar_type);
39 printf ("real ivar '%s' offset %d\n",
40 ivar->ivar_name, ivar->ivar_offset);
41 printf ("computed type '%s' offset %d\n", ivar_type, position);
42 if (position != ivar->ivar_offset)
44 printf ("offset %d and computed position %d don't match on ivar '%s'"
46 ivar->ivar_offset, position, ivar->ivar_name, i);
52 printf ("%d ivars checked\n", i);
62 Class class = [MyObject class];
64 printf ("type = %s\n", @encode (struct class_vars));
67 compare_structures (class, @encode(struct class_vars));
68 if ((size1 = objc_sizeof_type (@encode(struct class_vars)))
69 != (size2 = sizeof (struct class_vars)))
71 printf ("sizes don't match (computed %d, exact %d)\n", size1, size2);