1 #define PY_SSIZE_T_CLEAN 5 #define DLLEXPORT __declspec(dllexport) 16 static struct _frozen *frozen_modules = NULL;
17 static int num_frozen_modules = 0;
25 extend_frozen_modules(
const struct _frozen *new_modules,
int new_count) {
27 struct _frozen *realloc_FrozenModules;
29 if (PyImport_FrozenModules == frozen_modules) {
32 orig_count = num_frozen_modules;
38 while (PyImport_FrozenModules[orig_count].name != NULL) {
50 realloc_FrozenModules = (
struct _frozen *)malloc((orig_count + new_count + 1) *
sizeof(
struct _frozen));
54 if (frozen_modules != NULL) {
56 frozen_modules = NULL;
60 memcpy(realloc_FrozenModules, new_modules, new_count *
sizeof(
struct _frozen));
63 memcpy(realloc_FrozenModules + new_count, PyImport_FrozenModules, orig_count *
sizeof(
struct _frozen));
66 memset(realloc_FrozenModules + orig_count + new_count, 0,
sizeof(
struct _frozen));
69 PyImport_FrozenModules = realloc_FrozenModules;
70 frozen_modules = realloc_FrozenModules;
71 num_frozen_modules = orig_count + new_count;
73 return num_frozen_modules;
85 py_extend_frozen_modules(PyObject *
self, PyObject *args) {
89 struct _frozen *new_modules;
92 if (!PyArg_ParseTuple(args,
"O", &list)) {
96 if (!PySequence_Check(list)) {
98 PyErr_SetString(PyExc_TypeError,
"List required");
102 num_elements = PySequence_Size(list);
103 new_modules = (
struct _frozen *)malloc(
sizeof(
struct _frozen) * num_elements);
105 for (i = 0; i < num_elements; ++i) {
111 tuple = PySequence_GetItem(list, i);
112 if (!PyArg_ParseTuple(tuple,
"ss#", &name, &code, &size)) {
118 new_modules[i].name = strdup(name);
119 new_modules[i].code = (
unsigned char *)malloc(size);
120 new_modules[i].size = size;
121 memcpy(new_modules[i].code, code, size);
128 total_count = extend_frozen_modules(new_modules, num_elements);
131 return Py_BuildValue(
"i", total_count);
139 py_is_frozen_module(PyObject *
self, PyObject *args) {
143 if (!PyArg_ParseTuple(args,
"s", &name)) {
148 while (PyImport_FrozenModules[i].name != NULL) {
149 if (strcmp(PyImport_FrozenModules[i].name, name) == 0) {
169 py_get_frozen_module_code(PyObject *
self, PyObject *args) {
173 if (!PyArg_ParseTuple(args,
"s", &name)) {
178 while (PyImport_FrozenModules[i].name != NULL) {
179 if (strcmp(PyImport_FrozenModules[i].name, name) == 0) {
180 int is_package = (PyImport_FrozenModules[i].size < 0);
181 return Py_BuildValue(
"(s#i)", PyImport_FrozenModules[i].code,
182 (Py_ssize_t) abs(PyImport_FrozenModules[i].size),
188 return Py_BuildValue(
"");
196 py_get_frozen_module_names(PyObject *
self, PyObject *args) {
200 if (!PyArg_ParseTuple(args,
"")) {
204 list = PyList_New(0);
206 while (PyImport_FrozenModules[i].name != NULL) {
207 PyObject *name = PyString_FromString(PyImport_FrozenModules[i].name);
208 PyList_Append(list, name);
217 DLLEXPORT
void initextend_frozen() {
218 static PyMethodDef extend_frozen_methods[] = {
219 {
"extend", py_extend_frozen_modules, METH_VARARGS,
220 "Adds new frozen modules at runtime." },
221 {
"is_frozen_module", py_is_frozen_module, METH_VARARGS,
222 "Returns true if the named module is a frozen module." },
223 {
"get_frozen_module_code", py_get_frozen_module_code, METH_VARARGS,
224 "Returns the code string associated with the named module." },
225 {
"get_frozen_module_names", py_get_frozen_module_names, METH_VARARGS,
226 "Returns a list of frozen module names." },
227 { NULL, NULL, 0, NULL }
230 Py_InitModule(
"extend_frozen", extend_frozen_methods);