Skip to content

Commit 489a7fe

Browse files
author
g.ph
committed
update
1 parent 4d14d24 commit 489a7fe

File tree

12 files changed

+174
-56
lines changed

12 files changed

+174
-56
lines changed

PyLong.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package py3
2+
3+
import (
4+
"github.com/aadog/py3-go/cpy3"
5+
"unsafe"
6+
)
7+
8+
type PyLong struct {
9+
PyObject
10+
}
11+
12+
// PyLongFromInst
13+
// 新建一个对象来自已经存在的对象实例指针。
14+
//
15+
// Create a new object from an existing object instance pointer.
16+
func PyLongFromInst(inst uintptr) *PyLong {
17+
dl := new(PyLong)
18+
dl.instance = inst
19+
dl.ptr = unsafe.Pointer(dl.instance)
20+
return dl
21+
}
22+
func PyLongFromObj(obj *PyObject) *PyLong {
23+
dl := new(PyLong)
24+
dl.PyObject = *obj
25+
return dl
26+
}
27+
func PyLongFromLong(n int) *PyLong {
28+
return PyLongFromInst(cpy3.PyLong_FromLong(n))
29+
}
30+
func PyLongFromLongLong(n int64) *PyLong {
31+
return PyLongFromInst(cpy3.PyLong_FromLongLong(n))
32+
}
33+
func PyLong_FromDouble(n float64) *PyLong {
34+
return PyLongFromInst(cpy3.PyLong_FromDouble(n))
35+
}

PyMethodDef.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ type PyMethodDef struct {
88
}
99

1010
func NewMethodDef(name string, meth func(self *PyObject, args *PyObject) *PyObject, doc string, flags int) *PyMethodDef {
11-
return &PyMethodDef{
11+
def := &PyMethodDef{
1212
Name: name,
1313
Method: meth,
1414
flags: flags,
1515
Doc: doc,
1616
}
17+
return def
1718
}

PyModule.go

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,20 @@ import (
88
"unsafe"
99
)
1010

11+
var ModuleMethodsDef = sync.Map{}
12+
var ModuleDefMap = sync.Map{}
1113
var PyMethodMap = sync.Map{}
1214
var pyModuleInitMap = sync.Map{}
15+
1316
var PyMethodCallBack = syscall.NewCallback(func(self uintptr, args uintptr) uintptr {
1417
pyArgs := PyTupleFromInst(args)
1518
pyArgsLen := pyArgs.Size()
1619
if pyArgsLen < 1 {
1720
return Py_RETURN_NONE().instance
1821
}
19-
code := pyArgs.GetItem(0)
22+
code := pyArgs.GetItem(0).Str()
2023

21-
ifn, ok := PyMethodMap.Load(code.Str())
24+
ifn, ok := PyMethodMap.Load(code)
2225
if ok == false {
2326
return Py_RETURN_NONE().Instance()
2427
}
@@ -102,20 +105,31 @@ func CreateModule(def *PyModuleDef) *PyObject {
102105
methods := make([]cpy3.PyMethodDef, 0)
103106
for _, method := range def.MethodDefs {
104107
methodName := method.Name
105-
methods = append(methods, cpy3.PyMethodDef{
106-
Ml_name: cpy3.GoStrToCStr(method.Name),
107-
Ml_meth: NewMethodCallBack(moduleName, methodName, method.Method),
108-
Ml_flags: method.flags,
109-
Ml_doc: cpy3.GoStrToCStr(method.Doc),
110-
})
108+
NewMethodCallBack(moduleName,methodName,method.Method)
109+
//methodDef := cpy3.PyMethodDef{
110+
// Ml_name: cpy3.GoStrToCStr(method.Name),
111+
// Ml_meth: NewMethodCallBack(moduleName, methodName, method.Method),
112+
// Ml_flags: method.flags,
113+
// Ml_doc: cpy3.GoStrToCStr(method.Doc),
114+
//}
115+
//methods = append(methods, methodDef)
111116
}
112-
methods = append(methods, cpy3.PyMethodDef{
117+
methodCallDef := cpy3.PyMethodDef{
118+
Ml_name: cpy3.GoStrToCStr("Call"),
119+
Ml_meth: PyMethodCallBack,
120+
Ml_flags: 1,
121+
Ml_doc: cpy3.GoStrToCStr("跳转程序"),
122+
}
123+
methods = append(methods, methodCallDef)
124+
moduleNullMethodDef := cpy3.PyMethodDef{
113125
Ml_name: 0,
114126
Ml_meth: 0,
115127
Ml_flags: 0,
116128
Ml_doc: 0,
117-
})
129+
}
130+
methods = append(methods, moduleNullMethodDef)
118131

132+
ModuleMethodsDef.Store(fmt.Sprintf("%s", moduleName), methods)
119133
moduleDef := cpy3.PyModuleDef{
120134
M_base: cpy3.PyModuleDef_Base{
121135
Ob_base: cpy3.PyObject_HEAD_INIT(0),
@@ -129,6 +143,10 @@ func CreateModule(def *PyModuleDef) *PyObject {
129143
M_clear: 0,
130144
M_free: 0,
131145
}
132-
ptr := cpy3.PyModule_Create2(uintptr(unsafe.Pointer(&moduleDef)), 1013)
133-
return PyObjectFromInst(ptr)
146+
ModuleDefMap.Store(moduleName, def)
147+
148+
pyObj := PyObjectFromInst(cpy3.PyModule_Create2(uintptr(unsafe.Pointer(&moduleDef)), 1013))
149+
//不知道为啥非要IncRef一次才不会崩溃
150+
pyObj.IncRef()
151+
return pyObj
134152
}

ModuleDef.go renamed to PyModuleDef.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ type PyModuleDef struct {
77
}
88

99
func NewModuleDef(name string, doc string) *PyModuleDef {
10-
return &PyModuleDef{Name: name, Doc: doc}
10+
def := &PyModuleDef{Name: name, Doc: doc}
11+
return def
1112
}
1213
func (m *PyModuleDef) AddMethodDef(methodDef *PyMethodDef) {
1314
m.MethodDefs = append(m.MethodDefs, methodDef)

PyObject.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,16 @@ type PyObject struct {
1616
func (p *PyObject) String() string {
1717
return p.Str()
1818
}
19+
func (p *PyObject) CallNoArgs() *PyObject {
20+
return PyObjectFromInst(cpy3.PyObject_CallNoArgs(p.Instance()))
21+
}
22+
func (p *PyObject) CallObject(args *PyObject) *PyObject {
23+
return PyObjectFromInst(cpy3.PyObject_CallObject(p.Instance(), args.instance))
24+
}
25+
func (p *PyObject) PyObject_Call(args *PyObject, kwargs *PyObject) *PyObject {
26+
return PyObjectFromInst(cpy3.PyObject_Call(p.Instance(), args.instance, kwargs.instance))
27+
}
28+
1929
func (p *PyObject) GetAttr(attr_name string) *PyObject {
2030
name := PyUnicode_FromString(attr_name)
2131
defer name.DecRef()
@@ -35,9 +45,24 @@ func (o *PyObject) IncRef() {
3545
cpy3.Py_IncRef(o.instance)
3646
}
3747
}
48+
func (p *PyObject) RefCount() int {
49+
return int(cpy3.PyObjectFromPtr(p.instance).Ob_refcnt)
50+
}
3851
func (p *PyObject) AsObj() *PyObject {
3952
return p
4053
}
54+
func (p *PyObject) AsInt() int {
55+
return int(p.AsLong())
56+
}
57+
func (p *PyObject) AsDouble() float64 {
58+
return cpy3.PyLong_AsDouble(p.instance)
59+
}
60+
func (p *PyObject) AsLong() int {
61+
return cpy3.PyLong_AsLong(p.instance)
62+
}
63+
func (p *PyObject) AsLongLong() int64 {
64+
return cpy3.PyLong_AsLongLong(p.instance)
65+
}
4166

4267
// PyObjectFromInst
4368
// 新建一个对象来自已经存在的对象实例指针。

README.MD

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
2+
### go python bind
3+
4+
#### cgo-less
5+
6+
```
7+
go get github.com/aadog/py3-go
8+
```

RegModule.go

Lines changed: 6 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
11
package py3
22

33
import (
4-
"github.com/aadog/py3-go/cpy3"
54
"reflect"
6-
"sync"
7-
"unsafe"
85
)
96

10-
var ModuleDef = sync.Map{}
11-
127
func RegPyModule(moduleName string, structV any) *PyObject {
138
val := reflect.ValueOf(structV)
149
inval := reflect.Indirect(val)
@@ -24,43 +19,20 @@ func RegPyModule(moduleName string, structV any) *PyObject {
2419
if docV.Kind() == reflect.String {
2520
doc = docV.String()
2621
}
22+
moduleDef := NewModuleDef(moduleName, doc)
23+
2724

28-
methods := make([]cpy3.PyMethodDef, 0)
2925
for i := 0; i < tp.NumMethod(); i++ {
3026
method := tp.Method(i)
3127
methodVal := val.Method(i)
3228
fn, fnOk := methodVal.Interface().(PyMethodType)
3329
if !fnOk {
34-
break
30+
continue
3531
}
3632
methodName := method.Name
37-
methods = append(methods, cpy3.PyMethodDef{
38-
Ml_name: cpy3.GoStrToCStr(methodName),
39-
Ml_meth: NewMethodCallBack(moduleName, methodName, fn),
40-
Ml_flags: 1,
41-
Ml_doc: cpy3.GoStrToCStr(""),
42-
})
33+
moduleDef.AddMethodDef(NewMethodDef(methodName, fn, "", 1))
4334
}
44-
methods = append(methods, cpy3.PyMethodDef{
45-
Ml_name: 0,
46-
Ml_meth: 0,
47-
Ml_flags: 0,
48-
Ml_doc: 0,
49-
})
5035

51-
moduleDef := cpy3.PyModuleDef{
52-
M_base: cpy3.PyModuleDef_Base{
53-
Ob_base: cpy3.PyObject_HEAD_INIT(0),
54-
},
55-
M_name: cpy3.GoStrToCStr(moduleName),
56-
M_doc: cpy3.GoStrToCStr(doc),
57-
M_size: -1,
58-
M_methods: uintptr(unsafe.Pointer(&methods[0])),
59-
M_slots: 0,
60-
M_traverse: 0,
61-
M_clear: 0,
62-
M_free: 0,
63-
}
64-
ptr := cpy3.PyModule_Create2(uintptr(unsafe.Pointer(&moduleDef)), 1013)
65-
return PyObjectFromInst(ptr)
36+
obj := CreateModule(moduleDef)
37+
return obj
6638
}

cpy3/PyLong.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package cpy3
2+
3+
func PyLong_AsDouble(obj uintptr) float64 {
4+
r, _, _ := pyLong_AsDouble.Call(obj)
5+
return float64(r)
6+
}
7+
func PyLong_AsLong(obj uintptr) int {
8+
r, _, _ := pyLong_AsLong.Call(obj)
9+
return int(r)
10+
}
11+
func PyLong_AsLongLong(obj uintptr) int64 {
12+
r, _, _ := pyLong_AsLongLong.Call(obj)
13+
return int64(r)
14+
}
15+
16+
func PyLong_FromLong(n int) uintptr {
17+
r, _, _ := pyLong_FromLong.Call(uintptr(n))
18+
return r
19+
}
20+
21+
func PyLong_FromLongLong(n int64) uintptr {
22+
r, _, _ := pyLong_FromLong.Call(uintptr(n))
23+
return r
24+
}
25+
func PyLong_FromDouble(n float64) uintptr {
26+
r, _, _ := pyLong_FromLong.Call(uintptr(n))
27+
return r
28+
}
29+
30+
//func PyLong_FromString(n float64) uintptr {
31+
// r, _, _ := pyLong_FromLong.Call(uintptr(n))
32+
// return r
33+
//}

cpy3/PyModule.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package cpy3
22

3+
import "unsafe"
4+
35
type PyMethodDef struct {
46
Ml_name uintptr
57
Ml_meth uintptr
@@ -12,6 +14,7 @@ type PyObject struct {
1214
Ob_refcnt uintptr
1315
Ob_type uintptr
1416
}
17+
1518
type PyModuleDef_Base struct {
1619
Ob_base PyObject
1720
M_init uintptr
@@ -30,6 +33,10 @@ type PyModuleDef struct {
3033
M_free uintptr
3134
}
3235

36+
func PyObjectFromPtr(ptr uintptr) *PyObject {
37+
return (*PyObject)(unsafe.Pointer(ptr))
38+
}
39+
3340
func PyObject_HEAD_INIT(ob_type uintptr) PyObject {
3441
return PyObject{
3542
Ob_refcnt: 1,

cpy3/PyObject.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,16 @@ func PyObject_GetAttr(obj uintptr, attr_name uintptr) uintptr {
99
r, _, _ := pyObject_GetAttr.Call(obj, attr_name)
1010
return r
1111
}
12+
13+
func PyObject_Call(obj uintptr, args uintptr, kwargs uintptr) uintptr {
14+
r, _, _ := pyObject_Call.Call(obj, args, kwargs)
15+
return r
16+
}
17+
func PyObject_CallObject(obj uintptr, args uintptr) uintptr {
18+
r, _, _ := pyObject_CallObject.Call(obj, args)
19+
return r
20+
}
21+
func PyObject_CallNoArgs(obj uintptr) uintptr {
22+
r, _, _ := pyObject_CallNoArgs.Call(obj)
23+
return r
24+
}

0 commit comments

Comments
 (0)