55 lines
942 B
C
55 lines
942 B
C
typedef __SIZE_TYPE__ size_t;
|
|
typedef const struct objc_selector
|
|
{
|
|
void *sel_id;
|
|
}
|
|
*SEL;
|
|
typedef struct objc_object
|
|
{
|
|
}
|
|
*id;
|
|
typedef struct objc_class *Class;
|
|
struct objc_class
|
|
{
|
|
struct sarray *dtable;
|
|
};
|
|
typedef size_t sidx;
|
|
struct soffset
|
|
{
|
|
unsigned int boffset:(sizeof (size_t) * 8) / 2;
|
|
unsigned int eoffset:(sizeof (size_t) * 8) / 2;
|
|
};
|
|
union sofftype
|
|
{
|
|
struct soffset off;
|
|
sidx idx;
|
|
};
|
|
struct sarray
|
|
{
|
|
size_t capacity;
|
|
};
|
|
static __inline__ unsigned int
|
|
soffset_decode (sidx indx)
|
|
{
|
|
union sofftype x;
|
|
x.idx = indx;
|
|
return x.off.eoffset + (x.off.boffset * (1 << 5));
|
|
}
|
|
static __inline__ void *
|
|
sarray_get_safe (struct sarray *array, sidx indx)
|
|
{
|
|
if (soffset_decode (indx) < array->capacity)
|
|
return (void *)sarray_get (array, indx);
|
|
}
|
|
void *
|
|
get_imp (Class class, SEL sel)
|
|
{
|
|
void *res = sarray_get_safe (class->dtable, (size_t) sel->sel_id);
|
|
if (res == 0)
|
|
{
|
|
{
|
|
res = get_imp (class, sel);
|
|
}
|
|
}
|
|
}
|