[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