Skip to content

Commit

Permalink
Optional use ffi call wrapper in qtinline
Browse files Browse the repository at this point in the history
  • Loading branch information
drswinghead committed Dec 9, 2018
1 parent 99babe2 commit 8c5edc9
Show file tree
Hide file tree
Showing 8 changed files with 72 additions and 22 deletions.
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ updoc:
curl -POST -d "path=github.com/kitech/qt.go/qtwebenginewidgets" "https://godoc.org/-/refresh"
curl -POST -d "path=github.com/kitech/qt.go/qtsvg" "https://godoc.org/-/refresh"
curl -POST -d "path=github.com/kitech/qt.go/qtmultimedia" "https://godoc.org/-/refresh"
curl -POST -d "path=github.com/kitech/qt.go/qtmeta" "https://godoc.org/-/refresh"

wcs: wcbases wcqmls wcextras wcwebengines
wcbases:
Expand Down
8 changes: 8 additions & 0 deletions docs/qt-go-internals.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
### debug env

* QTGO_DEBUG_FFI_CALL
* QTGO_DEBUG_DYNSLOT
* QTGO_DEBUG_INHERIT_CALL
* QTGO_DEBUG_FINALIZE
* QTGO_DEBUG_QTMETA

2 changes: 2 additions & 0 deletions make.sh
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
#!/bin/sh

source ~/triline/shell/android-ndk-env.sh


Expand Down
32 changes: 16 additions & 16 deletions qtandroidextras/mod_qclass.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,56 +22,56 @@ func (this *QAndroidJniObject) CallMethod(methodName, signature string, args ...
qtrt.ErrPrint(err, rv)
}

func (this *QAndroidJniObject) CallMethod_2(methodName, signature string, args ...interface{}) byte {
func (this *QAndroidJniObject) CallMethod2(methodName, signature string, args ...interface{}) byte {
rv, err := qtrt.InvokeQtFunc6Var("C_ZNK17QAndroidJniObject10callMethodIhEET_PKcS3_z",
qtrt.FFI_TYPE_POINTER, 3, append([]interface{}{this.GetCthis(), methodName, signature}, args...)...)
qtrt.ErrPrint(err)
return byte(rv)
}

func (this *QAndroidJniObject) CallMethod_3(methodName, signature string, args ...interface{}) int8 {
func (this *QAndroidJniObject) CallMethod3(methodName, signature string, args ...interface{}) int8 {
rv, err := qtrt.InvokeQtFunc6Var("C_ZNK17QAndroidJniObject10callMethodIaEET_PKcS3_z",
qtrt.FFI_TYPE_POINTER, 3, append([]interface{}{this.GetCthis(), methodName, signature}, args...)...)
qtrt.ErrPrint(err)
return int8(rv)
}

func (this *QAndroidJniObject) CallMethod_4(methodName, signature string, args ...interface{}) uint16 {
func (this *QAndroidJniObject) CallMethod4(methodName, signature string, args ...interface{}) uint16 {
rv, err := qtrt.InvokeQtFunc6Var("C_ZNK17QAndroidJniObject10callMethodItEET_PKcS3_z",
qtrt.FFI_TYPE_POINTER, 3, append([]interface{}{this.GetCthis(), methodName, signature}, args...)...)
qtrt.ErrPrint(err)
return uint16(rv)
}

func (this *QAndroidJniObject) CallMethod_5(methodName, signature string, args ...interface{}) int16 {
func (this *QAndroidJniObject) CallMethod5(methodName, signature string, args ...interface{}) int16 {
rv, err := qtrt.InvokeQtFunc6Var("C_ZNK17QAndroidJniObject10callMethodIsEET_PKcS3_z",
qtrt.FFI_TYPE_POINTER, 3, append([]interface{}{this.GetCthis(), methodName, signature}, args...)...)
qtrt.ErrPrint(err)
return int16(rv)
}

func (this *QAndroidJniObject) CallMethod_6(methodName, signature string, args ...interface{}) int {
func (this *QAndroidJniObject) CallMethod6(methodName, signature string, args ...interface{}) int {
rv, err := qtrt.InvokeQtFunc6Var("C_ZNK17QAndroidJniObject10callMethodIiEET_PKcS3_z",
qtrt.FFI_TYPE_POINTER, 3, append([]interface{}{this.GetCthis(), methodName, signature}, args...)...)
qtrt.ErrPrint(err)
return int(rv)
}

func (this *QAndroidJniObject) CallMethod_7(methodName, signature string, args ...interface{}) int64 {
func (this *QAndroidJniObject) CallMethod7(methodName, signature string, args ...interface{}) int64 {
rv, err := qtrt.InvokeQtFunc6Var("C_ZNK17QAndroidJniObject10callMethodIxEET_PKcS3_z",
qtrt.FFI_TYPE_POINTER, 3, append([]interface{}{this.GetCthis(), methodName, signature}, args...)...)
qtrt.ErrPrint(err)
return int64(rv)
}

func (this *QAndroidJniObject) CallMethod_8(methodName, signature string, args ...interface{}) float32 {
func (this *QAndroidJniObject) CallMethod8(methodName, signature string, args ...interface{}) float32 {
rv, err := qtrt.InvokeQtFunc6Var("C_ZNK17QAndroidJniObject10callMethodIfEET_PKcS3_z",
qtrt.FFI_TYPE_POINTER, 3, append([]interface{}{this.GetCthis(), methodName, signature}, args...)...)
qtrt.ErrPrint(err)
return float32(rv)
}

func (this *QAndroidJniObject) CallMethod_9(methodName, signature string, args ...interface{}) float64 {
func (this *QAndroidJniObject) CallMethod9(methodName, signature string, args ...interface{}) float64 {
rv, err := qtrt.InvokeQtFunc6Var("C_ZNK17QAndroidJniObject10callMethodIdEET_PKcS3_z",
qtrt.FFI_TYPE_POINTER, 3, append([]interface{}{this.GetCthis(), methodName, signature}, args...)...)
qtrt.ErrPrint(err)
Expand All @@ -84,56 +84,56 @@ func QAndroidJniObject__callStaticMethod(className, methodName, signature string
qtrt.ErrPrint(err, rv)
}

func QAndroidJniObject__callStaticMethod_2(className, methodName, signature string, args ...interface{}) byte {
func QAndroidJniObject__callStaticMethod2(className, methodName, signature string, args ...interface{}) byte {
rv, err := qtrt.InvokeQtFunc6Var("C_ZN17QAndroidJniObject16callStaticMethodIhEET_PKcS3_S3_z",
qtrt.FFI_TYPE_POINTER, 3, append([]interface{}{className, methodName, signature}, args...)...)
qtrt.ErrPrint(err)
return byte(rv)
}

func QAndroidJniObject__callStaticMethod_3(className, methodName, signature string, args ...interface{}) int8 {
func QAndroidJniObject__callStaticMethod3(className, methodName, signature string, args ...interface{}) int8 {
rv, err := qtrt.InvokeQtFunc6Var("C_ZN17QAndroidJniObject16callStaticMethodIaEET_PKcS3_S3_z",
qtrt.FFI_TYPE_POINTER, 3, append([]interface{}{className, methodName, signature}, args...)...)
qtrt.ErrPrint(err)
return int8(rv)
}

func QAndroidJniObject__callStaticMethod_4(className, methodName, signature string, args ...interface{}) int16 {
func QAndroidJniObject__callStaticMethod4(className, methodName, signature string, args ...interface{}) int16 {
rv, err := qtrt.InvokeQtFunc6Var("C_ZN17QAndroidJniObject16callStaticMethodIsEET_PKcS3_S3_z",
qtrt.FFI_TYPE_POINTER, 3, append([]interface{}{className, methodName, signature}, args...)...)
qtrt.ErrPrint(err)
return int16(rv)
}

func QAndroidJniObject__callStaticMethod_5(className, methodName, signature string, args ...interface{}) uint16 {
func QAndroidJniObject__callStaticMethod5(className, methodName, signature string, args ...interface{}) uint16 {
rv, err := qtrt.InvokeQtFunc6Var("C_ZN17QAndroidJniObject16callStaticMethodItEET_PKcS3_S3_z",
qtrt.FFI_TYPE_POINTER, 3, append([]interface{}{className, methodName, signature}, args...)...)
qtrt.ErrPrint(err)
return uint16(rv)
}

func QAndroidJniObject__callStaticMethod_6(className, methodName, signature string, args ...interface{}) int {
func QAndroidJniObject__callStaticMethod6(className, methodName, signature string, args ...interface{}) int {
rv, err := qtrt.InvokeQtFunc6Var("C_ZN17QAndroidJniObject16callStaticMethodIiEET_PKcS3_S3_z",
qtrt.FFI_TYPE_POINTER, 3, append([]interface{}{className, methodName, signature}, args...)...)
qtrt.ErrPrint(err)
return int(rv)
}

func QAndroidJniObject__callStaticMethod_7(className, methodName, signature string, args ...interface{}) int64 {
func QAndroidJniObject__callStaticMethod7(className, methodName, signature string, args ...interface{}) int64 {
rv, err := qtrt.InvokeQtFunc6Var("C_ZN17QAndroidJniObject16callStaticMethodIxEET_PKcS3_S3_z",
qtrt.FFI_TYPE_POINTER, 3, append([]interface{}{className, methodName, signature}, args...)...)
qtrt.ErrPrint(err)
return int64(rv)
}

func QAndroidJniObject__callStaticMethod_8(className, methodName, signature string, args ...interface{}) float32 {
func QAndroidJniObject__callStaticMethod8(className, methodName, signature string, args ...interface{}) float32 {
rv, err := qtrt.InvokeQtFunc6Var("C_ZN17QAndroidJniObject16callStaticMethodIfEET_PKcS3_S3_z",
qtrt.FFI_TYPE_POINTER, 3, append([]interface{}{className, methodName, signature}, args...)...)
qtrt.ErrPrint(err)
return float32(rv)
}

func QAndroidJniObject__callStaticMethod_9(className, methodName, signature string, args ...interface{}) float64 {
func QAndroidJniObject__callStaticMethod9(className, methodName, signature string, args ...interface{}) float64 {
rv, err := qtrt.InvokeQtFunc6Var("C_ZN17QAndroidJniObject16callStaticMethodIdEET_PKcS3_S3_z",
qtrt.FFI_TYPE_POINTER, 3, append([]interface{}{className, methodName, signature}, args...)...)
qtrt.ErrPrint(err)
Expand Down
8 changes: 5 additions & 3 deletions qtmeta/meta_mark.go
Original file line number Diff line number Diff line change
Expand Up @@ -341,7 +341,7 @@ func mksignalfn(thisty string, cobjptr unsafe.Pointer, cmdo unsafe.Pointer, sign
log.Panicln("wtf", cobjptr, cmdo, args)
}
qtrt.InvokeQtFunc6("C_ZN11QMetaObject8activateEP7QObjectPKS_iPPv", qtrt.FFI_TYPE_POINTER, cobjptr, cmdo, signal_index, args_)
if DebugQtMeta {
if debugQtMeta {
log.Printf("emited signal: %s(%p)::%s:%d(%v|%v)\n", thisty, cobjptr, signal_name, signal_index, args, fullargs)
}
// void *_a[] = { nullptr, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) };
Expand All @@ -350,11 +350,13 @@ func mksignalfn(thisty string, cobjptr unsafe.Pointer, cmdo unsafe.Pointer, sign
}
}

var DebugQtMeta = false
var debugQtMeta = false

func init() {
DebugQtMeta = os.Getenv("QTGO_DEBUG_QTMETA") == "1" || os.Getenv("QTGO_DEBUG_QTMETA") == "true"
debugQtMeta = os.Getenv("QTGO_DEBUG_QTMETA") == "1" ||
strings.ToLower(os.Getenv("QTGO_DEBUG_QTMETA")) == "true"
}
func SetDebugQtMeta(on bool) { debugQtMeta = on }

/////
var mdcache = &_QtMetaDatas{
Expand Down
26 changes: 24 additions & 2 deletions qtrt/ffi_invoke.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include <stdint.h>
#include "ffi.h"

//
static ffi_type* itype2stype(int itype){
switch (itype) {
case FFI_TYPE_VOID:
Expand Down Expand Up @@ -40,7 +41,7 @@ static ffi_type* itype2stype(int itype){
argtypes int[20]
argvals uint64_t[20] it's should be arguments's address but store in uint64_t
*/
void ffi_call_ex(void*fn, int retype, uint64_t* retval, int argc, uint8_t* argtys, uint64_t* argvals) {
void ffi_call_ex_impl(void*fn, int retype, uint64_t* retval, int argc, uint8_t* argtys, uint64_t* argvals) {
ffi_cif cif;
ffi_type *ffitys[20] = {0};
void *ffivals[20] = {0};
Expand All @@ -61,7 +62,7 @@ void ffi_call_ex(void*fn, int retype, uint64_t* retval, int argc, uint8_t* argty
argtypes int[20]
argvals uint64_t[20] it's should be arguments's address but store in uint64_t
*/
void ffi_call_var_ex(void*fn, int retype, uint64_t* retval, int fixedargc, int totalargc,
void ffi_call_var_ex_impl(void*fn, int retype, uint64_t* retval, int fixedargc, int totalargc,
uint8_t* argtys, uint64_t* argvals) {
ffi_cif cif;
ffi_type *ffitys[20] = {0};
Expand All @@ -77,3 +78,24 @@ void ffi_call_var_ex(void*fn, int retype, uint64_t* retval, int fixedargc, int t
ffi_call(&cif, fn, retval, ffivals);
}
}

//
void (*ffi_call_ex_fnptr)(void*fn, int retype, uint64_t* retval, int argc,
uint8_t* argtys, uint64_t* argvals) = &ffi_call_ex_impl;
void (*ffi_call_var_ex_fnptr)(void*fn, int retype, uint64_t* retval, int fixedargc, int totalargc,
uint8_t* argtys, uint64_t* argvals) = &ffi_call_var_ex_impl;

void set_so_ffi_call_ex(void* ex_fnptr, void* varex_fnptr) {
if (ex_fnptr != 0 && varex_fnptr != 0) {
ffi_call_ex_fnptr = ex_fnptr;
ffi_call_var_ex_fnptr = varex_fnptr;
}
}

void ffi_call_ex(void*fn, int retype, uint64_t* retval, int argc, uint8_t* argtys, uint64_t* argvals) {
ffi_call_ex_fnptr(fn, retype, retval, argc, argtys, argvals);
}
void ffi_call_var_ex(void*fn, int retype, uint64_t* retval, int fixedargc, int totalargc,
uint8_t* argtys, uint64_t* argvals) {
ffi_call_var_ex_fnptr(fn, retype, retval, fixedargc, totalargc, argtys, argvals);
}
14 changes: 13 additions & 1 deletion qtrt/ffi_invoke.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ static void ffi_call_0(void*fn) {
extern void ffi_call_ex(void*fn, int retype, uint64_t *rc, int argc, uint8_t* argtys, uint64_t* argvals);
extern void ffi_call_var_ex(void*fn, int retype, uint64_t *rc, int fixedargc, int totalargc, uint8_t* argtys, uint64_t* argvals);
extern void set_so_ffi_call_ex(void* ex_fnptr, void* varex_fnptr);
static void ffi_call_1(void*fn) {
Expand Down Expand Up @@ -163,6 +164,7 @@ func SetDebugFFICall(on bool) { debugFFICall = on }
func init() {
log.SetFlags(log.Flags() | log.Lshortfile)
init_ffi_invoke()
init_so_ffi_call()

// TODO maybe run when first qtcall
init_destroyedDynSlot()
Expand Down Expand Up @@ -226,6 +228,14 @@ func init_ffi_invoke() {
}
}

func init_so_ffi_call() {
ex_fnptr := GetQtSymAddrRaw("ffi_call_ex")
varex_fnptr := GetQtSymAddrRaw("ffi_call_var_ex")
if ex_fnptr != nil && varex_fnptr != nil {
C.set_so_ffi_call_ex(ex_fnptr, varex_fnptr)
}
}

func deinit() {}

func InvokeQtFunc(symname string, retype byte, types []byte, args ...interface{}) (VRetype, error) {
Expand Down Expand Up @@ -342,7 +352,9 @@ func GetQtSymAddrRaw(symname string) unsafe.Pointer {
}
return addr
}
log.Println(fmt.Errorf("Symbol not found: %s", symname))
if debugFFICall {
log.Println(fmt.Errorf("Symbol not found: %s", symname))
}
return nil
}

Expand Down
3 changes: 3 additions & 0 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,3 +94,6 @@ Go side signal/slot: [syntax document](https://github.com/kitech/qt.go/blob/mast
Qt.Go uses FFI to call wrapped Qt functions and methods, so there is no compile/link time dependency on Qt, only a run time dependency.

This should make the development and testing phases much faster.

[Internal document](https://github.com/kitech/qt.go/blob/master/docs/qt-go-internals.md)

0 comments on commit 8c5edc9

Please sign in to comment.