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(Atom) ->
( var(Tail) -> throw(error(instantiation_error, atom_chars/2)) ( 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)) ; throw(error(instantiation_error, atom_chars/2))
) )
; atom(Atom) -> can_be_chars_or_vars(List, atom_chars/2), '$atom_chars'(Atom, List) ; atom(Atom) -> can_be_chars_or_vars(List, atom_chars/2), '$atom_chars'(Atom, List)

View File

@@ -864,30 +864,34 @@ impl MachineState {
self.unify(a2, list_of_chars); self.unify(a2, list_of_chars);
} }
addr if addr.is_ref() => { 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) { match iter.focus() {
Err(e) => { Addr::EmptyList => {
return Err(e); let chars = clause_name!(string, indices.atom_tbl);
let atom = self.heap.to_unifiable(
HeapCellValue::Atom(chars, None)
);
self.unify(addr, atom);
} }
Ok(addrs) => { focus => {
match self.try_char_list(addrs) { let stub = MachineError::functor_stub(
Ok(string) => { clause_name!("atom_chars"),
let chars = clause_name!(string, indices.atom_tbl); 2,
let atom = self.heap.to_unifiable( );
HeapCellValue::Atom(chars, None)
);
self.unify(addr, atom); if let Addr::Lis(l) = focus {
} let err = MachineError::type_error(
Err(err) => { self.heap.h(),
let stub = MachineError::functor_stub( ValidType::Character,
clause_name!("atom_chars"), Addr::HeapCell(l),
2, );
);
return Err(self.error_form(err, stub)); return Err(self.error_form(err, stub));
} } else {
unreachable!()
} }
} }
} }