type special struct {
_ sys.NotInHeap
next *special // linked list in span
- offset uint16 // span offset of object
+ offset uintptr // span offset of object
kind byte // kind of special
}
iter, exists := span.specialFindSplicePoint(offset, kind)
if !exists || force {
// Splice in record, fill in offset.
- s.offset = uint16(offset)
+ s.offset = offset
s.next = *iter
*iter = s
spanHasSpecials(span)
rec = (*specialPinCounter)(mheap_.specialPinCounterAlloc.alloc())
unlock(&mheap_.speciallock)
// splice in record, fill in offset.
- rec.special.offset = uint16(offset)
+ rec.special.offset = offset
rec.special.kind = _KindSpecialPinCounter
rec.special.next = *ref
*ref = (*special)(unsafe.Pointer(rec))
func TestPointerEquality(t *testing.T) {
bt := make([]*T, 10)
wt := make([]weak.Pointer[T], 10)
+ wo := make([]weak.Pointer[int], 10)
for i := range bt {
bt[i] = new(T)
wt[i] = weak.Make(bt[i])
+ wo[i] = weak.Make(&bt[i].a)
}
for i := range bt {
st := wt[i].Value()
if wp := weak.Make(st); wp != wt[i] {
t.Fatalf("new weak pointer not equal to existing weak pointer: %v vs. %v", wp, wt[i])
}
+ if wp := weak.Make(&st.a); wp != wo[i] {
+ t.Fatalf("new weak pointer not equal to existing weak pointer: %v vs. %v", wp, wo[i])
+ }
if i == 0 {
continue
}
if wp := weak.Make(st); wp != wt[i] {
t.Fatalf("new weak pointer not equal to existing weak pointer: %v vs. %v", wp, wt[i])
}
+ if wp := weak.Make(&st.a); wp != wo[i] {
+ t.Fatalf("new weak pointer not equal to existing weak pointer: %v vs. %v", wp, wo[i])
+ }
if i == 0 {
continue
}
}
wg.Wait()
}
+
+func TestIssue70739(t *testing.T) {
+ x := make([]*int, 4<<16)
+ wx1 := weak.Make(&x[1<<16])
+ wx2 := weak.Make(&x[1<<16])
+ if wx1 != wx2 {
+ t.Fatal("failed to look up special and made duplicate weak handle; see issue #70739")
+ }
+}