@@ -60,6 +60,8 @@ static Reader* NewObjectReader(PyObject* ob);
6060static Reader * NewFileReader (PyObject * ob );
6161#endif
6262
63+ // cache global VarList class object.
64+ static PyObject * g_varlist_class = NULL ;
6365
6466static PyObject * loads_tag (Reader * rin , uint64_t aux );
6567static int loads_kv (PyObject * out , Reader * rin );
@@ -368,7 +370,7 @@ PyObject* inner_loads_c(Reader* rin, uint8_t c) {
368370 case CBOR_ARRAY :
369371 if (cbor_info == CBOR_VAR_FOLLOWS ) {
370372 uint8_t sc ;
371- out = PyList_New ( 0 );
373+ out = PyObject_CallObject ( g_varlist_class , NULL );
372374 if (rin -> read1 (rin , & sc )) { logprintf ("r1 fail in var array tag\n" ); return NULL ; }
373375 while (sc != CBOR_BREAK ) {
374376 PyObject * subitem = inner_loads_c (rin , sc );
@@ -520,6 +522,21 @@ static PyObject* getCborTagClass(void) {
520522 return tag_class ;
521523}
522524
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+ }
523540
524541static PyObject * loads_tag (Reader * rin , uint64_t aux ) {
525542 PyObject * out = NULL ;
@@ -1180,6 +1197,18 @@ static int inner_dumps(EncodeOptions *optp, PyObject* ob, uint8_t* out, uintptr_
11801197 } else if (PyDict_Check (ob )) {
11811198 int err = dumps_dict (optp , ob , out , & pos );
11821199 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 );
11831212 } else if (PyList_Check (ob )) {
11841213 Py_ssize_t i ;
11851214 Py_ssize_t listlen = PyList_Size (ob );
@@ -1462,13 +1491,17 @@ static PyMethodDef CborMethods[] = {
14621491PyMODINIT_FUNC
14631492init_cbor (void )
14641493{
1494+ g_varlist_class = getCborVarListClass ();
1495+
14651496 (void ) Py_InitModule ("cbor._cbor" , CborMethods );
14661497}
14671498#else
14681499// Python 3
14691500PyMODINIT_FUNC
14701501PyInit__cbor (void )
14711502{
1503+ g_varlist_class = getCborVarListClass ();
1504+
14721505 static PyModuleDef modef = {
14731506 PyModuleDef_HEAD_INIT ,
14741507 };
0 commit comments