]> Cypherpunks repositories - gostls13.git/commit
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>
Wed, 5 Mar 2025 21:54:45 +0000 (13:54 -0800)
commit9189921e4759055141b51fdbb8b7b69ee4fdd477
treecf2b3d34b7d9c74cee15b125dc486e56a9e3c2d2
parentf7204d76bc3af681c12e8ed9bfb18c20bf6f8bc1
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.

Fixes golang/go#71817

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>
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