From: Ken Thompson Date: Wed, 13 Aug 2008 02:13:09 +0000 (-0700) Subject: put i2s, s2i and i2i in convert X-Git-Tag: weekly.2009-11-06~3317 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=52861558f4fcca548c600bc00fa62c96ad2f7249;p=gostls13.git put i2s, s2i and i2i in convert R=r OCL=14143 CL=14143 --- diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h index a1377fba4b..b8ddcc3cd0 100644 --- a/src/cmd/gc/go.h +++ b/src/cmd/gc/go.h @@ -669,6 +669,7 @@ Type* fixmap(Type*); Node* mapop(Node*, int); Type* fixchan(Type*); Node* chanop(Node*, int); +Node* isandss(Type*, Node*); Node* convas(Node*); void arrayconv(Type*, Node*); Node* colas(Node*, Node*); diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c index 36021ec0c9..3e3491bc02 100644 --- a/src/cmd/gc/walk.c +++ b/src/cmd/gc/walk.c @@ -391,45 +391,56 @@ loop: if(top != Erv) goto nottop; walktype(n->left, Erv); - if(n->left == N) + + l = n->left; + if(l == N) + goto ret; + t = n->type; + if(t == T) goto ret; - convlit(n->left, n->type); + convlit(l, t); // nil conversion - if(eqtype(n->type, n->left->type, 0)) { - if(n->left->op != ONAME) - *n = *n->left; + if(eqtype(t, l->type, 0)) { + if(l->op != ONAME) + *n = *l; goto ret; } // simple fix-float - if(n->left->type != T) - if(isint[n->left->type->etype] || isfloat[n->left->type->etype]) - if(isint[n->type->etype] || isfloat[n->type->etype]) { + if(l->type != T) + if(isint[l->type->etype] || isfloat[l->type->etype]) + if(isint[t->etype] || isfloat[t->etype]) { evconst(n); goto ret; } // to string - if(isptrto(n->type, TSTRING)) { - if(isint[n->left->type->etype]) { + if(isptrto(t, TSTRING)) { + if(isint[l->type->etype]) { *n = *stringop(n, top); goto ret; } - if(isbytearray(n->left->type) != 0) { + if(isbytearray(l->type) != 0) { n->op = OARRAY; *n = *stringop(n, top); goto ret; } } - if(n->type->etype == TARRAY) { - arrayconv(n->type, n->left); + if(t->etype == TARRAY) { + arrayconv(t, l); + goto ret; + } + + r = isandss(n->type, l); + if(r != N) { + *n = *r; goto ret; } - badtype(n->op, n->left->type, n->type); + badtype(n->op, l->type, t); goto ret; case ORETURN: @@ -2083,9 +2094,45 @@ diagnamed(Type *t) } Node* -convas(Node *n) +isandss(Type *lt, Node *r) { + Type *rt; + Node *n; 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; Type *lt, *rt; @@ -2124,35 +2171,15 @@ convas(Node *n) if(eqtype(lt, rt, 0)) return n; - 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; - } + r = isandss(lt, r); + if(r != N) { + n->right = r; + walktype(n, Etop); + return n; } badtype(n->op, lt, rt); return n; - -ret: - diagnamed(lt); - diagnamed(rt); - - n->right = nod(o, r, N); - n->right->type = l->type; - walktype(n, Etop); - return n; } void