From 60607d2bef37345059e8b5811350266fa0e7de18 Mon Sep 17 00:00:00 2001 From: Yaroslav Bolyukin Date: Sat, 04 Apr 2026 21:27:50 +0000 Subject: [PATCH] refactor: drop special casing of StaticBuiltin and Id functions --- --- a/crates/jrsonnet-evaluator/src/function/builtin.rs +++ b/crates/jrsonnet-evaluator/src/function/builtin.rs @@ -57,14 +57,6 @@ fn as_any(&self) -> &dyn Any; } -pub trait StaticBuiltin: Builtin + Send + Sync -where - Self: 'static, -{ - // In impl, to make it object safe: - // const INST: &'static Self; -} - #[derive(Trace)] pub struct NativeCallback { pub(crate) params: FunctionSignature, --- a/crates/jrsonnet-evaluator/src/function/mod.rs +++ b/crates/jrsonnet-evaluator/src/function/mod.rs @@ -7,13 +7,13 @@ pub use jrsonnet_macros::builtin; use self::{ - builtin::{Builtin, StaticBuiltin}, + builtin::Builtin, parse::{parse_builtin_call, parse_default_function_call, parse_function_call}, - prepared::{PreparedCall, parse_prepared_builtin_call, parse_prepared_function_call}, + prepared::{parse_prepared_builtin_call, parse_prepared_function_call, PreparedCall}, }; use crate::{ - Context, Result, Thunk, Val, bail, error::ErrorKind::*, evaluate, evaluate_trivial, - function::builtin::BuiltinFunc, + bail, error::ErrorKind::*, evaluate, evaluate_trivial, function::builtin::BuiltinFunc, Context, + Result, Thunk, Val, }; pub mod builtin; @@ -97,14 +97,10 @@ #[allow(clippy::module_name_repetitions)] #[derive(Trace, Clone)] pub enum FuncVal { - /// Identity function, kept this way for comparsions. - Id, /// Plain function implemented in jsonnet. Normal(Cc), /// Function without arguments works just as a fancy thunk value. Thunk(Thunk), - /// Standard library function. - StaticBuiltin(#[trace(skip)] &'static dyn StaticBuiltin), /// User-provided function. Builtin(BuiltinFunc), } @@ -112,12 +108,8 @@ impl Debug for FuncVal { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - Self::Id => f.debug_tuple("Id").finish(), Self::Thunk(arg0) => f.debug_tuple("Thunk").field(arg0).finish(), Self::Normal(arg0) => f.debug_tuple("Normal").field(arg0).finish(), - Self::StaticBuiltin(arg0) => { - f.debug_tuple("StaticBuiltin").field(&arg0.name()).finish() - } Self::Builtin(arg0) => f.debug_tuple("Builtin").field(&arg0.name()).finish(), } } @@ -125,23 +117,17 @@ #[allow(clippy::unnecessary_wraps)] #[builtin] -const fn builtin_id(x: Val) -> Val { +pub const fn builtin_id(x: Thunk) -> Thunk { x } -static ID: &builtin_id = &builtin_id {}; impl FuncVal { pub fn builtin(builtin: impl Builtin) -> Self { Self::Builtin(BuiltinFunc::new(builtin)) - } - pub fn static_builtin(static_builtin: &'static dyn StaticBuiltin) -> Self { - Self::StaticBuiltin(static_builtin) } pub fn params(&self) -> FunctionSignature { match self { - Self::Id => ID.params(), - Self::StaticBuiltin(i) => i.params(), Self::Builtin(i) => i.params(), Self::Normal(p) => p.params.signature.clone(), Self::Thunk(_) => FunctionSignature::empty(), @@ -154,9 +140,7 @@ /// Function name, as defined in code. pub fn name(&self) -> IStr { match self { - Self::Id => "id".into(), Self::Normal(normal) => normal.name.clone(), - Self::StaticBuiltin(builtin) => builtin.name().into(), Self::Builtin(builtin) => builtin.name().into(), Self::Thunk(_) => "thunk".into(), } @@ -182,14 +166,6 @@ } thunk.evaluate() } - Self::Id => { - let args = parse_builtin_call(call_ctx, ID.params(), args, tailstrict)?; - ID.call(loc, &args) - } - Self::StaticBuiltin(b) => { - let args = parse_builtin_call(call_ctx, b.params(), args, tailstrict)?; - b.call(loc, &args) - } Self::Builtin(b) => { let args = parse_builtin_call(call_ctx, b.params(), args, tailstrict)?; b.call(loc, &args) @@ -217,14 +193,6 @@ evaluate(body_ctx, &func.body) } FuncVal::Thunk(t) => t.evaluate(), - FuncVal::Id => { - let args = parse_prepared_builtin_call(prepared, ID.params(), unnamed, named); - ID.call(loc, &args) - } - FuncVal::StaticBuiltin(b) => { - let args = parse_prepared_builtin_call(prepared, b.params(), unnamed, named); - b.call(loc, &args) - } FuncVal::Builtin(b) => { let args = parse_prepared_builtin_call(prepared, b.params(), unnamed, named); b.call(loc, &args) @@ -239,7 +207,7 @@ /// This function should only be used for optimization, not for the conditional logic, i.e code should work with syntetic identity function too pub fn is_identity(&self) -> bool { match self { - Self::Id => true, + Self::Builtin(b) => b.as_any().downcast_ref::().is_some(), Self::Normal(desc) => { if desc.params.len() != 1 { return false; @@ -257,13 +225,9 @@ }; matches!(&*desc.body, Expr::Var(v) if &**v == id) } - _ => false, + Self::Thunk(_) => false, } } - /// Identity function value. - pub const fn identity() -> Self { - Self::Id - } pub fn evaluate_trivial(&self) -> Option { match self { @@ -279,10 +243,5 @@ { fn from(value: T) -> Self { Self::builtin(value) - } -} -impl From<&'static dyn StaticBuiltin> for FuncVal { - fn from(value: &'static dyn StaticBuiltin) -> Self { - Self::static_builtin(value) } } -- gitstuff