Skip to content

Commit 92e4196

Browse files
author
g.ph
committed
update
1 parent ab76c6f commit 92e4196

29 files changed

+752
-38
lines changed

ModuleDef.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package py3_go
2+
3+
type PyModuleDef struct {
4+
Name string
5+
Doc string
6+
MethodDefs []*PyMethodDef
7+
}
8+
9+
func NewModuleDef(name string, doc string) *PyModuleDef {
10+
return &PyModuleDef{Name: name, Doc: doc}
11+
}
12+
func (m *PyModuleDef) AddMethodDef(methodDef *PyMethodDef) {
13+
m.MethodDefs = append(m.MethodDefs, methodDef)
14+
}

PyDict.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package py3_go
2+
3+
import "unsafe"
4+
5+
type PyDict struct {
6+
PyObject
7+
}
8+
9+
// PyDictFromInst
10+
// 新建一个对象来自已经存在的对象实例指针。
11+
//
12+
// Create a new object from an existing object instance pointer.
13+
func PyDictFromInst(inst uintptr) *PyDict {
14+
dl := new(PyDict)
15+
dl.instance = inst
16+
dl.ptr = unsafe.Pointer(dl.instance)
17+
return dl
18+
}

PyEval.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package py3_go
2+
3+
import "github.com/aadog/py3-go/cpy3"
4+
5+
func PyEval_GetBuiltins() *PyObject {
6+
return PyObjectFromInst(cpy3.PyEval_GetBuiltins())
7+
}
8+
func PyEval_GetLocals() *PyObject {
9+
return PyObjectFromInst(cpy3.PyEval_GetLocals())
10+
}
11+
func PyEval_GetGlobals() *PyObject {
12+
return PyObjectFromInst(cpy3.PyEval_GetGlobals())
13+
}
14+
func PyEval_GetFrame() *PyFrame {
15+
return PyFrameFromInst(cpy3.PyEval_GetFrame())
16+
}

PyFrame.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package py3_go
2+
3+
import (
4+
"github.com/aadog/go-py3/cpy3"
5+
"unsafe"
6+
)
7+
8+
type PyFrame struct {
9+
PyObject
10+
}
11+
12+
func (p *PyFrame) GetBack() *PyObject {
13+
return PyObjectFromInst(cpy3.PyFrame_GetBack(p.instance))
14+
}
15+
func (p *PyFrame) GetCode() *PyObject {
16+
return PyObjectFromInst(cpy3.PyFrame_GetCode(p.instance))
17+
}
18+
19+
// PyFrameFromInst
20+
// 新建一个对象来自已经存在的对象实例指针。
21+
//
22+
// Create a new object from an existing object instance pointer.
23+
func PyFrameFromInst(inst uintptr) *PyFrame {
24+
dl := new(PyFrame)
25+
dl.instance = inst
26+
dl.ptr = unsafe.Pointer(dl.instance)
27+
return dl
28+
}

PyImport.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package py3_go
2+
3+
import "github.com/aadog/py3-go/cpy3"
4+
5+
func PyImport_Import(name string) *PyModule {
6+
pName := PyUnicode_DecodeFSDefault(name)
7+
defer pName.DecRef()
8+
return PyModuleFromInst(cpy3.PyImport_Import(pName.instance))
9+
}
10+
func PyImport_AppendInittab(name string, initFunc func() *PyObject) int {
11+
PyMethodMap.Store(name, initFunc)
12+
return cpy3.PyImport_AppendInittab(name, NewModuleInitFuncCallBack(name, initFunc))
13+
}

PyMethodDef.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package py3_go
2+
3+
type PyMethodDef struct {
4+
Name string
5+
Method func(self *PyObject, args *PyObject) *PyObject
6+
flags int
7+
Doc string
8+
}
9+
10+
func NewMethodDef(name string, meth func(self *PyObject, args *PyObject) *PyObject, doc string, flags int) *PyMethodDef {
11+
return &PyMethodDef{
12+
Name: name,
13+
Method: meth,
14+
flags: flags,
15+
Doc: doc,
16+
}
17+
}

PyModule.go

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
package py3_go
2+
3+
import (
4+
"fmt"
5+
"github.com/aadog/py3-go/cpy3"
6+
"sync"
7+
"syscall"
8+
"unsafe"
9+
)
10+
11+
var PyMethodMap = sync.Map{}
12+
var pyModuleInitMap = sync.Map{}
13+
var PyMethodCallBack = syscall.NewCallback(func(self uintptr, args uintptr) uintptr {
14+
pyArgs := PyTupleFromInst(args)
15+
pyArgsLen := pyArgs.Size()
16+
if pyArgsLen < 1 {
17+
return Py_RETURN_NONE().instance
18+
}
19+
code := pyArgs.GetItem(0)
20+
21+
ifn, ok := PyMethodMap.Load(code.Str())
22+
if ok == false {
23+
return Py_RETURN_NONE().Instance()
24+
}
25+
//处理参数
26+
newArgs := pyArgs.GetSlice(1, pyArgsLen)
27+
defer newArgs.DecRef()
28+
fn := ifn.(func(self *PyObject, args *PyObject) *PyObject)
29+
return fn(PyObjectFromInst(self), PyObjectFromInst(newArgs.Instance())).Instance()
30+
})
31+
32+
type PyMethodType = func(self *PyObject, args *PyObject) *PyObject
33+
34+
type PyModule struct {
35+
PyObject
36+
}
37+
38+
func (p *PyModule) GetName() string {
39+
return cpy3.PyModule_GetName(p.instance)
40+
}
41+
func (p *PyModule) GetDict() *PyDict {
42+
return PyDictFromInst(cpy3.PyModule_GetDict(p.instance))
43+
}
44+
func (p *PyModule) AddFunctions(functionsDef []PyMethodDef) int {
45+
methods := make([]cpy3.PyMethodDef, 0)
46+
moduleName := p.GetName()
47+
for _, method := range functionsDef {
48+
methodName := method.Name
49+
methods = append(methods, cpy3.PyMethodDef{
50+
Ml_name: cpy3.GoStrToCStr(method.Name),
51+
Ml_meth: NewMethodCallBack(moduleName, methodName, method.Method),
52+
Ml_flags: method.flags,
53+
Ml_doc: cpy3.GoStrToCStr(method.Doc),
54+
})
55+
}
56+
methods = append(methods, cpy3.PyMethodDef{
57+
Ml_name: 0,
58+
Ml_meth: 0,
59+
Ml_flags: 0,
60+
Ml_doc: 0,
61+
})
62+
return cpy3.PyModule_AddFunctions(p.instance, uintptr(unsafe.Pointer(&methods[0])))
63+
}
64+
func (p *PyModule) AddIntConstant(name string, value int64) int {
65+
return cpy3.PyModule_AddIntConstant(p.instance, name, value)
66+
}
67+
func (p *PyModule) AddStringConstant(name string, value string) int {
68+
return cpy3.PyModule_AddStringConstant(p.instance, name, value)
69+
}
70+
func (p *PyModule) AddObject(name string, value *PyObject) int {
71+
return cpy3.PyModule_AddObject(p.instance, name, value.instance)
72+
}
73+
func (p *PyModule) AddObjectRef(name string, value *PyObject) int {
74+
return cpy3.PyModule_AddObjectRef(p.instance, name, value.instance)
75+
}
76+
77+
// PyModuleFromInst
78+
// 新建一个对象来自已经存在的对象实例指针。
79+
//
80+
// Create a new object from an existing object instance pointer.
81+
func PyModuleFromInst(inst uintptr) *PyModule {
82+
dl := new(PyModule)
83+
dl.instance = inst
84+
dl.ptr = unsafe.Pointer(dl.instance)
85+
return dl
86+
}
87+
88+
func NewModuleInitFuncCallBack(moduleName string, fn func() *PyObject) uintptr {
89+
c := syscall.NewCallback(func() uintptr {
90+
return fn().Instance()
91+
})
92+
pyModuleInitMap.Store(moduleName, c)
93+
return c
94+
}
95+
func NewMethodCallBack(moduleName string, methodName string, fn func(self *PyObject, args *PyObject) *PyObject) uintptr {
96+
PyMethodMap.Store(fmt.Sprintf("%s.%s", moduleName, methodName), fn)
97+
return PyMethodCallBack
98+
}
99+
100+
func CreateModule(def *PyModuleDef) *PyObject {
101+
moduleName := def.Name
102+
methods := make([]cpy3.PyMethodDef, 0)
103+
for _, method := range def.MethodDefs {
104+
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+
})
111+
}
112+
methods = append(methods, cpy3.PyMethodDef{
113+
Ml_name: 0,
114+
Ml_meth: 0,
115+
Ml_flags: 0,
116+
Ml_doc: 0,
117+
})
118+
119+
moduleDef := cpy3.PyModuleDef{
120+
M_base: cpy3.PyModuleDef_Base{
121+
Ob_base: cpy3.PyObject_HEAD_INIT(0),
122+
},
123+
M_name: cpy3.GoStrToCStr(def.Name),
124+
M_doc: cpy3.GoStrToCStr(def.Doc),
125+
M_size: -1,
126+
M_methods: uintptr(unsafe.Pointer(&methods[0])),
127+
M_slots: 0,
128+
M_traverse: 0,
129+
M_clear: 0,
130+
M_free: 0,
131+
}
132+
ptr := cpy3.PyModule_Create2(uintptr(unsafe.Pointer(&moduleDef)), 1013)
133+
return PyObjectFromInst(ptr)
134+
}

PyNone.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package py3_go
2+
3+
import (
4+
"github.com/aadog/py3-go/cpy3"
5+
"unsafe"
6+
)
7+
8+
type PyNone struct {
9+
PyObject
10+
}
11+
12+
// PyNoneFromInst
13+
// 新建一个对象来自已经存在的对象实例指针。
14+
//
15+
// Create a new object from an existing object instance pointer.
16+
func PyNoneFromInst(inst uintptr) *PyNone {
17+
dl := new(PyNone)
18+
dl.instance = inst
19+
dl.ptr = unsafe.Pointer(dl.instance)
20+
return dl
21+
}
22+
23+
func Py_RETURN_NONE() *PyNone {
24+
none := PyNoneFromInst(cpy3.Py_None())
25+
none.IncRef()
26+
return none
27+
}

PyObject.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package py3_go
2+
3+
import (
4+
"github.com/aadog/py3-go/cpy3"
5+
"unsafe"
6+
)
7+
8+
type IPyObject interface {
9+
SetObject(object *PyObject)
10+
}
11+
12+
type PyObject struct {
13+
CObj
14+
}
15+
16+
func (p *PyObject) String() string {
17+
return p.Str()
18+
}
19+
func (p *PyObject) GetAttr(attr_name string) *PyObject {
20+
name := PyUnicode_FromString(attr_name)
21+
defer name.DecRef()
22+
o := cpy3.PyObject_GetAttr(p.instance, name.instance)
23+
return PyObjectFromInst(o)
24+
}
25+
func (p *PyObject) Str() string {
26+
o := PyUnicodeFromInst(cpy3.PyObject_Str(p.instance))
27+
defer o.DecRef()
28+
return cpy3.PyUnicode_AsUTF8(o.instance)
29+
}
30+
func (o *PyObject) DecRef() {
31+
cpy3.Py_DecRef(o.instance)
32+
}
33+
func (o *PyObject) IncRef() {
34+
if o.instance != 0 {
35+
cpy3.Py_IncRef(o.instance)
36+
}
37+
}
38+
func (p *PyObject) AsObj() *PyObject {
39+
return p
40+
}
41+
42+
// PyObjectFromInst
43+
// 新建一个对象来自已经存在的对象实例指针。
44+
//
45+
// Create a new object from an existing object instance pointer.
46+
func PyObjectFromInst(inst uintptr) *PyObject {
47+
dl := new(PyObject)
48+
dl.instance = inst
49+
dl.ptr = unsafe.Pointer(dl.instance)
50+
return dl
51+
}

PyTuple.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package py3_go
2+
3+
import (
4+
"github.com/aadog/py3-go/cpy3"
5+
"unsafe"
6+
)
7+
8+
type PyTuple struct {
9+
PyObject
10+
}
11+
12+
func (p *PyTuple) Size() int64 {
13+
return cpy3.PyTuple_Size(p.instance)
14+
}
15+
func (p *PyTuple) Check() int64 {
16+
return cpy3.PyTuple_Check(p.instance)
17+
}
18+
func (p *PyTuple) GetItem(pos int64) *PyObject {
19+
return PyObjectFromInst(cpy3.PyTuple_GetItem(p.instance, pos))
20+
}
21+
func (p *PyTuple) GetSlice(low int64, high int64) *PyObject {
22+
return PyObjectFromInst(cpy3.PyTuple_GetSlice(p.instance, low, high))
23+
}
24+
25+
// PyTupleFromInst
26+
// 新建一个对象来自已经存在的对象实例指针。
27+
//
28+
// Create a new object from an existing object instance pointer.
29+
func PyTupleFromInst(inst uintptr) *PyTuple {
30+
dl := new(PyTuple)
31+
dl.instance = inst
32+
dl.ptr = unsafe.Pointer(dl.instance)
33+
return dl
34+
}
35+
func PyTupleFromObj(obj *PyObject) *PyTuple {
36+
dl := new(PyTuple)
37+
dl.PyObject = *obj
38+
return dl
39+
}

0 commit comments

Comments
 (0)