perf improvements

This commit is contained in:
2026-04-06 02:51:42 +03:00
parent b0ea71e104
commit 953b39d433
7 changed files with 47 additions and 40 deletions

View File

@@ -3,6 +3,7 @@ use indexmap::IndexMap;
use rust_decimal::Decimal;
use smol_str::SmolStr;
use std::collections::HashMap;
use std::rc::Rc;
use std::str::FromStr;
#[derive(serde::Deserialize)]
@@ -55,7 +56,7 @@ fn value_def_to_value(def: &ValueDef) -> Value {
};
map.insert(SmolStr::from(k.as_str()), val);
}
Value::Object(Box::new(map))
Value::Object(Rc::new(map))
}
let obj = def.value.as_ref().unwrap().as_object().unwrap();
json_obj_to_value(obj)

View File

@@ -3,6 +3,7 @@ use indexmap::IndexMap;
use rust_decimal::prelude::ToPrimitive;
use rust_decimal_macros::dec;
use smol_str::SmolStr;
use std::rc::Rc;
/// Helper to run code and get the value of "result" variable
fn run_and_get_result(code: &str) -> Value {
@@ -628,7 +629,7 @@ fn test_numberlist_contains() {
let mut compiler = Compiler::new();
let bytecode = compiler.compile(ast).expect("compile");
let mut vm = VM::new(&bytecode);
vm.set_global("nums", Value::NumberList(Box::new(vec![dec!(1), dec!(2), dec!(3), dec!(4)])));
vm.set_global("nums", Value::NumberList(Rc::new(vec![dec!(1), dec!(2), dec!(3), dec!(4)])));
vm.execute().expect("execute");
assert_eq!(vm.get_global("result").unwrap(), &Value::Boolean(true));
}
@@ -639,7 +640,7 @@ fn test_numberlist_indexof() {
let mut compiler = Compiler::new();
let bytecode = compiler.compile(ast).expect("compile");
let mut vm = VM::new(&bytecode);
vm.set_global("nums", Value::NumberList(Box::new(vec![dec!(1), dec!(2), dec!(3)])));
vm.set_global("nums", Value::NumberList(Rc::new(vec![dec!(1), dec!(2), dec!(3)])));
vm.execute().expect("execute");
assert_eq!(vm.get_global("result").unwrap(), &Value::Number(dec!(2)));
}
@@ -650,7 +651,7 @@ fn test_numberlist_slice() {
let mut compiler = Compiler::new();
let bytecode = compiler.compile(ast).expect("compile");
let mut vm = VM::new(&bytecode);
vm.set_global("nums", Value::NumberList(Box::new(vec![dec!(10), dec!(20), dec!(30), dec!(40)])));
vm.set_global("nums", Value::NumberList(Rc::new(vec![dec!(10), dec!(20), dec!(30), dec!(40)])));
vm.execute().expect("execute");
// slice(1,3) = [20, 30], sum = 50
assert_eq!(vm.get_global("result").unwrap(), &Value::Number(dec!(50)));
@@ -662,7 +663,7 @@ fn test_numberlist_reverse() {
let mut compiler = Compiler::new();
let bytecode = compiler.compile(ast).expect("compile");
let mut vm = VM::new(&bytecode);
vm.set_global("nums", Value::NumberList(Box::new(vec![dec!(1), dec!(2), dec!(3)])));
vm.set_global("nums", Value::NumberList(Rc::new(vec![dec!(1), dec!(2), dec!(3)])));
vm.execute().expect("execute");
assert_eq!(vm.get_global("result").unwrap(), &Value::Number(dec!(3)));
}
@@ -673,7 +674,7 @@ fn test_numberlist_sort() {
let mut compiler = Compiler::new();
let bytecode = compiler.compile(ast).expect("compile");
let mut vm = VM::new(&bytecode);
vm.set_global("nums", Value::NumberList(Box::new(vec![dec!(30), dec!(10), dec!(20)])));
vm.set_global("nums", Value::NumberList(Rc::new(vec![dec!(30), dec!(10), dec!(20)])));
vm.execute().expect("execute");
assert_eq!(vm.get_global("result").unwrap(), &Value::Number(dec!(10)));
}
@@ -684,7 +685,7 @@ fn test_numberlist_isempty() {
let mut compiler = Compiler::new();
let bytecode = compiler.compile(ast).expect("compile");
let mut vm = VM::new(&bytecode);
vm.set_global("nums", Value::NumberList(Box::new(vec![])));
vm.set_global("nums", Value::NumberList(Rc::new(vec![])));
vm.execute().expect("execute");
assert_eq!(vm.get_global("result").unwrap(), &Value::Boolean(true));
}
@@ -1028,7 +1029,7 @@ fn make_object(entries: Vec<(&str, Value)>) -> Value {
for (k, v) in entries {
map.insert(SmolStr::new(k), v);
}
Value::Object(Box::new(map))
Value::Object(Rc::new(map))
}
#[test]
@@ -1113,7 +1114,7 @@ fn test_object_method_keys() {
let result = run_expr_with_globals("person.keys()", vec![("person", obj)]);
assert_eq!(
result,
Value::StringList(Box::new(vec![SmolStr::new("name"), SmolStr::new("age")]))
Value::StringList(Rc::new(vec![SmolStr::new("name"), SmolStr::new("age")]))
);
}
@@ -1177,7 +1178,7 @@ fn test_object_method_values_strings() {
let result = run_expr_with_globals("obj.values()", vec![("obj", obj)]);
assert_eq!(
result,
Value::StringList(Box::new(vec![SmolStr::new("x"), SmolStr::new("y")]))
Value::StringList(Rc::new(vec![SmolStr::new("x"), SmolStr::new("y")]))
);
}
@@ -1188,7 +1189,7 @@ fn test_object_method_values_numbers() {
("b", Value::Number(dec!(2))),
]);
let result = run_expr_with_globals("obj.values()", vec![("obj", obj)]);
assert_eq!(result, Value::NumberList(Box::new(vec![dec!(1), dec!(2)])));
assert_eq!(result, Value::NumberList(Rc::new(vec![dec!(1), dec!(2)])));
}
#[test]