1
0
mirror of https://github.com/golang/go synced 2024-11-25 11:07:59 -07:00

gc, ld: reflect support for PtrTo

R=ken2
CC=golang-dev
https://golang.org/cl/4245055
This commit is contained in:
Russ Cox 2011-03-03 13:17:54 -05:00
parent 2d404c4bff
commit 44fd7573aa
2 changed files with 32 additions and 2 deletions

View File

@ -10,6 +10,7 @@
static NodeList* signatlist; static NodeList* signatlist;
static Sym* dtypesym(Type*); static Sym* dtypesym(Type*);
static Sym* weaktypesym(Type*);
static int static int
sigcmp(Sig *a, Sig *b) sigcmp(Sig *a, Sig *b)
@ -570,9 +571,17 @@ dcommontype(Sym *s, int ot, Type *t)
{ {
int i; int i;
Sym *s1; Sym *s1;
Sym *sptr;
char *p; char *p;
dowidth(t); dowidth(t);
sptr = nil;
if(t->sym != nil && !isptr[t->etype])
sptr = dtypesym(ptrto(t));
else
sptr = weaktypesym(ptrto(t));
s1 = dextratype(t); s1 = dextratype(t);
// empty interface pointing at this type. // empty interface pointing at this type.
@ -617,7 +626,7 @@ dcommontype(Sym *s, int ot, Type *t)
ot = dsymptr(s, ot, s1, 0); // extraType ot = dsymptr(s, ot, s1, 0); // extraType
else else
ot = duintptr(s, ot, 0); ot = duintptr(s, ot, 0);
ot = duintptr(s, ot, 0); // ptr type (placeholder for now) ot = dsymptr(s, ot, sptr, 0); // ptr to type
return ot; return ot;
} }
@ -662,6 +671,25 @@ typename(Type *t)
return n; return n;
} }
static Sym*
weaktypesym(Type *t)
{
char *p;
Sym *s;
static Pkg *weak;
if(weak == nil) {
weak = mkpkg(strlit("weak.type"));
weak->name = "weak.type";
weak->prefix = "weak.type"; // not weak%2etype
}
p = smprint("%#-T", t);
s = pkglookup(p, weak);
free(p);
return s;
}
static Sym* static Sym*
dtypesym(Type *t) dtypesym(Type *t)
{ {

View File

@ -680,8 +680,10 @@ doweak(void)
if(t->type != 0 && t->reachable) { if(t->type != 0 && t->reachable) {
s->value = t->value; s->value = t->value;
s->type = t->type; s->type = t->type;
} else } else {
s->type = SCONST;
s->value = 0; s->value = 0;
}
continue; continue;
} }
} }