diff options
author | Michael Anthony Knyszek <mknyszek@google.com> | 2020-07-14 21:41:12 +0000 |
---|---|---|
committer | Michael Knyszek <mknyszek@google.com> | 2020-10-23 23:01:52 +0000 |
commit | 64dc25b2db5d5be55f3f2fde3daac6c8a2873235 (patch) | |
tree | c812dfa184319f5f2e7b4bb6bd88efdcdbc07896 /src/runtime/export_test.go | |
parent | fe70866d1dc8c44ab19180ecab2b5c5b8628265a (diff) | |
download | go-64dc25b2db5d5be55f3f2fde3daac6c8a2873235.tar.gz go-64dc25b2db5d5be55f3f2fde3daac6c8a2873235.zip |
runtime: add tests for addrRanges.add
Change-Id: I249deb482df74068b0538e9d773b9a87bc5a6df3
Reviewed-on: https://go-review.googlesource.com/c/go/+/242681
Run-TryBot: Michael Knyszek <mknyszek@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Trust: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Austin Clements <austin@google.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
Diffstat (limited to 'src/runtime/export_test.go')
-rw-r--r-- | src/runtime/export_test.go | 62 |
1 files changed, 60 insertions, 2 deletions
diff --git a/src/runtime/export_test.go b/src/runtime/export_test.go index 605bcb2294..e65b7b8ea7 100644 --- a/src/runtime/export_test.go +++ b/src/runtime/export_test.go @@ -785,22 +785,64 @@ func (a AddrRange) Equals(b AddrRange) bool { return a == b } +// Size returns the size in bytes of the address range. +func (a AddrRange) Size() uintptr { + return a.addrRange.size() +} + // AddrRanges is a wrapper around addrRanges for testing. type AddrRanges struct { addrRanges + mutable bool +} + +// NewAddrRanges creates a new empty addrRanges. +// +// Note that this initializes addrRanges just like in the +// runtime, so its memory is persistentalloc'd. Call this +// function sparingly since the memory it allocates is +// leaked. +// +// This AddrRanges is mutable, so we can test methods like +// Add. +func NewAddrRanges() AddrRanges { + r := addrRanges{} + r.init(new(uint64)) + return AddrRanges{r, true} } // MakeAddrRanges creates a new addrRanges populated with // the ranges in a. +// +// The returned AddrRanges is immutable, so methods like +// Add will fail. func MakeAddrRanges(a ...AddrRange) AddrRanges { // Methods that manipulate the backing store of addrRanges.ranges should // not be used on the result from this function (e.g. add) since they may - // trigger reallocation. + // trigger reallocation. That would normally be fine, except the new + // backing store won't come from the heap, but from persistentalloc, so + // we'll leak some memory implicitly. ranges := make([]addrRange, 0, len(a)) + total := uintptr(0) for _, r := range a { ranges = append(ranges, r.addrRange) + total += r.Size() + } + return AddrRanges{addrRanges{ + ranges: ranges, + totalBytes: total, + sysStat: new(uint64), + }, false} +} + +// Ranges returns a copy of the ranges described by the +// addrRanges. +func (a *AddrRanges) Ranges() []AddrRange { + result := make([]AddrRange, 0, len(a.addrRanges.ranges)) + for _, r := range a.addrRanges.ranges { + result = append(result, AddrRange{r}) } - return AddrRanges{addrRanges{ranges: ranges, sysStat: new(uint64)}} + return result } // FindSucc returns the successor to base. See addrRanges.findSucc @@ -809,6 +851,22 @@ func (a *AddrRanges) FindSucc(base uintptr) int { return a.findSucc(base) } +// Add adds a new AddrRange to the AddrRanges. +// +// The AddrRange must be mutable (i.e. created by NewAddrRanges), +// otherwise this method will throw. +func (a *AddrRanges) Add(r AddrRange) { + if !a.mutable { + throw("attempt to mutate immutable AddrRanges") + } + a.add(r.addrRange) +} + +// TotalBytes returns the totalBytes field of the addrRanges. +func (a *AddrRanges) TotalBytes() uintptr { + return a.addrRanges.totalBytes +} + // BitRange represents a range over a bitmap. type BitRange struct { I, N uint // bit index and length in bits |