Construct GeneratorExpressionExit

Performance Diagrams

Construct GeneratorExpressionExit 0040000000400000008000000080000000120000000120000000160000000160000000200000000200000000240000000240000000280000000280000000320000000320000000CPython 2.7Nuitka (master)Nuitka (develop)Nuitka (factory)34792867488.11538461538461257.0CPython 2.7164553106240.03846153846155387.2419932637821Nuitka (master)164552854391.96153846153845387.2421722460896Nuitka (develop)164553150543.8846153846154387.24196201290295Nuitka (factory)Construct GeneratorExpressionExitTicks Construct GeneratorExpressionExit 0010000000100000002000000020000000300000003000000040000000400000005000000050000000600000006000000070000000700000008000000080000000CPython 3.5Nuitka (master)Nuitka (develop)Nuitka (factory)8266870388.95192307692307257.0CPython 3.566456194242.31730769230768305.46284327353465Nuitka (master)66452101395.6826923076923305.4750781729891Nuitka (develop)66452901549.0480769230769305.4726867926901Nuitka (factory)Construct GeneratorExpressionExitTicks

Source Code with Construct

def calledRepeatedly():
    # We measure making a generator iterator step or not.
    gen = (x for x in range(3))

    next(gen)

    # Take attribute lookup out of it, and built-in lookup too.
    throw = gen.throw
    exc = GeneratorExit

    try:
# construct_begin
        throw(exc)
# construct_alternative


    except exc:
        pass

    return throw, exc


import itertools
for x in itertools.repeat(None, 50000):
    calledRepeatedly()

print("OK.")

Source Code without Construct

def calledRepeatedly():
    # We measure making a generator iterator step or not.
    gen = (x for x in range(3))

    next(gen)

    # Take attribute lookup out of it, and built-in lookup too.
    throw = gen.throw
    exc = GeneratorExit

    try:
# construct_begin

# construct_alternative
        pass
# construct_end
    except exc:
        pass

    return throw, exc


import itertools
for x in itertools.repeat(None, 50000):
    calledRepeatedly()

print("OK.")

Context Diff of Source Code


Construct
Baseline
27     throw = gen.throw 27     throw = gen.throw
28     exc = GeneratorExit 28     exc = GeneratorExit
29 29
30     try: 30     try:
31 # construct_begin 31 # construct_begin
n 32         throw(exc) n 32  
33 # construct_alternative 33 # construct_alternative
t 34   t 34         pass
35   35 # construct_end
36     except exc: 36     except exc:
37         pass 37         pass
38 38
39     return throw, exc 39     return throw, exc
40 40

Context Diff of Generated Code


Construct
Baseline
57 static PyObject *const_str_digest_5ed1392909ad16e6227b8230f4582352; 57 static PyObject *const_str_digest_5ed1392909ad16e6227b8230f4582352;
58 static PyObject *const_str_plain_repeat; 58 static PyObject *const_str_plain_repeat;
59 static PyObject *const_tuple_str_digest_b9c4baf879ebd882d40843df3a4dead7_str_plain_x_tuple; 59 static PyObject *const_tuple_str_digest_b9c4baf879ebd882d40843df3a4dead7_str_plain_x_tuple;
60 static PyObject *const_tuple_none_int_pos_50000_tuple; 60 static PyObject *const_tuple_none_int_pos_50000_tuple;
61 extern PyObject *const_str_plain___main__; 61 extern PyObject *const_str_plain___main__;
n 62 static PyObject *const_tuple_type_GeneratorExit_tuple; n
63 extern PyObject *const_str_plain___doc__; 62 extern PyObject *const_str_plain___doc__;
64 extern PyObject *const_str_plain___cached__; 63 extern PyObject *const_str_plain___cached__;
65 static PyObject *const_str_plain___debug__; 64 static PyObject *const_str_plain___debug__;
66 static PyObject *module_filename_obj; 65 static PyObject *module_filename_obj;
67 66
96     PyTuple_SET_ITEM( const_tuple_str_digest_b9c4baf879ebd882d40843df3a4dead7_str_plain_x_tuple, 0, const_str_digest_b9c4baf879ebd882d40843df3a4dead7 ); Py_INCREF( const_str_digest_b9c4baf879ebd882d40843df3a4dead7 ); 95     PyTuple_SET_ITEM( const_tuple_str_digest_b9c4baf879ebd882d40843df3a4dead7_str_plain_x_tuple, 0, const_str_digest_b9c4baf879ebd882d40843df3a4dead7 ); Py_INCREF( const_str_digest_b9c4baf879ebd882d40843df3a4dead7 );
97     PyTuple_SET_ITEM( const_tuple_str_digest_b9c4baf879ebd882d40843df3a4dead7_str_plain_x_tuple, 1, const_str_plain_x ); Py_INCREF( const_str_plain_x ); 96     PyTuple_SET_ITEM( const_tuple_str_digest_b9c4baf879ebd882d40843df3a4dead7_str_plain_x_tuple, 1, const_str_plain_x ); Py_INCREF( const_str_plain_x );
98     const_tuple_none_int_pos_50000_tuple = PyTuple_New( 2 ); 97     const_tuple_none_int_pos_50000_tuple = PyTuple_New( 2 );
99     PyTuple_SET_ITEM( const_tuple_none_int_pos_50000_tuple, 0, Py_None ); Py_INCREF( Py_None ); 98     PyTuple_SET_ITEM( const_tuple_none_int_pos_50000_tuple, 0, Py_None ); Py_INCREF( Py_None );
100     PyTuple_SET_ITEM( const_tuple_none_int_pos_50000_tuple, 1, const_int_pos_50000 ); Py_INCREF( const_int_pos_50000 ); 99     PyTuple_SET_ITEM( const_tuple_none_int_pos_50000_tuple, 1, const_int_pos_50000 ); Py_INCREF( const_int_pos_50000 );
n 101     const_tuple_type_GeneratorExit_tuple = PyTuple_New( 1 ); n
102     PyTuple_SET_ITEM( const_tuple_type_GeneratorExit_tuple, 0, (PyObject *)PyExc_GeneratorExit ); Py_INCREF( (PyObject *)PyExc_GeneratorExit );
103     const_str_plain___debug__ = UNSTREAM_STRING_ASCII( &constant_bin[ 149 ], 9, 1 ); 100     const_str_plain___debug__ = UNSTREAM_STRING_ASCII( &constant_bin[ 149 ], 9, 1 );
104 101
105     constants_created = true; 102     constants_created = true;
106 } 103 }
107 104
146     NUITKA_MAY_BE_UNUSED bool had_error = ERROR_OCCURRED(); 143     NUITKA_MAY_BE_UNUSED bool had_error = ERROR_OCCURRED();
147 #endif 144 #endif
148 145
149     // Local variable declarations. 146     // Local variable declarations.
150     PyObject *var_gen = NULL; 147     PyObject *var_gen = NULL;
n 151     PyObject *var_exc = NULL; n
152     PyObject *var_throw = NULL; 148     PyObject *var_throw = NULL;
153     PyObject *tmp_genexpr_1__$0 = NULL; 149     PyObject *tmp_genexpr_1__$0 = NULL;
154     struct Nuitka_FrameObject *frame_1c611ddcc06665b79c4f60c8ac0a796d; 150     struct Nuitka_FrameObject *frame_1c611ddcc06665b79c4f60c8ac0a796d;
155     NUITKA_MAY_BE_UNUSED char const *type_description_1 = NULL; 151     NUITKA_MAY_BE_UNUSED char const *type_description_1 = NULL;
156     PyObject *exception_type = NULL; 152     PyObject *exception_type = NULL;
157     PyObject *exception_value = NULL; 153     PyObject *exception_value = NULL;
158     PyTracebackObject *exception_tb = NULL; 154     PyTracebackObject *exception_tb = NULL;
159     NUITKA_MAY_BE_UNUSED int exception_lineno = 0; 155     NUITKA_MAY_BE_UNUSED int exception_lineno = 0;
n n 156     static struct Nuitka_FrameObject *cache_frame_1c611ddcc06665b79c4f60c8ac0a796d = NULL;
157     PyObject *tmp_return_value = NULL;
160     PyObject *exception_keeper_type_1; 158     PyObject *exception_keeper_type_1;
161     PyObject *exception_keeper_value_1; 159     PyObject *exception_keeper_value_1;
162     PyTracebackObject *exception_keeper_tb_1; 160     PyTracebackObject *exception_keeper_tb_1;
163     NUITKA_MAY_BE_UNUSED int exception_keeper_lineno_1; 161     NUITKA_MAY_BE_UNUSED int exception_keeper_lineno_1;
n 164     PyObject *exception_preserved_type_1; n
165     PyObject *exception_preserved_value_1;
166     PyTracebackObject *exception_preserved_tb_1;
167     int tmp_res;
168     bool tmp_result;
169     PyObject *exception_keeper_type_2;
170     PyObject *exception_keeper_value_2;
171     PyTracebackObject *exception_keeper_tb_2;
172     NUITKA_MAY_BE_UNUSED int exception_keeper_lineno_2;
173     PyObject *tmp_return_value = NULL;
174     static struct Nuitka_FrameObject *cache_frame_1c611ddcc06665b79c4f60c8ac0a796d = NULL;
175     PyObject *exception_keeper_type_3;
176     PyObject *exception_keeper_value_3;
177     PyTracebackObject *exception_keeper_tb_3;
178     NUITKA_MAY_BE_UNUSED int exception_keeper_lineno_3;
179 162
180     // Actual function code. 163     // Actual function code.
181     { 164     {
182     PyObject *tmp_assign_source_1; 165     PyObject *tmp_assign_source_1;
183     { 166     {
261         { 244         {
262             FETCH_ERROR_OCCURRED( &exception_type, &exception_value, &exception_tb ); 245             FETCH_ERROR_OCCURRED( &exception_type, &exception_value, &exception_tb );
263         } 246         }
264 247
265 248
n 266         type_description_1 = "ooo"; n 249         type_description_1 = "oNo";
267         exception_lineno = 24; 250         exception_lineno = 24;
268         goto frame_exception_exit_1; 251         goto frame_exception_exit_1;
269     } 252     }
270     Py_DECREF( tmp_next_value_1 ); 253     Py_DECREF( tmp_next_value_1 );
271     } 254     }
281         exception_tb = NULL; 264         exception_tb = NULL;
282         NORMALIZE_EXCEPTION( &exception_type, &exception_value, &exception_tb ); 265         NORMALIZE_EXCEPTION( &exception_type, &exception_value, &exception_tb );
283         CHAIN_EXCEPTION( exception_value ); 266         CHAIN_EXCEPTION( exception_value );
284 267
285         exception_lineno = 27; 268         exception_lineno = 27;
n 286         type_description_1 = "ooo"; n 269         type_description_1 = "oNo";
287         goto frame_exception_exit_1; 270         goto frame_exception_exit_1;
288     } 271     }
289 272
290     tmp_source_name_1 = var_gen; 273     tmp_source_name_1 = var_gen;
291     tmp_assign_source_3 = LOOKUP_ATTRIBUTE( tmp_source_name_1, const_str_plain_throw ); 274     tmp_assign_source_3 = LOOKUP_ATTRIBUTE( tmp_source_name_1, const_str_plain_throw );
295 278
296         FETCH_ERROR_OCCURRED( &exception_type, &exception_value, &exception_tb ); 279         FETCH_ERROR_OCCURRED( &exception_type, &exception_value, &exception_tb );
297 280
298 281
299         exception_lineno = 27; 282         exception_lineno = 27;
n 300         type_description_1 = "ooo"; n 283         type_description_1 = "oNo";
301         goto frame_exception_exit_1; 284         goto frame_exception_exit_1;
302     } 285     }
303     assert( var_throw == NULL ); 286     assert( var_throw == NULL );
304     var_throw = tmp_assign_source_3; 287     var_throw = tmp_assign_source_3;
305 288
306     } 289     }
n 307     { n
308     PyObject *tmp_assign_source_4;
309     tmp_assign_source_4 = PyExc_GeneratorExit;
310     assert( var_exc == NULL );
311     Py_INCREF( tmp_assign_source_4 );
312     var_exc = tmp_assign_source_4;
313 290
n n 291 #if 0
292     RESTORE_FRAME_EXCEPTION( frame_1c611ddcc06665b79c4f60c8ac0a796d );
293 #endif
294  
295     // Put the previous frame back on top.
296     popFrameStack();
297  
298     goto frame_no_exception_1;
299  
300     frame_exception_exit_1:;
301  
302 #if 0
303     RESTORE_FRAME_EXCEPTION( frame_1c611ddcc06665b79c4f60c8ac0a796d );
304 #endif
305  
306     if ( exception_tb == NULL )
314     } 307     {
308         exception_tb = MAKE_TRACEBACK( frame_1c611ddcc06665b79c4f60c8ac0a796d, exception_lineno );
315     { 309     }
316     // Tried code: 310     else if ( exception_tb->tb_frame != &frame_1c611ddcc06665b79c4f60c8ac0a796d->m_frame )
311     {
312         exception_tb = ADD_TRACEBACK( exception_tb, frame_1c611ddcc06665b79c4f60c8ac0a796d, exception_lineno );
317     { 313     }
314  
315     // Attachs locals to frame if any.
316     Nuitka_Frame_AttachLocals(
317         (struct Nuitka_FrameObject *)frame_1c611ddcc06665b79c4f60c8ac0a796d,
318         type_description_1,
319         var_gen,
320         NULL,
321         var_throw
322     );
323  
324  
325     // Release cached frame.
326     if ( frame_1c611ddcc06665b79c4f60c8ac0a796d == cache_frame_1c611ddcc06665b79c4f60c8ac0a796d )
327     {
328         Py_DECREF( frame_1c611ddcc06665b79c4f60c8ac0a796d );
329     }
330     cache_frame_1c611ddcc06665b79c4f60c8ac0a796d = NULL;
331  
332     assertFrameObject( frame_1c611ddcc06665b79c4f60c8ac0a796d );
333  
334     // Put the previous frame back on top.
335     popFrameStack();
336  
337     // Return the error.
338     goto try_except_handler_2;
339  
340     frame_no_exception_1:;
341     {
318     PyObject *tmp_called_name_1; 342     PyObject *tmp_tuple_element_1;
319     PyObject *tmp_call_result_1;
320     CHECK_OBJECT( var_throw ); 343     CHECK_OBJECT( var_throw );
n 321     tmp_called_name_1 = var_throw; n 344     tmp_tuple_element_1 = var_throw;
322     frame_1c611ddcc06665b79c4f60c8ac0a796d->m_frame.f_lineno = 32; 345     tmp_return_value = PyTuple_New( 2 );
323     tmp_call_result_1 = CALL_FUNCTION_WITH_ARGS1( tmp_called_name_1, &PyTuple_GET_ITEM( const_tuple_type_GeneratorExit_tuple, 0 ) ); 346     Py_INCREF( tmp_tuple_element_1 );
324   347     PyTuple_SET_ITEM( tmp_return_value, 0, tmp_tuple_element_1 );
325     if ( tmp_call_result_1 == NULL ) 348     tmp_tuple_element_1 = PyExc_GeneratorExit;
349     Py_INCREF( tmp_tuple_element_1 );
350     PyTuple_SET_ITEM( tmp_return_value, 1, tmp_tuple_element_1 );
351     goto try_return_handler_2;
326     { 352     }
327         assert( ERROR_OCCURRED() ); 353     // tried codes exits in all cases
328   354     NUITKA_CANNOT_GET_HERE( __main__$$$function_1_calledRepeatedly );
329         FETCH_ERROR_OCCURRED( &exception_type, &exception_value, &exception_tb ); 355     return NULL;
330   356     // Return handler code:
331   357     try_return_handler_2:;
332         exception_lineno = 32;
333         type_description_1 = "ooo";
334         goto try_except_handler_3;
335     } 358     {
336     Py_DECREF( tmp_call_result_1 ); 359     Py_XDECREF( var_gen );
360     var_gen = NULL;
361  
362     }
337     } 363     {
338     goto try_end_1; 364     Py_XDECREF( var_throw );
365     var_throw = NULL;
366  
367     }
368     {
369     goto function_return_exit;
370     }
339     // Exception handler code: 371     // Exception handler code:
n 340     try_except_handler_3:; n 372     try_except_handler_2:;
341     exception_keeper_type_1 = exception_type; 373     exception_keeper_type_1 = exception_type;
342     exception_keeper_value_1 = exception_value; 374     exception_keeper_value_1 = exception_value;
343     exception_keeper_tb_1 = exception_tb; 375     exception_keeper_tb_1 = exception_tb;
344     exception_keeper_lineno_1 = exception_lineno; 376     exception_keeper_lineno_1 = exception_lineno;
345     exception_type = NULL; 377     exception_type = NULL;
346     exception_value = NULL; 378     exception_value = NULL;
347     exception_tb = NULL; 379     exception_tb = NULL;
348     exception_lineno = 0; 380     exception_lineno = 0;
349 381
350     { 382     {
n 351     // Preserve existing published exception. n
352     exception_preserved_type_1 = EXC_TYPE(PyThreadState_GET());
353     Py_XINCREF( exception_preserved_type_1 );
354     exception_preserved_value_1 = EXC_VALUE(PyThreadState_GET());
355     Py_XINCREF( exception_preserved_value_1 );
356     exception_preserved_tb_1 = (PyTracebackObject *)EXC_TRACEBACK(PyThreadState_GET());
357     Py_XINCREF( exception_preserved_tb_1 );
358  
359     }
360     {
361     if ( exception_keeper_tb_1 == NULL )
362     {
363         exception_keeper_tb_1 = MAKE_TRACEBACK( frame_1c611ddcc06665b79c4f60c8ac0a796d, exception_keeper_lineno_1 );
364     }
365     else if ( exception_keeper_lineno_1 != 0 )
366     {
367         exception_keeper_tb_1 = ADD_TRACEBACK( exception_keeper_tb_1, frame_1c611ddcc06665b79c4f60c8ac0a796d, exception_keeper_lineno_1 );
368     }
369  
370     NORMALIZE_EXCEPTION( &exception_keeper_type_1, &exception_keeper_value_1, &exception_keeper_tb_1 );
371     PyException_SetTraceback( exception_keeper_value_1, (PyObject *)exception_keeper_tb_1 );
372     PUBLISH_EXCEPTION( &exception_keeper_type_1, &exception_keeper_value_1, &exception_keeper_tb_1 );
373     }
374     {
375     // Tried code:
376     {
377     nuitka_bool tmp_condition_result_1;
378     PyObject *tmp_operand_name_1;
379     PyObject *tmp_compexpr_left_1;
380     PyObject *tmp_compexpr_right_1;
381     tmp_compexpr_left_1 = EXC_TYPE(PyThreadState_GET());
382     if ( var_exc == NULL )
383     {
384  
385         exception_type = PyExc_UnboundLocalError;
386         Py_INCREF( exception_type );
387         exception_value = PyUnicode_FromFormat( "local variable '%s' referenced before assignment", "exc" );
388         exception_tb = NULL;
389         NORMALIZE_EXCEPTION( &exception_type, &exception_value, &exception_tb );
390         CHAIN_EXCEPTION( exception_value );
391  
392         exception_lineno = 36;
393         type_description_1 = "ooo";
394         goto try_except_handler_4;
395     }
396  
397     tmp_compexpr_right_1 = var_exc;
398     tmp_res = EXCEPTION_MATCH_BOOL( tmp_compexpr_left_1, tmp_compexpr_right_1 );
399     if ( tmp_res == -1 )
400     {
401         assert( ERROR_OCCURRED() );
402  
403         FETCH_ERROR_OCCURRED( &exception_type, &exception_value, &exception_tb );
404  
405  
406         exception_lineno = 36;
407         type_description_1 = "ooo";
408         goto try_except_handler_4;
409     }
410     tmp_operand_name_1 = ( tmp_res != 0 ) ? Py_True : Py_False;
411     tmp_res = CHECK_IF_TRUE( tmp_operand_name_1 );
412     if ( tmp_res == -1 )
413     {
414         assert( ERROR_OCCURRED() );
415  
416         FETCH_ERROR_OCCURRED( &exception_type, &exception_value, &exception_tb );
417  
418  
419         exception_lineno = 36;
420         type_description_1 = "ooo";
421         goto try_except_handler_4;
422     }
423     tmp_condition_result_1 = ( tmp_res == 0 ) ? NUITKA_BOOL_TRUE : NUITKA_BOOL_FALSE;
424     if ( tmp_condition_result_1 == NUITKA_BOOL_TRUE )
425     {
426         goto branch_yes_1;
427     }
428     else
429     {
430         goto branch_no_1;
431     }
432     branch_yes_1:;
433     {
434     tmp_result = RERAISE_EXCEPTION( &exception_type, &exception_value, &exception_tb );
435     if (unlikely( tmp_result == false ))
436     {
437         exception_lineno = 30;
438     }
439  
440     if (exception_tb && exception_tb->tb_frame == &frame_1c611ddcc06665b79c4f60c8ac0a796d->m_frame) frame_1c611ddcc06665b79c4f60c8ac0a796d->m_frame.f_lineno = exception_tb->tb_lineno;
441     type_description_1 = "ooo";
442     goto try_except_handler_4;
443     }
444     branch_no_1:;
445     }
446     goto try_end_2;
447     // Exception handler code:
448     try_except_handler_4:;
449     exception_keeper_type_2 = exception_type;
450     exception_keeper_value_2 = exception_value;
451     exception_keeper_tb_2 = exception_tb;
452     exception_keeper_lineno_2 = exception_lineno;
453     exception_type = NULL;
454     exception_value = NULL;
455     exception_tb = NULL;
456     exception_lineno = 0;
457  
458     {
459     // Restore previous exception.
460     SET_CURRENT_EXCEPTION( exception_preserved_type_1, exception_preserved_value_1, exception_preserved_tb_1 );
461     }
462     {
463     // Re-raise.
464     exception_type = exception_keeper_type_2;
465     exception_value = exception_keeper_value_2;
466     exception_tb = exception_keeper_tb_2;
467     exception_lineno = exception_keeper_lineno_2;
468  
469     goto frame_exception_exit_1;
470     }
471     // End of try:
472     try_end_2:;
473     }
474     {
475     // Restore previous exception.
476     SET_CURRENT_EXCEPTION( exception_preserved_type_1, exception_preserved_value_1, exception_preserved_tb_1 );
477     }
478     goto try_end_1;
479     // exception handler codes exits in all cases
480     NUITKA_CANNOT_GET_HERE( __main__$$$function_1_calledRepeatedly );
481     return NULL;
482     // End of try:
483     try_end_1:;
484     }
485     {
486     PyObject *tmp_tuple_element_1;
487     if ( var_throw == NULL )
488     {
489  
490         exception_type = PyExc_UnboundLocalError;
491         Py_INCREF( exception_type );
492         exception_value = PyUnicode_FromFormat( "local variable '%s' referenced before assignment", "throw" );
493         exception_tb = NULL;
494         NORMALIZE_EXCEPTION( &exception_type, &exception_value, &exception_tb );
495         CHAIN_EXCEPTION( exception_value );
496  
497         exception_lineno = 39;
498         type_description_1 = "ooo";
499         goto frame_exception_exit_1;
500     }
501  
502     tmp_tuple_element_1 = var_throw;
503     tmp_return_value = PyTuple_New( 2 );
504     Py_INCREF( tmp_tuple_element_1 );
505     PyTuple_SET_ITEM( tmp_return_value, 0, tmp_tuple_element_1 );
506     if ( var_exc == NULL )
507     {
508         Py_DECREF( tmp_return_value );
509         exception_type = PyExc_UnboundLocalError;
510         Py_INCREF( exception_type );
511         exception_value = PyUnicode_FromFormat( "local variable '%s' referenced before assignment", "exc" );
512         exception_tb = NULL;
513         NORMALIZE_EXCEPTION( &exception_type, &exception_value, &exception_tb );
514         CHAIN_EXCEPTION( exception_value );
515  
516         exception_lineno = 39;
517         type_description_1 = "ooo";
518         goto frame_exception_exit_1;
519     }
520  
521     tmp_tuple_element_1 = var_exc;
522     Py_INCREF( tmp_tuple_element_1 );
523     PyTuple_SET_ITEM( tmp_return_value, 1, tmp_tuple_element_1 );
524     goto frame_return_exit_1;
525     }
526  
527 #if 0
528     RESTORE_FRAME_EXCEPTION( frame_1c611ddcc06665b79c4f60c8ac0a796d );
529 #endif
530  
531     // Put the previous frame back on top.
532     popFrameStack();
533  
534     goto frame_no_exception_1;
535  
536     frame_return_exit_1:;
537 #if 0
538     RESTORE_FRAME_EXCEPTION( frame_1c611ddcc06665b79c4f60c8ac0a796d );
539 #endif
540  
541     // Put the previous frame back on top.
542     popFrameStack();
543  
544     goto try_return_handler_2;
545  
546     frame_exception_exit_1:;
547  
548 #if 0
549     RESTORE_FRAME_EXCEPTION( frame_1c611ddcc06665b79c4f60c8ac0a796d );
550 #endif
551  
552     if ( exception_tb == NULL )
553     {
554         exception_tb = MAKE_TRACEBACK( frame_1c611ddcc06665b79c4f60c8ac0a796d, exception_lineno );
555     }
556     else if ( exception_tb->tb_frame != &frame_1c611ddcc06665b79c4f60c8ac0a796d->m_frame )
557     {
558         exception_tb = ADD_TRACEBACK( exception_tb, frame_1c611ddcc06665b79c4f60c8ac0a796d, exception_lineno );
559     }
560  
561     // Attachs locals to frame if any.
562     Nuitka_Frame_AttachLocals(
563         (struct Nuitka_FrameObject *)frame_1c611ddcc06665b79c4f60c8ac0a796d,
564         type_description_1,
565         var_gen,
566         var_exc,
567         var_throw
568     );
569  
570  
571     // Release cached frame.
572     if ( frame_1c611ddcc06665b79c4f60c8ac0a796d == cache_frame_1c611ddcc06665b79c4f60c8ac0a796d )
573     {
574         Py_DECREF( frame_1c611ddcc06665b79c4f60c8ac0a796d );
575     }
576     cache_frame_1c611ddcc06665b79c4f60c8ac0a796d = NULL;
577  
578     assertFrameObject( frame_1c611ddcc06665b79c4f60c8ac0a796d );
579  
580     // Put the previous frame back on top.
581     popFrameStack();
582  
583     // Return the error.
584     goto try_except_handler_2;
585  
586     frame_no_exception_1:;
587     // tried codes exits in all cases
588     NUITKA_CANNOT_GET_HERE( __main__$$$function_1_calledRepeatedly );
589     return NULL;
590     // Return handler code:
591     try_return_handler_2:;
592     {
593     Py_XDECREF( var_gen ); 383     Py_XDECREF( var_gen );
594     var_gen = NULL; 384     var_gen = NULL;
595 385
596     } 386     }
597     { 387     {
n 598     Py_XDECREF( var_exc ); n
599     var_exc = NULL;
600  
601     }
602     {
603     Py_XDECREF( var_throw );
604     var_throw = NULL;
605  
606     }
607     {
608     goto function_return_exit;
609     }
610     // Exception handler code:
611     try_except_handler_2:;
612     exception_keeper_type_3 = exception_type;
613     exception_keeper_value_3 = exception_value;
614     exception_keeper_tb_3 = exception_tb;
615     exception_keeper_lineno_3 = exception_lineno;
616     exception_type = NULL;
617     exception_value = NULL;
618     exception_tb = NULL;
619     exception_lineno = 0;
620  
621     {
622     Py_XDECREF( var_gen );
623     var_gen = NULL;
624  
625     }
626     {
627     Py_XDECREF( var_exc );
628     var_exc = NULL;
629  
630     }
631     {
632     Py_XDECREF( var_throw );
633     var_throw = NULL;
634  
635     }
636     {
637     // Re-raise. 388     // Re-raise.
t 638     exception_type = exception_keeper_type_3; t 389     exception_type = exception_keeper_type_1;
639     exception_value = exception_keeper_value_3; 390     exception_value = exception_keeper_value_1;
640     exception_tb = exception_keeper_tb_3; 391     exception_tb = exception_keeper_tb_1;
641     exception_lineno = exception_keeper_lineno_3; 392     exception_lineno = exception_keeper_lineno_1;
642 393
643     goto function_exception_exit; 394     goto function_exception_exit;
644     } 395     }
645     // End of try: 396     // End of try:
646     } 397     }