disallow P.t for lowercase t and not our package P.

implement hiding lowercase methods m in
signatures by adding in a hash of the package name
to the type hash code.

remove remaining checks for internally-generated _ names:
they are all gone.

R=ken
OCL=23236
CL=23238
diff --git a/src/cmd/6g/gen.c b/src/cmd/6g/gen.c
index 121fb05..769a72b 100644
--- a/src/cmd/6g/gen.c
+++ b/src/cmd/6g/gen.c
@@ -57,9 +57,8 @@
 		// add clearing of the output parameters
 		t = structfirst(&save, getoutarg(curfn->type));
 		while(t != T) {
-			if(t->nname != N && t->nname->sym->name[0] != '_') {
+			if(t->nname != N)
 				curfn->nbody = list(nod(OAS, t->nname, N), curfn->nbody);
-			}
 			t = structnext(&save);
 		}
 	}
diff --git a/src/cmd/6g/obj.c b/src/cmd/6g/obj.c
index fb2d382..76c6a93 100644
--- a/src/cmd/6g/obj.c
+++ b/src/cmd/6g/obj.c
@@ -658,6 +658,8 @@
 
 		a->name = method->name;
 		a->hash = PRIME8*stringhash(a->name) + PRIME9*typehash(f->type, 0);
+		if(!exportname(a->name))
+			a->hash += PRIME10*stringhash(package);
 		a->perm = o;
 		a->sym = methodsym(method, rcvrt);
 
@@ -767,7 +769,6 @@
 	int o;
 	Sig *a, *b;
 	Prog *p;
-	char *sp;
 	char buf[NSYMB];
 
 	at.sym = s;
@@ -784,19 +785,15 @@
 		s1 = f->sym;
 		if(s1 == nil)
 			continue;
-		if(s1->name[0] == '_')
-			continue;
 
 		b = mal(sizeof(*b));
 		b->link = a;
 		a = b;
 
 		a->name = s1->name;
-		sp = strchr(s1->name, '_');
-		if(sp != nil)
-			a->name = sp+1;
-
 		a->hash = PRIME8*stringhash(a->name) + PRIME9*typehash(f->type, 0);
+		if(!exportname(a->name))
+			a->hash += PRIME10*stringhash(package);
 		a->perm = o;
 		a->sym = methodsym(f->sym, t);
 		a->offset = 0;
diff --git a/src/cmd/gc/dcl.c b/src/cmd/gc/dcl.c
index d25ab33..12123b4 100644
--- a/src/cmd/gc/dcl.c
+++ b/src/cmd/gc/dcl.c
@@ -433,7 +433,7 @@
 	while(t != T) {
 		if(t->nname != N)
 			t->nname->xoffset = t->width;
-		if(t->nname != N && t->nname->sym->name[0] != '_') {
+		if(t->nname != N) {
 			addvar(t->nname, t->type, PPARAM);
 			all |= 1;
 		} else
diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h
index fceb743..b04790d 100644
--- a/src/cmd/gc/go.h
+++ b/src/cmd/gc/go.h
@@ -34,6 +34,7 @@
 	PRIME7		= 10067,
 	PRIME8		= 10079,
 	PRIME9		= 10091,
+	PRIME10		= 10093,
 
 	AUNK		= 100,
 	// these values are known by runtime
diff --git a/src/cmd/gc/lex.c b/src/cmd/gc/lex.c
index c3a6511..83fc1f8 100644
--- a/src/cmd/gc/lex.c
+++ b/src/cmd/gc/lex.c
@@ -685,6 +685,8 @@
 		s = pkglookup(s->name, context);
 		if(s->lexical == LIGNORE)
 			goto l0;
+		if(!exportname(s->name) && strcmp(package, s->opackage) != 0)
+			s = pkglookup(s->name, ".private");
 	}
 
 	DBG("lex: %S %s\n", s, lexname(s->lexical));
diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c
index 40912bc..0650a63 100644
--- a/src/cmd/gc/subr.c
+++ b/src/cmd/gc/subr.c
@@ -1683,12 +1683,8 @@
 			if(t1->nname != N && t1->nname->sym != S) {
 				if(t2->nname == N || t2->nname->sym == S)
 					return 0;
-				if(strcmp(t1->nname->sym->name, t2->nname->sym->name) != 0) {
-					// assigned names dont count
-					if(t1->nname->sym->name[0] != '_' ||
-				   	   t2->nname->sym->name[0] != '_')
-						return 0;
-				}
+				if(strcmp(t1->nname->sym->name, t2->nname->sym->name) != 0)
+					return 0;
 			}
 			t1 = t1->down;
 			t2 = t2->down;
@@ -2489,7 +2485,7 @@
 	u = methtype(t);
 	if(u != T) {
 		for(f=u->method; f!=T; f=f->down) {
-			if(!exportname(f->sym->name) && strcmp(f->sym->package, package) != 0)
+			if(!exportname(f->sym->name) && strcmp(f->sym->opackage, package) != 0)
 				continue;
 			if(f->sym->uniq)
 				continue;