Commit 52861558 authored by Ken Thompson's avatar Ken Thompson

put i2s, s2i and i2i in convert

R=r
OCL=14143
CL=14143
parent 0f1d439e
...@@ -669,6 +669,7 @@ Type* fixmap(Type*); ...@@ -669,6 +669,7 @@ Type* fixmap(Type*);
Node* mapop(Node*, int); Node* mapop(Node*, int);
Type* fixchan(Type*); Type* fixchan(Type*);
Node* chanop(Node*, int); Node* chanop(Node*, int);
Node* isandss(Type*, Node*);
Node* convas(Node*); Node* convas(Node*);
void arrayconv(Type*, Node*); void arrayconv(Type*, Node*);
Node* colas(Node*, Node*); Node* colas(Node*, Node*);
......
...@@ -391,45 +391,56 @@ loop: ...@@ -391,45 +391,56 @@ loop:
if(top != Erv) if(top != Erv)
goto nottop; goto nottop;
walktype(n->left, Erv); walktype(n->left, Erv);
if(n->left == N)
l = n->left;
if(l == N)
goto ret;
t = n->type;
if(t == T)
goto ret; goto ret;
convlit(n->left, n->type); convlit(l, t);
// nil conversion // nil conversion
if(eqtype(n->type, n->left->type, 0)) { if(eqtype(t, l->type, 0)) {
if(n->left->op != ONAME) if(l->op != ONAME)
*n = *n->left; *n = *l;
goto ret; goto ret;
} }
// simple fix-float // simple fix-float
if(n->left->type != T) if(l->type != T)
if(isint[n->left->type->etype] || isfloat[n->left->type->etype]) if(isint[l->type->etype] || isfloat[l->type->etype])
if(isint[n->type->etype] || isfloat[n->type->etype]) { if(isint[t->etype] || isfloat[t->etype]) {
evconst(n); evconst(n);
goto ret; goto ret;
} }
// to string // to string
if(isptrto(n->type, TSTRING)) { if(isptrto(t, TSTRING)) {
if(isint[n->left->type->etype]) { if(isint[l->type->etype]) {
*n = *stringop(n, top); *n = *stringop(n, top);
goto ret; goto ret;
} }
if(isbytearray(n->left->type) != 0) { if(isbytearray(l->type) != 0) {
n->op = OARRAY; n->op = OARRAY;
*n = *stringop(n, top); *n = *stringop(n, top);
goto ret; goto ret;
} }
} }
if(n->type->etype == TARRAY) { if(t->etype == TARRAY) {
arrayconv(n->type, n->left); arrayconv(t, l);
goto ret;
}
r = isandss(n->type, l);
if(r != N) {
*n = *r;
goto ret; goto ret;
} }
badtype(n->op, n->left->type, n->type); badtype(n->op, l->type, t);
goto ret; goto ret;
case ORETURN: case ORETURN:
...@@ -2083,9 +2094,45 @@ diagnamed(Type *t) ...@@ -2083,9 +2094,45 @@ diagnamed(Type *t)
} }
Node* Node*
convas(Node *n) isandss(Type *lt, Node *r)
{ {
Type *rt;
Node *n;
int o; int o;
rt = r->type;
if(isinter(lt)) {
if(isptrto(rt, TSTRUCT)) {
o = OS2I;
goto ret;
}
if(isinter(rt)) {
o = OI2I;
goto ret;
}
}
if(isptrto(lt, TSTRUCT)) {
if(isinter(rt)) {
o = OI2S;
goto ret;
}
}
return N;
ret:
diagnamed(lt);
diagnamed(rt);
n = nod(o, r, N);
n->type = lt;
return n;
}
Node*
convas(Node *n)
{
Node *l, *r; Node *l, *r;
Type *lt, *rt; Type *lt, *rt;
...@@ -2124,35 +2171,15 @@ convas(Node *n) ...@@ -2124,35 +2171,15 @@ convas(Node *n)
if(eqtype(lt, rt, 0)) if(eqtype(lt, rt, 0))
return n; return n;
if(isinter(lt)) { r = isandss(lt, r);
if(isptrto(rt, TSTRUCT)) { if(r != N) {
o = OS2I; n->right = r;
goto ret; walktype(n, Etop);
} return n;
if(isinter(rt)) {
o = OI2I;
goto ret;
}
}
if(isptrto(lt, TSTRUCT)) {
if(isinter(rt)) {
o = OI2S;
goto ret;
}
} }
badtype(n->op, lt, rt); badtype(n->op, lt, rt);
return n; return n;
ret:
diagnamed(lt);
diagnamed(rt);
n->right = nod(o, r, N);
n->right->type = l->type;
walktype(n, Etop);
return n;
} }
void void
......
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