In libobjc/: 2010-12-24 Nicola Pero <nicola.pero@meta-innovation.com>

In libobjc/:
2010-12-24  Nicola Pero  <nicola.pero@meta-innovation.com>

	* objc/runtime.h (class_addIvar): Updated documentation.  The
	alignment is actually the log_2 of the alignment in bytes.
	* ivars.c (class_addIvar): Corresponding change to the
	implementation.

In gcc/testsuite/:
2010-12-24  Nicola Pero  <nicola.pero@meta-innovation.com>

	* objc.dg/gnu-api-2-class.m: Updated test to pass log_2 of the
	alignment to class_addIvar, instead of the alignment itself.
	* obj-c++.dg/gnu-api-2-class.mm: Same change.

From-SVN: r168230
This commit is contained in:
Nicola Pero 2010-12-24 18:41:05 +00:00 committed by Nicola Pero
parent 5750872c61
commit 410644c41a
6 changed files with 69 additions and 17 deletions

View File

@ -1,3 +1,9 @@
2010-12-24 Nicola Pero <nicola.pero@meta-innovation.com>
* objc.dg/gnu-api-2-class.m: Updated test to pass log_2 of the
alignment to class_addIvar, instead of the alignment itself.
* obj-c++.dg/gnu-api-2-class.mm: Same change.
2010-12-24 Nicola Pero <nicola.pero@meta-innovation.com>
* objc.dg/gnu-api-2-sel.m: Updated for renaming of sel_getType to

View File

@ -62,6 +62,24 @@
- (id) mySelf;
@end
/* Hack to calculate the log2 of a byte alignment. */
unsigned char
log_2_of (unsigned int x)
{
unsigned char result = 0;
/* We count how many times we need to divide by 2 before we reach 1.
This algorithm is good enough for the small numbers (such as 8,
16 or 64) that we have to deal with. */
while (x > 1)
{
x = x / 2;
result++;
}
return result;
}
int main ()
{
/* Functions are tested in alphabetical order. */
@ -74,15 +92,15 @@ int main ()
abort ();
if (! class_addIvar (new_class, "variable2_ivar", sizeof (id),
__alignof__ (id), @encode (id)))
log_2_of (__alignof__ (id)), @encode (id)))
abort ();
if (! class_addIvar (new_class, "variable3_ivar", sizeof (unsigned char),
__alignof__ (unsigned char), @encode (unsigned char)))
log_2_of (__alignof__ (unsigned char)), @encode (unsigned char)))
abort ();
if (! class_addIvar (new_class, "variable4_ivar", sizeof (unsigned long),
__alignof__ (unsigned long), @encode (unsigned long)))
log_2_of (__alignof__ (unsigned long)), @encode (unsigned long)))
abort ();
objc_registerClassPair (new_class);
@ -135,7 +153,7 @@ int main ()
abort ();
if (! class_addIvar (new_class, "variable_ivar", sizeof (id),
__alignof__ (id), @encode (id)))
log_2_of (__alignof__ (id)), @encode (id)))
abort ();
if (! class_addMethod (new_class, @selector (setVariable:), method_getImplementation (method1),

View File

@ -62,6 +62,24 @@
- (id) mySelf;
@end
/* Hack to calculate the log2 of a byte alignment. */
unsigned char
log_2_of (unsigned int x)
{
unsigned char result = 0;
/* We count how many times we need to divide by 2 before we reach 1.
This algorithm is good enough for the small numbers (such as 8,
16 or 64) that we have to deal with. */
while (x > 1)
{
x = x / 2;
result++;
}
return result;
}
int main(int argc, void **args)
{
/* Functions are tested in alphabetical order. */
@ -74,15 +92,15 @@ int main(int argc, void **args)
abort ();
if (! class_addIvar (new_class, "variable2_ivar", sizeof (id),
__alignof__ (id), @encode (id)))
log_2_of (__alignof__ (id)), @encode (id)))
abort ();
if (! class_addIvar (new_class, "variable3_ivar", sizeof (unsigned char),
__alignof__ (unsigned char), @encode (unsigned char)))
log_2_of (__alignof__ (unsigned char)), @encode (unsigned char)))
abort ();
if (! class_addIvar (new_class, "variable4_ivar", sizeof (unsigned long),
__alignof__ (unsigned long), @encode (unsigned long)))
log_2_of (__alignof__ (unsigned long)), @encode (unsigned long)))
abort ();
objc_registerClassPair (new_class);
@ -135,7 +153,7 @@ int main(int argc, void **args)
abort ();
if (! class_addIvar (new_class, "variable_ivar", sizeof (id),
__alignof__ (id), @encode (id)))
log_2_of (__alignof__ (id)), @encode (id)))
abort ();
if (! class_addMethod (new_class, @selector (setVariable:), method_getImplementation (method1),

View File

@ -1,3 +1,10 @@
2010-12-24 Nicola Pero <nicola.pero@meta-innovation.com>
* objc/runtime.h (class_addIvar): Updated documentation. The
alignment is actually the log_2 of the alignment in bytes.
* ivars.c (class_addIvar): Corresponding change to the
implementation.
2010-12-24 Nicola Pero <nicola.pero@meta-innovation.com>
* objc/runtime.h (sel_getType): Renamed to sel_getTypeEncoding to

View File

@ -212,7 +212,7 @@ struct objc_ivar ** class_copyIvarList (Class class_, unsigned int *numberOfRetu
BOOL
class_addIvar (Class class_, const char * ivar_name, size_t size,
unsigned char alignment, const char *type)
unsigned char log_2_of_alignment, const char *type)
{
struct objc_ivar_list *ivars;
@ -270,6 +270,7 @@ class_addIvar (Class class_, const char * ivar_name, size_t size,
size. */
{
struct objc_ivar *ivar = &(ivars->ivar_list[ivars->ivar_count - 1]);
unsigned int alignment = 1 << log_2_of_alignment;
int misalignment;
ivar->ivar_name = objc_malloc (strlen (ivar_name) + 1);

View File

@ -352,14 +352,16 @@ objc_EXPORT Ivar * class_copyIvarList (Class class_, unsigned int *numberOfRetur
using objc_allocateClassPair() and has not been registered with the
runtime using objc_registerClassPair() yet. You can not add
instance variables to classes already registered with the runtime.
'size' is the size of the instance variable, 'alignment' the
alignment, and 'type' the type encoding of the variable type. You
can use sizeof(), __alignof__() and @encode() to determine the
right 'size', 'alignment' and 'type' for your instance variable.
For example, to add an instance variable name "my_variable" and of
type 'id', you can use:
'size' is the size of the instance variable, 'log_2_of_alignment'
the alignment as a power of 2 (so 0 means alignment to a 1 byte
boundary, 1 means alignment to a 2 byte boundary, 2 means alignment
to a 4 byte boundary, etc), and 'type' the type encoding of the
variable type. You can use sizeof(), log2(__alignof__()) and
@encode() to determine the right 'size', 'alignment' and 'type' for
your instance variable. For example, to add an instance variable
name "my_variable" and of type 'id', you can use:
class_addIvar (class, "my_variable", sizeof (id), __alignof__ (id),
class_addIvar (class, "my_variable", sizeof (id), log2 ( __alignof__ (id)),
@encode (id));
Return YES if the variable was added, and NO if not. In
@ -368,7 +370,7 @@ objc_EXPORT Ivar * class_copyIvarList (Class class_, unsigned int *numberOfRetur
'type' is NULL, or 'size' is 0.
*/
objc_EXPORT BOOL class_addIvar (Class class_, const char * ivar_name, size_t size,
unsigned char alignment, const char *type);
unsigned char log_2_of_alignment, const char *type);
/* Return the name of the property. Return NULL if 'property' is
NULL. */