diff options
author | Luc Maranget <luc.maranget@inria.fr> | 2010-01-25 14:52:00 +0000 |
---|---|---|
committer | Luc Maranget <luc.maranget@inria.fr> | 2010-01-25 14:52:00 +0000 |
commit | e7ada9b93a02d39cd62f6fd7d9f629429ef51273 (patch) | |
tree | 0d5771c12e6ab43afb23e5976c1ab35686a66b30 /stdlib/printexc.ml | |
parent | 924e832b687e914f4173bb52ec39806b1b6192a8 (diff) | |
download | ocaml-jo311.tar.gz |
Preparing relase 3.11.2jo311
git-svn-id: http://caml.inria.fr/svn/ocaml/branches/jo311@9590 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'stdlib/printexc.ml')
-rw-r--r-- | stdlib/printexc.ml | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/stdlib/printexc.ml b/stdlib/printexc.ml index f06717c274..11e7d4fd6e 100644 --- a/stdlib/printexc.ml +++ b/stdlib/printexc.ml @@ -15,6 +15,8 @@ open Printf;; +let printers = ref [] + let locfmt = format_of_string "File \"%s\", line %d, characters %d-%d: %s";; let field x i = @@ -48,9 +50,16 @@ let to_string = function | Assert_failure(file, line, char) -> sprintf locfmt file line char (char+6) "Assertion failed" | x -> - let x = Obj.repr x in - let constructor = (Obj.magic(Obj.field (Obj.field x 0) 0) : string) in - constructor ^ (fields x) + let rec conv = function + | hd :: tl -> + (match try hd x with _ -> None with + | Some s -> s + | None -> conv tl) + | [] -> + let x = Obj.repr x in + let constructor = (Obj.magic(Obj.field (Obj.field x 0) 0) : string) in + constructor ^ (fields x) in + conv !printers ;; let print fct arg = @@ -125,3 +134,5 @@ let get_backtrace () = external record_backtrace: bool -> unit = "caml_record_backtrace" external backtrace_status: unit -> bool = "caml_backtrace_status" +let register_printer fn = + printers := fn :: !printers |