Commit 7ed8fc61 authored by Ken Thompson's avatar Ken Thompson

embedded types

auto & on methods

R=r
OCL=17682
CL=17682
parent ad48706a
...@@ -584,6 +584,8 @@ int isinter(Type*); ...@@ -584,6 +584,8 @@ int isinter(Type*);
int isnilinter(Type*); int isnilinter(Type*);
Sym* globalsig(Type*); Sym* globalsig(Type*);
Type* ismethod(Type*); Type* ismethod(Type*);
Type* methtype(Type*);
int needaddr(Type*);
Sym* signame(Type*, int); Sym* signame(Type*, int);
int bytearraysz(Type*); int bytearraysz(Type*);
int eqtype(Type*, Type*, int); int eqtype(Type*, Type*, int);
......
...@@ -1518,6 +1518,51 @@ out: ...@@ -1518,6 +1518,51 @@ out:
return t; 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 int
iscomposite(Type *t) iscomposite(Type *t)
{ {
......
...@@ -1422,30 +1422,6 @@ walkselect(Node *sel) ...@@ -1422,30 +1422,6 @@ walkselect(Node *sel)
lineno = lno; 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* Type*
lookdot1(Node *n, Type *f) lookdot1(Node *n, Type *f)
{ {
...@@ -1495,6 +1471,10 @@ lookdot(Node *n, Type *t) ...@@ -1495,6 +1471,10 @@ lookdot(Node *n, Type *t)
} }
if(f2 != 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->right = methodname(n->right, ismethod(n->left->type));
n->xoffset = f2->width; n->xoffset = f2->width;
n->type = f2->type; n->type = f2->type;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment