github.com/gotranspile/cxgo@v0.3.7/runtime/libc/assert.go (about) 1 package libc 2 3 import ( 4 "fmt" 5 "reflect" 6 "unsafe" 7 ) 8 9 func Assert(cond bool) { 10 if !cond { 11 panic("assert failed") 12 } 13 } 14 15 func AsPtr(v interface{}) (unsafe.Pointer, error) { 16 switch v := v.(type) { 17 case unsafe.Pointer: 18 return v, nil 19 case *byte: 20 return unsafe.Pointer(v), nil 21 case *WChar: 22 return unsafe.Pointer(v), nil 23 case uintptr: 24 return unsafe.Pointer(v), nil 25 case uint64: 26 return unsafe.Pointer(uintptr(v)), nil 27 case int64: 28 return unsafe.Pointer(uintptr(v)), nil 29 case uint32: 30 return unsafe.Pointer(uintptr(v)), nil 31 case int32: 32 return unsafe.Pointer(uintptr(v)), nil 33 default: 34 rv := reflect.ValueOf(v) 35 switch rv.Kind() { 36 case reflect.Ptr, reflect.UnsafePointer, reflect.Slice: 37 return unsafe.Pointer(rv.Pointer()), nil 38 case reflect.Uint, reflect.Uintptr, reflect.Uint64, reflect.Uint32: 39 return unsafe.Pointer(uintptr(rv.Uint())), nil 40 case reflect.Int, reflect.Int64, reflect.Int32: 41 return unsafe.Pointer(uintptr(rv.Uint())), nil 42 } 43 return nil, fmt.Errorf("cannot cast to pointer: %T", v) 44 } 45 }