allocate negator results in arena (#1898)
This commit is contained in:
@@ -242,9 +242,11 @@ impl<T: fmt::Display> fmt::Display for TypedArenaPtr<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<T: ?Sized + ArenaAllocated> TypedArenaPtr<T> {
|
impl<T: ?Sized + ArenaAllocated> TypedArenaPtr<T> {
|
||||||
|
// data must be allocated in the arena already.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub const fn new(data: *mut T) -> Self {
|
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]
|
#[inline]
|
||||||
|
|||||||
@@ -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)
|
fn negate_number<N, Negator, ToLiteral>(&mut self, n: N, negator: Negator, constr: ToLiteral)
|
||||||
where
|
where
|
||||||
Negator: Fn(N) -> N,
|
Negator: Fn(N, &mut Arena) -> N,
|
||||||
ToLiteral: Fn(N, &mut Arena) -> Literal,
|
ToLiteral: Fn(N, &mut Arena) -> Literal,
|
||||||
{
|
{
|
||||||
if let Some(desc) = self.stack.last().cloned() {
|
if let Some(desc) = self.stack.last().cloned() {
|
||||||
@@ -938,7 +938,9 @@ impl<'a, R: CharRead> Parser<'a, R> {
|
|||||||
self.stack.pop();
|
self.stack.pop();
|
||||||
self.terms.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);
|
self.shift(Token::Literal(literal), 0, TERM);
|
||||||
|
|
||||||
return;
|
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 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 i: Integer = (*t).clone();
|
||||||
let mut data = i.neg();
|
let data = i.neg();
|
||||||
TypedArenaPtr::new(&mut data)
|
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 r: Rational = (*t).clone();
|
||||||
let mut data = r.neg();
|
let data = r.neg();
|
||||||
TypedArenaPtr::new(&mut data)
|
arena_alloc!(data, arena)
|
||||||
}
|
}
|
||||||
|
|
||||||
match token {
|
match token {
|
||||||
Token::Literal(Literal::Fixnum(n)) => {
|
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)) => {
|
Token::Literal(Literal::Integer(n)) => {
|
||||||
self.negate_number(n, negate_int_rc, |n, _| 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(
|
Token::Literal(Literal::Float(n)) => self.negate_number(
|
||||||
**n.as_ptr(),
|
**n.as_ptr(),
|
||||||
|n| -n,
|
|n, _| -n,
|
||||||
|n, arena| Literal::from(float_alloc!(n, arena)),
|
|n, arena| Literal::from(float_alloc!(n, arena)),
|
||||||
),
|
),
|
||||||
Token::Literal(c) => {
|
Token::Literal(c) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user