module.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package python
  2. import (
  3. "unsafe"
  4. )
  5. /*
  6. #define PY_SSIZE_T_CLEAN
  7. #include <Python.h>
  8. */
  9. import "C"
  10. var ModuleType = NewType(&C.PyModule_Type)
  11. func CreateModule(name string) (*Reference, error) {
  12. name_ := C.CString(name)
  13. defer C.free(unsafe.Pointer(name_))
  14. var definition C.PyModuleDef
  15. definition.m_name = name_
  16. if module := C.PyModule_Create2(&definition, C.PYTHON_ABI_VERSION); module != nil {
  17. return NewReference(module), nil
  18. } else {
  19. return nil, GetError()
  20. }
  21. }
  22. func NewModuleRaw(name string) (*Reference, error) {
  23. name_ := C.CString(name)
  24. defer C.free(unsafe.Pointer(name_))
  25. if module := C.PyModule_New(name_); module != nil {
  26. return NewReference(module), nil
  27. } else {
  28. return nil, GetError()
  29. }
  30. }
  31. func (self *Reference) GetModuleName() (string, error) {
  32. if name := C.PyModule_GetName(self.Object); name != nil {
  33. defer C.free(unsafe.Pointer(name)) // TODO: need this?
  34. return C.GoString(name), nil
  35. } else {
  36. return "", GetError()
  37. }
  38. }
  39. func (self *Reference) EnableModule() error {
  40. if name := C.PyModule_GetNameObject(self.Object); name != nil {
  41. name_ := NewReference(name)
  42. defer name_.Release()
  43. if moduleDict := C.PyImport_GetModuleDict(); moduleDict != nil {
  44. moduleDict_ := NewReference(moduleDict)
  45. defer moduleDict_.Release()
  46. return moduleDict_.SetDictItem(name_, self)
  47. } else {
  48. return GetError()
  49. }
  50. } else {
  51. return GetError()
  52. }
  53. }
  54. // PyCFunction signature, second argument unused
  55. func (self *Reference) AddModuleCFunctionNoArgs(name string, function unsafe.Pointer) error {
  56. return self.addModuleCFunction(name, function, C.METH_NOARGS)
  57. }
  58. // PyCFunction signature, second argument is the Python argument
  59. func (self *Reference) AddModuleCFunctionOneArg(name string, function unsafe.Pointer) error {
  60. return self.addModuleCFunction(name, function, C.METH_O)
  61. }
  62. // PyCFunction signature, second argument is tuple of Python arguments
  63. func (self *Reference) AddModuleCFunctionArgs(name string, function unsafe.Pointer) error {
  64. return self.addModuleCFunction(name, function, C.METH_VARARGS)
  65. }
  66. // PyCFunctionWithKeywords signature
  67. func (self *Reference) AddModuleCFunctionArgsAndKeywords(name string, function unsafe.Pointer) error {
  68. return self.addModuleCFunction(name, function, C.METH_VARARGS|C.METH_KEYWORDS)
  69. }
  70. // _PyCFunctionFast signature
  71. func (self *Reference) AddModuleCFunctionFastArgs(name string, function unsafe.Pointer) error {
  72. return self.addModuleCFunction(name, function, C.METH_FASTCALL)
  73. }
  74. // _PyCFunctionFastWithKeywords signature
  75. func (self *Reference) AddModuleCFunctionFastArgsAndKeywords(name string, function unsafe.Pointer) error {
  76. return self.addModuleCFunction(name, function, C.METH_FASTCALL|C.METH_KEYWORDS)
  77. }
  78. func (self *Reference) addModuleCFunction(name string, function unsafe.Pointer, flags C.int) error {
  79. name_ := C.CString(name)
  80. defer C.free(unsafe.Pointer(name_))
  81. methodDef := []C.PyMethodDef{
  82. {
  83. ml_name: name_,
  84. ml_meth: C.PyCFunction(function),
  85. ml_flags: flags,
  86. },
  87. {}, // NULL end of array
  88. }
  89. if C.PyModule_AddFunctions(self.Object, &methodDef[0]) == 0 {
  90. return nil
  91. } else {
  92. return GetError()
  93. }
  94. }