@@ -383,6 +383,34 @@ pph_out_label_binding (pph_stream *stream, cp_label_binding *lb, bool ref_p)
}
+/* Returns the number of nodes matching FILTER in chain
+ starting with FIRST. */
+
+static unsigned
+pph_count_filter_match (tree first, enum chain_filter filter)
+{
+ unsigned count;
+ tree t;
+
+ switch (filter)
+ {
+ case NO_BUILTINS:
+ for (t = first, count = 0; t; t = TREE_CHAIN (t))
+ {
+ if (filter == NO_BUILTINS && DECL_P (t) && DECL_IS_BUILTIN (t))
+ continue;
+ count++;
+ }
+ break;
+
+ default:
+ internal_error ("unknown chain_filter used in pph_count_filter_match");
+ }
+
+ return count;
+}
+
+
/* Output a chain of nodes to STREAM starting with FIRST. Skip any
nodes that do not match FILTER. REF_P is true if nodes in the chain
should be emitted as references. */
@@ -402,13 +430,7 @@ pph_out_chain_filtered (pph_stream *stream, tree first, bool ref_p,
return;
}
- /* Count all the nodes that match the filter. */
- for (t = first, count = 0; t; t = TREE_CHAIN (t))
- {
- if (filter == NO_BUILTINS && DECL_P (t) && DECL_IS_BUILTIN (t))
- continue;
- count++;
- }
+ count = pph_count_filter_match (first, filter);
pph_out_uint (stream, count);
/* Output all the nodes that match the filter. */
@@ -439,7 +461,7 @@ static void
pph_out_binding_level (pph_stream *stream, struct cp_binding_level *bl,
bool ref_p)
{
- unsigned i;
+ unsigned i, streamed_names_size;
cp_class_binding *cs;
cp_label_binding *sl;
struct bitpack_d bp;
@@ -448,7 +470,8 @@ pph_out_binding_level (pph_stream *stream, struct cp_binding_level *bl,
return;
pph_out_chain_filtered (stream, bl->names, ref_p, NO_BUILTINS);
- pph_out_uint (stream, bl->names_size);
+ streamed_names_size = pph_count_filter_match (bl->names, NO_BUILTINS);
+ pph_out_uint (stream, streamed_names_size);
pph_out_chain_filtered (stream, bl->namespaces, ref_p, NO_BUILTINS);
pph_out_tree_vec (stream, bl->static_decls, ref_p);
@@ -714,7 +737,7 @@ pph_out_lang_specific (pph_stream *stream, tree decl, bool ref_p)
ld = DECL_LANG_SPECIFIC (decl);
if (!pph_start_record (stream, ld))
return;
-
+
/* Write all the fields in lang_decl_base. */
ldb = &ld->u.base;
pph_out_ld_base (stream, ldb);
@@ -1080,7 +1103,7 @@ pph_write_tree (struct output_block *ob, tree expr, bool ref_p)
TI_TYPEDEFS_NEEDING_ACCESS_CHECKING (expr), ref_p);
break;
- case TEMPLATE_PARM_INDEX:
+ case TEMPLATE_PARM_INDEX:
{
template_parm_index *p = TEMPLATE_PARM_INDEX_CAST (expr);
pph_out_tree_common (stream, expr, ref_p);