Skip to content

Commit 03ffed6

Browse files
committed
FastDSS: move common code to DSS C-API
1 parent 4d9531b commit 03ffed6

6 files changed

Lines changed: 61 additions & 1671 deletions

File tree

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,3 +126,5 @@ dss_python_backend/**/*.hpp
126126
*.dbl
127127
*.sng
128128
*.pdb
129+
130+
dss_python_backend/include

dss_python_backend/_func_info.py

Lines changed: 11 additions & 11 deletions
Large diffs are not rendered by default.

src/_fastdss.c

Lines changed: 38 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -27,56 +27,7 @@
2727
// #define PyList_SET_ITEM PyList_SetItem
2828
// #endif
2929

30-
//TODO: reuse code from the new capi.h header
31-
32-
typedef int32_t (*func_i32_ctx_i32)(const void* ctx, int32_t value);
33-
typedef int32_t (*func_i32_ctx_str)(const void* ctx, const char* value);
34-
typedef int32_t (*func_i32_ctx)(const void* ctx);
35-
36-
typedef double (*func_f64_ctx_i32)(const void* ctx, int32_t value);
37-
typedef double (*func_f64_ctx_str)(const void* ctx, const char* value);
38-
typedef double (*func_f64_ctx)(const void* ctx);
39-
40-
typedef uint16_t (*func_b16_ctx_i32)(const void* ctx, int32_t value);
41-
typedef uint16_t (*func_b16_ctx_i32_i32)(const void* ctx, int32_t value, int32_t value2);
42-
typedef uint16_t (*func_b16_ctx_str)(const void* ctx, const char* value);
43-
typedef uint16_t (*func_b16_ctx)(const void* ctx);
44-
45-
typedef const char* (*func_str_ctx)(const void* ctx);
46-
typedef const char* (*func_str_ctx_i32)(const void* ctx, int32_t value);
47-
typedef void (*func_void_ctx_strs)(const void* ctx, char*** ResultPtr, int32_t* ResultDims);
48-
typedef void (*func_void_ctx_strs_b16)(const void* ctx, char*** ResultPtr, int32_t* ResultDims, uint16_t value);
49-
typedef void (*func_void_ctx_strs_i32)(const void* ctx, char*** ResultPtr, int32_t* ResultDims, int32_t value);
50-
typedef void (*func_void_ctx_strs_str)(const void* ctx, char*** ResultPtr, int32_t* ResultDims, const char* value);
51-
typedef void (*gr_func_void_ctx)(const void* ctx);
52-
typedef void (*gr_func_void_ctx_b16)(const void* ctx, uint16_t value);
53-
typedef void (*gr_func_void_ctx_i32)(const void* ctx, int32_t value);
54-
typedef void (*gr_func_void_ctx_f64_f64_i32)(const void* ctx, double f1, double f2, int32_t value);
55-
56-
typedef void (*func_void_ctx_i32)(const void* ctx, int32_t value);
57-
typedef void (*func_void_ctx_i32_i32)(const void* ctx, int32_t value, int32_t value2);
58-
typedef void (*func_void_ctx_f64)(const void* ctx, double value);
59-
typedef void (*func_void_ctx_b16)(const void* ctx, uint16_t value);
60-
typedef void (*func_void_ctx_str)(const void* ctx, const char* value);
61-
typedef void (*func_void_ctx)(const void* ctx);
62-
63-
enum {
64-
fastdss_types_void = 0,
65-
fastdss_types_b16,
66-
fastdss_types_f32,
67-
fastdss_types_f64,
68-
fastdss_types_f64_f64_i32,
69-
fastdss_types_gr_f64s,
70-
fastdss_types_gr_i32s,
71-
fastdss_types_gr_i8s,
72-
fastdss_types_gr_z128,
73-
fastdss_types_gr_z128s,
74-
fastdss_types_i32,
75-
fastdss_types_i32_i32,
76-
fastdss_types_str,
77-
fastdss_types_strs,
78-
fastdss_types_z64,
79-
};
30+
#include "altdss/capi/fastdss_func_info.h"
8031

8132
enum FastDSSSettings {
8233
FastDSSSettings_UseExceptions = 1 << 0,
@@ -192,14 +143,6 @@ typedef struct AltDSS_PyContextObject_
192143
#include "./_fastdss_struct_members.inc.c"
193144
} AltDSS_PyContextObject;
194145

195-
typedef struct {
196-
int resType;
197-
int argType;
198-
size_t c_funcOffset;
199-
size_t attrOffset;
200-
char const* fname;
201-
} FastDSSFuncInfo;
202-
203146
static int AltDSS_PyScalarSetter_init(AltDSS_PyScalarSetterObject *f, PyObject *Py_UNUSED(args_ignored), PyObject *Py_UNUSED(kwargs_ignored))
204147
{
205148
f->parent = NULL;
@@ -258,7 +201,7 @@ static PyObject *AltDSS_PyScalarSetter_call(AltDSS_PyScalarSetterObject *f, PyOb
258201
return NULL;
259202
}
260203
threadstate = PyEval_SaveThread();
261-
((func_void_ctx_i32)f->func)(f->dssCtx, cval_int);
204+
((altdss_func_v_cvp_i32)f->func)(f->dssCtx, cval_int);
262205
PyEval_RestoreThread(threadstate);
263206
break;
264207
case fastdss_types_i32_i32:
@@ -268,7 +211,7 @@ static PyObject *AltDSS_PyScalarSetter_call(AltDSS_PyScalarSetterObject *f, PyOb
268211
return NULL;
269212
}
270213
threadstate = PyEval_SaveThread();
271-
((func_void_ctx_i32_i32)f->func)(f->dssCtx, cval_int, cval_int2);
214+
((altdss_func_v_cvp_i32_i32)f->func)(f->dssCtx, cval_int, cval_int2);
272215
PyEval_RestoreThread(threadstate);
273216
break;
274217
case fastdss_types_f64:
@@ -278,17 +221,17 @@ static PyObject *AltDSS_PyScalarSetter_call(AltDSS_PyScalarSetterObject *f, PyOb
278221
return NULL;
279222
}
280223
threadstate = PyEval_SaveThread();
281-
((func_void_ctx_f64)f->func)(f->dssCtx, cval_float64);
224+
((altdss_func_v_cvp_f64)f->func)(f->dssCtx, cval_float64);
282225
PyEval_RestoreThread(threadstate);
283226
break;
284-
case fastdss_types_b16:
227+
case fastdss_types_u16:
285228
if (!PyArg_ParseTuple(args, "p", &cval_int))
286229
{
287230
PyErr_SetString(PyExc_TypeError, "Invalid arguments on AltDSS_PyScalarSetter call (expected a boolean value)");
288231
return NULL;
289232
}
290233
threadstate = PyEval_SaveThread();
291-
((func_void_ctx_b16)f->func)(f->dssCtx, cval_int ? (uint16_t)-1 : (uint16_t)0);
234+
((altdss_func_v_cvp_u16)f->func)(f->dssCtx, cval_int ? (uint16_t)-1 : (uint16_t)0);
292235
PyEval_RestoreThread(threadstate);
293236
break;
294237
case fastdss_types_str:
@@ -298,12 +241,12 @@ static PyObject *AltDSS_PyScalarSetter_call(AltDSS_PyScalarSetterObject *f, PyOb
298241
return NULL;
299242
}
300243
threadstate = PyEval_SaveThread();
301-
((func_void_ctx_str)f->func)(f->dssCtx, cstr);
244+
((altdss_func_v_cvp_cstr)f->func)(f->dssCtx, cstr);
302245
PyEval_RestoreThread(threadstate);
303246
break;
304247
case fastdss_types_void:
305248
threadstate = PyEval_SaveThread();
306-
((func_void_ctx)f->func)(f->dssCtx);
249+
((altdss_func_v_cvp)f->func)(f->dssCtx);
307250
PyEval_RestoreThread(threadstate);
308251
break;
309252
default:
@@ -369,20 +312,20 @@ static PyObject *AltDSS_PyScalarGetter_call(AltDSS_PyScalarGetterObject *f, PyOb
369312
threadstate = PyEval_SaveThread();
370313
switch (f->resType)
371314
{
372-
case fastdss_types_b16:
315+
case fastdss_types_u16:
373316
switch (f->funcArgSignature)
374317
{
375318
case fastdss_types_i32_i32:
376-
cval_int32 = ((func_b16_ctx_i32_i32)f->func)(f->dssCtx, argValue, argValue2);
319+
cval_int32 = ((altdss_func_u16_cvp_i32_i32)f->func)(f->dssCtx, argValue, argValue2);
377320
break;
378321
case fastdss_types_i32:
379-
cval_int32 = ((func_b16_ctx_i32)f->func)(f->dssCtx, argValue);
322+
cval_int32 = ((altdss_func_u16_cvp_i32)f->func)(f->dssCtx, argValue);
380323
break;
381324
case fastdss_types_str:
382-
cval_int32 = ((func_b16_ctx_str)f->func)(f->dssCtx, cstr);
325+
cval_int32 = ((altdss_func_u16_cvp_cstr)f->func)(f->dssCtx, cstr);
383326
break;
384327
case fastdss_types_void:
385-
cval_int32 = ((func_b16_ctx)f->func)(f->dssCtx);
328+
cval_int32 = ((altdss_func_u16_cvp)f->func)(f->dssCtx);
386329
break;
387330
default:
388331
PyEval_RestoreThread(threadstate);
@@ -394,13 +337,13 @@ static PyObject *AltDSS_PyScalarGetter_call(AltDSS_PyScalarGetterObject *f, PyOb
394337
switch (f->funcArgSignature)
395338
{
396339
case fastdss_types_i32:
397-
cval_int32 = ((func_i32_ctx_i32)f->func)(f->dssCtx, argValue);
340+
cval_int32 = ((altdss_func_i32_cvp_i32)f->func)(f->dssCtx, argValue);
398341
break;
399342
case fastdss_types_str:
400-
cval_int32 = ((func_i32_ctx_str)f->func)(f->dssCtx, cstr);
343+
cval_int32 = ((altdss_func_i32_cvp_cstr)f->func)(f->dssCtx, cstr);
401344
break;
402345
case fastdss_types_void:
403-
cval_int32 = ((func_i32_ctx)f->func)(f->dssCtx);
346+
cval_int32 = ((altdss_func_i32_cvp)f->func)(f->dssCtx);
404347
break;
405348
default:
406349
PyEval_RestoreThread(threadstate);
@@ -412,13 +355,13 @@ static PyObject *AltDSS_PyScalarGetter_call(AltDSS_PyScalarGetterObject *f, PyOb
412355
switch (f->funcArgSignature)
413356
{
414357
case fastdss_types_i32:
415-
cval_float64 = ((func_f64_ctx_i32)f->func)(f->dssCtx, argValue);
358+
cval_float64 = ((altdss_func_f64_vp_i32)f->func)(f->dssCtx, argValue);
416359
break;
417360
case fastdss_types_str:
418-
cval_float64 = ((func_f64_ctx_str)f->func)(f->dssCtx, cstr);
361+
cval_float64 = ((altdss_func_f64_vp_cstr)f->func)(f->dssCtx, cstr);
419362
break;
420363
case fastdss_types_void:
421-
cval_float64 = ((func_f64_ctx)f->func)(f->dssCtx);
364+
cval_float64 = ((altdss_func_f64_cvp)f->func)(f->dssCtx);
422365
break;
423366
default:
424367
PyEval_RestoreThread(threadstate);
@@ -443,7 +386,7 @@ static PyObject *AltDSS_PyScalarGetter_call(AltDSS_PyScalarGetterObject *f, PyOb
443386

444387
switch (f->resType)
445388
{
446-
case fastdss_types_b16:
389+
case fastdss_types_u16:
447390
result = (cval_int32 ? Py_True : Py_False);
448391
Py_INCREF(result);
449392
return result;
@@ -482,7 +425,7 @@ static PyObject *AltDSS_PyGRGetter_call(AltDSS_PyGRGetterObject *f, PyObject *ar
482425
return NULL;
483426
}
484427
threadstate = PyEval_SaveThread();
485-
((gr_func_void_ctx_f64_f64_i32)f->func)(f->dssCtx, float64Arg1, float64Arg2, argValue);
428+
((altdss_func_v_cvp_f64_f64_i32)f->func)(f->dssCtx, float64Arg1, float64Arg2, argValue);
486429
PyEval_RestoreThread(threadstate);
487430
break;
488431
case fastdss_types_i32:
@@ -492,22 +435,22 @@ static PyObject *AltDSS_PyGRGetter_call(AltDSS_PyGRGetterObject *f, PyObject *ar
492435
return NULL;
493436
}
494437
threadstate = PyEval_SaveThread();
495-
((gr_func_void_ctx_i32)f->func)(f->dssCtx, argValue);
438+
((altdss_func_v_cvp_i32)f->func)(f->dssCtx, argValue);
496439
PyEval_RestoreThread(threadstate);
497440
break;
498-
case fastdss_types_b16:
441+
case fastdss_types_u16:
499442
if (!PyArg_ParseTuple(args, "p", &argValue))
500443
{
501444
PyErr_SetString(PyExc_TypeError, "Invalid arguments on AltDSS_PyGRSetter call (expected a boolean value)");
502445
return NULL;
503446
}
504447
threadstate = PyEval_SaveThread();
505-
((gr_func_void_ctx_b16)f->func)(f->dssCtx, argValue ? (uint16_t)-1 : (uint16_t)0);
448+
((altdss_func_v_cvp_u16)f->func)(f->dssCtx, argValue ? (uint16_t)-1 : (uint16_t)0);
506449
PyEval_RestoreThread(threadstate);
507450
break;
508451
default:
509452
threadstate = PyEval_SaveThread();
510-
((gr_func_void_ctx)f->func)(f->dssCtx);
453+
((altdss_func_v_cvp)f->func)(f->dssCtx);
511454
PyEval_RestoreThread(threadstate);
512455
break;
513456
}
@@ -737,12 +680,12 @@ static PyObject *AltDSS_PyStrGetter_call(AltDSS_PyStrGetterObject *f, PyObject *
737680
return NULL;
738681
}
739682
threadstate = PyEval_SaveThread();
740-
cstr = ((func_str_ctx_i32)f->func)(f->dssCtx, argValue);
683+
cstr = ((altdss_func_cstr_cvp_i32)f->func)(f->dssCtx, argValue);
741684
PyEval_RestoreThread(threadstate);
742685
break;
743686
default:
744687
threadstate = PyEval_SaveThread();
745-
cstr = ((func_str_ctx)f->func)(f->dssCtx);
688+
cstr = ((altdss_func_cstr_cvp)f->func)(f->dssCtx);
746689
PyEval_RestoreThread(threadstate);
747690
break;
748691
}
@@ -785,14 +728,14 @@ static PyObject *AltDSS_PyStrListGetter_call(AltDSS_PyStrListGetterObject *f, Py
785728

786729
switch (f->funcArgSignature)
787730
{
788-
case fastdss_types_b16:
731+
case fastdss_types_u16:
789732
if (!PyArg_ParseTuple(args, "i", &argIntValue))
790733
{
791734
PyErr_SetString(PyExc_TypeError, "Invalid arguments on AltDSS_PyStrGetter call (expected a boolean value)");
792735
return NULL;
793736
}
794737
threadstate = PyEval_SaveThread();
795-
((func_void_ctx_strs_i32)f->func)(f->dssCtx, &cstr_list, &count[0], argIntValue ? 1 : 0);
738+
((altdss_func_v_cvp_strs_i32p_u16)f->func)(f->dssCtx, &cstr_list, &count[0], argIntValue ? 1 : 0);
796739
PyEval_RestoreThread(threadstate);
797740
break;
798741
case fastdss_types_i32:
@@ -802,7 +745,7 @@ static PyObject *AltDSS_PyStrListGetter_call(AltDSS_PyStrListGetterObject *f, Py
802745
return NULL;
803746
}
804747
threadstate = PyEval_SaveThread();
805-
((func_void_ctx_strs_i32)f->func)(f->dssCtx, &cstr_list, &count[0], argIntValue);
748+
((altdss_func_v_cvp_strs_i32p_i32)f->func)(f->dssCtx, &cstr_list, &count[0], argIntValue);
806749
PyEval_RestoreThread(threadstate);
807750
break;
808751
case fastdss_types_str:
@@ -812,12 +755,12 @@ static PyObject *AltDSS_PyStrListGetter_call(AltDSS_PyStrListGetterObject *f, Py
812755
return NULL;
813756
}
814757
threadstate = PyEval_SaveThread();
815-
((func_void_ctx_strs_str)f->func)(f->dssCtx, &cstr_list, &count[0], cstr);
758+
((altdss_func_v_cvp_strs_i32p_cstr)f->func)(f->dssCtx, &cstr_list, &count[0], cstr);
816759
PyEval_RestoreThread(threadstate);
817760
break;
818761
default:
819762
threadstate = PyEval_SaveThread();
820-
((func_void_ctx_strs)f->func)(f->dssCtx, &cstr_list, &count[0]);
763+
((altdss_func_v_cvp_strs_i32p)f->func)(f->dssCtx, &cstr_list, &count[0]);
821764
PyEval_RestoreThread(threadstate);
822765
break;
823766
}
@@ -952,7 +895,8 @@ static struct PyModuleDef altdss_fast_def = {
952895

953896
int AltDSS_Add_PyFunc(AltDSS_PyContextObject *self, FastDSSFuncInfo* finfo, PyObject *setObj, PyObject *fakeLib);
954897

955-
#include "./_fastdss_func_info.inc.c"
898+
#define FASTDSS_FUNCINFO_FILL(funcname) offsetof(AltDSSCAPI, funcname), NULL, offsetof(AltDSS_PyContextObject, f_##funcname), #funcname
899+
#include "altdss/capi/fastdss_func_info.inc.c"
956900

957901
static int AltDSS_PyContext_init(AltDSS_PyContextObject *self, PyObject *args, PyObject *Py_UNUSED(kwargs_ignored))
958902
{
@@ -1160,7 +1104,7 @@ int AltDSS_PyScalarSetter_cinit(AltDSS_PyScalarSetterObject* f, AltDSS_PyContext
11601104
finfo->argType != fastdss_types_i32_i32 &&
11611105
finfo->argType != fastdss_types_i32 &&
11621106
finfo->argType != fastdss_types_f64 &&
1163-
finfo->argType != fastdss_types_b16 &&
1107+
finfo->argType != fastdss_types_u16 &&
11641108
finfo->argType != fastdss_types_void &&
11651109
finfo->argType != fastdss_types_str)
11661110
|| (finfo->resType != fastdss_types_void)
@@ -1187,7 +1131,7 @@ int AltDSS_PyScalarGetter_cinit(AltDSS_PyScalarGetterObject* f, AltDSS_PyContext
11871131
{
11881132
if (finfo->resType != fastdss_types_i32 &&
11891133
finfo->resType != fastdss_types_f64 &&
1190-
finfo->resType != fastdss_types_b16)
1134+
finfo->resType != fastdss_types_u16)
11911135
{
11921136
f->dssCtx = NULL;
11931137
f->func = NULL;
@@ -1276,7 +1220,7 @@ int AltDSS_Add_PyFunc(AltDSS_PyContextObject *self, FastDSSFuncInfo* finfo, PyOb
12761220
case fastdss_types_i32_i32:
12771221
case fastdss_types_f64:
12781222
case fastdss_types_i32:
1279-
case fastdss_types_b16:
1223+
case fastdss_types_u16:
12801224
case fastdss_types_str:
12811225
case fastdss_types_void:
12821226
*py_func = (PyObject*) PyObject_New(AltDSS_PyScalarSetterObject, &AltDSS_PyScalarSetterType);
@@ -1312,7 +1256,7 @@ int AltDSS_Add_PyFunc(AltDSS_PyContextObject *self, FastDSSFuncInfo* finfo, PyOb
13121256
break;
13131257
case fastdss_types_f64:
13141258
case fastdss_types_i32:
1315-
case fastdss_types_b16:
1259+
case fastdss_types_u16:
13161260
*py_func = (PyObject*) PyObject_New(AltDSS_PyScalarGetterObject, &AltDSS_PyScalarGetterType);
13171261
if ((*py_func) == NULL)
13181262
{

0 commit comments

Comments
 (0)