support yield implicit None

This commit is contained in:
blueloveTH 2024-09-29 17:24:33 +08:00
parent 0a77c96c0a
commit 18fc4c02d3
3 changed files with 16 additions and 6 deletions

View File

@ -2498,10 +2498,14 @@ static Error* compile_stmt(Compiler* self) {
break;
case TK_YIELD:
if(self->contexts.length <= 1) return SyntaxError(self, "'yield' outside function");
check(EXPR_TUPLE(self));
Ctx__s_emit_top(ctx());
Ctx__emit_(ctx(), OP_YIELD_VALUE, BC_NOARG, kw_line);
consume_end_stmt();
if(match_end_stmt(self)) {
Ctx__emit_(ctx(), OP_YIELD_VALUE, 1, kw_line);
} else {
check(EXPR_TUPLE(self));
Ctx__s_emit_top(ctx());
Ctx__emit_(ctx(), OP_YIELD_VALUE, BC_NOARG, kw_line);
consume_end_stmt();
}
break;
case TK_YIELD_FROM:
check(compile_yield_from(self, kw_line));

View File

@ -715,8 +715,12 @@ FrameResult VM__run_top_frame(VM* self) {
DISPATCH();
}
case OP_YIELD_VALUE: {
py_assign(py_retval(), TOP());
POP();
if(byte.arg == 1) {
py_newnone(py_retval());
} else {
py_assign(py_retval(), TOP());
POP();
}
return RES_YIELD;
}
/////////

View File

@ -1,10 +1,12 @@
def g():
yield 1
yield 2
yield
a = g()
assert next(a) == 1
assert next(a, None) == 2
assert next(a) == None
try:
next(a)