diff --git a/library/src/base/calc.rs b/library/src/base/calc.rs index 355e5c022..db40df061 100644 --- a/library/src/base/calc.rs +++ b/library/src/base/calc.rs @@ -3,7 +3,7 @@ use std::cmp::Ordering; use crate::prelude::*; /// Convert a value to an integer. -pub fn int(_: &mut Vm, args: &mut Args) -> SourceResult { +pub fn int(_: &Vm, args: &mut Args) -> SourceResult { let Spanned { v, span } = args.expect("value")?; Ok(Value::Int(match v { Value::Bool(v) => v as i64, @@ -18,7 +18,7 @@ pub fn int(_: &mut Vm, args: &mut Args) -> SourceResult { } /// Convert a value to a float. -pub fn float(_: &mut Vm, args: &mut Args) -> SourceResult { +pub fn float(_: &Vm, args: &mut Args) -> SourceResult { let Spanned { v, span } = args.expect("value")?; Ok(Value::Float(match v { Value::Int(v) => v as f64, @@ -32,7 +32,7 @@ pub fn float(_: &mut Vm, args: &mut Args) -> SourceResult { } /// The absolute value of a numeric value. -pub fn abs(_: &mut Vm, args: &mut Args) -> SourceResult { +pub fn abs(_: &Vm, args: &mut Args) -> SourceResult { let Spanned { v, span } = args.expect("numeric value")?; Ok(match v { Value::Int(v) => Value::Int(v.abs()), @@ -48,12 +48,12 @@ pub fn abs(_: &mut Vm, args: &mut Args) -> SourceResult { } /// The minimum of a sequence of values. -pub fn min(_: &mut Vm, args: &mut Args) -> SourceResult { +pub fn min(_: &Vm, args: &mut Args) -> SourceResult { minmax(args, Ordering::Less) } /// The maximum of a sequence of values. -pub fn max(_: &mut Vm, args: &mut Args) -> SourceResult { +pub fn max(_: &Vm, args: &mut Args) -> SourceResult { minmax(args, Ordering::Greater) } @@ -79,17 +79,17 @@ fn minmax(args: &mut Args, goal: Ordering) -> SourceResult { } /// Whether an integer is even. -pub fn even(_: &mut Vm, args: &mut Args) -> SourceResult { +pub fn even(_: &Vm, args: &mut Args) -> SourceResult { Ok(Value::Bool(args.expect::("integer")? % 2 == 0)) } /// Whether an integer is odd. -pub fn odd(_: &mut Vm, args: &mut Args) -> SourceResult { +pub fn odd(_: &Vm, args: &mut Args) -> SourceResult { Ok(Value::Bool(args.expect::("integer")? % 2 != 0)) } /// The modulo of two numbers. -pub fn mod_(_: &mut Vm, args: &mut Args) -> SourceResult { +pub fn mod_(_: &Vm, args: &mut Args) -> SourceResult { let Spanned { v: v1, span: span1 } = args.expect("integer or float")?; let Spanned { v: v2, span: span2 } = args.expect("integer or float")?; @@ -117,7 +117,7 @@ pub fn mod_(_: &mut Vm, args: &mut Args) -> SourceResult { } /// Create a sequence of numbers. -pub fn range(_: &mut Vm, args: &mut Args) -> SourceResult { +pub fn range(_: &Vm, args: &mut Args) -> SourceResult { let first = args.expect::("end")?; let (start, end) = match args.eat::()? { Some(second) => (first, second), diff --git a/library/src/base/color.rs b/library/src/base/color.rs index d54911ca0..2db41ebfb 100644 --- a/library/src/base/color.rs +++ b/library/src/base/color.rs @@ -3,13 +3,13 @@ use std::str::FromStr; use crate::prelude::*; /// Create a grayscale color. -pub fn luma(_: &mut Vm, args: &mut Args) -> SourceResult { +pub fn luma(_: &Vm, args: &mut Args) -> SourceResult { let Component(luma) = args.expect("gray component")?; Ok(Value::Color(LumaColor::new(luma).into())) } /// Create an RGB(A) color. -pub fn rgb(_: &mut Vm, args: &mut Args) -> SourceResult { +pub fn rgb(_: &Vm, args: &mut Args) -> SourceResult { Ok(Value::Color(if let Some(string) = args.find::>()? { match RgbaColor::from_str(&string.v) { Ok(color) => color.into(), @@ -25,7 +25,7 @@ pub fn rgb(_: &mut Vm, args: &mut Args) -> SourceResult { } /// Create a CMYK color. -pub fn cmyk(_: &mut Vm, args: &mut Args) -> SourceResult { +pub fn cmyk(_: &Vm, args: &mut Args) -> SourceResult { let RatioComponent(c) = args.expect("cyan component")?; let RatioComponent(m) = args.expect("magenta component")?; let RatioComponent(y) = args.expect("yellow component")?; diff --git a/library/src/base/data.rs b/library/src/base/data.rs index 67ef2f2c9..4f6e3b67e 100644 --- a/library/src/base/data.rs +++ b/library/src/base/data.rs @@ -5,12 +5,12 @@ use typst::diag::{format_xml_like_error, FileError}; use crate::prelude::*; /// Read structured data from a CSV file. -pub fn csv(vm: &mut Vm, args: &mut Args) -> SourceResult { +pub fn csv(vm: &Vm, args: &mut Args) -> SourceResult { let Spanned { v: path, span } = args.expect::>("path to csv file")?; let path = vm.locate(&path).at(span)?; - let data = vm.world.file(&path).at(span)?; + let data = vm.world().file(&path).at(span)?; let mut builder = csv::ReaderBuilder::new(); builder.has_headers(false); @@ -45,12 +45,12 @@ fn format_csv_error(error: csv::Error) -> String { } /// Read structured data from a JSON file. -pub fn json(vm: &mut Vm, args: &mut Args) -> SourceResult { +pub fn json(vm: &Vm, args: &mut Args) -> SourceResult { let Spanned { v: path, span } = args.expect::>("path to json file")?; let path = vm.locate(&path).at(span)?; - let data = vm.world.file(&path).at(span)?; + let data = vm.world().file(&path).at(span)?; let value: serde_json::Value = serde_json::from_slice(&data).map_err(format_json_error).at(span)?; @@ -85,12 +85,12 @@ fn format_json_error(error: serde_json::Error) -> String { } /// Read structured data from an XML file. -pub fn xml(vm: &mut Vm, args: &mut Args) -> SourceResult { +pub fn xml(vm: &Vm, args: &mut Args) -> SourceResult { let Spanned { v: path, span } = args.expect::>("path to xml file")?; let path = vm.locate(&path).at(span)?; - let data = vm.world.file(&path).at(span)?; + let data = vm.world().file(&path).at(span)?; let text = std::str::from_utf8(&data).map_err(FileError::from).at(span)?; let document = roxmltree::Document::parse(text).map_err(format_xml_error).at(span)?; diff --git a/library/src/base/mod.rs b/library/src/base/mod.rs index 837a2f0e8..86ebd6665 100644 --- a/library/src/base/mod.rs +++ b/library/src/base/mod.rs @@ -17,12 +17,12 @@ use typst::syntax::Source; use crate::prelude::*; /// The name of a value's type. -pub fn type_(_: &mut Vm, args: &mut Args) -> SourceResult { +pub fn type_(_: &Vm, args: &mut Args) -> SourceResult { Ok(args.expect::("value")?.type_name().into()) } /// Ensure that a condition is fulfilled. -pub fn assert(_: &mut Vm, args: &mut Args) -> SourceResult { +pub fn assert(_: &Vm, args: &mut Args) -> SourceResult { let Spanned { v, span } = args.expect::>("condition")?; if !v { bail!(span, "assertion failed"); @@ -31,10 +31,10 @@ pub fn assert(_: &mut Vm, args: &mut Args) -> SourceResult { } /// Evaluate a string as Typst markup. -pub fn eval(vm: &mut Vm, args: &mut Args) -> SourceResult { +pub fn eval(vm: &Vm, args: &mut Args) -> SourceResult { let Spanned { v: text, span } = args.expect::>("source")?; let source = Source::synthesized(text, span); let route = Route::default(); - let module = model::eval(vm.world, route.track(), &source)?; + let module = model::eval(vm.world(), route.track(), &source)?; Ok(Value::Content(module.content)) } diff --git a/library/src/base/string.rs b/library/src/base/string.rs index ed444d354..058ee2486 100644 --- a/library/src/base/string.rs +++ b/library/src/base/string.rs @@ -3,12 +3,12 @@ use typst::model::Regex; use crate::prelude::*; /// The string representation of a value. -pub fn repr(_: &mut Vm, args: &mut Args) -> SourceResult { +pub fn repr(_: &Vm, args: &mut Args) -> SourceResult { Ok(args.expect::("value")?.repr().into()) } /// Convert a value to a string. -pub fn str(_: &mut Vm, args: &mut Args) -> SourceResult { +pub fn str(_: &Vm, args: &mut Args) -> SourceResult { let Spanned { v, span } = args.expect("value")?; Ok(Value::Str(match v { Value::Int(v) => format_str!("{}", v), @@ -19,29 +19,29 @@ pub fn str(_: &mut Vm, args: &mut Args) -> SourceResult { } /// Create blind text. -pub fn lorem(_: &mut Vm, args: &mut Args) -> SourceResult { +pub fn lorem(_: &Vm, args: &mut Args) -> SourceResult { let words: usize = args.expect("number of words")?; Ok(Value::Str(lipsum::lipsum(words).into())) } /// Create a regular expression. -pub fn regex(_: &mut Vm, args: &mut Args) -> SourceResult { +pub fn regex(_: &Vm, args: &mut Args) -> SourceResult { let Spanned { v, span } = args.expect::>("regular expression")?; Ok(Regex::new(&v).at(span)?.into()) } /// Converts an integer into one or multiple letters. -pub fn letter(_: &mut Vm, args: &mut Args) -> SourceResult { +pub fn letter(_: &Vm, args: &mut Args) -> SourceResult { numbered(Numbering::Letter, args) } /// Converts an integer into a roman numeral. -pub fn roman(_: &mut Vm, args: &mut Args) -> SourceResult { +pub fn roman(_: &Vm, args: &mut Args) -> SourceResult { numbered(Numbering::Roman, args) } /// Convert a number into a symbol. -pub fn symbol(_: &mut Vm, args: &mut Args) -> SourceResult { +pub fn symbol(_: &Vm, args: &mut Args) -> SourceResult { numbered(Numbering::Symbol, args) } diff --git a/library/src/graphics/hide.rs b/library/src/graphics/hide.rs index 0fdb86382..f79b31ae6 100644 --- a/library/src/graphics/hide.rs +++ b/library/src/graphics/hide.rs @@ -6,7 +6,7 @@ pub struct HideNode(pub Content); #[node(LayoutInline)] impl HideNode { - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { Ok(Self(args.expect("body")?).pack()) } } diff --git a/library/src/graphics/image.rs b/library/src/graphics/image.rs index 121212579..202abebe7 100644 --- a/library/src/graphics/image.rs +++ b/library/src/graphics/image.rs @@ -14,12 +14,12 @@ impl ImageNode { /// How the image should adjust itself to a given area. pub const FIT: ImageFit = ImageFit::Cover; - fn construct(vm: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(vm: &Vm, args: &mut Args) -> SourceResult { let Spanned { v: path, span } = args.expect::>("path to image file")?; let full = vm.locate(&path).at(span)?; - let buffer = vm.world.file(&full).at(span)?; + let buffer = vm.world().file(&full).at(span)?; let ext = full.extension().and_then(OsStr::to_str).unwrap_or_default(); let format = match ext.to_lowercase().as_str() { "png" => ImageFormat::Raster(RasterFormat::Png), diff --git a/library/src/graphics/line.rs b/library/src/graphics/line.rs index 112274d2d..e7c347b2e 100644 --- a/library/src/graphics/line.rs +++ b/library/src/graphics/line.rs @@ -15,7 +15,7 @@ impl LineNode { #[property(resolve, fold)] pub const STROKE: PartialStroke = PartialStroke::default(); - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { let origin = args.named("origin")?.unwrap_or_default(); let delta = match args.named::>>("to")? { diff --git a/library/src/graphics/shape.rs b/library/src/graphics/shape.rs index d484b993a..ebdc17170 100644 --- a/library/src/graphics/shape.rs +++ b/library/src/graphics/shape.rs @@ -38,7 +38,7 @@ impl ShapeNode { #[property(skip, resolve, fold)] pub const RADIUS: Corners>> = Corners::splat(Rel::zero()); - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { let size = match S { SQUARE => args.named::("size")?.map(Rel::from), CIRCLE => args.named::("radius")?.map(|r| 2.0 * Rel::from(r)), diff --git a/library/src/layout/align.rs b/library/src/layout/align.rs index 5e1b3555b..6337c9416 100644 --- a/library/src/layout/align.rs +++ b/library/src/layout/align.rs @@ -12,7 +12,7 @@ pub struct AlignNode { #[node(LayoutBlock)] impl AlignNode { - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { let aligns: Axes> = args.find()?.unwrap_or_default(); let body: Content = args.expect("body")?; diff --git a/library/src/layout/columns.rs b/library/src/layout/columns.rs index c5a340ee1..6e1aaeae3 100644 --- a/library/src/layout/columns.rs +++ b/library/src/layout/columns.rs @@ -17,7 +17,7 @@ impl ColumnsNode { #[property(resolve)] pub const GUTTER: Rel = Ratio::new(0.04).into(); - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { Ok(Self { columns: args.expect("column count")?, child: args.expect("body")?, @@ -106,7 +106,7 @@ pub struct ColbreakNode { #[node(Behave)] impl ColbreakNode { - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { let weak = args.named("weak")?.unwrap_or(false); Ok(Self { weak }.pack()) } diff --git a/library/src/layout/container.rs b/library/src/layout/container.rs index 408f67207..9a6ccb9f3 100644 --- a/library/src/layout/container.rs +++ b/library/src/layout/container.rs @@ -12,7 +12,7 @@ pub struct BoxNode { #[node(LayoutInline)] impl BoxNode { - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { let width = args.named("width")?; let height = args.named("height")?; let body = args.eat::()?.unwrap_or_default(); @@ -70,7 +70,7 @@ impl BlockNode { #[property(skip)] pub const BELOW: VNode = VNode::block_spacing(Em::new(1.2).into()); - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { Ok(Self(args.eat()?.unwrap_or_default()).pack()) } diff --git a/library/src/layout/grid.rs b/library/src/layout/grid.rs index 7f58090bf..3b5afcc57 100644 --- a/library/src/layout/grid.rs +++ b/library/src/layout/grid.rs @@ -15,7 +15,7 @@ pub struct GridNode { #[node(LayoutBlock)] impl GridNode { - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { let TrackSizings(columns) = args.named("columns")?.unwrap_or_default(); let TrackSizings(rows) = args.named("rows")?.unwrap_or_default(); let TrackSizings(base_gutter) = args.named("gutter")?.unwrap_or_default(); diff --git a/library/src/layout/pad.rs b/library/src/layout/pad.rs index 318d9f270..d860e54d6 100644 --- a/library/src/layout/pad.rs +++ b/library/src/layout/pad.rs @@ -11,7 +11,7 @@ pub struct PadNode { #[node(LayoutBlock)] impl PadNode { - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { let all = args.named("rest")?.or(args.find()?); let x = args.named("x")?; let y = args.named("y")?; diff --git a/library/src/layout/page.rs b/library/src/layout/page.rs index 3901740ca..f32493476 100644 --- a/library/src/layout/page.rs +++ b/library/src/layout/page.rs @@ -41,7 +41,7 @@ impl PageNode { #[property(referenced)] pub const FOREGROUND: Marginal = Marginal::None; - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { Ok(Self(args.expect("body")?).pack()) } @@ -150,7 +150,7 @@ pub struct PagebreakNode { #[node] impl PagebreakNode { - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { let weak = args.named("weak")?.unwrap_or(false); Ok(Self { weak }.pack()) } diff --git a/library/src/layout/place.rs b/library/src/layout/place.rs index a4f05a6c7..221e90082 100644 --- a/library/src/layout/place.rs +++ b/library/src/layout/place.rs @@ -7,7 +7,7 @@ pub struct PlaceNode(pub Content); #[node(LayoutBlock, Behave)] impl PlaceNode { - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { let aligns = args.find()?.unwrap_or(Axes::with_x(Some(GenAlign::Start))); let dx = args.named("dx")?.unwrap_or_default(); let dy = args.named("dy")?.unwrap_or_default(); diff --git a/library/src/layout/spacing.rs b/library/src/layout/spacing.rs index b42f90ef8..f5c39af45 100644 --- a/library/src/layout/spacing.rs +++ b/library/src/layout/spacing.rs @@ -13,7 +13,7 @@ pub struct HNode { #[node(Behave)] impl HNode { - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { let amount = args.expect("spacing")?; let weak = args.named("weak")?.unwrap_or(false); Ok(Self { amount, weak }.pack()) @@ -60,7 +60,7 @@ pub struct VNode { #[node(Behave)] impl VNode { - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { let amount = args.expect("spacing")?; let node = if args.named("weak")?.unwrap_or(false) { Self::weak(amount) diff --git a/library/src/layout/stack.rs b/library/src/layout/stack.rs index 12a1c384a..52de2c482 100644 --- a/library/src/layout/stack.rs +++ b/library/src/layout/stack.rs @@ -17,7 +17,7 @@ pub struct StackNode { #[node(LayoutBlock)] impl StackNode { - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { Ok(Self { dir: args.named("dir")?.unwrap_or(Dir::TTB), spacing: args.named("spacing")?, diff --git a/library/src/layout/transform.rs b/library/src/layout/transform.rs index c45aa165a..bee38cb44 100644 --- a/library/src/layout/transform.rs +++ b/library/src/layout/transform.rs @@ -13,7 +13,7 @@ pub struct MoveNode { #[node(LayoutInline)] impl MoveNode { - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { let dx = args.named("dx")?.unwrap_or_default(); let dy = args.named("dy")?.unwrap_or_default(); Ok(Self { @@ -60,7 +60,7 @@ impl TransformNode { #[property(resolve)] pub const ORIGIN: Axes> = Axes::default(); - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { let transform = match T { ROTATE => { let angle = args.named_or_find("angle")?.unwrap_or_default(); diff --git a/library/src/structure/heading.rs b/library/src/structure/heading.rs index d99e2db8e..cf732a4ea 100644 --- a/library/src/structure/heading.rs +++ b/library/src/structure/heading.rs @@ -16,7 +16,7 @@ pub struct HeadingNode { #[node(Show, Finalize)] impl HeadingNode { - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { Ok(Self { body: args.expect("body")?, level: args.named("level")?.unwrap_or(NonZeroUsize::new(1).unwrap()), diff --git a/library/src/structure/list.rs b/library/src/structure/list.rs index 2a3f3035f..222dcbcff 100644 --- a/library/src/structure/list.rs +++ b/library/src/structure/list.rs @@ -38,7 +38,7 @@ impl ListNode { /// The spacing between the items of a wide (non-tight) list. pub const SPACING: Smart = Smart::Auto; - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { let items = match L { LIST => args .all()? diff --git a/library/src/structure/reference.rs b/library/src/structure/reference.rs index 4f6727078..361f8c257 100644 --- a/library/src/structure/reference.rs +++ b/library/src/structure/reference.rs @@ -7,7 +7,7 @@ pub struct RefNode(pub EcoString); #[node(Show)] impl RefNode { - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { Ok(Self(args.expect("target")?).pack()) } diff --git a/library/src/structure/table.rs b/library/src/structure/table.rs index eaadc3a1f..54413b637 100644 --- a/library/src/structure/table.rs +++ b/library/src/structure/table.rs @@ -23,7 +23,7 @@ impl TableNode { /// How much to pad the cells's content. pub const PADDING: Rel = Abs::pt(5.0).into(); - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { let TrackSizings(columns) = args.named("columns")?.unwrap_or_default(); let TrackSizings(rows) = args.named("rows")?.unwrap_or_default(); let TrackSizings(base_gutter) = args.named("gutter")?.unwrap_or_default(); diff --git a/library/src/text/deco.rs b/library/src/text/deco.rs index 7db7fa1bc..3357f76c3 100644 --- a/library/src/text/deco.rs +++ b/library/src/text/deco.rs @@ -34,7 +34,7 @@ impl DecoNode { /// with the glyphs. Does not apply to strikethrough. pub const EVADE: bool = true; - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { Ok(Self(args.expect("body")?).pack()) } diff --git a/library/src/text/link.rs b/library/src/text/link.rs index fd7aec8a4..f682eea9e 100644 --- a/library/src/text/link.rs +++ b/library/src/text/link.rs @@ -29,7 +29,7 @@ impl LinkNode { #[property(skip, referenced)] pub(crate) const DEST: Option = None; - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { let dest = args.expect::("destination")?; Ok(match dest { Destination::Url(url) => match args.eat()? { diff --git a/library/src/text/mod.rs b/library/src/text/mod.rs index 458083108..813432108 100644 --- a/library/src/text/mod.rs +++ b/library/src/text/mod.rs @@ -128,7 +128,7 @@ impl TextNode { #[property(skip, fold)] const DECO: Decoration = vec![]; - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { // The text constructor is special: It doesn't create a text node. // Instead, it leaves the passed argument structurally unchanged, but // styles all text in it. @@ -416,7 +416,7 @@ pub struct SpaceNode; #[node(Unlabellable, Behave)] impl SpaceNode { - fn construct(_: &mut Vm, _: &mut Args) -> SourceResult { + fn construct(_: &Vm, _: &mut Args) -> SourceResult { Ok(Self.pack()) } } @@ -437,7 +437,7 @@ pub struct LinebreakNode { #[node(Behave)] impl LinebreakNode { - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { let justify = args.named("justify")?.unwrap_or(false); Ok(Self { justify }.pack()) } @@ -457,19 +457,19 @@ pub struct SmartQuoteNode { #[node] impl SmartQuoteNode { - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { let double = args.named("double")?.unwrap_or(true); Ok(Self { double }.pack()) } } /// Convert a string or content to lowercase. -pub fn lower(_: &mut Vm, args: &mut Args) -> SourceResult { +pub fn lower(_: &Vm, args: &mut Args) -> SourceResult { case(Case::Lower, args) } /// Convert a string or content to uppercase. -pub fn upper(_: &mut Vm, args: &mut Args) -> SourceResult { +pub fn upper(_: &Vm, args: &mut Args) -> SourceResult { case(Case::Upper, args) } @@ -503,7 +503,7 @@ impl Case { } /// Display text in small capitals. -pub fn smallcaps(_: &mut Vm, args: &mut Args) -> SourceResult { +pub fn smallcaps(_: &Vm, args: &mut Args) -> SourceResult { let body: Content = args.expect("content")?; Ok(Value::Content(body.styled(TextNode::SMALLCAPS, true))) } @@ -514,7 +514,7 @@ pub struct StrongNode(pub Content); #[node(Show)] impl StrongNode { - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { Ok(Self(args.expect("body")?).pack()) } @@ -538,7 +538,7 @@ pub struct EmphNode(pub Content); #[node(Show)] impl EmphNode { - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { Ok(Self(args.expect("body")?).pack()) } diff --git a/library/src/text/par.rs b/library/src/text/par.rs index 196878f83..1dd6a42c6 100644 --- a/library/src/text/par.rs +++ b/library/src/text/par.rs @@ -31,7 +31,7 @@ impl ParNode { /// How to determine line breaks. pub const LINEBREAKS: Smart = Smart::Auto; - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { // The paragraph constructor is special: It doesn't create a paragraph // node. Instead, it just ensures that the passed content lives is in a // separate paragraph and styles it. @@ -119,7 +119,7 @@ pub struct ParbreakNode; #[node(Unlabellable)] impl ParbreakNode { - fn construct(_: &mut Vm, _: &mut Args) -> SourceResult { + fn construct(_: &Vm, _: &mut Args) -> SourceResult { Ok(Self.pack()) } } @@ -132,7 +132,7 @@ pub struct RepeatNode(pub Content); #[node(LayoutInline)] impl RepeatNode { - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { Ok(Self(args.expect("body")?).pack()) } } diff --git a/library/src/text/raw.rs b/library/src/text/raw.rs index 101f527c9..e47875dcc 100644 --- a/library/src/text/raw.rs +++ b/library/src/text/raw.rs @@ -25,7 +25,7 @@ impl RawNode { #[property(referenced)] pub const LANG: Option = None; - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { Ok(Self { text: args.expect("text")?, block: args.named("block")?.unwrap_or(false), diff --git a/library/src/text/shift.rs b/library/src/text/shift.rs index e63211c65..b05f68b7d 100644 --- a/library/src/text/shift.rs +++ b/library/src/text/shift.rs @@ -30,7 +30,7 @@ impl ShiftNode { /// The font size for synthetic sub- and superscripts. pub const SIZE: TextSize = TextSize(Em::new(0.6).into()); - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult { + fn construct(_: &Vm, args: &mut Args) -> SourceResult { Ok(Self(args.expect("body")?).pack()) } diff --git a/macros/src/node.rs b/macros/src/node.rs index 45e91b2ef..d08fc66b4 100644 --- a/macros/src/node.rs +++ b/macros/src/node.rs @@ -284,7 +284,7 @@ fn create_node_construct_func(node: &Node) -> syn::ImplItemMethod { node.construct.clone().unwrap_or_else(|| { parse_quote! { fn construct( - _: &mut ::typst::model::Vm, + _: &::typst::model::Vm, _: &mut ::typst::model::Args, ) -> ::typst::diag::SourceResult<::typst::model::Content> { unimplemented!() diff --git a/src/model/array.rs b/src/model/array.rs index 40b063e23..5a2f86729 100644 --- a/src/model/array.rs +++ b/src/model/array.rs @@ -128,7 +128,7 @@ impl Array { } /// Return the first matching element. - pub fn find(&self, vm: &mut Vm, f: Spanned) -> SourceResult> { + pub fn find(&self, vm: &Vm, f: Spanned) -> SourceResult> { for item in self.iter() { let args = Args::new(f.span, [item.clone()]); if f.v.call(vm, args)?.cast::().at(f.span)? { @@ -140,7 +140,7 @@ impl Array { } /// Return the index of the first matching element. - pub fn position(&self, vm: &mut Vm, f: Spanned) -> SourceResult> { + pub fn position(&self, vm: &Vm, f: Spanned) -> SourceResult> { for (i, item) in self.iter().enumerate() { let args = Args::new(f.span, [item.clone()]); if f.v.call(vm, args)?.cast::().at(f.span)? { @@ -153,7 +153,7 @@ impl Array { /// Return a new array with only those elements for which the function /// returns true. - pub fn filter(&self, vm: &mut Vm, f: Spanned) -> SourceResult { + pub fn filter(&self, vm: &Vm, f: Spanned) -> SourceResult { let mut kept = vec![]; for item in self.iter() { let args = Args::new(f.span, [item.clone()]); @@ -165,7 +165,7 @@ impl Array { } /// Transform each item in the array with a function. - pub fn map(&self, vm: &mut Vm, f: Spanned) -> SourceResult { + pub fn map(&self, vm: &Vm, f: Spanned) -> SourceResult { let enumerate = f.v.argc() == Some(2); self.iter() .enumerate() @@ -181,7 +181,7 @@ impl Array { } /// Whether any element matches. - pub fn any(&self, vm: &mut Vm, f: Spanned) -> SourceResult { + pub fn any(&self, vm: &Vm, f: Spanned) -> SourceResult { for item in self.iter() { let args = Args::new(f.span, [item.clone()]); if f.v.call(vm, args)?.cast::().at(f.span)? { @@ -193,7 +193,7 @@ impl Array { } /// Whether all elements match. - pub fn all(&self, vm: &mut Vm, f: Spanned) -> SourceResult { + pub fn all(&self, vm: &Vm, f: Spanned) -> SourceResult { for item in self.iter() { let args = Args::new(f.span, [item.clone()]); if !f.v.call(vm, args)?.cast::().at(f.span)? { diff --git a/src/model/content.rs b/src/model/content.rs index 9d78020c4..90df5a4e0 100644 --- a/src/model/content.rs +++ b/src/model/content.rs @@ -362,7 +362,7 @@ pub trait Node: 'static + Capable { /// /// This is passed only the arguments that remain after execution of the /// node's set rule. - fn construct(vm: &mut Vm, args: &mut Args) -> SourceResult + fn construct(vm: &Vm, args: &mut Args) -> SourceResult where Self: Sized; diff --git a/src/model/dict.rs b/src/model/dict.rs index 49e50aa0d..270c2c9cd 100644 --- a/src/model/dict.rs +++ b/src/model/dict.rs @@ -105,7 +105,7 @@ impl Dict { } /// Transform each pair in the array with a function. - pub fn map(&self, vm: &mut Vm, f: Spanned) -> SourceResult { + pub fn map(&self, vm: &Vm, f: Spanned) -> SourceResult { self.iter() .map(|(key, value)| { let args = Args::new(f.span, [Value::Str(key.clone()), value.clone()]); diff --git a/src/model/eval.rs b/src/model/eval.rs index fb1bd121a..e68f6e7a4 100644 --- a/src/model/eval.rs +++ b/src/model/eval.rs @@ -1030,7 +1030,7 @@ impl Eval for ast::ModuleInclude { } /// Process an import of a module relative to the current location. -fn import(vm: &mut Vm, path: &str, span: Span) -> SourceResult { +fn import(vm: &Vm, path: &str, span: Span) -> SourceResult { // Load the source file. let full = vm.locate(path).at(span)?; let id = vm.world.resolve(&full).at(span)?; diff --git a/src/model/func.rs b/src/model/func.rs index d84a81708..c0431ac64 100644 --- a/src/model/func.rs +++ b/src/model/func.rs @@ -32,7 +32,7 @@ impl Func { /// Create a new function from a native rust function. pub fn from_fn( name: &'static str, - func: fn(&mut Vm, &mut Args) -> SourceResult, + func: fn(&Vm, &mut Args) -> SourceResult, ) -> Self { Self(Arc::new(Repr::Native(Native { name, func, set: None, node: None }))) } @@ -77,7 +77,7 @@ impl Func { } /// Call the function with the given arguments. - pub fn call(&self, vm: &mut Vm, mut args: Args) -> SourceResult { + pub fn call(&self, vm: &Vm, mut args: Args) -> SourceResult { let value = match self.0.as_ref() { Repr::Native(native) => (native.func)(vm, &mut args)?, Repr::Closure(closure) => closure.call(vm, &mut args)?, @@ -99,8 +99,8 @@ impl Func { let route = Route::default(); let id = SourceId::detached(); let scopes = Scopes::new(None); - let mut vm = Vm::new(world, route.track(), id, scopes); - self.call(&mut vm, args) + let vm = Vm::new(world, route.track(), id, scopes); + self.call(&vm, args) } /// Apply the given arguments to the function. @@ -160,7 +160,7 @@ struct Native { /// The name of the function. pub name: &'static str, /// The function pointer. - pub func: fn(&mut Vm, &mut Args) -> SourceResult, + pub func: fn(&Vm, &mut Args) -> SourceResult, /// The set rule. pub set: Option SourceResult>, /// The id of the node to customize with this function's show rule. @@ -196,7 +196,7 @@ pub struct Closure { impl Closure { /// Call the function in the context with the arguments. - pub fn call(&self, vm: &mut Vm, args: &mut Args) -> SourceResult { + pub fn call(&self, vm: &Vm, args: &mut Args) -> SourceResult { // Don't leak the scopes from the call site. Instead, we use the scope // of captured variables we collected earlier. let mut scopes = Scopes::new(None); diff --git a/src/model/methods.rs b/src/model/methods.rs index 5f879eeb0..c5c12ed24 100644 --- a/src/model/methods.rs +++ b/src/model/methods.rs @@ -7,7 +7,7 @@ use crate::util::EcoString; /// Call a method on a value. pub fn call( - vm: &mut Vm, + vm: &Vm, value: Value, method: &str, mut args: Args, diff --git a/src/model/scope.rs b/src/model/scope.rs index 1ab7032c6..d21d05876 100644 --- a/src/model/scope.rs +++ b/src/model/scope.rs @@ -78,7 +78,7 @@ impl Scope { pub fn def_fn( &mut self, name: &'static str, - func: fn(&mut Vm, &mut Args) -> SourceResult, + func: fn(&Vm, &mut Args) -> SourceResult, ) { self.define(name, Func::from_fn(name, func)); } diff --git a/src/model/vm.rs b/src/model/vm.rs index d13be29ce..d3509eae3 100644 --- a/src/model/vm.rs +++ b/src/model/vm.rs @@ -9,19 +9,22 @@ use crate::util::PathExt; use crate::World; /// A virtual machine. +/// +/// Holds the state needed to evaluate Typst sources. A new virtual machine is +/// created for each module evaluation and function call. pub struct Vm<'a> { /// The core context. - pub world: Tracked<'a, dyn World>, + pub(crate) world: Tracked<'a, dyn World>, /// The route of source ids the VM took to reach its current location. - pub route: Tracked<'a, Route>, + pub(crate) route: Tracked<'a, Route>, /// The current location. - pub location: SourceId, + pub(crate) location: SourceId, /// The stack of scopes. - pub scopes: Scopes<'a>, + pub(crate) scopes: Scopes<'a>, /// A control flow event that is currently happening. - pub flow: Option, + pub(crate) flow: Option, /// The language items. - pub items: LangItems, + pub(crate) items: LangItems, } impl<'a> Vm<'a> { @@ -42,6 +45,11 @@ impl<'a> Vm<'a> { } } + /// Access the underlying world. + pub fn world(&self) -> Tracked { + self.world + } + /// Resolve a user-entered path to be relative to the compilation /// environment's root. pub fn locate(&self, path: &str) -> StrResult {