Skip to content

Commit

Permalink
ast_path: do not use recursion; it is expensive
Browse files Browse the repository at this point in the history
Signed-off-by: Vicent Marti <[email protected]>
  • Loading branch information
vmg committed Feb 11, 2025
1 parent 5e30170 commit 072f3e3
Show file tree
Hide file tree
Showing 2 changed files with 1,134 additions and 1,132 deletions.
23 changes: 12 additions & 11 deletions go/tools/asthelpergen/paths_gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -213,13 +213,12 @@ func (p *pathGen) generateGetNodeFromPath(spi generatorSPI) *jen.Statement {
jen.Id("node").Id(p.ifaceName),
jen.Id("path").Id("ASTPath"),
).Id(p.ifaceName).Block(
jen.If(jen.Id("path").Op("==").Id(`""`).Block(
jen.Return(jen.Id("node")))),
jen.Id("step").Op(":=").Id("path").Dot("nextPathStep").Call(),
jen.Id("path").Op("=").Id("path[2:]"),

jen.Switch(jen.Id("step")).Block(p.generateWalkCases(spi)...),
jen.Return(jen.Nil()), // Fallback return
jen.For(jen.Len(jen.Id("path")).Op(">=").Lit(2)).Block(
jen.Id("step").Op(":=").Id("path").Dot("nextPathStep").Call(),
jen.Id("path").Op("=").Id("path[2:]"),
jen.Switch(jen.Id("step")).Block(p.generateWalkCases(spi)...),
),
jen.Return(jen.Id("node")), // Fallback return
)
return method
}
Expand All @@ -238,11 +237,9 @@ func (p *pathGen) generateWalkCases(spi generatorSPI) []jen.Code {
if !step.slice {
// return GetNodeFromPath(node.(*RefContainer).ASTType, path)
t := types.TypeString(step.container, noQualifier)
n := jen.Id("node").Dot(fmt.Sprintf("(%s)", t)).Dot(step.name)

cases = append(cases, jen.Case(jen.Id(stepName)).Block(
// jen.Id("node").Op("=").Id("node").Dot(step.name),
jen.Return(jen.Id("GetNodeFromPath").Call(n, jen.Id("path"))),
jen.Id("node").Op("=").Id("node").Dot(fmt.Sprintf("(%s)", t)).Dot(step.name),
))
continue
}
Expand All @@ -258,9 +255,13 @@ func (p *pathGen) generateWalkCases(spi generatorSPI) []jen.Code {
cases = append(cases, jen.Case(jen.Id(stepName+"Offset")).Block(
jen.Id("idx, bytesRead").Op(":=").Id("path").Dot("nextPathOffset").Call(),
jen.Id("path").Op("=").Id("path[bytesRead:]"),
jen.Return(jen.Id("GetNodeFromPath").Call(assignNode, jen.Id("path"))),
jen.Id("node").Op("=").Add(assignNode),
))
}

cases = append(cases, jen.Default().Block(
jen.Return(jen.Nil()),
))

return cases
}
Loading

0 comments on commit 072f3e3

Please sign in to comment.