@@ -948,7 +948,6 @@ static int AltDSS_PyContext_init(AltDSS_PyContextObject *self, PyObject *args, P
948948 PyObject * setObj = NULL ;
949949 PyObject * fakeLib = NULL ;
950950 FastDSSFuncInfo * finfo = NULL ;
951- void * * tmpFunc = NULL ;
952951
953952 if (sizeof (unsigned long long ) < sizeof (void * ))
954953 {
@@ -984,8 +983,7 @@ static int AltDSS_PyContext_init(AltDSS_PyContextObject *self, PyObject *args, P
984983 while (finfo -> c_funcOffset )
985984 {
986985 // printf("INFO: function %s\n", finfo->fname);
987- tmpFunc = * (void * * )(((char * ) self -> dssCFuncs ) + finfo -> c_funcOffset );
988- if (tmpFunc != NULL && !AltDSS_Add_PyFunc (self , finfo , setObj , fakeLib ))
986+ if (!AltDSS_Add_PyFunc (self , finfo , setObj , fakeLib ))
989987 {
990988 goto ERROR_INIT ;
991989 }
@@ -1256,74 +1254,85 @@ int AltDSS_Add_PyFunc(AltDSS_PyContextObject *self, FastDSSFuncInfo* finfo, PyOb
12561254{
12571255 PyObject * * py_func = (PyObject * * )(((char * )self ) + finfo -> attrOffset );
12581256 PyObject * key = NULL ;
1257+ void * * tmpFunc = * (void * * )(((char * ) self -> dssCFuncs ) + finfo -> c_funcOffset );
12591258
1260- if (finfo -> resType == fastdss_types_void )
1259+ if (tmpFunc != NULL )
12611260 {
1262- switch (finfo -> argType )
1261+ if (finfo -> resType == fastdss_types_void )
12631262 {
1264- case fastdss_types_i32_i32 :
1265- case fastdss_types_f64 :
1266- case fastdss_types_i32 :
1267- case fastdss_types_b16 :
1268- case fastdss_types_str :
1269- case fastdss_types_void :
1270- * py_func = (PyObject * ) PyObject_New (AltDSS_PyScalarSetterObject , & AltDSS_PyScalarSetterType );
1271- if ((* py_func ) == NULL )
1272- {
1263+ switch (finfo -> argType )
1264+ {
1265+ case fastdss_types_i32_i32 :
1266+ case fastdss_types_f64 :
1267+ case fastdss_types_i32 :
1268+ case fastdss_types_b16 :
1269+ case fastdss_types_str :
1270+ case fastdss_types_void :
1271+ * py_func = (PyObject * ) PyObject_New (AltDSS_PyScalarSetterObject , & AltDSS_PyScalarSetterType );
1272+ if ((* py_func ) == NULL )
1273+ {
1274+ goto ADD_FUNC_ERROR ;
1275+ }
1276+ AltDSS_PyScalarSetter_cinit ((AltDSS_PyScalarSetterObject * ) * py_func , self , finfo );
1277+ break ;
1278+ default :
12731279 goto ADD_FUNC_ERROR ;
1274- }
1275- AltDSS_PyScalarSetter_cinit ((AltDSS_PyScalarSetterObject * ) * py_func , self , finfo );
1276- break ;
1277- default :
1278- goto ADD_FUNC_ERROR ;
1279- }
1280- }
1281- else
1282- {
1283- switch (finfo -> resType )
1280+ }
1281+ }
1282+ else
12841283 {
1285- case fastdss_types_strs :
1286- * py_func = (PyObject * ) PyObject_New (AltDSS_PyStrListGetterObject , & AltDSS_PyStrListGetterType );
1287- if ((* py_func ) == NULL )
1288- {
1289- goto ADD_FUNC_ERROR ;
1290- }
1291- AltDSS_PyStrListGetter_cinit ((AltDSS_PyStrListGetterObject * ) * py_func , self , finfo );
1292- break ;
1293- case fastdss_types_str :
1294- * py_func = (PyObject * ) PyObject_New (AltDSS_PyStrGetterObject , & AltDSS_PyStrGetterType );
1295- if ((* py_func ) == NULL )
1296- {
1297- goto ADD_FUNC_ERROR ;
1298- }
1299- AltDSS_PyStrGetter_cinit ((AltDSS_PyStrGetterObject * ) * py_func , self , finfo );
1300- break ;
1301- case fastdss_types_f64 :
1302- case fastdss_types_i32 :
1303- case fastdss_types_b16 :
1304- * py_func = (PyObject * ) PyObject_New (AltDSS_PyScalarGetterObject , & AltDSS_PyScalarGetterType );
1305- if ((* py_func ) == NULL )
1306- {
1307- goto ADD_FUNC_ERROR ;
1308- }
1309- AltDSS_PyScalarGetter_cinit ((AltDSS_PyScalarGetterObject * ) * py_func , self , finfo );
1310- break ;
1311- case fastdss_types_gr_z128s :
1312- case fastdss_types_gr_z128 :
1313- case fastdss_types_gr_f64s :
1314- case fastdss_types_gr_i32s :
1315- case fastdss_types_gr_i8s :
1316- * py_func = (PyObject * ) PyObject_New (AltDSS_PyGRGetterObject , & AltDSS_PyGRGetterType );
1317- if ((* py_func ) == NULL )
1318- {
1284+ switch (finfo -> resType )
1285+ {
1286+ case fastdss_types_strs :
1287+ * py_func = (PyObject * ) PyObject_New (AltDSS_PyStrListGetterObject , & AltDSS_PyStrListGetterType );
1288+ if ((* py_func ) == NULL )
1289+ {
1290+ goto ADD_FUNC_ERROR ;
1291+ }
1292+ AltDSS_PyStrListGetter_cinit ((AltDSS_PyStrListGetterObject * ) * py_func , self , finfo );
1293+ break ;
1294+ case fastdss_types_str :
1295+ * py_func = (PyObject * ) PyObject_New (AltDSS_PyStrGetterObject , & AltDSS_PyStrGetterType );
1296+ if ((* py_func ) == NULL )
1297+ {
1298+ goto ADD_FUNC_ERROR ;
1299+ }
1300+ AltDSS_PyStrGetter_cinit ((AltDSS_PyStrGetterObject * ) * py_func , self , finfo );
1301+ break ;
1302+ case fastdss_types_f64 :
1303+ case fastdss_types_i32 :
1304+ case fastdss_types_b16 :
1305+ * py_func = (PyObject * ) PyObject_New (AltDSS_PyScalarGetterObject , & AltDSS_PyScalarGetterType );
1306+ if ((* py_func ) == NULL )
1307+ {
1308+ goto ADD_FUNC_ERROR ;
1309+ }
1310+ AltDSS_PyScalarGetter_cinit ((AltDSS_PyScalarGetterObject * ) * py_func , self , finfo );
1311+ break ;
1312+ case fastdss_types_gr_z128s :
1313+ case fastdss_types_gr_z128 :
1314+ case fastdss_types_gr_f64s :
1315+ case fastdss_types_gr_i32s :
1316+ case fastdss_types_gr_i8s :
1317+ * py_func = (PyObject * ) PyObject_New (AltDSS_PyGRGetterObject , & AltDSS_PyGRGetterType );
1318+ if ((* py_func ) == NULL )
1319+ {
1320+ goto ADD_FUNC_ERROR ;
1321+ }
1322+ AltDSS_PyGRGetter_cinit ((AltDSS_PyGRGetterObject * ) * py_func , self , finfo );
1323+ break ;
1324+ default :
13191325 goto ADD_FUNC_ERROR ;
1320- }
1321- AltDSS_PyGRGetter_cinit ((AltDSS_PyGRGetterObject * ) * py_func , self , finfo );
1322- break ;
1323- default :
1324- goto ADD_FUNC_ERROR ;
1326+ }
13251327 }
13261328 }
1329+ else
1330+ {
1331+ // If the function is not available in the lib,
1332+ // set the attribute to None, but mark it as done.
1333+ * py_func = Py_None ;
1334+ Py_INCREF (* py_func );
1335+ }
13271336
13281337 key = PyUnicode_FromString (finfo -> fname );
13291338 Py_INCREF (key );
0 commit comments