1 #include "limbo.h" 2 #include "mp.h" 3 #include "libsec.h" 4 5 char *kindname[Tend] = 6 { 7 /* Tnone */ "no type", 8 /* Tadt */ "adt", 9 /* Tadtpick */ "adt", 10 /* Tarray */ "array", 11 /* Tbig */ "big", 12 /* Tbyte */ "byte", 13 /* Tchan */ "chan", 14 /* Treal */ "real", 15 /* Tfn */ "fn", 16 /* Tint */ "int", 17 /* Tlist */ "list", 18 /* Tmodule */ "module", 19 /* Tref */ "ref", 20 /* Tstring */ "string", 21 /* Ttuple */ "tuple", 22 /* Texception */ "exception", 23 /* Tfix */ "fixed point", 24 /* Tpoly */ "polymorphic", 25 26 /* Tainit */ "array initializers", 27 /* Talt */ "alt channels", 28 /* Tany */ "polymorphic type", 29 /* Tarrow */ "->", 30 /* Tcase */ "case int labels", 31 /* Tcasel */ "case big labels", 32 /* Tcasec */ "case string labels", 33 /* Tdot */ ".", 34 /* Terror */ "type error", 35 /* Tgoto */ "goto labels", 36 /* Tid */ "id", 37 /* Tiface */ "module interface", 38 /* Texcept */ "exception handler table", 39 /* Tinst */ "instantiated type", 40 }; 41 42 Tattr tattr[Tend] = 43 { 44 /* isptr refable conable big vis */ 45 /* Tnone */ { 0, 0, 0, 0, 0, }, 46 /* Tadt */ { 0, 1, 1, 1, 1, }, 47 /* Tadtpick */ { 0, 1, 0, 1, 1, }, 48 /* Tarray */ { 1, 0, 0, 0, 1, }, 49 /* Tbig */ { 0, 0, 1, 1, 1, }, 50 /* Tbyte */ { 0, 0, 1, 0, 1, }, 51 /* Tchan */ { 1, 0, 0, 0, 1, }, 52 /* Treal */ { 0, 0, 1, 1, 1, }, 53 /* Tfn */ { 0, 1, 0, 0, 1, }, 54 /* Tint */ { 0, 0, 1, 0, 1, }, 55 /* Tlist */ { 1, 0, 0, 0, 1, }, 56 /* Tmodule */ { 1, 0, 0, 0, 1, }, 57 /* Tref */ { 1, 0, 0, 0, 1, }, 58 /* Tstring */ { 1, 0, 1, 0, 1, }, 59 /* Ttuple */ { 0, 1, 1, 1, 1, }, 60 /* Texception */ { 0, 0, 0, 1, 1, }, 61 /* Tfix */ { 0, 0, 1, 0, 1, }, 62 /* Tpoly */ { 1, 0, 0, 0, 1, }, 63 64 /* Tainit */ { 0, 0, 0, 1, 0, }, 65 /* Talt */ { 0, 0, 0, 1, 0, }, 66 /* Tany */ { 1, 0, 0, 0, 0, }, 67 /* Tarrow */ { 0, 0, 0, 0, 1, }, 68 /* Tcase */ { 0, 0, 0, 1, 0, }, 69 /* Tcasel */ { 0, 0, 0, 1, 0, }, 70 /* Tcasec */ { 0, 0, 0, 1, 0, }, 71 /* Tdot */ { 0, 0, 0, 0, 1, }, 72 /* Terror */ { 0, 1, 1, 0, 0, }, 73 /* Tgoto */ { 0, 0, 0, 1, 0, }, 74 /* Tid */ { 0, 0, 0, 0, 1, }, 75 /* Tiface */ { 0, 0, 0, 1, 0, }, 76 /* Texcept */ { 0, 0, 0, 1, 0, }, 77 /* Tinst */ { 0, 1, 1, 1, 1, }, 78 }; 79 80 static Teq *eqclass[Tend]; 81 82 static Type ztype; 83 static int eqrec; 84 static int eqset; 85 static int tcomset; 86 87 static int idcompat(Decl*, Decl*, int, int); 88 static int rtcompat(Type *t1, Type *t2, int any, int); 89 static int assumeteq(Type *t1, Type *t2); 90 static int assumetcom(Type *t1, Type *t2); 91 static int cleartcomrec(Type *t); 92 static int rtequal(Type*, Type*); 93 static int cleareqrec(Type*); 94 static int idequal(Decl*, Decl*, int, int*); 95 static int pyequal(Type*, Type*); 96 static int rtsign(Type*, uchar*, int, int); 97 static int clearrec(Type*); 98 static int idsign(Decl*, int, uchar*, int, int); 99 static int idsign1(Decl*, int, uchar*, int, int); 100 static int raisessign(Node *n, uchar *sig, int lensig, int spos); 101 static void ckfix(Type*, double); 102 static int fnunify(Type*, Type*, Tpair**, int); 103 static int rtunify(Type*, Type*, Tpair**, int); 104 static int idunify(Decl*, Decl*, Tpair**, int); 105 static int toccurs(Type*, Tpair**); 106 static int fncleareqrec(Type*, Type*); 107 static Type* comtype(Src*, Type*, Decl*); 108 static Type* duptype(Type*); 109 static int tpolys(Type*); 110 111 static void 112 addtmap(Type *t1, Type *t2, Tpair **tpp) 113 { 114 Tpair *tp; 115 116 tp = allocmem(sizeof *tp); 117 tp->t1 = t1; 118 tp->t2 = t2; 119 tp->nxt = *tpp; 120 *tpp = tp; 121 } 122 123 Type* 124 valtmap(Type *t, Tpair *tp) 125 { 126 for( ; tp != nil; tp = tp->nxt) 127 if(tp->t1 == t) 128 return tp->t2; 129 return t; 130 } 131 132 Typelist* 133 addtype(Type *t, Typelist *hd) 134 { 135 Typelist *tl, *p; 136 137 tl = allocmem(sizeof(*tl)); 138 tl->t = t; 139 tl->nxt = nil; 140 if(hd == nil) 141 return tl; 142 for(p = hd; p->nxt != nil; p = p->nxt) 143 ; 144 p->nxt = tl; 145 return hd; 146 } 147 148 void 149 typeinit(void) 150 { 151 Decl *id; 152 153 anontupsym = enter(".tuple", 0); 154 155 ztype.sbl = -1; 156 ztype.ok = 0; 157 ztype.rec = 0; 158 159 tbig = mktype(&noline, &noline, Tbig, nil, nil); 160 tbig->size = IBY2LG; 161 tbig->align = IBY2LG; 162 tbig->ok = OKmask; 163 164 tbyte = mktype(&noline, &noline, Tbyte, nil, nil); 165 tbyte->size = 1; 166 tbyte->align = 1; 167 tbyte->ok = OKmask; 168 169 tint = mktype(&noline, &noline, Tint, nil, nil); 170 tint->size = IBY2WD; 171 tint->align = IBY2WD; 172 tint->ok = OKmask; 173 174 treal = mktype(&noline, &noline, Treal, nil, nil); 175 treal->size = IBY2FT; 176 treal->align = IBY2FT; 177 treal->ok = OKmask; 178 179 tstring = mktype(&noline, &noline, Tstring, nil, nil); 180 tstring->size = IBY2WD; 181 tstring->align = IBY2WD; 182 tstring->ok = OKmask; 183 184 texception = mktype(&noline, &noline, Texception, nil, nil); 185 texception->size = IBY2WD; 186 texception->align = IBY2WD; 187 texception->ok = OKmask; 188 189 tany = mktype(&noline, &noline, Tany, nil, nil); 190 tany->size = IBY2WD; 191 tany->align = IBY2WD; 192 tany->ok = OKmask; 193 194 tnone = mktype(&noline, &noline, Tnone, nil, nil); 195 tnone->size = 0; 196 tnone->align = 1; 197 tnone->ok = OKmask; 198 199 terror = mktype(&noline, &noline, Terror, nil, nil); 200 terror->size = 0; 201 terror->align = 1; 202 terror->ok = OKmask; 203 204 tunknown = mktype(&noline, &noline, Terror, nil, nil); 205 tunknown->size = 0; 206 tunknown->align = 1; 207 tunknown->ok = OKmask; 208 209 tfnptr = mktype(&noline, &noline, Ttuple, nil, nil); 210 id = tfnptr->ids = mkids(&nosrc, nil, tany, nil); 211 id->store = Dfield; 212 id->offset = 0; 213 id->sym = enter("t0", 0); 214 id->src = nosrc; 215 id = tfnptr->ids->next = mkids(&nosrc, nil, tint, nil); 216 id->store = Dfield; 217 id->offset = IBY2WD; 218 id->sym = enter("t1", 0); 219 id->src = nosrc; 220 221 rtexception = mktype(&noline, &noline, Tref, texception, nil); 222 rtexception->size = IBY2WD; 223 rtexception->align = IBY2WD; 224 rtexception->ok = OKmask; 225 } 226 227 void 228 typestart(void) 229 { 230 descriptors = nil; 231 nfns = 0; 232 nadts = 0; 233 selfdecl = nil; 234 if(tfnptr->decl != nil) 235 tfnptr->decl->desc = nil; 236 237 memset(eqclass, 0, sizeof eqclass); 238 239 typebuiltin(mkids(&nosrc, enter("int", 0), nil, nil), tint); 240 typebuiltin(mkids(&nosrc, enter("big", 0), nil, nil), tbig); 241 typebuiltin(mkids(&nosrc, enter("byte", 0), nil, nil), tbyte); 242 typebuiltin(mkids(&nosrc, enter("string", 0), nil, nil), tstring); 243 typebuiltin(mkids(&nosrc, enter("real", 0), nil, nil), treal); 244 } 245 246 Teq* 247 modclass(void) 248 { 249 return eqclass[Tmodule]; 250 } 251 252 Type* 253 mktype(Line *start, Line *stop, int kind, Type *tof, Decl *args) 254 { 255 Type *t; 256 257 t = allocmem(sizeof *t); 258 *t = ztype; 259 t->src.start = *start; 260 t->src.stop = *stop; 261 t->kind = kind; 262 t->tof = tof; 263 t->ids = args; 264 return t; 265 } 266 267 Type* 268 mktalt(Case *c) 269 { 270 Type *t; 271 char buf[32]; 272 static int nalt; 273 274 t = mktype(&noline, &noline, Talt, nil, nil); 275 t->decl = mkdecl(&nosrc, Dtype, t); 276 seprint(buf, buf+sizeof(buf), ".a%d", nalt++); 277 t->decl->sym = enter(buf, 0); 278 t->cse = c; 279 return usetype(t); 280 } 281 282 /* 283 * copy t and the top level of ids 284 */ 285 Type* 286 copytypeids(Type *t) 287 { 288 Type *nt; 289 Decl *id, *new, *last; 290 291 nt = allocmem(sizeof *nt); 292 *nt = *t; 293 last = nil; 294 for(id = t->ids; id != nil; id = id->next){ 295 new = allocmem(sizeof *id); 296 *new = *id; 297 if(last == nil) 298 nt->ids = new; 299 else 300 last->next = new; 301 last = new; 302 } 303 return nt; 304 } 305 306 /* 307 * make each of the ids have type t 308 */ 309 Decl* 310 typeids(Decl *ids, Type *t) 311 { 312 Decl *id; 313 314 if(ids == nil) 315 return nil; 316 317 ids->ty = t; 318 for(id = ids->next; id != nil; id = id->next){ 319 id->ty = t; 320 } 321 return ids; 322 } 323 324 void 325 typebuiltin(Decl *d, Type *t) 326 { 327 d->ty = t; 328 t->decl = d; 329 installids(Dtype, d); 330 } 331 332 Node * 333 fielddecl(int store, Decl *ids) 334 { 335 Node *n; 336 337 n = mkn(Ofielddecl, nil, nil); 338 n->decl = ids; 339 for(; ids != nil; ids = ids->next) 340 ids->store = store; 341 return n; 342 } 343 344 Node * 345 typedecl(Decl *ids, Type *t) 346 { 347 Node *n; 348 349 if(t->decl == nil) 350 t->decl = ids; 351 n = mkn(Otypedecl, nil, nil); 352 n->decl = ids; 353 n->ty = t; 354 for(; ids != nil; ids = ids->next) 355 ids->ty = t; 356 return n; 357 } 358 359 void 360 typedecled(Node *n) 361 { 362 installids(Dtype, n->decl); 363 } 364 365 Node * 366 adtdecl(Decl *ids, Node *fields) 367 { 368 Node *n; 369 Type *t; 370 371 n = mkn(Oadtdecl, nil, nil); 372 t = mktype(&ids->src.start, &ids->src.stop, Tadt, nil, nil); 373 n->decl = ids; 374 n->left = fields; 375 n->ty = t; 376 t->decl = ids; 377 for(; ids != nil; ids = ids->next) 378 ids->ty = t; 379 return n; 380 } 381 382 void 383 adtdecled(Node *n) 384 { 385 Decl *d, *ids; 386 387 d = n->ty->decl; 388 installids(Dtype, d); 389 if(n->ty->polys != nil){ 390 pushscope(nil, Sother); 391 installids(Dtype, n->ty->polys); 392 } 393 pushscope(nil, Sother); 394 fielddecled(n->left); 395 n->ty->ids = popscope(); 396 if(n->ty->polys != nil) 397 n->ty->polys = popscope(); 398 for(ids = n->ty->ids; ids != nil; ids = ids->next) 399 ids->dot = d; 400 } 401 402 void 403 fielddecled(Node *n) 404 { 405 for(; n != nil; n = n->right){ 406 switch(n->op){ 407 case Oseq: 408 fielddecled(n->left); 409 break; 410 case Oadtdecl: 411 adtdecled(n); 412 return; 413 case Otypedecl: 414 typedecled(n); 415 return; 416 case Ofielddecl: 417 installids(Dfield, n->decl); 418 return; 419 case Ocondecl: 420 condecled(n); 421 gdasdecl(n->right); 422 return; 423 case Oexdecl: 424 exdecled(n); 425 return; 426 case Opickdecl: 427 pickdecled(n); 428 return; 429 default: 430 fatal("can't deal with %O in fielddecled", n->op); 431 } 432 } 433 } 434 435 int 436 pickdecled(Node *n) 437 { 438 Decl *d; 439 int tag; 440 441 if(n == nil) 442 return 0; 443 tag = pickdecled(n->left); 444 pushscope(nil, Sother); 445 fielddecled(n->right->right); 446 d = n->right->left->decl; 447 d->ty->ids = popscope(); 448 installids(Dtag, d); 449 for(; d != nil; d = d->next) 450 d->tag = tag++; 451 return tag; 452 } 453 454 /* 455 * make the tuple type used to initialize adt t 456 */ 457 Type* 458 mkadtcon(Type *t) 459 { 460 Decl *id, *new, *last; 461 Type *nt; 462 463 nt = allocmem(sizeof *nt); 464 *nt = *t; 465 last = nil; 466 nt->ids = nil; 467 nt->kind = Ttuple; 468 for(id = t->ids; id != nil; id = id->next){ 469 if(id->store != Dfield) 470 continue; 471 new = allocmem(sizeof *id); 472 *new = *id; 473 new->cyc = 0; 474 if(last == nil) 475 nt->ids = new; 476 else 477 last->next = new; 478 last = new; 479 } 480 last->next = nil; 481 return nt; 482 } 483 484 /* 485 * make the tuple type used to initialize t, 486 * an adt with pick fields tagged by tg 487 */ 488 Type* 489 mkadtpickcon(Type *t, Type *tgt) 490 { 491 Decl *id, *new, *last; 492 Type *nt; 493 494 last = mkids(&tgt->decl->src, nil, tint, nil); 495 last->store = Dfield; 496 nt = mktype(&t->src.start, &t->src.stop, Ttuple, nil, last); 497 for(id = t->ids; id != nil; id = id->next){ 498 if(id->store != Dfield) 499 continue; 500 new = allocmem(sizeof *id); 501 *new = *id; 502 new->cyc = 0; 503 last->next = new; 504 last = new; 505 } 506 for(id = tgt->ids; id != nil; id = id->next){ 507 if(id->store != Dfield) 508 continue; 509 new = allocmem(sizeof *id); 510 *new = *id; 511 new->cyc = 0; 512 last->next = new; 513 last = new; 514 } 515 last->next = nil; 516 return nt; 517 } 518 519 /* 520 * make an identifier type 521 */ 522 Type* 523 mkidtype(Src *src, Sym *s) 524 { 525 Type *t; 526 527 t = mktype(&src->start, &src->stop, Tid, nil, nil); 528 if(s->unbound == nil){ 529 s->unbound = mkdecl(src, Dunbound, nil); 530 s->unbound->sym = s; 531 } 532 t->decl = s->unbound; 533 return t; 534 } 535 536 /* 537 * make a qualified type for t->s 538 */ 539 Type* 540 mkarrowtype(Line *start, Line *stop, Type *t, Sym *s) 541 { 542 Src src; 543 544 src.start = *start; 545 src.stop = *stop; 546 t = mktype(start, stop, Tarrow, t, nil); 547 if(s->unbound == nil){ 548 s->unbound = mkdecl(&src, Dunbound, nil); 549 s->unbound->sym = s; 550 } 551 t->decl = s->unbound; 552 return t; 553 } 554 555 /* 556 * make a qualified type for t.s 557 */ 558 Type* 559 mkdottype(Line *start, Line *stop, Type *t, Sym *s) 560 { 561 Src src; 562 563 src.start = *start; 564 src.stop = *stop; 565 t = mktype(start, stop, Tdot, t, nil); 566 if(s->unbound == nil){ 567 s->unbound = mkdecl(&src, Dunbound, nil); 568 s->unbound->sym = s; 569 } 570 t->decl = s->unbound; 571 return t; 572 } 573 574 Type* 575 mkinsttype(Src* src, Type *tt, Typelist *tl) 576 { 577 Type *t; 578 579 t = mktype(&src->start, &src->stop, Tinst, tt, nil); 580 t->u.tlist = tl; 581 return t; 582 } 583 584 /* 585 * look up the name f in the fields of a module, adt, or tuple 586 */ 587 Decl* 588 namedot(Decl *ids, Sym *s) 589 { 590 for(; ids != nil; ids = ids->next) 591 if(ids->sym == s) 592 return ids; 593 return nil; 594 } 595 596 /* 597 * complete the declaration of an adt 598 * methods frames get sized in module definition or during function definition 599 * place the methods at the end of the field list 600 */ 601 void 602 adtdefd(Type *t) 603 { 604 Decl *d, *id, *next, *aux, *store, *auxhd, *tagnext; 605 int seentags; 606 607 if(debug['x']) 608 print("adt %T defd\n", t); 609 d = t->decl; 610 tagnext = nil; 611 store = nil; 612 for(id = t->polys; id != nil; id = id->next){ 613 id->store = Dtype; 614 id->ty = verifytypes(id->ty, d, nil); 615 } 616 for(id = t->ids; id != nil; id = next){ 617 if(id->store == Dtag){ 618 if(t->tags != nil) 619 error(id->src.start, "only one set of pick fields allowed"); 620 tagnext = pickdefd(t, id); 621 next = tagnext; 622 if(store != nil) 623 store->next = next; 624 else 625 t->ids = next; 626 continue; 627 }else{ 628 id->dot = d; 629 next = id->next; 630 store = id; 631 } 632 } 633 aux = nil; 634 store = nil; 635 auxhd = nil; 636 seentags = 0; 637 for(id = t->ids; id != nil; id = next){ 638 if(id == tagnext) 639 seentags = 1; 640 641 next = id->next; 642 id->dot = d; 643 id->ty = topvartype(verifytypes(id->ty, d, nil), id, 1, 1); 644 if(id->store == Dfield && id->ty->kind == Tfn) 645 id->store = Dfn; 646 if(id->store == Dfn || id->store == Dconst){ 647 if(store != nil) 648 store->next = next; 649 else 650 t->ids = next; 651 if(aux != nil) 652 aux->next = id; 653 else 654 auxhd = id; 655 aux = id; 656 }else{ 657 if(seentags) 658 error(id->src.start, "pick fields must be the last data fields in an adt"); 659 store = id; 660 } 661 } 662 if(aux != nil) 663 aux->next = nil; 664 if(store != nil) 665 store->next = auxhd; 666 else 667 t->ids = auxhd; 668 669 for(id = t->tags; id != nil; id = id->next){ 670 id->ty = verifytypes(id->ty, d, nil); 671 if(id->ty->tof == nil) 672 id->ty->tof = mkadtpickcon(t, id->ty); 673 } 674 } 675 676 /* 677 * assemble the data structure for an adt with a pick clause. 678 * since the scoping rules for adt pick fields are strange, 679 * we have a customized check for overlapping definitions. 680 */ 681 Decl* 682 pickdefd(Type *t, Decl *tg) 683 { 684 Decl *id, *xid, *lasttg, *d; 685 Type *tt; 686 int tag; 687 688 lasttg = nil; 689 d = t->decl; 690 t->tags = tg; 691 tag = 0; 692 while(tg != nil){ 693 tt = tg->ty; 694 if(tt->kind != Tadtpick || tg->tag != tag) 695 break; 696 tt->decl = tg; 697 lasttg = tg; 698 for(; tg != nil; tg = tg->next){ 699 if(tg->ty != tt) 700 break; 701 tag++; 702 lasttg = tg; 703 tg->dot = d; 704 } 705 for(id = tt->ids; id != nil; id = id->next){ 706 xid = namedot(t->ids, id->sym); 707 if(xid != nil) 708 error(id->src.start, "redeclaration of %K, previously declared as %k on line %L", 709 id, xid, xid->src.start); 710 id->dot = d; 711 } 712 } 713 if(lasttg == nil){ 714 error(t->src.start, "empty pick field declaration in %T", t); 715 t->tags = nil; 716 }else 717 lasttg->next = nil; 718 d->tag = tag; 719 return tg; 720 } 721 722 Node* 723 moddecl(Decl *ids, Node *fields) 724 { 725 Node *n; 726 Type *t; 727 728 n = mkn(Omoddecl, mkn(Oseq, nil, nil), nil); 729 t = mktype(&ids->src.start, &ids->src.stop, Tmodule, nil, nil); 730 n->decl = ids; 731 n->left = fields; 732 n->ty = t; 733 return n; 734 } 735 736 void 737 moddecled(Node *n) 738 { 739 Decl *d, *ids, *im, *dot; 740 Type *t; 741 Sym *s; 742 char buf[StrSize]; 743 int isimp; 744 Dlist *dm, *dl; 745 746 d = n->decl; 747 installids(Dtype, d); 748 isimp = 0; 749 for(ids = d; ids != nil; ids = ids->next){ 750 for(im = impmods; im != nil; im = im->next){ 751 if(ids->sym == im->sym){ 752 isimp = 1; 753 d = ids; 754 dm = malloc(sizeof(Dlist)); 755 dm->d = ids; 756 dm->next = nil; 757 if(impdecls == nil) 758 impdecls = dm; 759 else{ 760 for(dl = impdecls; dl->next != nil; dl = dl->next) 761 ; 762 dl->next = dm; 763 } 764 } 765 } 766 ids->ty = n->ty; 767 } 768 pushscope(nil, Sother); 769 fielddecled(n->left); 770 771 d->ty->ids = popscope(); 772 773 /* 774 * make the current module the -> parent of all contained decls-> 775 */ 776 for(ids = d->ty->ids; ids != nil; ids = ids->next) 777 ids->dot = d; 778 779 t = d->ty; 780 t->decl = d; 781 if(debug['m']) 782 print("declare module %s\n", d->sym->name); 783 784 /* 785 * add the iface declaration in case it's needed later 786 */ 787 seprint(buf, buf+sizeof(buf), ".m.%s", d->sym->name); 788 installids(Dglobal, mkids(&d->src, enter(buf, 0), tnone, nil)); 789 790 if(isimp){ 791 for(ids = d->ty->ids; ids != nil; ids = ids->next){ 792 s = ids->sym; 793 if(s->decl != nil && s->decl->scope >= scope){ 794 dot = s->decl->dot; 795 if(s->decl->store != Dwundef && dot != nil && dot != d && isimpmod(dot->sym) && dequal(ids, s->decl, 0)) 796 continue; 797 redecl(ids); 798 ids->old = s->decl->old; 799 }else 800 ids->old = s->decl; 801 s->decl = ids; 802 ids->scope = scope; 803 } 804 } 805 } 806 807 /* 808 * for each module in id, 809 * link by field ext all of the decls for 810 * functions needed in external linkage table 811 * collect globals and make a tuple for all of them 812 */ 813 Type* 814 mkiface(Decl *m) 815 { 816 Decl *iface, *last, *globals, *glast, *id, *d; 817 Type *t; 818 char buf[StrSize]; 819 820 iface = last = allocmem(sizeof(Decl)); 821 globals = glast = mkdecl(&m->src, Dglobal, mktype(&m->src.start, &m->src.stop, Tadt, nil, nil)); 822 for(id = m->ty->ids; id != nil; id = id->next){ 823 switch(id->store){ 824 case Dglobal: 825 glast = glast->next = dupdecl(id); 826 id->iface = globals; 827 glast->iface = id; 828 break; 829 case Dfn: 830 id->iface = last = last->next = dupdecl(id); 831 last->iface = id; 832 break; 833 case Dtype: 834 if(id->ty->kind != Tadt) 835 break; 836 for(d = id->ty->ids; d != nil; d = d->next){ 837 if(d->store == Dfn){ 838 d->iface = last = last->next = dupdecl(d); 839 last->iface = d; 840 } 841 } 842 break; 843 } 844 } 845 last->next = nil; 846 iface = namesort(iface->next); 847 848 if(globals->next != nil){ 849 glast->next = nil; 850 globals->ty->ids = namesort(globals->next); 851 globals->ty->decl = globals; 852 globals->sym = enter(".mp", 0); 853 globals->dot = m; 854 globals->next = iface; 855 iface = globals; 856 } 857 858 /* 859 * make the interface type and install an identifier for it 860 * the iface has a ref count if it is loaded 861 */ 862 t = mktype(&m->src.start, &m->src.stop, Tiface, nil, iface); 863 seprint(buf, buf+sizeof(buf), ".m.%s", m->sym->name); 864 id = enter(buf, 0)->decl; 865 t->decl = id; 866 id->ty = t; 867 868 /* 869 * dummy node so the interface is initialized 870 */ 871 id->init = mkn(Onothing, nil, nil); 872 id->init->ty = t; 873 id->init->decl = id; 874 return t; 875 } 876 877 void 878 joiniface(Type *mt, Type *t) 879 { 880 Decl *id, *d, *iface, *globals; 881 882 iface = t->ids; 883 globals = iface; 884 if(iface != nil && iface->store == Dglobal) 885 iface = iface->next; 886 for(id = mt->tof->ids; id != nil; id = id->next){ 887 switch(id->store){ 888 case Dglobal: 889 for(d = id->ty->ids; d != nil; d = d->next) 890 d->iface->iface = globals; 891 break; 892 case Dfn: 893 id->iface->iface = iface; 894 iface = iface->next; 895 break; 896 default: 897 fatal("unknown store %k in joiniface", id); 898 break; 899 } 900 } 901 if(iface != nil) 902 fatal("join iface not matched"); 903 mt->tof = t; 904 } 905 906 void 907 addiface(Decl *m, Decl *d) 908 { 909 Type *t; 910 Decl *id, *last, *dd, *lastorig; 911 Dlist *dl; 912 913 if(d == nil || !local(d)) 914 return; 915 modrefable(d->ty); 916 if(m == nil){ 917 if(impdecls->next != nil) 918 for(dl = impdecls; dl != nil; dl = dl->next) 919 if(dl->d->ty->tof != impdecl->ty->tof) /* impdecl last */ 920 addiface(dl->d, d); 921 addiface(impdecl, d); 922 return; 923 } 924 t = m->ty->tof; 925 last = nil; 926 lastorig = nil; 927 for(id = t->ids; id != nil; id = id->next){ 928 if(d == id || d == id->iface) 929 return; 930 last = id; 931 if(id->tag == 0) 932 lastorig = id; 933 } 934 dd = dupdecl(d); 935 if(d->dot == nil) 936 d->dot = dd->dot = m; 937 d->iface = dd; 938 dd->iface = d; 939 if(debug['v']) print("addiface %p %p\n", d, dd); 940 if(last == nil) 941 t->ids = dd; 942 else 943 last->next = dd; 944 dd->tag = 1; /* mark so not signed */ 945 if(lastorig == nil) 946 t->ids = namesort(t->ids); 947 else 948 lastorig->next = namesort(lastorig->next); 949 } 950 951 /* 952 * eliminate unused declarations from interfaces 953 * label offset within interface 954 */ 955 void 956 narrowmods(void) 957 { 958 Teq *eq; 959 Decl *id, *last; 960 Type *t; 961 long offset; 962 963 for(eq = modclass(); eq != nil; eq = eq->eq){ 964 t = eq->ty->tof; 965 966 if(t->linkall == 0){ 967 last = nil; 968 for(id = t->ids; id != nil; id = id->next){ 969 if(id->refs == 0){ 970 if(last == nil) 971 t->ids = id->next; 972 else 973 last->next = id->next; 974 }else 975 last = id; 976 } 977 978 /* 979 * need to resize smaller interfaces 980 */ 981 resizetype(t); 982 } 983 984 offset = 0; 985 for(id = t->ids; id != nil; id = id->next) 986 id->offset = offset++; 987 988 /* 989 * rathole to stuff number of entries in interface 990 */ 991 t->decl->init->val = offset; 992 } 993 } 994 995 /* 996 * check to see if any data field of module m if referenced. 997 * if so, mark all data in m 998 */ 999 void 1000 moddataref(void) 1001 { 1002 Teq *eq; 1003 Decl *id; 1004 1005 for(eq = modclass(); eq != nil; eq = eq->eq){ 1006 id = eq->ty->tof->ids; 1007 if(id != nil && id->store == Dglobal && id->refs) 1008 for(id = eq->ty->ids; id != nil; id = id->next) 1009 if(id->store == Dglobal) 1010 modrefable(id->ty); 1011 } 1012 } 1013 1014 /* 1015 * move the global declarations in interface to the front 1016 */ 1017 Decl* 1018 modglobals(Decl *mod, Decl *globals) 1019 { 1020 Decl *id, *head, *last; 1021 1022 /* 1023 * make a copy of all the global declarations 1024 * used for making a type descriptor for globals ONLY 1025 * note we now have two declarations for the same variables, 1026 * which is apt to cause problems if code changes 1027 * 1028 * here we fix up the offsets for the real declarations 1029 */ 1030 idoffsets(mod->ty->ids, 0, 1); 1031 1032 last = head = allocmem(sizeof(Decl)); 1033 for(id = mod->ty->ids; id != nil; id = id->next) 1034 if(id->store == Dglobal) 1035 last = last->next = dupdecl(id); 1036 1037 last->next = globals; 1038 return head->next; 1039 } 1040 1041 /* 1042 * snap all id type names to the actual type 1043 * check that all types are completely defined 1044 * verify that the types look ok 1045 */ 1046 Type* 1047 validtype(Type *t, Decl *inadt) 1048 { 1049 if(t == nil) 1050 return t; 1051 bindtypes(t); 1052 t = verifytypes(t, inadt, nil); 1053 cycsizetype(t); 1054 teqclass(t); 1055 return t; 1056 } 1057 1058 Type* 1059 usetype(Type *t) 1060 { 1061 if(t == nil) 1062 return t; 1063 t = validtype(t, nil); 1064 reftype(t); 1065 return t; 1066 } 1067 1068 Type* 1069 internaltype(Type *t) 1070 { 1071 bindtypes(t); 1072 t->ok = OKverify; 1073 sizetype(t); 1074 t->ok = OKmask; 1075 return t; 1076 } 1077 1078 /* 1079 * checks that t is a valid top-level type 1080 */ 1081 Type* 1082 topvartype(Type *t, Decl *id, int tyok, int polyok) 1083 { 1084 if(t->kind == Tadt && t->tags != nil || t->kind == Tadtpick) 1085 error(id->src.start, "cannot declare %s with type %T", id->sym->name, t); 1086 if(!tyok && t->kind == Tfn) 1087 error(id->src.start, "cannot declare %s to be a function", id->sym->name); 1088 if(!polyok && (t->kind == Tadt || t->kind == Tadtpick) && ispolyadt(t)) 1089 error(id->src.start, "cannot declare %s of a polymorphic type", id->sym->name); 1090 return t; 1091 } 1092 1093 Type* 1094 toptype(Src *src, Type *t) 1095 { 1096 if(t->kind == Tadt && t->tags != nil || t->kind == Tadtpick) 1097 error(src->start, "%T, an adt with pick fields, must be used with ref", t); 1098 if(t->kind == Tfn) 1099 error(src->start, "data cannot have a fn type like %T", t); 1100 return t; 1101 } 1102 1103 static Type* 1104 comtype(Src *src, Type *t, Decl* adtd) 1105 { 1106 if(adtd == nil && (t->kind == Tadt || t->kind == Tadtpick) && ispolyadt(t)) 1107 error(src->start, "polymorphic type %T illegal here", t); 1108 return t; 1109 } 1110 1111 void 1112 usedty(Type *t) 1113 { 1114 if(t != nil && (t->ok | OKmodref) != OKmask) 1115 fatal("used ty %t %2.2ux", t, t->ok); 1116 } 1117 1118 void 1119 bindtypes(Type *t) 1120 { 1121 Decl *id; 1122 Typelist *tl; 1123 1124 if(t == nil) 1125 return; 1126 if((t->ok & OKbind) == OKbind) 1127 return; 1128 t->ok |= OKbind; 1129 switch(t->kind){ 1130 case Tadt: 1131 if(t->polys != nil){ 1132 pushscope(nil, Sother); 1133 installids(Dtype, t->polys); 1134 } 1135 if(t->val != nil) 1136 mergepolydecs(t); 1137 if(t->polys != nil){ 1138 popscope(); 1139 for(id = t->polys; id != nil; id = id->next) 1140 bindtypes(id->ty); 1141 } 1142 break; 1143 case Tadtpick: 1144 case Tmodule: 1145 case Terror: 1146 case Tint: 1147 case Tbig: 1148 case Tstring: 1149 case Treal: 1150 case Tbyte: 1151 case Tnone: 1152 case Tany: 1153 case Tiface: 1154 case Tainit: 1155 case Talt: 1156 case Tcase: 1157 case Tcasel: 1158 case Tcasec: 1159 case Tgoto: 1160 case Texcept: 1161 case Tfix: 1162 case Tpoly: 1163 break; 1164 case Tarray: 1165 case Tarrow: 1166 case Tchan: 1167 case Tdot: 1168 case Tlist: 1169 case Tref: 1170 bindtypes(t->tof); 1171 break; 1172 case Tid: 1173 id = t->decl->sym->decl; 1174 if(id == nil) 1175 id = undefed(&t->src, t->decl->sym); 1176 /* save a little space */ 1177 id->sym->unbound = nil; 1178 t->decl = id; 1179 break; 1180 case Ttuple: 1181 case Texception: 1182 for(id = t->ids; id != nil; id = id->next) 1183 bindtypes(id->ty); 1184 break; 1185 case Tfn: 1186 if(t->polys != nil){ 1187 pushscope(nil, Sother); 1188 installids(Dtype, t->polys); 1189 } 1190 for(id = t->ids; id != nil; id = id->next) 1191 bindtypes(id->ty); 1192 bindtypes(t->tof); 1193 if(t->val != nil) 1194 mergepolydecs(t); 1195 if(t->polys != nil){ 1196 popscope(); 1197 for(id = t->polys; id != nil; id = id->next) 1198 bindtypes(id->ty); 1199 } 1200 break; 1201 case Tinst: 1202 bindtypes(t->tof); 1203 for(tl = t->u.tlist; tl != nil; tl = tl->nxt) 1204 bindtypes(tl->t); 1205 break; 1206 default: 1207 fatal("bindtypes: unknown type kind %d", t->kind); 1208 } 1209 } 1210 1211 /* 1212 * walk the type checking for validity 1213 */ 1214 Type* 1215 verifytypes(Type *t, Decl *adtt, Decl *poly) 1216 { 1217 Node *n; 1218 Decl *id, *id1, *last; 1219 char buf[32]; 1220 int i, cyc; 1221 Ok ok, ok1; 1222 double max; 1223 Typelist *tl; 1224 1225 if(t == nil) 1226 return nil; 1227 if((t->ok & OKverify) == OKverify) 1228 return t; 1229 t->ok |= OKverify; 1230 if((t->ok & (OKverify|OKbind)) != (OKverify|OKbind)) 1231 fatal("verifytypes bogus ok for %t", t); 1232 cyc = t->flags&CYCLIC; 1233 switch(t->kind){ 1234 case Terror: 1235 case Tint: 1236 case Tbig: 1237 case Tstring: 1238 case Treal: 1239 case Tbyte: 1240 case Tnone: 1241 case Tany: 1242 case Tiface: 1243 case Tainit: 1244 case Talt: 1245 case Tcase: 1246 case Tcasel: 1247 case Tcasec: 1248 case Tgoto: 1249 case Texcept: 1250 break; 1251 case Tfix: 1252 n = t->val; 1253 max = 0.0; 1254 if(n->op == Oseq){ 1255 ok = echeck(n->left, 0, 0, n); 1256 ok1 = echeck(n->right, 0, 0, n); 1257 if(!ok.ok || !ok1.ok) 1258 return terror; 1259 if(n->left->ty != treal || n->right->ty != treal){ 1260 error(t->src.start, "fixed point scale/maximum not real"); 1261 return terror; 1262 } 1263 n->right = fold(n->right); 1264 if(n->right->op != Oconst){ 1265 error(t->src.start, "fixed point maximum not constant"); 1266 return terror; 1267 } 1268 if((max = n->right->rval) <= 0){ 1269 error(t->src.start, "non-positive fixed point maximum"); 1270 return terror; 1271 } 1272 n = n->left; 1273 } 1274 else{ 1275 ok = echeck(n, 0, 0, nil); 1276 if(!ok.ok) 1277 return terror; 1278 if(n->ty != treal){ 1279 error(t->src.start, "fixed point scale not real"); 1280 return terror; 1281 } 1282 } 1283 n = t->val = fold(n); 1284 if(n->op != Oconst){ 1285 error(t->src.start, "fixed point scale not constant"); 1286 return terror; 1287 } 1288 if(n->rval <= 0){ 1289 error(t->src.start, "non-positive fixed point scale"); 1290 return terror; 1291 } 1292 ckfix(t, max); 1293 break; 1294 case Tref: 1295 t->tof = comtype(&t->src, verifytypes(t->tof, adtt, nil), adtt); 1296 if(t->tof != nil && !tattr[t->tof->kind].refable){ 1297 error(t->src.start, "cannot have a ref %T", t->tof); 1298 return terror; 1299 } 1300 if(0 && t->tof->kind == Tfn && t->tof->ids != nil && t->tof->ids->implicit) 1301 error(t->src.start, "function references cannot have a self argument"); 1302 if(0 && t->tof->kind == Tfn && t->polys != nil) 1303 error(t->src.start, "function references cannot be polymorphic"); 1304 break; 1305 case Tchan: 1306 case Tarray: 1307 case Tlist: 1308 t->tof = comtype(&t->src, toptype(&t->src, verifytypes(t->tof, adtt, nil)), adtt); 1309 break; 1310 case Tid: 1311 t->ok &= ~OKverify; 1312 t = verifytypes(idtype(t), adtt, nil); 1313 break; 1314 case Tarrow: 1315 t->ok &= ~OKverify; 1316 t = verifytypes(arrowtype(t, adtt), adtt, nil); 1317 break; 1318 case Tdot: 1319 /* 1320 * verify the parent adt & lookup the tag fields 1321 */ 1322 t->ok &= ~OKverify; 1323 t = verifytypes(dottype(t, adtt), adtt, nil); 1324 break; 1325 case Tadt: 1326 /* 1327 * this is where Tadt may get tag fields added 1328 */ 1329 adtdefd(t); 1330 break; 1331 case Tadtpick: 1332 for(id = t->ids; id != nil; id = id->next){ 1333 id->ty = topvartype(verifytypes(id->ty, id->dot, nil), id, 0, 1); 1334 if(id->store == Dconst) 1335 error(t->src.start, "pick fields cannot be a con like %s", id->sym->name); 1336 } 1337 verifytypes(t->decl->dot->ty, nil, nil); 1338 break; 1339 case Tmodule: 1340 for(id = t->ids; id != nil; id = id->next){ 1341 id->ty = verifytypes(id->ty, nil, nil); 1342 if(id->store == Dglobal && id->ty->kind == Tfn) 1343 id->store = Dfn; 1344 if(id->store != Dtype && id->store != Dfn) 1345 topvartype(id->ty, id, 0, 0); 1346 } 1347 break; 1348 case Ttuple: 1349 case Texception: 1350 if(t->decl == nil){ 1351 t->decl = mkdecl(&t->src, Dtype, t); 1352 t->decl->sym = enter(".tuple", 0); 1353 } 1354 i = 0; 1355 for(id = t->ids; id != nil; id = id->next){ 1356 id->store = Dfield; 1357 if(id->sym == nil){ 1358 seprint(buf, buf+sizeof(buf), "t%d", i); 1359 id->sym = enter(buf, 0); 1360 } 1361 i++; 1362 id->ty = toptype(&id->src, verifytypes(id->ty, adtt, nil)); 1363 /* id->ty = comtype(&id->src, toptype(&id->src, verifytypes(id->ty, adtt, nil)), adtt); */ 1364 } 1365 break; 1366 case Tfn: 1367 last = nil; 1368 for(id = t->ids; id != nil; id = id->next){ 1369 id->store = Darg; 1370 id->ty = topvartype(verifytypes(id->ty, adtt, nil), id, 0, 1); 1371 if(id->implicit){ 1372 Decl *selfd; 1373 1374 selfd = poly ? poly : adtt; 1375 if(selfd == nil) 1376 error(t->src.start, "function is not a member of an adt, so can't use self"); 1377 else if(id != t->ids) 1378 error(id->src.start, "only the first argument can use self"); 1379 else if(id->ty != selfd->ty && (id->ty->kind != Tref || id->ty->tof != selfd->ty)) 1380 error(id->src.start, "self argument's type must be %s or ref %s", 1381 selfd->sym->name, selfd->sym->name); 1382 } 1383 last = id; 1384 } 1385 for(id = t->polys; id != nil; id = id->next){ 1386 if(adtt != nil){ 1387 for(id1 = adtt->ty->polys; id1 != nil; id1 = id1->next){ 1388 if(id1->sym == id->sym) 1389 id->ty = id1->ty; 1390 } 1391 } 1392 id->store = Dtype; 1393 id->ty = verifytypes(id->ty, adtt, nil); 1394 } 1395 t->tof = comtype(&t->src, toptype(&t->src, verifytypes(t->tof, adtt, nil)), adtt); 1396 if(t->varargs && (last == nil || last->ty != tstring)) 1397 error(t->src.start, "variable arguments must be preceded by a string"); 1398 if(t->varargs && t->polys != nil) 1399 error(t->src.start, "polymorphic functions must not have variable arguments"); 1400 break; 1401 case Tpoly: 1402 for(id = t->ids; id != nil; id = id->next){ 1403 id->store = Dfn; 1404 id->ty = verifytypes(id->ty, adtt, t->decl); 1405 } 1406 break; 1407 case Tinst: 1408 t->ok &= ~OKverify; 1409 t->tof = verifytypes(t->tof, adtt, nil); 1410 for(tl = t->u.tlist; tl != nil; tl = tl->nxt) 1411 tl->t = verifytypes(tl->t, adtt, nil); 1412 t = verifytypes(insttype(t, adtt, nil), adtt, nil); 1413 break; 1414 default: 1415 fatal("verifytypes: unknown type kind %d", t->kind); 1416 } 1417 if(cyc) 1418 t->flags |= CYCLIC; 1419 return t; 1420 } 1421 1422 /* 1423 * resolve an id type 1424 */ 1425 Type* 1426 idtype(Type *t) 1427 { 1428 Decl *id; 1429 Type *tt; 1430 1431 id = t->decl; 1432 if(id->store == Dunbound) 1433 fatal("idtype: unbound decl"); 1434 tt = id->ty; 1435 if(id->store != Dtype && id->store != Dtag){ 1436 if(id->store == Dundef){ 1437 id->store = Dwundef; 1438 error(t->src.start, "%s is not declared", id->sym->name); 1439 }else if(id->store == Dimport){ 1440 id->store = Dwundef; 1441 error(t->src.start, "%s's type cannot be determined", id->sym->name); 1442 }else if(id->store != Dwundef) 1443 error(t->src.start, "%s is not a type", id->sym->name); 1444 return terror; 1445 } 1446 if(tt == nil){ 1447 error(t->src.start, "%t not fully defined", t); 1448 return terror; 1449 } 1450 return tt; 1451 } 1452 1453 /* 1454 * resolve a -> qualified type 1455 */ 1456 Type* 1457 arrowtype(Type *t, Decl *adtt) 1458 { 1459 Type *tt; 1460 Decl *id; 1461 1462 id = t->decl; 1463 if(id->ty != nil){ 1464 if(id->store == Dunbound) 1465 fatal("arrowtype: unbound decl has a type"); 1466 return id->ty; 1467 } 1468 1469 /* 1470 * special hack to allow module variables to derive other types 1471 */ 1472 tt = t->tof; 1473 if(tt->kind == Tid){ 1474 id = tt->decl; 1475 if(id->store == Dunbound) 1476 fatal("arrowtype: Tid's decl unbound"); 1477 if(id->store == Dimport){ 1478 id->store = Dwundef; 1479 error(t->src.start, "%s's type cannot be determined", id->sym->name); 1480 return terror; 1481 } 1482 1483 /* 1484 * forward references to module variables can't be resolved 1485 */ 1486 if(id->store != Dtype && !(id->ty->ok & OKbind)){ 1487 error(t->src.start, "%s's type cannot be determined", id->sym->name); 1488 return terror; 1489 } 1490 1491 if(id->store == Dwundef) 1492 return terror; 1493 tt = id->ty = verifytypes(id->ty, adtt, nil); 1494 if(tt == nil){ 1495 error(t->tof->src.start, "%T is not a module", t->tof); 1496 return terror; 1497 } 1498 }else 1499 tt = verifytypes(t->tof, adtt, nil); 1500 t->tof = tt; 1501 if(tt == terror) 1502 return terror; 1503 if(tt->kind != Tmodule){ 1504 error(t->src.start, "%T is not a module", tt); 1505 return terror; 1506 } 1507 id = namedot(tt->ids, t->decl->sym); 1508 if(id == nil){ 1509 error(t->src.start, "%s is not a member of %T", t->decl->sym->name, tt); 1510 return terror; 1511 } 1512 if(id->store == Dtype && id->ty != nil){ 1513 t->decl = id; 1514 return id->ty; 1515 } 1516 error(t->src.start, "%T is not a type", t); 1517 return terror; 1518 } 1519 1520 /* 1521 * resolve a . qualified type 1522 */ 1523 Type* 1524 dottype(Type *t, Decl *adtt) 1525 { 1526 Type *tt; 1527 Decl *id; 1528 1529 if(t->decl->ty != nil){ 1530 if(t->decl->store == Dunbound) 1531 fatal("dottype: unbound decl has a type"); 1532 return t->decl->ty; 1533 } 1534 t->tof = tt = verifytypes(t->tof, adtt, nil); 1535 if(tt == terror) 1536 return terror; 1537 if(tt->kind != Tadt){ 1538 error(t->src.start, "%T is not an adt", tt); 1539 return terror; 1540 } 1541 id = namedot(tt->tags, t->decl->sym); 1542 if(id != nil && id->ty != nil){ 1543 t->decl = id; 1544 return id->ty; 1545 } 1546 error(t->src.start, "%s is not a pick tag of %T", t->decl->sym->name, tt); 1547 return terror; 1548 } 1549 1550 Type* 1551 insttype(Type *t, Decl *adtt, Tpair **tp) 1552 { 1553 Type *tt; 1554 Typelist *tl; 1555 Decl *ids; 1556 Tpair *tp1, *tp2; 1557 Src src; 1558 1559 src = t->src; 1560 if(tp == nil){ 1561 tp2 = nil; 1562 tp = &tp2; 1563 } 1564 if(t->tof->kind != Tadt && t->tof->kind != Tadtpick){ 1565 error(src.start, "%T is not an adt", t->tof); 1566 return terror; 1567 } 1568 if(t->tof->kind == Tadt) 1569 ids = t->tof->polys; 1570 else 1571 ids = t->tof->decl->dot->ty->polys; 1572 if(ids == nil){ 1573 error(src.start, "%T is not a polymorphic adt", t->tof); 1574 return terror; 1575 } 1576 for(tl = t->u.tlist; tl != nil && ids != nil; tl = tl->nxt, ids = ids->next){ 1577 tt = tl->t; 1578 if(!tattr[tt->kind].isptr){ 1579 error(src.start, "%T is not a pointer type", tt); 1580 return terror; 1581 } 1582 unifysrc = src; 1583 if(!tunify(ids->ty, tt, &tp1)){ 1584 error(src.start, "type %T does not match %T", tt, ids->ty); 1585 return terror; 1586 } 1587 /* usetype(tt); */ 1588 tt = verifytypes(tt, adtt, nil); 1589 addtmap(ids->ty, tt, tp); 1590 } 1591 if(tl != nil){ 1592 error(src.start, "too many actual types in instantiation"); 1593 return terror; 1594 } 1595 if(ids != nil){ 1596 error(src.start, "too few actual types in instantiation"); 1597 return terror; 1598 } 1599 tp1 = *tp; 1600 tt = t->tof; 1601 t = expandtype(tt, t, adtt, tp); 1602 if(t == tt && adtt == nil) 1603 t = duptype(t); 1604 if(t != tt){ 1605 t->u.tmap = tp1; 1606 if(debug['w']){ 1607 print("tmap for %T: ", t); 1608 for( ; tp1!=nil; tp1=tp1->nxt) 1609 print("%T -> %T ", tp1->t1, tp1->t2); 1610 print("\n"); 1611 } 1612 } 1613 t->src = src; 1614 return t; 1615 } 1616 1617 /* 1618 * walk a type, putting all adts, modules, and tuples into equivalence classes 1619 */ 1620 void 1621 teqclass(Type *t) 1622 { 1623 Decl *id, *tg; 1624 Teq *teq; 1625 1626 if(t == nil || (t->ok & OKclass) == OKclass) 1627 return; 1628 t->ok |= OKclass; 1629 switch(t->kind){ 1630 case Terror: 1631 case Tint: 1632 case Tbig: 1633 case Tstring: 1634 case Treal: 1635 case Tbyte: 1636 case Tnone: 1637 case Tany: 1638 case Tiface: 1639 case Tainit: 1640 case Talt: 1641 case Tcase: 1642 case Tcasel: 1643 case Tcasec: 1644 case Tgoto: 1645 case Texcept: 1646 case Tfix: 1647 case Tpoly: 1648 return; 1649 case Tref: 1650 teqclass(t->tof); 1651 return; 1652 case Tchan: 1653 case Tarray: 1654 case Tlist: 1655 teqclass(t->tof); 1656 if(!debug['Z']) 1657 return; 1658 break; 1659 case Tadt: 1660 case Tadtpick: 1661 case Ttuple: 1662 case Texception: 1663 for(id = t->ids; id != nil; id = id->next) 1664 teqclass(id->ty); 1665 for(tg = t->tags; tg != nil; tg = tg->next) 1666 teqclass(tg->ty); 1667 for(id = t->polys; id != nil; id = id->next) 1668 teqclass(id->ty); 1669 break; 1670 case Tmodule: 1671 t->tof = mkiface(t->decl); 1672 for(id = t->ids; id != nil; id = id->next) 1673 teqclass(id->ty); 1674 break; 1675 case Tfn: 1676 for(id = t->ids; id != nil; id = id->next) 1677 teqclass(id->ty); 1678 for(id = t->polys; id != nil; id = id->next) 1679 teqclass(id->ty); 1680 teqclass(t->tof); 1681 return; 1682 default: 1683 fatal("teqclass: unknown type kind %d", t->kind); 1684 return; 1685 } 1686 1687 /* 1688 * find an equivalent type 1689 * stupid linear lookup could be made faster 1690 */ 1691 if((t->ok & OKsized) != OKsized) 1692 fatal("eqclass type not sized: %t", t); 1693 1694 for(teq = eqclass[t->kind]; teq != nil; teq = teq->eq){ 1695 if(t->size == teq->ty->size && tequal(t, teq->ty)){ 1696 t->eq = teq; 1697 if(t->kind == Tmodule) 1698 joiniface(t, t->eq->ty->tof); 1699 return; 1700 } 1701 } 1702 1703 /* 1704 * if no equiv type, make one 1705 */ 1706 t->eq = allocmem(sizeof(Teq)); 1707 t->eq->id = 0; 1708 t->eq->ty = t; 1709 t->eq->eq = eqclass[t->kind]; 1710 eqclass[t->kind] = t->eq; 1711 } 1712 1713 /* 1714 * record that we've used the type 1715 * using a type uses all types reachable from that type 1716 */ 1717 void 1718 reftype(Type *t) 1719 { 1720 Decl *id, *tg; 1721 1722 if(t == nil || (t->ok & OKref) == OKref) 1723 return; 1724 t->ok |= OKref; 1725 if(t->decl != nil && t->decl->refs == 0) 1726 t->decl->refs++; 1727 switch(t->kind){ 1728 case Terror: 1729 case Tint: 1730 case Tbig: 1731 case Tstring: 1732 case Treal: 1733 case Tbyte: 1734 case Tnone: 1735 case Tany: 1736 case Tiface: 1737 case Tainit: 1738 case Talt: 1739 case Tcase: 1740 case Tcasel: 1741 case Tcasec: 1742 case Tgoto: 1743 case Texcept: 1744 case Tfix: 1745 case Tpoly: 1746 break; 1747 case Tref: 1748 case Tchan: 1749 case Tarray: 1750 case Tlist: 1751 if(t->decl != nil){ 1752 if(nadts >= lenadts){ 1753 lenadts = nadts + 32; 1754 adts = reallocmem(adts, lenadts * sizeof *adts); 1755 } 1756 adts[nadts++] = t->decl; 1757 } 1758 reftype(t->tof); 1759 break; 1760 case Tadt: 1761 case Tadtpick: 1762 case Ttuple: 1763 case Texception: 1764 if(t->kind == Tadt || t->kind == Ttuple && t->decl->sym != anontupsym){ 1765 if(nadts >= lenadts){ 1766 lenadts = nadts + 32; 1767 adts = reallocmem(adts, lenadts * sizeof *adts); 1768 } 1769 adts[nadts++] = t->decl; 1770 } 1771 for(id = t->ids; id != nil; id = id->next) 1772 if(id->store != Dfn) 1773 reftype(id->ty); 1774 for(tg = t->tags; tg != nil; tg = tg->next) 1775 reftype(tg->ty); 1776 for(id = t->polys; id != nil; id = id->next) 1777 reftype(id->ty); 1778 if(t->kind == Tadtpick) 1779 reftype(t->decl->dot->ty); 1780 break; 1781 case Tmodule: 1782 /* 1783 * a module's elements should get used individually 1784 * but do the globals for any sbl file 1785 */ 1786 if(bsym != nil) 1787 for(id = t->ids; id != nil; id = id->next) 1788 if(id->store == Dglobal) 1789 reftype(id->ty); 1790 break; 1791 case Tfn: 1792 for(id = t->ids; id != nil; id = id->next) 1793 reftype(id->ty); 1794 for(id = t->polys; id != nil; id = id->next) 1795 reftype(id->ty); 1796 reftype(t->tof); 1797 break; 1798 default: 1799 fatal("reftype: unknown type kind %d", t->kind); 1800 break; 1801 } 1802 } 1803 1804 /* 1805 * check all reachable types for cycles and illegal forward references 1806 * find the size of all the types 1807 */ 1808 void 1809 cycsizetype(Type *t) 1810 { 1811 Decl *id, *tg; 1812 1813 if(t == nil || (t->ok & (OKcycsize|OKcyc|OKsized)) == (OKcycsize|OKcyc|OKsized)) 1814 return; 1815 t->ok |= OKcycsize; 1816 switch(t->kind){ 1817 case Terror: 1818 case Tint: 1819 case Tbig: 1820 case Tstring: 1821 case Treal: 1822 case Tbyte: 1823 case Tnone: 1824 case Tany: 1825 case Tiface: 1826 case Tainit: 1827 case Talt: 1828 case Tcase: 1829 case Tcasel: 1830 case Tcasec: 1831 case Tgoto: 1832 case Texcept: 1833 case Tfix: 1834 case Tpoly: 1835 t->ok |= OKcyc; 1836 sizetype(t); 1837 break; 1838 case Tref: 1839 case Tchan: 1840 case Tarray: 1841 case Tlist: 1842 cyctype(t); 1843 sizetype(t); 1844 cycsizetype(t->tof); 1845 break; 1846 case Tadt: 1847 case Ttuple: 1848 case Texception: 1849 cyctype(t); 1850 sizetype(t); 1851 for(id = t->ids; id != nil; id = id->next) 1852 cycsizetype(id->ty); 1853 for(tg = t->tags; tg != nil; tg = tg->next){ 1854 if((tg->ty->ok & (OKcycsize|OKcyc|OKsized)) == (OKcycsize|OKcyc|OKsized)) 1855 continue; 1856 tg->ty->ok |= (OKcycsize|OKcyc|OKsized); 1857 for(id = tg->ty->ids; id != nil; id = id->next) 1858 cycsizetype(id->ty); 1859 } 1860 for(id = t->polys; id != nil; id = id->next) 1861 cycsizetype(id->ty); 1862 break; 1863 case Tadtpick: 1864 t->ok &= ~OKcycsize; 1865 cycsizetype(t->decl->dot->ty); 1866 break; 1867 case Tmodule: 1868 cyctype(t); 1869 sizetype(t); 1870 for(id = t->ids; id != nil; id = id->next) 1871 cycsizetype(id->ty); 1872 sizeids(t->ids, 0); 1873 break; 1874 case Tfn: 1875 cyctype(t); 1876 sizetype(t); 1877 for(id = t->ids; id != nil; id = id->next) 1878 cycsizetype(id->ty); 1879 for(id = t->polys; id != nil; id = id->next) 1880 cycsizetype(id->ty); 1881 cycsizetype(t->tof); 1882 sizeids(t->ids, MaxTemp); 1883 break; 1884 default: 1885 fatal("cycsizetype: unknown type kind %d", t->kind); 1886 break; 1887 } 1888 } 1889 1890 /* check for circularity in type declarations 1891 * - has to be called before verifytypes 1892 */ 1893 void 1894 tcycle(Type *t) 1895 { 1896 Decl *id; 1897 Type *tt; 1898 Typelist *tl; 1899 1900 if(t == nil) 1901 return; 1902 switch(t->kind){ 1903 default: 1904 break; 1905 case Tchan: 1906 case Tarray: 1907 case Tref: 1908 case Tlist: 1909 case Tdot: 1910 tcycle(t->tof); 1911 break; 1912 case Tfn: 1913 case Ttuple: 1914 tcycle(t->tof); 1915 for(id = t->ids; id != nil; id = id->next) 1916 tcycle(id->ty); 1917 break; 1918 case Tarrow: 1919 if(t->rec&TRvis){ 1920 error(t->src.start, "circularity in definition of %T", t); 1921 *t = *terror; /* break the cycle */ 1922 return; 1923 } 1924 tt = t->tof; 1925 t->rec |= TRvis; 1926 tcycle(tt); 1927 if(tt->kind == Tid) 1928 tt = tt->decl->ty; 1929 id = namedot(tt->ids, t->decl->sym); 1930 if(id != nil) 1931 tcycle(id->ty); 1932 t->rec &= ~TRvis; 1933 break; 1934 case Tid: 1935 if(t->rec&TRvis){ 1936 error(t->src.start, "circularity in definition of %T", t); 1937 *t = *terror; /* break the cycle */ 1938 return; 1939 } 1940 t->rec |= TRvis; 1941 tcycle(t->decl->ty); 1942 t->rec &= ~TRvis; 1943 break; 1944 case Tinst: 1945 tcycle(t->tof); 1946 for(tl = t->u.tlist; tl != nil; tl = tl->nxt) 1947 tcycle(tl->t); 1948 break; 1949 } 1950 } 1951 1952 /* 1953 * marks for checking for arcs 1954 */ 1955 enum 1956 { 1957 ArcValue = 1 << 0, 1958 ArcList = 1 << 1, 1959 ArcArray = 1 << 2, 1960 ArcRef = 1 << 3, 1961 ArcCyc = 1 << 4, /* cycle found */ 1962 ArcPolycyc = 1 << 5, 1963 }; 1964 1965 void 1966 cyctype(Type *t) 1967 { 1968 Decl *id, *tg; 1969 1970 if((t->ok & OKcyc) == OKcyc) 1971 return; 1972 t->ok |= OKcyc; 1973 t->rec |= TRcyc; 1974 switch(t->kind){ 1975 case Terror: 1976 case Tint: 1977 case Tbig: 1978 case Tstring: 1979 case Treal: 1980 case Tbyte: 1981 case Tnone: 1982 case Tany: 1983 case Tfn: 1984 case Tchan: 1985 case Tarray: 1986 case Tref: 1987 case Tlist: 1988 case Tfix: 1989 case Tpoly: 1990 break; 1991 case Tadt: 1992 case Tmodule: 1993 case Ttuple: 1994 case Texception: 1995 for(id = t->ids; id != nil; id = id->next) 1996 cycfield(t, id); 1997 for(tg = t->tags; tg != nil; tg = tg->next){ 1998 if((tg->ty->ok & OKcyc) == OKcyc) 1999 continue; 2000 tg->ty->ok |= OKcyc; 2001 for(id = tg->ty->ids; id != nil; id = id->next) 2002 cycfield(t, id); 2003 } 2004 break; 2005 default: 2006 fatal("checktype: unknown type kind %d", t->kind); 2007 break; 2008 } 2009 t->rec &= ~TRcyc; 2010 } 2011 2012 void 2013 cycfield(Type *base, Decl *id) 2014 { 2015 int arc; 2016 2017 if(!storespace[id->store]) 2018 return; 2019 arc = cycarc(base, id->ty); 2020 2021 if((arc & (ArcCyc|ArcValue)) == (ArcCyc|ArcValue)){ 2022 if(id->cycerr == 0) 2023 error(base->src.start, "illegal type cycle without a reference in field %s of %t", 2024 id->sym->name, base); 2025 id->cycerr = 1; 2026 }else if(arc & ArcCyc){ 2027 if((arc & ArcArray) && oldcycles && id->cyc == 0 && !(arc & ArcPolycyc)){ 2028 if(id->cycerr == 0) 2029 error(base->src.start, "illegal circular reference to type %T in field %s of %t", 2030 id->ty, id->sym->name, base); 2031 id->cycerr = 1; 2032 } 2033 id->cycle = 1; 2034 }else if(id->cyc != 0){ 2035 if(id->cycerr == 0) 2036 error(id->src.start, "spurious cyclic qualifier for field %s of %t", id->sym->name, base); 2037 id->cycerr = 1; 2038 } 2039 } 2040 2041 int 2042 cycarc(Type *base, Type *t) 2043 { 2044 Decl *id, *tg; 2045 int me, arc; 2046 2047 if(t == nil) 2048 return 0; 2049 if(t->rec & TRcyc){ 2050 if(tequal(t, base)){ 2051 if(t->kind == Tmodule) 2052 return ArcCyc | ArcRef; 2053 else 2054 return ArcCyc | ArcValue; 2055 } 2056 return 0; 2057 } 2058 t->rec |= TRcyc; 2059 me = 0; 2060 switch(t->kind){ 2061 case Terror: 2062 case Tint: 2063 case Tbig: 2064 case Tstring: 2065 case Treal: 2066 case Tbyte: 2067 case Tnone: 2068 case Tany: 2069 case Tchan: 2070 case Tfn: 2071 case Tfix: 2072 case Tpoly: 2073 break; 2074 case Tarray: 2075 me = cycarc(base, t->tof) & ~ArcValue | ArcArray; 2076 break; 2077 case Tref: 2078 me = cycarc(base, t->tof) & ~ArcValue | ArcRef; 2079 break; 2080 case Tlist: 2081 me = cycarc(base, t->tof) & ~ArcValue | ArcList; 2082 break; 2083 case Tadt: 2084 case Tadtpick: 2085 case Tmodule: 2086 case Ttuple: 2087 case Texception: 2088 me = 0; 2089 for(id = t->ids; id != nil; id = id->next){ 2090 if(!storespace[id->store]) 2091 continue; 2092 arc = cycarc(base, id->ty); 2093 if((arc & ArcCyc) && id->cycerr == 0) 2094 me |= arc; 2095 } 2096 for(tg = t->tags; tg != nil; tg = tg->next){ 2097 arc = cycarc(base, tg->ty); 2098 if((arc & ArcCyc) && tg->cycerr == 0) 2099 me |= arc; 2100 } 2101 2102 if(t->kind == Tmodule) 2103 me = me & ArcCyc | ArcRef | ArcPolycyc; 2104 else 2105 me &= ArcCyc | ArcValue | ArcPolycyc; 2106 break; 2107 default: 2108 fatal("cycarc: unknown type kind %d", t->kind); 2109 break; 2110 } 2111 t->rec &= ~TRcyc; 2112 if(t->flags&CYCLIC) 2113 me |= ArcPolycyc; 2114 return me; 2115 } 2116 2117 /* 2118 * set the sizes and field offsets for t 2119 * look only as deeply as needed to size this type. 2120 * cycsize type will clean up the rest. 2121 */ 2122 void 2123 sizetype(Type *t) 2124 { 2125 Decl *id, *tg; 2126 Szal szal; 2127 long sz, al, a; 2128 2129 if(t == nil) 2130 return; 2131 if((t->ok & OKsized) == OKsized) 2132 return; 2133 t->ok |= OKsized; 2134 if((t->ok & (OKverify|OKsized)) != (OKverify|OKsized)) 2135 fatal("sizetype bogus ok for %t", t); 2136 switch(t->kind){ 2137 default: 2138 fatal("sizetype: unknown type kind %d", t->kind); 2139 break; 2140 case Terror: 2141 case Tnone: 2142 case Tbyte: 2143 case Tint: 2144 case Tbig: 2145 case Tstring: 2146 case Tany: 2147 case Treal: 2148 fatal("%T should have a size", t); 2149 break; 2150 case Tref: 2151 case Tchan: 2152 case Tarray: 2153 case Tlist: 2154 case Tmodule: 2155 case Tfix: 2156 case Tpoly: 2157 t->size = t->align = IBY2WD; 2158 break; 2159 case Ttuple: 2160 case Tadt: 2161 case Texception: 2162 if(t->tags == nil){ 2163 if(!debug['z']){ 2164 szal = sizeids(t->ids, 0); 2165 t->size = align(szal.size, szal.align); 2166 t->align = szal.align; 2167 }else{ 2168 szal = sizeids(t->ids, 0); 2169 t->align = IBY2LG; 2170 t->size = align(szal.size, IBY2LG); 2171 } 2172 return; 2173 } 2174 if(!debug['z']){ 2175 szal = sizeids(t->ids, IBY2WD); 2176 sz = szal.size; 2177 al = szal.align; 2178 if(al < IBY2WD) 2179 al = IBY2WD; 2180 }else{ 2181 szal = sizeids(t->ids, IBY2WD); 2182 sz = szal.size; 2183 al = IBY2LG; 2184 } 2185 for(tg = t->tags; tg != nil; tg = tg->next){ 2186 if((tg->ty->ok & OKsized) == OKsized) 2187 continue; 2188 tg->ty->ok |= OKsized; 2189 if(!debug['z']){ 2190 szal = sizeids(tg->ty->ids, sz); 2191 a = szal.align; 2192 if(a < al) 2193 a = al; 2194 tg->ty->size = align(szal.size, a); 2195 tg->ty->align = a; 2196 }else{ 2197 szal = sizeids(tg->ty->ids, sz); 2198 tg->ty->size = align(szal.size, IBY2LG); 2199 tg->ty->align = IBY2LG; 2200 } 2201 } 2202 break; 2203 case Tfn: 2204 t->size = 0; 2205 t->align = 1; 2206 break; 2207 case Tainit: 2208 t->size = 0; 2209 t->align = 1; 2210 break; 2211 case Talt: 2212 t->size = t->cse->nlab * 2*IBY2WD + 2*IBY2WD; 2213 t->align = IBY2WD; 2214 break; 2215 case Tcase: 2216 case Tcasec: 2217 t->size = t->cse->nlab * 3*IBY2WD + 2*IBY2WD; 2218 t->align = IBY2WD; 2219 break; 2220 case Tcasel: 2221 t->size = t->cse->nlab * 6*IBY2WD + 3*IBY2WD; 2222 t->align = IBY2LG; 2223 break; 2224 case Tgoto: 2225 t->size = t->cse->nlab * IBY2WD + IBY2WD; 2226 if(t->cse->iwild != nil) 2227 t->size += IBY2WD; 2228 t->align = IBY2WD; 2229 break; 2230 case Tiface: 2231 sz = IBY2WD; 2232 for(id = t->ids; id != nil; id = id->next){ 2233 sz = align(sz, IBY2WD) + IBY2WD; 2234 sz += id->sym->len + 1; 2235 if(id->dot->ty->kind == Tadt) 2236 sz += id->dot->sym->len + 1; 2237 } 2238 t->size = sz; 2239 t->align = IBY2WD; 2240 break; 2241 case Texcept: 2242 t->size = 0; 2243 t->align = IBY2WD; 2244 break; 2245 } 2246 } 2247 2248 Szal 2249 sizeids(Decl *id, long off) 2250 { 2251 Szal szal; 2252 int a, al; 2253 2254 al = 1; 2255 for(; id != nil; id = id->next){ 2256 if(storespace[id->store]){ 2257 sizetype(id->ty); 2258 /* 2259 * alignment can be 0 if we have 2260 * illegal forward declarations. 2261 * just patch a; other code will flag an error 2262 */ 2263 a = id->ty->align; 2264 if(a == 0) 2265 a = 1; 2266 2267 if(a > al) 2268 al = a; 2269 2270 off = align(off, a); 2271 id->offset = off; 2272 off += id->ty->size; 2273 } 2274 } 2275 szal.size = off; 2276 szal.align = al; 2277 return szal; 2278 } 2279 2280 long 2281 align(long off, int align) 2282 { 2283 if(align == 0) 2284 fatal("align 0"); 2285 while(off % align) 2286 off++; 2287 return off; 2288 } 2289 2290 /* 2291 * recalculate a type's size 2292 */ 2293 void 2294 resizetype(Type *t) 2295 { 2296 if((t->ok & OKsized) == OKsized){ 2297 t->ok &= ~OKsized; 2298 cycsizetype(t); 2299 } 2300 } 2301 2302 /* 2303 * check if a module is accessable from t 2304 * if so, mark that module interface 2305 */ 2306 void 2307 modrefable(Type *t) 2308 { 2309 Decl *id, *m, *tg; 2310 2311 if(t == nil || (t->ok & OKmodref) == OKmodref) 2312 return; 2313 if((t->ok & OKverify) != OKverify) 2314 fatal("modrefable unused type %t", t); 2315 t->ok |= OKmodref; 2316 switch(t->kind){ 2317 case Terror: 2318 case Tint: 2319 case Tbig: 2320 case Tstring: 2321 case Treal: 2322 case Tbyte: 2323 case Tnone: 2324 case Tany: 2325 case Tfix: 2326 case Tpoly: 2327 break; 2328 case Tchan: 2329 case Tref: 2330 case Tarray: 2331 case Tlist: 2332 modrefable(t->tof); 2333 break; 2334 case Tmodule: 2335 t->tof->linkall = 1; 2336 t->decl->refs++; 2337 for(id = t->ids; id != nil; id = id->next){ 2338 switch(id->store){ 2339 case Dglobal: 2340 case Dfn: 2341 modrefable(id->ty); 2342 break; 2343 case Dtype: 2344 if(id->ty->kind != Tadt) 2345 break; 2346 for(m = id->ty->ids; m != nil; m = m->next) 2347 if(m->store == Dfn) 2348 modrefable(m->ty); 2349 break; 2350 } 2351 } 2352 break; 2353 case Tfn: 2354 case Tadt: 2355 case Ttuple: 2356 case Texception: 2357 for(id = t->ids; id != nil; id = id->next) 2358 if(id->store != Dfn) 2359 modrefable(id->ty); 2360 for(tg = t->tags; tg != nil; tg = tg->next){ 2361 /* 2362 if((tg->ty->ok & OKmodref) == OKmodref) 2363 continue; 2364 */ 2365 tg->ty->ok |= OKmodref; 2366 for(id = tg->ty->ids; id != nil; id = id->next) 2367 modrefable(id->ty); 2368 } 2369 for(id = t->polys; id != nil; id = id->next) 2370 modrefable(id->ty); 2371 modrefable(t->tof); 2372 break; 2373 case Tadtpick: 2374 modrefable(t->decl->dot->ty); 2375 break; 2376 default: 2377 fatal("unknown type kind %d", t->kind); 2378 break; 2379 } 2380 } 2381 2382 Desc* 2383 gendesc(Decl *d, long size, Decl *decls) 2384 { 2385 Desc *desc; 2386 2387 if(debug['D']) 2388 print("generate desc for %D\n", d); 2389 if(ispoly(d)) 2390 addfnptrs(d, 0); 2391 desc = usedesc(mkdesc(size, decls)); 2392 return desc; 2393 } 2394 2395 Desc* 2396 mkdesc(long size, Decl *d) 2397 { 2398 uchar *pmap; 2399 long len, n; 2400 2401 len = (size+8*IBY2WD-1) / (8*IBY2WD); 2402 pmap = allocmem(len); 2403 memset(pmap, 0, len); 2404 n = descmap(d, pmap, 0); 2405 if(n >= 0) 2406 n = n / (8*IBY2WD) + 1; 2407 else 2408 n = 0; 2409 if(n > len) 2410 fatal("wrote off end of decl map: %ld %ld", n, len); 2411 return enterdesc(pmap, size, n); 2412 } 2413 2414 Desc* 2415 mktdesc(Type *t) 2416 { 2417 Desc *d; 2418 uchar *pmap; 2419 long len, n; 2420 2421 usedty(t); 2422 if(debug['D']) 2423 print("generate desc for %T\n", t); 2424 if(t->decl == nil){ 2425 t->decl = mkdecl(&t->src, Dtype, t); 2426 t->decl->sym = enter("_mktdesc_", 0); 2427 } 2428 if(t->decl->desc != nil) 2429 return t->decl->desc; 2430 len = (t->size+8*IBY2WD-1) / (8*IBY2WD); 2431 pmap = allocmem(len); 2432 memset(pmap, 0, len); 2433 n = tdescmap(t, pmap, 0); 2434 if(n >= 0) 2435 n = n / (8*IBY2WD) + 1; 2436 else 2437 n = 0; 2438 if(n > len) 2439 fatal("wrote off end of type map for %T: %ld %ld 0x%2.2ux", t, n, len, t->ok); 2440 d = enterdesc(pmap, t->size, n); 2441 t->decl->desc = d; 2442 if(debug['j']){ 2443 uchar *m, *e; 2444 2445 print("generate desc for %T\n", t); 2446 print("\tdesc\t$%d,%lud,\"", d->id, d->size); 2447 e = d->map + d->nmap; 2448 for(m = d->map; m < e; m++) 2449 print("%.2x", *m); 2450 print("\"\n"); 2451 } 2452 return d; 2453 } 2454 2455 Desc* 2456 enterdesc(uchar *map, long size, long nmap) 2457 { 2458 Desc *d, *last; 2459 int c; 2460 2461 last = nil; 2462 for(d = descriptors; d != nil; d = d->next){ 2463 if(d->size > size || d->size == size && d->nmap > nmap) 2464 break; 2465 if(d->size == size && d->nmap == nmap){ 2466 c = memcmp(d->map, map, nmap); 2467 if(c == 0){ 2468 free(map); 2469 return d; 2470 } 2471 if(c > 0) 2472 break; 2473 } 2474 last = d; 2475 } 2476 d = allocmem(sizeof *d); 2477 d->id = -1; 2478 d->used = 0; 2479 d->map = map; 2480 d->size = size; 2481 d->nmap = nmap; 2482 if(last == nil){ 2483 d->next = descriptors; 2484 descriptors = d; 2485 }else{ 2486 d->next = last->next; 2487 last->next = d; 2488 } 2489 return d; 2490 } 2491 2492 Desc* 2493 usedesc(Desc *d) 2494 { 2495 d->used = 1; 2496 return d; 2497 } 2498 2499 /* 2500 * create the pointer description byte map for every type in decls 2501 * each bit corresponds to a word, and is 1 if occupied by a pointer 2502 * the high bit in the byte maps the first word 2503 */ 2504 long 2505 descmap(Decl *decls, uchar *map, long start) 2506 { 2507 Decl *d; 2508 long last, m; 2509 2510 if(debug['D']) 2511 print("descmap offset %ld\n", start); 2512 last = -1; 2513 for(d = decls; d != nil; d = d->next){ 2514 if(d->store == Dtype && d->ty->kind == Tmodule 2515 || d->store == Dfn 2516 || d->store == Dconst) 2517 continue; 2518 if(d->store == Dlocal && d->link != nil) 2519 continue; 2520 m = tdescmap(d->ty, map, d->offset + start); 2521 if(debug['D']){ 2522 if(d->sym != nil) 2523 print("descmap %s type %T offset %ld returns %ld\n", 2524 d->sym->name, d->ty, d->offset+start, m); 2525 else 2526 print("descmap type %T offset %ld returns %ld\n", d->ty, d->offset+start, m); 2527 } 2528 if(m >= 0) 2529 last = m; 2530 } 2531 return last; 2532 } 2533 2534 long 2535 tdescmap(Type *t, uchar *map, long offset) 2536 { 2537 Label *lab; 2538 long i, e, m; 2539 int bit; 2540 2541 if(t == nil) 2542 return -1; 2543 2544 m = -1; 2545 if(t->kind == Talt){ 2546 lab = t->cse->labs; 2547 e = t->cse->nlab; 2548 offset += IBY2WD * 2; 2549 for(i = 0; i < e; i++){ 2550 if(lab[i].isptr){ 2551 bit = offset / IBY2WD % 8; 2552 map[offset / (8*IBY2WD)] |= 1 << (7 - bit); 2553 m = offset; 2554 } 2555 offset += 2*IBY2WD; 2556 } 2557 return m; 2558 } 2559 if(t->kind == Tcasec){ 2560 e = t->cse->nlab; 2561 offset += IBY2WD; 2562 for(i = 0; i < e; i++){ 2563 bit = offset / IBY2WD % 8; 2564 map[offset / (8*IBY2WD)] |= 1 << (7 - bit); 2565 offset += IBY2WD; 2566 bit = offset / IBY2WD % 8; 2567 map[offset / (8*IBY2WD)] |= 1 << (7 - bit); 2568 m = offset; 2569 offset += 2*IBY2WD; 2570 } 2571 return m; 2572 } 2573 2574 if(tattr[t->kind].isptr){ 2575 bit = offset / IBY2WD % 8; 2576 map[offset / (8*IBY2WD)] |= 1 << (7 - bit); 2577 return offset; 2578 } 2579 if(t->kind == Tadtpick) 2580 t = t->tof; 2581 if(t->kind == Ttuple || t->kind == Tadt || t->kind == Texception){ 2582 if(debug['D']) 2583 print("descmap adt offset %ld\n", offset); 2584 if(t->rec != 0) 2585 fatal("illegal cyclic type %t in tdescmap", t); 2586 t->rec = 1; 2587 offset = descmap(t->ids, map, offset); 2588 t->rec = 0; 2589 return offset; 2590 } 2591 2592 return -1; 2593 } 2594 2595 /* 2596 * can a t2 be assigned to a t1? 2597 * any means Tany matches all types, 2598 * not just references 2599 */ 2600 int 2601 tcompat(Type *t1, Type *t2, int any) 2602 { 2603 int ok, v; 2604 2605 if(t1 == t2) 2606 return 1; 2607 if(t1 == nil || t2 == nil) 2608 return 0; 2609 if(t2->kind == Texception && t1->kind != Texception) 2610 t2 = mkextuptype(t2); 2611 tcomset = 0; 2612 ok = rtcompat(t1, t2, any, 0); 2613 v = cleartcomrec(t1) + cleartcomrec(t2); 2614 if(v != tcomset) 2615 fatal("recid t1 %t and t2 %t not balanced in tcompat: %d v %d", t1, t2, v, tcomset); 2616 return ok; 2617 } 2618 2619 static int 2620 rtcompat(Type *t1, Type *t2, int any, int inaorc) 2621 { 2622 if(t1 == t2) 2623 return 1; 2624 if(t1 == nil || t2 == nil) 2625 return 0; 2626 if(t1->kind == Terror || t2->kind == Terror) 2627 return 1; 2628 if(t2->kind == Texception && t1->kind != Texception) 2629 t2 = mkextuptype(t2); 2630 2631 if(debug['x']) 2632 print("rtcompat: %t and %t\n", t1, t2); 2633 2634 t1->rec |= TRcom; 2635 t2->rec |= TRcom; 2636 switch(t1->kind){ 2637 default: 2638 fatal("unknown type %t v %t in rtcompat", t1, t2); 2639 case Tstring: 2640 return t2->kind == Tstring || t2->kind == Tany; 2641 case Texception: 2642 if(t2->kind == Texception && t1->cons == t2->cons){ 2643 if(assumetcom(t1, t2)) 2644 return 1; 2645 return idcompat(t1->ids, t2->ids, 0, inaorc); 2646 } 2647 return 0; 2648 case Tnone: 2649 case Tint: 2650 case Tbig: 2651 case Tbyte: 2652 case Treal: 2653 return t1->kind == t2->kind; 2654 case Tfix: 2655 return t1->kind == t2->kind && sametree(t1->val, t2->val); 2656 case Tany: 2657 if(tattr[t2->kind].isptr) 2658 return 1; 2659 return any; 2660 case Tref: 2661 case Tlist: 2662 case Tarray: 2663 case Tchan: 2664 if(t1->kind != t2->kind){ 2665 if(t2->kind == Tany) 2666 return 1; 2667 return 0; 2668 } 2669 if(t1->kind != Tref && assumetcom(t1, t2)) 2670 return 1; 2671 return rtcompat(t1->tof, t2->tof, 0, t1->kind == Tarray || t1->kind == Tchan || inaorc); 2672 case Tfn: 2673 break; 2674 case Ttuple: 2675 if(t2->kind == Tadt && t2->tags == nil 2676 || t2->kind == Ttuple){ 2677 if(assumetcom(t1, t2)) 2678 return 1; 2679 return idcompat(t1->ids, t2->ids, any, inaorc); 2680 } 2681 if(t2->kind == Tadtpick){ 2682 t2->tof->rec |= TRcom; 2683 if(assumetcom(t1, t2->tof)) 2684 return 1; 2685 return idcompat(t1->ids, t2->tof->ids->next, any, inaorc); 2686 } 2687 return 0; 2688 case Tadt: 2689 if(t2->kind == Ttuple && t1->tags == nil){ 2690 if(assumetcom(t1, t2)) 2691 return 1; 2692 return idcompat(t1->ids, t2->ids, any, inaorc); 2693 } 2694 if(t1->tags != nil && t2->kind == Tadtpick && !inaorc) 2695 t2 = t2->decl->dot->ty; 2696 break; 2697 case Tadtpick: 2698 /* 2699 if(t2->kind == Ttuple) 2700 return idcompat(t1->tof->ids->next, t2->ids, any, inaorc); 2701 */ 2702 break; 2703 case Tmodule: 2704 if(t2->kind == Tany) 2705 return 1; 2706 break; 2707 case Tpoly: 2708 if(t2->kind == Tany) 2709 return 1; 2710 break; 2711 } 2712 return tequal(t1, t2); 2713 } 2714 2715 /* 2716 * add the assumption that t1 and t2 are compatable 2717 */ 2718 static int 2719 assumetcom(Type *t1, Type *t2) 2720 { 2721 Type *r1, *r2; 2722 2723 if(t1->tcom == nil && t2->tcom == nil){ 2724 tcomset += 2; 2725 t1->tcom = t2->tcom = t1; 2726 }else{ 2727 if(t1->tcom == nil){ 2728 r1 = t1; 2729 t1 = t2; 2730 t2 = r1; 2731 } 2732 for(r1 = t1->tcom; r1 != r1->tcom; r1 = r1->tcom) 2733 ; 2734 for(r2 = t2->tcom; r2 != nil && r2 != r2->tcom; r2 = r2->tcom) 2735 ; 2736 if(r1 == r2) 2737 return 1; 2738 if(r2 == nil) 2739 tcomset++; 2740 t2->tcom = t1; 2741 for(; t2 != r1; t2 = r2){ 2742 r2 = t2->tcom; 2743 t2->tcom = r1; 2744 } 2745 } 2746 return 0; 2747 } 2748 2749 static int 2750 cleartcomrec(Type *t) 2751 { 2752 Decl *id; 2753 int n; 2754 2755 n = 0; 2756 for(; t != nil && (t->rec & TRcom) == TRcom; t = t->tof){ 2757 t->rec &= ~TRcom; 2758 if(t->tcom != nil){ 2759 t->tcom = nil; 2760 n++; 2761 } 2762 if(t->kind == Tadtpick) 2763 n += cleartcomrec(t->tof); 2764 if(t->kind == Tmodule) 2765 t = t->tof; 2766 for(id = t->ids; id != nil; id = id->next) 2767 n += cleartcomrec(id->ty); 2768 for(id = t->tags; id != nil; id = id->next) 2769 n += cleartcomrec(id->ty); 2770 for(id = t->polys; id != nil; id = id->next) 2771 n += cleartcomrec(id->ty); 2772 } 2773 return n; 2774 } 2775 2776 /* 2777 * id1 and id2 are the fields in an adt or tuple 2778 * simple structural check; ignore names 2779 */ 2780 static int 2781 idcompat(Decl *id1, Decl *id2, int any, int inaorc) 2782 { 2783 for(; id1 != nil; id1 = id1->next){ 2784 if(id1->store != Dfield) 2785 continue; 2786 while(id2 != nil && id2->store != Dfield) 2787 id2 = id2->next; 2788 if(id2 == nil 2789 || id1->store != id2->store 2790 || !rtcompat(id1->ty, id2->ty, any, inaorc)) 2791 return 0; 2792 id2 = id2->next; 2793 } 2794 while(id2 != nil && id2->store != Dfield) 2795 id2 = id2->next; 2796 return id2 == nil; 2797 } 2798 2799 int 2800 tequal(Type *t1, Type *t2) 2801 { 2802 int ok, v; 2803 2804 eqrec = 0; 2805 eqset = 0; 2806 ok = rtequal(t1, t2); 2807 v = cleareqrec(t1) + cleareqrec(t2); 2808 if(v != eqset && 0) 2809 fatal("recid t1 %t and t2 %t not balanced in tequal: %d %d", t1, t2, v, eqset); 2810 eqset = 0; 2811 return ok; 2812 } 2813 2814 /* 2815 * structural equality on types 2816 */ 2817 static int 2818 rtequal(Type *t1, Type *t2) 2819 { 2820 /* 2821 * this is just a shortcut 2822 */ 2823 if(t1 == t2) 2824 return 1; 2825 2826 if(t1 == nil || t2 == nil) 2827 return 0; 2828 if(t1->kind == Terror || t2->kind == Terror) 2829 return 1; 2830 2831 if(t1->kind != t2->kind) 2832 return 0; 2833 2834 if(t1->eq != nil && t2->eq != nil) 2835 return t1->eq == t2->eq; 2836 2837 if(debug['x']) 2838 print("rtequal: %t and %t\n", t1, t2); 2839 2840 t1->rec |= TReq; 2841 t2->rec |= TReq; 2842 switch(t1->kind){ 2843 default: 2844 fatal("unknown type %t v %t in rtequal", t1, t2); 2845 case Tnone: 2846 case Tbig: 2847 case Tbyte: 2848 case Treal: 2849 case Tint: 2850 case Tstring: 2851 /* 2852 * this should always be caught by t1 == t2 check 2853 */ 2854 fatal("bogus value type %t vs %t in rtequal", t1, t2); 2855 return 1; 2856 case Tfix: 2857 return sametree(t1->val, t2->val); 2858 case Tref: 2859 case Tlist: 2860 case Tarray: 2861 case Tchan: 2862 if(t1->kind != Tref && assumeteq(t1, t2)) 2863 return 1; 2864 return rtequal(t1->tof, t2->tof); 2865 case Tfn: 2866 if(t1->varargs != t2->varargs) 2867 return 0; 2868 if(!idequal(t1->ids, t2->ids, 0, storespace)) 2869 return 0; 2870 /* if(!idequal(t1->polys, t2->polys, 1, nil)) */ 2871 if(!pyequal(t1, t2)) 2872 return 0; 2873 return rtequal(t1->tof, t2->tof); 2874 case Ttuple: 2875 case Texception: 2876 if(t1->kind != t2->kind || t1->cons != t2->cons) 2877 return 0; 2878 if(assumeteq(t1, t2)) 2879 return 1; 2880 return idequal(t1->ids, t2->ids, 0, storespace); 2881 case Tadt: 2882 case Tadtpick: 2883 case Tmodule: 2884 if(assumeteq(t1, t2)) 2885 return 1; 2886 /* 2887 * compare interfaces when comparing modules 2888 */ 2889 if(t1->kind == Tmodule) 2890 return idequal(t1->tof->ids, t2->tof->ids, 1, nil); 2891 2892 /* 2893 * picked adts; check parent, 2894 * assuming equiv picked fields, 2895 * then check picked fields are equiv 2896 */ 2897 if(t1->kind == Tadtpick && !rtequal(t1->decl->dot->ty, t2->decl->dot->ty)) 2898 return 0; 2899 2900 /* 2901 * adts with pick tags: check picked fields for equality 2902 */ 2903 if(!idequal(t1->tags, t2->tags, 1, nil)) 2904 return 0; 2905 2906 /* if(!idequal(t1->polys, t2->polys, 1, nil)) */ 2907 if(!pyequal(t1, t2)) 2908 return 0; 2909 return idequal(t1->ids, t2->ids, 1, storespace); 2910 case Tpoly: 2911 if(assumeteq(t1, t2)) 2912 return 1; 2913 if(t1->decl->sym != t2->decl->sym) 2914 return 0; 2915 return idequal(t1->ids, t2->ids, 1, nil); 2916 } 2917 } 2918 2919 static int 2920 assumeteq(Type *t1, Type *t2) 2921 { 2922 Type *r1, *r2; 2923 2924 if(t1->teq == nil && t2->teq == nil){ 2925 eqrec++; 2926 eqset += 2; 2927 t1->teq = t2->teq = t1; 2928 }else{ 2929 if(t1->teq == nil){ 2930 r1 = t1; 2931 t1 = t2; 2932 t2 = r1; 2933 } 2934 for(r1 = t1->teq; r1 != r1->teq; r1 = r1->teq) 2935 ; 2936 for(r2 = t2->teq; r2 != nil && r2 != r2->teq; r2 = r2->teq) 2937 ; 2938 if(r1 == r2) 2939 return 1; 2940 if(r2 == nil) 2941 eqset++; 2942 t2->teq = t1; 2943 for(; t2 != r1; t2 = r2){ 2944 r2 = t2->teq; 2945 t2->teq = r1; 2946 } 2947 } 2948 return 0; 2949 } 2950 2951 /* 2952 * checking structural equality for adts, tuples, and fns 2953 */ 2954 static int 2955 idequal(Decl *id1, Decl *id2, int usenames, int *storeok) 2956 { 2957 /* 2958 * this is just a shortcut 2959 */ 2960 if(id1 == id2) 2961 return 1; 2962 2963 for(; id1 != nil; id1 = id1->next){ 2964 if(storeok != nil && !storeok[id1->store]) 2965 continue; 2966 while(id2 != nil && storeok != nil && !storeok[id2->store]) 2967 id2 = id2->next; 2968 if(id2 == nil 2969 || usenames && id1->sym != id2->sym 2970 || id1->store != id2->store 2971 || id1->implicit != id2->implicit 2972 || id1->cyc != id2->cyc 2973 || (id1->dot == nil) != (id2->dot == nil) 2974 || id1->dot != nil && id2->dot != nil && id1->dot->ty->kind != id2->dot->ty->kind 2975 || !rtequal(id1->ty, id2->ty)) 2976 return 0; 2977 id2 = id2->next; 2978 } 2979 while(id2 != nil && storeok != nil && !storeok[id2->store]) 2980 id2 = id2->next; 2981 return id1 == nil && id2 == nil; 2982 } 2983 2984 static int 2985 pyequal(Type *t1, Type *t2) 2986 { 2987 Type *pt1, *pt2; 2988 Decl *id1, *id2; 2989 2990 if(t1 == t2) 2991 return 1; 2992 id1 = t1->polys; 2993 id2 = t2->polys; 2994 for(; id1 != nil; id1 = id1->next){ 2995 if(id2 == nil) 2996 return 0; 2997 pt1 = id1->ty; 2998 pt2 = id2->ty; 2999 if(!rtequal(pt1, pt2)){ 3000 if(t1->u.tmap != nil) 3001 pt1 = valtmap(pt1, t1->u.tmap); 3002 if(t2->u.tmap != nil) 3003 pt2 = valtmap(pt2, t2->u.tmap); 3004 if(!rtequal(pt1, pt2)) 3005 return 0; 3006 } 3007 id2 = id2->next; 3008 } 3009 return id1 == nil && id2 == nil; 3010 } 3011 3012 static int 3013 cleareqrec(Type *t) 3014 { 3015 Decl *id; 3016 int n; 3017 3018 n = 0; 3019 for(; t != nil && (t->rec & TReq) == TReq; t = t->tof){ 3020 t->rec &= ~TReq; 3021 if(t->teq != nil){ 3022 t->teq = nil; 3023 n++; 3024 } 3025 if(t->kind == Tadtpick) 3026 n += cleareqrec(t->decl->dot->ty); 3027 if(t->kind == Tmodule) 3028 t = t->tof; 3029 for(id = t->ids; id != nil; id = id->next) 3030 n += cleareqrec(id->ty); 3031 for(id = t->tags; id != nil; id = id->next) 3032 n += cleareqrec(id->ty); 3033 for(id = t->polys; id != nil; id = id->next) 3034 n += cleareqrec(id->ty); 3035 } 3036 return n; 3037 } 3038 3039 int 3040 raisescompat(Node *n1, Node *n2) 3041 { 3042 if(n1 == n2) 3043 return 1; 3044 if(n2 == nil) 3045 return 1; /* no need to repeat in definition if given in declaration */ 3046 if(n1 == nil) 3047 return 0; 3048 for(n1 = n1->left, n2 = n2->left; n1 != nil && n2 != nil; n1 = n1->right, n2 = n2->right){ 3049 if(n1->left->decl != n2->left->decl) 3050 return 0; 3051 } 3052 return n1 == n2; 3053 } 3054 3055 /* t1 a polymorphic type */ 3056 static int 3057 fnunify(Type *t1, Type *t2, Tpair **tp, int swapped) 3058 { 3059 Decl *id, *ids; 3060 Sym *sym; 3061 3062 for(ids = t1->ids; ids != nil; ids = ids->next){ 3063 sym = ids->sym; 3064 id = fnlookup(sym, t2, nil); 3065 if(id != nil) 3066 usetype(id->ty); 3067 if(id == nil){ 3068 if(dowarn) 3069 error(unifysrc.start, "type %T does not have a '%s' function", t2, sym->name); 3070 return 0; 3071 } 3072 else if(id->ty->kind != Tfn){ 3073 if(dowarn) 3074 error(unifysrc.start, "%T is not a function", id->ty); 3075 return 0; 3076 } 3077 else if(!rtunify(ids->ty, id->ty, tp, !swapped)){ 3078 if(dowarn) 3079 error(unifysrc.start, "%T and %T are not compatible wrt %s", ids->ty, id->ty, sym->name); 3080 return 0; 3081 } 3082 } 3083 return 1; 3084 } 3085 3086 static int 3087 fncleareqrec(Type *t1, Type *t2) 3088 { 3089 Decl *id, *ids; 3090 int n; 3091 3092 n = 0; 3093 n += cleareqrec(t1); 3094 n += cleareqrec(t2); 3095 for(ids = t1->ids; ids != nil; ids = ids->next){ 3096 id = fnlookup(ids->sym, t2, nil); 3097 if(id == nil) 3098 continue; 3099 else{ 3100 n += cleareqrec(ids->ty); 3101 n += cleareqrec(id->ty); 3102 } 3103 } 3104 return n; 3105 } 3106 int 3107 tunify(Type *t1, Type *t2, Tpair **tp) 3108 { 3109 int ok, v; 3110 Tpair *p; 3111 3112 *tp = nil; 3113 eqrec = 0; 3114 eqset = 0; 3115 ok = rtunify(t1, t2, tp, 0); 3116 v = cleareqrec(t1) + cleareqrec(t2); 3117 for(p = *tp; p != nil; p = p->nxt) 3118 v += fncleareqrec(p->t1, p->t2); 3119 if(0 && v != eqset) 3120 fatal("recid t1 %t and t2 %t not balanced in tunify: %d %d", t1, t2, v, eqset); 3121 return ok; 3122 } 3123 3124 static int 3125 rtunify(Type *t1, Type *t2, Tpair **tp, int swapped) 3126 { 3127 Type *tmp; 3128 3129 if(debug['w']) print("rtunifya - %T %T\n", t1, t2); 3130 t1 = valtmap(t1, *tp); 3131 t2 = valtmap(t2, *tp); 3132 if(debug['w']) print("rtunifyb - %T %T\n", t1, t2); 3133 if(t1 == t2) 3134 return 1; 3135 if(t1 == nil || t2 == nil) 3136 return 0; 3137 if(t1->kind == Terror || t2->kind == Terror) 3138 return 1; 3139 if(t1->kind != Tpoly && t2->kind == Tpoly){ 3140 tmp = t1; 3141 t1 = t2; 3142 t2 = tmp; 3143 swapped = !swapped; 3144 } 3145 if(t1->kind == Tpoly){ 3146 /* 3147 if(typein(t1, t2)) 3148 return 0; 3149 */ 3150 if(!tattr[t2->kind].isptr) 3151 return 0; 3152 if(t2->kind != Tany) 3153 addtmap(t1, t2, tp); 3154 return fnunify(t1, t2, tp, swapped); 3155 } 3156 if(t1->kind != Tany && t2->kind == Tany){ 3157 tmp = t1; 3158 t1 = t2; 3159 t2 = tmp; 3160 swapped = !swapped; 3161 } 3162 if(t1->kind == Tadt && t1->tags != nil && t2->kind == Tadtpick && !swapped) 3163 t2 = t2->decl->dot->ty; 3164 if(t2->kind == Tadt && t2->tags != nil && t1->kind == Tadtpick && swapped) 3165 t1 = t1->decl->dot->ty; 3166 if(t1->kind != Tany && t1->kind != t2->kind) 3167 return 0; 3168 t1->rec |= TReq; 3169 t2->rec |= TReq; 3170 switch(t1->kind){ 3171 default: 3172 return tequal(t1, t2); 3173 case Tany: 3174 return tattr[t2->kind].isptr; 3175 case Tref: 3176 case Tlist: 3177 case Tarray: 3178 case Tchan: 3179 if(t1->kind != Tref && assumeteq(t1, t2)) 3180 return 1; 3181 return rtunify(t1->tof, t2->tof, tp, swapped); 3182 case Tfn: 3183 if(!idunify(t1->ids, t2->ids, tp, swapped)) 3184 return 0; 3185 if(!idunify(t1->polys, t2->polys, tp, swapped)) 3186 return 0; 3187 return rtunify(t1->tof, t2->tof, tp, swapped); 3188 case Ttuple: 3189 if(assumeteq(t1, t2)) 3190 return 1; 3191 return idunify(t1->ids, t2->ids, tp, swapped); 3192 case Tadt: 3193 case Tadtpick: 3194 if(assumeteq(t1, t2)) 3195 return 1; 3196 if(!idunify(t1->polys, t2->polys, tp, swapped)) 3197 return 0; 3198 if(!idunify(t1->tags, t2->tags, tp, swapped)) 3199 return 0; 3200 return idunify(t1->ids, t2->ids, tp, swapped); 3201 case Tmodule: 3202 if(assumeteq(t1, t2)) 3203 return 1; 3204 return idunify(t1->tof->ids, t2->tof->ids, tp, swapped); 3205 case Tpoly: 3206 return t1 == t2; 3207 } 3208 } 3209 3210 static int 3211 idunify(Decl *id1, Decl *id2, Tpair **tp, int swapped) 3212 { 3213 if(id1 == id2) 3214 return 1; 3215 for(; id1 != nil; id1 = id1->next){ 3216 if(id2 == nil || !rtunify(id1->ty, id2->ty, tp, swapped)) 3217 return 0; 3218 id2 = id2->next; 3219 } 3220 return id1 == nil && id2 == nil; 3221 } 3222 3223 int 3224 polyequal(Decl *id1, Decl *id2) 3225 { 3226 int ck2; 3227 Decl *d; 3228 3229 /* allow id2 list to have an optional for clause */ 3230 ck2 = 0; 3231 for(d = id2; d != nil; d = d->next) 3232 if(d->ty->ids != nil) 3233 ck2 = 1; 3234 for( ; id1 != nil; id1 = id1->next){ 3235 if(id2 == nil 3236 || id1->sym != id2->sym 3237 || id1->ty->decl != nil && id2->ty->decl != nil && id1->ty->decl->sym != id2->ty->decl->sym) 3238 return 0; 3239 if(ck2 && !idequal(id1->ty->ids, id2->ty->ids, 1, nil)) 3240 return 0; 3241 id2 = id2->next; 3242 } 3243 return id1 == nil && id2 == nil; 3244 } 3245 3246 Type* 3247 calltype(Type *f, Node *a, Type *rt) 3248 { 3249 Type *t; 3250 Decl *id, *first, *last; 3251 3252 first = last = nil; 3253 t = mktype(&f->src.start, &f->src.stop, Tfn, rt, nil); 3254 t->polys = f->kind == Tref ? f->tof->polys : f->polys; 3255 for( ; a != nil; a = a->right){ 3256 id = mkdecl(&f->src, Darg, a->left->ty); 3257 if(last == nil) 3258 first = id; 3259 else 3260 last->next = id; 3261 last = id; 3262 } 3263 t->ids = first; 3264 if(f->kind == Tref) 3265 t = mktype(&f->src.start, &f->src.stop, Tref, t, nil); 3266 return t; 3267 } 3268 3269 static Type* 3270 duptype(Type *t) 3271 { 3272 Type *nt; 3273 3274 nt = allocmem(sizeof(*nt)); 3275 *nt = *t; 3276 nt->ok &= ~(OKverify|OKref|OKclass|OKsized|OKcycsize|OKcyc); 3277 nt->flags |= INST; 3278 nt->eq = nil; 3279 nt->sbl = -1; 3280 if(t->decl != nil && (nt->kind == Tadt || nt->kind == Tadtpick || nt->kind == Ttuple)){ 3281 nt->decl = dupdecl(t->decl); 3282 nt->decl->ty = nt; 3283 nt->decl->link = t->decl; 3284 if(t->decl->dot != nil){ 3285 nt->decl->dot = dupdecl(t->decl->dot); 3286 nt->decl->dot->link = t->decl->dot; 3287 } 3288 } 3289 else 3290 nt->decl = nil; 3291 return nt; 3292 } 3293 3294 static int 3295 dpolys(Decl *ids) 3296 { 3297 Decl *p; 3298 3299 for(p = ids; p != nil; p = p->next) 3300 if(tpolys(p->ty)) 3301 return 1; 3302 return 0; 3303 } 3304 3305 static int 3306 tpolys(Type *t) 3307 { 3308 int v; 3309 Typelist *tl; 3310 3311 if(t == nil) 3312 return 0; 3313 if(t->flags&(POLY|NOPOLY)) 3314 return t->flags&POLY; 3315 switch(t->kind){ 3316 default: 3317 v = 0; 3318 break; 3319 case Tarrow: 3320 case Tdot: 3321 case Tpoly: 3322 v = 1; 3323 break; 3324 case Tref: 3325 case Tlist: 3326 case Tarray: 3327 case Tchan: 3328 v = tpolys(t->tof); 3329 break; 3330 case Tid: 3331 v = tpolys(t->decl->ty); 3332 break; 3333 case Tinst: 3334 v = 0; 3335 for(tl = t->u.tlist; tl != nil; tl = tl->nxt) 3336 if(tpolys(tl->t)){ 3337 v = 1; 3338 break; 3339 } 3340 if(v == 0) 3341 v = tpolys(t->tof); 3342 break; 3343 case Tfn: 3344 case Tadt: 3345 case Tadtpick: 3346 case Ttuple: 3347 case Texception: 3348 if(t->polys != nil){ 3349 v = 1; 3350 break; 3351 } 3352 if(t->rec&TRvis) 3353 return 0; 3354 t->rec |= TRvis; 3355 v = tpolys(t->tof) || dpolys(t->polys) || dpolys(t->ids) || dpolys(t->tags); 3356 t->rec &= ~TRvis; 3357 if(t->kind == Tadtpick && v == 0) 3358 v = tpolys(t->decl->dot->ty); 3359 break; 3360 } 3361 if(v) 3362 t->flags |= POLY; 3363 else 3364 t->flags |= NOPOLY; 3365 return v; 3366 } 3367 3368 static int 3369 doccurs(Decl *ids, Tpair **tp) 3370 { 3371 Decl *p; 3372 3373 for(p = ids; p != nil; p = p->next) 3374 if(toccurs(p->ty, tp)) 3375 return 1; 3376 return 0; 3377 } 3378 3379 static int 3380 toccurs(Type *t, Tpair **tp) 3381 { 3382 int o; 3383 Typelist *tl; 3384 3385 if(t == nil) 3386 return 0; 3387 if(!(t->flags&(POLY|NOPOLY))) 3388 tpolys(t); 3389 if(t->flags&NOPOLY) 3390 return 0; 3391 switch(t->kind){ 3392 default: 3393 fatal("unknown type %t in toccurs", t); 3394 case Tnone: 3395 case Tbig: 3396 case Tbyte: 3397 case Treal: 3398 case Tint: 3399 case Tstring: 3400 case Tfix: 3401 case Tmodule: 3402 case Terror: 3403 return 0; 3404 case Tarrow: 3405 case Tdot: 3406 return 1; 3407 case Tpoly: 3408 return valtmap(t, *tp) != t; 3409 case Tref: 3410 case Tlist: 3411 case Tarray: 3412 case Tchan: 3413 return toccurs(t->tof, tp); 3414 case Tid: 3415 return toccurs(t->decl->ty, tp); 3416 case Tinst: 3417 for(tl = t->u.tlist; tl != nil; tl = tl->nxt) 3418 if(toccurs(tl->t, tp)) 3419 return 1; 3420 return toccurs(t->tof, tp); 3421 case Tfn: 3422 case Tadt: 3423 case Tadtpick: 3424 case Ttuple: 3425 case Texception: 3426 if(t->rec&TRvis) 3427 return 0; 3428 t->rec |= TRvis; 3429 o = toccurs(t->tof, tp) || doccurs(t->polys, tp) || doccurs(t->ids, tp) || doccurs(t->tags, tp); 3430 t->rec &= ~TRvis; 3431 if(t->kind == Tadtpick && o == 0) 3432 o = toccurs(t->decl->dot->ty, tp); 3433 return o; 3434 } 3435 } 3436 3437 static Decl* 3438 expandids(Decl *ids, Decl *adtt, Tpair **tp, int sym) 3439 { 3440 Decl *p, *q, *nids, *last; 3441 3442 nids = last = nil; 3443 for(p = ids; p != nil; p = p->next){ 3444 q = dupdecl(p); 3445 q->ty = expandtype(p->ty, nil, adtt, tp); 3446 if(sym && q->ty->decl != nil) 3447 q->sym = q->ty->decl->sym; 3448 if(q->store == Dfn){ 3449 if(debug['v']) print("%p->link = %p\n", q, p); 3450 q->link = p; 3451 } 3452 if(nids == nil) 3453 nids = q; 3454 else 3455 last->next = q; 3456 last = q; 3457 } 3458 return nids; 3459 } 3460 3461 Type* 3462 expandtype(Type *t, Type *instt, Decl *adtt, Tpair **tp) 3463 { 3464 Type *nt; 3465 Decl *ids; 3466 3467 if(t == nil) 3468 return nil; 3469 if(debug['w']) print("expandtype %d %#p %T\n", t->kind, t, t); 3470 if(!toccurs(t, tp)) 3471 return t; 3472 if(debug['w']) print("\texpanding\n"); 3473 switch(t->kind){ 3474 default: 3475 fatal("unknown type %t in expandtype", t); 3476 case Tpoly: 3477 return valtmap(t, *tp); 3478 case Tref: 3479 case Tlist: 3480 case Tarray: 3481 case Tchan: 3482 nt = duptype(t); 3483 nt->tof = expandtype(t->tof, nil, adtt, tp); 3484 return nt; 3485 case Tid: 3486 return expandtype(idtype(t), nil, adtt, tp); 3487 case Tdot: 3488 return expandtype(dottype(t, adtt), nil, adtt, tp); 3489 case Tarrow: 3490 return expandtype(arrowtype(t, adtt), nil, adtt, tp); 3491 case Tinst: 3492 if((nt = valtmap(t, *tp)) != t) 3493 return nt; 3494 return expandtype(insttype(t, adtt, tp), nil, adtt, tp); 3495 case Tfn: 3496 case Tadt: 3497 case Tadtpick: 3498 case Ttuple: 3499 case Texception: 3500 if((nt = valtmap(t, *tp)) != t) 3501 return nt; 3502 if(t->kind == Tadt) 3503 adtt = t->decl; 3504 nt = duptype(t); 3505 addtmap(t, nt, tp); 3506 if(instt != nil) 3507 addtmap(instt, nt, tp); 3508 nt->tof = expandtype(t->tof, nil, adtt, tp); 3509 nt->polys = expandids(t->polys, adtt, tp, 1); 3510 nt->ids = expandids(t->ids, adtt, tp, 0); 3511 nt->tags = expandids(t->tags, adtt, tp, 0); 3512 if(t->kind == Tadt){ 3513 for(ids = nt->tags; ids != nil; ids = ids->next) 3514 ids->ty->decl->dot = nt->decl; 3515 } 3516 if(t->kind == Tadtpick){ 3517 nt->decl->dot->ty = expandtype(t->decl->dot->ty, nil, adtt, tp); 3518 } 3519 if((t->kind == Tadt || t->kind == Tadtpick) && t->u.tmap != nil){ 3520 Tpair *p; 3521 3522 nt->u.tmap = nil; 3523 for(p = t->u.tmap; p != nil; p = p->nxt) 3524 addtmap(valtmap(p->t1, *tp), valtmap(p->t2, *tp), &nt->u.tmap); 3525 if(debug['w']){ 3526 print("new tmap for %T->%T: ", t, nt); 3527 for(p=nt->u.tmap;p!=nil;p=p->nxt)print("%T -> %T ", p->t1, p->t2); 3528 print("\n"); 3529 } 3530 } 3531 return nt; 3532 } 3533 } 3534 3535 /* 3536 * create type signatures 3537 * sign the same information used 3538 * for testing type equality 3539 */ 3540 ulong 3541 sign(Decl *d) 3542 { 3543 Type *t; 3544 uchar *sig, md5sig[MD5dlen]; 3545 char buf[StrSize]; 3546 int i, sigend, sigalloc, v; 3547 3548 t = d->ty; 3549 if(t->sig != 0) 3550 return t->sig; 3551 3552 if(ispoly(d)) 3553 rmfnptrs(d); 3554 3555 sig = 0; 3556 sigend = -1; 3557 sigalloc = 1024; 3558 while(sigend < 0 || sigend >= sigalloc){ 3559 sigalloc *= 2; 3560 sig = reallocmem(sig, sigalloc); 3561 eqrec = 0; 3562 sigend = rtsign(t, sig, sigalloc, 0); 3563 v = clearrec(t); 3564 if(v != eqrec) 3565 fatal("recid not balanced in sign: %d %d", v, eqrec); 3566 eqrec = 0; 3567 } 3568 sig[sigend] = '\0'; 3569 3570 if(signdump != nil){ 3571 seprint(buf, buf+sizeof(buf), "%D", d); 3572 if(strcmp(buf, signdump) == 0){ 3573 print("sign %D len %d\n", d, sigend); 3574 print("%s\n", (char*)sig); 3575 } 3576 } 3577 3578 md5(sig, sigend, md5sig, nil); 3579 for(i = 0; i < MD5dlen; i += 4) 3580 t->sig ^= md5sig[i+0] | (md5sig[i+1]<<8) | (md5sig[i+2]<<16) | (md5sig[i+3]<<24); 3581 if(debug['S']) 3582 print("signed %D type %T len %d sig %#lux\n", d, t, sigend, t->sig); 3583 free(sig); 3584 return t->sig; 3585 } 3586 3587 enum 3588 { 3589 SIGSELF = 'S', 3590 SIGVARARGS = '*', 3591 SIGCYC = 'y', 3592 SIGREC = '@' 3593 }; 3594 3595 static int sigkind[Tend] = 3596 { 3597 /* Tnone */ 'n', 3598 /* Tadt */ 'a', 3599 /* Tadtpick */ 'p', 3600 /* Tarray */ 'A', 3601 /* Tbig */ 'B', 3602 /* Tbyte */ 'b', 3603 /* Tchan */ 'C', 3604 /* Treal */ 'r', 3605 /* Tfn */ 'f', 3606 /* Tint */ 'i', 3607 /* Tlist */ 'L', 3608 /* Tmodule */ 'm', 3609 /* Tref */ 'R', 3610 /* Tstring */ 's', 3611 /* Ttuple */ 't', 3612 /* Texception */ 'e', 3613 /* Tfix */ 'x', 3614 /* Tpoly */ 'P', 3615 }; 3616 3617 static int 3618 rtsign(Type *t, uchar *sig, int lensig, int spos) 3619 { 3620 Decl *id, *tg; 3621 char name[32]; 3622 int kind, lenname; 3623 3624 if(t == nil) 3625 return spos; 3626 3627 if(spos < 0 || spos + 8 >= lensig) 3628 return -1; 3629 3630 if(t->eq != nil && t->eq->id){ 3631 if(t->eq->id < 0 || t->eq->id > eqrec) 3632 fatal("sign rec %T %d %d", t, t->eq->id, eqrec); 3633 3634 sig[spos++] = SIGREC; 3635 seprint(name, name+sizeof(name), "%d", t->eq->id); 3636 lenname = strlen(name); 3637 if(spos + lenname > lensig) 3638 return -1; 3639 strcpy((char*)&sig[spos], name); 3640 spos += lenname; 3641 return spos; 3642 } 3643 if(t->eq != nil){ 3644 eqrec++; 3645 t->eq->id = eqrec; 3646 } 3647 3648 kind = sigkind[t->kind]; 3649 sig[spos++] = kind; 3650 if(kind == 0) 3651 fatal("no sigkind for %t", t); 3652 3653 t->rec = 1; 3654 switch(t->kind){ 3655 default: 3656 fatal("bogus type %t in rtsign", t); 3657 return -1; 3658 case Tnone: 3659 case Tbig: 3660 case Tbyte: 3661 case Treal: 3662 case Tint: 3663 case Tstring: 3664 case Tpoly: 3665 return spos; 3666 case Tfix: 3667 seprint(name, name+sizeof(name), "%g", t->val->rval); 3668 lenname = strlen(name); 3669 if(spos+lenname-1 >= lensig) 3670 return -1; 3671 strcpy((char*)&sig[spos], name); 3672 spos += lenname; 3673 return spos; 3674 case Tref: 3675 case Tlist: 3676 case Tarray: 3677 case Tchan: 3678 return rtsign(t->tof, sig, lensig, spos); 3679 case Tfn: 3680 if(t->varargs != 0) 3681 sig[spos++] = SIGVARARGS; 3682 if(t->polys != nil) 3683 spos = idsign(t->polys, 0, sig, lensig, spos); 3684 spos = idsign(t->ids, 0, sig, lensig, spos); 3685 if(t->u.eraises) 3686 spos = raisessign(t->u.eraises, sig, lensig, spos); 3687 return rtsign(t->tof, sig, lensig, spos); 3688 case Ttuple: 3689 return idsign(t->ids, 0, sig, lensig, spos); 3690 case Tadt: 3691 /* 3692 * this is a little different than in rtequal, 3693 * since we flatten the adt we used to represent the globals 3694 */ 3695 if(t->eq == nil){ 3696 if(strcmp(t->decl->sym->name, ".mp") != 0) 3697 fatal("no t->eq field for %t", t); 3698 spos--; 3699 for(id = t->ids; id != nil; id = id->next){ 3700 spos = idsign1(id, 1, sig, lensig, spos); 3701 if(spos < 0 || spos >= lensig) 3702 return -1; 3703 sig[spos++] = ';'; 3704 } 3705 return spos; 3706 } 3707 if(t->polys != nil) 3708 spos = idsign(t->polys, 0, sig, lensig, spos); 3709 spos = idsign(t->ids, 1, sig, lensig, spos); 3710 if(spos < 0 || t->tags == nil) 3711 return spos; 3712 3713 /* 3714 * convert closing ')' to a ',', then sign any tags 3715 */ 3716 sig[spos-1] = ','; 3717 for(tg = t->tags; tg != nil; tg = tg->next){ 3718 lenname = tg->sym->len; 3719 if(spos + lenname + 2 >= lensig) 3720 return -1; 3721 strcpy((char*)&sig[spos], tg->sym->name); 3722 spos += lenname; 3723 sig[spos++] = '='; 3724 sig[spos++] = '>'; 3725 3726 spos = rtsign(tg->ty, sig, lensig, spos); 3727 if(spos < 0 || spos >= lensig) 3728 return -1; 3729 3730 if(tg->next != nil) 3731 sig[spos++] = ','; 3732 } 3733 if(spos >= lensig) 3734 return -1; 3735 sig[spos++] = ')'; 3736 return spos; 3737 case Tadtpick: 3738 spos = idsign(t->ids, 1, sig, lensig, spos); 3739 if(spos < 0) 3740 return spos; 3741 return rtsign(t->decl->dot->ty, sig, lensig, spos); 3742 case Tmodule: 3743 if(t->tof->linkall == 0) 3744 fatal("signing a narrowed module"); 3745 3746 if(spos >= lensig) 3747 return -1; 3748 sig[spos++] = '{'; 3749 for(id = t->tof->ids; id != nil; id = id->next){ 3750 if(id->tag) 3751 continue; 3752 if(strcmp(id->sym->name, ".mp") == 0){ 3753 spos = rtsign(id->ty, sig, lensig, spos); 3754 if(spos < 0) 3755 return -1; 3756 continue; 3757 } 3758 spos = idsign1(id, 1, sig, lensig, spos); 3759 if(spos < 0 || spos >= lensig) 3760 return -1; 3761 sig[spos++] = ';'; 3762 } 3763 if(spos >= lensig) 3764 return -1; 3765 sig[spos++] = '}'; 3766 return spos; 3767 } 3768 } 3769 3770 static int 3771 idsign(Decl *id, int usenames, uchar *sig, int lensig, int spos) 3772 { 3773 int first; 3774 3775 if(spos >= lensig) 3776 return -1; 3777 sig[spos++] = '('; 3778 first = 1; 3779 for(; id != nil; id = id->next){ 3780 if(id->store == Dlocal) 3781 fatal("local %s in idsign", id->sym->name); 3782 3783 if(!storespace[id->store]) 3784 continue; 3785 3786 if(!first){ 3787 if(spos >= lensig) 3788 return -1; 3789 sig[spos++] = ','; 3790 } 3791 3792 spos = idsign1(id, usenames, sig, lensig, spos); 3793 if(spos < 0) 3794 return -1; 3795 first = 0; 3796 } 3797 if(spos >= lensig) 3798 return -1; 3799 sig[spos++] = ')'; 3800 return spos; 3801 } 3802 3803 static int 3804 idsign1(Decl *id, int usenames, uchar *sig, int lensig, int spos) 3805 { 3806 char *name; 3807 int lenname; 3808 3809 if(usenames){ 3810 name = id->sym->name; 3811 lenname = id->sym->len; 3812 if(spos + lenname + 1 >= lensig) 3813 return -1; 3814 strcpy((char*)&sig[spos], name); 3815 spos += lenname; 3816 sig[spos++] = ':'; 3817 } 3818 3819 if(spos + 2 >= lensig) 3820 return -1; 3821 3822 if(id->implicit != 0) 3823 sig[spos++] = SIGSELF; 3824 3825 if(id->cyc != 0) 3826 sig[spos++] = SIGCYC; 3827 3828 return rtsign(id->ty, sig, lensig, spos); 3829 } 3830 3831 static int 3832 raisessign(Node *n, uchar *sig, int lensig, int spos) 3833 { 3834 int m; 3835 char *s; 3836 Node *nn; 3837 3838 if(spos >= lensig) 3839 return -1; 3840 sig[spos++] = '('; 3841 for(nn = n->left; nn != nil; nn = nn->right){ 3842 s = nn->left->decl->sym->name; 3843 m = nn->left->decl->sym->len; 3844 if(spos+m-1 >= lensig) 3845 return -1; 3846 strcpy((char*)&sig[spos], s); 3847 spos += m; 3848 if(nn->right != nil){ 3849 if(spos >= lensig) 3850 return -1; 3851 sig[spos++] = ','; 3852 } 3853 } 3854 if(spos >= lensig) 3855 return -1; 3856 sig[spos++] = ')'; 3857 return spos; 3858 } 3859 3860 static int 3861 clearrec(Type *t) 3862 { 3863 Decl *id; 3864 int n; 3865 3866 n = 0; 3867 for(; t != nil && t->rec; t = t->tof){ 3868 t->rec = 0; 3869 if(t->eq != nil && t->eq->id != 0){ 3870 t->eq->id = 0; 3871 n++; 3872 } 3873 if(t->kind == Tmodule){ 3874 for(id = t->tof->ids; id != nil; id = id->next) 3875 n += clearrec(id->ty); 3876 return n; 3877 } 3878 if(t->kind == Tadtpick) 3879 n += clearrec(t->decl->dot->ty); 3880 for(id = t->ids; id != nil; id = id->next) 3881 n += clearrec(id->ty); 3882 for(id = t->tags; id != nil; id = id->next) 3883 n += clearrec(id->ty); 3884 for(id = t->polys; id != nil; id = id->next) 3885 n += clearrec(id->ty); 3886 } 3887 return n; 3888 } 3889 3890 /* must a variable of the given type be zeroed ? (for uninitialized declarations inside loops) */ 3891 int 3892 tmustzero(Type *t) 3893 { 3894 if(t==nil) 3895 return 0; 3896 if(tattr[t->kind].isptr) 3897 return 1; 3898 if(t->kind == Tadtpick) 3899 t = t->tof; 3900 if(t->kind == Ttuple || t->kind == Tadt) 3901 return mustzero(t->ids); 3902 return 0; 3903 } 3904 3905 int 3906 mustzero(Decl *decls) 3907 { 3908 Decl *d; 3909 3910 for (d = decls; d != nil; d = d->next) 3911 if (tmustzero(d->ty)) 3912 return 1; 3913 return 0; 3914 } 3915 3916 int 3917 typeconv(Fmt *f) 3918 { 3919 Type *t; 3920 char *p, buf[1024]; 3921 3922 t = va_arg(f->args, Type*); 3923 if(t == nil){ 3924 p = "nothing"; 3925 }else{ 3926 p = buf; 3927 buf[0] = 0; 3928 tprint(buf, buf+sizeof(buf), t); 3929 } 3930 return fmtstrcpy(f, p); 3931 } 3932 3933 int 3934 stypeconv(Fmt *f) 3935 { 3936 Type *t; 3937 char *p, buf[1024]; 3938 3939 t = va_arg(f->args, Type*); 3940 if(t == nil){ 3941 p = "nothing"; 3942 }else{ 3943 p = buf; 3944 buf[0] = 0; 3945 stprint(buf, buf+sizeof(buf), t); 3946 } 3947 return fmtstrcpy(f, p); 3948 } 3949 3950 int 3951 ctypeconv(Fmt *f) 3952 { 3953 Type *t; 3954 char buf[1024]; 3955 3956 t = va_arg(f->args, Type*); 3957 buf[0] = 0; 3958 ctprint(buf, buf+sizeof(buf), t); 3959 return fmtstrcpy(f, buf); 3960 } 3961 3962 char* 3963 tprint(char *buf, char *end, Type *t) 3964 { 3965 Decl *id; 3966 Typelist *tl; 3967 3968 if(t == nil) 3969 return buf; 3970 if(t->kind >= Tend) 3971 return seprint(buf, end, "kind %d", t->kind); 3972 switch(t->kind){ 3973 case Tarrow: 3974 buf = seprint(buf, end, "%T->%s", t->tof, t->decl->sym->name); 3975 break; 3976 case Tdot: 3977 buf = seprint(buf, end, "%T.%s", t->tof, t->decl->sym->name); 3978 break; 3979 case Tid: 3980 case Tpoly: 3981 buf = seprint(buf, end, "%s", t->decl->sym->name); 3982 break; 3983 case Tinst: 3984 buf = tprint(buf, end, t->tof); 3985 buf = secpy(buf ,end, "["); 3986 for(tl = t->u.tlist; tl != nil; tl = tl->nxt){ 3987 buf = tprint(buf, end, tl->t); 3988 if(tl->nxt != nil) 3989 buf = secpy(buf, end, ", "); 3990 } 3991 buf = secpy(buf, end, "]"); 3992 break; 3993 case Tint: 3994 case Tbig: 3995 case Tstring: 3996 case Treal: 3997 case Tbyte: 3998 case Tany: 3999 case Tnone: 4000 case Terror: 4001 case Tainit: 4002 case Talt: 4003 case Tcase: 4004 case Tcasel: 4005 case Tcasec: 4006 case Tgoto: 4007 case Tiface: 4008 case Texception: 4009 case Texcept: 4010 buf = secpy(buf, end, kindname[t->kind]); 4011 break; 4012 case Tfix: 4013 buf = seprint(buf, end, "%s(%v)", kindname[t->kind], t->val); 4014 break; 4015 case Tref: 4016 buf = secpy(buf, end, "ref "); 4017 buf = tprint(buf, end, t->tof); 4018 break; 4019 case Tchan: 4020 case Tarray: 4021 case Tlist: 4022 buf = seprint(buf, end, "%s of ", kindname[t->kind]); 4023 buf = tprint(buf, end, t->tof); 4024 break; 4025 case Tadtpick: 4026 buf = seprint(buf, end, "%s.%s", t->decl->dot->sym->name, t->decl->sym->name); 4027 break; 4028 case Tadt: 4029 if(t->decl->dot != nil && !isimpmod(t->decl->dot->sym)) 4030 buf = seprint(buf, end, "%s->%s", t->decl->dot->sym->name, t->decl->sym->name); 4031 else 4032 buf = seprint(buf, end, "%s", t->decl->sym->name); 4033 if(t->polys != nil){ 4034 buf = secpy(buf ,end, "["); 4035 for(id = t->polys; id != nil; id = id->next){ 4036 if(t->u.tmap != nil) 4037 buf = tprint(buf, end, valtmap(id->ty, t->u.tmap)); 4038 else 4039 buf = seprint(buf, end, "%s", id->sym->name); 4040 if(id->next != nil) 4041 buf = secpy(buf, end, ", "); 4042 } 4043 buf = secpy(buf, end, "]"); 4044 } 4045 break; 4046 case Tmodule: 4047 buf = seprint(buf, end, "%s", t->decl->sym->name); 4048 break; 4049 case Ttuple: 4050 buf = secpy(buf, end, "("); 4051 for(id = t->ids; id != nil; id = id->next){ 4052 buf = tprint(buf, end, id->ty); 4053 if(id->next != nil) 4054 buf = secpy(buf, end, ", "); 4055 } 4056 buf = secpy(buf, end, ")"); 4057 break; 4058 case Tfn: 4059 buf = secpy(buf, end, "fn"); 4060 if(t->polys != nil){ 4061 buf = secpy(buf, end, "["); 4062 for(id = t->polys; id != nil; id = id->next){ 4063 buf = seprint(buf, end, "%s", id->sym->name); 4064 if(id->next != nil) 4065 buf = secpy(buf, end, ", "); 4066 } 4067 buf = secpy(buf, end, "]"); 4068 } 4069 buf = secpy(buf, end, "("); 4070 for(id = t->ids; id != nil; id = id->next){ 4071 if(id->sym == nil) 4072 buf = secpy(buf, end, "nil: "); 4073 else 4074 buf = seprint(buf, end, "%s: ", id->sym->name); 4075 if(id->implicit) 4076 buf = secpy(buf, end, "self "); 4077 buf = tprint(buf, end, id->ty); 4078 if(id->next != nil) 4079 buf = secpy(buf, end, ", "); 4080 } 4081 if(t->varargs && t->ids != nil) 4082 buf = secpy(buf, end, ", *"); 4083 else if(t->varargs) 4084 buf = secpy(buf, end, "*"); 4085 if(t->tof != nil && t->tof->kind != Tnone){ 4086 buf = secpy(buf, end, "): "); 4087 buf = tprint(buf, end, t->tof); 4088 break; 4089 } 4090 buf = secpy(buf, end, ")"); 4091 break; 4092 default: 4093 yyerror("tprint: unknown type kind %d", t->kind); 4094 break; 4095 } 4096 return buf; 4097 } 4098 4099 char* 4100 stprint(char *buf, char *end, Type *t) 4101 { 4102 if(t == nil) 4103 return buf; 4104 switch(t->kind){ 4105 case Tid: 4106 return seprint(buf, end, "id %s", t->decl->sym->name); 4107 case Tadt: 4108 case Tadtpick: 4109 case Tmodule: 4110 buf = secpy(buf, end, kindname[t->kind]); 4111 buf = secpy(buf, end, " "); 4112 return tprint(buf, end, t); 4113 } 4114 return tprint(buf, end, t); 4115 } 4116 4117 /* generalize ref P.A, ref P.B to ref P */ 4118 4119 /* 4120 Type* 4121 tparentx(Type *t1, Type* t2) 4122 { 4123 if(t1 == nil || t2 == nil || t1->kind != Tref || t2->kind != Tref) 4124 return t1; 4125 t1 = t1->tof; 4126 t2 = t2->tof; 4127 if(t1 == nil || t2 == nil || t1->kind != Tadtpick || t2->kind != Tadtpick) 4128 return t1; 4129 t1 = t1->decl->dot->ty; 4130 t2 = t2->decl->dot->ty; 4131 if(tequal(t1, t2)) 4132 return mktype(&t1->src.start, &t1->src.stop, Tref, t1, nil); 4133 return t1; 4134 } 4135 */ 4136 4137 static int 4138 tparent0(Type *t1, Type *t2) 4139 { 4140 Decl *id1, *id2; 4141 4142 if(t1 == t2) 4143 return 1; 4144 if(t1 == nil || t2 == nil) 4145 return 0; 4146 if(t1->kind == Tadt && t2->kind == Tadtpick) 4147 t2 = t2->decl->dot->ty; 4148 if(t1->kind == Tadtpick && t2->kind == Tadt) 4149 t1 = t1->decl->dot->ty; 4150 if(t1->kind != t2->kind) 4151 return 0; 4152 switch(t1->kind){ 4153 default: 4154 fatal("unknown type %t v %t in tparent", t1, t2); 4155 break; 4156 case Terror: 4157 case Tstring: 4158 case Tnone: 4159 case Tint: 4160 case Tbig: 4161 case Tbyte: 4162 case Treal: 4163 case Tany: 4164 return 1; 4165 case Texception: 4166 case Tfix: 4167 case Tfn: 4168 case Tadt: 4169 case Tmodule: 4170 case Tpoly: 4171 return tcompat(t1, t2, 0); 4172 case Tref: 4173 case Tlist: 4174 case Tarray: 4175 case Tchan: 4176 return tparent0(t1->tof, t2->tof); 4177 case Ttuple: 4178 for(id1 = t1->ids, id2 = t2->ids; id1 != nil && id2 != nil; id1 = id1->next, id2 = id2->next) 4179 if(!tparent0(id1->ty, id2->ty)) 4180 return 0; 4181 return id1 == nil && id2 == nil; 4182 case Tadtpick: 4183 return tequal(t1->decl->dot->ty, t2->decl->dot->ty); 4184 } 4185 return 0; 4186 } 4187 4188 static Type* 4189 tparent1(Type *t1, Type *t2) 4190 { 4191 Type *t, *nt; 4192 Decl *id, *id1, *id2, *idt; 4193 4194 if(t1->kind == Tadt && t2->kind == Tadtpick) 4195 t2 = t2->decl->dot->ty; 4196 if(t1->kind == Tadtpick && t2->kind == Tadt) 4197 t1 = t1->decl->dot->ty; 4198 switch(t1->kind){ 4199 default: 4200 return t1; 4201 case Tref: 4202 case Tlist: 4203 case Tarray: 4204 case Tchan: 4205 t = tparent1(t1->tof, t2->tof); 4206 if(t == t1->tof) 4207 return t1; 4208 return mktype(&t1->src.start, &t1->src.stop, t1->kind, t, nil); 4209 case Ttuple: 4210 nt = nil; 4211 id = nil; 4212 for(id1 = t1->ids, id2 = t2->ids; id1 != nil && id2 != nil; id1 = id1->next, id2 = id2->next){ 4213 t = tparent1(id1->ty, id2->ty); 4214 if(t != id1->ty){ 4215 if(nt == nil){ 4216 nt = mktype(&t1->src.start, &t1->src.stop, Ttuple, nil, dupdecls(t1->ids)); 4217 for(id = nt->ids, idt = t1->ids; idt != id1; id = id->next, idt = idt->next) 4218 ; 4219 } 4220 id->ty = t; 4221 } 4222 if(id != nil) 4223 id = id->next; 4224 } 4225 if(nt == nil) 4226 return t1; 4227 return nt; 4228 case Tadtpick: 4229 if(tequal(t1, t2)) 4230 return t1; 4231 return t1->decl->dot->ty; 4232 } 4233 } 4234 4235 Type* 4236 tparent(Type *t1, Type *t2) 4237 { 4238 if(tparent0(t1, t2)) 4239 return tparent1(t1, t2); 4240 return t1; 4241 } 4242 4243 /* 4244 * make the tuple type used to initialize an exception type 4245 */ 4246 Type* 4247 mkexbasetype(Type *t) 4248 { 4249 Decl *id, *new, *last; 4250 Type *nt; 4251 4252 if(!t->cons) 4253 fatal("mkexbasetype on non-constant"); 4254 last = mkids(&t->decl->src, nil, tstring, nil); 4255 last->store = Dfield; 4256 nt = mktype(&t->src.start, &t->src.stop, Texception, nil, last); 4257 nt->cons = 0; 4258 new = mkids(&t->decl->src, nil, tint, nil); 4259 new->store = Dfield; 4260 last->next = new; 4261 last = new; 4262 for(id = t->ids; id != nil; id = id->next){ 4263 new = allocmem(sizeof *id); 4264 *new = *id; 4265 new->cyc = 0; 4266 last->next = new; 4267 last = new; 4268 } 4269 last->next = nil; 4270 return usetype(nt); 4271 } 4272 4273 /* 4274 * make an instantiated exception type 4275 */ 4276 Type* 4277 mkextype(Type *t) 4278 { 4279 Type *nt; 4280 4281 if(!t->cons) 4282 fatal("mkextype on non-constant"); 4283 if(t->tof != nil) 4284 return t->tof; 4285 nt = copytypeids(t); 4286 nt->cons = 0; 4287 t->tof = usetype(nt); 4288 return t->tof; 4289 } 4290 4291 /* 4292 * convert an instantiated exception type to its underlying type 4293 */ 4294 Type* 4295 mkextuptype(Type *t) 4296 { 4297 Decl *id; 4298 Type *nt; 4299 4300 if(t->cons) 4301 return t; 4302 if(t->tof != nil) 4303 return t->tof; 4304 id = t->ids; 4305 if(id == nil) 4306 nt = t; 4307 else if(id->next == nil) 4308 nt = id->ty; 4309 else{ 4310 nt = copytypeids(t); 4311 nt->cons = 0; 4312 nt->kind = Ttuple; 4313 } 4314 t->tof = usetype(nt); 4315 return t->tof; 4316 } 4317 4318 static void 4319 ckfix(Type *t, double max) 4320 { 4321 int p; 4322 vlong k, x; 4323 double s; 4324 4325 s = t->val->rval; 4326 if(max == 0.0) 4327 k = ((vlong)1<<32)-1; 4328 else 4329 k = 2*(vlong)(max/s+0.5)+1; 4330 x = 1; 4331 for(p = 0; k > x; p++) 4332 x *= 2; 4333 if(p == 0 || p > 32){ 4334 error(t->src.start, "cannot fit fixed type into an int"); 4335 return; 4336 } 4337 if(p < 32) 4338 t->val->rval /= (double)(1<<(32-p)); 4339 } 4340 4341 double 4342 scale(Type *t) 4343 { 4344 Node *n; 4345 4346 if(t->kind == Tint || t->kind == Treal) 4347 return 1.0; 4348 if(t->kind != Tfix) 4349 fatal("scale() on non fixed point type"); 4350 n = t->val; 4351 if(n->op != Oconst) 4352 fatal("non constant scale"); 4353 if(n->ty != treal) 4354 fatal("non real scale"); 4355 return n->rval; 4356 } 4357 4358 double 4359 scale2(Type *f, Type *t) 4360 { 4361 return scale(f)/scale(t); 4362 } 4363 4364 #define I(x) ((int)(x)) 4365 #define V(x) ((Long)(x)) 4366 #define D(x) ((double)(x)) 4367 4368 /* put x in normal form */ 4369 static int 4370 nf(double x, int *mant) 4371 { 4372 int p; 4373 double m; 4374 4375 p = 0; 4376 m = x; 4377 while(m >= 1){ 4378 p++; 4379 m /= 2; 4380 } 4381 while(m < 0.5){ 4382 p--; 4383 m *= 2; 4384 } 4385 m *= D(1<<16)*D(1<<15); 4386 if(m >= D(0x7fffffff) - 0.5){ 4387 *mant = 0x7fffffff; 4388 return p; 4389 } 4390 *mant = I(m+0.5); 4391 return p; 4392 } 4393 4394 static int 4395 ispow2(double x) 4396 { 4397 int m; 4398 4399 nf(x, &m); 4400 if(m != 1<<30) 4401 return 0; 4402 return 1; 4403 } 4404 4405 static int 4406 fround(double x, int n, int *m) 4407 { 4408 if(n != 31) 4409 fatal("not 31 in fround"); 4410 return nf(x, m); 4411 } 4412 4413 static int 4414 fixmul2(double sx, double sy, double sr, int *rp, int *ra) 4415 { 4416 int k, n, a; 4417 double alpha; 4418 4419 alpha = (sx*sy)/sr; 4420 n = 31; 4421 k = fround(1/alpha, n, &a); 4422 *rp = 1-k; 4423 *ra = 0; 4424 return IMULX; 4425 } 4426 4427 static int 4428 fixdiv2(double sx, double sy, double sr, int *rp, int *ra) 4429 { 4430 int k, n, b; 4431 double beta; 4432 4433 beta = sx/(sy*sr); 4434 n = 31; 4435 k = fround(beta, n, &b); 4436 *rp = k-1; 4437 *ra = 0; 4438 return IDIVX; 4439 } 4440 4441 static int 4442 fixmul(double sx, double sy, double sr, int *rp, int *ra) 4443 { 4444 int k, m, n, a, v; 4445 vlong W; 4446 double alpha, eps; 4447 4448 alpha = (sx*sy)/sr; 4449 if(ispow2(alpha)) 4450 return fixmul2(sx, sy, sr, rp, ra); 4451 n = 31; 4452 k = fround(1/alpha, n, &a); 4453 m = n-k; 4454 if(m < -n-1) 4455 return IMOVW; /* result is zero whatever the values */ 4456 v = 0; 4457 W = 0; 4458 eps = D(1<<m)/(alpha*D(a)) - 1; 4459 if(eps < 0){ 4460 v = a-1; 4461 eps = -eps; 4462 } 4463 if(m < 0 && D(1<<n)*eps*D(a) >= D(a)-1+D(1<<m)) 4464 W = (V(1)<<(-m)) - 1; 4465 if(v != 0 || W != 0) 4466 m = m<<2|(v != 0)<<1|(W != 0); 4467 *rp = m; 4468 *ra = a; 4469 return v == 0 && W == 0 ? IMULX0: IMULX1; 4470 } 4471 4472 static int 4473 fixdiv(double sx, double sy, double sr, int *rp, int *ra) 4474 { 4475 int k, m, n, b, v; 4476 vlong W; 4477 double beta, eps; 4478 4479 beta = sx/(sy*sr); 4480 if(ispow2(beta)) 4481 return fixdiv2(sx, sy, sr, rp, ra); 4482 n = 31; 4483 k = fround(beta, n, &b); 4484 m = k-n; 4485 if(m <= -2*n) 4486 return IMOVW; /* result is zero whatever the values */ 4487 v = 0; 4488 W = 0; 4489 eps = (D(1<<m)*D(b))/beta - 1; 4490 if(eps < 0) 4491 v = 1; 4492 if(m < 0) 4493 W = (V(1)<<(-m)) - 1; 4494 if(v != 0 || W != 0) 4495 m = m<<2|(v != 0)<<1|(W != 0); 4496 *rp = m; 4497 *ra = b; 4498 return v == 0 && W == 0 ? IDIVX0: IDIVX1; 4499 } 4500 4501 static int 4502 fixcast(double sx, double sr, int *rp, int *ra) 4503 { 4504 int op; 4505 4506 op = fixmul(sx, 1.0, sr, rp, ra); 4507 return op-IMULX+ICVTXX; 4508 } 4509 4510 int 4511 fixop(int op, Type *tx, Type *ty, Type *tr, int *rp, int *ra) 4512 { 4513 double sx, sy, sr; 4514 4515 sx = scale(tx); 4516 sy = scale(ty); 4517 sr = scale(tr); 4518 if(op == IMULX) 4519 op = fixmul(sx, sy, sr, rp, ra); 4520 else if(op == IDIVX) 4521 op = fixdiv(sx, sy, sr, rp, ra); 4522 else 4523 op = fixcast(sx, sr, rp, ra); 4524 return op; 4525 } 4526 4527 int 4528 ispoly(Decl *d) 4529 { 4530 Type *t; 4531 4532 if(d == nil) 4533 return 0; 4534 t = d->ty; 4535 if(t->kind == Tfn){ 4536 if(t->polys != nil) 4537 return 1; 4538 if((d = d->dot) == nil) 4539 return 0; 4540 t = d->ty; 4541 return t->kind == Tadt && t->polys != nil; 4542 } 4543 return 0; 4544 } 4545 4546 int 4547 ispolyadt(Type *t) 4548 { 4549 return (t->kind == Tadt || t->kind == Tadtpick) && t->polys != nil && !(t->flags & INST); 4550 } 4551 4552 Decl* 4553 polydecl(Decl *ids) 4554 { 4555 Decl *id; 4556 Type *t; 4557 4558 for(id = ids; id != nil; id = id->next){ 4559 t = mktype(&id->src.start, &id->src.stop, Tpoly, nil, nil); 4560 id->ty = t; 4561 t->decl = id; 4562 } 4563 return ids; 4564 } 4565 4566 /* try to convert an expression tree to a type */ 4567 Type* 4568 exptotype(Node *n) 4569 { 4570 Type *t, *tt; 4571 Decl *d; 4572 Typelist *tl; 4573 Src *src; 4574 4575 if(n == nil) 4576 return nil; 4577 t = nil; 4578 switch(n->op){ 4579 case Oname: 4580 if((d = n->decl) != nil && d->store == Dtype) 4581 t = d->ty; 4582 break; 4583 case Otype: 4584 case Ochan: 4585 t = n->ty; 4586 break; 4587 case Oref: 4588 t = exptotype(n->left); 4589 if(t != nil) 4590 t = mktype(&n->src.start, &n->src.stop, Tref, t, nil); 4591 break; 4592 case Odot: 4593 t = exptotype(n->left); 4594 if(t != nil){ 4595 d = namedot(t->tags, n->right->decl->sym); 4596 if(d == nil) 4597 t = nil; 4598 else 4599 t = d->ty; 4600 } 4601 if(t == nil) 4602 t = exptotype(n->right); 4603 break; 4604 case Omdot: 4605 t = exptotype(n->right); 4606 break; 4607 case Oindex: 4608 t = exptotype(n->left); 4609 if(t != nil){ 4610 src = &n->src; 4611 tl = nil; 4612 for(n = n->right; n != nil; n = n->right){ 4613 if(n->op == Oseq) 4614 tt = exptotype(n->left); 4615 else 4616 tt = exptotype(n); 4617 if(tt == nil) 4618 return nil; 4619 tl = addtype(tt, tl); 4620 if(n->op != Oseq) 4621 break; 4622 } 4623 t = mkinsttype(src, t, tl); 4624 } 4625 break; 4626 } 4627 return t; 4628 } 4629 4630 static char* 4631 uname(Decl *im) 4632 { 4633 Decl *p; 4634 int n; 4635 char *s; 4636 4637 n = 0; 4638 for(p = im; p != nil; p = p->next) 4639 n += strlen(p->sym->name)+1; 4640 s = allocmem(n); 4641 strcpy(s, ""); 4642 for(p = im; p != nil; p = p->next){ 4643 strcat(s, p->sym->name); 4644 if(p->next != nil) 4645 strcat(s, "+"); 4646 } 4647 return s; 4648 } 4649 4650 /* check all implementation modules have consistent declarations 4651 * and create their union if needed 4652 */ 4653 Decl* 4654 modimp(Dlist *dl, Decl *im) 4655 { 4656 Decl *u, *d, *dd, *ids, *dot, *last; 4657 Sym *s; 4658 Dlist *dl0; 4659 long sg, sg0; 4660 char buf[StrSize], *un; 4661 4662 if(dl->next == nil) 4663 return dl->d; 4664 dl0 = dl; 4665 sg0 = 0; 4666 un = uname(im); 4667 seprint(buf, buf+sizeof(buf), ".m.%s", un); 4668 installids(Dglobal, mkids(&dl->d->src, enter(buf, 0), tnone, nil)); 4669 u = dupdecl(dl->d); 4670 u->sym = enter(un, 0); 4671 u->sym->decl = u; 4672 u->ty = mktype(&u->src.start, &u->src.stop, Tmodule, nil, nil); 4673 u->ty->decl = u; 4674 last = nil; 4675 for( ; dl != nil; dl = dl->next){ 4676 d = dl->d; 4677 ids = d->ty->tof->ids; /* iface */ 4678 if(ids != nil && ids->store == Dglobal) /* .mp */ 4679 sg = sign(ids); 4680 else 4681 sg = 0; 4682 if(dl == dl0) 4683 sg0 = sg; 4684 else if(sg != sg0) 4685 error(d->src.start, "%s's module data not consistent with that of %s\n", d->sym->name, dl0->d->sym->name); 4686 for(ids = d->ty->ids; ids != nil; ids = ids->next){ 4687 s = ids->sym; 4688 if(s->decl != nil && s->decl->scope >= scope){ 4689 if(ids == s->decl){ 4690 dd = dupdecl(ids); 4691 if(u->ty->ids == nil) 4692 u->ty->ids = dd; 4693 else 4694 last->next = dd; 4695 last = dd; 4696 continue; 4697 } 4698 dot = s->decl->dot; 4699 if(s->decl->store != Dwundef && dot != nil && dot != d && isimpmod(dot->sym) && dequal(ids, s->decl, 1)) 4700 ids->refs = s->decl->refs; 4701 else 4702 redecl(ids); 4703 ids->init = s->decl->init; 4704 } 4705 } 4706 } 4707 u->ty = usetype(u->ty); 4708 return u; 4709 } 4710 4711 static void 4712 modres(Decl *d) 4713 { 4714 Decl *ids, *id, *n, *i; 4715 Type *t; 4716 4717 for(ids = d->ty->ids; ids != nil; ids = ids->next){ 4718 id = ids->sym->decl; 4719 if(ids != id){ 4720 n = ids->next; 4721 i = ids->iface; 4722 t = ids->ty; 4723 *ids = *id; 4724 ids->next = n; 4725 ids->iface = i; 4726 ids->ty = t; 4727 } 4728 } 4729 } 4730 4731 /* update the fields of duplicate declarations in other implementation modules 4732 * and their union 4733 */ 4734 void 4735 modresolve(void) 4736 { 4737 Dlist *dl; 4738 4739 dl = impdecls; 4740 if(dl->next == nil) 4741 return; 4742 for( ; dl != nil; dl = dl->next) 4743 modres(dl->d); 4744 modres(impdecl); 4745 } 4746