chiark / gitweb /
spec loop detecton: Detect for magic too.
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 16 May 2022 01:58:39 +0000 (02:58 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 16 May 2022 02:09:35 +0000 (03:09 +0100)
Introduce PieceLoadArgs::recursing, and use it in the one current call
site.

Make the error more general.  So now we can call it for magic too.

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/gamestate.rs
src/pcaliases.rs
src/shapelib.rs
src/spec.rs

index b4200be053b062a31654c088cf4da3cd824ca565..62cd3b39f06f4ffc5dff7daf8c0605bf720ca7c2 100644 (file)
@@ -411,6 +411,15 @@ impl SpecDepth {
   }
 }
 
+impl<'a> PieceLoadArgs<'a> {
+  #[throws(SpE)]
+  pub fn recursing(mut self) -> Self {
+    self.depth = self.depth.increment()
+      .ok_or_else(|| SpE::ImageOrAliasLoop)?;
+    self
+  }
+}
+
 #[derive(Error, Debug)]
 #[error("{self:?}")]
 pub struct PieceTraitDowncastFailed<'p> {
index 84b0788fb8d5875b34c6e3c2d15fb52f6c9ed4d9..1a2281fcc4a5dd0aa83a889da9d68b3f8859d78f 100644 (file)
@@ -49,9 +49,7 @@ impl Alias {
 
   #[throws(SpecError)]
   fn new_depth(&self, depth: SpecDepth) -> SpecDepth {
-    depth.increment().ok_or_else(||{
-      SpE::AliasLoop(self.target.clone())
-    })?
+    depth.increment().ok_or_else(|| SpE::ImageOrAliasLoop)?
   }
 }
 
@@ -64,9 +62,9 @@ impl PieceSpec for Alias {
     self.resolve(pcaliases)?.count(&default())?
   }
   #[throws(SpecError)]
-  fn load(&self, PLA { i,gpc,ig,depth,.. }: PLA) -> SpecLoaded {
-    let r = self.resolve(&ig.pcaliases)?
-      .load(PLA { i, gpc, ig, depth: self.new_depth(depth)? })?;
+  fn load(&self, pla: PLA) -> SpecLoaded {
+    let r = self.resolve(&pla.ig.pcaliases)?
+      .load(pla.recursing()?)?;
     r
   }
   #[throws(SpecError)]
index 43150defa0f941b438ab43ab0a3679dbdee80699..669b393d460098fc5261f7de27ccbde51c0b7fc4 100644 (file)
@@ -481,7 +481,7 @@ impl PieceSpec for ItemSpec {
     self.find_load_general(
       pla.ig, pla.depth,
       |loaded| Ok(loaded.into()),
-      |magic| magic.load(pla),
+      |magic| magic.load(pla.recursing()?)
     )?
   }
   #[throws(SpecError)]
index 07929b0da3a118c0a333011bdf8b03eb7d31994f..31e4eff0d5e83885143a17aeb65bdb8bc5e5f512 100644 (file)
@@ -89,7 +89,7 @@ pub enum SpecError {
   #[error("piece alias not found")]          AliasNotFound,
   #[error("piece alias target is multi spec")] AliasTargetMultiSpec,
   #[error("invalid range ({0} to {1})")]     InvalidRange(usize,usize),
-  #[error("piece alias loop")]               AliasLoop(String),
+  #[error("piece image/alias depth exceeded")] ImageOrAliasLoop,
   #[error("invalid size scale")]             InvalidSizeScale,
   #[error("multiple faces required")]        MultipleFacesRequired,
   #[error("far too many faces ({0})")]       FarTooManyFaces(usize),