]> Cypherpunks repositories - gostls13.git/commitdiff
more on channels
authorKen Thompson <ken@golang.org>
Sat, 12 Jul 2008 20:08:53 +0000 (13:08 -0700)
committerKen Thompson <ken@golang.org>
Sat, 12 Jul 2008 20:08:53 +0000 (13:08 -0700)
arg space magic number for morestack

SVN=126936

src/cmd/6g/gen.c
src/cmd/6g/list.c
src/cmd/gc/export.c
src/cmd/gc/go.h
src/cmd/gc/go.y
src/cmd/gc/subr.c
src/cmd/gc/sys.go
src/cmd/gc/sysimport.c
src/cmd/gc/walk.c

index 9049cb4c630e4de6f5e713c47198e00f8b2d6ac0..e4dfa2c4bd7c96b961bab879ed1aadd0e98e6816 100644 (file)
@@ -22,7 +22,7 @@ compile(Node *fn)
        Plist *pl;
        Node nod1;
        Prog *ptxt;
-       long lno;
+       long lno, argsiz;
 
 if(newproc == N) {
        newproc = nod(ONAME, N, N);
@@ -69,8 +69,15 @@ if(newproc == N) {
        pc->as = ARET;  // overwrite AEND
        pc->lineno = lineno;
 
+       // fill in argument size
+       argsiz = getthisx(curfn->type) -> width;
+       argsiz += getinargx(curfn->type) -> width;
+       argsiz += getoutargx(curfn->type) -> width;
+       ptxt->to.offset = rnd(argsiz, maxround);
+
        // fill in final stack size
-       ptxt->to.offset = rnd(stksize+maxarg, maxround);
+       ptxt->to.offset <<= 32;
+       ptxt->to.offset |= rnd(stksize+maxarg, maxround);
 
        if(debug['f'])
                frame(0);
index 93dd756020b23f4c472f1bda0cf26b88894d5e1d..53ef173d488cc0dd60e135809aa5c519f4e95b69 100644 (file)
@@ -50,14 +50,23 @@ Pconv(Fmt *fp)
 
        p = va_arg(fp->args, Prog*);
        sconsize = 8;
-       if(p->as == ADATA) {
+       switch(p->as) {
+       default:
+               snprint(str, sizeof(str), "%.4ld (%4ld) %-7A %D,%D",
+                       p->loc, p->lineno, p->as, &p->from, &p->to);
+               break;
+
+       case ADATA:
                sconsize = p->from.scale;
                snprint(str, sizeof(str), "%.4ld (%4ld) %-7A %D/%d,%D",
                        p->loc, p->lineno, p->as, &p->from, sconsize, &p->to);
-               return fmtstrcpy(fp, str);
+               break;
+
+       case ATEXT:
+               snprint(str, sizeof(str), "%.4ld (%4ld) %-7A %D,%lD",
+                       p->loc, p->lineno, p->as, &p->from, &p->to);
+               break;
        }
-       snprint(str, sizeof(str), "%.4ld (%4ld) %-7A %D,%D",
-               p->loc, p->lineno, p->as, &p->from, &p->to);
        return fmtstrcpy(fp, str);
 }
 
@@ -67,6 +76,7 @@ Dconv(Fmt *fp)
        char str[40], s[20];
        Addr *a;
        int i;
+       ulong d1, d2;
 
        a = va_arg(fp->args, Addr*);
        i = a->type;
@@ -111,6 +121,12 @@ Dconv(Fmt *fp)
                break;
 
        case D_CONST:
+               if(fp->flags & FmtLong) {
+                       d1 = a->offset & 0xffffffffLL;
+                       d2 = (a->offset>>32) & 0xffffffffLL;
+                       sprint(str, "$%lud-%lud", d1, d2);
+                       break;
+               }
                sprint(str, "$%lld", a->offset);
                break;
 
index d84e203686b7c038f04394055179e2a4908bda1e..31972ba24108b20713ed60750bd4e868ea64fbb3 100644 (file)
@@ -233,6 +233,16 @@ dumpexporttype(Sym *s)
                        Bprint(bout, "!");
                Bprint(bout, "%lS [%lS] %lS\n", s, t->down->sym, t->type->sym);
                break;
+
+       case TCHAN:
+               reexport(t->type);
+
+               /* type 8 */
+               Bprint(bout, "\ttype ");
+               if(s->export != 0)
+                       Bprint(bout, "!");
+               Bprint(bout, "%lS %d %lS\n", s, t->chan, t->type->sym);
+               break;
        }
 }
 
@@ -624,3 +634,25 @@ doimport7(Node *ss, Node *n)
 
        importaddtyp(ss, t);
 }
+
+/*
+ * LTYPE importsym chdir importsym
+ * interface type
+ */
+void
+doimport8(Node *ss, Val *v, Node *st)
+{
+       Type *t;
+       Sym *s;
+       int dir;
+
+       s = pkglookup(st->sym->name, st->psym->name);
+       dir = v->vval;
+
+       t = typ(TCHAN);
+       s = pkglookup(st->sym->name, st->psym->name);
+       t->type = s->otype;
+       t->chan = dir;
+
+       importaddtyp(ss, t);
+}
index e039db7d6632dbe14cc5998e38eef8eca118b50b..d1877b66d53805878ed3ba14a3e7f64bdb5832ae 100644 (file)
@@ -96,9 +96,9 @@ struct        Type
        Type*   nforw;
 
        // TFUNCT
-       Type*   this;
-       Type*   argout;
-       Type*   argin;
+//     Type*   this;
+//     Type*   argout;
+//     Type*   argin;
        Node*   nname;
 
        // TARRAY
@@ -563,6 +563,7 @@ void        doimport4(Node*, Node*);
 void   doimport5(Node*, Val*);
 void   doimport6(Node*, Node*);
 void   doimport7(Node*, Node*);
+void   doimport8(Node*, Val*, Node*);
 
 /*
  *     walk.c
@@ -583,6 +584,7 @@ Node*       nodpanic(long);
 Node*  newcompat(Node*);
 Node*  stringop(Node*, int);
 Node*  mapop(Node*, int);
+Node*  chanop(Node*, int);
 Node*  convas(Node*);
 void   arrayconv(Type*, Node*);
 Node*  colas(Node*, Node*);
index 1d72912f0d48b1e0e4127db03d97679190242a0a..aea7fec71f601a54e037bdc8f26a228902dbb40d 100644 (file)
@@ -910,6 +910,14 @@ chandir:
        {
                $$ = Csend;
        }
+|      LLT LGT
+       {
+               $$ = Cboth;
+       }
+|      LGT LLT
+       {
+               $$ = 0;
+       }
 
 keyval:
        expr ':' expr
@@ -1481,6 +1489,11 @@ hidden_import:
                // type interface
                doimport7($2, $4);
        }
+|      LTYPE hidden_importsym LLITERAL hidden_importsym
+       {
+               // type interface
+               doimport8($2, &$3, $4);
+       }
 
 isym:
        sym '.' sym
index 72ff4b8f1ecb191c1af273501f4214a99715244c..7816b45d05b0ade70b83ad10cfce7dd22bdbf1a0 100644 (file)
@@ -1295,6 +1295,7 @@ loop:
 
        case TPTR32:
        case TPTR64:
+       case TCHAN:
                stp = &st->type;
                goto loop;
 
index ebb9351ea0b9a07a6e0c8cb411de8f900867472f..bb731315a1726d00ed46371651c0ff7ddd95196f 100644 (file)
@@ -44,6 +44,8 @@ func  mapaccess2(hmap *map[any]any, key any) (val any, pres bool);
 func   mapassign1(hmap *map[any]any, key any, val any);
 func   mapassign2(hmap *map[any]any, key any, val any, pres bool);
 
+func   newchan(elemsize uint32, elemalg uint32, hint uint32) (hchan *chan any);
+
 func   gosched();
 func   goexit();
 
@@ -89,13 +91,16 @@ export
        Inf,
        NaN,
 
-       // op map
+       // map
        newmap
        mapaccess1
        mapaccess2
        mapassign1
        mapassign2
 
+       // chan
+       newchan
+
        // go routines
        gosched
        goexit
index 91dd561c3b042831c194ab73d18e4c289aa3e3b1..6e01adbd492220b9ca8a17b525a349fd6c24ecfb 100644 (file)
@@ -3,10 +3,10 @@ char* sysimport =
        "type sys._esys_002 {}\n"
        "type sys.any 24\n"
        "type sys._esys_003 *sys.any\n"
-       "type sys._osys_262 {_esys_260 sys._esys_003}\n"
+       "type sys._osys_281 {_esys_279 sys._esys_003}\n"
        "type sys.uint32 6\n"
-       "type sys._isys_264 {_esys_261 sys.uint32}\n"
-       "type sys._esys_001 (sys._esys_002 sys._osys_262 sys._isys_264)\n"
+       "type sys._isys_283 {_esys_280 sys.uint32}\n"
+       "type sys._esys_001 (sys._esys_002 sys._osys_281 sys._isys_283)\n"
        "var !sys.mal sys._esys_001\n"
        "type sys._esys_005 {}\n"
        "type sys._esys_006 {}\n"
@@ -16,202 +16,209 @@ char*     sysimport =
        "type sys._esys_009 {}\n"
        "type sys._esys_010 {}\n"
        "type sys.int32 5\n"
-       "type sys._isys_270 {_esys_269 sys.int32}\n"
-       "type sys._esys_008 (sys._esys_009 sys._esys_010 sys._isys_270)\n"
+       "type sys._isys_289 {_esys_288 sys.int32}\n"
+       "type sys._esys_008 (sys._esys_009 sys._esys_010 sys._isys_289)\n"
        "var !sys.panicl sys._esys_008\n"
        "type sys._esys_012 {}\n"
        "type sys._esys_013 {}\n"
        "type sys.bool 12\n"
-       "type sys._isys_275 {_esys_274 sys.bool}\n"
-       "type sys._esys_011 (sys._esys_012 sys._esys_013 sys._isys_275)\n"
+       "type sys._isys_294 {_esys_293 sys.bool}\n"
+       "type sys._esys_011 (sys._esys_012 sys._esys_013 sys._isys_294)\n"
        "var !sys.printbool sys._esys_011\n"
        "type sys._esys_015 {}\n"
        "type sys._esys_016 {}\n"
        "type sys.float64 10\n"
-       "type sys._isys_280 {_esys_279 sys.float64}\n"
-       "type sys._esys_014 (sys._esys_015 sys._esys_016 sys._isys_280)\n"
+       "type sys._isys_299 {_esys_298 sys.float64}\n"
+       "type sys._esys_014 (sys._esys_015 sys._esys_016 sys._isys_299)\n"
        "var !sys.printfloat sys._esys_014\n"
        "type sys._esys_018 {}\n"
        "type sys._esys_019 {}\n"
        "type sys.int64 7\n"
-       "type sys._isys_285 {_esys_284 sys.int64}\n"
-       "type sys._esys_017 (sys._esys_018 sys._esys_019 sys._isys_285)\n"
+       "type sys._isys_304 {_esys_303 sys.int64}\n"
+       "type sys._esys_017 (sys._esys_018 sys._esys_019 sys._isys_304)\n"
        "var !sys.printint sys._esys_017\n"
        "type sys._esys_021 {}\n"
        "type sys._esys_022 {}\n"
        "type sys._esys_023 25\n"
        "type sys.string *sys._esys_023\n"
-       "type sys._isys_290 {_esys_289 sys.string}\n"
-       "type sys._esys_020 (sys._esys_021 sys._esys_022 sys._isys_290)\n"
+       "type sys._isys_309 {_esys_308 sys.string}\n"
+       "type sys._esys_020 (sys._esys_021 sys._esys_022 sys._isys_309)\n"
        "var !sys.printstring sys._esys_020\n"
        "type sys._esys_025 {}\n"
        "type sys._esys_026 {}\n"
        "type sys.uint8 2\n"
        "type sys._esys_027 *sys.uint8\n"
-       "type sys._isys_295 {_esys_294 sys._esys_027}\n"
-       "type sys._esys_024 (sys._esys_025 sys._esys_026 sys._isys_295)\n"
+       "type sys._isys_314 {_esys_313 sys._esys_027}\n"
+       "type sys._esys_024 (sys._esys_025 sys._esys_026 sys._isys_314)\n"
        "var !sys.printpointer sys._esys_024\n"
        "type sys._esys_029 {}\n"
-       "type sys._osys_302 {_esys_299 sys.string}\n"
-       "type sys._isys_304 {_esys_300 sys.string _esys_301 sys.string}\n"
-       "type sys._esys_028 (sys._esys_029 sys._osys_302 sys._isys_304)\n"
+       "type sys._osys_321 {_esys_318 sys.string}\n"
+       "type sys._isys_323 {_esys_319 sys.string _esys_320 sys.string}\n"
+       "type sys._esys_028 (sys._esys_029 sys._osys_321 sys._isys_323)\n"
        "var !sys.catstring sys._esys_028\n"
        "type sys._esys_031 {}\n"
-       "type sys._osys_312 {_esys_309 sys.int32}\n"
-       "type sys._isys_314 {_esys_310 sys.string _esys_311 sys.string}\n"
-       "type sys._esys_030 (sys._esys_031 sys._osys_312 sys._isys_314)\n"
+       "type sys._osys_331 {_esys_328 sys.int32}\n"
+       "type sys._isys_333 {_esys_329 sys.string _esys_330 sys.string}\n"
+       "type sys._esys_030 (sys._esys_031 sys._osys_331 sys._isys_333)\n"
        "var !sys.cmpstring sys._esys_030\n"
        "type sys._esys_033 {}\n"
-       "type sys._osys_323 {_esys_319 sys.string}\n"
-       "type sys._isys_325 {_esys_320 sys.string _esys_321 sys.int32 _esys_322 sys.int32}\n"
-       "type sys._esys_032 (sys._esys_033 sys._osys_323 sys._isys_325)\n"
+       "type sys._osys_342 {_esys_338 sys.string}\n"
+       "type sys._isys_344 {_esys_339 sys.string _esys_340 sys.int32 _esys_341 sys.int32}\n"
+       "type sys._esys_032 (sys._esys_033 sys._osys_342 sys._isys_344)\n"
        "var !sys.slicestring sys._esys_032\n"
        "type sys._esys_035 {}\n"
-       "type sys._osys_334 {_esys_331 sys.uint8}\n"
-       "type sys._isys_336 {_esys_332 sys.string _esys_333 sys.int32}\n"
-       "type sys._esys_034 (sys._esys_035 sys._osys_334 sys._isys_336)\n"
+       "type sys._osys_353 {_esys_350 sys.uint8}\n"
+       "type sys._isys_355 {_esys_351 sys.string _esys_352 sys.int32}\n"
+       "type sys._esys_034 (sys._esys_035 sys._osys_353 sys._isys_355)\n"
        "var !sys.indexstring sys._esys_034\n"
        "type sys._esys_037 {}\n"
-       "type sys._osys_343 {_esys_341 sys.string}\n"
-       "type sys._isys_345 {_esys_342 sys.int64}\n"
-       "type sys._esys_036 (sys._esys_037 sys._osys_343 sys._isys_345)\n"
+       "type sys._osys_362 {_esys_360 sys.string}\n"
+       "type sys._isys_364 {_esys_361 sys.int64}\n"
+       "type sys._esys_036 (sys._esys_037 sys._osys_362 sys._isys_364)\n"
        "var !sys.intstring sys._esys_036\n"
        "type sys._esys_039 {}\n"
-       "type sys._osys_352 {_esys_349 sys.string}\n"
+       "type sys._osys_371 {_esys_368 sys.string}\n"
        "type sys._esys_040 *sys.uint8\n"
-       "type sys._isys_354 {_esys_350 sys._esys_040 _esys_351 sys.int32}\n"
-       "type sys._esys_038 (sys._esys_039 sys._osys_352 sys._isys_354)\n"
+       "type sys._isys_373 {_esys_369 sys._esys_040 _esys_370 sys.int32}\n"
+       "type sys._esys_038 (sys._esys_039 sys._osys_371 sys._isys_373)\n"
        "var !sys.byteastring sys._esys_038\n"
        "type sys._esys_042 {}\n"
        "type sys._esys_043 <>\n"
-       "type sys._osys_363 {_esys_359 sys._esys_043}\n"
+       "type sys._osys_382 {_esys_378 sys._esys_043}\n"
        "type sys._esys_044 *sys.uint8\n"
        "type sys._esys_045 *sys.uint8\n"
-       "type sys._ssys_370 {}\n"
-       "type sys._esys_046 *sys._ssys_370\n"
-       "type sys._isys_365 {_esys_360 sys._esys_044 _esys_361 sys._esys_045 _esys_362 sys._esys_046}\n"
-       "type sys._esys_041 (sys._esys_042 sys._osys_363 sys._isys_365)\n"
+       "type sys._ssys_389 {}\n"
+       "type sys._esys_046 *sys._ssys_389\n"
+       "type sys._isys_384 {_esys_379 sys._esys_044 _esys_380 sys._esys_045 _esys_381 sys._esys_046}\n"
+       "type sys._esys_041 (sys._esys_042 sys._osys_382 sys._isys_384)\n"
        "var !sys.mkiface sys._esys_041\n"
        "type sys._esys_048 {}\n"
-       "type sys._osys_374 {_esys_373 sys.int32}\n"
+       "type sys._osys_393 {_esys_392 sys.int32}\n"
        "type sys._esys_049 {}\n"
-       "type sys._esys_047 (sys._esys_048 sys._osys_374 sys._esys_049)\n"
+       "type sys._esys_047 (sys._esys_048 sys._osys_393 sys._esys_049)\n"
        "var !sys.argc sys._esys_047\n"
        "type sys._esys_051 {}\n"
-       "type sys._osys_378 {_esys_377 sys.int32}\n"
+       "type sys._osys_397 {_esys_396 sys.int32}\n"
        "type sys._esys_052 {}\n"
-       "type sys._esys_050 (sys._esys_051 sys._osys_378 sys._esys_052)\n"
+       "type sys._esys_050 (sys._esys_051 sys._osys_397 sys._esys_052)\n"
        "var !sys.envc sys._esys_050\n"
        "type sys._esys_054 {}\n"
-       "type sys._osys_383 {_esys_381 sys.string}\n"
-       "type sys._isys_385 {_esys_382 sys.int32}\n"
-       "type sys._esys_053 (sys._esys_054 sys._osys_383 sys._isys_385)\n"
+       "type sys._osys_402 {_esys_400 sys.string}\n"
+       "type sys._isys_404 {_esys_401 sys.int32}\n"
+       "type sys._esys_053 (sys._esys_054 sys._osys_402 sys._isys_404)\n"
        "var !sys.argv sys._esys_053\n"
        "type sys._esys_056 {}\n"
-       "type sys._osys_391 {_esys_389 sys.string}\n"
-       "type sys._isys_393 {_esys_390 sys.int32}\n"
-       "type sys._esys_055 (sys._esys_056 sys._osys_391 sys._isys_393)\n"
+       "type sys._osys_410 {_esys_408 sys.string}\n"
+       "type sys._isys_412 {_esys_409 sys.int32}\n"
+       "type sys._esys_055 (sys._esys_056 sys._osys_410 sys._isys_412)\n"
        "var !sys.envv sys._esys_055\n"
        "type sys._esys_058 {}\n"
-       "type sys._osys_400 {_esys_397 sys.float64 _esys_398 sys.int32}\n"
-       "type sys._isys_402 {_esys_399 sys.float64}\n"
-       "type sys._esys_057 (sys._esys_058 sys._osys_400 sys._isys_402)\n"
+       "type sys._osys_419 {_esys_416 sys.float64 _esys_417 sys.int32}\n"
+       "type sys._isys_421 {_esys_418 sys.float64}\n"
+       "type sys._esys_057 (sys._esys_058 sys._osys_419 sys._isys_421)\n"
        "var !sys.frexp sys._esys_057\n"
        "type sys._esys_060 {}\n"
-       "type sys._osys_409 {_esys_406 sys.float64}\n"
-       "type sys._isys_411 {_esys_407 sys.float64 _esys_408 sys.int32}\n"
-       "type sys._esys_059 (sys._esys_060 sys._osys_409 sys._isys_411)\n"
+       "type sys._osys_428 {_esys_425 sys.float64}\n"
+       "type sys._isys_430 {_esys_426 sys.float64 _esys_427 sys.int32}\n"
+       "type sys._esys_059 (sys._esys_060 sys._osys_428 sys._isys_430)\n"
        "var !sys.ldexp sys._esys_059\n"
        "type sys._esys_062 {}\n"
-       "type sys._osys_419 {_esys_416 sys.float64 _esys_417 sys.float64}\n"
-       "type sys._isys_421 {_esys_418 sys.float64}\n"
-       "type sys._esys_061 (sys._esys_062 sys._osys_419 sys._isys_421)\n"
+       "type sys._osys_438 {_esys_435 sys.float64 _esys_436 sys.float64}\n"
+       "type sys._isys_440 {_esys_437 sys.float64}\n"
+       "type sys._esys_061 (sys._esys_062 sys._osys_438 sys._isys_440)\n"
        "var !sys.modf sys._esys_061\n"
        "type sys._esys_064 {}\n"
-       "type sys._osys_428 {_esys_425 sys.bool}\n"
-       "type sys._isys_430 {_esys_426 sys.float64 _esys_427 sys.int32}\n"
-       "type sys._esys_063 (sys._esys_064 sys._osys_428 sys._isys_430)\n"
+       "type sys._osys_447 {_esys_444 sys.bool}\n"
+       "type sys._isys_449 {_esys_445 sys.float64 _esys_446 sys.int32}\n"
+       "type sys._esys_063 (sys._esys_064 sys._osys_447 sys._isys_449)\n"
        "var !sys.isInf sys._esys_063\n"
        "type sys._esys_066 {}\n"
-       "type sys._osys_437 {_esys_435 sys.bool}\n"
-       "type sys._isys_439 {_esys_436 sys.float64}\n"
-       "type sys._esys_065 (sys._esys_066 sys._osys_437 sys._isys_439)\n"
+       "type sys._osys_456 {_esys_454 sys.bool}\n"
+       "type sys._isys_458 {_esys_455 sys.float64}\n"
+       "type sys._esys_065 (sys._esys_066 sys._osys_456 sys._isys_458)\n"
        "var !sys.isNaN sys._esys_065\n"
        "type sys._esys_068 {}\n"
-       "type sys._osys_445 {_esys_443 sys.float64}\n"
-       "type sys._isys_447 {_esys_444 sys.int32}\n"
-       "type sys._esys_067 (sys._esys_068 sys._osys_445 sys._isys_447)\n"
+       "type sys._osys_464 {_esys_462 sys.float64}\n"
+       "type sys._isys_466 {_esys_463 sys.int32}\n"
+       "type sys._esys_067 (sys._esys_068 sys._osys_464 sys._isys_466)\n"
        "var !sys.Inf sys._esys_067\n"
        "type sys._esys_070 {}\n"
-       "type sys._osys_452 {_esys_451 sys.float64}\n"
+       "type sys._osys_471 {_esys_470 sys.float64}\n"
        "type sys._esys_071 {}\n"
-       "type sys._esys_069 (sys._esys_070 sys._osys_452 sys._esys_071)\n"
+       "type sys._esys_069 (sys._esys_070 sys._osys_471 sys._esys_071)\n"
        "var !sys.NaN sys._esys_069\n"
        "type sys._esys_073 {}\n"
        "type sys._esys_075 [sys.any] sys.any\n"
        "type sys._esys_074 *sys._esys_075\n"
-       "type sys._osys_455 {hmap sys._esys_074}\n"
-       "type sys._isys_457 {keysize sys.uint32 valsize sys.uint32 keyalg sys.uint32 valalg sys.uint32 hint sys.uint32}\n"
-       "type sys._esys_072 (sys._esys_073 sys._osys_455 sys._isys_457)\n"
+       "type sys._osys_474 {hmap sys._esys_074}\n"
+       "type sys._isys_476 {keysize sys.uint32 valsize sys.uint32 keyalg sys.uint32 valalg sys.uint32 hint sys.uint32}\n"
+       "type sys._esys_072 (sys._esys_073 sys._osys_474 sys._isys_476)\n"
        "var !sys.newmap sys._esys_072\n"
        "type sys._esys_077 {}\n"
-       "type sys._osys_466 {val sys.any}\n"
+       "type sys._osys_485 {val sys.any}\n"
        "type sys._esys_079 [sys.any] sys.any\n"
        "type sys._esys_078 *sys._esys_079\n"
-       "type sys._isys_468 {hmap sys._esys_078 key sys.any}\n"
-       "type sys._esys_076 (sys._esys_077 sys._osys_466 sys._isys_468)\n"
+       "type sys._isys_487 {hmap sys._esys_078 key sys.any}\n"
+       "type sys._esys_076 (sys._esys_077 sys._osys_485 sys._isys_487)\n"
        "var !sys.mapaccess1 sys._esys_076\n"
        "type sys._esys_081 {}\n"
-       "type sys._osys_474 {val sys.any pres sys.bool}\n"
+       "type sys._osys_493 {val sys.any pres sys.bool}\n"
        "type sys._esys_083 [sys.any] sys.any\n"
        "type sys._esys_082 *sys._esys_083\n"
-       "type sys._isys_476 {hmap sys._esys_082 key sys.any}\n"
-       "type sys._esys_080 (sys._esys_081 sys._osys_474 sys._isys_476)\n"
+       "type sys._isys_495 {hmap sys._esys_082 key sys.any}\n"
+       "type sys._esys_080 (sys._esys_081 sys._osys_493 sys._isys_495)\n"
        "var !sys.mapaccess2 sys._esys_080\n"
        "type sys._esys_085 {}\n"
        "type sys._esys_086 {}\n"
        "type sys._esys_088 [sys.any] sys.any\n"
        "type sys._esys_087 *sys._esys_088\n"
-       "type sys._isys_483 {hmap sys._esys_087 key sys.any val sys.any}\n"
-       "type sys._esys_084 (sys._esys_085 sys._esys_086 sys._isys_483)\n"
+       "type sys._isys_502 {hmap sys._esys_087 key sys.any val sys.any}\n"
+       "type sys._esys_084 (sys._esys_085 sys._esys_086 sys._isys_502)\n"
        "var !sys.mapassign1 sys._esys_084\n"
        "type sys._esys_090 {}\n"
        "type sys._esys_091 {}\n"
        "type sys._esys_093 [sys.any] sys.any\n"
        "type sys._esys_092 *sys._esys_093\n"
-       "type sys._isys_489 {hmap sys._esys_092 key sys.any val sys.any pres sys.bool}\n"
-       "type sys._esys_089 (sys._esys_090 sys._esys_091 sys._isys_489)\n"
+       "type sys._isys_508 {hmap sys._esys_092 key sys.any val sys.any pres sys.bool}\n"
+       "type sys._esys_089 (sys._esys_090 sys._esys_091 sys._isys_508)\n"
        "var !sys.mapassign2 sys._esys_089\n"
        "type sys._esys_095 {}\n"
-       "type sys._esys_096 {}\n"
-       "type sys._esys_097 {}\n"
-       "type sys._esys_094 (sys._esys_095 sys._esys_096 sys._esys_097)\n"
-       "var !sys.gosched sys._esys_094\n"
+       "type sys._esys_097 1 sys.any\n"
+       "type sys._esys_096 *sys._esys_097\n"
+       "type sys._osys_515 {hchan sys._esys_096}\n"
+       "type sys._isys_517 {elemsize sys.uint32 elemalg sys.uint32 hint sys.uint32}\n"
+       "type sys._esys_094 (sys._esys_095 sys._osys_515 sys._isys_517)\n"
+       "var !sys.newchan sys._esys_094\n"
        "type sys._esys_099 {}\n"
        "type sys._esys_100 {}\n"
        "type sys._esys_101 {}\n"
        "type sys._esys_098 (sys._esys_099 sys._esys_100 sys._esys_101)\n"
-       "var !sys.goexit sys._esys_098\n"
+       "var !sys.gosched sys._esys_098\n"
        "type sys._esys_103 {}\n"
-       "type sys._osys_501 {_esys_498 sys.string _esys_499 sys.bool}\n"
-       "type sys._isys_503 {_esys_500 sys.string}\n"
-       "type sys._esys_102 (sys._esys_103 sys._osys_501 sys._isys_503)\n"
-       "var !sys.readfile sys._esys_102\n"
+       "type sys._esys_104 {}\n"
        "type sys._esys_105 {}\n"
-       "type sys._osys_512 {_esys_507 sys.int32 _esys_508 sys.int32}\n"
-       "type sys._esys_106 *sys.uint8\n"
-       "type sys._isys_514 {_esys_509 sys._esys_106 _esys_510 sys.int32 _esys_511 sys.int32}\n"
-       "type sys._esys_104 (sys._esys_105 sys._osys_512 sys._isys_514)\n"
-       "var !sys.bytestorune sys._esys_104\n"
-       "type sys._esys_108 {}\n"
-       "type sys._osys_525 {_esys_520 sys.int32 _esys_521 sys.int32}\n"
-       "type sys._isys_527 {_esys_522 sys.string _esys_523 sys.int32 _esys_524 sys.int32}\n"
-       "type sys._esys_107 (sys._esys_108 sys._osys_525 sys._isys_527)\n"
-       "var !sys.stringtorune sys._esys_107\n"
-       "type sys._esys_110 {}\n"
-       "type sys._esys_111 {}\n"
-       "type sys._isys_534 {_esys_533 sys.int32}\n"
-       "type sys._esys_109 (sys._esys_110 sys._esys_111 sys._isys_534)\n"
-       "var !sys.exit sys._esys_109\n"
+       "type sys._esys_102 (sys._esys_103 sys._esys_104 sys._esys_105)\n"
+       "var !sys.goexit sys._esys_102\n"
+       "type sys._esys_107 {}\n"
+       "type sys._osys_529 {_esys_526 sys.string _esys_527 sys.bool}\n"
+       "type sys._isys_531 {_esys_528 sys.string}\n"
+       "type sys._esys_106 (sys._esys_107 sys._osys_529 sys._isys_531)\n"
+       "var !sys.readfile sys._esys_106\n"
+       "type sys._esys_109 {}\n"
+       "type sys._osys_540 {_esys_535 sys.int32 _esys_536 sys.int32}\n"
+       "type sys._esys_110 *sys.uint8\n"
+       "type sys._isys_542 {_esys_537 sys._esys_110 _esys_538 sys.int32 _esys_539 sys.int32}\n"
+       "type sys._esys_108 (sys._esys_109 sys._osys_540 sys._isys_542)\n"
+       "var !sys.bytestorune sys._esys_108\n"
+       "type sys._esys_112 {}\n"
+       "type sys._osys_553 {_esys_548 sys.int32 _esys_549 sys.int32}\n"
+       "type sys._isys_555 {_esys_550 sys.string _esys_551 sys.int32 _esys_552 sys.int32}\n"
+       "type sys._esys_111 (sys._esys_112 sys._osys_553 sys._isys_555)\n"
+       "var !sys.stringtorune sys._esys_111\n"
+       "type sys._esys_114 {}\n"
+       "type sys._esys_115 {}\n"
+       "type sys._isys_562 {_esys_561 sys.int32}\n"
+       "type sys._esys_113 (sys._esys_114 sys._esys_115 sys._isys_562)\n"
+       "var !sys.exit sys._esys_113\n"
        "))\n"
 ;
index 242233d20be4c60d3825db16120e6ff9e5cd6c1b..ef03993220f9ee6fa05184b512633c7eb954c5e9 100644 (file)
@@ -1219,6 +1219,10 @@ newcompat(Node *n)
                r = mapop(n, Erv);
                return r;
        }
+       if(t->etype == TCHAN) {
+               r = chanop(n, Erv);
+               return r;
+       }
 
        if(n->left != N)
                yyerror("dont know what new(,e) means");
@@ -1371,6 +1375,32 @@ fixmap(Type *tm)
        return t;
 }
 
+Type*
+fixchan(Type *tm)
+{
+       Type *t;
+
+       t = tm->type;
+       if(t == T) {
+               fatal("fixchan: t nil");
+               return T;
+       }
+
+       if(t->etype != TCHAN) {
+               fatal("fixchan: %O not map");
+               return T;
+       }
+
+       if(t->type == T) {
+               fatal("fixchan: chan element type is nil");
+               return T;
+       }
+
+       dowidth(t->type);
+
+       return t;
+}
+
 static int
 algtype(Type *t)
 {
@@ -1593,6 +1623,49 @@ nottop:
        return N;
 }
 
+Node*
+chanop(Node *n, int top)
+{
+       Node *r, *a;
+       Type *t;
+       Node *on;
+       int alg, cl, cr;
+
+//dump("chanop", n);
+
+       r = n;
+       switch(n->op) {
+       default:
+               fatal("mapop: unknown op %E", n->op);
+
+       case ONEW:
+               // newchan(elemsize uint32, elemalg uint32,
+               //      hint uint32) (hmap *chan[any-1]);
+
+               t = fixchan(n->type);
+               if(t == T)
+                       break;
+
+               a = n->left;                            // hint
+               if(n->left == N)
+                       a = nodintconst(0);
+               r = a;
+               a = nodintconst(algtype(t->type));      // elem algorithm
+               r = nod(OLIST, a, r);
+               a = nodintconst(t->type->width);        // elem width
+               r = nod(OLIST, a, r);
+
+               on = syslook("newchan", 1);
+               argtype(on, t->type);   // any-1
+
+               r = nod(OCALL, on, r);
+               walktype(r, top);
+               r->type = n->type;
+               break;
+       }
+       return r;
+}
+
 void
 diagnamed(Type *t)
 {