diff --git a/cl/_testgo/cgofull/bar.go b/cl/_testgo/cgofull/bar.go new file mode 100644 index 00000000..08e6830f --- /dev/null +++ b/cl/_testgo/cgofull/bar.go @@ -0,0 +1,16 @@ +package main + +/* +#cgo CFLAGS: -DBAR +#include +#include "foo.h" +static void foo(Foo* f) { + printf("foo in bar: %d\n", f->a); +} +*/ +import "C" + +func Bar(f *C.Foo) { + C.print_foo(f) + C.foo(f) +} diff --git a/cl/_testgo/cgofull/cgofull.go b/cl/_testgo/cgofull/cgofull.go new file mode 100644 index 00000000..476b0167 --- /dev/null +++ b/cl/_testgo/cgofull/cgofull.go @@ -0,0 +1,115 @@ +package main + +/* +#cgo windows,!amd64 CFLAGS: -D_WIN32 +#cgo !windows CFLAGS: -D_POSIX +#cgo windows,amd64 CFLAGS: -D_WIN64 +#cgo linux,amd64 CFLAGS: -D_LINUX64 +#cgo !windows,amd64 CFLAGS: -D_UNIX64 +#cgo pkg-config: python3-embed +#include +#include +#include "foo.h" +typedef struct { + int a; +} s4; + +typedef struct { + int a; + int b; +} s8; + +typedef struct { + int a; + int b; + int c; +} s12; + +typedef struct { + int a; + int b; + int c; + int d; +} s16; + +typedef struct { + int a; + int b; + int c; + int d; + int e; +} s20; + +static int test_structs(s4* s4, s8* s8, s12* s12, s16* s16, s20* s20) { + printf("s4.a: %d\n", s4->a); + printf("s8.a: %d, s8.b: %d\n", s8->a, s8->b); + printf("s12.a: %d, s12.b: %d, s12.c: %d\n", s12->a, s12->b, s12->c); + printf("s16.a: %d, s16.b: %d, s16.c: %d, s16.d: %d\n", s16->a, s16->b, s16->c, s16->d); + printf("s20.a: %d, s20.b: %d, s20.c: %d, s20.d: %d, s20.e: %d\n", s20->a, s20->b, s20->c, s20->d, s20->e); + + return s4->a + s8->a + s8->b + s12->a + s12->b + s12->c + s16->a + s16->b + s16->c + s16->d + s20->a + s20->b + s20->c + s20->d + s20->e; +} + +static void test_macros() { +#ifdef FOO + printf("FOO is defined\n"); +#endif +#ifdef BAR + printf("BAR is defined\n"); +#endif +#ifdef _WIN32 + printf("WIN32 is defined\n"); +#endif +#ifdef _POSIX + printf("POSIX is defined\n"); +#endif +#ifdef _WIN64 + printf("WIN64 is defined\n"); +#endif +#ifdef _LINUX64 + printf("LINUX64 is defined\n"); +#endif +#ifdef _UNIX64 + printf("UNIX64 is defined\n"); +#endif +} + +#define MY_VERSION "1.0.0" +#define MY_CODE 0x12345678 + +void test_void() { + printf("test_void\n"); +} +*/ +import "C" +import ( + "fmt" + "unsafe" + + "github.com/goplus/llgo/_demo/cgofull/pymod1" + "github.com/goplus/llgo/_demo/cgofull/pymod2" +) + +func main() { + runPy() + f := &C.Foo{a: 1} + Foo(f) + Bar(f) + C.test_macros() + r := C.test_structs(&C.s4{a: 1}, &C.s8{a: 1, b: 2}, &C.s12{a: 1, b: 2, c: 3}, &C.s16{a: 1, b: 2, c: 3, d: 4}, &C.s20{a: 1, b: 2, c: 3, d: 4, e: 5}) + fmt.Println(r) + if r != 35 { + panic("test_structs failed") + } + fmt.Println(C.MY_VERSION) + fmt.Println(int(C.MY_CODE)) + C.test_void() +} + +func runPy() { + Initialize() + defer Finalize() + Run("print('Hello, Python!')") + C.PyObject_Print((*C.PyObject)(unsafe.Pointer(pymod1.Float(1.23))), C.stderr, 0) + C.PyObject_Print((*C.PyObject)(unsafe.Pointer(pymod2.Long(123))), C.stdout, 0) +} diff --git a/cl/_testgo/cgofull/foo.c b/cl/_testgo/cgofull/foo.c new file mode 100644 index 00000000..b3f07e04 --- /dev/null +++ b/cl/_testgo/cgofull/foo.c @@ -0,0 +1,6 @@ +#include +#include "foo.h" + +void print_foo(Foo* f) { + printf("print_foo: %d\n", f->a); +} diff --git a/cl/_testgo/cgofull/foo.go b/cl/_testgo/cgofull/foo.go new file mode 100644 index 00000000..1d6aa3b4 --- /dev/null +++ b/cl/_testgo/cgofull/foo.go @@ -0,0 +1,16 @@ +package main + +/* +#cgo CFLAGS: -DFOO +#include +#include "foo.h" +static void foo(Foo* f) { + printf("foo in bar: %d\n", f->a); +} +*/ +import "C" + +func Foo(f *C.Foo) { + C.print_foo(f) + C.foo(f) +} diff --git a/cl/_testgo/cgofull/foo.h b/cl/_testgo/cgofull/foo.h new file mode 100644 index 00000000..f714fec6 --- /dev/null +++ b/cl/_testgo/cgofull/foo.h @@ -0,0 +1,7 @@ +#pragma once + +typedef struct { + int a; +} Foo; + +extern void print_foo(Foo* f); diff --git a/cl/_testgo/cgofull/out.ll b/cl/_testgo/cgofull/out.ll new file mode 100644 index 00000000..1c8a0e79 --- /dev/null +++ b/cl/_testgo/cgofull/out.ll @@ -0,0 +1 @@ +; \ No newline at end of file diff --git a/cl/_testgo/cgofull/py.go b/cl/_testgo/cgofull/py.go new file mode 100644 index 00000000..509d88ca --- /dev/null +++ b/cl/_testgo/cgofull/py.go @@ -0,0 +1,24 @@ +package main + +/* +#cgo pkg-config: python3-embed +#include +*/ +import "C" +import "fmt" + +func Initialize() { + C.Py_Initialize() +} + +func Finalize() { + C.Py_Finalize() +} + +func Run(code string) error { + if C.PyRun_SimpleString(C.CString(code)) != 0 { + C.PyErr_Print() + return fmt.Errorf("failed to run code") + } + return nil +} diff --git a/cl/_testgo/cgofull/pymod1/pymod1.go b/cl/_testgo/cgofull/pymod1/pymod1.go new file mode 100644 index 00000000..480b1b4a --- /dev/null +++ b/cl/_testgo/cgofull/pymod1/pymod1.go @@ -0,0 +1,11 @@ +package pymod1 + +/* +#cgo pkg-config: python3-embed +#include +*/ +import "C" + +func Float(f float64) *C.PyObject { + return C.PyFloat_FromDouble(C.double(f)) +} diff --git a/cl/_testgo/cgofull/pymod2/pymod2.go b/cl/_testgo/cgofull/pymod2/pymod2.go new file mode 100644 index 00000000..8cc7dd27 --- /dev/null +++ b/cl/_testgo/cgofull/pymod2/pymod2.go @@ -0,0 +1,11 @@ +package pymod2 + +/* +#cgo pkg-config: python3-embed +#include +*/ +import "C" + +func Long(l int64) *C.PyObject { + return C.PyLong_FromLongLong(C.longlong(l)) +}