Home | History | Annotate | Download | only in Utility
      1 /////////////// PyIdentifierFromString.proto ///////////////
      2 
      3 #if !defined(__Pyx_PyIdentifier_FromString)
      4 #if PY_MAJOR_VERSION < 3
      5   #define __Pyx_PyIdentifier_FromString(s) PyString_FromString(s)
      6 #else
      7   #define __Pyx_PyIdentifier_FromString(s) PyUnicode_FromString(s)
      8 #endif
      9 #endif
     10 
     11 
     12 /////////////// Import.proto ///////////////
     13 
     14 static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); /*proto*/
     15 
     16 /////////////// Import ///////////////
     17 //@requires: ObjectHandling.c::PyObjectGetAttrStr
     18 //@substitute: naming
     19 
     20 static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) {
     21     PyObject *empty_list = 0;
     22     PyObject *module = 0;
     23     PyObject *global_dict = 0;
     24     PyObject *empty_dict = 0;
     25     PyObject *list;
     26     #if PY_VERSION_HEX < 0x03030000
     27     PyObject *py_import;
     28     py_import = __Pyx_PyObject_GetAttrStr($builtins_cname, PYIDENT("__import__"));
     29     if (!py_import)
     30         goto bad;
     31     #endif
     32     if (from_list)
     33         list = from_list;
     34     else {
     35         empty_list = PyList_New(0);
     36         if (!empty_list)
     37             goto bad;
     38         list = empty_list;
     39     }
     40     global_dict = PyModule_GetDict($module_cname);
     41     if (!global_dict)
     42         goto bad;
     43     empty_dict = PyDict_New();
     44     if (!empty_dict)
     45         goto bad;
     46     #if PY_VERSION_HEX >= 0x02050000
     47     {
     48         #if PY_MAJOR_VERSION >= 3
     49         if (level == -1) {
     50             if (strchr(__Pyx_MODULE_NAME, '.')) {
     51                 /* try package relative import first */
     52                 #if PY_VERSION_HEX < 0x03030000
     53                 PyObject *py_level = PyInt_FromLong(1);
     54                 if (!py_level)
     55                     goto bad;
     56                 module = PyObject_CallFunctionObjArgs(py_import,
     57                     name, global_dict, empty_dict, list, py_level, NULL);
     58                 Py_DECREF(py_level);
     59                 #else
     60                 module = PyImport_ImportModuleLevelObject(
     61                     name, global_dict, empty_dict, list, 1);
     62                 #endif
     63                 if (!module) {
     64                     if (!PyErr_ExceptionMatches(PyExc_ImportError))
     65                         goto bad;
     66                     PyErr_Clear();
     67                 }
     68             }
     69             level = 0; /* try absolute import on failure */
     70         }
     71         #endif
     72         if (!module) {
     73             #if PY_VERSION_HEX < 0x03030000
     74             PyObject *py_level = PyInt_FromLong(level);
     75             if (!py_level)
     76                 goto bad;
     77             module = PyObject_CallFunctionObjArgs(py_import,
     78                 name, global_dict, empty_dict, list, py_level, NULL);
     79             Py_DECREF(py_level);
     80             #else
     81             module = PyImport_ImportModuleLevelObject(
     82                 name, global_dict, empty_dict, list, level);
     83             #endif
     84         }
     85     }
     86     #else
     87     if (level>0) {
     88         PyErr_SetString(PyExc_RuntimeError, "Relative import is not supported for Python <=2.4.");
     89         goto bad;
     90     }
     91     module = PyObject_CallFunctionObjArgs(py_import,
     92         name, global_dict, empty_dict, list, NULL);
     93     #endif
     94 bad:
     95     #if PY_VERSION_HEX < 0x03030000
     96     Py_XDECREF(py_import);
     97     #endif
     98     Py_XDECREF(empty_list);
     99     Py_XDECREF(empty_dict);
    100     return module;
    101 }
    102 
    103 
    104 /////////////// ImportFrom.proto ///////////////
    105 
    106 static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); /*proto*/
    107 
    108 /////////////// ImportFrom ///////////////
    109 //@requires: ObjectHandling.c::PyObjectGetAttrStr
    110 
    111 static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) {
    112     PyObject* value = __Pyx_PyObject_GetAttrStr(module, name);
    113     if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) {
    114         PyErr_Format(PyExc_ImportError,
    115         #if PY_MAJOR_VERSION < 3
    116             "cannot import name %.230s", PyString_AS_STRING(name));
    117         #else
    118             "cannot import name %S", name);
    119         #endif
    120     }
    121     return value;
    122 }
    123 
    124 
    125 /////////////// ModuleImport.proto ///////////////
    126 
    127 static PyObject *__Pyx_ImportModule(const char *name); /*proto*/
    128 
    129 /////////////// ModuleImport ///////////////
    130 //@requires: PyIdentifierFromString
    131 
    132 #ifndef __PYX_HAVE_RT_ImportModule
    133 #define __PYX_HAVE_RT_ImportModule
    134 static PyObject *__Pyx_ImportModule(const char *name) {
    135     PyObject *py_name = 0;
    136     PyObject *py_module = 0;
    137 
    138     py_name = __Pyx_PyIdentifier_FromString(name);
    139     if (!py_name)
    140         goto bad;
    141     py_module = PyImport_Import(py_name);
    142     Py_DECREF(py_name);
    143     return py_module;
    144 bad:
    145     Py_XDECREF(py_name);
    146     return 0;
    147 }
    148 #endif
    149 
    150 
    151 /////////////// SetPackagePathFromImportLib.proto ///////////////
    152 
    153 #if PY_VERSION_HEX >= 0x03030000
    154 static int __Pyx_SetPackagePathFromImportLib(const char* parent_package_name, PyObject *module_name);
    155 #else
    156 #define __Pyx_SetPackagePathFromImportLib(a, b) 0
    157 #endif
    158 
    159 /////////////// SetPackagePathFromImportLib ///////////////
    160 //@requires: ObjectHandling.c::PyObjectGetAttrStr
    161 //@substitute: naming
    162 
    163 #if PY_VERSION_HEX >= 0x03030000
    164 static int __Pyx_SetPackagePathFromImportLib(const char* parent_package_name, PyObject *module_name) {
    165     PyObject *importlib, *loader, *osmod, *ossep, *parts, *package_path;
    166     PyObject *path = NULL, *file_path = NULL;
    167     int result;
    168     if (parent_package_name) {
    169         PyObject *package = PyImport_ImportModule(parent_package_name);
    170         if (unlikely(!package))
    171             goto bad;
    172         path = PyObject_GetAttrString(package, "__path__");
    173         Py_DECREF(package);
    174         if (unlikely(!path) || unlikely(path == Py_None))
    175             goto bad;
    176     } else {
    177         path = Py_None; Py_INCREF(Py_None);
    178     }
    179     // package_path = [importlib.find_loader(module_name, path).path.rsplit(os.sep, 1)[0]]
    180     importlib = PyImport_ImportModule("importlib");
    181     if (unlikely(!importlib))
    182         goto bad;
    183     loader = PyObject_CallMethod(importlib, "find_loader", "(OO)", module_name, path);
    184     Py_DECREF(importlib);
    185     Py_DECREF(path); path = NULL;
    186     if (unlikely(!loader))
    187         goto bad;
    188     file_path = PyObject_GetAttrString(loader, "path");
    189     Py_DECREF(loader);
    190     if (unlikely(!file_path))
    191         goto bad;
    192 
    193     if (unlikely(__Pyx_SetAttrString($module_cname, "__file__", file_path) < 0))
    194         goto bad;
    195 
    196     osmod = PyImport_ImportModule("os");
    197     if (unlikely(!osmod))
    198         goto bad;
    199     ossep = PyObject_GetAttrString(osmod, "sep");
    200     Py_DECREF(osmod);
    201     if (unlikely(!ossep))
    202         goto bad;
    203     parts = PyObject_CallMethod(file_path, "rsplit", "(Oi)", ossep, 1);
    204     Py_DECREF(file_path); file_path = NULL;
    205     Py_DECREF(ossep);
    206     if (unlikely(!parts))
    207         goto bad;
    208     package_path = Py_BuildValue("[O]", PyList_GET_ITEM(parts, 0));
    209     Py_DECREF(parts);
    210     if (unlikely(!package_path))
    211         goto bad;
    212     goto set_path;
    213 
    214 bad:
    215     PyErr_WriteUnraisable(module_name);
    216     Py_XDECREF(path);
    217     Py_XDECREF(file_path);
    218 
    219     // set an empty path list on failure
    220     PyErr_Clear();
    221     package_path = PyList_New(0);
    222     if (unlikely(!package_path))
    223         return -1;
    224 
    225 set_path:
    226     result = __Pyx_SetAttrString($module_cname, "__path__", package_path);
    227     Py_DECREF(package_path);
    228     return result;
    229 }
    230 #endif
    231 
    232 
    233 /////////////// TypeImport.proto ///////////////
    234 
    235 static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, size_t size, int strict);  /*proto*/
    236 
    237 /////////////// TypeImport ///////////////
    238 //@requires: PyIdentifierFromString
    239 //@requires: ModuleImport
    240 
    241 #ifndef __PYX_HAVE_RT_ImportType
    242 #define __PYX_HAVE_RT_ImportType
    243 static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name,
    244     size_t size, int strict)
    245 {
    246     PyObject *py_module = 0;
    247     PyObject *result = 0;
    248     PyObject *py_name = 0;
    249     char warning[200];
    250     Py_ssize_t basicsize;
    251 #ifdef Py_LIMITED_API
    252     PyObject *py_basicsize;
    253 #endif
    254 
    255     py_module = __Pyx_ImportModule(module_name);
    256     if (!py_module)
    257         goto bad;
    258     py_name = __Pyx_PyIdentifier_FromString(class_name);
    259     if (!py_name)
    260         goto bad;
    261     result = PyObject_GetAttr(py_module, py_name);
    262     Py_DECREF(py_name);
    263     py_name = 0;
    264     Py_DECREF(py_module);
    265     py_module = 0;
    266     if (!result)
    267         goto bad;
    268     if (!PyType_Check(result)) {
    269         PyErr_Format(PyExc_TypeError,
    270             "%.200s.%.200s is not a type object",
    271             module_name, class_name);
    272         goto bad;
    273     }
    274 #ifndef Py_LIMITED_API
    275     basicsize = ((PyTypeObject *)result)->tp_basicsize;
    276 #else
    277     py_basicsize = PyObject_GetAttrString(result, "__basicsize__");
    278     if (!py_basicsize)
    279         goto bad;
    280     basicsize = PyLong_AsSsize_t(py_basicsize);
    281     Py_DECREF(py_basicsize);
    282     py_basicsize = 0;
    283     if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred())
    284         goto bad;
    285 #endif
    286     if (!strict && (size_t)basicsize > size) {
    287         PyOS_snprintf(warning, sizeof(warning),
    288             "%s.%s size changed, may indicate binary incompatibility",
    289             module_name, class_name);
    290         #if PY_VERSION_HEX < 0x02050000
    291         if (PyErr_Warn(NULL, warning) < 0) goto bad;
    292         #else
    293         if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad;
    294         #endif
    295     }
    296     else if ((size_t)basicsize != size) {
    297         PyErr_Format(PyExc_ValueError,
    298             "%.200s.%.200s has the wrong size, try recompiling",
    299             module_name, class_name);
    300         goto bad;
    301     }
    302     return (PyTypeObject *)result;
    303 bad:
    304     Py_XDECREF(py_module);
    305     Py_XDECREF(result);
    306     return NULL;
    307 }
    308 #endif
    309 
    310 /////////////// FunctionImport.proto ///////////////
    311 
    312 static int __Pyx_ImportFunction(PyObject *module, const char *funcname, void (**f)(void), const char *sig); /*proto*/
    313 
    314 /////////////// FunctionImport ///////////////
    315 //@substitute: naming
    316 
    317 #ifndef __PYX_HAVE_RT_ImportFunction
    318 #define __PYX_HAVE_RT_ImportFunction
    319 static int __Pyx_ImportFunction(PyObject *module, const char *funcname, void (**f)(void), const char *sig) {
    320     PyObject *d = 0;
    321     PyObject *cobj = 0;
    322     union {
    323         void (*fp)(void);
    324         void *p;
    325     } tmp;
    326 
    327     d = PyObject_GetAttrString(module, (char *)"$api_name");
    328     if (!d)
    329         goto bad;
    330     cobj = PyDict_GetItemString(d, funcname);
    331     if (!cobj) {
    332         PyErr_Format(PyExc_ImportError,
    333             "%.200s does not export expected C function %.200s",
    334                 PyModule_GetName(module), funcname);
    335         goto bad;
    336     }
    337 #if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3 && PY_MINOR_VERSION==0)
    338     if (!PyCapsule_IsValid(cobj, sig)) {
    339         PyErr_Format(PyExc_TypeError,
    340             "C function %.200s.%.200s has wrong signature (expected %.500s, got %.500s)",
    341              PyModule_GetName(module), funcname, sig, PyCapsule_GetName(cobj));
    342         goto bad;
    343     }
    344     tmp.p = PyCapsule_GetPointer(cobj, sig);
    345 #else
    346     {const char *desc, *s1, *s2;
    347     desc = (const char *)PyCObject_GetDesc(cobj);
    348     if (!desc)
    349         goto bad;
    350     s1 = desc; s2 = sig;
    351     while (*s1 != '\0' && *s1 == *s2) { s1++; s2++; }
    352     if (*s1 != *s2) {
    353         PyErr_Format(PyExc_TypeError,
    354             "C function %.200s.%.200s has wrong signature (expected %.500s, got %.500s)",
    355              PyModule_GetName(module), funcname, sig, desc);
    356         goto bad;
    357     }
    358     tmp.p = PyCObject_AsVoidPtr(cobj);}
    359 #endif
    360     *f = tmp.fp;
    361     if (!(*f))
    362         goto bad;
    363     Py_DECREF(d);
    364     return 0;
    365 bad:
    366     Py_XDECREF(d);
    367     return -1;
    368 }
    369 #endif
    370 
    371 /////////////// FunctionExport.proto ///////////////
    372 
    373 static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig); /*proto*/
    374 
    375 /////////////// FunctionExport ///////////////
    376 //@substitute: naming
    377 
    378 static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig) {
    379     PyObject *d = 0;
    380     PyObject *cobj = 0;
    381     union {
    382         void (*fp)(void);
    383         void *p;
    384     } tmp;
    385 
    386     d = PyObject_GetAttrString($module_cname, (char *)"$api_name");
    387     if (!d) {
    388         PyErr_Clear();
    389         d = PyDict_New();
    390         if (!d)
    391             goto bad;
    392         Py_INCREF(d);
    393         if (PyModule_AddObject($module_cname, (char *)"$api_name", d) < 0)
    394             goto bad;
    395     }
    396     tmp.fp = f;
    397 #if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3&&PY_MINOR_VERSION==0)
    398     cobj = PyCapsule_New(tmp.p, sig, 0);
    399 #else
    400     cobj = PyCObject_FromVoidPtrAndDesc(tmp.p, (void *)sig, 0);
    401 #endif
    402     if (!cobj)
    403         goto bad;
    404     if (PyDict_SetItemString(d, name, cobj) < 0)
    405         goto bad;
    406     Py_DECREF(cobj);
    407     Py_DECREF(d);
    408     return 0;
    409 bad:
    410     Py_XDECREF(cobj);
    411     Py_XDECREF(d);
    412     return -1;
    413 }
    414 
    415 /////////////// VoidPtrImport.proto ///////////////
    416 
    417 static int __Pyx_ImportVoidPtr(PyObject *module, const char *name, void **p, const char *sig); /*proto*/
    418 
    419 /////////////// VoidPtrImport ///////////////
    420 //@substitute: naming
    421 
    422 #ifndef __PYX_HAVE_RT_ImportVoidPtr
    423 #define __PYX_HAVE_RT_ImportVoidPtr
    424 static int __Pyx_ImportVoidPtr(PyObject *module, const char *name, void **p, const char *sig) {
    425     PyObject *d = 0;
    426     PyObject *cobj = 0;
    427 
    428     d = PyObject_GetAttrString(module, (char *)"$api_name");
    429     if (!d)
    430         goto bad;
    431     cobj = PyDict_GetItemString(d, name);
    432     if (!cobj) {
    433         PyErr_Format(PyExc_ImportError,
    434             "%.200s does not export expected C variable %.200s",
    435                 PyModule_GetName(module), name);
    436         goto bad;
    437     }
    438 #if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3 && PY_MINOR_VERSION==0)
    439     if (!PyCapsule_IsValid(cobj, sig)) {
    440         PyErr_Format(PyExc_TypeError,
    441             "C variable %.200s.%.200s has wrong signature (expected %.500s, got %.500s)",
    442              PyModule_GetName(module), name, sig, PyCapsule_GetName(cobj));
    443         goto bad;
    444     }
    445     *p = PyCapsule_GetPointer(cobj, sig);
    446 #else
    447     {const char *desc, *s1, *s2;
    448     desc = (const char *)PyCObject_GetDesc(cobj);
    449     if (!desc)
    450         goto bad;
    451     s1 = desc; s2 = sig;
    452     while (*s1 != '\0' && *s1 == *s2) { s1++; s2++; }
    453     if (*s1 != *s2) {
    454         PyErr_Format(PyExc_TypeError,
    455             "C variable %.200s.%.200s has wrong signature (expected %.500s, got %.500s)",
    456              PyModule_GetName(module), name, sig, desc);
    457         goto bad;
    458     }
    459     *p = PyCObject_AsVoidPtr(cobj);}
    460 #endif
    461     if (!(*p))
    462         goto bad;
    463     Py_DECREF(d);
    464     return 0;
    465 bad:
    466     Py_XDECREF(d);
    467     return -1;
    468 }
    469 #endif
    470 
    471 /////////////// VoidPtrExport.proto ///////////////
    472 
    473 static int __Pyx_ExportVoidPtr(PyObject *name, void *p, const char *sig); /*proto*/
    474 
    475 /////////////// VoidPtrExport ///////////////
    476 //@substitute: naming
    477 //@requires: ObjectHandling.c::PyObjectSetAttrStr
    478 
    479 static int __Pyx_ExportVoidPtr(PyObject *name, void *p, const char *sig) {
    480     PyObject *d;
    481     PyObject *cobj = 0;
    482 
    483     d = PyDict_GetItem($moddict_cname, PYIDENT("$api_name"));
    484     Py_XINCREF(d);
    485     if (!d) {
    486         d = PyDict_New();
    487         if (!d)
    488             goto bad;
    489         if (__Pyx_PyObject_SetAttrStr($module_cname, PYIDENT("$api_name"), d) < 0)
    490             goto bad;
    491     }
    492 #if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3 && PY_MINOR_VERSION==0)
    493     cobj = PyCapsule_New(p, sig, 0);
    494 #else
    495     cobj = PyCObject_FromVoidPtrAndDesc(p, (void *)sig, 0);
    496 #endif
    497     if (!cobj)
    498         goto bad;
    499     if (PyDict_SetItem(d, name, cobj) < 0)
    500         goto bad;
    501     Py_DECREF(cobj);
    502     Py_DECREF(d);
    503     return 0;
    504 bad:
    505     Py_XDECREF(cobj);
    506     Py_XDECREF(d);
    507     return -1;
    508 }
    509 
    510 
    511 /////////////// SetVTable.proto ///////////////
    512 
    513 static int __Pyx_SetVtable(PyObject *dict, void *vtable); /*proto*/
    514 
    515 /////////////// SetVTable ///////////////
    516 
    517 static int __Pyx_SetVtable(PyObject *dict, void *vtable) {
    518 #if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3&&PY_MINOR_VERSION==0)
    519     PyObject *ob = PyCapsule_New(vtable, 0, 0);
    520 #else
    521     PyObject *ob = PyCObject_FromVoidPtr(vtable, 0);
    522 #endif
    523     if (!ob)
    524         goto bad;
    525     if (PyDict_SetItem(dict, PYIDENT("__pyx_vtable__"), ob) < 0)
    526         goto bad;
    527     Py_DECREF(ob);
    528     return 0;
    529 bad:
    530     Py_XDECREF(ob);
    531     return -1;
    532 }
    533 
    534 
    535 /////////////// GetVTable.proto ///////////////
    536 
    537 static void* __Pyx_GetVtable(PyObject *dict); /*proto*/
    538 
    539 /////////////// GetVTable ///////////////
    540 
    541 static void* __Pyx_GetVtable(PyObject *dict) {
    542     void* ptr;
    543     PyObject *ob = PyObject_GetItem(dict, PYIDENT("__pyx_vtable__"));
    544     if (!ob)
    545         goto bad;
    546 #if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3&&PY_MINOR_VERSION==0)
    547     ptr = PyCapsule_GetPointer(ob, 0);
    548 #else
    549     ptr = PyCObject_AsVoidPtr(ob);
    550 #endif
    551     if (!ptr && !PyErr_Occurred())
    552         PyErr_SetString(PyExc_RuntimeError, "invalid vtable found for imported type");
    553     Py_DECREF(ob);
    554     return ptr;
    555 bad:
    556     Py_XDECREF(ob);
    557     return NULL;
    558 }
    559