Commit 1bd5981b by Ziemowit Laski Committed by Ziemowit Laski

objc-act.c (build_ivar_chain): Remove.

[gcc]
2002-08-19  Ziemowit Laski  <zlaski@apple.com>

        * objc/objc-act.c (build_ivar_chain): Remove.
        (objc_copy_list): Likewise.
        (get_class_ivars): Inline call to removed build_ivar_chain
        function.  Save off a clean copy of ivars in the CLASS_OWN_IVARS
        slot; use that slot (rather than CLASS_IVARS) when accessing
        ivars for base classes.  Call copy_list and chainon instead of
        objc_copy_list.
        (build_private_template): Call get_class_ivars instead of
        build_ivar_chain.
        (start_class): Allocate room for the CLASS_OWN_IVARS slot.
        (continue_class): Call get_class_ivars instead of
        build_ivar_chain.
        (encode_field_decl): Check for DECL_BIT_FIELD_TYPE instead
        of DECL_BIT_FIELD (which may have been cleared).
        * objc/objc-act.h (CLASS_OWN_IVARS): New accessor macro.

[gcc/testsuite]
2002-08-19  Ziemowit Laski  <zlaski@apple.com>

        * objc.dg/bitfield-1.m: New test.
        * objc.dg/bitfield-2.m: New test.

From-SVN: r56451
parent 2bf087c0
2002-08-19 Ziemowit Laski <zlaski@apple.com>
* objc/objc-act.c (build_ivar_chain): Remove.
(objc_copy_list): Likewise.
(get_class_ivars): Inline call to removed build_ivar_chain
function. Save off a clean copy of ivars in the CLASS_OWN_IVARS
slot; use that slot (rather than CLASS_IVARS) when accessing
ivars for base classes. Call copy_list and chainon instead of
objc_copy_list.
(build_private_template): Call get_class_ivars instead of
build_ivar_chain.
(start_class): Allocate room for the CLASS_OWN_IVARS slot.
(continue_class): Call get_class_ivars instead of
build_ivar_chain.
(encode_field_decl): Check for DECL_BIT_FIELD_TYPE instead
of DECL_BIT_FIELD (which may have been cleared).
* objc/objc-act.h (CLASS_OWN_IVARS): New accessor macro.
2002-08-19 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 2002-08-19 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* genautomata.c (output_translate_vect, output_state_ainsn_table, * genautomata.c (output_translate_vect, output_state_ainsn_table,
......
...@@ -128,7 +128,6 @@ static tree build_objc_method_call PARAMS ((int, tree, tree, ...@@ -128,7 +128,6 @@ static tree build_objc_method_call PARAMS ((int, tree, tree,
static void generate_strings PARAMS ((void)); static void generate_strings PARAMS ((void));
static tree get_proto_encoding PARAMS ((tree)); static tree get_proto_encoding PARAMS ((tree));
static void build_selector_translation_table PARAMS ((void)); static void build_selector_translation_table PARAMS ((void));
static tree build_ivar_chain PARAMS ((tree, int));
static tree objc_add_static_instance PARAMS ((tree, tree)); static tree objc_add_static_instance PARAMS ((tree, tree));
...@@ -249,7 +248,6 @@ static tree build_typed_selector_reference PARAMS ((tree, tree)); ...@@ -249,7 +248,6 @@ static tree build_typed_selector_reference PARAMS ((tree, tree));
static tree build_selector_reference PARAMS ((tree)); static tree build_selector_reference PARAMS ((tree));
static tree build_class_reference_decl PARAMS ((void)); static tree build_class_reference_decl PARAMS ((void));
static void add_class_reference PARAMS ((tree)); static void add_class_reference PARAMS ((tree));
static tree objc_copy_list PARAMS ((tree, tree *));
static tree build_protocol_template PARAMS ((void)); static tree build_protocol_template PARAMS ((void));
static tree build_descriptor_table_initializer PARAMS ((tree, tree)); static tree build_descriptor_table_initializer PARAMS ((tree, tree));
static tree build_method_prototype_list_template PARAMS ((tree, int)); static tree build_method_prototype_list_template PARAMS ((tree, int));
...@@ -2277,51 +2275,23 @@ lookup_interface (ident) ...@@ -2277,51 +2275,23 @@ lookup_interface (ident)
return NULL_TREE; return NULL_TREE;
} }
static tree /* Used by: build_private_template, continue_class,
objc_copy_list (list, head) and for @defs constructs. */
tree list;
tree *head;
{
tree newlist = NULL_TREE, tail = NULL_TREE;
while (list)
{
tail = copy_node (list);
/* The following statement fixes a bug when inheriting instance
variables that are declared to be bitfields. finish_struct
expects to find the width of the bitfield in DECL_INITIAL. */
if (DECL_BIT_FIELD (tail) && DECL_INITIAL (tail) == 0)
DECL_INITIAL (tail) = DECL_SIZE (tail);
newlist = chainon (newlist, tail);
list = TREE_CHAIN (list);
}
*head = newlist;
return tail;
}
/* Used by: build_private_template, get_class_ivars, and
continue_class. COPY is 1 when called from @defs. In this case
copy all fields. Otherwise don't copy leaf ivars since we rely on
them being side-effected exactly once by finish_struct. */
static tree tree
build_ivar_chain (interface, copy) get_class_ivars (interface)
tree interface; tree interface;
int copy;
{ {
tree my_name, super_name, ivar_chain; tree my_name, super_name, ivar_chain;
my_name = CLASS_NAME (interface); my_name = CLASS_NAME (interface);
super_name = CLASS_SUPER_NAME (interface); super_name = CLASS_SUPER_NAME (interface);
ivar_chain = CLASS_IVARS (interface);
/* Possibly copy leaf ivars. */ /* Save off a pristine copy of the leaf ivars (i.e, those not
if (copy) inherited from a super class). */
objc_copy_list (CLASS_IVARS (interface), &ivar_chain); if (!CLASS_OWN_IVARS (interface))
else CLASS_OWN_IVARS (interface) = copy_list (ivar_chain);
ivar_chain = CLASS_IVARS (interface);
while (super_name) while (super_name)
{ {
...@@ -2345,14 +2315,14 @@ build_ivar_chain (interface, copy) ...@@ -2345,14 +2315,14 @@ build_ivar_chain (interface, copy)
my_name = CLASS_NAME (interface); my_name = CLASS_NAME (interface);
super_name = CLASS_SUPER_NAME (interface); super_name = CLASS_SUPER_NAME (interface);
op1 = CLASS_IVARS (interface); op1 = CLASS_OWN_IVARS (interface);
if (op1) if (op1)
{ {
tree head, tail = objc_copy_list (op1, &head); tree head = copy_list (op1);
/* Prepend super class ivars...make a copy of the list, we /* Prepend super class ivars...make a copy of the list, we
do not want to alter the original. */ do not want to alter the original. */
TREE_CHAIN (tail) = ivar_chain; chainon (head, ivar_chain);
ivar_chain = head; ivar_chain = head;
} }
} }
...@@ -2379,7 +2349,7 @@ build_private_template (class) ...@@ -2379,7 +2349,7 @@ build_private_template (class)
{ {
uprivate_record = start_struct (RECORD_TYPE, CLASS_NAME (class)); uprivate_record = start_struct (RECORD_TYPE, CLASS_NAME (class));
ivar_context = build_ivar_chain (class, 0); ivar_context = get_class_ivars (class);
finish_struct (uprivate_record, ivar_context, NULL_TREE); finish_struct (uprivate_record, ivar_context, NULL_TREE);
...@@ -5660,18 +5630,6 @@ is_public (expr, identifier) ...@@ -5660,18 +5630,6 @@ is_public (expr, identifier)
return 1; return 1;
} }
/* Implement @defs (<classname>) within struct bodies. */
tree
get_class_ivars (interface)
tree interface;
{
/* Make sure we copy the leaf ivars in case @defs is used in a local
context. Otherwise finish_struct will overwrite the layout info
using temporary storage. */
return build_ivar_chain (interface, 1);
}
/* Make sure all entries in CHAIN are also in LIST. */ /* Make sure all entries in CHAIN are also in LIST. */
...@@ -5903,7 +5861,7 @@ start_class (code, class_name, super_name, protocol_list) ...@@ -5903,7 +5861,7 @@ start_class (code, class_name, super_name, protocol_list)
} }
class = make_node (code); class = make_node (code);
TYPE_BINFO (class) = make_tree_vec (5); TYPE_BINFO (class) = make_tree_vec (6);
CLASS_NAME (class) = class_name; CLASS_NAME (class) = class_name;
CLASS_SUPER_NAME (class) = super_name; CLASS_SUPER_NAME (class) = super_name;
...@@ -6093,7 +6051,7 @@ continue_class (class) ...@@ -6093,7 +6051,7 @@ continue_class (class)
if (!TYPE_FIELDS (record)) if (!TYPE_FIELDS (record))
{ {
finish_struct (record, build_ivar_chain (class, 0), NULL_TREE); finish_struct (record, get_class_ivars (class), NULL_TREE);
CLASS_STATIC_TEMPLATE (class) = record; CLASS_STATIC_TEMPLATE (class) = record;
/* Mark this record as a class template for static typing. */ /* Mark this record as a class template for static typing. */
...@@ -6717,14 +6675,14 @@ encode_field_decl (field_decl, curtype, format) ...@@ -6717,14 +6675,14 @@ encode_field_decl (field_decl, curtype, format)
the bitfield typing information. */ the bitfield typing information. */
if (flag_next_runtime) if (flag_next_runtime)
{ {
if (DECL_BIT_FIELD (field_decl)) if (DECL_BIT_FIELD_TYPE (field_decl))
encode_bitfield (tree_low_cst (DECL_SIZE (field_decl), 1)); encode_bitfield (tree_low_cst (DECL_SIZE (field_decl), 1));
else else
encode_type (TREE_TYPE (field_decl), curtype, format); encode_type (TREE_TYPE (field_decl), curtype, format);
} }
else else
{ {
if (DECL_BIT_FIELD (field_decl)) if (DECL_BIT_FIELD_TYPE (field_decl))
encode_complete_bitfield (int_bit_position (field_decl), encode_complete_bitfield (int_bit_position (field_decl),
DECL_BIT_FIELD_TYPE (field_decl), DECL_BIT_FIELD_TYPE (field_decl),
tree_low_cst (DECL_SIZE (field_decl), 1)); tree_low_cst (DECL_SIZE (field_decl), 1));
......
...@@ -97,6 +97,7 @@ tree build_encode_expr PARAMS ((tree)); ...@@ -97,6 +97,7 @@ tree build_encode_expr PARAMS ((tree));
#define CLASS_STATIC_TEMPLATE(CLASS) TREE_VEC_ELT (TYPE_BINFO (CLASS), 2) #define CLASS_STATIC_TEMPLATE(CLASS) TREE_VEC_ELT (TYPE_BINFO (CLASS), 2)
#define CLASS_CATEGORY_LIST(CLASS) TREE_VEC_ELT (TYPE_BINFO (CLASS), 3) #define CLASS_CATEGORY_LIST(CLASS) TREE_VEC_ELT (TYPE_BINFO (CLASS), 3)
#define CLASS_PROTOCOL_LIST(CLASS) TREE_VEC_ELT (TYPE_BINFO (CLASS), 4) #define CLASS_PROTOCOL_LIST(CLASS) TREE_VEC_ELT (TYPE_BINFO (CLASS), 4)
#define CLASS_OWN_IVARS(CLASS) TREE_VEC_ELT (TYPE_BINFO (CLASS), 5)
#define PROTOCOL_NAME(CLASS) ((CLASS)->type.name) #define PROTOCOL_NAME(CLASS) ((CLASS)->type.name)
#define PROTOCOL_LIST(CLASS) TREE_VEC_ELT (TYPE_BINFO (CLASS), 0) #define PROTOCOL_LIST(CLASS) TREE_VEC_ELT (TYPE_BINFO (CLASS), 0)
#define PROTOCOL_NST_METHODS(CLASS) ((CLASS)->type.minval) #define PROTOCOL_NST_METHODS(CLASS) ((CLASS)->type.minval)
......
2002-08-19 Ziemowit Laski <zlaski@apple.com>
* objc.dg/bitfield-1.m: New test.
* objc.dg/bitfield-2.m: New test.
2002-08-17 Joseph S. Myers <jsm@polyomino.org.uk> 2002-08-17 Joseph S. Myers <jsm@polyomino.org.uk>
* gcc.dg/c90-flex-array-1.c, gcc.dg/c99-flex-array-3.c, * gcc.dg/c90-flex-array-1.c, gcc.dg/c99-flex-array-3.c,
......
/* Check if bitfield ivars are inherited correctly (i.e., without
being "promoted" to ints). */
/* Contributed by Ziemowit Laski <zlaski@apple.com>. */
/* { dg-do run } */
#include <objc/objc.h>
#include <objc/Object.h>
extern void abort(void);
#define CHECK_IF(expr) if(!(expr)) abort();
@interface Base: Object
{
int full;
int full2: 32;
int _refs: 8;
int field2: 3;
unsigned f3: 8;
short cc;
unsigned g: 16;
int r2: 8;
int r3: 8;
int r4: 2;
int r5: 8;
char c;
}
- (void)setValues;
@end
@interface Derived: Base
{
char d;
int _field3: 6;
}
- (void)checkValues;
@end
@implementation Base
-(void)setValues {
full = 1;
full2 = 2;
_refs = 3;
field2 = 1;
f3 = 6;
cc = 7;
g = 8;
r2 = 9;
r3 = 10;
r4 = 1;
r5 = 12;
c = 13;
}
@end
@implementation Derived
-(void)checkValues {
CHECK_IF(full == 1);
CHECK_IF(full2 == 2);
CHECK_IF(_refs == 3);
CHECK_IF(field2 == 1);
CHECK_IF(f3 == 6);
CHECK_IF(cc == 7);
CHECK_IF(g == 8);
CHECK_IF(r2 == 9);
CHECK_IF(r3 == 10);
CHECK_IF(r4 == 1);
CHECK_IF(r5 == 12);
CHECK_IF(c == 13);
}
@end
int main(void) {
Derived *obj = [[Derived alloc] init];
[obj setValues];
[obj checkValues];
return 0;
}
/* Check if bitfield ivars are correctly @encode'd when
the NeXT runtime is used. */
/* Contributed by Ziemowit Laski <zlaski@apple.com>. */
/* { dg-options "-fnext-runtime" } */
/* { dg-do run } */
struct objc_object { struct objc_class *class_pointer; } *id;
extern void abort(void);
extern int strcmp(const char *, const char *);
#define CHECK_IF(expr) if(!(expr)) abort();
@interface Base
{
struct objc_class *isa;
int full;
int full2: 32;
int _refs: 8;
int field2: 3;
unsigned f3: 8;
short cc;
unsigned g: 16;
int r2: 8;
int r3: 8;
int r4: 2;
int r5: 8;
char c;
}
@end
@interface Derived: Base
{
char d;
int _field3: 6;
}
@end
@implementation Base
@end
@implementation Derived
@end
int main(void) {
const char *s1r = "{Base=#ib32b8b3b8sb16b8b8b2b8c}";
const char *s1 = @encode(Base);
const char *s2r = "{Derived=#ib32b8b3b8sb16b8b8b2b8ccb6}";
const char *s2 = @encode(Derived);
CHECK_IF(!strcmp(s1r, s1));
CHECK_IF(!strcmp(s2r, s2));
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment