summaryrefslogtreecommitdiff
path: root/crates/typst-eval/src
diff options
context:
space:
mode:
Diffstat (limited to 'crates/typst-eval/src')
-rw-r--r--crates/typst-eval/src/call.rs10
-rw-r--r--crates/typst-eval/src/code.rs11
-rw-r--r--crates/typst-eval/src/math.rs8
3 files changed, 22 insertions, 7 deletions
diff --git a/crates/typst-eval/src/call.rs b/crates/typst-eval/src/call.rs
index 6f0ec1fc..c68bef96 100644
--- a/crates/typst-eval/src/call.rs
+++ b/crates/typst-eval/src/call.rs
@@ -315,13 +315,15 @@ fn eval_field_call(
(target, args)
};
+ let field_span = field.span();
+ let sink = (&mut vm.engine, field_span);
if let Some(callee) = target.ty().scope().get(&field) {
args.insert(0, target_expr.span(), target);
- Ok(FieldCall::Normal(callee.read().clone(), args))
+ Ok(FieldCall::Normal(callee.read_checked(sink).clone(), args))
} else if let Value::Content(content) = &target {
if let Some(callee) = content.elem().scope().get(&field) {
args.insert(0, target_expr.span(), target);
- Ok(FieldCall::Normal(callee.read().clone(), args))
+ Ok(FieldCall::Normal(callee.read_checked(sink).clone(), args))
} else {
bail!(missing_field_call_error(target, field))
}
@@ -331,7 +333,7 @@ fn eval_field_call(
) {
// Certain value types may have their own ways to access method fields.
// e.g. `$arrow.r(v)$`, `table.cell[..]`
- let value = target.field(&field).at(field.span())?;
+ let value = target.field(&field, sink).at(field_span)?;
Ok(FieldCall::Normal(value, args))
} else {
// Otherwise we cannot call this field.
@@ -364,7 +366,7 @@ fn missing_field_call_error(target: Value, field: Ident) -> SourceDiagnostic {
field.as_str(),
));
}
- _ if target.field(&field).is_ok() => {
+ _ if target.field(&field, ()).is_ok() => {
error.hint(eco_format!(
"did you mean to access the field `{}`?",
field.as_str(),
diff --git a/crates/typst-eval/src/code.rs b/crates/typst-eval/src/code.rs
index 4ac48186..a7b6b6f9 100644
--- a/crates/typst-eval/src/code.rs
+++ b/crates/typst-eval/src/code.rs
@@ -154,7 +154,13 @@ impl Eval for ast::Ident<'_> {
type Output = Value;
fn eval(self, vm: &mut Vm) -> SourceResult<Self::Output> {
- Ok(vm.scopes.get(&self).at(self.span())?.read().clone())
+ let span = self.span();
+ Ok(vm
+ .scopes
+ .get(&self)
+ .at(span)?
+ .read_checked((&mut vm.engine, span))
+ .clone())
}
}
@@ -310,8 +316,9 @@ impl Eval for ast::FieldAccess<'_> {
fn eval(self, vm: &mut Vm) -> SourceResult<Self::Output> {
let value = self.target().eval(vm)?;
let field = self.field();
+ let field_span = field.span();
- let err = match value.field(&field).at(field.span()) {
+ let err = match value.field(&field, (&mut vm.engine, field_span)).at(field_span) {
Ok(value) => return Ok(value),
Err(err) => err,
};
diff --git a/crates/typst-eval/src/math.rs b/crates/typst-eval/src/math.rs
index 23b293f2..0e271a08 100644
--- a/crates/typst-eval/src/math.rs
+++ b/crates/typst-eval/src/math.rs
@@ -35,7 +35,13 @@ impl Eval for ast::MathIdent<'_> {
type Output = Value;
fn eval(self, vm: &mut Vm) -> SourceResult<Self::Output> {
- Ok(vm.scopes.get_in_math(&self).at(self.span())?.read().clone())
+ let span = self.span();
+ Ok(vm
+ .scopes
+ .get_in_math(&self)
+ .at(span)?
+ .read_checked((&mut vm.engine, span))
+ .clone())
}
}