Skip to content

Commit 1e56709

Browse files
runtime: support Pinner.Pin for string type
For #65286 Change-Id: I1a04f151ac78c8c09a37d2cb7f782b2b61ad3290
1 parent 09ed9a6 commit 1e56709

File tree

2 files changed

+27
-3
lines changed

2 files changed

+27
-3
lines changed

src/runtime/pinner.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,14 +107,20 @@ func pinnerGetPtr(i *any) unsafe.Pointer {
107107
if etyp == nil {
108108
panic(errorString("runtime.Pinner: argument is nil"))
109109
}
110-
if kind := etyp.Kind_ & kindMask; kind != kindPtr && kind != kindUnsafePointer {
111-
panic(errorString("runtime.Pinner: argument is not a pointer: " + toRType(etyp).string()))
110+
var data unsafe.Pointer
111+
kind := etyp.Kind_ & kindMask
112+
switch kind {
113+
case kindPtr, kindUnsafePointer:
114+
case kindString:
115+
data = unsafe.Pointer(unsafe.StringData(*(*string)(e.data)))
116+
default:
117+
panic(errorString("runtime.Pinner: argument is not a pointer or string: " + toRType(etyp).string()))
112118
}
113119
if inUserArenaChunk(uintptr(e.data)) {
114120
// Arena-allocated objects are not eligible for pinning.
115121
panic(errorString("runtime.Pinner: object was allocated into an arena"))
116122
}
117-
return e.data
123+
return data
118124
}
119125

120126
// isPinned checks if a Go pointer is pinned.

src/runtime/pinner_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -538,3 +538,21 @@ func TestPinnerConstStringData(t *testing.T) {
538538
t.Fatal("not marked as pinned")
539539
}
540540
}
541+
542+
func TestPinnerPinString(t *testing.T) {
543+
var pinner runtime.Pinner
544+
heapStr := getHeapStr()
545+
pinner.Pin(heapStr)
546+
addr := unsafe.Pointer(unsafe.StringData(heapStr))
547+
if !runtime.IsPinned(addr) {
548+
t.Fatal("not marked as pinned")
549+
}
550+
pinner.Unpin()
551+
if runtime.IsPinned(addr) {
552+
t.Fatal("still marked as pinned")
553+
}
554+
}
555+
556+
func getHeapStr() string {
557+
return string(byte(fastrand()))
558+
}

0 commit comments

Comments
 (0)