Skip to content

Commit f345ee2

Browse files
committed
test(vm): add generator regression tests for return_value reset
Add tests ensuring that resetting `return_value` in `push_frame()` does not break generator yield/return behavior, as requested in the PR #4713 review.
1 parent 9aca278 commit f345ee2

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

core/engine/src/tests/function.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,45 @@ fn implicit_constructor_return_does_not_leak_completion_value_from_same_eval() {
100100
]);
101101
}
102102

103+
/// Regression test for issue #4485.
104+
/// Generator functions must still correctly yield and return values
105+
/// after the `return_value` reset in `push_frame`.
106+
#[test]
107+
fn generator_yield_and_return_not_affected_by_return_value_reset() {
108+
run_test_actions([TestAction::assert(indoc! {r#"
109+
function* gen() {
110+
yield 1;
111+
yield 2;
112+
return 3;
113+
}
114+
var g = gen();
115+
var a = g.next();
116+
var b = g.next();
117+
var c = g.next();
118+
a.value === 1 && !a.done &&
119+
b.value === 2 && !b.done &&
120+
c.value === 3 && c.done;
121+
"#})]);
122+
}
123+
124+
/// Regression test for issue #4485.
125+
/// Generator functions without an explicit return should yield
126+
/// `undefined` as the final value, not a stale caller expression.
127+
#[test]
128+
fn generator_implicit_return_undefined() {
129+
run_test_actions([TestAction::assert(indoc! {r#"
130+
function* gen() {
131+
yield 1;
132+
}
133+
99;
134+
var g = gen();
135+
var a = g.next();
136+
var b = g.next();
137+
a.value === 1 && !a.done &&
138+
b.value === undefined && b.done;
139+
"#})]);
140+
}
141+
103142
#[test]
104143
fn property_accessor_member_expression_dot_notation_on_function() {
105144
run_test_actions([TestAction::assert_eq(

0 commit comments

Comments
 (0)