From: Mark Thom Date: Wed, 9 Mar 2022 04:25:19 +0000 (-0700) Subject: fix parser bounds check bug (#1333, #1301) X-Git-Tag: v0.9.1~120 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=bd5d6d0686791eb44628afa83e9f600209a67104;p=scryer-prolog.git fix parser bounds check bug (#1333, #1301) --- diff --git a/src/machine/system_calls.rs b/src/machine/system_calls.rs index c435503d..5e23e19e 100644 --- a/src/machine/system_calls.rs +++ b/src/machine/system_calls.rs @@ -3302,8 +3302,8 @@ impl Machine { .get_name(); let op = read_heap_cell!(self.machine_st.store(self.machine_st.deref(op)), - (HeapCellValueTag::Char) => { - self.machine_st.atom_tbl.build_with(&op.to_string()) + (HeapCellValueTag::Char, c) => { + self.machine_st.atom_tbl.build_with(&c.to_string()) } (HeapCellValueTag::Atom, (name, _arity)) => { name diff --git a/src/parser/parser.rs b/src/parser/parser.rs index 2d6334c0..45f98ab8 100644 --- a/src/parser/parser.rs +++ b/src/parser/parser.rs @@ -823,13 +823,13 @@ impl<'a, R: CharRead> Parser<'a, R> { self.reduce_op(1400); - if self.stack.len() == 1 { + if self.stack.len() <= 1 { return false; } let idx = self.stack.len() - 2; - let td = self.stack.remove(idx); + match td.tt { TokenType::Open | TokenType::OpenCT => { if self.stack[idx].tt == TokenType::Comma { diff --git a/src/types.rs b/src/types.rs index b151ee23..0c2f289d 100644 --- a/src/types.rs +++ b/src/types.rs @@ -5,9 +5,6 @@ use crate::machine::machine_indices::*; use crate::machine::partial_string::PartialString; use crate::machine::streams::*; use crate::parser::ast::Fixnum; -use crate::parser::rug::{Integer, Rational}; - -use ordered_float::OrderedFloat; use std::cmp::Ordering; use std::convert::TryFrom; @@ -244,56 +241,6 @@ pub struct HeapCellValue { tag: HeapCellValueTag, } -impl fmt::Display for HeapCellValue { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - read_heap_cell!(*self, - (HeapCellValueTag::Atom, (name, arity)) => { - if arity == 0 { - write!(f, "{}", name.as_str()) - } else { - write!( - f, - "{}/{}", - name.as_str(), - arity - ) - } - } - (HeapCellValueTag::PStr, pstr_atom) => { - let pstr = PartialString::from(pstr_atom); - - write!( - f, - "pstr ( \"{}\", )", - pstr.as_str_from(0) - ) - } - (HeapCellValueTag::Cons, c) => { - match_untyped_arena_ptr!(c, - (ArenaHeaderTag::Integer, n) => { - write!(f, "{}", n) - } - (ArenaHeaderTag::Rational, r) => { - write!(f, "{}", r) - } - (ArenaHeaderTag::F64, fl) => { - write!(f, "{}", fl) - } - (ArenaHeaderTag::Stream, stream) => { - write!(f, "$stream({})", stream.as_ptr() as usize) - } - _ => { - write!(f, "") - } - ) - } - _ => { - unreachable!() - } - ) - } -} - impl fmt::Debug for HeapCellValue { fn fmt(&self, f: &mut std::fmt::Formatter) -> fmt::Result { match self.get_tag() {