@@ -51,6 +51,8 @@ var $ifaceKeyFor = function(x) {
51
51
52
52
var $identity = function(x) { return x; };
53
53
54
+ var $typeIDCounter = 0;
55
+
54
56
var $newType = function(size, kind, string, name, pkg, constructor) {
55
57
var typ;
56
58
switch(kind) {
@@ -362,6 +364,8 @@ var $newType = function(size, kind, string, name, pkg, constructor) {
362
364
$panic(new $String("invalid kind: " + kind));
363
365
}
364
366
367
+ typ.id = $typeIDCounter;
368
+ $typeIDCounter++;
365
369
typ.size = size;
366
370
typ.kind = kind;
367
371
typ.string = string;
@@ -496,11 +500,11 @@ var $toNativeArray = function(elemKind, array) {
496
500
};
497
501
var $arrayTypes = {};
498
502
var $arrayType = function(elem, len) {
499
- var string = "[" + len + "] " + elem.string ;
500
- var typ = $arrayTypes[string ];
503
+ var typeKey = elem.id + "$ " + len ;
504
+ var typ = $arrayTypes[typeKey ];
501
505
if (typ === undefined) {
502
- typ = $newType(12, $kindArray, string, "", "", null);
503
- $arrayTypes[string ] = typ;
506
+ typ = $newType(12, $kindArray, "[" + len + "]" + elem. string, "", "", null);
507
+ $arrayTypes[typeKey ] = typ;
504
508
typ.init(elem, len);
505
509
}
506
510
return typ;
@@ -520,37 +524,39 @@ var $chanType = function(elem, sendOnly, recvOnly) {
520
524
521
525
var $funcTypes = {};
522
526
var $funcType = function(params, results, variadic) {
523
- var paramTypes = $mapArray(params, function(p) { return p.string; });
524
- if (variadic) {
525
- paramTypes[paramTypes.length - 1] = "..." + paramTypes[paramTypes.length - 1].substr(2);
526
- }
527
- var string = "func(" + paramTypes.join(", ") + ")";
528
- if (results.length === 1) {
529
- string += " " + results[0].string;
530
- } else if (results.length > 1) {
531
- string += " (" + $mapArray(results, function(r) { return r.string; }).join(", ") + ")";
532
- }
533
- var typ = $funcTypes[string];
527
+ var typeKey = $mapArray(params, function(p) { return p.id; }).join(",") + "$" + $mapArray(results, function(r) { return r.id; }).join(",") + "$" + variadic;
528
+ var typ = $funcTypes[typeKey];
534
529
if (typ === undefined) {
530
+ var paramTypes = $mapArray(params, function(p) { return p.string; });
531
+ if (variadic) {
532
+ paramTypes[paramTypes.length - 1] = "..." + paramTypes[paramTypes.length - 1].substr(2);
533
+ }
534
+ var string = "func(" + paramTypes.join(", ") + ")";
535
+ if (results.length === 1) {
536
+ string += " " + results[0].string;
537
+ } else if (results.length > 1) {
538
+ string += " (" + $mapArray(results, function(r) { return r.string; }).join(", ") + ")";
539
+ }
535
540
typ = $newType(4, $kindFunc, string, "", "", null);
536
- $funcTypes[string ] = typ;
541
+ $funcTypes[typeKey ] = typ;
537
542
typ.init(params, results, variadic);
538
543
}
539
544
return typ;
540
545
};
541
546
542
547
var $interfaceTypes = {};
543
548
var $interfaceType = function(methods) {
544
- var string = "interface {}";
545
- if (methods.length !== 0) {
546
- string = "interface { " + $mapArray(methods, function(m) {
547
- return (m.pkg !== "" ? m.pkg + "." : "") + m.name + m.typ.string.substr(4);
548
- }).join("; ") + " }";
549
- }
550
- var typ = $interfaceTypes[string];
549
+ var typeKey = $mapArray(methods, function(m) { return m.pkg + "," + m.name + "," + m.typ.id; }).join("$");
550
+ var typ = $interfaceTypes[typeKey];
551
551
if (typ === undefined) {
552
+ var string = "interface {}";
553
+ if (methods.length !== 0) {
554
+ string = "interface { " + $mapArray(methods, function(m) {
555
+ return (m.pkg !== "" ? m.pkg + "." : "") + m.name + m.typ.string.substr(4);
556
+ }).join("; ") + " }";
557
+ }
552
558
typ = $newType(8, $kindInterface, string, "", "", null);
553
- $interfaceTypes[string ] = typ;
559
+ $interfaceTypes[typeKey ] = typ;
554
560
typ.init(methods);
555
561
}
556
562
return typ;
@@ -569,11 +575,11 @@ var $Map = function() {};
569
575
})();
570
576
var $mapTypes = {};
571
577
var $mapType = function(key, elem) {
572
- var string = "map[" + key.string + "] " + elem.string ;
573
- var typ = $mapTypes[string ];
578
+ var typeKey = key.id + "$ " + elem.id ;
579
+ var typ = $mapTypes[typeKey ];
574
580
if (typ === undefined) {
575
- typ = $newType(4, $kindMap, string, "", "", null);
576
- $mapTypes[string ] = typ;
581
+ typ = $newType(4, $kindMap, "map[" + key.string + "]" + elem. string, "", "", null);
582
+ $mapTypes[typeKey ] = typ;
577
583
typ.init(key, elem);
578
584
}
579
585
return typ;
@@ -602,10 +608,10 @@ var $indexPtr = function(array, index, constructor) {
602
608
};
603
609
604
610
var $sliceType = function(elem) {
605
- var typ = elem.Slice ;
611
+ var typ = elem.slice ;
606
612
if (typ === undefined) {
607
613
typ = $newType(12, $kindSlice, "[]" + elem.string, "", "", null);
608
- elem.Slice = typ;
614
+ elem.slice = typ;
609
615
typ.init(elem);
610
616
}
611
617
return typ;
@@ -625,14 +631,15 @@ var $makeSlice = function(typ, length, capacity) {
625
631
626
632
var $structTypes = {};
627
633
var $structType = function(fields) {
628
- var string = "struct { " + $mapArray(fields, function(f) {
629
- return f.name + " " + f.typ.string + (f.tag !== "" ? (" \"" + f.tag.replace(/\\/g, "\\\\").replace(/"/g, "\\\"") + "\"") : "");
630
- }).join("; ") + " }";
631
- if (fields.length === 0) {
632
- string = "struct {}";
633
- }
634
- var typ = $structTypes[string];
634
+ var typeKey = $mapArray(fields, function(f) { return f.name + "," + f.typ.id + "," + f.tag; }).join("$");
635
+ var typ = $structTypes[typeKey];
635
636
if (typ === undefined) {
637
+ var string = "struct { " + $mapArray(fields, function(f) {
638
+ return f.name + " " + f.typ.string + (f.tag !== "" ? (" \"" + f.tag.replace(/\\/g, "\\\\").replace(/"/g, "\\\"") + "\"") : "");
639
+ }).join("; ") + " }";
640
+ if (fields.length === 0) {
641
+ string = "struct {}";
642
+ }
636
643
typ = $newType(0, $kindStruct, string, "", "", function() {
637
644
this.$val = this;
638
645
for (var i = 0; i < fields.length; i++) {
@@ -641,7 +648,7 @@ var $structType = function(fields) {
641
648
this[f.prop] = arg !== undefined ? arg : f.typ.zero();
642
649
}
643
650
});
644
- $structTypes[string ] = typ;
651
+ $structTypes[typeKey ] = typ;
645
652
typ.init(fields);
646
653
}
647
654
return typ;
0 commit comments