Construct GeneratorExit

Performance Diagrams

Construct GeneratorExit 002000000020000000400000004000000060000000600000008000000080000000100000000100000000120000000120000000140000000140000000160000000160000000180000000180000000200000000200000000220000000220000000240000000240000000260000000260000000280000000280000000300000000300000000CPython 2.7Nuitka (historic)Nuitka (master)Nuitka (develop)Nuitka (factory)31351282472.9230769230769257.0CPython 2.70194.46153846153845504.11538461538464Nuitka (historic)166053883316.0373.2292899386863Nuitka (master)160354324437.53846153846143377.72176554607347Nuitka (develop)160354528559.0769230769231377.72160475029546Nuitka (factory)Construct GeneratorExitTicks Construct GeneratorExit 0010000000100000002000000020000000300000003000000040000000400000005000000050000000600000006000000070000000700000008000000080000000CPython 3.5Nuitka (historic)Nuitka (master)Nuitka (develop)Nuitka (factory)8177097973.61538461538461257.0CPython 3.50196.30769230769232504.11538461538464Nuitka (historic)74401840319.0000000000001279.26985222066656Nuitka (master)66913402441.69230769230774301.90023110531297Nuitka (develop)66908116564.3846153846155301.9162056226668Nuitka (factory)Construct GeneratorExitTicks

Source Code with Construct

def calledRepeatedly():
    # We measure making a generator iterator step or not.
    def generator():
        yield 1
        yield 2
        yield 3

    gen = generator()

    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


for x in xrange(50000):
    calledRepeatedly()

print("OK.")

Source Code without Construct

def calledRepeatedly():
    # We measure making a generator iterator step or not.
    def generator():
        yield 1
        yield 2
        yield 3

    gen = generator()

    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


for x in xrange(50000):
    calledRepeatedly()

print("OK.")

Context Diff of Source Code


Construct
Baseline
32     throw = gen.throw 32     throw = gen.throw
33     exc = GeneratorExit 33     exc = GeneratorExit
34 34
35     try: 35     try:
36 # construct_begin 36 # construct_begin
n 37         throw(exc) n 37  
38 # construct_alternative 38 # construct_alternative
t 39   t 39         pass
40   40 # construct_end
41     except exc: 41     except exc:
42         pass 42         pass
43 43
44     return throw, exc 44     return throw, exc
45 45

Context Diff of Generated Code


Construct
Baseline
134 134
135     // Local variable declarations. 135     // Local variable declarations.
136     PyObject *var_generator = NULL; 136     PyObject *var_generator = NULL;
137     PyObject *var_gen = NULL; 137     PyObject *var_gen = NULL;
138     PyObject *var_throw = NULL; 138     PyObject *var_throw = NULL;
n 139     PyObject *var_exc = NULL; n
140     PyObject *exception_type = NULL, *exception_value = NULL; 139     PyObject *exception_type = NULL, *exception_value = NULL;
141     PyTracebackObject *exception_tb = NULL; 140     PyTracebackObject *exception_tb = NULL;
142     NUITKA_MAY_BE_UNUSED int exception_lineno = -1; 141     NUITKA_MAY_BE_UNUSED int exception_lineno = -1;
143     PyObject *exception_keeper_type_1; 142     PyObject *exception_keeper_type_1;
144     PyObject *exception_keeper_value_1; 143     PyObject *exception_keeper_value_1;
145     PyTracebackObject *exception_keeper_tb_1; 144     PyTracebackObject *exception_keeper_tb_1;
146     NUITKA_MAY_BE_UNUSED int exception_keeper_lineno_1; 145     NUITKA_MAY_BE_UNUSED int exception_keeper_lineno_1;
n 147     PyObject *exception_keeper_type_2; n
148     PyObject *exception_keeper_value_2;
149     PyTracebackObject *exception_keeper_tb_2;
150     NUITKA_MAY_BE_UNUSED int exception_keeper_lineno_2;
151     PyObject *exception_keeper_type_3;
152     PyObject *exception_keeper_value_3;
153     PyTracebackObject *exception_keeper_tb_3;
154     NUITKA_MAY_BE_UNUSED int exception_keeper_lineno_3;
155     PyObject *exception_preserved_type_1;
156     PyObject *exception_preserved_value_1;
157     PyTracebackObject *exception_preserved_tb_1;
158     PyObject *tmp_args_element_name_1;
159     PyObject *tmp_assign_source_1; 146     PyObject *tmp_assign_source_1;
160     PyObject *tmp_assign_source_2; 147     PyObject *tmp_assign_source_2;
161     PyObject *tmp_assign_source_3; 148     PyObject *tmp_assign_source_3;
n 162     PyObject *tmp_assign_source_4; n
163     PyObject *tmp_called_name_1; 149     PyObject *tmp_called_name_1;
n 164     PyObject *tmp_called_name_2; n
165     PyObject *tmp_compare_left_1;
166     PyObject *tmp_compare_right_1;
167     int tmp_exc_match_exception_match_1;
168     PyObject *tmp_return_value; 150     PyObject *tmp_return_value;
169     PyObject *tmp_source_name_1; 151     PyObject *tmp_source_name_1;
170     PyObject *tmp_tuple_element_1; 152     PyObject *tmp_tuple_element_1;
171     NUITKA_MAY_BE_UNUSED PyObject *tmp_unused; 153     NUITKA_MAY_BE_UNUSED PyObject *tmp_unused;
172     PyObject *tmp_value_name_1; 154     PyObject *tmp_value_name_1;
181     tmp_assign_source_1 = MAKE_FUNCTION___main__$$$function_1_calledRepeatedly$$$function_1_generator(  ); 163     tmp_assign_source_1 = MAKE_FUNCTION___main__$$$function_1_calledRepeatedly$$$function_1_generator(  );
182     assert( var_generator == NULL ); 164     assert( var_generator == NULL );
183     var_generator = tmp_assign_source_1; 165     var_generator = tmp_assign_source_1;
184 166
185     // Tried code: 167     // Tried code:
n 186     MAKE_OR_REUSE_FRAME( cache_frame_a84667b37b1c2ca7fbd839bafbf16317, codeobj_a84667b37b1c2ca7fbd839bafbf16317, module___main__, sizeof(PyObject *)+sizeof(PyObject *)+sizeof(PyObject *)+sizeof(PyObject *) ); n 168     MAKE_OR_REUSE_FRAME( cache_frame_a84667b37b1c2ca7fbd839bafbf16317, codeobj_a84667b37b1c2ca7fbd839bafbf16317, module___main__, sizeof(void *)+sizeof(PyObject *)+sizeof(PyObject *)+sizeof(PyObject *) );
187     frame_a84667b37b1c2ca7fbd839bafbf16317 = cache_frame_a84667b37b1c2ca7fbd839bafbf16317; 169     frame_a84667b37b1c2ca7fbd839bafbf16317 = cache_frame_a84667b37b1c2ca7fbd839bafbf16317;
188 170
189     // Push the new frame as the currently active one. 171     // Push the new frame as the currently active one.
190     pushFrameStack( frame_a84667b37b1c2ca7fbd839bafbf16317 ); 172     pushFrameStack( frame_a84667b37b1c2ca7fbd839bafbf16317 );
191 173
204 186
205         FETCH_ERROR_OCCURRED( &exception_type, &exception_value, &exception_tb ); 187         FETCH_ERROR_OCCURRED( &exception_type, &exception_value, &exception_tb );
206 188
207 189
208         exception_lineno = 27; 190         exception_lineno = 27;
n 209         type_description = "oooo"; n 191         type_description = "oooN";
210         goto frame_exception_exit_1; 192         goto frame_exception_exit_1;
211     } 193     }
212     assert( var_gen == NULL ); 194     assert( var_gen == NULL );
213     var_gen = tmp_assign_source_2; 195     var_gen = tmp_assign_source_2;
214 196
229         { 211         {
230             FETCH_ERROR_OCCURRED( &exception_type, &exception_value, &exception_tb ); 212             FETCH_ERROR_OCCURRED( &exception_type, &exception_value, &exception_tb );
231         } 213         }
232 214
233 215
n 234         type_description = "oooo"; n 216         type_description = "oooN";
235         exception_lineno = 29; 217         exception_lineno = 29;
236         goto frame_exception_exit_1; 218         goto frame_exception_exit_1;
237     } 219     }
238     Py_DECREF( tmp_unused ); 220     Py_DECREF( tmp_unused );
239     tmp_source_name_1 = var_gen; 221     tmp_source_name_1 = var_gen;
247         exception_tb = NULL; 229         exception_tb = NULL;
248         NORMALIZE_EXCEPTION( &exception_type, &exception_value, &exception_tb ); 230         NORMALIZE_EXCEPTION( &exception_type, &exception_value, &exception_tb );
249         CHAIN_EXCEPTION( exception_value ); 231         CHAIN_EXCEPTION( exception_value );
250 232
251         exception_lineno = 32; 233         exception_lineno = 32;
n 252         type_description = "oooo"; n 234         type_description = "oooN";
253         goto frame_exception_exit_1; 235         goto frame_exception_exit_1;
254     } 236     }
255 237
256     tmp_assign_source_3 = LOOKUP_ATTRIBUTE( tmp_source_name_1, const_str_plain_throw ); 238     tmp_assign_source_3 = LOOKUP_ATTRIBUTE( tmp_source_name_1, const_str_plain_throw );
257     if ( tmp_assign_source_3 == NULL ) 239     if ( tmp_assign_source_3 == NULL )
260 242
261         FETCH_ERROR_OCCURRED( &exception_type, &exception_value, &exception_tb ); 243         FETCH_ERROR_OCCURRED( &exception_type, &exception_value, &exception_tb );
262 244
263 245
264         exception_lineno = 32; 246         exception_lineno = 32;
n 265         type_description = "oooo"; n 247         type_description = "oooN";
266         goto frame_exception_exit_1; 248         goto frame_exception_exit_1;
267     } 249     }
268     assert( var_throw == NULL ); 250     assert( var_throw == NULL );
269     var_throw = tmp_assign_source_3; 251     var_throw = tmp_assign_source_3;
270 252
n 271     tmp_assign_source_4 = PyExc_GeneratorExit; n
272     assert( var_exc == NULL );
273     Py_INCREF( tmp_assign_source_4 );
274     var_exc = tmp_assign_source_4;
275 253
n 276     // Tried code: n 254 #if 0
277     tmp_called_name_2 = var_throw; 255     RESTORE_FRAME_EXCEPTION( frame_a84667b37b1c2ca7fbd839bafbf16317 );
256 #endif
278 257
n 279     CHECK_OBJECT( tmp_called_name_2 ); n 258     // Put the previous frame back on top.
280     tmp_args_element_name_1 = PyExc_GeneratorExit; 259     popFrameStack();
281     frame_a84667b37b1c2ca7fbd839bafbf16317->m_frame.f_lineno = 37; 260  
282     { 261     goto frame_no_exception_1;
283         PyObject *call_args[] = { tmp_args_element_name_1 }; 262  
284         tmp_unused = CALL_FUNCTION_WITH_ARGS1( tmp_called_name_2, call_args ); 263     frame_exception_exit_1:;
264  
265 #if 0
266     RESTORE_FRAME_EXCEPTION( frame_a84667b37b1c2ca7fbd839bafbf16317 );
267 #endif
268  
269     if ( exception_tb == NULL )
285     } 270     {
286   271         exception_tb = MAKE_TRACEBACK( frame_a84667b37b1c2ca7fbd839bafbf16317, exception_lineno );
287     if ( tmp_unused == NULL )
288     { 272     }
289         assert( ERROR_OCCURRED() ); 273     else if ( exception_tb->tb_frame != &frame_a84667b37b1c2ca7fbd839bafbf16317->m_frame )
274     {
275         exception_tb = ADD_TRACEBACK( exception_tb, frame_a84667b37b1c2ca7fbd839bafbf16317, exception_lineno );
276     }
290 277
n 291         FETCH_ERROR_OCCURRED( &exception_type, &exception_value, &exception_tb ); n 278     Nuitka_Frame_AttachLocals( (struct Nuitka_FrameObject *)frame_a84667b37b1c2ca7fbd839bafbf16317, type_description ,var_generator, var_gen, var_throw, NULL );
292 279
n n 280     // Release cached frame.
281     if ( frame_a84667b37b1c2ca7fbd839bafbf16317 == cache_frame_a84667b37b1c2ca7fbd839bafbf16317 )
282     {
283         Py_DECREF( frame_a84667b37b1c2ca7fbd839bafbf16317 );
284     }
285     cache_frame_a84667b37b1c2ca7fbd839bafbf16317 = NULL;
293 286
n 294         exception_lineno = 37; n 287     assertFrameObject( frame_a84667b37b1c2ca7fbd839bafbf16317 );
295         type_description = "oooo"; 288  
289  
290     // Put the previous frame back on top.
291     popFrameStack();
292  
293     // Return the error.
296         goto try_except_handler_2; 294     goto try_except_handler_1;
297     } 295  
298     Py_DECREF( tmp_unused ); 296     frame_no_exception_1:;
297  
298     tmp_return_value = PyTuple_New( 2 );
299     tmp_tuple_element_1 = var_throw;
300  
301     CHECK_OBJECT( tmp_tuple_element_1 );
302     Py_INCREF( tmp_tuple_element_1 );
303     PyTuple_SET_ITEM( tmp_return_value, 0, tmp_tuple_element_1 );
304     tmp_tuple_element_1 = PyExc_GeneratorExit;
305     Py_INCREF( tmp_tuple_element_1 );
306     PyTuple_SET_ITEM( tmp_return_value, 1, tmp_tuple_element_1 );
299     goto try_end_1; 307     goto try_return_handler_1;
308     // tried codes exits in all cases
309     NUITKA_CANNOT_GET_HERE( __main__$$$function_1_calledRepeatedly );
310     return NULL;
311     // Return handler code:
312     try_return_handler_1:;
313     Py_XDECREF( var_generator );
314     var_generator = NULL;
315  
316     Py_XDECREF( var_gen );
317     var_gen = NULL;
318  
319     Py_XDECREF( var_throw );
320     var_throw = NULL;
321  
322     goto function_return_exit;
300     // Exception handler code: 323     // Exception handler code:
n 301     try_except_handler_2:; n 324     try_except_handler_1:;
302     exception_keeper_type_1 = exception_type; 325     exception_keeper_type_1 = exception_type;
303     exception_keeper_value_1 = exception_value; 326     exception_keeper_value_1 = exception_value;
304     exception_keeper_tb_1 = exception_tb; 327     exception_keeper_tb_1 = exception_tb;
305     exception_keeper_lineno_1 = exception_lineno; 328     exception_keeper_lineno_1 = exception_lineno;
306     exception_type = NULL; 329     exception_type = NULL;
307     exception_value = NULL; 330     exception_value = NULL;
308     exception_tb = NULL; 331     exception_tb = NULL;
309     exception_lineno = -1; 332     exception_lineno = -1;
310 333
n 311     // Preserve existing published exception. n
312     exception_preserved_type_1 = PyThreadState_GET()->exc_type;
313     Py_XINCREF( exception_preserved_type_1 );
314     exception_preserved_value_1 = PyThreadState_GET()->exc_value;
315     Py_XINCREF( exception_preserved_value_1 );
316     exception_preserved_tb_1 = (PyTracebackObject *)PyThreadState_GET()->exc_traceback;
317     Py_XINCREF( exception_preserved_tb_1 );
318  
319     if ( exception_keeper_tb_1 == NULL )
320     {
321         exception_keeper_tb_1 = MAKE_TRACEBACK( frame_a84667b37b1c2ca7fbd839bafbf16317, exception_keeper_lineno_1 );
322     }
323     else if ( exception_keeper_lineno_1 != -1 )
324     {
325         exception_keeper_tb_1 = ADD_TRACEBACK( exception_keeper_tb_1, frame_a84667b37b1c2ca7fbd839bafbf16317, exception_keeper_lineno_1 );
326     }
327  
328     NORMALIZE_EXCEPTION( &exception_keeper_type_1, &exception_keeper_value_1, &exception_keeper_tb_1 );
329     PyException_SetTraceback( exception_keeper_value_1, (PyObject *)exception_keeper_tb_1 );
330     PUBLISH_EXCEPTION( &exception_keeper_type_1, &exception_keeper_value_1, &exception_keeper_tb_1 );
331     // Tried code:
332     tmp_compare_left_1 = PyThreadState_GET()->exc_type;
333     tmp_compare_right_1 = var_exc;
334  
335     if ( tmp_compare_right_1 == NULL )
336     {
337  
338         exception_type = PyExc_UnboundLocalError;
339         Py_INCREF( exception_type );
340         exception_value = PyUnicode_FromFormat( "local variable '%s' referenced before assignment", "exc" );
341         exception_tb = NULL;
342         NORMALIZE_EXCEPTION( &exception_type, &exception_value, &exception_tb );
343         CHAIN_EXCEPTION( exception_value );
344  
345         exception_lineno = 41;
346         type_description = "oooo";
347         goto try_except_handler_3;
348     }
349  
350     tmp_exc_match_exception_match_1 = EXCEPTION_MATCH_BOOL( tmp_compare_left_1, tmp_compare_right_1 );
351     if ( tmp_exc_match_exception_match_1 == -1 )
352     {
353         assert( ERROR_OCCURRED() );
354  
355         FETCH_ERROR_OCCURRED( &exception_type, &exception_value, &exception_tb );
356  
357  
358         exception_lineno = 41;
359         type_description = "oooo";
360         goto try_except_handler_3;
361     }
362     if ( tmp_exc_match_exception_match_1 == 1 )
363     {
364         goto branch_no_1;
365     }
366     else
367     {
368         goto branch_yes_1;
369     }
370     branch_yes_1:;
371     RERAISE_EXCEPTION( &exception_type, &exception_value, &exception_tb );
372     if (exception_tb && exception_tb->tb_frame == &frame_a84667b37b1c2ca7fbd839bafbf16317->m_frame) frame_a84667b37b1c2ca7fbd839bafbf16317->m_frame.f_lineno = exception_tb->tb_lineno;
373     type_description = "oooo";
374     goto try_except_handler_3;
375     branch_no_1:;
376     goto try_end_2;
377     // Exception handler code:
378     try_except_handler_3:;
379     exception_keeper_type_2 = exception_type;
380     exception_keeper_value_2 = exception_value;
381     exception_keeper_tb_2 = exception_tb;
382     exception_keeper_lineno_2 = exception_lineno;
383     exception_type = NULL;
384     exception_value = NULL;
385     exception_tb = NULL;
386     exception_lineno = -1;
387  
388     // Restore previous exception.
389     SET_CURRENT_EXCEPTION( exception_preserved_type_1, exception_preserved_value_1, exception_preserved_tb_1 );
390     // Re-raise.
391     exception_type = exception_keeper_type_2;
392     exception_value = exception_keeper_value_2;
393     exception_tb = exception_keeper_tb_2;
394     exception_lineno = exception_keeper_lineno_2;
395  
396     goto frame_exception_exit_1;
397     // End of try:
398     try_end_2:;
399     // Restore previous exception.
400     SET_CURRENT_EXCEPTION( exception_preserved_type_1, exception_preserved_value_1, exception_preserved_tb_1 );
401     goto try_end_1;
402     // exception handler codes exits in all cases
403     NUITKA_CANNOT_GET_HERE( __main__$$$function_1_calledRepeatedly );
404     return NULL;
405     // End of try:
406     try_end_1:;
407     tmp_return_value = PyTuple_New( 2 );
408     tmp_tuple_element_1 = var_throw;
409  
410     if ( tmp_tuple_element_1 == NULL )
411     {
412         Py_DECREF( tmp_return_value );
413         exception_type = PyExc_UnboundLocalError;
414         Py_INCREF( exception_type );
415         exception_value = PyUnicode_FromFormat( "local variable '%s' referenced before assignment", "throw" );
416         exception_tb = NULL;
417         NORMALIZE_EXCEPTION( &exception_type, &exception_value, &exception_tb );
418         CHAIN_EXCEPTION( exception_value );
419  
420         exception_lineno = 44;
421         type_description = "oooo";
422         goto frame_exception_exit_1;
423     }
424  
425     Py_INCREF( tmp_tuple_element_1 );
426     PyTuple_SET_ITEM( tmp_return_value, 0, tmp_tuple_element_1 );
427     tmp_tuple_element_1 = var_exc;
428  
429     if ( tmp_tuple_element_1 == NULL )
430     {
431         Py_DECREF( tmp_return_value );
432         exception_type = PyExc_UnboundLocalError;
433         Py_INCREF( exception_type );
434         exception_value = PyUnicode_FromFormat( "local variable '%s' referenced before assignment", "exc" );
435         exception_tb = NULL;
436         NORMALIZE_EXCEPTION( &exception_type, &exception_value, &exception_tb );
437         CHAIN_EXCEPTION( exception_value );
438  
439         exception_lineno = 44;
440         type_description = "oooo";
441         goto frame_exception_exit_1;
442     }
443  
444     Py_INCREF( tmp_tuple_element_1 );
445     PyTuple_SET_ITEM( tmp_return_value, 1, tmp_tuple_element_1 );
446     goto frame_return_exit_1;
447  
448 #if 1
449     RESTORE_FRAME_EXCEPTION( frame_a84667b37b1c2ca7fbd839bafbf16317 );
450 #endif
451  
452     // Put the previous frame back on top.
453     popFrameStack();
454  
455     goto frame_no_exception_1;
456  
457     frame_return_exit_1:;
458 #if 1
459     RESTORE_FRAME_EXCEPTION( frame_a84667b37b1c2ca7fbd839bafbf16317 );
460 #endif
461  
462     // Put the previous frame back on top.
463     popFrameStack();
464  
465     goto try_return_handler_1;
466  
467     frame_exception_exit_1:;
468  
469 #if 1
470     RESTORE_FRAME_EXCEPTION( frame_a84667b37b1c2ca7fbd839bafbf16317 );
471 #endif
472  
473     if ( exception_tb == NULL )
474     {
475         exception_tb = MAKE_TRACEBACK( frame_a84667b37b1c2ca7fbd839bafbf16317, exception_lineno );
476     }
477     else if ( exception_tb->tb_frame != &frame_a84667b37b1c2ca7fbd839bafbf16317->m_frame )
478     {
479         exception_tb = ADD_TRACEBACK( exception_tb, frame_a84667b37b1c2ca7fbd839bafbf16317, exception_lineno );
480     }
481  
482     Nuitka_Frame_AttachLocals( (struct Nuitka_FrameObject *)frame_a84667b37b1c2ca7fbd839bafbf16317, type_description ,var_generator, var_gen, var_throw, var_exc );
483  
484     // Release cached frame.
485     if ( frame_a84667b37b1c2ca7fbd839bafbf16317 == cache_frame_a84667b37b1c2ca7fbd839bafbf16317 )
486     {
487         Py_DECREF( frame_a84667b37b1c2ca7fbd839bafbf16317 );
488     }
489     cache_frame_a84667b37b1c2ca7fbd839bafbf16317 = NULL;
490  
491     assertFrameObject( frame_a84667b37b1c2ca7fbd839bafbf16317 );
492  
493  
494     // Put the previous frame back on top.
495     popFrameStack();
496  
497     // Return the error.
498     goto try_except_handler_1;
499  
500     frame_no_exception_1:;
501  
502     // tried codes exits in all cases
503     NUITKA_CANNOT_GET_HERE( __main__$$$function_1_calledRepeatedly );
504     return NULL;
505     // Return handler code:
506     try_return_handler_1:;
507     Py_XDECREF( var_generator ); 334     Py_XDECREF( var_generator );
508     var_generator = NULL; 335     var_generator = NULL;
509 336
510     Py_XDECREF( var_gen ); 337     Py_XDECREF( var_gen );
511     var_gen = NULL; 338     var_gen = NULL;
512 339
n 513     Py_XDECREF( var_throw ); n
514     var_throw = NULL;
515  
516     Py_XDECREF( var_exc );
517     var_exc = NULL;
518  
519     goto function_return_exit;
520     // Exception handler code:
521     try_except_handler_1:;
522     exception_keeper_type_3 = exception_type;
523     exception_keeper_value_3 = exception_value;
524     exception_keeper_tb_3 = exception_tb;
525     exception_keeper_lineno_3 = exception_lineno;
526     exception_type = NULL;
527     exception_value = NULL;
528     exception_tb = NULL;
529     exception_lineno = -1;
530  
531     Py_XDECREF( var_generator );
532     var_generator = NULL;
533  
534     Py_XDECREF( var_gen );
535     var_gen = NULL;
536  
537     Py_XDECREF( var_throw );
538     var_throw = NULL;
539  
540     Py_XDECREF( var_exc );
541     var_exc = NULL;
542  
543     // Re-raise. 340     // Re-raise.
t 544     exception_type = exception_keeper_type_3; t 341     exception_type = exception_keeper_type_1;
545     exception_value = exception_keeper_value_3; 342     exception_value = exception_keeper_value_1;
546     exception_tb = exception_keeper_tb_3; 343     exception_tb = exception_keeper_tb_1;
547     exception_lineno = exception_keeper_lineno_3; 344     exception_lineno = exception_keeper_lineno_1;
548 345
549     goto function_exception_exit; 346     goto function_exception_exit;
550     // End of try: 347     // End of try:
551 348
552     // Return statement must have exited already. 349     // Return statement must have exited already.