+
+enum CPPTraversal {
+ trav_full, // Full, final output
+ trav_obj_def, // Object struct definition
+ trav_obj_stub, // Object pointer stub,
+ // so it can be used in structs.
+ trav_nsdecl, // _ns declaration
+ trav_forward, // Forward declaration of
+ // structs/interfaces in nsdecl
+
+ num_traversals,
+
+ // Values beyond this point are not part of the
+ // above sequential pass scheme; they are merely
+ // for dynamic dispatch.
+ trav_marshall,
+ trav_unmarshall,
+};
+
+// Per-symbol language-private data
+struct CPPData : public Releasable {
+ // The traversal indices are also passed as "arg1" to determine
+ // which pass to generate. Higher numbers are performed first.
+
+ int traversed[num_traversals];
+
+ CPPData() : Releasable(1)
+ {
+ memset(traversed, 0, sizeof(traversed));
+ }
+};
+
+static inline CPPData &cpp_symdata(Symbol *sym)
+{
+ if (!sym->lang_priv)
+ sym->lang_priv = new CPPData;
+
+ CPPData *ptr = dynamic_cast<CPPData *>(sym->lang_priv);
+ assert(ptr);
+ return *ptr;
+}