]> Cypherpunks repositories - gostls13.git/commitdiff
string([]int) conversion
authorKen Thompson <ken@golang.org>
Wed, 27 May 2009 22:38:02 +0000 (15:38 -0700)
committerKen Thompson <ken@golang.org>
Wed, 27 May 2009 22:38:02 +0000 (15:38 -0700)
R=r
OCL=29466
CL=29466

src/cmd/gc/builtin.c.boot
src/cmd/gc/sys.go
src/cmd/gc/walk.c
src/runtime/string.c

index 97574f7103b309b36b348cc31c90b430b70f1c84..6ee50e035e7bc7d2a052a28e6f0351938be4b76c 100644 (file)
@@ -20,6 +20,7 @@ char *sysimport =
        "func sys.indexstring (? string, ? int) (? uint8)\n"
        "func sys.intstring (? int64) (? string)\n"
        "func sys.arraystring (? []uint8) (? string)\n"
+       "func sys.arraystringi (? []int) (? string)\n"
        "func sys.stringiter (? string, ? int) (? int)\n"
        "func sys.stringiter2 (? string, ? int) (retk int, retv int)\n"
        "func sys.ifaceI2E (iface any) (ret any)\n"
index 270ca04da46967a1369c69e9deaa68d8162df91e..3a278d9ff993c51c56eb085b2f05810be538a15f 100644 (file)
@@ -29,6 +29,7 @@ func  slicestring(string, int, int) string;
 func   indexstring(string, int) byte;
 func   intstring(int64) string;
 func   arraystring([]byte) string;
+func   arraystringi([]int) string;
 func   stringiter(string, int) int;
 func   stringiter2(string, int) (retk int, retv int);
 
index e47be30ff44a847728e0c606ffb93b42838f6d33..96cd4005412a73727b5d367f5693a3bb024eb0a6 100644 (file)
@@ -1293,6 +1293,7 @@ walkconv(Node *n)
                        indir(n, stringop(n, Erv));
                        return;
                }
+
                // can convert []byte and *[10]byte
                if((isptr[et] && isfixedarray(l->type->type) && istype(l->type->type->type, TUINT8))
                || (isslice(l->type) && istype(l->type->type, TUINT8))) {
@@ -1300,6 +1301,14 @@ walkconv(Node *n)
                        indir(n, stringop(n, Erv));
                        return;
                }
+
+               // can convert []int and *[10]int
+               if((isptr[et] && isfixedarray(l->type->type) && istype(l->type->type->type, TINT))
+               || (isslice(l->type) && istype(l->type->type, TINT))) {
+                       n->op = OARRAY;
+                       indir(n, stringop(n, Erv));
+                       return;
+               }
        }
 
        // convert dynamic to static generated by ONEW/OMAKE
@@ -2450,8 +2459,17 @@ stringop(Node *n, int top)
                break;
 
        case OARRAY:
-               // arraystring([]byte) string;
                r = n->left;
+               if(r->type != T && r->type->type != T) {
+                       if(istype(r->type->type, TINT) || istype(r->type->type->type, TINT)) {
+                               // arraystring([]byte) string;
+                               on = syslook("arraystringi", 0);
+                               r = nod(OCALL, on, r);
+                               break;
+                       }
+               }
+
+               // arraystring([]byte) string;
                on = syslook("arraystring", 0);
                r = nod(OCALL, on, r);
                break;
index d7393ef6ed3b11929c0af1b7e73b29256799c4ce..04cf06bc3c86ce30edb7041fbdbe3c3d0243c393 100644 (file)
@@ -181,6 +181,28 @@ sys·arraystring(Array b, String s)
        FLUSH(&s);
 }
 
+void
+sys·arraystringi(Array b, String s)
+{
+       int32 siz, i;
+       int32 *a;
+       byte dum[8];
+
+       a = (int32*)b.array;
+       siz = 0;
+       for(i=0; i<b.nel; i++) {
+               siz += runetochar(dum, a[i]);
+       }
+
+       s = gostringsize(siz);
+       siz = 0;
+       for(i=0; i<b.nel; i++) {
+               siz += runetochar(s.str+siz, a[i]);
+       }
+
+       FLUSH(&s);
+}
+
 enum
 {
        Runeself        = 0x80,