diff options
author | Kai Backman <kaib@golang.org> | 2009-07-13 22:06:28 -0700 |
---|---|---|
committer | Kai Backman <kaib@golang.org> | 2009-07-13 22:06:28 -0700 |
commit | 7f2eba29c1c887cc0a1148bd41580d92cc817195 (patch) | |
tree | d0f8230db83e60bd8e364523fb2318e0afb7ec11 /src/cmd/5g/gobj.c | |
parent | ed457814e5f874a16649e4725906e8ae75d7722f (diff) | |
download | golang-7f2eba29c1c887cc0a1148bd41580d92cc817195.tar.gz |
added missing pieces required by reflection
R=rsc
APPROVED=rsc
DELTA=61 (40 added, 18 deleted, 3 changed)
OCL=31502
CL=31580
Diffstat (limited to 'src/cmd/5g/gobj.c')
-rw-r--r-- | src/cmd/5g/gobj.c | 58 |
1 files changed, 40 insertions, 18 deletions
diff --git a/src/cmd/5g/gobj.c b/src/cmd/5g/gobj.c index b8f8f68e9..47de270d0 100644 --- a/src/cmd/5g/gobj.c +++ b/src/cmd/5g/gobj.c @@ -484,46 +484,67 @@ dstringptr(Sym *s, int off, char *str) } int -duintxx(Sym *s, int off, uint64 v, int wid) +dgostrlitptr(Sym *s, int off, Strlit *lit) { Prog *p; - off = rnd(off, wid); + if(lit == nil) + return duintptr(s, off, 0); + off = rnd(off, widthptr); p = gins(ADATA, N, N); p->from.type = D_OREG; p->from.name = D_EXTERN; p->from.sym = s; p->from.offset = off; - p->reg = wid; + p->from.reg = widthptr; + datagostring(lit, &p->to); p->to.type = D_CONST; - p->to.name = D_NONE; - p->to.offset = v; - off += wid; + p->to.etype = TINT32; + off += widthptr; return off; } int -duint32(Sym *s, int off, uint32 v) +dgostringptr(Sym *s, int off, char *str) { - return duintxx(s, off, v, 4); -} + int n; + Strlit *lit; -int -duint16(Sym *s, int off, uint32 v) -{ - return duintxx(s, off, v, 2); + if(str == nil) + return duintptr(s, off, 0); + + n = strlen(str); + lit = mal(sizeof *lit + n); + strcpy(lit->s, str); + lit->len = n; + return dgostrlitptr(s, off, lit); } int -duintptr(Sym *s, int off, uint32 v) +duintxx(Sym *s, int off, uint64 v, int wid) { - return duintxx(s, off, v, 8); + Prog *p; + + off = rnd(off, wid); + + p = gins(ADATA, N, N); + p->from.type = D_OREG; + p->from.name = D_EXTERN; + p->from.sym = s; + p->from.offset = off; + p->reg = wid; + p->to.type = D_CONST; + p->to.name = D_NONE; + p->to.offset = v; + off += wid; + + return off; } int -dsymptr(Sym *s, int off, Sym *x) +dsymptr(Sym *s, int off, Sym *x, int xoff) { Prog *p; @@ -538,7 +559,7 @@ dsymptr(Sym *s, int off, Sym *x) p->to.type = D_CONST; p->to.name = D_EXTERN; p->to.sym = x; - p->to.offset = 0; + p->to.offset = xoff; off += widthptr; return off; @@ -546,9 +567,10 @@ dsymptr(Sym *s, int off, Sym *x) void -genembedtramp(Type *t, Sig *b) +genembedtramp(Type *rcvr, Type *method, Sym *newnam) { fatal("genembedtramp not implemented"); + // TODO(kaib): re-lift from 8g // Sym *e; // int c, d, o, loaded; // Prog *p; |