allocate negator results in arena (#1898)

This commit is contained in:
Mark
2023-08-02 19:50:27 -06:00
parent 2c05ebbded
commit ec450fc567
2 changed files with 15 additions and 11 deletions

View File

@@ -242,9 +242,11 @@ impl<T: fmt::Display> fmt::Display for TypedArenaPtr<T> {
}
impl<T: ?Sized + ArenaAllocated> TypedArenaPtr<T> {
// 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]

View File

@@ -926,7 +926,7 @@ impl<'a, R: CharRead> Parser<'a, R> {
fn negate_number<N, Negator, ToLiteral>(&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<Integer>) -> TypedArenaPtr<Integer> {
fn negate_int_rc(t: TypedArenaPtr<Integer>, arena: &mut Arena) -> TypedArenaPtr<Integer> {
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<Rational>) -> TypedArenaPtr<Rational> {
fn negate_rat_rc(t: TypedArenaPtr<Rational>, arena: &mut Arena) -> TypedArenaPtr<Rational> {
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) => {