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  }