]> Repositorios git - scryer-prolog.git/commitdiff
use heap_pstr_iter in AtomChars (#482)
authorMark Thom <[email protected]>
Sun, 10 May 2020 21:46:51 +0000 (15:46 -0600)
committerMark Thom <[email protected]>
Sun, 10 May 2020 21:46:51 +0000 (15:46 -0600)
src/prolog/lib/builtins.pl
src/prolog/machine/system_calls.rs

index 798e201a8b1a61f82429f68d493455599184926d..0cf39457300b94ea510a9ae327dce5e041eb4cbf 100644 (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)
index b1abfdd2dc6c36476ba9bafc63a8e90e37f3998e..025997169c0dbb20074a12964ea7368c73083141 100644 (file)
@@ -864,30 +864,34 @@ 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 iter.focus() {
+                            Addr::EmptyList => {
+                                let chars = clause_name!(string, indices.atom_tbl);
+                                let atom  = self.heap.to_unifiable(
+                                    HeapCellValue::Atom(chars, None)
+                                );
 
-                        match self.try_from_list(temp_v!(2), stub) {
-                            Err(e) => {
-                                return Err(e);
+                                self.unify(addr, atom);
                             }
-                            Ok(addrs) => {
-                                match self.try_char_list(addrs) {
-                                    Ok(string) => {
-                                        let chars = clause_name!(string, indices.atom_tbl);
-                                        let atom  = self.heap.to_unifiable(
-                                            HeapCellValue::Atom(chars, None)
-                                        );
-
-                                        self.unify(addr, atom);
-                                    }
-                                    Err(err) => {
-                                        let stub = MachineError::functor_stub(
-                                            clause_name!("atom_chars"),
-                                            2,
-                                        );
+                            focus => {
+                                let stub = MachineError::functor_stub(
+                                    clause_name!("atom_chars"),
+                                    2,
+                                );
 
-                                        return Err(self.error_form(err, stub));
-                                    }
+                                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!()
                                 }
                             }
                         }