@@ -9613,8 +9613,8 @@ unpack_instruction(PyObject *instr, int *label, int *opcode, int *oparg,
9613
9613
return 0 ;
9614
9614
}
9615
9615
9616
- static basicblock *
9617
- instructions_to_cfg (PyObject * instructions )
9616
+ static int
9617
+ instructions_to_cfg (PyObject * instructions , cfg_builder * g )
9618
9618
{
9619
9619
assert (PyList_Check (instructions ));
9620
9620
@@ -9623,16 +9623,17 @@ instructions_to_cfg(PyObject *instructions)
9623
9623
basicblock * * label2block = (basicblock * * )PyMem_Malloc (sizeof (basicblock * ) * max_labels );
9624
9624
if (!label2block ) {
9625
9625
PyErr_NoMemory ();
9626
+ return -1 ;
9626
9627
}
9627
9628
memset (label2block , 0 , sizeof (basicblock * ) * max_labels );
9628
9629
9629
- basicblock * entryblock = new_basicblock ();
9630
- if (entryblock == NULL ) {
9630
+ g -> block_list = NULL ;
9631
+ basicblock * block = cfg_builder_new_block (g );
9632
+ if (block == NULL ) {
9631
9633
goto error ;
9632
9634
}
9633
- basicblock * current_block = entryblock ;
9635
+ g -> curblock = g -> cfg_entryblock = block ;
9634
9636
9635
- bool start_new_block = false;
9636
9637
for (Py_ssize_t i = 0 ; i < num_insts ; i ++ ) {
9637
9638
PyObject * instr_tuple = PyList_GET_ITEM (instructions , i );
9638
9639
int label , opcode , oparg , target ;
@@ -9642,7 +9643,7 @@ instructions_to_cfg(PyObject *instructions)
9642
9643
}
9643
9644
if (label >= max_labels || target >= max_labels ) {
9644
9645
PyErr_SetString (PyExc_ValueError , "label is out of range" );
9645
- return NULL ;
9646
+ goto error ;
9646
9647
}
9647
9648
basicblock * new_block = NULL ;
9648
9649
if (label > 0 && label2block [label ] != NULL ) {
@@ -9652,44 +9653,37 @@ instructions_to_cfg(PyObject *instructions)
9652
9653
*/
9653
9654
assert (new_block -> b_iused == 0 );
9654
9655
}
9655
- else if (start_new_block || label > 0 ) {
9656
- new_block = new_basicblock ( );
9656
+ else if (label > 0 ) {
9657
+ new_block = cfg_builder_new_block ( g );
9657
9658
if (new_block == NULL ) {
9658
9659
goto error ;
9659
9660
}
9660
- if (label > 0 ) {
9661
- assert (label < max_labels );
9662
- label2block [label ] = new_block ;
9663
- }
9661
+ assert (label < max_labels );
9662
+ label2block [label ] = new_block ;
9664
9663
}
9665
9664
if (new_block ) {
9666
- current_block -> b_next = new_block ;
9667
- current_block = new_block ;
9668
- start_new_block = false;
9665
+ cfg_builder_use_next_block (g , new_block );
9669
9666
}
9670
9667
basicblock * target_block = NULL ;
9671
9668
if (target > 0 ) {
9672
9669
target_block = label2block [target ];
9673
9670
if (target_block == NULL ) {
9674
- target_block = new_basicblock ( );
9671
+ target_block = cfg_builder_new_block ( g );
9675
9672
if (target_block == NULL ) {
9676
9673
goto error ;
9677
9674
}
9678
9675
label2block [target ] = target_block ;
9679
9676
}
9680
9677
}
9681
- if (!basicblock_addop ( current_block , opcode , oparg , target_block , & loc )) {
9678
+ if (!cfg_builder_addop ( g , opcode , oparg , target_block , loc )) {
9682
9679
goto error ;
9683
9680
}
9684
- if (IS_TERMINATOR_OPCODE (opcode )) {
9685
- start_new_block = true;
9686
- }
9687
9681
}
9688
9682
PyMem_Free (label2block );
9689
- return entryblock ;
9683
+ return 0 ;
9690
9684
error :
9691
9685
PyMem_Free (label2block );
9692
- return NULL ;
9686
+ return -1 ;
9693
9687
}
9694
9688
9695
9689
static PyObject *
@@ -9742,16 +9736,20 @@ _PyCompile_OptimizeCfg(PyObject *instructions, PyObject *consts)
9742
9736
if (const_cache == NULL ) {
9743
9737
return NULL ;
9744
9738
}
9745
- basicblock * entryblock = instructions_to_cfg (instructions );
9746
- if (optimize_cfg (entryblock , consts , const_cache )) {
9739
+ cfg_builder g ;
9740
+ instructions_to_cfg (instructions , & g );
9741
+
9742
+ if (optimize_cfg (g .cfg_entryblock , consts , const_cache )) {
9747
9743
goto error ;
9748
9744
}
9749
- PyObject * optimized_instructions = cfg_to_instructions (entryblock );
9745
+ PyObject * optimized_instructions = cfg_to_instructions (g . cfg_entryblock );
9750
9746
if (optimized_instructions == NULL ) {
9751
9747
goto error ;
9752
9748
}
9749
+ cfg_builder_free (& g );
9753
9750
return PyTuple_Pack (2 , optimized_instructions , consts );
9754
9751
error :
9752
+ cfg_builder_free (& g );
9755
9753
return NULL ;
9756
9754
}
9757
9755
0 commit comments