@@ -943,6 +943,8 @@ PyCompile_OpcodeStackEffect(int opcode, int oparg)
943
943
return 0 ;
944
944
case YIELD_FROM :
945
945
return -1 ;
946
+ case DEFER_PENDING_UNTIL :
947
+ return 0 ;
946
948
case POP_BLOCK :
947
949
return 0 ;
948
950
case POP_EXCEPT :
@@ -4194,14 +4196,15 @@ expr_constant(struct compiler *c, expr_ty e)
4194
4196
static int
4195
4197
compiler_async_with (struct compiler * c , stmt_ty s , int pos )
4196
4198
{
4197
- basicblock * block , * finally ;
4199
+ basicblock * block , * finally , * finally_await ;
4198
4200
withitem_ty item = asdl_seq_GET (s -> v .AsyncWith .items , pos );
4199
4201
4200
4202
assert (s -> kind == AsyncWith_kind );
4201
4203
4202
4204
block = compiler_new_block (c );
4203
4205
finally = compiler_new_block (c );
4204
- if (!block || !finally )
4206
+ finally_await = compiler_new_block (c );
4207
+ if (!block || !finally || !finally_await )
4205
4208
return 0 ;
4206
4209
4207
4210
/* Evaluate EXPR */
@@ -4210,8 +4213,8 @@ compiler_async_with(struct compiler *c, stmt_ty s, int pos)
4210
4213
ADDOP (c , BEFORE_ASYNC_WITH );
4211
4214
ADDOP (c , GET_AWAITABLE );
4212
4215
ADDOP_O (c , LOAD_CONST , Py_None , consts );
4216
+ ADDOP_JREL (c , DEFER_PENDING_UNTIL , block );
4213
4217
ADDOP (c , YIELD_FROM );
4214
-
4215
4218
ADDOP_JREL (c , SETUP_ASYNC_WITH , finally );
4216
4219
4217
4220
/* SETUP_ASYNC_WITH pushes a finally block. */
@@ -4236,6 +4239,7 @@ compiler_async_with(struct compiler *c, stmt_ty s, int pos)
4236
4239
return 0 ;
4237
4240
4238
4241
/* End of try block; start the finally block */
4242
+ ADDOP_JREL (c , DEFER_PENDING_UNTIL , finally_await );
4239
4243
ADDOP (c , POP_BLOCK );
4240
4244
compiler_pop_fblock (c , FINALLY_TRY , block );
4241
4245
@@ -4249,8 +4253,10 @@ compiler_async_with(struct compiler *c, stmt_ty s, int pos)
4249
4253
opcode. */
4250
4254
ADDOP (c , WITH_CLEANUP_START );
4251
4255
4256
+ ADDOP_JREL (c , DEFER_PENDING_UNTIL , finally_await );
4252
4257
ADDOP (c , GET_AWAITABLE );
4253
4258
ADDOP_O (c , LOAD_CONST , Py_None , consts );
4259
+ compiler_use_next_block (c , finally_await );
4254
4260
ADDOP (c , YIELD_FROM );
4255
4261
4256
4262
ADDOP (c , WITH_CLEANUP_FINISH );
@@ -4324,6 +4330,7 @@ compiler_with(struct compiler *c, stmt_ty s, int pos)
4324
4330
return 0 ;
4325
4331
4326
4332
/* End of try block; start the finally block */
4333
+ ADDOP_JREL (c , DEFER_PENDING_UNTIL , finally );
4327
4334
ADDOP (c , POP_BLOCK );
4328
4335
compiler_pop_fblock (c , FINALLY_TRY , block );
4329
4336
0 commit comments