]> Cypherpunks repositories - gostls13.git/commitdiff
put i2s, s2i and i2i in convert
authorKen Thompson <ken@golang.org>
Wed, 13 Aug 2008 02:13:09 +0000 (19:13 -0700)
committerKen Thompson <ken@golang.org>
Wed, 13 Aug 2008 02:13:09 +0000 (19:13 -0700)
R=r
OCL=14143
CL=14143

src/cmd/gc/go.h
src/cmd/gc/walk.c

index a1377fba4b6b5955780bd2b391bc81f138988ee0..b8ddcc3cd042a58004715da646e3e46a17117c4b 100644 (file)
@@ -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*);
index 36021ec0c921f895256792fe746af0c334bca33f..3e3491bc02b13bdd42d3bb11f453835a9f693a62 100644 (file)
@@ -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