shithub: mc

Download patch

ref: 4078198dee11c72b6e735e704d21a2c0f39cb575
parent: 0ac48a57880b009dc00c756882d26ab7ac0974f4
author: Ori Bernstein <ori@eigenstate.org>
date: Sat Jan 14 18:22:16 EST 2017

Unfuck cross module traits a bit.

	Mildly tested.

--- a/parse/export.c
+++ b/parse/export.c
@@ -278,6 +278,7 @@
 			continue;
 		tagnode(st, s, 0, hidelocal);
                 tr = s->impl.trait;
+		tagtrait(st, tr, 0, hidelocal);
 		for (j = 0; j < tr->naux; j++)
 			tr->aux[j]->vis = Visexport;
 	}
--- a/parse/use.c
+++ b/parse/use.c
@@ -400,6 +400,7 @@
 Trait *traitunpickle(FILE *fd)
 {
 	Trait *tr;
+	Node *fn;
 	size_t i, n;
 	intptr_t uid;
 
@@ -423,8 +424,11 @@
 	for (i = 0; i < n; i++)
 		lappend(&tr->memb, &tr->nmemb, rdsym(fd, tr));
 	n = rdint(fd);
-	for (i = 0; i < n; i++)
-		lappend(&tr->funcs, &tr->nfuncs, rdsym(fd, tr));
+	for (i = 0; i < n; i++) {
+		fn = rdsym(fd, tr);
+		fn->decl.impls = mkht(tyhash, tyeq);
+		lappend(&tr->funcs, &tr->nfuncs, fn);
+	}
 	htput(trmap, itop(uid), tr);
 	return tr;
 }
@@ -963,7 +967,6 @@
 				  puttrait(s, tr->name, tr);
 				  for (i = 0; i < tr->nfuncs; i++) {
 					  putdcl(s, tr->funcs[i]);
-					  tr->funcs[i]->decl.impls = mkht(tyhash, tyeq);
 				  }
 			  }
 			  break;
@@ -1131,6 +1134,8 @@
 	}
 
 	for (i = 0; i < ntraittab; i++) {
+		if (i < Ntraits)
+			continue;
 		if (traittab[i]->vis == Visexport || traittab[i]->vis == Vishidden) {
 			wrbyte(f, 'R');
 			traitpickle(f, traittab[i]);