@@ -60,6 +60,8 @@ static Reader* NewObjectReader(PyObject* ob);
60
60
static Reader * NewFileReader (PyObject * ob );
61
61
#endif
62
62
63
+ // cache global VarList class object.
64
+ static PyObject * g_varlist_class = NULL ;
63
65
64
66
static PyObject * loads_tag (Reader * rin , uint64_t aux );
65
67
static int loads_kv (PyObject * out , Reader * rin );
@@ -368,7 +370,7 @@ PyObject* inner_loads_c(Reader* rin, uint8_t c) {
368
370
case CBOR_ARRAY :
369
371
if (cbor_info == CBOR_VAR_FOLLOWS ) {
370
372
uint8_t sc ;
371
- out = PyList_New ( 0 );
373
+ out = PyObject_CallObject ( g_varlist_class , NULL );
372
374
if (rin -> read1 (rin , & sc )) { logprintf ("r1 fail in var array tag\n" ); return NULL ; }
373
375
while (sc != CBOR_BREAK ) {
374
376
PyObject * subitem = inner_loads_c (rin , sc );
@@ -520,6 +522,21 @@ static PyObject* getCborTagClass(void) {
520
522
return tag_class ;
521
523
}
522
524
525
+ // returns a PyObject for cbor.cbor.VarList
526
+ // Returned PyObject* is a BORROWED reference from the module dict
527
+ static PyObject * getCborVarListClass (void ) {
528
+ PyObject * cbor_module = PyImport_ImportModule ("cbor.cbor" );
529
+ PyObject * moddict = PyModule_GetDict (cbor_module );
530
+ PyObject * tag_class = PyDict_GetItemString (moddict , "VarList" );
531
+ // moddict and tag_class are 'borrowed reference'
532
+ Py_DECREF (cbor_module );
533
+
534
+ return tag_class ;
535
+ }
536
+
537
+ static int VarList_Check (PyObject * o ) {
538
+ return PyObject_IsInstance (o , g_varlist_class );
539
+ }
523
540
524
541
static PyObject * loads_tag (Reader * rin , uint64_t aux ) {
525
542
PyObject * out = NULL ;
@@ -1180,6 +1197,18 @@ static int inner_dumps(EncodeOptions *optp, PyObject* ob, uint8_t* out, uintptr_
1180
1197
} else if (PyDict_Check (ob )) {
1181
1198
int err = dumps_dict (optp , ob , out , & pos );
1182
1199
if (err != 0 ) { return err ; }
1200
+ } else if (VarList_Check (ob )) {
1201
+ Py_ssize_t i ;
1202
+ if (out != NULL ) {
1203
+ out [pos ] = CBOR_ARRAY | CBOR_VAR_FOLLOWS ;
1204
+ }
1205
+ pos ++ ;
1206
+ Py_ssize_t listlen = PyList_Size (ob );
1207
+ for (i = 0 ; i < listlen ; i ++ ) {
1208
+ int err = inner_dumps (optp , PyList_GetItem (ob , i ), out , & pos );
1209
+ if (err != 0 ) { return err ; }
1210
+ }
1211
+ tag_aux_out (CBOR_BREAK , 0 , out , & pos );
1183
1212
} else if (PyList_Check (ob )) {
1184
1213
Py_ssize_t i ;
1185
1214
Py_ssize_t listlen = PyList_Size (ob );
@@ -1462,13 +1491,17 @@ static PyMethodDef CborMethods[] = {
1462
1491
PyMODINIT_FUNC
1463
1492
init_cbor (void )
1464
1493
{
1494
+ g_varlist_class = getCborVarListClass ();
1495
+
1465
1496
(void ) Py_InitModule ("cbor._cbor" , CborMethods );
1466
1497
}
1467
1498
#else
1468
1499
// Python 3
1469
1500
PyMODINIT_FUNC
1470
1501
PyInit__cbor (void )
1471
1502
{
1503
+ g_varlist_class = getCborVarListClass ();
1504
+
1472
1505
static PyModuleDef modef = {
1473
1506
PyModuleDef_HEAD_INIT ,
1474
1507
};
0 commit comments