git.delta.rocks / jrsonnet / refs/commits / 562e7b71e322

difftreelog

refactor remove manual ThunkValue implementations

Yaroslav Bolyukin2024-08-30parent: #7cd3ab4.patch.diff
in: master

3 files changed

modifiedcrates/jrsonnet-evaluator/src/function/arglike.rsdiffbeforeafterboth
3use jrsonnet_interner::IStr;3use jrsonnet_interner::IStr;
4use jrsonnet_parser::{ArgsDesc, LocExpr};4use jrsonnet_parser::{ArgsDesc, LocExpr};
55
6use crate::{evaluate, gc::GcHashMap, typed::Typed, val::ThunkValue, Context, Result, Thunk, Val};6use crate::{evaluate, gc::GcHashMap, typed::Typed, Context, Result, Thunk, Val};
77
8/// Marker for arguments, which can be evaluated with context set to None8/// Marker for arguments, which can be evaluated with context set to None
9pub trait OptionalContext {}9pub trait OptionalContext {}
10
11#[derive(Trace)]
12struct EvaluateThunk {
13 ctx: Context,
14 expr: LocExpr,
15}
16impl ThunkValue for EvaluateThunk {
17 type Output = Val;
18 fn get(self: Box<Self>) -> Result<Val> {
19 evaluate(self.ctx, &self.expr)
20 }
21}
2210
23pub trait ArgLike {11pub trait ArgLike {
24 fn evaluate_arg(&self, ctx: Context, tailstrict: bool) -> Result<Thunk<Val>>;12 fn evaluate_arg(&self, ctx: Context, tailstrict: bool) -> Result<Thunk<Val>>;
29 Ok(if tailstrict {17 Ok(if tailstrict {
30 Thunk::evaluated(evaluate(ctx, self)?)18 Thunk::evaluated(evaluate(ctx, self)?)
31 } else {19 } else {
32 Thunk::new(EvaluateThunk {
33 ctx,
34 expr: (*self).clone(),20 let expr = (*self).clone();
35 })21 Thunk!(move || evaluate(ctx, &expr))
36 })22 })
37 }23 }
38}24}
65 Self::Code(code) => Ok(if tailstrict {51 Self::Code(code) => Ok(if tailstrict {
66 Thunk::evaluated(evaluate(ctx, code)?)52 Thunk::evaluated(evaluate(ctx, code)?)
67 } else {53 } else {
68 Thunk::new(EvaluateThunk {
69 ctx,
70 expr: code.clone(),54 let code = code.clone();
71 })55 Thunk!(move || evaluate(ctx, &code))
72 }),56 }),
73 Self::Val(val) => Ok(Thunk::evaluated(val.clone())),57 Self::Val(val) => Ok(Thunk::evaluated(val.clone())),
74 Self::Lazy(lazy) => Ok(lazy.clone()),58 Self::Lazy(lazy) => Ok(lazy.clone()),
140 if tailstrict {124 if tailstrict {
141 Thunk::evaluated(evaluate(ctx.clone(), arg)?)125 Thunk::evaluated(evaluate(ctx.clone(), arg)?)
142 } else {126 } else {
143 Thunk::new(EvaluateThunk {
144 ctx: ctx.clone(),127 let ctx = ctx.clone();
145 expr: arg.clone(),128 let arg = arg.clone();
146 })129
130 Thunk!(move || evaluate(ctx, &arg))
147 },131 },
148 )?;132 )?;
149 }133 }
162 if tailstrict {146 if tailstrict {
163 Thunk::evaluated(evaluate(ctx.clone(), arg)?)147 Thunk::evaluated(evaluate(ctx.clone(), arg)?)
164 } else {148 } else {
165 Thunk::new(EvaluateThunk {
166 ctx: ctx.clone(),149 let ctx = ctx.clone();
167 expr: arg.clone(),150 let arg = arg.clone();
168 })151
152 Thunk!(move || evaluate(ctx, &arg))
169 },153 },
170 )?;154 )?;
171 }155 }
modifiedcrates/jrsonnet-evaluator/src/function/parse.rsdiffbeforeafterboth
12 evaluate_named,12 evaluate_named,
13 function::builtin::ParamDefault,13 function::builtin::ParamDefault,
14 gc::GcHashMap,14 gc::GcHashMap,
15 val::ThunkValue,
16 Context, Pending, Thunk, Val,15 Context, Pending, Thunk, Val,
17};16};
18
19#[derive(Trace)]
20struct EvaluateNamedThunk {
21 ctx: Pending<Context>,
22 name: IStr,
23 value: LocExpr,
24}
25
26impl ThunkValue for EvaluateNamedThunk {
27 type Output = Val;
28 fn get(self: Box<Self>) -> Result<Val> {
29 evaluate_named(self.ctx.unwrap(), &self.value, self.name)
30 }
31}
3217
33/// Creates correct [context](Context) for function body evaluation returning error on invalid call.18/// Creates correct [context](Context) for function body evaluation returning error on invalid call.
34///19///
10590
106 destruct(91 destruct(
107 &param.0,92 &param.0,
108 Thunk::new(EvaluateNamedThunk {93 {
109 ctx: fctx.clone(),94 let ctx = fctx.clone();
110 name: param.0.name().unwrap_or_else(|| "<destruct>".into()),95 let name = param.0.name().unwrap_or_else(|| "<destruct>".into());
111 value: param.1.clone().expect("default exists"),96 let value = param.1.clone().expect("default exists");
97 Thunk!(move || evaluate_named(ctx.unwrap(), &value, name))
112 }),98 },
113 fctx.clone(),99 fctx.clone(),
114 &mut defaults,100 &mut defaults,
115 )?;101 )?;
241 if let Some(v) = &param.1 {227 if let Some(v) = &param.1 {
242 destruct(228 destruct(
243 &param.0.clone(),229 &param.0.clone(),
244 Thunk::new(EvaluateNamedThunk {230 {
245 ctx: fctx.clone(),231 let ctx = fctx.clone();
246 name: param.0.name().unwrap_or_else(|| "<destruct>".into()),232 let name = param.0.name().unwrap_or_else(|| "<destruct>".into());
247 value: v.clone(),233 let value = v.clone();
234 Thunk!(move || evaluate_named(ctx.unwrap(), &value, name))
248 }),235 },
249 fctx.clone(),236 fctx.clone(),
250 &mut bindings,237 &mut bindings,
251 )?;238 )?;
modifiednix/benchmarks.nixdiffbeforeafterboth
48 outputHashMode = "recursive";48 outputHashMode = "recursive";
49 buildInputs = [cacert];49 buildInputs = [cacert];
50 }50 }
51 ''51 ''
52 mkdir -p $out52 mkdir -p $out
53 cp -r ${src}/* $out/53 cp -r ${src}/* $out/
54 cd $out54 cd $out
55 mkdir vendor55 chmod u+w jsonnetfile.lock.json
56 mkdir vendor
56 ${jsonnet-bundler}/bin/jb install57 ${jsonnet-bundler}/bin/jb install
57 '';58 '';
5859
59 # Removes outsiders from the output60 # Removes outsiders from the output
60 # Useful when comparing performance of different jrsonnet releases61 # Useful when comparing performance of different jrsonnet releases
88 skipCpp ? "",89 skipCpp ? "",
89 skipGo ? "",90 skipGo ? "",
90 vendor ? "",91 vendor ? "",
91 }: ''92 }: ''
92 echo >> $out93 echo >> $out
93 echo "### ${name}" >> $out94 echo "### ${name}" >> $out
94 echo >> $out95 echo >> $out
95 ${optionalString (skipRustAlternative != "") ''96 ${optionalString (skipRustAlternative != "") ''
96 echo "> Note: No results for Rust (alternative), ${skipRustAlternative}" >> $out97 echo "> Note: No results for Rust (alternative), ${skipRustAlternative}" >> $out
97 echo >> $out98 echo >> $out
98 ''}99 ''}
99 ${optionalString (skipGo != "") ''100 ${optionalString (skipGo != "") ''
100 echo "> Note: No results for Go, ${skipGo}" >> $out101 echo "> Note: No results for Go, ${skipGo}" >> $out
101 echo >> $out102 echo >> $out
102 ''}103 ''}
103 ${optionalString (skipScala != "") ''104 ${optionalString (skipScala != "") ''
104 echo "> Note: No results for Scala, ${skipScala}" >> $out105 echo "> Note: No results for Scala, ${skipScala}" >> $out
105 echo >> $out106 echo >> $out
106 ''}107 ''}
107 ${optionalString (skipCpp != "") ''108 ${optionalString (skipCpp != "") ''
108 echo "> Note: No results for C++, ${skipCpp}" >> $out109 echo "> Note: No results for C++, ${skipCpp}" >> $out
109 echo >> $out110 echo >> $out
110 ''}111 ''}
111 ${optionalString (!quick && !omitSource) ''112 ${optionalString (!quick && !omitSource) ''
112 echo "<details>" >> $out113 echo "<details>" >> $out
113 echo "<summary>Source</summary>" >> $out114 echo "<summary>Source</summary>" >> $out
114 echo >> $out115 echo >> $out
115 echo "\`\`\`jsonnet" >> $out116 echo "\`\`\`jsonnet" >> $out
116 ${optionalString pathIsGenerator "echo \"// Generator source\" >> $out"}117 ${optionalString pathIsGenerator "echo \"// Generator source\" >> $out"}
117 cat ${path} >> $out118 cat ${path} >> $out
118 echo >> $out119 echo >> $out
119 echo "\`\`\`" >> $out120 echo "\`\`\`" >> $out
120 echo "</details>" >> $out121 echo "</details>" >> $out
121 echo >> $out122 echo >> $out
122 ''}123 ''}
123 path=${path}124 path=${path}
124 ${optionalString pathIsGenerator ''125 ${optionalString pathIsGenerator ''
125 go-jsonnet $path > generated.jsonnet126 go-jsonnet $path > generated.jsonnet
126 path=generated.jsonnet127 path=generated.jsonnet
127 ''}128 ''}
128 hyperfine -N -w4 -m20 --output=pipe --style=basic --export-markdown result.md \129 hyperfine -N -w4 -m20 --output=pipe --style=basic --export-asciidoc result.adoc \
129 ${concatStringsSep " " (forEach jrsonnetVariants (130 ${concatStringsSep " " (forEach jrsonnetVariants (
130 variant: "\"${variant.drv}/bin/jrsonnet $path${optionalString (vendor != "") " -J${vendor}"}\" -n \"Rust${131 variant: "\"${variant.drv}/bin/jrsonnet $path${optionalString (vendor != "") " -J${vendor}"}\" -n \"Rust${
131 if variant.name != ""132 if variant.name != ""
132 then " (${variant.name})"133 then " (${variant.name})"
133 else ""134 else ""
134 }\""135 }\""
135 ))} \136 ))} \
136 ${optionalString (skipRustAlternative == "") "\"rsjsonnet $path${optionalString (vendor != "") " -J ${vendor}"}\" -n \"Rust (alternative, rsjsonnet)\""} \137 ${optionalString (skipRustAlternative == "") "\"rsjsonnet $path${optionalString (vendor != "") " -J ${vendor}"}\" -n \"Rust (alternative, rsjsonnet)\""} \
137 ${optionalString (skipGo == "") "\"go-jsonnet $path${optionalString (vendor != "") " -J ${vendor}"}\" -n \"Go\""} \138 ${optionalString (skipGo == "") "\"go-jsonnet $path${optionalString (vendor != "") " -J ${vendor}"}\" -n \"Go\""} \
138 ${optionalString (skipScala == "") "\"sjsonnet $path${optionalString (vendor != "") " -J ${vendor}"}\" -n \"Scala\""} \139 ${optionalString (skipScala == "") "\"sjsonnet $path${optionalString (vendor != "") " -J ${vendor}"}\" -n \"Scala\""} \
139 ${optionalString (skipCpp == "") "\"jsonnet $path${optionalString (vendor != "") " -J ${vendor}"}\" -n \"C++\""}140 ${optionalString (skipCpp == "") "\"jsonnet $path${optionalString (vendor != "") " -J ${vendor}"}\" -n \"C++\""}
140 cat result.md >> $out141 cat result.adoc >> $out
141 '';142 '';
142 in ''143 in ''
143 set -oux144 set -oux
144145