summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2025-06-02 18:53:35 +0200
committerGitHub <noreply@github.com>2025-06-02 16:53:35 +0000
commit664d33a68178239a9b9799d5c1b9e08958dd8d5c (patch)
treec60490caa792f8ceda399b715b719142abbdaa86
parente023db5f1dea8b0273eec0f528d6ae0fed118a65 (diff)
Be a bit lazier in function call evaluation (#6368)
-rw-r--r--crates/typst-eval/src/call.rs23
1 files changed, 15 insertions, 8 deletions
diff --git a/crates/typst-eval/src/call.rs b/crates/typst-eval/src/call.rs
index fa968341..eaeabbab 100644
--- a/crates/typst-eval/src/call.rs
+++ b/crates/typst-eval/src/call.rs
@@ -25,15 +25,13 @@ impl Eval for ast::FuncCall<'_> {
fn eval(self, vm: &mut Vm) -> SourceResult<Self::Output> {
let span = self.span();
let callee = self.callee();
- let in_math = in_math(callee);
let callee_span = callee.span();
let args = self.args();
- let trailing_comma = args.trailing_comma();
vm.engine.route.check_call_depth().at(span)?;
// Try to evaluate as a call to an associated function or field.
- let (callee, args) = if let ast::Expr::FieldAccess(access) = callee {
+ let (callee_value, args_value) = if let ast::Expr::FieldAccess(access) = callee {
let target = access.target();
let field = access.field();
match eval_field_call(target, field, args, span, vm)? {
@@ -50,9 +48,15 @@ impl Eval for ast::FuncCall<'_> {
(callee.eval(vm)?, args.eval(vm)?.spanned(span))
};
- let func_result = callee.clone().cast::<Func>();
- if in_math && func_result.is_err() {
- return wrap_args_in_math(callee, callee_span, args, trailing_comma);
+ let func_result = callee_value.clone().cast::<Func>();
+
+ if func_result.is_err() && in_math(callee) {
+ return wrap_args_in_math(
+ callee_value,
+ callee_span,
+ args_value,
+ args.trailing_comma(),
+ );
}
let func = func_result
@@ -61,8 +65,11 @@ impl Eval for ast::FuncCall<'_> {
let point = || Tracepoint::Call(func.name().map(Into::into));
let f = || {
- func.call(&mut vm.engine, vm.context, args)
- .trace(vm.world(), point, span)
+ func.call(&mut vm.engine, vm.context, args_value).trace(
+ vm.world(),
+ point,
+ span,
+ )
};
// Stacker is broken on WASM.