mirror of
https://github.com/ChaiScript/ChaiScript.git
synced 2026-04-30 19:09:26 +08:00
* Fix #635: Segfault in async result via dangling pointer from optimized for loop * The optimized for loop (chaiscript_optimizer.hpp) stored the loop counter as a stack-local `int` and exposed it to ChaiScript via `var(&i)`, creating a reference-type Boxed_Value pointing to the stack frame.
42 lines
926 B
ChaiScript
42 lines
926 B
ChaiScript
// Issue #635: optimized for loop with := must not produce dangling values
|
|
// := is reference-assign, so ret aliases i and sees the loop exit value
|
|
|
|
// Basic: capture loop variable via :=
|
|
var ret = 0
|
|
for (var i = 0; i < 100; ++i) {
|
|
ret := i
|
|
}
|
|
assert_equal(100, ret)
|
|
|
|
// Return from function containing optimized for loop
|
|
def loop_result() {
|
|
var ret = 0
|
|
for (var i = 0; i < 200; ++i) {
|
|
ret := i
|
|
}
|
|
return ret
|
|
}
|
|
assert_equal(200, loop_result())
|
|
|
|
// Multiple calls return consistent results
|
|
assert_equal(loop_result(), loop_result())
|
|
|
|
// Nested optimized for loops
|
|
var outer_val = 0
|
|
var inner_val = 0
|
|
for (var i = 0; i < 10; ++i) {
|
|
for (var j = 0; j < 10; ++j) {
|
|
inner_val := j
|
|
}
|
|
outer_val := i
|
|
}
|
|
assert_equal(10, outer_val)
|
|
assert_equal(10, inner_val)
|
|
|
|
// Value-assign (=) captures last body-iteration value, not exit value
|
|
var ret2 = 0
|
|
for (var i = 0; i < 100; ++i) {
|
|
ret2 = i
|
|
}
|
|
assert_equal(99, ret2)
|