+typedef struct {
+ const IdDataSpec *idds;
+ int n;
+ void **a;
+} IdDataAssocData;
+
+typedef struct {
+ Tcl_Interp *interp;
+ IdDataAssocData *assoc;
+ int ix;
+} IdDataValue;
+
+static void assoc_del(ClientData assoc_cd, Tcl_Interp *ip) {
+ IdDataAssocData *assoc;
+ int ix;
+ void **p, *v;
+
+ assoc= assoc_cd;
+ for (ix=0, p=assoc->a; ix<assoc->n; ix++, p++) {
+ v= *p;
+ if (!v) continue;
+ assert(*(int*)v == ix);
+ *(int*)v= -1;
+ assoc->idds->destroyitem(ip,v);
+ *p= 0;
+ }
+ TFREE(assoc->a);
+ TFREE(assoc);
+}
+
+static void setobjdataid(Tcl_Interp *interp, Tcl_Obj *o,
+ int ix, const IdDataSpec *idds) {
+ IdDataValue *dv;
+ IdDataAssocData *assoc;
+
+ assoc= Tcl_GetAssocData(interp, (char*)idds->assockey, 0);
+ if (!assoc) {
+ assoc= TALLOC(sizeof(*assoc));
+ assoc->idds= idds;
+ assoc->n= 0;
+ assoc->a= 0;
+ Tcl_SetAssocData(interp, (char*)idds->assockey, assoc_del, assoc);
+ }
+
+ dv= TALLOC(sizeof(*dv));
+ dv->interp= interp;
+ dv->assoc= assoc;
+ dv->ix= ix;