41 lines
1 KiB
Go
41 lines
1 KiB
Go
// +build !purego,!appengine
|
|
|
|
package msgp
|
|
|
|
import (
|
|
"reflect"
|
|
"unsafe"
|
|
)
|
|
|
|
// NOTE:
|
|
// all of the definition in this file
|
|
// should be repeated in appengine.go,
|
|
// but without using unsafe
|
|
|
|
const (
|
|
// spec says int and uint are always
|
|
// the same size, but that int/uint
|
|
// size may not be machine word size
|
|
smallint = unsafe.Sizeof(int(0)) == 4
|
|
)
|
|
|
|
// UnsafeString returns the byte slice as a volatile string
|
|
// THIS SHOULD ONLY BE USED BY THE CODE GENERATOR.
|
|
// THIS IS EVIL CODE.
|
|
// YOU HAVE BEEN WARNED.
|
|
func UnsafeString(b []byte) string {
|
|
sh := (*reflect.SliceHeader)(unsafe.Pointer(&b))
|
|
return *(*string)(unsafe.Pointer(&reflect.StringHeader{Data: sh.Data, Len: sh.Len}))
|
|
}
|
|
|
|
// UnsafeBytes returns the string as a byte slice
|
|
// THIS SHOULD ONLY BE USED BY THE CODE GENERATOR.
|
|
// THIS IS EVIL CODE.
|
|
// YOU HAVE BEEN WARNED.
|
|
func UnsafeBytes(s string) []byte {
|
|
return *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{
|
|
Len: len(s),
|
|
Cap: len(s),
|
|
Data: (*(*reflect.StringHeader)(unsafe.Pointer(&s))).Data,
|
|
}))
|
|
}
|