use heap_pstr_iter in AtomChars (#482)

This commit is contained in:
Mark Thom
2020-05-10 15:46:51 -06:00
parent c1df7ead1a
commit 540bc71873
2 changed files with 25 additions and 21 deletions

View File

@@ -932,7 +932,7 @@ atom_chars(Atom, List) :-
),
( var(Atom) ->
( var(Tail) -> throw(error(instantiation_error, atom_chars/2))
; ground(List), Tail == [] -> '$atom_chars'(Atom, List)
; ground(List) -> '$atom_chars'(Atom, List)
; throw(error(instantiation_error, atom_chars/2))
)
; atom(Atom) -> can_be_chars_or_vars(List, atom_chars/2), '$atom_chars'(Atom, List)

View File

@@ -864,15 +864,11 @@ impl MachineState {
self.unify(a2, list_of_chars);
}
addr if addr.is_ref() => {
let stub = MachineError::functor_stub(clause_name!("atom_chars"), 2);
let mut iter = self.heap_pstr_iter(self[temp_v!(2)]);
let string = iter.to_string();
match self.try_from_list(temp_v!(2), stub) {
Err(e) => {
return Err(e);
}
Ok(addrs) => {
match self.try_char_list(addrs) {
Ok(string) => {
match iter.focus() {
Addr::EmptyList => {
let chars = clause_name!(string, indices.atom_tbl);
let atom = self.heap.to_unifiable(
HeapCellValue::Atom(chars, None)
@@ -880,14 +876,22 @@ impl MachineState {
self.unify(addr, atom);
}
Err(err) => {
focus => {
let stub = MachineError::functor_stub(
clause_name!("atom_chars"),
2,
);
if let Addr::Lis(l) = focus {
let err = MachineError::type_error(
self.heap.h(),
ValidType::Character,
Addr::HeapCell(l),
);
return Err(self.error_form(err, stub));
}
} else {
unreachable!()
}
}
}