mirror of
https://github.com/golang/go
synced 2024-09-29 02:24:33 -06:00
go/types, types2: add a const to control recursion panics in unification
Add a panicAtUnificationDepthLimit const to replace the use of the debug const to control whether to panic when the unification recursion depth is reached. Our tests should pass when debug==true. Change-Id: I58847f49d66010bd4ca01c0408ec10acac95cba6 Reviewed-on: https://go-review.googlesource.com/c/go/+/382534 Trust: Robert Findley <rfindley@google.com> Run-TryBot: Robert Findley <rfindley@google.com> Reviewed-by: Robert Griesemer <gri@golang.org> TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
parent
edbe4742a2
commit
77eff30ec0
@ -33,9 +33,15 @@ import (
|
||||
// by setting up one of them (using init) and then assigning its value
|
||||
// to the other.
|
||||
|
||||
// Upper limit for recursion depth. Used to catch infinite recursions
|
||||
// due to implementation issues (e.g., see issues #48619, #48656).
|
||||
const unificationDepthLimit = 50
|
||||
const (
|
||||
// Upper limit for recursion depth. Used to catch infinite recursions
|
||||
// due to implementation issues (e.g., see issues #48619, #48656).
|
||||
unificationDepthLimit = 50
|
||||
|
||||
// Whether to panic when unificationDepthLimit is reached. Turn on when
|
||||
// investigating infinite recursion.
|
||||
panicAtUnificationDepthLimit = false
|
||||
)
|
||||
|
||||
// A unifier maintains the current type parameters for x and y
|
||||
// and the respective types inferred for each type parameter.
|
||||
@ -244,7 +250,7 @@ func (u *unifier) nifyEq(x, y Type, p *ifacePair) bool {
|
||||
func (u *unifier) nify(x, y Type, p *ifacePair) bool {
|
||||
// Stop gap for cases where unification fails.
|
||||
if u.depth >= unificationDepthLimit {
|
||||
if debug {
|
||||
if panicAtUnificationDepthLimit {
|
||||
panic("unification reached recursion depth limit")
|
||||
}
|
||||
return false
|
||||
|
@ -33,9 +33,15 @@ import (
|
||||
// by setting up one of them (using init) and then assigning its value
|
||||
// to the other.
|
||||
|
||||
// Upper limit for recursion depth. Used to catch infinite recursions
|
||||
// due to implementation issues (e.g., see issues #48619, #48656).
|
||||
const unificationDepthLimit = 50
|
||||
const (
|
||||
// Upper limit for recursion depth. Used to catch infinite recursions
|
||||
// due to implementation issues (e.g., see issues #48619, #48656).
|
||||
unificationDepthLimit = 50
|
||||
|
||||
// Whether to panic when unificationDepthLimit is reached. Turn on when
|
||||
// investigating infinite recursion.
|
||||
panicAtUnificationDepthLimit = false
|
||||
)
|
||||
|
||||
// A unifier maintains the current type parameters for x and y
|
||||
// and the respective types inferred for each type parameter.
|
||||
@ -244,7 +250,7 @@ func (u *unifier) nifyEq(x, y Type, p *ifacePair) bool {
|
||||
func (u *unifier) nify(x, y Type, p *ifacePair) bool {
|
||||
// Stop gap for cases where unification fails.
|
||||
if u.depth >= unificationDepthLimit {
|
||||
if debug {
|
||||
if panicAtUnificationDepthLimit {
|
||||
panic("unification reached recursion depth limit")
|
||||
}
|
||||
return false
|
||||
|
Loading…
Reference in New Issue
Block a user