@@ -451,16 +451,12 @@ dummy_func(
451
451
DISPATCH_INLINED (new_frame );
452
452
}
453
453
454
- // Alternative: (list, unused[oparg], v -- list, unused[oparg])
455
- inst (LIST_APPEND , (v -- )) {
456
- PyObject * list = PEEK (oparg + 1 ); // +1 to account for v staying on stack
454
+ inst (LIST_APPEND , (list , unused [oparg - 1 ], v -- list , unused [oparg - 1 ])) {
457
455
ERROR_IF (_PyList_AppendTakeRef ((PyListObject * )list , v ) < 0 , error );
458
456
PREDICT (JUMP_BACKWARD );
459
457
}
460
458
461
- // Alternative: (set, unused[oparg], v -- set, unused[oparg])
462
- inst (SET_ADD , (v -- )) {
463
- PyObject * set = PEEK (oparg + 1 ); // +1 to account for v staying on stack
459
+ inst (SET_ADD , (set , unused [oparg - 1 ], v -- set , unused [oparg - 1 ])) {
464
460
int err = PySet_Add (set , v );
465
461
Py_DECREF (v );
466
462
ERROR_IF (err , error );
@@ -532,7 +528,7 @@ dummy_func(
532
528
ERROR_IF (res == NULL , error );
533
529
}
534
530
535
- // stack effect: (__array[oparg] -- )
531
+ // This should remain a legacy instruction.
536
532
inst (RAISE_VARARGS ) {
537
533
PyObject * cause = NULL , * exc = NULL ;
538
534
switch (oparg ) {
@@ -1295,40 +1291,25 @@ dummy_func(
1295
1291
}
1296
1292
}
1297
1293
1298
- // stack effect: (__array[oparg] -- __0)
1299
- inst (BUILD_STRING ) {
1300
- PyObject * str ;
1301
- str = _PyUnicode_JoinArray (& _Py_STR (empty ),
1302
- stack_pointer - oparg , oparg );
1303
- if (str == NULL )
1304
- goto error ;
1305
- while (-- oparg >= 0 ) {
1306
- PyObject * item = POP ();
1307
- Py_DECREF (item );
1294
+ inst (BUILD_STRING , (pieces [oparg ] -- str )) {
1295
+ str = _PyUnicode_JoinArray (& _Py_STR (empty ), pieces , oparg );
1296
+ for (int i = 0 ; i < oparg ; i ++ ) {
1297
+ Py_DECREF (pieces [i ]);
1308
1298
}
1309
- PUSH (str );
1299
+ ERROR_IF (str == NULL , error );
1310
1300
}
1311
1301
1312
- // stack effect: (__array[oparg] -- __0)
1313
- inst (BUILD_TUPLE ) {
1314
- STACK_SHRINK (oparg );
1315
- PyObject * tup = _PyTuple_FromArraySteal (stack_pointer , oparg );
1316
- if (tup == NULL )
1317
- goto error ;
1318
- PUSH (tup );
1302
+ inst (BUILD_TUPLE , (values [oparg ] -- tup )) {
1303
+ tup = _PyTuple_FromArraySteal (values , oparg );
1304
+ ERROR_IF (tup == NULL , error );
1319
1305
}
1320
1306
1321
- // stack effect: (__array[oparg] -- __0)
1322
- inst (BUILD_LIST ) {
1323
- STACK_SHRINK (oparg );
1324
- PyObject * list = _PyList_FromArraySteal (stack_pointer , oparg );
1325
- if (list == NULL )
1326
- goto error ;
1327
- PUSH (list );
1307
+ inst (BUILD_LIST , (values [oparg ] -- list )) {
1308
+ list = _PyList_FromArraySteal (values , oparg );
1309
+ ERROR_IF (list == NULL , error );
1328
1310
}
1329
1311
1330
- inst (LIST_EXTEND , (iterable -- )) {
1331
- PyObject * list = PEEK (oparg + 1 ); // iterable is still on the stack
1312
+ inst (LIST_EXTEND , (list , unused [oparg - 1 ], iterable -- list , unused [oparg - 1 ])) {
1332
1313
PyObject * none_val = _PyList_Extend ((PyListObject * )list , iterable );
1333
1314
if (none_val == NULL ) {
1334
1315
if (_PyErr_ExceptionMatches (tstate , PyExc_TypeError ) &&
@@ -1346,48 +1327,40 @@ dummy_func(
1346
1327
DECREF_INPUTS ();
1347
1328
}
1348
1329
1349
- inst (SET_UPDATE , (iterable -- )) {
1350
- PyObject * set = PEEK (oparg + 1 ); // iterable is still on the stack
1330
+ inst (SET_UPDATE , (set , unused [oparg - 1 ], iterable -- set , unused [oparg - 1 ])) {
1351
1331
int err = _PySet_Update (set , iterable );
1352
1332
DECREF_INPUTS ();
1353
1333
ERROR_IF (err < 0 , error );
1354
1334
}
1355
1335
1356
- // stack effect: (__array[oparg] -- __0)
1357
- inst (BUILD_SET ) {
1358
- PyObject * set = PySet_New (NULL );
1336
+ inst (BUILD_SET , (values [oparg ] -- set )) {
1337
+ set = PySet_New (NULL );
1359
1338
int err = 0 ;
1360
- int i ;
1361
- if (set == NULL )
1362
- goto error ;
1363
- for (i = oparg ; i > 0 ; i -- ) {
1364
- PyObject * item = PEEK (i );
1339
+ for (int i = 0 ; i < oparg ; i ++ ) {
1340
+ PyObject * item = values [i ];
1365
1341
if (err == 0 )
1366
1342
err = PySet_Add (set , item );
1367
1343
Py_DECREF (item );
1368
1344
}
1369
- STACK_SHRINK (oparg );
1370
1345
if (err != 0 ) {
1371
1346
Py_DECREF (set );
1372
- goto error ;
1347
+ ERROR_IF (true, error ) ;
1373
1348
}
1374
- PUSH (set );
1375
1349
}
1376
1350
1377
- // stack effect: (__array[oparg*2] -- __0)
1378
- inst (BUILD_MAP ) {
1379
- PyObject * map = _PyDict_FromItems (
1380
- & PEEK (2 * oparg ), 2 ,
1381
- & PEEK (2 * oparg - 1 ), 2 ,
1351
+ inst (BUILD_MAP , (values [oparg * 2 ] -- map )) {
1352
+ map = _PyDict_FromItems (
1353
+ values , 2 ,
1354
+ values + 1 , 2 ,
1382
1355
oparg );
1383
1356
if (map == NULL )
1384
1357
goto error ;
1385
1358
1386
- while ( oparg -- ) {
1387
- Py_DECREF (POP () );
1388
- Py_DECREF (POP () );
1359
+ for ( int i = 0 ; i < oparg ; i ++ ) {
1360
+ Py_DECREF (values [ i * 2 ] );
1361
+ Py_DECREF (values [ i * 2 + 1 ] );
1389
1362
}
1390
- PUSH (map );
1363
+ ERROR_IF (map == NULL , error );
1391
1364
}
1392
1365
1393
1366
inst (SETUP_ANNOTATIONS , (-- )) {
@@ -1432,28 +1405,21 @@ dummy_func(
1432
1405
}
1433
1406
}
1434
1407
1435
- // stack effect: (__array[oparg] -- )
1436
- inst (BUILD_CONST_KEY_MAP ) {
1437
- PyObject * map ;
1438
- PyObject * keys = TOP ();
1408
+ inst (BUILD_CONST_KEY_MAP , (values [oparg ], keys -- map )) {
1439
1409
if (!PyTuple_CheckExact (keys ) ||
1440
1410
PyTuple_GET_SIZE (keys ) != (Py_ssize_t )oparg ) {
1441
1411
_PyErr_SetString (tstate , PyExc_SystemError ,
1442
1412
"bad BUILD_CONST_KEY_MAP keys argument" );
1443
- goto error ;
1413
+ goto error ; // Pop the keys and values.
1444
1414
}
1445
1415
map = _PyDict_FromItems (
1446
1416
& PyTuple_GET_ITEM (keys , 0 ), 1 ,
1447
- & PEEK (oparg + 1 ), 1 , oparg );
1448
- if (map == NULL ) {
1449
- goto error ;
1450
- }
1451
-
1452
- Py_DECREF (POP ());
1453
- while (oparg -- ) {
1454
- Py_DECREF (POP ());
1417
+ values , 1 , oparg );
1418
+ Py_DECREF (keys );
1419
+ for (int i = 0 ; i < oparg ; i ++ ) {
1420
+ Py_DECREF (values [i ]);
1455
1421
}
1456
- PUSH (map );
1422
+ ERROR_IF (map == NULL , error );
1457
1423
}
1458
1424
1459
1425
inst (DICT_UPDATE , (update -- )) {
0 commit comments