50
50
# define ASSERT_REFCNT (expr )
51
51
#endif
52
52
53
+ // Marker to check that pointer value was set
54
+ static const char uninitialized [] = "uninitialized" ;
55
+ #define UNINITIALIZED_OBJ ((PyObject *)uninitialized)
56
+
53
57
54
58
static PyObject *
55
59
create_string (const char * str )
@@ -806,7 +810,7 @@ test_weakref(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args))
806
810
}
807
811
808
812
// test PyWeakref_GetRef(), reference is alive
809
- PyObject * ref = Py_True ; // marker to check that value was set
813
+ PyObject * ref = UNINITIALIZED_OBJ ;
810
814
assert (PyWeakref_GetRef (weakref , & ref ) == 1 );
811
815
assert (ref == obj );
812
816
assert (Py_REFCNT (obj ) == (refcnt + 1 ));
@@ -1016,28 +1020,28 @@ test_getattr(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args))
1016
1020
1017
1021
// test PyObject_GetOptionalAttr(): attribute exists
1018
1022
attr_name = create_string ("version" );
1019
- value = Py_True ; // marker value
1023
+ value = UNINITIALIZED_OBJ ;
1020
1024
assert (PyObject_GetOptionalAttr (obj , attr_name , & value ) == 1 );
1021
1025
assert (value != _Py_NULL );
1022
1026
Py_DECREF (value );
1023
1027
Py_DECREF (attr_name );
1024
1028
1025
1029
// test PyObject_GetOptionalAttrString(): attribute exists
1026
- value = Py_True ; // marker value
1030
+ value = UNINITIALIZED_OBJ ;
1027
1031
assert (PyObject_GetOptionalAttrString (obj , "version" , & value ) == 1 );
1028
1032
assert (value != _Py_NULL );
1029
1033
Py_DECREF (value );
1030
1034
1031
1035
// test PyObject_GetOptionalAttr(): attribute doesn't exist
1032
1036
attr_name = create_string ("nonexistant_attr_name" );
1033
- value = Py_True ; // marker value
1037
+ value = UNINITIALIZED_OBJ ;
1034
1038
assert (PyObject_GetOptionalAttr (obj , attr_name , & value ) == 0 );
1035
1039
assert (value == _Py_NULL );
1036
1040
Py_DECREF (attr_name );
1037
1041
assert (!PyErr_Occurred ());
1038
1042
1039
1043
// test PyObject_GetOptionalAttrString(): attribute doesn't exist
1040
- value = Py_True ; // marker value
1044
+ value = UNINITIALIZED_OBJ ;
1041
1045
assert (PyObject_GetOptionalAttrString (obj , "nonexistant_attr_name" , & value ) == 0 );
1042
1046
assert (value == _Py_NULL );
1043
1047
assert (!PyErr_Occurred ());
@@ -1056,37 +1060,56 @@ test_getitem(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args))
1056
1060
assert (value != _Py_NULL );
1057
1061
PyObject * obj = Py_BuildValue ("{sO}" , "key" , value );
1058
1062
assert (obj != _Py_NULL );
1059
- PyObject * key ;
1063
+ PyObject * present_key , * missing_key ;
1060
1064
PyObject * item ;
1061
1065
1066
+ present_key = create_string ("key" );
1067
+ missing_key = create_string ("dontexist" );
1068
+
1062
1069
// test PyMapping_GetOptionalItem(): key is present
1063
- key = create_string ("key" );
1064
- item = Py_True ; // marker value
1065
- assert (PyMapping_GetOptionalItem (obj , key , & item ) == 1 );
1070
+ item = UNINITIALIZED_OBJ ;
1071
+ assert (PyMapping_GetOptionalItem (obj , present_key , & item ) == 1 );
1066
1072
assert (item == value );
1067
1073
Py_DECREF (item );
1068
- Py_DECREF (key );
1074
+ assert (!PyErr_Occurred ());
1075
+
1076
+ // test PyMapping_HasKeyWithError(): key is present
1077
+ assert (PyMapping_HasKeyWithError (obj , present_key ) == 1 );
1078
+ assert (!PyErr_Occurred ());
1069
1079
1070
1080
// test PyMapping_GetOptionalItemString(): key is present
1071
- item = Py_True ; // marker value
1081
+ item = UNINITIALIZED_OBJ ;
1072
1082
assert (PyMapping_GetOptionalItemString (obj , "key" , & item ) == 1 );
1073
1083
assert (item == value );
1074
1084
Py_DECREF (item );
1075
1085
1086
+ // test PyMapping_HasKeyStringWithError(): key is present
1087
+ assert (PyMapping_HasKeyStringWithError (obj , "key" ) == 1 );
1088
+ assert (!PyErr_Occurred ());
1089
+
1076
1090
// test PyMapping_GetOptionalItem(): missing key
1077
- key = create_string ("dontexist" );
1078
- item = Py_True ; // marker value
1079
- assert (PyMapping_GetOptionalItem (obj , key , & item ) == 0 );
1091
+ item = UNINITIALIZED_OBJ ;
1092
+ assert (PyMapping_GetOptionalItem (obj , missing_key , & item ) == 0 );
1080
1093
assert (item == _Py_NULL );
1081
- Py_DECREF (key );
1094
+ assert (!PyErr_Occurred ());
1095
+
1096
+ // test PyMapping_HasKeyWithError(): missing key
1097
+ assert (PyMapping_HasKeyWithError (obj , missing_key ) == 0 );
1098
+ assert (!PyErr_Occurred ());
1082
1099
1083
1100
// test PyMapping_GetOptionalItemString(): missing key
1084
- item = Py_True ; // marker value
1101
+ item = UNINITIALIZED_OBJ ;
1085
1102
assert (PyMapping_GetOptionalItemString (obj , "dontexist" , & item ) == 0 );
1086
1103
assert (item == _Py_NULL );
1087
1104
1105
+ // test PyMapping_HasKeyStringWithError(): missing key
1106
+ assert (PyMapping_HasKeyStringWithError (obj , "dontexist" ) == 0 );
1107
+ assert (!PyErr_Occurred ());
1108
+
1088
1109
Py_DECREF (obj );
1089
1110
Py_DECREF (value );
1111
+ Py_DECREF (present_key );
1112
+ Py_DECREF (missing_key );
1090
1113
Py_RETURN_NONE ;
1091
1114
}
1092
1115
@@ -1147,45 +1170,45 @@ test_dict_api(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args))
1147
1170
PyErr_Clear ();
1148
1171
1149
1172
// test PyDict_GetItemRef(), key is present
1150
- get_value = Py_Ellipsis ; // marker value
1173
+ get_value = UNINITIALIZED_OBJ ;
1151
1174
assert (PyDict_GetItemRef (dict , key , & get_value ) == 1 );
1152
1175
assert (get_value == value );
1153
1176
Py_DECREF (get_value );
1154
1177
1155
1178
// test PyDict_GetItemStringRef(), key is present
1156
- get_value = Py_Ellipsis ; // marker value
1179
+ get_value = UNINITIALIZED_OBJ ;
1157
1180
assert (PyDict_GetItemStringRef (dict , "key" , & get_value ) == 1 );
1158
1181
assert (get_value == value );
1159
1182
Py_DECREF (get_value );
1160
1183
1161
1184
// test PyDict_GetItemRef(), missing key
1162
- get_value = Py_Ellipsis ; // marker value
1185
+ get_value = UNINITIALIZED_OBJ ;
1163
1186
assert (PyDict_GetItemRef (dict , missing_key , & get_value ) == 0 );
1164
1187
assert (!PyErr_Occurred ());
1165
1188
assert (get_value == NULL );
1166
1189
1167
1190
// test PyDict_GetItemStringRef(), missing key
1168
- get_value = Py_Ellipsis ; // marker value
1191
+ get_value = UNINITIALIZED_OBJ ;
1169
1192
assert (PyDict_GetItemStringRef (dict , "missing_key" , & get_value ) == 0 );
1170
1193
assert (!PyErr_Occurred ());
1171
1194
assert (get_value == NULL );
1172
1195
1173
1196
// test PyDict_GetItemRef(), invalid dict
1174
- get_value = Py_Ellipsis ; // marker value
1197
+ get_value = UNINITIALIZED_OBJ ;
1175
1198
assert (PyDict_GetItemRef (invalid_dict , key , & get_value ) == -1 );
1176
1199
assert (PyErr_ExceptionMatches (PyExc_SystemError ));
1177
1200
PyErr_Clear ();
1178
1201
assert (get_value == NULL );
1179
1202
1180
1203
// test PyDict_GetItemStringRef(), invalid dict
1181
- get_value = Py_Ellipsis ; // marker value
1204
+ get_value = UNINITIALIZED_OBJ ;
1182
1205
assert (PyDict_GetItemStringRef (invalid_dict , "key" , & get_value ) == -1 );
1183
1206
assert (PyErr_ExceptionMatches (PyExc_SystemError ));
1184
1207
PyErr_Clear ();
1185
1208
assert (get_value == NULL );
1186
1209
1187
1210
// test PyDict_GetItemRef(), invalid key
1188
- get_value = Py_Ellipsis ; // marker value
1211
+ get_value = UNINITIALIZED_OBJ ;
1189
1212
assert (PyDict_GetItemRef (dict , invalid_key , & get_value ) == -1 );
1190
1213
assert (PyErr_ExceptionMatches (PyExc_TypeError ));
1191
1214
PyErr_Clear ();
0 commit comments