Fix Array::pad infinite loop.
This commit is contained in:
parent
5e32af0ceb
commit
5ab7c59ba0
@ -7,6 +7,7 @@ Version 1.5.0
|
||||
Bug fixes
|
||||
---------
|
||||
|
||||
* Padding arrays with another array via `pad` no longer loops indefinitely.
|
||||
* `set_bit` for bit-flags with negative index now works correctly.
|
||||
* Misnamed `params` field `name` in the JSON output of `Engine::gen_fn_metadata_to_json` is fixed (was incorrectly named `type`).
|
||||
|
||||
|
@ -102,14 +102,30 @@ pub mod array_functions {
|
||||
let check_sizes = false;
|
||||
|
||||
if check_sizes {
|
||||
let arr = mem::take(array);
|
||||
let mut arr = Dynamic::from_array(arr);
|
||||
let mut arr_len = array.len();
|
||||
let mut arr = Dynamic::from_array(mem::take(array));
|
||||
|
||||
while array.len() < len {
|
||||
arr.write_lock::<Array>().unwrap().push(item.clone());
|
||||
#[cfg(not(feature = "unchecked"))]
|
||||
let (mut a1, mut m1, mut s1) = Engine::calc_data_sizes(&arr, true);
|
||||
#[cfg(not(feature = "unchecked"))]
|
||||
let (a2, m2, s2) = Engine::calc_data_sizes(&item, true);
|
||||
|
||||
#[cfg(not(feature = "unchecked"))]
|
||||
_ctx.engine().ensure_data_size_within_limits(&arr)?;
|
||||
{
|
||||
let mut guard = arr.write_lock::<Array>().unwrap();
|
||||
|
||||
while arr_len < len {
|
||||
#[cfg(not(feature = "unchecked"))]
|
||||
{
|
||||
a1 += a2;
|
||||
m1 += m2;
|
||||
s1 += s2;
|
||||
|
||||
_ctx.engine()
|
||||
.raise_err_if_over_data_size_limit((a1, m1, s1), Position::NONE)?;
|
||||
}
|
||||
guard.push(item.clone());
|
||||
arr_len += 1;
|
||||
}
|
||||
}
|
||||
|
||||
*array = arr.into_array().unwrap();
|
||||
|
@ -22,6 +22,18 @@ fn test_arrays() -> Result<(), Box<EvalAltResult>> {
|
||||
assert_eq!(engine.eval::<INT>("let y = [1, 2, 3]; y[-3]")?, 1);
|
||||
assert!(engine.eval::<bool>("let y = [1, 2, 3]; 2 in y")?);
|
||||
assert_eq!(engine.eval::<INT>("let y = [1, 2, 3]; y += 4; y[3]")?, 4);
|
||||
assert_eq!(
|
||||
engine.eval::<INT>("let y = [1, 2, 3]; pad(y, 5, 42); len(y)")?,
|
||||
5
|
||||
);
|
||||
assert_eq!(
|
||||
engine.eval::<INT>("let y = [1, 2, 3]; pad(y, 5, [42]); len(y)")?,
|
||||
5
|
||||
);
|
||||
assert_eq!(
|
||||
engine.eval::<INT>("let y = [1, 2, 3]; pad(y, 5, [42, 999, 123]); y[4][0]")?,
|
||||
42
|
||||
);
|
||||
assert_eq!(
|
||||
engine
|
||||
.eval::<Dynamic>("let y = [1, 2, 3]; y[1] += 4; y")?
|
||||
|
Loading…
Reference in New Issue
Block a user