c/ffi: import libffi
This commit is contained in:
124
c/ffi/type.go
Normal file
124
c/ffi/type.go
Normal file
@@ -0,0 +1,124 @@
|
||||
package ffi
|
||||
|
||||
import (
|
||||
"unsafe"
|
||||
|
||||
"github.com/goplus/llgo/c"
|
||||
"github.com/goplus/llgo/c/ffi/ffi"
|
||||
)
|
||||
|
||||
type BasicKind int
|
||||
|
||||
const (
|
||||
Void BasicKind = iota // type is invalid
|
||||
|
||||
// predeclared types
|
||||
Bool
|
||||
Int
|
||||
Int8
|
||||
Int16
|
||||
Int32
|
||||
Int64
|
||||
Uint
|
||||
Uint8
|
||||
Uint16
|
||||
Uint32
|
||||
Uint64
|
||||
Uintptr
|
||||
Float32
|
||||
Float64
|
||||
Complex64
|
||||
Complex128
|
||||
String
|
||||
UnsafePointer
|
||||
Interface
|
||||
Slice
|
||||
|
||||
// aliases
|
||||
Byte = Uint8
|
||||
Rune = Int32
|
||||
)
|
||||
|
||||
const (
|
||||
_64bit = 1 << (^uintptr(0) >> 63) / 2
|
||||
_Int = _64bit*ffi.Sint64 + (1-_64bit)*ffi.Sint32
|
||||
_Uint = _64bit*ffi.Uint64 + (1-_64bit)*ffi.Uint32
|
||||
_sizei = unsafe.Sizeof(0)
|
||||
_aligni = uint16(unsafe.Alignof(0))
|
||||
_sizeci = unsafe.Sizeof(c.Int(0))
|
||||
_alignci = uint16(unsafe.Alignof(c.Int(0)))
|
||||
_sizes = unsafe.Sizeof("")
|
||||
_aligns = uint16(unsafe.Alignof(""))
|
||||
)
|
||||
|
||||
var (
|
||||
TypeVoid = &Type{1, 1, ffi.Void, nil}
|
||||
TypeBool = &Type{1, 1, ffi.Uint8, nil}
|
||||
TypeInt8 = &Type{1, 1, ffi.Sint8, nil}
|
||||
TypeInt16 = &Type{2, 2, ffi.Sint16, nil}
|
||||
TypeInt32 = &Type{4, 4, ffi.Sint32, nil}
|
||||
TypeInt64 = &Type{8, 8, ffi.Sint64, nil}
|
||||
TypeUint8 = &Type{1, 1, ffi.Uint8, nil}
|
||||
TypeUint16 = &Type{2, 2, ffi.Uint16, nil}
|
||||
TypeUint32 = &Type{4, 4, ffi.Uint32, nil}
|
||||
TypeUint64 = &Type{8, 8, ffi.Uint64, nil}
|
||||
TypeFloat32 = &Type{4, 4, ffi.Float, nil}
|
||||
TypeFloat64 = &Type{8, 8, ffi.Double, nil}
|
||||
TypeComplex64 = &Type{8, 4, ffi.Complex, &[]*Type{TypeFloat32, nil}[0]}
|
||||
TypeComplex128 = &Type{16, 8, ffi.Complex, &[]*Type{TypeFloat64, nil}[0]}
|
||||
TypeInt = &Type{_sizei, _aligni, _Int, nil}
|
||||
TypeUint = &Type{_sizei, _aligni, _Uint, nil}
|
||||
TypeUintptr = &Type{_sizei, _aligni, _Uint, nil}
|
||||
TypePointer = &Type{_sizei, _aligni, ffi.Pointer, nil}
|
||||
TypeString = StructOf(TypePointer, TypeInt)
|
||||
TypeInterface = StructOf(TypePointer, TypePointer)
|
||||
TypeSlice = StructOf(TypePointer, TypeInt, TypeInt)
|
||||
)
|
||||
|
||||
var Typ = []*Type{
|
||||
Void: TypeVoid,
|
||||
Bool: TypeBool,
|
||||
Int: TypeInt,
|
||||
Int8: TypeInt8,
|
||||
Int16: TypeInt16,
|
||||
Int32: TypeInt32,
|
||||
Int64: TypeInt64,
|
||||
Uint: TypeUint,
|
||||
Uint8: TypeUint8,
|
||||
Uint16: TypeUint16,
|
||||
Uint32: TypeUint32,
|
||||
Uint64: TypeUint64,
|
||||
Uintptr: TypeUintptr,
|
||||
Float32: TypeFloat32,
|
||||
Float64: TypeFloat64,
|
||||
Complex64: TypeComplex64,
|
||||
Complex128: TypeComplex128,
|
||||
String: TypeString,
|
||||
UnsafePointer: TypePointer,
|
||||
Interface: TypeInterface,
|
||||
Slice: TypeSlice,
|
||||
}
|
||||
|
||||
func ArrayOf(elem *Type, N int) *Type {
|
||||
fs := make([]*Type, N+1)
|
||||
for i := 0; i < N; i++ {
|
||||
fs[i] = elem
|
||||
}
|
||||
return &Type{
|
||||
0,
|
||||
0,
|
||||
ffi.Struct,
|
||||
&fs[0],
|
||||
}
|
||||
}
|
||||
|
||||
func StructOf(fields ...*Type) *Type {
|
||||
fs := make([]*Type, len(fields)+1)
|
||||
copy(fs, fields)
|
||||
return &Type{
|
||||
0,
|
||||
0,
|
||||
ffi.Struct,
|
||||
&fs[0],
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user