use heap_pstr_iter in AtomChars (#482)
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user