1
0
mirror of https://github.com/golang/go synced 2024-11-26 17:07:09 -07:00

embedded types

auto & on methods

R=r
OCL=17682
CL=17682
This commit is contained in:
Ken Thompson 2008-10-22 18:18:08 -07:00
parent ad48706a24
commit 7ed8fc611d
3 changed files with 51 additions and 24 deletions

View File

@ -584,6 +584,8 @@ int isinter(Type*);
int isnilinter(Type*);
Sym* globalsig(Type*);
Type* ismethod(Type*);
Type* methtype(Type*);
int needaddr(Type*);
Sym* signame(Type*, int);
int bytearraysz(Type*);
int eqtype(Type*, Type*, int);

View File

@ -1518,6 +1518,51 @@ out:
return t;
}
/*
* this is ismethod() without side effects
*/
Type*
methtype(Type *t)
{
Sym *s;
if(t == T)
return T;
if(t->etype == TINTER || (t->etype == tptr && t->type->etype == TINTER))
return T;
s = t->sym;
if(s != S)
return t;
if(!isptr[t->etype])
return T;
t = t->type;
if(t == T)
return T;
s = t->sym;
if(s != S)
return t;
return T;
}
/*
* this is another ismethod()
* returns 1 if t=T and method wants *T
*/
int
needaddr(Type *t)
{
Sym *s;
if(t == T)
return 0;
if(t->etype == TINTER || (t->etype == tptr && t->type->etype == TINTER))
return 0;
s = t->sym;
if(s != S && t->methptr == 2)
return 1;
return 0;
}
int
iscomposite(Type *t)
{

View File

@ -1422,30 +1422,6 @@ walkselect(Node *sel)
lineno = lno;
}
Type*
methtype(Type *t)
{
Sym *s;
// this is ismethod() without diagnostics
if(t == T)
return T;
if(t->etype == TINTER || (t->etype == tptr && t->type->etype == TINTER))
return T;
s = t->sym;
if(s != S && s->name[0] != '_')
return t;
if(!isptr[t->etype])
return T;
t = t->type;
if(t == T)
return T;
s = t->sym;
if(s != S && s->name[0] != '_')
return t;
return T;
}
Type*
lookdot1(Node *n, Type *f)
{
@ -1495,6 +1471,10 @@ lookdot(Node *n, Type *t)
}
if(f2 != T) {
if(needaddr(n->left->type)) {
n->left = nod(OADDR, n->left, N);
n->left->type = ptrto(n->left->left->type);
}
n->right = methodname(n->right, ismethod(n->left->type));
n->xoffset = f2->width;
n->type = f2->type;