From d5c2e5559be96b396871a69fc4b7fd6c7b81f171 Mon Sep 17 00:00:00 2001 From: CUB3D Date: Fri, 2 Apr 2021 23:17:28 +0100 Subject: [PATCH] avm2: Don't mutably borrow for pos() --- core/src/avm2/activation.rs | 8 ++++---- swf/src/avm1/read.rs | 5 +++++ swf/src/avm2/read.rs | 5 +++++ swf/src/extensions.rs | 8 +++++++- swf/src/read.rs | 5 +++++ 5 files changed, 26 insertions(+), 5 deletions(-) diff --git a/core/src/avm2/activation.rs b/core/src/avm2/activation.rs index 6dc007301..97b53c40c 100644 --- a/core/src/avm2/activation.rs +++ b/core/src/avm2/activation.rs @@ -2393,14 +2393,14 @@ impl<'a, 'gc, 'gc_context> Activation<'a, 'gc, 'gc_context> { ) -> Result, Error> { let index = self.context.avm2.pop().coerce_to_i32(self)?; - //TODO: can we just subtract the size of *this* op to save some of this maths let offset = case_offsets .get(index as usize) .copied() .unwrap_or(default_offset) - + current_pos as i32; - let current_pos = reader.pos(full_data) as i32; - reader.seek(full_data, offset - current_pos); + + current_pos as i32 + - reader.pos(full_data) as i32; + + reader.seek(full_data, offset); Ok(FrameControl::Continue) } diff --git a/swf/src/avm1/read.rs b/swf/src/avm1/read.rs index aebcef494..b4c159023 100644 --- a/swf/src/avm1/read.rs +++ b/swf/src/avm1/read.rs @@ -15,6 +15,11 @@ impl<'a> ReadSwfExt<'a> for Reader<'a> { fn as_mut_slice(&mut self) -> &mut &'a [u8] { &mut self.input } + + #[inline(always)] + fn as_slice(&self) -> &'a [u8] { + &self.input + } } impl<'a> Reader<'a> { diff --git a/swf/src/avm2/read.rs b/swf/src/avm2/read.rs index e53f64cd9..45075a95c 100644 --- a/swf/src/avm2/read.rs +++ b/swf/src/avm2/read.rs @@ -12,6 +12,11 @@ impl<'a> ReadSwfExt<'a> for Reader<'a> { fn as_mut_slice(&mut self) -> &mut &'a [u8] { &mut self.input } + + #[inline(always)] + fn as_slice(&self) -> &'a [u8] { + &self.input + } } impl<'a> Reader<'a> { diff --git a/swf/src/extensions.rs b/swf/src/extensions.rs index 112a12d99..b791cdc0f 100644 --- a/swf/src/extensions.rs +++ b/swf/src/extensions.rs @@ -6,9 +6,15 @@ use std::io::{self, Read}; pub trait ReadSwfExt<'a> { fn as_mut_slice(&mut self) -> &mut &'a [u8]; + fn as_slice(&self) -> &'a [u8]; + + fn pos(&self, data: &[u8]) -> usize { + self.as_slice().as_ptr() as usize - data.as_ptr() as usize + } + // TODO: Make this fallible? fn seek(&mut self, data: &'a [u8], relative_offset: isize) { - let mut pos = self.as_mut_slice().as_ptr() as usize - data.as_ptr() as usize; + let mut pos = self.pos(data); pos = (pos as isize + relative_offset) as usize; pos = pos.min(data.len()); *self.as_mut_slice() = &data[pos..]; diff --git a/swf/src/read.rs b/swf/src/read.rs index 1d3c58e54..8c584e9e3 100644 --- a/swf/src/read.rs +++ b/swf/src/read.rs @@ -243,6 +243,11 @@ impl<'a> ReadSwfExt<'a> for Reader<'a> { fn as_mut_slice(&mut self) -> &mut &'a [u8] { &mut self.input } + + #[inline(always)] + fn as_slice(&self) -> &'a [u8] { + &self.input + } } impl<'a> Reader<'a> {