[m-rev.] diff: fix string/1 with version arrays

Julien Fischer jfischer at opturion.com
Tue Mar 4 01:46:06 AEDT 2014


Branches: master, 14.01

Make string/1 handle verison_arrays in the same way as io.write/3 etc.

library/string.m:
 	As above.
NEWS:
 	Add a section for 14.01.1 news.

 	Mention the above change.

tests/hard_coded/string_string.{m,exp}:
 	Extend this test case to cover arrays and version arrays.

Julien.

diff --git a/NEWS b/NEWS
index a08d669..9a7c7a6 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,12 @@
+NEWS for Mercury 14.01.1
+------------------------
+
+This is a bug-fix release.
+
+* The function string.string/1 and related functions now handle verison
+  arrays properly.
+
+
  NEWS for Mercury 14.01
  ----------------------

diff --git a/library/string.m b/library/string.m
index 6c8e138..c262e74 100644
--- a/library/string.m
+++ b/library/string.m
@@ -1119,6 +1119,7 @@
  :- implementation.

  :- import_module array.
+:- import_module bitmap.
  :- import_module bool.
  :- import_module float.
  :- import_module int.
@@ -1129,6 +1130,7 @@
  :- import_module std_util.
  :- import_module type_desc.
  :- import_module univ.
+:- import_module version_array.

  :- use_module rtti_implementation.
  :- use_module term_io.
@@ -6390,6 +6392,8 @@ value_to_revstrings_prio(NonCanon, OpsTable, Priority, X, !Rs) :-
          add_revstring(string.int_to_string(Int), !Rs)
      ; dynamic_cast(X, Float) ->
          add_revstring(string.float_to_string(Float), !Rs)
+    ; dynamic_cast(X, Bitmap) ->
+        add_revstring(term_io.quoted_string(bitmap.to_string(Bitmap)), !Rs)
      ; dynamic_cast(X, TypeDesc) ->
          type_desc_to_revstrings(TypeDesc, !Rs)
      ; dynamic_cast(X, TypeCtorDesc) ->
@@ -6423,6 +6427,16 @@ value_to_revstrings_prio(NonCanon, OpsTable, Priority, X, !Rs) :-
          det_dynamic_cast(X, Array),
          array_to_revstrings(NonCanon, OpsTable, Array, !Rs)
      ;
+        type_ctor_and_args(type_of(X), TypeCtor, ArgTypes),
+        ArgTypes = [ElemType],
+        type_ctor_name(TypeCtor) = "version_array",
+        type_ctor_module_name(TypeCtor) = "version_array"
+    ->
+        has_type(Elem, ElemType),
+        same_version_array_elem_type(VersionArray, Elem),
+        det_dynamic_cast(X, VersionArray),
+        version_array_to_revstrings(NonCanon, OpsTable, VersionArray, !Rs)
+    ;
          % Check if the type is private_builtin.type_info/1.
          % See the comments above for array.array/1.
          %
@@ -6443,6 +6457,11 @@ value_to_revstrings_prio(NonCanon, OpsTable, Priority, X, !Rs) :-

  same_array_elem_type(_, _).

+:- pred same_version_array_elem_type(version_array(T)::unused, T::unused)
+    is det.
+
+same_version_array_elem_type(_, _).
+
  :- pred same_private_builtin_type(private_builtin.type_info::unused,
      T::unused) is det.

@@ -6701,6 +6720,20 @@ array_to_revstrings(NonCanon, OpsTable, Array, !Rs) :-
          array.to_list(Array) `with_type` list(T), !Rs),
      add_revstring(")", !Rs).

+:- pred version_array_to_revstrings(noncanon_handling, ops.table, version_array(T),
+    revstrings, revstrings).
+:- mode version_array_to_revstrings(in(do_not_allow), in, in, in, out) is det.
+:- mode version_array_to_revstrings(in(canonicalize), in, in, in, out) is det.
+:- mode version_array_to_revstrings(in(include_details_cc), in, in, in, out)
+    is cc_multi.
+:- mode version_array_to_revstrings(in, in, in, in, out) is cc_multi.
+
+version_array_to_revstrings(NonCanon, OpsTable, Array, !Rs) :-
+    add_revstring("version_array(", !Rs),
+    value_to_revstrings(NonCanon, OpsTable,
+        version_array.to_list(Array) `with_type` list(T), !Rs),
+    add_revstring(")", !Rs).
+
  :- pred type_desc_to_revstrings(type_desc::in,
      revstrings::in, revstrings::out) is det.

diff --git a/tests/hard_coded/string_string.exp b/tests/hard_coded/string_string.exp
index 2c39043..93225c9 100644
--- a/tests/hard_coded/string_string.exp
+++ b/tests/hard_coded/string_string.exp
@@ -2,3 +2,5 @@ leaf
  branch(leaf, leaf)
  [1, 2, 3]
  1.234 - 5
+array([1, 2, 3])
+version_array([1, 2, 3])
diff --git a/tests/hard_coded/string_string.m b/tests/hard_coded/string_string.m
index 2b4b288..a099a68 100644
--- a/tests/hard_coded/string_string.m
+++ b/tests/hard_coded/string_string.m
@@ -1,37 +1,43 @@
  %-----------------------------------------------------------------------------%
+% vim: ft=mercury ts=4 sw=4 et wm=0 tw=0
+%-----------------------------------------------------------------------------%
  % string_string.m
  % Ralph Becket <rafe at cs.mu.oz.au>
  % Tue Oct  5 13:10:27 EST 2004
-% vim: ft=mercury ts=4 sw=4 et wm=0 tw=0
  %
  %-----------------------------------------------------------------------------%

  :- module string_string.
-
  :- interface.

  :- import_module io.

-
-
-:- pred main(io :: di, io :: uo) is det.
+:- pred main(io::di, io::uo) is det.

  %-----------------------------------------------------------------------------%
  %-----------------------------------------------------------------------------%

  :- implementation.

-:- import_module string, list, pair.
+:- import_module array.
+:- import_module list.
+:- import_module pair.
+:- import_module string.
+:- import_module version_array.

  :- type tree ---> leaf; branch(tree, tree).

  %-----------------------------------------------------------------------------%

  main(!IO) :-
+    array.from_list([1, 2, 3], Array),
+    VersionArray = version_array.from_list([1, 2, 3]),
      io.write_string(string.string(leaf) ++ "\n", !IO),
      io.write_string(string.string(branch(leaf, leaf)) ++ "\n", !IO),
      io.write_string(string.string([1,2,3]) ++ "\n", !IO),
-    io.write_string(string.string(1.234 - 5) ++ "\n", !IO).
+    io.write_string(string.string(1.234 - 5) ++ "\n", !IO),
+    io.write_string(string.string(Array) ++ "\n", !IO),
+    io.write_string(string.string(VersionArray) ++ "\n", !IO).

  %-----------------------------------------------------------------------------%
  %-----------------------------------------------------------------------------%



More information about the reviews mailing list