}
func synthesizestringtypes(die *DWDie) {
- prototype := walktypedef(defgotype(lookup_or_diag("type.runtime._string")))
+ prototype := walktypedef(defgotype(lookup_or_diag("type.runtime.stringStructDWARF")))
if prototype == nil {
return
}
}
var s string
- sp := (*_string)(unsafe.Pointer(&s))
- sp.str = &p[0]
+ sp := stringStructOf(&s)
+ sp.str = unsafe.Pointer(&p[0])
sp.len = int(r)
return s
}
func cstring(s string) unsafe.Pointer {
p := make([]byte, len(s)+1)
- sp := (*_string)(unsafe.Pointer(&s))
- memmove(unsafe.Pointer(&p[0]), unsafe.Pointer(sp.str), uintptr(len(s)))
+ copy(p, s)
return unsafe.Pointer(&p[0])
}
if h == nil || h.count == 0 {
return atomicloadp(unsafe.Pointer(&zeroptr))
}
- key := (*stringStruct)(unsafe.Pointer(&ky))
+ key := stringStructOf(&ky)
if h.B == 0 {
// One-bucket table.
b := (*bmap)(h.buckets)
if h == nil || h.count == 0 {
return atomicloadp(unsafe.Pointer(&zeroptr)), false
}
- key := (*stringStruct)(unsafe.Pointer(&ky))
+ key := stringStructOf(&ky)
if h.B == 0 {
// One-bucket table.
b := (*bmap)(h.buckets)
}
func dumpstr(s string) {
- sp := (*stringStruct)(unsafe.Pointer(&s))
+ sp := stringStructOf(&s)
dumpmemrange(sp.str, uintptr(sp.len))
}
if t.x == nil || t.x.pkgpath == nil || t.x.name == nil {
dumpstr(*t._string)
} else {
- pkgpath := (*stringStruct)(unsafe.Pointer(&t.x.pkgpath))
- name := (*stringStruct)(unsafe.Pointer(&t.x.name))
+ pkgpath := stringStructOf(t.x.pkgpath)
+ name := stringStructOf(t.x.name)
dumpint(uint64(uintptr(pkgpath.len) + 1 + uintptr(name.len)))
dwrite(pkgpath.str, uintptr(pkgpath.len))
dwritebyte('.')
func bytes(s string) (ret []byte) {
rp := (*slice)(unsafe.Pointer(&ret))
- sp := (*_string)(noescape(unsafe.Pointer(&s)))
- rp.array = unsafe.Pointer(sp.str)
+ sp := stringStructOf(&s)
+ rp.array = sp.str
rp.len = sp.len
rp.cap = sp.len
return
key uintptr
}
-type _string struct {
- str *byte
- len int
-}
-
type funcval struct {
fn uintptr
// variable-size, fn-specific data here
racewriterangepc(unsafe.Pointer(&to[0]), uintptr(n), callerpc, pc)
}
- memmove(unsafe.Pointer(&to[0]), unsafe.Pointer((*stringStruct)(unsafe.Pointer(&fm)).str), uintptr(n))
+ memmove(unsafe.Pointer(&to[0]), unsafe.Pointer(stringStructOf(&fm).str), uintptr(n))
return n
}
// stringDataOnStack reports whether the string's data is
// stored on the current goroutine's stack.
func stringDataOnStack(s string) bool {
- ptr := uintptr((*stringStruct)(unsafe.Pointer(&s)).str)
+ ptr := uintptr(stringStructOf(&s).str)
stk := getg().stack
return stk.lo <= ptr && ptr < stk.hi
}
// The only such case today is:
// for i, c := range []byte(str)
- str := (*stringStruct)(unsafe.Pointer(&s))
+ str := stringStructOf(&s)
ret := slice{array: unsafe.Pointer(str.str), len: str.len, cap: str.len}
return *(*[]byte)(unsafe.Pointer(&ret))
}
len int
}
+// Variant with *byte pointer type for DWARF debugging.
+type stringStructDWARF struct {
+ str *byte
+ len int
+}
+
+func stringStructOf(sp *string) *stringStruct {
+ return (*stringStruct)(unsafe.Pointer(sp))
+}
+
func intstring(buf *[4]byte, v int64) string {
var s string
var b []byte
func rawstring(size int) (s string, b []byte) {
p := mallocgc(uintptr(size), nil, flagNoScan|flagNoZero)
- (*stringStruct)(unsafe.Pointer(&s)).str = p
- (*stringStruct)(unsafe.Pointer(&s)).len = size
+ stringStructOf(&s).str = p
+ stringStructOf(&s).len = size
*(*slice)(unsafe.Pointer(&b)) = slice{p, size, size}