allocate floats in dedicated buffer

This commit is contained in:
Mark Thom
2022-04-04 23:56:30 -06:00
parent 0ab928063e
commit 8c99d748e2
14 changed files with 204 additions and 195 deletions

View File

@@ -1,5 +1,4 @@
use lexical::parse_lossy;
use ordered_float::*;
use crate::atom_table::*;
pub use crate::machine::machine_state::*;
@@ -633,12 +632,8 @@ impl<'a, R: CharRead> Lexer<'a, R> {
fn vacate_with_float(&mut self, mut token: String) -> Result<Token, ParserError> {
self.return_char(token.pop().unwrap());
let result = OrderedFloat(parse_lossy::<f64, _>(token.as_bytes())?);
Ok(Token::Literal(Literal::Float(arena_alloc!(
result,
&mut self.machine_st.arena
))))
let n = parse_lossy::<f64, _>(token.as_bytes())?;
Ok(Token::Literal(Literal::Float(float_alloc!(n, self.machine_st.arena))))
}
fn skip_underscore_in_number(&mut self) -> Result<char, ParserError> {
@@ -748,20 +743,18 @@ impl<'a, R: CharRead> Lexer<'a, R> {
}
}
let n = OrderedFloat(parse_lossy::<f64, _>(token.as_bytes())?);
Ok(Token::Literal(Literal::Float(arena_alloc!(
n,
&mut self.machine_st.arena
))))
let n = parse_lossy::<f64, _>(token.as_bytes())?;
Ok(Token::Literal(Literal::Float(
float_alloc!(n, self.machine_st.arena)
)))
} else {
return Ok(self.vacate_with_float(token)?);
}
} else {
let n = OrderedFloat(parse_lossy::<f64, _>(token.as_bytes())?);
Ok(Token::Literal(Literal::Float(arena_alloc!(
n,
&mut self.machine_st.arena
))))
let n = parse_lossy::<f64, _>(token.as_bytes())?;
Ok(Token::Literal(Literal::Float(
float_alloc!(n, self.machine_st.arena)
)))
}
} else {
self.return_char('.');

View File

@@ -4,8 +4,6 @@ use crate::parser::ast::*;
use crate::parser::char_reader::*;
use crate::parser::lexer::*;
use ordered_float::OrderedFloat;
use rug::ops::NegAssign;
use std::cell::Cell;
@@ -949,8 +947,8 @@ impl<'a, R: CharRead> Parser<'a, R> {
}
Token::Literal(Literal::Float(n)) => self.negate_number(
**n,
|n| OrderedFloat(-n.into_inner()),
|n, arena| Literal::Float(arena_alloc!(n, arena)),
|n| -n,
|n, arena| Literal::Float(float_alloc!(n, arena))
),
Token::Literal(c) => {
if let Some(name) = atomize_constant(&mut self.lexer.machine_st.atom_tbl, c) {