86 lines
1.5 KiB
Go
86 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"unsafe"
|
|
|
|
"github.com/goplus/lib/c"
|
|
)
|
|
|
|
//llgo:type C
|
|
type T func()
|
|
|
|
type M struct {
|
|
fn T
|
|
v int
|
|
}
|
|
|
|
type N struct {
|
|
fn func()
|
|
v int
|
|
}
|
|
|
|
func main() {
|
|
if unsafe.Sizeof(*(*T)(nil)) != unsafe.Sizeof(0) {
|
|
panic("error")
|
|
}
|
|
if unsafe.Sizeof(*(*M)(nil)) != unsafe.Sizeof([2]int{}) {
|
|
panic("error")
|
|
}
|
|
// TODO(lijie): inconsistent with golang
|
|
if unsafe.Sizeof(*(*N)(nil)) != unsafe.Sizeof([3]int{}) {
|
|
panic("error")
|
|
}
|
|
|
|
if unsafe.Alignof(*(*T)(nil)) != unsafe.Alignof(0) {
|
|
panic("error")
|
|
}
|
|
if unsafe.Alignof(*(*M)(nil)) != unsafe.Alignof([2]int{}) {
|
|
panic("error")
|
|
}
|
|
if unsafe.Alignof(*(*N)(nil)) != unsafe.Alignof([3]int{}) {
|
|
panic("error")
|
|
}
|
|
|
|
if unsafe.Offsetof(M{}.fn) != 0 {
|
|
panic("error")
|
|
}
|
|
if unsafe.Offsetof(M{}.v) != unsafe.Sizeof(int(0)) {
|
|
panic("error")
|
|
}
|
|
if unsafe.Offsetof(N{}.fn) != 0 {
|
|
panic("error")
|
|
}
|
|
// TODO(lijie): inconsistent with golang
|
|
if unsafe.Offsetof(N{}.v) != unsafe.Sizeof([2]int{}) {
|
|
panic("error")
|
|
}
|
|
|
|
s := unsafe.String((*byte)(unsafe.Pointer(c.Str("abc"))), 3)
|
|
if s != "abc" {
|
|
panic("error")
|
|
}
|
|
|
|
p := unsafe.StringData(s)
|
|
arr := (*[3]byte)(unsafe.Pointer(p))
|
|
if arr[0] != 'a' || arr[1] != 'b' || arr[2] != 'c' {
|
|
panic("error")
|
|
}
|
|
|
|
intArr := [2]int{1, 2}
|
|
pi := &intArr[0]
|
|
intSlice := unsafe.Slice(pi, 2)
|
|
if intSlice[0] != 1 || intSlice[1] != 2 {
|
|
panic("error")
|
|
}
|
|
|
|
pi = unsafe.SliceData(intSlice)
|
|
if *pi != 1 {
|
|
panic("error")
|
|
}
|
|
|
|
if uintptr(unsafe.Add(unsafe.Pointer(nil), 1)) != 1 {
|
|
panic("error")
|
|
}
|
|
|
|
}
|