maintaining parent expression


git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@291 59561ff5-6e30-0410-9f3c-9617f08c8826
diff --git a/libasn1parser/asn1p_expr.c b/libasn1parser/asn1p_expr.c
index 4337981..755196f 100644
--- a/libasn1parser/asn1p_expr.c
+++ b/libasn1parser/asn1p_expr.c
@@ -82,13 +82,23 @@
 			asn1p_expr_free(clone);
 			return NULL;
 		}
-		TQ_ADD(&(clone->members), cmemb, next);
+		asn1p_expr_add(clone, cmemb);
 	}
 
 	return clone;
 }
 
 /*
+ * Add expression as a member of another.
+ */
+void
+asn1p_expr_add(asn1p_expr_t *to, asn1p_expr_t *what) {
+	TQ_ADD(&(to->members), what, next);
+	what->parent_expr = to;
+}
+
+
+/*
  * Destruct the types collection structure.
  */
 void
@@ -96,6 +106,16 @@
 	if(expr) {
 		asn1p_expr_t *tm;
 
+		/* Remove all children */
+		while((tm = TQ_REMOVE(&(expr->members), next))) {
+			if(tm->parent_expr != expr)
+				printf("<%s:%p !-> %s:%p>\n",
+					tm->Identifier, tm->parent_expr,
+					expr->Identifier, expr);
+			assert(tm->parent_expr == expr);
+			asn1p_expr_free(tm);
+		}
+
 		if(expr->Identifier)
 			free(expr->Identifier);
 		if(expr->reference)
@@ -111,11 +131,6 @@
 		if(expr->with_syntax)
 			asn1p_wsyntx_free(expr->with_syntax);
 
-		/* Remove all children */
-		while((tm = TQ_REMOVE(&(expr->members), next))) {
-			asn1p_expr_free(tm);
-		}
-
 		if(expr->data && expr->data_free)
 			expr->data_free(expr->data);