From: Ken Thompson Date: Sat, 12 Jul 2008 20:08:53 +0000 (-0700) Subject: more on channels X-Git-Tag: weekly.2009-11-06~3514 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=3856e45e030b815633a8d336b723031ef902226b;p=gostls13.git more on channels arg space magic number for morestack SVN=126936 --- diff --git a/src/cmd/6g/gen.c b/src/cmd/6g/gen.c index 9049cb4c63..e4dfa2c4bd 100644 --- a/src/cmd/6g/gen.c +++ b/src/cmd/6g/gen.c @@ -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); diff --git a/src/cmd/6g/list.c b/src/cmd/6g/list.c index 93dd756020..53ef173d48 100644 --- a/src/cmd/6g/list.c +++ b/src/cmd/6g/list.c @@ -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; diff --git a/src/cmd/gc/export.c b/src/cmd/gc/export.c index d84e203686..31972ba241 100644 --- a/src/cmd/gc/export.c +++ b/src/cmd/gc/export.c @@ -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); +} diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h index e039db7d66..d1877b66d5 100644 --- a/src/cmd/gc/go.h +++ b/src/cmd/gc/go.h @@ -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*); diff --git a/src/cmd/gc/go.y b/src/cmd/gc/go.y index 1d72912f0d..aea7fec71f 100644 --- a/src/cmd/gc/go.y +++ b/src/cmd/gc/go.y @@ -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 diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c index 72ff4b8f1e..7816b45d05 100644 --- a/src/cmd/gc/subr.c +++ b/src/cmd/gc/subr.c @@ -1295,6 +1295,7 @@ loop: case TPTR32: case TPTR64: + case TCHAN: stp = &st->type; goto loop; diff --git a/src/cmd/gc/sys.go b/src/cmd/gc/sys.go index ebb9351ea0..bb731315a1 100644 --- a/src/cmd/gc/sys.go +++ b/src/cmd/gc/sys.go @@ -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 diff --git a/src/cmd/gc/sysimport.c b/src/cmd/gc/sysimport.c index 91dd561c3b..6e01adbd49 100644 --- a/src/cmd/gc/sysimport.c +++ b/src/cmd/gc/sysimport.c @@ -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" ; diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c index 242233d20b..ef03993220 100644 --- a/src/cmd/gc/walk.c +++ b/src/cmd/gc/walk.c @@ -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) {