Library of Assembled Shared Sources
_lass_module.cpp
Go to the documentation of this file.
1/** @file
2 * @author Bram de Greve (bram@cocamware.com)
3 * @author Tom De Muer (tom@cocamware.com)
4 *
5 * *** BEGIN LICENSE INFORMATION ***
6 *
7 * The contents of this file are subject to the Common Public Attribution License
8 * Version 1.0 (the "License"); you may not use this file except in compliance with
9 * the License. You may obtain a copy of the License at
10 * http://lass.sourceforge.net/cpal-license. The License is based on the
11 * Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover
12 * use of software over a computer network and provide for limited attribution for
13 * the Original Developer. In addition, Exhibit A has been modified to be consistent
14 * with Exhibit B.
15 *
16 * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
17 * WARRANTY OF ANY KIND, either express or implied. See the License for the specific
18 * language governing rights and limitations under the License.
19 *
20 * The Original Code is LASS - Library of Assembled Shared Sources.
21 *
22 * The Initial Developer of the Original Code is Bram de Greve and Tom De Muer.
23 * The Original Developer is the Initial Developer.
24 *
25 * All portions of the code written by the Initial Developer are:
26 * Copyright (C) 2023-2025 the Initial Developer.
27 * All Rights Reserved.
28 *
29 * Contributor(s):
30 *
31 * Alternatively, the contents of this file may be used under the terms of the
32 * GNU General Public License Version 2 or later (the GPL), in which case the
33 * provisions of GPL are applicable instead of those above. If you wish to allow use
34 * of your version of this file only under the terms of the GPL and not to allow
35 * others to use your version of this file under the CPAL, indicate your decision by
36 * deleting the provisions above and replace them with the notice and other
37 * provisions required by the GPL License. If you do not delete the provisions above,
38 * a recipient may use your version of this file under either the CPAL or the GPL.
39 *
40 * *** END LICENSE INFORMATION ***
41 */
42
43#include "python_common.h"
44#include "pyobject_plus.h"
45#include "pymap.h"
46#include "pysequence.h"
47#include "pycallback.h"
48#include "pyiteratorrange.h"
50#include "callback_python.h"
51#include "pyobject_macros.h"
52
53PY_DECLARE_MODULE_NAME( lassMod, "_lass")
54PY_MODULE_CLASS( lassMod, lass::python::PyObjectPlus )
55PY_MODULE_CLASS( lassMod, lass::python::impl::Map )
56PY_MODULE_CLASS( lassMod, lass::python::impl::Sequence )
57PY_MODULE_CLASS( lassMod, lass::python::MultiCallback )
58PY_MODULE_CLASS( lassMod, lass::python::PyIteratorRange )
59PY_MODULE_CLASS( lassMod, lass::python::impl::Function )
60PY_MODULE_CLASS( lassMod, lass::python::impl::PyCallback )
61
62namespace lass::python::impl
63{
64
65int initLassModule()
66{
67 if (lassMod.module())
68 {
69 return 0;
70 }
71 LockGIL LASS_UNUSED(lock);
72 TPyObjPtr mod(lassMod.inject());
73 if (!mod)
74 {
75 return -1;
76 }
77 PyObject* sysModules = PySys_GetObject("modules");
78 if (!sysModules || PyDict_SetItemString(sysModules, "_lass", mod.get()) != 0)
79 {
80 return -1;
81 }
82
83 // register lass containers with abstract base classes
84 // so that they will be recognized when using isinstance(x, collections.abc.Sequence)
85 //
86 // MultiCallback and PyIteratorRange are automatically recognized
87 //
88 TPyObjPtr abcMod(PyImport_ImportModule("collections.abc"));
89 if (!abcMod)
90 {
91 return -1;
92 }
93
94 {
95 TPyObjPtr astractType(PyObject_GetAttrString(abcMod.get(), "MutableSequence"));
96 if (!astractType)
97 {
98 return -1;
99 }
100 PyTypeObject* lassType = lass::python::impl::Sequence::_lassPyClassDef.type();
101 if (!lassType)
102 {
103 return -1;
104 }
105 TPyObjPtr r(PyObject_CallMethod(astractType.get(), "register", "O", lassType));
106 if (!r)
107 {
108 return -1;
109 }
110 }
111
112 {
113 TPyObjPtr astractType(PyObject_GetAttrString(abcMod.get(), "MutableMapping"));
114 if (!astractType)
115 {
116 return -1;
117 }
118 PyTypeObject* lassType = lass::python::impl::Map::_lassPyClassDef.type();
119 if (!lassType)
120 {
121 return -1;
122 }
123 TPyObjPtr r(PyObject_CallMethod(astractType.get(), "register", "O", lassType));
124 if (!r)
125 {
126 return -1;
127 }
128 }
129
130 return 0;
131}
132
133}
acquire the GIL for the current scope.
Definition gil.h:56
#define PY_DECLARE_MODULE_NAME(i_module, s_name)
Declare a module with name only (no documentation).
#define PY_MODULE_CLASS(i_module, t_cppClass)
Add a Python class to a module.
PyObjectPtr< PyObject >::Type TPyObjPtr
PyObjectPtr to a PyObject.
Comprehensive C++ to Python binding library.
Library for Assembled Shared Sources.
Definition config.h:53