diff options
author | Mark Mitchell <mark@codesourcery.com> | 2004-07-08 04:32:27 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2004-07-08 04:32:27 +0000 |
commit | 89b578be68dd3d91e551c3ba922f054ead36c4e4 (patch) | |
tree | b704620d1b4bd63427c4b884a49c7ece575dd1e4 /gcc/cp/class.c | |
parent | beed8fc0bb23590fdfa4665c3ad5b3ca7edb17f7 (diff) | |
download | gcc-89b578be68dd3d91e551c3ba922f054ead36c4e4.tar.gz |
cp-tree.h (saved_scope): Remove x_previous_class_type and x_previous_class_values...
* cp-tree.h (saved_scope): Remove x_previous_class_type and
x_previous_class_values; add x_previous_class_level.
(previous_class_type): Remove.
(previous_class_values): Remove.
(previous_class_level): New macro.
* class.c (pushclass): Restore the identifier cache more
expeditiously.
(invalidate_class_lookup_cache): Use vector for class_shadowed and
previous_class_values.
* decl.c (poplevel): Likewise.
* name-lookup.c (cxx_binding_init): New function.
(cxx_binding_make): Use it.
(push_binding): For a binding in a class level, use a vector of
cp_class_binding nodes.
(push_binding_level): New function.
(begin_scope): Use it.
(leave_scope): Do not put class binding levels on the free list.
(print_binding_level): Adjust for the fact that class_shadowed is
a vector.
(poplevel_class): Likewise.
(clear_identifier_class_values): Likewise.
(push_class_level_binding): Likewise.
(set_class_shadows): Remove.
(store_binding): New function.
(store_class_bindings): New function.
(push_to_top_level): Use store_class_bindings as appropriate.
(pop_from_top_level): Use previous_class_level, not
previous_class_type.
* name-lookup.h (cp_class_binding): New type.
(cp_binding_level): Use a vector object for class_shadowed.
(push_binding_level): Declare.
(set_class_shadows): Remove.
From-SVN: r84259
Diffstat (limited to 'gcc/cp/class.c')
-rw-r--r-- | gcc/cp/class.c | 54 |
1 files changed, 34 insertions, 20 deletions
diff --git a/gcc/cp/class.c b/gcc/cp/class.c index e4117278690..1f3b22a7ddc 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -5486,9 +5486,8 @@ pushclass (tree type) ? access_private_node : access_public_node); - if (previous_class_type != NULL_TREE - && (type != previous_class_type - || !COMPLETE_TYPE_P (previous_class_type)) + if (previous_class_level + && type != previous_class_level->this_entity && current_class_depth == 1) { /* Forcibly remove any old class remnants. */ @@ -5500,10 +5499,11 @@ pushclass (tree type) if (current_class_depth > 1) clear_identifier_class_values (); - pushlevel_class (); - - if (type != previous_class_type || current_class_depth > 1) + if (!previous_class_level + || type != previous_class_level->this_entity + || current_class_depth > 1) { + pushlevel_class (); push_class_decls (type); if (CLASSTYPE_TEMPLATE_INFO (type) && !CLASSTYPE_USE_TEMPLATE (type)) { @@ -5520,22 +5520,33 @@ pushclass (tree type) } else { - tree item; + cp_class_binding *cb; + size_t i; /* We are re-entering the same class we just left, so we don't have to search the whole inheritance matrix to find all the decls to bind again. Instead, we install the cached class_shadowed list, and walk through it binding names and setting up IDENTIFIER_TYPE_VALUEs. */ - set_class_shadows (previous_class_values); - for (item = previous_class_values; item; item = TREE_CHAIN (item)) + push_binding_level (previous_class_level); + class_binding_level = previous_class_level; + for (i = 0; + (cb = VEC_iterate (cp_class_binding, + previous_class_level->class_shadowed, + i)); + ++i) { - tree id = TREE_PURPOSE (item); - tree decl = TREE_TYPE (item); - - push_class_binding (id, decl); - if (TREE_CODE (decl) == TYPE_DECL) - set_identifier_type_value (id, decl); + tree id; + tree type_decl; + + id = cb->identifier; + cb->base.previous = IDENTIFIER_BINDING (id); + IDENTIFIER_BINDING (id) = &cb->base; + type_decl = cb->base.value; + if (!type_decl || TREE_CODE (type_decl) != TYPE_DECL) + type_decl = cb->base.type; + if (type_decl && TREE_CODE (type_decl) == TYPE_DECL) + set_identifier_type_value (id, type_decl); } unuse_fields (type); } @@ -5551,14 +5562,17 @@ pushclass (tree type) void invalidate_class_lookup_cache (void) { - tree t; + size_t i; + cp_class_binding *cb; /* The IDENTIFIER_CLASS_VALUEs are no longer valid. */ - for (t = previous_class_values; t; t = TREE_CHAIN (t)) - IDENTIFIER_CLASS_VALUE (TREE_PURPOSE (t)) = NULL_TREE; + for (i = 0; + (cb = VEC_iterate (cp_class_binding, + previous_class_level->class_shadowed, i)); + ++i) + IDENTIFIER_CLASS_VALUE (cb->identifier) = NULL_TREE; - previous_class_values = NULL_TREE; - previous_class_type = NULL_TREE; + previous_class_level = NULL; } /* Get out of the current class scope. If we were in a class scope |