@@ -1158,6 +1158,8 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
1158
1158
|| opcode == Pyc::POP_JUMP_IF_TRUE_A;
1159
1159
1160
1160
int offs = operand;
1161
+ if (mod->verCompare (3 , 10 ) >= 0 )
1162
+ offs *= sizeof (uint16_t ); // // BPO-27129
1161
1163
if (opcode == Pyc::JUMP_IF_FALSE_A
1162
1164
|| opcode == Pyc::JUMP_IF_TRUE_A) {
1163
1165
/* Offset is relative in these cases */
@@ -1240,7 +1242,11 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
1240
1242
break ;
1241
1243
case Pyc::JUMP_ABSOLUTE_A:
1242
1244
{
1243
- if (operand < pos) {
1245
+ int offs = operand;
1246
+ if (mod->verCompare (3 , 10 ) >= 0 )
1247
+ offs *= sizeof (uint16_t ); // // BPO-27129
1248
+
1249
+ if (offs < pos) {
1244
1250
if (curblock->blktype () == ASTBlock::BLK_FOR
1245
1251
&& curblock.cast <ASTIterBlock>()->isComprehension ()) {
1246
1252
PycRef<ASTNode> top = stack.top ();
@@ -1339,13 +1345,17 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
1339
1345
break ;
1340
1346
case Pyc::JUMP_FORWARD_A:
1341
1347
{
1348
+ int offs = operand;
1349
+ if (mod->verCompare (3 , 10 ) >= 0 )
1350
+ offs *= sizeof (uint16_t ); // // BPO-27129
1351
+
1342
1352
if (curblock->blktype () == ASTBlock::BLK_CONTAINER) {
1343
1353
PycRef<ASTContainerBlock> cont = curblock.cast <ASTContainerBlock>();
1344
1354
if (cont->hasExcept ()) {
1345
1355
stack_hist.push (stack);
1346
1356
1347
- curblock->setEnd (pos+operand );
1348
- PycRef<ASTBlock> except = new ASTCondBlock (ASTBlock::BLK_EXCEPT, pos+operand , NULL , false );
1357
+ curblock->setEnd (pos+offs );
1358
+ PycRef<ASTBlock> except = new ASTCondBlock (ASTBlock::BLK_EXCEPT, pos+offs , NULL , false );
1349
1359
except->init ();
1350
1360
blocks.push (except);
1351
1361
curblock = blocks.top ();
@@ -1381,31 +1391,31 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
1381
1391
1382
1392
if (prev->blktype () == ASTBlock::BLK_IF
1383
1393
|| prev->blktype () == ASTBlock::BLK_ELIF) {
1384
- if (operand == 0 ) {
1394
+ if (offs == 0 ) {
1385
1395
prev = nil;
1386
1396
continue ;
1387
1397
}
1388
1398
1389
1399
if (push) {
1390
1400
stack_hist.push (stack);
1391
1401
}
1392
- PycRef<ASTBlock> next = new ASTBlock (ASTBlock::BLK_ELSE, pos+operand );
1402
+ PycRef<ASTBlock> next = new ASTBlock (ASTBlock::BLK_ELSE, pos+offs );
1393
1403
if (prev->inited () == ASTCondBlock::PRE_POPPED) {
1394
1404
next->init (ASTCondBlock::PRE_POPPED);
1395
1405
}
1396
1406
1397
1407
blocks.push (next.cast <ASTBlock>());
1398
1408
prev = nil;
1399
1409
} else if (prev->blktype () == ASTBlock::BLK_EXCEPT) {
1400
- if (operand == 0 ) {
1410
+ if (offs == 0 ) {
1401
1411
prev = nil;
1402
1412
continue ;
1403
1413
}
1404
1414
1405
1415
if (push) {
1406
1416
stack_hist.push (stack);
1407
1417
}
1408
- PycRef<ASTBlock> next = new ASTCondBlock (ASTBlock::BLK_EXCEPT, pos+operand , NULL , false );
1418
+ PycRef<ASTBlock> next = new ASTCondBlock (ASTBlock::BLK_EXCEPT, pos+offs , NULL , false );
1409
1419
next->init ();
1410
1420
1411
1421
blocks.push (next.cast <ASTBlock>());
@@ -1424,7 +1434,7 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
1424
1434
prev = nil;
1425
1435
}
1426
1436
} else if (prev->blktype () == ASTBlock::BLK_TRY
1427
- && prev->end () < pos+operand ) {
1437
+ && prev->end () < pos+offs ) {
1428
1438
/* Need to add an except/finally block */
1429
1439
stack = stack_hist.top ();
1430
1440
stack.pop ();
@@ -1436,7 +1446,7 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
1436
1446
stack_hist.push (stack);
1437
1447
}
1438
1448
1439
- PycRef<ASTBlock> except = new ASTCondBlock (ASTBlock::BLK_EXCEPT, pos+operand , NULL , false );
1449
+ PycRef<ASTBlock> except = new ASTCondBlock (ASTBlock::BLK_EXCEPT, pos+offs , NULL , false );
1440
1450
except->init ();
1441
1451
blocks.push (except);
1442
1452
}
@@ -1453,7 +1463,7 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
1453
1463
curblock = blocks.top ();
1454
1464
1455
1465
if (curblock->blktype () == ASTBlock::BLK_EXCEPT) {
1456
- curblock->setEnd (pos+operand );
1466
+ curblock->setEnd (pos+offs );
1457
1467
}
1458
1468
}
1459
1469
break ;
0 commit comments