d636ae0b80
* lib/{objc.exp,objc-torture.exp}: New files for objc testing harness. * objc: ObjC testsuite. From-SVN: r22198
77 lines
1.9 KiB
C
77 lines
1.9 KiB
C
#include <objc/encoding.h>
|
|
|
|
|
|
void print_ivars (Class class)
|
|
{
|
|
struct objc_ivar_list* ivars = class->ivars;
|
|
int i;
|
|
|
|
for (i = 0; i < ivars->ivar_count; i++) {
|
|
struct objc_ivar *ivar = &(ivars->ivar_list[i]);
|
|
printf ("ivar '%s', type '%s', offset %d\n",
|
|
ivar->ivar_name, ivar->ivar_type, ivar->ivar_offset);
|
|
}
|
|
}
|
|
|
|
void compare_structures (Class class, const char* type)
|
|
{
|
|
struct objc_struct_layout layout;
|
|
struct objc_ivar_list* ivars = class->ivars;
|
|
int i = 0;
|
|
int position;
|
|
|
|
objc_layout_structure (type, &layout);
|
|
|
|
while (objc_layout_structure_next_member (&layout))
|
|
{
|
|
struct objc_ivar *ivar;
|
|
const char *ivar_type;
|
|
|
|
if (i > ivars->ivar_count)
|
|
{
|
|
printf ("too many ivars in type %s, layout = %s\n",
|
|
type, layout.type);
|
|
exit (1);
|
|
}
|
|
|
|
ivar = &(ivars->ivar_list[i]);
|
|
objc_layout_structure_get_info (&layout, &position, NULL, &ivar_type);
|
|
printf ("real ivar '%s' offset %d\n",
|
|
ivar->ivar_name, ivar->ivar_offset);
|
|
printf ("computed type '%s' offset %d\n", ivar_type, position);
|
|
if (position != ivar->ivar_offset)
|
|
{
|
|
printf ("offset %d and computed position %d don't match on ivar '%s'"
|
|
" (i = %d)\n",
|
|
ivar->ivar_offset, position, ivar->ivar_name, i);
|
|
exit (1);
|
|
}
|
|
i++;
|
|
}
|
|
|
|
printf ("%d ivars checked\n", i);
|
|
}
|
|
|
|
int main ()
|
|
{
|
|
struct class_vars
|
|
{
|
|
@defs (MyObject);
|
|
};
|
|
int size1, size2;
|
|
Class class = [MyObject class];
|
|
|
|
printf ("type = %s\n", @encode (struct class_vars));
|
|
print_ivars (class);
|
|
|
|
compare_structures (class, @encode(struct class_vars));
|
|
if ((size1 = objc_sizeof_type (@encode(struct class_vars)))
|
|
!= (size2 = sizeof (struct class_vars)))
|
|
{
|
|
printf ("sizes don't match (computed %d, exact %d)\n", size1, size2);
|
|
abort ();
|
|
}
|
|
|
|
exit (0);
|
|
}
|