summaryrefslogtreecommitdiff
path: root/devel/ocaml-sexplib/files/patch-lib_conv.ml
diff options
context:
space:
mode:
Diffstat (limited to 'devel/ocaml-sexplib/files/patch-lib_conv.ml')
-rw-r--r--devel/ocaml-sexplib/files/patch-lib_conv.ml46
1 files changed, 46 insertions, 0 deletions
diff --git a/devel/ocaml-sexplib/files/patch-lib_conv.ml b/devel/ocaml-sexplib/files/patch-lib_conv.ml
new file mode 100644
index 000000000000..4e1382e8aa58
--- /dev/null
+++ b/devel/ocaml-sexplib/files/patch-lib_conv.ml
@@ -0,0 +1,46 @@
+From cba80ebe02962504fbe404b1baf484a5000f44b4
+From: Jeremie Dimino <jdimino@janestreet.com>
+Date: Tue, 12 Jul 2016 17:08:10 +0100
+Subject: [PATCH] 114.01+04
+
+--- lib/conv.ml.orig 2016-03-09 15:44:55 UTC
++++ lib/conv.ml
+@@ -185,7 +185,7 @@ module Exn_converter = struct
+
+ (* [Obj.extension_id] works on both the exception itself, and the extension slot of the
+ exception. *)
+- let rec clean_up_handler (slot : Obj.t) =
++ let rec clean_up_handler (slot : extension_constructor) =
+ let id = Obj.extension_id slot in
+ let old_exn_id_map = !exn_id_map in
+ let new_exn_id_map = Exn_ids.remove id old_exn_id_map in
+@@ -196,7 +196,7 @@ module Exn_converter = struct
+ exn_id_map := new_exn_id_map
+
+ let add_auto ?(finalise = true) exn sexp_of_exn =
+- let id = Obj.extension_id exn in
++ let id = Obj.extension_id (Obj.extension_constructor exn) in
+ let rec loop () =
+ let old_exn_id_map = !exn_id_map in
+ let new_exn_id_map = Exn_ids.add id sexp_of_exn old_exn_id_map in
+@@ -205,13 +205,18 @@ module Exn_converter = struct
+ loop ()
+ else begin
+ exn_id_map := new_exn_id_map;
+- if finalise then Gc.finalise clean_up_handler (Obj.extension_slot exn)
++ if finalise then
++ try
++ Gc.finalise clean_up_handler (Obj.extension_constructor exn)
++ with Invalid_argument _ ->
++ (* Pre-allocated extension constructors cannot be finalised *)
++ ()
+ end
+ in
+ loop ()
+
+ let find_auto exn =
+- let id = Obj.extension_id exn in
++ let id = Obj.extension_id (Obj.extension_constructor exn) in
+ match Exn_ids.find id !exn_id_map with
+ | exception Not_found -> None
+ | sexp_of_exn -> Some (sexp_of_exn exn)