0
1
mirror of https://github.com/golang/go synced 2025-04-07 23:54:28 +00:00
Files
David Chase cad4dca518 cmd/compile: use inline-Pos-based recursion test
Look at the inlining stack of positions for a call site,
if the line/col/file of the call site appears in that
stack, do not inline.  This subsumes all the other
recently-added recursive inlining checks, but they are
left in to make this easier+safer to backport.

Fixes 

Change-Id: I0f487bb0d4c514015907c649312672b7be464abd
Reviewed-on: https://go-review.googlesource.com/c/go/+/655155
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Keith Randall <khr@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
2025-03-05 15:02:38 -08:00

86 lines
1.4 KiB
Go

// build
// Copyright 2025 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
import (
"iter"
)
type leafSet map[rune]struct{}
type branchMap map[rune]*node
func (bm branchMap) findOrCreateBranch(r rune) *node {
if _, ok := bm[r]; !ok {
bm[r] = newNode()
}
return bm[r]
}
func (bm branchMap) allSuffixes() iter.Seq[string] {
return func(yield func(string) bool) {
for r, n := range bm {
for s := range n.allStrings() {
if !yield(string(r) + s) {
return
}
}
}
}
}
type node struct {
leafSet
branchMap
}
func newNode() *node {
return &node{make(leafSet), make(branchMap)}
}
func (n *node) add(s []rune) {
switch len(s) {
case 0:
return
case 1:
n.leafSet[s[0]] = struct{}{}
default:
n.branchMap.findOrCreateBranch(s[0]).add(s[1:])
}
}
func (n *node) addString(s string) {
n.add([]rune(s))
}
func (n *node) allStrings() iter.Seq[string] {
return func(yield func(string) bool) {
for s := range n.leafSet {
if !yield(string(s)) {
return
}
}
for r, n := range n.branchMap {
for s := range n.allSuffixes() {
if !yield(string(r) + s) {
return
}
}
}
}
}
func main() {
root := newNode()
for _, s := range []string{"foo", "bar", "baz", "a", "b", "c", "hello", "world"} {
root.addString(s)
}
for s := range root.allStrings() {
println(s)
}
}