mirror of
https://github.com/mappu/miqt.git
synced 2024-12-22 08:58:37 +00:00
handbindings: avoid unsafe.Pointer when marshalling cgo.Handle
This commit is contained in:
parent
204f886760
commit
0e705a4e6e
@ -4,7 +4,7 @@
|
|||||||
#include <QPushButton>
|
#include <QPushButton>
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
extern void miqt_exec_callback(void* cb, int argc, void* argv);
|
extern void miqt_exec_callback(intptr_t cb, int argc, void* argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
PQApplication QApplication_new(int* argc, char** argv) {
|
PQApplication QApplication_new(int* argc, char** argv) {
|
||||||
@ -28,7 +28,7 @@ void QPushButton_show(PQPushButton self) {
|
|||||||
static_cast<QPushButton*>(self)->show();
|
static_cast<QPushButton*>(self)->show();
|
||||||
}
|
}
|
||||||
|
|
||||||
void QPushButton_connect_pressed(PQPushButton self, void* cb) {
|
void QPushButton_connect_pressed(PQPushButton self, intptr_t cb) {
|
||||||
QPushButton::connect(static_cast<QPushButton*>(self), &QPushButton::pressed, [=]() {
|
QPushButton::connect(static_cast<QPushButton*>(self), &QPushButton::pressed, [=]() {
|
||||||
miqt_exec_callback(cb, 0, nullptr);
|
miqt_exec_callback(cb, 0, nullptr);
|
||||||
});
|
});
|
||||||
|
@ -28,11 +28,11 @@ func CArray(data []string) (C.int, **C.char) {
|
|||||||
type CallbackFunc func(argc C.int, args *C.void)
|
type CallbackFunc func(argc C.int, args *C.void)
|
||||||
|
|
||||||
//export miqt_exec_callback
|
//export miqt_exec_callback
|
||||||
func miqt_exec_callback(cb *C.void, argc C.int, args *C.void) {
|
func miqt_exec_callback(cb C.intptr_t, argc C.int, args *C.void) {
|
||||||
// Our CABI for all callbacks is void(int, void*).
|
// Our CABI for all callbacks is void(int, void*).
|
||||||
// Our Go ABI is CallbackFunc
|
// Our Go ABI is CallbackFunc
|
||||||
// Then the Go bindings can unmarshal the arguments and C.free() them as necessary
|
// Then the Go bindings can unmarshal the arguments and C.free() them as necessary
|
||||||
cfunc, ok := (cgo.Handle(uintptr(unsafe.Pointer(cb))).Value()).(CallbackFunc)
|
cfunc, ok := (cgo.Handle(cb)).Value().(CallbackFunc)
|
||||||
if !ok {
|
if !ok {
|
||||||
panic("miqt: callback of non-callback type (heap corruption?)")
|
panic("miqt: callback of non-callback type (heap corruption?)")
|
||||||
}
|
}
|
||||||
@ -105,6 +105,6 @@ func (this *QPushButton) OnPressed(cb func()) {
|
|||||||
cb()
|
cb()
|
||||||
}
|
}
|
||||||
|
|
||||||
C.QPushButton_connect_pressed(this.h, unsafe.Pointer(uintptr(cgo.NewHandle(cbWrapper))))
|
C.QPushButton_connect_pressed(this.h, C.intptr_t(cgo.NewHandle(cbWrapper)))
|
||||||
// TODO allow disconnect'ing, or tie lifespan for handle.Delete(), ...
|
// TODO allow disconnect'ing, or tie lifespan for handle.Delete(), ...
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,7 @@ PQPushButton QPushButton_new(const char* label, PQWidget parent);
|
|||||||
|
|
||||||
void QPushButton_show(PQPushButton self);
|
void QPushButton_show(PQPushButton self);
|
||||||
|
|
||||||
void QPushButton_connect_pressed(PQPushButton self, void* cb);
|
void QPushButton_connect_pressed(PQPushButton self, intptr_t cb);
|
||||||
|
|
||||||
int QApplication_exec(PQApplication self);
|
int QApplication_exec(PQApplication self);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user