]> Cypherpunks repositories - gostls13.git/commit
[release-branch.go1.24] go/types,types2: externalize used objects
authorRob Findley <rfindley@google.com>
Wed, 19 Feb 2025 22:07:09 +0000 (22:07 +0000)
committerGopher Robot <gobot@golang.org>
Tue, 25 Mar 2025 16:45:16 +0000 (09:45 -0700)
commite9162e7e22e6030f52c275fdafe789d8ef73d882
tree6cc899b264337db4cf65bc189cd8a0dd1b511a1e
parentd107ee90df402aa5042ab69d5c1d26aa320e1585
[release-branch.go1.24] go/types,types2: externalize used objects

The 'used' field on Var and PkgName is fundamentally an aspect of the
type checking pass: it records when objects are used, for the purposes
of reporting errors for unused variables or package names. While
expedient and performant, recording this information in the types.Object
instances themselves increases the memory footprint of type-checked
packages, and (as we saw in golang/go#71817) can lead to data races when
Objects are reused in follow-up type checking, such as is done with the
CheckExpr and Eval APIs.

Fix this by externalizing the 'used' information into two maps (one for
variables and one for packages) on the types.Checker, so that they are
garbage-collected after type checking, and cannot be a source of data
races.

Benchmarks showed essentially no change in performance.

For #72826

Change-Id: I40daeabe4ecaca3bcb494e2f1c62a04232098e49
Reviewed-on: https://go-review.googlesource.com/c/go/+/650796
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Robert Findley <rfindley@google.com>
Reviewed-by: Robert Griesemer <gri@google.com>
(cherry picked from commit 9189921e4759055141b51fdbb8b7b69ee4fdd477)
Reviewed-on: https://go-review.googlesource.com/c/go/+/657675
Auto-Submit: Dmitri Shuralyov <dmitshur@google.com>
16 files changed:
src/cmd/compile/internal/types2/assignments.go
src/cmd/compile/internal/types2/call.go
src/cmd/compile/internal/types2/check.go
src/cmd/compile/internal/types2/object.go
src/cmd/compile/internal/types2/resolver.go
src/cmd/compile/internal/types2/sizeof_test.go
src/cmd/compile/internal/types2/stmt.go
src/cmd/compile/internal/types2/typexpr.go
src/go/types/assignments.go
src/go/types/call.go
src/go/types/check.go
src/go/types/object.go
src/go/types/resolver.go
src/go/types/sizeof_test.go
src/go/types/stmt.go
src/go/types/typexpr.go