mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-12-07 05:35:01 -05:00
148 lines
3.2 KiB
C
148 lines
3.2 KiB
C
#include "dukpy.h"
|
|
|
|
PyObject *JSError = NULL;
|
|
|
|
/* ARGSUSED */
|
|
static PyObject *
|
|
undefined_repr(PyObject *op)
|
|
{
|
|
#if PY_MAJOR_VERSION < 3
|
|
return PyBytes_FromString("undefined");
|
|
#else
|
|
return PyUnicode_FromString("undefined");
|
|
#endif
|
|
}
|
|
|
|
/* ARGUSED */
|
|
static void
|
|
undefined_dealloc(PyObject* ignore)
|
|
{
|
|
/* This should never get called, but we also don't want to SEGV if
|
|
* we accidentally decref undef out of existence.
|
|
*/
|
|
Py_FatalError("deallocating undefined");
|
|
}
|
|
|
|
static PyTypeObject DukUndefined_Type = {
|
|
#if PY_MAJOR_VERSION < 3
|
|
PyVarObject_HEAD_INIT(NULL, 0)
|
|
#else
|
|
PyVarObject_HEAD_INIT(&PyType_Type, 0)
|
|
#endif
|
|
"UndefinedType",
|
|
0,
|
|
0,
|
|
undefined_dealloc,
|
|
0, /*tp_print*/
|
|
0, /*tp_getattr*/
|
|
0, /*tp_setattr*/
|
|
0, /*tp_compare*/
|
|
undefined_repr, /*tp_repr*/
|
|
0, /*tp_as_number*/
|
|
0, /*tp_as_sequence*/
|
|
0, /*tp_as_mapping*/
|
|
};
|
|
|
|
PyObject DukUndefined = {
|
|
_PyObject_EXTRA_INIT
|
|
1, &DukUndefined_Type
|
|
};
|
|
|
|
|
|
#if PY_MAJOR_VERSION >= 3
|
|
static struct PyModuleDef moduledef = {
|
|
PyModuleDef_HEAD_INIT,
|
|
"dukpy", /* m_name */
|
|
NULL, /* m_doc */
|
|
0, /* m_size */
|
|
NULL, /* m_methods */
|
|
NULL, /* m_reload */
|
|
NULL, /* m_traverse */
|
|
NULL, /* m_clear */
|
|
NULL /* m_free */
|
|
};
|
|
#endif
|
|
|
|
#ifndef _MSC_VER
|
|
__attribute__ ((visibility ("default")))
|
|
#endif
|
|
PyMODINIT_FUNC
|
|
#if PY_MAJOR_VERSION >= 3
|
|
PyInit_dukpy(void)
|
|
#else
|
|
initdukpy(void)
|
|
#endif
|
|
{
|
|
PyObject *mod;
|
|
|
|
#if PY_MAJOR_VERSION < 3
|
|
DukUndefined_Type.ob_type = &PyType_Type;
|
|
#endif
|
|
if (PyType_Ready(&DukUndefined_Type) < 0)
|
|
#if PY_MAJOR_VERSION >= 3
|
|
return NULL;
|
|
#else
|
|
return;
|
|
#endif
|
|
|
|
DukContext_Type.tp_new = PyType_GenericNew;
|
|
if (PyType_Ready(&DukContext_Type) < 0)
|
|
#if PY_MAJOR_VERSION >= 3
|
|
return NULL;
|
|
#else
|
|
return;
|
|
#endif
|
|
|
|
DukObject_Type.tp_new = PyType_GenericNew;
|
|
if (PyType_Ready(&DukObject_Type) < 0)
|
|
#if PY_MAJOR_VERSION >= 3
|
|
return NULL;
|
|
#else
|
|
return;
|
|
#endif
|
|
|
|
DukArray_Type.tp_new = PyType_GenericNew;
|
|
if (PyType_Ready(&DukArray_Type) < 0)
|
|
#if PY_MAJOR_VERSION >= 3
|
|
return NULL;
|
|
#else
|
|
return;
|
|
#endif
|
|
|
|
DukFunction_Type.tp_new = PyType_GenericNew;
|
|
if (PyType_Ready(&DukFunction_Type) < 0)
|
|
#if PY_MAJOR_VERSION >= 3
|
|
return NULL;
|
|
#else
|
|
return;
|
|
#endif
|
|
|
|
DukEnum_Type.tp_new = PyType_GenericNew;
|
|
if (PyType_Ready(&DukEnum_Type) < 0)
|
|
#if PY_MAJOR_VERSION >= 3
|
|
return NULL;
|
|
#else
|
|
return;
|
|
#endif
|
|
|
|
#if PY_MAJOR_VERSION >= 3
|
|
mod = PyModule_Create(&moduledef);
|
|
#else
|
|
mod = Py_InitModule3("dukpy", NULL, "Python bindings for duktape");
|
|
#endif
|
|
if (mod != NULL) {
|
|
Py_INCREF(&DukContext_Type);
|
|
PyModule_AddObject(mod, "Context", (PyObject *)&DukContext_Type);
|
|
|
|
Py_INCREF(Duk_undefined);
|
|
PyModule_AddObject(mod, "undefined", (PyObject *)Duk_undefined);
|
|
|
|
JSError = PyErr_NewException("dukpy.JSError", NULL, NULL);
|
|
if (JSError) PyModule_AddObject(mod, "JSError", JSError);
|
|
}
|
|
|
|
#if PY_MAJOR_VERSION >= 3
|
|
return mod;
|
|
#endif
|
|
}
|