From ec450fc567b7da959b3930073226034711c7cbae Mon Sep 17 00:00:00 2001 From: Mark Date: Wed, 2 Aug 2023 19:50:27 -0600 Subject: [PATCH] allocate negator results in arena (#1898) --- src/arena.rs | 4 +++- src/parser/parser.rs | 22 ++++++++++++---------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/arena.rs b/src/arena.rs index 3d321c5a..66b5c27b 100644 --- a/src/arena.rs +++ b/src/arena.rs @@ -242,9 +242,11 @@ impl fmt::Display for TypedArenaPtr { } impl TypedArenaPtr { + // data must be allocated in the arena already. #[inline] pub const fn new(data: *mut T) -> Self { - unsafe { TypedArenaPtr(ptr::NonNull::new_unchecked(data)) } + let result = unsafe { TypedArenaPtr(ptr::NonNull::new_unchecked(data)) }; + result } #[inline] diff --git a/src/parser/parser.rs b/src/parser/parser.rs index b14e0923..edf5d883 100644 --- a/src/parser/parser.rs +++ b/src/parser/parser.rs @@ -926,7 +926,7 @@ impl<'a, R: CharRead> Parser<'a, R> { fn negate_number(&mut self, n: N, negator: Negator, constr: ToLiteral) where - Negator: Fn(N) -> N, + Negator: Fn(N, &mut Arena) -> N, ToLiteral: Fn(N, &mut Arena) -> Literal, { if let Some(desc) = self.stack.last().cloned() { @@ -938,7 +938,9 @@ impl<'a, R: CharRead> Parser<'a, R> { self.stack.pop(); self.terms.pop(); - let literal = constr(negator(n), &mut self.lexer.machine_st.arena); + let arena = &mut self.lexer.machine_st.arena; + let literal = constr(negator(n, arena), arena); + self.shift(Token::Literal(literal), 0, TERM); return; @@ -953,21 +955,21 @@ impl<'a, R: CharRead> Parser<'a, R> { } fn shift_token(&mut self, token: Token, op_dir: &CompositeOpDir) -> Result<(), ParserError> { - fn negate_int_rc(t: TypedArenaPtr) -> TypedArenaPtr { + fn negate_int_rc(t: TypedArenaPtr, arena: &mut Arena) -> TypedArenaPtr { let i: Integer = (*t).clone(); - let mut data = i.neg(); - TypedArenaPtr::new(&mut data) + let data = i.neg(); + arena_alloc!(data, arena) } - fn negate_rat_rc(t: TypedArenaPtr) -> TypedArenaPtr { + fn negate_rat_rc(t: TypedArenaPtr, arena: &mut Arena) -> TypedArenaPtr { let r: Rational = (*t).clone(); - let mut data = r.neg(); - TypedArenaPtr::new(&mut data) + let data = r.neg(); + arena_alloc!(data, arena) } match token { Token::Literal(Literal::Fixnum(n)) => { - self.negate_number(n, |n| -n, |n, _| Literal::Fixnum(n)) + self.negate_number(n, |n, _| -n, |n, _| Literal::Fixnum(n)) } Token::Literal(Literal::Integer(n)) => { self.negate_number(n, negate_int_rc, |n, _| Literal::Integer(n)) @@ -977,7 +979,7 @@ impl<'a, R: CharRead> Parser<'a, R> { } Token::Literal(Literal::Float(n)) => self.negate_number( **n.as_ptr(), - |n| -n, + |n, _| -n, |n, arena| Literal::from(float_alloc!(n, arena)), ), Token::Literal(c) => { -- 2.54.0