@@ -1425,14 +1425,24 @@ static PyType_Spec pycpointer_type_spec = {
1425
1425
PyCArrayType_init ensures that the new Array subclass created has a _length_
1426
1426
attribute, and a _type_ attribute.
1427
1427
*/
1428
+ /*[clinic input]
1429
+ class _ctypes.PyCArrayType_Type "CDataObject *" "clinic_state()->PyCArrayType_Type"
1430
+ [clinic start generated code]*/
1431
+ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=6340cbaead1bf3f3]*/
1432
+
1433
+ /*[clinic input]
1434
+ @critical_section
1435
+ @setter
1436
+ _ctypes.PyCArrayType_Type.raw
1437
+ [clinic start generated code]*/
1428
1438
1429
1439
static int
1430
- CharArray_set_raw (PyObject * op , PyObject * value , void * Py_UNUSED (ignored ))
1440
+ _ctypes_PyCArrayType_Type_raw_set_impl (CDataObject * self , PyObject * value )
1441
+ /*[clinic end generated code: output=cf9b2a9fd92e9ecb input=a3717561efc45efd]*/
1431
1442
{
1432
1443
char * ptr ;
1433
1444
Py_ssize_t size ;
1434
1445
Py_buffer view ;
1435
- CDataObject * self = _CDataObject_CAST (op );
1436
1446
1437
1447
if (value == NULL ) {
1438
1448
PyErr_SetString (PyExc_AttributeError , "cannot delete attribute" );
@@ -1457,39 +1467,51 @@ CharArray_set_raw(PyObject *op, PyObject *value, void *Py_UNUSED(ignored))
1457
1467
return -1 ;
1458
1468
}
1459
1469
1470
+ /*[clinic input]
1471
+ @critical_section
1472
+ @getter
1473
+ _ctypes.PyCArrayType_Type.raw
1474
+ [clinic start generated code]*/
1475
+
1460
1476
static PyObject *
1461
- CharArray_get_raw (PyObject * op , void * Py_UNUSED (ignored ))
1477
+ _ctypes_PyCArrayType_Type_raw_get_impl (CDataObject * self )
1478
+ /*[clinic end generated code: output=3a90be6f43764e31 input=4c49bbb715235ba7]*/
1462
1479
{
1463
- PyObject * res ;
1464
- CDataObject * self = _CDataObject_CAST (op );
1465
- LOCK_PTR (self );
1466
- res = PyBytes_FromStringAndSize (self -> b_ptr , self -> b_size );
1467
- UNLOCK_PTR (self );
1468
- return res ;
1480
+ return PyBytes_FromStringAndSize (self -> b_ptr , self -> b_size );
1469
1481
}
1470
1482
1483
+ /*[clinic input]
1484
+ @critical_section
1485
+ @getter
1486
+ _ctypes.PyCArrayType_Type.value
1487
+ [clinic start generated code]*/
1488
+
1471
1489
static PyObject *
1472
- CharArray_get_value (PyObject * op , void * Py_UNUSED (ignored ))
1490
+ _ctypes_PyCArrayType_Type_value_get_impl (CDataObject * self )
1491
+ /*[clinic end generated code: output=fb0636f4d8875483 input=2432a2aeb1ed78d1]*/
1473
1492
{
1474
1493
Py_ssize_t i ;
1475
1494
PyObject * res ;
1476
- CDataObject * self = _CDataObject_CAST (op );
1477
- LOCK_PTR (self );
1478
1495
char * ptr = self -> b_ptr ;
1479
1496
for (i = 0 ; i < self -> b_size ; ++ i )
1480
1497
if (* ptr ++ == '\0' )
1481
1498
break ;
1482
1499
res = PyBytes_FromStringAndSize (self -> b_ptr , i );
1483
- UNLOCK_PTR (self );
1484
1500
return res ;
1485
1501
}
1486
1502
1503
+ /*[clinic input]
1504
+ @critical_section
1505
+ @setter
1506
+ _ctypes.PyCArrayType_Type.value
1507
+ [clinic start generated code]*/
1508
+
1487
1509
static int
1488
- CharArray_set_value (PyObject * op , PyObject * value , void * Py_UNUSED (ignored ))
1510
+ _ctypes_PyCArrayType_Type_value_set_impl (CDataObject * self , PyObject * value )
1511
+ /*[clinic end generated code: output=39ad655636a28dd5 input=e2e6385fc6ab1a29]*/
1489
1512
{
1490
1513
const char * ptr ;
1491
1514
Py_ssize_t size ;
1492
- CDataObject * self = _CDataObject_CAST (op );
1493
1515
1494
1516
if (value == NULL ) {
1495
1517
PyErr_SetString (PyExc_TypeError ,
@@ -1513,40 +1535,46 @@ CharArray_set_value(PyObject *op, PyObject *value, void *Py_UNUSED(ignored))
1513
1535
}
1514
1536
1515
1537
ptr = PyBytes_AS_STRING (value );
1516
- LOCK_PTR (self );
1517
1538
memcpy (self -> b_ptr , ptr , size );
1518
1539
if (size < self -> b_size )
1519
1540
self -> b_ptr [size ] = '\0' ;
1520
- UNLOCK_PTR (self );
1521
1541
Py_DECREF (value );
1522
1542
1523
1543
return 0 ;
1524
1544
}
1525
1545
1526
1546
static PyGetSetDef CharArray_getsets [] = {
1527
- { "raw" , CharArray_get_raw , CharArray_set_raw , "value" , NULL },
1528
- { "value" , CharArray_get_value , CharArray_set_value , "string value" },
1547
+ _CTYPES_PYCARRAYTYPE_TYPE_RAW_GETSETDEF
1548
+ _CTYPES_PYCARRAYTYPE_TYPE_VALUE_GETSETDEF
1529
1549
{ NULL , NULL }
1530
1550
};
1531
1551
1532
1552
static PyObject *
1533
- WCharArray_get_value (PyObject * op , void * Py_UNUSED ( ignored ) )
1553
+ WCharArray_get_value_lock_held (PyObject * op )
1534
1554
{
1535
1555
Py_ssize_t i ;
1536
1556
PyObject * res ;
1537
1557
CDataObject * self = _CDataObject_CAST (op );
1538
1558
wchar_t * ptr = (wchar_t * )self -> b_ptr ;
1539
- LOCK_PTR (self );
1540
1559
for (i = 0 ; i < self -> b_size /(Py_ssize_t )sizeof (wchar_t ); ++ i )
1541
1560
if (* ptr ++ == (wchar_t )0 )
1542
1561
break ;
1543
1562
res = PyUnicode_FromWideChar ((wchar_t * )self -> b_ptr , i );
1544
- UNLOCK_PTR (self );
1563
+ return res ;
1564
+ }
1565
+
1566
+ static PyObject *
1567
+ WCharArray_get_value (PyObject * op , void * Py_UNUSED (ignored ))
1568
+ {
1569
+ PyObject * res ;
1570
+ Py_BEGIN_CRITICAL_SECTION (op );
1571
+ res = WCharArray_get_value_lock_held (op );
1572
+ Py_END_CRITICAL_SECTION ();
1545
1573
return res ;
1546
1574
}
1547
1575
1548
1576
static int
1549
- WCharArray_set_value (PyObject * op , PyObject * value , void * Py_UNUSED ( ignored ) )
1577
+ WCharArray_set_value_lock_held (PyObject * op , PyObject * value )
1550
1578
{
1551
1579
CDataObject * self = _CDataObject_CAST (op );
1552
1580
@@ -1575,12 +1603,20 @@ WCharArray_set_value(PyObject *op, PyObject *value, void *Py_UNUSED(ignored))
1575
1603
return -1 ;
1576
1604
}
1577
1605
Py_ssize_t rc ;
1578
- LOCK_PTR (self );
1579
1606
rc = PyUnicode_AsWideChar (value , (wchar_t * )self -> b_ptr , size );
1580
- UNLOCK_PTR (self );
1581
1607
return rc < 0 ? -1 : 0 ;
1582
1608
}
1583
1609
1610
+ static int
1611
+ WCharArray_set_value (PyObject * op , PyObject * value , void * Py_UNUSED (ignored ))
1612
+ {
1613
+ int rc ;
1614
+ Py_BEGIN_CRITICAL_SECTION (op );
1615
+ rc = WCharArray_set_value_lock_held (op , value );
1616
+ Py_END_CRITICAL_SECTION ();
1617
+ return rc ;
1618
+ }
1619
+
1584
1620
static PyGetSetDef WCharArray_getsets [] = {
1585
1621
{ "value" , WCharArray_get_value , WCharArray_set_value , "string value" },
1586
1622
{ NULL , NULL }
@@ -2779,8 +2815,9 @@ static PyType_Spec pycfuncptr_type_spec = {
2779
2815
static CDataObject *
2780
2816
PyCData_GetContainer (CDataObject * self )
2781
2817
{
2782
- while (self -> b_base )
2818
+ while (self -> b_base ) {
2783
2819
self = self -> b_base ;
2820
+ }
2784
2821
if (self -> b_objects == NULL ) {
2785
2822
if (self -> b_length ) {
2786
2823
self -> b_objects = PyDict_New ();
@@ -6305,4 +6342,4 @@ PyMODINIT_FUNC
6305
6342
PyInit__ctypes (void )
6306
6343
{
6307
6344
return PyModuleDef_Init (& _ctypesmodule );
6308
- }
6345
+ }
0 commit comments