diff --git a/src/go/go2go/instantiate.go b/src/go/go2go/instantiate.go index 69e33e9a47..3abbb70951 100644 --- a/src/go/go2go/instantiate.go +++ b/src/go/go2go/instantiate.go @@ -29,7 +29,7 @@ func newTypeArgs(typeTypes []types.Type) *typeArgs { } } -// typeArgsFromTParams builds mappings from a list of type parameters +// typeArgsFromFields builds mappings from a list of type parameters // expressed as ast.Field values. func typeArgsFromFields(t *translator, astTypes []ast.Expr, typeTypes []types.Type, tparams []*ast.Field) *typeArgs { ta := newTypeArgs(typeTypes) @@ -52,7 +52,7 @@ func typeArgsFromFields(t *translator, astTypes []ast.Expr, typeTypes []types.Ty return ta } -// typeArgsFromTParams builds mappings from a list of type parameters +// typeArgsFromExprs builds mappings from a list of type parameters // expressed as ast.Expr values. func typeArgsFromExprs(t *translator, astTypes []ast.Expr, typeTypes []types.Type, tparams []ast.Expr) *typeArgs { ta := newTypeArgs(typeTypes) diff --git a/src/go/go2go/rewrite.go b/src/go/go2go/rewrite.go index a5c75a7555..bb40ad4b1d 100644 --- a/src/go/go2go/rewrite.go +++ b/src/go/go2go/rewrite.go @@ -128,6 +128,9 @@ type translator struct { typeInstantiations map[types.Type][]*typeInstantiation typePackages map[*types.Package]bool + // typeDepth tracks recursive type instantiations. + typeDepth int + // err is set if we have seen an error during this translation. // This is used by the rewrite methods. err error diff --git a/src/go/go2go/types.go b/src/go/go2go/types.go index fdd96fea28..7a94ab8fbc 100644 --- a/src/go/go2go/types.go +++ b/src/go/go2go/types.go @@ -43,12 +43,19 @@ func (t *translator) setType(e ast.Expr, nt types.Type) { // instantiateType instantiates typ using ta. func (t *translator) instantiateType(ta *typeArgs, typ types.Type) types.Type { - var inProgress *typeInstantiation - key := typ - if named, ok := typ.(*types.Named); ok { - key = t.typeWithoutArgs(named) + if t.err != nil { + return nil } - for _, inst := range t.typeInstantiations[key] { + + t.typeDepth++ + defer func() { t.typeDepth-- }() + if t.typeDepth > 25 { + t.err = fmt.Errorf("looping while instantiating %v %v", typ, ta.types) + return nil + } + + var inProgress *typeInstantiation + for _, inst := range t.typeInstantiations[typ] { if t.sameTypes(ta.types, inst.types) { if inst.typ == nil { inProgress = inst @@ -70,7 +77,7 @@ func (t *translator) instantiateType(ta *typeArgs, typ types.Type) types.Type { types: ta.types, typ: ityp, } - t.typeInstantiations[key] = append(t.typeInstantiations[key], typinst) + t.typeInstantiations[typ] = append(t.typeInstantiations[typ], typinst) } return ityp