@@ -486,6 +486,13 @@ initial_counter_value(void) {
486
486
#define SPEC_FAIL_BUFFER_SLICE 16
487
487
#define SPEC_FAIL_SEQUENCE_INT 17
488
488
489
+ /* Store subscr */
490
+ #define SPEC_FAIL_BYTEARRAY_INT 18
491
+ #define SPEC_FAIL_BYTEARRAY_SLICE 19
492
+ #define SPEC_FAIL_PY_SIMPLE 20
493
+ #define SPEC_FAIL_PY_OTHER 21
494
+ #define SPEC_FAIL_DICT_SUBCLASS_NO_OVERRIDE 22
495
+
489
496
/* Binary add */
490
497
491
498
#define SPEC_FAIL_NON_FUNCTION_SCOPE 11
@@ -1253,15 +1260,73 @@ _Py_Specialize_StoreSubscr(PyObject *container, PyObject *sub, _Py_CODEUNIT *ins
1253
1260
goto fail ;
1254
1261
}
1255
1262
}
1256
- else if (container_type == & PyDict_Type ) {
1263
+ if (container_type == & PyDict_Type ) {
1257
1264
* instr = _Py_MAKECODEUNIT (STORE_SUBSCR_DICT ,
1258
1265
initial_counter_value ());
1259
1266
goto success ;
1260
1267
}
1261
- else {
1262
- SPECIALIZATION_FAIL (STORE_SUBSCR , SPEC_FAIL_OTHER );
1268
+ #ifdef Py_STATS
1269
+ PyMappingMethods * as_mapping = container_type -> tp_as_mapping ;
1270
+ if (as_mapping && (as_mapping -> mp_ass_subscript
1271
+ == PyDict_Type .tp_as_mapping -> mp_ass_subscript )) {
1272
+ SPECIALIZATION_FAIL (STORE_SUBSCR , SPEC_FAIL_DICT_SUBCLASS_NO_OVERRIDE );
1263
1273
goto fail ;
1264
1274
}
1275
+ if (PyObject_CheckBuffer (container )) {
1276
+ if (PyLong_CheckExact (sub ) && (((size_t )Py_SIZE (sub )) > 1 )) {
1277
+ SPECIALIZATION_FAIL (STORE_SUBSCR , SPEC_FAIL_OUT_OF_RANGE );
1278
+ }
1279
+ else if (strcmp (container_type -> tp_name , "array.array" ) == 0 ) {
1280
+ if (PyLong_CheckExact (sub )) {
1281
+ SPECIALIZATION_FAIL (STORE_SUBSCR , SPEC_FAIL_ARRAY_INT );
1282
+ }
1283
+ else if (PySlice_Check (sub )) {
1284
+ SPECIALIZATION_FAIL (STORE_SUBSCR , SPEC_FAIL_ARRAY_SLICE );
1285
+ }
1286
+ else {
1287
+ SPECIALIZATION_FAIL (STORE_SUBSCR , SPEC_FAIL_OTHER );
1288
+ }
1289
+ }
1290
+ else if (PyByteArray_CheckExact (container )) {
1291
+ if (PyLong_CheckExact (sub )) {
1292
+ SPECIALIZATION_FAIL (STORE_SUBSCR , SPEC_FAIL_BYTEARRAY_INT );
1293
+ }
1294
+ else if (PySlice_Check (sub )) {
1295
+ SPECIALIZATION_FAIL (STORE_SUBSCR , SPEC_FAIL_BYTEARRAY_SLICE );
1296
+ }
1297
+ else {
1298
+ SPECIALIZATION_FAIL (STORE_SUBSCR , SPEC_FAIL_OTHER );
1299
+ }
1300
+ }
1301
+ else {
1302
+ if (PyLong_CheckExact (sub )) {
1303
+ SPECIALIZATION_FAIL (STORE_SUBSCR , SPEC_FAIL_BUFFER_INT );
1304
+ }
1305
+ else if (PySlice_Check (sub )) {
1306
+ SPECIALIZATION_FAIL (STORE_SUBSCR , SPEC_FAIL_BUFFER_SLICE );
1307
+ }
1308
+ else {
1309
+ SPECIALIZATION_FAIL (STORE_SUBSCR , SPEC_FAIL_OTHER );
1310
+ }
1311
+ }
1312
+ goto fail ;
1313
+ }
1314
+ _Py_IDENTIFIER (__setitem__ );
1315
+ PyObject * descriptor = _PyType_LookupId (container_type , & PyId___setitem__ );
1316
+ if (descriptor && Py_TYPE (descriptor ) == & PyFunction_Type ) {
1317
+ PyFunctionObject * func = (PyFunctionObject * )descriptor ;
1318
+ PyCodeObject * code = (PyCodeObject * )func -> func_code ;
1319
+ int kind = function_kind (code );
1320
+ if (kind == SIMPLE_FUNCTION ) {
1321
+ SPECIALIZATION_FAIL (STORE_SUBSCR , SPEC_FAIL_PY_SIMPLE );
1322
+ }
1323
+ else {
1324
+ SPECIALIZATION_FAIL (STORE_SUBSCR , SPEC_FAIL_PY_OTHER );
1325
+ }
1326
+ goto fail ;
1327
+ }
1328
+ #endif
1329
+ SPECIALIZATION_FAIL (STORE_SUBSCR , SPEC_FAIL_OTHER );
1265
1330
fail :
1266
1331
STAT_INC (STORE_SUBSCR , failure );
1267
1332
assert (!PyErr_Occurred ());
0 commit comments