aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPatrick Walton <[email protected]>2010-12-21 15:58:17 -0800
committerPatrick Walton <[email protected]>2010-12-21 15:59:14 -0800
commitd7cbeba731716f176f4c116cfe92f3ec246e1396 (patch)
tree6f4693f2689e63f5beeb46cc0b6854833ea4aad8 /src
parentAdd std.sort, with a simple mergesort. (diff)
downloadrust-d7cbeba731716f176f4c116cfe92f3ec246e1396.tar.xz
rust-d7cbeba731716f176f4c116cfe92f3ec246e1396.zip
rustboot: Only bottom out at opaque IL types after finding two cycles. DON'T ASK ME WHY THIS WORKS.
Diffstat (limited to 'src')
-rw-r--r--src/boot/me/semant.ml2
-rw-r--r--src/boot/util/common.ml7
2 files changed, 8 insertions, 1 deletions
diff --git a/src/boot/me/semant.ml b/src/boot/me/semant.ml
index cea0b479..019cd13e 100644
--- a/src/boot/me/semant.ml
+++ b/src/boot/me/semant.ml
@@ -2425,7 +2425,7 @@ and referent_type
Some parent_tags
when boxed
&& parent_tags <> []
- && List.mem ttag parent_tags
+ && (list_count ttag parent_tags) > 1
&& is_back_edge ttag (List.hd parent_tags) ->
Il.StructTy [| word; Il.OpaqueTy |]
| _ -> tag ttag
diff --git a/src/boot/util/common.ml b/src/boot/util/common.ml
index 7a95573c..f9b18246 100644
--- a/src/boot/util/common.ml
+++ b/src/boot/util/common.ml
@@ -380,6 +380,13 @@ let rec list_drop n ls =
else list_drop (n-1) (List.tl ls)
;;
+let rec list_count elem lst =
+ match lst with
+ [] -> 0
+ | h::t when h = elem -> 1 + (list_count elem t)
+ | _::t -> list_count elem t
+;;
+
(*
* Auxiliary pair functions.