Changeset d04ac05 in sasview


Ignore:
Timestamp:
Sep 22, 2017 11:47:05 PM (7 years ago)
Author:
Paul Kienzle <pkienzle@…>
Branches:
master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, magnetic_scatt, release-4.2.2, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
Children:
9e308a3
Parents:
7b50f14
Message:

add python 3 support for C modules

Location:
src/sas/sascalc
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • src/sas/sascalc/calculator/c_extensions/sld2i_module.cpp

    rb523c0e rd04ac05  
    55#include <stdio.h> 
    66#include <sld2i.hh> 
     7 
     8#if PY_MAJOR_VERSION < 3 
     9typedef void (*PyCapsule_Destructor)(PyObject *); 
     10typedef void (*PyCObject_Destructor)(void *); 
     11#define PyCapsule_New(pointer, name, destructor) (PyCObject_FromVoidPtr(pointer, (PyCObject_Destructor)destructor)) 
     12#define PyCapsule_GetPointer(capsule, name) (PyCObject_AsVoidPtr(capsule)) 
     13#endif 
     14 
    715 
    816// Utilities 
     
    2533 * Delete a GenI object 
    2634 */ 
    27 void del_sld2i(void *ptr){ 
    28         GenI* sld2i = static_cast<GenI *>(ptr); 
     35void 
     36del_sld2i(PyObject *obj){ 
     37        GenI* sld2i = static_cast<GenI *>(PyCapsule_GetPointer(obj, "GenI")); 
    2938        delete sld2i; 
    3039        return; 
     
    7180        OUTVECTOR(vol_pix_obj, vol_pix, n_x); 
    7281        GenI* sld2i = new GenI(n_pix,x_val,y_val,z_val,sldn_val,mx_val,my_val,mz_val,vol_pix,inspin,outspin,stheta); 
    73         return PyCObject_FromVoidPtr(sld2i, del_sld2i); 
     82        return PyCapsule_New(sld2i, "GenI", del_sld2i); 
    7483} 
    7584 
     
    97106 
    98107        // Set the array pointers 
    99         void *temp = PyCObject_AsVoidPtr(gen_obj); 
     108        void *temp = PyCapsule_GetPointer(gen_obj, "GenI"); 
    100109        GenI* s = static_cast<GenI *>(temp); 
    101110 
     
    125134 
    126135        // Set the array pointers 
    127         void *temp = PyCObject_AsVoidPtr(gen_obj); 
     136        void *temp = PyCapsule_GetPointer(gen_obj, "GenI"); 
    128137        GenI* s = static_cast<GenI *>(temp); 
    129138 
     
    146155}; 
    147156 
    148  
    149 #ifndef PyMODINIT_FUNC  /* declarations for DLL import/export */ 
    150 #define PyMODINIT_FUNC void 
     157#define MODULE_DOC "Sld2i C Library" 
     158#define MODULE_NAME "sld2i" 
     159#define MODULE_INIT2 initsld2i 
     160#define MODULE_INIT3 PyInit_reflmodule 
     161#define MODULE_METHODS module_methods 
     162 
     163/* ==== boilerplate python 2/3 interface bootstrap ==== */ 
     164 
     165 
     166#if defined(WIN32) && !defined(__MINGW32__) 
     167    #define DLL_EXPORT __declspec(dllexport) 
     168#else 
     169    #define DLL_EXPORT 
    151170#endif 
    152 PyMODINIT_FUNC 
    153 initsld2i(void) 
    154 { 
    155     Py_InitModule3("sld2i", module_methods, "Sld2i module"); 
    156 } 
     171 
     172#if PY_MAJOR_VERSION >= 3 
     173 
     174  DLL_EXPORT PyMODINIT_FUNC MODULE_INIT3(void) 
     175  { 
     176    static struct PyModuleDef moduledef = { 
     177      PyModuleDef_HEAD_INIT, 
     178      MODULE_NAME,         /* m_name */ 
     179      MODULE_DOC,          /* m_doc */ 
     180      -1,                  /* m_size */ 
     181      MODULE_METHODS,      /* m_methods */ 
     182      NULL,                /* m_reload */ 
     183      NULL,                /* m_traverse */ 
     184      NULL,                /* m_clear */ 
     185      NULL,                /* m_free */ 
     186    }; 
     187    return PyModule_Create(&moduledef); 
     188  } 
     189 
     190#else /* !PY_MAJOR_VERSION >= 3 */ 
     191 
     192  DLL_EXPORT PyMODINIT_FUNC MODULE_INIT2(void) 
     193  { 
     194    Py_InitModule4(MODULE_NAME, 
     195                 MODULE_METHODS, 
     196                 MODULE_DOC, 
     197                 0, 
     198                 PYTHON_API_VERSION 
     199                 ); 
     200  } 
     201 
     202#endif /* !PY_MAJOR_VERSION >= 3 */ 
  • src/sas/sascalc/file_converter/c_ext/bsl_loader.c

    r2ab9c432 rd04ac05  
    11#include <Python.h> 
    2 //#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION 
     2#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION 
    33#include <numpy/arrayobject.h> 
    44#include <stdio.h> 
     
    4444static void CLoader_dealloc(CLoader *self) { 
    4545    free(self->params.filename); 
    46     self->ob_type->tp_free((PyObject *)self); 
     46    Py_TYPE(self)->tp_free((PyObject *)self); 
    4747} 
    4848 
     
    237237 
    238238static PyTypeObject CLoaderType = { 
    239     PyObject_HEAD_INIT(NULL) 
    240     0,                         /*ob_size*/ 
     239    //PyObject_HEAD_INIT(NULL) 
     240    //0,                         /*ob_size*/ 
     241    PyVarObject_HEAD_INIT(NULL, 0) 
    241242    "CLoader",             /*tp_name*/ 
    242243    sizeof(CLoader),             /*tp_basicsize*/ 
     
    278279}; 
    279280 
    280 PyMODINIT_FUNC 
    281 initbsl_loader(void) 
    282 { 
    283     PyObject *module; 
    284     module = Py_InitModule("bsl_loader", NULL); 
    285     import_array(); 
    286  
     281static PyMethodDef module_methods[] = { 
     282    {NULL} 
     283}; 
     284 
     285/** 
     286 * Function used to add the model class to a module 
     287 * @param module: module to add the class to 
     288 */ 
     289void addCLoader(PyObject *module) { 
    287290    if (PyType_Ready(&CLoaderType) < 0) 
    288291        return; 
    289292 
    290293    Py_INCREF(&CLoaderType); 
    291     PyModule_AddObject(module, "CLoader", (PyObject *)&CLoaderType); 
    292 } 
     294    PyModule_AddObject(module, "bsl_loader", (PyObject *)&CLoaderType); 
     295} 
     296 
     297 
     298#define MODULE_DOC "C module for loading bsl." 
     299#define MODULE_NAME "bsl_loader" 
     300#define MODULE_INIT2 initbsl_loader 
     301#define MODULE_INIT3 PyInit_bsl_loader 
     302#define MODULE_METHODS module_methods 
     303 
     304/* ==== boilerplate python 2/3 interface bootstrap ==== */ 
     305 
     306 
     307#if defined(WIN32) && !defined(__MINGW32__) 
     308    #define DLL_EXPORT __declspec(dllexport) 
     309#else 
     310    #define DLL_EXPORT 
     311#endif 
     312 
     313#if PY_MAJOR_VERSION >= 3 
     314 
     315  DLL_EXPORT PyMODINIT_FUNC MODULE_INIT3(void) 
     316  { 
     317    static struct PyModuleDef moduledef = { 
     318      PyModuleDef_HEAD_INIT, 
     319      MODULE_NAME,         /* m_name */ 
     320      MODULE_DOC,          /* m_doc */ 
     321      -1,                  /* m_size */ 
     322      MODULE_METHODS,      /* m_methods */ 
     323      NULL,                /* m_reload */ 
     324      NULL,                /* m_traverse */ 
     325      NULL,                /* m_clear */ 
     326      NULL,                /* m_free */ 
     327    }; 
     328        PyObject* m = PyModule_Create(&moduledef); 
     329        addCLoader(m); 
     330        return m; 
     331  } 
     332 
     333#else /* !PY_MAJOR_VERSION >= 3 */ 
     334 
     335  DLL_EXPORT PyMODINIT_FUNC MODULE_INIT2(void) 
     336  { 
     337    PyObject* m = Py_InitModule4(MODULE_NAME, 
     338                 MODULE_METHODS, 
     339                 MODULE_DOC, 
     340                 0, 
     341                 PYTHON_API_VERSION 
     342                 ); 
     343        addCLoader(m); 
     344  } 
     345 
     346#endif /* !PY_MAJOR_VERSION >= 3 */ 
  • src/sas/sascalc/pr/c_extensions/Cinvertor.c

    rcb62bd5 rd04ac05  
    5252    invertor_dealloc(&(self->params)); 
    5353 
    54     self->ob_type->tp_free((PyObject*)self); 
     54    Py_TYPE(self)->tp_free((PyObject*)self); 
    5555 
    5656} 
     
    10541054 
    10551055static PyTypeObject CinvertorType = { 
    1056     PyObject_HEAD_INIT(NULL) 
    1057     0,                         /*ob_size*/ 
     1056    //PyObject_HEAD_INIT(NULL) 
     1057    //0,                         /*ob_size*/ 
     1058    PyVarObject_HEAD_INIT(NULL, 0) 
    10581059    "Cinvertor",             /*tp_name*/ 
    10591060    sizeof(Cinvertor),             /*tp_basicsize*/ 
     
    11191120 
    11201121 
    1121 #ifndef PyMODINIT_FUNC  /* declarations for DLL import/export */ 
    1122 #define PyMODINIT_FUNC void 
     1122#define MODULE_DOC "C extension module for inversion to P(r)." 
     1123#define MODULE_NAME "pr_inversion" 
     1124#define MODULE_INIT2 initpr_inversion 
     1125#define MODULE_INIT3 PyInit_pr_inversion 
     1126#define MODULE_METHODS module_methods 
     1127 
     1128/* ==== boilerplate python 2/3 interface bootstrap ==== */ 
     1129 
     1130 
     1131#if defined(WIN32) && !defined(__MINGW32__) 
     1132    #define DLL_EXPORT __declspec(dllexport) 
     1133#else 
     1134    #define DLL_EXPORT 
    11231135#endif 
    1124 PyMODINIT_FUNC 
    1125 initpr_inversion(void) 
    1126 { 
    1127     PyObject* m; 
    1128  
    1129     m = Py_InitModule3("pr_inversion", module_methods, 
    1130                        "C extension module for inversion to P(r)."); 
    1131  
    1132     addCinvertor(m); 
    1133 } 
     1136 
     1137#if PY_MAJOR_VERSION >= 3 
     1138 
     1139  DLL_EXPORT PyMODINIT_FUNC MODULE_INIT3(void) 
     1140  { 
     1141    static struct PyModuleDef moduledef = { 
     1142      PyModuleDef_HEAD_INIT, 
     1143      MODULE_NAME,         /* m_name */ 
     1144      MODULE_DOC,          /* m_doc */ 
     1145      -1,                  /* m_size */ 
     1146      MODULE_METHODS,      /* m_methods */ 
     1147      NULL,                /* m_reload */ 
     1148      NULL,                /* m_traverse */ 
     1149      NULL,                /* m_clear */ 
     1150      NULL,                /* m_free */ 
     1151    }; 
     1152        PyObject* m = PyModule_Create(&moduledef); 
     1153        addCinvertor(m); 
     1154        return m; 
     1155  } 
     1156 
     1157#else /* !PY_MAJOR_VERSION >= 3 */ 
     1158 
     1159  DLL_EXPORT PyMODINIT_FUNC MODULE_INIT2(void) 
     1160  { 
     1161    PyObject* m = Py_InitModule4(MODULE_NAME, 
     1162                 MODULE_METHODS, 
     1163                 MODULE_DOC, 
     1164                 0, 
     1165                 PYTHON_API_VERSION 
     1166                 ); 
     1167        addCinvertor(m); 
     1168  } 
     1169 
     1170#endif /* !PY_MAJOR_VERSION >= 3 */ 
  • src/sas/sascalc/pr/invertor.py

    r574adc7 rd04ac05  
    472472        try: 
    473473            self._get_matrix(nfunc, nq, a, b) 
    474         except: 
    475             raise RuntimeError("Invertor: could not invert I(Q)\n  %s" % sys.exc_value) 
     474        except Exception as exc: 
     475            raise RuntimeError("Invertor: could not invert I(Q)\n  %s" % str(exc)) 
    476476 
    477477        # Perform the inversion (least square fit) 
Note: See TracChangeset for help on using the changeset viewer.