From abc7df52bc9a3a3ea1b2ab2b140f60b476e8b29c Mon Sep 17 00:00:00 2001 From: Alain Frisch Date: Mon, 1 Sep 2014 08:38:29 +0000 Subject: [PATCH 001/494] Cherry-pick commit 15171 from trunk (#6529: further optimize consistency check). git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15172 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- toplevel/topdirs.ml | 2 +- toplevel/toploop.ml | 2 +- typing/env.ml | 44 ++++++++++++++++++++++++++++---------------- typing/env.mli | 2 +- 4 files changed, 31 insertions(+), 19 deletions(-) diff --git a/toplevel/topdirs.ml b/toplevel/topdirs.ml index d3387a3f19..59ce633cdf 100644 --- a/toplevel/topdirs.ml +++ b/toplevel/topdirs.ml @@ -62,7 +62,7 @@ let check_consistency ppf filename cu = try List.iter (fun (name, crco) -> - Env.imported_units := name :: !Env.imported_units; + Env.add_import name; match crco with None -> () | Some crc-> diff --git a/toplevel/toploop.ml b/toplevel/toploop.ml index 482150a10a..cf62137c23 100644 --- a/toplevel/toploop.ml +++ b/toplevel/toploop.ml @@ -429,7 +429,7 @@ let _ = Compmisc.init_path false; List.iter (fun (name, crco) -> - Env.imported_units := name :: !Env.imported_units; + Env.add_import name; match crco with None -> () | Some crc-> diff --git a/typing/env.ml b/typing/env.ml index c5c3a5ff4a..51bea94d19 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -300,16 +300,24 @@ type pers_struct = ps_flags: pers_flags list } let persistent_structures = - (Hashtbl.create 17 : (string, pers_struct option) Hashtbl.t) + (Hashtbl.create 17 : (string, (pers_struct * bool ref (* checked? *)) option) + Hashtbl.t) (* Consistency between persistent structures *) let crc_units = Consistbl.create() -let imported_units = ref ([] : string list) + +module StringSet = + Set.Make(struct type t = string let compare = String.compare end) + +let imported_units = ref StringSet.empty + +let add_import s = + imported_units := StringSet.add s !imported_units let clear_imports () = Consistbl.clear crc_units; - imported_units := [] + imported_units := StringSet.empty let check_consistency ps = try @@ -318,7 +326,7 @@ let check_consistency ps = match crco with None -> () | Some crc -> - imported_units := name :: !imported_units; + add_import name; Consistbl.check crc_units name crc ps.ps_filename) ps.ps_crcs with Consistbl.Inconsistency(name, source, auth) -> @@ -345,14 +353,15 @@ let read_pers_struct modname filename = ps_flags = flags } in if ps.ps_name <> modname then error (Illegal_renaming(modname, ps.ps_name, filename)); - imported_units := name :: !imported_units; + add_import name; List.iter (function Rectypes -> if not !Clflags.recursive_types then error (Need_recursive_types(ps.ps_name, !current_unit))) ps.ps_flags; - Hashtbl.add persistent_structures modname (Some ps); - ps + let r = (ps, ref false) in + Hashtbl.add persistent_structures modname (Some r); + r let find_pers_struct ?(check=true) name = if name = "*predef*" then raise Not_found; @@ -360,10 +369,10 @@ let find_pers_struct ?(check=true) name = try Some (Hashtbl.find persistent_structures name) with Not_found -> None in - let ps = + let ps, checked = match r with | Some None -> raise Not_found - | Some (Some sg) -> sg + | Some (Some (sg, checked)) -> sg, checked | None -> let filename = try find_in_path_uncap !load_path (name ^ ".cmi") @@ -373,7 +382,10 @@ let find_pers_struct ?(check=true) name = in read_pers_struct name filename in - if check then check_consistency ps; + if check && not !checked then begin + check_consistency ps; + checked := true; + end; ps let reset_cache () = @@ -933,7 +945,7 @@ let iter_env proj1 proj2 f env = Hashtbl.iter (fun s pso -> match pso with None -> () - | Some ps -> + | Some (ps, _) -> let id = Pident (Ident.create_persistent s) in iter_components id id ps.ps_comps) persistent_structures; @@ -1576,7 +1588,7 @@ let open_signature ?(loc = Location.none) ?(toplevel = false) ovf root sg env = (* Read a signature from a file *) let read_signature modname filename = - let ps = read_pers_struct modname filename in + let ps, _ = read_pers_struct modname filename in check_consistency ps; ps.ps_sig @@ -1597,7 +1609,7 @@ let crc_of_unit name = (* Return the list of imported interfaces with their CRCs *) let imports() = - Consistbl.extract !imported_units crc_units + Consistbl.extract (StringSet.elements !imported_units) crc_units (* Save a signature to a file *) @@ -1629,9 +1641,9 @@ let save_signature_with_imports sg modname filename imports = ps_crcs = (cmi.cmi_name, Some crc) :: imports; ps_filename = filename; ps_flags = cmi.cmi_flags } in - Hashtbl.add persistent_structures modname (Some ps); + Hashtbl.add persistent_structures modname (Some (ps, ref false)); Consistbl.set crc_units modname crc filename; - imported_units := modname :: !imported_units; + add_import modname; sg with exn -> close_out oc; @@ -1694,7 +1706,7 @@ let fold_modules f lid env acc = (fun name ps acc -> match ps with None -> acc - | Some ps -> + | Some (ps, _) -> f name (Pident(Ident.create_persistent name)) (md (Mty_signature ps.ps_sig)) acc) persistent_structures diff --git a/typing/env.mli b/typing/env.mli index 4db5a84760..ed2f6f1c50 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -168,7 +168,7 @@ val imports: unit -> (string * Digest.t option) list (* Direct access to the table of imported compilation units with their CRC *) val crc_units: Consistbl.t -val imported_units: string list ref +val add_import: string -> unit (* Summaries -- compact representation of an environment, to be exported in debugging information. *) From f12f696955d17ef8a9074f1dc7fe7be24d6c95e5 Mon Sep 17 00:00:00 2001 From: Alain Frisch Date: Mon, 1 Sep 2014 12:29:55 +0000 Subject: [PATCH 002/494] Cherry pick 15174 from 4.02 (#6529: the checked flag is now part of pers_struct). git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15175 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- typing/env.ml | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/typing/env.ml b/typing/env.ml index 51bea94d19..7df1566073 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -296,12 +296,12 @@ type pers_struct = ps_sig: signature; ps_comps: module_components; ps_crcs: (string * Digest.t option) list; + mutable ps_crcs_checked: bool; ps_filename: string; ps_flags: pers_flags list } let persistent_structures = - (Hashtbl.create 17 : (string, (pers_struct * bool ref (* checked? *)) option) - Hashtbl.t) + (Hashtbl.create 17 : (string, pers_struct option) Hashtbl.t) (* Consistency between persistent structures *) @@ -320,6 +320,7 @@ let clear_imports () = imported_units := StringSet.empty let check_consistency ps = + if not ps.ps_crcs_checked then try List.iter (fun (name, crco) -> @@ -328,7 +329,8 @@ let check_consistency ps = | Some crc -> add_import name; Consistbl.check crc_units name crc ps.ps_filename) - ps.ps_crcs + ps.ps_crcs; + ps.ps_crcs_checked <- true; with Consistbl.Inconsistency(name, source, auth) -> error (Inconsistent_import(name, auth, source)) @@ -350,7 +352,9 @@ let read_pers_struct modname filename = ps_comps = comps; ps_crcs = crcs; ps_filename = filename; - ps_flags = flags } in + ps_flags = flags; + ps_crcs_checked = false; + } in if ps.ps_name <> modname then error (Illegal_renaming(modname, ps.ps_name, filename)); add_import name; @@ -359,9 +363,8 @@ let read_pers_struct modname filename = if not !Clflags.recursive_types then error (Need_recursive_types(ps.ps_name, !current_unit))) ps.ps_flags; - let r = (ps, ref false) in - Hashtbl.add persistent_structures modname (Some r); - r + Hashtbl.add persistent_structures modname (Some ps); + ps let find_pers_struct ?(check=true) name = if name = "*predef*" then raise Not_found; @@ -369,10 +372,10 @@ let find_pers_struct ?(check=true) name = try Some (Hashtbl.find persistent_structures name) with Not_found -> None in - let ps, checked = + let ps = match r with | Some None -> raise Not_found - | Some (Some (sg, checked)) -> sg, checked + | Some (Some sg) -> sg | None -> let filename = try find_in_path_uncap !load_path (name ^ ".cmi") @@ -382,10 +385,7 @@ let find_pers_struct ?(check=true) name = in read_pers_struct name filename in - if check && not !checked then begin - check_consistency ps; - checked := true; - end; + if check then check_consistency ps; ps let reset_cache () = @@ -945,7 +945,7 @@ let iter_env proj1 proj2 f env = Hashtbl.iter (fun s pso -> match pso with None -> () - | Some (ps, _) -> + | Some ps -> let id = Pident (Ident.create_persistent s) in iter_components id id ps.ps_comps) persistent_structures; @@ -1588,7 +1588,7 @@ let open_signature ?(loc = Location.none) ?(toplevel = false) ovf root sg env = (* Read a signature from a file *) let read_signature modname filename = - let ps, _ = read_pers_struct modname filename in + let ps = read_pers_struct modname filename in check_consistency ps; ps.ps_sig @@ -1640,8 +1640,10 @@ let save_signature_with_imports sg modname filename imports = ps_comps = comps; ps_crcs = (cmi.cmi_name, Some crc) :: imports; ps_filename = filename; - ps_flags = cmi.cmi_flags } in - Hashtbl.add persistent_structures modname (Some (ps, ref false)); + ps_flags = cmi.cmi_flags; + ps_crcs_checked = false; + } in + Hashtbl.add persistent_structures modname (Some ps); Consistbl.set crc_units modname crc filename; add_import modname; sg @@ -1706,7 +1708,7 @@ let fold_modules f lid env acc = (fun name ps acc -> match ps with None -> acc - | Some (ps, _) -> + | Some ps -> f name (Pident(Ident.create_persistent name)) (md (Mty_signature ps.ps_sig)) acc) persistent_structures From fd3c18fac82be7ebca19bdf82cf62b8bf6d3b100 Mon Sep 17 00:00:00 2001 From: Mark Shinwell Date: Thu, 11 Sep 2014 11:03:14 +0000 Subject: [PATCH 003/494] PR#6554: race condition in caml_get_raw_backtrace git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15210 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 + asmrun/backtrace.c | 51 +++++++++++++------ testsuite/tests/backtrace/Makefile | 11 ++++ .../backtrace/backtraces_and_finalizers.ml | 25 +++++++++ .../backtraces_and_finalizers.reference | 1 + 5 files changed, 75 insertions(+), 15 deletions(-) create mode 100644 testsuite/tests/backtrace/backtraces_and_finalizers.ml create mode 100644 testsuite/tests/backtrace/backtraces_and_finalizers.reference diff --git a/Changes b/Changes index 61eebc5cd2..0ef0e92759 100644 --- a/Changes +++ b/Changes @@ -1,4 +1,6 @@ - PR#6529: fix quadratic-time algorithm in Consistbl.extract. +- PR#6554: fix race condition when retrieving backtraces (Jérémie Dimino, + Mark Shinwell). OCaml 4.02.0: diff --git a/asmrun/backtrace.c b/asmrun/backtrace.c index c72a2373b9..05e0d6b2a7 100644 --- a/asmrun/backtrace.c +++ b/asmrun/backtrace.c @@ -332,13 +332,37 @@ CAMLprim value caml_get_exception_raw_backtrace(value unit) { CAMLparam0(); CAMLlocal1(res); + const int tag = 0; - res = caml_alloc(caml_backtrace_pos, 0); - if(caml_backtrace_buffer != NULL) { + /* Beware: the allocations below may cause finalizers to be run, and another + backtrace---possibly of a different length---to be stashed (for example + if the finalizer raises then catches an exception). We choose to ignore + any such finalizer backtraces and return the original one. */ + + if (caml_backtrace_buffer == NULL || caml_backtrace_pos == 0) { + res = caml_alloc(0, tag); + } + else { + code_t saved_caml_backtrace_buffer[BACKTRACE_BUFFER_SIZE]; + int saved_caml_backtrace_pos; intnat i; - for(i = 0; i < caml_backtrace_pos; i++) - Field(res, i) = Val_Descrptr(caml_backtrace_buffer[i]); + + saved_caml_backtrace_pos = caml_backtrace_pos; + + if (saved_caml_backtrace_pos > BACKTRACE_BUFFER_SIZE) { + saved_caml_backtrace_pos = BACKTRACE_BUFFER_SIZE; + } + + memcpy(saved_caml_backtrace_buffer, caml_backtrace_buffer, + saved_caml_backtrace_pos * sizeof(code_t)); + + res = caml_alloc(saved_caml_backtrace_pos, tag); + for (i = 0; i < saved_caml_backtrace_pos; i++) { + /* [Val_Descrptr] always returns an immediate. */ + Field(res, i) = Val_Descrptr(saved_caml_backtrace_buffer[i]); + } } + CAMLreturn(res); } @@ -355,19 +379,16 @@ CAMLprim value caml_get_exception_raw_backtrace(value unit) CAMLprim value caml_get_exception_backtrace(value unit) { CAMLparam0(); - CAMLlocal4(arr, raw_slot, slot, res); + CAMLlocal3(arr, res, backtrace); + intnat i; - arr = caml_alloc(caml_backtrace_pos, 0); - if (caml_backtrace_buffer == NULL) { - Assert(caml_backtrace_pos == 0); - } else { - intnat i; - for(i = 0; i < caml_backtrace_pos; i++) { - raw_slot = Val_Descrptr(caml_backtrace_buffer[i]); - slot = caml_convert_raw_backtrace_slot(raw_slot); - caml_modify(&Field(arr, i), slot); - } + backtrace = caml_get_exception_raw_backtrace(Val_unit); + + arr = caml_alloc(Wosize_val(backtrace), 0); + for (i = 0; i < Wosize_val(backtrace); i++) { + Store_field(arr, i, caml_convert_raw_backtrace_slot(Field(backtrace, i))); } + res = caml_alloc_small(1, 0); Field(res, 0) = arr; /* Some */ CAMLreturn(res); } diff --git a/testsuite/tests/backtrace/Makefile b/testsuite/tests/backtrace/Makefile index 1ca390f942..33ca1ed8bc 100644 --- a/testsuite/tests/backtrace/Makefile +++ b/testsuite/tests/backtrace/Makefile @@ -16,6 +16,7 @@ EXECNAME=program$(EXE) ABCDFILES=backtrace.ml OTHERFILES=backtrace2.ml raw_backtrace.ml \ backtrace_deprecated.ml backtrace_slots.ml +OTHERFILESNOINLINING=backtraces_and_finalizers.ml default: $(MAKE) byte @@ -69,6 +70,16 @@ native: >$$F.native.result 2>&1; \ $(DIFF) $$F.reference $$F.native.result >/dev/null \ && echo " => passed" || echo " => failed"; \ + done; + @for file in $(OTHERFILESNOINLINING); do \ + rm -f program program.exe; \ + $(OCAMLOPT) -inline 0 -g -o $(EXECNAME) $$file; \ + printf " ... testing '$$file' with ocamlopt:"; \ + F="`basename $$file .ml`"; \ + (OCAMLRUNPARAM=b=1 ./$(EXECNAME) $$arg || true) \ + >$$F.native.result 2>&1; \ + $(DIFF) $$F.reference $$F.native.result >/dev/null \ + && echo " => passed" || echo " => failed"; \ done .PHONY: promote diff --git a/testsuite/tests/backtrace/backtraces_and_finalizers.ml b/testsuite/tests/backtrace/backtraces_and_finalizers.ml new file mode 100644 index 0000000000..22acf1af82 --- /dev/null +++ b/testsuite/tests/backtrace/backtraces_and_finalizers.ml @@ -0,0 +1,25 @@ +let () = Printexc.record_backtrace true + +let finaliser _ = try raise Exit with _ -> () + +let create () = + let x = ref () in + Gc.finalise finaliser x; + x + +let f () = raise Exit + +let () = + let minor_size = (Gc.get ()).Gc.minor_heap_size in + for i = 1 to 100 do + Gc.minor (); + try + ignore (create () : unit ref); + f () + with _ -> + for i = 1 to minor_size / 2 - 1 do + ignore (ref ()) + done; + ignore (Printexc.get_backtrace () : string) + done; + Printf.printf "ok\n" diff --git a/testsuite/tests/backtrace/backtraces_and_finalizers.reference b/testsuite/tests/backtrace/backtraces_and_finalizers.reference new file mode 100644 index 0000000000..9766475a41 --- /dev/null +++ b/testsuite/tests/backtrace/backtraces_and_finalizers.reference @@ -0,0 +1 @@ +ok From bed0e3f6399ca0cf8ede6b5cef041bf572b01d65 Mon Sep 17 00:00:00 2001 From: Mark Shinwell Date: Thu, 11 Sep 2014 11:22:42 +0000 Subject: [PATCH 004/494] PR#6539 and PR#6540: incorrect documentation in gc.mli, and error in gc_ctrl.c git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15213 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- byterun/gc_ctrl.c | 2 +- stdlib/gc.mli | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/byterun/gc_ctrl.c b/byterun/gc_ctrl.c index 7e61f0c1b6..1ab099da9e 100644 --- a/byterun/gc_ctrl.c +++ b/byterun/gc_ctrl.c @@ -321,7 +321,7 @@ CAMLprim value caml_gc_get(value v) res = caml_alloc_tuple (7); Store_field (res, 0, Val_long (Wsize_bsize (caml_minor_heap_size))); /* s */ - Store_field (res, 1,Val_long(Wsize_bsize(caml_major_heap_increment)));/* i */ + Store_field (res, 1, Val_long (caml_major_heap_increment)); /* i */ Store_field (res, 2, Val_long (caml_percent_free)); /* o */ Store_field (res, 3, Val_long (caml_verb_gc)); /* v */ Store_field (res, 4, Val_long (caml_percent_max)); /* O */ diff --git a/stdlib/gc.mli b/stdlib/gc.mli index 8cd2a719a7..f86a1e687a 100644 --- a/stdlib/gc.mli +++ b/stdlib/gc.mli @@ -83,7 +83,7 @@ type stat = type control = { mutable minor_heap_size : int; (** The size (in words) of the minor heap. Changing - this parameter will trigger a minor collection. Default: 32k. *) + this parameter will trigger a minor collection. Default: 256k. *) mutable major_heap_increment : int; (** How much to add to the major heap when increasing it. If this @@ -131,7 +131,7 @@ type control = mutable stack_limit : int; (** The maximum size of the stack (in words). This is only relevant to the byte-code runtime, as the native code runtime - uses the operating system's stack. Default: 256k. *) + uses the operating system's stack. Default: 1024k. *) mutable allocation_policy : int; (** The policy used for allocating in the heap. Possible From e1add70c998b22c8c242cf5cf7b178249792586d Mon Sep 17 00:00:00 2001 From: Damien Doligez Date: Sun, 14 Sep 2014 19:41:26 +0000 Subject: [PATCH 005/494] PR#6522: double warning on (&) and (or); add hints for deprecated stdlib functions git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15225 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- bytecomp/translcore.ml | 6 ------ stdlib/array.mli | 4 ++-- stdlib/arrayLabels.mli | 4 ++-- stdlib/filename.mli | 3 ++- stdlib/format.mli | 10 +++++----- stdlib/lazy.mli | 9 ++++++--- stdlib/obj.mli | 9 ++++++--- stdlib/pervasives.mli | 4 ++-- stdlib/sort.mli | 6 +++--- stdlib/string.mli | 8 +++++--- stdlib/stringLabels.mli | 14 ++++++++------ 11 files changed, 41 insertions(+), 36 deletions(-) diff --git a/bytecomp/translcore.ml b/bytecomp/translcore.ml index 876abaa942..31396522ef 100644 --- a/bytecomp/translcore.ml +++ b/bytecomp/translcore.ml @@ -695,12 +695,6 @@ and transl_exp0 e = wrap (Lsend(Cached, meth, obj, [cache; pos], e.exp_loc)) | _ -> assert false else begin - if p.prim_name = "%sequand" && Path.last path = "&" then - Location.prerr_warning fn.exp_loc - (Warnings.Deprecated "operator (&); you should use (&&) instead"); - if p.prim_name = "%sequor" && Path.last path = "or" then - Location.prerr_warning fn.exp_loc - (Warnings.Deprecated "operator (or); you should use (||) instead"); let prim = transl_prim e.exp_loc p args in match (prim, args) with (Praise k, [arg1]) -> diff --git a/stdlib/array.mli b/stdlib/array.mli index e9a64528fe..99de0c806e 100644 --- a/stdlib/array.mli +++ b/stdlib/array.mli @@ -47,7 +47,7 @@ external make : int -> 'a -> 'a array = "caml_make_vect" size is only [Sys.max_array_length / 2].*) external create : int -> 'a -> 'a array = "caml_make_vect" - [@@ocaml.deprecated] + [@@ocaml.deprecated "Use Array.make instead."] (** @deprecated [Array.create] is an alias for {!Array.make}. *) val init : int -> (int -> 'a) -> 'a array @@ -74,7 +74,7 @@ val make_matrix : int -> int -> 'a -> 'a array array size is only [Sys.max_array_length / 2]. *) val create_matrix : int -> int -> 'a -> 'a array array - [@@ocaml.deprecated] + [@@ocaml.deprecated "Use Array.make_matrix instead."] (** @deprecated [Array.create_matrix] is an alias for {!Array.make_matrix}. *) val append : 'a array -> 'a array -> 'a array diff --git a/stdlib/arrayLabels.mli b/stdlib/arrayLabels.mli index cf8b650e51..0d046378ad 100644 --- a/stdlib/arrayLabels.mli +++ b/stdlib/arrayLabels.mli @@ -47,7 +47,7 @@ external make : int -> 'a -> 'a array = "caml_make_vect" size is only [Sys.max_array_length / 2].*) external create : int -> 'a -> 'a array = "caml_make_vect" - [@@ocaml.deprecated] + [@@ocaml.deprecated "Use ArrayLabels.make instead."] (** @deprecated [ArrayLabels.create] is an alias for {!ArrayLabels.make}. *) val init : int -> f:(int -> 'a) -> 'a array @@ -74,7 +74,7 @@ val make_matrix : dimx:int -> dimy:int -> 'a -> 'a array array size is only [Sys.max_array_length / 2]. *) val create_matrix : dimx:int -> dimy:int -> 'a -> 'a array array - [@@ocaml.deprecated] + [@@ocaml.deprecated "Use ArrayLabels.make_matrix instead."] (** @deprecated [ArrayLabels.create_matrix] is an alias for {!ArrayLabels.make_matrix}. *) diff --git a/stdlib/filename.mli b/stdlib/filename.mli index a4ea3aaab3..c2cc6a486a 100644 --- a/stdlib/filename.mli +++ b/stdlib/filename.mli @@ -117,7 +117,8 @@ val set_temp_dir_name : string -> unit @since 4.00.0 *) -val temp_dir_name : string [@@ocaml.deprecated] +val temp_dir_name : string + [@@ocaml.deprecated "Use Filename.get_temp_dir_name instead"] (** The name of the initial temporary directory: Under Unix, the value of the [TMPDIR] environment variable, or "/tmp" if the variable is not set. diff --git a/stdlib/format.mli b/stdlib/format.mli index b44fc0a946..541ffbe390 100644 --- a/stdlib/format.mli +++ b/stdlib/format.mli @@ -724,7 +724,7 @@ val bprintf : Buffer.t -> ('a, formatter, unit) format -> 'a use regular calls to [Format.fprintf] on formatter [to_b]. *) val kprintf : (string -> 'a) -> ('b, unit, string, 'a) format4 -> 'b - [@@ocaml.deprecated] + [@@ocaml.deprecated "Use Format.ksprintf instead."] ;; (** @deprecated An alias for [ksprintf]. *) @@ -734,7 +734,7 @@ val set_all_formatter_output_functions : newline:(unit -> unit) -> spaces:(int -> unit) -> unit -[@@ocaml.deprecated] +[@@ocaml.deprecated "Use Format.set_formatter_out_functions instead."] ;; (** @deprecated Subsumed by [set_formatter_out_functions]. *) @@ -745,14 +745,14 @@ val get_all_formatter_output_functions : (unit -> unit) * (unit -> unit) * (int -> unit) -[@@ocaml.deprecated] +[@@ocaml.deprecated "Use Format.get_formatter_out_functions instead."] ;; (** @deprecated Subsumed by [get_formatter_out_functions]. *) val pp_set_all_formatter_output_functions : formatter -> out:(string -> int -> int -> unit) -> flush:(unit -> unit) -> newline:(unit -> unit) -> spaces:(int -> unit) -> unit -[@@ocaml.deprecated] +[@@ocaml.deprecated "Use Format.pp_set_formatter_out_functions instead."] ;; (** @deprecated Subsumed by [pp_set_formatter_out_functions]. *) @@ -761,7 +761,7 @@ val pp_get_all_formatter_output_functions : formatter -> unit -> (string -> int -> int -> unit) * (unit -> unit) * (unit -> unit) * (int -> unit) -[@@ocaml.deprecated] +[@@ocaml.deprecated "Use Format.pp_get_formatter_out_functions instead."] ;; (** @deprecated Subsumed by [pp_get_formatter_out_functions]. *) diff --git a/stdlib/lazy.mli b/stdlib/lazy.mli index 6ade2e3d46..f2541b7fd3 100644 --- a/stdlib/lazy.mli +++ b/stdlib/lazy.mli @@ -75,11 +75,14 @@ val is_val : 'a t -> bool;; did not raise an exception. @since 4.00.0 *) -val lazy_from_fun : (unit -> 'a) -> 'a t [@@ocaml.deprecated];; +val lazy_from_fun : (unit -> 'a) -> 'a t + [@@ocaml.deprecated "Use Lazy.from_fun instead."];; (** @deprecated synonym for [from_fun]. *) -val lazy_from_val : 'a -> 'a t [@@ocaml.deprecated];; +val lazy_from_val : 'a -> 'a t + [@@ocaml.deprecated "Use Lazy.from_val instead."];; (** @deprecated synonym for [from_val]. *) -val lazy_is_val : 'a t -> bool [@@ocaml.deprecated];; +val lazy_is_val : 'a t -> bool + [@@ocaml.deprecated "Use Lazy.is_val instead."];; (** @deprecated synonym for [is_val]. *) diff --git a/stdlib/obj.mli b/stdlib/obj.mli index 08b8a4f64b..3395fa86f5 100644 --- a/stdlib/obj.mli +++ b/stdlib/obj.mli @@ -47,7 +47,8 @@ val string_tag : int (* both [string] and [bytes] *) val double_tag : int val double_array_tag : int val custom_tag : int -val final_tag : int [@@ocaml.deprecated] +val final_tag : int + [@@ocaml.deprecated "Replaced by custom_tag."] val int_tag : int val out_of_heap_tag : int @@ -60,5 +61,7 @@ val extension_slot : 'a -> t (** The following two functions are deprecated. Use module {!Marshal} instead. *) -val marshal : t -> bytes [@@ocaml.deprecated] -val unmarshal : bytes -> int -> t * int [@@ocaml.deprecated] +val marshal : t -> bytes + [@@ocaml.deprecated "Use Marshal.to_bytes instead."] +val unmarshal : bytes -> int -> t * int + [@@ocaml.deprecated "Use Marshal.from_bytes and Marshal.total_size instead."] diff --git a/stdlib/pervasives.mli b/stdlib/pervasives.mli index d471a4ebb6..6413829146 100644 --- a/stdlib/pervasives.mli +++ b/stdlib/pervasives.mli @@ -130,7 +130,7 @@ external ( && ) : bool -> bool -> bool = "%sequand" [e2] is not evaluated at all. *) external ( & ) : bool -> bool -> bool = "%sequand" - [@@ocaml.deprecated] + [@@ocaml.deprecated "Use (&&) instead."] (** @deprecated {!Pervasives.( && )} should be used instead. *) external ( || ) : bool -> bool -> bool = "%sequor" @@ -139,7 +139,7 @@ external ( || ) : bool -> bool -> bool = "%sequor" [e2] is not evaluated at all. *) external ( or ) : bool -> bool -> bool = "%sequor" - [@@ocaml.deprecated] + [@@ocaml.deprecated "Use (||) instead."] (** @deprecated {!Pervasives.( || )} should be used instead.*) (** {6 Debugging} *) diff --git a/stdlib/sort.mli b/stdlib/sort.mli index a9be27e138..2da46cd717 100644 --- a/stdlib/sort.mli +++ b/stdlib/sort.mli @@ -20,13 +20,13 @@ *) val list : ('a -> 'a -> bool) -> 'a list -> 'a list - [@@ocaml.deprecated] + [@@ocaml.deprecated "Use List.sort instead."] (** Sort a list in increasing order according to an ordering predicate. The predicate should return [true] if its first argument is less than or equal to its second argument. *) val array : ('a -> 'a -> bool) -> 'a array -> unit - [@@ocaml.deprecated] + [@@ocaml.deprecated "Use Array.sort instead."] (** Sort an array in increasing order according to an ordering predicate. The predicate should return [true] if its first argument is @@ -34,7 +34,7 @@ val array : ('a -> 'a -> bool) -> 'a array -> unit The array is sorted in place. *) val merge : ('a -> 'a -> bool) -> 'a list -> 'a list -> 'a list - [@@ocaml.deprecated] + [@@ocaml.deprecated "Use List.merge instead."] (** Merge two lists according to the given predicate. Assuming the two argument lists are sorted according to the predicate, [merge] returns a sorted list containing the elements diff --git a/stdlib/string.mli b/stdlib/string.mli index 8f1e178b53..56065bbfbd 100644 --- a/stdlib/string.mli +++ b/stdlib/string.mli @@ -57,7 +57,7 @@ external get : string -> int -> char = "%string_safe_get" external set : bytes -> int -> char -> unit = "%string_safe_set" - [@@ocaml.deprecated] + [@@ocaml.deprecated "Use Bytes.set instead."] (** [String.set s n c] modifies byte sequence [s] in place, replacing the byte at index [n] with [c]. You can also write [s.[n] <- c] instead of [String.set s n c]. @@ -66,7 +66,8 @@ external set : bytes -> int -> char -> unit = "%string_safe_set" @deprecated This is a deprecated alias of {!Bytes.set}.[ ] *) -external create : int -> bytes = "caml_create_string" [@@ocaml.deprecated] +external create : int -> bytes = "caml_create_string" + [@@ocaml.deprecated "Use Bytes.create instead."] (** [String.create n] returns a fresh byte sequence of length [n]. The sequence is uninitialized and contains arbitrary bytes. @@ -104,7 +105,8 @@ val sub : string -> int -> int -> string Raise [Invalid_argument] if [start] and [len] do not designate a valid substring of [s]. *) -val fill : bytes -> int -> int -> char -> unit [@@ocaml.deprecated] +val fill : bytes -> int -> int -> char -> unit + [@@ocaml.deprecated "Use Bytes.fill instead."] (** [String.fill s start len c] modifies byte sequence [s] in place, replacing [len] bytes with [c], starting at [start]. diff --git a/stdlib/stringLabels.mli b/stdlib/stringLabels.mli index 1cf5d51ede..6f6f997ea4 100644 --- a/stdlib/stringLabels.mli +++ b/stdlib/stringLabels.mli @@ -23,22 +23,23 @@ external get : string -> int -> char = "%string_safe_get" Raise [Invalid_argument] if [n] not a valid index in [s]. *) external set : bytes -> int -> char -> unit = "%string_safe_set" - [@@ocaml.deprecated] + [@@ocaml.deprecated "Use BytesLabels.set instead."] (** [String.set s n c] modifies byte sequence [s] in place, replacing the byte at index [n] with [c]. You can also write [s.[n] <- c] instead of [String.set s n c]. Raise [Invalid_argument] if [n] is not a valid index in [s]. - @deprecated This is a deprecated alias of {!Bytes.set}. *) + @deprecated This is a deprecated alias of {!BytesLabels.set}. *) -external create : int -> bytes = "caml_create_string" [@@ocaml.deprecated] +external create : int -> bytes = "caml_create_string" + [@@ocaml.deprecated "Use BytesLabels.create instead."] (** [String.create n] returns a fresh byte sequence of length [n]. The sequence is uninitialized and contains arbitrary bytes. Raise [Invalid_argument] if [n < 0] or [n > ]{!Sys.max_string_length}. - @deprecated This is a deprecated alias of {!Bytes.create}. *) + @deprecated This is a deprecated alias of {!BytesLabels.create}. *) val make : int -> char -> string (** [String.make n c] returns a fresh string of length [n], @@ -63,14 +64,15 @@ val sub : string -> pos:int -> len:int -> string Raise [Invalid_argument] if [start] and [len] do not designate a valid substring of [s]. *) -val fill : bytes -> pos:int -> len:int -> char -> unit [@@ocaml.deprecated] +val fill : bytes -> pos:int -> len:int -> char -> unit + [@@ocaml.deprecated "Use BytesLabels.fill instead."] (** [String.fill s start len c] modifies byte sequence [s] in place, replacing [len] bytes by [c], starting at [start]. Raise [Invalid_argument] if [start] and [len] do not designate a valid substring of [s]. - @deprecated This is a deprecated alias of {!Bytes.fill}. *) + @deprecated This is a deprecated alias of {!BytesLabels.fill}. *) val blit : src:string -> src_pos:int -> dst:bytes -> dst_pos:int -> len:int From 463cfdce2d61abe289d0b0e1a7c33bcd522e3d89 Mon Sep 17 00:00:00 2001 From: Jacques Garrigue Date: Mon, 15 Sep 2014 03:01:17 +0000 Subject: [PATCH 006/494] Fix PR#6466: Non-exhaustive matching warning message for open types is confusing git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15226 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + bytecomp/translcore.ml | 2 +- .../tests/typing-extensions/open_types.ml.reference | 4 +++- typing/parmatch.ml | 12 +++++++++--- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Changes b/Changes index 0ef0e92759..91dc3a565e 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,4 @@ +- PR#6466: Non-exhaustive matching warning message for open types is confusing - PR#6529: fix quadratic-time algorithm in Consistbl.extract. - PR#6554: fix race condition when retrieving backtraces (Jérémie Dimino, Mark Shinwell). diff --git a/bytecomp/translcore.ml b/bytecomp/translcore.ml index 31396522ef..ef7d82cd0f 100644 --- a/bytecomp/translcore.ml +++ b/bytecomp/translcore.ml @@ -669,7 +669,7 @@ and transl_exp0 e = transl_function e.exp_loc !Clflags.native_code repr partial pl) in Lfunction(kind, params, body) - | Texp_apply({exp_desc = Texp_ident(path, _, {val_kind = Val_prim p})} as fn, + | Texp_apply({exp_desc = Texp_ident(path, _, {val_kind = Val_prim p})}, oargs) when List.length oargs >= p.prim_arity && List.for_all (fun (_, arg,_) -> arg <> None) oargs -> diff --git a/testsuite/tests/typing-extensions/open_types.ml.reference b/testsuite/tests/typing-extensions/open_types.ml.reference index 5fb9684d47..841a94baa2 100644 --- a/testsuite/tests/typing-extensions/open_types.ml.reference +++ b/testsuite/tests/typing-extensions/open_types.ml.reference @@ -76,7 +76,9 @@ Error: Signature mismatch: ^^^^^^^^^^^^^^^^^^ Warning 8: this pattern-matching is not exhaustive. Here is an example of a value that is not matched: -*extension* +_ +Matching over values of open types must include +a wild card pattern in order to be exhaustive. type foo = .. type foo += Foo val f : foo -> unit = diff --git a/typing/parmatch.ml b/typing/parmatch.ml index 1729797454..6732be7a92 100644 --- a/typing/parmatch.ml +++ b/typing/parmatch.ml @@ -1809,7 +1809,11 @@ let do_check_partial ?pred exhaust loc casel pss = match pss with None -> Total | Some v -> let errmsg = - try + match v.pat_desc with + Tpat_construct (_, {cstr_name="*extension*"}, _) -> + "_\nMatching over values of open types must include\n\ + a wild card pattern in order to be exhaustive." + | _ -> try let buf = Buffer.create 16 in let fmt = formatter_of_buffer buf in top_pretty fmt v; @@ -1825,9 +1829,11 @@ let do_check_partial ?pred exhaust loc casel pss = match pss with end ; Buffer.contents buf with _ -> - "" in + "" + in Location.prerr_warning loc (Warnings.Partial_match errmsg) ; - Partial end + Partial + end | _ -> fatal_error "Parmatch.check_partial" end From cf0f2c439cd09e93891775180c22fbf629c69d11 Mon Sep 17 00:00:00 2001 From: Jacques Garrigue Date: Mon, 15 Sep 2014 03:13:20 +0000 Subject: [PATCH 007/494] Fix PR#6547: __MODULE__ aborts the compiler if the module name cannot be inferred git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15227 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + bytecomp/lambda.ml | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Changes b/Changes index 91dc3a565e..2d138e64b2 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,6 @@ - PR#6466: Non-exhaustive matching warning message for open types is confusing - PR#6529: fix quadratic-time algorithm in Consistbl.extract. +- PR#6547: __MODULE__ aborts the compiler if the module name cannot be inferred - PR#6554: fix race condition when retrieving backtraces (Jérémie Dimino, Mark Shinwell). diff --git a/bytecomp/lambda.ml b/bytecomp/lambda.ml index 4ad8e9b4e1..5d9fb593fa 100644 --- a/bytecomp/lambda.ml +++ b/bytecomp/lambda.ml @@ -537,9 +537,12 @@ let lam_of_loc kind loc = Const_base (Const_int enum); ])) | Loc_FILE -> Lconst (Const_immstring file) - | Loc_MODULE -> Lconst (Const_immstring - (String.capitalize - (Filename.chop_extension (Filename.basename file)))) + | Loc_MODULE -> + let filename = Filename.basename file in + let module_name = + try String.capitalize (Filename.chop_extension filename) + with Invalid_argument _ -> "//"^filename^"//" + in Lconst (Const_immstring module_name) | Loc_LOC -> let loc = Printf.sprintf "File %S, line %d, characters %d-%d" file lnum cnum enum in From d96e959467c2a4145d43aecec91c29f3f36bcc31 Mon Sep 17 00:00:00 2001 From: Damien Doligez Date: Mon, 15 Sep 2014 11:15:16 +0000 Subject: [PATCH 008/494] PR#6536: better documentation of flag # in format strings git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15228 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 4 ++++ stdlib/printf.mli | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 2d138e64b2..dd391599b8 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,9 @@ +OCaml 4.02.1: +------------- + - PR#6466: Non-exhaustive matching warning message for open types is confusing - PR#6529: fix quadratic-time algorithm in Consistbl.extract. +- PR#6536: better documentation of flag # in format strings - PR#6547: __MODULE__ aborts the compiler if the module name cannot be inferred - PR#6554: fix race condition when retrieving backtraces (Jérémie Dimino, Mark Shinwell). diff --git a/stdlib/printf.mli b/stdlib/printf.mli index 21e28159af..4a72566594 100644 --- a/stdlib/printf.mli +++ b/stdlib/printf.mli @@ -92,7 +92,9 @@ val fprintf : out_channel -> ('a, out_channel, unit) format -> 'a sign if positive. - space: for signed numerical conversions, prefix number with a space if positive. - - [#]: request an alternate formatting style for numbers. + - [#]: request an alternate formatting style for the hexadecimal + and octal integer types ([x], [X], [o], [lx], [lX], [lo], [Lx], + [LX], [Lo]). The optional [width] is an integer indicating the minimal width of the result. For instance, [%6d] prints an integer, From 0880bfbd5e9a3a40081fe31333eb896406fea88e Mon Sep 17 00:00:00 2001 From: Jacques Garrigue Date: Wed, 17 Sep 2014 07:25:03 +0000 Subject: [PATCH 009/494] fix PR#6564: infinite loop in Mtype.remove_aliases git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15233 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + typing/mtype.ml | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index dd391599b8..6ed1befb19 100644 --- a/Changes +++ b/Changes @@ -7,6 +7,7 @@ OCaml 4.02.1: - PR#6547: __MODULE__ aborts the compiler if the module name cannot be inferred - PR#6554: fix race condition when retrieving backtraces (Jérémie Dimino, Mark Shinwell). +- PR#6564: infinite loop in Mtype.remove_aliases OCaml 4.02.0: diff --git a/typing/mtype.ml b/typing/mtype.ml index dd766a9130..21d6b871c2 100644 --- a/typing/mtype.ml +++ b/typing/mtype.ml @@ -350,7 +350,9 @@ let rec remove_aliases env excl mty = Mty_signature sg -> Mty_signature (remove_aliases_sig env excl sg) | Mty_alias _ -> - remove_aliases env excl (Env.scrape_alias env mty) + let mty' = Env.scrape_alias env mty in + if mty' = mty then mty else + remove_aliases env excl mty' | mty -> mty From 0a0a8b5cf8d6df959a28694fb989937b8bc5490e Mon Sep 17 00:00:00 2001 From: Jacques Garrigue Date: Wed, 17 Sep 2014 08:21:25 +0000 Subject: [PATCH 010/494] Fix PR#6563: Inclusion of packs failing to run module initializers git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15238 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + bytecomp/translmod.ml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 6ed1befb19..bab71aa18e 100644 --- a/Changes +++ b/Changes @@ -8,6 +8,7 @@ OCaml 4.02.1: - PR#6554: fix race condition when retrieving backtraces (Jérémie Dimino, Mark Shinwell). - PR#6564: infinite loop in Mtype.remove_aliases +- PR#6563: Inclusion of packs failing to run module initializers OCaml 4.02.0: diff --git a/bytecomp/translmod.ml b/bytecomp/translmod.ml index dc7d2d7a63..9e15fc97e6 100644 --- a/bytecomp/translmod.ml +++ b/bytecomp/translmod.ml @@ -322,7 +322,7 @@ let rec transl_module cc rootpath mexp = | _ -> match mexp.mod_desc with Tmod_ident (path,_) -> - apply_coercion StrictOpt cc + apply_coercion Strict cc (transl_path ~loc:mexp.mod_loc mexp.mod_env path) | Tmod_structure str -> transl_struct [] cc rootpath str From 22e4527b860204074f68a590f312db4274ef568e Mon Sep 17 00:00:00 2001 From: Gabriel Scherer Date: Wed, 17 Sep 2014 09:25:22 +0000 Subject: [PATCH 011/494] bootstrap to get the post-release performance fixes in boot/ocamlc (saves one or two minutes of compile time on my machines) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15243 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- boot/ocamlc | Bin 1707973 -> 1708076 bytes boot/ocamldep | Bin 526040 -> 525946 bytes boot/ocamllex | Bin 251585 -> 251600 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/boot/ocamlc b/boot/ocamlc index bd530ec4c3c31f4f3b1a27f3df15c67eb3e9cf2e..27567a1e6cf5622b395711da417b05ddad7f1eff 100755 GIT binary patch delta 35329 zcmcempZ#(UAP0F75)}#*6buR!Q%eg>Q@eW8(o)lc($drd)6!Ct z!d#XXq!yMIbhWmnT`22n<-OR|o0gW8mfp0Ww6yeIp6}XcpDy|H`Fx(g9zKn;=WWfJ zHEY&dvu5V>LCw_7wNrbhBxg=7yX*GMDYwp?H1+n(E6U1my(=^4imX0Y^qx^R>DC$P zQ>M+joYM=sJkmux(nY?}C8XPn!fh427!o7GVmfu|6h^f#g~U)zKd)O9Qrlm{V<_=9 zMWc2tB8d{8^|)wXk`hZbM}&)xd>G=T#y>~6l5a%IScE);s}Xu3bVGbj7PQqOO1Z;wE6Is*T-Egt?#2tp`A7(!=j_$%R_esXs*B`Z-0*1VSR zwRxh9V!ODG=nU6D@HnB6lAbgYDgU6?t#H1Ez_^4{L7Z!n?!spjLIOf4LNYbQxkmcp z@mY-EM;L-&A|zAGCqBQG?RQNc5XRkjsAXGtOjrO~!+6)Qu3^Y!NS(Pl0{?MyPDfGJ z!%;Efd1^QS>W%xeYfv&n6$soD(}a8DW=wHz7Djvj?8>G!_2F)PEYhP9m?$?Rc*%8( zE0NOY8EzjFi|INUfyaG4LMY|k;+k|>4}5YLJ_MeI78yu$H_-^(bv#woM8?nrLwAY6 zq#1gQweuF&9GCD~1yfwbp$az)&SfN3T_2u8{zJZ`tF~NdZ)f5u2;48@7J{(O$>%(# zIg=z51Fel`do!6_0{?Ib|wc`Ym}KF zUA_!tbJK8yE-1E}P{X4#rg}xKJDH1kUcUM*P!xr4&SR?VLY`8cRU1RrbGqi^EUxhzAkmHrFD*W4Z`w^%C{^UQ{mw zX{Oi3@RBd87mGA_c#2(-5eSYY0tMVrFn#{lz<8O%nIv47<5(x|>cqS#IsXbL&O*#E zn4F$pDS4!f8zBKJ%E@OU{dO)eiNU@;L7Hcb2f)+8b--wy{@H<$*+_GJ&L^66w<~49 zx=*^8?acm*=9}MRmWv zsP1P!)4S!aIQ{Pz<-bp-(09eQi?Zt-&_SN(Zh{0a!FO_(@ICy2|g zM+mk{a>|MVWfh%n=umj#Oki9$I(f`ruU{f>I`WtY88{;v1b%&o{HPB3mm|L;J;RaK z?e@bubxP|{@yO{vR@{bkM-jyxa%U`}sxPYhFqPixN)*>q`MoZ`kB7yz$0KkHmN(m| z7DeJI+HtQdMU0~suJ2tn6JqA89|I#VMm27BofD5k9PIE_)L~>e&6F{a?l`J5Z2=gA zJJdPk4Qjj zMD%YLm0x#JI=+>XXSt#)ZbDzdb-pR3h+_??|t=PX#8DVKMBx z5UxewKTc0a;Iz}O!p@xGWb(lHuhIb$90O18^h@N8cJde)x8-^RkjLwaI}5gFMo79u zUH7R80c<-0ICt{@<{d*`5NJ7oac2zl6XdhC7VP{fq=TIzyHhz;-S3JKlW61pu3}L@ zr|x&kc+iO#IPpR!ei|_YVJUIw z`2Xe750S?Ru&m5d%m3)TdS=V19^ zqXd8Md0$w5Ry4fyB~0+cd2!%)F6vh5&vip)n&(OruT?jF8Do{rbF~R^jwU|nO7w+d0kTq^h`@imdDyym<%2GS2y5kokw<@! ze+{Prz4ch@$r(}KY7r@@!E>2Hl@CS@QJB(E2rTL|sI)Z1AHi81`cQ@pPqbPejGCX#UcuAvaaQHr#~3lfb0ns!Rf|+KPO(OSz1@ z?pU@F`R^eFL8G{n0`r|M{4o@}ENcBVcj1$>S#EMQ2Fal3A)m1c=5c<_|4ZFZS1pgq z7o8RtERV7Zmb(`Zk<~rv#~VWuXla`1wa)H$AG<-kPKQ&JY#%c-{}m(ftnz;ANz&GJ zP83x%C{?MTH91NW`3EX)N*t&pF)wx+guo5@Av{5qN0pSG%=~>3R$$D*J>Dp!`ylY% zjq#p>piyl@NLp70!_~qz0ns(#w^?Fq)F9#8%h0dadn!l=&fYRTSO2+!sgNXSvhhG`w5z`o8^(iLOUwEz z`SQ6a(jPbCD05GgD>51RT=skvjd(aDnxd{$G+E;$4(yBa(vT~a3|SjR_w0@6UOi!{ z%UXY>QY7UIQS?G|RCj9pRCQ6~VCf?NRZ5jy7ezllV05SY8{8Vr8wql^UZrf7>!YgQ z-5*U`u2%NS4QP2==WbSAp|V@hnt@6@Wqup!qQu51H`NSK#>$tXNQCMM6f;m+ME*e- z;`V_`Egc<%s7!Y^6mU zy+QjCg}#Zp)fEl#R6JZMl~xoDcp@U&+B95wUx;m1`3=fADc_2sPyVGRRIk|OqSK{H zs(c%BsY1A9j!oAj#_V4PRPGH_@4fg zvP3r8r0Ye6$0IZ<`6g$lz5BoP(p=#7f`P^60Gf0l+{AMhYs&FqOIxE zl!+m7r_=q?_d+l)Gn7j4zEysgGE&G7z?jD(qpd@CD_J2l>0XCpb_FZoqCVy2Qs;j@%&v~#ACB>qWFGnEvvk9N#b zcFFw?Qfuy0dW6Y;q3dQfT7DWuPll**bat*1D~6IbPstPqsA!%tLGSlzdwczX_V!86 zyd0#4dCHV7?;|Vuv-b8W2wM;iBZPhq5lC6{m0e-o@#&(XTeKJ@C~jEvtfr&~m3+~K z#y_a67qP1zQvBj_ihoGi)$_(f0fE;G)q+h}Ld`^eFpXrVCURFOHDTM4?WcwcWt`|u z?n-4$vV~o9I@iG84~}UXY{-EAPKzp)neyCW`n6JdSZt*E3zX?%IGtFaj1iww(Zfo% z{OU{VzK4}3MA!k?xy#A5NJ$HeYGKKmvq;HS?tt|<1y*Mi^j8;}wMfZSyW=xRn$IvB zpNDtT^N<(pnXws1#}+BYVk-4`L`fHoH0lwhMwT9@0cS&_E3Ssgz+#M5+vNy61eVsl zkRMbGj6VN855U18o`aTWY3oMdw$l-UoieE#Q5VtgTK_}T=XyB^+#d@cr0MZTm78D< zwmho%d+u@cbPx`zbYjbzW9}!2+nbcS7%WvuLl-N#;%2H`teh5~TeFrZ6_VDd_g7n*q(#IhKZoqm>Ujb1gPSD{hWs3MW zxAj{So>bO`i0`ZmE0yyec@oQhy%I;WH!5B$?L|lkamrd-r;H4tlr6{#*`(BV7C%tw zBkmY$`|HY7AzH1}ElP+KZPeoph^8N{Id3Rir2Gj>YNeV$t%;D$+czi~RIv?0__QsA zt>U+oGoj*)mG@U=u^{shNR>F%a9hV4m4j~ai`BG88L7&%SdM;IcPsyp;*#P!8uW#- zPo9IAGu10-$d}4c`71QrI8Qg)@}-g|e+!h<`Hv_f@;qq3^78`p$amp!RM>*C|Ho=; zQC3LtUkjRcjS%e=|BbR(c5>6Zw?rh6CAB0WsO4K_QfF=}-83LXyH12~mY)i*)smE; z$;aiPoIjh2Pbglh3DI1%<~Y@OqS zG~y9=v~~2~EP*2JRGgL8sw8z5QP$9(mGcr#^g-v8*+N2v_5N6oqXWM}52|j~W0wCn zWmbgnSXCkF;z*%cv8tLDCUhz?)qG)alumV~x>}f2Z1!)byX8ZoYl}(ogjqY(h}AD5E<{L1xJ-`R#`W7 za+v5!`_t6pl;1~ zQPQZXpXw)1o*EBxLmfp!@>DN1=c+|ilLwxO$y2jLIt|TJ$A}E7%~OjbE(bjm(6mc+ z(XyCoPqd4o`lHenRM20|rn>%UU(;W8i7YDb573EM0!)2>b(EEVrJ5nA1Zi;O# zsl&ubD!5v$uu=-uQGyB!L4~>^jK=h_6}BKsH_lmqlT!lVm74?Q5TCjw09Wt z?eUKp3Ub(A>-h_m$f1;LoiA(swdxE(o@>!#$}nVZAF58Jk@nYh_*%$ccH`#Xzx=}k zjpJ!eD^|FBRzlQOb4TXOHI?7)_CW#hakIu~-kgUHRxXt4) zyYepnO20uZ70Y=%*{~xq#3usZ+pod*3i6g|m z8>M{4O=2R*>~CGuG}U49!9GjGEbuCX@WrXH1Yt((5OTz0eSZ&xn}@tn1JiaIPD zr$p!OR_kSrEhwn5OdTs~DYjfaBwn!2l!I}_Ix4zX-7ePCg?rUBxxr1JJgr3ATRzqw zFVdiy7~f0Qo|$Ttlyz?U&jnAM+~}q*|M4VH$>1m#)x<`)td#rJy&>}D01^~4SIv;G z*a^tGxoS?tCXAVtt-9)0CBQ4cu6(b6`Qf9 zm1?8-i&gownl8l_Ycr|SQH^4s1xdEL>7H0M&N}+6x+GM-;o#c%MX1YKQKN2<;!Vm~ zr=|7f%ppxqAup%q!RIhyRe>s}iNljeqeK-A>gFTnI zQO)sv05ah}d-wed;+qg6s9~d;NbRLzE?T$|P2 zdz?Cd57b%uvZ~2{Kwigc-9$4ry$rE_^c5_S!bRb3`3dOMOONi%WB6y_oANiQyD4Oo z8ZSOywF#Qy(5lU#!eM|25AQ~Wo7GhLg_~}@-rbEBZ&uHVFRAiXjOvJ+URd5aj`qE( z9+WNM_A5OJ3d8*h!(+AZH646SP3&^i889CnJ`Vd1+T1QaMp`}Q^BZ7M4iaV_b%Pb_ zRk!@s0lceTjhDw!{Gz*`JORbN4j2?RsN?0oQ6nBRlsPFJ7D)pX$9Ht9K~0Q1iN1J) z&E_Jba>_yFdrT=e$bTL1e?a1&FwiEvu1=P%fS>7!)7vg;`6IQxu2xgX7RaW$zo=RA zG!U2?9!;%(ft)?VBuJwpFT36HX9u$yKa2&>Ht3&UsCub}nzFjzKQQS&z}8B0xwV1EJ^o~QDyAoqn104Q?|_NPa-s#A^s zI3xV86XQgycfO}PRlEVc(f)=y+@5Nw(Ccrgy<~{O)C3l9V#S6kq}Qw6Y4IE2jstIk z*kKCYy3U=TF!_p|?mJVG1<4t+4T5%!UyGG4B`_29mO52ND7-EbD0iDWTtw2MZEA{) zLWQZ}y(sb4NZ1kE)cw)IO%2VEPKrVc{tUqvvsX>B%)Khi)z7VleQKE$s+IJqYD!o^ zIR{l3ofkjdQccvk1t@?NK;`yK!R2G zr8>E@^eXh@f=DdPt%i#-zfosNpF#tULtZp~qqc>?U}`uCeu;t8t0TX}BF!}Kg32pG z;$)mc$=hJr`A?}0F5#y=XVhvDPZNJu56P}JhM2T}!(5v1i+V0pBv@n5tGQv~yEm#l zt+1Y`GSst1BvE{rrpHtAy|d?>=tf!NJc(9uxMz`& zDGELLf!@tJ>GB*FG8H3>cg4xeKs{J&RMQ>zDpq{thM_&j@RBDYT%&POo>`*1wKvKW zBV`&Ups$D%Jt$Q5kmzZxRXwNOSR++_PjMiMsji4~Q)av;-sX?=Kns~+6S13}cR9Mt zGZW+$Am!CEPG*AYQK1Qz74I1z0>jLkrw))03w6zi5K4 zq(PaUbZX4>^dQ1NFapanJ&7;^TQWU6!5m4(3< zbCgNNy*)+L-rEDa?!j=E9D?bd7v7x`pTV^i>g|~!hhlQKg(Y;o7X7o}%EJbhuP9U? z@ZOA>hH2sXC2b_3rpseIdl+APU<~#9&Tvlv683x zKw0^oLh&$_=X=uSLM#R-X0eENe=O4pRmWOns=8t`@WFG3{=rUL#9cli9FT9=kYpGRrl_y+?WwiQg&r-46N-gwE z5#kAJS&?T=7);k5gFQQ8x}F;BX%2zuy5l-eV`m&5&mZBL7gi0xxS~@W8Dp6@dfu0E zC1xM?C7mDT=^>wnfcZJ{3Txy|9#^PXMM({w6szK94}1z_K@jZ>i&zZ+&?%jYso{wb z0J+sOQHW=(S+{u>hKXnC+!RkUY}egWJs}}tE$x}^*_r%Yhr#gRp1&wvV>Qh1M1|4m zS)O?7z&)N(LcZWg?O`)L8--j4w6d{N_1x!KBIJ6d`m45RtNwmZsylK6VDUn{JDfh5 z8Wv53AuhMo{;Q!sCq)b@cvf&q(;l zVxRFW7B5@1&v+IJ`3gGpyLwT{8qXP;@SG>9dcsgI&0gynMcFl&%!*tH>62?ATVJ&% zKIhpd#A^XLJ+j7gxU*glq*#4yL*M~7P|-^eKd)OeUc!WlzYyXvR>?+;G-3-aAgAb8);P0Ls(T7_8;Yp+H ze|Uz=M?(c%lwV@L z-?a{Z39RIMp!h8j-RVeGh-MYHpbPXd=PS=_L~UOI-<`nd2KbyyzV?iYcpoF@?UJCj zW1bkweaxL|9sk<%erNfCLZ9S9qc#8Avr_);f1}upjx$brnxo_{Wd4ZhHqUxW0etdV z0N<_HUX#YNpdj*A|LV!?*#~_vxAL(GZ&O&Du)JoL=~xy)S+{vox^Nb|B9jnU^Kf;$ zDrNiz_V|#t{ssyA5zxbCicbILi3LXP^H6x=W4dqwnr4p``yWqZnEX5F`K@vrHHT=} z-iK&8vf0joT>u|bnC)Yt(l9NBT0^w)@)Nr-nihv@j(Z7Td*wg>*QN)p3DcS|uJN6< zNr;*{YqR0%&I{MFVJyuE*X9Ya-#X#a(n5ff=GM}}<-edVU@TcGWk0tIsi&vJ~W$(BG3@f9oG6!|p-WsdJ^ntqwCMfw1NCE8KDL4rKy zK>G&v=1Xc^^tYIfpcF(kyY6vFhL_X?8?h6%KBv>MTEJZS&S`%VeE2dPh$&sPa(N1@ zvI(5MB~J6wksPr1zAhlg4^$Ngd|J`upbH!DI5-B|s4Y$#7WpH(Wwd?*7{|2N=+Mh< zO`b*$?>1o5d*vBB(T`60wHfkf@WhvH?A_zFjmf_N0I&bxIp0|)9o&ALqk^tlvG|oL zyK2MaZ+15cbh4|~B+p~$$=H#UHRG)6;{+{BUci8PKNXXx4Hf^PiHTY+nMqm_HGc?m zu`yALm+cN(?TJ7Ow`OhAJ3C3sfc;FjCTZ^(5=W#R4cZWu?zzW|mZ56E@Gnc&T;0P^ ziFaXq0Q?KWO$eOkiSCRtrb)OO*pgVum|K_A`XnbJP;yOFFDtE^b~r>vsx;!fFV0Hr z4q8JZ9Zu7>2oXh9J+)n7yvz(Lf6AR^E$pQ=M1q}j`ht)9(A2(K`ej_qXP&&(;MK>c z+I&!u?4<4TRi@%sm=&i6bFCIMHl!MuN$7409&}cPa3CCc}u!O1NRJcp2#N@LmVH9GmmT}syP>gTmM6Efpi!&Jq zF0)VL>6u%#hh!Yc*GK79o%p_shTW!Jkbaf)d76Z11@Ht25y?nHYRXzAp65R#~Ij#eq&rlJS5lcA>j zHX$sGMoax3~R<(ZI=xD4xB8gVWP`tU0D z*{Z#jh|FrgfeJDY3;Hj+Q6xY+*My-zMT`0;4O(-v+ zmJh%<6@NoUdlTlpRHZNe!mL|?4u zV`y)amPRQbXk*1Fn*RY1??YQZ(9*?C41Hn5Xs2Q{SInd}f77bO7|PhCHOjGAcmr`J zW$uQ)jl9{JoTt1ju|qV`RY-lxCNE?{A`eW|sID%7?3Q7aaHRx+F9bMwk(XPZu}Hp&iXLTs{2JNkaAi;9*R5P{8bwlBBuir92Q#@ z7qqp!TI1Wb5+BR(Xh66Yf&XkP%c^XLScsV641CTTXY{BLao4I)eV4o&-G3AkZ5;{K zH4%0ln%qKX!t^mzQGx+hJP#=|th1gJ@h6lp75$X7Jls#s6S0>rv)M6DmaBC6RQMDV zzYEv8ux-a?7~6Rq3j{VcBB`>oo`@rp+RplcZubHg&gD{`gqatmXQ`yP;F8%Mu8-Bl zeU`V2UMS@KDv9UK1Z!rTemERwC#Bu=7%|71+D$h_zXt$<=QzUwi>Ol`E|_;rKYmgA z+*x`(Meh!IeK18I7oCagRm|ocFTFc)R3ve|GhaxqcJ`8L2{W>T64J$S(UCA(U4xcS3UtdWHYW6rDy1=RCoo- zHuchTuoG_SrRU2kaLz(_aZWSHCuwiGUM!z-T5L(z<3+WdM_U+ZSuec@m1O8k?2v-P6nR~$|X8nBy?4tnKyw413kM;}M0`|7wOwFCn4;~c$*d<_(2Z&gfRy-3zO zOfs{to+le@RN(6S2hRDL`+~r)cg%_Dr^jNKoYhayr{Y}9>56_jv{kO|iU?xx2JP*q zr^`2C39z|r<^p94U9dxFI+}=WRF$hI>Tg|y`PzPIUbqfbPh_bEpEA=_TN-59_LhX&$w;%|- zhw``+pK#)TgVsg9ZZxGx*W`C#wE|xsagr5qI@J_mRh)u6nE@7#8US|vo)=``r0R#j zqNL*k^o)M&&l`;p)E8|R;rk=fw&w@LqB-X7MA>T@Gq z_Imyq-M~eu^12VM{az@0e|^R}>94{SMqb4GgJi7y0V8aGIf z$GJ6z_+O{<_73eOp3pJD=+GejuuVZ%AVWqtaikMRc>)w{yhg{_{$M?a3b%*hs@`BQ zf8AjH934Rcy!*Sa!7_>oM6rRW3oRL<52NCtIxL?d5P$L1HbnR1>Vq961foQmI8@Js z*<3YL&xROA6l1$=Wj7CtFI+UdR!<61c>;n8Jl8=E9#5X$Ka}-%%C2+}-!)uM8l4Y$ z&bo^?KdfvDoHTT$oxaLR2RpdhNe5@V&`Gm&W%b50T;vICAIDq|y*YrUUaw~l9Ef@y zm0Iyd=|LBzuem5a*i)U1#Z$8_Op`;LfeiJ~C)*(NhuxqjC0~mM9Zi|*oOBS;VYKW9 zy`*Belik}H-}O%VawmO*lkVxHOPus&PP)`dGw(6IMmXuNPWnbC-Ni|dbkfYPs6VjN zC?_LG@SB`;kl>@8bdca^E*M@1;jg7eMIsz+WBC6ek6W3uQ z^w{KEfkDTqyX~U%B+}xI7+NzzKOrVti*D4*guLBTy#O+@;&J#s+Vfqw13OA@5O-L6 zN9m_s5mNwx8D%Q%`LjMoOrz9W^iASUYws=k8bNh;L8RL^f0j z(04`R+R4N;pPl_*XqPA{UStVi+|XawpREdT8yr)T2R9k6@Y0 zHx33ejv=8)HTLeGpu`g-UuD|M=PwV-D!^=SvY8}#y2uoL%s6i>Zo<^a%*g*4->m}kvYtL~V2l2R# z^PLX2&gVEGN7vIR^ps9Wtvv-B=p}n<6KKM9xUA87O5ZK(Joc4vYW^PV^tpBTdk7-n zGrUz_DmQ|JQ#2eowd%{n%e16TUn5`fJUzmMv*$;BE$-G=-eUOa?2r0zG56^VBQY>( ziL~NZ7}HCCf=JjLs8ZIhI*41eCOF1QVY28`>qt>JQW0PgfXiux87Ju^6476GjR88Y+$Y5ZqZh7iQF9gI?R& zSZ_0fLfXkNKTQfZk^<@KDsPNc6K-q<4-rU$WA8{~79g}l8at)jjuns!_jjXWEJEfW z)fgEncQ~0_3}cjh$3ssZG`mr{X`HYH4;vOK)K+ZxaS1BVYm5ZoWnKf~xZ>F4NBR68Nll;V*m2AMD`%kMh)i@Fo%`+N}YAi}RtWj|g=OOK{c6QmqZy$Pt zmzK_-Gx3U~2Qb=?0T$z^@MI5Ts{B_VVO8`rvO;jxz9GYyCk|K{mmAem9Hgd9bodz< z?}q5=iuYXB_ACQOWS>)8ZzGMyU1P*rnSG4?;S@92NTQlHIB_$tG)gfql~)=k!?28I z6d5%k;tO&QGIGV2)}TQ~3?%b)81Bq#j195{w>q9Tqpi%r29Cf!C)ZG;P<{oa(i(|t zO+$^b5<=(QCAj0%Jk)3rUsJ=i#%vl{ijE7fGfoMbIRb<(9Bzz7<2@zD6lx!CB#Cb* z>3Xo)=hp7)4HDv8npk46AVrPE;y6{E!O|%!HC(?#Ur}ltlP8=dL?et+`R@Q`)IP%4 z0}uM18;wo!q?5N|q~R8)XzfVjDE2m$ql`2h&TJe7#%kqM3MJlT9K+d6?Pv&v_R)r$%0?Sm;7QuykpBrZsrC$n%v5nAT{aQ0QKjKl zW1RdiSSbx&-;!&g1d4An@=#*UpJXhSvYka2yjXV_lYb}qk$3UXX#E|=L?LmN;`M6{ zY~Kdp`n=F=Wwv6fvD?NdvbyMBDb*EjS7bc+oRmKkbM9@7QQr6IW3=?;~X#6Y|^49!W1}@jaXt~cwv9Wd2-onU4`?p_E>&$(|770ti zenZrFKQFOJYJ0%Q)>#j-8Ni4I%z&J^0AX7R@E2pQTJPtZm~+A8SVi-|TY%RzAJ|5L zTKuBz?0h5D9w6)JfPRKGN0sNmboqHMFO7T9@G4A!-z(7k2aV&lDZ=}OBn0*)0+m2} zHZ)RT2!KiE(w>Kmapnchwa+@SIc{MH0W9!&7MGE-+$w z-b)`gb_tszDmBdaB;tZtq-G6U1OW@!Qy(=7AtW|F3ZZ~x%VJ|Eq76%oDLDRfKZZr> zq1fd{N>|>y2ZzR}vexJM*0v6lgZW<%=>|)3Jvc83OAC)7<2ud?+h##rk^|*k*sl}BwPSfVdopOn zGtAlTP!{d$4X=$?7`1&G8bg^IAT=giQ#Y_yPSFB~l&P4Jo4vS0_#!ku*rdD;OK%ZX z)xjLNOsh`5DuHHhG%96x``a>KHd4cq(_l>V9ylF=|8B>7c$OVKkk4^XYwT;rNfFV@ zNvG5B2JmEtwXDGyB6?o#WMARLnNFPL#J!!kk9Fa7NN%9hW2vTpHSBUk5_QPN#_oUz*&D)ThFUo*R*r}z(zY|)=eKg8@^=?F#`>3Ej#p)u4k#+#lH zDb$$db5qPmMwQ5?jUO2^x$Vcs>Bs^Ml>H(taimYjnST99H*WUqF_uYr75L?HiF@n+ zFt8W7+FG{PXq33PID8*eKer2~@&^HW!hWdnB9`iL*1rAF&VNb)Q}jl-9^qbuW`r(S z-u)16Mp%My93d87i=GHqB8*0O9-#^00Kzv2KG>)|5#}INLz-?4rxzZ8c{}A(BNd*b zWuHPg52S`qjZ9pZZ21&Ib>{&n$*2RyRGbPTKPI9WV`FhK*e=J>AXmdPOFO!j4j(Yi z%j*IwomvkXJwWr=&x|N>XDGzb|387pbhZ3U&r;0C7&!Ej;Ks1*?s9AcP{iA2RKef-3 ztTSIihRf1`)v&Y0z{Z9SwitRO5{dkDR;VX0WF1C+<*;zc0FIe0N7Mtc&AW=F#35z>to9ZDe)f{`fCgiPL-p5keV9 zq2Wf-)}vs|zI5!UQ71=f)cXXcx3CR&us0oJB|4Yh{|1|sxzzTJ5hHJc+Wn3XsK13p zFq+)QjcOeK)*d%bV`sa>Wv0>g6UJ~c&2s(QIE%(_o-}Y`U4Y%L(F_06PufA7IAw>F%{!j*r9y5u_;{+Srw@iW*L+(Jb^ zgCcXSykCrZ88!ja5l1cc_{F*@-cXR>GgR~(Qe9R$F6c{KCoVV->-biz`ME~4wc@v7zP|q{>6h zk>YlGpCdb!OC@1uDVo)WnQ3ebf%veu!%YoDY6~|BQ;6yGh_0**n8n$8D?#8@wi<%ocrDspc>- zorbICq0TcvkAzP2$zFjfclbt2J{Rr!@|6C9FdBj749gHuE*A)$?uRKY%r#xT=U<|7ic|T)OO)ZwECARmgW*-s z+FUc!s62KZ=IstFo>4=WU z0#mLutHQ=1`7>R((%c2l@B8_f&L=3ez+NO{3(OkFG_n22HIGMWR{B*uCo8O3g=S$$ z*mB^2H_>gnzq)lSE^7@m*NWw<#+ixKScr!YHO1y4Q5DemGYdh-l0ha5v!W$tqP2LC zIf~uQhp#m!$fv-&xb#Q3^yh*v&}>6N=`b@lq8dH$lEK}iVdiPHT{IkPW+m+%ZsyCU zVY2^fMpMf5W`S5`O}rjlEGe+^eD*@a(q#o2RFLA5hKB&$ZfC5)1I@ML%uIfunN$ud^7vO_ITSO=%o8|0;&L;UHr-=RjoS?J@bc-XnwceEg~$j#`gje$QD;^|0Uo>8ToY0MM}lse zX|~7)jl?H#^!evvd=)cI7b-W+f&g}8*I%goK1jVSwC6rEJz{GR!m9ht>G-je8TUhm z1Zv7Rfp0G_d{m#Y7-ofX_I{J?5cg~|-(ltP_hV7dyU)~Yr3tbB6w)-?oE)(&2$@+e zhWvA&3g%MA99twJN~6po6IU{3n|PBv$4rWNyJLeC3V#6HkKOYFW}(wp(MgFPUwXjI zh}izes$=Gw!y|Td%=43fFF#3pOuFk@=bCJFw9PXQA=)z^tMMKDD2Vwn+@_}<#He8o zJY+W8XB9!;MbLKuKCCduQR0K}GOn+{tT$ne;MZ&@rqV36RavkFdt=!IVNc!eIiW&tZ1 z8ot2vBbvIvY(&)KVH5Wvz!1NN$5GkCW-54L<-_JoT#s-qG#BG~guQ(TUx*3bzR(;c zJ|Jz8xh3pxz+V{7dr zW)vF%8y91>EPTYwqVtQ*LCAopV)mM|1d{O|v~3Bf-)yBmW^U)&ElbU8-V@90k!s7$#qyt!@N;npRKMIDj!XC#mcvNdPf1UhDP8}C25e?^R7M3z zvzGXjCO!c^Eq(&yUhxE$2wcKXn*OlQxD90;4T~Y-vi2I>-Z}k*Ifu4zvSJ1F*5OOQ zWuuwlesPJi7^+->IdRk46%gd7SD5qhqa)>2!0@X})Xs7s!6jS;46Ccq?U5?e6?Tj( z+o-_}ycYwcv?tApbet;`)_GkN@+7`^FtnJzxDl=AuR^?LgsazX<9`Z5?IhJc1*LB< z)&q!kS3@403e4U2RIt*lVLh@EY%-ThpT-2FtTZ$132qDUOU2V>hIQy^jKp^uXcYlx zW?bG01o(LdK}OA8wHh|k8O+cwJoGGFZ7z!V8MSSeW|;tA^)tY+bv3NBUnuDrNTaiV zD7R3K2TyPduYpDLD~(?RUG*DnTw^wak8KFmYt8Wy=l{@(%;(Hg;sR{@eBfXCBJdyi zyqVYKKd8l9{tyJ7tN;G7Rpaw!c?AE6T?hO|)|hz_JgooaS@kt0e%~Uq#+Iv$gVkPZ z&JbNBs&xb((y6dojma<_bKZ+h{?di_UMp#nEya`!+1q<<_yc&H51Oc97ikSF=_sdf-%Z zQlptCRXwoDq%Jsw4Bw?`w6D?3ksj2+*3wFBGLLnZnoeIG3hz~2QHaN#yUgKoE-tCf z#~IlAT^N|u^}sRLf!*d*-RM9#R=_4aP39IV{195e^O0H3H2TP%r`nHfak~R4SpfIc z&3Fn`aSL8&9k~^5eE%feJ5Ku;YGbbYpsQ2e8H>=9w>6<))38=y6LuQ?_}Mq>u?KFQYM%c*6bZF8O5XHLRIjo)u> z7X?=Azf6x5F;bt~`WeenTt-D_ zp}_(UPT3vZe~7cPwEvAK-a3BPoFniwW8$w^8*}N@uV%CCi3)sO=Fo3u54_C?JrC}{ zAVysPHZmQAI%!5*oBm_sjYfvm&<@k!55~^#9wTd!@GgzQFH~tbZVN@cTlcm`$;)-y zK}A!#dT|Y+tM~l~afP)p%^MZ&7-ol0;C1SuE4+&$$?A%2?Y#cpjZq*&>NVa8on@A8 zUpuF|VcreNy)nHkefuE(GvfUSyu`ADX(}CqH;ApUi6b4t7=5qW6G?fYAMOT74%mMgK$`4#Qw74QbmW6N&x7KuWu;U+I0Xcy@;paSn5&W`rZiX7n79O%?sI>vj9 zrjPL^(TcI&EI3}9#(I~^!Mg3apMJA^Vua_tcfw~MSvbG-OPC;U$W=6ln5?`47 z6!IvFI^i_UyAYk7dbC4l=jRMW8BG|S91zZ?>X=%f0ACIhaVdXaNo#Ap*)*lro2rihoFWANV@wKQbfJCX z3*J0=l|ji*m~jzjkk9B`P4iy>gA`Kj3tm5dsbUAB-UBXyTu-OLz)O_*XfK)t=#{+= z^cobvtY#fB!x_ywU^Z`^Hv@)OXCrBz3vi_`#8N0qrFUm z*=QB$X5V^n5#Dgsf&l&v_`ZP$S%OzwRU6P-;RaMZu)$jyHUdy>p8tIYZVb%8$V+q= zoPkkX=FGs0ff;y_2lygpV2m>ZFJWwBof*J4Wxs?0HuBdLe2G$8_7ZTzINcFJZXQn= zbzXnipKa*O)bMM!tO4L5bq+_t+e^UmTQapTz?vJw5^&{S9aON%I}Tpt)tkJTa;ibM4%HH@HX?wGGxL9D}yH((7Z{Sy+UCqtbwR*ulyTn2Yg;y+ceGAd_3YWit8E4kTk=F>g!Q zq-GVyGrQP2^P_ihC=M^?|KdF_tSwB74- zKZ&0mtM~b;y1Z}^oOQu8_A&gKqHIQ^u}OAry1a*M6_@c;}Uz5 zuD;mhuP=go^dh*&tP@?qQE&;3PxPhBZ=H2iljy4q$Bn?GG#|+mkbidqYWvH0D1Ri) zSH(LNEdJbZ`ERV=H@)5H<18Pp0614rEN^dLtBCy0>1ufh4Y&)hMl-X0aIT-k12bQ) zJcWi+@r11|$Co6(M+f*7Xxl^d1GVLVr&~Enw`TVBxrA(k?BJ8NAD#H8Ky0n)=er;S zkB*|ufQj!8#B{X3ugQKnWIuZ{Ou8o@KN+y^N-)0tqfB1Z!^^A57 zhRK)!2oXz31-@+Ag==bf4$aTE;sS}V$?S@y;RRs3rH8@;Zzbacoye|%_A((5TPauh za`61(YEUSR_Fm0RuEx@<8K}Ge&zq~B4BtVk7rY((RBUOXFIA?S0TN^cVyZ9n%@2&c zx6@spKuoiXu*^>uq0byj8sM7_skCf>Z&-xrXC1uGcRnPn9~?fBt4e)-`^%uDQeP&e zmH4tmKN?%&OG8vy;+u!)LJ1aKKP$eJIiw#|jqnXa)N->g#yUO1S1XZNIm%atDxo)l zdB7D}V|-CuwO}l_#H~!b#m2F|>2_yRfA1FmCxn}Qc;I}q-EGy)K0m5&zS)-zVCbMR z6mjh>zVJ|)Ytn*c5z)45A;WtAHXj_r{b=uGUrZMs2^&%D#J&uHmm{mPeyeVGN=uRY zKc$ovEWYuQ#S??YV=q};6)YZq$>OG9@!gj!ZVMKdU$Qvq4hQplFIij~ES`1A;>uw0 z{g*6m2o}$|WN}Nd__0eCYf~K5p15Rj(G+{GmrZdP%SGBWUkWu(@nvAXE==*IAWE9* zOS3t_q_#5W(`$dCuy(3%h+UYxYO2jX?rAp2vD26>XxTJhu3g+C*r071L|;FOztcAa z(d0XQ+Yu#Aw|S{xx&yv1*T(j2x=%xC)pXy!uFN-+Fo=#b#Ddo59jct+^fQH9Vv98c zYpEY;ciC`Jnn=U$@@3gjuIxYx-h|o^06m|w?(!vu1pw~2%Qwd6)l1f|d;ujK!LXSEsxKQKVsG950c>@uI%ZjN8R`+pj{7OI zIK5xndunUj)7#pX+MXV2t=xY$L_HpRzq>!O_ntK~Yu2navu4fgnFS;yzfQbceBrJ5 z5^9(u%j1fjq{=xa%RH4|EBY8#?SQ(5DsYfzWbpJpaOPZ+mc*8+j8=XiXL4;qG|0)a!Hd5-Y|n?1y8ws*quJJnnX)$R*`5f)_^ExU);Wk!C1@e zkUZM48iq!G1oP_z$62dMBtH%#j|E3h5}!beDUb@DAkT2zc#ja5eXF4(#1X-LFOvInX6AQaBqtt5$?E_Jt(nH+}V;@uc1XV7JPNGbmBTh|^C zUd0}8!M%qVxQFBznzD!V9iFMaEpC<^r!oRRW_N4xPdi^}gHq*cq)+yeFpevtSDwRo zT_n{#PkK47R;qiEtW#pYaE}+$0^ZzbGGJ1xe--wO1^hfZAe*o2H&?7ItV)o_R}<}i zl?>(|j$p^{r|@$ivm6|=TJtIyz}NTZYXFBo4#=R21H>TOK$8J=W*2KsjA4w;c9fYP zDaaO`Lt1bEYE3=2pFd8+%oCsqYx6m9Pv+vi2Nh+Q@FWl%tVV{Co4jk z?pfELbp^6+3cux>`%zlfP7?b$o79fM>M;h%Wc!KQNlZAaFf;gBBV|Rel)*9|d@YcH zSD}KJlmZT$cDIvpIBbeX3@trQf0z!oH0Lx!6xlV&d1`4#GQ!WC{5BP~_5{4)O|i7NK?H zE6EAibnB(=6U-ERTDpD`HYhxE)OC_-^#dnc<)aj>Fq$0fe&eCberx;sh+Uepq!PO$V_f2BKW58Rm8;YpD?@{&^`H(P0z=kJQ zJ>T%Tj(Sd`h;^r7hWl>#$byuZvfTXAnM*rPlX2mj{tX;?hNKj3z7veFk1tGkOs+om zvhSxp_HMZ|AAR%;$qd;FaGfs;?KneRh1>2-`G1sfy8yS}nU5|$Oa3GL*?$9foF!xE zoU>$rtn=cC@%+cKi z(t*{qwO!CeCTZ;1@TOZiGFn7C@jAH^f@`iwMs8uCis}VC!+7`)zPoW z&s>}2{X3KbzZV+lakvn9;TtlPe-0g!dFFlls}w%?6+}y7nqb9nU6%jC-uF zz5+s-*!KZol?lcT7gm^LIGYr+i*+A1Ci&oF>Gi7^#9F1!pNNa+yv-3pj8y&$InD9= z&`XY}1^U7TB@VyzkhSnTDs}zJdewf4=NLNwH`2);=;N|vxei+Z8?gd!kfq^cK@PhT z@nd9-qML4z)NmgatWoy$qxWx+#1Qsvja_{pWiPr`8rAngW!6(qFZsLXHK1b)@G3v{ ze_i6ZZ#K3FO?{EmsEZQ{G}4_Z=p{}_TAO@JAaHsod(&iwidQBpVL4-(S2H|eDyAqr7FK|*F8!^(l66SRxM>g1IxSqlM@|28UlCtBVH$(@EM9E)3?dBQ0E*14RA6x`D!Ic!+Ho z2pOHbh2}h7r*ZEvWRfdFziNbu|;bQarU;35#hP3&@! z@3JCC(=b7Z)H0qh1dLbAw(=RIC+U3xTHSlnVnG^jRa*^*QMy?vdUYEqo>p&C0B^H<&XmMptc}IWxoVFg9fNWvI8;8tYRnR(CoJ z(_>SFLB%8gpQ$rzthP+#Z>V=R+7fDO)%lj%T3z~Vn?2oRo^5ufJM0dsDi=}*rOz%a z95*t(zCou;uQ%1RyTe`QG#gFobjp_t>Hj(GX5{dClP=wfBz9f0(`c)=)+896iRlhY zs*K%LXLOoPiFm&)OvhFT&69@ITWyUC5{#~d40}Qb?#9Fnmpx}ePIh(n$n-|r9GiW< zEnQBOZm~7~VZ_R;N&&wpDXTJi!<4{r6TH|z;Xi?%Z;MVFb+*u}4CR!8OAcE;oMMrm!K;km6qSgM~6cR#;h|hs52sqb)GpxJxVill6}4zxYKklJAFJ*n?K?o zoPS4ELSm9v`A<$&Jjtu<;Z*UHy~Nt*XpN!yOIt7CD`QhrAC`K(?20I6Ms_jY%P~Cz^jBiiF4C;8)OOb7wMi= z+D*#goYE}iuh#NBKFf|@qn+trF&omVl=iIAF0sLLK+-j>d+0ZYJg*@=f1%rqcIY%Z ztwviO7tz*b@EV5pL2YvYz-IAl+DHuEA6(NWVM2QCn)bcK#x9mDWt_diVXZeK)k%hI zC<`}OUA1}Kz$V)Lo3>_PkqjT-V0G8pO)TM9YPzm{9`l{B-?e%y&l`T%S|i?PsfLvp zt+r~T)8ayQLXZ8f&BF1K?|;`8VUgyZ8(MaVe)8+*0!To!z8XyZyhFy!TX4awzhB(>!EO<|-X#9Ck;7X&tp^BRVf zH`ch^d0gN_a?O&<=Y!%pV0=`rK>5N3x3Na9scB=9Sh>_+#yPwKz1US>Yj>h*1D=$# z4(o$8*iCs{c$!?XK8U^MVI;cGkdNYqRiO0RdZP;zglc7$%Mck+$cUQ&6B6ZdAxBVJ zL4Pij+i5m$>=6y&^|B0DKDz^?hgqdUPW%%Wl{C$4oa50K3^FXYf4#i%X_HyIWp>4b z^hSs{m`13?*ytfFlgp!TteR5Yd20Emhb{ko_Q0u#UGznj7)N{5;vm|g5aX#;Atumr z4Pd`0#RP%X)1#l1JosYAzI$>9ADbv`-=DRT{#7aJ=vkJtDG;{=e-!hz3b2#B7%L=J z)YN6zNPQ(nke}vD$uyd-U&=*Llu-|8nXFj`0hk z73b#Bhl4>)ky?z&?w6oPzwOn>uXaw|@m|{Kt)l9!gPxX_q2+E+E%{n?L^R^`?(dRU{9STNl zTmWEez^t6)GKbOW0;^6~_~|`uGmab#$o?>Yv%}KTGQ7;}oM&`FgMs}a+>9CV+2*Yw zUu3l}CF8MkKNu)J$UA;>8=<1ZbXTG@n%l0>~WHz?6Bo{*@Hj76e^VRN2 zrTZ_uwmofAWKLUq4PC8}^BET{^yrry3F^+A^<{6t|9qix)?R&*<&*ofM?YikmoF_j z_5QE}mn#dy&G(w zUUKha`}Dd)v{=E~?|9ohk3R0+s+#9i_DQv!BmPk{x9xQrsz&vH3J{~|159XHNJ{5w z@HUdQg^EzT^#+01wooyLZb9#%Ru(+0M7A}dc!RThk=6u)lWSCBA}v&jL+ArxVk#Y> z6o=8EKrtbTX<;;z;&J+jmQ~-q_}J8=8y?6gTtyEDA;UG+@IDC=6T}pj&SJKC^i_*@ z#=U;1WP(?{QopfU(?ffhxW4sANpM>bOBXR=&csbWB+uzIg845m3t9WCCpR|xF>Bcd zrT(jymc%?KB)0iP*ZN}B?bOSEi5oCb=9CK zPo)K>rKJU>_E=g{x~sd|Vw&vTz^#QJ%?zTbbo_w^d)IrHPp znKNh3oH;Yk!>0Oaf2^C6x+(&RM5d))R1AQq}=9ksS>i25g5Yzot>Q&_LieBwfEsJ zbJlvt2Cn5HF~lx}sK<%LDQ`Luf)JbtJ_g97=ZY~Wwg#`xWHYHz4v8Y8 zmut7Cqn2!k9D#z$WAvzAqGgfgwqphHwFo^aF48qwioj!@o#mzjUxoUJB3*^F@o(NZ z(--BMGQ5{SDzIpFF+rvu!|F+{QCIc?*b_luQ4w+x#4iRxq~9n2{PGc;EAMngu~k%a zDA-5oce+M6eMn_=;BVf95b-Dq10ghW#MU9JgKdzZ^Y zt3KA4opl11^;M>{)vP{#sqY-JF@ zS5Pug6JU?$yTK~}3(`T>r4~fFh26?k02bZpUaq`bxv78!yF@pideGIovIq%+m)$Fl z>{c-cu#gT>PBbJqBl?tPBMiXtfCW2T2qF%QVYm%P*>RFTrhc0Yt*2n|kY8wE5sw_x z{}=z@2N3oFEI1H=&!6`Xs31DPSdQmk1!M6OjSfT*Zje>;Du9Si({a{W;*z)YdmfS0~3b9u+?{`vPJ zw7465e>b?e8$7NXd<)f-yP~wbZpm4+1Iah0bxTeHEV?MhI{~4qF!%0O)@zp)^D&!a7Aio|NZ+;v{C5{S5#$7x8%PA7Oe$DT|5T{;buGsMs>YiE*oj0OxL_e z>^w1OB5xEzpkBV6C)6YIDtnCXlBw94g?5@4-NR@71a(b&7HL8{1#&@X0Qu}L>0w>c z$0EHe+pYraS8X6Iu}i_8-3qpx`AxTp#zYW}2|f7%^132@gAUAe#j@GdG1C?072Oi0 z??4bWgl1}?xLHu{?^E_HR|0#2N@k&a7F7YNbp7P-=5Uk~^+wvU(D8v55B}(UYZe3)337D7>>H)a(gOPz~`M8OB_f`Nu_ z0Nl0V=x%Ul`|k<;9&p$4GrGZf?X+gLE4)t;+5#~aErP{qHZ6g6Pm#;vjJX}w(jK$Z z1QCI9(~u@+lfWCOFGfHAf67ko(IfqT5_|NBy-ZqI7o-o_jR~aZ+x)9tpz-$s2O33o z4G*8%}lhw2<|q znulGnH`m&ELLE3!ue+F@IqAnQl#*!sZaXGBei5<2E!MTSsPGY&ukr;uE6@dzHOfZQ z-_FB;S?Cto@nSm;)Lm`EuOJrag}HF}+uxf7Ro&oefFUm9F3C?J5`U~C3u&;ycc`kumBE^7o34os z5!FT6O=fF_E10vN>C|JcST9GX#Ija`AbtkIyNjbAcOitB(T|57|AB3J@4>K6RT6fz z7$*_S)H*ZFN7J7Qi=eE>!#uQhKyU;t>u^Pw>mLuBB=sK!!%9#qe$eKY;VzVp=(XVE z1IT|1VKt>J56i#pC75$t5d>QWLqt*0QBm|4q#LjwMP3*}*SvR;z8@ig8reO3Fuf-r z+)aCzhppvvFVOI7r10=3ktA9dMFmmR*rs5e}%SK0H zFCkHa^hktw1kn|tdNnHPCq?n6!-&1%4X4_E(jZ9T+Ob(kMLB#Gz6eHDpRjG>Tz=yK|_dl5eOKN9{wUz3fF& zvm~E$Fi3rg%4bPgWDWzWBm2YLp?#1jGFFGt-A_2ebEgC9^#jw9)Y#kkWjeRL<5>Zl1K3%dceY@z;Uo4`9&F5z;z3o`>!%yk6Qs zYe%3!Y)i0<3T^-&-k{kxNE<2n2Cyz8Uy9&tBNg5VM6m$Ou$!bEOn(c*mWy7A-w=ei z!|44{(g1Rdmgcc{X#QxafW1rmMYNfsZc%?UST~q5PvT8d$1_n@6TfE=Id1p$8YHN%eS~Dn*;- z1JWc1`&cyMqvVHB`x7AjizD1@en`q@Y?t7mj}r5PRVr8!DtsL9m=yek!D;@&?J=j8 zOQ$*8{hK)a(Ju}~vp~(cWx6T_L|cf&9%_ZG@V#L)e7O#~XG`<>pTkIdE-ao7&6d*G zU#Re5DS_>?A_{(3+D5^1q}}{)b|;R{k&>K|pM&?AK(`muMQqxIWQj327)E`bS0gEB zJ{b29O_&d9|ALmxmx}dCfA8%4;!tPjWV`6!fiNs6hJ24nBYXV|8TtR{>|BBH4+Jv3sO?`s8!pHQJcc?`+J>3o$mk&UOZ3#9SvE84U`ie+bL z{{m?ikNJv*KOsHA{z|)_kfy^Yl(rCMF4B^PQaTTAF+W@=Jp3ZIk`oda7t zJ0GL@PfF?1a+q@~V8#u^`jJCBo|IDM(Rd7S9VR$%B|Ywc8uq%z%Aq_=-XX+oN(j^e5*QsWSl))-# z?-J<@J8bS)Dphj!59(MB_ucsAQeXZhbkcGOigvj)iL#bM8-%Tp;`mWJId27K?N`tp zpFkOJUjY^IHMOpgYI%!YVA<2sAl6DvPfJDYn26G8U$r!vwm&Upil=Gu$HV;ldeK8M z6;5=6{|W5dj2LrPjnv54x77DpX(~G@P(_*RpOscSLQkQ_SkydvckKdqxH);HbW~yA znYph^YdQOud18Z9*ep$Bl(9+jn3Y?k4#s|<^7o*T+Rdi- zq|KanV7zOT7}}nsdPsR4>Tu8d(kA|+rCQBpA4q3|*iUBFPH8ctSsy@i#C|NDa`Urc z^zvV&7&Gy&(jb|FKNi|`sarJ{AC-bQJ4MUCmOh6aQPLvKrHMzO2-;hu5mekFrLCXb zDzVUC&=WCVf5jyHS8yaPJ|;CfFCbB)rZClK7JVbl=8)(ES3u>poq$4R|Dh@0N{jh_ z!|0upS`3Aq#OQQlx(BKEu^!ZV5<03bNFBtOc+RKVlV~;PlvKhTRDVi39unmCH|eD1 z-(h0)6vd+G+<8@{&LI3b(i0rW_?L8)2fK+q1^y$mK(2`zqHO=+O(Pnz2+{k&j zADe0PmUlDmbJH4+98T>qvJ3w0^D%NUvqR9_gmfu8`tQGeMr>WKk5| zUp~pBtwyNw9mQ=X4v9_eP`bVQ#mXca@y$B*y?bf+`2PRC8mxe9*yS zsVYOB&f+LHQ;uSNtccn&j5SVl?PF6rW{QLBLP+nl|AGT zf7T9_NAw(k@rmg{pB=;`bPSV|sCp<0r4N$}Sqd#0CZ}I{rB$Lw4=;Gu55a*D&|6n^ z&!bJli>$Ymsq_715DvL1to(tg=GN%#la2F|;U0u4K1TeXg9&imb?VH3- z>^gZQtrbtPxnM&3rKh6n!d>IgZS z-6x)l$iOox*UOnSYJ_|WCJpGyzg~_be5rYcxt!-=yGmAjZX2W`UVtE%}3|T zsW4wIVlzY(MLY9>eu%xk;!G<`JE zQg258c3$amQP|C}5Lel0gJ5GJx8i09p6}+s(`4~vVcB=-Dg73tS!C@IPm?c!MghQD z0a`U$#1jS*>?;5_lSQso?VNa;cnMtPgIT&=fYS@*dF*NPM4_C@S+(gYl6^s}#!MM6 zCouMmSvUc(_gU}~>aNFK2;U>zh7e3mFNXN2c9Pu0YH949GV$l!v|z9tUOV?%v^p#d zX5p{8%S^rt^2?s53B~duw$e;1k@s;rBtXau{c?QQTZPioXu6^j`%hR&#|e zS?_O~iYw$4zQF<_sqU*F7?Ma~Zn!( zymE=Wp1%bI|5ae%HGth^{bbcVzC=FC+1qB*GICVFpD9HO2=g>S<$FvbbhdmqLqZ@nDdN38H4bQ$EI?Lih3OXO{* z-RmI`JLuGUc_RPNP1;>p2b=#E>Vlam@Y3Q9PysuseuJFFnnaXnHTAKZW(>rNo%jZ_ zKcU<=FwVQE<_$1@H-_i~HHP-RA$#~Aq3XvtW7wZ8TK5Q?>3nY&I@zDCoWF>_H0w=B zc=Ma6x8K4aPn$(b>J;pVI@h?}l(A9X27|L>BRbwp>Lw_y1ODhUf8yV)i1IgKDUzsu zt=q@H1ghZRcv}3H+?O9g7jJRLQ}bK$d43dhyzY*nlW(IFU#)DA&+xB7e3lX;3Ffqb zae}R_6xWFMj!|x-?Bm}+!pC6gZ}_w)CPJe;f*;4?Rt~ncG|C=!0%#J*_YV5-Pd7dD zx_b!!76hzCn~UF(C-IYR`sJSB7;?NTr-htC3&N%hA@v*Pi~J6tu&l(AA_(}GO+Xu# z)ZSs?QXJBR6G`NqrkZ!<3jV#Dq;FWH_CvR-?UcD$uH_we533_UY*~Y>l4A?h?2i<; zMNX!Do8`V#wgofk3{`EBGx%9I9g9=@QOg#v>fe4=h2)_%!G@nHZL6Hc&!IQlosq(# zwvx|N%~m;){X*NeLd1Wij;(T?cEP6nq8fe*c^Z%mr@5uvrC&>E98AE5@gN95^ zP+hdjlt*$dbzyDTHaU$uB+}MmgeGp2-8@L5XST{QwD?W8hdU)&utmO#8rHg9G<6%4 zhqB%sL7m&=5*AD)@53N)(f;=#+#zPi`*N_4he~w!Jv^M0&(Ps8Gww6_kOMRG{6V>l zGq*YIkZf=!ne+c4Z|1O+(vCu;nL<@x$?Z%v%fE&l!!+|ii@dNW*Cm?qlMzW}-^%lu zVV?e04(l1>fhi?+33>j}^aAWUn&E&2AAJ&ysdhy22#G%1CJgBBo${9{}$~?@Jb_Xpy z2j$=5R2Dg7fYD944?>w&_Efge9;Xs*76dENjK@jBM5KZy#gpn*qId!bg}FurZe=g;E75R=-p|aDln%zPK-ORu$@7=G9KDv;q zc-SEEoQxxS#bY^&hS1nFB~i=hHawZM9L1bNksL;?TCgufkUQ)WNNdxSY%;!K9++z* z1}e!g*UASf2|P!lJ{6e$4Fi=Vo-5Isaj?WwpEBIkIZ%n_!@H)`t>JEd9eVes9K-Yc zF%?`5#O_+aU#!Mx_c@IE0)nqEZ(8+er6m)L8+RrNx z-D{`aXU9`%&`>2^pJs#i+wlV!gZr@rtQxA!)~4HurHF-(a|Fd@C{fM_0jk!D5%Q2- zqKrz0DT&T}d%g&i?#}89nmXfEvXuy41yUXe8^9Mp zPO#ECpFj?C9TLH$g_LrQaxP{OGK9CP3Zo^~|0@szE6tM<4P54k;ZFhCKxF`5 zjOJE2;;G?U#m$z`j%$@Dw$wa)trE;|deoYuETco$DymtLt4v^Qxp{E7vdYO;P3dd8o(QqAf~$|fg_%j|oUO6;l49g~%XPS};X_bbh?E7b=Shl9ODo(Gj(eO94= zN$69+v$47x{IYreK_$$|Ujg^hS)>^|OBu^}9j3%l7Gu`VRyHtl%z};_KSx=@*c!8S zu9D?uubR<|lyo<&%)%NFvCceDqhy7^%5=Y^6v3ra@{+QcuLr;GbN4fqRmvpBH$c3v zb`2m}t(@g=VA+|h4xqA9_$qh4tc>MvVwua7VkrF;Wi~B)8B=lR1j%JKzoKknWV`}J zyfYaWv{uzCM|)~-p%-Em*@hsd*W0vYJ#Zu%ShSBfDN>)5n$IV7?18Z79ai zXj5K*%Na~ar4YykE=Zlq_k*^RaBc`M75~%%ZlJ|Ms^z8{ z8xjqSLMaTP13^&X8=dM|cEGIfsX7GJ>w?wEh+HmpF8hqCTxxpAVbBqQ3h~t1toY2& zUFsyp{${3ys)-ITWP+q72D8u2Dvx@E@q_*qkAGpufA_~!5w1qtD`1Nkhd|+K5isbOvwUha|A&>mjlcTU$1z5M4fD?^cpE}sFLeTW z0sVty3;jPO`fj}(;}iq+t>0WYX;X5_j=!@gil^d8bw2+W^zTNP25t5NX+){J`Dtj7 z&qL$+_fTA8am?b2R^#YU6dZ+>TS4{I*W78L?Py#y(gAE+urw@t)2;F!yV%J5C#>{q z-9sq7w^|B&zrMG+tIt`~63Qj8sra`I2bP7OX;F-t$Irp$dj!j8TMWkKJgArkiy=K$ zZQ{Q`F$9N)Q^Nrq$ry2J8vhmDYLMe;YMh$OFW3fs`$23!n&VUz&eYa8VEm6w*`YW! zi7NW2DZCRs9_NOI+eh7`i*>oH>C9vrKGO(ioYVw0(c-3qn&Q={&>)l){dUUMu7o<{ z(MV5GES-+WgGCM4EKu`IYzD@6XdZKMg1XzmT{88#=#8Z9^L4j5D^Z1~dz;y}zq*<6 z5ZN+~+Xo;q&8$yWkAyJ69rfEYng z7zk6THAqdR^*5=R*kH8Yq&ma~arfTd~Pdi_}zx z%cZ$v)z3Nh7oPFz5jeC>Sk)&v_sEuY%)PSz?5OxOW=PbXm|fYxKGV>3uhPCbYBtfsn8XFIt9>bdu3AO4a{%TP zLoN#HkfzL2=cAeB^T0?PCN@2S=C{$3N7Xi@&aO~>jK!JD=c~m|<}*((P!pL&49A^Q zwZNRZQ0?nreaz)gsk5*zS-AvQ5~yma>Z4Ih)V-{)cuu9A>oi<}UaF>1`VwfgfX8tE$Ircufsr*w}1&T{R(SrRyP5XnFYtbs67=1!iVX+&g|lT?8g=dqdsm z+y)vrjozffCG)0QXu)h{S&)y;ys6G+sWfe)S_DKpHmVyP7VCOgxeFWAE!+p;{5Ck! zENWCogz$l~wZRCz8l($RO_wdpk>dSDQ6543E!717ikz`k*d>}J?We~9J|iPBR)RO6i21CdI(TW}kG?S~lQd?Zpq zAv{B|#R``357iRvn+iVy<401}N9tmJBUH!8ut+mur&`5&-Xun=huD8Z(=@4l*(f^E z1i>FI)5mwXB5D1{>NIvUsh?oV+(NCNsQIjbl6I-%!PzPiu|o6kZXv9gSASH62R{2x z>SB1{cmD|;fKK=mG(?d=5Jh==fNU&n+N192d0Ur;tM{tw_&9Jv+%Kqp3a-@RKdU=f z=y;S7Oqw85uRbuDV%vjV=BRz@6bHNAZ2YTQ)RWy|$-Ei$g}Nw&O{Ds-(dZ-*B}vp-oaHpxZh#4e=CYTD>hGG9b#f8iJ>VDSeE;J*Qt1u*l1Q*+IU>z$lM}DK`iAlQr zxN7pdE!Me45pv_BAJ-Q9VJZTYgSWpxU3H zLK@CN%q)k3ueSN`ZnNc_I-2vTwho-;*Ma8LU)5{}zhAb_jm5* z#Zg|c2Fuf>MY9K~+@&3ge+XCt>%QP;SvR;`rmsS@cyn2ZHbG-E%oCAX4&yU1>0ZG( zYhJW=G?>kzxW1Z?%{DXpY6ctfFi?o$NkI_X8S%RV7pc3#o4Ub~=V`$eT0hL04OeIr z!^hz6l5j0{y*qZpd3t8Q9z#l#(}Rfz^>!$SN5g@w%?qDn^CDW9H~0xLnv0?DY8*kg zCTcD|56PPxS5a&Qb~M$A+7k8%C5U$d{y*N}>}1XG9gH_1C8I1w!k% z;WhoI+ikg&pRktjcski%OXCZnHMhuqug4;2FW5bDS0qnj{Kq)qgBYN>`BPm9>by5B zj*bt|JZv#l4b)<(Ws^gt>LQ$xrYCEed`Z{B1*zH~wv_6x)N;s|qIviqtlV(AaHWPd zD^2rIMGA^6qsA01i!X;}To~Msb|q_LEt;RUi!Zzq@=z`C zcz{=5z>0jfn)VLVig3abeYIA=U-9#m7GJFm;&ok#!k`YJ{^{C#ICg1G*NXTWnckTR zqc8St7@QLaX;X0a(liJiTMHcTL03f$)>8O70Kzn!Iv6AP8oGSDyC3ZwtmXE3-IlI^ zVYwc#xXCAmRCIL%#SPIW@;B^eRt?dT_?wUi;hH)=L>s|3+R~Djfg#+4Y2F+fPjwj> zq>3S!k4MDQF7c!ch0`fxLa>K7K)DE~PjRM}rZsjW;2o;Z)ROtTP#?m6J&rPbv+Q^3 zWDNzf>P!u$^-wKB+uE(_dsH)2OXnukUW<_5p;|T-57k_~0#@|<-70)Q*~7E~ZF{%m z9khBFNchmkb9|VVf_LA3tM9^4En5ohpO*(M89T=5;vE*c0dfqAiyf^P=^xQ7T$8fU z1_6!mlSOvF5TS#-Nbf^C^0Z`X7@_s$XYJnp+m3&><8%I)J|6-0S6`2g{)*Owlk_%vZaB8|yixM`rh$8$^FDs(8H)<)Aa}#hxQ^`$QI_oVW z-zC><4BX~pobj??d0<73_0z`V6mgRF`@BAOUc5igJOtDZqFc1MaTy?5EbQV|hggU* zZCF?a0v>9^fo6u;aA2gfY*wT9oU$;N^6KbGyOA zyTR8fwF5D6Dz`aRo@aMwghKCZbH-Ctp%&NYdQ|9Yq1<4@0YdX>QlVB*InquZ2s%ao zZnWVmZTKb|?r+1RZ1@Tr9&N*YZ1`py?rp=j*s!=yEbtfDu-6Y?*Q3x*2rzt%4F?#0 zs|^PjUSz|8evGBkF;LF8(eg1`0vkt-V_+GKr;agNKA)h_-G#8K3U0-UdwW;l4hx8> zRnlElcPnQ7L`9qsL{f1A?(npTlt~H=oB`DrRis74--%Yc4%c1X;9`Y7o&t~1^djvP zD>288)yf#ZTcI&u;0j~QZCVq%$E+WxopFUuMol3UQ!rSY)o|KetmWc*$k}3TBfHP6 zFVR*pK2@>y&(<}b;(N6H4n9qxV?Tw3Q{H`;1oxX$?$dD2_JBEWn%3EqvhL9$%<3|& zFcbz?>mwS@;2$(cRA>~;9-^a9V9hEs`!3Y>gyObH+RIqYtCt14aAhR>X$@CWp4QxK zritfb7fdKCfBQ-Z>TKG-5(>n4T8pOSukhYx`;Q?mGnKSl2X2Uzzob>*a>(hIw8d;5 z&0eK7z<}wy8f`sFrK^!xAy7q;@-hgXFP;g4dCkN!A75KPD%Nb< zsHHKskfPtxM)5@o&6tJZsC-L{z;%EZ-oh&Tq@C7=H2&0Y1>jWK8RlM}`nKlaiy;L# zisMVH0SL(ecHx_Iu6$gHrDgAErRe$jceG?n%Zl5oH&9$OytKvFi(SUM+H>NXLhEKt zal#<#*oGkmr#{j~nJ3@ZS{Z<&A8QHJwq4uS<#~2(%U@mm4~pNTUi=|=@2^(Pmc6$V zrUqYbleGe6Cg5K3swQm%<$Z{idS^UNH>XEo$6ofapw2`C`J7in9L3e>oZZ?qKdwBp zZ8!8g6*YLU7`k06%ncm%N-m_v=9YEfR1Ev~@}ZGcg+!xvfPEemQ4mdIU;kH`d-!=F~Uoh(r zLCpD!3TZvHe$;*p-ubM5XidGvaJg&>#0o1`S3#gim#A=bn9of8Qp;qlgr*(Q68K9{ z1mZxu`gSzC`G|IygNe(()^K1thg{#lAfIEVeS<-8ioS6woGkgwy5kxg538v0q{yek zCovc1(AZO2C9K1Pr?kZWFWWL4u+?4xEXWXQRH)8?x~!wV-vLKGjs6bCBb=`J&x%U02EyvNzgrBrk{B>k7oWUz+wAE}q6_)5xwC9XA z8Wk@xJ=Q;JvDBW5*9s<{g=B8+dt^OUhja@x!|ynQW1-v(6{ey zU8LtTz8Q@kg=@8)>F&#QGLP#QaYqOwFGjPB*#Oq14?+50_^%T7Fza5}CIYHmS*I*gU+f1cn zhj3=m@>WlmWpy@#C*tsL-!H;>GC+^Rb)}jCdM!>*5G9)h$$FZD{f(-w(kpOEa`7s? zma~IYGf+RmzW{e`39qgG#APnKTF1%M->E5GPvnREg4mg^9}MP)!H!pqaO%w0alz*& zDAUd?y$}Obn60-tF_*Hh)9W1UA9VD3J%fE|dT!A1xrvkM;96e3zK%Z6(&NnFk@^8K zR}bH)=irk6@)A9Z+Frmc>AW5GeA!KU1V4_7&^7DA6%p z_fbNLp2E%vU6jSn3uaHZ^+WDQxT>@4eGX^l-TIb5@wU4miHj$Ks=5-8+$`gjs+@a( z4h5l68}m^q1F+(j4#**2!=SRf9Yqwm!hbACaHN+h*U)u&wIa>FMEKK?OHFJU;0 z!8j&U=l%Lf{vZEbEPg=WYmpOLTlhr+6-?Jv{$KQcx;~C~D)jzzeTbj199(x#D;46Z z`d6VNrMgEGlY(PH1l9=t-h+Bn5H7z*&(PaZ(LGa-;z6h(CPmRqeJs*8%!IO@vvL*$ z6N;w`U`EW+4P4QplsQ73o1^FG36^;=S5L5LbW`IN9z|snxQbG{=jxleQxz_}aI<=z zm{>T7uF%spvHXb@Ur^;=@q^|Ag=G*>;calKkD9M{poQ$mprnAR=5dgTH;pVqWY6Pz zU#nwcO%ANbI;Aae#ZqOJ!%c~mdW0l;eyISBuGCLj28Y-R#36|7FR1X>7v@9)l~q9w z=FsXYeIlAXU!_+gLQWzzEYNpQ;!MmB%E0>rtDewvd5B62M(G30;DvgG7~r@?`W|L+ zL8jcXp;+hclTApgw_*faHH_pEa_@0SgsG^@VsbQ zQlwe8+!9Z-b%l=mBKVlf)6i~*X-c(jB8sko;2)+5HF_%7RO?+cYMF~WfDJYJd}O3N zBl68@&tQo_yy;mTZ#ZB+;uW)SGwV6MRG1eVR_dL&XG&hk5sZhU2UojdvZ%Idky7Mf0nA6YE7aYxP+cWjd7% z@!(4OIz2kjV%c-JcwDqbkE4opXf}$P)?uI^1ncxfL~*Y{{Gu^S@Y-Tz*AWsXSzv1Q zw)01HA+>9MjDIi)g8{!SOa^LxP4`$7IqAUPad6c68gxa8nfba{i(^&)p<*0HdB{xe8<=}lRPqLlfIe#Nz-wYC?@cJictT$Ie_u~=vVrEJk96EUm_wUB#(Fe|B0kYGuCXj&P?C!veqwO{ z-=qoZucqan=oc`Zmh94Z^~Bx61Fsl9nmf>gcUJpjem2D871p}H=t+DKcz)i9N290z zqNnr0AS_smTPe9_V$`$$fea4%+7J*Jp{!`}H%Sndr1| zg2Y9Mt)$ucsr~}zLxJ&19%*hqpl@Jom^tZh`c96oT||F@)n3#HrmDw)H1+TL1fH!5 z?QgFAJC@=*CPOx6Agn-m7eT>nza3!?!ixxd5fb5;n1FCU!lMW)5xzzc2B{C>3WVDb z?nl^$@Hv#~*9epiT9oAD>4mBQzQqQHmhxH0R9NOfJE8MzH zEHuY;RxULh#-Ir%TIl&hp`7nKqdYE6GUgOb@oDgj@s70 z`J7O9xFFbgBE%;>j>mBb!N|lXw~lzCs3J^thg^g{L=vtDy1qi^Ln-AeJ*s!{fB*M8 z1O-SF3ql@k$}08~$#{+d63bcQ# zpJo&2=t*oFZm057`Wft}CxjS@wCp>5G`rV4{GEOdmCXZf`YMJa`qJ<9W+2J_LD&F( zTz9DS{b$%+HTBJ`v4ip&6weB+Q|tc4STRtGMEJ%;~ALs2x=MONZQv zz6lm)ng`oqRO9k)M~6Nhxg&ps?9VYvf5fg6^zHZwOud&*_#^ij3mW8)Ci$a9{%Dgw zI*5qhi~ZysT1=?mzGww-$i&~n0|AFz$~R}9g@)n9s^3S@HVZ4i`EPv!TqNqx;L04+ zbxv>K&bvW&BsDeQ^Kava;A;@du~3hB;TIUUc3y6>hD=6HOX_L0Y@~yp1F|s+ zhu6`HaRg4*^9mq~$OM|I8k3wt-0`WmnYdfiq8dw(H%&7pBHFDP#LJ+c#U+t)JDvg7 z5BK)tGa=66K(<9Ugo9A{GvJbKG>im3+b>~en_=_~Vh@{YgfTt{Lo+SfSSHr#v#~}# zqU<X&6q(qd$rshzj=-q9~d*(1^32&4z)-NDkn9y0Hw= zqCrLhqJ#dZ?_dj>?T>a3HYPjog}Ml$`U)kgwr;qaD(hj^O&kIqUM{0;h;i6k0p^OK z6~p>7g3zNQNX;~&*icGAL`tUN8v6KUiY1_^P|uZ@$&0Y_s;E$)T0o_lMk;O3G*Y~x z%9E%f6r#|i0)C2)W*VdTVyNi}QoQw6#1bkTYQ)0zTRs${@dw%lC}bJxm7@GmY8qQr+HVb33^V$MKWD!?pMqSmJrH5v3EDc$xGN+UFVIf~?4koJ-S8@9 z8OxnfNZU&Lvy45gnx4zXpw`gAY-_e8U1Q*#ejHlP2!*%lR8P0revL7f!{<99*T``= zt3d=Kb*~&%+d08S8}p3Sz;R$A=4W#b&hN@b7>jVn+%i3C$$h;c6so$^h&9JwZ;W-K z?53NHV*VTiOk4pxl8iZ>Gs?^u{$?W!_YY~t zuW+}Vx!K5uCpYaDNHBlVKkK~KB*XL->y)t41*={%Pmh602wBw?YZOf_GPZ@R?wXcB zqsAH$Ause(PwF(>xo)@v^6pPrg|{n9CmE^1lspxRGuDe6A$yKF2T_(67VX5J z@k(pwWRzZG#!WH89CYD+lqycc-SNDsMh#TKI1rdgTV@%nLf-j3k1J*yt^8dm6R|+HJ!+^Sn=cipc^InM)@Jam&Ve4>N~`A> z$szAuDsy0tF`bgWqZ;4u5rfam5*FmBIWLs%+D=NehI{a^kF z=KH8QhU)a|=cZb~Q|B2|LO!^J9YW}%ws}}6;MSgJDN00%)R}9zq+Ik-{6t^3Q`IA& zYe(0b33TWYOb_h*A2o99Mhn}xkD4DfQbIobebK}UV|2(zUDKkd?SK(Y#Y?$+{mu$Q z7${Biv1q_)@fhanPU?8f*oU`5cRX&0jaE{n(QF-~1bi(4hX*9J3Y`0xrXk{=z>^_v zzMZTx3VVy?E>K+9lfwQIX0V?jV;2~SSBPzmu;@gx$PP?1VUmey<}X^m!0=r!u!*Ai z2my;tWCu{(h-Yyy7JvoHC;=k`>fS*0NvbbIh?5_4^b^pib13r(V<)2XPZ-I37Y6q{ z?wRK-H2OlSrYtmO(cDEC=(dH%Z1zXL^7)g0VXj_;g&!ZBS!8Txd+E6+p?Cl6U%9C0 zDI?k`7W+uNwTicba-M>O?6+#u<|Rgix$r6Dtl;{*C9p33>POp5Tb6*CmQKq+G;*nt zL+6%5z-Xy4iG60CU25QlE1W*djdW``gx1eR5I-R)f1~ru4Kw8POGCYFg;;sFqy*1$2zz0|r6#$q+8uNjqa0oS|+^CFWDyaw|olR92AieY7<2T_~{Yt{k2xom@R z81JjmlugD|ugh+56Si*Q=#iiOt(%O`QE$szFw(stD3XgTF+xIX`HLKW+gdEj8_?_= z>S(|~g=+rendC+&3h=GbUdJ8O_$1tZ$+zs^ zeFKZmY%y|~WDeSDgfYvTZ5^$lVKE&apu+dia3-C4&sdD8+=Mh%QQkms&8p3L z+h7JTmwDiQ5m!^vc38O8=9cY7gM-U9l@&X&hfu&1aTc52WMpy`r?z5~IyDNO+S(># z1lN#_U8&jLWSqcz&>DSwBzQn=b&iXI_hO9~hTCH}xtp~Yo#KXOT@0Z0e>SFRo-Rxi zYRF4*e}PU6r-OenDg<-(Sp!tQ&r-L`0r5;2X}9AQp5{WBBF+1ZdBFe7k1z}02R~p> zz7Hce<1LVO?tPdH!Jis6R)O#kF(ATF#2H0@+;M3B6jls|(bTuda)o=*q zTGDJyth3F=RPM7mG3$U)->2)^B;M;5-c4cH!nxULjkr1JGh@7iM}P_VxQ(@lS5xCb z%NpBz(3p(DNcqCp&N9tYUl@4Xpck}$RI0S;_yGs?t3F1XthZswfEJiv<{Q@%H*GQ7{R{|C%X zjD@?yNEd5X?oY-^9uF+d@M-0pF;2jjnRFILMqfI67Q|g)ru`f9m-WL3kkBqmB=tNN zDBItfr1|}={ePn!UzR%$oyrDK+OLrKIke+fqnRiB=RIw_U?i~=^WX&t1Uk|8KcI$R z38u6e;bz5u4ZIU_)z&J{PWC&q=8_x9#NooSFud{6iVs@_A$~#kw1-jZFi$jP#CUKi zBgV5kgr%ADl00F-)|oiRs3uYQV%1mMxzlBCO!X`Zg#j)0SPIQL2=SeW4EsMX@2~q?HPUwAQe8oT z=RCHTBMUtRA;VBjRL?T&3qANKOE!3hkFwCRv7THyS>&nW*Zh{!#IN-a_QrE?QkUK4 zX$;M=>*s2;;5{4&=Zy2@vf*acI8P$u*J-r_x8kdY%dwHzH{MfDIk$V_XyOFViO}oq zdNA+da$pNL0hQLe?FgDeOk7zr)kUZZelo^i=egMxmPEcMd|3nfr+6 zj6-a%tS&rC^^bUbQbpGyRPvZ-mL~YMpi6R(m5+N8SP=Dn+>=95k9$=1B&CR?rz{jy z`?zNZ&NB-uJ>yxBxuMdtj9qHwb$=`CyPylAk_9N)gSLq%h}0)M4S<@Su&PHa^!Oa& zbo43D!Vq}XEn2_zV>#Ic3%>o;wZsp8QWh=-6ME38#TMq=C7xtJrAs{HFQNLczu@sD zo*Je<&zFu@D!GQhq-*>JP*4<3h%*Q~a@;KA`=1f6~n ztmsAROP&O0Bx*=>;AtqCf|oq5K2d;$9pBaH6T5kVJzC^Z>xP~_+Vhgf1Bd_7m*5rO ziF&QiBB)tMMr_iQXKxXwT9@o$- zFM~YWMt;?0@`M*fbUjrdpU%=KyUsI;+UwAXjdhT#s|D!^xL$(P2~J(xS>GA#_ZTgVW3lv{(l5*W_pVCUfN|GQy@;-b1%#H`*LX5{j!r*5ZA6BgwXx^Y=vP7K`d7h^F|^}Vl&gCc z{K&fuMg8qMBQBHYwezm0)>l2#Y4ci;QnnUEom`9IXa*ZJh`ePiA+lt3q@VOdD23U6 zYON=c^4Ecku{3EN$jDg-=^1^QrmnV|y4lZ-Tc~QCC!dO6!_H&Y8fe_Mb!fZxH8h*> znkO5*DtQe|xRsuJ%~R_v0z$u7ivf5&FaWn*rk%h5j1zhO0T}OZa)LboucM*q>+vUX zy{b>nIb>)n2Fy~mHd zdIM(gWIv01Zvbia8|Yx_8=e#xwv*lf();k4CC_3u)r@%4bB3{Lbt@e0(SRSI?Zv#&m#Wi3= z7B-?Q6C1D`%m9w@!UWvw#W&v?J+pD+c2T2eR1n;|2ex=V$7S1fTRr*k>z>}~IW89S z1EvQ{^IR%?-?J7MY|p;$Np;RetN1@Jzv9*WoDV#iaN5rMz*7L{_1+Iq_fcH6_l)XQ zfkL?;NBo4zFN8~M*XPpg?daQFonG#R*Ozu}_e|jPb^7=PT(wHy0e(G3FYNH7;$H6F z9iD_>VMh$`Lh!!;#dQwNZKm$_bU6O^8i<*;*OTYul|TjijVeUZx=%g(8L!g)9|u_0 z>^V)vpLyIA_L*m_`0oOrd9rBP0ncc*(8O~)V~fnf&oL_eN!_wq%({afe987Hx_HQw z%oii^9uB+bu&171hJcPQ!NC5)&=iJ&Fx7Gq#F49I`gL)R_zlj}M?LulSUjl1Q^xrc z49)S7NNXdx)ZG1(XK@g0iP7gg7dZceF03@O_*YL~r@pKUW5wdXTz`H6e4h=So+S1( z9q#m)ta@vW7uNu4bb98TJH|Z2ydzv_C^OW%3%*yn==RQH&zj|uH$MoUh1;fi$Fs*t z)xAD&JxTXY=Csk{Eu{>vw=YF`y|~%n1^34baFy5V4i`$Z9%OWNL$A?E3x^G{+3Vdx zu|BW+8GN3rGTd83sXlME<+)zpt;z-}@p<#4H|%7w?Yxg%5#AzlM0nwSh=854&*x1E zc`HzY>La`fR@&gkKpJWZdfw>4ol1 z?}awE1MKy_T~!RDK>a}gHsd0}*N_0ZKl;)AiAG0x^Qa-p?&iKgal86{YK`({(8g#m zG9%iX#{Y_;el!SfnP_hcZ?=KdXnZW8E!w-z;_jE-a2$bHPlB&{)h$}|?MIO*rj$^| zg1)b8SZp8#{Iv}Wvq!)!HY`L@z^yhc`f)#kFe-#39V0cyn+)emc8oWQA4iiFn4v8v z@n&FUj5ngsiEeoR*$wZv=C&9}7T#D&iSs7&Q}%o*i}O|m!voWi=q3IyUF=Bl#kDu# zd2UGZ!t*@G#0<{}=4}vH(}NHD4D{l*fPGoTJTcJQ&O%SyO|5WP7bwo8d-1u#?hHg~W$j<-V$@#SZ08g)?9V2JjQB1$&%hIn0!|Aa9wg3Ie7=KG< z-nHIAjEbj+xp|^Z&b}N7>)aghs6W-`V7vy1CK7d_c)Y;X$Htj#6PIH6-x-^j3letb zdgoic9%%RaYJab3xVNwM667GeYlE#gp0*DM0Yj)`xOY0sFehE-9TkEt@P<*|3l3){ zoGPJopwJs-J?hj^=uM?_cuf~pPEw&a5m8~Gw*t}rLd?5N^K_w*54fgo^^QW+c!$?# z?z+`m&jC!i&0B^d2XBMuusQEd@P>(!?%PF0O1a&tFz>Ty=1oA^v9@3w^Tslpf>CFPR7iL-`xqqg&z(QL2TeDTaJ+2UsQB*t2JIE?^o4;vL5Ko5^r!xh^d<0kelpuT*c#wRE?0=u zhwVvQaoOzLK(_eK{r_}<${)r^4Kts6*xSZw*Q4HObJaXAE{bMT+@s#L{2Ie@UsKDY z-umC{!xt*NXE;SI@#3!Jb9mcq7IM;V z3hPJ7CEf^g;!wO)vga-b9TD$W2D2nV)_sk@jWG2_7I&>!_lY}IMTtmbp3#&=E zk4Pc}qXr0_$>e~^%s4aQ3J9yKE{A4Npb%Ib1q2Z!{5Tp2LV$1!MnU;0x`5((f#BkS z8eqRQFjO!QIsI$8MN0Kbf>p{#VN76QnKr*hwqg}<&?=J0X&*xdW+=dC$aZL) z<*UJt3Z-o|so*d=$G(oCa~v&QOG+?J^{$14zp@q$6t(6%ikp0^@OA2gb8KvMQ8fB6;? z#oO-Wv%^?98<<5;Z6$@011J@OSavZ1VjN<8eF9d}z$n3I+c}kC+n~|t^6kW^XPjxg z!yzoHGY++GCy&ypJFrFkoJ_(aYY^*yHO-2e1}4h{u7e+q3R3I}vka$0VwfwL<{jt* zGicOKa*A(4+s#yA!|qP-yT?ova>l!TC{sSocd|ZXpieA|5VT2n zW&}J-jeAMb9sd5X2ZPmf3<3vLd(ptndr6RwW;O-z8-#PgzLx_8ftfpuAASL3n9V~E zIIkAq8>4M6rZ@{&fKzDOaB}Fqtb+>m$I+0_AZ1N$qzp69jy7V(3z@$ANNOJ@-|S*l zv$4xxC1V7GF$z3LKHMF$oLr2H`)4WQq9sizuQ;_K{845CqAMrp^0d@x7$9 z?Pr$aBITU}Fj3*cJpUl6)Gk48CORQ_uSBAGYM_^~{hrp&RKYjhL9$xgg&{3n4N525 zaE!u%L!>NX>Ag5m&v}fuJ_=~@VW^~H$n1OJ5R}8D6usp9VHgy}OOCKRH69^n2-6E} z++vja$JJ&!@hIx4JPPC8e>2jMW3U{GsOKmd7_khwFw5zB2U$cf9wn*6m){GTJCk6CJs#$(#vEM--2Z2@WO2Wj!lHtDB<6;kq2&)uaWe@Y?jEHo0Yd2h_j~N z3_v|XrVH4GiJuS7Cduq#U51TCes}?W=Nd+@HOitNh>OPwQXK{%MoIb^Jmt11m#&j7 z9Jf{R{>u8#Hj1!69ok9SdG;n69Hy14u)#L(2CM*1q5pf6%#J7kChTGuFpTnO-7S(H z;YWbUAOlaNt8bAcJ$viLuG^r~NXca_5-Pb#izfHb#ULhLc&ziSU0yg6_H)Upx z5EaK9P5D(Pqi7yj&Advm7TRN=X$Qiys67Z56BcO~wY~WxfkH3*dP*Z?V zfPGkw0AUQ@hLHoV>uL5Xoepwxl|}8Nra<92yr$R@C=~GfA>GW&nIT9hOkg-MMbHyJ zrUaN??S&u1lj+(66o-d4!N2L%AR!wZGirtY2*zoJR_#I1$4~_{Scujh>Ut~;7Sh3F zYp@XChb{T~RhnOYFc_nPQRClu^#*dY3vYb_g=l&zSm<@92=co{P*aGIO77;1za)iP zLxkl(GDs&>@`nxd?S)w7d|D@DVCPkfPKZX-5uK1-#L7jd^P%BKjTOi)h8ny4@ZUpu z4b9gJP1>Vfbnn&+wZ1iOElx&f^(cj*U^wcV6VBvKSrIN^vjI*di2#G{4&v#iVZ6?_ z40McjGOUkB3OaaeWgSj$1R@-Mx0xLa5E{f2Da5mFVv)jR6m&7sMuutZ_+f}gk_gB$Qy#)BZPv0S6;3=3GSiGhK z1+++4MZVfkv)c3MIYEdL8G~2>jB(8D@*Ah^R2K~q{6Hy=7W%98EEyZiZlT`wA;n-Shfp znR2pB>D87geR4B%Onv%hn({Mq`Y12v3m2sB3E7PD!u2(i6; z{y}VZRlV(Ya%ZD0(QMXc(Gg`rrfAH`w3-{8E{n^UX?3{koEEuSn_6o&Q*D`$JUh=? zZOn8UGi9f_&NwYUw=%b{(U@sBrZ{DrwZ1A*b|z&yYPCaY&@oge4PF8f3HGHSK=0RkqdsH+7lj#4LMamMbw!PRerG|8$$^OxfYES~9C;C-Cgk zC#!E(&L77-_tIDazi8#9vE3Jq4$2$Sf_)YN{b=^O?iu&*8Q!7}4M%hor+TowMNK$W`XencK>1|Fv#$HliTol59jX-{&bh_~w2ezl z>e-_Hk<%0pYf=BiX%a@YsDI`(;dr{vX>3`j=63euxe0{1|i3(J}EYp%FYJaZLZ6zwYV$YaxEfMoNCcXg!r&|W(h(KjSCjL_Y34ywX^UT z#Hp&LBh+%L@hlAHRIahCSKzu@0Dz8DHH<~5=TrqOKU{7Hi*vL%m|@Q-Jocc!1dB1+ zc=$&gjz=Ty5h98>j3F;XoW=E4wuOjA6-s9fK(l)#yDU#M%C_o+6puE|?yxvzx7}&% zm6F!qINjc8bk*4#A)<{g3t%Z}#(JB}4GB*5WwSdI?M{!j_kXh4oxhWB=FF~qEozbD z-+ydPAsPd7kuy|3S6r&j;nb6rH|B~w57(I+=8F{p<7&__;}!h^ah44q&&>Z-bmJtr z-$au7Mn_>wVXpzx-4<)TZE_K3Si=Ar3;;o&EZ16`04ns)zll9zHOjwwA#cB-p$+yHAB#&iE zFLl=2+*Y}vs#-4M!Y0zKx5S~COLyK96S(^p$4PPAnZ*xCJ-DwHS4eS@bA0HGncm=* zt9*FZES@io<$@MpkPH>gKBCgfpeS6{277f87m?*d>^8(+HK~XT&o3M>5V)32cUaIB zUBERo+Q&d2#O?%*dQ%sm8i@edfvhlon2!z=z{UuO}jp^kh)H2QNG5sc6Cl-$Qv}$o*2iF$Uxt{7& zQmiyccFRtS!|5@(KYgn1#=nBcg zIPB5gb6}QBNiOK~(xEhT2VEz=wx6aA{~nbAXsi;X4KPwg8z;R~;~ zXR$nEy2td7m1SQyuN>6##LfdA_ff|u^o(9grF9JL?Rpg11RhW;EA6maGSWz`B++$@ zd!vHzZ$=pYRj}IxEppg3Qjg(o2)D;{AD#02+4XBay6IefB;ym?POmq4fEz93F>RVz zHoKQy8#p7g?Q8B#>nlLzA&Xn~m^wyU23<&dD}C{?M+Q&08sAAL2cpcu0aCn>R90p6 zm_9jKc>lO};|s68TDx&)hI0)43nSGXDv2~!BVnqo#bX;o-Jp}A>F7`?F{jAsltJdf zSJuCAp*i(Lll`+VKY2fJAecSI4QAJROsX3fp4p!hb$Zs7&F&^mziV_ED|H?tIU)f6 zS_44$YGxW1CNYd!?fPH$ksik1U`c1WWNE3I?4nk145ngYnF& zS%J@LrnN4rZGVAggKyoFi)=PK+L#VEt!!V@=?Dvu_*^PF{RWYV*vM<_SN!_ zU0?h7u5E$2X9m3NsHMlXNcdJL5{^b22}vbYlRTy)lCq@aG!uF2C*{y6>@njZ{8Q&qTa(t_1n!hpmwofMlp1ge?YG#=B% z2J6bIUHwj+$T`;J%6Rai*PA-f3Y(`Et^fVGT}Kyx<8nRz?!k_zgsnK}Sts=qQ-;{t z80#^W9Q|%ah%W!DZ}!htj~u_CHw_F!O&_Ci;(M1`oKs{M^aP3-|4;k5tMRG#(~(~~ o=H?e&@Oqa-i6V^-l_Ir;14{-C?k2>U=%p|zjz1Jlb>Win-@X)C-T(jq diff --git a/boot/ocamldep b/boot/ocamldep index db5b79a27ad1d7e01cbaf30cdfb5da6bbd4a91ca..47861baf2b562fcdfc0bca33ac90c4c73f840299 100755 GIT binary patch delta 1089 zcma)4ZERCj81Cog3>ZWa=xw`s+tQZO-S&2NWi!M<%NA<3tY%8WBvEml*kFtZoK~aKk?7%BcxmA@QcM{K}qH*7~>xk{=DbB zdEfIq@B2LG(g5{mKjpGnym2wfd1Fv!XjjtYPDIVLMfGM-(Tk^Z|GmuZVudf?v8TZ3|-6k{4`Tf*EWpx z5tqq6-)+))`9!A|50K=ywuN@JwzPzU&VSAd|LtOQCWKoUQbw?{Y(+432g_1)mmtzn zu8WiCl$b*A8wt0W?uvv%ewt5G6wOEZa!jS;5(lFdGC~c<-rV&Gr*U{lzf_IS6n!YSaM(dP@yVq$7g+(p?I3 zHGI0eX>yUCIUZWQ<2XEm&T4RDg$|e+wnaFp8_J1p4)ay2J31@@?nGtDH_^ATX`)bY zMxZ3$Bx~!RxzwIvFD^cFW$tpmpurSGd8gBoDDzcnGV3ghY+$h}sxxN7{7k1R#gj>DLs6%)iEuP_ImTrixOZ6q4{ zhL=9MUVOMvu(iUJ!W>)&ZF9}*t_F+x^&2M7wIf*vENDar%*dh#B>Eh$fn*IZ`nI&d zCwdj;=?iOq_dYhaviql!USgL93I%&uNC*51Q^$?wevWH)<^n*^>GphwzSUrqlpa*o zHH%UbrWFRx)@g!ot9pv(2B&mW%cl#4t<4FZ6JU~4nEK5VAAU2lR@~QmZ+3*C#*qhm zMLKqKDNcwg%-KU<3pHClI}^RSU{dLq}y7R?jt~`1{4V)-S05=M&fy-bI_NL2D zwS<@rh1@T1X7|3Af4~#Yp)~}kM)|TRo3z;5Wo)p)zDtrI7G(HPW&d@hu_};FMDjXj V9-Y+UFY*!r99s3t2pT5<^*1yliK_qr delta 1185 zcmb`FZA@EL9LD?3!68c!S>I+aw6t{gwzsu(NanHvA;T4!n~_KyczW-pbh*9v=H8aE z5#2Cp?8vZpAK2NlfX!Z&ZHc`!*Ofv(~IW?k)vN0yp;LFtb!iRZY?;$?zBTV*EUrLsIoIpd)hnEEB3wo)5m+En+-RiVklXh#3tSM`OeiGLy!_dLW%Amx~f8Lp&&t!0^yV(k0HvSWGBT~em(XRWHiMy97~Yx989+H zFu}?qr12jAX4~UD%Mfx(6eU*1QO%r(Gyks-oVnzbG=r> z*Kj;e;qt9YjSkBm@+3~E3i?E*uO7MRgP8Vqt$4OW)eo1$A4s`zf}+VQ+l z^EvhC!InVq2pZL5>s39lp$iMkqz;&k z+;?wSiYe5Aw?EkXX1(jj(6!8qb0aTbMp+z$`gFi*EZ+$615+r+x)lY-=1+ZQna$6d zW7i_+U2HKq>sXQH8HGBwYn=BuMvpKL4E;byzZyVKsxh<;C!iuNu$jYhGPzx3WrZsE z^F-cHb^Sj_!q+#QKXHB+@?t&YjIdpC9-~-hj;?Py{r+nMp8dsD$KQ(Pauv-`;<1Kj zW4}Iou;dB(@$tf=$GGf@zmyA z&bc`$-Qm*So=T4dia&b#yH}Fk`s!Q#bHHqJ)(cVsCKamb(%g<^1yx_)9NDScuw~CG zv|Epx*QkMY<*JRW)CuKy=R)}{Gs2hO+gz1s!wqqFRd@eC;^d4}eZBmG#9Vz7Jp&^>!<_uoGP%o1G?zfrPP zlCf2iX{#jj?h?jX+pm@|uVWTBgDBNbNi8$bH8LLi!gw4OKV?JAo_4w8a)A_G4%X_N^mn0@7`nH|XQpi3N$LJ^>93O3X{i&z)e9>&SP8Vb!tBwEo32 zZ(sYfXuAFtX4w#}fYhS0#Ny1dRG>?F8Ka^U%~EIcJ~7-^FY3B)!2=$Ce)kfy!gP&G z%resrFEdMstN12n=1nlD&nh!JVEZB1t^CX69run+oBsDQv-EWPt3YBEh~T=)EG4eu zlUP+b!Ju{*_Xquir~h4EK4C3N{?t4D_a$c8>2t0yOHMy^nOR0!!!0u>H7_wYb%KF~ z_`ZX;F7f0?`dYPaG*H+vJ@XQ?-1LW6nI)!QxB_%SKhSJ(73YjZpa&EF&e)aznR(Yw zjk@aJ9r;4j=U!q~pZ@L~(AczV%tA~H7EHf*j#+qm_$6i$300@c5>R0JI2#Br=y0ZF_Hc)jeDoO;pbX@~)&(8_=vSzKB0aI8Eo&f{Ju?QILGY?*vxW`TX bliA~r74HshxH!Gy8nXuDy6FqAF)IK7x%4px delta 605 zcmcbxmjB>deo19T{nFwh{ha*d#2kGfk(;A$qGw>FXV9qGs>#@@$+T6Id3Oop?CnoW znAb5&m_sDBQ&P(e&2)_n3{7+mEOdAe-*t&uHpw@!V1hw8U!w9;H@??S zms$CRkFE_~us|)iq$o2leS!h=--oS-j6|-~zTa3<&1&^|!2;#rRG@P_3a6jB^lzDO z(8seA3ldL#TChMhBrz!`b%KG?_2xGV5}r^0$Xur%k<9;dy23SP83|R#qM}5gYmd%f zwen%V`q}FIN6+tEVt1bY>I$>m^a)p)CB;>IGC>~g>`-XwRCk>GJ9gJsYM;VzcnSS94vy7yge`!fUDbS?Z zpVog-vgQ`N;fc2B0~Ut^Y#28NPzer|4l-UNeX zSK_i}m*_S3@Mrt_c`Z0HJ>v?{m`qR{H~_siJ@68<#Ps>V@RrpING&Q$EY2)TEuLTy n`z-(d2YGeV>E6!^IxQR@PCs*%S$BH-HD(RQ_0u<8V^#nFCE))H From e83cbc3d77cbf177fa54873bba42606e5d805827 Mon Sep 17 00:00:00 2001 From: Jacques Garrigue Date: Wed, 17 Sep 2014 10:16:16 +0000 Subject: [PATCH 012/494] Fix PR#6565: compilation fails with Env.Error(_) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15244 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 +- parsing/location.ml | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Changes b/Changes index bab71aa18e..7848e6c065 100644 --- a/Changes +++ b/Changes @@ -9,7 +9,7 @@ OCaml 4.02.1: Mark Shinwell). - PR#6564: infinite loop in Mtype.remove_aliases - PR#6563: Inclusion of packs failing to run module initializers - +- PR#6565: compilation fails with Env.Error(_) OCaml 4.02.0: ------------- diff --git a/parsing/location.ml b/parsing/location.ml index c6d1704f15..11c1e4252d 100644 --- a/parsing/location.ml +++ b/parsing/location.ml @@ -363,11 +363,18 @@ let () = ) -let report_exception ppf exn = +let rec report_exception_rec n ppf exn = match error_of_exn exn with - | Some err -> fprintf ppf "@[%a@]@." report_error err + | Some err -> + begin try + fprintf ppf "@[%a@]@." report_error err + with exn when n > 0 -> + report_exception_rec (n-1) ppf exn + end | None -> raise exn +let report_exception ppf exn = report_exception_rec 5 ppf exn + exception Error of error From c93fe90df666dcd6872b76a9aa6be4e82e0f7f8b Mon Sep 17 00:00:00 2001 From: Jacques Garrigue Date: Wed, 17 Sep 2014 10:18:13 +0000 Subject: [PATCH 013/494] Fix PR#6566: -short-paths and signature inclusion errors git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15245 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + typing/includemod.ml | 41 ++++++++++++++++++++++------------------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/Changes b/Changes index 7848e6c065..01e35bfd21 100644 --- a/Changes +++ b/Changes @@ -10,6 +10,7 @@ OCaml 4.02.1: - PR#6564: infinite loop in Mtype.remove_aliases - PR#6563: Inclusion of packs failing to run module initializers - PR#6565: compilation fails with Env.Error(_) +- PR#6566: -short-paths and signature inclusion errors OCaml 4.02.0: ------------- diff --git a/typing/includemod.ml b/typing/includemod.ml index 223214f36b..0e5be3a3da 100644 --- a/typing/includemod.ml +++ b/typing/includemod.ml @@ -61,12 +61,12 @@ let value_descriptions env cxt subst id vd1 vd2 = (* Inclusion between type declarations *) -let type_declarations env cxt subst id decl1 decl2 = +let type_declarations env ?(old_env=env) cxt subst id decl1 decl2 = Env.mark_type_used env (Ident.name id) decl1; let decl2 = Subst.type_declaration subst decl2 in let err = Includecore.type_declarations env (Ident.name id) decl1 id decl2 in if err <> [] then - raise(Error[cxt, env, Type_declarations(id, decl1, decl2, err)]) + raise(Error[cxt, old_env, Type_declarations(id, decl1, decl2, err)]) (* Inclusion between extension constructors *) @@ -78,19 +78,20 @@ let extension_constructors env cxt subst id ext1 ext2 = (* Inclusion between class declarations *) -let class_type_declarations env cxt subst id decl1 decl2 = +let class_type_declarations ~old_env env cxt subst id decl1 decl2 = let decl2 = Subst.cltype_declaration subst decl2 in match Includeclass.class_type_declarations env decl1 decl2 with [] -> () | reason -> - raise(Error[cxt, env, Class_type_declarations(id, decl1, decl2, reason)]) + raise(Error[cxt, old_env, + Class_type_declarations(id, decl1, decl2, reason)]) -let class_declarations env cxt subst id decl1 decl2 = +let class_declarations ~old_env env cxt subst id decl1 decl2 = let decl2 = Subst.class_declaration subst decl2 in match Includeclass.class_declarations env decl1 decl2 with [] -> () | reason -> - raise(Error[cxt, env, Class_declarations(id, decl1, decl2, reason)]) + raise(Error[cxt, old_env, Class_declarations(id, decl1, decl2, reason)]) (* Expand a module type identifier when possible *) @@ -314,7 +315,7 @@ and signatures env cxt subst sig1 sig2 = begin match unpaired with [] -> let cc = - signature_components new_env cxt subst (List.rev paired) + signature_components env new_env cxt subst (List.rev paired) in if len1 = len2 then (* see PR#5098 *) simplify_structure_coercion cc id_pos_list @@ -363,36 +364,38 @@ and signatures env cxt subst sig1 sig2 = (* Inclusion between signature components *) -and signature_components env cxt subst = function +and signature_components old_env env cxt subst paired = + let comps_rec rem = signature_components old_env env cxt subst rem in + match paired with [] -> [] | (Sig_value(id1, valdecl1), Sig_value(id2, valdecl2), pos) :: rem -> let cc = value_descriptions env cxt subst id1 valdecl1 valdecl2 in begin match valdecl2.val_kind with - Val_prim p -> signature_components env cxt subst rem - | _ -> (pos, cc) :: signature_components env cxt subst rem + Val_prim p -> comps_rec rem + | _ -> (pos, cc) :: comps_rec rem end | (Sig_type(id1, tydecl1, _), Sig_type(id2, tydecl2, _), pos) :: rem -> - type_declarations env cxt subst id1 tydecl1 tydecl2; - signature_components env cxt subst rem + type_declarations ~old_env env cxt subst id1 tydecl1 tydecl2; + comps_rec rem | (Sig_typext(id1, ext1, _), Sig_typext(id2, ext2, _), pos) :: rem -> extension_constructors env cxt subst id1 ext1 ext2; - (pos, Tcoerce_none) :: signature_components env cxt subst rem + (pos, Tcoerce_none) :: comps_rec rem | (Sig_module(id1, mty1, _), Sig_module(id2, mty2, _), pos) :: rem -> let cc = modtypes env (Module id1::cxt) subst (Mtype.strengthen env mty1.md_type (Pident id1)) mty2.md_type in - (pos, cc) :: signature_components env cxt subst rem + (pos, cc) :: comps_rec rem | (Sig_modtype(id1, info1), Sig_modtype(id2, info2), pos) :: rem -> modtype_infos env cxt subst id1 info1 info2; - signature_components env cxt subst rem + comps_rec rem | (Sig_class(id1, decl1, _), Sig_class(id2, decl2, _), pos) :: rem -> - class_declarations env cxt subst id1 decl1 decl2; - (pos, Tcoerce_none) :: signature_components env cxt subst rem + class_declarations ~old_env env cxt subst id1 decl1 decl2; + (pos, Tcoerce_none) :: comps_rec rem | (Sig_class_type(id1, info1, _), Sig_class_type(id2, info2, _), pos) :: rem -> - class_type_declarations env cxt subst id1 info1 info2; - signature_components env cxt subst rem + class_type_declarations ~old_env env cxt subst id1 info1 info2; + comps_rec rem | _ -> assert false From 1718acbab7889070070f0cfea2cac7cd7ecc189e Mon Sep 17 00:00:00 2001 From: Jacques Garrigue Date: Wed, 17 Sep 2014 10:22:47 +0000 Subject: [PATCH 014/494] add test case for PR#6566 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15246 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- testsuite/tests/typing-short-paths/short-paths.ml | 6 ++++++ .../tests/typing-short-paths/short-paths.ml.reference | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/testsuite/tests/typing-short-paths/short-paths.ml b/testsuite/tests/typing-short-paths/short-paths.ml index 5616090606..a9812f4fad 100644 --- a/testsuite/tests/typing-short-paths/short-paths.ml +++ b/testsuite/tests/typing-short-paths/short-paths.ml @@ -46,3 +46,9 @@ module M1 = struct type u = v and v = t1 end;; module N1 = struct type u = v and v = M1.v end;; type t1 = B;; module N2 = struct type u = v and v = M1.v end;; + + +(* PR#6566 *) +module type PR6566 = sig type t = string end;; +module PR6566 = struct type t = int end;; +module PR6566' : PR6566 = PR6566;; diff --git a/testsuite/tests/typing-short-paths/short-paths.ml.reference b/testsuite/tests/typing-short-paths/short-paths.ml.reference index 657a52145f..53309ad383 100644 --- a/testsuite/tests/typing-short-paths/short-paths.ml.reference +++ b/testsuite/tests/typing-short-paths/short-paths.ml.reference @@ -69,4 +69,15 @@ type u = M.u = C # module N1 : sig type u = v and v = t1 end # type t1 = B # module N2 : sig type u = v and v = N1.v end +# module type PR6566 = sig type t = bytes end +# module PR6566 : sig type t = int end +# Characters 26-32: + module PR6566' : PR6566 = PR6566;; + ^^^^^^ +Error: Signature mismatch: + Modules do not match: sig type t = int end is not included in PR6566 + Type declarations do not match: + type t = int + is not included in + type t = bytes # From ea9fa3ad0f7dfc5882e5615fbacc690d173cc43b Mon Sep 17 00:00:00 2001 From: Gabriel Scherer Date: Thu, 18 Sep 2014 16:32:42 +0000 Subject: [PATCH 015/494] =?UTF-8?q?PR#6533:=20broken=20semantics=20of=20%(?= =?UTF-8?q?%)=20when=20substited=20by=20a=20box=20Patch=20by=20Beno=C3=AEt?= =?UTF-8?q?=20Vaugon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15264 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ stdlib/camlinternalFormat.ml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 01e35bfd21..67e22eb2b0 100644 --- a/Changes +++ b/Changes @@ -3,6 +3,8 @@ OCaml 4.02.1: - PR#6466: Non-exhaustive matching warning message for open types is confusing - PR#6529: fix quadratic-time algorithm in Consistbl.extract. +- PR#6533: broken semantics of %(%) when substitued by a box + (Benoît Vaugon, report by Boris Yakobowski) - PR#6536: better documentation of flag # in format strings - PR#6547: __MODULE__ aborts the compiler if the module name cannot be inferred - PR#6554: fix race condition when retrieving backtraces (Jérémie Dimino, diff --git a/stdlib/camlinternalFormat.ml b/stdlib/camlinternalFormat.ml index 5dda3a7fc6..1cb45cc761 100644 --- a/stdlib/camlinternalFormat.ml +++ b/stdlib/camlinternalFormat.ml @@ -1067,7 +1067,7 @@ fun formatting_gen fmt0 fmtty0 -> match formatting_gen with | Open_box (Format (fmt1, str)) -> let Fmt_fmtty_EBB (fmt2, fmtty2) = type_format_gen fmt1 fmtty0 in let Fmt_fmtty_EBB (fmt3, fmtty3) = type_format_gen fmt0 fmtty2 in - Fmt_fmtty_EBB (Formatting_gen (Open_tag (Format (fmt2, str)), fmt3), fmtty3) + Fmt_fmtty_EBB (Formatting_gen (Open_box (Format (fmt2, str)), fmt3), fmtty3) (* Type an Ignored_param node according to an fmtty. *) and type_ignored_param : type p q x y z t u v a b c d e f . From 20c0b8652f8dc7f8670fa84ba77bc82a42560177 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer Date: Thu, 18 Sep 2014 16:32:44 +0000 Subject: [PATCH 016/494] PR#6544: Bytes and CamlinternalFormat missing from threads stdlib.cma (Christopher Zimmermann) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15265 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ otherlibs/threads/Makefile | 30 +++++++++++++++--------------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/Changes b/Changes index 67e22eb2b0..54683102a1 100644 --- a/Changes +++ b/Changes @@ -6,6 +6,8 @@ OCaml 4.02.1: - PR#6533: broken semantics of %(%) when substitued by a box (Benoît Vaugon, report by Boris Yakobowski) - PR#6536: better documentation of flag # in format strings +- PR#6544: Bytes and CamlinternalFormat missing from threads stdlib.cma + (Christopher Zimmermann) - PR#6547: __MODULE__ aborts the compiler if the module name cannot be inferred - PR#6554: fix race condition when retrieving backtraces (Jérémie Dimino, Mark Shinwell). diff --git a/otherlibs/threads/Makefile b/otherlibs/threads/Makefile index 1c4434f5b3..4b78333364 100644 --- a/otherlibs/threads/Makefile +++ b/otherlibs/threads/Makefile @@ -27,21 +27,21 @@ CAML_OBJS=thread.cmo mutex.cmo condition.cmo event.cmo threadUnix.cmo LIB=../../stdlib -LIB_OBJS=$(LIB)/camlinternalFormatBasics.cmo pervasives.cmo \ - $(LIB)/array.cmo $(LIB)/list.cmo $(LIB)/char.cmo $(LIB)/string.cmo \ - $(LIB)/sys.cmo $(LIB)/sort.cmo marshal.cmo $(LIB)/obj.cmo \ - $(LIB)/int32.cmo $(LIB)/int64.cmo $(LIB)/nativeint.cmo \ - $(LIB)/lexing.cmo $(LIB)/parsing.cmo $(LIB)/set.cmo $(LIB)/map.cmo \ - $(LIB)/stack.cmo $(LIB)/queue.cmo $(LIB)/camlinternalLazy.cmo \ - $(LIB)/lazy.cmo $(LIB)/stream.cmo $(LIB)/buffer.cmo \ - $(LIB)/printf.cmo $(LIB)/arg.cmo $(LIB)/printexc.cmo $(LIB)/gc.cmo \ - $(LIB)/digest.cmo $(LIB)/random.cmo $(LIB)/hashtbl.cmo \ - $(LIB)/format.cmo $(LIB)/scanf.cmo $(LIB)/callback.cmo \ - $(LIB)/camlinternalOO.cmo \ - $(LIB)/oo.cmo $(LIB)/camlinternalMod.cmo $(LIB)/genlex.cmo \ - $(LIB)/weak.cmo $(LIB)/filename.cmo \ - $(LIB)/complex.cmo $(LIB)/arrayLabels.cmo $(LIB)/listLabels.cmo \ - $(LIB)/stringLabels.cmo $(LIB)/stdLabels.cmo $(LIB)/moreLabels.cmo +LIB_OBJS=$(LIB)/camlinternalFormatBasics.cmo pervasives.cmo \ + $(LIB)/array.cmo $(LIB)/list.cmo $(LIB)/char.cmo $(LIB)/bytes.cmo \ + $(LIB)/string.cmo $(LIB)/sys.cmo $(LIB)/sort.cmo $(LIB)/marshal.cmo \ + $(LIB)/obj.cmo $(LIB)/int32.cmo $(LIB)/int64.cmo \ + $(LIB)/nativeint.cmo $(LIB)/lexing.cmo $(LIB)/parsing.cmo \ + $(LIB)/set.cmo $(LIB)/map.cmo $(LIB)/stack.cmo $(LIB)/queue.cmo \ + $(LIB)/camlinternalLazy.cmo $(LIB)/lazy.cmo $(LIB)/stream.cmo \ + $(LIB)/buffer.cmo $(LIB)/camlinternalFormat.cmo $(LIB)/printf.cmo \ + $(LIB)/arg.cmo $(LIB)/printexc.cmo $(LIB)/gc.cmo $(LIB)/digest.cmo \ + $(LIB)/random.cmo $(LIB)/hashtbl.cmo $(LIB)/format.cmo \ + $(LIB)/scanf.cmo $(LIB)/callback.cmo $(LIB)/camlinternalOO.cmo \ + $(LIB)/oo.cmo $(LIB)/camlinternalMod.cmo $(LIB)/genlex.cmo \ + $(LIB)/weak.cmo $(LIB)/filename.cmo $(LIB)/complex.cmo \ + $(LIB)/arrayLabels.cmo $(LIB)/listLabels.cmo $(LIB)/bytesLabels.cmo \ + $(LIB)/stringLabels.cmo $(LIB)/moreLabels.cmo $(LIB)/stdLabels.cmo UNIXLIB=../unix From 15e1057307e8845deea51f3fd27ed473ac4fba75 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer Date: Fri, 19 Sep 2014 16:10:02 +0000 Subject: [PATCH 017/494] PR#6546: -dsource omits parens for `List ((`String "A")::[]) in patterns git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15267 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ parsing/pprintast.ml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 54683102a1..cfa1216dd9 100644 --- a/Changes +++ b/Changes @@ -8,6 +8,8 @@ OCaml 4.02.1: - PR#6536: better documentation of flag # in format strings - PR#6544: Bytes and CamlinternalFormat missing from threads stdlib.cma (Christopher Zimmermann) +- PR#6546: -dsource omits parens for `List ((`String "A")::[]) in patterns + (Gabriel Scherer, report by Peter Zotov) - PR#6547: __MODULE__ aborts the compiler if the module name cannot be inferred - PR#6554: fix race condition when retrieving backtraces (Jérémie Dimino, Mark Shinwell). diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index ad1e5daab1..7dea70c555 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -351,7 +351,7 @@ class printer ()= object(self:'self) | p -> self#pattern1 f p in if x.ppat_attributes <> [] then self#pattern f x else match x.ppat_desc with - | Ppat_variant (l, Some p) -> pp f "@[<2>`%s@;%a@]" l self#pattern1 p (*RA*) + | Ppat_variant (l, Some p) -> pp f "@[<2>`%s@;%a@]" l self#simple_pattern p | Ppat_construct (({txt=Lident("()"|"[]");_}), _) -> self#simple_pattern f x | Ppat_construct (({txt;_} as li), po) -> (* FIXME The third field always false *) if txt = Lident "::" then From 04a0f3e518dbcfc59656306a454c085b595afb5b Mon Sep 17 00:00:00 2001 From: Gabriel Scherer Date: Fri, 19 Sep 2014 22:04:19 +0000 Subject: [PATCH 018/494] PR#6549: Debug section is sometimes not readable when using -pack (Hugo Heuzard) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15270 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 + bytecomp/bytepackager.ml | 3 +- .../tool-debugger/no_debug_event/.ignore | 2 + .../tool-debugger/no_debug_event/Makefile | 57 +++++++++++++++++++ .../tests/tool-debugger/no_debug_event/a.ml | 1 + .../tests/tool-debugger/no_debug_event/b.ml | 3 + .../tool-debugger/no_debug_event/input_script | 2 + 7 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 testsuite/tests/tool-debugger/no_debug_event/.ignore create mode 100644 testsuite/tests/tool-debugger/no_debug_event/Makefile create mode 100644 testsuite/tests/tool-debugger/no_debug_event/a.ml create mode 100644 testsuite/tests/tool-debugger/no_debug_event/b.ml create mode 100644 testsuite/tests/tool-debugger/no_debug_event/input_script diff --git a/Changes b/Changes index cfa1216dd9..bc089d811b 100644 --- a/Changes +++ b/Changes @@ -11,6 +11,8 @@ OCaml 4.02.1: - PR#6546: -dsource omits parens for `List ((`String "A")::[]) in patterns (Gabriel Scherer, report by Peter Zotov) - PR#6547: __MODULE__ aborts the compiler if the module name cannot be inferred +- PR#6549: Debug section is sometimes not readable when using -pack + (Hugo Heuzard, review by Gabriel Scherer) - PR#6554: fix race condition when retrieving backtraces (Jérémie Dimino, Mark Shinwell). - PR#6564: infinite loop in Mtype.remove_aliases diff --git a/bytecomp/bytepackager.ml b/bytecomp/bytepackager.ml index 3348f46dcd..05ebac9aad 100644 --- a/bytecomp/bytepackager.ml +++ b/bytecomp/bytepackager.ml @@ -222,9 +222,10 @@ let package_object_files ppf files targetfile targetname coercion = targetname Subst.identity members in build_global_target oc targetname members mapping ofs coercion; let pos_debug = pos_out oc in - if !Clflags.debug && !events <> [] then + if !Clflags.debug && !events <> [] then begin output_value oc (List.rev !events); output_value oc (StringSet.elements !debug_dirs); + end; let pos_final = pos_out oc in let imports = List.filter diff --git a/testsuite/tests/tool-debugger/no_debug_event/.ignore b/testsuite/tests/tool-debugger/no_debug_event/.ignore new file mode 100644 index 0000000000..0a2c0c40cf --- /dev/null +++ b/testsuite/tests/tool-debugger/no_debug_event/.ignore @@ -0,0 +1,2 @@ +compiler-libs +out diff --git a/testsuite/tests/tool-debugger/no_debug_event/Makefile b/testsuite/tests/tool-debugger/no_debug_event/Makefile new file mode 100644 index 0000000000..8c774c3126 --- /dev/null +++ b/testsuite/tests/tool-debugger/no_debug_event/Makefile @@ -0,0 +1,57 @@ +######################################################################### +# # +# OCaml # +# # +# Damien Doligez, EPI Gallium, INRIA Rocquencourt # +# # +# Copyright 2013 Institut National de Recherche en Informatique et # +# en Automatique. All rights reserved. This file is distributed # +# under the terms of the Q Public License version 1.0. # +# # +######################################################################### + +BASEDIR=../../.. +ADD_COMPFLAGS=-g +LD_PATH=$(TOPDIR)/otherlibs/$(UNIXLIBVAR)unix + +.PHONY: default +default: + @if ! $(SUPPORTS_SHARED_LIBRARIES); then \ + echo 'skipped (shared libraries not available)'; \ + else \ + $(MAKE) compile; \ + $(SET_LD_PATH) OCAMLLIB=. $(MAKE) run; \ + fi + +.PHONY: compile +compile: $(ML_FILES) $(CMO_FILES) + @rm -f c$(EXE) + @$(OCAMLC) -g -c a.ml -for-pack foo + @$(OCAMLC) -g a.cmo -pack -o foo.cmo + @$(OCAMLC) -g -c b.ml + @$(OCAMLC) -g foo.cmo b.cmo -o c$(EXE) + @mkdir -p compiler-libs + @cp $(TOPDIR)/toplevel/topdirs.cmi compiler-libs/ + +.PHONY: run +run: + @printf " ... testing with ocamlc" + @rm -f noev.result + @echo 'source input_script' | \ + $(OCAMLRUN) `$(CYGPATH) $(TOPDIR)/debugger/ocamldebug$(EXE)` \ + c$(EXE) >noev.raw.result 2>&1 \ + && sed -e '/Debugger version/d' -e '/^Time:/d' \ + -e '/Breakpoint [0-9]* at [0-9]*:/d' -e '$$d' \ + noev.raw.result >noev.result \ + && $(DIFF) noev.reference noev.result >/dev/null \ + && echo " => passed" || echo " => failed" + +.PHONY: promote +promote: defaultpromote + +.PHONY: clean +clean: defaultclean + @rm -f *.result *.cm* noev.* c$(EXE) + @rm -rf compiler-libs + +include $(BASEDIR)/makefiles/Makefile.common diff --git a/testsuite/tests/tool-debugger/no_debug_event/a.ml b/testsuite/tests/tool-debugger/no_debug_event/a.ml new file mode 100644 index 0000000000..0547b3d0ee --- /dev/null +++ b/testsuite/tests/tool-debugger/no_debug_event/a.ml @@ -0,0 +1 @@ +let x = 1 diff --git a/testsuite/tests/tool-debugger/no_debug_event/b.ml b/testsuite/tests/tool-debugger/no_debug_event/b.ml new file mode 100644 index 0000000000..83502097a9 --- /dev/null +++ b/testsuite/tests/tool-debugger/no_debug_event/b.ml @@ -0,0 +1,3 @@ +let () = + print_int Foo.A.x; + print_newline () diff --git a/testsuite/tests/tool-debugger/no_debug_event/input_script b/testsuite/tests/tool-debugger/no_debug_event/input_script new file mode 100644 index 0000000000..58afc787f5 --- /dev/null +++ b/testsuite/tests/tool-debugger/no_debug_event/input_script @@ -0,0 +1,2 @@ +run +quit From 7a7a8842b949435a97e70ceae6366370aca8feb2 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer Date: Sat, 20 Sep 2014 19:35:56 +0000 Subject: [PATCH 019/494] =?UTF-8?q?format=20fix:=20passing=20a=20negative?= =?UTF-8?q?=20width=20to=20%*d=20should=20pad=20to=20the=20left=20(Beno?= =?UTF-8?q?=C3=AEt=20Vaugon)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15271 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- stdlib/camlinternalFormat.ml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/stdlib/camlinternalFormat.ml b/stdlib/camlinternalFormat.ml index 1cb45cc761..0025ea1717 100644 --- a/stdlib/camlinternalFormat.ml +++ b/stdlib/camlinternalFormat.ml @@ -1229,6 +1229,18 @@ let recast : (* Add padding spaces arround a string. *) let fix_padding padty width str = let len = String.length str in + let width, padty = + abs width, + (* while literal padding widths are always non-negative, + dynamically-set widths (Arg_padding, eg. %*d) may be negative; + we interpret those as specifying a padding-to-the-left; this + means that '0' may get dropped even if it was explicitly set, + but: + - this is what the legacy implementation does, and + we preserve compatibility if possible + - we could only signal this issue by failing at runtime, + which is not very nice... *) + if width < 0 then Left else padty in if width <= len then str else let res = Bytes.make width (if padty = Zeros then '0' else ' ') in begin match padty with From f3095a8c35dfb41f385c658c0c5bb7eb27c12423 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer Date: Sat, 20 Sep 2014 19:35:58 +0000 Subject: [PATCH 020/494] =?UTF-8?q?camlinternalFormat.ml:=20minor=20style?= =?UTF-8?q?=20fixes=20(Beno=C3=AEt=20Vaugon)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15272 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- stdlib/camlinternalFormat.ml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/stdlib/camlinternalFormat.ml b/stdlib/camlinternalFormat.ml index 0025ea1717..b65a2546de 100644 --- a/stdlib/camlinternalFormat.ml +++ b/stdlib/camlinternalFormat.ml @@ -1935,9 +1935,8 @@ let fmt_ebb_of_string ?legacy_behavior str = if str_ind = end_ind then unexpected_end_of_format end_ind; let parse_literal str_ind = let new_ind, prec = parse_positive str_ind end_ind 0 in - if new_ind = end_ind then unexpected_end_of_format end_ind; - parse_conversion pct_ind (new_ind + 1) end_ind plus sharp space ign pad - (Lit_precision prec) str.[new_ind] in + parse_after_precision pct_ind new_ind end_ind plus sharp space ign + pad (Lit_precision prec) in match str.[str_ind] with | '0' .. '9' -> parse_literal str_ind | ('+' | '-') when legacy_behavior -> @@ -1989,7 +1988,7 @@ let fmt_ebb_of_string ?legacy_behavior str = and get_prec () = prec_used := true; prec in (* Check that padty <> Zeros. *) - let check_no_0 symb (type a) (type b) (pad : (a,b) padding) = + let check_no_0 symb (type a) (type b) (pad : (a, b) padding) = match pad with | No_padding -> pad | Lit_padding ((Left | Right), _) -> pad @@ -2014,7 +2013,7 @@ let fmt_ebb_of_string ?legacy_behavior str = | Lit_padding (Left, width) -> if legacy_behavior then Some width else incompatible_flag pct_ind str_ind c "'-'" - | Arg_padding _ -> incompatible_flag pct_ind str_ind c "'*'" + | Arg_padding _ -> incompatible_flag pct_ind str_ind c "'*'" in (* Get precision as a prec_option (see "%_f"). From ce92b0c2e81b430d1a328c705069c651e55a6c1e Mon Sep 17 00:00:00 2001 From: Gabriel Scherer Date: Sun, 21 Sep 2014 09:49:01 +0000 Subject: [PATCH 021/494] PR#6531 %0c: runtime support (first part of bootstrap cycle) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15273 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- stdlib/camlinternalFormat.ml | 16 +++++++++++++++- stdlib/camlinternalFormatBasics.ml | 7 +++++++ stdlib/camlinternalFormatBasics.mli | 7 +++++++ stdlib/scanf.ml | 5 +++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/stdlib/camlinternalFormat.ml b/stdlib/camlinternalFormat.ml index b65a2546de..671ce7a0f4 100644 --- a/stdlib/camlinternalFormat.ml +++ b/stdlib/camlinternalFormat.ml @@ -94,6 +94,8 @@ fun ign fmt -> match ign with Param_format_EBB (Scan_char_set (width_opt, char_set, fmt)) | Ignored_scan_get_counter counter -> Param_format_EBB (Scan_get_counter (counter, fmt)) + | Ignored_scan_next_char -> + Param_format_EBB (Scan_next_char fmt) (******************************************************************************) @@ -568,6 +570,10 @@ let bprint_fmt buf fmt = buffer_add_char buf '%'; bprint_ignored_flag buf ign_flag; buffer_add_char buf (char_of_counter counter); fmtiter rest false; + | Scan_next_char rest -> + buffer_add_char buf '%'; bprint_ignored_flag buf ign_flag; + bprint_string_literal buf "0c"; fmtiter rest false; + | Ignored_param (ign, rest) -> let Param_format_EBB fmt' = param_format_of_ignored_format ign rest in fmtiter fmt' true; @@ -842,6 +848,7 @@ fun fmtty -> match fmtty with | Scan_char_set (_, _, rest) -> String_ty (fmtty_of_fmt rest) | Scan_get_counter (_, rest) -> Int_ty (fmtty_of_fmt rest) + | Scan_next_char rest -> Char_ty (fmtty_of_fmt rest) | Ignored_param (ign, rest) -> fmtty_of_ignored_format ign rest | Formatting_lit (_, rest) -> fmtty_of_fmt rest | Formatting_gen (fmting_gen, rest) -> @@ -871,6 +878,7 @@ fun ign fmt -> match ign with | Ignored_reader -> Ignored_reader_ty (fmtty_of_fmt fmt) | Ignored_scan_char_set _ -> fmtty_of_fmt fmt | Ignored_scan_get_counter _ -> fmtty_of_fmt fmt + | Ignored_scan_next_char -> fmtty_of_fmt fmt (* Add an Int_ty node if padding is taken as an extra argument (ex: "%*s"). *) and fmtty_of_padding_fmtty : type x a b c d e f . @@ -1088,6 +1096,7 @@ fun ign fmt fmtty -> match ign with | Ignored_bool as ign' -> type_ignored_param_one ign' fmt fmtty | Ignored_scan_char_set _ as ign' -> type_ignored_param_one ign' fmt fmtty | Ignored_scan_get_counter _ as ign' -> type_ignored_param_one ign' fmt fmtty + | Ignored_scan_next_char as ign' -> type_ignored_param_one ign' fmt fmtty | Ignored_format_arg (pad_opt, sub_fmtty) -> type_ignored_param_one (Ignored_format_arg (pad_opt, sub_fmtty)) fmt fmtty | Ignored_format_subst (pad_opt, sub_fmtty) -> @@ -1426,6 +1435,10 @@ fun k o acc fmt -> match fmt with fun n -> let new_acc = Acc_data_string (acc, format_int "%u" n) in make_printf k o new_acc rest + | Scan_next_char rest -> + fun c -> + let new_acc = Acc_data_char (acc, c) in + make_printf k o new_acc rest | Ignored_param (ign, rest) -> make_ignored_param k o acc ign rest @@ -1465,6 +1478,7 @@ fun k o acc ign fmt -> match ign with | Ignored_reader -> assert false | Ignored_scan_char_set _ -> make_invalid_arg k o acc fmt | Ignored_scan_get_counter _ -> make_invalid_arg k o acc fmt + | Ignored_scan_next_char -> make_invalid_arg k o acc fmt (* Special case of printf "%_(". *) @@ -2305,7 +2319,7 @@ let fmt_ebb_of_string ?legacy_behavior str = fun str_ind end_ind -> let next_ind, formatting_lit = try - if str_ind = end_ind || str.[str_ind] <> '<' then raise Not_found; + if str_ind = end_ind || str.[str_ind] <> '<' then raise Not_found; let str_ind_1 = parse_spaces (str_ind + 1) end_ind in match str.[str_ind_1] with | '0' .. '9' | '-' -> ( diff --git a/stdlib/camlinternalFormatBasics.ml b/stdlib/camlinternalFormatBasics.ml index e51e4e2ce8..f45f434c8f 100644 --- a/stdlib/camlinternalFormatBasics.ml +++ b/stdlib/camlinternalFormatBasics.ml @@ -410,6 +410,9 @@ and ('a, 'b, 'c, 'd, 'e, 'f) fmt = | Scan_get_counter : (* %[nlNL] *) counter * ('a, 'b, 'c, 'd, 'e, 'f) fmt -> (int -> 'a, 'b, 'c, 'd, 'e, 'f) fmt + | Scan_next_char : (* %0c *) + ('a, 'b, 'c, 'd, 'e, 'f) fmt -> + (char -> 'a, 'b, 'c, 'd, 'e, 'f) fmt | Ignored_param : (* %_ *) ('a, 'b, 'c, 'd, 'y, 'x) ignored * ('x, 'b, 'c, 'y, 'e, 'f) fmt -> ('a, 'b, 'c, 'd, 'e, 'f) fmt @@ -453,6 +456,8 @@ and ('a, 'b, 'c, 'd, 'e, 'f) ignored = pad_option * char_set -> ('a, 'b, 'c, 'd, 'd, 'a) ignored | Ignored_scan_get_counter : (* %_[nlNL] *) counter -> ('a, 'b, 'c, 'd, 'd, 'a) ignored + | Ignored_scan_next_char : (* %_0c *) + ('a, 'b, 'c, 'd, 'd, 'a) ignored and ('a, 'b, 'c, 'd, 'e, 'f) format6 = Format of ('a, 'b, 'c, 'd, 'e, 'f) fmt * string @@ -602,6 +607,8 @@ fun fmt1 fmt2 -> match fmt1 with Scan_char_set (width_opt, char_set, concat_fmt rest fmt2) | Scan_get_counter (counter, rest) -> Scan_get_counter (counter, concat_fmt rest fmt2) + | Scan_next_char (rest) -> + Scan_next_char (concat_fmt rest fmt2) | Ignored_param (ign, rest) -> Ignored_param (ign, concat_fmt rest fmt2) diff --git a/stdlib/camlinternalFormatBasics.mli b/stdlib/camlinternalFormatBasics.mli index 52f428ad83..4e579f3aa9 100644 --- a/stdlib/camlinternalFormatBasics.mli +++ b/stdlib/camlinternalFormatBasics.mli @@ -225,6 +225,11 @@ and ('a, 'b, 'c, 'd, 'e, 'f) fmt = | Scan_get_counter : (* %[nlNL] *) counter * ('a, 'b, 'c, 'd, 'e, 'f) fmt -> (int -> 'a, 'b, 'c, 'd, 'e, 'f) fmt +| Scan_next_char : (* %0c *) + ('a, 'b, 'c, 'd, 'e, 'f) fmt -> + (char -> 'a, 'b, 'c, 'd, 'e, 'f) fmt + (* %0c behaves as %c for printing, but when scanning it does not + consume the character from the input stream *) | Ignored_param : (* %_ *) ('a, 'b, 'c, 'd, 'y, 'x) ignored * ('x, 'b, 'c, 'y, 'e, 'f) fmt -> ('a, 'b, 'c, 'd, 'e, 'f) fmt @@ -265,6 +270,8 @@ and ('a, 'b, 'c, 'd, 'e, 'f) ignored = pad_option * char_set -> ('a, 'b, 'c, 'd, 'd, 'a) ignored | Ignored_scan_get_counter : counter -> ('a, 'b, 'c, 'd, 'd, 'a) ignored + | Ignored_scan_next_char : + ('a, 'b, 'c, 'd, 'd, 'a) ignored and ('a, 'b, 'c, 'd, 'e, 'f) format6 = Format of ('a, 'b, 'c, 'd, 'e, 'f) fmt * string diff --git a/stdlib/scanf.ml b/stdlib/scanf.ml index 2a63ced9a4..1372c41ae8 100644 --- a/stdlib/scanf.ml +++ b/stdlib/scanf.ml @@ -1032,6 +1032,7 @@ fun k fmt -> match fmt with | Scan_char_set (_, _, rest) -> take_format_readers k rest | Scan_get_counter (_, rest) -> take_format_readers k rest + | Scan_next_char rest -> take_format_readers k rest | Formatting_lit (_, rest) -> take_format_readers k rest | Formatting_gen (Open_tag (Format (fmt, _)), rest) -> take_format_readers k (concat_fmt fmt rest) @@ -1096,6 +1097,7 @@ fun k ign fmt -> match ign with | Ignored_format_subst (_, fmtty) -> take_fmtty_format_readers k fmtty fmt | Ignored_scan_char_set _ -> take_format_readers k fmt | Ignored_scan_get_counter _ -> take_format_readers k fmt + | Ignored_scan_next_char -> take_format_readers k fmt (******************************************************************************) (* Generic scanning *) @@ -1225,6 +1227,9 @@ fun ib fmt readers -> match fmt with | Scan_get_counter (counter, rest) -> let count = get_counter ib counter in Cons (count, make_scanf ib rest readers) + | Scan_next_char rest -> + let c = Scanning.checked_peek_char ib in + Cons (c, make_scanf ib rest readers) | Formatting_lit (formatting_lit, rest) -> String.iter (check_char ib) (string_of_formatting_lit formatting_lit); From ba73da325e57f68466776eeb0973b6db06297779 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer Date: Sun, 21 Sep 2014 09:49:03 +0000 Subject: [PATCH 022/494] PR#6531 %0c: type-checker support (second part of bootstrap cycle) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15274 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- typing/typecore.ml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/typing/typecore.ml b/typing/typecore.ml index 16a310d60f..b173d99c64 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -2905,6 +2905,8 @@ and type_format loc str env = mk_constr "Ignored_scan_get_counter" [ mk_counter counter ] + | Ignored_scan_next_char -> + mk_constr "Ignored_scan_next_char" [] and mk_padding : type x y . (x, y) padding -> Parsetree.expression = fun pad -> match pad with | No_padding -> mk_constr "No_padding" [] @@ -2970,6 +2972,8 @@ and type_format loc str env = mk_int_opt width_opt; mk_string char_set; mk_fmt rest ] | Scan_get_counter (cnt, rest) -> mk_constr "Scan_get_counter" [ mk_counter cnt; mk_fmt rest ] + | Scan_next_char rest -> + mk_constr "Scan_next_char" [ mk_fmt rest ] | Ignored_param (ign, rest) -> mk_constr "Ignored_param" [ mk_ignored ign; mk_fmt rest ] | End_of_format -> From f892c3ffa85891a8cfc90e01173c18119cdd64d2 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer Date: Sun, 21 Sep 2014 09:49:05 +0000 Subject: [PATCH 023/494] PR#6531 %0c: parser support (third part of bootstrap cycle) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15275 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- stdlib/camlinternalFormat.ml | 52 +++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/stdlib/camlinternalFormat.ml b/stdlib/camlinternalFormat.ml index 671ce7a0f4..0511613569 100644 --- a/stdlib/camlinternalFormat.ml +++ b/stdlib/camlinternalFormat.ml @@ -1815,26 +1815,39 @@ let fmt_ebb_of_string ?legacy_behavior str = in (* Raise a Failure with a friendly error message. *) + let invalid_format_message str_ind msg = + failwith_message + "invalid format %S: at character number %d, %s" + str str_ind msg; + in + (* Used when the end of the format (or the current sub-format) was encoutered unexpectedly. *) let unexpected_end_of_format end_ind = - failwith_message - "invalid format %S: at character number %d, unexpected end of format" - str end_ind; + invalid_format_message end_ind + "unexpected end of format" + in + (* Used for %0c: no other widths are accepted *) + let invalid_nonnull_char_width str_ind = + invalid_format_message str_ind + "non-zero widths are invalid for %c conversions" + in (* Raise Failure with a friendly error message about an option dependencie problem. *) - and invalid_format_without str_ind c s = + let invalid_format_without str_ind c s = failwith_message "invalid format %S: at character number %d, '%c' without %s" str str_ind c s + in (* Raise Failure with a friendly error message about an unexpected character. *) - and expected_character str_ind expected read = + let expected_character str_ind expected read = failwith_message "invalid format %S: at character number %d, %s expected, read %C" - str str_ind expected read in + str str_ind expected read + in (* Parse the string from beg_ind (included) to end_ind (excluded). *) let rec parse : type e f . int -> int -> (_, _, e, f) fmt_ebb = @@ -1915,14 +1928,18 @@ let fmt_ebb_of_string ?legacy_behavior str = parse_after_padding pct_ind (str_ind + 1) end_ind plus sharp space ign (Arg_padding padty) | _ -> - if legacy_behavior then + begin match padty with + | Left -> + if not legacy_behavior then + invalid_format_without (str_ind - 1) '-' "padding"; parse_after_padding pct_ind str_ind end_ind plus sharp space ign No_padding - else begin match padty with - | Left -> - invalid_format_without (str_ind - 1) '-' "padding" | Zeros -> - invalid_format_without (str_ind - 1) '0' "padding" + (* a '0' padding indication not followed by anything should + be interpreted as a Right padding of width 0. This is used + by scanning conversions %0s and %0c *) + parse_after_padding pct_ind str_ind end_ind plus sharp space ign + (Lit_padding (Right, 0)) | Right -> parse_after_padding pct_ind str_ind end_ind plus sharp space ign No_padding @@ -2044,8 +2061,17 @@ let fmt_ebb_of_string ?legacy_behavior str = parse str_ind end_ind | 'c' -> let Fmt_EBB fmt_rest = parse str_ind end_ind in - if get_ign () then Fmt_EBB (Ignored_param (Ignored_char, fmt_rest)) - else Fmt_EBB (Char fmt_rest) + begin match get_pad_opt 'c' with + | None -> + if get_ign () + then Fmt_EBB (Ignored_param (Ignored_char, fmt_rest)) + else Fmt_EBB (Char fmt_rest) + | Some 0 -> + if get_ign () + then Fmt_EBB (Ignored_param (Ignored_scan_next_char, fmt_rest)) + else Fmt_EBB (Scan_next_char fmt_rest) + | Some _n -> invalid_nonnull_char_width str_ind + end | 'C' -> let Fmt_EBB fmt_rest = parse str_ind end_ind in if get_ign () then Fmt_EBB (Ignored_param (Ignored_caml_char,fmt_rest)) From 940f2197a5d09da98c963f53b7588a86c6d79979 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer Date: Sun, 21 Sep 2014 09:49:07 +0000 Subject: [PATCH 024/494] bootstrap git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15276 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- boot/ocamlc | Bin 1708076 -> 1709104 bytes boot/ocamldep | Bin 525946 -> 526896 bytes boot/ocamllex | Bin 251600 -> 252396 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/boot/ocamlc b/boot/ocamlc index 27567a1e6cf5622b395711da417b05ddad7f1eff..3d985633ec4ca8bfdc15771d09fa53288b4dd0a6 100755 GIT binary patch delta 140800 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⁢5E zIP##yNc89AYJ9l`V9HL>x#@bOaSC;ads43ER*!lLHdGA0N5D7x#9fvEm6`3F^iSy$VYpGG;Zp3AKGI0?CwNV(1f8=WAqu%3#}REsXV}m;OCN$7 zQ8^2B0Byl6L@yvrOU=@;x!)hls8+GK(!l&vl#m7zN5iERiP`Lk>CrTOtZj^k{ug2E zPCupTb8TY<;HCW8`f$*&d$taHt~q*+zA{1?k5l+`O}Q3#k|UoJr~s3KSO+1XNfMeY zp=1eR?F0KvmC$t(nj)d861rYOH%Mrjgl?1&HoS5Q(1SUanG%{Mp)?82me3ptrAsJ7 zLN`e$Q$n~jj$@f8q4^S8AfYS?WlQL03Ed*090}!0XrYAiB$O|q0tqdW&|(P{N@$6M zZk5nd2`!V*a>-BV$4uEu>9$Hjt0i=sgw{w1dl!oJVB<7uI$JTg(iJzA?73oy#qG^L zSX*ZwceM7gR>pXzj1kjJoc3K3S|_2qC4}3U*loRp?v+r9gzl5j{W1ro651f42P9M` zeLg6mjS?!C5J_m0gdUR6za{jrgf>fPi-aDL(4!KnkWi(B9+S{k2|X^MZIYHJB!u-f zEJ-^gv{OP)O6V!+bC-m6OXz6{JtKWqNvK*v&r0Yy2|X{N7bNtegiIOB9trK0&`T0} zS^C^3q5Tp%Afba2IwYaP5_&~KuS)1O2_2Ep>k>LDp<@zyLqcy#=(vR5lF$hWy)B`4 zBvd1zS_!=?q4y+oQbO-b=mQCTD4~xe1bZTL_mqS_k; z8?FpvpB*KHt%D3XC4@cI40V>_uo#dbmxQ`VsH=o<9wWPXB&146lMw9OAi`XApWfh7 z49eZC2aC=d3g!?OEXkYo9q3HPZ-GjiNUOK#aSks!alf7U&=x%q*M-z?)5Dy9p)Fxu zC4}mC0=&}?V)4`?Xn3&b_Yn-ui*|Jg#Ck&Uf7T-i94`Jl`}loF;Nlhd?oO2zIxfq2 zL?3Rj(&vS<4=+F5W<`?cQS^0KDEKIt6eS>WJ4^^1eR%m{kI~YJcLJh zV?C9VQ(2>JpNNw1r(4JT8*ToNj_dW7O}^^k_EdS)8j?F<0*Gf zP;kWMU_S4`v&?cW&1JZYeybiP2xQ&KhnFADY(I-(8C$`y{>@xr3y}{mKkPA~*@>41 z`0(<>PB_GJ2XfZ16;uz9l!gbOI0sVn%Rm42g{6XdR%u4(k??( zKD_*Jv_qOxX8MHc)*PrynWeV74xlI>WwQqxZbG0m%s3$<=2ubj8{_hk2orws{@|;8&Pau2ONFSx_W2DT|z9+zm zM5=v4h+^Xtpm9_)A#6hP;pK-38QtuJ9=Da#m}V!|9esHD;ZS3#a=RW!n~)TJx*chc zm(=;-#?)O)$_`LBK~g6eK2cIPYlolV*TEZm=ZB-5B=`uzD^Z++oo%be~y1WLIyogp-84Td*t06KD_*}M_ea^W<=yG z1)vWvKkPJ<`5sBTo&w8fNwO~RtXZ0DB4!JeXd>oFSJ6bIOQOf^(o;mNZ2t4%<%eU< zXiktTun#Xk>~s^=?-FvP>;}=9WbF1+HW`jSy!^1oxilV5*p8UJTVLRshxR~d?r4(G zk(hjI)owjV=ztvJQoL+D6T@fnJgwgaYrsQK>wOeuJ{@^RpNSQL(N($@(W)VVZpaM- z7d8u7mYG@wpP2X9U5%t~rW4gV4ZWpB(g@Hr=bHn(4=@{z*lEkN7{KJx$Iqg1 zTu91uh`Wx`o*p7h{ugF z%O0}(Z8s;rsE_&wZ>Cr?iUxToW@qyE=pl{*P~MG-*BQZdb|y9; z@7jX_;1JrsS09UyXRkgXbWw{;bHY9FGH-=*AF9}k8!i_6{qzQ&C4h;OemJHG?u=MH zABmTx;0C;waSqqsy@cwVNQp0jMRn%#moT=r6{=zcX6|@dPgk5v5Iv9j50ur!kaTBvkbzTA^1=m3eJoIF#+IL-wJWv?Ep{}L;MD)vKyZe?Zw z-=l@QO3D~Vn6iXU@7Jd|m-_Rm(9i?mP!1Iz5E5K@Ko9QC(XrrhE?I1s!Ltuvewg}R zc%@L*AJAhG+j?K##=GJ7&Y5SXakLiI4ywe28mLM;sK>b2&SB*VBUqro&T4#mu4oY_ zhh?AKgOA6X>5mUL7#-B7VX&2Y2-b*IX7M3CrlYVcDpY+^$6+l;^$>geU3TU-$JxTR z8ds;Gx8b<}npmsbF#Zp?n~`3FSo<&Ylqq2 z7DJCm7#|UchdnUT=r#U`mAIeo*W18H+rY=#z;9SEB}Ibxb;GcqwJOqxQjSw?q>-$= zMbS~lNaX}Wu--))v6ph5Yph`YWNX{N@2YfLl(9leKuWX`g^g0O9p%=ZWB9}mbHB~- zr+%160t}z_!(86mjS$!OZSj#*b(dm)@hYrzbTz=y znjZ4+l4xv?`k_7Q$M&e7+M|AMh4Kso8>%Tmep2P9Kz=sJPqqBi%1@*Gc!tYx@{=k* z1@f~&eyZiCR(=}g$CD_-$xo{M6v)p8`4LCEc1FQj8l!)zA*emd)gINQJ*sOv6y;oP z@TvP^3d7UNnUCA2x>TFpr2^kvs0pSK>C#$xZM@pxGy9uE7_CC2e$Xk{HM6r@K$)v813*i z^P@YQ+ps>eJu0d_D!Lttb|p2(8`Ii3Nia{8K+je#3D*dh=#j=?R~%fLE1ftL-q#<; z^lZMSiDB(dCGOoSw&v2g4EW~q6vs4Yjq}91`T*ZtL}FJ`e0x;i_NdF-qx!W&(U4Js zR3X&~aBjoeE83$5v_)ax^jf}fYaepHYP1pW8VDb4+NoosjfvO{W{fc=IF&2SjAY}F z02p7=rl7uENvo$AnfTOCG2$FoB5-#qo?;Bc)zOGHKMzVp{!~L3E>}>-6axzh;b|ay z>PPuuSZDU>R0ESdSK_8-V}fwJk{w|zyuqlj0Ut5l$V0Lv(+%tlUt#W@X>?YEzbuXq zi{fS(Yzsb=CKs17 z&Nt%32-1ss!|E`%*rzCWzVRxoRtXCX+_j1B6=S5P;YKccngD8C*(nSQBUUc}e~Zle z1;$dDZ6_(W8oVpLAlpxQvW2O%FsT-%*1}A&Fv`vTQ0UfVJP8&i*TQ62m^=%!!NL?+ zn8Oxkv4v^0FiR{<^ez6hmRgup3sY=iiY?6T7N!~)Wbchz{PJ)K?amXJgdAfE9PZ39 zVnhjrQfi?Q159lWROc({B0j<)k}8)NeaiYP_VOI)vFW*n8_or}{%}#WVX=V;>8l{3 zhjO7dL40$K0U~HDMK8k0y#GQYT)@3Z$@NS2W#X@s<+l$?D~vMEVHwk*g+@FgIJeMv z8K0ebehKey(RMD+Pt;Hj9!vxCq3*+fKD6a4DX9Qb+kX)&v|F%JGrj;?jKEIA=b?gD ze%zGbfZg*c9Z*;63XE7m-&ItJDBw9_k)KTLk6eUEXDu>(Eqn;FhY7MPhr!lSvqD^o{cjairQT``5KcE)1Y<$(qbSK8w;J&x zmNiyl%2JV7-=#t{iY2srsgW$a-9ZIoI&0$Z+UCEQcC@gVbF}{ctNHIb%9tAntH&}y zP4zOr6t56IkePZ5v)aOVmiztOMi~?Mu!ZGlnupM&1g~G1ZZ4wfKydpVh04nU1UAwR2hRo?!ZEwXx1QtSKa4<;40eZNAOe z{LiCBN?ijT6bTi9Np+N41TtW)C=v-BDMB&Uk)v3+CCE>j{M=n^+#*&D^rXft99hw@ z2YcAuw;KbowxO}g(8Ml1-y8>y_PyQM$BTw~{>ymIh8%yq4qfaJQ@I=Mqi7jDqGdE| z?m=q^Yq&qOozAW|>XZ@YiF=JX3asIM?}L0Laek@x@&Jss@58X~8jY@waC>RheW(^A zX~TVxs8QyL`@pt{(SByMw8ZfG2p(kipwvsT=e4xdxKUBYaJb+XA7CY)J!7II0mJv_ z%M4z3QCo%~IfrwUW!#7L({A1FVvrx%QYY|o@|0j4I1qJJmsm=9(5O+y;_hi9S==_s z!*HvQ$7Y6&M)2RDcWy)@Fb)*oOqEmgxbkvipl!THldtL8gQ9p?Sd@&FbQRxWzgoj5 zb{v3FZs5q1Yt0un8K3i-FR@zY&mA2*&|Ck8l0N}4wdw39wnt5BkDA;Hg*7!;5cDwG zuQRm!VNfWRY*GD9INJnQ7KI2HbA&rl9#NZ(AoDjj~rI11zZ-H$^2rqJO>jhN7D5rBI>_B* zkS;!9@D8fJ+tF_%QtEaL++e}qf!L^2@2lQURkTZd*X@w71xYjPT&Ha^67`Hg4Lv|w@H zGSsuEDkBU3@2)bELs`DS%ce8lGx47pn#s*VFjfvas}UYn!un^8havao>gSCBzWKBG z1tXcpZO4(^pT1zE%L>tta$bbOIuF!X_0K=1o!<&2?jaDDLi7B9;ZJe_{4}fV;^LK- z&RMOT#Rx4MD67cC&@5P7hzIqRO zZS2F@gZ?THeo?S_Sm&Hi%3fozC~C}Zz|iesp=Yt;`YTQ7*?XbMGMcl~jIP`ZlN+PC zWSh~a_Zq`e8O<4F#$1n=?U^j%1xT4Qxd`8;%7)aqAY<^d+hV_;!j^t0`z5HuOX$Q) zMx=*X&vxEuyd3MTbnzu)shIkR1IUTqfS1|9-ek+Q;bo{bb+qkeSY>clpMgbp9YDv3&SBm>OmrH03qT+XfesbmOLhK4fl9jd2bBzi@*Uv9f+MEuVAh?1Udw@{bl?4jb!j#Tp&h;OgeM9pSp-qHGXfbJ(yuxcDxSM`Bg*kys6fjjX<`5Z>=k z^A7xH-Z}Adf>uMx62j$;W5PNkt7l&^uwCN)E_O5&yI%o^?rg$`;|PO{SCRXs?Y=^2 zI6}@lXY8)O^U$*Rp$xu?x^_41f7QTle&{i@=~W{Z$Fc(v*G>r63p9nlhEZ+Hz95kb zUW0CMFY?4SqDjys1FK#WrBnMF3bKR?EQ|t=7(uz*$MMs$q?m8k+zPYdKEPHB!~RjY zVm^&a)|we)fA{~t_+xTLQ1KCi&#S>&)Ufgcu(apji!n*V5yR&yZ4ow!5?{v%f8A>s zwS3LIfADpq!SeuoaA8@QOENbeh0sQ{lr;#4N*NH;@A!QhB4REl6$fZLsyS!*f(L3;HD`GtsZon z&2Jh5UF9uuI08q?8F77ufPx5SekNW%5rqF+L~(Yw0yFcjrG(=~A5mrc_)$YB`?wLA zzzOmEO_NU~WVKoxlQluuH^5tf z-}}SxZZ+muKk&A(n1-Cd$a@4e#okhEx3r7h@s2ToUPBO3a0;UBfmasX^mmLtbfGyq z#Jc+(p>8QPs53aou?DKxDb_jAQI;ElW_k@Yep>}MJ^|g8O3{81>RBKSeAmcP=9-o7 zVjO`s1K(hpc+z;B`-784jHuGg^XAlhzK>o0!i(LbjGUR_^Y_cK3)NfEx!asv) zP3XrMkbTBR3YS~%PDrFlpNX1#_h+z&J%%dH$t2-s!#%G+4}uGo7VXGB9ehM4-6^)3as5qX{ zNAUKPuMIxs34G!KMe#RKToY;fx1t5Q^IKz$7(V0t)diU83I7g!d_s(U`2Zan^_@{6 z&MJ=LlBLQ=1GMt9ViI-eSqxKV(8aUpab{2@PVS;!=TIT6Jw{gRI)fU2z*JEBIYgXh zW}ic{7LReYFouc$Gr|)rhB700NXGKRMt<%XSf02E-hmuhkz&?j4_c0@^@0AKhrE#q zEs4>|F3!0#{9$&s50gF_*U$St#|bl5q8#~?txB=-d!t_~=cnLobzD+4j^I$cfNl~E z$Ue6ztj{@cexsoYt%^fg?Im|GLFAdx83(~P80j8{t!|H_+l_7ZYhikP=rGp+;74p zui0Q~QTJoc@9a0eS6YR+OD}(G1RV-yeG5v%w&{lfmC*v-hWs~}|@eFUn zQhr5l*!Iii5rdb@hsAdgmALib1fFnVGB^{@fG6zCYb~-Jr|7rki2g$zz6aY{U^T9N~fsFIC?q%PxP@YY^eDvA2x2o*^?E28fPuf&$aOk zeB)ond&=|Nmh^d{!HY=&(U4@~oR|$ZuO^y8?l^gj!4H!?llI!Y(;^ZZf;1E#Jeze71;f0wFJa_OcI#x8iGm0Pf)7Jk$N(k_VMR57?V?}!qx+P-s zr<~#NjvSqXLJ9yX3NIHm$JQGeVJ*~3JpupQrhYSe%jQg^*}W^V9`9qjH%`F8a~9qT!bym1+Dc9~;l3rfmT*MktJmk%^6>EI0; z%FC$uVRl-I3NHq`8ZbwYiI*9$68<=&j1vr@`VQVX$~a2u=#6pgL0NjJIM5r3oraZx zUK~*ee|xF2qj$aZ6ILFt<3zGRZ@3U^t`io0FVXTqFiZrT<9ZoUHIJ!XPH#*C7mlUv zbK3WSP+lR-m2MxrGma}=e|*J%%5Wk=nZw@y*EysUPH&ho4#L9Rv*e2_`xTVh$s3u# zh0PDAyC3N?>ns5g=Mn;r!pj0AHKIwKyfG0hM@&8kJJ2>5m2^U)oI?)P1FzsN62-~N zNHm&dg&z)m&>z|=D3K_o=0Xv1clPp3meJYU2cw>(&WN-N+C^|hk|ILI5r z_n!rMgAF+%;i5RVS3~VD?&1wbNj%gAwd?eWJDKyLVn z!pr1Y%sowsT~Q{9l-AW7CU|!VDQ7VqP}Xi{jyA~!-L}r~f^{VxKkFiCgU2g( zy(DAvIF9|EU0&`eJxiTj1Z=%4N8B7ZE(cK)IL&PScfz2P$i0~}&ZAri(1}&&9(NLW^ zsXoGR=>N+^iq+|G5b|ynB9w6KVgb?7I%wd`<7x{gNB(UJheG`OaFx10v%RVENgFQi zcm^Yz{x$_a13J3P8vekdYz=mcAj2Cj^4OQ^_hOa(L<7uSLe+*hl9v7L|9-AxC_hW} zJcSDqAb@YQLV3JiUIW}0pXgWM!c?-HS%Qzhf@+q>H`x-$(+nkEZ?I5Xx$hZ?w>gQu z&GC6SK7N|wBLxHqxn(p5jo0l5+ zW%eWqxPw9-EyvLe)}Tq~T$bv+=T@mN*OMGPJ^T-R1vWW;`-s;#g3dvJE_sKo}2ybTHEE6dC0K1tW*z zZSsucHvD`T;CJQ~AmnfU`OOz`P1zwVTqgg)0o8A$}t5#u0f$hiZtLy=a?I(QfitSf? z9E$BXd^#w$KW?b9;}p~j_yj^~XII%_AyM$@qy#u-RM|T#0UhuOQUbcps~6)8OS635DEICKRd!8ryfUZCj;l^zokM9pZ>YJ==e<=4jLXlMJ2!jb z0<-%y-iZOWtrI9?jMt#z(cb6co%J`x#Px}jZ&X~BeXG*RmL3B{YxEAKQ+G3cjQ1^^ zi8jWY5O7s|6s3*xh6MPWBk903-aZUCrQ~hi|3%`*`mpmy$pm zrg>wdF7JOuzntuw`sHP27XS#QDF@fx=e+e3|>Fd9RM3-wVAx?uuCA z#T#r!ED3pXg-0C|8?z{HX@$?n>{Lp|Q1#6rn)%)LA=_+$gOaQ46^d=Jx#@?HYh%pw zM(8<(ehv;TvL94}w$k#D(AVwnDXu7UWN2u8SeIc+z{>FtM)in~s&WL3peqK2=3IKM zVw*mJV|N7LF3{}cQvNqtQ3|r~O~wrqlkrWV*9L|5xdJEC#Et?8JEk_iGo=g$LFMD>4$_DKAe{q?8b5X{k?2Ls; zing7-_LA6zw*aw~5%G-3&&a$bV*y8~y@2aTLSw^6a1>XJL^)(HES$G!VMflFyhXVg zg&@X9MSq1(UGt(yd1Pi@Zhn$to9RosrpgyPGAmpgdc&(&OrvXSJ*=@_OK>5dvPYb ztn^)jxGx=(kA{@%gE!#Wh~AT1S;DFf#c`STZq&<&fo~*$1lvxSu%HC zW=_Upu&@(O#!Our%lvM+d2^GL&Rs-$;}g$3Z+|r%z!?nbPHE* zqGL+8_yGzh(R*Uv!UfqfnE;2#V(g@hY!;4_!kvLR8H>2kRDfUy$EC^niy$fB$5i&yDnzCr#+_<-!kQQIZ5lE)#Gz^AmjG>`(Xg z5xAU;+?(cRBq?3z3Yn8Jffp#Ads+l#?x0|t2Sx1HWh|VVmy6gRV;V2JZpp&J>|9B< zXJEO#TXa+c`|CNS5Oomw-^|{6O(~o^XWp`GWL0~glI-0gMxstb&U;Q-auYKkFij+Q z>6E1qN^q(xgqVXZ&n?WjNz|0Nf+bUyBm2wdEkafTRI0Rh>#m*=KBvxGl$*V9ejcjF z)l_TmrmaEa0-jzrby3E`#W|UIi@-&9iAbfl#0hcp#B*>zChw-3;c2+wM(?S}wqIJi zgo;cEjEKl}MH7NWI!ST8#FdUCVrCUCnm2C^GIdNAQQs!ycr-oW?wg!ud=qw32DAJ) zM;XURL0FfZCO9u29O{~l6qsY|1M=K)p}+hYE}XXvQFNXwSTQYQ(ZcM7nrNv`vs}ea zo0oy2Q1+TXJG%7>a__i*Lrp{S2e%x0`N<#026o?Q_EozbR&3oHs6p!%2?M!X?-up{ E0O|gZ_5c6? diff --git a/boot/ocamldep b/boot/ocamldep index 47861baf2b562fcdfc0bca33ac90c4c73f840299..3aa4641b7031515d4252ca3519a90a52437028b4 100755 GIT binary patch delta 25102 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 bafmH?E8Vc!>a=ezQk@;8D=4UiE%yHbVM~Wz diff --git a/boot/ocamllex b/boot/ocamllex index 30fb9c37e30c1a9206a8958390a717c86d89a851..818180d0b3e83f1922ed830422f4ab82c1f79bfa 100755 GIT binary patch delta 11396 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 Uqc^LGfxQ0=?B!WLdPYb8H!yfqlK=n! From 84d87fc9c79ce25e5a6cf0176b983e40671e912a Mon Sep 17 00:00:00 2001 From: Gabriel Scherer Date: Sun, 21 Sep 2014 09:49:09 +0000 Subject: [PATCH 025/494] improve the various formats testsuite with recent regressions git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15277 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- testsuite/tests/lib-format/Makefile | 7 +- testsuite/tests/lib-format/tformat.ml | 32 +++++-- testsuite/tests/lib-format/tformat.reference | 88 ++++++++++---------- testsuite/tests/lib-printf/tprintf.ml | 24 ++++-- testsuite/tests/lib-printf/tprintf.reference | 88 ++++++++++---------- testsuite/tests/lib-scanf/tscanf.ml | 14 ++++ testsuite/tests/lib-scanf/tscanf.reference | 2 +- 7 files changed, 148 insertions(+), 107 deletions(-) diff --git a/testsuite/tests/lib-format/Makefile b/testsuite/tests/lib-format/Makefile index 7a6297b6f4..9805d2db42 100644 --- a/testsuite/tests/lib-format/Makefile +++ b/testsuite/tests/lib-format/Makefile @@ -10,11 +10,8 @@ # # ######################################################################### -MAIN_MODULE=tformat -ADD_COMPFLAGS=-I $(OTOPDIR)/testsuite/lib -ADD_MODULES=testing - BASEDIR=../.. +MODULES=testing -include $(BASEDIR)/makefiles/Makefile.one +include $(BASEDIR)/makefiles/Makefile.several include $(BASEDIR)/makefiles/Makefile.common diff --git a/testsuite/tests/lib-format/tformat.ml b/testsuite/tests/lib-format/tformat.ml index a627b47f40..13c6094bd1 100644 --- a/testsuite/tests/lib-format/tformat.ml +++ b/testsuite/tests/lib-format/tformat.ml @@ -31,6 +31,7 @@ try test (sprintf "% d/% i" 42 43 = " 42/ 43"); test (sprintf "%#d/%#i" 42 43 = "42/43"); test (sprintf "%4d/%5i" 42 43 = " 42/ 43"); + test (sprintf "%*d" (-4) 42 = "42 "); test (sprintf "%*d/%*i" 4 42 5 43 = " 42/ 43"); test (sprintf "%-0+#4d/%-0 #5i" 42 43 = "+42 / 43 "); @@ -42,6 +43,7 @@ try test (sprintf "% d/% i" (-42) (-43) = "-42/-43"); test (sprintf "%#d/%#i" (-42) (-43) = "-42/-43"); test (sprintf "%4d/%5i" (-42) (-43) = " -42/ -43"); + test (sprintf "%*d" (-4) (-42) = "-42 "); test (sprintf "%*d/%*i" 4 (-42) 5 (-43) = " -42/ -43"); test (sprintf "%-0+ #4d/%-0+ #5i" (-42) (-43) = "-42 /-43 "); @@ -54,7 +56,7 @@ try test (sprintf "%#u" 42 = "42"); test (sprintf "%4u" 42 = " 42"); test (sprintf "%*u" 4 42 = " 42"); - test (sprintf "%-0+ #6d" 42 = "+42 "); + test (sprintf "%*u" (-4) 42 = "42 "); say "\nu negative\n%!"; begin match Sys.word_size with @@ -74,6 +76,10 @@ try test (sprintf "%#x" 42 = "0x2a"); test (sprintf "%4x" 42 = " 2a"); test (sprintf "%*x" 5 42 = " 2a"); + test (sprintf "%*x" (-5) 42 = "2a "); + test (sprintf "%#*x" 5 42 = " 0x2a"); + test (sprintf "%#*x" (-5) 42 = "0x2a "); + test (sprintf "%#-*x" 5 42 = "0x2a "); test (sprintf "%-0+ #*x" 5 42 = "0x2a "); say "\nx negative\n%!"; @@ -135,6 +141,7 @@ try test (sprintf "%5s" "foo" = " foo"); test (sprintf "%1s" "foo" = "foo"); test (sprintf "%*s" 6 "foo" = " foo"); + test (sprintf "%*s" (-6) "foo" = "foo "); test (sprintf "%*s" 2 "foo" = "foo"); test (sprintf "%-0+ #5s" "foo" = "foo "); test (sprintf "%s@@" "foo" = "foo@"); @@ -143,16 +150,19 @@ try say "\nS\n%!"; test (sprintf "%S" "fo\"o" = "\"fo\\\"o\""); -(* test (sprintf "%-5S" "foo" = "\"foo\" "); padding not done *) -(* test (sprintf "%05S" "foo" = " \"foo\""); padding not done *) + test (sprintf "%-7S" "foo" = "\"foo\" "); +(* test (sprintf "%07S" "foo" = " \"foo\""); *) + (* %S is incompatible with '0' *) test (sprintf "%+S" "foo" = "\"foo\""); test (sprintf "% S" "foo" = "\"foo\""); test (sprintf "%#S" "foo" = "\"foo\""); -(* test (sprintf "%5S" "foo" = " \"foo\""); padding not done *) + test (sprintf "%7S" "foo" = " \"foo\""); test (sprintf "%1S" "foo" = "\"foo\""); -(* test (sprintf "%*S" 6 "foo" = " \"foo\""); padding not done *) + test (sprintf "%*S" 8 "foo" = " \"foo\""); + test (sprintf "%*S" (-8) "foo" = "\"foo\" "); test (sprintf "%*S" 2 "foo" = "\"foo\""); (* test (sprintf "%-0+ #5S" "foo" = "\"foo\" "); padding not done *) + (* %S is incompatible with '0','+' and ' ' *) test (sprintf "%S@@" "foo" = "\"foo\"@"); test (sprintf "%S@@inria.fr" "foo" = "\"foo\"@inria.fr"); test (sprintf "%S@@%S" "foo" "inria.fr" = "\"foo\"@\"inria.fr\""); @@ -229,7 +239,13 @@ try test (sprintf "%F" 42.42e42 =* "4.242e+43"); test (sprintf "%F" 42.00 = "42."); test (sprintf "%F" 0.042 = "0.042"); -(* no padding, no precision + test (sprintf "%4F" 3. = " 3."); + test (sprintf "%-4F" 3. = "3. "); + test (sprintf "%04F" 3. = "003."); +(* plus-padding unsupported + test (sprintf "%+4F" 3. = " +3."); +*) +(* no precision test (sprintf "%.3F" 42.42 = "42.420"); test (sprintf "%12.3F" 42.42e42 = " 4.242e+43"); test (sprintf "%.3F" 42.00 = "42.000"); @@ -297,6 +313,8 @@ try say "\nB\n%!"; test (sprintf "%B" true = "true"); test (sprintf "%B" false = "false"); + (* test (sprintf "%8B" false = " false"); *) + (* padding not done *) say "\nld/li positive\n%!"; test (sprintf "%ld/%li" 42l 43l = "42/43"); @@ -485,8 +503,8 @@ try test (sprintf "@@" = "@"); test (sprintf "@@@@" = "@@"); test (sprintf "@@%%" = "@%"); - say "\nend of tests\n%!"; + with e -> say "unexpected exception: %s\n%!" (Printexc.to_string e); test false; diff --git a/testsuite/tests/lib-format/tformat.reference b/testsuite/tests/lib-format/tformat.reference index 387dfb8533..cf2b241ce7 100644 --- a/testsuite/tests/lib-format/tformat.reference +++ b/testsuite/tests/lib-format/tformat.reference @@ -1,91 +1,91 @@ d/i positive - 0 1 2 3 4 5 6 7 8 + 0 1 2 3 4 5 6 7 8 9 d/i negative - 9 10 11 12 13 14 15 16 17 + 10 11 12 13 14 15 16 17 18 19 u positive - 18 19 20 21 22 23 24 25 26 + 20 21 22 23 24 25 26 27 28 u negative - 27 + 29 x positive - 28 29 30 31 32 33 34 35 36 + 30 31 32 33 34 35 36 37 38 39 40 41 42 x negative - 37 + 43 X positive - 38 39 40 41 42 43 44 45 46 + 44 45 46 47 48 49 50 51 52 x negative - 47 + 53 o positive - 48 49 50 51 52 53 54 55 56 + 54 55 56 57 58 59 60 61 62 o negative - 57 + 63 s - 58 59 60 61 62 63 64 65 66 67 68 69 70 71 + 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 S - 72 73 74 75 76 77 78 79 80 + 79 80 81 82 83 84 85 86 87 88 89 90 91 c - 81 82 83 84 + 92 93 94 95 C - 85 86 87 88 89 + 96 97 98 99 100 f - 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 + 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 F - 108 109 110 111 + 119 120 121 122 123 124 125 e - 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 + 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 E - 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 + 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 B - 148 149 + 162 163 ld/li positive - 150 151 152 153 154 155 156 157 158 + 164 165 166 167 168 169 170 171 172 ld/li negative - 159 160 161 162 163 164 165 166 167 + 173 174 175 176 177 178 179 180 181 lu positive - 168 169 170 171 172 173 174 175 176 + 182 183 184 185 186 187 188 189 190 lu negative - 177 + 191 lx positive - 178 179 180 181 182 183 184 185 186 + 192 193 194 195 196 197 198 199 200 lx negative - 187 + 201 lX positive - 188 189 190 191 192 193 194 195 196 + 202 203 204 205 206 207 208 209 210 lx negative - 197 + 211 lo positive - 198 199 200 201 202 203 204 205 206 + 212 213 214 215 216 217 218 219 220 lo negative - 207 + 221 Ld/Li positive - 208 209 210 211 212 213 214 215 216 + 222 223 224 225 226 227 228 229 230 Ld/Li negative - 217 218 219 220 221 222 223 224 225 + 231 232 233 234 235 236 237 238 239 Lu positive - 226 227 228 229 230 231 232 233 234 + 240 241 242 243 244 245 246 247 248 Lu negative - 235 + 249 Lx positive - 236 237 238 239 240 241 242 243 244 + 250 251 252 253 254 255 256 257 258 Lx negative - 245 + 259 LX positive - 246 247 248 249 250 251 252 253 254 + 260 261 262 263 264 265 266 267 268 Lx negative - 255 + 269 Lo positive - 256 257 258 259 260 261 262 263 264 + 270 271 272 273 274 275 276 277 278 Lo negative - 265 + 279 a - 266 + 280 t - 267 + 281 {...%} - 268 + 282 (...%) - 269 + 283 ! % @ , and constants - 270 271 272 273 274 275 276 + 284 285 286 287 288 289 290 end of tests All tests succeeded. diff --git a/testsuite/tests/lib-printf/tprintf.ml b/testsuite/tests/lib-printf/tprintf.ml index 2922f8e325..ab0eeb7f39 100644 --- a/testsuite/tests/lib-printf/tprintf.ml +++ b/testsuite/tests/lib-printf/tprintf.ml @@ -30,6 +30,7 @@ try (*test (sprintf "%#d/%#i" 42 43 = "42/43");*) (* >> '#' is incompatible with 'd' *) test (sprintf "%4d/%5i" 42 43 = " 42/ 43"); + test (sprintf "%*d" (-4) 42 = "42 "); test (sprintf "%*d/%*i" 4 42 5 43 = " 42/ 43"); (*test (sprintf "%-0+#4d/%-0 #5i" 42 43 = "+42 / 43 ");*) (* >> '#' is incompatible with 'd' *) @@ -43,6 +44,7 @@ try (*test (sprintf "%#d/%#i" (-42) (-43) = "-42/-43");*) (* >> '#' is incompatible with 'd' *) test (sprintf "%4d/%5i" (-42) (-43) = " -42/ -43"); + test (sprintf "%*d" (-4) (-42) = "-42 "); test (sprintf "%*d/%*i" 4 (-42) 5 (-43) = " -42/ -43"); (*test (sprintf "%-0+ #4d/%-0+ #5i" (-42) (-43) = "-42 /-43 ");*) (* >> '0' is incompatible with '-', '#' is incompatible with 'd' *) @@ -59,8 +61,7 @@ try (* >> '#' is incompatible with 'u' *) test (sprintf "%4u" 42 = " 42"); test (sprintf "%*u" 4 42 = " 42"); - (*test (sprintf "%-0+ #6d" 42 = "+42 ");*) - (* >> '-' is incompatible with '0', '#' is incompatible with 'd' *) + test (sprintf "%*u" (-4) 42 = "42 "); printf "\nu negative\n%!"; begin match Sys.word_size with @@ -82,8 +83,11 @@ try test (sprintf "%#x" 42 = "0x2a"); test (sprintf "%4x" 42 = " 2a"); test (sprintf "%*x" 5 42 = " 2a"); - (*test (sprintf "%-0+ #*x" 5 42 = "0x2a ");*) - (* >> '-' is incompatible with '0' *) + test (sprintf "%*x" (-5) 42 = "2a "); + test (sprintf "%#*x" 5 42 = " 0x2a"); + test (sprintf "%#*x" (-5) 42 = "0x2a "); + test (sprintf "%#-*x" 5 42 = "0x2a "); + test (sprintf "%-0+ #*x" 5 42 = "0x2a "); printf "\nx negative\n%!"; begin match Sys.word_size with @@ -154,6 +158,7 @@ try test (sprintf "%5s" "foo" = " foo"); test (sprintf "%1s" "foo" = "foo"); test (sprintf "%*s" 6 "foo" = " foo"); + test (sprintf "%*s" (-6) "foo" = "foo "); test (sprintf "%*s" 2 "foo" = "foo"); (*test (sprintf "%-0+ #5s" "foo" = "foo ");*) (* >> '-' is incompatible with '0', '#' is incompatible with 's' *) @@ -173,7 +178,8 @@ try (* >> '#' is incompatible with 'S' *) (* test (sprintf "%5S" "foo" = " \"foo\""); padding not done *) test (sprintf "%1S" "foo" = "\"foo\""); -(* test (sprintf "%*S" 6 "foo" = " \"foo\""); padding not done *) + test (sprintf "%*S" 8 "foo" = " \"foo\""); + test (sprintf "%*S" (-8) "foo" = "\"foo\" "); test (sprintf "%*S" 2 "foo" = "\"foo\""); (* test (sprintf "%-0+ #5S" "foo" = "\"foo\" "); padding not done *) test (sprintf "%S@" "foo" = "\"foo\"@"); @@ -262,7 +268,13 @@ try test (sprintf "%F" 42.42e42 =* "4.242e+43"); test (sprintf "%F" 42.00 = "42."); test (sprintf "%F" 0.042 = "0.042"); -(* no padding, no precision + test (sprintf "%4F" 3. = " 3."); + test (sprintf "%-4F" 3. = "3. "); + test (sprintf "%04F" 3. = "003."); +(* plus-padding unsupported + test (sprintf "%+4F" 3. = " +3."); +*) +(* no precision test (sprintf "%.3F" 42.42 = "42.420"); test (sprintf "%12.3F" 42.42e42 = " 4.242e+43"); test (sprintf "%.3F" 42.00 = "42.000"); diff --git a/testsuite/tests/lib-printf/tprintf.reference b/testsuite/tests/lib-printf/tprintf.reference index 11ee3a74fd..323a24a74f 100644 --- a/testsuite/tests/lib-printf/tprintf.reference +++ b/testsuite/tests/lib-printf/tprintf.reference @@ -1,91 +1,91 @@ d/i positive - 0 1 2 3 4 5 6 + 0 1 2 3 4 5 6 7 d/i negative - 7 8 9 10 11 12 13 + 8 9 10 11 12 13 14 15 u positive - 14 15 16 17 18 + 16 17 18 19 20 21 u negative - 19 + 22 x positive - 20 21 22 23 24 25 + 23 24 25 26 27 28 29 30 31 32 33 x negative - 26 + 34 X positive - 27 28 29 30 31 32 + 35 36 37 38 39 40 x negative - 33 + 41 o positive - 34 35 36 37 38 39 + 42 43 44 45 46 47 o negative - 40 + 48 s - 41 42 43 44 45 46 47 48 49 + 49 50 51 52 53 54 55 56 57 58 S - 50 51 52 53 54 55 + 59 60 61 62 63 64 65 66 c - 56 + 67 C - 57 58 + 68 69 f - 59 60 61 62 63 64 65 66 67 68 69 70 71 72 + 70 71 72 73 74 75 76 77 78 79 80 81 82 83 F - 73 74 75 76 + 84 85 86 87 88 89 90 e - 77 78 79 80 81 82 83 84 85 86 87 88 89 90 -E 91 92 93 94 95 96 97 98 99 100 101 102 103 104 +E + 105 106 107 108 109 110 111 112 113 114 115 116 117 118 B - 105 106 + 119 120 ld/li positive - 107 108 109 110 111 112 113 + 121 122 123 124 125 126 127 ld/li negative - 114 115 116 117 118 119 120 + 128 129 130 131 132 133 134 lu positive - 121 122 123 124 125 + 135 136 137 138 139 lu negative - 126 + 140 lx positive - 127 128 129 130 131 132 + 141 142 143 144 145 146 lx negative - 133 + 147 lX positive - 134 135 136 137 138 139 + 148 149 150 151 152 153 lx negative - 140 + 154 lo positive - 141 142 143 144 145 146 + 155 156 157 158 159 160 lo negative - 147 + 161 Ld/Li positive - 148 149 150 151 152 + 162 163 164 165 166 Ld/Li negative - 153 154 155 156 157 + 167 168 169 170 171 Lu positive - 158 159 160 161 162 + 172 173 174 175 176 Lu negative - 163 + 177 Lx positive - 164 165 166 167 168 169 + 178 179 180 181 182 183 Lx negative - 170 + 184 LX positive - 171 172 173 174 175 176 + 185 186 187 188 189 190 Lx negative - 177 + 191 Lo positive - 178 179 180 181 182 183 + 192 193 194 195 196 197 Lo negative - 184 + 198 a - 185 + 199 t - 186 + 200 {...%} - 187 + 201 (...%) - 188 + 202 ! % @ , and constants - 189 190 191 192 193 194 195 + 203 204 205 206 207 208 209 end of tests All tests succeeded. diff --git a/testsuite/tests/lib-scanf/tscanf.ml b/testsuite/tests/lib-scanf/tscanf.ml index 8e6a252b86..33054b66e7 100644 --- a/testsuite/tests/lib-scanf/tscanf.ml +++ b/testsuite/tests/lib-scanf/tscanf.ml @@ -1439,6 +1439,8 @@ let test58 () = test (test58 ()) ;; +(* skip test number "59" which is commented below *) +let () = test (true);; (* let test59 () = ;; @@ -1470,3 +1472,15 @@ let scan_record scan_field ib = let scan_field ib = bscanf ib "%s = %[^;]" (fun finame ficont -> finame, ficont);; *) + +(* testing formats that do not consume their input *) +let test60 () = + sscanf "abc" "%0c%0c%c%n" (fun c1 c2 c3 n -> + c1 = 'a' && c2 = 'a' && c3 = 'a' && n = 1) + && + sscanf "abc" "%0s%s" (fun s1 s2 -> s1 = "" && s2 = "abc") + && + sscanf "abc" "%1s%s" (fun s1 s2 -> s1 = "a" && s2 = "bc") +;; + +test (test60 ()); diff --git a/testsuite/tests/lib-scanf/tscanf.reference b/testsuite/tests/lib-scanf/tscanf.reference index 18fe92baf8..5b2859cb86 100644 --- a/testsuite/tests/lib-scanf/tscanf.reference +++ b/testsuite/tests/lib-scanf/tscanf.reference @@ -1,2 +1,2 @@ - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 All tests succeeded. From 4d7bbdb7e4d17f66340f5d3f31ab689a7d5f7f3a Mon Sep 17 00:00:00 2001 From: Gabriel Scherer Date: Sun, 21 Sep 2014 09:49:10 +0000 Subject: [PATCH 026/494] forgotten reference file in the new no_debug_event test git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15278 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- testsuite/tests/tool-debugger/no_debug_event/noev.reference | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 testsuite/tests/tool-debugger/no_debug_event/noev.reference diff --git a/testsuite/tests/tool-debugger/no_debug_event/noev.reference b/testsuite/tests/tool-debugger/no_debug_event/noev.reference new file mode 100644 index 0000000000..d4a69fc90e --- /dev/null +++ b/testsuite/tests/tool-debugger/no_debug_event/noev.reference @@ -0,0 +1,4 @@ + +(ocd) Loading program... done. +1 +Program exit. From 3b1a62bfa3d314e944494dc67a2980fd23f9cbac Mon Sep 17 00:00:00 2001 From: Gabriel Scherer Date: Sun, 21 Sep 2014 19:59:13 +0000 Subject: [PATCH 027/494] PR#6534: legacy support for %.10s git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15279 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 + stdlib/camlinternalFormat.ml | 112 ++++++++++++------- testsuite/tests/lib-printf/Makefile | 9 +- testsuite/tests/lib-printf/pr6534.ml | 19 ++++ testsuite/tests/lib-printf/pr6534.reference | 14 +++ testsuite/tests/lib-printf/tprintf.ml | 5 + testsuite/tests/lib-printf/tprintf.reference | 60 +++++----- 7 files changed, 142 insertions(+), 79 deletions(-) create mode 100644 testsuite/tests/lib-printf/pr6534.ml create mode 100644 testsuite/tests/lib-printf/pr6534.reference diff --git a/Changes b/Changes index bc089d811b..20ffcf1760 100644 --- a/Changes +++ b/Changes @@ -5,6 +5,8 @@ OCaml 4.02.1: - PR#6529: fix quadratic-time algorithm in Consistbl.extract. - PR#6533: broken semantics of %(%) when substitued by a box (Benoît Vaugon, report by Boris Yakobowski) +- PR#6534: legacy support for %.10s + (Benoît Vaugon, Gabriel Scherer, report by Nick Chapman) - PR#6536: better documentation of flag # in format strings - PR#6544: Bytes and CamlinternalFormat missing from threads stdlib.cma (Christopher Zimmermann) diff --git a/stdlib/camlinternalFormat.ml b/stdlib/camlinternalFormat.ml index 0511613569..47ea7b6ab6 100644 --- a/stdlib/camlinternalFormat.ml +++ b/stdlib/camlinternalFormat.ml @@ -1268,6 +1268,7 @@ let fix_padding padty width str = (* Add '0' padding to int, int32, nativeint or int64 string representation. *) let fix_int_precision prec str = + let prec = abs prec in let len = String.length str in if prec <= len then str else let res = Bytes.make prec '0' in @@ -1312,6 +1313,7 @@ let format_of_aconv iconv c = (* Generate the format_float first argument form a float_conv. *) let format_of_fconv fconv prec = + let prec = abs prec in let symb = if fconv = Float_F then 'g' else char_of_fconv fconv in let buf = buffer_create 16 in buffer_add_char buf '%'; @@ -1330,6 +1332,7 @@ let convert_int64 iconv n = format_int64 (format_of_aconv iconv 'L') n (* Convert a float to string. *) (* Fix special case of "OCaml float format". *) let convert_float fconv prec x = + let prec = abs prec in let str = format_float (format_of_fconv fconv prec) x in if fconv <> Float_F then str else let len = String.length str in @@ -1922,55 +1925,56 @@ let fmt_ebb_of_string ?legacy_behavior str = match str.[str_ind] with | '0' .. '9' -> let new_ind, width = parse_positive str_ind end_ind 0 in - parse_after_padding pct_ind new_ind end_ind plus sharp space ign + parse_after_padding pct_ind new_ind end_ind minus plus sharp space ign (Lit_padding (padty, width)) | '*' -> - parse_after_padding pct_ind (str_ind + 1) end_ind plus sharp space ign - (Arg_padding padty) + parse_after_padding pct_ind (str_ind + 1) end_ind minus plus sharp space + ign (Arg_padding padty) | _ -> begin match padty with | Left -> if not legacy_behavior then invalid_format_without (str_ind - 1) '-' "padding"; - parse_after_padding pct_ind str_ind end_ind plus sharp space ign + parse_after_padding pct_ind str_ind end_ind minus plus sharp space ign No_padding | Zeros -> (* a '0' padding indication not followed by anything should be interpreted as a Right padding of width 0. This is used by scanning conversions %0s and %0c *) - parse_after_padding pct_ind str_ind end_ind plus sharp space ign + parse_after_padding pct_ind str_ind end_ind minus plus sharp space ign (Lit_padding (Right, 0)) | Right -> - parse_after_padding pct_ind str_ind end_ind plus sharp space ign + parse_after_padding pct_ind str_ind end_ind minus plus sharp space ign No_padding end (* Is precision defined? *) and parse_after_padding : type x e f . - int -> int -> int -> bool -> bool -> bool -> bool -> (x, _) padding -> - (_, _, e, f) fmt_ebb = - fun pct_ind str_ind end_ind plus sharp space ign pad -> + int -> int -> int -> bool -> bool -> bool -> bool -> bool -> + (x, _) padding -> (_, _, e, f) fmt_ebb = + fun pct_ind str_ind end_ind minus plus sharp space ign pad -> if str_ind = end_ind then unexpected_end_of_format end_ind; match str.[str_ind] with | '.' -> - parse_precision pct_ind (str_ind + 1) end_ind plus sharp space ign pad + parse_precision pct_ind (str_ind + 1) end_ind minus plus sharp space ign + pad | symb -> parse_conversion pct_ind (str_ind + 1) end_ind plus sharp space ign pad - No_precision symb + No_precision pad symb (* Read the digital or '*' precision. *) and parse_precision : type x e f . - int -> int -> int -> bool -> bool -> bool -> bool -> (x, _) padding -> - (_, _, e, f) fmt_ebb = - fun pct_ind str_ind end_ind plus sharp space ign pad -> + int -> int -> int -> bool -> bool -> bool -> bool -> bool -> + (x, _) padding -> (_, _, e, f) fmt_ebb = + fun pct_ind str_ind end_ind minus plus sharp space ign pad -> if str_ind = end_ind then unexpected_end_of_format end_ind; - let parse_literal str_ind = + let parse_literal minus str_ind = let new_ind, prec = parse_positive str_ind end_ind 0 in - parse_after_precision pct_ind new_ind end_ind plus sharp space ign + parse_after_precision pct_ind new_ind end_ind minus plus sharp space ign pad (Lit_precision prec) in match str.[str_ind] with - | '0' .. '9' -> parse_literal str_ind - | ('+' | '-') when legacy_behavior -> + | '0' .. '9' -> parse_literal minus str_ind + | ('+' | '-') as symb when legacy_behavior -> (* Legacy mode would accept and ignore '+' or '-' before the integer describing the desired precision; not that this cannot happen for padding width, as '+' and '-' already have @@ -1979,44 +1983,64 @@ let fmt_ebb_of_string ?legacy_behavior str = That said, the idea (supported by this tweak) that width and precision literals are "integer literals" in the OCaml sense is still blatantly wrong, as 123_456 or 0xFF are rejected. *) - parse_literal (str_ind + 1) + parse_literal (minus || symb = '-') (str_ind + 1) | '*' -> - parse_after_precision pct_ind (str_ind + 1) end_ind plus sharp space ign - pad Arg_precision + parse_after_precision pct_ind (str_ind + 1) end_ind minus plus sharp space + ign pad Arg_precision | _ -> if legacy_behavior then (* note that legacy implementation did not ignore '.' without a number (as it does for padding indications), but interprets it as '.0' *) - parse_after_precision pct_ind str_ind end_ind plus sharp space ign pad (Lit_precision 0) else - invalid_format_without (str_ind - 1) '.' "precision" + parse_after_precision pct_ind str_ind end_ind minus plus sharp space ign + pad (Lit_precision 0) + else + invalid_format_without (str_ind - 1) '.' "precision" (* Try to read the conversion. *) - and parse_after_precision : type x z e f . - int -> int -> int -> bool -> bool -> bool -> bool -> (x, _) padding -> - (z, _) precision -> (_, _, e, f) fmt_ebb = - fun pct_ind str_ind end_ind plus sharp space ign pad prec -> + and parse_after_precision : type x y z t e f . + int -> int -> int -> bool -> bool -> bool -> bool -> bool -> + (x, y) padding -> (z, t) precision -> (_, _, e, f) fmt_ebb = + fun pct_ind str_ind end_ind minus plus sharp space ign pad prec -> if str_ind = end_ind then unexpected_end_of_format end_ind; - parse_conversion pct_ind (str_ind + 1) end_ind plus sharp space ign pad prec - str.[str_ind] + let parse_conv (type u) (type v) (padprec : (u, v) padding) = + parse_conversion pct_ind (str_ind + 1) end_ind plus sharp space ign pad + prec padprec str.[str_ind] in + (* in legacy mode, some formats (%s and %S) accept a weird mix of + padding and precision, which is merged as a single padding + information. For example, in %.10s the precision is implicitly + understood as padding %10s, but the left-padding component may + be specified either as a left padding or a negative precision: + %-.3s and %.-3s are equivalent to %-3s *) + match pad with + | No_padding -> ( + match minus, prec with + | _, No_precision -> parse_conv No_padding + | false, Lit_precision n -> parse_conv (Lit_padding (Right, n)) + | true, Lit_precision n -> parse_conv (Lit_padding (Left, n)) + | false, Arg_precision -> parse_conv (Arg_padding Right) + | true, Arg_precision -> parse_conv (Arg_padding Left) + ) + | pad -> parse_conv pad (* Case analysis on conversion. *) - and parse_conversion : type x y z t e f . + and parse_conversion : type x y z t u v e f . int -> int -> int -> bool -> bool -> bool -> bool -> (x, y) padding -> - (z, t) precision -> char -> (_, _, e, f) fmt_ebb = - fun pct_ind str_ind end_ind plus sharp space ign pad prec symb -> + (z, t) precision -> (u, v) padding -> char -> (_, _, e, f) fmt_ebb = + fun pct_ind str_ind end_ind plus sharp space ign pad prec padprec symb -> (* Flags used to check option usages/compatibilities. *) let plus_used = ref false and sharp_used = ref false and space_used = ref false and ign_used = ref false and pad_used = ref false and prec_used = ref false in (* Access to options, update flags. *) - let get_plus () = plus_used := true; plus - and get_sharp () = sharp_used := true; sharp - and get_space () = space_used := true; space - and get_ign () = ign_used := true; ign - and get_pad () = pad_used := true; pad - and get_prec () = prec_used := true; prec in + let get_plus () = plus_used := true; plus + and get_sharp () = sharp_used := true; sharp + and get_space () = space_used := true; space + and get_ign () = ign_used := true; ign + and get_pad () = pad_used := true; pad + and get_prec () = prec_used := true; prec + and get_padprec () = pad_used := true; padprec in (* Check that padty <> Zeros. *) let check_no_0 symb (type a) (type b) (pad : (a, b) padding) = @@ -2035,7 +2059,7 @@ let fmt_ebb_of_string ?legacy_behavior str = (* Get padding as a pad_option (see "%_", "%{", "%(" and "%["). (no need for legacy mode tweaking, those were rejected by the legacy parser as well) *) - let get_pad_opt c = match get_pad () with + let opt_of_pad c (type a) (type b) (pad : (a, b) padding) = match pad with | No_padding -> None | Lit_padding (Right, width) -> Some width | Lit_padding (Zeros, width) -> @@ -2046,6 +2070,8 @@ let fmt_ebb_of_string ?legacy_behavior str = else incompatible_flag pct_ind str_ind c "'-'" | Arg_padding _ -> incompatible_flag pct_ind str_ind c "'*'" in + let get_pad_opt c = opt_of_pad c (get_pad ()) in + let get_padprec_opt c = opt_of_pad c (get_padprec ()) in (* Get precision as a prec_option (see "%_f"). (no need for legacy mode tweaking, those were rejected by the @@ -2077,20 +2103,20 @@ let fmt_ebb_of_string ?legacy_behavior str = if get_ign () then Fmt_EBB (Ignored_param (Ignored_caml_char,fmt_rest)) else Fmt_EBB (Caml_char fmt_rest) | 's' -> - let pad = check_no_0 symb (get_pad ()) in + let pad = check_no_0 symb (get_padprec ()) in let Fmt_EBB fmt_rest = parse str_ind end_ind in if get_ign () then - let ignored = Ignored_string (get_pad_opt '_') in + let ignored = Ignored_string (get_padprec_opt '_') in Fmt_EBB (Ignored_param (ignored, fmt_rest)) else let Padding_fmt_EBB (pad', fmt_rest') = make_padding_fmt_ebb pad fmt_rest in Fmt_EBB (String (pad', fmt_rest')) | 'S' -> - let pad = check_no_0 symb (get_pad ()) in + let pad = check_no_0 symb (get_padprec ()) in let Fmt_EBB fmt_rest = parse str_ind end_ind in if get_ign () then - let ignored = Ignored_caml_string (get_pad_opt '_') in + let ignored = Ignored_caml_string (get_padprec_opt '_') in Fmt_EBB (Ignored_param (ignored, fmt_rest)) else let Padding_fmt_EBB (pad', fmt_rest') = diff --git a/testsuite/tests/lib-printf/Makefile b/testsuite/tests/lib-printf/Makefile index dc31633e11..4a74a3fdcb 100644 --- a/testsuite/tests/lib-printf/Makefile +++ b/testsuite/tests/lib-printf/Makefile @@ -10,11 +10,8 @@ # # ######################################################################### -#MODULES= -MAIN_MODULE=tprintf -ADD_COMPFLAGS=-I $(OTOPDIR)/testsuite/lib -ADD_MODULES=testing - +MODULES=testing BASEDIR=../.. -include $(BASEDIR)/makefiles/Makefile.one + +include $(BASEDIR)/makefiles/Makefile.several include $(BASEDIR)/makefiles/Makefile.common diff --git a/testsuite/tests/lib-printf/pr6534.ml b/testsuite/tests/lib-printf/pr6534.ml new file mode 100644 index 0000000000..a356d52114 --- /dev/null +++ b/testsuite/tests/lib-printf/pr6534.ml @@ -0,0 +1,19 @@ +(* these are not valid under -strict-formats, but we test them here + for backward-compatibility *) +open Printf + +let () = + printf "1 [%.5s]\n" "foo"; + printf "2 [%.*s]\n" 5 "foo"; + printf "3 [%.-5s]\n" "foo"; + printf "4 [%-.5s]\n" "foo"; + printf "5 [%-.*s]\n" 5 "foo"; + printf "6 [%.*s]\n" (-5) "foo"; + + printf "1 [%.7S]\n" "foo"; + printf "2 [%.*S]\n" 7 "foo"; + printf "3 [%.-7S]\n" "foo"; + printf "4 [%-.7S]\n" "foo"; + printf "5 [%-.*S]\n" 7 "foo"; + printf "6 [%.*S]\n" (-7) "foo"; + () diff --git a/testsuite/tests/lib-printf/pr6534.reference b/testsuite/tests/lib-printf/pr6534.reference new file mode 100644 index 0000000000..c3e2a7ffd4 --- /dev/null +++ b/testsuite/tests/lib-printf/pr6534.reference @@ -0,0 +1,14 @@ +1 [ foo] +2 [ foo] +3 [foo ] +4 [foo ] +5 [foo ] +6 [foo ] +1 [ "foo"] +2 [ "foo"] +3 ["foo" ] +4 ["foo" ] +5 ["foo" ] +6 ["foo" ] + +All tests succeeded. diff --git a/testsuite/tests/lib-printf/tprintf.ml b/testsuite/tests/lib-printf/tprintf.ml index ab0eeb7f39..cb4ee657b8 100644 --- a/testsuite/tests/lib-printf/tprintf.ml +++ b/testsuite/tests/lib-printf/tprintf.ml @@ -228,6 +228,11 @@ try (*test (sprintf "%-0+ #12f" 42.42 = "+42.420000 ");*) (* >> '-' is incompatible with '0', '#' is incompatible with 'f' *) test (sprintf "%.3f" (-42.42) = "-42.420"); + test (sprintf "%.*f" (-3) 42.42 = "42.420"); + (* dynamically-provided negative precisions are currently silently + turned into their absolute value; we could error on this + in the future (the behavior is unspecified), but the previous + buggy output "%.0-3f-" is not desirable. *) test (sprintf "%-13.3f" (-42.42) = "-42.420 "); test (sprintf "%013.3f" (-42.42) = "-00000042.420"); test (sprintf "%+.3f" 42.42 = "+42.420"); diff --git a/testsuite/tests/lib-printf/tprintf.reference b/testsuite/tests/lib-printf/tprintf.reference index 323a24a74f..3a6c3f0dbc 100644 --- a/testsuite/tests/lib-printf/tprintf.reference +++ b/testsuite/tests/lib-printf/tprintf.reference @@ -27,65 +27,65 @@ c C 68 69 f - 70 71 72 73 74 75 76 77 78 79 80 81 82 83 + 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 F - 84 85 86 87 88 89 90 + 85 86 87 88 89 90 91 e - 91 92 93 94 95 96 97 98 99 100 101 102 103 104 + 92 93 94 95 96 97 98 99 100 101 102 103 104 105 E - 105 106 107 108 109 110 111 112 113 114 115 116 117 118 + 106 107 108 109 110 111 112 113 114 115 116 117 118 119 B - 119 120 + 120 121 ld/li positive - 121 122 123 124 125 126 127 + 122 123 124 125 126 127 128 ld/li negative - 128 129 130 131 132 133 134 + 129 130 131 132 133 134 135 lu positive - 135 136 137 138 139 + 136 137 138 139 140 lu negative - 140 + 141 lx positive - 141 142 143 144 145 146 + 142 143 144 145 146 147 lx negative - 147 + 148 lX positive - 148 149 150 151 152 153 + 149 150 151 152 153 154 lx negative - 154 + 155 lo positive - 155 156 157 158 159 160 + 156 157 158 159 160 161 lo negative - 161 + 162 Ld/Li positive - 162 163 164 165 166 + 163 164 165 166 167 Ld/Li negative - 167 168 169 170 171 + 168 169 170 171 172 Lu positive - 172 173 174 175 176 + 173 174 175 176 177 Lu negative - 177 + 178 Lx positive - 178 179 180 181 182 183 + 179 180 181 182 183 184 Lx negative - 184 + 185 LX positive - 185 186 187 188 189 190 + 186 187 188 189 190 191 Lx negative - 191 + 192 Lo positive - 192 193 194 195 196 197 + 193 194 195 196 197 198 Lo negative - 198 -a 199 -t +a 200 -{...%} +t 201 -(...%) +{...%} 202 +(...%) + 203 ! % @ , and constants - 203 204 205 206 207 208 209 + 204 205 206 207 208 209 210 end of tests All tests succeeded. From e74922997fb2a81c548c69838f4a468d6d930e7d Mon Sep 17 00:00:00 2001 From: Jacques Garrigue Date: Mon, 22 Sep 2014 09:59:37 +0000 Subject: [PATCH 028/494] Mark change in CAMLlocal initialization as incompatible git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15282 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Changes b/Changes index 20ffcf1760..d93ecece9b 100644 --- a/Changes +++ b/Changes @@ -131,7 +131,7 @@ Runtime system: - Fixed bug in native code version of [caml_raise_with_string] that could potentially lead to heap corruption. (Mark Shinwell) -- Blocks initialized by [CAMLlocal*] and [caml_alloc] are now filled with +* Blocks initialized by [CAMLlocal*] and [caml_alloc] are now filled with [Val_unit] rather than zero. (Mark Shinwell) - Fixed a major performance problem on large heaps (~1GB) by making heap From 7dbcd7250957cfbe76ce5350183e4250f2835f15 Mon Sep 17 00:00:00 2001 From: Jacques Garrigue Date: Mon, 22 Sep 2014 15:31:08 +0000 Subject: [PATCH 029/494] Fix PR#6572: Fatal error with recursive modules (still need to add repro case) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15298 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 + bytecomp/bytegen.ml | 1 - bytecomp/translmod.ml | 56 ++++++++++++------- .../tool-debugger/no_debug_event/Makefile | 2 +- 4 files changed, 40 insertions(+), 21 deletions(-) diff --git a/Changes b/Changes index d93ecece9b..a21f196356 100644 --- a/Changes +++ b/Changes @@ -21,6 +21,8 @@ OCaml 4.02.1: - PR#6563: Inclusion of packs failing to run module initializers - PR#6565: compilation fails with Env.Error(_) - PR#6566: -short-paths and signature inclusion errors +- PR#6572: Fatal error with recursive modules + OCaml 4.02.0: ------------- diff --git a/bytecomp/bytegen.ml b/bytecomp/bytegen.ml index af5f0a3fd8..aa98a6b34f 100644 --- a/bytecomp/bytegen.ml +++ b/bytecomp/bytegen.ml @@ -441,7 +441,6 @@ let rec comp_expr env exp sz cont = let ofs = Ident.find_same id env.ce_rec in Koffsetclosure(ofs) :: cont with Not_found -> - Format.eprintf "%a@." Ident.print id; fatal_error ("Bytegen.comp_expr: var " ^ Ident.unique_name id) end | Lconst cst -> diff --git a/bytecomp/translmod.ml b/bytecomp/translmod.ml index 9e15fc97e6..5d9d50fb03 100644 --- a/bytecomp/translmod.ml +++ b/bytecomp/translmod.ml @@ -85,19 +85,12 @@ let rec apply_coercion strict restr arg = name_lambda strict arg (fun id -> let lam = Lprim(Pmakeblock(0, Immutable), - List.map (apply_coercion_field id) pos_cc_list) in - let fv = free_variables lam in - let (lam,s) = - List.fold_left (fun (lam,s) (id',pos,c) -> - if IdentSet.mem id' fv then - let id'' = Ident.create (Ident.name id') in - (Llet(Alias,id'', - apply_coercion Alias c (Lprim(Pfield pos,[Lvar id])),lam), - Ident.add id' (Lvar id'') s) - else (lam,s)) - (lam, Ident.empty) id_pos_list + List.map (apply_coercion_field id) pos_cc_list) + and v = + Array.init (List.length pos_cc_list) + (fun pos -> (Lprim(Pfield pos,[Lvar id]))) in - if s == Ident.empty then lam else subst_lambda s lam) + wrap_id_pos_list id_pos_list v lam) | Tcoerce_functor(cc_arg, cc_res) -> let param = Ident.create "funarg" in name_lambda strict arg (fun id -> @@ -114,6 +107,24 @@ let rec apply_coercion strict restr arg = and apply_coercion_field id (pos, cc) = apply_coercion Alias cc (Lprim(Pfield pos, [Lvar id])) +and wrap_id_pos_list id_pos_list v lam = + let fv = free_variables lam in + (*Format.eprintf "%a@." Printlambda.lambda lam; + IdentSet.iter (fun id -> Format.eprintf "%a " Ident.print id) fv; + Format.eprintf "@.";*) + let (lam,s) = + List.fold_left (fun (lam,s) (id',pos,c) -> + if IdentSet.mem id' fv then + let id'' = Ident.create (Ident.name id') in + (Llet(Alias,id'', + apply_coercion Alias c v.(pos),lam), + Ident.add id' (Lvar id'') s) + else (lam,s)) + (lam, Ident.empty) id_pos_list + in + if s == Ident.empty then lam else subst_lambda s lam + + (* Compose two coercions apply_coercion c1 (apply_coercion c2 e) behaves like apply_coercion (compose_coercions c1 c2) e. *) @@ -154,7 +165,7 @@ let compose_coercions c1 c2 = let c3 = compose_coercions c1 c2 in let open Includemod in Format.eprintf "@[<2>compose_coercions@ (%a)@ (%a) =@ %a@]@." - print_coercion c1 print_coercion c2 print_coercion c2; + print_coercion c1 print_coercion c2 print_coercion c3; c3 *) @@ -362,18 +373,25 @@ and transl_structure fields cc rootpath = function Lprim(Pmakeblock(0, Immutable), List.map (fun id -> Lvar id) (List.rev fields)) | Tcoerce_structure(pos_cc_list, id_pos_list) -> - (* ignore id_pos_list as the ids are already bound *) - let v = Array.of_list (List.rev fields) in - (*List.fold_left - (fun lam (id, pos) -> Llet(Alias, id, Lvar v.(pos), lam))*) + (* Do not ignore id_pos_list ! *) + (*Format.eprintf "%a@.@[" Includemod.print_coercion cc; + List.iter (fun l -> Format.eprintf "%a@ " Ident.print l) + fields; + Format.eprintf "@]@.";*) + let v = Array.of_list (List.map (fun i -> Lvar i) (List.rev fields)) + and ids = List.fold_right IdentSet.add fields IdentSet.empty in + let lam = (Lprim(Pmakeblock(0, Immutable), List.map (fun (pos, cc) -> match cc with Tcoerce_primitive p -> transl_primitive Location.none p - | _ -> apply_coercion Strict cc (Lvar v.(pos))) + | _ -> apply_coercion Strict cc v.(pos)) pos_cc_list)) - (*id_pos_list*) + and id_pos_list = + List.filter (fun (id,_,_) -> not (IdentSet.mem id ids)) id_pos_list + in + wrap_id_pos_list id_pos_list v lam | _ -> fatal_error "Translmod.transl_structure" end diff --git a/testsuite/tests/tool-debugger/no_debug_event/Makefile b/testsuite/tests/tool-debugger/no_debug_event/Makefile index 8c774c3126..19144f3b35 100644 --- a/testsuite/tests/tool-debugger/no_debug_event/Makefile +++ b/testsuite/tests/tool-debugger/no_debug_event/Makefile @@ -51,7 +51,7 @@ promote: defaultpromote .PHONY: clean clean: defaultclean - @rm -f *.result *.cm* noev.* c$(EXE) + @rm -f *.result *.cm* c$(EXE) @rm -rf compiler-libs include $(BASEDIR)/makefiles/Makefile.common From 10a0dc6aebcdacec85136017e7f86cb753f614f3 Mon Sep 17 00:00:00 2001 From: Damien Doligez Date: Tue, 23 Sep 2014 12:17:27 +0000 Subject: [PATCH 030/494] testsuite/tests/tool-debugger/no_debug_event/Makefile: add option -custom to be independent from installed version of OCaml git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15306 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- testsuite/tests/tool-debugger/no_debug_event/.ignore | 2 ++ testsuite/tests/tool-debugger/no_debug_event/Makefile | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/testsuite/tests/tool-debugger/no_debug_event/.ignore b/testsuite/tests/tool-debugger/no_debug_event/.ignore index 0a2c0c40cf..cfbcf5c6d3 100644 --- a/testsuite/tests/tool-debugger/no_debug_event/.ignore +++ b/testsuite/tests/tool-debugger/no_debug_event/.ignore @@ -1,2 +1,4 @@ compiler-libs out +c +c.exe diff --git a/testsuite/tests/tool-debugger/no_debug_event/Makefile b/testsuite/tests/tool-debugger/no_debug_event/Makefile index 19144f3b35..ad9505f292 100644 --- a/testsuite/tests/tool-debugger/no_debug_event/Makefile +++ b/testsuite/tests/tool-debugger/no_debug_event/Makefile @@ -11,7 +11,7 @@ ######################################################################### BASEDIR=../../.. -ADD_COMPFLAGS=-g +ADD_COMPFLAGS=-g -custom LD_PATH=$(TOPDIR)/otherlibs/$(UNIXLIBVAR)unix .PHONY: default From b5069e98ec9f41c361120a7bad6479f6231c2e65 Mon Sep 17 00:00:00 2001 From: Damien Doligez Date: Tue, 23 Sep 2014 13:36:04 +0000 Subject: [PATCH 031/494] follow-up to commit 15306 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15312 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- testsuite/tests/tool-debugger/no_debug_event/Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/testsuite/tests/tool-debugger/no_debug_event/Makefile b/testsuite/tests/tool-debugger/no_debug_event/Makefile index ad9505f292..c9a08d256b 100644 --- a/testsuite/tests/tool-debugger/no_debug_event/Makefile +++ b/testsuite/tests/tool-debugger/no_debug_event/Makefile @@ -26,10 +26,10 @@ default: .PHONY: compile compile: $(ML_FILES) $(CMO_FILES) @rm -f c$(EXE) - @$(OCAMLC) -g -c a.ml -for-pack foo - @$(OCAMLC) -g a.cmo -pack -o foo.cmo - @$(OCAMLC) -g -c b.ml - @$(OCAMLC) -g foo.cmo b.cmo -o c$(EXE) + @$(OCAMLC) $(ADD_COMPFLAGS) -c a.ml -for-pack foo + @$(OCAMLC) $(ADD_COMPFLAGS) a.cmo -pack -o foo.cmo + @$(OCAMLC) $(ADD_COMPFLAGS) -c b.ml + @$(OCAMLC) $(ADD_COMPFLAGS) foo.cmo b.cmo -o c$(EXE) @mkdir -p compiler-libs @cp $(TOPDIR)/toplevel/topdirs.cmi compiler-libs/ From c17f0d51ef92ae2892682dc865a324b21b264708 Mon Sep 17 00:00:00 2001 From: Damien Doligez Date: Tue, 23 Sep 2014 13:37:07 +0000 Subject: [PATCH 032/494] testsuite: fix small mistake in makefile git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15313 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- testsuite/tests/tool-debugger/basic/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testsuite/tests/tool-debugger/basic/Makefile b/testsuite/tests/tool-debugger/basic/Makefile index f95b4803b6..3c1713906c 100644 --- a/testsuite/tests/tool-debugger/basic/Makefile +++ b/testsuite/tests/tool-debugger/basic/Makefile @@ -10,7 +10,7 @@ # # ######################################################################### -BASEDIR=../.. +BASEDIR=../../.. MAIN_MODULE=debuggee ADD_COMPFLAGS=-g -custom LD_PATH=$(TOPDIR)/otherlibs/$(UNIXLIBVAR)unix From edc74270608ac588274720279b411ff6e80c0a03 Mon Sep 17 00:00:00 2001 From: Jacques Garrigue Date: Wed, 24 Sep 2014 01:03:13 +0000 Subject: [PATCH 033/494] Fix bug introduced by commit 15298 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15316 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- bytecomp/translmod.ml | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/bytecomp/translmod.ml b/bytecomp/translmod.ml index 5d9d50fb03..a2944f3dc2 100644 --- a/bytecomp/translmod.ml +++ b/bytecomp/translmod.ml @@ -83,14 +83,12 @@ let rec apply_coercion strict restr arg = arg | Tcoerce_structure(pos_cc_list, id_pos_list) -> name_lambda strict arg (fun id -> + let get_field pos = Lprim(Pfield pos,[Lvar id]) in let lam = Lprim(Pmakeblock(0, Immutable), - List.map (apply_coercion_field id) pos_cc_list) - and v = - Array.init (List.length pos_cc_list) - (fun pos -> (Lprim(Pfield pos,[Lvar id]))) + List.map (apply_coercion_field get_field) pos_cc_list) in - wrap_id_pos_list id_pos_list v lam) + wrap_id_pos_list id_pos_list get_field lam) | Tcoerce_functor(cc_arg, cc_res) -> let param = Ident.create "funarg" in name_lambda strict arg (fun id -> @@ -104,10 +102,10 @@ let rec apply_coercion strict restr arg = name_lambda strict arg (fun id -> apply_coercion Alias cc (transl_normal_path path)) -and apply_coercion_field id (pos, cc) = - apply_coercion Alias cc (Lprim(Pfield pos, [Lvar id])) +and apply_coercion_field get_field (pos, cc) = + apply_coercion Alias cc (get_field pos) -and wrap_id_pos_list id_pos_list v lam = +and wrap_id_pos_list id_pos_list get_field lam = let fv = free_variables lam in (*Format.eprintf "%a@." Printlambda.lambda lam; IdentSet.iter (fun id -> Format.eprintf "%a " Ident.print id) fv; @@ -117,7 +115,7 @@ and wrap_id_pos_list id_pos_list v lam = if IdentSet.mem id' fv then let id'' = Ident.create (Ident.name id') in (Llet(Alias,id'', - apply_coercion Alias c v.(pos),lam), + apply_coercion Alias c (get_field pos),lam), Ident.add id' (Lvar id'') s) else (lam,s)) (lam, Ident.empty) id_pos_list @@ -378,7 +376,8 @@ and transl_structure fields cc rootpath = function List.iter (fun l -> Format.eprintf "%a@ " Ident.print l) fields; Format.eprintf "@]@.";*) - let v = Array.of_list (List.map (fun i -> Lvar i) (List.rev fields)) + let v = Array.of_list (List.rev fields) in + let get_field pos = Lvar v.(pos) and ids = List.fold_right IdentSet.add fields IdentSet.empty in let lam = (Lprim(Pmakeblock(0, Immutable), @@ -386,12 +385,12 @@ and transl_structure fields cc rootpath = function (fun (pos, cc) -> match cc with Tcoerce_primitive p -> transl_primitive Location.none p - | _ -> apply_coercion Strict cc v.(pos)) + | _ -> apply_coercion Strict cc (get_field pos)) pos_cc_list)) and id_pos_list = List.filter (fun (id,_,_) -> not (IdentSet.mem id ids)) id_pos_list in - wrap_id_pos_list id_pos_list v lam + wrap_id_pos_list id_pos_list get_field lam | _ -> fatal_error "Translmod.transl_structure" end From 90e57bc64461b677f67bbf61857e8d0897f371b1 Mon Sep 17 00:00:00 2001 From: Jacques Garrigue Date: Wed, 24 Sep 2014 01:12:13 +0000 Subject: [PATCH 034/494] add a tests target to the Makefile git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15317 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Makefile | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Makefile b/Makefile index 733ed99d47..6c0e7e6403 100644 --- a/Makefile +++ b/Makefile @@ -367,6 +367,13 @@ installoptopt: cd $(INSTALL_COMPLIBDIR) && $(RANLIB) ocamlcommon.a ocamlbytecomp.a \ ocamloptcomp.a +# Run all tests + +tests: opt.opt + cd testsuite; $(MAKE) clean && $(MAKE) all + +# The clean target + clean:: partialclean # Shared parts of the system From 1d004f8cf8ce6a1a6e8c258b2e6bdba4e9544df4 Mon Sep 17 00:00:00 2001 From: Jacques Garrigue Date: Wed, 24 Sep 2014 01:28:12 +0000 Subject: [PATCH 035/494] add repro case for PR#6572 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15318 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- .../tests/typing-modules-bugs/pr6572_ok.ml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 testsuite/tests/typing-modules-bugs/pr6572_ok.ml diff --git a/testsuite/tests/typing-modules-bugs/pr6572_ok.ml b/testsuite/tests/typing-modules-bugs/pr6572_ok.ml new file mode 100644 index 0000000000..00c2f091d6 --- /dev/null +++ b/testsuite/tests/typing-modules-bugs/pr6572_ok.ml @@ -0,0 +1,19 @@ +module type S = sig + include Set.S + module E : sig val x : int end +end + +module Make(O : Set.OrderedType) : S with type elt = O.t = + struct + include Set.Make(O) + module E = struct let x = 1 end + end + +module rec A : Set.OrderedType = struct + type t = int + let compare = Pervasives.compare +end +and B : S = struct + module C = Make(A) + include C +end From ce58da7a24aba89fda68a5c09d47858f4479e36c Mon Sep 17 00:00:00 2001 From: Jacques Garrigue Date: Wed, 24 Sep 2014 09:57:52 +0000 Subject: [PATCH 036/494] Fix PR#6578: Initialization of recursive module containing alias causes Segmentation fault git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15325 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 +- stdlib/camlinternalMod.ml | 3 +-- testsuite/tests/typing-modules/aliases.ml | 9 +++++++++ testsuite/tests/typing-modules/aliases.ml.reference | 5 +++++ 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Changes b/Changes index a21f196356..c05b0cf22b 100644 --- a/Changes +++ b/Changes @@ -22,7 +22,7 @@ OCaml 4.02.1: - PR#6565: compilation fails with Env.Error(_) - PR#6566: -short-paths and signature inclusion errors - PR#6572: Fatal error with recursive modules - +- PR#6578: Recursive module containing alias causes Segmentation fault OCaml 4.02.0: ------------- diff --git a/stdlib/camlinternalMod.ml b/stdlib/camlinternalMod.ml index 5f1882a2b4..5265a712e6 100644 --- a/stdlib/camlinternalMod.ml +++ b/stdlib/camlinternalMod.ml @@ -67,5 +67,4 @@ let rec update_mod shape o n = for i = 0 to Array.length comps - 1 do update_mod comps.(i) (Obj.field o i) (Obj.field n i) done - | Value v -> - overwrite o n + | Value v -> () (* the value is already there *) diff --git a/testsuite/tests/typing-modules/aliases.ml b/testsuite/tests/typing-modules/aliases.ml index 3eca527145..7580bebe7c 100644 --- a/testsuite/tests/typing-modules/aliases.ml +++ b/testsuite/tests/typing-modules/aliases.ml @@ -235,3 +235,12 @@ module R = struct module Q = M end;; module R' : S = R;; (* should be ok *) + +(* PR#6578 *) + +module M = struct let f x = x end +module rec R : sig module M : sig val f : 'a -> 'a end end = + struct module M = M end;; +R.M.f 3;; +module rec R : sig module M = M end = struct module M = M end;; +R.M.f 3;; diff --git a/testsuite/tests/typing-modules/aliases.ml.reference b/testsuite/tests/typing-modules/aliases.ml.reference index 2bb3231de4..6f0fe74589 100644 --- a/testsuite/tests/typing-modules/aliases.ml.reference +++ b/testsuite/tests/typing-modules/aliases.ml.reference @@ -411,4 +411,9 @@ Error: Signature mismatch: sig module N = M.N module P = M.P end In module Q.N: Modules do not match: sig end is not included in (module M.N) +# module M : sig val f : 'a -> 'a end +module rec R : sig module M : sig val f : 'a -> 'a end end +# - : int = 3 +# module rec R : sig module M = M end +# - : int = 3 # From dc7e024c5d903226f77d5a0e143be4fdb4d21eec Mon Sep 17 00:00:00 2001 From: Gabriel Scherer Date: Thu, 25 Sep 2014 15:07:52 +0000 Subject: [PATCH 037/494] =?UTF-8?q?revert=20to=20the=20legacy=20behavior?= =?UTF-8?q?=20for=20%05.3d,=20but=20reject=20it=20in=20-strict-formats=20m?= =?UTF-8?q?ode=20(Beno=C3=AEt=20Vaugon)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15331 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- stdlib/camlinternalFormat.ml | 63 +++++++++++++++++++++++++----------- 1 file changed, 44 insertions(+), 19 deletions(-) diff --git a/stdlib/camlinternalFormat.ml b/stdlib/camlinternalFormat.ml index 47ea7b6ab6..19488ac08e 100644 --- a/stdlib/camlinternalFormat.ml +++ b/stdlib/camlinternalFormat.ml @@ -1270,21 +1270,23 @@ let fix_padding padty width str = let fix_int_precision prec str = let prec = abs prec in let len = String.length str in - if prec <= len then str else + match str.[0] with + | ('+' | '-' | ' ') as c when prec + 1 > len -> + let res = Bytes.make (prec + 1) '0' in + Bytes.set res 0 c; + String.blit str 1 res (prec - len + 2) (len - 1); + Bytes.unsafe_to_string res + | '0' when prec + 2 > len && len > 1 && (str.[1] = 'x' || str.[1] = 'X') -> + let res = Bytes.make (prec + 2) '0' in + Bytes.set res 1 str.[1]; + String.blit str 2 res (prec - len + 4) (len - 2); + Bytes.unsafe_to_string res + | '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' when prec > len -> let res = Bytes.make prec '0' in - begin match str.[0] with - | ('+' | '-' | ' ') as c -> - Bytes.set res 0 c; - String.blit str 1 res (prec - len + 1) (len - 1); - | '0' when len > 1 && (str.[1] = 'x' || str.[1] = 'X') -> - Bytes.set res 1 str.[1]; - String.blit str 2 res (prec - len + 2) (len - 2); - | '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' -> - String.blit str 0 res (prec - len) len; - | _ -> - assert false - end; + String.blit str 0 res (prec - len) len; Bytes.unsafe_to_string res + | _ -> + str (* Escape a string according to the OCaml lexing convention. *) let string_to_caml_string str = @@ -2130,8 +2132,31 @@ let fmt_ebb_of_string ?legacy_behavior str = let ignored = Ignored_int (iconv, get_pad_opt '_') in Fmt_EBB (Ignored_param (ignored, fmt_rest)) else + (* %5.3d is accepted and meaningful: pad to length 5 with + spaces, but first pad with zeros upto length 3 (0-padding + is the interpretation of "precision" for integer formats). + + %05.3d is redundant: pad to length 5 *with zeros*, but + first pad with zeros... To add insult to the injury, the + legacy implementation ignores the 0-padding indication and + does the 5 padding with spaces instead. We reuse this + interpretation for compatiblity, but statically reject this + format when the legacy mode is disabled, to protect strict + users from this corner case. + *) + let pad = match get_pad (), get_prec () with + | pad, No_precision -> pad + | No_padding, _ -> No_padding + | Lit_padding (Zeros, n), _ -> + if legacy_behavior then Lit_padding (Right, n) + else incompatible_flag pct_ind str_ind '0' "precision" + | Arg_padding Zeros, _ -> + if legacy_behavior then Arg_padding Right + else incompatible_flag pct_ind str_ind '0' "precision" + | Lit_padding _ as pad, _ -> pad + | Arg_padding _ as pad, _ -> pad in let Padprec_fmt_EBB (pad', prec', fmt_rest') = - make_padprec_fmt_ebb (get_pad ()) (get_prec ()) fmt_rest in + make_padprec_fmt_ebb pad (get_prec ()) fmt_rest in Fmt_EBB (Int (iconv, pad', prec', fmt_rest')) | 'N' -> let Fmt_EBB fmt_rest = parse str_ind end_ind in @@ -2619,24 +2644,24 @@ let fmt_ebb_of_string ?legacy_behavior str = | _, true, _, 'x' when legacy_behavior -> Int_Cx | _, true, _, 'X' when legacy_behavior -> Int_CX | _, true, _, 'o' when legacy_behavior -> Int_Co - | _, true, _, _ -> + | _, true, _, ('d' | 'i' | 'u') -> if legacy_behavior then (* ignore *) compute_int_conv pct_ind str_ind plus false space symb else incompatible_flag pct_ind str_ind symb "'#'" - | true, false, true, _ -> + | true, _, true, _ -> if legacy_behavior then (* plus and space: legacy implementation prefers plus *) compute_int_conv pct_ind str_ind plus sharp false symb else incompatible_flag pct_ind str_ind ' ' "'+'" - | false, false, true, _ -> + | false, _, true, _ -> if legacy_behavior then (* ignore *) compute_int_conv pct_ind str_ind plus sharp false symb else incompatible_flag pct_ind str_ind symb "' '" - | true, false, false, _ -> + | true, _, false, _ -> if legacy_behavior then (* ignore *) compute_int_conv pct_ind str_ind false sharp space symb else incompatible_flag pct_ind str_ind symb "'+'" - | false, false, false, _ -> assert false + | false, _, false, _ -> assert false (* Convert (plus, symb) to its associated float_conv. *) and compute_float_conv pct_ind str_ind plus space symb = From dcce0049e62b196e9fd2c9e101b44915663c32b6 Mon Sep 17 00:00:00 2001 From: Jacques Garrigue Date: Fri, 26 Sep 2014 01:34:10 +0000 Subject: [PATCH 038/494] Fix PR#6581: Some bugs in generative functors git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15336 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + parsing/parser.mly | 4 ++-- typing/includemod.ml | 7 +++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Changes b/Changes index c05b0cf22b..85ebaa6df9 100644 --- a/Changes +++ b/Changes @@ -23,6 +23,7 @@ OCaml 4.02.1: - PR#6566: -short-paths and signature inclusion errors - PR#6572: Fatal error with recursive modules - PR#6578: Recursive module containing alias causes Segmentation fault +- PR#6581: Some bugs in generative functors OCaml 4.02.0: ------------- diff --git a/parsing/parser.mly b/parsing/parser.mly index 4e2053be34..ba8e98e6b9 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -547,7 +547,7 @@ parse_pattern: functor_arg: LPAREN RPAREN - { mkrhs "()" 2, None } + { mkrhs "*" 2, None } | LPAREN functor_arg_name COLON module_type RPAREN { mkrhs $2 2, Some $4 } ; @@ -776,7 +776,7 @@ module_declaration: | LPAREN UIDENT COLON module_type RPAREN module_declaration { mkmty(Pmty_functor(mkrhs $2 2, Some $4, $6)) } | LPAREN RPAREN module_declaration - { mkmty(Pmty_functor(mkrhs "()" 1, None, $3)) } + { mkmty(Pmty_functor(mkrhs "*" 1, None, $3)) } ; module_rec_declarations: module_rec_declaration { [$1] } diff --git a/typing/includemod.ml b/typing/includemod.ml index 0e5be3a3da..91f37d7ccf 100644 --- a/typing/includemod.ml +++ b/typing/includemod.ml @@ -543,7 +543,7 @@ let rec context ppf = function | Modtype id :: rem -> fprintf ppf "@[<2>module type %a =@ %a@]" ident id context_mty rem | Body x :: rem -> - fprintf ppf "functor (%a) ->@ %a" ident x context_mty rem + fprintf ppf "functor (%s) ->@ %a" (argname x) context_mty rem | Arg x :: rem -> fprintf ppf "functor (%a : %a) -> ..." ident x context_mty rem | [] -> @@ -554,11 +554,14 @@ and context_mty ppf = function | cxt -> context ppf cxt and args ppf = function Body x :: rem -> - fprintf ppf "(%a)%a" ident x args rem + fprintf ppf "(%s)%a" (argname x) args rem | Arg x :: rem -> fprintf ppf "(%a :@ %a) : ..." ident x context_mty rem | cxt -> fprintf ppf " :@ %a" context_mty cxt +and argname x = + let s = Ident.name x in + if s = "*" then "" else s let path_of_context = function Module id :: rem -> From 182bd56cd69b8a37d6bab3a0b5a5d16b912e2e3b Mon Sep 17 00:00:00 2001 From: Damien Doligez Date: Fri, 26 Sep 2014 09:34:27 +0000 Subject: [PATCH 039/494] testsuite: add compatibility test for invalid formats git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15344 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- .../formats-transition/invalid_formats.ml | 63 +++++++++++++++++++ .../invalid_formats.ml.reference | 23 +++++++ 2 files changed, 86 insertions(+) create mode 100644 testsuite/tests/formats-transition/invalid_formats.ml create mode 100644 testsuite/tests/formats-transition/invalid_formats.ml.reference diff --git a/testsuite/tests/formats-transition/invalid_formats.ml b/testsuite/tests/formats-transition/invalid_formats.ml new file mode 100644 index 0000000000..8d72492dbe --- /dev/null +++ b/testsuite/tests/formats-transition/invalid_formats.ml @@ -0,0 +1,63 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Damien Doligez, EPI Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2014 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* WARNING: this file MUST NOT be merged into the trunk, it is for the + 4.02 branch only, to test compatibility with the old implementation + of printf. Starting with 4.03, all these formats will be statically + refused by the compiler. +*) + +open Printf;; + +let show arg f = + printf "%8s --> |" (string_of_format f); + printf f arg; + printf "|\n"; +in + + List.iter (show 12.3) [ + "%0.3f"; + "%0.f"; + "%+ .3f"; + "%.f"; + "%3.f"; + "%-9.f"; + "%0.16g"; + ]; + + List.iter (show "ab") [ + "%.30s"; + "%-.30s"; + "%-s"; + "%0s"; + "%03s"; + "% s"; + ]; + + List.iter (show 4) [ + "%0.3d"; + "%0X"; + "%0x"; + ]; +;; + +let fmt = format_of_string "%0.*f" in +printf "%8s --> |" (string_of_format fmt); +printf fmt 3 12.3; +printf "|\n"; +;; + +let fmt = format_of_string "%.2%" in +printf "%8s --> |" (string_of_format fmt); +printf fmt; +printf "|\n"; +;; diff --git a/testsuite/tests/formats-transition/invalid_formats.ml.reference b/testsuite/tests/formats-transition/invalid_formats.ml.reference new file mode 100644 index 0000000000..fafcbba58e --- /dev/null +++ b/testsuite/tests/formats-transition/invalid_formats.ml.reference @@ -0,0 +1,23 @@ + +# * * * * # %0.3f --> |12.300| + %0.f --> |12| + %+ .3f --> |+12.300| + %.f --> |12| + %3.f --> | 12| + %-9.f --> |12 | + %0.16g --> |12.3| + %.30s --> | ab| + %-.30s --> |ab | + %-s --> |ab| + %0s --> |ab| + %03s --> | ab| + % s --> |ab| + %0.3d --> |004| + %0X --> |4| + %0x --> |4| +- : unit = () +# %0.*f --> |12.300| +- : unit = () +# %.2% --> |%| +- : unit = () +# From 283b4d4c8f9be521efb433075ab5fbfe5123fa9e Mon Sep 17 00:00:00 2001 From: Maxence Guesdon Date: Fri, 26 Sep 2014 12:40:03 +0000 Subject: [PATCH 040/494] Add optional argument ?limit to Arg.align git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15349 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- stdlib/arg.ml | 18 ++++++++++++------ stdlib/arg.mli | 2 +- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/stdlib/arg.ml b/stdlib/arg.ml index 0f6480b826..d7b8ac0bf6 100644 --- a/stdlib/arg.ml +++ b/stdlib/arg.ml @@ -255,18 +255,24 @@ let add_padding len ksd = ksd | (kwd, (Symbol (l, _) as spec), msg) -> let cutcol = second_word msg in - let spaces = String.make (len - cutcol + 3) ' ' in + let spaces = String.make ((max 0 (len - cutcol)) + 3) ' ' in (kwd, spec, "\n" ^ spaces ^ msg) | (kwd, spec, msg) -> let cutcol = second_word msg in - let spaces = String.make (len - String.length kwd - cutcol) ' ' in - let prefix = String.sub msg 0 cutcol in - let suffix = String.sub msg cutcol (String.length msg - cutcol) in - (kwd, spec, prefix ^ spaces ^ suffix) + let kwd_len = String.length kwd in + let diff = len - kwd_len - cutcol in + if diff <= 0 then + (kwd, spec, msg) + else + let spaces = String.make diff ' ' in + let prefix = String.sub msg 0 cutcol in + let suffix = String.sub msg cutcol (String.length msg - cutcol) in + (kwd, spec, prefix ^ spaces ^ suffix) ;; -let align speclist = +let align ?(limit=max_int) speclist = let completed = add_help speclist in let len = List.fold_left max_arg_len 0 completed in + let len = min len limit in List.map (add_padding len) completed ;; diff --git a/stdlib/arg.mli b/stdlib/arg.mli index 22eda40b74..82455e0ee2 100644 --- a/stdlib/arg.mli +++ b/stdlib/arg.mli @@ -140,7 +140,7 @@ val usage_string : (key * spec * doc) list -> usage_msg -> string (** Returns the message that would have been printed by {!Arg.usage}, if provided with the same parameters. *) -val align: (key * spec * doc) list -> (key * spec * doc) list;; +val align: ?limit: int -> (key * spec * doc) list -> (key * spec * doc) list;; (** Align the documentation strings by inserting spaces at the first space, according to the length of the keyword. Use a space as the first character in a doc string if you want to From c3f62950e9ecd463c3df77ae412e995d61fd9232 Mon Sep 17 00:00:00 2001 From: Maxence Guesdon Date: Fri, 26 Sep 2014 12:45:51 +0000 Subject: [PATCH 041/494] Add doc about optional argument ?limit of Arg.align git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15350 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- stdlib/arg.mli | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/stdlib/arg.mli b/stdlib/arg.mli index 82455e0ee2..0999edf5f3 100644 --- a/stdlib/arg.mli +++ b/stdlib/arg.mli @@ -145,7 +145,10 @@ val align: ?limit: int -> (key * spec * doc) list -> (key * spec * doc) list;; space, according to the length of the keyword. Use a space as the first character in a doc string if you want to align the whole string. The doc strings corresponding to - [Symbol] arguments are aligned on the next line. *) + [Symbol] arguments are aligned on the next line. + @param limit options with keyword and message longer than + [limit] will not be used to compute the alignement. +*) val current : int ref (** Position (in {!Sys.argv}) of the argument being processed. You can From 442c897a2d7a56eb5bbc68f1ea43c91858ce3827 Mon Sep 17 00:00:00 2001 From: Maxence Guesdon Date: Fri, 26 Sep 2014 13:00:20 +0000 Subject: [PATCH 042/494] PR#6553: add missing options to ocamldoc git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15351 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- driver/main_args.ml | 55 ++++++++++++++- driver/main_args.mli | 20 ++++++ ocamldoc/odoc_args.ml | 99 +++++++++++++++++--------- ocamldoc/odoc_global.ml | 11 +-- ocamldoc/odoc_global.mli | 7 -- ocamldoc/odoc_messages.ml | 144 ++++++++++++++++++++------------------ 6 files changed, 213 insertions(+), 123 deletions(-) diff --git a/driver/main_args.ml b/driver/main_args.ml index 4f9668c750..7636abe030 100644 --- a/driver/main_args.ml +++ b/driver/main_args.ml @@ -501,7 +501,7 @@ module type Common_options = sig val anonymous : string -> unit end;; -module type Compiler_options = sig +module type Compiler_options = sig val _a : unit -> unit val _annot : unit -> unit val _binannot : unit -> unit @@ -608,6 +608,22 @@ module type Opttop_options = sig val _stdin : unit -> unit end;; +module type Ocamldoc_options = sig + include Common_options + val _impl : string -> unit + val _intf : string -> unit + val _intf_suffix : string -> unit + val _pp : string -> unit + val _principal : unit -> unit + val _rectypes : unit -> unit + val _safe_string : unit -> unit + val _short_paths : unit -> unit + val _thread : unit -> unit + val _v : unit -> unit + val _verbose : unit -> unit + val _vmthread : unit -> unit +end;; + module type Arg_list = sig val list : (string * Arg.spec * string) list end;; @@ -874,3 +890,40 @@ module Make_opttop_options (F : Opttop_options) = struct mk_dstartup F._dstartup; ] end;; + +module Make_ocamldoc_options (F : Ocamldoc_options) = +struct + let list = [ + mk_absname F._absname; + mk_I F._I; + mk_impl F._impl; + mk_intf F._intf; + mk_intf_suffix F._intf_suffix; + mk_intf_suffix_2 F._intf_suffix; + mk_labels F._labels; + mk_modern F._labels; + mk_no_alias_deps F._no_alias_deps; + mk_no_app_funct F._no_app_funct; + mk_noassert F._noassert; + mk_nolabels F._nolabels; + mk_nostdlib F._nostdlib; + mk_open F._open; + mk_pp F._pp; + mk_ppx F._ppx; + mk_principal F._principal; + mk_rectypes F._rectypes; + mk_safe_string F._safe_string; + mk_short_paths F._short_paths; + mk_strict_sequence F._strict_sequence; + mk_strict_formats F._strict_formats; + mk_thread F._thread; + mk_unsafe_string F._unsafe_string; + mk_v F._v; + mk_verbose F._verbose; + mk_version F._version; + mk_vmthread F._vmthread; + mk_vnum F._vnum; + mk_w F._w; + mk__ F.anonymous; + ] +end;; diff --git a/driver/main_args.mli b/driver/main_args.mli index 95b7c69e38..18ade80bae 100644 --- a/driver/main_args.mli +++ b/driver/main_args.mli @@ -10,6 +10,9 @@ (* *) (***********************************************************************) +(* ATTENTION ! When you add or modify a parsing or typing option, do not forget + to update ocamldoc options too, in odoc_args.ml. *) + module type Common_options = sig val _absname : unit -> unit val _I : string -> unit @@ -152,6 +155,22 @@ module type Opttop_options = sig val _stdin : unit -> unit end;; +module type Ocamldoc_options = sig + include Common_options + val _impl : string -> unit + val _intf : string -> unit + val _intf_suffix : string -> unit + val _pp : string -> unit + val _principal : unit -> unit + val _rectypes : unit -> unit + val _safe_string : unit -> unit + val _short_paths : unit -> unit + val _thread : unit -> unit + val _v : unit -> unit + val _verbose : unit -> unit + val _vmthread : unit -> unit +end + module type Arg_list = sig val list : (string * Arg.spec * string) list end;; @@ -160,3 +179,4 @@ module Make_bytecomp_options (F : Bytecomp_options) : Arg_list;; module Make_bytetop_options (F : Bytetop_options) : Arg_list;; module Make_optcomp_options (F : Optcomp_options) : Arg_list;; module Make_opttop_options (F : Opttop_options) : Arg_list;; +module Make_ocamldoc_options (F : Ocamldoc_options) : Arg_list;; diff --git a/ocamldoc/odoc_args.ml b/ocamldoc/odoc_args.ml index be5ce12fc6..77b59025b4 100644 --- a/ocamldoc/odoc_args.ml +++ b/ocamldoc/odoc_args.ml @@ -172,29 +172,73 @@ let add_hidden_modules s = let set_generator (g : Odoc_gen.generator) = current_generator := Some g +let anonymous f = + let sf = + if Filename.check_suffix f "ml" then + Odoc_global.Impl_file f + else + if Filename.check_suffix f !Config.interface_suffix then + Odoc_global.Intf_file f + else + if Filename.check_suffix f "txt" then + Odoc_global.Text_file f + else + failwith (Odoc_messages.unknown_extension f) + in + Odoc_global.files := !Odoc_global.files @ [sf] + +module Options = Main_args.Make_ocamldoc_options(struct + let set r () = r := true + let unset r () = r := false + let _absname = set Location.absname + let _I s = Odoc_global.include_dirs := + (Misc.expand_directory Config.standard_library s) :: !Odoc_global.include_dirs + let _impl s = Odoc_global.files := !Odoc_global.files @ [Odoc_global.Impl_file s] + let _intf s = Odoc_global.files := !Odoc_global.files @ [Odoc_global.Intf_file s] + let _intf_suffix s = Config.interface_suffix := s + let _labels = unset Clflags.classic + let _no_alias_deps = set Clflags.transparent_modules + let _no_app_funct = unset Clflags.applicative_functors + let _noassert = set Clflags.noassert + let _nolabels = set Clflags.classic + let _nostdlib = set Clflags.no_std_include + let _open s = Clflags.open_modules := s :: !Clflags.open_modules + let _pp s = Clflags.preprocessor := Some s + let _ppx s = Clflags.all_ppx := s :: !Clflags.all_ppx + let _principal = set Clflags.principal + let _rectypes = set Clflags.recursive_types + let _safe_string = unset Clflags.unsafe_string + let _short_paths = unset Clflags.real_paths + let _strict_sequence = set Clflags.strict_sequence + let _strict_formats = set Clflags.strict_formats + let _thread = set Clflags.use_threads + let _vmthread = set Clflags.use_vmthreads + let _unsafe () = assert false + let _unsafe_string = set Clflags.unsafe_string + let _v () = Compenv.print_version_and_library "documentation generator" + let _version = Compenv.print_version_string + let _vnum = Compenv.print_version_string + let _w = (Warnings.parse_options false) + let _warn_error _ = assert false + let _warn_help _ = assert false + let _where = Compenv.print_standard_library + let _verbose = set Clflags.verbose + let _nopervasives = set Clflags.nopervasives + let _dsource = set Clflags.dump_source + let _dparsetree = set Clflags.dump_parsetree + let _dtypedtree = set Clflags.dump_typedtree + let _drawlambda = set Clflags.dump_rawlambda + let _dlambda = set Clflags.dump_lambda + let _dinstr = set Clflags.dump_instr + let anonymous = anonymous +end) + (** The default option list *) -let default_options = [ - "-version", Arg.Unit (fun () -> print_string M.message_version ; print_newline () ; exit 0) , M.option_version ; - "-vnum", Arg.Unit (fun () -> print_string M.config_version ; - print_newline () ; exit 0) , M.option_version ; - "-v", Arg.Unit (fun () -> Odoc_global.verbose := true), M.verbose_mode ; - "-I", Arg.String (fun s -> - Odoc_global.include_dirs := - (Misc.expand_directory Config.standard_library s) :: !Odoc_global.include_dirs), - M.include_dirs ; - "-pp", Arg.String (fun s -> Odoc_global.preprocessor := Some s), M.preprocess ; - "-ppx", Arg.String (fun s -> Odoc_global.ppx := s :: !Odoc_global.ppx), M.ppx ; - "-impl", Arg.String (fun s -> - Odoc_global.files := !Odoc_global.files @ [Odoc_global.Impl_file s]), - M.option_impl ; - "-intf", Arg.String (fun s -> - Odoc_global.files := !Odoc_global.files @ [Odoc_global.Intf_file s]), - M.option_intf ; +let default_options = Options.list @ +[ "-text", Arg.String (fun s -> Odoc_global.files := !Odoc_global.files @ [Odoc_global.Text_file s]), M.option_text ; - "-rectypes", Arg.Set Odoc_global.recursive_types, M.rectypes ; - "-nolabels", Arg.Unit (fun () -> Odoc_global.classic := true), M.nolabels ; "-warn-error", Arg.Set Odoc_global.warn_error, M.werr ; "-hide-warnings", Arg.Clear Odoc_config.print_warnings, M.hide_warnings ; "-o", Arg.String (fun s -> Odoc_global.out_file := s), M.out_file ; @@ -338,24 +382,9 @@ let add_option o = options := iter !options let parse () = - let anonymous f = - let sf = - if Filename.check_suffix f "ml" then - Odoc_global.Impl_file f - else - if Filename.check_suffix f "mli" then - Odoc_global.Intf_file f - else - if Filename.check_suffix f "txt" then - Odoc_global.Text_file f - else - failwith (Odoc_messages.unknown_extension f) - in - Odoc_global.files := !Odoc_global.files @ [sf] - in if modified_options () then append_last_doc "\n"; let options = !options @ !help_options in - let _ = Arg.parse options + let _ = Arg.parse (Arg.align ~limit:13 options) anonymous (M.usage^M.options_are) in diff --git a/ocamldoc/odoc_global.ml b/ocamldoc/odoc_global.ml index 901febf1ba..9c3efb9824 100644 --- a/ocamldoc/odoc_global.ml +++ b/ocamldoc/odoc_global.ml @@ -40,13 +40,6 @@ let dump = ref (None : string option) let load = ref ([] : string list) -(** Allow arbitrary recursive types. *) -let recursive_types = Clflags.recursive_types - -(** Optional preprocessor command. *) -let preprocessor = Clflags.preprocessor -let ppx = Clflags.all_ppx - let sort_modules = ref false let no_custom_tags = ref false @@ -65,11 +58,9 @@ let hidden_modules = ref ([] : string list) let files = ref [] - - let out_file = ref Odoc_messages.default_out_file -let verbose = ref false +let verbose = Clflags.verbose let target_dir = ref Filename.current_dir_name diff --git a/ocamldoc/odoc_global.mli b/ocamldoc/odoc_global.mli index 2cf846c301..641d40c0bc 100644 --- a/ocamldoc/odoc_global.mli +++ b/ocamldoc/odoc_global.mli @@ -21,13 +21,6 @@ type source_file = (** The include_dirs in the OCaml compiler. *) val include_dirs : string list ref -(** Optional preprocessor command to pass to ocaml compiler. *) -val preprocessor : string option ref (* -pp *) -val ppx : string list ref (* -ppx *) - -(** Recursive types flag to passe to ocaml compiler. *) -val recursive_types : bool ref - (** The merge options to be used. *) val merge_options : Odoc_types.merge_option list ref diff --git a/ocamldoc/odoc_messages.ml b/ocamldoc/odoc_messages.ml index 4c409a3a17..0ac45ba91a 100644 --- a/ocamldoc/odoc_messages.ml +++ b/ocamldoc/odoc_messages.ml @@ -16,13 +16,11 @@ let ok = "Ok" let software = "OCamldoc" let config_version = Config.version let magic = config_version^"" -let message_version = software^" "^config_version (** Messages for command line *) let usage = "Usage: "^(Sys.argv.(0))^" [options] \n" let options_are = "Options are:" -let option_version = "\tPrint version and exit" let latex_only = "(LaTeX only)" let texi_only = "(TeXinfo only)" let latex_texi_only = "(LaTeX and TeXinfo only)" @@ -30,51 +28,45 @@ let html_only = "(HTML only)" let html_latex_only = "(HTML and LaTeX only)" let html_latex_texi_only = "(HTML, LaTeX and TeXinfo only)" let man_only = "(man only)" -let verbose_mode = "\t\tverbose mode" -let include_dirs = "\tAdd to the list of include directories" -let rectypes = "\tAllow arbitrary recursive types" -let preprocess = "\tPipe sources through preprocessor " -let ppx = "\n\t\tPipe abstract syntax tree through preprocessor " -let option_impl ="\tConsider as a .ml file" -let option_intf ="\tConsider as a .mli file" -let option_text ="\tConsider as a .txt file" -let display_custom_generators_dir = "\tDisplay custom generators standard directory and exit" -let add_load_dir = "\tAdd the given directory to the search path for custom\n"^ +let option_impl =" Consider as a .ml file" +let option_intf =" Consider as a .mli file" +let option_text =" Consider as a .txt file" +let display_custom_generators_dir = "Display custom generators standard directory and exit" +let add_load_dir = " Add the given directory to the search path for custom\n"^ "\t\tgenerators" -let load_file = "\n\t\tLoad file defining a new documentation generator" -let nolabels = "\tIgnore non-optional labels in types" -let werr = "\tTreat ocamldoc warnings as errors" -let hide_warnings = "\n\t\tdo not print ocamldoc warnings" -let target_dir = "\tGenerate files in directory , rather than in current\n"^ +let load_file = " Load file defining a new documentation generator" +let werr = " Treat ocamldoc warnings as errors" +let hide_warnings = " do not print ocamldoc warnings" +let target_dir = " Generate files in directory , rather than in current\n"^ "\t\tdirectory (for man and HTML generators)" -let dump = "\tDump collected information into " -let load = "\tLoad information from ; may be used several times" -let css_style = "\n\t\tUse content of as CSS style definition "^html_only -let index_only = "\tGenerate index files only "^html_only -let colorize_code = "\n\t\tColorize code even in documentation pages "^html_only -let html_short_functors = "\n\t\tUse short form to display functor types "^html_only +let dump = " Dump collected information into " +let load = " Load information from ; may be used several times" +let css_style = " Use content of as CSS style definition "^html_only +let index_only = " Generate index files only "^html_only +let colorize_code = " Colorize code even in documentation pages "^html_only +let html_short_functors = " Use short form to display functor types "^html_only let charset c = Printf.sprintf - "\n\t\tAdd information about character encoding being s\n\t\t(default is %s)" + " Add information about character encoding being s\n\t\t(default is %s)" c -let generate_html = "\tGenerate HTML documentation" -let generate_latex = "\tGenerate LaTeX documentation" -let generate_texinfo = "\tGenerate TeXinfo documentation" -let generate_man = "\t\tGenerate man pages" -let generate_dot = "\t\tGenerate dot code of top modules dependencies" +let generate_html = " Generate HTML documentation" +let generate_latex = " Generate LaTeX documentation" +let generate_texinfo = " Generate TeXinfo documentation" +let generate_man = " Generate man pages" +let generate_dot = " Generate dot code of top modules dependencies" let option_not_in_native_code op = "Option "^op^" not available in native code version." let default_out_file = "ocamldoc.out" let out_file = - "\tSet the output file name, used by texi, latex and dot generators\n"^ + " Set the output file name, used by texi, latex and dot generators\n"^ "\t\t(default is "^default_out_file^")\n"^ "\t\tor the prefix of index files for the HTML generator\n"^ "\t\t(default is index)" let dot_include_all = - "\n\t\tInclude all modules in the dot output, not only the\n"^ + " Include all modules in the dot output, not only the\n"^ "\t\tmodules given on the command line" -let dot_types = "\tGenerate dependency graph for types instead of modules" +let dot_types = " Generate dependency graph for types instead of modules" let default_dot_colors = [ [ "darkturquoise" ; "darkgoldenrod2" ; "cyan" ; "green" ; ] ; [ "magenta" ; "yellow" ; "burlywood1" ; "aquamarine" ; "floralwhite" ; "lightpink" ] ; @@ -82,36 +74,37 @@ let default_dot_colors = ] let dot_colors = - "\n\t\tUse colors c1,c1,...,cn in the dot output\n"^ + " \n"^ + "\t\tUse colors c1,c1,...,cn in the dot output\n"^ "\t\t(default list is "^ (String.concat ",\n\t\t" (List.map (String.concat ",") default_dot_colors))^")" let dot_reduce = - "\tPerform a transitive reduction on the selected dependency graph\n"^ + " Perform a transitive reduction on the selected dependency graph\n"^ "\t\tbefore the dot output" -let man_mini = "\tGenerate man pages only for modules, module types, classes\n"^ +let man_mini = " Generate man pages only for modules, module types, classes\n"^ "\t\tand class types "^man_only let default_man_section = "3" -let man_section = "
\n\t\tUse
in man page files "^ +let man_section = "
Use
in man page files "^ "(default is "^default_man_section^") "^man_only^"\n" let default_man_suffix = default_man_section^"o" -let man_suffix = "\n\t\tUse for man page files "^ +let man_suffix = " Use for man page files "^ "(default is "^default_man_suffix^") "^man_only^"\n" -let option_title = "\tUse <title> as title for the generated documentation" +let option_title = "<title> Use <title> as title for the generated documentation" let option_intro = - "<file>\tUse content of <file> as ocamldoc text to use as introduction\n"^ + "<file> Use content of <file> as ocamldoc text to use as introduction\n"^ "\t\t"^(html_latex_texi_only) -let with_parameter_list = "\tDisplay the complete list of parameters for functions and\n"^ +let with_parameter_list = " Display the complete list of parameters for functions and\n"^ "\t\tmethods "^html_only -let hide_modules = "<M1,M2.M3,...>\n\t\tHide the given complete module names in generated doc" -let no_header = "\tSuppress header in generated documentation\n\t\t"^latex_texi_only -let no_trailer = "\tSuppress trailer in generated documentation\n\t\t"^latex_texi_only -let separate_files = "\tGenerate one file per toplevel module "^latex_only +let hide_modules = "<M1,M2.M3,...> Hide the given complete module names in generated doc" +let no_header = " Suppress header in generated documentation\n\t\t"^latex_texi_only +let no_trailer = " Suppress trailer in generated documentation\n\t\t"^latex_texi_only +let separate_files = " Generate one file per toplevel module "^latex_only let latex_title ref_titles = - "n,style\n\t\tAssociate {n } to the given sectionning style\n"^ + "n,style Associate {n } to the given sectionning style\n"^ "\t\t(e.g. 'section') in the latex output "^latex_only^"\n"^ "\t\tDefault sectionning is:\n\t\t"^ (String.concat "\n\t\t" @@ -119,67 +112,78 @@ let latex_title ref_titles = let default_latex_value_prefix = "val:" let latex_value_prefix = - "<string>\n\t\tUse <string> as prefix for the LaTeX labels of values.\n"^ + "<string>\n"^ + "\t\tUse <string> as prefix for the LaTeX labels of values.\n"^ "\t\t(default is \""^default_latex_value_prefix^"\")" let default_latex_type_prefix = "type:" let latex_type_prefix = - "<string>\n\t\tUse <string> as prefix for the LaTeX labels of types.\n"^ + "<string>\n"^ + "\t\tUse <string> as prefix for the LaTeX labels of types.\n"^ "\t\t(default is \""^default_latex_type_prefix^"\")" let default_latex_type_elt_prefix = "typeelt:" let latex_type_elt_prefix = - "<string>\n\t\tUse <string> as prefix for the LaTeX labels of type elements.\n"^ + "<string>\n"^ + "\t\tUse <string> as prefix for the LaTeX labels of type elements.\n"^ "\t\t(default is \""^default_latex_type_elt_prefix^"\")" let default_latex_extension_prefix = "extension:" let latex_extension_prefix = - "<string>\n\t\tUse <string> as prefix for the LaTeX labels of extensions.\n"^ + "<string>\n"^ + "\t\tUse <string> as prefix for the LaTeX labels of extensions.\n"^ "\t\t(default is \""^default_latex_extension_prefix^"\")" let default_latex_exception_prefix = "exception:" let latex_exception_prefix = - "<string>\n\t\tUse <string> as prefix for the LaTeX labels of exceptions.\n"^ + "<string>\n"^ + "\t\tUse <string> as prefix for the LaTeX labels of exceptions.\n"^ "\t\t(default is \""^default_latex_exception_prefix^"\")" let default_latex_module_prefix = "module:" let latex_module_prefix = - "<string>\n\t\tUse <string> as prefix for the LaTeX labels of modules.\n"^ + "<string>\n"^ + "\t\tUse <string> as prefix for the LaTeX labels of modules.\n"^ "\t\t(default is \""^default_latex_module_prefix^"\")" let default_latex_module_type_prefix = "moduletype:" let latex_module_type_prefix = - "<string>\n\t\tUse <string> as prefix for the LaTeX labels of module types.\n"^ + "<string>\n"^ + "\t\tUse <string> as prefix for the LaTeX labels of module types.\n"^ "\t\t(default is \""^default_latex_module_type_prefix^"\")" let default_latex_class_prefix = "class:" let latex_class_prefix = - "<string>\n\t\tUse <string> as prefix for the LaTeX labels of classes.\n"^ + "<string>\n"^ + "\t\tUse <string> as prefix for the LaTeX labels of classes.\n"^ "\t\t(default is \""^default_latex_class_prefix^"\")" let default_latex_class_type_prefix = "classtype:" let latex_class_type_prefix = - "<string>\n\t\tUse <string> as prefix for the LaTeX labels of class types.\n"^ + "<string>\n"^ + "\t\tUse <string> as prefix for the LaTeX labels of class types.\n"^ "\t\t(default is \""^default_latex_class_type_prefix^"\")" let default_latex_attribute_prefix = "val:" let latex_attribute_prefix = - "<string>\n\t\tUse <string> as prefix for the LaTeX labels of attributes.\n"^ + "<string>\n"^ + "\t\tUse <string> as prefix for the LaTeX labels of attributes.\n"^ "\t\t(default is \""^default_latex_attribute_prefix^"\")" let default_latex_method_prefix = "method:" let latex_method_prefix = - "<string>\n\t\tUse <string> as prefix for the LaTeX labels of methods.\n"^ + "<string>\n"^ + "\t\tUse <string> as prefix for the LaTeX labels of methods.\n"^ "\t\t(default is \""^default_latex_method_prefix^"\")" -let no_toc = "\tDo not generate table of contents "^latex_only -let sort_modules = "\tSort the list of top modules before generating the documentation" -let no_stop = "\tDo not stop at (**/**) comments" -let no_custom_tags = "\n\t\tDo not allow custom @-tags" -let remove_stars = "\tRemove beginning blanks of comment lines, until the first '*'" -let keep_code = "\tAlways keep code when available" -let inverse_merge_ml_mli = "\n\t\tInverse implementations and interfaces when merging" -let no_filter_with_module_constraints = "\n\t\tDo not filter module elements using module type constraints" +let no_toc = " Do not generate table of contents "^latex_only +let sort_modules = " Sort the list of top modules before generating the documentation" +let no_stop = " Do not stop at (**/**) comments" +let no_custom_tags = " Do not allow custom @-tags" +let remove_stars = " Remove beginning blanks of comment lines, until the first '*'" +let keep_code = " Always keep code when available" +let inverse_merge_ml_mli = " Inverse implementations and interfaces when merging" +let no_filter_with_module_constraints = "Do not filter module elements using module type constraints" let merge_description = ('d', "merge description") let merge_author = ('a', "merge @author") let merge_version = ('v', "merge @version") @@ -193,10 +197,10 @@ let merge_return_value = ('r', "merge @return") let merge_custom = ('c', "merge custom @-tags") let merge_all = ('A', "merge all") -let no_index = "\tDo not build index for Info files "^texi_only -let esc_8bits = "\tEscape accentuated characters in Info files "^texi_only -let info_section = "Specify section of Info directory "^texi_only -let info_entry = "\tSpecify Info directory entry "^texi_only +let no_index = " Do not build index for Info files "^texi_only +let esc_8bits = " Escape accentuated characters in Info files "^texi_only +let info_section = " Specify section of Info directory "^texi_only +let info_entry = " Specify Info directory entry "^texi_only let options_can_be = "<options> can be one or more of the following characters:" let string_of_options_list l = @@ -205,7 +209,7 @@ let string_of_options_list l = l let merge_options = - "<options>\tspecify merge options between .mli and .ml\n\t\t"^ + "<options> specify merge options between .mli and .ml\n\t\t"^ options_can_be^ (string_of_options_list [ merge_description ; @@ -222,7 +226,7 @@ let merge_options = merge_all ] ) -let help = "\t\tDisplay this list of options" +let help = " Display this list of options" (** Error and warning messages *) From 8520dc8c0e827db191bcbf1b15ad1fb6528b1325 Mon Sep 17 00:00:00 2001 From: Maxence Guesdon <maxence.guesdon@inria.fr> Date: Fri, 26 Sep 2014 13:11:51 +0000 Subject: [PATCH 043/494] Update Changes for Arg.align ?limit and PR#6553 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15352 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Changes b/Changes index 85ebaa6df9..682f2f379e 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,7 @@ OCaml 4.02.1: ------------- +Standard library: +* Add optional argument ?limit to Arg.align. - PR#6466: Non-exhaustive matching warning message for open types is confusing - PR#6529: fix quadratic-time algorithm in Consistbl.extract. @@ -24,6 +26,7 @@ OCaml 4.02.1: - PR#6572: Fatal error with recursive modules - PR#6578: Recursive module containing alias causes Segmentation fault - PR#6581: Some bugs in generative functors +- PR#6553: Missing command line options for ocamldoc OCaml 4.02.0: ------------- From 0c621312629ee3c7876fc5e11d9504dc0180e371 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Fri, 26 Sep 2014 20:48:47 +0000 Subject: [PATCH 044/494] typos in caml-types.el documentation git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15356 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- emacs/caml-types.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/emacs/caml-types.el b/emacs/caml-types.el index 47060a2cf7..4bc2266557 100644 --- a/emacs/caml-types.el +++ b/emacs/caml-types.el @@ -113,9 +113,9 @@ type call ident" (make-variable-buffer-local 'caml-types-annotation-date) (defvar caml-types-buffer-name "*caml-types*" - "Name of buffer for diplaying caml types") + "Name of buffer for displaying caml types") (defvar caml-types-buffer nil - "buffer for diplaying caml types") + "buffer for displaying caml types") (defun caml-types-show-type (arg) "Show the type of expression or pattern at point. From 206f11ec2ab6485c0e2b0c908a1f7c9137fc6f72 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Fri, 26 Sep 2014 20:50:24 +0000 Subject: [PATCH 045/494] PR#4099: Bug in Makefile.nt: won't stop on error git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15357 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + Makefile.nt | 4 +++- VERSION | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Changes b/Changes index 682f2f379e..4147230985 100644 --- a/Changes +++ b/Changes @@ -3,6 +3,7 @@ OCaml 4.02.1: Standard library: * Add optional argument ?limit to Arg.align. +- PR#4099: Bug in Makefile.nt: won't stop on error (George Necula) - PR#6466: Non-exhaustive matching warning message for open types is confusing - PR#6529: fix quadratic-time algorithm in Consistbl.extract. - PR#6533: broken semantics of %(%) when substitued by a box diff --git a/Makefile.nt b/Makefile.nt index 648c918df1..16b53fe269 100644 --- a/Makefile.nt +++ b/Makefile.nt @@ -252,7 +252,9 @@ installbyt: cp expunge $(INSTALL_LIBDIR)/expunge.exe cp toplevel/topdirs.cmi $(INSTALL_LIBDIR) cd tools ; $(MAKEREC) install - for i in $(OTHERLIBRARIES); do $(MAKEREC) -C otherlibs/$$i install; done + for i in $(OTHERLIBRARIES); do \ + $(MAKEREC) -C otherlibs/$$i install || exit $$?; \ + done if test -n "$(WITH_OCAMLDOC)"; then (cd ocamldoc; $(MAKEREC) install); \ else :; fi if test -n "$(WITH_DEBUGGER)"; then (cd debugger; $(MAKEREC) install); \ diff --git a/VERSION b/VERSION index 197cd1f7a7..ebc080e4b9 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.02.1+dev0-2014-08-29 +4.02.1+dev1-2014-09-26 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli From 37d8e1242cf9d4666a69f2e77811ec7f3d21ac4d Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sat, 27 Sep 2014 14:09:51 +0000 Subject: [PATCH 046/494] %0c support: accept and ignore %5c when -strict-formats is not used Damien remarked that the previous commit 4.02@15275 to support %0c (PR#6531) introduced a new static rejection of %c formats padded with a non-zero width. They are now rejected only when -strict-formats is activated, and otherwise ignored, as in the legacy implementation. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15359 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- stdlib/camlinternalFormat.ml | 29 ++++++++++++------- .../formats-transition/invalid_formats.ml | 4 +++ .../invalid_formats.ml.reference | 1 + 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/stdlib/camlinternalFormat.ml b/stdlib/camlinternalFormat.ml index 19488ac08e..40d76678ee 100644 --- a/stdlib/camlinternalFormat.ml +++ b/stdlib/camlinternalFormat.ml @@ -1833,10 +1833,10 @@ let fmt_ebb_of_string ?legacy_behavior str = "unexpected end of format" in - (* Used for %0c: no other widths are accepted *) + (* Used for %0c: no other widths are implemented *) let invalid_nonnull_char_width str_ind = invalid_format_message str_ind - "non-zero widths are invalid for %c conversions" + "non-zero widths are unsupported for %c conversions" in (* Raise Failure with a friendly error message about an option dependencie problem. *) @@ -2088,17 +2088,24 @@ let fmt_ebb_of_string ?legacy_behavior str = | ',' -> parse str_ind end_ind | 'c' -> + let char_format fmt_rest = (* %c *) + if get_ign () + then Fmt_EBB (Ignored_param (Ignored_char, fmt_rest)) + else Fmt_EBB (Char fmt_rest) + in + let scan_format fmt_rest = (* %0c *) + if get_ign () + then Fmt_EBB (Ignored_param (Ignored_scan_next_char, fmt_rest)) + else Fmt_EBB (Scan_next_char fmt_rest) + in let Fmt_EBB fmt_rest = parse str_ind end_ind in begin match get_pad_opt 'c' with - | None -> - if get_ign () - then Fmt_EBB (Ignored_param (Ignored_char, fmt_rest)) - else Fmt_EBB (Char fmt_rest) - | Some 0 -> - if get_ign () - then Fmt_EBB (Ignored_param (Ignored_scan_next_char, fmt_rest)) - else Fmt_EBB (Scan_next_char fmt_rest) - | Some _n -> invalid_nonnull_char_width str_ind + | None -> char_format fmt_rest + | Some 0 -> scan_format fmt_rest + | Some _n -> + if not legacy_behavior + then invalid_nonnull_char_width str_ind + else (* legacy ignores %c widths *) char_format fmt_rest end | 'C' -> let Fmt_EBB fmt_rest = parse str_ind end_ind in diff --git a/testsuite/tests/formats-transition/invalid_formats.ml b/testsuite/tests/formats-transition/invalid_formats.ml index 8d72492dbe..16697ca9e6 100644 --- a/testsuite/tests/formats-transition/invalid_formats.ml +++ b/testsuite/tests/formats-transition/invalid_formats.ml @@ -48,6 +48,10 @@ in "%0X"; "%0x"; ]; + + List.iter (show 'a') [ + "%5c"; + ]; ;; let fmt = format_of_string "%0.*f" in diff --git a/testsuite/tests/formats-transition/invalid_formats.ml.reference b/testsuite/tests/formats-transition/invalid_formats.ml.reference index fafcbba58e..f44bd7a8f3 100644 --- a/testsuite/tests/formats-transition/invalid_formats.ml.reference +++ b/testsuite/tests/formats-transition/invalid_formats.ml.reference @@ -15,6 +15,7 @@ %0.3d --> |004| %0X --> |4| %0x --> |4| + %5c --> |a| - : unit = () # %0.*f --> |12.300| - : unit = () From 2caecdc27247a6557c55815722815e5eb057ca8b Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sat, 27 Sep 2014 15:17:48 +0000 Subject: [PATCH 047/494] invisible fix to mysterious testsuite issue git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15360 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- testsuite/tests/formats-transition/invalid_formats.ml.reference | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testsuite/tests/formats-transition/invalid_formats.ml.reference b/testsuite/tests/formats-transition/invalid_formats.ml.reference index f44bd7a8f3..65881b42fe 100644 --- a/testsuite/tests/formats-transition/invalid_formats.ml.reference +++ b/testsuite/tests/formats-transition/invalid_formats.ml.reference @@ -1,5 +1,5 @@ -# * * * * # %0.3f --> |12.300| +# * * * * # %0.3f --> |12.300| %0.f --> |12| %+ .3f --> |+12.300| %.f --> |12| From d5b393e71946960371ff820718a3ec590b820cf9 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Sat, 27 Sep 2014 22:38:23 +0000 Subject: [PATCH 048/494] Changes: add the usual sentence about * git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15361 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Changes b/Changes index 4147230985..88790646bd 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,7 @@ OCaml 4.02.1: ------------- +(Changes that can break existing programs are marked with a "*") + Standard library: * Add optional argument ?limit to Arg.align. From ad1686175af7d824026c223e09eb318a4c5c1087 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Sat, 27 Sep 2014 22:40:40 +0000 Subject: [PATCH 049/494] PR#6181: Improve MSVC build git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15362 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + config/Makefile.msvc | 20 ++++++++++---------- config/Makefile.msvc64 | 22 +++++++++++----------- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/Changes b/Changes index 88790646bd..4f171d311b 100644 --- a/Changes +++ b/Changes @@ -6,6 +6,7 @@ Standard library: * Add optional argument ?limit to Arg.align. - PR#4099: Bug in Makefile.nt: won't stop on error (George Necula) +- PR#6181: Improve MSVC build (Chen Gang) - PR#6466: Non-exhaustive matching warning message for open types is confusing - PR#6529: fix quadratic-time algorithm in Consistbl.extract. - PR#6533: broken semantics of %(%) when substitued by a box diff --git a/config/Makefile.msvc b/config/Makefile.msvc index 3ab6c6ebf4..e9d35661e5 100644 --- a/config/Makefile.msvc +++ b/config/Makefile.msvc @@ -63,7 +63,7 @@ SUPPORTS_SHARED_LIBRARIES=true SHAREDCCCOMPOPTS= NATIVECCPROFOPTS= NATIVECCRPATH= -ASM=ml /nologo /coff /Cp /c /Fo +ASM=ml -nologo -coff -Cp -c -Fo ASPP= ASPPPROFFLAGS= PROFILING=noprof @@ -81,23 +81,23 @@ GRAPHLIB=win32graph ########## Configuration for the bytecode compiler ### Which C compiler to use for the bytecode interpreter. -BYTECC=cl /nologo -D_CRT_SECURE_NO_DEPRECATE +BYTECC=cl -nologo -D_CRT_SECURE_NO_DEPRECATE ### Additional compile-time options for $(BYTECC). (For static linking.) -BYTECCCOMPOPTS=/Ox /MD +BYTECCCOMPOPTS=-Ox -MD ### Additional link-time options for $(BYTECC). (For static linking.) BYTECCLINKOPTS= ### Additional compile-time options for $(BYTECC). (For building a DLL.) -DLLCCCOMPOPTS=/Ox /MD +DLLCCCOMPOPTS=-Ox -MD ### Libraries needed BYTECCLIBS=advapi32.lib ws2_32.lib NATIVECCLIBS=advapi32.lib ws2_32.lib ### How to invoke the C preprocessor -CPP=cl /nologo /EP +CPP=cl -nologo -EP ### Flexlink FLEXLINK=flexlink -merge-manifest -stack 16777216 @@ -108,8 +108,8 @@ MKEXE=$(FLEXLINK) -exe MKMAINDLL=$(FLEXLINK) -maindll ### How to build a static library -MKLIB=link /lib /nologo /out:$(1) $(2) -#ml let mklib out files opts = Printf.sprintf "link /lib /nologo /out:%s %s %s" out opts files;; +MKLIB=link -lib -nologo -out:$(1) $(2) +#ml let mklib out files opts = Printf.sprintf "link -lib -nologo -out:%s %s %s" out opts files;; MKSHAREDLIBRPATH= ### Canonicalize the name of a system library @@ -135,16 +135,16 @@ MODEL=default SYSTEM=win32 ### Which C compiler to use for the native-code compiler. -NATIVECC=cl /nologo -D_CRT_SECURE_NO_DEPRECATE +NATIVECC=cl -nologo -D_CRT_SECURE_NO_DEPRECATE ### Additional compile-time options for $(NATIVECC). -NATIVECCCOMPOPTS=/Ox /MD +NATIVECCCOMPOPTS=-Ox -MD ### Additional link-time options for $(NATIVECC) NATIVECCLINKOPTS= ### Build partially-linked object file -PACKLD=link /lib /nologo /out:# there must be no space after this '/out:' +PACKLD=link -lib -nologo -out:# there must be no space after this '-out:' ### Clear this to disable compiling ocamldebug WITH_DEBUGGER=ocamldebugger diff --git a/config/Makefile.msvc64 b/config/Makefile.msvc64 index 8437cf4bd0..827cc7c81a 100644 --- a/config/Makefile.msvc64 +++ b/config/Makefile.msvc64 @@ -63,7 +63,7 @@ SUPPORTS_SHARED_LIBRARIES=true SHAREDCCCOMPOPTS= NATIVECCPROFOPTS= NATIVECCRPATH= -ASM=ml64 /nologo /Cp /c /Fo +ASM=ml64 -nologo -Cp -c -Fo ASPP= ASPPPROFFLAGS= PROFILING=noprof @@ -80,19 +80,19 @@ GRAPHLIB=win32graph ########## Configuration for the bytecode compiler ### Which C compiler to use for the bytecode interpreter. -BYTECC=cl /nologo -D_CRT_SECURE_NO_DEPRECATE +BYTECC=cl -nologo -D_CRT_SECURE_NO_DEPRECATE ### Additional compile-time options for $(BYTECC). (For static linking.) -BYTECCCOMPOPTS=/Ox /MD +BYTECCCOMPOPTS=-Ox -MD ### Additional compile-time options for $(BYTECC). (For debug version.) -BYTECCDBGCOMPOPTS=-DDEBUG /Zi /W3 /Wp64 +BYTECCDBGCOMPOPTS=-DDEBUG -Zi -W3 -Wp64 ### Additional link-time options for $(BYTECC). (For static linking.) BYTECCLINKOPTS= ### Additional compile-time options for $(BYTECC). (For building a DLL.) -DLLCCCOMPOPTS=/Ox /MD +DLLCCCOMPOPTS=-Ox -MD ### Libraries needed #EXTRALIBS=bufferoverflowu.lib # for the old PSDK compiler only @@ -101,7 +101,7 @@ BYTECCLIBS=advapi32.lib ws2_32.lib $(EXTRALIBS) NATIVECCLIBS=advapi32.lib ws2_32.lib $(EXTRALIBS) ### How to invoke the C preprocessor -CPP=cl /nologo /EP +CPP=cl -nologo -EP ### Flexlink FLEXLINK=flexlink -x64 -merge-manifest -stack 33554432 @@ -112,8 +112,8 @@ MKEXE=$(FLEXLINK) -exe MKMAINDLL=$(FLEXLINK) -maindll ### How to build a static library -MKLIB=link /lib /nologo /machine:AMD64 /out:$(1) $(2) -#ml let mklib out files opts = Printf.sprintf "link /lib /nologo /machine:AMD64 /out:%s %s %s" out opts files;; +MKLIB=link -lib -nologo -machine:AMD64 /out:$(1) $(2) +#ml let mklib out files opts = Printf.sprintf "link -lib -nologo -machine:AMD64 -out:%s %s %s" out opts files;; MKSHAREDLIBRPATH= ### Canonicalize the name of a system library @@ -139,16 +139,16 @@ MODEL=default SYSTEM=win64 ### Which C compiler to use for the native-code compiler. -NATIVECC=cl /nologo +NATIVECC=cl -nologo ### Additional compile-time options for $(NATIVECC). -NATIVECCCOMPOPTS=/Ox /MD +NATIVECCCOMPOPTS=-Ox -MD ### Additional link-time options for $(NATIVECC) NATIVECCLINKOPTS= ### Build partially-linked object file -PACKLD=link /lib /nologo /machine:AMD64 /out:# must have no space after '/out:' +PACKLD=link -lib -nologo -machine:AMD64 -out:# must have no space after '-out:' ### Clear this to disable compiling ocamldebug WITH_DEBUGGER=ocamldebugger From 6a29c452ddc5e40da7b9bb44cfc6d39cbf6f4491 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Sun, 28 Sep 2014 19:46:24 +0000 Subject: [PATCH 050/494] PR#6530: Add stack overflow handling for native code (OpenBSD i386 and amd64) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15363 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + asmrun/signals_osdep.h | 30 ++++++++++++++++++++++++++++++ configure | 3 ++- 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 4f171d311b..7494f4bdc8 100644 --- a/Changes +++ b/Changes @@ -9,6 +9,7 @@ Standard library: - PR#6181: Improve MSVC build (Chen Gang) - PR#6466: Non-exhaustive matching warning message for open types is confusing - PR#6529: fix quadratic-time algorithm in Consistbl.extract. +- PR#6530: Add stack overflow handling for native code (OpenBSD i386 and amd64) - PR#6533: broken semantics of %(%) when substitued by a box (Benoît Vaugon, report by Boris Yakobowski) - PR#6534: legacy support for %.10s diff --git a/asmrun/signals_osdep.h b/asmrun/signals_osdep.h index 23165ad680..f3b4642d2d 100644 --- a/asmrun/signals_osdep.h +++ b/asmrun/signals_osdep.h @@ -130,6 +130,22 @@ #define CONTEXT_YOUNG_PTR (context->uc_mcontext.gregs[REG_R15]) #define CONTEXT_FAULTING_ADDRESS ((char *) info->si_addr) +/****************** AMD64, OpenBSD */ + +#elif defined(TARGET_amd64) && defined (SYS_openbsd) + + #define DECLARE_SIGNAL_HANDLER(name) \ + static void name(int sig, siginfo_t * info, struct sigcontext * context) + + #define SET_SIGACT(sigact,name) \ + sigact.sa_sigaction = (void (*)(int,siginfo_t *,void *)) (name); \ + sigact.sa_flags = SA_SIGINFO + + #define CONTEXT_PC (context->sc_rip) + #define CONTEXT_EXCEPTION_POINTER (context->sc_r14) + #define CONTEXT_YOUNG_PTR (context->sc_r15) + #define CONTEXT_FAULTING_ADDRESS ((char *) info->si_addr) + /****************** I386, Linux */ #elif defined(TARGET_i386) && defined(SYS_linux_elf) @@ -143,6 +159,20 @@ #define CONTEXT_FAULTING_ADDRESS ((char *) context.cr2) +/****************** I386, BSD_ELF */ + +#elif defined(TARGET_i386) && defined(SYS_bsd_elf) + + #define DECLARE_SIGNAL_HANDLER(name) \ + static void name(int sig, siginfo_t * info, struct sigcontext * context) + + #define SET_SIGACT(sigact,name) \ + sigact.sa_sigaction = (void (*)(int,siginfo_t *,void *)) (name); \ + sigact.sa_flags = SA_SIGINFO + + #define CONTEXT_PC (context->sc_eip) + #define CONTEXT_FAULTING_ADDRESS ((char *) info->si_addr) + /****************** I386, BSD */ #elif defined(TARGET_i386) && defined(SYS_bsd) diff --git a/configure b/configure index dbc6178078..90b4a76c86 100755 --- a/configure +++ b/configure @@ -1324,7 +1324,8 @@ fi # Determine if system stack overflows can be detected case "$arch,$system" in - i386,linux_elf|amd64,linux|power,rhapsody|amd64,macosx|i386,macosx) + i386,linux_elf|amd64,linux|power,rhapsody|amd64,macosx|i386,macosx \ + |amd64,openbsd|i386,bsd_elf) inf "System stack overflow can be detected." echo "#define HAS_STACK_OVERFLOW_DETECTION" >> s.h;; *) From 8196a1f2185bb82b9e5f28a066eec827dafd61db Mon Sep 17 00:00:00 2001 From: Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> Date: Mon, 29 Sep 2014 13:05:45 +0000 Subject: [PATCH 051/494] re-fix PR#6565 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15364 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- parsing/location.ml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/parsing/location.ml b/parsing/location.ml index 11c1e4252d..174377eecb 100644 --- a/parsing/location.ml +++ b/parsing/location.ml @@ -364,14 +364,12 @@ let () = let rec report_exception_rec n ppf exn = - match error_of_exn exn with + try match error_of_exn exn with | Some err -> - begin try - fprintf ppf "@[%a@]@." report_error err - with exn when n > 0 -> - report_exception_rec (n-1) ppf exn - end + fprintf ppf "@[%a@]@." report_error err | None -> raise exn + with exn when n > 0 -> + report_exception_rec (n-1) ppf exn let report_exception ppf exn = report_exception_rec 5 ppf exn From 4be6590d983560dd2040c0539b94ed95144878ae Mon Sep 17 00:00:00 2001 From: Alain Frisch <alain@frisch.fr> Date: Wed, 1 Oct 2014 14:29:59 +0000 Subject: [PATCH 052/494] Cherry-pick 15314 from trunk (see #5904, #6582). git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15411 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- driver/pparse.ml | 61 ++++---- driver/pparse.mli | 3 +- parsing/ast_mapper.ml | 313 ++++++++++++++++++++++++++--------------- parsing/ast_mapper.mli | 28 +++- toplevel/toploop.ml | 5 +- 5 files changed, 261 insertions(+), 149 deletions(-) diff --git a/driver/pparse.ml b/driver/pparse.ml index 08b9bc736e..79adb7a78d 100644 --- a/driver/pparse.ml +++ b/driver/pparse.ml @@ -39,6 +39,10 @@ let remove_preprocessed inputfile = None -> () | Some _ -> Misc.remove_file inputfile + +(* Note: some of the functions here should go to Ast_mapper instead, + which would encapsulate the "binary AST" protocol. *) + let write_ast magic ast = let fn = Filename.temp_file "camlppx" "" in let oc = open_out_bin fn in @@ -87,41 +91,34 @@ let read_ast magic fn = Misc.remove_file fn; raise exn -let apply_rewriters ~tool_name magic ast = - let ctx = Ast_mapper.ppx_context ~tool_name () in +let rewrite magic ast ppxs = + read_ast magic + (List.fold_left (apply_rewriter magic) (write_ast magic ast) + (List.rev ppxs)) + +let apply_rewriters_str ~restore ~tool_name ast = match !Clflags.all_ppx with | [] -> ast | ppxs -> - let ast = - if magic = Config.ast_impl_magic_number - then Obj.magic (Ast_helper.Str.attribute ctx :: (Obj.magic ast)) - else Obj.magic (Ast_helper.Sig.attribute ctx :: (Obj.magic ast)) - in - let fn = - List.fold_left (apply_rewriter magic) (write_ast magic ast) - (List.rev ppxs) - in - let ast = read_ast magic fn in - let open Parsetree in - if magic = Config.ast_impl_magic_number then - let ast = - match Obj.magic ast with - | {pstr_desc = Pstr_attribute({Location.txt = "ocaml.ppx.context"}, _)} - :: items -> - items - | items -> items - in - Obj.magic ast - else - let ast = - match Obj.magic ast with - | {psig_desc = Psig_attribute({Location.txt = "ocaml.ppx.context"}, _)} - :: items -> - items - | items -> items - in - Obj.magic ast + let ast = Ast_mapper.add_ppx_context_str ~tool_name ast in + let ast = rewrite Config.ast_impl_magic_number ast ppxs in + Ast_mapper.drop_ppx_context_str ~restore ast +let apply_rewriters_sig ~restore ~tool_name ast = + match !Clflags.all_ppx with + | [] -> ast + | ppxs -> + let ast = Ast_mapper.add_ppx_context_sig ~tool_name ast in + let ast = rewrite Config.ast_intf_magic_number ast ppxs in + Ast_mapper.drop_ppx_context_sig ~restore ast + +let apply_rewriters ~restore ~tool_name magic ast = + if magic = Config.ast_impl_magic_number then + Obj.magic (apply_rewriters_str ~restore ~tool_name (Obj.magic ast)) + else if magic = Config.ast_intf_magic_number then + Obj.magic (apply_rewriters_sig ~restore ~tool_name (Obj.magic ast)) + else + assert false (* Parse a file or get a dumped syntax tree from it *) @@ -160,7 +157,7 @@ let file ppf ~tool_name inputfile parse_fun ast_magic = with x -> close_in ic; raise x in close_in ic; - apply_rewriters ~tool_name ast_magic ast + apply_rewriters ~restore:false ~tool_name ast_magic ast let report_error ppf = function | CannotRun cmd -> diff --git a/driver/pparse.mli b/driver/pparse.mli index d45adf91de..7972e6c04b 100644 --- a/driver/pparse.mli +++ b/driver/pparse.mli @@ -21,7 +21,8 @@ exception Error of error val preprocess : string -> string val remove_preprocessed : string -> unit val file : formatter -> tool_name:string -> string -> (Lexing.lexbuf -> 'a) -> string -> 'a -val apply_rewriters : tool_name:string -> string -> 'a -> 'a +val apply_rewriters: restore:bool -> tool_name:string -> string -> 'a -> 'a +val apply_rewriters_str: restore:bool -> tool_name:string -> Parsetree.structure -> Parsetree.structure val report_error : formatter -> error -> unit diff --git a/parsing/ast_mapper.ml b/parsing/ast_mapper.ml index f44b123300..669d01449c 100644 --- a/parsing/ast_mapper.ml +++ b/parsing/ast_mapper.ml @@ -19,7 +19,6 @@ open Asttypes -open Longident open Parsetree open Ast_helper open Location @@ -625,79 +624,170 @@ let attribute_of_warning loc s = { loc; txt = "ocaml.ppwarning" }, PStr ([Str.eval ~loc (Exp.constant (Const_string (s, None)))]) +module StringMap = Map.Make(struct + type t = string + let compare = compare +end) + +let cookies = ref StringMap.empty + +let get_cookie k = + try Some (StringMap.find k !cookies) + with Not_found -> None + +let set_cookie k v = + cookies := StringMap.add k v !cookies + let tool_name_ref = ref "_none_" let tool_name () = !tool_name_ref -let restore_ppx_context payload = - let fields = - match payload with + +module PpxContext = struct + open Longident + open Asttypes + open Ast_helper + + let lid name = { txt = Lident name; loc = Location.none } + + let make_string x = Exp.constant (Const_string (x, None)) + + let make_bool x = + if x + then Exp.construct (lid "true") None + else Exp.construct (lid "false") None + + let rec make_list f lst = + match lst with + | x :: rest -> + Exp.construct (lid "::") (Some (Exp.tuple [f x; make_list f rest])) + | [] -> + Exp.construct (lid "[]") None + + let make_pair f1 f2 (x1, x2) = + Exp.tuple [f1 x1; f2 x2] + + let make_option f opt = + match opt with + | Some x -> Exp.construct (lid "Some") (Some (f x)) + | None -> Exp.construct (lid "None") None + + let get_cookies () = + lid "cookies", + make_list (make_pair make_string (fun x -> x)) + (StringMap.bindings !cookies) + + let mk fields = + { txt = "ocaml.ppx.context"; loc = Location.none }, + Parsetree.PStr [Str.eval (Exp.record fields None)] + + let make ~tool_name () = + let fields = + [ + lid "tool_name", make_string tool_name; + lid "include_dirs", make_list make_string !Clflags.include_dirs; + lid "load_path", make_list make_string !Config.load_path; + lid "open_modules", make_list make_string !Clflags.open_modules; + lid "for_package", make_option make_string !Clflags.for_package; + lid "debug", make_bool !Clflags.debug; + get_cookies () + ] + in + mk fields + + let get_fields = function | PStr [{pstr_desc = Pstr_eval ({ pexp_desc = Pexp_record (fields, None) }, [])}] -> fields | _ -> raise_errorf "Internal error: invalid [@@@ocaml.ppx.context] syntax" - in - let field name payload = - let rec get_string = function - | { pexp_desc = Pexp_constant (Const_string (str, None)) } -> str - | _ -> - raise_errorf - "Internal error: invalid [@@@ocaml.ppx.context { %s }] string syntax" - name - and get_bool pexp = - match pexp with - | {pexp_desc = Pexp_construct ({txt = Longident.Lident "true"}, None)} -> - true - | {pexp_desc = Pexp_construct ({txt = Longident.Lident "false"}, None)} -> - false - | _ -> - raise_errorf - "Internal error: invalid [@@@ocaml.ppx.context { %s }] bool syntax" - name - and get_list elem = function - | {pexp_desc = - Pexp_construct ({txt = Longident.Lident "::"}, - Some {pexp_desc = Pexp_tuple [exp; rest]}) } -> - elem exp :: get_list elem rest - | {pexp_desc = - Pexp_construct ({txt = Longident.Lident "[]"}, None)} -> - [] - | _ -> - raise_errorf - "Internal error: invalid [@@@ocaml.ppx.context { %s }] list syntax" - name - and get_option elem = function - | { pexp_desc = - Pexp_construct ({ txt = Longident.Lident "Some" }, Some exp) } -> - Some (elem exp) - | { pexp_desc = - Pexp_construct ({ txt = Longident.Lident "None" }, None) } -> - None + + let restore fields = + let field name payload = + let rec get_string = function + | { pexp_desc = Pexp_constant (Const_string (str, None)) } -> str + | _ -> + raise_errorf + "Internal error: invalid [@@@ocaml.ppx.context { %s }] string syntax" + name + and get_bool pexp = + match pexp with + | {pexp_desc = Pexp_construct ({txt = Longident.Lident "true"}, None)} -> + true + | {pexp_desc = Pexp_construct ({txt = Longident.Lident "false"}, None)} -> + false + | _ -> + raise_errorf + "Internal error: invalid [@@@ocaml.ppx.context { %s }] bool syntax" + name + and get_list elem = function + | {pexp_desc = + Pexp_construct ({txt = Longident.Lident "::"}, + Some {pexp_desc = Pexp_tuple [exp; rest]}) } -> + elem exp :: get_list elem rest + | {pexp_desc = + Pexp_construct ({txt = Longident.Lident "[]"}, None)} -> + [] + | _ -> + raise_errorf + "Internal error: invalid [@@@ocaml.ppx.context { %s }] list syntax" + name + and get_pair f1 f2 = function + | {pexp_desc = Pexp_tuple [e1; e2]} -> + (f1 e1, f2 e2) + | _ -> + raise_errorf + "Internal error: invalid [@@@ocaml.ppx.context { %s }] pair syntax" + name + and get_option elem = function + | { pexp_desc = + Pexp_construct ({ txt = Longident.Lident "Some" }, Some exp) } -> + Some (elem exp) + | { pexp_desc = + Pexp_construct ({ txt = Longident.Lident "None" }, None) } -> + None + | _ -> + raise_errorf + "Internal error: invalid [@@@ocaml.ppx.context { %s }] option syntax" + name + in + match name with + | "tool_name" -> + tool_name_ref := get_string payload + | "include_dirs" -> + Clflags.include_dirs := get_list get_string payload + | "load_path" -> + Config.load_path := get_list get_string payload + | "open_modules" -> + Clflags.open_modules := get_list get_string payload + | "for_package" -> + Clflags.for_package := get_option get_string payload + | "debug" -> + Clflags.debug := get_bool payload + | "cookies" -> + let l = get_list (get_pair get_string (fun x -> x)) payload in + cookies := + List.fold_left + (fun s (k, v) -> StringMap.add k v s) StringMap.empty + l | _ -> - raise_errorf - "Internal error: invalid [@@@ocaml.ppx.context { %s }] option syntax" - name + () in - match name with - | "tool_name" -> - tool_name_ref := get_string payload - | "include_dirs" -> - Clflags.include_dirs := get_list get_string payload - | "load_path" -> - Config.load_path := get_list get_string payload - | "open_modules" -> - Clflags.open_modules := get_list get_string payload - | "for_package" -> - Clflags.for_package := get_option get_string payload - | "debug" -> - Clflags.debug := get_bool payload - | _ -> - () - in - List.iter (function ({txt=Lident name}, x) -> field name x | _ -> ()) fields + List.iter (function ({txt=Lident name}, x) -> field name x | _ -> ()) fields -let apply ~source ~target mapper = + let update_cookies fields = + let fields = + List.filter + (function ({txt=Lident "cookies"}, _) -> false | _ -> true) + fields + in + fields @ [get_cookies ()] +end + +let ppx_context = PpxContext.make + + +let apply_lazy ~source ~target mapper = let ic = open_in_bin source in let magic = really_input_string ic (String.length Config.ast_impl_magic_number) @@ -711,12 +801,17 @@ let apply ~source ~target mapper = let implem ast = try - begin match ast with - | {pstr_desc = Pstr_attribute ({txt = "ocaml.ppx.context"}, x)} :: _ -> - restore_ppx_context x - | _ -> () - end; - mapper.structure mapper ast + let fields, ast = + match ast with + | {pstr_desc = Pstr_attribute ({txt = "ocaml.ppx.context"}, x)} :: l -> + PpxContext.get_fields x, l + | _ -> [], ast + in + PpxContext.restore fields; + let mapper = mapper () in + let ast = mapper.structure mapper ast in + let fields = PpxContext.update_cookies fields in + Str.attribute (PpxContext.mk fields) :: ast with exn -> match error_of_exn exn with | Some error -> @@ -726,12 +821,17 @@ let apply ~source ~target mapper = in let iface ast = try - begin match ast with - | {psig_desc = Psig_attribute ({txt = "ocaml.ppx.context"}, x)} :: _ -> - restore_ppx_context x - | _ -> () - end; - mapper.signature mapper ast + let fields, ast = + match ast with + | {psig_desc = Psig_attribute ({txt = "ocaml.ppx.context"}, x)} :: l -> + PpxContext.get_fields x, l + | _ -> [], ast + in + PpxContext.restore fields; + let mapper = mapper () in + let ast = mapper.signature mapper ast in + let fields = PpxContext.update_cookies fields in + Sig.attribute (PpxContext.mk fields) :: ast with exn -> match error_of_exn exn with | Some error -> @@ -750,19 +850,45 @@ let apply ~source ~target mapper = output_value oc ast; close_out oc +let drop_ppx_context_str ~restore = function + | {pstr_desc = Pstr_attribute({Location.txt = "ocaml.ppx.context"}, a)} + :: items -> + if restore then + PpxContext.restore (PpxContext.get_fields a); + items + | items -> items + +let drop_ppx_context_sig ~restore = function + | {psig_desc = Psig_attribute({Location.txt = "ocaml.ppx.context"}, a)} + :: items -> + if restore then + PpxContext.restore (PpxContext.get_fields a); + items + | items -> items + +let add_ppx_context_str ~tool_name ast = + Ast_helper.Str.attribute (ppx_context ~tool_name ()) :: ast + +let add_ppx_context_sig ~tool_name ast = + Ast_helper.Sig.attribute (ppx_context ~tool_name ()) :: ast + + +let apply ~source ~target mapper = + apply_lazy ~source ~target (fun () -> mapper) + let run_main mapper = try let a = Sys.argv in let n = Array.length a in if n > 2 then - let mapper = + let mapper () = try mapper (Array.to_list (Array.sub a 1 (n - 3))) with exn -> (* PR #6463 *) let f _ _ = raise exn in {default_mapper with structure = f; signature = f} in - apply ~source:a.(n - 2) ~target:a.(n - 1) mapper + apply_lazy ~source:a.(n - 2) ~target:a.(n - 1) mapper else begin Printf.eprintf "Usage: %s [extra_args] <infile> <outfile>\n%!" Sys.executable_name; @@ -774,38 +900,3 @@ let run_main mapper = let register_function = ref (fun _name f -> run_main f) let register name f = !register_function name f - - -let ppx_context ~tool_name () = - let open Longident in - let open Asttypes in - let open Ast_helper in - let lid name = { txt = Lident name; loc = Location.none } in - let make_string x = Exp.constant (Const_string (x, None)) in - let make_bool x = - if x - then Exp.construct (lid "true") None - else Exp.construct (lid "false") None - in - let rec make_list f lst = - match lst with - | x :: rest -> - Exp.construct (lid "::") (Some (Exp.tuple [f x; make_list f rest])) - | [] -> - Exp.construct (lid "[]") None - in - let make_option f opt = - match opt with - | Some x -> Exp.construct (lid "Some") (Some (f x)) - | None -> Exp.construct (lid "None") None - in - { txt = "ocaml.ppx.context"; loc = Location.none }, - Parsetree.PStr [Str.eval ( - Exp.record ([ - lid "tool_name", make_string tool_name; - lid "include_dirs", make_list make_string !Clflags.include_dirs; - lid "load_path", make_list make_string !Config.load_path; - lid "open_modules", make_list make_string !Clflags.open_modules; - lid "for_package", make_option make_string !Clflags.for_package; - lid "debug", make_bool !Clflags.debug; - ]) None)] diff --git a/parsing/ast_mapper.mli b/parsing/ast_mapper.mli index 786c37d6be..5a57b19daa 100644 --- a/parsing/ast_mapper.mli +++ b/parsing/ast_mapper.mli @@ -134,8 +134,28 @@ val attribute_of_warning: Location.t -> string -> attribute (** {2 Helper functions to call external mappers} *) -val ppx_context: tool_name:string -> unit -> Parsetree.attribute +val add_ppx_context_str: tool_name:string -> Parsetree.structure -> Parsetree.structure (** Extract information from the current environment and encode it - into an attribute an attribute which can be prepended to - signature/structure items of an AST to pass the information to an - external processor. *) + into an attribute which is prepended to the list of structure + items in order to pass the information to an external + processor. *) + +val add_ppx_context_sig: tool_name:string -> Parsetree.signature -> Parsetree.signature +(** Same as [ad_ppx_context_str] for signatures. *) + +val drop_ppx_context_str: restore:bool -> Parsetree.structure -> Parsetree.structure +(** Drop the ocaml.ppx.context attribute from a structure. If + [restore] is true, also restore the associated data in the current + process. *) + +val drop_ppx_context_sig: restore:bool -> Parsetree.signature -> Parsetree.signature +(** Same as [drop_ppx_context_str] for signatures. *) + +(** {2 Cookies} *) + +(** Cookies are used to pass information from a ppx processor to + a further invocation of itself, when called from the OCaml + toplevel (or other tools that support cookies). *) + +val set_cookie: string -> Parsetree.expression -> unit +val get_cookie: string -> Parsetree.expression option diff --git a/toplevel/toploop.ml b/toplevel/toploop.ml index cf62137c23..220d759677 100644 --- a/toplevel/toploop.ml +++ b/toplevel/toploop.ml @@ -327,7 +327,10 @@ let phrase ppf phr = let phr = match phr with | Ptop_def str -> - Ptop_def (Pparse.apply_rewriters ~tool_name:"ocaml" ast_impl_magic_number str) + let str = + Pparse.apply_rewriters_str ~restore:true ~tool_name:"ocaml" str + in + Ptop_def str | phr -> phr in if !Clflags.dump_parsetree then Printast.top_phrase ppf phr; From a16e7eb15bcdf0456a0f47142d64d642325f2d51 Mon Sep 17 00:00:00 2001 From: Alain Frisch <alain@frisch.fr> Date: Thu, 2 Oct 2014 07:37:45 +0000 Subject: [PATCH 053/494] #6582: make backport of #5904 more backwards compatible. (Cherry-picked from trunk, commit 15414.) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15415 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- driver/pparse.ml | 10 +++++----- driver/pparse.mli | 10 ++++++++-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/driver/pparse.ml b/driver/pparse.ml index 79adb7a78d..4b2553f272 100644 --- a/driver/pparse.ml +++ b/driver/pparse.ml @@ -96,7 +96,7 @@ let rewrite magic ast ppxs = (List.fold_left (apply_rewriter magic) (write_ast magic ast) (List.rev ppxs)) -let apply_rewriters_str ~restore ~tool_name ast = +let apply_rewriters_str ?(restore = true) ~tool_name ast = match !Clflags.all_ppx with | [] -> ast | ppxs -> @@ -104,7 +104,7 @@ let apply_rewriters_str ~restore ~tool_name ast = let ast = rewrite Config.ast_impl_magic_number ast ppxs in Ast_mapper.drop_ppx_context_str ~restore ast -let apply_rewriters_sig ~restore ~tool_name ast = +let apply_rewriters_sig ?(restore = true) ~tool_name ast = match !Clflags.all_ppx with | [] -> ast | ppxs -> @@ -112,11 +112,11 @@ let apply_rewriters_sig ~restore ~tool_name ast = let ast = rewrite Config.ast_intf_magic_number ast ppxs in Ast_mapper.drop_ppx_context_sig ~restore ast -let apply_rewriters ~restore ~tool_name magic ast = +let apply_rewriters ?restore ~tool_name magic ast = if magic = Config.ast_impl_magic_number then - Obj.magic (apply_rewriters_str ~restore ~tool_name (Obj.magic ast)) + Obj.magic (apply_rewriters_str ?restore ~tool_name (Obj.magic ast)) else if magic = Config.ast_intf_magic_number then - Obj.magic (apply_rewriters_sig ~restore ~tool_name (Obj.magic ast)) + Obj.magic (apply_rewriters_sig ?restore ~tool_name (Obj.magic ast)) else assert false diff --git a/driver/pparse.mli b/driver/pparse.mli index 7972e6c04b..bcff4e7815 100644 --- a/driver/pparse.mli +++ b/driver/pparse.mli @@ -21,8 +21,14 @@ exception Error of error val preprocess : string -> string val remove_preprocessed : string -> unit val file : formatter -> tool_name:string -> string -> (Lexing.lexbuf -> 'a) -> string -> 'a -val apply_rewriters: restore:bool -> tool_name:string -> string -> 'a -> 'a -val apply_rewriters_str: restore:bool -> tool_name:string -> Parsetree.structure -> Parsetree.structure +val apply_rewriters: ?restore:bool -> tool_name:string -> string -> 'a -> 'a + (** If [restore = true] (the default), cookies set by external rewriters will be + kept for later calls. *) + +val apply_rewriters_str: ?restore:bool -> tool_name:string -> Parsetree.structure -> Parsetree.structure +val apply_rewriters_sig: ?restore:bool -> tool_name:string -> Parsetree.signature -> Parsetree.signature + + val report_error : formatter -> error -> unit From 43b9dddaa4bba7dfd250e47f5b21699f04118f4f Mon Sep 17 00:00:00 2001 From: Alain Frisch <alain@frisch.fr> Date: Thu, 2 Oct 2014 12:43:33 +0000 Subject: [PATCH 054/494] Cherry-pick r15412 from trunk to fix #6592 (Prepare environment (with Compenv.readenv) before executing script passed on the toplevel command-line.). git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15416 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- toplevel/topmain.ml | 1 + 1 file changed, 1 insertion(+) diff --git a/toplevel/topmain.ml b/toplevel/topmain.ml index d1dbeca9d4..0d8f2d4c21 100644 --- a/toplevel/topmain.ml +++ b/toplevel/topmain.ml @@ -41,6 +41,7 @@ let file_argument name = let newargs = Array.sub Sys.argv !Arg.current (Array.length Sys.argv - !Arg.current) in + Compenv.readenv ppf Before_link; if prepare ppf && Toploop.run_script ppf name newargs then exit 0 else exit 2 From 687b5a0a733e0d7aa5bc2c2ffe313ea4d52b764c Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Fri, 3 Oct 2014 12:25:00 +0000 Subject: [PATCH 055/494] PR#6207: Configure doesn't detect features correctly on Haiku git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15444 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + config/s-nt.h | 1 + config/s-templ.h | 4 ++++ configure | 26 ++++++++++++++++++--- otherlibs/systhreads/Makefile | 6 ++--- otherlibs/unix/nice.c | 4 ++++ testsuite/tests/lib-dynlink-native/Makefile | 2 +- 7 files changed, 37 insertions(+), 7 deletions(-) diff --git a/Changes b/Changes index 7494f4bdc8..482fe54491 100644 --- a/Changes +++ b/Changes @@ -7,6 +7,7 @@ Standard library: - PR#4099: Bug in Makefile.nt: won't stop on error (George Necula) - PR#6181: Improve MSVC build (Chen Gang) +- PR#6207: Configure doesn't detect features correctly on Haiku - PR#6466: Non-exhaustive matching warning message for open types is confusing - PR#6529: fix quadratic-time algorithm in Consistbl.extract. - PR#6530: Add stack overflow handling for native code (OpenBSD i386 and amd64) diff --git a/config/s-nt.h b/config/s-nt.h index 6df440b8a0..e8aa87853f 100644 --- a/config/s-nt.h +++ b/config/s-nt.h @@ -27,3 +27,4 @@ #define HAS_LOCALE #define HAS_BROKEN_PRINTF #define HAS_IPV6 +#define HAS_NICE diff --git a/config/s-templ.h b/config/s-templ.h index d0748ae291..383b401557 100644 --- a/config/s-templ.h +++ b/config/s-templ.h @@ -212,3 +212,7 @@ The value of this symbol is the number of arguments of gethostbyaddr_r(): either 7 or 8 depending on prototype. (7 is the Solaris version, 8 is the Linux version). */ + +#define HAS_NICE + +/* Define HAS_NICE if you have nice(). */ diff --git a/configure b/configure index 90b4a76c86..aa317e165f 100755 --- a/configure +++ b/configure @@ -333,6 +333,10 @@ case "$bytecc,$target" in echo "#ifndef __PIC__" >> m.h echo "# define ARCH_CODE32" >> m.h echo "#endif" >> m.h;; + *,*-*-haiku*) + bytecccompopts="-fno-defer-pop $gcc_warnings" + # No -lm library + mathlib="";; *,*-*-beos*) bytecccompopts="-fno-defer-pop $gcc_warnings" # No -lm library @@ -655,7 +659,7 @@ if test $with_sharedlibs = "yes"; then mksharedlib="$flexlink" mkmaindll="$flexlink -maindll" shared_libraries_supported=true;; - *-*-linux-gnu|*-*-linux|*-*-freebsd[3-9]*|*-*-freebsd[1-9][0-9]*|*-*-openbsd*|*-*-netbsd*|*-*-gnu*) + *-*-linux-gnu|*-*-linux|*-*-freebsd[3-9]*|*-*-freebsd[1-9][0-9]*|*-*-openbsd*|*-*-netbsd*|*-*-gnu*|*-*-haiku*) sharedcccompopts="-fPIC" mksharedlib="$bytecc -shared" bytecclinkopts="$bytecclinkopts -Wl,-E" @@ -767,6 +771,7 @@ if test $with_sharedlibs = "yes"; then i[3456]86-*-netbsd*) natdynlink=true;; x86_64-*-netbsd*) natdynlink=true;; i386-*-gnu0.3) natdynlink=true;; + i[3456]86-*-haiku*) natdynlink=true;; arm*-*-linux*) natdynlink=true;; arm*-*-freebsd*) natdynlink=true;; aarch64-*-linux*) natdynlink=true;; @@ -799,6 +804,7 @@ case "$target" in else arch=i386; system=solaris fi;; + i[3456]86-*-haiku*) arch=i386; system=beos;; i[3456]86-*-beos*) arch=i386; system=beos;; i[3456]86-*-cygwin*) arch=i386; system=cygwin;; i[3456]86-*-darwin*) if $arch64; then @@ -1046,11 +1052,17 @@ if sh ./hasgot socket socketpair bind listen accept connect; then inf "You have BSD sockets." echo "#define HAS_SOCKETS" >> s.h has_sockets=yes -elif sh ./hasgot -lnsl -lsocket socket socketpair bind listen accept connect; then +elif sh ./hasgot -lnsl -lsocket socket socketpair bind listen accept connect +then inf "You have BSD sockets (with libraries '-lnsl -lsocket')" cclibs="$cclibs -lnsl -lsocket" echo "#define HAS_SOCKETS" >> s.h has_sockets=yes +elif sh ./hasgot -lnetwork socket socketpair bind listen accept connect; then + echo "You have BSD sockets (with library '-lnetwork')" + cclibs="$cclibs -lnetwork" + echo "#define HAS_SOCKETS" >> s.h + has_sockets=yes else case "$target" in *-*-mingw*) @@ -1309,6 +1321,11 @@ if sh ./hasgot mkstemp; then echo "#define HAS_MKSTEMP" >> s.h fi +if sh ./hasgot nice; then + inf "nice() found" + echo "#define HAS_NICE" >> s.h +fi + # Determine if the debugger is supported if test -n "$with_debugger"; then @@ -1361,6 +1378,8 @@ if test "$pthread_wanted" = "yes"; then pthread_caml_link="-cclib -pthread";; *-*-openbsd*) pthread_link="-pthread" pthread_caml_link="-cclib -pthread";; + *-*-haiku*) pthread_link="" + pthread_caml_link="";; *) pthread_link="-lpthread" pthread_caml_link="-cclib -lpthread";; esac @@ -1391,7 +1410,8 @@ if test "$pthread_wanted" = "yes"; then else pthread_link="" fi -echo "PTHREAD_LINK=$pthread_caml_link" >> Makefile +echo "PTHREAD_LINK=$pthread_link" >> Makefile +echo "PTHREAD_CAML_LINK=$pthread_caml_link" >> Makefile # Determine if the bytecode thread library is supported diff --git a/otherlibs/systhreads/Makefile b/otherlibs/systhreads/Makefile index a08bf34b43..f24af23b67 100644 --- a/otherlibs/systhreads/Makefile +++ b/otherlibs/systhreads/Makefile @@ -31,7 +31,7 @@ all: libthreads.a threads.cma allopt: libthreadsnat.a threads.cmxa libthreads.a: $(BYTECODE_C_OBJS) - $(MKLIB) -o threads $(BYTECODE_C_OBJS) -lpthread + $(MKLIB) -o threads $(BYTECODE_C_OBJS) $(PTHREAD_LINK) st_stubs_b.o: st_stubs.c st_posix.h $(BYTECC) -O -I../../byterun $(BYTECCCOMPOPTS) $(SHAREDCCCOMPOPTS) \ @@ -51,12 +51,12 @@ st_stubs_n.o: st_stubs.c st_posix.h threads.cma: $(THREAD_OBJS) $(MKLIB) -ocamlc '$(CAMLC)' -o threads $(THREAD_OBJS) \ - -cclib -lunix $(PTHREAD_LINK) + -cclib -lunix $(PTHREAD_CAML_LINK) # See remark above: force static linking of libthreadsnat.a threads.cmxa: $(THREAD_OBJS:.cmo=.cmx) $(CAMLOPT) -a -o threads.cmxa $(THREAD_OBJS:.cmo=.cmx) \ - -cclib -lthreadsnat $(PTHREAD_LINK) + -cclib -lthreadsnat $(PTHREAD_CAML_LINK) # Note: I removed "-cclib -lunix" from the line above. # Indeed, if we link threads.cmxa, then we must also link unix.cmxa, diff --git a/otherlibs/unix/nice.c b/otherlibs/unix/nice.c index 019e2d1c76..d0956a1685 100644 --- a/otherlibs/unix/nice.c +++ b/otherlibs/unix/nice.c @@ -22,7 +22,11 @@ CAMLprim value unix_nice(value incr) { int ret; errno = 0; +#ifdef HAS_NICE ret = nice(Int_val(incr)); +#else + ret = 0; +#endif if (ret == -1 && errno != 0) uerror("nice", Nothing); return Val_int(ret); } diff --git a/testsuite/tests/lib-dynlink-native/Makefile b/testsuite/tests/lib-dynlink-native/Makefile index 54126ff59d..f4f9d09942 100644 --- a/testsuite/tests/lib-dynlink-native/Makefile +++ b/testsuite/tests/lib-dynlink-native/Makefile @@ -49,7 +49,7 @@ run: main$(EXE): api.cmx main.cmx @$(OCAMLOPT) -thread -o main$(EXE) -linkall unix.cmxa threads.cmxa \ - dynlink.cmxa api.cmx main.cmx $(PTHREAD_LINK) + dynlink.cmxa api.cmx main.cmx main_ext$(EXE): api.cmx main.cmx factorial.$(O) @$(OCAMLOPT) -o main_ext$(EXE) dynlink.cmxa api.cmx main.cmx \ From bc689c9b6744ab310f38f4b9542d0ddd15a2789d Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Fri, 3 Oct 2014 15:27:17 +0000 Subject: [PATCH 056/494] PR#6562: Fix ocamldebug module source lookup git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15455 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ bytecomp/emitcode.ml | 1 + debugger/source.ml | 8 ++++---- utils/misc.ml | 16 ++++++++++++++++ utils/misc.mli | 2 ++ 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/Changes b/Changes index 482fe54491..33a45254e2 100644 --- a/Changes +++ b/Changes @@ -33,6 +33,8 @@ Standard library: - PR#6578: Recursive module containing alias causes Segmentation fault - PR#6581: Some bugs in generative functors - PR#6553: Missing command line options for ocamldoc +- PR#6562: Fix ocamldebug module source lookup + (Leo White) OCaml 4.02.0: ------------- diff --git a/bytecomp/emitcode.ml b/bytecomp/emitcode.ml index 77df46110e..e9a977656d 100644 --- a/bytecomp/emitcode.ml +++ b/bytecomp/emitcode.ml @@ -143,6 +143,7 @@ let record_event ev = let path = ev.ev_loc.Location.loc_start.Lexing.pos_fname in let abspath = Location.absolute_path path in debug_dirs := StringSet.add (Filename.dirname abspath) !debug_dirs; + if Filename.is_relative path then debug_dirs := StringSet.add (Sys.getcwd ()) !debug_dirs; ev.ev_pos <- !out_position; events := ev :: !events diff --git a/debugger/source.ml b/debugger/source.ml index af69fbc7bf..aa9ec70831 100644 --- a/debugger/source.ml +++ b/debugger/source.ml @@ -50,10 +50,10 @@ let source_of_module pos mdle = try find_in_path_uncap path (innermost_module ^ ext) with Not_found -> loop exts in loop source_extensions - else if Filename.is_implicit fname then - find_in_path path fname - else - fname + else if Filename.is_relative fname then + find_in_path_rel path fname + else if Sys.file_exists fname then fname + else raise Not_found (*** Buffer cache ***) diff --git a/utils/misc.ml b/utils/misc.ml index 898880cb07..2eb8088e77 100644 --- a/utils/misc.ml +++ b/utils/misc.ml @@ -87,6 +87,22 @@ let find_in_path path name = in try_dir path end +let find_in_path_rel path name = + let rec simplify s = + let open Filename in + let base = basename s in + let dir = dirname s in + if dir = s then dir + else if base = current_dir_name then simplify dir + else concat (simplify dir) base + in + let rec try_dir = function + [] -> raise Not_found + | dir::rem -> + let fullname = simplify (Filename.concat dir name) in + if Sys.file_exists fullname then fullname else try_dir rem + in try_dir path + let find_in_path_uncap path name = let uname = String.uncapitalize name in let rec try_dir = function diff --git a/utils/misc.mli b/utils/misc.mli index 4a3c84b2d9..5168a6a913 100644 --- a/utils/misc.mli +++ b/utils/misc.mli @@ -42,6 +42,8 @@ val may_map: ('a -> 'b) -> 'a option -> 'b option val find_in_path: string list -> string -> string (* Search a file in a list of directories. *) +val find_in_path_rel: string list -> string -> string + (* Search a relative file in a list of directories. *) val find_in_path_uncap: string list -> string -> string (* Same, but search also for uncapitalized name, i.e. if name is Foo.ml, allow /path/Foo.ml and /path/foo.ml From 352a031853cca5cc30c5bace15cba891244cab81 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Fri, 3 Oct 2014 19:17:58 +0000 Subject: [PATCH 057/494] PR#6590: Improve Windows (MSVC and mingw) build git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15461 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ config/Makefile.mingw | 2 +- config/Makefile.mingw64 | 2 +- config/Makefile.msvc | 8 ++++---- config/Makefile.msvc64 | 8 ++++---- 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Changes b/Changes index 33a45254e2..10c648c82b 100644 --- a/Changes +++ b/Changes @@ -35,6 +35,8 @@ Standard library: - PR#6553: Missing command line options for ocamldoc - PR#6562: Fix ocamldebug module source lookup (Leo White) +- PR#6590: Improve Windows (MSVC and mingw) build + (Chen Gang) OCaml 4.02.0: ------------- diff --git a/config/Makefile.mingw b/config/Makefile.mingw index d9e7607fec..c204980367 100644 --- a/config/Makefile.mingw +++ b/config/Makefile.mingw @@ -110,7 +110,7 @@ CPP=$(BYTECC) -E ### Flexlink FLEXLINK=flexlink -chain mingw -stack 16777216 -link -static-libgcc -FLEXDIR=$(shell $(FLEXLINK) -where) +FLEXDIR:=$(shell $(FLEXLINK) -where) IFLEXDIR=-I"$(FLEXDIR)" MKDLL=$(FLEXLINK) MKEXE=$(FLEXLINK) -exe diff --git a/config/Makefile.mingw64 b/config/Makefile.mingw64 index 44784b68ac..0a3bdfbd09 100644 --- a/config/Makefile.mingw64 +++ b/config/Makefile.mingw64 @@ -110,7 +110,7 @@ CPP=$(BYTECC) -E ### Flexlink FLEXLINK=flexlink -chain mingw64 -stack 33554432 -FLEXDIR=$(shell $(FLEXLINK) -where) +FLEXDIR:=$(shell $(FLEXLINK) -where) IFLEXDIR=-I"$(FLEXDIR)" MKDLL=$(FLEXLINK) MKEXE=$(FLEXLINK) -exe diff --git a/config/Makefile.msvc b/config/Makefile.msvc index e9d35661e5..01776bf89c 100644 --- a/config/Makefile.msvc +++ b/config/Makefile.msvc @@ -84,13 +84,13 @@ GRAPHLIB=win32graph BYTECC=cl -nologo -D_CRT_SECURE_NO_DEPRECATE ### Additional compile-time options for $(BYTECC). (For static linking.) -BYTECCCOMPOPTS=-Ox -MD +BYTECCCOMPOPTS=-O2 -MD ### Additional link-time options for $(BYTECC). (For static linking.) BYTECCLINKOPTS= ### Additional compile-time options for $(BYTECC). (For building a DLL.) -DLLCCCOMPOPTS=-Ox -MD +DLLCCCOMPOPTS=-O2 -MD ### Libraries needed BYTECCLIBS=advapi32.lib ws2_32.lib @@ -101,7 +101,7 @@ CPP=cl -nologo -EP ### Flexlink FLEXLINK=flexlink -merge-manifest -stack 16777216 -FLEXDIR=$(shell $(FLEXLINK) -where) +FLEXDIR:=$(shell $(FLEXLINK) -where) IFLEXDIR=-I"$(FLEXDIR)" MKDLL=$(FLEXLINK) MKEXE=$(FLEXLINK) -exe @@ -138,7 +138,7 @@ SYSTEM=win32 NATIVECC=cl -nologo -D_CRT_SECURE_NO_DEPRECATE ### Additional compile-time options for $(NATIVECC). -NATIVECCCOMPOPTS=-Ox -MD +NATIVECCCOMPOPTS=-O2 -MD ### Additional link-time options for $(NATIVECC) NATIVECCLINKOPTS= diff --git a/config/Makefile.msvc64 b/config/Makefile.msvc64 index 827cc7c81a..4b084bb7f2 100644 --- a/config/Makefile.msvc64 +++ b/config/Makefile.msvc64 @@ -83,7 +83,7 @@ GRAPHLIB=win32graph BYTECC=cl -nologo -D_CRT_SECURE_NO_DEPRECATE ### Additional compile-time options for $(BYTECC). (For static linking.) -BYTECCCOMPOPTS=-Ox -MD +BYTECCCOMPOPTS=-O2 -MD ### Additional compile-time options for $(BYTECC). (For debug version.) BYTECCDBGCOMPOPTS=-DDEBUG -Zi -W3 -Wp64 @@ -92,7 +92,7 @@ BYTECCDBGCOMPOPTS=-DDEBUG -Zi -W3 -Wp64 BYTECCLINKOPTS= ### Additional compile-time options for $(BYTECC). (For building a DLL.) -DLLCCCOMPOPTS=-Ox -MD +DLLCCCOMPOPTS=-O2 -MD ### Libraries needed #EXTRALIBS=bufferoverflowu.lib # for the old PSDK compiler only @@ -105,7 +105,7 @@ CPP=cl -nologo -EP ### Flexlink FLEXLINK=flexlink -x64 -merge-manifest -stack 33554432 -FLEXDIR=$(shell $(FLEXLINK) -where) +FLEXDIR:=$(shell $(FLEXLINK) -where) IFLEXDIR=-I"$(FLEXDIR)" MKDLL=$(FLEXLINK) MKEXE=$(FLEXLINK) -exe @@ -142,7 +142,7 @@ SYSTEM=win64 NATIVECC=cl -nologo ### Additional compile-time options for $(NATIVECC). -NATIVECCCOMPOPTS=-Ox -MD +NATIVECCCOMPOPTS=-O2 -MD ### Additional link-time options for $(NATIVECC) NATIVECCLINKOPTS= From 540b122b21a9e8744c3677c259bfea77d2b9d9d2 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Fri, 3 Oct 2014 19:25:44 +0000 Subject: [PATCH 058/494] sync configure with the bdf.h objinfo change (Patch by Christopher Zimmermann) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15463 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- configure | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index aa317e165f..5d33b070cb 100755 --- a/configure +++ b/configure @@ -1602,8 +1602,8 @@ echo "X11_LINK=$x11_link" >> Makefile # Look for BFD library -if ./hasgot -i bfd.h && \ - ./hasgot -lbfd -ldl -liberty -lz bfd_openr; then +if ./hasgot -DPACKAGE=ocaml -i bfd.h && \ + ./hasgot -DPACKAGE=ocaml -lbfd -ldl -liberty -lz bfd_openr; then inf "BFD library found." echo "#define HAS_LIBBFD" >> s.h echo "LIBBFD_LINK=-lbfd -ldl -liberty -lz" >> Makefile From 1e09a6d90921b476bc87bbf0016c1d9b7552e8af Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Fri, 3 Oct 2014 19:25:46 +0000 Subject: [PATCH 059/494] minor configure changes git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15464 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- configure | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/configure b/configure index 5d33b070cb..3edb9fd247 100755 --- a/configure +++ b/configure @@ -881,7 +881,7 @@ esac asppprofflags='-DPROFILING' case "$arch,$system" in - amd64,macosx) if ./searchpath clang; then + amd64,macosx) if sh ./searchpath clang; then as='clang -arch x86_64 -c' aspp='clang -arch x86_64 -c' else @@ -1383,7 +1383,7 @@ if test "$pthread_wanted" = "yes"; then *) pthread_link="-lpthread" pthread_caml_link="-cclib -lpthread";; esac - if ./hasgot -i pthread.h $pthread_link pthread_self; then + if sh ./hasgot -i pthread.h $pthread_link pthread_self; then inf "POSIX threads library supported." systhread_support=true otherlibraries="$otherlibraries systhreads" @@ -1574,7 +1574,7 @@ if test "x11_include" != "not found"; then if test "$x11_include" = "-I/usr/include"; then x11_include="" fi - if ./hasgot $x11_include $x11_link -i X11/Xlib.h XrmInitialize; then + if sh ./hasgot $x11_include $x11_link -i X11/Xlib.h XrmInitialize; then inf "X11 works" else wrn "Cannot compile X11 program." @@ -1602,8 +1602,8 @@ echo "X11_LINK=$x11_link" >> Makefile # Look for BFD library -if ./hasgot -DPACKAGE=ocaml -i bfd.h && \ - ./hasgot -DPACKAGE=ocaml -lbfd -ldl -liberty -lz bfd_openr; then +if sh ./hasgot -DPACKAGE=ocaml -i bfd.h && \ + sh ./hasgot -DPACKAGE=ocaml -lbfd -ldl -liberty -lz bfd_openr; then inf "BFD library found." echo "#define HAS_LIBBFD" >> s.h echo "LIBBFD_LINK=-lbfd -ldl -liberty -lz" >> Makefile From 126c1fe243100f1c215a7a166e7a2497dbdf5906 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Fri, 3 Oct 2014 20:31:45 +0000 Subject: [PATCH 060/494] minor refactoring in ocamldep.ml git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15470 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- tools/ocamldep.ml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/tools/ocamldep.ml b/tools/ocamldep.ml index 59fecc412c..0ca6adb191 100644 --- a/tools/ocamldep.ml +++ b/tools/ocamldep.ml @@ -56,18 +56,21 @@ let readdir dir = dirs := StringMap.add dir contents !dirs; contents +let add_to_list li s = + li := s :: !li + let add_to_load_path dir = try let dir = Misc.expand_directory Config.standard_library dir in let contents = readdir dir in - load_path := (dir, contents) :: !load_path + add_to_list load_path (dir, contents) with Sys_error msg -> Format.fprintf Format.err_formatter "@[Bad -I option: %s@]@." msg; error_occurred := true let add_to_synonym_list synonyms suffix = if (String.length suffix) > 1 && suffix.[0] = '.' then - synonyms := suffix :: !synonyms + add_to_list synonyms suffix else begin Format.fprintf Format.err_formatter "@[Bad suffix: '%s'@]@." suffix; error_occurred := true @@ -405,14 +408,14 @@ let print_version_num () = let _ = Clflags.classic := false; - first_include_dirs := Filename.current_dir_name :: !first_include_dirs; + add_to_list first_include_dirs Filename.current_dir_name; Compenv.readenv ppf Before_args; Arg.parse [ "-absname", Arg.Set Location.absname, " Show absolute filenames in error messages"; "-all", Arg.Set all_dependencies, " Generate dependencies on all files"; - "-I", Arg.String (fun s -> Clflags.include_dirs := s :: !Clflags.include_dirs), + "-I", Arg.String (add_to_list Clflags.include_dirs), "<dir> Add <dir> to the list of include directories"; "-impl", Arg.String (file_dependencies_as ML), "<f> Process <f> as a .ml file"; @@ -430,7 +433,7 @@ let _ = " Output one line per file, regardless of the length"; "-pp", Arg.String(fun s -> Clflags.preprocessor := Some s), "<cmd> Pipe sources through preprocessor <cmd>"; - "-ppx", Arg.String(fun s -> first_ppx := s :: !first_ppx), + "-ppx", Arg.String (add_to_list first_ppx), "<cmd> Pipe abstract syntax trees through preprocessor <cmd>"; "-slash", Arg.Set Clflags.force_slash, " (Windows) Use forward slash / instead of backslash \\ in file paths"; From 95da49623c023fd5e0491da426ac508a21087f3a Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Fri, 3 Oct 2014 20:31:47 +0000 Subject: [PATCH 061/494] ocamldep support for -open Adding an `open_module` function to the Depend interface instead of directly mutating `free_structure_names` makes the approach robust to eventual improvement to ocamldep's handling of `open` (for example, in presence of .cmi for the opened units it could add their submodules to the set of bound vars). This only goes so far, however, as the overall imperative style would not nicely support proper local handling of `let open M in e`. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15471 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- tools/depend.ml | 21 +++++++++++---------- tools/depend.mli | 2 ++ tools/ocamldep.ml | 12 ++++++++++-- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/tools/depend.ml b/tools/depend.ml index c6dc14330d..aeb121cbc8 100644 --- a/tools/depend.ml +++ b/tools/depend.ml @@ -21,20 +21,21 @@ module StringSet = Set.Make(struct type t = string let compare = compare end) let free_structure_names = ref StringSet.empty -let rec addmodule bv lid = - match lid with - Lident s -> +let rec add_path bv = function + | Lident s -> if not (StringSet.mem s bv) then free_structure_names := StringSet.add s !free_structure_names - | Ldot(l, _s) -> addmodule bv l - | Lapply(l1, l2) -> addmodule bv l1; addmodule bv l2 + | Ldot(l, _s) -> add_path bv l + | Lapply(l1, l2) -> add_path bv l1; add_path bv l2 + +let open_module bv lid = add_path bv lid let add bv lid = match lid.txt with - Ldot(l, _s) -> addmodule bv l + Ldot(l, _s) -> add_path bv l | _ -> () -let addmodule bv lid = addmodule bv lid.txt +let addmodule bv lid = add_path bv lid.txt let rec add_type bv ty = match ty.ptyp_desc with @@ -192,7 +193,7 @@ let rec add_expr bv exp = let bv = add_pattern bv pat in List.iter (add_class_field bv) fieldl | Pexp_newtype (_, e) -> add_expr bv e | Pexp_pack m -> add_module bv m - | Pexp_open (_ovf, m, e) -> addmodule bv m; add_expr bv e + | Pexp_open (_ovf, m, e) -> open_module bv m.txt; add_expr bv e | Pexp_extension _ -> () and add_cases bv cases = @@ -260,7 +261,7 @@ and add_sig_item bv item = end; bv | Psig_open od -> - addmodule bv od.popen_lid; bv + open_module bv od.popen_lid.txt; bv | Psig_include incl -> add_modtype bv incl.pincl_mod; bv | Psig_class cdl -> @@ -321,7 +322,7 @@ and add_struct_item bv item = end; bv | Pstr_open od -> - addmodule bv od.popen_lid; bv + open_module bv od.popen_lid.txt; bv | Pstr_class cdl -> List.iter (add_class_declaration bv) cdl; bv | Pstr_class_type cdtl -> diff --git a/tools/depend.mli b/tools/depend.mli index f859cfef20..93fc084f79 100644 --- a/tools/depend.mli +++ b/tools/depend.mli @@ -16,6 +16,8 @@ module StringSet : Set.S with type elt = string val free_structure_names : StringSet.t ref +val open_module : StringSet.t -> Longident.t -> unit + val add_use_file : StringSet.t -> Parsetree.toplevel_phrase list -> unit val add_signature : StringSet.t -> Parsetree.signature -> unit diff --git a/tools/ocamldep.ml b/tools/ocamldep.ml index 0ca6adb191..db0695c9c7 100644 --- a/tools/ocamldep.ml +++ b/tools/ocamldep.ml @@ -223,8 +223,14 @@ let read_parse_and_extract parse_function extract_function magic source_file = let input_file = Pparse.preprocess source_file in begin try let ast = - Pparse.file ~tool_name Format.err_formatter input_file parse_function magic in - extract_function Depend.StringSet.empty ast; + Pparse.file ~tool_name Format.err_formatter + input_file parse_function magic + in + let bound_vars = Depend.StringSet.empty in + List.iter (fun modname -> + Depend.open_module bound_vars (Longident.Lident modname) + ) !Clflags.open_modules; + extract_function bound_vars ast; Pparse.remove_preprocessed input_file; !Depend.free_structure_names with x -> @@ -431,6 +437,8 @@ let _ = " Generate dependencies for native-code only (no .cmo files)"; "-one-line", Arg.Set one_line, " Output one line per file, regardless of the length"; + "-open", Arg.String (add_to_list Clflags.open_modules), + "<module> Opens the module <module> before typing"; "-pp", Arg.String(fun s -> Clflags.preprocessor := Some s), "<cmd> Pipe sources through preprocessor <cmd>"; "-ppx", Arg.String (add_to_list first_ppx), From 40b8a274836b26ad84cf707fb0dfce9a27ceec19 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Fri, 3 Oct 2014 20:31:49 +0000 Subject: [PATCH 062/494] tell ocamlbuild about ocamldep's support of -open git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15472 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- ocamlbuild/ocaml_specific.ml | 2 ++ ocamlbuild/testsuite/internal.ml | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/ocamlbuild/ocaml_specific.ml b/ocamlbuild/ocaml_specific.ml index 134a153325..037d119e6f 100644 --- a/ocamlbuild/ocaml_specific.ml +++ b/ocamlbuild/ocaml_specific.ml @@ -612,6 +612,8 @@ let () = (fun param -> S [A "-w"; A param]); pflag ["ocaml";"compile";] "warn_error" (fun param -> S [A "-warn-error"; A param]); + pflag ["ocaml"; "ocamldep"] "open" + (fun param -> S [A "-open"; A param]); pflag ["ocaml"; "compile"] "open" (fun param -> S [A "-open"; A param]); () diff --git a/ocamlbuild/testsuite/internal.ml b/ocamlbuild/testsuite/internal.ml index fc7ff98dd3..d0071543f0 100644 --- a/ocamlbuild/testsuite/internal.ml +++ b/ocamlbuild/testsuite/internal.ml @@ -303,4 +303,15 @@ let () = test "OpenTag" ~matching:[M.f "test.byte"] ~targets:("test.byte",[]) ();; +let () = test "OpenDependencies" + ~description:"Test dependency computation for the new -open feature (PR#6584)" + ~options:[`no_ocamlfind] + ~tree:[ + T.f "a.ml" ~content:"let x = 1"; + T.f "b.ml" ~content:"print_int x; print_newline ()"; + T.f "_tags" ~content: "<b.*>: open(A)"; + ] + ~matching:[M.f "b.byte"] + ~targets:("b.byte",[]) ();; + run ~root:"_test_internal";; From 0368352bad7970bd477b813e3b70799b98e2c874 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Fri, 3 Oct 2014 20:35:38 +0000 Subject: [PATCH 063/494] update Changes git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15473 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Changes b/Changes index 10c648c82b..1d2cc64d6e 100644 --- a/Changes +++ b/Changes @@ -32,6 +32,8 @@ Standard library: - PR#6572: Fatal error with recursive modules - PR#6578: Recursive module containing alias causes Segmentation fault - PR#6581: Some bugs in generative functors +- PR#6584: ocamldep support for "-open M" + (Gabriel Scherer, review by Damien Doligez, report by Hezekiah M. Carty) - PR#6553: Missing command line options for ocamldoc - PR#6562: Fix ocamldebug module source lookup (Leo White) From 5c77abb8569488e3d146132e6c90f384a92586cc Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sat, 4 Oct 2014 10:38:53 +0000 Subject: [PATCH 064/494] Document -ppx option. From: Peter Zotov <whitequark@whitequark.org> git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15474 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- .gitignore | 1 + man/ocaml.m | 5 +++-- man/ocamlc.m | 5 +++-- man/ocamlopt.m | 5 +++-- ocamldoc/Makefile | 1 + parsing/ast_mapper.mli | 40 ++++++++++++++++++++++++++++++++++++---- 6 files changed, 47 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index d36195a282..6c66ecc5a7 100644 --- a/.gitignore +++ b/.gitignore @@ -414,6 +414,7 @@ /ocamldoc/odoc_text_parser.ml /ocamldoc/odoc_text_parser.mli /ocamldoc/stdlib_man +/ocamldoc/stdlib_html /ocamldoc/*.output /ocamldoc/test_stdlib /ocamldoc/test_latex diff --git a/man/ocaml.m b/man/ocaml.m index 6764d52ce3..79f81df0a4 100644 --- a/man/ocaml.m +++ b/man/ocaml.m @@ -142,8 +142,9 @@ .BI \-ppx \ command After parsing, pipe the abstract syntax tree through the preprocessor .IR command . -The format of the input and output of the preprocessor -are not yet documented. +The module +.BR Ast_mapper (3) +implements the external interface of a preprocessor. .TP .B \-principal Check information path during type-checking, to make sure that all diff --git a/man/ocamlc.m b/man/ocamlc.m index 8661a76a76..090f1c686c 100644 --- a/man/ocamlc.m +++ b/man/ocamlc.m @@ -502,8 +502,9 @@ Build a bytecode object file (.cmo file) and its associated compiled .BI \-ppx \ command After parsing, pipe the abstract syntax tree through the preprocessor .IR command . -The format of the input and output of the preprocessor -are not yet documented. +The module +.BR Ast_mapper (3) +implements the external interface of a preprocessor. .TP .B \-principal Check information path during type-checking, to make sure that all diff --git a/man/ocamlopt.m b/man/ocamlopt.m index b1b173afa8..fb20ca99c8 100644 --- a/man/ocamlopt.m +++ b/man/ocamlopt.m @@ -457,8 +457,9 @@ Build an object file (.cmx and .o files) and its associated compiled .BI \-ppx \ command After parsing, pipe the abstract syntax tree through the preprocessor .IR command . -The format of the input and output of the preprocessor -are not yet documented. +The module +.BR Ast_mapper (3) +implements the external interface of a preprocessor. .TP .B \-principal Check information path during type-checking, to make sure that all diff --git a/ocamldoc/Makefile b/ocamldoc/Makefile index 0e8b288b85..7a487c6ca0 100644 --- a/ocamldoc/Makefile +++ b/ocamldoc/Makefile @@ -148,6 +148,7 @@ OCAMLCMXFILES=$(OCAMLCMOFILES:.cmo=.cmx) STDLIB_MLIS=../stdlib/*.mli \ + ../parsing/*.mli \ ../otherlibs/$(UNIXLIB)/unix.mli \ ../otherlibs/str/str.mli \ ../otherlibs/bigarray/bigarray.mli \ diff --git a/parsing/ast_mapper.mli b/parsing/ast_mapper.mli index 5a57b19daa..d48971d589 100644 --- a/parsing/ast_mapper.mli +++ b/parsing/ast_mapper.mli @@ -10,7 +10,40 @@ (* *) (***********************************************************************) -(** Helpers to write Parsetree rewriters *) +(** The interface of a -ppx rewriter + + A -ppx rewriter is a program that accepts a serialized abstract syntax + tree and outputs another, possibly modified, abstract syntax tree. + This module encapsulates the interface between the compiler and + the -ppx rewriters, handling such details as the serialization format, + forwarding of command-line flags, and storing state. + + {!mapper} allows to implement AST rewriting using open recursion. + A typical mapper would be based on {!default_mapper}, a deep + identity mapper, and will fall back on it for handling the syntax it + does not modify. For example: + + {[ +open Asttypes +open Parsetree +open Ast_mapper + +let test_mapper argv = + { default_mapper with + expr = fun mapper expr -> + match expr with + | { pexp_desc = Pexp_extension ({ txt = "test" }, PStr [])} -> + Ast_helper.Exp.constant (Const_int 42) + | other -> default_mapper.expr mapper other; } + +let () = + register "ppx_test" test_mapper]} + + This -ppx rewriter, which replaces [[%test]] in expressions with + the constant [42], can be compiled using + [ocamlc -o ppx_test -I +compiler-libs ocamlcommon.cma ppx_test.ml]. + + *) open Parsetree @@ -100,7 +133,6 @@ val run_main: (string list -> mapper) -> unit val register_function: (string -> (string list -> mapper) -> unit) ref val register: string -> (string list -> mapper) -> unit - (** Apply the [register_function]. The default behavior is to run the mapper immediately, taking arguments from the process command line. This is to support a scenario where a mapper is linked as a @@ -141,7 +173,7 @@ val add_ppx_context_str: tool_name:string -> Parsetree.structure -> Parsetree.st processor. *) val add_ppx_context_sig: tool_name:string -> Parsetree.signature -> Parsetree.signature -(** Same as [ad_ppx_context_str] for signatures. *) +(** Same as [add_ppx_context_str], but for signatures. *) val drop_ppx_context_str: restore:bool -> Parsetree.structure -> Parsetree.structure (** Drop the ocaml.ppx.context attribute from a structure. If @@ -149,7 +181,7 @@ val drop_ppx_context_str: restore:bool -> Parsetree.structure -> Parsetree.struc process. *) val drop_ppx_context_sig: restore:bool -> Parsetree.signature -> Parsetree.signature -(** Same as [drop_ppx_context_str] for signatures. *) +(** Same as [drop_ppx_context_str], but for signatures. *) (** {2 Cookies} *) From 3d29d7dea5f8ead9471aa4d30829c5a74f04ca34 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Mon, 6 Oct 2014 13:36:23 +0000 Subject: [PATCH 065/494] PR#6590 continued, rollback -O2 vs -Ox MSVC compiler option git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15476 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- config/Makefile.msvc | 6 +++--- config/Makefile.msvc64 | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/config/Makefile.msvc b/config/Makefile.msvc index 01776bf89c..93cf94b618 100644 --- a/config/Makefile.msvc +++ b/config/Makefile.msvc @@ -84,13 +84,13 @@ GRAPHLIB=win32graph BYTECC=cl -nologo -D_CRT_SECURE_NO_DEPRECATE ### Additional compile-time options for $(BYTECC). (For static linking.) -BYTECCCOMPOPTS=-O2 -MD +BYTECCCOMPOPTS=-Ox -MD ### Additional link-time options for $(BYTECC). (For static linking.) BYTECCLINKOPTS= ### Additional compile-time options for $(BYTECC). (For building a DLL.) -DLLCCCOMPOPTS=-O2 -MD +DLLCCCOMPOPTS=-Ox -MD ### Libraries needed BYTECCLIBS=advapi32.lib ws2_32.lib @@ -138,7 +138,7 @@ SYSTEM=win32 NATIVECC=cl -nologo -D_CRT_SECURE_NO_DEPRECATE ### Additional compile-time options for $(NATIVECC). -NATIVECCCOMPOPTS=-O2 -MD +NATIVECCCOMPOPTS=-Ox -MD ### Additional link-time options for $(NATIVECC) NATIVECCLINKOPTS= diff --git a/config/Makefile.msvc64 b/config/Makefile.msvc64 index 4b084bb7f2..1b2e18880d 100644 --- a/config/Makefile.msvc64 +++ b/config/Makefile.msvc64 @@ -83,7 +83,7 @@ GRAPHLIB=win32graph BYTECC=cl -nologo -D_CRT_SECURE_NO_DEPRECATE ### Additional compile-time options for $(BYTECC). (For static linking.) -BYTECCCOMPOPTS=-O2 -MD +BYTECCCOMPOPTS=-Ox -MD ### Additional compile-time options for $(BYTECC). (For debug version.) BYTECCDBGCOMPOPTS=-DDEBUG -Zi -W3 -Wp64 @@ -92,7 +92,7 @@ BYTECCDBGCOMPOPTS=-DDEBUG -Zi -W3 -Wp64 BYTECCLINKOPTS= ### Additional compile-time options for $(BYTECC). (For building a DLL.) -DLLCCCOMPOPTS=-O2 -MD +DLLCCCOMPOPTS=-Ox -MD ### Libraries needed #EXTRALIBS=bufferoverflowu.lib # for the old PSDK compiler only @@ -142,7 +142,7 @@ SYSTEM=win64 NATIVECC=cl -nologo ### Additional compile-time options for $(NATIVECC). -NATIVECCCOMPOPTS=-O2 -MD +NATIVECCCOMPOPTS=-Ox -MD ### Additional link-time options for $(NATIVECC) NATIVECCLINKOPTS= From 9101d4ade8060cf497dd73d3c30ff774bddc939c Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Tue, 7 Oct 2014 08:06:25 +0000 Subject: [PATCH 066/494] PR#6599: add -bin-annot when -packing (Christopher Zimmermann) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15482 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ ocamlbuild/ocaml_specific.ml | 1 + 2 files changed, 3 insertions(+) diff --git a/Changes b/Changes index 1d2cc64d6e..d57f0e6f53 100644 --- a/Changes +++ b/Changes @@ -39,6 +39,8 @@ Standard library: (Leo White) - PR#6590: Improve Windows (MSVC and mingw) build (Chen Gang) +- PR#6599: ocamlbuild: add -bin-annot when using -pack + (Christopher Zimmermann) OCaml 4.02.0: ------------- diff --git a/ocamlbuild/ocaml_specific.ml b/ocamlbuild/ocaml_specific.ml index 037d119e6f..c62d3a0ff4 100644 --- a/ocamlbuild/ocaml_specific.ml +++ b/ocamlbuild/ocaml_specific.ml @@ -671,6 +671,7 @@ flag ["ocaml"; "link"; "byte"; "output_obj"] (A"-output-obj");; flag ["ocaml"; "dtypes"; "compile"] (A "-dtypes");; flag ["ocaml"; "annot"; "compile"] (A "-annot");; flag ["ocaml"; "bin_annot"; "compile"] (A "-bin-annot");; +flag ["ocaml"; "bin_annot"; "pack"] (A "-bin-annot");; flag ["ocaml"; "safe_string"; "compile"] (A "-safe-string");; flag ["ocaml"; "safe_string"; "infer_interface"] (A "-safe-string");; flag ["ocaml"; "unsafe_string"; "compile"] (A "-unsafe-string");; From b55225a2ba51fb58539240a9ab527c87d9580cae Mon Sep 17 00:00:00 2001 From: Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> Date: Wed, 8 Oct 2014 02:38:16 +0000 Subject: [PATCH 067/494] Fix PR#6602: Fatal error when tracing a function with abstract type git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15495 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + toplevel/topdirs.ml | 2 ++ 2 files changed, 3 insertions(+) diff --git a/Changes b/Changes index d57f0e6f53..a166593c18 100644 --- a/Changes +++ b/Changes @@ -41,6 +41,7 @@ Standard library: (Chen Gang) - PR#6599: ocamlbuild: add -bin-annot when using -pack (Christopher Zimmermann) +- PR#6602: Fatal error when tracing a function with abstract type OCaml 4.02.0: ------------- diff --git a/toplevel/topdirs.ml b/toplevel/topdirs.ml index 59ce633cdf..4773c3f0bd 100644 --- a/toplevel/topdirs.ml +++ b/toplevel/topdirs.ml @@ -271,6 +271,8 @@ let dir_trace ppf lid = (* Nothing to do if it's not a closure *) if Obj.is_block clos && (Obj.tag clos = Obj.closure_tag || Obj.tag clos = Obj.infix_tag) + && (match Ctype.(repr (expand_head !toplevel_env desc.val_type)) + with {desc=Tarrow _} -> true | _ -> false) then begin match is_traced clos with | Some opath -> From 3d4e4a212c4f89a1b65fd60b28475e63a022e6d2 Mon Sep 17 00:00:00 2001 From: Xavier Leroy <xavier.leroy@inria.fr> Date: Thu, 9 Oct 2014 09:21:33 +0000 Subject: [PATCH 068/494] PR#6588 part 1: wrong "parallel move" code generated for CSE of operators that have multiple results. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15497 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- asmcomp/CSEgen.ml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/asmcomp/CSEgen.ml b/asmcomp/CSEgen.ml index 8cd23b0a9b..6571ad53fe 100644 --- a/asmcomp/CSEgen.ml +++ b/asmcomp/CSEgen.ml @@ -164,8 +164,8 @@ let insert_move srcs dsts i = | l -> (* Parallel move: first copy srcs into tmps one by one, then copy tmps into dsts one by one *) let tmps = Reg.createv_like srcs in - array_fold2 insert_single_move - (array_fold2 insert_single_move i srcs tmps) tmps dsts + let i1 = array_fold2 insert_single_move i tmps dsts in + array_fold2 insert_single_move i1 srcs tmps (* Classification of operations *) From 7660d81ec5cc4e2fe4a496332a557595cfc1e5a9 Mon Sep 17 00:00:00 2001 From: Xavier Leroy <xavier.leroy@inria.fr> Date: Thu, 9 Oct 2014 09:33:36 +0000 Subject: [PATCH 069/494] PR#6588 part 2: for ARMv4 and ARMv5, make sure architectural constraints on the "smull" instruction are respected. (Patch by Mark Shinwell.) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15498 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ asmcomp/arm/proc.ml | 2 ++ asmcomp/arm/selection.ml | 10 +++++++--- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Changes b/Changes index a166593c18..f39a7b0a76 100644 --- a/Changes +++ b/Changes @@ -37,6 +37,8 @@ Standard library: - PR#6553: Missing command line options for ocamldoc - PR#6562: Fix ocamldebug module source lookup (Leo White) +- PR#6588: Code generation errors for ARM + (Mark Shinwell, Xavier Leroy) - PR#6590: Improve Windows (MSVC and mingw) build (Chen Gang) - PR#6599: ocamlbuild: add -bin-annot when using -pack diff --git a/asmcomp/arm/proc.ml b/asmcomp/arm/proc.ml index 6b2ba3cf3a..58bfa427b3 100644 --- a/asmcomp/arm/proc.ml +++ b/asmcomp/arm/proc.ml @@ -219,6 +219,7 @@ let safe_register_pressure = function Iextcall(_, _) -> if abi = EABI then 0 else 4 | Ialloc _ -> if abi = EABI then 0 else 7 | Iconst_symbol _ when !pic_code -> 7 + | Iintop Imulh when !arch < ARMv6 -> 8 | _ -> 9 let max_register_pressure = function @@ -227,6 +228,7 @@ let max_register_pressure = function | Iconst_symbol _ when !pic_code -> [| 7; 16; 32 |] | Iintoffloat | Ifloatofint | Iload(Single, _) | Istore(Single, _, _) -> [| 9; 15; 31 |] + | Iintop Imulh when !arch < ARMv6 -> [| 8; 16; 32 |] | _ -> [| 9; 16; 32 |] (* Pure operations (without any side effect besides updating their result diff --git a/asmcomp/arm/selection.ml b/asmcomp/arm/selection.ml index 9cd6090cd1..4725942b72 100644 --- a/asmcomp/arm/selection.ml +++ b/asmcomp/arm/selection.ml @@ -48,6 +48,8 @@ let select_shiftop = function exception Use_default let r1 = phys_reg 1 +let r6 = phys_reg 6 +let r7 = phys_reg 7 let r12 = phys_reg 8 let pseudoregs_for_operation op arg res = @@ -58,10 +60,12 @@ let pseudoregs_for_operation op arg res = Iintop Imul | Ispecific Imuladd when !arch < ARMv6 -> (arg, [| res.(0); arg.(0) |]) (* For smull rdlo,rdhi,rn,rm (pre-ARMv6) the registers rdlo, rdhi and rn - must be different. We deal with this by pretending that rn is also a - result of the smull operation. *) + must be different. Also, rdlo (whose contents we discard) is always + forced to be r12 in proc.ml, which means that neither rdhi and rn can + be r12. To keep things simple, we force both of those two to specific + hard regs: rdhi in r6 and rn in r7. *) | Iintop Imulh when !arch < ARMv6 -> - (arg, [| res.(0); arg.(0) |]) + ([| r7; arg.(1) |], [| r6 |]) (* Soft-float Iabsf and Inegf: arg.(0) and res.(0) must be the same *) | Iabsf | Inegf when !fpu = Soft -> ([|res.(0); arg.(1)|], res) From b7d26c2dd9a0be9ff82ef98b2a63cf9ab9470252 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Fri, 10 Oct 2014 14:19:55 +0000 Subject: [PATCH 070/494] PR#6557: String.sub throws Invalid_argument("Bytes.sub") git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15520 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ stdlib/bytes.ml | 29 +++++++++++++++++++---------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/Changes b/Changes index f39a7b0a76..b8220e4d39 100644 --- a/Changes +++ b/Changes @@ -35,6 +35,8 @@ Standard library: - PR#6584: ocamldep support for "-open M" (Gabriel Scherer, review by Damien Doligez, report by Hezekiah M. Carty) - PR#6553: Missing command line options for ocamldoc +- PR#6557: String.sub throws Invalid_argument("Bytes.sub") + (Damien Doligez, report by Oliver Bandel) - PR#6562: Fix ocamldebug module source lookup (Leo White) - PR#6588: Code generation errors for ARM diff --git a/stdlib/bytes.ml b/stdlib/bytes.ml index ece7c1ea5a..ce6e126db8 100644 --- a/stdlib/bytes.ml +++ b/stdlib/bytes.ml @@ -55,7 +55,7 @@ let of_string s = copy (unsafe_of_string s) let sub s ofs len = if ofs < 0 || len < 0 || ofs > length s - len - then invalid_arg "Bytes.sub" + then invalid_arg "String.sub / Bytes.sub" else begin let r = create len in unsafe_blit s ofs r 0 len; @@ -74,7 +74,7 @@ let extend s left right = let fill s ofs len c = if ofs < 0 || len < 0 || ofs > length s - len - then invalid_arg "Bytes.fill" + then invalid_arg "String.fill / Bytes.fill" else unsafe_fill s ofs len c let blit s1 ofs1 s2 ofs2 len = @@ -86,7 +86,7 @@ let blit s1 ofs1 s2 ofs2 len = let blit_string s1 ofs1 s2 ofs2 len = if len < 0 || ofs1 < 0 || ofs1 > string_length s1 - len || ofs2 < 0 || ofs2 > length s2 - len - then invalid_arg "Bytes.blit_string" + then invalid_arg "String.blit / Bytes.blit_string" else unsafe_blit_string s1 ofs1 s2 ofs2 len let iter f a = @@ -224,7 +224,7 @@ let index s c = index_rec s (length s) 0 c;; let index_from s i c = let l = length s in - if i < 0 || i > l then invalid_arg "Bytes.index_from" else + if i < 0 || i > l then invalid_arg "String.index_from / Bytes.index_from" else index_rec s l i c;; let rec rindex_rec s i c = @@ -234,19 +234,28 @@ let rec rindex_rec s i c = let rindex s c = rindex_rec s (length s - 1) c;; let rindex_from s i c = - if i < -1 || i >= length s then invalid_arg "Bytes.rindex_from" else - rindex_rec s i c;; + if i < -1 || i >= length s then + invalid_arg "String.rindex_from / Bytes.rindex_from" + else + rindex_rec s i c +;; let contains_from s i c = let l = length s in - if i < 0 || i > l then invalid_arg "Bytes.contains_from" else - try ignore (index_rec s l i c); true with Not_found -> false;; + if i < 0 || i > l then + invalid_arg "String.contains_from / Bytes.contains_from" + else + try ignore (index_rec s l i c); true with Not_found -> false +;; let contains s c = contains_from s 0 c;; let rcontains_from s i c = - if i < 0 || i >= length s then invalid_arg "Bytes.rcontains_from" else - try ignore (rindex_rec s i c); true with Not_found -> false;; + if i < 0 || i >= length s then + invalid_arg "String.rcontains_from / Bytes.rcontains_from" + else + try ignore (rindex_rec s i c); true with Not_found -> false +;; type t = bytes From ac787a854a501f4b568dba307dd2b56437a72f8f Mon Sep 17 00:00:00 2001 From: Alain Frisch <alain@frisch.fr> Date: Mon, 13 Oct 2014 07:18:19 +0000 Subject: [PATCH 071/494] #6609: export Toploop.phrase. (Cherry-picked 15528 from trunk.) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15529 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- toplevel/toploop.ml | 6 +++--- toplevel/toploop.mli | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/toplevel/toploop.ml b/toplevel/toploop.ml index 220d759677..9fa802ca1b 100644 --- a/toplevel/toploop.ml +++ b/toplevel/toploop.ml @@ -323,7 +323,7 @@ let protect r newval body = let use_print_results = ref true -let phrase ppf phr = +let preprocess_phrase ppf phr = let phr = match phr with | Ptop_def str -> @@ -357,7 +357,7 @@ let use_file ppf wrap_mod name = try List.iter (fun ph -> - let ph = phrase ppf ph in + let ph = preprocess_phrase ppf ph in if not (execute_phrase !use_print_results ppf ph) then raise Exit) (if wrap_mod then parse_mod_use_file name lb @@ -483,7 +483,7 @@ let loop ppf = Location.reset(); first_line := true; let phr = try !parse_toplevel_phrase lb with Exit -> raise PPerror in - let phr = phrase ppf phr in + let phr = preprocess_phrase ppf phr in Env.reset_cache_toplevel (); ignore(execute_phrase true ppf phr) with diff --git a/toplevel/toploop.mli b/toplevel/toploop.mli index 5f0b86e261..1867c001ed 100644 --- a/toplevel/toploop.mli +++ b/toplevel/toploop.mli @@ -53,6 +53,9 @@ val execute_phrase : bool -> formatter -> Parsetree.toplevel_phrase -> bool phrase executed with no errors and [false] otherwise. First bool says whether the values and types of the results should be printed. Uncaught exceptions are always printed. *) +val preprocess_phrase : formatter -> Parsetree.toplevel_phrase -> Parsetree.toplevel_phrase + (* Preprocess the given toplevel phrase using regular and ppx + preprocessors. Return the updated phrase. *) val use_file : formatter -> string -> bool val use_silently : formatter -> string -> bool val mod_use_file : formatter -> string -> bool From 116fdd0c1091c38beac48bc9f4dfa14a757eb6f1 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Mon, 13 Oct 2014 09:37:48 +0000 Subject: [PATCH 072/494] ocamlbuild: make it possible to change the ocamlmklib command Add a -ocamlmklib option. Use ocamlfind for ocamlmklib as well, when told to do so. This is useful when crosscompiling, to select an alternative ocamlmklib that produces libraries for the target platform. From: Jerome Vouillon <jerome.vouillon@pps.univ-paris-diderot.fr> git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15532 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ ocamlbuild/options.ml | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Changes b/Changes index b8220e4d39..f0a5ebad29 100644 --- a/Changes +++ b/Changes @@ -46,6 +46,8 @@ Standard library: - PR#6599: ocamlbuild: add -bin-annot when using -pack (Christopher Zimmermann) - PR#6602: Fatal error when tracing a function with abstract type +- ocamlbuild: add an -ocamlmklib option to change the ocamlmklib command + (Jérôme Vouillon) OCaml 4.02.0: ------------- diff --git a/ocamlbuild/options.ml b/ocamlbuild/options.ml index 5ee512200f..5193b9b904 100644 --- a/ocamlbuild/options.ml +++ b/ocamlbuild/options.ml @@ -238,8 +238,7 @@ let spec = ref ( "-ocamlyacc", set_cmd ocamlyacc, "<command> Set the ocamlyacc tool"; "-menhir", set_cmd ocamlyacc, "<command> Set the menhir tool (use it after -use-menhir)"; "-ocamllex", set_cmd ocamllex, "<command> Set the ocamllex tool"; - (* Not set since we perhaps want to replace ocamlmklib *) - (* "-ocamlmklib", set_cmd ocamlmklib, "<command> Set the ocamlmklib tool"; *) + "-ocamlmklib", set_cmd ocamlmklib, "<command> Set the ocamlmklib tool"; "-ocamlmktop", set_cmd ocamlmktop, "<command> Set the ocamlmktop tool"; "-ocamlrun", set_cmd ocamlrun, "<command> Set the ocamlrun tool"; @@ -316,6 +315,7 @@ let init () = "ocamlopt", ocamlopt; "ocamldep", ocamldep; "ocamldoc", ocamldoc; + "ocamlmklib", ocamlmklib; "ocamlmktop", ocamlmktop; ] end; From 12c24197ac7095e5f755ad57ed624f28d93db5e3 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Mon, 13 Oct 2014 09:38:16 +0000 Subject: [PATCH 073/494] PR#6599 continued: ocamlbuild, add -annot when using pack git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15533 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- ocamlbuild/ocaml_specific.ml | 1 + 1 file changed, 1 insertion(+) diff --git a/ocamlbuild/ocaml_specific.ml b/ocamlbuild/ocaml_specific.ml index c62d3a0ff4..79517a86a4 100644 --- a/ocamlbuild/ocaml_specific.ml +++ b/ocamlbuild/ocaml_specific.ml @@ -670,6 +670,7 @@ flag ["ocaml"; "link"; "native"; "output_obj"] (A"-output-obj");; flag ["ocaml"; "link"; "byte"; "output_obj"] (A"-output-obj");; flag ["ocaml"; "dtypes"; "compile"] (A "-dtypes");; flag ["ocaml"; "annot"; "compile"] (A "-annot");; +flag ["ocaml"; "annot"; "pack"] (A "-annot");; flag ["ocaml"; "bin_annot"; "compile"] (A "-bin-annot");; flag ["ocaml"; "bin_annot"; "pack"] (A "-bin-annot");; flag ["ocaml"; "safe_string"; "compile"] (A "-safe-string");; From d0f949370ae2abb2d1b9a1c958361e80dad509d2 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Mon, 13 Oct 2014 09:58:26 +0000 Subject: [PATCH 074/494] improve 4.02.1 Changelog git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15534 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/Changes b/Changes index f0a5ebad29..f1435285f0 100644 --- a/Changes +++ b/Changes @@ -5,40 +5,56 @@ OCaml 4.02.1: Standard library: * Add optional argument ?limit to Arg.align. -- PR#4099: Bug in Makefile.nt: won't stop on error (George Necula) -- PR#6181: Improve MSVC build (Chen Gang) +- PR#4099: Bug in Makefile.nt: won't stop on error + (George Necula) +- PR#6181: Improve MSVC build + (Chen Gang) - PR#6207: Configure doesn't detect features correctly on Haiku + (Jessica Hamilton) - PR#6466: Non-exhaustive matching warning message for open types is confusing + (Peter Zotov) - PR#6529: fix quadratic-time algorithm in Consistbl.extract. + (Xavier Leroy, Alain Frisch, relase-worthy report by Jacques-Pascal Deplaix) - PR#6530: Add stack overflow handling for native code (OpenBSD i386 and amd64) + (Cristopher Zimmermann) - PR#6533: broken semantics of %(%) when substitued by a box (Benoît Vaugon, report by Boris Yakobowski) - PR#6534: legacy support for %.10s (Benoît Vaugon, Gabriel Scherer, report by Nick Chapman) - PR#6536: better documentation of flag # in format strings + (Damien Doligez, report by Nick Chapman) - PR#6544: Bytes and CamlinternalFormat missing from threads stdlib.cma (Christopher Zimmermann) - PR#6546: -dsource omits parens for `List ((`String "A")::[]) in patterns (Gabriel Scherer, report by Peter Zotov) - PR#6547: __MODULE__ aborts the compiler if the module name cannot be inferred + (Jacques Garrigue, report by Kaustuv Chaudhuri) - PR#6549: Debug section is sometimes not readable when using -pack (Hugo Heuzard, review by Gabriel Scherer) -- PR#6554: fix race condition when retrieving backtraces (Jérémie Dimino, - Mark Shinwell). -- PR#6564: infinite loop in Mtype.remove_aliases +- PR#6553: Missing command line options for ocamldoc + (Maxence Guesdon) +- PR#6554: fix race condition when retrieving backtraces + (Jérémie Dimino, Mark Shinwell). +- PR#6557: String.sub throws Invalid_argument("Bytes.sub") + (Damien Doligez, report by Oliver Bandel) +- PR#6562: Fix ocamldebug module source lookup + (Leo White) - PR#6563: Inclusion of packs failing to run module initializers + (Jacques Garrigue, report by Mark Shinwell) +- PR#6564: infinite loop in Mtype.remove_aliases + (Jacques Garrigue, report by Mark Shinwell) - PR#6565: compilation fails with Env.Error(_) + (Jacques Garrigue and Mark Shinwell) - PR#6566: -short-paths and signature inclusion errors + (Jacques Garrigue, report by Mark Shinwell) - PR#6572: Fatal error with recursive modules + (Jacques Garrigue, report by Quentin Stievenart) - PR#6578: Recursive module containing alias causes Segmentation fault + (Jacques Garrigue) - PR#6581: Some bugs in generative functors + (Jacques Garrigue, report by Mark Shinwell) - PR#6584: ocamldep support for "-open M" (Gabriel Scherer, review by Damien Doligez, report by Hezekiah M. Carty) -- PR#6553: Missing command line options for ocamldoc -- PR#6557: String.sub throws Invalid_argument("Bytes.sub") - (Damien Doligez, report by Oliver Bandel) -- PR#6562: Fix ocamldebug module source lookup - (Leo White) - PR#6588: Code generation errors for ARM (Mark Shinwell, Xavier Leroy) - PR#6590: Improve Windows (MSVC and mingw) build @@ -46,6 +62,7 @@ Standard library: - PR#6599: ocamlbuild: add -bin-annot when using -pack (Christopher Zimmermann) - PR#6602: Fatal error when tracing a function with abstract type + (Jacques Garrigue, report by Hugo Herbelin) - ocamlbuild: add an -ocamlmklib option to change the ocamlmklib command (Jérôme Vouillon) From 68c8a13f7b9ea707f38b73fb1980cea995a61648 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 14 Oct 2014 12:02:19 +0000 Subject: [PATCH 075/494] last commit before tagging 4.02.1 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15540 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- .depend | 40 ++++++++++++++++++++-------------------- VERSION | 2 +- boot/ocamlc | Bin 1709104 -> 1715892 bytes boot/ocamldep | Bin 526896 -> 532330 bytes boot/ocamllex | Bin 252396 -> 254330 bytes ocamldoc/.depend | 18 ++++++++++++------ tools/.depend | 12 +++++++----- 7 files changed, 40 insertions(+), 32 deletions(-) diff --git a/.depend b/.depend index 9b6b9ffb68..5d95a9bb65 100644 --- a/.depend +++ b/.depend @@ -538,20 +538,20 @@ bytecomp/translclass.cmx : typing/types.cmx bytecomp/typeopt.cmx \ typing/path.cmx bytecomp/matching.cmx parsing/location.cmx \ bytecomp/lambda.cmx typing/ident.cmx typing/env.cmx utils/clflags.cmx \ typing/btype.cmx parsing/asttypes.cmi bytecomp/translclass.cmi -bytecomp/translcore.cmo : utils/warnings.cmi typing/types.cmi \ - bytecomp/typeopt.cmi typing/typedtree.cmi bytecomp/translobj.cmi \ - typing/primitive.cmi typing/predef.cmi typing/path.cmi \ - typing/parmatch.cmi utils/misc.cmi bytecomp/matching.cmi \ - parsing/longident.cmi parsing/location.cmi bytecomp/lambda.cmi \ - typing/ident.cmi typing/env.cmi utils/config.cmi utils/clflags.cmi \ - typing/btype.cmi parsing/asttypes.cmi bytecomp/translcore.cmi -bytecomp/translcore.cmx : utils/warnings.cmx typing/types.cmx \ - bytecomp/typeopt.cmx typing/typedtree.cmx bytecomp/translobj.cmx \ - typing/primitive.cmx typing/predef.cmx typing/path.cmx \ - typing/parmatch.cmx utils/misc.cmx bytecomp/matching.cmx \ - parsing/longident.cmx parsing/location.cmx bytecomp/lambda.cmx \ - typing/ident.cmx typing/env.cmx utils/config.cmx utils/clflags.cmx \ - typing/btype.cmx parsing/asttypes.cmi bytecomp/translcore.cmi +bytecomp/translcore.cmo : typing/types.cmi bytecomp/typeopt.cmi \ + typing/typedtree.cmi bytecomp/translobj.cmi typing/primitive.cmi \ + typing/predef.cmi typing/path.cmi typing/parmatch.cmi utils/misc.cmi \ + bytecomp/matching.cmi parsing/longident.cmi parsing/location.cmi \ + bytecomp/lambda.cmi typing/ident.cmi typing/env.cmi utils/config.cmi \ + utils/clflags.cmi typing/btype.cmi parsing/asttypes.cmi \ + bytecomp/translcore.cmi +bytecomp/translcore.cmx : typing/types.cmx bytecomp/typeopt.cmx \ + typing/typedtree.cmx bytecomp/translobj.cmx typing/primitive.cmx \ + typing/predef.cmx typing/path.cmx typing/parmatch.cmx utils/misc.cmx \ + bytecomp/matching.cmx parsing/longident.cmx parsing/location.cmx \ + bytecomp/lambda.cmx typing/ident.cmx typing/env.cmx utils/config.cmx \ + utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi \ + bytecomp/translcore.cmi bytecomp/translmod.cmo : typing/types.cmi typing/typedtree.cmi \ bytecomp/translobj.cmi bytecomp/translcore.cmi bytecomp/translclass.cmi \ typing/printtyp.cmi typing/primitive.cmi typing/predef.cmi \ @@ -927,12 +927,12 @@ driver/optmain.cmx : utils/warnings.cmx asmcomp/printmach.cmx \ driver/compenv.cmx utils/clflags.cmx asmcomp/asmpackager.cmx \ asmcomp/asmlink.cmx asmcomp/asmlibrarian.cmx asmcomp/arch.cmx \ driver/optmain.cmi -driver/pparse.cmo : parsing/parsetree.cmi parsing/parse.cmi utils/misc.cmi \ - parsing/location.cmi utils/config.cmi utils/clflags.cmi utils/ccomp.cmi \ - parsing/ast_mapper.cmi parsing/ast_helper.cmi driver/pparse.cmi -driver/pparse.cmx : parsing/parsetree.cmi parsing/parse.cmx utils/misc.cmx \ - parsing/location.cmx utils/config.cmx utils/clflags.cmx utils/ccomp.cmx \ - parsing/ast_mapper.cmx parsing/ast_helper.cmx driver/pparse.cmi +driver/pparse.cmo : parsing/parse.cmi utils/misc.cmi parsing/location.cmi \ + utils/config.cmi utils/clflags.cmi utils/ccomp.cmi parsing/ast_mapper.cmi \ + driver/pparse.cmi +driver/pparse.cmx : parsing/parse.cmx utils/misc.cmx parsing/location.cmx \ + utils/config.cmx utils/clflags.cmx utils/ccomp.cmx parsing/ast_mapper.cmx \ + driver/pparse.cmi toplevel/genprintval.cmi : typing/types.cmi typing/path.cmi \ typing/outcometree.cmi typing/env.cmi toplevel/opttopdirs.cmi : parsing/longident.cmi diff --git a/VERSION b/VERSION index ebc080e4b9..04633d112c 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.02.1+dev1-2014-09-26 +4.02.1+dev2-2014-10-14 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli diff --git a/boot/ocamlc b/boot/ocamlc index 3d985633ec4ca8bfdc15771d09fa53288b4dd0a6..ea306b374018d4386ed8df7ad05ade44321ba6f6 100755 GIT binary patch delta 145141 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 U0jpS@9CWkggBM@{G|2tG07|lFu>b%7 delta 144778 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 {uuCnuywPUO7;XNY}&Apj=;G2uq6Yo|6 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 R$=U6KUi(q*?;D%=e*g!5gS`L% diff --git a/boot/ocamldep b/boot/ocamldep index 3aa4641b7031515d4252ca3519a90a52437028b4..64bb5040f9c41cfdaae71181a7dab18dfb10a5fe 100755 GIT binary patch delta 32770 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 DW-@I? delta 30871 zcmb`w3tUxI_6P1h54cxBLEeIL0Sy%p6jV%&OPY_gq<p7^ii#!*J}MiX!5)*AmKMgc zw2>aa(Me~-v^h0dQudr|B(v1Aq|CIm#I&-qx&QC?+<Wj!*8lhWfBxt5S?seOd+oK? zUVH6*_PO`+)k~h*)t+u?DcLj1XHUy6ojku}#<c8i<rR}>XXkax>CvrwS$WCivW(K1 z3$pTZdSp$Xxp3P2I})BvP+g<7rCvFG)`+)mj8=cTJ+fm9|8)<F%K?4m<o&8RD-5?0 zfVKeM=K?6|0>lD%-3{mph?gY~s9ZVxM-?W0A5`(}DHH`zfUy8Q0G&|g%lQXXDTSlM zgOx_fij^wkQuKzED%++fTqF-&T>vy7RO*+hWGPvtI=kBe=QTsTx2iN5cB_h)Hy%(C zk$E770N9I`fGA0N2o3t?sEF>Bz-cUdOXGtZiUeK)=m0PP^hTo87pX+4dQj!a%G;GI zg+fUHw$29JfN;RY7WT;jDFqM;V3p=TkJHX*0By(sP}N&9^&yqkowvN4vAP2H^es)I zZ(9L)Ed|goy=2EjDmkV-ZrQ3+@_wqUqFb{kVa)cgQV~sK!8W3$VX=|cKLNMdfH44C z%%&Vq1veQi7YCW1fDeM)|Mp51t)iskYL%hFrGACVNazL;nxO!6Y$o6)z&F(os=iWQ zrd)O;nf`$~U#)t(4}e_;D3+QVRASYJBM}eoaY?x#j;O%|P-9DZRaDx8Z->blu#^(l z8kJ!l1gEvs&Q*yi9A7p&kivih0I$vfj&GpGhq(3EkezFk%lrs<7&T<e&bw5Iyd$cm zw0cC1ll5y<M_Kxa%8UFMGE_rH(Fvc(?nl&4w-W?zY3QU6lOG;ctHK#+3=q4N&1+Sn zYmCq5qg&<ewW?z!`}6aE{S*p0lhFwg4`>Vzn*1*0C=(B0Y%B&Gff4K~X`F+keFED5 z5-R_<g8wJE|G)sp5Z=?6=Yx!Tpvg$Y83p!%;0XRNE&pAEoW>r3ZjKgp76w668<iju zF#_c;O_p77VMl~fQ-y%s)7k}EaWlTtkw-wM0h>@#zPSOUjdm0}2CxiP{sSt<LGXG& zFg^HwDtL?mrWwXZq%{7Iij&H}C{NZ#1WqYv3{LWbfhmYdKFy)a?!O>ami|R0Nz{53 zEsHiGZRGN9!V|a~xn6lO8&<DZX+5Vv??r7w2lah}=uSmB3NXI8j1>JtC1cKq)u<7X zeSXEI)!{dz;tT){b<3(6Rhrcnk|jXf08#=hCZpB>wiVo`w*EHUa^NW}3#E^%#R>c2 z(o2~dCOLH~(Ts+MR(36ERfAp*eggT#B@>@e!<1V#KB3YgA8W3m$-yr9`3V&tx%`p> zGnvO|I1Q!Y%tOqwmjQSU0FZVU5nQyAK$Dp4vH+|{XT|`ii=Aa1(y5F0np9M)#7K&9 z=|ec!=`L1kHmJB1YIABb?K?GjuK+W|Q-f9Rt~f1PPQU|^1$r}wIpfyvDK#Q18C<IS zzmCTG$j>hwr|bVmdAjcfk8%1(z(wN;JP+W+DZ6X)IRuG_%&@;=C21C@^Z%;6;f|9E zQ6pSx)~mS46=)<GC|57~IZ+O5QfcjH;Fdardqfe^;-qeiigP!a<b+qnKUAD*BTF`@ z-m>!_*mqDLJ?kiIDGmQngXP%YRD|rQRS}(fH19oxZwHJ9a6O=c2+4d}Ww<Yz$cYKu zZO{iSgPZVA5Bd3Ntm}#3IZd~cdRUi5o9Q;EqzXor2f$^gsZYFj`n4DifyFhO)PUdW zQs2$ke_b#!FsD~+R%0W%3SF$$&P1*LuJRISA$d^%n$Z=|3vgJ*{aqz@VO4HuIA;z4 z=niM0E64p6DnOH(zpHEveEr`Mw57G!_a$$_d@b0jTrt$oO3wDh#{DD6X6@#sVT(#f z8si8`<py+C{-N?CotbgLi5S17|G&1AUHe<@43?eXwWsNK1BL@Q#TcvY0rW+bzr#m1 zsrXKgjm-l#xZA%9T)W$DyW0rd-CNb*-x}aq�UfXSkR>s26$N7d&hYvf~*n7Uj>X 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 diff --git a/boot/ocamllex b/boot/ocamllex index 818180d0b3e83f1922ed830422f4ab82c1f79bfa..82bd72ddda2332ae1a33683d10e6ed34b7561b30 100755 GIT binary patch delta 13613 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 C-SP|o delta 12623 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 L>2G}VQEmS}9Pg|g diff --git a/ocamldoc/.depend b/ocamldoc/.depend index 0f692a22c6..b98bb57fe7 100644 --- a/ocamldoc/.depend +++ b/ocamldoc/.depend @@ -22,12 +22,18 @@ odoc_analyse.cmx : ../utils/warnings.cmx ../typing/types.cmx \ odoc_comments.cmx odoc_class.cmx odoc_ast.cmx ../utils/misc.cmx \ ../parsing/location.cmx ../typing/env.cmx ../utils/config.cmx \ ../utils/clflags.cmx odoc_analyse.cmi -odoc_args.cmo : odoc_types.cmi odoc_texi.cmo odoc_messages.cmo odoc_man.cmo \ - odoc_latex.cmo odoc_html.cmo odoc_global.cmi odoc_gen.cmi odoc_dot.cmo \ - odoc_config.cmi ../utils/misc.cmi ../utils/config.cmi odoc_args.cmi -odoc_args.cmx : odoc_types.cmx odoc_texi.cmx odoc_messages.cmx odoc_man.cmx \ - odoc_latex.cmx odoc_html.cmx odoc_global.cmx odoc_gen.cmx odoc_dot.cmx \ - odoc_config.cmx ../utils/misc.cmx ../utils/config.cmx odoc_args.cmi +odoc_args.cmo : ../utils/warnings.cmi odoc_types.cmi odoc_texi.cmo \ + odoc_messages.cmo odoc_man.cmo odoc_latex.cmo odoc_html.cmo \ + odoc_global.cmi odoc_gen.cmi odoc_dot.cmo odoc_config.cmi \ + ../utils/misc.cmi ../driver/main_args.cmi ../parsing/location.cmi \ + ../utils/config.cmi ../driver/compenv.cmi ../utils/clflags.cmi \ + odoc_args.cmi +odoc_args.cmx : ../utils/warnings.cmx odoc_types.cmx odoc_texi.cmx \ + odoc_messages.cmx odoc_man.cmx odoc_latex.cmx odoc_html.cmx \ + odoc_global.cmx odoc_gen.cmx odoc_dot.cmx odoc_config.cmx \ + ../utils/misc.cmx ../driver/main_args.cmx ../parsing/location.cmx \ + ../utils/config.cmx ../driver/compenv.cmx ../utils/clflags.cmx \ + odoc_args.cmi odoc_ast.cmo : ../typing/types.cmi ../typing/typedtree.cmi \ ../typing/predef.cmi ../typing/path.cmi ../parsing/parsetree.cmi \ odoc_value.cmo odoc_types.cmi odoc_type.cmo odoc_sig.cmi \ diff --git a/tools/.depend b/tools/.depend index b0407009d2..c33f5c6f22 100644 --- a/tools/.depend +++ b/tools/.depend @@ -1,4 +1,4 @@ -depend.cmi : ../parsing/parsetree.cmi +depend.cmi : ../parsing/parsetree.cmi ../parsing/longident.cmi profiling.cmi : tast_iter.cmi : ../typing/typedtree.cmi ../parsing/asttypes.cmi untypeast.cmi : ../typing/typedtree.cmi ../typing/path.cmi \ @@ -52,11 +52,13 @@ ocaml299to3.cmx : ocamlcp.cmo : ../driver/main_args.cmi ocamlcp.cmx : ../driver/main_args.cmx ocamldep.cmo : ../driver/pparse.cmi ../parsing/parsetree.cmi \ - ../parsing/parse.cmi ../utils/misc.cmi ../parsing/location.cmi depend.cmi \ - ../utils/config.cmi ../driver/compenv.cmi ../utils/clflags.cmi + ../parsing/parse.cmi ../utils/misc.cmi ../parsing/longident.cmi \ + ../parsing/location.cmi depend.cmi ../utils/config.cmi \ + ../driver/compenv.cmi ../utils/clflags.cmi ocamldep.cmx : ../driver/pparse.cmx ../parsing/parsetree.cmi \ - ../parsing/parse.cmx ../utils/misc.cmx ../parsing/location.cmx depend.cmx \ - ../utils/config.cmx ../driver/compenv.cmx ../utils/clflags.cmx + ../parsing/parse.cmx ../utils/misc.cmx ../parsing/longident.cmx \ + ../parsing/location.cmx depend.cmx ../utils/config.cmx \ + ../driver/compenv.cmx ../utils/clflags.cmx ocamlmklib.cmo : ocamlmklibconfig.cmo ocamlmklib.cmx : ocamlmklibconfig.cmx ocamlmklibconfig.cmo : From f787c4676eb7bdd19eb1e9e9fb96d3e301df4d16 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 14 Oct 2014 12:24:00 +0000 Subject: [PATCH 076/494] increment version number after tagging 4.02.1 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15542 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 04633d112c..ead086b794 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.02.1+dev2-2014-10-14 +4.02.1+dev3-2014-10-14 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli From 4bfbc6bbc954e764bc3b5d8acc7bb84fffec8408 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Wed, 15 Oct 2014 12:04:55 +0000 Subject: [PATCH 077/494] increment version number after tagging 4.02.1 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15557 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index ead086b794..09cabba6aa 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.02.1+dev3-2014-10-14 +4.02.2+dev0-2014-10-14 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli From 5e430116d788664a1c40f8662aab0c02d3ef97ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Dimino?= <jeremie@dimino.org> Date: Mon, 20 Oct 2014 13:20:52 +0000 Subject: [PATCH 078/494] PR#6619: update documentation of Printexc.set_uncaught_exception_handler git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15561 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- stdlib/printexc.mli | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/stdlib/printexc.mli b/stdlib/printexc.mli index 6bffe174cb..12e021c234 100644 --- a/stdlib/printexc.mli +++ b/stdlib/printexc.mli @@ -145,7 +145,11 @@ val set_uncaught_exception_handler: (exn -> raw_backtrace -> unit) -> unit {!Pervasives.at_exit} have already been called. Because of this you must make sure any output channel [fn] writes on is flushed. - If [fn] raises an exception, it is ignored. + Also note that exceptions raised by user code in the interactive toplevel + are not passed to this function as they are caught by the toplevel itself. + + If [fn] raises an exception, both the exceptions passed to [fn] and raised + by [fn] will be printed with their respective backtrace. @since 4.02.0 *) From 48871e6ee18bd1fe72333cc18f01dd1689cdf38a Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Wed, 29 Oct 2014 16:32:28 +0000 Subject: [PATCH 079/494] PR#6628: Configure script rejects legitimate arguments git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15563 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 5 +++++ configure | 13 +++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Changes b/Changes index f1435285f0..dd2d6f7584 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,8 @@ +OCaml 4.02.2: +------------- + +- PR#6628: Configure script rejects legitimate arguments + OCaml 4.02.1: ------------- (Changes that can break existing programs are marked with a "*") diff --git a/configure b/configure index 3edb9fd247..d63dbbd042 100755 --- a/configure +++ b/configure @@ -77,7 +77,7 @@ wrn() { } err() { - printf "[ERROR!]%b\n" "$*" 1>&3 + printf "[ERROR!] %b\n" "$*" 1>&3 exit 2 } @@ -85,10 +85,6 @@ exec 3>&1 # Parse command-line arguments -if echo "$configure_options" | grep -q -e '--\?[a-zA-Z0-9-]\+='; then - err "Arguments to this script look like '-prefix /foo/bar', not '-prefix=/foo/bar' (note the '=')." -fi - while : ; do case "$1" in "") break;; @@ -155,7 +151,12 @@ while : ; do no_naked_pointers=true;; -no-cfi|--no-cfi) with_cfi=false;; - *) err "Unknown option \"$1\".";; + *) if echo "$1" | grep -q -e '^--\?[a-zA-Z0-9-]\+='; then + err "configure expects arguments of the form '-prefix /foo/bar'," \ + "not '-prefix=/foo/bar' (note the '=')." + else + err "Unknown option \"$1\"." + fi;; esac shift done From 55b1bb2bf6a1506cea4196df34b5e7c175448121 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Wed, 29 Oct 2014 21:16:48 +0000 Subject: [PATCH 080/494] fix a bug where the .annot files were truncated because of a missing "close" git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15564 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- typing/stypes.ml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/typing/stypes.ml b/typing/stypes.ml index e1f4557a2c..1f89e7443b 100644 --- a/typing/stypes.ml +++ b/typing/stypes.ml @@ -198,6 +198,10 @@ let dump filename = | Some filename -> open_out filename in sort_filter_phrases (); ignore (List.fold_left (print_info pp) Location.none info); + begin match filename with + | None -> () + | Some _ -> close_out pp + end; phrases := []; end else begin annotations := []; From 17bc3ea823c9de09b5fa6638de6aa08526f80faa Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 16 Nov 2014 17:37:45 +0000 Subject: [PATCH 081/494] fix for ocamlbuild on cygwin cannot find ocamlfind ocamlbuild should append .exe extension to filename when looking for executables and Sys.cygiwn is set (not only Sys.win32). From: algoriddle <szilvasy@gmail.com> git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15578 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- ocamlbuild/command.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ocamlbuild/command.ml b/ocamlbuild/command.ml index fc6e07cf43..3bb2614b9f 100644 --- a/ocamlbuild/command.ml +++ b/ocamlbuild/command.ml @@ -125,7 +125,7 @@ let virtual_solver virtual_command = (* On Windows, we need to also check for the ".exe" version of the file. *) let file_or_exe_exists file = - sys_file_exists file || (Sys.os_type = "Win32" && sys_file_exists (file ^ ".exe")) + sys_file_exists file || ((Sys.win32 || Sys.cygwin) && sys_file_exists (file ^ ".exe")) let search_in_path cmd = (* Try to find [cmd] in path [path]. *) From 3ab396e121f848f6096524d25692f7df23ceda84 Mon Sep 17 00:00:00 2001 From: Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> Date: Tue, 18 Nov 2014 06:30:59 +0000 Subject: [PATCH 082/494] update Changes for PR#6661 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15597 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Changes b/Changes index dd2d6f7584..8d18b98a95 100644 --- a/Changes +++ b/Changes @@ -81,7 +81,7 @@ Language features: (Alain Frisch) - Generative functors (PR#5905) (Jacques Garrigue) -- Module aliases +* Module aliases (Jacques Garrigue) * Alternative syntax for string literals {id|...|id} (can break comments) (Alain Frisch) @@ -112,8 +112,8 @@ Type system: an applicative functor if no types are created (Jacques Garrigue, suggestion by Leo White) * Module aliases are now typed in a specific way, which remembers their - identity. In particular this changes the signature inferred by - "module type of" + identity. Compiled interfaces become smaller, but may depend on the + original modules. This also changes the signature inferred by "module type of". (Jacques Garrigue, feedback from Leo White, Mark Shinwell and Nick Chapman) - PR#6331: Slight change in the criterion to distinguish private abbreviations and private row types: create a private abbreviation for From 9730b9b7e73fd3363b48dfd353bec39f2eb3f27b Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 23 Nov 2014 09:17:39 +0000 Subject: [PATCH 083/494] fix regression in toplevel printing of lazy values (fix from Leo White) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15599 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ toplevel/genprintval.ml | 35 +++++++++++++++++++++++++++++------ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/Changes b/Changes index 8d18b98a95..6b6369ccfd 100644 --- a/Changes +++ b/Changes @@ -2,6 +2,8 @@ OCaml 4.02.2: ------------- - PR#6628: Configure script rejects legitimate arguments +- PR#6669: fix regression in toplevel printing of lazy values + (Leo White, review by Gabriel Scherer) OCaml 4.02.1: ------------- diff --git a/toplevel/genprintval.ml b/toplevel/genprintval.ml index 27f45a2d1b..94ca87795f 100644 --- a/toplevel/genprintval.ml +++ b/toplevel/genprintval.ml @@ -258,12 +258,35 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct Oval_array [] | Tconstr (path, [ty_arg], _) when Path.same path Predef.path_lazy_t -> - if Lazy.is_val (O.obj obj) - then let v = - nest tree_of_val depth (Lazy.force (O.obj obj)) ty_arg - in - Oval_constr (Oide_ident "lazy", [v]) - else Oval_stuff "<lazy>" + if not (Lazy.is_val (O.obj obj)) then Oval_stuff "<lazy>" + else begin + let forced_obj = + (* we know that (Lazy.is_val (O.obj obj)), + forcing will not block *) + Lazy.force (O.obj obj) in + (* calling oneself recursively on forced_obj risks + having a false positive for cycle detection; indeed, + if the value has been created with Lazy.from_val, + it may be stored as-is instead of being wrapped in a + forward pointer. It means that, for (lazy "foo"), we have + forced_obj == obj + and it is easy to wrongly print (lazy <cycle>) in such + a case (PR#6669). + + Unfortunately, there is a corner-case that *is* + a real cycle: using -rectypes one can define + let rec x = lazy x + which creates a Forward_tagged block that points to + itself. For this reason, we still "nest" + (detect head cycles) on forward tags. + *) + let maybe_nest tree_of_val = + if O.tag obj = Obj.forward_tag + then nest tree_of_val + else tree_of_val in + let v = maybe_nest tree_of_val depth forced_obj ty_arg in + Oval_constr (Oide_ident "lazy", [v]) + end | Tconstr(path, ty_list, _) -> begin try let decl = Env.find_type path env in From a4816384b81099bce4533b79f40deb4318a0419a Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 23 Nov 2014 09:17:41 +0000 Subject: [PATCH 084/494] update Changes git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15600 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 6b6369ccfd..aee476d6f1 100644 --- a/Changes +++ b/Changes @@ -2,8 +2,12 @@ OCaml 4.02.2: ------------- - PR#6628: Configure script rejects legitimate arguments -- PR#6669: fix regression in toplevel printing of lazy values + (Michael Grünewald, Damien Doligez) +- PR#6669: fix 4.02 regression in toplevel printing of lazy values (Leo White, review by Gabriel Scherer) +- ocamlbuild on cygwin cannot find ocamlfind + (user 'algoriddle') + OCaml 4.02.1: ------------- From abcb863e43eaf9987c5603e5dd6de9dce6e0cb70 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 23 Nov 2014 09:17:43 +0000 Subject: [PATCH 085/494] testsuite/lib-hashtbl: use LICENSE rather than /usr/share/dict/words to avoid excessive test time git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15601 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- testsuite/tests/lib-hashtbl/htbl.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testsuite/tests/lib-hashtbl/htbl.ml b/testsuite/tests/lib-hashtbl/htbl.ml index 655191a8e3..bd5f33a656 100644 --- a/testsuite/tests/lib-hashtbl/htbl.ml +++ b/testsuite/tests/lib-hashtbl/htbl.ml @@ -193,7 +193,7 @@ let _ = printf "-- Random integers, narrow range\n%!"; TI2.test (random_integers 100_000 1_000); let d = - try file_data "/usr/share/dict/words" with Sys_error _ -> string_data in + try file_data "../../LICENSE" with Sys_error _ -> string_data in printf "-- Strings, generic interface\n%!"; TS1.test d; printf "-- Strings, functorial interface\n%!"; From cf58e782227e4d1d64bf7bd7e4a9e58a8fedb6e1 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 23 Nov 2014 09:54:33 +0000 Subject: [PATCH 086/494] PR#6640: add 'precious' as a builtin-useful tag git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15605 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ ocamlbuild/main.ml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index aee476d6f1..da55c9b8e1 100644 --- a/Changes +++ b/Changes @@ -3,6 +3,8 @@ OCaml 4.02.2: - PR#6628: Configure script rejects legitimate arguments (Michael Grünewald, Damien Doligez) +- PR#6640: ocamlbuild: wrong "unused tag" warning on "precious" + (report by user 'william') - PR#6669: fix 4.02 regression in toplevel printing of lazy values (Leo White, review by Gabriel Scherer) - ocamlbuild on cygwin cannot find ocamlfind diff --git a/ocamlbuild/main.ml b/ocamlbuild/main.ml index 07ca9c0652..0f502c75e5 100644 --- a/ocamlbuild/main.ml +++ b/ocamlbuild/main.ml @@ -57,7 +57,7 @@ let show_documentation () = they should be marked as useful, to avoid the "unused tag" warning. *) let builtin_useful_tags = Tags.of_list [ - "include"; "traverse"; "not_hygienic"; + "include"; "traverse"; "not_hygienic"; "precious"; "pack"; "ocamlmklib"; "native"; "thread"; "nopervasives"; "use_menhir"; "ocamldep"; "thread"; From fac2d983c6cda5e6a53fa733a91bcecb344a46e6 Mon Sep 17 00:00:00 2001 From: Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> Date: Mon, 8 Dec 2014 07:56:16 +0000 Subject: [PATCH 087/494] fix PR#6690 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15638 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 + testsuite/tests/typing-gadts/pr6690.ml | 28 ++++++++ .../pr6690.ml.principal.reference | 23 +++++++ .../tests/typing-gadts/pr6690.ml.reference | 27 ++++++++ .../gatien_baron_20131019_ok.ml | 7 +- typing/ctype.ml | 7 +- typing/env.ml | 67 +++++++++++++------ typing/env.mli | 3 +- typing/printtyp.ml | 44 ++++++++---- 9 files changed, 169 insertions(+), 39 deletions(-) create mode 100644 testsuite/tests/typing-gadts/pr6690.ml create mode 100644 testsuite/tests/typing-gadts/pr6690.ml.principal.reference create mode 100644 testsuite/tests/typing-gadts/pr6690.ml.reference diff --git a/Changes b/Changes index da55c9b8e1..d8cdae7482 100644 --- a/Changes +++ b/Changes @@ -9,6 +9,8 @@ OCaml 4.02.2: (Leo White, review by Gabriel Scherer) - ocamlbuild on cygwin cannot find ocamlfind (user 'algoriddle') +- PR#6690: Uncaught exception (Not_found) with (wrong) wildcard or unification + type variable in place of a local abstract type OCaml 4.02.1: diff --git a/testsuite/tests/typing-gadts/pr6690.ml b/testsuite/tests/typing-gadts/pr6690.ml new file mode 100644 index 0000000000..46ece4b239 --- /dev/null +++ b/testsuite/tests/typing-gadts/pr6690.ml @@ -0,0 +1,28 @@ +type 'a visit_action + +type insert + +type 'a local_visit_action + +type ('a, 'result, 'visit_action) context = + | Local : ('a, ('a * insert) as 'result, 'a local_visit_action) context + | Global : ('a, 'a, 'a visit_action) context +;; + +let vexpr (type visit_action) : (_, _, visit_action) context -> _ -> visit_action = + function + | Local -> fun _ -> raise Exit + | Global -> fun _ -> raise Exit +;; + +let vexpr (type visit_action) : ('a, 'result, visit_action) context -> 'a -> visit_action = + function + | Local -> fun _ -> raise Exit + | Global -> fun _ -> raise Exit +;; + +let vexpr (type result) (type visit_action) : (unit, result, visit_action) context -> unit -> visit_action = + function + | Local -> fun _ -> raise Exit + | Global -> fun _ -> raise Exit +;; diff --git a/testsuite/tests/typing-gadts/pr6690.ml.principal.reference b/testsuite/tests/typing-gadts/pr6690.ml.principal.reference new file mode 100644 index 0000000000..2ff1624546 --- /dev/null +++ b/testsuite/tests/typing-gadts/pr6690.ml.principal.reference @@ -0,0 +1,23 @@ + +# type 'a visit_action +type insert +type 'a local_visit_action +type ('a, 'result, 'visit_action) context = + Local : ('a, 'a * insert, 'a local_visit_action) context + | Global : ('a, 'a, 'a visit_action) context +# Characters 133-139: + | Global -> fun _ -> raise Exit + ^^^^^^ +Error: This pattern matches values of type (ex#1, ex#1, visit_action) context + but a pattern was expected which matches values of type + (ex#0, ex#0 * insert, visit_action) context + Type ex#1 is not compatible with type ex#0 +# Characters 141-147: + | Global -> fun _ -> raise Exit + ^^^^^^ +Error: This pattern matches values of type (ex#3, ex#3, visit_action) context + but a pattern was expected which matches values of type + (ex#2, ex#2 * insert, visit_action) context + Type ex#3 is not compatible with type ex#2 +# val vexpr : (unit, 'a, 'b) context -> unit -> 'b = <fun> +# diff --git a/testsuite/tests/typing-gadts/pr6690.ml.reference b/testsuite/tests/typing-gadts/pr6690.ml.reference new file mode 100644 index 0000000000..086f3237eb --- /dev/null +++ b/testsuite/tests/typing-gadts/pr6690.ml.reference @@ -0,0 +1,27 @@ + +# type 'a visit_action +type insert +type 'a local_visit_action +type ('a, 'result, 'visit_action) context = + Local : ('a, 'a * insert, 'a local_visit_action) context + | Global : ('a, 'a, 'a visit_action) context +# Characters 11-162: + ..........(type visit_action) : (_, _, visit_action) context -> _ -> visit_action = + function + | Local -> fun _ -> raise Exit + | Global -> fun _ -> raise Exit +Error: This expression has type (ex#0, ex#0 * insert, 'a) context -> 'b -> 'a + but an expression was expected of type + (ex#0, ex#0 * insert, 'a) context -> 'b -> 'a + The type constructor ex#0 would escape its scope +# Characters 11-170: + ..........(type visit_action) : ('a, 'result, visit_action) context -> 'a -> visit_action = + function + | Local -> fun _ -> raise Exit + | Global -> fun _ -> raise Exit +Error: This expression has type (a#0, a#0 * insert, 'a) context -> a#0 -> 'a + but an expression was expected of type + (a#0, a#0 * insert, 'a) context -> a#0 -> 'a + The type constructor a#0 would escape its scope +# val vexpr : (unit, 'a, 'b) context -> unit -> 'b = <fun> +# diff --git a/testsuite/tests/typing-modules-bugs/gatien_baron_20131019_ok.ml b/testsuite/tests/typing-modules-bugs/gatien_baron_20131019_ok.ml index 5887445493..7862083b6a 100644 --- a/testsuite/tests/typing-modules-bugs/gatien_baron_20131019_ok.ml +++ b/testsuite/tests/typing-modules-bugs/gatien_baron_20131019_ok.ml @@ -10,9 +10,14 @@ let f2 (x : (_,_) Hash2.t) = (x : (_,_) Hashtbl.t);; module Std2 = struct module M = struct type t end end;; module Std' = Std2;; -module M' : module type of Std'.M = Std2.M;; +module M' : module type of struct include Std'.M end = Std2.M;; let f3 (x : M'.t) = (x : Std2.M.t);; +(* But this on fails since Std'.M is now Std2.M *) +module M'' : module type of Std'.M = Std2.M;; +(* let f3 (x : M''.t) = (x : Std2.M.t);; *) + + (* original report required Core_kernel: module type S = sig open Core_kernel.Std diff --git a/typing/ctype.ml b/typing/ctype.ml index 78852a439e..c357e0c6c0 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -2052,8 +2052,11 @@ let rec mcomp type_pairs env t1 t2 = | (Tconstr (p1, tl1, _), Tconstr (p2, tl2, _)) -> mcomp_type_decl type_pairs env p1 p2 tl1 tl2 | (Tconstr (p, _, _), _) | (_, Tconstr (p, _, _)) -> - let decl = Env.find_type p env in - if non_aliasable p decl then raise (Unify []) + begin try + let decl = Env.find_type p env in + if non_aliasable p decl then raise (Unify []) + with Not_found -> () + end (* | (Tpackage (p1, n1, tl1), Tpackage (p2, n2, tl2)) when n1 = n2 -> mcomp_list type_pairs env tl1 tl2 diff --git a/typing/env.ml b/typing/env.ml index 7df1566073..27739f7b3a 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -185,7 +185,7 @@ type t = { } and module_components = - (t * Subst.t * Path.t * Types.module_type, module_components_repr) EnvLazy.t + (t * t * Subst.t * Path.t * Types.module_type, module_components_repr) EnvLazy.t and module_components_repr = Structure_comps of structure_components @@ -267,8 +267,8 @@ let components_of_module' = ref ((fun env sub path mty -> assert false) : t -> Subst.t -> Path.t -> module_type -> module_components) let components_of_module_maker' = - ref ((fun (env, sub, path, mty) -> assert false) : - t * Subst.t * Path.t * module_type -> module_components_repr) + ref ((fun (env, cenv, sub, path, mty) -> assert false) : + t * t * Subst.t * Path.t * module_type -> module_components_repr) let components_of_functor_appl' = ref ((fun f p1 p2 -> assert false) : functor_components -> Path.t -> Path.t -> module_components) @@ -927,20 +927,25 @@ let lookup_cltype lid env = (* Iter on an environment (ignoring the body of functors and not yet evaluated structures) *) +let iter_env_cont = ref [] + let iter_env proj1 proj2 f env = + iter_env_cont := []; Ident.iter (fun id (x,_) -> f (Pident id) x) (proj1 env); let rec iter_components path path' mcomps = (* if EnvLazy.is_val mcomps then *) - match EnvLazy.force !components_of_module_maker' mcomps with - Structure_comps comps -> - Tbl.iter - (fun s (d, n) -> f (Pdot (path, s, n)) (Pdot (path', s, n), d)) - (proj2 comps); - Tbl.iter - (fun s (c, n) -> - iter_components (Pdot (path, s, n)) (Pdot (path', s, n)) c) - comps.comp_components - | Functor_comps _ -> () + let cont () = + match EnvLazy.force !components_of_module_maker' mcomps with + Structure_comps comps -> + Tbl.iter + (fun s (d, n) -> f (Pdot (path, s, n)) (Pdot (path', s, n), d)) + (proj2 comps); + Tbl.iter + (fun s (c, n) -> + iter_components (Pdot (path, s, n)) (Pdot (path', s, n)) c) + comps.comp_components + | Functor_comps _ -> () + in iter_env_cont := (path, cont) :: !iter_env_cont in Hashtbl.iter (fun s pso -> @@ -951,7 +956,15 @@ let iter_env proj1 proj2 f env = persistent_structures; Ident.iter (fun id ((path, comps), _) -> iter_components (Pident id) path comps) - env.components + env.components; + List.rev !iter_env_cont + +let run_iter_env l = + iter_env_cont := []; + List.iter (fun c -> c ()) l; + let cont = List.rev !iter_env_cont in + iter_env_cont := []; + cont let iter_types f = iter_env (fun env -> env.types) (fun sc -> sc.comp_types) f @@ -1182,11 +1195,16 @@ let add_to_tbl id decl tbl = try Tbl.find id tbl with Not_found -> [] in Tbl.add id (decl :: decls) tbl -let rec components_of_module env sub path mty = - EnvLazy.create (env, sub, path, mty) +let rec components_of_module env cenv sub path mty = + EnvLazy.create (env, cenv, sub, path, mty) -and components_of_module_maker (env, sub, path, mty) = - (match scrape_alias env mty with +and components_of_module_maker (env, cenv, sub, path, mty) = + try match mty with + Mty_alias path' (*when Ident.persistent (Path.head path')*) -> + EnvLazy.force components_of_module_maker (find_module_descr path' cenv) + | _ -> raise Not_found + with Not_found -> + match scrape_alias env mty with Mty_signature sg -> let c = { comp_values = Tbl.empty; @@ -1197,6 +1215,7 @@ and components_of_module_maker (env, sub, path, mty) = comp_cltypes = Tbl.empty } in let pl, sub, _ = prefix_idents_and_subst path sub sg in let env = ref env in + let cenv = ref cenv in let pos = ref 0 in List.iter2 (fun item path -> match item with @@ -1237,10 +1256,14 @@ and components_of_module_maker (env, sub, path, mty) = let mty' = EnvLazy.create (sub, mty) in c.comp_modules <- Tbl.add (Ident.name id) (mty', !pos) c.comp_modules; - let comps = components_of_module !env sub path mty in + let comps = components_of_module !env !cenv sub path mty in c.comp_components <- Tbl.add (Ident.name id) (comps, !pos) c.comp_components; env := store_module None id (Pident id) md !env !env; + cenv := { !cenv with components = + EnvTbl.add "module" None id + (Pdot (path, Ident.name id, !pos), comps) + !cenv.components !cenv.components }; incr pos | Sig_modtype(id, decl) -> let decl' = Subst.modtype_declaration sub decl in @@ -1279,7 +1302,7 @@ and components_of_module_maker (env, sub, path, mty) = comp_types = Tbl.empty; comp_modules = Tbl.empty; comp_modtypes = Tbl.empty; comp_components = Tbl.empty; comp_classes = Tbl.empty; - comp_cltypes = Tbl.empty }) + comp_cltypes = Tbl.empty } (* Insertion of bindings by identifier + path *) @@ -1391,7 +1414,7 @@ and store_module slot id path md env renv = modules = EnvTbl.add "module" slot id (path, md) env.modules renv.modules; components = EnvTbl.add "module" slot id - (path, components_of_module env Subst.identity path md.md_type) + (path, components_of_module env env Subst.identity path md.md_type) env.components renv.components; summary = Env_module(env.summary, id, md) } @@ -1414,6 +1437,8 @@ and store_cltype slot id path desc env renv = (* Compute the components of a functor application in a path. *) +let components_of_module env = components_of_module env env + let components_of_functor_appl f p1 p2 = try Hashtbl.find f.fcomp_cache p2 diff --git a/typing/env.mli b/typing/env.mli index ed2f6f1c50..cf30cf4cb2 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -39,7 +39,8 @@ type type_descriptions = (* For short-paths *) val iter_types: (Path.t -> Path.t * (type_declaration * type_descriptions) -> unit) -> - t -> unit + t -> (Path.t * (unit -> unit)) list +val run_iter_env: (unit -> unit) list -> (Path.t * (unit -> unit)) list val same_types: t -> t -> bool val used_persistent: unit -> Concr.t val find_shadowed_types: Path.t -> t -> Path.t list diff --git a/typing/printtyp.ml b/typing/printtyp.ml index 920c28b5c1..ba301b2178 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -216,6 +216,8 @@ let apply_subst s1 tyl = type best_path = Paths of Path.t list | Best of Path.t let printing_env = ref Env.empty +let printing_depth = ref 0 +let printing_cont = ref ([] : (unit -> unit) list) let printing_old = ref Env.empty let printing_pers = ref Concr.empty module Path2 = struct @@ -232,7 +234,7 @@ module Path2 = struct | _ -> Pervasives.compare p1 p2 end module PathMap = Map.Make(Path2) -let printing_map = ref (Lazy.from_val PathMap.empty) +let printing_map = ref PathMap.empty let same_type t t' = repr t == repr t' @@ -287,24 +289,26 @@ let set_printing_env env = (* printf "Reset printing_map@."; *) printing_old := env; printing_pers := Env.used_persistent (); - printing_map := lazy begin - (* printf "Recompute printing_map.@."; *) - let map = ref PathMap.empty in + printing_map := PathMap.empty; + printing_depth := 0; + (* printf "Recompute printing_map.@."; *) + let cont () = + ignore ( Env.iter_types (fun p (p', decl) -> let (p1, s1) = normalize_type_path env p' ~cache:true in (* Format.eprintf "%a -> %a = %a@." path p path p' path p1 *) if s1 = Id then try - let r = PathMap.find p1 !map in + let r = PathMap.find p1 !printing_map in match !r with Paths l -> r := Paths (p :: l) - | Best _ -> assert false + | Best p' -> r := Paths [p; p'] (* assert false *) with Not_found -> - map := PathMap.add p1 (ref (Paths [p])) !map) - env; - !map - end + let ps = if Env.is_functor_arg p1 Env.empty then [p;p1] else [p] in + printing_map := PathMap.add p1 (ref (Paths ps)) !printing_map) + env) in + printing_cont := [cont]; end let wrap_printing_env env f = @@ -328,7 +332,8 @@ let is_unambiguous path env = let rec get_best_path r = match !r with - Best p' -> p' + Best p' -> + if fst (path_size p') > !printing_depth then raise Not_found else p' | Paths [] -> raise Not_found | Paths l -> r := Paths []; @@ -347,10 +352,21 @@ let best_type_path p = then (p, Id) else let (p', s) = normalize_type_path !printing_env p in - let p'' = - try get_best_path (PathMap.find p' (Lazy.force !printing_map)) - with Not_found -> p' + let r = + try PathMap.find p' !printing_map + with Not_found -> + let ps = if Env.is_functor_arg p' Env.empty then [p'] else [] in + let r = ref (Paths ps) in + printing_map := PathMap.add p' r !printing_map; + r in + while !printing_cont <> [] && + try ignore (get_best_path r); false with Not_found -> true + do + printing_cont := List.map snd (Env.run_iter_env !printing_cont); + incr printing_depth; + done; + let p'' = try get_best_path r with Not_found -> p' in (* Format.eprintf "%a = %a -> %a@." path p path p' path p''; *) (p'', s) From 2790ba1077778776dd6dfd6a6bd3fe2592adfa1d Mon Sep 17 00:00:00 2001 From: Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> Date: Mon, 8 Dec 2014 08:02:17 +0000 Subject: [PATCH 088/494] revert wrongly commited files git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15639 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- .../gatien_baron_20131019_ok.ml | 7 +- typing/env.ml | 67 ++++++------------- typing/env.mli | 3 +- typing/printtyp.ml | 44 ++++-------- 4 files changed, 37 insertions(+), 84 deletions(-) diff --git a/testsuite/tests/typing-modules-bugs/gatien_baron_20131019_ok.ml b/testsuite/tests/typing-modules-bugs/gatien_baron_20131019_ok.ml index 7862083b6a..5887445493 100644 --- a/testsuite/tests/typing-modules-bugs/gatien_baron_20131019_ok.ml +++ b/testsuite/tests/typing-modules-bugs/gatien_baron_20131019_ok.ml @@ -10,14 +10,9 @@ let f2 (x : (_,_) Hash2.t) = (x : (_,_) Hashtbl.t);; module Std2 = struct module M = struct type t end end;; module Std' = Std2;; -module M' : module type of struct include Std'.M end = Std2.M;; +module M' : module type of Std'.M = Std2.M;; let f3 (x : M'.t) = (x : Std2.M.t);; -(* But this on fails since Std'.M is now Std2.M *) -module M'' : module type of Std'.M = Std2.M;; -(* let f3 (x : M''.t) = (x : Std2.M.t);; *) - - (* original report required Core_kernel: module type S = sig open Core_kernel.Std diff --git a/typing/env.ml b/typing/env.ml index 27739f7b3a..7df1566073 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -185,7 +185,7 @@ type t = { } and module_components = - (t * t * Subst.t * Path.t * Types.module_type, module_components_repr) EnvLazy.t + (t * Subst.t * Path.t * Types.module_type, module_components_repr) EnvLazy.t and module_components_repr = Structure_comps of structure_components @@ -267,8 +267,8 @@ let components_of_module' = ref ((fun env sub path mty -> assert false) : t -> Subst.t -> Path.t -> module_type -> module_components) let components_of_module_maker' = - ref ((fun (env, cenv, sub, path, mty) -> assert false) : - t * t * Subst.t * Path.t * module_type -> module_components_repr) + ref ((fun (env, sub, path, mty) -> assert false) : + t * Subst.t * Path.t * module_type -> module_components_repr) let components_of_functor_appl' = ref ((fun f p1 p2 -> assert false) : functor_components -> Path.t -> Path.t -> module_components) @@ -927,25 +927,20 @@ let lookup_cltype lid env = (* Iter on an environment (ignoring the body of functors and not yet evaluated structures) *) -let iter_env_cont = ref [] - let iter_env proj1 proj2 f env = - iter_env_cont := []; Ident.iter (fun id (x,_) -> f (Pident id) x) (proj1 env); let rec iter_components path path' mcomps = (* if EnvLazy.is_val mcomps then *) - let cont () = - match EnvLazy.force !components_of_module_maker' mcomps with - Structure_comps comps -> - Tbl.iter - (fun s (d, n) -> f (Pdot (path, s, n)) (Pdot (path', s, n), d)) - (proj2 comps); - Tbl.iter - (fun s (c, n) -> - iter_components (Pdot (path, s, n)) (Pdot (path', s, n)) c) - comps.comp_components - | Functor_comps _ -> () - in iter_env_cont := (path, cont) :: !iter_env_cont + match EnvLazy.force !components_of_module_maker' mcomps with + Structure_comps comps -> + Tbl.iter + (fun s (d, n) -> f (Pdot (path, s, n)) (Pdot (path', s, n), d)) + (proj2 comps); + Tbl.iter + (fun s (c, n) -> + iter_components (Pdot (path, s, n)) (Pdot (path', s, n)) c) + comps.comp_components + | Functor_comps _ -> () in Hashtbl.iter (fun s pso -> @@ -956,15 +951,7 @@ let iter_env proj1 proj2 f env = persistent_structures; Ident.iter (fun id ((path, comps), _) -> iter_components (Pident id) path comps) - env.components; - List.rev !iter_env_cont - -let run_iter_env l = - iter_env_cont := []; - List.iter (fun c -> c ()) l; - let cont = List.rev !iter_env_cont in - iter_env_cont := []; - cont + env.components let iter_types f = iter_env (fun env -> env.types) (fun sc -> sc.comp_types) f @@ -1195,16 +1182,11 @@ let add_to_tbl id decl tbl = try Tbl.find id tbl with Not_found -> [] in Tbl.add id (decl :: decls) tbl -let rec components_of_module env cenv sub path mty = - EnvLazy.create (env, cenv, sub, path, mty) +let rec components_of_module env sub path mty = + EnvLazy.create (env, sub, path, mty) -and components_of_module_maker (env, cenv, sub, path, mty) = - try match mty with - Mty_alias path' (*when Ident.persistent (Path.head path')*) -> - EnvLazy.force components_of_module_maker (find_module_descr path' cenv) - | _ -> raise Not_found - with Not_found -> - match scrape_alias env mty with +and components_of_module_maker (env, sub, path, mty) = + (match scrape_alias env mty with Mty_signature sg -> let c = { comp_values = Tbl.empty; @@ -1215,7 +1197,6 @@ and components_of_module_maker (env, cenv, sub, path, mty) = comp_cltypes = Tbl.empty } in let pl, sub, _ = prefix_idents_and_subst path sub sg in let env = ref env in - let cenv = ref cenv in let pos = ref 0 in List.iter2 (fun item path -> match item with @@ -1256,14 +1237,10 @@ and components_of_module_maker (env, cenv, sub, path, mty) = let mty' = EnvLazy.create (sub, mty) in c.comp_modules <- Tbl.add (Ident.name id) (mty', !pos) c.comp_modules; - let comps = components_of_module !env !cenv sub path mty in + let comps = components_of_module !env sub path mty in c.comp_components <- Tbl.add (Ident.name id) (comps, !pos) c.comp_components; env := store_module None id (Pident id) md !env !env; - cenv := { !cenv with components = - EnvTbl.add "module" None id - (Pdot (path, Ident.name id, !pos), comps) - !cenv.components !cenv.components }; incr pos | Sig_modtype(id, decl) -> let decl' = Subst.modtype_declaration sub decl in @@ -1302,7 +1279,7 @@ and components_of_module_maker (env, cenv, sub, path, mty) = comp_types = Tbl.empty; comp_modules = Tbl.empty; comp_modtypes = Tbl.empty; comp_components = Tbl.empty; comp_classes = Tbl.empty; - comp_cltypes = Tbl.empty } + comp_cltypes = Tbl.empty }) (* Insertion of bindings by identifier + path *) @@ -1414,7 +1391,7 @@ and store_module slot id path md env renv = modules = EnvTbl.add "module" slot id (path, md) env.modules renv.modules; components = EnvTbl.add "module" slot id - (path, components_of_module env env Subst.identity path md.md_type) + (path, components_of_module env Subst.identity path md.md_type) env.components renv.components; summary = Env_module(env.summary, id, md) } @@ -1437,8 +1414,6 @@ and store_cltype slot id path desc env renv = (* Compute the components of a functor application in a path. *) -let components_of_module env = components_of_module env env - let components_of_functor_appl f p1 p2 = try Hashtbl.find f.fcomp_cache p2 diff --git a/typing/env.mli b/typing/env.mli index cf30cf4cb2..ed2f6f1c50 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -39,8 +39,7 @@ type type_descriptions = (* For short-paths *) val iter_types: (Path.t -> Path.t * (type_declaration * type_descriptions) -> unit) -> - t -> (Path.t * (unit -> unit)) list -val run_iter_env: (unit -> unit) list -> (Path.t * (unit -> unit)) list + t -> unit val same_types: t -> t -> bool val used_persistent: unit -> Concr.t val find_shadowed_types: Path.t -> t -> Path.t list diff --git a/typing/printtyp.ml b/typing/printtyp.ml index ba301b2178..920c28b5c1 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -216,8 +216,6 @@ let apply_subst s1 tyl = type best_path = Paths of Path.t list | Best of Path.t let printing_env = ref Env.empty -let printing_depth = ref 0 -let printing_cont = ref ([] : (unit -> unit) list) let printing_old = ref Env.empty let printing_pers = ref Concr.empty module Path2 = struct @@ -234,7 +232,7 @@ module Path2 = struct | _ -> Pervasives.compare p1 p2 end module PathMap = Map.Make(Path2) -let printing_map = ref PathMap.empty +let printing_map = ref (Lazy.from_val PathMap.empty) let same_type t t' = repr t == repr t' @@ -289,26 +287,24 @@ let set_printing_env env = (* printf "Reset printing_map@."; *) printing_old := env; printing_pers := Env.used_persistent (); - printing_map := PathMap.empty; - printing_depth := 0; - (* printf "Recompute printing_map.@."; *) - let cont () = - ignore ( + printing_map := lazy begin + (* printf "Recompute printing_map.@."; *) + let map = ref PathMap.empty in Env.iter_types (fun p (p', decl) -> let (p1, s1) = normalize_type_path env p' ~cache:true in (* Format.eprintf "%a -> %a = %a@." path p path p' path p1 *) if s1 = Id then try - let r = PathMap.find p1 !printing_map in + let r = PathMap.find p1 !map in match !r with Paths l -> r := Paths (p :: l) - | Best p' -> r := Paths [p; p'] (* assert false *) + | Best _ -> assert false with Not_found -> - let ps = if Env.is_functor_arg p1 Env.empty then [p;p1] else [p] in - printing_map := PathMap.add p1 (ref (Paths ps)) !printing_map) - env) in - printing_cont := [cont]; + map := PathMap.add p1 (ref (Paths [p])) !map) + env; + !map + end end let wrap_printing_env env f = @@ -332,8 +328,7 @@ let is_unambiguous path env = let rec get_best_path r = match !r with - Best p' -> - if fst (path_size p') > !printing_depth then raise Not_found else p' + Best p' -> p' | Paths [] -> raise Not_found | Paths l -> r := Paths []; @@ -352,21 +347,10 @@ let best_type_path p = then (p, Id) else let (p', s) = normalize_type_path !printing_env p in - let r = - try PathMap.find p' !printing_map - with Not_found -> - let ps = if Env.is_functor_arg p' Env.empty then [p'] else [] in - let r = ref (Paths ps) in - printing_map := PathMap.add p' r !printing_map; - r + let p'' = + try get_best_path (PathMap.find p' (Lazy.force !printing_map)) + with Not_found -> p' in - while !printing_cont <> [] && - try ignore (get_best_path r); false with Not_found -> true - do - printing_cont := List.map snd (Env.run_iter_env !printing_cont); - incr printing_depth; - done; - let p'' = try get_best_path r with Not_found -> p' in (* Format.eprintf "%a = %a -> %a@." path p path p' path p''; *) (p'', s) From 6216eed5777c90f3f016844181df9cf7e8801c2a Mon Sep 17 00:00:00 2001 From: Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> Date: Mon, 8 Dec 2014 08:12:09 +0000 Subject: [PATCH 089/494] Fix PR#6680 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15641 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + typing/parmatch.ml | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index d8cdae7482..a3f4927636 100644 --- a/Changes +++ b/Changes @@ -9,6 +9,7 @@ OCaml 4.02.2: (Leo White, review by Gabriel Scherer) - ocamlbuild on cygwin cannot find ocamlfind (user 'algoriddle') +- PR#6680: Missing parentheses when printing polymorphic variant value in warning - PR#6690: Uncaught exception (Not_found) with (wrong) wildcard or unification type variable in place of a local abstract type diff --git a/typing/parmatch.ml b/typing/parmatch.ml index 6732be7a92..acffc40b6f 100644 --- a/typing/parmatch.ml +++ b/typing/parmatch.ml @@ -210,7 +210,8 @@ and pretty_cdr ppf v = match v.pat_desc with | _ -> pretty_val ppf v and pretty_arg ppf v = match v.pat_desc with -| Tpat_construct (_,_,_::_) -> fprintf ppf "(%a)" pretty_val v +| Tpat_construct (_,_,_::_) +| Tpat_variant (_, Some _, _) -> fprintf ppf "(%a)" pretty_val v | _ -> pretty_val ppf v and pretty_or ppf v = match v.pat_desc with From 328959848e0154b6d82a3bbdb4e5e05b85735bea Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 9 Dec 2014 17:21:31 +0000 Subject: [PATCH 090/494] fix an incorrect assertion in the documentation of Gc.finalise git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15642 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- stdlib/gc.mli | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/stdlib/gc.mli b/stdlib/gc.mli index f86a1e687a..14088c1648 100644 --- a/stdlib/gc.mli +++ b/stdlib/gc.mli @@ -221,9 +221,10 @@ val finalise : ('a -> unit) -> 'a -> unit Anything reachable from the closure of finalisation functions is considered reachable, so the following code will not work as expected: - - [ let v = ... in Gc.finalise (fun x -> ...) v ] + - [ let v = ... in Gc.finalise (fun x -> ... v ...) v ] - Instead you should write: + Instead you should make sure that [v] is not in the closure of + the finalisation function by writing: - [ let f = fun x -> ... ;; let v = ... in Gc.finalise f v ] From 588af24a1873393787bd66b349b08cdda18839e0 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 9 Dec 2014 21:45:41 +0000 Subject: [PATCH 091/494] fix a bug where some GC counters are not updated when the GC is called explicity from OCaml git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15643 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- byterun/minor_gc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/byterun/minor_gc.c b/byterun/minor_gc.c index b15d1e4469..2f0ed344cb 100644 --- a/byterun/minor_gc.c +++ b/byterun/minor_gc.c @@ -226,8 +226,10 @@ void caml_oldify_mopup (void) void caml_empty_minor_heap (void) { value **r; + uintnat prev_alloc_words; if (caml_young_ptr != caml_young_end){ + prev_alloc_words = caml_allocated_words; caml_in_minor_collection = 1; caml_gc_message (0x02, "<", 0); caml_oldify_local_roots(); @@ -252,6 +254,8 @@ void caml_empty_minor_heap (void) clear_table (&caml_weak_ref_table); caml_gc_message (0x02, ">", 0); caml_in_minor_collection = 0; + caml_stat_promoted_words += caml_allocated_words - prev_alloc_words; + ++ caml_stat_minor_collections; } caml_final_empty_young (); #ifdef DEBUG @@ -271,12 +275,8 @@ void caml_empty_minor_heap (void) */ CAMLexport void caml_minor_collection (void) { - intnat prev_alloc_words = caml_allocated_words; - caml_empty_minor_heap (); - caml_stat_promoted_words += caml_allocated_words - prev_alloc_words; - ++ caml_stat_minor_collections; caml_major_collection_slice (0); caml_force_major_slice = 0; From d7a486d4535f54e459a0b068652875ce85c5a046 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Fri, 12 Dec 2014 17:11:45 +0000 Subject: [PATCH 092/494] apply GPR123: fix stupid bug in opttoploop git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15648 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- toplevel/opttoploop.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toplevel/opttoploop.ml b/toplevel/opttoploop.ml index 9e9e3d7447..d21860a871 100644 --- a/toplevel/opttoploop.ml +++ b/toplevel/opttoploop.ml @@ -136,7 +136,7 @@ let load_lambda ppf (size, lam) = else Filename.temp_file ("caml" ^ !phrase_name) ext_dll in let fn = Filename.chop_extension dll in - Asmgen.compile_implementation ~toplevel:need_symbol fn ppf (size, lam); + Asmgen.compile_implementation ~toplevel:need_symbol fn ppf (size, slam); Asmlink.call_linker_shared [fn ^ ext_obj] dll; Sys.remove (fn ^ ext_obj); From 7e557c21342a476a5f9bee91f870f4d49a8591c7 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 14 Dec 2014 21:53:12 +0000 Subject: [PATCH 093/494] update .gitignore git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15674 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- .gitignore | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/.gitignore b/.gitignore index 6c66ecc5a7..62c0f7076d 100644 --- a/.gitignore +++ b/.gitignore @@ -2161,6 +2161,31 @@ /testsuite/tests/tool-debugger/find-artifacts/compiler-libs /testsuite/tests/tool-debugger/find-artifacts/out +# /testsuite/tests/tool-debugger/no_debug_event/ +/testsuite/tests/tool-debugger/no_debug_event/*.o +/testsuite/tests/tool-debugger/no_debug_event/*.a +/testsuite/tests/tool-debugger/no_debug_event/*.so +/testsuite/tests/tool-debugger/no_debug_event/*.obj +/testsuite/tests/tool-debugger/no_debug_event/*.lib +/testsuite/tests/tool-debugger/no_debug_event/*.dll +/testsuite/tests/tool-debugger/no_debug_event/*.cm[ioxat] +/testsuite/tests/tool-debugger/no_debug_event/*.cmx[as] +/testsuite/tests/tool-debugger/no_debug_event/*.cmti +/testsuite/tests/tool-debugger/no_debug_event/*.annot +/testsuite/tests/tool-debugger/no_debug_event/*.result +/testsuite/tests/tool-debugger/no_debug_event/*.byte +/testsuite/tests/tool-debugger/no_debug_event/*.native +/testsuite/tests/tool-debugger/no_debug_event/program +/testsuite/tests/tool-debugger/no_debug_event/*.exe +/testsuite/tests/tool-debugger/no_debug_event/*.exe.manifest +/testsuite/tests/tool-debugger/no_debug_event/.depend +/testsuite/tests/tool-debugger/no_debug_event/.depend.nt +/testsuite/tests/tool-debugger/no_debug_event/.DS_Store +/testsuite/tests/tool-debugger/no_debug_event/compiler-libs +/testsuite/tests/tool-debugger/no_debug_event/out +/testsuite/tests/tool-debugger/no_debug_event/c +/testsuite/tests/tool-debugger/no_debug_event/c.exe + # /testsuite/tests/tool-lexyacc/ /testsuite/tests/tool-lexyacc/*.o /testsuite/tests/tool-lexyacc/*.a From 3840c30ac86f5486a8d071b202fe8a8b5525f87e Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Fri, 19 Dec 2014 17:34:53 +0000 Subject: [PATCH 094/494] Change 'List' to 'ListLabels' in the ListLabels documentation. From: Jeremy Yallop <yallop@gmail.com> git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15688 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- stdlib/listLabels.mli | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/stdlib/listLabels.mli b/stdlib/listLabels.mli index 8cf6514718..7404fd00b9 100644 --- a/stdlib/listLabels.mli +++ b/stdlib/listLabels.mli @@ -50,7 +50,7 @@ val append : 'a list -> 'a list -> 'a list operator is not tail-recursive either. *) val rev_append : 'a list -> 'a list -> 'a list -(** [List.rev_append l1 l2] reverses [l1] and concatenates it to [l2]. +(** [ListLabels.rev_append l1 l2] reverses [l1] and concatenates it to [l2]. This is equivalent to {!ListLabels.rev}[ l1 @ l2], but [rev_append] is tail-recursive and more efficient. *) @@ -69,40 +69,40 @@ val flatten : 'a list list -> 'a list val iter : f:('a -> unit) -> 'a list -> unit -(** [List.iter f [a1; ...; an]] applies function [f] in turn to +(** [ListLabels.iter f [a1; ...; an]] applies function [f] in turn to [a1; ...; an]. It is equivalent to [begin f a1; f a2; ...; f an; () end]. *) val iteri : f:(int -> 'a -> unit) -> 'a list -> unit -(** Same as {!List.iter}, but the function is applied to the index of +(** Same as {!ListLabels.iter}, but the function is applied to the index of the element as first argument (counting from 0), and the element itself as second argument. @since 4.00.0 *) val map : f:('a -> 'b) -> 'a list -> 'b list -(** [List.map f [a1; ...; an]] applies function [f] to [a1, ..., an], +(** [ListLabels.map f [a1; ...; an]] applies function [f] to [a1, ..., an], and builds the list [[f a1; ...; f an]] with the results returned by [f]. Not tail-recursive. *) val mapi : f:(int -> 'a -> 'b) -> 'a list -> 'b list -(** Same as {!List.map}, but the function is applied to the index of +(** Same as {!ListLabels.map}, but the function is applied to the index of the element as first argument (counting from 0), and the element itself as second argument. @since 4.00.0 *) val rev_map : f:('a -> 'b) -> 'a list -> 'b list -(** [List.rev_map f l] gives the same result as +(** [ListLabels.rev_map f l] gives the same result as {!ListLabels.rev}[ (]{!ListLabels.map}[ f l)], but is tail-recursive and more efficient. *) val fold_left : f:('a -> 'b -> 'a) -> init:'a -> 'b list -> 'a -(** [List.fold_left f a [b1; ...; bn]] is +(** [ListLabels.fold_left f a [b1; ...; bn]] is [f (... (f (f a b1) b2) ...) bn]. *) val fold_right : f:('a -> 'b -> 'b) -> 'a list -> init:'b -> 'b -(** [List.fold_right f [a1; ...; an] b] is +(** [ListLabels.fold_right f [a1; ...; an] b] is [f a1 (f a2 (... (f an b) ...))]. Not tail-recursive. *) @@ -110,32 +110,32 @@ val fold_right : f:('a -> 'b -> 'b) -> 'a list -> init:'b -> 'b val iter2 : f:('a -> 'b -> unit) -> 'a list -> 'b list -> unit -(** [List.iter2 f [a1; ...; an] [b1; ...; bn]] calls in turn +(** [ListLabels.iter2 f [a1; ...; an] [b1; ...; bn]] calls in turn [f a1 b1; ...; f an bn]. Raise [Invalid_argument] if the two lists have different lengths. *) val map2 : f:('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list -(** [List.map2 f [a1; ...; an] [b1; ...; bn]] is +(** [ListLabels.map2 f [a1; ...; an] [b1; ...; bn]] is [[f a1 b1; ...; f an bn]]. Raise [Invalid_argument] if the two lists have different lengths. Not tail-recursive. *) val rev_map2 : f:('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list -(** [List.rev_map2 f l1 l2] gives the same result as +(** [ListLabels.rev_map2 f l1 l2] gives the same result as {!ListLabels.rev}[ (]{!ListLabels.map2}[ f l1 l2)], but is tail-recursive and more efficient. *) val fold_left2 : f:('a -> 'b -> 'c -> 'a) -> init:'a -> 'b list -> 'c list -> 'a -(** [List.fold_left2 f a [b1; ...; bn] [c1; ...; cn]] is +(** [ListLabels.fold_left2 f a [b1; ...; bn] [c1; ...; cn]] is [f (... (f (f a b1 c1) b2 c2) ...) bn cn]. Raise [Invalid_argument] if the two lists have different lengths. *) val fold_right2 : f:('a -> 'b -> 'c -> 'c) -> 'a list -> 'b list -> init:'c -> 'c -(** [List.fold_right2 f [a1; ...; an] [b1; ...; bn] c] is +(** [ListLabels.fold_right2 f [a1; ...; an] [b1; ...; bn] c] is [f a1 b1 (f a2 b2 (... (f an bn c) ...))]. Raise [Invalid_argument] if the two lists have different lengths. Not tail-recursive. *) @@ -259,7 +259,7 @@ val sort : cmp:('a -> 'a -> int) -> 'a list -> 'a list a complete specification). For example, {!Pervasives.compare} is a suitable comparison function. The resulting list is sorted in increasing order. - [List.sort] is guaranteed to run in constant heap space + [ListLabels.sort] is guaranteed to run in constant heap space (in addition to the size of the result list) and logarithmic stack space. @@ -277,8 +277,8 @@ val stable_sort : cmp:('a -> 'a -> int) -> 'a list -> 'a list *) val fast_sort : cmp:('a -> 'a -> int) -> 'a list -> 'a list -(** Same as {!List.sort} or {!List.stable_sort}, whichever is faster - on typical input. *) +(** Same as {!ListLabels.sort} or {!ListLabels.stable_sort}, whichever is + faster on typical input. *) val merge : cmp:('a -> 'a -> int) -> 'a list -> 'a list -> 'a list (** Merge two lists: From c0b58581eeb61cc50c28596cdf91a60ecaab2412 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Fri, 19 Dec 2014 17:34:55 +0000 Subject: [PATCH 095/494] Change 'Array' to 'ArrayLabels' in the ArrayLabels documentation. From: Jeremy Yallop <yallop@gmail.com> git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15689 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- stdlib/arrayLabels.mli | 62 +++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/stdlib/arrayLabels.mli b/stdlib/arrayLabels.mli index 0d046378ad..f42853c8a1 100644 --- a/stdlib/arrayLabels.mli +++ b/stdlib/arrayLabels.mli @@ -17,24 +17,24 @@ external length : 'a array -> int = "%array_length" (** Return the length (number of elements) of the given array. *) external get : 'a array -> int -> 'a = "%array_safe_get" -(** [Array.get a n] returns the element number [n] of array [a]. +(** [ArrayLabels.get a n] returns the element number [n] of array [a]. The first element has number 0. - The last element has number [Array.length a - 1]. - You can also write [a.(n)] instead of [Array.get a n]. + The last element has number [ArrayLabels.length a - 1]. + You can also write [a.(n)] instead of [ArrayLabels.get a n]. Raise [Invalid_argument "index out of bounds"] - if [n] is outside the range 0 to [(Array.length a - 1)]. *) + if [n] is outside the range 0 to [(ArrayLabels.length a - 1)]. *) external set : 'a array -> int -> 'a -> unit = "%array_safe_set" -(** [Array.set a n x] modifies array [a] in place, replacing +(** [ArrayLabels.set a n x] modifies array [a] in place, replacing element number [n] with [x]. - You can also write [a.(n) <- x] instead of [Array.set a n x]. + You can also write [a.(n) <- x] instead of [ArrayLabels.set a n x]. Raise [Invalid_argument "index out of bounds"] - if [n] is outside the range 0 to [Array.length a - 1]. *) + if [n] is outside the range 0 to [ArrayLabels.length a - 1]. *) external make : int -> 'a -> 'a array = "caml_make_vect" -(** [Array.make n x] returns a fresh array of length [n], +(** [ArrayLabels.make n x] returns a fresh array of length [n], initialized with [x]. All the elements of this new array are initially physically equal to [x] (in the sense of the [==] predicate). @@ -51,9 +51,9 @@ external create : int -> 'a -> 'a array = "caml_make_vect" (** @deprecated [ArrayLabels.create] is an alias for {!ArrayLabels.make}. *) val init : int -> f:(int -> 'a) -> 'a array -(** [Array.init n f] returns a fresh array of length [n], +(** [ArrayLabels.init n f] returns a fresh array of length [n], with element number [i] initialized to the result of [f i]. - In other terms, [Array.init n f] tabulates the results of [f] + In other terms, [ArrayLabels.init n f] tabulates the results of [f] applied to the integers [0] to [n-1]. Raise [Invalid_argument] if [n < 0] or [n > Sys.max_array_length]. @@ -61,7 +61,7 @@ val init : int -> f:(int -> 'a) -> 'a array size is only [Sys.max_array_length / 2].*) val make_matrix : dimx:int -> dimy:int -> 'a -> 'a array array -(** [Array.make_matrix dimx dimy e] returns a two-dimensional array +(** [ArrayLabels.make_matrix dimx dimy e] returns a two-dimensional array (an array of arrays) with first dimension [dimx] and second dimension [dimy]. All the elements of this new matrix are initially physically equal to [e]. @@ -79,27 +79,27 @@ val create_matrix : dimx:int -> dimy:int -> 'a -> 'a array array {!ArrayLabels.make_matrix}. *) val append : 'a array -> 'a array -> 'a array -(** [Array.append v1 v2] returns a fresh array containing the +(** [ArrayLabels.append v1 v2] returns a fresh array containing the concatenation of the arrays [v1] and [v2]. *) val concat : 'a array list -> 'a array -(** Same as [Array.append], but concatenates a list of arrays. *) +(** Same as [ArrayLabels.append], but concatenates a list of arrays. *) val sub : 'a array -> pos:int -> len:int -> 'a array -(** [Array.sub a start len] returns a fresh array of length [len], +(** [ArrayLabels.sub a start len] returns a fresh array of length [len], containing the elements number [start] to [start + len - 1] of array [a]. Raise [Invalid_argument "Array.sub"] if [start] and [len] do not designate a valid subarray of [a]; that is, if - [start < 0], or [len < 0], or [start + len > Array.length a]. *) + [start < 0], or [len < 0], or [start + len > ArrayLabels.length a]. *) val copy : 'a array -> 'a array -(** [Array.copy a] returns a copy of [a], that is, a fresh array +(** [ArrayLabels.copy a] returns a copy of [a], that is, a fresh array containing the same elements as [a]. *) val fill : 'a array -> pos:int -> len:int -> 'a -> unit -(** [Array.fill a ofs len x] modifies the array [a] in place, +(** [ArrayLabels.fill a ofs len x] modifies the array [a] in place, storing [x] in elements number [ofs] to [ofs + len - 1]. Raise [Invalid_argument "Array.fill"] if [ofs] and [len] do not @@ -108,7 +108,7 @@ val fill : 'a array -> pos:int -> len:int -> 'a -> unit val blit : src:'a array -> src_pos:int -> dst:'a array -> dst_pos:int -> len:int -> unit -(** [Array.blit v1 o1 v2 o2 len] copies [len] elements +(** [ArrayLabels.blit v1 o1 v2 o2 len] copies [len] elements from array [v1], starting at element number [o1], to array [v2], starting at element number [o2]. It works correctly even if [v1] and [v2] are the same array, and the source and @@ -119,21 +119,21 @@ val blit : designate a valid subarray of [v2]. *) val to_list : 'a array -> 'a list -(** [Array.to_list a] returns the list of all the elements of [a]. *) +(** [ArrayLabels.to_list a] returns the list of all the elements of [a]. *) val of_list : 'a list -> 'a array -(** [Array.of_list l] returns a fresh array containing the elements +(** [ArrayLabels.of_list l] returns a fresh array containing the elements of [l]. *) val iter : f:('a -> unit) -> 'a array -> unit -(** [Array.iter f a] applies function [f] in turn to all +(** [ArrayLabels.iter f a] applies function [f] in turn to all the elements of [a]. It is equivalent to - [f a.(0); f a.(1); ...; f a.(Array.length a - 1); ()]. *) + [f a.(0); f a.(1); ...; f a.(ArrayLabels.length a - 1); ()]. *) val map : f:('a -> 'b) -> 'a array -> 'b array -(** [Array.map f a] applies function [f] to all the elements of [a], +(** [ArrayLabels.map f a] applies function [f] to all the elements of [a], and builds an array with the results returned by [f]: - [[| f a.(0); f a.(1); ...; f a.(Array.length a - 1) |]]. *) + [[| f a.(0); f a.(1); ...; f a.(ArrayLabels.length a - 1) |]]. *) val iteri : f:(int -> 'a -> unit) -> 'a array -> unit (** Same as {!ArrayLabels.iter}, but the @@ -146,12 +146,12 @@ val mapi : f:(int -> 'a -> 'b) -> 'a array -> 'b array and the element itself as second argument. *) val fold_left : f:('a -> 'b -> 'a) -> init:'a -> 'b array -> 'a -(** [Array.fold_left f x a] computes +(** [ArrayLabels.fold_left f x a] computes [f (... (f (f x a.(0)) a.(1)) ...) a.(n-1)], where [n] is the length of the array [a]. *) val fold_right : f:('b -> 'a -> 'a) -> 'b array -> init:'a -> 'a -(** [Array.fold_right f a x] computes +(** [ArrayLabels.fold_right f a x] computes [f a.(0) (f a.(1) ( ... (f a.(n-1) x) ...))], where [n] is the length of the array [a]. *) @@ -166,9 +166,9 @@ val sort : cmp:('a -> 'a -> int) -> 'a array -> unit and a negative integer if the first is smaller (see below for a complete specification). For example, {!Pervasives.compare} is a suitable comparison function, provided there are no floating-point - NaN values in the data. After calling [Array.sort], the + NaN values in the data. After calling [ArrayLabels.sort], the array is sorted in place in increasing order. - [Array.sort] is guaranteed to run in constant heap space + [ArrayLabels.sort] is guaranteed to run in constant heap space and (at most) logarithmic stack space. The current implementation uses Heap Sort. It runs in constant @@ -180,7 +180,7 @@ val sort : cmp:('a -> 'a -> int) -> 'a array -> unit - [cmp x y] > 0 if and only if [cmp y x] < 0 - if [cmp x y] >= 0 and [cmp y z] >= 0 then [cmp x z] >= 0 - When [Array.sort] returns, [a] contains the same elements as before, + When [ArrayLabels.sort] returns, [a] contains the same elements as before, reordered in such a way that for all i and j valid indices of [a] : - [cmp a.(i) a.(j)] >= 0 if and only if i >= j *) @@ -196,8 +196,8 @@ val stable_sort : cmp:('a -> 'a -> int) -> 'a array -> unit *) val fast_sort : cmp:('a -> 'a -> int) -> 'a array -> unit -(** Same as {!Array.sort} or {!Array.stable_sort}, whichever is faster - on typical input. +(** Same as {!ArrayLabels.sort} or {!ArrayLabels.stable_sort}, whichever is + faster on typical input. *) From ddd90c984e0eddbf89eaea7bd9ce3eae6e5a61d5 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Fri, 19 Dec 2014 17:34:57 +0000 Subject: [PATCH 096/494] Add @since tags on stdlib functions new in 4.02 make_float was added in 4.02 Buffer.(to_bytes, add_bytes, add_subbytes) were added in 4.02. BytesLabels was added in 4.02. Digest.(bytes, subbytes) were added in 4.02. Marshal.(to_bytes, from_bytes) were added in 4.02. various Pervasives functions were added in 4.02: print_bytes prerr_bytes output_bytes output_substring really_input_string Printexc.(backtrace_slots, raw_backtrace_slot) were added in 4.02. Scanf.(ksscanf, kfscanf) were added in 4.02. Stream.of_bytes was added in 4.02. From: Jeremy Yallop <yallop@gmail.com> git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15690 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- stdlib/array.mli | 3 ++- stdlib/buffer.mli | 11 +++++++---- stdlib/bytesLabels.mli | 4 +++- stdlib/digest.mli | 6 ++++-- stdlib/marshal.mli | 6 ++++-- stdlib/pervasives.mli | 15 ++++++++++----- stdlib/printexc.mli | 4 ++++ stdlib/scanf.mli | 6 ++++-- stdlib/stream.mli | 3 ++- 9 files changed, 40 insertions(+), 18 deletions(-) diff --git a/stdlib/array.mli b/stdlib/array.mli index 99de0c806e..7580f7e754 100644 --- a/stdlib/array.mli +++ b/stdlib/array.mli @@ -154,7 +154,8 @@ val fold_right : ('b -> 'a -> 'a) -> 'b array -> 'a -> 'a external make_float: int -> float array = "caml_make_float_vect" (** [Array.make_float n] returns a fresh float array of length [n], - with uninitialized data. *) + with uninitialized data. + @since 4.02 *) (** {6 Sorting} *) diff --git a/stdlib/buffer.mli b/stdlib/buffer.mli index e7ce8b9999..962f6bc7fa 100644 --- a/stdlib/buffer.mli +++ b/stdlib/buffer.mli @@ -38,11 +38,12 @@ val create : int -> t val contents : t -> string (** Return a copy of the current contents of the buffer. - The buffer itself is unchanged. *) + The buffer itself is unchanged. *) val to_bytes : t -> bytes (** Return a copy of the current contents of the buffer. - The buffer itself is unchanged. *) + The buffer itself is unchanged. + @since 4.02 *) val sub : t -> int -> int -> string (** [Buffer.sub b off len] returns (a copy of) the bytes from the @@ -85,7 +86,8 @@ val add_string : t -> string -> unit (** [add_string b s] appends the string [s] at the end of the buffer [b]. *) val add_bytes : t -> bytes -> unit -(** [add_string b s] appends the string [s] at the end of the buffer [b]. *) +(** [add_string b s] appends the string [s] at the end of the buffer [b]. + @since 4.02 *) val add_substring : t -> string -> int -> int -> unit (** [add_substring b s ofs len] takes [len] characters from offset @@ -93,7 +95,8 @@ val add_substring : t -> string -> int -> int -> unit val add_subbytes : t -> bytes -> int -> int -> unit (** [add_substring b s ofs len] takes [len] characters from offset - [ofs] in byte sequence [s] and appends them at the end of the buffer [b]. *) + [ofs] in byte sequence [s] and appends them at the end of the buffer [b]. + @since 4.02 *) val add_substitute : t -> (string -> string) -> string -> unit (** [add_substitute b f s] appends the string pattern [s] at the end diff --git a/stdlib/bytesLabels.mli b/stdlib/bytesLabels.mli index d48d95f5c7..04043182f4 100644 --- a/stdlib/bytesLabels.mli +++ b/stdlib/bytesLabels.mli @@ -11,7 +11,9 @@ (* *) (***********************************************************************) -(** Byte sequence operations. *) +(** Byte sequence operations. + @since 4.02.0 + *) external length : bytes -> int = "%string_length" (** Return the length (number of bytes) of the argument. *) diff --git a/stdlib/digest.mli b/stdlib/digest.mli index 583d2a46b0..9227cd7de8 100644 --- a/stdlib/digest.mli +++ b/stdlib/digest.mli @@ -37,7 +37,8 @@ val string : string -> t (** Return the digest of the given string. *) val bytes : bytes -> t -(** Return the digest of the given byte sequence. *) +(** Return the digest of the given byte sequence. + @since 4.02.0 *) val substring : string -> int -> int -> t (** [Digest.substring s ofs len] returns the digest of the substring @@ -45,7 +46,8 @@ val substring : string -> int -> int -> t val subbytes : bytes -> int -> int -> t (** [Digest.subbytes s ofs len] returns the digest of the subsequence - of [s] starting at index [ofs] and containing [len] bytes. *) + of [s] starting at index [ofs] and containing [len] bytes. + @since 4.02.0 *) external channel : in_channel -> int -> t = "caml_md5_chan" (** If [len] is nonnegative, [Digest.channel ic len] reads [len] diff --git a/stdlib/marshal.mli b/stdlib/marshal.mli index 9dfdd1624c..4f0ed49b78 100644 --- a/stdlib/marshal.mli +++ b/stdlib/marshal.mli @@ -114,7 +114,8 @@ external to_bytes : (** [Marshal.to_bytes v flags] returns a byte sequence containing the representation of [v]. The [flags] argument has the same meaning as for - {!Marshal.to_channel}. *) + {!Marshal.to_channel}. + @since 4.02.0 *) external to_string : 'a -> extern_flags list -> string = "caml_output_value_to_string" @@ -141,7 +142,8 @@ val from_bytes : bytes -> int -> 'a like {!Marshal.from_channel} does, except that the byte representation is not read from a channel, but taken from the byte sequence [buff], starting at position [ofs]. - The byte sequence is not mutated. *) + The byte sequence is not mutated. + @since 4.02.0 *) val from_string : string -> int -> 'a (** Same as [from_bytes] but take a string as argument instead of a diff --git a/stdlib/pervasives.mli b/stdlib/pervasives.mli index 6413829146..4d63a41ef5 100644 --- a/stdlib/pervasives.mli +++ b/stdlib/pervasives.mli @@ -594,7 +594,8 @@ val print_string : string -> unit (** Print a string on standard output. *) val print_bytes : bytes -> unit -(** Print a byte sequence on standard output. *) +(** Print a byte sequence on standard output. + @since 4.02.0 *) val print_int : int -> unit (** Print an integer, in decimal, on standard output. *) @@ -621,7 +622,8 @@ val prerr_string : string -> unit (** Print a string on standard error. *) val prerr_bytes : bytes -> unit -(** Print a byte sequence on standard error. *) +(** Print a byte sequence on standard error. + @since 4.02.0 *) val prerr_int : int -> unit (** Print an integer, in decimal, on standard error. *) @@ -708,7 +710,8 @@ val output_string : out_channel -> string -> unit (** Write the string on the given output channel. *) val output_bytes : out_channel -> bytes -> unit -(** Write the byte sequence on the given output channel. *) +(** Write the byte sequence on the given output channel. + @since 4.02.0 *) val output : out_channel -> bytes -> int -> int -> unit (** [output oc buf pos len] writes [len] characters from byte sequence [buf], @@ -718,7 +721,8 @@ val output : out_channel -> bytes -> int -> int -> unit val output_substring : out_channel -> string -> int -> int -> unit (** Same as [output] but take a string as argument instead of - a byte sequence. *) + a byte sequence. + @since 4.02.0 *) val output_byte : out_channel -> int -> unit (** Write one 8-bit integer (as the single character with that code) @@ -838,7 +842,8 @@ val really_input_string : in_channel -> int -> string (** [really_input_string ic len] reads [len] characters from channel [ic] and returns them in a new string. Raise [End_of_file] if the end of file is reached before [len] - characters have been read. *) + characters have been read. + @since 4.02.0 *) val input_byte : in_channel -> int (** Same as {!Pervasives.input_char}, but return the 8-bit integer representing diff --git a/stdlib/printexc.mli b/stdlib/printexc.mli index 12e021c234..c347b9915b 100644 --- a/stdlib/printexc.mli +++ b/stdlib/printexc.mli @@ -181,6 +181,8 @@ val backtrace_slots : raw_backtrace -> backtrace_slot array option debug information ([-g]) - the program is a bytecode program that has not been linked with debug information enabled ([ocamlc -g]) + + @since 4.02.0 *) type location = { @@ -247,6 +249,8 @@ type raw_backtrace_slot elements are equal, then they represent the same source location (the converse is not necessarily true in presence of inlining, for example). + + @since 4.02.0 *) val raw_backtrace_length : raw_backtrace -> int diff --git a/stdlib/scanf.mli b/stdlib/scanf.mli index 297d6f2d5a..212aa00b75 100644 --- a/stdlib/scanf.mli +++ b/stdlib/scanf.mli @@ -488,12 +488,14 @@ val kscanf : val ksscanf : string -> (Scanning.in_channel -> exn -> 'd) -> ('a, 'b, 'c, 'd) scanner -(** Same as {!Scanf.kscanf} but reads from the given string. *) +(** Same as {!Scanf.kscanf} but reads from the given string. + @since 4.02.0 *) val kfscanf : Pervasives.in_channel -> (Scanning.in_channel -> exn -> 'd) -> ('a, 'b, 'c, 'd) scanner -(** Same as {!Scanf.kscanf}, but reads from the given regular input channel. *) +(** Same as {!Scanf.kscanf}, but reads from the given regular input channel. + @since 4.02.0 *) (** {6 Reading format strings from input} *) diff --git a/stdlib/stream.mli b/stdlib/stream.mli index 85a846102c..1957cf60d2 100644 --- a/stdlib/stream.mli +++ b/stdlib/stream.mli @@ -47,7 +47,8 @@ val of_string : string -> char t (** Return the stream of the characters of the string parameter. *) val of_bytes : bytes -> char t -(** Return the stream of the characters of the bytes parameter. *) +(** Return the stream of the characters of the bytes parameter. + @since 4.02.0 *) val of_channel : in_channel -> char t (** Return the stream of the characters read from the input channel. *) From 79d804d4580cc8ab084834cc97346bd47af51a99 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sat, 20 Dec 2014 22:21:31 +0000 Subject: [PATCH 097/494] ocamlbuild: refine circular dependency errors When reporting a circular dependency, refine the printed filenames to those that are really part of the cycle -- instead of those that happened to be traversed during the DFS that found a cycle. This gives much more readable error messages. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15691 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- ocamlbuild/main.ml | 4 ++-- ocamlbuild/ocaml_dependencies.ml | 41 +++++++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/ocamlbuild/main.ml b/ocamlbuild/main.ml index 0f502c75e5..6a26b54279 100644 --- a/ocamlbuild/main.ml +++ b/ocamlbuild/main.ml @@ -263,10 +263,10 @@ let proceed () = else () with - | Ocaml_dependencies.Circular_dependencies(seen, p) -> + | Ocaml_dependencies.Circular_dependencies(cycle, p) -> raise (Exit_build_error - (sbprintf "@[<2>Circular dependencies: %S already seen in@ %a@]@." p pp_l seen)) + (sbprintf "@[<2>Circular dependencies: %S already seen in@ %a@]@." p pp_l cycle)) ;; open Exit_codes;; diff --git a/ocamlbuild/ocaml_dependencies.ml b/ocamlbuild/ocaml_dependencies.ml index de2c11fab4..3997f247e6 100644 --- a/ocamlbuild/ocaml_dependencies.ml +++ b/ocamlbuild/ocaml_dependencies.ml @@ -194,11 +194,49 @@ module Make (I : INPUT) = struct let dependencies_of x = try SMap.find x !*dependencies with Not_found -> Resources.empty in + let refine_cycle files starting_file = + (* We are looking for a cycle starting from [fn], included in + [files]; we'll simply use a DFS which builds a path until it + finds a circularity. + + Note that if there is at least one cycle going through [fn], + calling [dfs path fn] will return it no matter what [path] is + (it may just not be the shortest possible cycle). This means + that if [dfs path fn] returns [None], [fn] is a dead-end that + should never be explored again. + *) + let dead_ends = ref Resources.empty in + let rec dfs path fn = + let through_dep f = function + | Some _ as cycle -> cycle + | None -> + if List.mem f path + then (* we have found a cycle *) + Some (List.rev path) + else if not (List.mem f files) + then + (* the neighbor is not in the set of paths known to have a cycle *) + None + else + (* look for cycles going through this neighbor *) + dfs (f :: path) f + in + if Resources.mem fn !dead_ends then None + else match Resources.fold through_dep (dependencies_of fn) None with + | Some _ as cycle -> cycle + | None -> dead_ends := Resources.add fn !dead_ends; None + in + match dfs [] starting_file with + | None -> files + | Some cycle -> cycle + in + let needed = ref [] in let seen = ref [] in let rec aux fn = if sys_file_exists fn && not (List.mem fn !needed) then begin - if List.mem fn !seen then raise (Circular_dependencies (!seen, fn)); + if List.mem fn !seen then + raise (Circular_dependencies (refine_cycle !seen fn, fn)); seen := fn :: !seen; Resources.iter begin fun f -> if sys_file_exists f then @@ -217,4 +255,5 @@ module Make (I : INPUT) = struct mydprintf "caml_transitive_closure:@ %a ->@ %a" pp_l fns pp_l !needed; List.rev !needed + end From 09ce8313a42fb4437a38ba6f23756ad91d1560d2 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sat, 20 Dec 2014 22:21:34 +0000 Subject: [PATCH 098/494] ocamlbuild: use sets rather than list for cycle-checking I'm worried the previous algorithmically-naive implementation may behave badly on larger-scale projects. We still keep a list around to return results in the exact same order as previously. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15692 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- ocamlbuild/ocaml_dependencies.ml | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/ocamlbuild/ocaml_dependencies.ml b/ocamlbuild/ocaml_dependencies.ml index 3997f247e6..f62eb7d45b 100644 --- a/ocamlbuild/ocaml_dependencies.ml +++ b/ocamlbuild/ocaml_dependencies.ml @@ -213,7 +213,7 @@ module Make (I : INPUT) = struct if List.mem f path then (* we have found a cycle *) Some (List.rev path) - else if not (List.mem f files) + else if not (Resources.mem f files) then (* the neighbor is not in the set of paths known to have a cycle *) None @@ -227,17 +227,18 @@ module Make (I : INPUT) = struct | None -> dead_ends := Resources.add fn !dead_ends; None in match dfs [] starting_file with - | None -> files + | None -> Resources.elements files | Some cycle -> cycle in - let needed = ref [] in - let seen = ref [] in + let needed_in_order = ref [] in + let needed = ref Resources.empty in + let seen = ref Resources.empty in let rec aux fn = - if sys_file_exists fn && not (List.mem fn !needed) then begin - if List.mem fn !seen then + if sys_file_exists fn && not (Resources.mem fn !needed) then begin + if Resources.mem fn !seen then raise (Circular_dependencies (refine_cycle !seen fn, fn)); - seen := fn :: !seen; + seen := Resources.add fn !seen; Resources.iter begin fun f -> if sys_file_exists f then if Filename.check_suffix f ".cmi" then @@ -248,12 +249,14 @@ module Make (I : INPUT) = struct else () else aux f end (dependencies_of fn); - needed := fn :: !needed + needed := Resources.add fn !needed; + needed_in_order := fn :: !needed_in_order end in List.iter aux fns; - mydprintf "caml_transitive_closure:@ %a ->@ %a" pp_l fns pp_l !needed; - List.rev !needed + mydprintf "caml_transitive_closure:@ %a ->@ %a" + pp_l fns pp_l !needed_in_order; + List.rev !needed_in_order end From 93ebda1275de06fadf768aa90a7c591b714d370d Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 21 Dec 2014 08:25:33 +0000 Subject: [PATCH 099/494] PR#6466: use "extensible variant" rather than "open" types in error message (Leo White) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15695 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- testsuite/tests/typing-extensions/open_types.ml.reference | 2 +- typing/parmatch.ml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/testsuite/tests/typing-extensions/open_types.ml.reference b/testsuite/tests/typing-extensions/open_types.ml.reference index 841a94baa2..4c143a564b 100644 --- a/testsuite/tests/typing-extensions/open_types.ml.reference +++ b/testsuite/tests/typing-extensions/open_types.ml.reference @@ -77,7 +77,7 @@ Error: Signature mismatch: Warning 8: this pattern-matching is not exhaustive. Here is an example of a value that is not matched: _ -Matching over values of open types must include +Matching over values of extensible variant types must include a wild card pattern in order to be exhaustive. type foo = .. type foo += Foo diff --git a/typing/parmatch.ml b/typing/parmatch.ml index acffc40b6f..c2c7ceba38 100644 --- a/typing/parmatch.ml +++ b/typing/parmatch.ml @@ -1812,8 +1812,8 @@ let do_check_partial ?pred exhaust loc casel pss = match pss with let errmsg = match v.pat_desc with Tpat_construct (_, {cstr_name="*extension*"}, _) -> - "_\nMatching over values of open types must include\n\ - a wild card pattern in order to be exhaustive." + "_\nMatching over values of extensible variant types must include\n\ + a wild card pattern in order to be exhaustive." | _ -> try let buf = Buffer.create 16 in let fmt = formatter_of_buffer buf in From e388652957c18daf52e8a9fd523366d17b133396 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 21 Dec 2014 08:25:35 +0000 Subject: [PATCH 100/494] testsuite/Makefile.toplevel: make terminal DUMB by default (tests rely on this) Currently it is not equivalent to do: cd testsuite; make one DIR=tests/$foo and cd testsuite/tests/$foo; make because the latter will not set TERM=dumb and toplevel tests will use nice escape-code location highlighting instead of ASCII-made squiggly lines, which breaks the tests. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15696 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- testsuite/makefiles/Makefile.toplevel | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testsuite/makefiles/Makefile.toplevel b/testsuite/makefiles/Makefile.toplevel index 46acb3d78c..284465fe92 100644 --- a/testsuite/makefiles/Makefile.toplevel +++ b/testsuite/makefiles/Makefile.toplevel @@ -12,10 +12,10 @@ default: @for file in *.ml; do \ - $(OCAML) $(TOPFLAGS) <$$file 2>&1 \ + TERM=dumb $(OCAML) $(TOPFLAGS) <$$file 2>&1 \ | grep -v '^ OCaml version' > $$file.result; \ if [ -f $$file.principal.reference ]; then \ - $(OCAML) $(TOPFLAGS) -principal <$$file 2>&1 \ + TERM=dumb $(OCAML) $(TOPFLAGS) -principal <$$file 2>&1 \ | grep -v '^ OCaml version' > $$file.principal.result; \ fi; \ done From 11570a483e5f917a29776209dc3c80614b5b6ea7 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 21 Dec 2014 08:25:37 +0000 Subject: [PATCH 101/494] missing @since on List.sort_uniq git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15697 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- stdlib/list.mli | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/stdlib/list.mli b/stdlib/list.mli index 5b88f229db..932195973d 100644 --- a/stdlib/list.mli +++ b/stdlib/list.mli @@ -279,7 +279,8 @@ val fast_sort : ('a -> 'a -> int) -> 'a list -> 'a list on typical input. *) val sort_uniq : ('a -> 'a -> int) -> 'a list -> 'a list -(** Same as {!List.sort}, but also remove duplicates. *) +(** Same as {!List.sort}, but also remove duplicates. + @since 4.02.0 *) val merge : ('a -> 'a -> int) -> 'a list -> 'a list -> 'a list (** Merge two lists: From 2bcf9075560ebe258ff2a16c6567f978b4b913c2 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 21 Dec 2014 08:25:39 +0000 Subject: [PATCH 102/494] ocamlbuild: add an explicit "infer" tag for menhir (Patch by Hugo Heuzard) This allows to prevent the --infer option from being passed to Menhir by using the negative tag -infer. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15698 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- ocamlbuild/main.ml | 3 ++- ocamlbuild/ocaml_specific.ml | 1 + ocamlbuild/ocaml_tools.ml | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/ocamlbuild/main.ml b/ocamlbuild/main.ml index 6a26b54279..cb0a4b6679 100644 --- a/ocamlbuild/main.ml +++ b/ocamlbuild/main.ml @@ -74,7 +74,7 @@ let proceed () = (* If we are in the first run before launching the plugin, we should skip the user-visible operations (hygiene) that may need information from the plugin to run as the user expects it. - + Note that we don't need to disable the [Hooks] call as they are no-ops anyway, before any plugin has registered hooks. *) Plugin.we_need_a_plugin () && not !Options.just_plugin in @@ -91,6 +91,7 @@ let proceed () = <**/*.cmo>: ocaml, byte\n\ <**/*.cmi>: ocaml, byte, native\n\ <**/*.cmx>: ocaml, native\n\ + <**/*.mly>: infer\n\ "; List.iter diff --git a/ocamlbuild/ocaml_specific.ml b/ocamlbuild/ocaml_specific.ml index 79517a86a4..32f2fa57fd 100644 --- a/ocamlbuild/ocaml_specific.ml +++ b/ocamlbuild/ocaml_specific.ml @@ -530,6 +530,7 @@ flag ["ocaml"; "doc"] (atomize !Options.ocaml_docflags);; (* Tell menhir to explain conflicts *) flag [ "ocaml" ; "menhir" ; "explain" ] (S[A "--explain"]);; +flag [ "ocaml" ; "menhir" ; "infer" ] (S[A "--infer"]);; flag ["ocaml"; "ocamllex"] (atomize !Options.ocaml_lexflags);; diff --git a/ocamlbuild/ocaml_tools.ml b/ocamlbuild/ocaml_tools.ml index f4019c7ace..a615f28e2e 100644 --- a/ocamlbuild/ocaml_tools.ml +++ b/ocamlbuild/ocaml_tools.ml @@ -73,7 +73,7 @@ let menhir_modular menhir_base mlypack mlypack_depends env build = let tags = tags++"ocaml"++"parser"++"menhir" in Cmd(S[menhir ; A "--ocamlc"; Quote(S[!Options.ocamlc; T ocamlc_tags; ocaml_include_flags mlypack]); - T tags ; A "--infer" ; A "--base" ; Px menhir_base ; atomize_paths files]) + T tags ; A "--base" ; Px menhir_base ; atomize_paths files]) let ocamldep_command arg out env _build = let arg = env arg and out = env out in @@ -106,7 +106,7 @@ let menhir mly env build = Ocaml_compiler.prepare_compile build mly; Cmd(S[menhir; A"--ocamlc"; Quote(S[!Options.ocamlc; T ocamlc_tags; ocaml_include_flags mly]); - T menhir_tags; A"--infer"; Px mly]) + T menhir_tags; Px mly]) let ocamldoc_c tags arg odoc = let tags = tags++"ocaml" in From d67a128b130d18a5e06b3f53165ecc64b1aebc69 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 21 Dec 2014 08:25:41 +0000 Subject: [PATCH 103/494] toplevel: allows the extension of 'genprintval.ml' with parameterised printer. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15699 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- toplevel/genprintval.ml | 129 ++++++++++++++++++++++++++++++--------- toplevel/genprintval.mli | 14 +++++ toplevel/toploop.ml | 6 ++ toplevel/toploop.mli | 11 ++++ 4 files changed, 130 insertions(+), 30 deletions(-) diff --git a/toplevel/genprintval.ml b/toplevel/genprintval.ml index 94ca87795f..d9ca886533 100644 --- a/toplevel/genprintval.ml +++ b/toplevel/genprintval.ml @@ -37,11 +37,25 @@ module type EVALPATH = val same_value: valu -> valu -> bool end +type ('a, 'b) gen_printer = + | Zero of 'b + | Succ of ('a -> ('a, 'b) gen_printer) + module type S = sig type t val install_printer : Path.t -> Types.type_expr -> (formatter -> t -> unit) -> unit + val install_generic_printer : + Path.t -> Path.t -> + (int -> (int -> t -> Outcometree.out_value, + t -> Outcometree.out_value) gen_printer) -> + unit + val install_generic_printer' : + Path.t -> Path.t -> + (formatter -> t -> unit, + formatter -> t -> unit) gen_printer -> + unit val remove_printer : Path.t -> unit val outval_of_untyped_exception : t -> Outcometree.out_value val outval_of_value : @@ -104,47 +118,73 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct (* The user-defined printers. Also used for some builtin types. *) + type printer = + | Simple of Types.type_expr * (O.t -> Outcometree.out_value) + | Generic of Path.t * (int -> (int -> O.t -> Outcometree.out_value, + O.t -> Outcometree.out_value) gen_printer) + let printers = ref ([ - Pident(Ident.create "print_int"), Predef.type_int, - (fun x -> Oval_int (O.obj x : int)); - Pident(Ident.create "print_float"), Predef.type_float, - (fun x -> Oval_float (O.obj x : float)); - Pident(Ident.create "print_char"), Predef.type_char, - (fun x -> Oval_char (O.obj x : char)); - Pident(Ident.create "print_string"), Predef.type_string, - (fun x -> Oval_string (O.obj x : string)); - Pident(Ident.create "print_int32"), Predef.type_int32, - (fun x -> Oval_int32 (O.obj x : int32)); - Pident(Ident.create "print_nativeint"), Predef.type_nativeint, - (fun x -> Oval_nativeint (O.obj x : nativeint)); - Pident(Ident.create "print_int64"), Predef.type_int64, - (fun x -> Oval_int64 (O.obj x : int64)) - ] : (Path.t * type_expr * (O.t -> Outcometree.out_value)) list) + ( Pident(Ident.create "print_int"), + Simple (Predef.type_int, + (fun x -> Oval_int (O.obj x : int))) ); + ( Pident(Ident.create "print_float"), + Simple (Predef.type_float, + (fun x -> Oval_float (O.obj x : float))) ); + ( Pident(Ident.create "print_char"), + Simple (Predef.type_char, + (fun x -> Oval_char (O.obj x : char))) ); + ( Pident(Ident.create "print_string"), + Simple (Predef.type_string, + (fun x -> Oval_string (O.obj x : string))) ); + ( Pident(Ident.create "print_int32"), + Simple (Predef.type_int32, + (fun x -> Oval_int32 (O.obj x : int32))) ); + ( Pident(Ident.create "print_nativeint"), + Simple (Predef.type_nativeint, + (fun x -> Oval_nativeint (O.obj x : nativeint))) ); + ( Pident(Ident.create "print_int64"), + Simple (Predef.type_int64, + (fun x -> Oval_int64 (O.obj x : int64)) )) + ] : (Path.t * printer) list) + + let exn_printer ppf path = + fprintf ppf "<printer %a raised an exception>" Printtyp.path path + + let out_exn path = + Oval_printer (fun ppf -> exn_printer ppf path) let install_printer path ty fn = let print_val ppf obj = - try fn ppf obj with - | exn -> - fprintf ppf "<printer %a raised an exception>" Printtyp.path path in + try fn ppf obj with exn -> exn_printer ppf path in let printer obj = Oval_printer (fun ppf -> print_val ppf obj) in - printers := (path, ty, printer) :: !printers + printers := (path, Simple (ty, printer)) :: !printers + + let install_generic_printer path ty_path fn = + printers := (path, Generic (ty_path, fn)) :: !printers + + let install_generic_printer' path ty_path fn = + let rec build gp depth = + match gp with + | Zero fn -> + let out_printer obj = + let printer ppf = try fn ppf obj with _ -> exn_printer ppf path in + Oval_printer printer in + Zero out_printer + | Succ fn -> + let print_val fn_arg = + let print_arg ppf o = + !Oprint.out_value ppf (fn_arg (depth+1) o) in + build (fn print_arg) depth in + Succ print_val in + printers := (path, Generic (ty_path, build fn)) :: !printers let remove_printer path = let rec remove = function | [] -> raise Not_found - | (p, ty, fn as printer) :: rem -> + | ((p, _) as printer) :: rem -> if Path.same p path then rem else printer :: remove rem in printers := remove !printers - let find_printer env ty = - let rec find = function - | [] -> raise Not_found - | (name, sch, printer) :: remainder -> - if Ctype.moregeneral env false sch ty - then printer - else find remainder - in find !printers - (* Print a constructor or label, giving it the same prefix as the type it comes from. Attempt to omit the prefix if the type comes from a module that has been opened. *) @@ -205,7 +245,7 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct if !printer_steps < 0 || depth < 0 then Oval_ellipsis else begin try - find_printer env ty obj + find_printer depth env ty obj with Not_found -> match (Ctype.repr ty).desc with | Tvar _ | Tunivar _ -> @@ -439,6 +479,35 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct | None -> Oval_stuff "<extension>" + and find_printer depth env ty = + let rec find = function + | [] -> raise Not_found + | (name, Simple (sch, printer)) :: remainder -> + if Ctype.moregeneral env false sch ty + then printer + else find remainder + | (name, Generic (path, fn)) :: remainder -> + begin match (Ctype.expand_head env ty).desc with + | Tconstr (p, args, _) when Path.same p path -> + begin try apply_generic_printer path (fn depth) args + with _ -> (fun obj -> out_exn path) end + | _ -> find remainder end in + find !printers + + and apply_generic_printer path printer args = + match (printer, args) with + | (Zero fn, []) -> (fun (obj : O.t)-> try fn obj with _ -> out_exn path) + | (Succ fn, arg :: args) -> + let printer = fn (fun depth obj -> tree_of_val depth obj arg) in + apply_generic_printer path printer args + | _ -> + (fun obj -> + let printer ppf = + fprintf ppf "<internal error: incorrect arity for '%a'>" + Printtyp.path path in + Oval_printer printer) + + in nest tree_of_val max_depth obj ty end diff --git a/toplevel/genprintval.mli b/toplevel/genprintval.mli index 3f7b85ab69..a1cd6b9773 100644 --- a/toplevel/genprintval.mli +++ b/toplevel/genprintval.mli @@ -33,11 +33,25 @@ module type EVALPATH = val same_value: valu -> valu -> bool end +type ('a, 'b) gen_printer = + | Zero of 'b + | Succ of ('a -> ('a, 'b) gen_printer) + module type S = sig type t val install_printer : Path.t -> Types.type_expr -> (formatter -> t -> unit) -> unit + val install_generic_printer : + Path.t -> Path.t -> + (int -> (int -> t -> Outcometree.out_value, + t -> Outcometree.out_value) gen_printer) -> + unit + val install_generic_printer' : + Path.t -> Path.t -> + (formatter -> t -> unit, + formatter -> t -> unit) gen_printer -> + unit val remove_printer : Path.t -> unit val outval_of_untyped_exception : t -> Outcometree.out_value val outval_of_value : diff --git a/toplevel/toploop.ml b/toplevel/toploop.ml index 9fa802ca1b..772b83ad99 100644 --- a/toplevel/toploop.ml +++ b/toplevel/toploop.ml @@ -96,7 +96,13 @@ let outval_of_value env obj ty = let print_value env obj ppf ty = !print_out_value ppf (outval_of_value env obj ty) +type ('a, 'b) gen_printer = ('a, 'b) Genprintval.gen_printer = + | Zero of 'b + | Succ of ('a -> ('a, 'b) gen_printer) + let install_printer = Printer.install_printer +let install_generic_printer = Printer.install_generic_printer +let install_generic_printer' = Printer.install_generic_printer' let remove_printer = Printer.remove_printer (* Hooks for parsing functions *) diff --git a/toplevel/toploop.mli b/toplevel/toploop.mli index 1867c001ed..6638d76959 100644 --- a/toplevel/toploop.mli +++ b/toplevel/toploop.mli @@ -71,8 +71,19 @@ val eval_path: Env.t -> Path.t -> Obj.t val print_value: Env.t -> Obj.t -> formatter -> Types.type_expr -> unit val print_untyped_exception: formatter -> Obj.t -> unit +type ('a, 'b) gen_printer = + | Zero of 'b + | Succ of ('a -> ('a, 'b) gen_printer) + val install_printer : Path.t -> Types.type_expr -> (formatter -> Obj.t -> unit) -> unit +val install_generic_printer : + Path.t -> Path.t -> + (int -> (int -> Obj.t -> Outcometree.out_value, + Obj.t -> Outcometree.out_value) gen_printer) -> unit +val install_generic_printer' : + Path.t -> Path.t -> (formatter -> Obj.t -> unit, + formatter -> Obj.t -> unit) gen_printer -> unit val remove_printer : Path.t -> unit val max_printer_depth: int ref From 58b96e1721ab0164634b61c03d43d133e3fb34b6 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 21 Dec 2014 08:25:43 +0000 Subject: [PATCH 104/494] toplevel: extends #install_printer to accept parameterised printers git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15700 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- toplevel/topdirs.ml | 88 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 73 insertions(+), 15 deletions(-) diff --git a/toplevel/topdirs.ml b/toplevel/topdirs.ml index 4773c3f0bd..f19d63d97c 100644 --- a/toplevel/topdirs.ml +++ b/toplevel/topdirs.ml @@ -185,6 +185,27 @@ let _ = Hashtbl.add directive_table "mod_use" (* Install, remove a printer *) +let filter_arrow ty = + let ty = Ctype.expand_head !toplevel_env ty in + match ty.desc with + | Tarrow (lbl, l, r, _) when not (Btype.is_optional lbl) -> Some (l, r) + | _ -> None + +let rec extract_last_arrow desc = + match filter_arrow desc with + | None -> raise (Ctype.Unify []) + | Some (_, r as res) -> + try extract_last_arrow r + with Ctype.Unify _ -> res + +let extract_target_type ty = fst (extract_last_arrow ty) +let extract_target_parameters ty = + let ty = extract_target_type ty |> Ctype.expand_head !toplevel_env in + match ty.desc with + | Tconstr (path, (_ :: _ as args), _) + when Ctype.all_distinct_vars !toplevel_env args -> Some (path, args) + | _ -> None + type 'a printer_type_new = Format.formatter -> 'a -> unit type 'a printer_type_old = 'a -> unit @@ -196,14 +217,35 @@ let match_printer_type ppf desc typename = fprintf ppf "Cannot find type Topdirs.%s.@." typename; raise Exit in Ctype.init_def(Ident.current_time()); - Ctype.begin_def(); - let ty_arg = Ctype.newvar() in - Ctype.unify !toplevel_env - (Ctype.newconstr printer_type [ty_arg]) - (Ctype.instance_def desc.val_type); - Ctype.end_def(); - Ctype.generalize ty_arg; - ty_arg + + match extract_target_parameters desc.val_type with + | None -> + Ctype.begin_def(); + let ty_arg = Ctype.newvar() in + Ctype.unify !toplevel_env + (Ctype.newconstr printer_type [ty_arg]) + (Ctype.instance_def desc.val_type); + Ctype.end_def(); + Ctype.generalize ty_arg; + (ty_arg, None) + | Some (path, args) -> + Ctype.begin_def(); + let args = List.map (fun _ -> Ctype.newvar ()) args in + let ty_target = Ctype.newty (Tconstr (path, args, ref Mnil)) in + let ty_args = + List.map (fun ty_var -> Ctype.newconstr printer_type [ty_var]) args in + let ty_expected = + List.fold_right + (fun ty_arg ty -> Ctype.newty (Tarrow ("", ty_arg, ty, Cunknown))) + ty_args (Ctype.newconstr printer_type [ty_target]) in + Ctype.unify !toplevel_env + ty_expected + (Ctype.instance_def desc.val_type); + Ctype.end_def(); + Ctype.generalize ty_expected; + if not (Ctype.all_distinct_vars !toplevel_env args) then + raise (Ctype.Unify []); + (ty_expected, Some (path, ty_args)) let find_printer_type ppf lid = try @@ -225,14 +267,30 @@ let find_printer_type ppf lid = let dir_install_printer ppf lid = try - let (ty_arg, path, is_old_style) = find_printer_type ppf lid in + let ((ty_arg, ty), path, is_old_style) = + find_printer_type ppf lid in let v = eval_path !toplevel_env path in - let print_function = - if is_old_style then - (fun formatter repr -> Obj.obj v (Obj.obj repr)) - else - (fun formatter repr -> Obj.obj v formatter (Obj.obj repr)) in - install_printer path ty_arg print_function + match ty with + | None -> + let print_function = + if is_old_style then + (fun formatter repr -> Obj.obj v (Obj.obj repr)) + else + (fun formatter repr -> Obj.obj v formatter (Obj.obj repr)) in + install_printer path ty_arg print_function + | Some (ty_path, ty_args) -> + let rec build v = function + | [] -> + let print_function = + if is_old_style then + (fun formatter repr -> Obj.obj v (Obj.obj repr)) + else + (fun formatter repr -> Obj.obj v formatter (Obj.obj repr)) in + Zero print_function + | _ :: args -> + Succ + (fun fn -> build ((Obj.obj v : _ -> Obj.t) fn) args) in + install_generic_printer' path ty_path (build v ty_args) with Exit -> () let dir_remove_printer ppf lid = From e7822376fa33e9b2f96da7fa3685fe2813462bad Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 21 Dec 2014 08:25:44 +0000 Subject: [PATCH 105/494] toplevel: generic printers are only allowed with 'new' printer style. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15701 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- toplevel/topdirs.ml | 74 +++++++++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 32 deletions(-) diff --git a/toplevel/topdirs.ml b/toplevel/topdirs.ml index f19d63d97c..709451762d 100644 --- a/toplevel/topdirs.ml +++ b/toplevel/topdirs.ml @@ -209,52 +209,62 @@ let extract_target_parameters ty = type 'a printer_type_new = Format.formatter -> 'a -> unit type 'a printer_type_old = 'a -> unit -let match_printer_type ppf desc typename = +let printer_type ppf typename = let (printer_type, _) = try Env.lookup_type (Ldot(Lident "Topdirs", typename)) !toplevel_env with Not_found -> fprintf ppf "Cannot find type Topdirs.%s.@." typename; raise Exit in + printer_type + +let match_simple_printer_type ppf desc printer_type = + Ctype.begin_def(); + let ty_arg = Ctype.newvar() in + Ctype.unify !toplevel_env + (Ctype.newconstr printer_type [ty_arg]) + (Ctype.instance_def desc.val_type); + Ctype.end_def(); + Ctype.generalize ty_arg; + (ty_arg, None) + +let match_generic_printer_type ppf desc path args printer_type = + Ctype.begin_def(); + let args = List.map (fun _ -> Ctype.newvar ()) args in + let ty_target = Ctype.newty (Tconstr (path, args, ref Mnil)) in + let ty_args = + List.map (fun ty_var -> Ctype.newconstr printer_type [ty_var]) args in + let ty_expected = + List.fold_right + (fun ty_arg ty -> Ctype.newty (Tarrow ("", ty_arg, ty, Cunknown))) + ty_args (Ctype.newconstr printer_type [ty_target]) in + Ctype.unify !toplevel_env + ty_expected + (Ctype.instance_def desc.val_type); + Ctype.end_def(); + Ctype.generalize ty_expected; + if not (Ctype.all_distinct_vars !toplevel_env args) then + raise (Ctype.Unify []); + (ty_expected, Some (path, ty_args)) + +let match_printer_type ppf desc = + let printer_type_new = printer_type ppf "printer_type_new" in + let printer_type_old = printer_type ppf "printer_type_old" in Ctype.init_def(Ident.current_time()); - match extract_target_parameters desc.val_type with | None -> - Ctype.begin_def(); - let ty_arg = Ctype.newvar() in - Ctype.unify !toplevel_env - (Ctype.newconstr printer_type [ty_arg]) - (Ctype.instance_def desc.val_type); - Ctype.end_def(); - Ctype.generalize ty_arg; - (ty_arg, None) + (try + (match_simple_printer_type ppf desc printer_type_new, false) + with Ctype.Unify _ -> + (match_simple_printer_type ppf desc printer_type_old, true)) | Some (path, args) -> - Ctype.begin_def(); - let args = List.map (fun _ -> Ctype.newvar ()) args in - let ty_target = Ctype.newty (Tconstr (path, args, ref Mnil)) in - let ty_args = - List.map (fun ty_var -> Ctype.newconstr printer_type [ty_var]) args in - let ty_expected = - List.fold_right - (fun ty_arg ty -> Ctype.newty (Tarrow ("", ty_arg, ty, Cunknown))) - ty_args (Ctype.newconstr printer_type [ty_target]) in - Ctype.unify !toplevel_env - ty_expected - (Ctype.instance_def desc.val_type); - Ctype.end_def(); - Ctype.generalize ty_expected; - if not (Ctype.all_distinct_vars !toplevel_env args) then - raise (Ctype.Unify []); - (ty_expected, Some (path, ty_args)) + (* only 'new' style is available for generic printers *) + match_generic_printer_type ppf desc path args printer_type_new, false let find_printer_type ppf lid = try let (path, desc) = Env.lookup_value lid !toplevel_env in - let (ty_arg, is_old_style) = - try - (match_printer_type ppf desc "printer_type_new", false) - with Ctype.Unify _ -> - (match_printer_type ppf desc "printer_type_old", true) in + let (ty_arg, is_old_style) = match_printer_type ppf desc in (ty_arg, path, is_old_style) with | Not_found -> From c549786735b99e53022b2ca02a95a5e2d37857cc Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 21 Dec 2014 08:25:46 +0000 Subject: [PATCH 106/494] toplevel: be explicit about what path are used for git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15702 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- toplevel/genprintval.ml | 11 ++++++----- toplevel/genprintval.mli | 2 ++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/toplevel/genprintval.ml b/toplevel/genprintval.ml index d9ca886533..c09ee9f8c4 100644 --- a/toplevel/genprintval.ml +++ b/toplevel/genprintval.ml @@ -159,15 +159,16 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct let printer obj = Oval_printer (fun ppf -> print_val ppf obj) in printers := (path, Simple (ty, printer)) :: !printers - let install_generic_printer path ty_path fn = - printers := (path, Generic (ty_path, fn)) :: !printers + let install_generic_printer function_path constr_path fn = + printers := (function_path, Generic (constr_path, fn)) :: !printers - let install_generic_printer' path ty_path fn = + let install_generic_printer' function_path ty_path fn = let rec build gp depth = match gp with | Zero fn -> let out_printer obj = - let printer ppf = try fn ppf obj with _ -> exn_printer ppf path in + let printer ppf = + try fn ppf obj with _ -> exn_printer ppf function_path in Oval_printer printer in Zero out_printer | Succ fn -> @@ -176,7 +177,7 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct !Oprint.out_value ppf (fn_arg (depth+1) o) in build (fn print_arg) depth in Succ print_val in - printers := (path, Generic (ty_path, build fn)) :: !printers + printers := (function_path, Generic (ty_path, build fn)) :: !printers let remove_printer path = let rec remove = function diff --git a/toplevel/genprintval.mli b/toplevel/genprintval.mli index a1cd6b9773..14659d62a2 100644 --- a/toplevel/genprintval.mli +++ b/toplevel/genprintval.mli @@ -52,6 +52,8 @@ module type S = (formatter -> t -> unit, formatter -> t -> unit) gen_printer -> unit + (** [install_generic_printer' function_path constructor_path printer] + function_path is used to remove the printer. *) val remove_printer : Path.t -> unit val outval_of_untyped_exception : t -> Outcometree.out_value val outval_of_value : From 356aa87847e8a6532a5b5d9a645329400677a741 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 21 Dec 2014 08:25:48 +0000 Subject: [PATCH 107/494] update Changes git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15703 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Changes b/Changes index a3f4927636..8e862f86f1 100644 --- a/Changes +++ b/Changes @@ -1,6 +1,15 @@ OCaml 4.02.2: ------------- +Toplevel and debugger: +- PR#5958: generalized polymorphic #install_printer + (Pierre Chambart and Grégoire Henry) + +OCamlbuild: +- PR#6237: explicit "infer" tag to control or disable menhir --infer + (Hugo Heuzard) + +Bug fixes: - PR#6628: Configure script rejects legitimate arguments (Michael Grünewald, Damien Doligez) - PR#6640: ocamlbuild: wrong "unused tag" warning on "precious" From c8a5d63f288c5c75b71771af3956784090f2a56d Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 21 Dec 2014 08:25:50 +0000 Subject: [PATCH 108/494] rewrite the printing of Lazy values in toplevel/genprintval.ml The code previously used Lazy.is_val to know whether the value was already-evaluated (and, in this case, Lazy.force to extract this value and print it more precisely). But it lies inside a functor that is instantiated over different implementations of Obj, while Lazy.{is_val,force} force the use of the Obj module of the standard library. This could cause segfaults when this code is called from the debugger, which instantiates it with a different Obj module talking over a socket. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15704 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- toplevel/genprintval.ml | 51 ++++++++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/toplevel/genprintval.ml b/toplevel/genprintval.ml index c09ee9f8c4..ec9b4f14d1 100644 --- a/toplevel/genprintval.ml +++ b/toplevel/genprintval.ml @@ -299,17 +299,40 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct Oval_array [] | Tconstr (path, [ty_arg], _) when Path.same path Predef.path_lazy_t -> - if not (Lazy.is_val (O.obj obj)) then Oval_stuff "<lazy>" + let obj_tag = O.tag obj in + (* Lazy values are represented in three possible ways: + + 1. a lazy thunk that is not yet forced has tag + Obj.lazy_tag + + 2. a lazy thunk that has just been forced has tag + Obj.forward_tag; its first field is the forced + result, which we can print + + 3. when the GC moves a forced trunk with forward_tag, + or when a thunk is directly created from a value, + we get a third representation where the value is + directly exposed, without the Obj.forward_tag + (if its own tag is not ambiguous, that is neither + lazy_tag nor forward_tag) + + Note that using Lazy.is_val and Lazy.force would be + unsafe, because they use the Obj.* functions rather + than the O.* functions of the functor argument, and + would thus crash if called from the toplevel + (debugger/printval instantiates Genprintval.Make with + an Obj module talking over a socket). + *) + if obj_tag = Obj.lazy_tag then Oval_stuff "<lazy>" else begin let forced_obj = - (* we know that (Lazy.is_val (O.obj obj)), - forcing will not block *) - Lazy.force (O.obj obj) in + if obj_tag = Obj.forward_tag then O.field obj 0 else obj + in (* calling oneself recursively on forced_obj risks - having a false positive for cycle detection; indeed, - if the value has been created with Lazy.from_val, - it may be stored as-is instead of being wrapped in a - forward pointer. It means that, for (lazy "foo"), we have + having a false positive for cycle detection; + indeed, in case (3) above, the value is stored + as-is instead of being wrapped in a forward + pointer. It means that, for (lazy "foo"), we have forced_obj == obj and it is easy to wrongly print (lazy <cycle>) in such a case (PR#6669). @@ -321,12 +344,12 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct itself. For this reason, we still "nest" (detect head cycles) on forward tags. *) - let maybe_nest tree_of_val = - if O.tag obj = Obj.forward_tag - then nest tree_of_val - else tree_of_val in - let v = maybe_nest tree_of_val depth forced_obj ty_arg in - Oval_constr (Oide_ident "lazy", [v]) + let v = + if obj_tag = Obj.forward_tag + then nest tree_of_val depth forced_obj ty_arg + else tree_of_val depth forced_obj ty_arg + in + Oval_constr (Oide_ident "lazy", [v]) end | Tconstr(path, ty_list, _) -> begin try From 0a7819f7949ae1713735e2a5bee805eda2c029f2 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 21 Dec 2014 08:25:51 +0000 Subject: [PATCH 109/494] rewrite cycle-detection in genprintval.ml to use O instead of Obj (see previous commit) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15705 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- toplevel/genprintval.ml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/toplevel/genprintval.ml b/toplevel/genprintval.ml index ec9b4f14d1..3144594f09 100644 --- a/toplevel/genprintval.ml +++ b/toplevel/genprintval.ml @@ -64,8 +64,12 @@ module type S = Env.t -> t -> type_expr -> Outcometree.out_value end -module ObjTbl = Hashtbl.Make(struct - type t = Obj.t +module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct + + type t = O.t + + module ObjTbl = Hashtbl.Make(struct + type t = O.t let equal = (==) let hash x = try @@ -73,9 +77,6 @@ module ObjTbl = Hashtbl.Make(struct with exn -> 0 end) -module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct - - type t = O.t (* Given an exception value, we cannot recover its type, hence we cannot print its arguments in general. @@ -225,8 +226,8 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct let nested_values = ObjTbl.create 8 in let nest_gen err f depth obj ty = - let repr = Obj.repr obj in - if not (Obj.is_block repr) then + let repr = obj in + if not (O.is_block repr) then f depth obj ty else if ObjTbl.mem nested_values repr then From 7087ec15e5d1b744b0eb2ed9c3289fe37be88c6e Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 21 Dec 2014 08:25:53 +0000 Subject: [PATCH 110/494] ocamldebug: fix printing of variables of lazy type "print a" in ocamldebug when a is a forced lazy value segfaults on all OCaml versions I tested it on. This comes from the fact that the debugcomm.ml re-implementation of the Obj module (talking over the debugging socket) implements Obj.tag without special-casing integers (that is, testing is_block first), and always assumes its input is a block. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15706 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- debugger/debugcom.ml | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/debugger/debugcom.ml b/debugger/debugcom.ml index ac91df799f..8bfd3aaba3 100644 --- a/debugger/debugcom.ml +++ b/debugger/debugcom.ml @@ -213,14 +213,16 @@ module Remote_value = | Local obj -> Obj.is_block obj | Remote v -> Obj.is_block (Array.unsafe_get (Obj.magic v : Obj.t array) 0) - let tag = function - | Local obj -> Obj.tag obj - | Remote v -> - output_char !conn.io_out 'H'; - output_remote_value !conn.io_out v; - flush !conn.io_out; - let header = input_binary_int !conn.io_in in - header land 0xFF + let tag obj = + if not (is_block obj) then Obj.int_tag + else match obj with + | Local obj -> Obj.tag obj + | Remote v -> + output_char !conn.io_out 'H'; + output_remote_value !conn.io_out v; + flush !conn.io_out; + let header = input_binary_int !conn.io_in in + header land 0xFF let size = function | Local obj -> Obj.size obj From 68c4ef65f7b93f77b9d5e3a6442c9ff060afd949 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 21 Dec 2014 08:25:55 +0000 Subject: [PATCH 111/494] Since r10c, Android NDK includes sys/ucontext.h. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15707 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- asmrun/signals_osdep.h | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/asmrun/signals_osdep.h b/asmrun/signals_osdep.h index f3b4642d2d..8dd651f6c5 100644 --- a/asmrun/signals_osdep.h +++ b/asmrun/signals_osdep.h @@ -66,18 +66,7 @@ #elif defined(TARGET_arm) && (defined(SYS_linux_eabi) \ || defined(SYS_linux_eabihf)) - #if defined(__ANDROID__) - // The Android NDK does not have sys/ucontext.h yet. - typedef struct ucontext { - uint32_t uc_flags; - struct ucontext *uc_link; - stack_t uc_stack; - struct sigcontext uc_mcontext; - // Other fields omitted... - } ucontext_t; - #else - #include <sys/ucontext.h> - #endif + #include <sys/ucontext.h> #define DECLARE_SIGNAL_HANDLER(name) \ static void name(int sig, siginfo_t * info, ucontext_t * context) From 054b57f8bd637d43dfedb458aede34984fc825fd Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 21 Dec 2014 08:25:57 +0000 Subject: [PATCH 112/494] Allow Android builds with systhreads support. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15708 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- otherlibs/systhreads/st_posix.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/otherlibs/systhreads/st_posix.h b/otherlibs/systhreads/st_posix.h index e0bc65e41d..1d87a22986 100644 --- a/otherlibs/systhreads/st_posix.h +++ b/otherlibs/systhreads/st_posix.h @@ -80,7 +80,12 @@ static void st_thread_exit(void) static void st_thread_kill(st_thread_id thr) { +#if !defined(__ANDROID__) + /* pthread_cancel is unsafe, as it does not allow the thread an opportunity + to free shared resources such as mutexes. Thus, it is not implemented + in Android's libc. */ pthread_cancel(thr); +#endif } /* Scheduling hints */ @@ -322,8 +327,10 @@ static void * caml_thread_tick(void * arg) /* Block all signals so that we don't try to execute an OCaml signal handler*/ sigfillset(&mask); pthread_sigmask(SIG_BLOCK, &mask, NULL); +#if !defined(__ANDROID__) /* Allow async cancellation */ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); +#endif while(1) { /* select() seems to be the most efficient way to suspend the thread for sub-second intervals */ @@ -340,6 +347,15 @@ static void * caml_thread_tick(void * arg) /* "At fork" processing */ +#if defined(__ANDROID__) +/* Android's libc does not include declaration of pthread_atfork; + however, it implements it since API level 10 (Gingerbread). + The reason for the omission is that Android (GUI) applications + are not supposed to fork at all, however this workaround is still + included in case OCaml is used for an Android CLI utility. */ +int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void)); +#endif + static int st_atfork(void (*fn)(void)) { return pthread_atfork(NULL, NULL, fn); From 1577858a545202fd69a280e05564c405cfcb5117 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 21 Dec 2014 08:25:59 +0000 Subject: [PATCH 113/494] Update manpage git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15709 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- man/ocaml.m | 4 ++-- man/ocamlc.m | 6 +++--- man/ocamlopt.m | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/man/ocaml.m b/man/ocaml.m index 79f81df0a4..5c839ea61d 100644 --- a/man/ocaml.m +++ b/man/ocaml.m @@ -81,9 +81,9 @@ .BR + , it is taken relative to the standard library directory. For instance, -.B \-I\ +camlp4 +.B \-I\ +compiler-libs adds the subdirectory -.B camlp4 +.B compiler-libs of the standard library to the search path. .IP Directories can also be added to the search path once the toplevel diff --git a/man/ocamlc.m b/man/ocamlc.m index 090f1c686c..26ce50f7c2 100644 --- a/man/ocamlc.m +++ b/man/ocamlc.m @@ -350,9 +350,9 @@ compiled interface files (.cmi), compiled object code files .BR + , it is taken relative to the standard library directory. For instance, -.B \-I\ +camlp4 +.B \-I\ +compiler-libs adds the subdirectory -.B camlp4 +.B compiler-libs of the standard library to the search path. .TP .BI \-impl \ filename @@ -745,7 +745,7 @@ compilation in any way (even if it is fatal). If a warning is enabled, \ \ Non-returning statement. 22 -\ \ Camlp4 warning. +\ \ Preprocessor warning. 23 \ \ Useless record diff --git a/man/ocamlopt.m b/man/ocamlopt.m index fb20ca99c8..15b0c3b89f 100644 --- a/man/ocamlopt.m +++ b/man/ocamlopt.m @@ -260,9 +260,9 @@ and libraries (.cmxa). By default, the current directory is searched .BR + , it is taken relative to the standard library directory. For instance, -.B \-I\ +camlp4 +.B \-I\ +compiler-libs adds the subdirectory -.B camlp4 +.B compiler-libs of the standard library to the search path. .TP .BI \-impl \ filename From dff6a1e508ab21d2279f7f6a03310f6e773ef518 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 21 Dec 2014 08:26:01 +0000 Subject: [PATCH 114/494] PR6712: Ignore (-traverse) common VCS directories in ocamlbuild. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15710 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ ocamlbuild/main.ml | 1 + 2 files changed, 3 insertions(+) diff --git a/Changes b/Changes index 8e862f86f1..e12eea94bf 100644 --- a/Changes +++ b/Changes @@ -8,6 +8,8 @@ Toplevel and debugger: OCamlbuild: - PR#6237: explicit "infer" tag to control or disable menhir --infer (Hugo Heuzard) +- PR#6712: Ignore common VCS directories + (Peter Zotov) Bug fixes: - PR#6628: Configure script rejects legitimate arguments diff --git a/ocamlbuild/main.ml b/ocamlbuild/main.ml index cb0a4b6679..8f7d6f76e0 100644 --- a/ocamlbuild/main.ml +++ b/ocamlbuild/main.ml @@ -92,6 +92,7 @@ let proceed () = <**/*.cmi>: ocaml, byte, native\n\ <**/*.cmx>: ocaml, native\n\ <**/*.mly>: infer\n\ + <**/.svn>|\".bzr\"|\".hg\"|\".git\"|\"_darcs\": -traverse\n\ "; List.iter From 9611439bd34a8f7c3f4359815fc64d8a64d85855 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 21 Dec 2014 08:26:02 +0000 Subject: [PATCH 115/494] ocamlbuild: explicit 'linkpkg' and 'dontlink(foo)' flags git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15711 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ ocamlbuild/ocaml_specific.ml | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/Changes b/Changes index e12eea94bf..0530c5d5da 100644 --- a/Changes +++ b/Changes @@ -10,6 +10,8 @@ OCamlbuild: (Hugo Heuzard) - PR#6712: Ignore common VCS directories (Peter Zotov) +- explicit "linkpkg" and "dontlink(foo)" flags + (Peter Zotov, Gabriel Scherer) Bug fixes: - PR#6628: Configure script rejects legitimate arguments diff --git a/ocamlbuild/ocaml_specific.ml b/ocamlbuild/ocaml_specific.ml index 32f2fa57fd..72de3ebbed 100644 --- a/ocamlbuild/ocaml_specific.ml +++ b/ocamlbuild/ocaml_specific.ml @@ -560,6 +560,14 @@ let () = flag ["ocaml"; "link"; "program"] & A"-linkpkg"; flag ["ocaml"; "link"; "toplevel"] & A"-linkpkg"; + (* "program" will make sure that -linkpkg is passed when compiling + whole-programs (.byte and .native); but it is occasionally + useful to pass -linkpkg when building archives for example + (.cma and .cmxa); the "linkpkg" flag allows user to request it + explicitly. *) + flag ["ocaml"; "link"; "linkpkg"] & A"-linkpkg"; + pflag ["ocaml"; "link"] "dontlink" (fun pkg -> S[A"-dontlink"; A pkg]); + let all_tags = [ ["ocaml"; "byte"; "compile"]; ["ocaml"; "native"; "compile"]; From abcf422d5d99294e1a5a9876f839efbdaac253b3 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 21 Dec 2014 08:26:04 +0000 Subject: [PATCH 116/494] PR#6717: Pprintast does not print let-pattern attributes git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15712 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- parsing/pprintast.ml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index 7dea70c555..8f4ebce4be 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -363,7 +363,8 @@ class printer ()= object(self:'self) | None -> pp f "%a@;"self#longident_loc li ) | _ -> self#simple_pattern f x method simple_pattern (f:Format.formatter) (x:pattern) :unit = - match x.ppat_desc with + if x.ppat_attributes <> [] then self#pattern f x + else match x.ppat_desc with | Ppat_construct (({txt=Lident ("()"|"[]" as x);_}), _) -> pp f "%s" x | Ppat_any -> pp f "_"; | Ppat_var ({txt = txt;_}) -> protect_ident f txt From b49476cc851dcaf1c2387cac4bc2cafbbaf0bc16 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 21 Dec 2014 08:26:06 +0000 Subject: [PATCH 117/494] PR#6720: pass -g to C compilers when tag 'debug' is set git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15713 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- ocamlbuild/ocaml_specific.ml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ocamlbuild/ocaml_specific.ml b/ocamlbuild/ocaml_specific.ml index 72de3ebbed..6a4194e85d 100644 --- a/ocamlbuild/ocaml_specific.ml +++ b/ocamlbuild/ocaml_specific.ml @@ -675,6 +675,8 @@ flag ["ocaml"; "debug"; "pack"; "byte"] (A "-g");; flag ["ocaml"; "debug"; "compile"; "native"] (A "-g");; flag ["ocaml"; "debug"; "link"; "native"; "program"] (A "-g");; flag ["ocaml"; "debug"; "pack"; "native"] (A "-g");; +flag ["c"; "debug"; "compile"] (A "-g"); +flag ["c"; "debug"; "link"] (A "-g"); flag ["ocaml"; "link"; "native"; "output_obj"] (A"-output-obj");; flag ["ocaml"; "link"; "byte"; "output_obj"] (A"-output-obj");; flag ["ocaml"; "dtypes"; "compile"] (A "-dtypes");; From d96fbdfbc263cab6081fb63f9a17b33953438a08 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 21 Dec 2014 08:26:07 +0000 Subject: [PATCH 118/494] Update Changes after trunk cherry-picking session git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15714 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Changes b/Changes index 0530c5d5da..f236d6a037 100644 --- a/Changes +++ b/Changes @@ -8,12 +8,16 @@ Toplevel and debugger: OCamlbuild: - PR#6237: explicit "infer" tag to control or disable menhir --infer (Hugo Heuzard) +- PR#6702: explicit "linkpkg" and "dontlink(foo)" flags + (Peter Zotov, Gabriel Scherer) - PR#6712: Ignore common VCS directories (Peter Zotov) -- explicit "linkpkg" and "dontlink(foo)" flags +- PR#6720: pass -g to C compilers when tag 'debug' is set (Peter Zotov, Gabriel Scherer) Bug fixes: +- PR#5836, PR#6684: printing lazy values in ocamldebug may segfault + (Gabriel Scherer) - PR#6628: Configure script rejects legitimate arguments (Michael Grünewald, Damien Doligez) - PR#6640: ocamlbuild: wrong "unused tag" warning on "precious" @@ -25,7 +29,10 @@ Bug fixes: - PR#6680: Missing parentheses when printing polymorphic variant value in warning - PR#6690: Uncaught exception (Not_found) with (wrong) wildcard or unification type variable in place of a local abstract type - +- PR#6717: Pprintast does not print let-pattern attributes + (Gabriel Scherer, report by Peter Zotov) +- allow android build with pthreads support (since SDK r10c) + (Peter Zotov) OCaml 4.02.1: ------------- From f81918e272a5a5fc5f2a5f468556829d8312523a Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 21 Dec 2014 10:39:17 +0000 Subject: [PATCH 119/494] PR#6625: pass -linkpkg to files built with -output-obj. (Peter Zotov) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15718 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ ocamlbuild/ocaml_specific.ml | 1 + 2 files changed, 3 insertions(+) diff --git a/Changes b/Changes index f236d6a037..f14c2e2afc 100644 --- a/Changes +++ b/Changes @@ -8,6 +8,8 @@ Toplevel and debugger: OCamlbuild: - PR#6237: explicit "infer" tag to control or disable menhir --infer (Hugo Heuzard) +- PR#6625: pass -linkpkg to files built with -output-obj. + (Peter Zotov) - PR#6702: explicit "linkpkg" and "dontlink(foo)" flags (Peter Zotov, Gabriel Scherer) - PR#6712: Ignore common VCS directories diff --git a/ocamlbuild/ocaml_specific.ml b/ocamlbuild/ocaml_specific.ml index 6a4194e85d..1d0b8a8e47 100644 --- a/ocamlbuild/ocaml_specific.ml +++ b/ocamlbuild/ocaml_specific.ml @@ -559,6 +559,7 @@ let () = (* Ocamlfind will link the archives for us. *) flag ["ocaml"; "link"; "program"] & A"-linkpkg"; flag ["ocaml"; "link"; "toplevel"] & A"-linkpkg"; + flag ["ocaml"; "link"; "output_obj"] & A"-linkpkg"; (* "program" will make sure that -linkpkg is passed when compiling whole-programs (.byte and .native); but it is occasionally From 6ab55a25cb0c9a3e08309890f395d33d88715e80 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 21 Dec 2014 10:46:36 +0000 Subject: [PATCH 120/494] PR#6616: allow meaningful use of -use-runtime without -custom. (Peter Zotov) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15721 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 6 ++++-- bytecomp/bytelink.ml | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Changes b/Changes index f14c2e2afc..8306abe895 100644 --- a/Changes +++ b/Changes @@ -20,19 +20,21 @@ OCamlbuild: Bug fixes: - PR#5836, PR#6684: printing lazy values in ocamldebug may segfault (Gabriel Scherer) +- PR#6616: allow meaningful use of -use-runtime without -custom. + (Peter Zotov) - PR#6628: Configure script rejects legitimate arguments (Michael Grünewald, Damien Doligez) - PR#6640: ocamlbuild: wrong "unused tag" warning on "precious" (report by user 'william') - PR#6669: fix 4.02 regression in toplevel printing of lazy values (Leo White, review by Gabriel Scherer) -- ocamlbuild on cygwin cannot find ocamlfind - (user 'algoriddle') - PR#6680: Missing parentheses when printing polymorphic variant value in warning - PR#6690: Uncaught exception (Not_found) with (wrong) wildcard or unification type variable in place of a local abstract type - PR#6717: Pprintast does not print let-pattern attributes (Gabriel Scherer, report by Peter Zotov) +- ocamlbuild on cygwin cannot find ocamlfind + (user 'algoriddle') - allow android build with pthreads support (since SDK r10c) (Peter Zotov) diff --git a/bytecomp/bytelink.ml b/bytecomp/bytelink.ml index c0f8f6a935..ded549489c 100644 --- a/bytecomp/bytelink.ml +++ b/bytecomp/bytelink.ml @@ -309,7 +309,7 @@ let link_bytecode ppf tolink exec_name standalone = Bytesections.init_record outchan; (* The path to the bytecode interpreter (in use_runtime mode) *) if String.length !Clflags.use_runtime > 0 then begin - output_string outchan (make_absolute !Clflags.use_runtime); + output_string outchan ("#!" ^ (make_absolute !Clflags.use_runtime)); output_char outchan '\n'; Bytesections.record outchan "RNTM" end; From dcc066bba85f08a77a0f4be03cc16c4515396614 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 23 Dec 2014 16:53:13 +0000 Subject: [PATCH 121/494] PR#6663: A misleading typo in parsetree.mli git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15742 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- parsing/parsetree.mli | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index a66317f47c..295e3eaa07 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -36,7 +36,7 @@ and attributes = attribute list and payload = | PStr of structure | PTyp of core_type (* : T *) - | PPat of pattern * expression option (* : P or : P when E *) + | PPat of pattern * expression option (* ? P or ? P when E *) (** {2 Core language} *) From 8468fbf039d20bf8ccf86edcea7297143519c008 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Wed, 24 Dec 2014 16:23:07 +0000 Subject: [PATCH 122/494] PR#6665: Failure of tests/asmcomp on sparc git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15743 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ testsuite/tests/asmcomp/sparc.S | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 8306abe895..89e133db07 100644 --- a/Changes +++ b/Changes @@ -26,6 +26,8 @@ Bug fixes: (Michael Grünewald, Damien Doligez) - PR#6640: ocamlbuild: wrong "unused tag" warning on "precious" (report by user 'william') +- PR#6665: Failure of tests/asmcomp on sparc + (Stéphane Glondu) - PR#6669: fix 4.02 regression in toplevel printing of lazy values (Leo White, review by Gabriel Scherer) - PR#6680: Missing parentheses when printing polymorphic variant value in warning diff --git a/testsuite/tests/asmcomp/sparc.S b/testsuite/tests/asmcomp/sparc.S index ea029573a0..f2b9ce2073 100644 --- a/testsuite/tests/asmcomp/sparc.S +++ b/testsuite/tests/asmcomp/sparc.S @@ -10,7 +10,7 @@ /* */ /***********************************************************************/ -#if defined(SYS_solaris) || defined(SYS_elf) +#if defined(SYS_solaris) || defined(SYS_linux) #define Call_gen_code call_gen_code #define Caml_c_call caml_c_call #else From c73f3175a151712b2f2151e40b202a0b61b6220e Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Wed, 24 Dec 2014 19:56:22 +0000 Subject: [PATCH 123/494] PR#6727: Printf.sprintf "%F" misbehavior git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15745 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 4 +++- stdlib/camlinternalFormat.ml | 19 ++++++++++--------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/Changes b/Changes index 89e133db07..b3616f5cce 100644 --- a/Changes +++ b/Changes @@ -35,6 +35,8 @@ Bug fixes: type variable in place of a local abstract type - PR#6717: Pprintast does not print let-pattern attributes (Gabriel Scherer, report by Peter Zotov) +- PR#6727: Printf.sprintf "%F" misbehavior + (Benoît Vaugon, report by Vassili Karpov) - ocamlbuild on cygwin cannot find ocamlfind (user 'algoriddle') - allow android build with pthreads support (since SDK r10c) @@ -59,7 +61,7 @@ Standard library: (Xavier Leroy, Alain Frisch, relase-worthy report by Jacques-Pascal Deplaix) - PR#6530: Add stack overflow handling for native code (OpenBSD i386 and amd64) (Cristopher Zimmermann) -- PR#6533: broken semantics of %(%) when substitued by a box +- PR#6533: broken semantics of %(%) when substituted by a box (Benoît Vaugon, report by Boris Yakobowski) - PR#6534: legacy support for %.10s (Benoît Vaugon, Gabriel Scherer, report by Nick Chapman) diff --git a/stdlib/camlinternalFormat.ml b/stdlib/camlinternalFormat.ml index 40d76678ee..2c92c25b9d 100644 --- a/stdlib/camlinternalFormat.ml +++ b/stdlib/camlinternalFormat.ml @@ -1315,15 +1315,16 @@ let format_of_aconv iconv c = (* Generate the format_float first argument form a float_conv. *) let format_of_fconv fconv prec = - let prec = abs prec in - let symb = if fconv = Float_F then 'g' else char_of_fconv fconv in - let buf = buffer_create 16 in - buffer_add_char buf '%'; - bprint_fconv_flag buf fconv; - buffer_add_char buf '.'; - buffer_add_string buf (string_of_int prec); - buffer_add_char buf symb; - buffer_contents buf + if fconv = Float_F then "%.12g" else + let prec = abs prec in + let symb = char_of_fconv fconv in + let buf = buffer_create 16 in + buffer_add_char buf '%'; + bprint_fconv_flag buf fconv; + buffer_add_char buf '.'; + buffer_add_string buf (string_of_int prec); + buffer_add_char buf symb; + buffer_contents buf (* Convert an integer to a string according to a conversion. *) let convert_int iconv n = format_int (format_of_iconv iconv) n From 03b80fe8195940a61bd3c7677ed150d1bbae8d20 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sat, 27 Dec 2014 08:44:24 +0000 Subject: [PATCH 124/494] PR#6641: add -g, -ocamlcflags, -ocamloptflags options to ocamlmklib (Peter Zotov) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15748 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 4 ++++ tools/ocamlmklib.ml | 29 +++++++++++++++++++++++------ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/Changes b/Changes index b3616f5cce..513953b62f 100644 --- a/Changes +++ b/Changes @@ -17,6 +17,10 @@ OCamlbuild: - PR#6720: pass -g to C compilers when tag 'debug' is set (Peter Zotov, Gabriel Scherer) +Tools: +- PR#6641: add -g, -ocamlcflags, -ocamloptflags options to ocamlmklib + (Peter Zotov) + Bug fixes: - PR#5836, PR#6684: printing lazy values in ocamldebug may segfault (Gabriel Scherer) diff --git a/tools/ocamlmklib.ml b/tools/ocamlmklib.ml index 77ae57becb..23a273ec12 100644 --- a/tools/ocamlmklib.ml +++ b/tools/ocamlmklib.ml @@ -27,14 +27,17 @@ and caml_opts = ref [] (* -ccopt to pass to ocamlc, ocamlopt *) and dynlink = ref supports_shared_libraries and failsafe = ref false (* whether to fall back on static build only *) and c_libs = ref [] (* libs to pass to mksharedlib and ocamlc -cclib *) -and c_Lopts = ref [] (* options to pass to mksharedlib and ocamlc -cclib *) -and c_opts = ref [] (* options to pass to mksharedlib and ocamlc -ccopt *) +and c_Lopts = ref [] (* options to pass to mksharedlib and ocamlc -cclib *) +and c_opts = ref [] (* options to pass to mksharedlib and ocamlc -ccopt *) and ld_opts = ref [] (* options to pass only to the linker *) and ocamlc = ref (compiler_path "ocamlc") +and ocamlc_opts = ref [] (* options to pass only to ocamlc *) and ocamlopt = ref (compiler_path "ocamlopt") +and ocamlopt_opts = ref [] (* options to pass only to ocamlc *) and output = ref "a" (* Output name for OCaml part of library *) and output_c = ref "" (* Output name for C part of library *) and rpath = ref [] (* rpath options *) +and debug = ref false (* -g option *) and verbose = ref false let starts_with s pref = @@ -84,6 +87,8 @@ let parse_arguments argv = caml_opts := next_arg () :: "-I" :: !caml_opts else if s = "-failsafe" then failsafe := true + else if s = "-g" then + debug := true else if s = "-h" || s = "-help" || s = "--help" then raise (Bad_argument "") else if s = "-ldopt" then @@ -96,10 +101,14 @@ let parse_arguments argv = (c_Lopts := s :: !c_Lopts; let l = chop_prefix s "-L" in if not (Filename.is_relative l) then rpath := l :: !rpath) + else if s = "-ocamlcflags" then + ocamlc_opts := next_arg () :: !ocamlc_opts else if s = "-ocamlc" then ocamlc := next_arg () else if s = "-ocamlopt" then ocamlopt := next_arg () + else if s = "-ocamloptflags" then + ocamlopt_opts := next_arg () :: !ocamlopt_opts else if s = "-o" then output := next_arg() else if s = "-oc" then @@ -148,7 +157,8 @@ Usage: ocamlmklib [options] <.cmo|.cma|.cmx|.cmxa|.ml|.mli|.o|.a|.obj|.lib|\ \nOptions are:\ \n -cclib <lib> C library passed to ocamlc -a or ocamlopt -a only\ \n -ccopt <opt> C option passed to ocamlc -a or ocamlopt -a only\ -\n -custom disable dynamic loading\ +\n -custom Disable dynamic loading\ +\n -g Build with debug information\ \n -dllpath <dir> Add <dir> to the run-time search path for DLLs\ \n -F<dir> Specify a framework directory (MacOSX)\ \n -framework <name> Use framework <name> (MacOSX)\ @@ -162,7 +172,9 @@ Usage: ocamlmklib [options] <.cmo|.cma|.cmx|.cmxa|.ml|.mli|.o|.a|.obj|.lib|\ \n -l<lib> Specify a dependent C library\ \n -L<dir> Add <dir> to the path searched for C libraries\ \n -ocamlc <cmd> Use <cmd> in place of \"ocamlc\"\ +\n -ocamlcflags <opt> Pass <opt> to ocamlc\ \n -ocamlopt <cmd> Use <cmd> in place of \"ocamlopt\"\ +\n -ocamloptflags <opt> Pass <opt> to ocamlopt\ \n -o <name> Generated OCaml library is named <name>.cma or <name>.cmxa\ \n -oc <name> Generated C library is named dll<name>.so or lib<name>.a\ \n -rpath <dir> Same as -dllpath <dir>\ @@ -229,8 +241,9 @@ let build_libs () = if !c_objs <> [] then begin if !dynlink then begin let retcode = command - (Printf.sprintf "%s -o %s %s %s %s %s %s" + (Printf.sprintf "%s %s -o %s %s %s %s %s %s" mkdll + (if !debug then "-g" else "") (prepostfix "dll" !output_c ext_dll) (String.concat " " !c_objs) (String.concat " " !c_opts) @@ -248,9 +261,11 @@ let build_libs () = end; if !bytecode_objs <> [] then scommand - (sprintf "%s -a %s -o %s.cma %s %s -dllib -l%s -cclib -l%s %s %s %s %s" + (sprintf "%s -a %s %s %s -o %s.cma %s %s -dllib -l%s -cclib -l%s %s %s %s %s" (transl_path !ocamlc) + (if !debug then "-g" else "") (if !dynlink then "" else "-custom") + (String.concat " " !ocamlc_opts) !output (String.concat " " !caml_opts) (String.concat " " !bytecode_objs) @@ -262,8 +277,10 @@ let build_libs () = (String.concat " " !caml_libs)); if !native_objs <> [] then scommand - (sprintf "%s -a -o %s.cmxa %s %s -cclib -l%s %s %s %s %s" + (sprintf "%s -a %s %s -o %s.cmxa %s %s -cclib -l%s %s %s %s %s" (transl_path !ocamlopt) + (if !debug then "-g" else "") + (String.concat " " !ocamlopt_opts) !output (String.concat " " !caml_opts) (String.concat " " !native_objs) From 0f1669ebb0f558ec63cc53cabeda7422cd936f86 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sat, 27 Dec 2014 08:44:33 +0000 Subject: [PATCH 125/494] PR#6729: Makefile: remove suffix rules to avoid -jN race conditions (Peter Zotov) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15749 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- asmrun/Makefile | 30 ++++++++++++------------------ asmrun/Makefile.nt | 6 ++---- byterun/Makefile | 17 ++++------------- byterun/Makefile.nt | 11 ++++------- yacc/Makefile.nt | 6 ++---- 5 files changed, 24 insertions(+), 46 deletions(-) diff --git a/asmrun/Makefile b/asmrun/Makefile index 63ff80c687..552759c81b 100644 --- a/asmrun/Makefile +++ b/asmrun/Makefile @@ -173,33 +173,27 @@ LINKEDFILES=misc.c freelist.c major_gc.c minor_gc.c memory.c alloc.c array.c \ clean:: rm -f $(LINKEDFILES) -.SUFFIXES: .S .d.o .p.o - -.S.o: - $(ASPP) -DSYS_$(SYSTEM) -DMODEL_$(MODEL) -o $*.o $*.S || \ +%.o: %.S + $(ASPP) -DSYS_$(SYSTEM) -DMODEL_$(MODEL) -o $@ $< || \ { echo "If your assembler produced syntax errors, it is probably";\ echo "unhappy with the preprocessor. Check your assembler, or";\ echo "try producing $*.o by hand.";\ exit 2; } -.S.p.o: - $(ASPP) -DSYS_$(SYSTEM) -DMODEL_$(MODEL) $(ASPPPROFFLAGS) -o $*.p.o $*.S +%.p.o: %.S + $(ASPP) -DSYS_$(SYSTEM) -DMODEL_$(MODEL) $(ASPPPROFFLAGS) -o $@ $< -.c.d.o: - ln -s -f $*.c $*.d.c - $(CC) -c $(DFLAGS) $*.d.c - rm -f $*.d.c +%.d.o: %.c + $(CC) -c $(DFLAGS) -o $@ $< -.c.p.o: - ln -s -f $*.c $*.p.c - $(CC) -c $(PFLAGS) $*.p.c - rm -f $*.p.c +%.p.o: %.c + $(CC) -c $(PFLAGS) -o $@ $< -.s.o: - $(ASPP) -DSYS_$(SYSTEM) -o $*.o $*.s +%.o: %.s + $(ASPP) -DSYS_$(SYSTEM) -o $@ $< -.s.p.o: - $(ASPP) -DSYS_$(SYSTEM) $(ASPPPROFFLAGS) -o $*.p.o $*.s +%.p.o: %.s + $(ASPP) -DSYS_$(SYSTEM) $(ASPPPROFFLAGS) -o $@ $< clean:: rm -f *.o *.a *~ diff --git a/asmrun/Makefile.nt b/asmrun/Makefile.nt index 77c2002d4f..f0a033eae7 100644 --- a/asmrun/Makefile.nt +++ b/asmrun/Makefile.nt @@ -68,10 +68,8 @@ $(LINKEDFILES): %.c: ../byterun/%.c win32.$(O): ../byterun/win32.c $(CC) -c $(NATIVECCCOMPOPTS) -DNATIVE_CODE $(IFLEXDIR) ../byterun/win32.c -.SUFFIXES: .c .$(O) - -.c.$(O): - $(CC) $(CFLAGS) -c $< +%.c: %.$(O) + $(CC) $(CFLAGS) -c -o $@ $< clean:: rm -f $(LINKEDFILES) diff --git a/byterun/Makefile b/byterun/Makefile index 816dd75e51..f77ed4956c 100644 --- a/byterun/Makefile +++ b/byterun/Makefile @@ -51,20 +51,11 @@ install:: clean:: rm -f libcamlrun_shared.so -.SUFFIXES: .d.o .pic.o +%.d.o: %.c + $(CC) -c $(DFLAGS) $< -o $@ -.c.d.o: - ln -s -f $*.c $*.d.c - $(CC) -c $(DFLAGS) $*.d.c - rm $*.d.c - -.c.pic.o: - ln -s -f $*.c $*.pic.c - $(CC) -c $(CFLAGS) $(SHAREDCCCOMPOPTS) $*.pic.c - rm $*.pic.c - -clean:: - rm -f *.pic.c *.d.c +%.pic.o: %.c + $(CC) -c $(CFLAGS) $(SHAREDCCCOMPOPTS) $< -o $@ depend : prims.c opnames.h jumptbl.h version.h -gcc -MM $(BYTECCCOMPOPTS) *.c > .depend diff --git a/byterun/Makefile.nt b/byterun/Makefile.nt index af28818842..d912eb97e2 100644 --- a/byterun/Makefile.nt +++ b/byterun/Makefile.nt @@ -33,14 +33,11 @@ libcamlrun.$(A): $(OBJS) libcamlrund.$(A): $(DOBJS) $(call MKLIB,libcamlrund.$(A),$(DOBJS)) -.SUFFIXES: .$(O) .$(DBGO) +%.c: %.$(O) + $(CC) $(CFLAGS) $(BYTECCCOMPOPTS) -c -o $@ $< -.c.$(O): - $(CC) $(CFLAGS) $(BYTECCCOMPOPTS) -c $< - -.c.$(DBGO): - $(CC) $(CFLAGS) $(BYTECCDBGCOMPOPTS) -c $< - mv $*.$(O) $*.$(DBGO) +%.c: %.$(DBGO) + $(CC) $(CFLAGS) $(BYTECCDBGCOMPOPTS) -c -o $@ $< .depend.nt: .depend rm -f .depend.win32 diff --git a/yacc/Makefile.nt b/yacc/Makefile.nt index 32caa41e9d..b7284055aa 100644 --- a/yacc/Makefile.nt +++ b/yacc/Makefile.nt @@ -29,10 +29,8 @@ version.h : ../VERSION clean: rm -f *.$(O) ocamlyacc.exe *~ version.h -.SUFFIXES: .c .$(O) - -.c.$(O): - $(BYTECC) -DNDEBUG -DNO_UNIX $(BYTECCCOMPOPTS) -c $< +%.$(O): %.c + $(BYTECC) -DNDEBUG -DNO_UNIX $(BYTECCCOMPOPTS) -c -o $@ $< depend: From 4892549bfe2737eef0b452f42729181c45581a44 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sat, 27 Dec 2014 09:22:43 +0000 Subject: [PATCH 126/494] PR#6475: accept -o in ocamlc when compiling C files (Vincent Laporte, Peter Zotov) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15753 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 4 ++++ bytecomp/bytelink.ml | 2 +- driver/compile.ml | 2 +- driver/optcompile.ml | 2 +- ocamlbuild/ocaml_specific.ml | 4 +--- ocamlbuild/testsuite/internal.ml | 7 +++++++ utils/ccomp.ml | 5 +++-- utils/ccomp.mli | 2 +- 8 files changed, 19 insertions(+), 9 deletions(-) diff --git a/Changes b/Changes index 513953b62f..0178bfcf6c 100644 --- a/Changes +++ b/Changes @@ -1,6 +1,10 @@ OCaml 4.02.2: ------------- +Compilers: +- PR#6475: accept -o in ocamlc when compiling C files + (Vincent Laporte, Peter Zotov) + Toplevel and debugger: - PR#5958: generalized polymorphic #install_printer (Pierre Chambart and Grégoire Henry) diff --git a/bytecomp/bytelink.ml b/bytecomp/bytelink.ml index ded549489c..bc9779908b 100644 --- a/bytecomp/bytelink.ml +++ b/bytecomp/bytelink.ml @@ -580,7 +580,7 @@ let link ppf objfiles output_name = link_bytecode_as_c ppf tolink c_file; if not (Filename.check_suffix output_name ".c") then begin temps := c_file :: !temps; - if Ccomp.compile_file c_file <> 0 then raise(Error Custom_runtime); + if Ccomp.compile_file ~output_name:(Some obj_file) c_file <> 0 then raise(Error Custom_runtime); if not (Filename.check_suffix output_name Config.ext_obj) then begin temps := obj_file :: !temps; if not ( diff --git a/driver/compile.ml b/driver/compile.ml index 3b5d2ae077..7ce751ec70 100644 --- a/driver/compile.ml +++ b/driver/compile.ml @@ -107,4 +107,4 @@ let implementation ppf sourcefile outputprefix = let c_file name = Location.input_name := name; - if Ccomp.compile_file name <> 0 then exit 2 + if Ccomp.compile_file ~output_name:!Clflags.output_name name <> 0 then exit 2 diff --git a/driver/optcompile.ml b/driver/optcompile.ml index f0ef78d1cb..9a0f703f2b 100644 --- a/driver/optcompile.ml +++ b/driver/optcompile.ml @@ -100,4 +100,4 @@ let implementation ppf sourcefile outputprefix = raise x let c_file name = - if Ccomp.compile_file name <> 0 then exit 2 + if Ccomp.compile_file ~output_name:!Clflags.output_name name <> 0 then exit 2 diff --git a/ocamlbuild/ocaml_specific.ml b/ocamlbuild/ocaml_specific.ml index 1d0b8a8e47..04459c7ff3 100644 --- a/ocamlbuild/ocaml_specific.ml +++ b/ocamlbuild/ocaml_specific.ml @@ -472,9 +472,7 @@ rule "ocaml C stubs: c -> o" let c = env "%.c" in let o = env x_o in let comp = if Tags.mem "native" (tags_of_pathname c) then !Options.ocamlopt else !Options.ocamlc in - let cc = Cmd(S[comp; T(tags_of_pathname c++"c"++"compile"); A"-c"; Px c]) in - if Pathname.dirname o = Pathname.current_dir_name then cc - else Seq[cc; mv (Pathname.basename o) o] + Cmd(S[comp; T(tags_of_pathname c++"c"++"compile"); A"-c"; A"-o"; P o; Px c]) end;; rule "ocaml: ml & ml.depends & *cmi -> .inferred.mli" diff --git a/ocamlbuild/testsuite/internal.ml b/ocamlbuild/testsuite/internal.ml index d0071543f0..d02946bf4d 100644 --- a/ocamlbuild/testsuite/internal.ml +++ b/ocamlbuild/testsuite/internal.ml @@ -314,4 +314,11 @@ let () = test "OpenDependencies" ~matching:[M.f "b.byte"] ~targets:("b.byte",[]) ();; +let () = test "OCamlcC" + ~options:[`no_ocamlfind] + ~description:"Build a C file using ocamlc (PR#6475)" + ~tree:[T.d "nested" [T.f "foo.c" ~content:"void f(){}"]] + ~matching:[_build [M.d "nested" [M.f "foo.o"]]] + ~targets:("nested/foo.o",[]) ();; + run ~root:"_test_internal";; diff --git a/utils/ccomp.ml b/utils/ccomp.ml index bbc8e3f0b3..a1c45ec029 100644 --- a/utils/ccomp.ml +++ b/utils/ccomp.ml @@ -48,16 +48,17 @@ let quote_optfile = function | None -> "" | Some f -> Filename.quote f -let compile_file name = +let compile_file ~output_name name = command (Printf.sprintf - "%s -c %s %s %s %s" + "%s%s -c %s %s %s %s" (match !Clflags.c_compiler with | Some cc -> cc | None -> if !Clflags.native_code then Config.native_c_compiler else Config.bytecomp_c_compiler) + (match output_name with Some n -> " -o " ^ Filename.quote n | None -> "") (String.concat " " (List.rev !Clflags.all_ccopts)) (quote_prefixed "-I" (List.rev !Clflags.include_dirs)) (Clflags.std_include_flag "-I") diff --git a/utils/ccomp.mli b/utils/ccomp.mli index 63a190c339..897c2abbfa 100644 --- a/utils/ccomp.mli +++ b/utils/ccomp.mli @@ -14,7 +14,7 @@ val command: string -> int val run_command: string -> unit -val compile_file: string -> int +val compile_file: output_name:string option -> string -> int val create_archive: string -> string list -> int val expand_libname: string -> string val quote_files: string list -> string From 8d3efe344b9fe98899384af2b34d1a42b933b986 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sat, 27 Dec 2014 10:57:07 +0000 Subject: [PATCH 127/494] PR#6729: minor Makefile.nt fix git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15756 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- asmrun/Makefile.nt | 2 +- byterun/Makefile.nt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/asmrun/Makefile.nt b/asmrun/Makefile.nt index f0a033eae7..2b4c090a43 100644 --- a/asmrun/Makefile.nt +++ b/asmrun/Makefile.nt @@ -68,7 +68,7 @@ $(LINKEDFILES): %.c: ../byterun/%.c win32.$(O): ../byterun/win32.c $(CC) -c $(NATIVECCCOMPOPTS) -DNATIVE_CODE $(IFLEXDIR) ../byterun/win32.c -%.c: %.$(O) +%.$(O): %.c $(CC) $(CFLAGS) -c -o $@ $< clean:: diff --git a/byterun/Makefile.nt b/byterun/Makefile.nt index d912eb97e2..a363669db8 100644 --- a/byterun/Makefile.nt +++ b/byterun/Makefile.nt @@ -33,10 +33,10 @@ libcamlrun.$(A): $(OBJS) libcamlrund.$(A): $(DOBJS) $(call MKLIB,libcamlrund.$(A),$(DOBJS)) -%.c: %.$(O) +%.$(O): %.c $(CC) $(CFLAGS) $(BYTECCCOMPOPTS) -c -o $@ $< -%.c: %.$(DBGO) +%.$(DBGO): %.c $(CC) $(CFLAGS) $(BYTECCDBGCOMPOPTS) -c -o $@ $< .depend.nt: .depend From ca53e9558ea358d7f3919a6298838d23abb16686 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Mon, 5 Jan 2015 21:50:31 +0000 Subject: [PATCH 128/494] fix wrong compiling option for making dependencies git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15762 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- asmrun/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asmrun/Makefile b/asmrun/Makefile index 552759c81b..15732755ce 100644 --- a/asmrun/Makefile +++ b/asmrun/Makefile @@ -201,6 +201,6 @@ clean:: depend: $(COBJS:.o=.c) ${LINKEDFILES} -gcc -MM $(FLAGS) *.c > .depend gcc -MM $(FLAGS) -DDEBUG *.c | sed -e 's/\.o/.d.o/' >> .depend - gcc -MM $(FLAGS) -DDEBUG *.c | sed -e 's/\.o/.p.o/' >> .depend + gcc -MM $(FLAGS) -DPROFILING *.c | sed -e 's/\.o/.p.o/' >> .depend include .depend From 068242b2178b9b40f8b106281034ea397cd6a6ca Mon Sep 17 00:00:00 2001 From: Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> Date: Fri, 16 Jan 2015 02:02:06 +0000 Subject: [PATCH 129/494] PR#6600: make -short-paths faster by building the printing map incrementally git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15774 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ typing/env.ml | 34 +++++++++++++++++++++++----------- typing/env.mli | 4 +++- typing/printtyp.ml | 34 ++++++++++++++++++++-------------- 4 files changed, 48 insertions(+), 26 deletions(-) diff --git a/Changes b/Changes index 0178bfcf6c..b06328d148 100644 --- a/Changes +++ b/Changes @@ -4,6 +4,8 @@ OCaml 4.02.2: Compilers: - PR#6475: accept -o in ocamlc when compiling C files (Vincent Laporte, Peter Zotov) +- PR#6600: make -short-paths faster by building the printing map + incrementally (Jacques Garrigue) Toplevel and debugger: - PR#5958: generalized polymorphic #install_printer diff --git a/typing/env.ml b/typing/env.ml index 7df1566073..b30ef659c6 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -927,20 +927,25 @@ let lookup_cltype lid env = (* Iter on an environment (ignoring the body of functors and not yet evaluated structures) *) -let iter_env proj1 proj2 f env = +type iter_cont = unit -> unit +let iter_env_cont = ref [] + +let iter_env proj1 proj2 f env () = Ident.iter (fun id (x,_) -> f (Pident id) x) (proj1 env); let rec iter_components path path' mcomps = (* if EnvLazy.is_val mcomps then *) - match EnvLazy.force !components_of_module_maker' mcomps with - Structure_comps comps -> - Tbl.iter - (fun s (d, n) -> f (Pdot (path, s, n)) (Pdot (path', s, n), d)) - (proj2 comps); - Tbl.iter - (fun s (c, n) -> - iter_components (Pdot (path, s, n)) (Pdot (path', s, n)) c) - comps.comp_components - | Functor_comps _ -> () + let cont () = + match EnvLazy.force !components_of_module_maker' mcomps with + Structure_comps comps -> + Tbl.iter + (fun s (d, n) -> f (Pdot (path, s, n)) (Pdot (path', s, n), d)) + (proj2 comps); + Tbl.iter + (fun s (c, n) -> + iter_components (Pdot (path, s, n)) (Pdot (path', s, n)) c) + comps.comp_components + | Functor_comps _ -> () + in iter_env_cont := (path, cont) :: !iter_env_cont in Hashtbl.iter (fun s pso -> @@ -953,6 +958,13 @@ let iter_env proj1 proj2 f env = (fun id ((path, comps), _) -> iter_components (Pident id) path comps) env.components +let run_iter_cont l = + iter_env_cont := []; + List.iter (fun c -> c ()) l; + let cont = List.rev !iter_env_cont in + iter_env_cont := []; + cont + let iter_types f = iter_env (fun env -> env.types) (fun sc -> sc.comp_types) f let same_types env1 env2 = diff --git a/typing/env.mli b/typing/env.mli index ed2f6f1c50..607406a914 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -37,9 +37,11 @@ type type_descriptions = constructor_description list * label_description list (* For short-paths *) +type iter_cont val iter_types: (Path.t -> Path.t * (type_declaration * type_descriptions) -> unit) -> - t -> unit + t -> iter_cont +val run_iter_cont: iter_cont list -> (Path.t * iter_cont) list val same_types: t -> t -> bool val used_persistent: unit -> Concr.t val find_shadowed_types: Path.t -> t -> Path.t list diff --git a/typing/printtyp.ml b/typing/printtyp.ml index 920c28b5c1..881e410653 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -216,6 +216,8 @@ let apply_subst s1 tyl = type best_path = Paths of Path.t list | Best of Path.t let printing_env = ref Env.empty +let printing_depth = ref 0 +let printing_cont = ref ([] : Env.iter_cont list) let printing_old = ref Env.empty let printing_pers = ref Concr.empty module Path2 = struct @@ -232,7 +234,7 @@ module Path2 = struct | _ -> Pervasives.compare p1 p2 end module PathMap = Map.Make(Path2) -let printing_map = ref (Lazy.from_val PathMap.empty) +let printing_map = ref PathMap.empty let same_type t t' = repr t == repr t' @@ -287,24 +289,24 @@ let set_printing_env env = (* printf "Reset printing_map@."; *) printing_old := env; printing_pers := Env.used_persistent (); - printing_map := lazy begin - (* printf "Recompute printing_map.@."; *) - let map = ref PathMap.empty in + printing_map := PathMap.empty; + printing_depth := 0; + (* printf "Recompute printing_map.@."; *) + let cont = Env.iter_types (fun p (p', decl) -> let (p1, s1) = normalize_type_path env p' ~cache:true in (* Format.eprintf "%a -> %a = %a@." path p path p' path p1 *) if s1 = Id then try - let r = PathMap.find p1 !map in + let r = PathMap.find p1 !printing_map in match !r with Paths l -> r := Paths (p :: l) - | Best _ -> assert false + | Best p' -> r := Paths [p; p'] (* assert false *) with Not_found -> - map := PathMap.add p1 (ref (Paths [p])) !map) - env; - !map - end + printing_map := PathMap.add p1 (ref (Paths [p])) !printing_map) + env in + printing_cont := [cont]; end let wrap_printing_env env f = @@ -347,10 +349,14 @@ let best_type_path p = then (p, Id) else let (p', s) = normalize_type_path !printing_env p in - let p'' = - try get_best_path (PathMap.find p' (Lazy.force !printing_map)) - with Not_found -> p' - in + let get_path () = get_best_path (PathMap.find p' !printing_map) in + while !printing_cont <> [] && + try ignore (get_path ()); false with Not_found -> true + do + printing_cont := List.map snd (Env.run_iter_cont !printing_cont); + incr printing_depth; + done; + let p'' = try get_path () with Not_found -> p' in (* Format.eprintf "%a = %a -> %a@." path p path p' path p''; *) (p'', s) From f11b580cd3db9061ddda80c58f4c6b034f5a97f9 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 20 Jan 2015 19:32:41 +0000 Subject: [PATCH 130/494] move declaration into `extern "C"` block git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15785 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- byterun/mlvalues.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/byterun/mlvalues.h b/byterun/mlvalues.h index 268bcfe9ff..fe4a8f0953 100644 --- a/byterun/mlvalues.h +++ b/byterun/mlvalues.h @@ -296,10 +296,10 @@ CAMLextern header_t caml_atom_table[]; extern value caml_global_data; +CAMLextern value caml_set_oo_id(value obj); + #ifdef __cplusplus } #endif -CAMLextern value caml_set_oo_id(value obj); - #endif /* CAML_MLVALUES_H */ From f42d5c2be4010206f0abd1a2faba42187ea416c5 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 20 Jan 2015 19:33:26 +0000 Subject: [PATCH 131/494] update `.depend` files git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15786 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- .depend | 116 ++-- asmrun/.depend | 1266 +++++++++++++++++----------------- byterun/.depend | 571 ++++++++------- debugger/.depend | 2 +- lex/.depend | 6 +- ocamlbuild/.depend | 50 +- ocamldoc/.depend | 26 +- otherlibs/bigarray/.depend | 30 +- otherlibs/graph/.depend | 160 ++--- otherlibs/num/.depend | 22 +- otherlibs/str/.depend | 10 +- otherlibs/systhreads/.depend | 20 +- otherlibs/threads/.depend | 38 +- otherlibs/unix/.depend | 816 +++++++++++----------- stdlib/.depend | 58 +- tools/.depend | 4 +- 16 files changed, 1576 insertions(+), 1619 deletions(-) diff --git a/.depend b/.depend index 5d95a9bb65..32b0b62b3c 100644 --- a/.depend +++ b/.depend @@ -94,10 +94,10 @@ typing/ctype.cmi : typing/types.cmi typing/path.cmi parsing/longident.cmi \ typing/ident.cmi typing/env.cmi parsing/asttypes.cmi typing/datarepr.cmi : typing/types.cmi typing/path.cmi typing/ident.cmi \ parsing/asttypes.cmi +typing/envaux.cmi : typing/subst.cmi typing/path.cmi typing/env.cmi typing/env.cmi : utils/warnings.cmi typing/types.cmi typing/subst.cmi \ typing/path.cmi parsing/longident.cmi parsing/location.cmi \ typing/ident.cmi utils/consistbl.cmi parsing/asttypes.cmi -typing/envaux.cmi : typing/subst.cmi typing/path.cmi typing/env.cmi typing/ident.cmi : typing/includeclass.cmi : typing/types.cmi typing/env.cmi typing/ctype.cmi typing/includecore.cmi : typing/types.cmi typing/typedtree.cmi \ @@ -115,10 +115,10 @@ typing/parmatch.cmi : typing/types.cmi typing/typedtree.cmi \ typing/path.cmi : typing/ident.cmi typing/predef.cmi : typing/types.cmi typing/path.cmi typing/ident.cmi typing/primitive.cmi : +typing/printtyped.cmi : typing/typedtree.cmi typing/printtyp.cmi : typing/types.cmi typing/path.cmi \ typing/outcometree.cmi parsing/longident.cmi typing/ident.cmi \ typing/env.cmi -typing/printtyped.cmi : typing/typedtree.cmi typing/stypes.cmi : typing/typedtree.cmi parsing/location.cmi \ typing/annot.cmi typing/subst.cmi : typing/types.cmi typing/path.cmi typing/ident.cmi @@ -131,11 +131,11 @@ typing/typecore.cmi : typing/types.cmi typing/typedtree.cmi typing/path.cmi \ typing/typedecl.cmi : typing/types.cmi typing/typedtree.cmi typing/path.cmi \ parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ typing/includecore.cmi typing/ident.cmi typing/env.cmi +typing/typedtreeIter.cmi : typing/typedtree.cmi parsing/asttypes.cmi +typing/typedtreeMap.cmi : typing/typedtree.cmi typing/typedtree.cmi : typing/types.cmi typing/primitive.cmi typing/path.cmi \ parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ typing/ident.cmi typing/env.cmi parsing/asttypes.cmi -typing/typedtreeIter.cmi : typing/typedtree.cmi parsing/asttypes.cmi -typing/typedtreeMap.cmi : typing/typedtree.cmi typing/typemod.cmi : typing/types.cmi typing/typedtree.cmi typing/path.cmi \ parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ typing/includemod.cmi typing/ident.cmi typing/env.cmi \ @@ -176,6 +176,12 @@ typing/datarepr.cmo : typing/types.cmi typing/path.cmi parsing/location.cmi \ typing/datarepr.cmx : typing/types.cmx typing/path.cmx parsing/location.cmx \ typing/ident.cmx typing/btype.cmx parsing/asttypes.cmi \ typing/datarepr.cmi +typing/envaux.cmo : typing/types.cmi typing/subst.cmi typing/printtyp.cmi \ + typing/path.cmi utils/misc.cmi typing/ident.cmi typing/env.cmi \ + parsing/asttypes.cmi typing/envaux.cmi +typing/envaux.cmx : typing/types.cmx typing/subst.cmx typing/printtyp.cmx \ + typing/path.cmx utils/misc.cmx typing/ident.cmx typing/env.cmx \ + parsing/asttypes.cmi typing/envaux.cmi typing/env.cmo : utils/warnings.cmi typing/types.cmi utils/tbl.cmi \ typing/subst.cmi typing/predef.cmi typing/path.cmi utils/misc.cmi \ parsing/longident.cmi parsing/location.cmi typing/ident.cmi \ @@ -188,12 +194,6 @@ typing/env.cmx : utils/warnings.cmx typing/types.cmx utils/tbl.cmx \ typing/datarepr.cmx utils/consistbl.cmx utils/config.cmx \ typing/cmi_format.cmx utils/clflags.cmx typing/btype.cmx \ parsing/asttypes.cmi typing/env.cmi -typing/envaux.cmo : typing/types.cmi typing/subst.cmi typing/printtyp.cmi \ - typing/path.cmi utils/misc.cmi typing/ident.cmi typing/env.cmi \ - parsing/asttypes.cmi typing/envaux.cmi -typing/envaux.cmx : typing/types.cmx typing/subst.cmx typing/printtyp.cmx \ - typing/path.cmx utils/misc.cmx typing/ident.cmx typing/env.cmx \ - parsing/asttypes.cmi typing/envaux.cmi typing/ident.cmo : typing/ident.cmi typing/ident.cmx : typing/ident.cmi typing/includeclass.cmo : typing/types.cmi typing/printtyp.cmi \ @@ -252,6 +252,12 @@ typing/predef.cmx : typing/types.cmx typing/path.cmx parsing/location.cmx \ typing/ident.cmx typing/btype.cmx parsing/asttypes.cmi typing/predef.cmi typing/primitive.cmo : utils/misc.cmi typing/primitive.cmi typing/primitive.cmx : utils/misc.cmx typing/primitive.cmi +typing/printtyped.cmo : typing/typedtree.cmi parsing/printast.cmi \ + typing/path.cmi utils/misc.cmi parsing/longident.cmi parsing/location.cmi \ + typing/ident.cmi parsing/asttypes.cmi typing/printtyped.cmi +typing/printtyped.cmx : typing/typedtree.cmx parsing/printast.cmx \ + typing/path.cmx utils/misc.cmx parsing/longident.cmx parsing/location.cmx \ + typing/ident.cmx parsing/asttypes.cmi typing/printtyped.cmi typing/printtyp.cmo : typing/types.cmi typing/primitive.cmi \ typing/predef.cmi typing/path.cmi typing/outcometree.cmi \ typing/oprint.cmi utils/misc.cmi parsing/longident.cmi \ @@ -264,12 +270,6 @@ typing/printtyp.cmx : typing/types.cmx typing/primitive.cmx \ parsing/location.cmx typing/ident.cmx typing/env.cmx typing/ctype.cmx \ utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi \ typing/printtyp.cmi -typing/printtyped.cmo : typing/typedtree.cmi parsing/printast.cmi \ - typing/path.cmi utils/misc.cmi parsing/longident.cmi parsing/location.cmi \ - typing/ident.cmi parsing/asttypes.cmi typing/printtyped.cmi -typing/printtyped.cmx : typing/typedtree.cmx parsing/printast.cmx \ - typing/path.cmx utils/misc.cmx parsing/longident.cmx parsing/location.cmx \ - typing/ident.cmx parsing/asttypes.cmi typing/printtyped.cmi typing/stypes.cmo : typing/typedtree.cmi typing/printtyp.cmi \ parsing/location.cmi utils/clflags.cmi typing/annot.cmi typing/stypes.cmi typing/stypes.cmx : typing/typedtree.cmx typing/printtyp.cmx \ @@ -332,14 +332,6 @@ typing/typedecl.cmx : utils/warnings.cmx typing/typetexp.cmx \ typing/ident.cmx typing/env.cmx typing/ctype.cmx utils/config.cmx \ utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi \ parsing/ast_helper.cmx typing/typedecl.cmi -typing/typedtree.cmo : typing/types.cmi typing/primitive.cmi typing/path.cmi \ - parsing/parsetree.cmi utils/misc.cmi parsing/longident.cmi \ - parsing/location.cmi typing/ident.cmi typing/env.cmi parsing/asttypes.cmi \ - typing/typedtree.cmi -typing/typedtree.cmx : typing/types.cmx typing/primitive.cmx typing/path.cmx \ - parsing/parsetree.cmi utils/misc.cmx parsing/longident.cmx \ - parsing/location.cmx typing/ident.cmx typing/env.cmx parsing/asttypes.cmi \ - typing/typedtree.cmi typing/typedtreeIter.cmo : typing/typedtree.cmi utils/misc.cmi \ parsing/asttypes.cmi typing/typedtreeIter.cmi typing/typedtreeIter.cmx : typing/typedtree.cmx utils/misc.cmx \ @@ -348,6 +340,14 @@ typing/typedtreeMap.cmo : typing/typedtree.cmi utils/misc.cmi \ typing/typedtreeMap.cmi typing/typedtreeMap.cmx : typing/typedtree.cmx utils/misc.cmx \ typing/typedtreeMap.cmi +typing/typedtree.cmo : typing/types.cmi typing/primitive.cmi typing/path.cmi \ + parsing/parsetree.cmi utils/misc.cmi parsing/longident.cmi \ + parsing/location.cmi typing/ident.cmi typing/env.cmi parsing/asttypes.cmi \ + typing/typedtree.cmi +typing/typedtree.cmx : typing/types.cmx typing/primitive.cmx typing/path.cmx \ + parsing/parsetree.cmi utils/misc.cmx parsing/longident.cmx \ + parsing/location.cmx typing/ident.cmx typing/env.cmx parsing/asttypes.cmi \ + typing/typedtree.cmi typing/typemod.cmo : utils/warnings.cmi typing/typetexp.cmi typing/types.cmi \ typing/typedtree.cmi typing/typedecl.cmi typing/typecore.cmi \ typing/typeclass.cmi typing/subst.cmi typing/stypes.cmi \ @@ -578,7 +578,6 @@ bytecomp/typeopt.cmo : typing/types.cmi typing/typedtree.cmi \ bytecomp/typeopt.cmx : typing/types.cmx typing/typedtree.cmx \ typing/predef.cmx typing/path.cmx bytecomp/lambda.cmx typing/ident.cmx \ typing/env.cmx typing/ctype.cmx bytecomp/typeopt.cmi -asmcomp/CSEgen.cmi : asmcomp/mach.cmi asmcomp/asmgen.cmi : bytecomp/lambda.cmi asmcomp/cmm.cmi asmcomp/asmlibrarian.cmi : asmcomp/asmlink.cmi : asmcomp/cmx_format.cmi @@ -586,19 +585,20 @@ asmcomp/asmpackager.cmi : typing/env.cmi asmcomp/clambda.cmi : bytecomp/lambda.cmi typing/ident.cmi \ asmcomp/debuginfo.cmi parsing/asttypes.cmi asmcomp/closure.cmi : bytecomp/lambda.cmi asmcomp/clambda.cmi -asmcomp/cmm.cmi : bytecomp/lambda.cmi typing/ident.cmi asmcomp/debuginfo.cmi asmcomp/cmmgen.cmi : asmcomp/cmx_format.cmi asmcomp/cmm.cmi \ asmcomp/clambda.cmi +asmcomp/cmm.cmi : bytecomp/lambda.cmi typing/ident.cmi asmcomp/debuginfo.cmi asmcomp/cmx_format.cmi : asmcomp/clambda.cmi asmcomp/codegen.cmi : asmcomp/cmm.cmi asmcomp/coloring.cmi : asmcomp/comballoc.cmi : asmcomp/mach.cmi asmcomp/compilenv.cmi : typing/ident.cmi asmcomp/cmx_format.cmi \ asmcomp/clambda.cmi +asmcomp/CSEgen.cmi : asmcomp/mach.cmi asmcomp/deadcode.cmi : asmcomp/mach.cmi asmcomp/debuginfo.cmi : parsing/location.cmi bytecomp/lambda.cmi -asmcomp/emit.cmi : asmcomp/linearize.cmi asmcomp/cmm.cmi asmcomp/emitaux.cmi : asmcomp/debuginfo.cmi +asmcomp/emit.cmi : asmcomp/linearize.cmi asmcomp/cmm.cmi asmcomp/interf.cmi : asmcomp/mach.cmi asmcomp/linearize.cmi : asmcomp/reg.cmi asmcomp/mach.cmi bytecomp/lambda.cmi \ asmcomp/debuginfo.cmi @@ -611,8 +611,8 @@ asmcomp/printlinear.cmi : asmcomp/linearize.cmi asmcomp/printmach.cmi : asmcomp/reg.cmi asmcomp/mach.cmi asmcomp/proc.cmi : asmcomp/reg.cmi asmcomp/mach.cmi asmcomp/reg.cmi : typing/ident.cmi asmcomp/cmm.cmi -asmcomp/reload.cmi : asmcomp/mach.cmi asmcomp/reloadgen.cmi : asmcomp/reg.cmi asmcomp/mach.cmi +asmcomp/reload.cmi : asmcomp/mach.cmi asmcomp/schedgen.cmi : asmcomp/mach.cmi asmcomp/linearize.cmi asmcomp/scheduling.cmi : asmcomp/linearize.cmi asmcomp/selectgen.cmi : utils/tbl.cmi asmcomp/reg.cmi asmcomp/mach.cmi \ @@ -621,12 +621,6 @@ asmcomp/selection.cmi : asmcomp/mach.cmi asmcomp/cmm.cmi asmcomp/spill.cmi : asmcomp/mach.cmi asmcomp/split.cmi : asmcomp/mach.cmi asmcomp/strmatch.cmi : asmcomp/cmm.cmi -asmcomp/CSE.cmo : asmcomp/mach.cmi asmcomp/CSEgen.cmi asmcomp/arch.cmo -asmcomp/CSE.cmx : asmcomp/mach.cmx asmcomp/CSEgen.cmx asmcomp/arch.cmx -asmcomp/CSEgen.cmo : asmcomp/reg.cmi asmcomp/proc.cmi asmcomp/mach.cmi \ - asmcomp/CSEgen.cmi -asmcomp/CSEgen.cmx : asmcomp/reg.cmx asmcomp/proc.cmx asmcomp/mach.cmx \ - asmcomp/CSEgen.cmi asmcomp/arch.cmo : asmcomp/arch.cmx : asmcomp/asmgen.cmo : bytecomp/translmod.cmi asmcomp/split.cmi \ @@ -691,10 +685,6 @@ asmcomp/closure.cmx : utils/tbl.cmx bytecomp/switch.cmx typing/primitive.cmx \ asmcomp/debuginfo.cmx asmcomp/compilenv.cmx utils/clflags.cmx \ asmcomp/clambda.cmx parsing/asttypes.cmi asmcomp/arch.cmx \ asmcomp/closure.cmi -asmcomp/cmm.cmo : bytecomp/lambda.cmi typing/ident.cmi asmcomp/debuginfo.cmi \ - asmcomp/arch.cmo asmcomp/cmm.cmi -asmcomp/cmm.cmx : bytecomp/lambda.cmx typing/ident.cmx asmcomp/debuginfo.cmx \ - asmcomp/arch.cmx asmcomp/cmm.cmi asmcomp/cmmgen.cmo : typing/types.cmi bytecomp/switch.cmi \ asmcomp/strmatch.cmi asmcomp/proc.cmi typing/primitive.cmi utils/misc.cmi \ bytecomp/lambda.cmi typing/ident.cmi asmcomp/debuginfo.cmi \ @@ -707,6 +697,10 @@ asmcomp/cmmgen.cmx : typing/types.cmx bytecomp/switch.cmx \ utils/config.cmx asmcomp/compilenv.cmx asmcomp/cmx_format.cmi \ asmcomp/cmm.cmx utils/clflags.cmx asmcomp/clambda.cmx \ parsing/asttypes.cmi asmcomp/arch.cmx asmcomp/cmmgen.cmi +asmcomp/cmm.cmo : bytecomp/lambda.cmi typing/ident.cmi asmcomp/debuginfo.cmi \ + asmcomp/arch.cmo asmcomp/cmm.cmi +asmcomp/cmm.cmx : bytecomp/lambda.cmx typing/ident.cmx asmcomp/debuginfo.cmx \ + asmcomp/arch.cmx asmcomp/cmm.cmi asmcomp/codegen.cmo : asmcomp/split.cmi asmcomp/spill.cmi asmcomp/reload.cmi \ asmcomp/reg.cmi asmcomp/printmach.cmi asmcomp/printlinear.cmi \ asmcomp/printcmm.cmi asmcomp/liveness.cmi asmcomp/linearize.cmi \ @@ -729,6 +723,12 @@ asmcomp/compilenv.cmo : utils/misc.cmi parsing/location.cmi typing/ident.cmi \ asmcomp/compilenv.cmx : utils/misc.cmx parsing/location.cmx typing/ident.cmx \ typing/env.cmx utils/config.cmx asmcomp/cmx_format.cmi \ asmcomp/clambda.cmx asmcomp/compilenv.cmi +asmcomp/CSEgen.cmo : asmcomp/reg.cmi asmcomp/proc.cmi asmcomp/mach.cmi \ + asmcomp/CSEgen.cmi +asmcomp/CSEgen.cmx : asmcomp/reg.cmx asmcomp/proc.cmx asmcomp/mach.cmx \ + asmcomp/CSEgen.cmi +asmcomp/CSE.cmo : asmcomp/mach.cmi asmcomp/CSEgen.cmi asmcomp/arch.cmo +asmcomp/CSE.cmx : asmcomp/mach.cmx asmcomp/CSEgen.cmx asmcomp/arch.cmx asmcomp/deadcode.cmo : asmcomp/reg.cmi asmcomp/proc.cmi asmcomp/mach.cmi \ asmcomp/deadcode.cmi asmcomp/deadcode.cmx : asmcomp/reg.cmx asmcomp/proc.cmx asmcomp/mach.cmx \ @@ -737,6 +737,10 @@ asmcomp/debuginfo.cmo : parsing/location.cmi bytecomp/lambda.cmi \ asmcomp/debuginfo.cmi asmcomp/debuginfo.cmx : parsing/location.cmx bytecomp/lambda.cmx \ asmcomp/debuginfo.cmi +asmcomp/emitaux.cmo : asmcomp/linearize.cmi asmcomp/debuginfo.cmi \ + utils/config.cmi utils/clflags.cmi asmcomp/arch.cmo asmcomp/emitaux.cmi +asmcomp/emitaux.cmx : asmcomp/linearize.cmx asmcomp/debuginfo.cmx \ + utils/config.cmx utils/clflags.cmx asmcomp/arch.cmx asmcomp/emitaux.cmi asmcomp/emit.cmo : asmcomp/reg.cmi asmcomp/proc.cmi utils/misc.cmi \ asmcomp/mach.cmi asmcomp/linearize.cmi bytecomp/lambda.cmi \ asmcomp/emitaux.cmi asmcomp/debuginfo.cmi utils/config.cmi \ @@ -747,10 +751,6 @@ asmcomp/emit.cmx : asmcomp/reg.cmx asmcomp/proc.cmx utils/misc.cmx \ asmcomp/emitaux.cmx asmcomp/debuginfo.cmx utils/config.cmx \ asmcomp/compilenv.cmx asmcomp/cmm.cmx utils/clflags.cmx asmcomp/arch.cmx \ asmcomp/emit.cmi -asmcomp/emitaux.cmo : asmcomp/linearize.cmi asmcomp/debuginfo.cmi \ - utils/config.cmi utils/clflags.cmi asmcomp/arch.cmo asmcomp/emitaux.cmi -asmcomp/emitaux.cmx : asmcomp/linearize.cmx asmcomp/debuginfo.cmx \ - utils/config.cmx utils/clflags.cmx asmcomp/arch.cmx asmcomp/emitaux.cmi asmcomp/interf.cmo : asmcomp/reg.cmi asmcomp/proc.cmi asmcomp/mach.cmi \ asmcomp/interf.cmi asmcomp/interf.cmx : asmcomp/reg.cmx asmcomp/proc.cmx asmcomp/mach.cmx \ @@ -803,14 +803,14 @@ asmcomp/proc.cmx : asmcomp/reg.cmx utils/misc.cmx asmcomp/mach.cmx \ asmcomp/arch.cmx asmcomp/proc.cmi asmcomp/reg.cmo : typing/ident.cmi asmcomp/cmm.cmi asmcomp/reg.cmi asmcomp/reg.cmx : typing/ident.cmx asmcomp/cmm.cmx asmcomp/reg.cmi -asmcomp/reload.cmo : asmcomp/reloadgen.cmi asmcomp/reg.cmi asmcomp/mach.cmi \ - asmcomp/cmm.cmi utils/clflags.cmi asmcomp/arch.cmo asmcomp/reload.cmi -asmcomp/reload.cmx : asmcomp/reloadgen.cmx asmcomp/reg.cmx asmcomp/mach.cmx \ - asmcomp/cmm.cmx utils/clflags.cmx asmcomp/arch.cmx asmcomp/reload.cmi asmcomp/reloadgen.cmo : asmcomp/reg.cmi utils/misc.cmi asmcomp/mach.cmi \ asmcomp/reloadgen.cmi asmcomp/reloadgen.cmx : asmcomp/reg.cmx utils/misc.cmx asmcomp/mach.cmx \ asmcomp/reloadgen.cmi +asmcomp/reload.cmo : asmcomp/reloadgen.cmi asmcomp/reg.cmi asmcomp/mach.cmi \ + asmcomp/cmm.cmi utils/clflags.cmi asmcomp/arch.cmo asmcomp/reload.cmi +asmcomp/reload.cmx : asmcomp/reloadgen.cmx asmcomp/reg.cmx asmcomp/mach.cmx \ + asmcomp/cmm.cmx utils/clflags.cmx asmcomp/arch.cmx asmcomp/reload.cmi asmcomp/schedgen.cmo : asmcomp/reg.cmi asmcomp/proc.cmi asmcomp/mach.cmi \ asmcomp/linearize.cmi asmcomp/cmm.cmi asmcomp/arch.cmo \ asmcomp/schedgen.cmi @@ -849,8 +849,8 @@ driver/compenv.cmi : driver/compile.cmi : driver/compmisc.cmi : typing/env.cmi driver/errors.cmi : -driver/main.cmi : driver/main_args.cmi : +driver/main.cmi : driver/optcompile.cmi : driver/opterrors.cmi : driver/optmain.cmi : @@ -885,6 +885,8 @@ driver/compmisc.cmx : typing/typemod.cmx utils/misc.cmx \ parsing/asttypes.cmi driver/compmisc.cmi driver/errors.cmo : parsing/location.cmi driver/errors.cmi driver/errors.cmx : parsing/location.cmx driver/errors.cmi +driver/main_args.cmo : utils/warnings.cmi driver/main_args.cmi +driver/main_args.cmx : utils/warnings.cmx driver/main_args.cmi driver/main.cmo : utils/warnings.cmi utils/misc.cmi driver/main_args.cmi \ parsing/location.cmi utils/config.cmi driver/compmisc.cmi \ driver/compile.cmi driver/compenv.cmi utils/clflags.cmi \ @@ -895,8 +897,6 @@ driver/main.cmx : utils/warnings.cmx utils/misc.cmx driver/main_args.cmx \ driver/compile.cmx driver/compenv.cmx utils/clflags.cmx \ bytecomp/bytepackager.cmx bytecomp/bytelink.cmx \ bytecomp/bytelibrarian.cmx driver/main.cmi -driver/main_args.cmo : utils/warnings.cmi driver/main_args.cmi -driver/main_args.cmx : utils/warnings.cmx driver/main_args.cmi driver/optcompile.cmo : utils/warnings.cmi typing/typemod.cmi \ typing/typedtree.cmi typing/typecore.cmi bytecomp/translmod.cmi \ typing/stypes.cmi bytecomp/simplif.cmi typing/printtyped.cmi \ @@ -952,13 +952,15 @@ toplevel/expunge.cmo : bytecomp/symtable.cmi bytecomp/runtimedef.cmi \ toplevel/expunge.cmx : bytecomp/symtable.cmx bytecomp/runtimedef.cmx \ utils/misc.cmx typing/ident.cmx bytecomp/bytesections.cmx toplevel/genprintval.cmo : typing/types.cmi typing/printtyp.cmi \ - typing/predef.cmi typing/path.cmi typing/outcometree.cmi utils/misc.cmi \ - parsing/longident.cmi typing/ident.cmi typing/env.cmi typing/datarepr.cmi \ - typing/ctype.cmi typing/btype.cmi toplevel/genprintval.cmi + typing/predef.cmi typing/path.cmi typing/outcometree.cmi \ + typing/oprint.cmi utils/misc.cmi parsing/longident.cmi typing/ident.cmi \ + typing/env.cmi typing/datarepr.cmi typing/ctype.cmi typing/btype.cmi \ + toplevel/genprintval.cmi toplevel/genprintval.cmx : typing/types.cmx typing/printtyp.cmx \ - typing/predef.cmx typing/path.cmx typing/outcometree.cmi utils/misc.cmx \ - parsing/longident.cmx typing/ident.cmx typing/env.cmx typing/datarepr.cmx \ - typing/ctype.cmx typing/btype.cmx toplevel/genprintval.cmi + typing/predef.cmx typing/path.cmx typing/outcometree.cmi \ + typing/oprint.cmx utils/misc.cmx parsing/longident.cmx typing/ident.cmx \ + typing/env.cmx typing/datarepr.cmx typing/ctype.cmx typing/btype.cmx \ + toplevel/genprintval.cmi toplevel/opttopdirs.cmo : utils/warnings.cmi typing/types.cmi \ typing/printtyp.cmi toplevel/opttoploop.cmi utils/misc.cmi \ parsing/longident.cmi typing/ident.cmi typing/env.cmi typing/ctype.cmi \ @@ -1010,7 +1012,7 @@ toplevel/topdirs.cmo : utils/warnings.cmi typing/typetexp.cmi \ parsing/longident.cmi parsing/location.cmi typing/ident.cmi \ typing/env.cmi bytecomp/dll.cmi typing/ctype.cmi utils/consistbl.cmi \ utils/config.cmi bytecomp/cmo_format.cmi utils/clflags.cmi \ - parsing/asttypes.cmi toplevel/topdirs.cmi + typing/btype.cmi parsing/asttypes.cmi toplevel/topdirs.cmi toplevel/topdirs.cmx : utils/warnings.cmx typing/typetexp.cmx \ typing/types.cmx toplevel/trace.cmx toplevel/toploop.cmx \ bytecomp/symtable.cmx typing/printtyp.cmx typing/predef.cmx \ @@ -1018,7 +1020,7 @@ toplevel/topdirs.cmx : utils/warnings.cmx typing/typetexp.cmx \ parsing/longident.cmx parsing/location.cmx typing/ident.cmx \ typing/env.cmx bytecomp/dll.cmx typing/ctype.cmx utils/consistbl.cmx \ utils/config.cmx bytecomp/cmo_format.cmi utils/clflags.cmx \ - parsing/asttypes.cmi toplevel/topdirs.cmi + typing/btype.cmx parsing/asttypes.cmi toplevel/topdirs.cmi toplevel/toploop.cmo : utils/warnings.cmi typing/types.cmi \ typing/typemod.cmi typing/typedtree.cmi typing/typecore.cmi \ bytecomp/translmod.cmi bytecomp/symtable.cmi bytecomp/simplif.cmi \ diff --git a/asmrun/.depend b/asmrun/.depend index 1088ad8ed0..30043c16fe 100644 --- a/asmrun/.depend +++ b/asmrun/.depend @@ -1,753 +1,753 @@ alloc.o: alloc.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/custom.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/stacks.h \ - ../byterun/memory.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/custom.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ + ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/stacks.h \ + ../byterun/memory.h array.o: array.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/misc.h ../byterun/mlvalues.h backtrace.o: backtrace.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/backtrace.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h stack.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/backtrace.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h stack.h callback.o: callback.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/mlvalues.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/misc.h ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/mlvalues.h compact.o: compact.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/misc.h ../byterun/config.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/memory.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/weak.h + ../byterun/../config/s.h ../byterun/finalise.h ../byterun/roots.h \ + ../byterun/misc.h ../byterun/config.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ + ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/freelist.h \ + ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ + ../byterun/memory.h ../byterun/mlvalues.h ../byterun/roots.h \ + ../byterun/weak.h compare.o: compare.c ../byterun/custom.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/misc.h ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/misc.h ../byterun/mlvalues.h custom.o: custom.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/custom.h ../byterun/fail.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/mlvalues.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/custom.h ../byterun/fail.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ + ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/mlvalues.h debugger.o: debugger.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/config.h ../byterun/debugger.h \ - ../byterun/misc.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/config.h ../byterun/debugger.h \ + ../byterun/misc.h dynlink.o: dynlink.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/dynlink.h \ - ../byterun/fail.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/osdeps.h \ - ../byterun/prims.h + ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ + ../byterun/config.h ../byterun/mlvalues.h ../byterun/dynlink.h \ + ../byterun/fail.h ../byterun/mlvalues.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/misc.h ../byterun/osdeps.h \ + ../byterun/prims.h extern.o: extern.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/custom.h ../byterun/fail.h \ - ../byterun/gc.h ../byterun/intext.h ../byterun/io.h ../byterun/io.h \ - ../byterun/md5.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/reverse.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/custom.h ../byterun/fail.h \ + ../byterun/gc.h ../byterun/intext.h ../byterun/io.h ../byterun/io.h \ + ../byterun/md5.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/misc.h ../byterun/mlvalues.h ../byterun/reverse.h fail.o: fail.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/io.h ../byterun/gc.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/printexc.h \ - ../byterun/signals.h stack.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/callback.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/fail.h ../byterun/io.h ../byterun/gc.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/printexc.h \ + ../byterun/signals.h stack.h ../byterun/roots.h ../byterun/memory.h \ + ../byterun/callback.h finalise.o: finalise.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/mlvalues.h \ - ../byterun/roots.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/signals.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/misc.h ../byterun/fail.h ../byterun/mlvalues.h \ + ../byterun/roots.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/signals.h floats.o: floats.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/fail.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/reverse.h ../byterun/stacks.h ../byterun/memory.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/fail.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/misc.h \ + ../byterun/reverse.h ../byterun/stacks.h ../byterun/memory.h freelist.o: freelist.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/major_gc.h ../byterun/misc.h ../byterun/mlvalues.h + ../byterun/../config/s.h ../byterun/freelist.h ../byterun/misc.h \ + ../byterun/config.h ../byterun/mlvalues.h ../byterun/gc.h \ + ../byterun/gc_ctrl.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/major_gc.h ../byterun/misc.h ../byterun/mlvalues.h gc_ctrl.o: gc_ctrl.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/compact.h ../byterun/custom.h \ - ../byterun/finalise.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/freelist.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h stack.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/compact.h ../byterun/custom.h \ + ../byterun/finalise.h ../byterun/roots.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/freelist.h ../byterun/gc.h \ + ../byterun/gc_ctrl.h ../byterun/major_gc.h ../byterun/minor_gc.h \ + ../byterun/misc.h ../byterun/mlvalues.h stack.h globroots.o: globroots.c ../byterun/memory.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/globroots.h ../byterun/roots.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/gc.h \ + ../byterun/mlvalues.h ../byterun/misc.h ../byterun/major_gc.h \ + ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/misc.h \ + ../byterun/mlvalues.h ../byterun/roots.h ../byterun/memory.h \ + ../byterun/globroots.h ../byterun/roots.h hash.o: hash.c ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/hash.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ + ../byterun/custom.h ../byterun/mlvalues.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/hash.h intern.o: intern.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/callback.h ../byterun/custom.h \ - ../byterun/fail.h ../byterun/gc.h ../byterun/intext.h ../byterun/io.h \ - ../byterun/io.h ../byterun/md5.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/reverse.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/callback.h ../byterun/custom.h \ + ../byterun/fail.h ../byterun/gc.h ../byterun/intext.h ../byterun/io.h \ + ../byterun/io.h ../byterun/md5.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/mlvalues.h ../byterun/misc.h ../byterun/reverse.h ints.o: ints.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/custom.h ../byterun/fail.h ../byterun/intext.h \ - ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/custom.h ../byterun/fail.h ../byterun/intext.h \ + ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/misc.h ../byterun/mlvalues.h io.o: io.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/custom.h \ - ../byterun/fail.h ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/signals.h \ - ../byterun/sys.h + ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ + ../byterun/config.h ../byterun/mlvalues.h ../byterun/custom.h \ + ../byterun/fail.h ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/misc.h ../byterun/mlvalues.h ../byterun/signals.h \ + ../byterun/sys.h lexing.o: lexing.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/mlvalues.h ../byterun/stacks.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/mlvalues.h ../byterun/stacks.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ + ../byterun/freelist.h ../byterun/minor_gc.h main.o: main.c ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/sys.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/misc.h ../byterun/sys.h major_gc.o: major_gc.c ../byterun/compact.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/fail.h ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/weak.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ + ../byterun/custom.h ../byterun/mlvalues.h ../byterun/config.h \ + ../byterun/fail.h ../byterun/finalise.h ../byterun/roots.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ + ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/freelist.h \ + ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ + ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ + ../byterun/weak.h md5.o: md5.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/md5.h ../byterun/io.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/io.h \ - ../byterun/reverse.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/fail.h ../byterun/md5.h ../byterun/io.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/io.h \ + ../byterun/reverse.h memory.o: memory.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/freelist.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/signals.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/freelist.h ../byterun/gc.h \ + ../byterun/gc_ctrl.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ + ../byterun/minor_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ + ../byterun/mlvalues.h ../byterun/signals.h meta.o: meta.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/fail.h ../byterun/fix_code.h \ - ../byterun/interp.h ../byterun/intext.h ../byterun/io.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/prims.h ../byterun/stacks.h ../byterun/memory.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/config.h ../byterun/fail.h ../byterun/fix_code.h \ + ../byterun/interp.h ../byterun/intext.h ../byterun/io.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ + ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h \ + ../byterun/prims.h ../byterun/stacks.h ../byterun/memory.h minor_gc.o: minor_gc.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/finalise.h \ - ../byterun/roots.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/memory.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/roots.h ../byterun/signals.h \ - ../byterun/weak.h + ../byterun/../config/s.h ../byterun/fail.h ../byterun/misc.h \ + ../byterun/config.h ../byterun/mlvalues.h ../byterun/finalise.h \ + ../byterun/roots.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ + ../byterun/memory.h ../byterun/minor_gc.h ../byterun/misc.h \ + ../byterun/mlvalues.h ../byterun/roots.h ../byterun/signals.h \ + ../byterun/weak.h misc.o: misc.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h + ../byterun/../config/s.h ../byterun/misc.h ../byterun/config.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/mlvalues.h \ + ../byterun/misc.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h natdynlink.o: natdynlink.c ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h stack.h ../byterun/callback.h ../byterun/alloc.h \ - ../byterun/intext.h ../byterun/io.h ../byterun/osdeps.h \ - ../byterun/fail.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/misc.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h stack.h ../byterun/callback.h ../byterun/alloc.h \ + ../byterun/intext.h ../byterun/io.h ../byterun/osdeps.h \ + ../byterun/fail.h obj.o: obj.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/gc.h ../byterun/interp.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/prims.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/fail.h ../byterun/gc.h ../byterun/interp.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ + ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h \ + ../byterun/prims.h parsing.o: parsing.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/alloc.h + ../byterun/../config/s.h ../byterun/mlvalues.h ../byterun/config.h \ + ../byterun/misc.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/alloc.h printexc.o: printexc.c ../byterun/backtrace.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/callback.h ../byterun/debugger.h \ - ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/printexc.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/misc.h ../byterun/callback.h ../byterun/debugger.h \ + ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ + ../byterun/printexc.h roots.o: roots.c ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/misc.h ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/globroots.h ../byterun/memory.h \ - ../byterun/major_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h stack.h ../byterun/roots.h -signals.o: signals.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/callback.h ../byterun/config.h \ - ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/memory.h ../byterun/signals.h ../byterun/signals_machdep.h \ - ../byterun/sys.h + ../byterun/misc.h ../byterun/config.h ../byterun/../config/m.h \ + ../byterun/../config/s.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/globroots.h ../byterun/memory.h \ + ../byterun/major_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ + ../byterun/mlvalues.h stack.h ../byterun/roots.h signals_asm.o: signals_asm.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/osdeps.h ../byterun/signals.h ../byterun/signals_machdep.h \ - signals_osdep.h stack.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/osdeps.h ../byterun/signals.h ../byterun/signals_machdep.h \ + signals_osdep.h stack.h +signals.o: signals.c ../byterun/alloc.h ../byterun/misc.h \ + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/callback.h ../byterun/config.h \ + ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ + ../byterun/memory.h ../byterun/signals.h ../byterun/signals_machdep.h \ + ../byterun/sys.h startup.o: startup.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/backtrace.h ../byterun/custom.h \ - ../byterun/debugger.h ../byterun/fail.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/intext.h \ - ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/osdeps.h \ - ../byterun/printexc.h stack.h ../byterun/sys.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/misc.h ../byterun/backtrace.h ../byterun/custom.h \ + ../byterun/debugger.h ../byterun/fail.h ../byterun/freelist.h \ + ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/intext.h ../byterun/io.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ + ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/misc.h \ + ../byterun/mlvalues.h ../byterun/osdeps.h ../byterun/printexc.h stack.h \ + ../byterun/sys.h str.o: str.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/mlvalues.h ../byterun/misc.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/fail.h ../byterun/mlvalues.h ../byterun/misc.h sys.o: sys.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/debugger.h \ - ../byterun/fail.h ../byterun/instruct.h ../byterun/mlvalues.h \ - ../byterun/osdeps.h ../byterun/signals.h ../byterun/stacks.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/sys.h + ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ + ../byterun/config.h ../byterun/mlvalues.h ../byterun/debugger.h \ + ../byterun/fail.h ../byterun/instruct.h ../byterun/mlvalues.h \ + ../byterun/osdeps.h ../byterun/signals.h ../byterun/stacks.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ + ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/sys.h terminfo.o: terminfo.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/fail.h \ - ../byterun/io.h ../byterun/mlvalues.h + ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ + ../byterun/config.h ../byterun/mlvalues.h ../byterun/fail.h \ + ../byterun/io.h ../byterun/mlvalues.h unix.o: unix.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/osdeps.h + ../byterun/../config/s.h ../byterun/memory.h ../byterun/config.h \ + ../byterun/gc.h ../byterun/mlvalues.h ../byterun/misc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/misc.h ../byterun/osdeps.h weak.o: weak.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/fail.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ + ../byterun/minor_gc.h ../byterun/mlvalues.h alloc.d.o: alloc.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/custom.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/stacks.h \ - ../byterun/memory.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/custom.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ + ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/stacks.h \ + ../byterun/memory.h array.d.o: array.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/misc.h ../byterun/mlvalues.h backtrace.d.o: backtrace.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/backtrace.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h stack.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/backtrace.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h stack.h callback.d.o: callback.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/mlvalues.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/misc.h ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/mlvalues.h compact.d.o: compact.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/misc.h ../byterun/config.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/memory.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/weak.h + ../byterun/../config/s.h ../byterun/finalise.h ../byterun/roots.h \ + ../byterun/misc.h ../byterun/config.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ + ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/freelist.h \ + ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ + ../byterun/memory.h ../byterun/mlvalues.h ../byterun/roots.h \ + ../byterun/weak.h compare.d.o: compare.c ../byterun/custom.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/misc.h ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/misc.h ../byterun/mlvalues.h custom.d.o: custom.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/custom.h ../byterun/fail.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/mlvalues.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/custom.h ../byterun/fail.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ + ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/mlvalues.h debugger.d.o: debugger.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/config.h ../byterun/debugger.h \ - ../byterun/misc.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/config.h ../byterun/debugger.h \ + ../byterun/misc.h dynlink.d.o: dynlink.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/dynlink.h \ - ../byterun/fail.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/osdeps.h \ - ../byterun/prims.h + ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ + ../byterun/config.h ../byterun/mlvalues.h ../byterun/dynlink.h \ + ../byterun/fail.h ../byterun/mlvalues.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/misc.h ../byterun/osdeps.h \ + ../byterun/prims.h extern.d.o: extern.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/custom.h ../byterun/fail.h \ - ../byterun/gc.h ../byterun/intext.h ../byterun/io.h ../byterun/io.h \ - ../byterun/md5.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/reverse.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/custom.h ../byterun/fail.h \ + ../byterun/gc.h ../byterun/intext.h ../byterun/io.h ../byterun/io.h \ + ../byterun/md5.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/misc.h ../byterun/mlvalues.h ../byterun/reverse.h fail.d.o: fail.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/io.h ../byterun/gc.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/printexc.h \ - ../byterun/signals.h stack.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/callback.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/fail.h ../byterun/io.h ../byterun/gc.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/printexc.h \ + ../byterun/signals.h stack.h ../byterun/roots.h ../byterun/memory.h \ + ../byterun/callback.h finalise.d.o: finalise.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/mlvalues.h \ - ../byterun/roots.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/signals.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/misc.h ../byterun/fail.h ../byterun/mlvalues.h \ + ../byterun/roots.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/signals.h floats.d.o: floats.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/fail.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/reverse.h ../byterun/stacks.h ../byterun/memory.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/fail.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/misc.h \ + ../byterun/reverse.h ../byterun/stacks.h ../byterun/memory.h freelist.d.o: freelist.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/major_gc.h ../byterun/misc.h ../byterun/mlvalues.h + ../byterun/../config/s.h ../byterun/freelist.h ../byterun/misc.h \ + ../byterun/config.h ../byterun/mlvalues.h ../byterun/gc.h \ + ../byterun/gc_ctrl.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/major_gc.h ../byterun/misc.h ../byterun/mlvalues.h gc_ctrl.d.o: gc_ctrl.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/compact.h ../byterun/custom.h \ - ../byterun/finalise.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/freelist.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h stack.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/compact.h ../byterun/custom.h \ + ../byterun/finalise.h ../byterun/roots.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/freelist.h ../byterun/gc.h \ + ../byterun/gc_ctrl.h ../byterun/major_gc.h ../byterun/minor_gc.h \ + ../byterun/misc.h ../byterun/mlvalues.h stack.h globroots.d.o: globroots.c ../byterun/memory.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/globroots.h ../byterun/roots.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/gc.h \ + ../byterun/mlvalues.h ../byterun/misc.h ../byterun/major_gc.h \ + ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/misc.h \ + ../byterun/mlvalues.h ../byterun/roots.h ../byterun/memory.h \ + ../byterun/globroots.h ../byterun/roots.h hash.d.o: hash.c ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/hash.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ + ../byterun/custom.h ../byterun/mlvalues.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/hash.h intern.d.o: intern.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/callback.h ../byterun/custom.h \ - ../byterun/fail.h ../byterun/gc.h ../byterun/intext.h ../byterun/io.h \ - ../byterun/io.h ../byterun/md5.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/reverse.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/callback.h ../byterun/custom.h \ + ../byterun/fail.h ../byterun/gc.h ../byterun/intext.h ../byterun/io.h \ + ../byterun/io.h ../byterun/md5.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/mlvalues.h ../byterun/misc.h ../byterun/reverse.h ints.d.o: ints.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/custom.h ../byterun/fail.h ../byterun/intext.h \ - ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/custom.h ../byterun/fail.h ../byterun/intext.h \ + ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/misc.h ../byterun/mlvalues.h io.d.o: io.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/custom.h \ - ../byterun/fail.h ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/signals.h \ - ../byterun/sys.h + ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ + ../byterun/config.h ../byterun/mlvalues.h ../byterun/custom.h \ + ../byterun/fail.h ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/misc.h ../byterun/mlvalues.h ../byterun/signals.h \ + ../byterun/sys.h lexing.d.o: lexing.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/mlvalues.h ../byterun/stacks.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/mlvalues.h ../byterun/stacks.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ + ../byterun/freelist.h ../byterun/minor_gc.h main.d.o: main.c ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/sys.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/misc.h ../byterun/sys.h major_gc.d.o: major_gc.c ../byterun/compact.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/fail.h ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/weak.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ + ../byterun/custom.h ../byterun/mlvalues.h ../byterun/config.h \ + ../byterun/fail.h ../byterun/finalise.h ../byterun/roots.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ + ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/freelist.h \ + ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ + ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ + ../byterun/weak.h md5.d.o: md5.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/md5.h ../byterun/io.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/io.h \ - ../byterun/reverse.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/fail.h ../byterun/md5.h ../byterun/io.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/io.h \ + ../byterun/reverse.h memory.d.o: memory.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/freelist.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/signals.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/freelist.h ../byterun/gc.h \ + ../byterun/gc_ctrl.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ + ../byterun/minor_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ + ../byterun/mlvalues.h ../byterun/signals.h meta.d.o: meta.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/fail.h ../byterun/fix_code.h \ - ../byterun/interp.h ../byterun/intext.h ../byterun/io.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/prims.h ../byterun/stacks.h ../byterun/memory.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/config.h ../byterun/fail.h ../byterun/fix_code.h \ + ../byterun/interp.h ../byterun/intext.h ../byterun/io.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ + ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h \ + ../byterun/prims.h ../byterun/stacks.h ../byterun/memory.h minor_gc.d.o: minor_gc.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/finalise.h \ - ../byterun/roots.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/memory.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/roots.h ../byterun/signals.h \ - ../byterun/weak.h + ../byterun/../config/s.h ../byterun/fail.h ../byterun/misc.h \ + ../byterun/config.h ../byterun/mlvalues.h ../byterun/finalise.h \ + ../byterun/roots.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ + ../byterun/memory.h ../byterun/minor_gc.h ../byterun/misc.h \ + ../byterun/mlvalues.h ../byterun/roots.h ../byterun/signals.h \ + ../byterun/weak.h misc.d.o: misc.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h + ../byterun/../config/s.h ../byterun/misc.h ../byterun/config.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/mlvalues.h \ + ../byterun/misc.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h natdynlink.d.o: natdynlink.c ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h stack.h ../byterun/callback.h ../byterun/alloc.h \ - ../byterun/intext.h ../byterun/io.h ../byterun/osdeps.h \ - ../byterun/fail.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/misc.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h stack.h ../byterun/callback.h ../byterun/alloc.h \ + ../byterun/intext.h ../byterun/io.h ../byterun/osdeps.h \ + ../byterun/fail.h obj.d.o: obj.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/gc.h ../byterun/interp.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/prims.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/fail.h ../byterun/gc.h ../byterun/interp.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ + ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h \ + ../byterun/prims.h parsing.d.o: parsing.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/alloc.h + ../byterun/../config/s.h ../byterun/mlvalues.h ../byterun/config.h \ + ../byterun/misc.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/alloc.h printexc.d.o: printexc.c ../byterun/backtrace.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/callback.h ../byterun/debugger.h \ - ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/printexc.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/misc.h ../byterun/callback.h ../byterun/debugger.h \ + ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ + ../byterun/printexc.h roots.d.o: roots.c ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/misc.h ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/globroots.h ../byterun/memory.h \ - ../byterun/major_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h stack.h ../byterun/roots.h -signals.d.o: signals.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/callback.h ../byterun/config.h \ - ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/memory.h ../byterun/signals.h ../byterun/signals_machdep.h \ - ../byterun/sys.h + ../byterun/misc.h ../byterun/config.h ../byterun/../config/m.h \ + ../byterun/../config/s.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/globroots.h ../byterun/memory.h \ + ../byterun/major_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ + ../byterun/mlvalues.h stack.h ../byterun/roots.h signals_asm.d.o: signals_asm.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/osdeps.h ../byterun/signals.h ../byterun/signals_machdep.h \ - signals_osdep.h stack.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/osdeps.h ../byterun/signals.h ../byterun/signals_machdep.h \ + signals_osdep.h stack.h +signals.d.o: signals.c ../byterun/alloc.h ../byterun/misc.h \ + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/callback.h ../byterun/config.h \ + ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ + ../byterun/memory.h ../byterun/signals.h ../byterun/signals_machdep.h \ + ../byterun/sys.h startup.d.o: startup.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/backtrace.h ../byterun/custom.h \ - ../byterun/debugger.h ../byterun/fail.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/intext.h \ - ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/osdeps.h \ - ../byterun/printexc.h stack.h ../byterun/sys.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/misc.h ../byterun/backtrace.h ../byterun/custom.h \ + ../byterun/debugger.h ../byterun/fail.h ../byterun/freelist.h \ + ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/intext.h ../byterun/io.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ + ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/misc.h \ + ../byterun/mlvalues.h ../byterun/osdeps.h ../byterun/printexc.h stack.h \ + ../byterun/sys.h str.d.o: str.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/mlvalues.h ../byterun/misc.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/fail.h ../byterun/mlvalues.h ../byterun/misc.h sys.d.o: sys.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/debugger.h \ - ../byterun/fail.h ../byterun/instruct.h ../byterun/mlvalues.h \ - ../byterun/osdeps.h ../byterun/signals.h ../byterun/stacks.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/sys.h + ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ + ../byterun/config.h ../byterun/mlvalues.h ../byterun/debugger.h \ + ../byterun/fail.h ../byterun/instruct.h ../byterun/mlvalues.h \ + ../byterun/osdeps.h ../byterun/signals.h ../byterun/stacks.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ + ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/sys.h terminfo.d.o: terminfo.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/fail.h \ - ../byterun/io.h ../byterun/mlvalues.h + ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ + ../byterun/config.h ../byterun/mlvalues.h ../byterun/fail.h \ + ../byterun/io.h ../byterun/mlvalues.h unix.d.o: unix.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/osdeps.h + ../byterun/../config/s.h ../byterun/memory.h ../byterun/config.h \ + ../byterun/gc.h ../byterun/mlvalues.h ../byterun/misc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/misc.h ../byterun/osdeps.h weak.d.o: weak.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/fail.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ + ../byterun/minor_gc.h ../byterun/mlvalues.h alloc.p.o: alloc.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/custom.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/stacks.h \ - ../byterun/memory.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/custom.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ + ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/stacks.h \ + ../byterun/memory.h array.p.o: array.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/misc.h ../byterun/mlvalues.h backtrace.p.o: backtrace.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/backtrace.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h stack.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/backtrace.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h stack.h callback.p.o: callback.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/mlvalues.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/misc.h ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/mlvalues.h compact.p.o: compact.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/misc.h ../byterun/config.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/memory.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/weak.h + ../byterun/../config/s.h ../byterun/finalise.h ../byterun/roots.h \ + ../byterun/misc.h ../byterun/config.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ + ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/freelist.h \ + ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ + ../byterun/memory.h ../byterun/mlvalues.h ../byterun/roots.h \ + ../byterun/weak.h compare.p.o: compare.c ../byterun/custom.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/misc.h ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/misc.h ../byterun/mlvalues.h custom.p.o: custom.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/custom.h ../byterun/fail.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/mlvalues.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/custom.h ../byterun/fail.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ + ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/mlvalues.h debugger.p.o: debugger.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/config.h ../byterun/debugger.h \ - ../byterun/misc.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/config.h ../byterun/debugger.h \ + ../byterun/misc.h dynlink.p.o: dynlink.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/dynlink.h \ - ../byterun/fail.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/osdeps.h \ - ../byterun/prims.h + ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ + ../byterun/config.h ../byterun/mlvalues.h ../byterun/dynlink.h \ + ../byterun/fail.h ../byterun/mlvalues.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/misc.h ../byterun/osdeps.h \ + ../byterun/prims.h extern.p.o: extern.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/custom.h ../byterun/fail.h \ - ../byterun/gc.h ../byterun/intext.h ../byterun/io.h ../byterun/io.h \ - ../byterun/md5.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/reverse.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/custom.h ../byterun/fail.h \ + ../byterun/gc.h ../byterun/intext.h ../byterun/io.h ../byterun/io.h \ + ../byterun/md5.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/misc.h ../byterun/mlvalues.h ../byterun/reverse.h fail.p.o: fail.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/io.h ../byterun/gc.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/printexc.h \ - ../byterun/signals.h stack.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/callback.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/fail.h ../byterun/io.h ../byterun/gc.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/printexc.h \ + ../byterun/signals.h stack.h ../byterun/roots.h ../byterun/memory.h \ + ../byterun/callback.h finalise.p.o: finalise.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/mlvalues.h \ - ../byterun/roots.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/signals.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/misc.h ../byterun/fail.h ../byterun/mlvalues.h \ + ../byterun/roots.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/signals.h floats.p.o: floats.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/fail.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/reverse.h ../byterun/stacks.h ../byterun/memory.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/fail.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/misc.h \ + ../byterun/reverse.h ../byterun/stacks.h ../byterun/memory.h freelist.p.o: freelist.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/major_gc.h ../byterun/misc.h ../byterun/mlvalues.h + ../byterun/../config/s.h ../byterun/freelist.h ../byterun/misc.h \ + ../byterun/config.h ../byterun/mlvalues.h ../byterun/gc.h \ + ../byterun/gc_ctrl.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/major_gc.h ../byterun/misc.h ../byterun/mlvalues.h gc_ctrl.p.o: gc_ctrl.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/compact.h ../byterun/custom.h \ - ../byterun/finalise.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/freelist.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h stack.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/compact.h ../byterun/custom.h \ + ../byterun/finalise.h ../byterun/roots.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/freelist.h ../byterun/gc.h \ + ../byterun/gc_ctrl.h ../byterun/major_gc.h ../byterun/minor_gc.h \ + ../byterun/misc.h ../byterun/mlvalues.h stack.h globroots.p.o: globroots.c ../byterun/memory.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/globroots.h ../byterun/roots.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/gc.h \ + ../byterun/mlvalues.h ../byterun/misc.h ../byterun/major_gc.h \ + ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/misc.h \ + ../byterun/mlvalues.h ../byterun/roots.h ../byterun/memory.h \ + ../byterun/globroots.h ../byterun/roots.h hash.p.o: hash.c ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/hash.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ + ../byterun/custom.h ../byterun/mlvalues.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/hash.h intern.p.o: intern.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/callback.h ../byterun/custom.h \ - ../byterun/fail.h ../byterun/gc.h ../byterun/intext.h ../byterun/io.h \ - ../byterun/io.h ../byterun/md5.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/reverse.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/callback.h ../byterun/custom.h \ + ../byterun/fail.h ../byterun/gc.h ../byterun/intext.h ../byterun/io.h \ + ../byterun/io.h ../byterun/md5.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/mlvalues.h ../byterun/misc.h ../byterun/reverse.h ints.p.o: ints.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/custom.h ../byterun/fail.h ../byterun/intext.h \ - ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/custom.h ../byterun/fail.h ../byterun/intext.h \ + ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/misc.h ../byterun/mlvalues.h io.p.o: io.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/custom.h \ - ../byterun/fail.h ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/signals.h \ - ../byterun/sys.h + ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ + ../byterun/config.h ../byterun/mlvalues.h ../byterun/custom.h \ + ../byterun/fail.h ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/misc.h ../byterun/mlvalues.h ../byterun/signals.h \ + ../byterun/sys.h lexing.p.o: lexing.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/mlvalues.h ../byterun/stacks.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/mlvalues.h ../byterun/stacks.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ + ../byterun/freelist.h ../byterun/minor_gc.h main.p.o: main.c ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/sys.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/misc.h ../byterun/sys.h major_gc.p.o: major_gc.c ../byterun/compact.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/fail.h ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/weak.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ + ../byterun/custom.h ../byterun/mlvalues.h ../byterun/config.h \ + ../byterun/fail.h ../byterun/finalise.h ../byterun/roots.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ + ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/freelist.h \ + ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ + ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ + ../byterun/weak.h md5.p.o: md5.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/md5.h ../byterun/io.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/io.h \ - ../byterun/reverse.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/fail.h ../byterun/md5.h ../byterun/io.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/io.h \ + ../byterun/reverse.h memory.p.o: memory.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/freelist.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/signals.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/freelist.h ../byterun/gc.h \ + ../byterun/gc_ctrl.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ + ../byterun/minor_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ + ../byterun/mlvalues.h ../byterun/signals.h meta.p.o: meta.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/fail.h ../byterun/fix_code.h \ - ../byterun/interp.h ../byterun/intext.h ../byterun/io.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/prims.h ../byterun/stacks.h ../byterun/memory.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/config.h ../byterun/fail.h ../byterun/fix_code.h \ + ../byterun/interp.h ../byterun/intext.h ../byterun/io.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ + ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h \ + ../byterun/prims.h ../byterun/stacks.h ../byterun/memory.h minor_gc.p.o: minor_gc.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/finalise.h \ - ../byterun/roots.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/memory.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/roots.h ../byterun/signals.h \ - ../byterun/weak.h + ../byterun/../config/s.h ../byterun/fail.h ../byterun/misc.h \ + ../byterun/config.h ../byterun/mlvalues.h ../byterun/finalise.h \ + ../byterun/roots.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ + ../byterun/memory.h ../byterun/minor_gc.h ../byterun/misc.h \ + ../byterun/mlvalues.h ../byterun/roots.h ../byterun/signals.h \ + ../byterun/weak.h misc.p.o: misc.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h + ../byterun/../config/s.h ../byterun/misc.h ../byterun/config.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/mlvalues.h \ + ../byterun/misc.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h natdynlink.p.o: natdynlink.c ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h stack.h ../byterun/callback.h ../byterun/alloc.h \ - ../byterun/intext.h ../byterun/io.h ../byterun/osdeps.h \ - ../byterun/fail.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/misc.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h stack.h ../byterun/callback.h ../byterun/alloc.h \ + ../byterun/intext.h ../byterun/io.h ../byterun/osdeps.h \ + ../byterun/fail.h obj.p.o: obj.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/gc.h ../byterun/interp.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/prims.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/fail.h ../byterun/gc.h ../byterun/interp.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/memory.h \ + ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ + ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h \ + ../byterun/prims.h parsing.p.o: parsing.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/alloc.h + ../byterun/../config/s.h ../byterun/mlvalues.h ../byterun/config.h \ + ../byterun/misc.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/alloc.h printexc.p.o: printexc.c ../byterun/backtrace.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/callback.h ../byterun/debugger.h \ - ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/printexc.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/misc.h ../byterun/callback.h ../byterun/debugger.h \ + ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ + ../byterun/printexc.h roots.p.o: roots.c ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/misc.h ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/globroots.h ../byterun/memory.h \ - ../byterun/major_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h stack.h ../byterun/roots.h -signals.p.o: signals.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/callback.h ../byterun/config.h \ - ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/memory.h ../byterun/signals.h ../byterun/signals_machdep.h \ - ../byterun/sys.h + ../byterun/misc.h ../byterun/config.h ../byterun/../config/m.h \ + ../byterun/../config/s.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/minor_gc.h ../byterun/globroots.h ../byterun/memory.h \ + ../byterun/major_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ + ../byterun/mlvalues.h stack.h ../byterun/roots.h signals_asm.p.o: signals_asm.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/osdeps.h ../byterun/signals.h ../byterun/signals_machdep.h \ - signals_osdep.h stack.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/osdeps.h ../byterun/signals.h ../byterun/signals_machdep.h \ + signals_osdep.h stack.h +signals.p.o: signals.c ../byterun/alloc.h ../byterun/misc.h \ + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/mlvalues.h ../byterun/callback.h ../byterun/config.h \ + ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ + ../byterun/memory.h ../byterun/signals.h ../byterun/signals_machdep.h \ + ../byterun/sys.h startup.p.o: startup.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/backtrace.h ../byterun/custom.h \ - ../byterun/debugger.h ../byterun/fail.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/intext.h \ - ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/osdeps.h \ - ../byterun/printexc.h stack.h ../byterun/sys.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/misc.h ../byterun/backtrace.h ../byterun/custom.h \ + ../byterun/debugger.h ../byterun/fail.h ../byterun/freelist.h \ + ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/intext.h ../byterun/io.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ + ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/misc.h \ + ../byterun/mlvalues.h ../byterun/osdeps.h ../byterun/printexc.h stack.h \ + ../byterun/sys.h str.p.o: str.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/mlvalues.h ../byterun/misc.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/fail.h ../byterun/mlvalues.h ../byterun/misc.h sys.p.o: sys.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/debugger.h \ - ../byterun/fail.h ../byterun/instruct.h ../byterun/mlvalues.h \ - ../byterun/osdeps.h ../byterun/signals.h ../byterun/stacks.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/sys.h + ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ + ../byterun/config.h ../byterun/mlvalues.h ../byterun/debugger.h \ + ../byterun/fail.h ../byterun/instruct.h ../byterun/mlvalues.h \ + ../byterun/osdeps.h ../byterun/signals.h ../byterun/stacks.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ + ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/sys.h terminfo.p.o: terminfo.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/fail.h \ - ../byterun/io.h ../byterun/mlvalues.h + ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ + ../byterun/config.h ../byterun/mlvalues.h ../byterun/fail.h \ + ../byterun/io.h ../byterun/mlvalues.h unix.p.o: unix.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/osdeps.h + ../byterun/../config/s.h ../byterun/memory.h ../byterun/config.h \ + ../byterun/gc.h ../byterun/mlvalues.h ../byterun/misc.h \ + ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ + ../byterun/misc.h ../byterun/osdeps.h weak.p.o: weak.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h + ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ + ../byterun/fail.h ../byterun/major_gc.h ../byterun/freelist.h \ + ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ + ../byterun/minor_gc.h ../byterun/mlvalues.h diff --git a/byterun/.depend b/byterun/.depend index 743737d052..823b58101f 100644 --- a/byterun/.depend +++ b/byterun/.depend @@ -1,422 +1,419 @@ alloc.o: alloc.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h major_gc.h freelist.h memory.h gc.h \ - minor_gc.h stacks.h + ../config/s.h mlvalues.h custom.h major_gc.h freelist.h memory.h gc.h \ + minor_gc.h stacks.h array.o: array.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h + ../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h freelist.h \ + minor_gc.h backtrace.o: backtrace.c config.h ../config/m.h ../config/s.h \ - compatibility.h mlvalues.h misc.h alloc.h io.h instruct.h intext.h \ - exec.h fix_code.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - startup.h stacks.h sys.h backtrace.h fail.h + compatibility.h mlvalues.h misc.h alloc.h io.h instruct.h intext.h \ + exec.h fix_code.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ + startup.h stacks.h sys.h backtrace.h fail.h callback.o: callback.c callback.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h interp.h instruct.h fix_code.h stacks.h + ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ + freelist.h minor_gc.h interp.h instruct.h fix_code.h stacks.h compact.o: compact.c config.h ../config/m.h ../config/s.h compatibility.h \ - finalise.h roots.h misc.h memory.h gc.h mlvalues.h major_gc.h \ - freelist.h minor_gc.h gc_ctrl.h weak.h + finalise.h roots.h misc.h memory.h gc.h mlvalues.h major_gc.h freelist.h \ + minor_gc.h gc_ctrl.h weak.h compare.o: compare.c custom.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h + ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ + freelist.h minor_gc.h custom.o: custom.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h + ../config/s.h mlvalues.h custom.h fail.h memory.h gc.h major_gc.h \ + freelist.h minor_gc.h debugger.o: debugger.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h debugger.h fail.h fix_code.h \ - instruct.h intext.h io.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h sys.h + ../config/m.h ../config/s.h mlvalues.h debugger.h fail.h fix_code.h \ + instruct.h intext.h io.h stacks.h memory.h gc.h major_gc.h freelist.h \ + minor_gc.h sys.h dynlink.o: dynlink.c config.h ../config/m.h ../config/s.h compatibility.h \ - alloc.h misc.h mlvalues.h dynlink.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h osdeps.h prims.h + alloc.h misc.h mlvalues.h dynlink.h fail.h memory.h gc.h major_gc.h \ + freelist.h minor_gc.h osdeps.h prims.h extern.o: extern.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h gc.h intext.h io.h md5.h \ - memory.h major_gc.h freelist.h minor_gc.h reverse.h + ../config/s.h mlvalues.h custom.h fail.h gc.h intext.h io.h md5.h \ + memory.h major_gc.h freelist.h minor_gc.h reverse.h fail.o: fail.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h io.h gc.h memory.h major_gc.h \ - freelist.h minor_gc.h printexc.h signals.h stacks.h + ../config/s.h mlvalues.h fail.h io.h gc.h memory.h major_gc.h freelist.h \ + minor_gc.h printexc.h signals.h stacks.h finalise.o: finalise.c callback.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h roots.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h signals.h + ../config/m.h ../config/s.h misc.h fail.h roots.h memory.h gc.h \ + major_gc.h freelist.h minor_gc.h signals.h fix_code.o: fix_code.c config.h ../config/m.h ../config/s.h \ - compatibility.h debugger.h misc.h mlvalues.h fix_code.h instruct.h \ - intext.h io.h md5.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - reverse.h + compatibility.h debugger.h misc.h mlvalues.h fix_code.h instruct.h \ + intext.h io.h md5.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ + reverse.h floats.o: floats.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h reverse.h stacks.h + ../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h freelist.h \ + minor_gc.h reverse.h stacks.h freelist.o: freelist.c config.h ../config/m.h ../config/s.h \ - compatibility.h freelist.h misc.h mlvalues.h gc.h gc_ctrl.h memory.h \ - major_gc.h minor_gc.h + compatibility.h freelist.h misc.h mlvalues.h gc.h gc_ctrl.h memory.h \ + major_gc.h minor_gc.h gc_ctrl.o: gc_ctrl.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h compact.h custom.h finalise.h \ - roots.h memory.h gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h \ - stacks.h + ../config/m.h ../config/s.h mlvalues.h compact.h custom.h finalise.h \ + roots.h memory.h gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h \ + stacks.h globroots.o: globroots.c memory.h compatibility.h config.h ../config/m.h \ - ../config/s.h gc.h mlvalues.h misc.h major_gc.h freelist.h minor_gc.h \ - roots.h globroots.h + ../config/s.h gc.h mlvalues.h misc.h major_gc.h freelist.h minor_gc.h \ + roots.h globroots.h hash.o: hash.c mlvalues.h compatibility.h config.h ../config/m.h \ - ../config/s.h misc.h custom.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h hash.h + ../config/s.h misc.h custom.h memory.h gc.h major_gc.h freelist.h \ + minor_gc.h hash.h instrtrace.o: instrtrace.c intern.o: intern.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h callback.h custom.h fail.h gc.h intext.h io.h \ - md5.h memory.h major_gc.h freelist.h minor_gc.h reverse.h + ../config/s.h mlvalues.h callback.h custom.h fail.h gc.h intext.h io.h \ + md5.h memory.h major_gc.h freelist.h minor_gc.h reverse.h interp.o: interp.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h backtrace.h callback.h debugger.h fail.h \ - fix_code.h instrtrace.h instruct.h interp.h major_gc.h freelist.h \ - memory.h gc.h minor_gc.h prims.h signals.h stacks.h jumptbl.h + ../config/s.h mlvalues.h backtrace.h callback.h debugger.h fail.h \ + fix_code.h instrtrace.h instruct.h interp.h major_gc.h freelist.h \ + memory.h gc.h minor_gc.h prims.h signals.h stacks.h jumptbl.h ints.o: ints.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h intext.h io.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h + ../config/s.h mlvalues.h custom.h fail.h intext.h io.h memory.h gc.h \ + major_gc.h freelist.h minor_gc.h io.o: io.c config.h ../config/m.h ../config/s.h compatibility.h alloc.h \ - misc.h mlvalues.h custom.h fail.h io.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h signals.h sys.h + misc.h mlvalues.h custom.h fail.h io.h memory.h gc.h major_gc.h \ + freelist.h minor_gc.h signals.h sys.h lexing.o: lexing.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h + ../config/s.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ + minor_gc.h main.o: main.c misc.h compatibility.h config.h ../config/m.h \ - ../config/s.h mlvalues.h sys.h + ../config/s.h mlvalues.h sys.h major_gc.o: major_gc.c compact.h config.h ../config/m.h ../config/s.h \ - compatibility.h misc.h custom.h mlvalues.h fail.h finalise.h roots.h \ - memory.h gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h weak.h + compatibility.h misc.h custom.h mlvalues.h fail.h finalise.h roots.h \ + memory.h gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h weak.h md5.o: md5.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h md5.h io.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h reverse.h + ../config/s.h mlvalues.h fail.h md5.h io.h memory.h gc.h major_gc.h \ + freelist.h minor_gc.h reverse.h memory.o: memory.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h freelist.h gc.h gc_ctrl.h major_gc.h memory.h \ - minor_gc.h signals.h + ../config/s.h mlvalues.h freelist.h gc.h gc_ctrl.h major_gc.h memory.h \ + minor_gc.h signals.h meta.o: meta.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h fix_code.h interp.h intext.h io.h \ - major_gc.h freelist.h memory.h gc.h minor_gc.h prims.h stacks.h + ../config/s.h mlvalues.h fail.h fix_code.h interp.h intext.h io.h \ + major_gc.h freelist.h memory.h gc.h minor_gc.h prims.h stacks.h minor_gc.o: minor_gc.c config.h ../config/m.h ../config/s.h \ - compatibility.h fail.h misc.h mlvalues.h finalise.h roots.h memory.h \ - gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h signals.h weak.h + compatibility.h fail.h misc.h mlvalues.h finalise.h roots.h memory.h \ + gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h signals.h weak.h misc.o: misc.c config.h ../config/m.h ../config/s.h compatibility.h \ - misc.h memory.h gc.h mlvalues.h major_gc.h freelist.h minor_gc.h + misc.h memory.h gc.h mlvalues.h major_gc.h freelist.h minor_gc.h obj.o: obj.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h gc.h interp.h major_gc.h freelist.h \ - memory.h minor_gc.h prims.h + ../config/s.h mlvalues.h fail.h gc.h interp.h major_gc.h freelist.h \ + memory.h minor_gc.h prims.h parsing.o: parsing.c config.h ../config/m.h ../config/s.h compatibility.h \ - mlvalues.h misc.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - alloc.h + mlvalues.h misc.h memory.h gc.h major_gc.h freelist.h minor_gc.h alloc.h prims.o: prims.c mlvalues.h compatibility.h config.h ../config/m.h \ - ../config/s.h misc.h prims.h + ../config/s.h misc.h prims.h printexc.o: printexc.c backtrace.h mlvalues.h compatibility.h config.h \ - ../config/m.h ../config/s.h misc.h callback.h debugger.h fail.h \ - printexc.h + ../config/m.h ../config/s.h misc.h callback.h debugger.h fail.h \ + printexc.h roots.o: roots.c finalise.h roots.h misc.h compatibility.h config.h \ - ../config/m.h ../config/s.h memory.h gc.h mlvalues.h major_gc.h \ - freelist.h minor_gc.h globroots.h stacks.h -signals.o: signals.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h callback.h fail.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h roots.h signals.h signals_machdep.h \ - sys.h + ../config/m.h ../config/s.h memory.h gc.h mlvalues.h major_gc.h \ + freelist.h minor_gc.h globroots.h stacks.h signals_byt.o: signals_byt.c config.h ../config/m.h ../config/s.h \ - compatibility.h memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h \ - minor_gc.h osdeps.h signals.h signals_machdep.h + compatibility.h memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h \ + minor_gc.h osdeps.h signals.h signals_machdep.h +signals.o: signals.c alloc.h compatibility.h misc.h config.h \ + ../config/m.h ../config/s.h mlvalues.h callback.h fail.h memory.h gc.h \ + major_gc.h freelist.h minor_gc.h roots.h signals.h signals_machdep.h \ + sys.h stacks.o: stacks.c config.h ../config/m.h ../config/s.h compatibility.h \ - fail.h misc.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h + fail.h misc.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ + minor_gc.h startup.o: startup.c config.h ../config/m.h ../config/s.h compatibility.h \ - alloc.h misc.h mlvalues.h backtrace.h callback.h custom.h debugger.h \ - dynlink.h exec.h fail.h fix_code.h freelist.h gc_ctrl.h instrtrace.h \ - interp.h intext.h io.h memory.h gc.h major_gc.h minor_gc.h osdeps.h \ - prims.h printexc.h reverse.h signals.h stacks.h sys.h startup.h \ - version.h + alloc.h misc.h mlvalues.h backtrace.h callback.h custom.h debugger.h \ + dynlink.h exec.h fail.h fix_code.h freelist.h gc_ctrl.h instrtrace.h \ + interp.h intext.h io.h memory.h gc.h major_gc.h minor_gc.h osdeps.h \ + prims.h printexc.h reverse.h signals.h stacks.h sys.h startup.h \ + version.h str.o: str.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h + ../config/s.h mlvalues.h fail.h sys.o: sys.c config.h ../config/m.h ../config/s.h compatibility.h alloc.h \ - misc.h mlvalues.h debugger.h fail.h instruct.h osdeps.h signals.h \ - stacks.h memory.h gc.h major_gc.h freelist.h minor_gc.h sys.h + misc.h mlvalues.h debugger.h fail.h instruct.h osdeps.h signals.h \ + stacks.h memory.h gc.h major_gc.h freelist.h minor_gc.h sys.h terminfo.o: terminfo.c config.h ../config/m.h ../config/s.h \ - compatibility.h alloc.h misc.h mlvalues.h fail.h io.h + compatibility.h alloc.h misc.h mlvalues.h fail.h io.h unix.o: unix.c config.h ../config/m.h ../config/s.h compatibility.h \ - memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h minor_gc.h \ - osdeps.h + memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h minor_gc.h \ + osdeps.h weak.o: weak.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h major_gc.h freelist.h memory.h gc.h \ - minor_gc.h + ../config/s.h mlvalues.h fail.h major_gc.h freelist.h memory.h gc.h \ + minor_gc.h win32.o: win32.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - osdeps.h signals.h sys.h + ../config/s.h mlvalues.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ + osdeps.h signals.h sys.h alloc.d.o: alloc.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h major_gc.h freelist.h memory.h gc.h \ - minor_gc.h stacks.h + ../config/s.h mlvalues.h custom.h major_gc.h freelist.h memory.h gc.h \ + minor_gc.h stacks.h array.d.o: array.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h + ../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h freelist.h \ + minor_gc.h backtrace.d.o: backtrace.c config.h ../config/m.h ../config/s.h \ - compatibility.h mlvalues.h misc.h alloc.h io.h instruct.h intext.h \ - exec.h fix_code.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - startup.h stacks.h sys.h backtrace.h fail.h + compatibility.h mlvalues.h misc.h alloc.h io.h instruct.h intext.h \ + exec.h fix_code.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ + startup.h stacks.h sys.h backtrace.h fail.h callback.d.o: callback.c callback.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h interp.h instruct.h fix_code.h stacks.h + ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ + freelist.h minor_gc.h interp.h instruct.h fix_code.h stacks.h compact.d.o: compact.c config.h ../config/m.h ../config/s.h compatibility.h \ - finalise.h roots.h misc.h memory.h gc.h mlvalues.h major_gc.h \ - freelist.h minor_gc.h gc_ctrl.h weak.h + finalise.h roots.h misc.h memory.h gc.h mlvalues.h major_gc.h freelist.h \ + minor_gc.h gc_ctrl.h weak.h compare.d.o: compare.c custom.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h + ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ + freelist.h minor_gc.h custom.d.o: custom.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h + ../config/s.h mlvalues.h custom.h fail.h memory.h gc.h major_gc.h \ + freelist.h minor_gc.h debugger.d.o: debugger.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h debugger.h fail.h fix_code.h \ - instruct.h intext.h io.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h sys.h + ../config/m.h ../config/s.h mlvalues.h debugger.h fail.h fix_code.h \ + instruct.h intext.h io.h stacks.h memory.h gc.h major_gc.h freelist.h \ + minor_gc.h sys.h dynlink.d.o: dynlink.c config.h ../config/m.h ../config/s.h compatibility.h \ - alloc.h misc.h mlvalues.h dynlink.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h osdeps.h prims.h + alloc.h misc.h mlvalues.h dynlink.h fail.h memory.h gc.h major_gc.h \ + freelist.h minor_gc.h osdeps.h prims.h extern.d.o: extern.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h gc.h intext.h io.h md5.h \ - memory.h major_gc.h freelist.h minor_gc.h reverse.h + ../config/s.h mlvalues.h custom.h fail.h gc.h intext.h io.h md5.h \ + memory.h major_gc.h freelist.h minor_gc.h reverse.h fail.d.o: fail.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h io.h gc.h memory.h major_gc.h \ - freelist.h minor_gc.h printexc.h signals.h stacks.h + ../config/s.h mlvalues.h fail.h io.h gc.h memory.h major_gc.h freelist.h \ + minor_gc.h printexc.h signals.h stacks.h finalise.d.o: finalise.c callback.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h roots.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h signals.h + ../config/m.h ../config/s.h misc.h fail.h roots.h memory.h gc.h \ + major_gc.h freelist.h minor_gc.h signals.h fix_code.d.o: fix_code.c config.h ../config/m.h ../config/s.h \ - compatibility.h debugger.h misc.h mlvalues.h fix_code.h instruct.h \ - intext.h io.h md5.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - reverse.h + compatibility.h debugger.h misc.h mlvalues.h fix_code.h instruct.h \ + intext.h io.h md5.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ + reverse.h floats.d.o: floats.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h reverse.h stacks.h + ../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h freelist.h \ + minor_gc.h reverse.h stacks.h freelist.d.o: freelist.c config.h ../config/m.h ../config/s.h \ - compatibility.h freelist.h misc.h mlvalues.h gc.h gc_ctrl.h memory.h \ - major_gc.h minor_gc.h + compatibility.h freelist.h misc.h mlvalues.h gc.h gc_ctrl.h memory.h \ + major_gc.h minor_gc.h gc_ctrl.d.o: gc_ctrl.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h compact.h custom.h finalise.h \ - roots.h memory.h gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h \ - stacks.h + ../config/m.h ../config/s.h mlvalues.h compact.h custom.h finalise.h \ + roots.h memory.h gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h \ + stacks.h globroots.d.o: globroots.c memory.h compatibility.h config.h ../config/m.h \ - ../config/s.h gc.h mlvalues.h misc.h major_gc.h freelist.h minor_gc.h \ - roots.h globroots.h + ../config/s.h gc.h mlvalues.h misc.h major_gc.h freelist.h minor_gc.h \ + roots.h globroots.h hash.d.o: hash.c mlvalues.h compatibility.h config.h ../config/m.h \ - ../config/s.h misc.h custom.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h hash.h + ../config/s.h misc.h custom.h memory.h gc.h major_gc.h freelist.h \ + minor_gc.h hash.h instrtrace.d.o: instrtrace.c instruct.h misc.h compatibility.h config.h \ - ../config/m.h ../config/s.h mlvalues.h opnames.h prims.h stacks.h \ - memory.h gc.h major_gc.h freelist.h minor_gc.h + ../config/m.h ../config/s.h mlvalues.h opnames.h prims.h stacks.h \ + memory.h gc.h major_gc.h freelist.h minor_gc.h intern.d.o: intern.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h callback.h custom.h fail.h gc.h intext.h io.h \ - md5.h memory.h major_gc.h freelist.h minor_gc.h reverse.h + ../config/s.h mlvalues.h callback.h custom.h fail.h gc.h intext.h io.h \ + md5.h memory.h major_gc.h freelist.h minor_gc.h reverse.h interp.d.o: interp.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h backtrace.h callback.h debugger.h fail.h \ - fix_code.h instrtrace.h instruct.h interp.h major_gc.h freelist.h \ - memory.h gc.h minor_gc.h prims.h signals.h stacks.h + ../config/s.h mlvalues.h backtrace.h callback.h debugger.h fail.h \ + fix_code.h instrtrace.h instruct.h interp.h major_gc.h freelist.h \ + memory.h gc.h minor_gc.h prims.h signals.h stacks.h ints.d.o: ints.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h intext.h io.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h + ../config/s.h mlvalues.h custom.h fail.h intext.h io.h memory.h gc.h \ + major_gc.h freelist.h minor_gc.h io.d.o: io.c config.h ../config/m.h ../config/s.h compatibility.h alloc.h \ - misc.h mlvalues.h custom.h fail.h io.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h signals.h sys.h + misc.h mlvalues.h custom.h fail.h io.h memory.h gc.h major_gc.h \ + freelist.h minor_gc.h signals.h sys.h lexing.d.o: lexing.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h + ../config/s.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ + minor_gc.h main.d.o: main.c misc.h compatibility.h config.h ../config/m.h \ - ../config/s.h mlvalues.h sys.h + ../config/s.h mlvalues.h sys.h major_gc.d.o: major_gc.c compact.h config.h ../config/m.h ../config/s.h \ - compatibility.h misc.h custom.h mlvalues.h fail.h finalise.h roots.h \ - memory.h gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h weak.h + compatibility.h misc.h custom.h mlvalues.h fail.h finalise.h roots.h \ + memory.h gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h weak.h md5.d.o: md5.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h md5.h io.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h reverse.h + ../config/s.h mlvalues.h fail.h md5.h io.h memory.h gc.h major_gc.h \ + freelist.h minor_gc.h reverse.h memory.d.o: memory.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h freelist.h gc.h gc_ctrl.h major_gc.h memory.h \ - minor_gc.h signals.h + ../config/s.h mlvalues.h freelist.h gc.h gc_ctrl.h major_gc.h memory.h \ + minor_gc.h signals.h meta.d.o: meta.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h fix_code.h interp.h intext.h io.h \ - major_gc.h freelist.h memory.h gc.h minor_gc.h prims.h stacks.h + ../config/s.h mlvalues.h fail.h fix_code.h interp.h intext.h io.h \ + major_gc.h freelist.h memory.h gc.h minor_gc.h prims.h stacks.h minor_gc.d.o: minor_gc.c config.h ../config/m.h ../config/s.h \ - compatibility.h fail.h misc.h mlvalues.h finalise.h roots.h memory.h \ - gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h signals.h weak.h + compatibility.h fail.h misc.h mlvalues.h finalise.h roots.h memory.h \ + gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h signals.h weak.h misc.d.o: misc.c config.h ../config/m.h ../config/s.h compatibility.h \ - misc.h memory.h gc.h mlvalues.h major_gc.h freelist.h minor_gc.h + misc.h memory.h gc.h mlvalues.h major_gc.h freelist.h minor_gc.h obj.d.o: obj.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h gc.h interp.h major_gc.h freelist.h \ - memory.h minor_gc.h prims.h + ../config/s.h mlvalues.h fail.h gc.h interp.h major_gc.h freelist.h \ + memory.h minor_gc.h prims.h parsing.d.o: parsing.c config.h ../config/m.h ../config/s.h compatibility.h \ - mlvalues.h misc.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - alloc.h + mlvalues.h misc.h memory.h gc.h major_gc.h freelist.h minor_gc.h alloc.h prims.d.o: prims.c mlvalues.h compatibility.h config.h ../config/m.h \ - ../config/s.h misc.h prims.h + ../config/s.h misc.h prims.h printexc.d.o: printexc.c backtrace.h mlvalues.h compatibility.h config.h \ - ../config/m.h ../config/s.h misc.h callback.h debugger.h fail.h \ - printexc.h + ../config/m.h ../config/s.h misc.h callback.h debugger.h fail.h \ + printexc.h roots.d.o: roots.c finalise.h roots.h misc.h compatibility.h config.h \ - ../config/m.h ../config/s.h memory.h gc.h mlvalues.h major_gc.h \ - freelist.h minor_gc.h globroots.h stacks.h -signals.d.o: signals.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h callback.h fail.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h roots.h signals.h signals_machdep.h \ - sys.h + ../config/m.h ../config/s.h memory.h gc.h mlvalues.h major_gc.h \ + freelist.h minor_gc.h globroots.h stacks.h signals_byt.d.o: signals_byt.c config.h ../config/m.h ../config/s.h \ - compatibility.h memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h \ - minor_gc.h osdeps.h signals.h signals_machdep.h + compatibility.h memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h \ + minor_gc.h osdeps.h signals.h signals_machdep.h +signals.d.o: signals.c alloc.h compatibility.h misc.h config.h \ + ../config/m.h ../config/s.h mlvalues.h callback.h fail.h memory.h gc.h \ + major_gc.h freelist.h minor_gc.h roots.h signals.h signals_machdep.h \ + sys.h stacks.d.o: stacks.c config.h ../config/m.h ../config/s.h compatibility.h \ - fail.h misc.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h + fail.h misc.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ + minor_gc.h startup.d.o: startup.c config.h ../config/m.h ../config/s.h compatibility.h \ - alloc.h misc.h mlvalues.h backtrace.h callback.h custom.h debugger.h \ - dynlink.h exec.h fail.h fix_code.h freelist.h gc_ctrl.h instrtrace.h \ - interp.h intext.h io.h memory.h gc.h major_gc.h minor_gc.h osdeps.h \ - prims.h printexc.h reverse.h signals.h stacks.h sys.h startup.h \ - version.h + alloc.h misc.h mlvalues.h backtrace.h callback.h custom.h debugger.h \ + dynlink.h exec.h fail.h fix_code.h freelist.h gc_ctrl.h instrtrace.h \ + interp.h intext.h io.h memory.h gc.h major_gc.h minor_gc.h osdeps.h \ + prims.h printexc.h reverse.h signals.h stacks.h sys.h startup.h \ + version.h str.d.o: str.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h + ../config/s.h mlvalues.h fail.h sys.d.o: sys.c config.h ../config/m.h ../config/s.h compatibility.h alloc.h \ - misc.h mlvalues.h debugger.h fail.h instruct.h osdeps.h signals.h \ - stacks.h memory.h gc.h major_gc.h freelist.h minor_gc.h sys.h + misc.h mlvalues.h debugger.h fail.h instruct.h osdeps.h signals.h \ + stacks.h memory.h gc.h major_gc.h freelist.h minor_gc.h sys.h terminfo.d.o: terminfo.c config.h ../config/m.h ../config/s.h \ - compatibility.h alloc.h misc.h mlvalues.h fail.h io.h + compatibility.h alloc.h misc.h mlvalues.h fail.h io.h unix.d.o: unix.c config.h ../config/m.h ../config/s.h compatibility.h \ - memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h minor_gc.h \ - osdeps.h + memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h minor_gc.h \ + osdeps.h weak.d.o: weak.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h major_gc.h freelist.h memory.h gc.h \ - minor_gc.h + ../config/s.h mlvalues.h fail.h major_gc.h freelist.h memory.h gc.h \ + minor_gc.h win32.d.o: win32.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - osdeps.h signals.h sys.h + ../config/s.h mlvalues.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ + osdeps.h signals.h sys.h alloc.pic.o: alloc.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h major_gc.h freelist.h memory.h gc.h \ - minor_gc.h stacks.h + ../config/s.h mlvalues.h custom.h major_gc.h freelist.h memory.h gc.h \ + minor_gc.h stacks.h array.pic.o: array.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h + ../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h freelist.h \ + minor_gc.h backtrace.pic.o: backtrace.c config.h ../config/m.h ../config/s.h \ - compatibility.h mlvalues.h misc.h alloc.h io.h instruct.h intext.h \ - exec.h fix_code.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - startup.h stacks.h sys.h backtrace.h fail.h + compatibility.h mlvalues.h misc.h alloc.h io.h instruct.h intext.h \ + exec.h fix_code.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ + startup.h stacks.h sys.h backtrace.h fail.h callback.pic.o: callback.c callback.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h interp.h instruct.h fix_code.h stacks.h + ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ + freelist.h minor_gc.h interp.h instruct.h fix_code.h stacks.h compact.pic.o: compact.c config.h ../config/m.h ../config/s.h compatibility.h \ - finalise.h roots.h misc.h memory.h gc.h mlvalues.h major_gc.h \ - freelist.h minor_gc.h gc_ctrl.h weak.h + finalise.h roots.h misc.h memory.h gc.h mlvalues.h major_gc.h freelist.h \ + minor_gc.h gc_ctrl.h weak.h compare.pic.o: compare.c custom.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h + ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ + freelist.h minor_gc.h custom.pic.o: custom.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h + ../config/s.h mlvalues.h custom.h fail.h memory.h gc.h major_gc.h \ + freelist.h minor_gc.h debugger.pic.o: debugger.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h debugger.h fail.h fix_code.h \ - instruct.h intext.h io.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h sys.h + ../config/m.h ../config/s.h mlvalues.h debugger.h fail.h fix_code.h \ + instruct.h intext.h io.h stacks.h memory.h gc.h major_gc.h freelist.h \ + minor_gc.h sys.h dynlink.pic.o: dynlink.c config.h ../config/m.h ../config/s.h compatibility.h \ - alloc.h misc.h mlvalues.h dynlink.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h osdeps.h prims.h + alloc.h misc.h mlvalues.h dynlink.h fail.h memory.h gc.h major_gc.h \ + freelist.h minor_gc.h osdeps.h prims.h extern.pic.o: extern.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h gc.h intext.h io.h md5.h \ - memory.h major_gc.h freelist.h minor_gc.h reverse.h + ../config/s.h mlvalues.h custom.h fail.h gc.h intext.h io.h md5.h \ + memory.h major_gc.h freelist.h minor_gc.h reverse.h fail.pic.o: fail.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h io.h gc.h memory.h major_gc.h \ - freelist.h minor_gc.h printexc.h signals.h stacks.h + ../config/s.h mlvalues.h fail.h io.h gc.h memory.h major_gc.h freelist.h \ + minor_gc.h printexc.h signals.h stacks.h finalise.pic.o: finalise.c callback.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h roots.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h signals.h + ../config/m.h ../config/s.h misc.h fail.h roots.h memory.h gc.h \ + major_gc.h freelist.h minor_gc.h signals.h fix_code.pic.o: fix_code.c config.h ../config/m.h ../config/s.h \ - compatibility.h debugger.h misc.h mlvalues.h fix_code.h instruct.h \ - intext.h io.h md5.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - reverse.h + compatibility.h debugger.h misc.h mlvalues.h fix_code.h instruct.h \ + intext.h io.h md5.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ + reverse.h floats.pic.o: floats.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h reverse.h stacks.h + ../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h freelist.h \ + minor_gc.h reverse.h stacks.h freelist.pic.o: freelist.c config.h ../config/m.h ../config/s.h \ - compatibility.h freelist.h misc.h mlvalues.h gc.h gc_ctrl.h memory.h \ - major_gc.h minor_gc.h + compatibility.h freelist.h misc.h mlvalues.h gc.h gc_ctrl.h memory.h \ + major_gc.h minor_gc.h gc_ctrl.pic.o: gc_ctrl.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h compact.h custom.h finalise.h \ - roots.h memory.h gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h \ - stacks.h + ../config/m.h ../config/s.h mlvalues.h compact.h custom.h finalise.h \ + roots.h memory.h gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h \ + stacks.h globroots.pic.o: globroots.c memory.h compatibility.h config.h ../config/m.h \ - ../config/s.h gc.h mlvalues.h misc.h major_gc.h freelist.h minor_gc.h \ - roots.h globroots.h + ../config/s.h gc.h mlvalues.h misc.h major_gc.h freelist.h minor_gc.h \ + roots.h globroots.h hash.pic.o: hash.c mlvalues.h compatibility.h config.h ../config/m.h \ - ../config/s.h misc.h custom.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h hash.h + ../config/s.h misc.h custom.h memory.h gc.h major_gc.h freelist.h \ + minor_gc.h hash.h instrtrace.pic.o: instrtrace.c intern.pic.o: intern.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h callback.h custom.h fail.h gc.h intext.h io.h \ - md5.h memory.h major_gc.h freelist.h minor_gc.h reverse.h + ../config/s.h mlvalues.h callback.h custom.h fail.h gc.h intext.h io.h \ + md5.h memory.h major_gc.h freelist.h minor_gc.h reverse.h interp.pic.o: interp.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h backtrace.h callback.h debugger.h fail.h \ - fix_code.h instrtrace.h instruct.h interp.h major_gc.h freelist.h \ - memory.h gc.h minor_gc.h prims.h signals.h stacks.h jumptbl.h + ../config/s.h mlvalues.h backtrace.h callback.h debugger.h fail.h \ + fix_code.h instrtrace.h instruct.h interp.h major_gc.h freelist.h \ + memory.h gc.h minor_gc.h prims.h signals.h stacks.h jumptbl.h ints.pic.o: ints.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h intext.h io.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h + ../config/s.h mlvalues.h custom.h fail.h intext.h io.h memory.h gc.h \ + major_gc.h freelist.h minor_gc.h io.pic.o: io.c config.h ../config/m.h ../config/s.h compatibility.h alloc.h \ - misc.h mlvalues.h custom.h fail.h io.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h signals.h sys.h + misc.h mlvalues.h custom.h fail.h io.h memory.h gc.h major_gc.h \ + freelist.h minor_gc.h signals.h sys.h lexing.pic.o: lexing.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h + ../config/s.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ + minor_gc.h main.pic.o: main.c misc.h compatibility.h config.h ../config/m.h \ - ../config/s.h mlvalues.h sys.h + ../config/s.h mlvalues.h sys.h major_gc.pic.o: major_gc.c compact.h config.h ../config/m.h ../config/s.h \ - compatibility.h misc.h custom.h mlvalues.h fail.h finalise.h roots.h \ - memory.h gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h weak.h + compatibility.h misc.h custom.h mlvalues.h fail.h finalise.h roots.h \ + memory.h gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h weak.h md5.pic.o: md5.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h md5.h io.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h reverse.h + ../config/s.h mlvalues.h fail.h md5.h io.h memory.h gc.h major_gc.h \ + freelist.h minor_gc.h reverse.h memory.pic.o: memory.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h freelist.h gc.h gc_ctrl.h major_gc.h memory.h \ - minor_gc.h signals.h + ../config/s.h mlvalues.h freelist.h gc.h gc_ctrl.h major_gc.h memory.h \ + minor_gc.h signals.h meta.pic.o: meta.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h fix_code.h interp.h intext.h io.h \ - major_gc.h freelist.h memory.h gc.h minor_gc.h prims.h stacks.h + ../config/s.h mlvalues.h fail.h fix_code.h interp.h intext.h io.h \ + major_gc.h freelist.h memory.h gc.h minor_gc.h prims.h stacks.h minor_gc.pic.o: minor_gc.c config.h ../config/m.h ../config/s.h \ - compatibility.h fail.h misc.h mlvalues.h finalise.h roots.h memory.h \ - gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h signals.h weak.h + compatibility.h fail.h misc.h mlvalues.h finalise.h roots.h memory.h \ + gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h signals.h weak.h misc.pic.o: misc.c config.h ../config/m.h ../config/s.h compatibility.h \ - misc.h memory.h gc.h mlvalues.h major_gc.h freelist.h minor_gc.h + misc.h memory.h gc.h mlvalues.h major_gc.h freelist.h minor_gc.h obj.pic.o: obj.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h gc.h interp.h major_gc.h freelist.h \ - memory.h minor_gc.h prims.h + ../config/s.h mlvalues.h fail.h gc.h interp.h major_gc.h freelist.h \ + memory.h minor_gc.h prims.h parsing.pic.o: parsing.c config.h ../config/m.h ../config/s.h compatibility.h \ - mlvalues.h misc.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - alloc.h + mlvalues.h misc.h memory.h gc.h major_gc.h freelist.h minor_gc.h alloc.h prims.pic.o: prims.c mlvalues.h compatibility.h config.h ../config/m.h \ - ../config/s.h misc.h prims.h + ../config/s.h misc.h prims.h printexc.pic.o: printexc.c backtrace.h mlvalues.h compatibility.h config.h \ - ../config/m.h ../config/s.h misc.h callback.h debugger.h fail.h \ - printexc.h + ../config/m.h ../config/s.h misc.h callback.h debugger.h fail.h \ + printexc.h roots.pic.o: roots.c finalise.h roots.h misc.h compatibility.h config.h \ - ../config/m.h ../config/s.h memory.h gc.h mlvalues.h major_gc.h \ - freelist.h minor_gc.h globroots.h stacks.h -signals.pic.o: signals.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h callback.h fail.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h roots.h signals.h signals_machdep.h \ - sys.h + ../config/m.h ../config/s.h memory.h gc.h mlvalues.h major_gc.h \ + freelist.h minor_gc.h globroots.h stacks.h signals_byt.pic.o: signals_byt.c config.h ../config/m.h ../config/s.h \ - compatibility.h memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h \ - minor_gc.h osdeps.h signals.h signals_machdep.h + compatibility.h memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h \ + minor_gc.h osdeps.h signals.h signals_machdep.h +signals.pic.o: signals.c alloc.h compatibility.h misc.h config.h \ + ../config/m.h ../config/s.h mlvalues.h callback.h fail.h memory.h gc.h \ + major_gc.h freelist.h minor_gc.h roots.h signals.h signals_machdep.h \ + sys.h stacks.pic.o: stacks.c config.h ../config/m.h ../config/s.h compatibility.h \ - fail.h misc.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h + fail.h misc.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ + minor_gc.h startup.pic.o: startup.c config.h ../config/m.h ../config/s.h compatibility.h \ - alloc.h misc.h mlvalues.h backtrace.h callback.h custom.h debugger.h \ - dynlink.h exec.h fail.h fix_code.h freelist.h gc_ctrl.h instrtrace.h \ - interp.h intext.h io.h memory.h gc.h major_gc.h minor_gc.h osdeps.h \ - prims.h printexc.h reverse.h signals.h stacks.h sys.h startup.h \ - version.h + alloc.h misc.h mlvalues.h backtrace.h callback.h custom.h debugger.h \ + dynlink.h exec.h fail.h fix_code.h freelist.h gc_ctrl.h instrtrace.h \ + interp.h intext.h io.h memory.h gc.h major_gc.h minor_gc.h osdeps.h \ + prims.h printexc.h reverse.h signals.h stacks.h sys.h startup.h \ + version.h str.pic.o: str.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h + ../config/s.h mlvalues.h fail.h sys.pic.o: sys.c config.h ../config/m.h ../config/s.h compatibility.h alloc.h \ - misc.h mlvalues.h debugger.h fail.h instruct.h osdeps.h signals.h \ - stacks.h memory.h gc.h major_gc.h freelist.h minor_gc.h sys.h + misc.h mlvalues.h debugger.h fail.h instruct.h osdeps.h signals.h \ + stacks.h memory.h gc.h major_gc.h freelist.h minor_gc.h sys.h terminfo.pic.o: terminfo.c config.h ../config/m.h ../config/s.h \ - compatibility.h alloc.h misc.h mlvalues.h fail.h io.h + compatibility.h alloc.h misc.h mlvalues.h fail.h io.h unix.pic.o: unix.c config.h ../config/m.h ../config/s.h compatibility.h \ - memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h minor_gc.h \ - osdeps.h + memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h minor_gc.h \ + osdeps.h weak.pic.o: weak.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h major_gc.h freelist.h memory.h gc.h \ - minor_gc.h + ../config/s.h mlvalues.h fail.h major_gc.h freelist.h memory.h gc.h \ + minor_gc.h win32.pic.o: win32.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - osdeps.h signals.h sys.h + ../config/s.h mlvalues.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ + osdeps.h signals.h sys.h diff --git a/debugger/.depend b/debugger/.depend index b62541619a..c9a56ac144 100644 --- a/debugger/.depend +++ b/debugger/.depend @@ -16,8 +16,8 @@ int64ops.cmi : lexer.cmi : parser.cmi loadprinter.cmi : ../parsing/longident.cmi dynlink.cmi parameters.cmi : -parser.cmi : parser_aux.cmi ../parsing/longident.cmi parser_aux.cmi : primitives.cmi ../parsing/longident.cmi +parser.cmi : parser_aux.cmi ../parsing/longident.cmi pattern_matching.cmi : ../typing/typedtree.cmi parser_aux.cmi debugcom.cmi pos.cmi : ../bytecomp/instruct.cmi primitives.cmi : $(UNIXDIR)/unix.cmi diff --git a/lex/.depend b/lex/.depend index 455421e708..10f90c22c6 100644 --- a/lex/.depend +++ b/lex/.depend @@ -3,8 +3,8 @@ compact.cmi : lexgen.cmi cset.cmi : lexer.cmi : parser.cmi lexgen.cmi : syntax.cmi -output.cmi : syntax.cmi lexgen.cmi compact.cmi common.cmi outputbis.cmi : syntax.cmi lexgen.cmi common.cmi +output.cmi : syntax.cmi lexgen.cmi compact.cmi common.cmi parser.cmi : syntax.cmi syntax.cmi : cset.cmi table.cmi : @@ -22,10 +22,10 @@ main.cmo : syntax.cmi parser.cmi outputbis.cmi output.cmi lexgen.cmi \ lexer.cmi cset.cmi compact.cmi common.cmi main.cmx : syntax.cmx parser.cmx outputbis.cmx output.cmx lexgen.cmx \ lexer.cmx cset.cmx compact.cmx common.cmx -output.cmo : lexgen.cmi compact.cmi common.cmi output.cmi -output.cmx : lexgen.cmx compact.cmx common.cmx output.cmi outputbis.cmo : lexgen.cmi common.cmi outputbis.cmi outputbis.cmx : lexgen.cmx common.cmx outputbis.cmi +output.cmo : lexgen.cmi compact.cmi common.cmi output.cmi +output.cmx : lexgen.cmx compact.cmx common.cmx output.cmi parser.cmo : syntax.cmi cset.cmi parser.cmi parser.cmx : syntax.cmx cset.cmx parser.cmi syntax.cmo : cset.cmi syntax.cmi diff --git a/ocamlbuild/.depend b/ocamlbuild/.depend index 3b67d873d4..d6dda722ed 100644 --- a/ocamlbuild/.depend +++ b/ocamlbuild/.depend @@ -8,9 +8,9 @@ exit_codes.cmi : fda.cmi : slurp.cmi findlib.cmi : signatures.cmi command.cmi flags.cmi : tags.cmi command.cmi -glob.cmi : signatures.cmi glob_ast.cmi bool.cmi glob_ast.cmi : bool.cmi glob_lexer.cmi : glob_ast.cmi +glob.cmi : signatures.cmi glob_ast.cmi bool.cmi hooks.cmi : hygiene.cmi : slurp.cmi lexers.cmi : loc.cmi glob.cmi @@ -20,17 +20,17 @@ main.cmi : my_std.cmi : signatures.cmi my_unix.cmi : ocaml_arch.cmi : signatures.cmi command.cmi +ocamlbuild_executor.cmi : +ocamlbuildlight.cmi : +ocamlbuild.cmi : +ocamlbuild_plugin.cmi : +ocamlbuild_unix_plugin.cmi : +ocamlbuild_where.cmi : ocaml_compiler.cmi : tags.cmi rule.cmi pathname.cmi command.cmi ocaml_dependencies.cmi : pathname.cmi ocaml_specific.cmi : ocaml_tools.cmi : tags.cmi rule.cmi pathname.cmi command.cmi ocaml_utils.cmi : tags.cmi pathname.cmi command.cmi -ocamlbuild.cmi : -ocamlbuild_executor.cmi : -ocamlbuild_plugin.cmi : -ocamlbuild_unix_plugin.cmi : -ocamlbuild_where.cmi : -ocamlbuildlight.cmi : options.cmi : slurp.cmi signatures.cmi command.cmi param_tags.cmi : tags.cmi loc.cmi pathname.cmi : signatures.cmi @@ -75,12 +75,12 @@ findlib.cmx : my_unix.cmx my_std.cmx lexers.cmx const.cmx command.cmx \ findlib.cmi flags.cmo : tags.cmi param_tags.cmi log.cmi command.cmi bool.cmi flags.cmi flags.cmx : tags.cmx param_tags.cmx log.cmx command.cmx bool.cmx flags.cmi -glob.cmo : my_std.cmi glob_lexer.cmi glob_ast.cmi bool.cmi glob.cmi -glob.cmx : my_std.cmx glob_lexer.cmx glob_ast.cmx bool.cmx glob.cmi glob_ast.cmo : bool.cmi glob_ast.cmi glob_ast.cmx : bool.cmx glob_ast.cmi glob_lexer.cmo : glob_ast.cmi bool.cmi glob_lexer.cmi glob_lexer.cmx : glob_ast.cmx bool.cmx glob_lexer.cmi +glob.cmo : my_std.cmi glob_lexer.cmi glob_ast.cmi bool.cmi glob.cmi +glob.cmx : my_std.cmx glob_lexer.cmx glob_ast.cmx bool.cmx glob.cmi hooks.cmo : hooks.cmi hooks.cmx : hooks.cmi hygiene.cmo : slurp.cmi shell.cmi pathname.cmi options.cmi my_std.cmi \ @@ -111,6 +111,22 @@ my_unix.cmo : my_std.cmi my_unix.cmi my_unix.cmx : my_std.cmx my_unix.cmi ocaml_arch.cmo : pathname.cmi my_std.cmi command.cmi ocaml_arch.cmi ocaml_arch.cmx : pathname.cmx my_std.cmx command.cmx ocaml_arch.cmi +ocamlbuild_config.cmo : +ocamlbuild_config.cmx : +ocamlbuild_executor.cmo : ocamlbuild_executor.cmi +ocamlbuild_executor.cmx : ocamlbuild_executor.cmi +ocamlbuildlight.cmo : ocamlbuildlight.cmi +ocamlbuildlight.cmx : ocamlbuildlight.cmi +ocamlbuild.cmo : ocamlbuild_unix_plugin.cmi ocamlbuild.cmi +ocamlbuild.cmx : ocamlbuild_unix_plugin.cmx ocamlbuild.cmi +ocamlbuild_plugin.cmo : ocamlbuild_plugin.cmi +ocamlbuild_plugin.cmx : ocamlbuild_plugin.cmi +ocamlbuild_unix_plugin.cmo : ocamlbuild_executor.cmi my_unix.cmi my_std.cmi \ + exit_codes.cmi ocamlbuild_unix_plugin.cmi +ocamlbuild_unix_plugin.cmx : ocamlbuild_executor.cmx my_unix.cmx my_std.cmx \ + exit_codes.cmx ocamlbuild_unix_plugin.cmi +ocamlbuild_where.cmo : ocamlbuild_config.cmo ocamlbuild_where.cmi +ocamlbuild_where.cmx : ocamlbuild_config.cmx ocamlbuild_where.cmi ocaml_compiler.cmo : tools.cmi tags.cmi rule.cmi resource.cmi pathname.cmi \ options.cmi ocaml_utils.cmi ocaml_dependencies.cmi ocaml_arch.cmi \ my_std.cmi log.cmi command.cmi ocaml_compiler.cmi @@ -141,22 +157,6 @@ ocaml_utils.cmo : tools.cmi tags.cmi pathname.cmi param_tags.cmi options.cmi \ ocaml_utils.cmx : tools.cmx tags.cmx pathname.cmx param_tags.cmx options.cmx \ my_std.cmx log.cmx lexers.cmx flags.cmx const.cmx command.cmx \ ocaml_utils.cmi -ocamlbuild.cmo : ocamlbuild_unix_plugin.cmi ocamlbuild.cmi -ocamlbuild.cmx : ocamlbuild_unix_plugin.cmx ocamlbuild.cmi -ocamlbuild_config.cmo : -ocamlbuild_config.cmx : -ocamlbuild_executor.cmo : ocamlbuild_executor.cmi -ocamlbuild_executor.cmx : ocamlbuild_executor.cmi -ocamlbuild_plugin.cmo : ocamlbuild_plugin.cmi -ocamlbuild_plugin.cmx : ocamlbuild_plugin.cmi -ocamlbuild_unix_plugin.cmo : ocamlbuild_executor.cmi my_unix.cmi my_std.cmi \ - exit_codes.cmi ocamlbuild_unix_plugin.cmi -ocamlbuild_unix_plugin.cmx : ocamlbuild_executor.cmx my_unix.cmx my_std.cmx \ - exit_codes.cmx ocamlbuild_unix_plugin.cmi -ocamlbuild_where.cmo : ocamlbuild_config.cmo ocamlbuild_where.cmi -ocamlbuild_where.cmx : ocamlbuild_config.cmx ocamlbuild_where.cmi -ocamlbuildlight.cmo : ocamlbuildlight.cmi -ocamlbuildlight.cmx : ocamlbuildlight.cmi options.cmo : shell.cmi ocamlbuild_where.cmi ocamlbuild_config.cmo \ my_std.cmi log.cmi lexers.cmi const.cmo command.cmi options.cmi options.cmx : shell.cmx ocamlbuild_where.cmx ocamlbuild_config.cmx \ diff --git a/ocamldoc/.depend b/ocamldoc/.depend index b98bb57fe7..6c729e3274 100644 --- a/ocamldoc/.depend +++ b/ocamldoc/.depend @@ -1,11 +1,3 @@ -odoc.cmo : ../typing/typedtree.cmi odoc_messages.cmo odoc_info.cmi \ - odoc_global.cmi odoc_gen.cmi odoc_config.cmi odoc_args.cmi \ - odoc_analyse.cmi ../utils/misc.cmi ../utils/config.cmi \ - ../utils/clflags.cmi -odoc.cmx : ../typing/typedtree.cmx odoc_messages.cmx odoc_info.cmx \ - odoc_global.cmx odoc_gen.cmx odoc_config.cmx odoc_args.cmx \ - odoc_analyse.cmx ../utils/misc.cmx ../utils/config.cmx \ - ../utils/clflags.cmx odoc_analyse.cmo : ../utils/warnings.cmi ../typing/types.cmi \ ../typing/typemod.cmi ../typing/typedtree.cmi ../parsing/syntaxerr.cmi \ ../driver/pparse.cmi ../parsing/parse.cmi odoc_types.cmi odoc_text.cmi \ @@ -52,6 +44,8 @@ odoc_class.cmo : ../typing/types.cmi odoc_value.cmo odoc_types.cmi \ odoc_parameter.cmo odoc_name.cmi odoc_class.cmx : ../typing/types.cmx odoc_value.cmx odoc_types.cmx \ odoc_parameter.cmx odoc_name.cmx +odoc_comments_global.cmo : odoc_comments_global.cmi +odoc_comments_global.cmx : odoc_comments_global.cmi odoc_comments.cmo : odoc_types.cmi odoc_text.cmi odoc_see_lexer.cmo \ odoc_parser.cmi odoc_misc.cmi odoc_messages.cmo odoc_merge.cmi \ odoc_lexer.cmo odoc_global.cmi odoc_cross.cmi odoc_comments_global.cmi \ @@ -60,8 +54,6 @@ odoc_comments.cmx : odoc_types.cmx odoc_text.cmx odoc_see_lexer.cmx \ odoc_parser.cmx odoc_misc.cmx odoc_messages.cmx odoc_merge.cmx \ odoc_lexer.cmx odoc_global.cmx odoc_cross.cmx odoc_comments_global.cmx \ odoc_comments.cmi -odoc_comments_global.cmo : odoc_comments_global.cmi -odoc_comments_global.cmx : odoc_comments_global.cmi odoc_config.cmo : ../utils/config.cmi odoc_config.cmi odoc_config.cmx : ../utils/config.cmx odoc_config.cmi odoc_control.cmo : @@ -150,6 +142,14 @@ odoc_misc.cmo : ../typing/types.cmi ../typing/predef.cmi ../typing/path.cmi \ odoc_misc.cmx : ../typing/types.cmx ../typing/predef.cmx ../typing/path.cmx \ odoc_types.cmx odoc_messages.cmx ../parsing/longident.cmx \ ../typing/ctype.cmx ../typing/btype.cmx odoc_misc.cmi +odoc.cmo : ../typing/typedtree.cmi odoc_messages.cmo odoc_info.cmi \ + odoc_global.cmi odoc_gen.cmi odoc_config.cmi odoc_args.cmi \ + odoc_analyse.cmi ../utils/misc.cmi ../utils/config.cmi \ + ../utils/clflags.cmi +odoc.cmx : ../typing/typedtree.cmx odoc_messages.cmx odoc_info.cmx \ + odoc_global.cmx odoc_gen.cmx odoc_config.cmx odoc_args.cmx \ + odoc_analyse.cmx ../utils/misc.cmx ../utils/config.cmx \ + ../utils/clflags.cmx odoc_module.cmo : ../typing/types.cmi odoc_value.cmo odoc_types.cmi \ odoc_type.cmo odoc_name.cmi odoc_extension.cmo odoc_exception.cmo \ odoc_class.cmo @@ -212,12 +212,12 @@ odoc_texi.cmo : ../typing/types.cmi odoc_to_text.cmo odoc_messages.cmo \ odoc_info.cmi ../parsing/asttypes.cmi odoc_texi.cmx : ../typing/types.cmx odoc_to_text.cmx odoc_messages.cmx \ odoc_info.cmx ../parsing/asttypes.cmi +odoc_text_lexer.cmo : odoc_text_parser.cmi odoc_misc.cmi +odoc_text_lexer.cmx : odoc_text_parser.cmx odoc_misc.cmx odoc_text.cmo : odoc_types.cmi odoc_text_parser.cmi odoc_text_lexer.cmo \ odoc_text.cmi odoc_text.cmx : odoc_types.cmx odoc_text_parser.cmx odoc_text_lexer.cmx \ odoc_text.cmi -odoc_text_lexer.cmo : odoc_text_parser.cmi odoc_misc.cmi -odoc_text_lexer.cmx : odoc_text_parser.cmx odoc_misc.cmx odoc_text_parser.cmo : odoc_types.cmi odoc_misc.cmi odoc_text_parser.cmi odoc_text_parser.cmx : odoc_types.cmx odoc_misc.cmx odoc_text_parser.cmi odoc_to_text.cmo : odoc_module.cmo odoc_messages.cmo odoc_info.cmi @@ -236,8 +236,8 @@ odoc_analyse.cmi : odoc_module.cmo odoc_global.cmi odoc_args.cmi : odoc_gen.cmi odoc_ast.cmi : ../typing/types.cmi ../typing/typedtree.cmi \ ../parsing/parsetree.cmi odoc_sig.cmi odoc_name.cmi odoc_module.cmo -odoc_comments.cmi : odoc_types.cmi odoc_module.cmo odoc_comments_global.cmi : +odoc_comments.cmi : odoc_types.cmi odoc_module.cmo odoc_config.cmi : odoc_cross.cmi : odoc_types.cmi odoc_module.cmo odoc_dag2html.cmi : odoc_info.cmi diff --git a/otherlibs/bigarray/.depend b/otherlibs/bigarray/.depend index 889328a333..d19e796b38 100644 --- a/otherlibs/bigarray/.depend +++ b/otherlibs/bigarray/.depend @@ -1,21 +1,21 @@ bigarray_stubs.o: bigarray_stubs.c ../../byterun/alloc.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h bigarray.h \ - ../../byterun/config.h ../../byterun/mlvalues.h ../../byterun/custom.h \ - ../../byterun/fail.h ../../byterun/intext.h ../../byterun/io.h \ - ../../byterun/hash.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h + ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/mlvalues.h bigarray.h \ + ../../byterun/config.h ../../byterun/mlvalues.h ../../byterun/custom.h \ + ../../byterun/fail.h ../../byterun/intext.h ../../byterun/io.h \ + ../../byterun/hash.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/major_gc.h ../../byterun/freelist.h \ + ../../byterun/minor_gc.h mmap_unix.o: mmap_unix.c bigarray.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/mlvalues.h ../../byterun/config.h ../../byterun/misc.h \ - ../../byterun/custom.h ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/io.h ../../byterun/sys.h ../../byterun/signals.h + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/mlvalues.h ../../byterun/config.h ../../byterun/misc.h \ + ../../byterun/custom.h ../../byterun/mlvalues.h ../../byterun/fail.h \ + ../../byterun/io.h ../../byterun/sys.h ../../byterun/signals.h mmap_win32.o: mmap_win32.c bigarray.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/mlvalues.h ../../byterun/config.h ../../byterun/misc.h \ - ../../byterun/alloc.h ../../byterun/mlvalues.h ../../byterun/custom.h \ - ../../byterun/fail.h ../../byterun/sys.h ../unix/unixsupport.h + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/mlvalues.h ../../byterun/config.h ../../byterun/misc.h \ + ../../byterun/alloc.h ../../byterun/mlvalues.h ../../byterun/custom.h \ + ../../byterun/fail.h ../../byterun/sys.h ../unix/unixsupport.h bigarray.cmi : bigarray.cmo : bigarray.cmi bigarray.cmx : bigarray.cmi diff --git a/otherlibs/graph/.depend b/otherlibs/graph/.depend index ab9faa619a..b4b531d43a 100644 --- a/otherlibs/graph/.depend +++ b/otherlibs/graph/.depend @@ -1,103 +1,63 @@ -color.o: color.c libgraph.h \ - \ - \ - \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h \ - -draw.o: draw.c libgraph.h \ - \ - \ - \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h -dump_img.o: dump_img.c libgraph.h \ - \ - \ - \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h image.h \ - ../../byterun/alloc.h ../../byterun/mlvalues.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h -events.o: events.c libgraph.h \ - \ - \ - \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/signals.h -fill.o: fill.c libgraph.h \ - \ - \ - \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h -image.o: image.c libgraph.h \ - \ - \ - \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h image.h \ - ../../byterun/alloc.h ../../byterun/mlvalues.h ../../byterun/custom.h -make_img.o: make_img.c libgraph.h \ - \ - \ - \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h image.h \ - ../../byterun/memory.h ../../byterun/gc.h ../../byterun/mlvalues.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h -open.o: open.c libgraph.h \ - \ - \ - \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/callback.h ../../byterun/fail.h \ - ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h -point_col.o: point_col.c libgraph.h \ - \ - \ - \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h -sound.o: sound.c libgraph.h \ - \ - \ - \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h -subwindow.o: subwindow.c libgraph.h \ - \ - \ - \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h -text.o: text.c libgraph.h \ - \ - \ - \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h +color.o: color.c libgraph.h ../../byterun/mlvalues.h \ + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h +draw.o: draw.c libgraph.h ../../byterun/mlvalues.h \ + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h +dump_img.o: dump_img.c libgraph.h ../../byterun/mlvalues.h \ + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h image.h ../../byterun/alloc.h \ + ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/major_gc.h ../../byterun/freelist.h \ + ../../byterun/minor_gc.h +events.o: events.c libgraph.h ../../byterun/mlvalues.h \ + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ + ../../byterun/signals.h +fill.o: fill.c libgraph.h ../../byterun/mlvalues.h \ + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/mlvalues.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h +image.o: image.c libgraph.h ../../byterun/mlvalues.h \ + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h image.h ../../byterun/alloc.h \ + ../../byterun/mlvalues.h ../../byterun/custom.h +make_img.o: make_img.c libgraph.h ../../byterun/mlvalues.h \ + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h image.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/mlvalues.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h +open.o: open.c libgraph.h ../../byterun/mlvalues.h \ + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ + ../../byterun/callback.h ../../byterun/fail.h ../../byterun/memory.h \ + ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ + ../../byterun/minor_gc.h +point_col.o: point_col.c libgraph.h ../../byterun/mlvalues.h \ + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h +sound.o: sound.c libgraph.h ../../byterun/mlvalues.h \ + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h +subwindow.o: subwindow.c libgraph.h ../../byterun/mlvalues.h \ + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h +text.o: text.c libgraph.h ../../byterun/mlvalues.h \ + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h graphics.cmi : graphicsX11.cmi : graphics.cmo : graphics.cmi diff --git a/otherlibs/num/.depend b/otherlibs/num/.depend index 51b180f5d8..62a525057d 100644 --- a/otherlibs/num/.depend +++ b/otherlibs/num/.depend @@ -1,21 +1,21 @@ -bng.o: bng.c bng.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/compatibility.h bng_amd64.c \ - bng_digit.c bng_amd64.o: bng_amd64.c bng_arm64.o: bng_arm64.c +bng.o: bng.c bng.h ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/compatibility.h bng_amd64.c \ + bng_digit.c bng_digit.o: bng_digit.c bng_ia32.o: bng_ia32.c bng_ppc.o: bng_ppc.c bng_sparc.o: bng_sparc.c nat_stubs.o: nat_stubs.c ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/config.h ../../byterun/custom.h ../../byterun/intext.h \ - ../../byterun/io.h ../../byterun/fail.h ../../byterun/hash.h \ - ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/mlvalues.h bng.h nat.h + ../../byterun/compatibility.h ../../byterun/misc.h \ + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/mlvalues.h \ + ../../byterun/config.h ../../byterun/custom.h ../../byterun/intext.h \ + ../../byterun/io.h ../../byterun/fail.h ../../byterun/hash.h \ + ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h \ + ../../byterun/mlvalues.h bng.h nat.h arith_flags.cmi : arith_status.cmi : big_int.cmi : nat.cmi diff --git a/otherlibs/str/.depend b/otherlibs/str/.depend index 5be8377c2d..b0ff35895b 100644 --- a/otherlibs/str/.depend +++ b/otherlibs/str/.depend @@ -1,9 +1,9 @@ strstubs.o: strstubs.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/fail.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ + ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/fail.h str.cmi : str.cmo : str.cmi str.cmx : str.cmi diff --git a/otherlibs/systhreads/.depend b/otherlibs/systhreads/.depend index 85add2e592..93b01d6876 100644 --- a/otherlibs/systhreads/.depend +++ b/otherlibs/systhreads/.depend @@ -1,14 +1,14 @@ st_stubs.o: st_stubs.c ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/backtrace.h ../../byterun/callback.h \ - ../../byterun/custom.h ../../byterun/fail.h ../../byterun/io.h \ - ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/printexc.h ../../byterun/roots.h \ - ../../byterun/memory.h ../../byterun/signals.h ../../byterun/stacks.h \ - ../../byterun/sys.h threads.h st_posix.h + ../../byterun/compatibility.h ../../byterun/misc.h \ + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/mlvalues.h \ + ../../byterun/backtrace.h ../../byterun/callback.h \ + ../../byterun/custom.h ../../byterun/fail.h ../../byterun/io.h \ + ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/misc.h \ + ../../byterun/mlvalues.h ../../byterun/printexc.h ../../byterun/roots.h \ + ../../byterun/memory.h ../../byterun/signals.h ../../byterun/stacks.h \ + ../../byterun/sys.h threads.h st_posix.h condition.cmi : mutex.cmi event.cmi : mutex.cmi : diff --git a/otherlibs/threads/.depend b/otherlibs/threads/.depend index 3a6c7f02b6..8728bad9e2 100644 --- a/otherlibs/threads/.depend +++ b/otherlibs/threads/.depend @@ -1,19 +1,21 @@ scheduler.o: scheduler.c ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/backtrace.h ../../byterun/callback.h \ - ../../byterun/config.h ../../byterun/fail.h ../../byterun/io.h \ - ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/printexc.h ../../byterun/roots.h \ - ../../byterun/memory.h ../../byterun/signals.h ../../byterun/stacks.h \ - ../../byterun/sys.h + ../../byterun/compatibility.h ../../byterun/misc.h \ + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/mlvalues.h \ + ../../byterun/backtrace.h ../../byterun/callback.h \ + ../../byterun/config.h ../../byterun/fail.h ../../byterun/io.h \ + ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/misc.h \ + ../../byterun/mlvalues.h ../../byterun/printexc.h ../../byterun/roots.h \ + ../../byterun/memory.h ../../byterun/signals.h ../../byterun/stacks.h \ + ../../byterun/sys.h condition.cmi : mutex.cmi event.cmi : mutex.cmi : -thread.cmi : unix.cmo -threadUnix.cmi : unix.cmo +pervasives.cmi : +thread.cmi : unix.cmi +threadUnix.cmi : unix.cmi +unix.cmi : condition.cmo : thread.cmi mutex.cmi condition.cmi condition.cmx : thread.cmx mutex.cmx condition.cmi event.cmo : mutex.cmi condition.cmi event.cmi @@ -22,11 +24,11 @@ marshal.cmo : marshal.cmx : mutex.cmo : thread.cmi mutex.cmi mutex.cmx : thread.cmx mutex.cmi -pervasives.cmo : unix.cmo -pervasives.cmx : unix.cmx -thread.cmo : unix.cmo thread.cmi +pervasives.cmo : unix.cmi pervasives.cmi +pervasives.cmx : unix.cmx pervasives.cmi +thread.cmo : unix.cmi thread.cmi thread.cmx : unix.cmx thread.cmi -threadUnix.cmo : unix.cmo thread.cmi threadUnix.cmi +threadUnix.cmo : unix.cmi thread.cmi threadUnix.cmi threadUnix.cmx : unix.cmx thread.cmx threadUnix.cmi -unix.cmo : -unix.cmx : +unix.cmo : unix.cmi +unix.cmx : unix.cmi diff --git a/otherlibs/unix/.depend b/otherlibs/unix/.depend index 85eee1b853..048b855412 100644 --- a/otherlibs/unix/.depend +++ b/otherlibs/unix/.depend @@ -1,506 +1,502 @@ accept.o: accept.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h \ - socketaddr.h ../../byterun/misc.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ + ../../byterun/mlvalues.h ../../byterun/fail.h ../../byterun/memory.h \ + ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ + ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h \ + socketaddr.h ../../byterun/misc.h access.o: access.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ + ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/major_gc.h ../../byterun/freelist.h \ + ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h addrofstr.o: addrofstr.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/fail.h \ - unixsupport.h socketaddr.h ../../byterun/misc.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/mlvalues.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/fail.h \ + unixsupport.h socketaddr.h ../../byterun/misc.h alarm.o: alarm.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h bind.o: bind.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h socketaddr.h \ - ../../byterun/misc.h + ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/mlvalues.h \ + ../../byterun/mlvalues.h unixsupport.h socketaddr.h ../../byterun/misc.h chdir.o: chdir.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ + ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h \ + ../../byterun/signals.h unixsupport.h chmod.o: chmod.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ + ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h \ + ../../byterun/signals.h unixsupport.h chown.o: chown.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ + ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h \ + ../../byterun/signals.h unixsupport.h chroot.o: chroot.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ + ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h \ + ../../byterun/signals.h unixsupport.h close.o: close.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h \ - ../../byterun/signals.h ../../byterun/mlvalues.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/signals.h \ + ../../byterun/mlvalues.h unixsupport.h closedir.o: closedir.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/mlvalues.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h \ + ../../byterun/signals.h unixsupport.h connect.o: connect.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h ../../byterun/signals.h unixsupport.h \ - socketaddr.h ../../byterun/misc.h + ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/mlvalues.h \ + ../../byterun/mlvalues.h ../../byterun/signals.h unixsupport.h \ + socketaddr.h ../../byterun/misc.h cst2constr.o: cst2constr.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/fail.h ../../byterun/mlvalues.h \ - cst2constr.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/fail.h ../../byterun/mlvalues.h \ + cst2constr.h cstringv.o: cstringv.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h -dup.o: dup.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/mlvalues.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h dup2.o: dup2.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h +dup.o: dup.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h envir.o: envir.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ + ../../byterun/mlvalues.h errmsg.o: errmsg.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ + ../../byterun/mlvalues.h execv.o: execv.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ + ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h execve.o: execve.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ + ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h execvp.o: execvp.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ + ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h exit.o: exit.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h fchmod.o: fchmod.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h ../../byterun/signals.h unixsupport.h + ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/mlvalues.h \ + ../../byterun/mlvalues.h ../../byterun/signals.h unixsupport.h fchown.o: fchown.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h ../../byterun/signals.h unixsupport.h + ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/mlvalues.h \ + ../../byterun/mlvalues.h ../../byterun/signals.h unixsupport.h fcntl.o: fcntl.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h + ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/mlvalues.h \ + ../../byterun/mlvalues.h unixsupport.h fork.o: fork.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h \ - ../../byterun/debugger.h ../../byterun/mlvalues.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h \ + ../../byterun/debugger.h ../../byterun/mlvalues.h unixsupport.h ftruncate.o: ftruncate.c ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h ../../byterun/io.h ../../byterun/signals.h \ - unixsupport.h + ../../byterun/compatibility.h ../../byterun/misc.h \ + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/mlvalues.h \ + ../../byterun/mlvalues.h ../../byterun/io.h ../../byterun/signals.h \ + unixsupport.h getaddrinfo.o: getaddrinfo.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/misc.h ../../byterun/signals.h \ - unixsupport.h cst2constr.h socketaddr.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ + ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/major_gc.h ../../byterun/freelist.h \ + ../../byterun/minor_gc.h ../../byterun/misc.h ../../byterun/signals.h \ + unixsupport.h cst2constr.h socketaddr.h getcwd.o: getcwd.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ + ../../byterun/mlvalues.h ../../byterun/fail.h unixsupport.h getegid.o: getegid.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h unixsupport.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h unixsupport.h geteuid.o: geteuid.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h unixsupport.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h unixsupport.h getgid.o: getgid.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h getgr.o: getgr.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/fail.h \ - ../../byterun/mlvalues.h ../../byterun/alloc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/fail.h \ + ../../byterun/mlvalues.h ../../byterun/alloc.h ../../byterun/memory.h \ + ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ + ../../byterun/minor_gc.h unixsupport.h getgroups.o: getgroups.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h unixsupport.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ + ../../byterun/fail.h unixsupport.h gethost.o: gethost.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h \ - socketaddr.h ../../byterun/misc.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ + ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/major_gc.h ../../byterun/freelist.h \ + ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h \ + socketaddr.h ../../byterun/misc.h gethostname.o: gethostname.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h unixsupport.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ + ../../byterun/fail.h unixsupport.h getlogin.o: getlogin.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - unixsupport.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ + unixsupport.h getnameinfo.o: getnameinfo.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h \ - socketaddr.h ../../byterun/misc.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ + ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/major_gc.h ../../byterun/freelist.h \ + ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h \ + socketaddr.h ../../byterun/misc.h getpeername.o: getpeername.c ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h socketaddr.h \ - ../../byterun/misc.h + ../../byterun/compatibility.h ../../byterun/misc.h \ + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/mlvalues.h \ + ../../byterun/mlvalues.h unixsupport.h socketaddr.h ../../byterun/misc.h getpid.o: getpid.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h getppid.o: getppid.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h unixsupport.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h unixsupport.h getproto.o: getproto.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h unixsupport.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ + ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/major_gc.h ../../byterun/freelist.h \ + ../../byterun/minor_gc.h unixsupport.h getpw.o: getpw.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/fail.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ + ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/major_gc.h ../../byterun/freelist.h \ + ../../byterun/minor_gc.h ../../byterun/fail.h unixsupport.h getserv.o: getserv.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h unixsupport.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ + ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/major_gc.h ../../byterun/freelist.h \ + ../../byterun/minor_gc.h unixsupport.h getsockname.o: getsockname.c ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h socketaddr.h \ - ../../byterun/misc.h + ../../byterun/compatibility.h ../../byterun/misc.h \ + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/mlvalues.h \ + ../../byterun/mlvalues.h unixsupport.h socketaddr.h ../../byterun/misc.h gettimeofday.o: gettimeofday.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h unixsupport.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ + ../../byterun/fail.h unixsupport.h getuid.o: getuid.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h gmtime.o: gmtime.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ + ../../byterun/mlvalues.h ../../byterun/fail.h ../../byterun/memory.h \ + ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ + ../../byterun/minor_gc.h unixsupport.h initgroups.o: initgroups.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h unixsupport.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ + ../../byterun/fail.h unixsupport.h isatty.o: isatty.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h itimer.o: itimer.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ + ../../byterun/mlvalues.h ../../byterun/fail.h ../../byterun/memory.h \ + ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ + ../../byterun/minor_gc.h unixsupport.h kill.o: kill.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/fail.h \ - ../../byterun/mlvalues.h unixsupport.h ../../byterun/signals.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/fail.h \ + ../../byterun/mlvalues.h unixsupport.h ../../byterun/signals.h link.o: link.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ + ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h \ + ../../byterun/signals.h unixsupport.h listen.o: listen.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h + ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/mlvalues.h \ + ../../byterun/mlvalues.h unixsupport.h lockf.o: lockf.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h ../../byterun/signals.h unixsupport.h + ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/mlvalues.h \ + ../../byterun/mlvalues.h ../../byterun/signals.h unixsupport.h lseek.o: lseek.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/io.h ../../byterun/signals.h \ - unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ + ../../byterun/mlvalues.h ../../byterun/io.h ../../byterun/signals.h \ + unixsupport.h mkdir.o: mkdir.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ + ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h \ + ../../byterun/signals.h unixsupport.h mkfifo.o: mkfifo.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h + ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/mlvalues.h \ + ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/major_gc.h ../../byterun/freelist.h \ + ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h nice.o: nice.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h open.o: open.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/misc.h ../../byterun/signals.h \ - unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ + ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/major_gc.h ../../byterun/freelist.h \ + ../../byterun/minor_gc.h ../../byterun/misc.h ../../byterun/signals.h \ + unixsupport.h opendir.o: opendir.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/alloc.h \ - ../../byterun/signals.h unixsupport.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/mlvalues.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/alloc.h \ + ../../byterun/signals.h unixsupport.h pipe.o: pipe.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ + ../../byterun/mlvalues.h unixsupport.h putenv.o: putenv.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/mlvalues.h unixsupport.h + ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/mlvalues.h \ + ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h \ + ../../byterun/mlvalues.h unixsupport.h read.o: read.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ + ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h \ + ../../byterun/signals.h unixsupport.h readdir.o: readdir.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/fail.h ../../byterun/mlvalues.h \ - ../../byterun/alloc.h ../../byterun/signals.h unixsupport.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/fail.h ../../byterun/mlvalues.h \ + ../../byterun/alloc.h ../../byterun/signals.h unixsupport.h readlink.o: readlink.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/alloc.h \ - ../../byterun/fail.h ../../byterun/signals.h unixsupport.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/mlvalues.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/alloc.h \ + ../../byterun/fail.h ../../byterun/signals.h unixsupport.h rename.o: rename.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ + ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h \ + ../../byterun/signals.h unixsupport.h rewinddir.o: rewinddir.c ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h + ../../byterun/compatibility.h ../../byterun/misc.h \ + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/mlvalues.h \ + ../../byterun/mlvalues.h unixsupport.h rmdir.o: rmdir.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ + ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h \ + ../../byterun/signals.h unixsupport.h select.o: select.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ + ../../byterun/mlvalues.h ../../byterun/fail.h ../../byterun/memory.h \ + ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ + ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h sendrecv.o: sendrecv.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h \ - socketaddr.h ../../byterun/misc.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ + ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/major_gc.h ../../byterun/freelist.h \ + ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h \ + socketaddr.h ../../byterun/misc.h setgid.o: setgid.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h setgroups.o: setgroups.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h unixsupport.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ + ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/major_gc.h ../../byterun/freelist.h \ + ../../byterun/minor_gc.h unixsupport.h setsid.o: setsid.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h + ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/mlvalues.h \ + ../../byterun/mlvalues.h unixsupport.h setuid.o: setuid.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h shutdown.o: shutdown.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h + ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/mlvalues.h \ + ../../byterun/mlvalues.h unixsupport.h signals.o: signals.c ../../byterun/alloc.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/mlvalues.h \ - ../../byterun/signals.h unixsupport.h + ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/mlvalues.h \ + ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/major_gc.h ../../byterun/freelist.h \ + ../../byterun/minor_gc.h ../../byterun/mlvalues.h \ + ../../byterun/signals.h unixsupport.h sleep.o: sleep.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h \ - ../../byterun/signals.h ../../byterun/mlvalues.h unixsupport.h -socket.o: socket.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/signals.h \ + ../../byterun/mlvalues.h unixsupport.h socketaddr.o: socketaddr.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h \ - socketaddr.h ../../byterun/misc.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ + ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h \ + socketaddr.h ../../byterun/misc.h +socket.o: socket.c ../../byterun/fail.h ../../byterun/compatibility.h \ + ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/mlvalues.h \ + ../../byterun/mlvalues.h unixsupport.h socketpair.o: socketpair.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h unixsupport.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ + ../../byterun/fail.h unixsupport.h sockopt.o: sockopt.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/alloc.h \ - ../../byterun/fail.h unixsupport.h socketaddr.h ../../byterun/misc.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/mlvalues.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/alloc.h \ + ../../byterun/fail.h unixsupport.h socketaddr.h ../../byterun/misc.h stat.o: stat.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/alloc.h \ - ../../byterun/signals.h unixsupport.h cst2constr.h ../../byterun/io.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ + ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/alloc.h \ + ../../byterun/signals.h unixsupport.h cst2constr.h ../../byterun/io.h strofaddr.o: strofaddr.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h unixsupport.h socketaddr.h ../../byterun/misc.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ + ../../byterun/fail.h unixsupport.h socketaddr.h ../../byterun/misc.h symlink.o: symlink.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h + ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/mlvalues.h \ + ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/major_gc.h ../../byterun/freelist.h \ + ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h termios.o: termios.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h unixsupport.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ + ../../byterun/fail.h unixsupport.h time.o: time.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ + ../../byterun/mlvalues.h unixsupport.h times.o: times.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ + ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/major_gc.h ../../byterun/freelist.h \ + ../../byterun/minor_gc.h unixsupport.h truncate.o: truncate.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/fail.h \ - ../../byterun/signals.h ../../byterun/io.h unixsupport.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/mlvalues.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/fail.h \ + ../../byterun/signals.h ../../byterun/io.h unixsupport.h umask.o: umask.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h unixsupport.o: unixsupport.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/callback.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/fail.h unixsupport.h \ - cst2constr.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ + ../../byterun/callback.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/major_gc.h ../../byterun/freelist.h \ + ../../byterun/minor_gc.h ../../byterun/fail.h unixsupport.h cst2constr.h unlink.o: unlink.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ + ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h \ + ../../byterun/signals.h unixsupport.h utimes.o: utimes.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h + ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/mlvalues.h \ + ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/major_gc.h ../../byterun/freelist.h \ + ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h wait.o: wait.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ + ../../byterun/mlvalues.h ../../byterun/fail.h ../../byterun/memory.h \ + ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ + ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h write.o: write.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h -unix.cmi : + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ + ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h \ + ../../byterun/signals.h unixsupport.h unixLabels.cmi : unix.cmi -unix.cmo : unix.cmi -unix.cmx : unix.cmi +unix.cmi : unixLabels.cmo : unix.cmi unixLabels.cmi unixLabels.cmx : unix.cmx unixLabels.cmi +unix.cmo : unix.cmi +unix.cmx : unix.cmi diff --git a/stdlib/.depend b/stdlib/.depend index 96f95082d2..11f21a8fa0 100644 --- a/stdlib/.depend +++ b/stdlib/.depend @@ -1,12 +1,12 @@ arg.cmi : -array.cmi : arrayLabels.cmi : +array.cmi : buffer.cmi : -bytes.cmi : bytesLabels.cmi : +bytes.cmi : callback.cmi : -camlinternalFormat.cmi : camlinternalFormatBasics.cmi buffer.cmi camlinternalFormatBasics.cmi : +camlinternalFormat.cmi : camlinternalFormatBasics.cmi buffer.cmi camlinternalLazy.cmi : camlinternalMod.cmi : obj.cmi camlinternalOO.cmi : obj.cmi @@ -22,8 +22,8 @@ int32.cmi : int64.cmi : lazy.cmi : lexing.cmi : -list.cmi : listLabels.cmi : +list.cmi : map.cmi : marshal.cmi : moreLabels.cmi : set.cmi map.cmi hashtbl.cmi @@ -43,32 +43,32 @@ stack.cmi : stdLabels.cmi : stringLabels.cmi listLabels.cmi bytesLabels.cmi \ arrayLabels.cmi stream.cmi : -string.cmi : stringLabels.cmi : +string.cmi : sys.cmi : weak.cmi : hashtbl.cmi arg.cmo : sys.cmi string.cmi printf.cmi list.cmi buffer.cmi array.cmi \ arg.cmi arg.cmx : sys.cmx string.cmx printf.cmx list.cmx buffer.cmx array.cmx \ arg.cmi -array.cmo : array.cmi -array.cmx : array.cmi arrayLabels.cmo : array.cmi arrayLabels.cmi arrayLabels.cmx : array.cmx arrayLabels.cmi +array.cmo : array.cmi +array.cmx : array.cmi buffer.cmo : sys.cmi string.cmi bytes.cmi buffer.cmi buffer.cmx : sys.cmx string.cmx bytes.cmx buffer.cmi -bytes.cmo : pervasives.cmi list.cmi char.cmi bytes.cmi -bytes.cmx : pervasives.cmx list.cmx char.cmx bytes.cmi bytesLabels.cmo : bytes.cmi bytesLabels.cmi bytesLabels.cmx : bytes.cmx bytesLabels.cmi +bytes.cmo : pervasives.cmi list.cmi char.cmi bytes.cmi +bytes.cmx : pervasives.cmx list.cmx char.cmx bytes.cmi callback.cmo : obj.cmi callback.cmi callback.cmx : obj.cmx callback.cmi +camlinternalFormatBasics.cmo : camlinternalFormatBasics.cmi +camlinternalFormatBasics.cmx : camlinternalFormatBasics.cmi camlinternalFormat.cmo : sys.cmi string.cmi char.cmi \ camlinternalFormatBasics.cmi bytes.cmi buffer.cmi camlinternalFormat.cmi camlinternalFormat.cmx : sys.cmx string.cmx char.cmx \ camlinternalFormatBasics.cmx bytes.cmx buffer.cmx camlinternalFormat.cmi -camlinternalFormatBasics.cmo : camlinternalFormatBasics.cmi -camlinternalFormatBasics.cmx : camlinternalFormatBasics.cmi camlinternalLazy.cmo : obj.cmi camlinternalLazy.cmi camlinternalLazy.cmx : obj.cmx camlinternalLazy.cmi camlinternalMod.cmo : obj.cmi camlinternalOO.cmi array.cmi \ @@ -111,10 +111,10 @@ lazy.cmo : obj.cmi camlinternalLazy.cmi lazy.cmi lazy.cmx : obj.cmx camlinternalLazy.cmx lazy.cmi lexing.cmo : sys.cmi string.cmi bytes.cmi array.cmi lexing.cmi lexing.cmx : sys.cmx string.cmx bytes.cmx array.cmx lexing.cmi -list.cmo : list.cmi -list.cmx : list.cmi listLabels.cmo : list.cmi listLabels.cmi listLabels.cmx : list.cmx listLabels.cmi +list.cmo : list.cmi +list.cmx : list.cmi map.cmo : map.cmi map.cmx : map.cmi marshal.cmo : bytes.cmi marshal.cmi @@ -157,18 +157,18 @@ sort.cmo : array.cmi sort.cmi sort.cmx : array.cmx sort.cmi stack.cmo : list.cmi stack.cmi stack.cmx : list.cmx stack.cmi +std_exit.cmo : +std_exit.cmx : stdLabels.cmo : stringLabels.cmi listLabels.cmi bytesLabels.cmi \ arrayLabels.cmi stdLabels.cmi stdLabels.cmx : stringLabels.cmx listLabels.cmx bytesLabels.cmx \ arrayLabels.cmx stdLabels.cmi -std_exit.cmo : -std_exit.cmx : stream.cmo : string.cmi obj.cmi list.cmi lazy.cmi bytes.cmi stream.cmi stream.cmx : string.cmx obj.cmx list.cmx lazy.cmx bytes.cmx stream.cmi -string.cmo : pervasives.cmi list.cmi bytes.cmi string.cmi -string.cmx : pervasives.cmx list.cmx bytes.cmx string.cmi stringLabels.cmo : string.cmi stringLabels.cmi stringLabels.cmx : string.cmx stringLabels.cmi +string.cmo : pervasives.cmi list.cmi bytes.cmi string.cmi +string.cmx : pervasives.cmx list.cmx bytes.cmx string.cmi sys.cmo : sys.cmi sys.cmx : sys.cmi weak.cmo : sys.cmi obj.cmi hashtbl.cmi array.cmi weak.cmi @@ -177,24 +177,24 @@ arg.cmo : sys.cmi string.cmi printf.cmi list.cmi buffer.cmi array.cmi \ arg.cmi arg.p.cmx : sys.p.cmx string.p.cmx printf.p.cmx list.p.cmx buffer.p.cmx array.p.cmx \ arg.cmi -array.cmo : array.cmi -array.p.cmx : array.cmi arrayLabels.cmo : array.cmi arrayLabels.cmi arrayLabels.p.cmx : array.p.cmx arrayLabels.cmi +array.cmo : array.cmi +array.p.cmx : array.cmi buffer.cmo : sys.cmi string.cmi bytes.cmi buffer.cmi buffer.p.cmx : sys.p.cmx string.p.cmx bytes.p.cmx buffer.cmi -bytes.cmo : pervasives.cmi list.cmi char.cmi bytes.cmi -bytes.p.cmx : pervasives.p.cmx list.p.cmx char.p.cmx bytes.cmi bytesLabels.cmo : bytes.cmi bytesLabels.cmi bytesLabels.p.cmx : bytes.p.cmx bytesLabels.cmi +bytes.cmo : pervasives.cmi list.cmi char.cmi bytes.cmi +bytes.p.cmx : pervasives.p.cmx list.p.cmx char.p.cmx bytes.cmi callback.cmo : obj.cmi callback.cmi callback.p.cmx : obj.p.cmx callback.cmi +camlinternalFormatBasics.cmo : camlinternalFormatBasics.cmi +camlinternalFormatBasics.p.cmx : camlinternalFormatBasics.cmi camlinternalFormat.cmo : sys.cmi string.cmi char.cmi \ camlinternalFormatBasics.cmi bytes.cmi buffer.cmi camlinternalFormat.cmi camlinternalFormat.p.cmx : sys.p.cmx string.p.cmx char.p.cmx \ camlinternalFormatBasics.p.cmx bytes.p.cmx buffer.p.cmx camlinternalFormat.cmi -camlinternalFormatBasics.cmo : camlinternalFormatBasics.cmi -camlinternalFormatBasics.p.cmx : camlinternalFormatBasics.cmi camlinternalLazy.cmo : obj.cmi camlinternalLazy.cmi camlinternalLazy.p.cmx : obj.p.cmx camlinternalLazy.cmi camlinternalMod.cmo : obj.cmi camlinternalOO.cmi array.cmi \ @@ -237,10 +237,10 @@ lazy.cmo : obj.cmi camlinternalLazy.cmi lazy.cmi lazy.p.cmx : obj.p.cmx camlinternalLazy.p.cmx lazy.cmi lexing.cmo : sys.cmi string.cmi bytes.cmi array.cmi lexing.cmi lexing.p.cmx : sys.p.cmx string.p.cmx bytes.p.cmx array.p.cmx lexing.cmi -list.cmo : list.cmi -list.p.cmx : list.cmi listLabels.cmo : list.cmi listLabels.cmi listLabels.p.cmx : list.p.cmx listLabels.cmi +list.cmo : list.cmi +list.p.cmx : list.cmi map.cmo : map.cmi map.p.cmx : map.cmi marshal.cmo : bytes.cmi marshal.cmi @@ -283,18 +283,18 @@ sort.cmo : array.cmi sort.cmi sort.p.cmx : array.p.cmx sort.cmi stack.cmo : list.cmi stack.cmi stack.p.cmx : list.p.cmx stack.cmi +std_exit.cmo : +std_exit.p.cmx : stdLabels.cmo : stringLabels.cmi listLabels.cmi bytesLabels.cmi \ arrayLabels.cmi stdLabels.cmi stdLabels.p.cmx : stringLabels.p.cmx listLabels.p.cmx bytesLabels.p.cmx \ arrayLabels.p.cmx stdLabels.cmi -std_exit.cmo : -std_exit.p.cmx : stream.cmo : string.cmi obj.cmi list.cmi lazy.cmi bytes.cmi stream.cmi stream.p.cmx : string.p.cmx obj.p.cmx list.p.cmx lazy.p.cmx bytes.p.cmx stream.cmi -string.cmo : pervasives.cmi list.cmi bytes.cmi string.cmi -string.p.cmx : pervasives.p.cmx list.p.cmx bytes.p.cmx string.cmi stringLabels.cmo : string.cmi stringLabels.cmi stringLabels.p.cmx : string.p.cmx stringLabels.cmi +string.cmo : pervasives.cmi list.cmi bytes.cmi string.cmi +string.p.cmx : pervasives.p.cmx list.p.cmx bytes.p.cmx string.cmi sys.cmo : sys.cmi sys.p.cmx : sys.cmi weak.cmo : sys.cmi obj.cmi hashtbl.cmi array.cmi weak.cmi diff --git a/tools/.depend b/tools/.depend index c33f5c6f22..810c439bba 100644 --- a/tools/.depend +++ b/tools/.depend @@ -59,10 +59,10 @@ ocamldep.cmx : ../driver/pparse.cmx ../parsing/parsetree.cmi \ ../parsing/parse.cmx ../utils/misc.cmx ../parsing/longident.cmx \ ../parsing/location.cmx depend.cmx ../utils/config.cmx \ ../driver/compenv.cmx ../utils/clflags.cmx -ocamlmklib.cmo : ocamlmklibconfig.cmo -ocamlmklib.cmx : ocamlmklibconfig.cmx ocamlmklibconfig.cmo : ocamlmklibconfig.cmx : +ocamlmklib.cmo : ocamlmklibconfig.cmo +ocamlmklib.cmx : ocamlmklibconfig.cmx ocamlmktop.cmo : ../utils/ccomp.cmi ocamlmktop.cmx : ../utils/ccomp.cmx ocamloptp.cmo : ../driver/main_args.cmi From 14764ec8413f684359fdd677633349d842af6157 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 20 Jan 2015 19:38:51 +0000 Subject: [PATCH 132/494] PR#6573: extern "C" for systhreads/threads.h git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15787 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ VERSION | 2 +- otherlibs/systhreads/threads.h | 8 ++++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index b06328d148..33a2f6dd15 100644 --- a/Changes +++ b/Changes @@ -38,6 +38,8 @@ Bug fixes: (report by user 'william') - PR#6665: Failure of tests/asmcomp on sparc (Stéphane Glondu) +- PR#6573: extern "C" for systhreads/threads.h + (Mickaël Delahaye) - PR#6669: fix 4.02 regression in toplevel printing of lazy values (Leo White, review by Gabriel Scherer) - PR#6680: Missing parentheses when printing polymorphic variant value in warning diff --git a/VERSION b/VERSION index 09cabba6aa..9da3f6af46 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.02.2+dev0-2014-10-14 +4.02.2+dev1-2015-01-20 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli diff --git a/otherlibs/systhreads/threads.h b/otherlibs/systhreads/threads.h index 6a97b25103..616138da60 100644 --- a/otherlibs/systhreads/threads.h +++ b/otherlibs/systhreads/threads.h @@ -14,6 +14,10 @@ #ifndef CAML_THREADS_H #define CAML_THREADS_H +#ifdef __cplusplus +extern "C" { +#endif + CAMLextern void caml_enter_blocking_section (void); CAMLextern void caml_leave_blocking_section (void); #define caml_acquire_runtime_system caml_leave_blocking_section @@ -55,4 +59,8 @@ CAMLextern int caml_c_thread_unregister(void); Both functions return 1 on success, 0 on error. */ +#ifdef __cplusplus +} +#endif + #endif /* CAML_THREADS_H */ From 700d297eb5fcb0f34ddfbb6d4df284944f380a9a Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sat, 24 Jan 2015 16:59:28 +0000 Subject: [PATCH 133/494] PR#6720: propagate -g to the C compiler (Peter Zotov) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15796 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- utils/ccomp.ml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/utils/ccomp.ml b/utils/ccomp.ml index a1c45ec029..4bea26866b 100644 --- a/utils/ccomp.ml +++ b/utils/ccomp.ml @@ -51,14 +51,17 @@ let quote_optfile = function let compile_file ~output_name name = command (Printf.sprintf - "%s%s -c %s %s %s %s" + "%s%s -c %s %s %s %s %s" (match !Clflags.c_compiler with | Some cc -> cc | None -> if !Clflags.native_code then Config.native_c_compiler else Config.bytecomp_c_compiler) - (match output_name with Some n -> " -o " ^ Filename.quote n | None -> "") + (match output_name with + | Some n -> " -o " ^ Filename.quote n + | None -> "") + (if !Clflags.debug then "-g" else "") (String.concat " " (List.rev !Clflags.all_ccopts)) (quote_prefixed "-I" (List.rev !Clflags.include_dirs)) (Clflags.std_include_flag "-I") From 4eb7786c9e6908f439c808797faddc16e7190469 Mon Sep 17 00:00:00 2001 From: Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> Date: Fri, 30 Jan 2015 02:04:38 +0000 Subject: [PATCH 134/494] Fix PR#6763 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15799 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + toplevel/topdirs.ml | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 33a2f6dd15..f80b0d7cd2 100644 --- a/Changes +++ b/Changes @@ -49,6 +49,7 @@ Bug fixes: (Gabriel Scherer, report by Peter Zotov) - PR#6727: Printf.sprintf "%F" misbehavior (Benoît Vaugon, report by Vassili Karpov) +- PR#6763: #show with -short-paths doesn't select shortest type paths - ocamlbuild on cygwin cannot find ocamlfind (user 'algoriddle') - allow android build with pthreads support (since SDK r10c) diff --git a/toplevel/topdirs.ml b/toplevel/topdirs.ml index 709451762d..42fe0a5dcc 100644 --- a/toplevel/topdirs.ml +++ b/toplevel/topdirs.ml @@ -429,7 +429,8 @@ let show_prim to_sig ppf lid = in let id = Ident.create_persistent s in let sg = to_sig env loc id lid in - fprintf ppf "@[%a@]@." Printtyp.signature sg + Printtyp.wrap_printing_env env + (fun () -> fprintf ppf "@[%a@]@." Printtyp.signature sg) with | Not_found -> fprintf ppf "@[Unknown element.@]@." From ae7fea5f6636704e4a74dd7804de88ccd93f88a8 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Thu, 5 Feb 2015 04:21:12 +0000 Subject: [PATCH 135/494] configure: add test for cygwin64 Makefile: fix compilation of checkstack tests/callback: fix compilation git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15808 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Makefile | 5 ++--- configure | 7 ++++++- testsuite/tests/callback/Makefile | 12 ++++++------ 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index 6c0e7e6403..8666fe17b4 100644 --- a/Makefile +++ b/Makefile @@ -798,9 +798,8 @@ alldepend:: # Check that the stack limit is reasonable. checkstack: - @if $(BYTECC) $(BYTECCCOMPOPTS) $(BYTECCLINKOPTS) \ - -o tools/checkstack tools/checkstack.c; \ - then tools/checkstack; \ + @if $(MKEXE) -o tools/checkstack$(EXE) tools/checkstack.c; \ + then tools/checkstack$(EXE); \ else :; \ fi @rm -f tools/checkstack diff --git a/configure b/configure index d63dbbd042..f3c14c8743 100755 --- a/configure +++ b/configure @@ -375,10 +375,15 @@ case "$bytecc,$target" in *,powerpc-*-aix*) bytecccompopts="-D_XOPEN_SOURCE=500";; *gcc*,*-*-cygwin*) + case $target in + i686-*) flavor=cygwin;; + x86_64-*) flavor=cygwin64;; + *) err "unknown cygwin variant";; + esac bytecccompopts="-fno-defer-pop $gcc_warnings -U_WIN32" dllccompopts="-U_WIN32 -DCAML_DLL" if test $with_sharedlibs = yes; then - flexlink="flexlink -chain cygwin -merge-manifest -stack 16777216" + flexlink="flexlink -chain $flavor -merge-manifest -stack 16777216" flexdir=`$flexlink -where | dos2unix` if test -z "$flexdir"; then wrn "flexlink not found: native shared libraries won't be available." diff --git a/testsuite/tests/callback/Makefile b/testsuite/tests/callback/Makefile index 58b5ed8aa9..d89c532635 100644 --- a/testsuite/tests/callback/Makefile +++ b/testsuite/tests/callback/Makefile @@ -31,9 +31,9 @@ common: run-byte: common @printf " ... testing 'bytecode':" @$(OCAMLC) $(COMPFLAGS) -c tcallback.ml - @$(OCAMLC) $(COMPFLAGS) -o ./program -custom unix.cma \ + @$(OCAMLC) $(COMPFLAGS) -o ./program$(EXE) -custom unix.cma \ callbackprim.$(O) tcallback.cmo - @./program >bytecode.result + @./program$(EXE) >bytecode.result @$(DIFF) reference bytecode.result \ && echo " => passed" || echo " => failed" @@ -42,9 +42,9 @@ run-opt: common @if $(BYTECODE_ONLY); then : ; else \ printf " ... testing 'native':"; \ $(OCAMLOPT) $(COMPFLAGS) -c tcallback.ml; \ - $(OCAMLOPT) $(COMPFLAGS) -o ./program unix.cmxa callbackprim.$(O) \ - tcallback.cmx; \ - ./program >native.result; \ + $(OCAMLOPT) $(COMPFLAGS) -o ./program$(EXE) unix.cmxa \ + callbackprim.$(O) tcallback.cmx; \ + ./program$(EXE) >native.result; \ $(DIFF) reference native.result \ && echo " => passed" || echo " => failed"; \ fi @@ -54,6 +54,6 @@ promote: defaultpromote .PHONY: clean clean: defaultclean - @rm -f *.result ./program + @rm -f *.result ./program$(EXE) include $(BASEDIR)/makefiles/Makefile.common From 0d45fb82df8253a3619f99f720f847e4b0bc805d Mon Sep 17 00:00:00 2001 From: Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> Date: Thu, 5 Feb 2015 07:50:43 +0000 Subject: [PATCH 136/494] Fix PR#6768: Typechecker overflow the stack on cyclic type git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15811 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + testsuite/tests/typing-misc/wellfounded.ml | 11 +++++++++++ .../typing-misc/wellfounded.ml.principal.reference | 7 +++++++ testsuite/tests/typing-misc/wellfounded.ml.reference | 7 +++++++ typing/typedecl.ml | 2 +- 5 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 testsuite/tests/typing-misc/wellfounded.ml create mode 100644 testsuite/tests/typing-misc/wellfounded.ml.principal.reference create mode 100644 testsuite/tests/typing-misc/wellfounded.ml.reference diff --git a/Changes b/Changes index f80b0d7cd2..0d63000fa2 100644 --- a/Changes +++ b/Changes @@ -50,6 +50,7 @@ Bug fixes: - PR#6727: Printf.sprintf "%F" misbehavior (Benoît Vaugon, report by Vassili Karpov) - PR#6763: #show with -short-paths doesn't select shortest type paths +- PR#6768: Typechecker overflow the stack on cyclic type - ocamlbuild on cygwin cannot find ocamlfind (user 'algoriddle') - allow android build with pthreads support (since SDK r10c) diff --git a/testsuite/tests/typing-misc/wellfounded.ml b/testsuite/tests/typing-misc/wellfounded.ml new file mode 100644 index 0000000000..b33adc5e17 --- /dev/null +++ b/testsuite/tests/typing-misc/wellfounded.ml @@ -0,0 +1,11 @@ +(* PR#6768 *) + +type _ prod = Prod : ('a * 'y) prod;; + +let f : type t. t prod -> _ = function Prod -> + let module M = + struct + type d = d * d + end + in () +;; diff --git a/testsuite/tests/typing-misc/wellfounded.ml.principal.reference b/testsuite/tests/typing-misc/wellfounded.ml.principal.reference new file mode 100644 index 0000000000..0c9e64ad01 --- /dev/null +++ b/testsuite/tests/typing-misc/wellfounded.ml.principal.reference @@ -0,0 +1,7 @@ + +# type _ prod = Prod : ('a * 'y) prod +# Characters 87-96: + type d = d * d + ^^^^^^^^^ +Error: The type abbreviation d is cyclic +# diff --git a/testsuite/tests/typing-misc/wellfounded.ml.reference b/testsuite/tests/typing-misc/wellfounded.ml.reference new file mode 100644 index 0000000000..0c9e64ad01 --- /dev/null +++ b/testsuite/tests/typing-misc/wellfounded.ml.reference @@ -0,0 +1,7 @@ + +# type _ prod = Prod : ('a * 'y) prod +# Characters 87-96: + type d = d * d + ^^^^^^^^^ +Error: The type abbreviation d is cyclic +# diff --git a/typing/typedecl.ml b/typing/typedecl.ml index ecad00f3a0..781d3cf46a 100644 --- a/typing/typedecl.ml +++ b/typing/typedecl.ml @@ -512,7 +512,7 @@ let check_well_founded env loc path to_check ty = (* Will be detected by check_recursion *) Btype.backtrack snap in - check ty TypeSet.empty ty + Ctype.wrap_trace_gadt_instances env (check ty TypeSet.empty) ty let check_well_founded_manifest env loc path decl = if decl.type_manifest = None then () else From f07c77cf27299c2044ad08007e76db1d923237bd Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 8 Feb 2015 10:00:08 +0000 Subject: [PATCH 137/494] PR#6749: ocamlopt returns n for (n mod 1) instead of 0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (Mark Shinwell and Jérémie Dimino) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15822 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ asmcomp/cmmgen.ml | 6 +++--- testsuite/tests/basic/divint.ml | 4 ++++ testsuite/tests/basic/divint.reference | 4 ++++ 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/Changes b/Changes index 0d63000fa2..3931bf1e21 100644 --- a/Changes +++ b/Changes @@ -49,6 +49,8 @@ Bug fixes: (Gabriel Scherer, report by Peter Zotov) - PR#6727: Printf.sprintf "%F" misbehavior (Benoît Vaugon, report by Vassili Karpov) +- PR#6749: ocamlopt returns n for (n mod 1) instead of 0 + (Mark Shinwell and Jeremie Dimino) - PR#6763: #show with -short-paths doesn't select shortest type paths - PR#6768: Typechecker overflow the stack on cyclic type - ocamlbuild on cygwin cannot find ocamlfind diff --git a/asmcomp/cmmgen.ml b/asmcomp/cmmgen.ml index 1f640b9bfe..3bd65a5349 100644 --- a/asmcomp/cmmgen.ml +++ b/asmcomp/cmmgen.ml @@ -349,9 +349,9 @@ let mod_int c1 c2 dbg = (c1, Cconst_int 0) -> Csequence(c1, Cop(Craise (Raise_regular, dbg), [Cconst_symbol "caml_exn_Division_by_zero"])) - | (c1, Cconst_int 1) -> - c1 - | (Cconst_int(0 | 1) as c1, c2) -> + | (c1, Cconst_int (1 | (-1))) -> + Csequence(c1, Cconst_int 0) + | (Cconst_int(0 | 1 | (-1)) as c1, c2) -> Csequence(c2, c1) | (Cconst_int n1, Cconst_int n2) -> Cconst_int (n1 mod n2) diff --git a/testsuite/tests/basic/divint.ml b/testsuite/tests/basic/divint.ml index 52d14b9c85..fea32631e2 100644 --- a/testsuite/tests/basic/divint.ml +++ b/testsuite/tests/basic/divint.ml @@ -74,6 +74,7 @@ let do_test divisor (df: nativeint -> nativeint) (mf: nativeint -> nativeint) = end let _ = + printf "1 int\n"; WithInt.do_test 1 (fun x -> x / 1)(fun x -> x mod 1); printf "2 int\n"; WithInt.do_test 2 (fun x -> x / 2)(fun x -> x mod 2); printf "3 int\n"; WithInt.do_test 3 (fun x -> x / 3)(fun x -> x mod 3); printf "4 int\n"; WithInt.do_test 4 (fun x -> x / 4)(fun x -> x mod 4); @@ -88,9 +89,11 @@ let _ = printf "55 int\n"; WithInt.do_test 55 (fun x -> x / 55)(fun x -> x mod 55); printf "125 int\n"; WithInt.do_test 125 (fun x -> x / 125)(fun x -> x mod 125); printf "625 int\n"; WithInt.do_test 625 (fun x -> x / 625)(fun x -> x mod 625); + printf "-1 int\n"; WithInt.do_test (-1) (fun x -> x / (-1))(fun x -> x mod (-1)); printf "-2 int\n"; WithInt.do_test (-2) (fun x -> x / (-2))(fun x -> x mod (-2)); printf "-3 int\n"; WithInt.do_test (-3) (fun x -> x / (-3))(fun x -> x mod (-3)); + printf "1 nat\n"; WithNat.do_test 1 (fun x -> Nativeint.div x 1n)(fun x -> Nativeint.rem x 1n); printf "2 nat\n"; WithNat.do_test 2 (fun x -> Nativeint.div x 2n)(fun x -> Nativeint.rem x 2n); printf "3 nat\n"; WithNat.do_test 3 (fun x -> Nativeint.div x 3n)(fun x -> Nativeint.rem x 3n); printf "4 nat\n"; WithNat.do_test 4 (fun x -> Nativeint.div x 4n)(fun x -> Nativeint.rem x 4n); @@ -105,6 +108,7 @@ let _ = printf "55 nat\n"; WithNat.do_test 55 (fun x -> Nativeint.div x 55n)(fun x -> Nativeint.rem x 55n); printf "125 nat\n"; WithNat.do_test 125 (fun x -> Nativeint.div x 125n)(fun x -> Nativeint.rem x 125n); printf "625 nat\n"; WithNat.do_test 625 (fun x -> Nativeint.div x 625n)(fun x -> Nativeint.rem x 625n); + printf "-1 nat\n"; WithNat.do_test (-1) (fun x -> Nativeint.div x (-1n))(fun x -> Nativeint.rem x (-1n)); printf "-2 nat\n"; WithNat.do_test (-2) (fun x -> Nativeint.div x (-2n))(fun x -> Nativeint.rem x (-2n)); printf "-3 nat\n"; WithNat.do_test (-3) (fun x -> Nativeint.div x (-3n))(fun x -> Nativeint.rem x (-3n)); diff --git a/testsuite/tests/basic/divint.reference b/testsuite/tests/basic/divint.reference index 4aa1e2110f..e9a6387fa8 100644 --- a/testsuite/tests/basic/divint.reference +++ b/testsuite/tests/basic/divint.reference @@ -1,3 +1,4 @@ +1 int 2 int 3 int 4 int @@ -12,8 +13,10 @@ 55 int 125 int 625 int +-1 int -2 int -3 int +1 nat 2 nat 3 nat 4 nat @@ -28,6 +31,7 @@ 55 nat 125 nat 625 nat +-1 nat -2 nat -3 nat Test passed. From 76cc0fb0f1d39dab7580d9d825745fbc095b448e Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 8 Feb 2015 10:03:36 +0000 Subject: [PATCH 138/494] minor Changes fix git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15825 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Changes b/Changes index 3931bf1e21..df3d1f1172 100644 --- a/Changes +++ b/Changes @@ -50,7 +50,7 @@ Bug fixes: - PR#6727: Printf.sprintf "%F" misbehavior (Benoît Vaugon, report by Vassili Karpov) - PR#6749: ocamlopt returns n for (n mod 1) instead of 0 - (Mark Shinwell and Jeremie Dimino) + (Mark Shinwell and Jérémie Dimino) - PR#6763: #show with -short-paths doesn't select shortest type paths - PR#6768: Typechecker overflow the stack on cyclic type - ocamlbuild on cygwin cannot find ocamlfind From 80a89ddc64589fb3433536fa21e130836750d5df Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 8 Feb 2015 11:18:19 +0000 Subject: [PATCH 139/494] PR#6642: replace $CAMLORIGIN in -ccopt with the path to cma or cmxa (Peter Zotov) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15827 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ asmcomp/asmlink.ml | 7 ++++--- bytecomp/bytelink.ml | 7 ++++--- man/ocamlc.m | 8 ++++++-- man/ocamlopt.m | 7 ++++++- utils/misc.ml | 11 +++++++++++ utils/misc.mli | 4 ++++ 7 files changed, 37 insertions(+), 9 deletions(-) diff --git a/Changes b/Changes index df3d1f1172..ae9a8f1c05 100644 --- a/Changes +++ b/Changes @@ -6,6 +6,8 @@ Compilers: (Vincent Laporte, Peter Zotov) - PR#6600: make -short-paths faster by building the printing map incrementally (Jacques Garrigue) +- PR#6642: replace $CAMLORIGIN in -ccopt with the path to cma or cmxa + (Peter Zotov, Gabriel Scherer, review by Damien Doligez) Toplevel and debugger: - PR#5958: generalized polymorphic #install_printer diff --git a/asmcomp/asmlink.ml b/asmcomp/asmlink.ml index 153da7cace..bc62b017f5 100644 --- a/asmcomp/asmlink.ml +++ b/asmcomp/asmlink.ml @@ -91,10 +91,11 @@ let extract_crc_implementations () = let lib_ccobjs = ref [] let lib_ccopts = ref [] -let add_ccobjs l = +let add_ccobjs origin l = if not !Clflags.no_auto_link then begin lib_ccobjs := l.lib_ccobjs @ !lib_ccobjs; - lib_ccopts := l.lib_ccopts @ !lib_ccopts + let replace_origin = Misc.replace_substring ~before:"$CAMLORIGIN" ~after:origin in + lib_ccopts := List.map replace_origin l.lib_ccopts @ !lib_ccopts end let runtime_lib () = @@ -179,7 +180,7 @@ let scan_file obj_name tolink = match read_file obj_name with | Library (file_name,infos) -> (* This is an archive file. Each unit contained in it will be linked in only if needed. *) - add_ccobjs infos; + add_ccobjs (Filename.dirname file_name) infos; List.fold_right (fun (info, crc) reqd -> if info.ui_force_link diff --git a/bytecomp/bytelink.ml b/bytecomp/bytelink.ml index bc9779908b..2a729b81dc 100644 --- a/bytecomp/bytelink.ml +++ b/bytecomp/bytelink.ml @@ -42,7 +42,7 @@ let lib_ccobjs = ref [] let lib_ccopts = ref [] let lib_dllibs = ref [] -let add_ccobjs l = +let add_ccobjs origin l = if not !Clflags.no_auto_link then begin if String.length !Clflags.use_runtime = 0 @@ -50,7 +50,8 @@ let add_ccobjs l = then begin if l.lib_custom then Clflags.custom_runtime := true; lib_ccobjs := l.lib_ccobjs @ !lib_ccobjs; - lib_ccopts := l.lib_ccopts @ !lib_ccopts; + let replace_origin = Misc.replace_substring ~before:"$CAMLORIGIN" ~after:origin in + lib_ccopts := List.map replace_origin l.lib_ccopts @ !lib_ccopts; end; lib_dllibs := l.lib_dllibs @ !lib_dllibs end @@ -132,7 +133,7 @@ let scan_file obj_name tolink = seek_in ic pos_toc; let toc = (input_value ic : library) in close_in ic; - add_ccobjs toc; + add_ccobjs (Filename.dirname file_name) toc; let required = List.fold_right (fun compunit reqd -> diff --git a/man/ocamlc.m b/man/ocamlc.m index 26ce50f7c2..3b526f7eec 100644 --- a/man/ocamlc.m +++ b/man/ocamlc.m @@ -191,8 +191,12 @@ Build a library (.cma file) with the object files (.cmo files) given options as if they had been provided on the command line, unless the .B -noautolink -option is given. -.TP +option is given. Additionally, a substring +.B $CAMLORIGIN +inside a +.BR \ \-ccopt +options will be replaced by the full path to the .cma library, +excluding the filename. .B \-absname Show absolute filenames in error messages. .TP diff --git a/man/ocamlopt.m b/man/ocamlopt.m index 15b0c3b89f..fa3db5df8c 100644 --- a/man/ocamlopt.m +++ b/man/ocamlopt.m @@ -153,7 +153,12 @@ Build a library (.cmxa/.a file) with the object files (.cmx/.o options as if they had been provided on the command line, unless the .B \-noautolink -option is given. +option is given. Additionally, a substring +.B $CAMLORIGIN +inside a +.BR \ \-ccopt +options will be replaced by the full path to the .cma library, +excluding the filename. .TP .B \-absname Show absolute filenames in error messages. diff --git a/utils/misc.ml b/utils/misc.ml index 2eb8088e77..2e785327e7 100644 --- a/utils/misc.ml +++ b/utils/misc.ml @@ -202,6 +202,17 @@ let search_substring pat str start = else search (i+1) 0 in search start 0 +let replace_substring ~before ~after str = + let rec search acc curr = + match search_substring before str curr with + | next -> + let prefix = String.sub str curr (next - curr) in + search (prefix :: acc) (next + String.length before) + | exception Not_found -> + let suffix = String.sub str curr (String.length str - curr) in + List.rev (suffix :: acc) + in String.concat after (search [] 0) + let rev_split_words s = let rec split1 res i = if i >= String.length s then res else begin diff --git a/utils/misc.mli b/utils/misc.mli index 5168a6a913..cec1b80bfc 100644 --- a/utils/misc.mli +++ b/utils/misc.mli @@ -101,6 +101,10 @@ val search_substring: string -> string -> int -> int at offset [start] in [str]. Raise [Not_found] if [pat] does not occur. *) +val replace_substring: before:string -> after:string -> string -> string + (* [search_substring ~before ~after str] replaces all occurences + of [before] with [after] in [str] and returns the resulting string. *) + val rev_split_words: string -> string list (* [rev_split_words s] splits [s] in blank-separated words, and return the list of words in reverse order. *) From 06f096d7655ee56a6afd32b4935ff2b5f713c595 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Mon, 9 Feb 2015 22:44:05 +0000 Subject: [PATCH 140/494] a test for the life cycle of weak reference git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15834 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- testsuite/tests/misc/weaklifetime.ml | 74 +++++++++++++++++++++ testsuite/tests/misc/weaklifetime.reference | 0 2 files changed, 74 insertions(+) create mode 100644 testsuite/tests/misc/weaklifetime.ml create mode 100644 testsuite/tests/misc/weaklifetime.reference diff --git a/testsuite/tests/misc/weaklifetime.ml b/testsuite/tests/misc/weaklifetime.ml new file mode 100644 index 0000000000..bc6d0f7348 --- /dev/null +++ b/testsuite/tests/misc/weaklifetime.ml @@ -0,0 +1,74 @@ +(*************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Damien Doligez, Jane Street Capital *) +(* *) +(* Copyright 2015 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(*************************************************************************) + +Random.init 12345;; + +let size = 1000;; + +type block = int array;; + +type objdata = + | Present of block + | Absent of int (* GC count at time of erase *) +;; + +type bunch = { + objs : objdata array; + wp : block Weak.t; +};; + +let data = + Array.init size (fun i -> + let n = 1 + Random.int size in + { + objs = Array.make n (Absent 0); + wp = Weak.create n; + } + ) +;; + +let gccount () = (Gc.quick_stat ()).Gc.major_collections;; + +(* Check the correctness condition on the data at (i,j): + 1. if the block is present, the weak pointer must be full + 2. if the block was removed at GC n, and the weak pointer is still + full, then the current GC must be at most n+1. + + Then modify the data in one of the following ways: + 1. if the block and weak pointer are absent, fill them + 2. if the block and weak pointer are present, randomly erase the block +*) +let check_and_change i j = + let gc1 = gccount () in + match data.(i).objs.(j), Weak.check data.(i).wp j with + | Present x, false -> assert false + | Absent n, true -> assert (gc1 <= n+1) + | Absent _, false -> + let x = Array.make (1 + Random.int 10) 42 in + data.(i).objs.(j) <- Present x; + Weak.set data.(i).wp j (Some x); + | Present _, true -> + if Random.int 10 = 0 then begin + data.(i).objs.(j) <- Absent gc1; + let gc2 = gccount () in + if gc1 <> gc2 then data.(i).objs.(j) <- Absent gc2; + end +;; + +let dummy = ref [||];; + +while gccount () < 20 do + dummy := Array.make (Random.int 300) 0; + let i = Random.int size in + let j = Random.int (Array.length data.(i).objs) in + check_and_change i j; +done diff --git a/testsuite/tests/misc/weaklifetime.reference b/testsuite/tests/misc/weaklifetime.reference new file mode 100644 index 0000000000..e69de29bb2 From 444d6c2eb3e82a003c40c10b0b608909fa1f9a78 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 10 Feb 2015 15:26:30 +0000 Subject: [PATCH 141/494] PR#6675: GC hooks git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15835 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 4 ++++ byterun/major_gc.c | 4 ++++ byterun/minor_gc.c | 6 +++++- byterun/misc.c | 7 +++++++ byterun/misc.h | 7 +++++++ 5 files changed, 27 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index ae9a8f1c05..382be3cdc4 100644 --- a/Changes +++ b/Changes @@ -29,6 +29,10 @@ Tools: - PR#6641: add -g, -ocamlcflags, -ocamloptflags options to ocamlmklib (Peter Zotov) +Runtime: +- PR#6675: GC hooks + (Damien Doligez and Roshan James) + Bug fixes: - PR#5836, PR#6684: printing lazy values in ocamldebug may segfault (Gabriel Scherer) diff --git a/byterun/major_gc.c b/byterun/major_gc.c index a44c8d90ad..eb7f3d0b62 100644 --- a/byterun/major_gc.c +++ b/byterun/major_gc.c @@ -145,6 +145,7 @@ static void mark_slice (intnat work) int marking_closure = 0; #endif + if (caml_major_slice_begin_hook != NULL) (*caml_major_slice_begin_hook) (); caml_gc_message (0x40, "Marking %ld words\n", work); caml_gc_message (0x40, "Subphase = %ld\n", caml_gc_subphase); gray_vals_ptr = gray_vals_cur; @@ -314,6 +315,7 @@ static void mark_slice (intnat work) } } gray_vals_cur = gray_vals_ptr; + if (caml_major_slice_end_hook != NULL) (*caml_major_slice_end_hook) (); } static void sweep_slice (intnat work) @@ -321,6 +323,7 @@ static void sweep_slice (intnat work) char *hp; header_t hd; + if (caml_major_slice_begin_hook != NULL) (*caml_major_slice_begin_hook) (); caml_gc_message (0x40, "Sweeping %ld words\n", work); while (work > 0){ if (caml_gc_sweep_hp < limit){ @@ -359,6 +362,7 @@ static void sweep_slice (intnat work) } } } + if (caml_major_slice_end_hook != NULL) (*caml_major_slice_end_hook) (); } /* The main entry point for the GC. Called after each minor GC. diff --git a/byterun/minor_gc.c b/byterun/minor_gc.c index 2f0ed344cb..ffaf4c7334 100644 --- a/byterun/minor_gc.c +++ b/byterun/minor_gc.c @@ -229,6 +229,7 @@ void caml_empty_minor_heap (void) uintnat prev_alloc_words; if (caml_young_ptr != caml_young_end){ + if (caml_minor_gc_begin_hook != NULL) (*caml_minor_gc_begin_hook) (); prev_alloc_words = caml_allocated_words; caml_in_minor_collection = 1; caml_gc_message (0x02, "<", 0); @@ -256,8 +257,9 @@ void caml_empty_minor_heap (void) caml_in_minor_collection = 0; caml_stat_promoted_words += caml_allocated_words - prev_alloc_words; ++ caml_stat_minor_collections; + caml_final_empty_young (); + if (caml_minor_gc_end_hook != NULL) (*caml_minor_gc_end_hook) (); } - caml_final_empty_young (); #ifdef DEBUG { value *p; @@ -280,7 +282,9 @@ CAMLexport void caml_minor_collection (void) caml_major_collection_slice (0); caml_force_major_slice = 0; + if (caml_finalise_begin_hook != NULL) (*caml_finalise_begin_hook) (); caml_final_do_calls (); + if (caml_finalise_end_hook != NULL) (*caml_finalise_end_hook) (); caml_empty_minor_heap (); } diff --git a/byterun/misc.c b/byterun/misc.c index 6dc27d5cc3..75e1ff992c 100644 --- a/byterun/misc.c +++ b/byterun/misc.c @@ -18,6 +18,13 @@ #include "misc.h" #include "memory.h" +caml_timing_hook caml_major_slice_begin_hook = NULL; +caml_timing_hook caml_major_slice_end_hook = NULL; +caml_timing_hook caml_minor_gc_begin_hook = NULL; +caml_timing_hook caml_minor_gc_end_hook = NULL; +caml_timing_hook caml_finalise_begin_hook = NULL; +caml_timing_hook caml_finalise_end_hook = NULL; + #ifdef DEBUG int caml_failed_assert (char * expr, char * file, int line) diff --git a/byterun/misc.h b/byterun/misc.h index 5640980a6f..a473bd13f4 100644 --- a/byterun/misc.h +++ b/byterun/misc.h @@ -59,6 +59,13 @@ typedef char * addr; #define CAMLweakdef #endif +/* GC timing hooks. These can be assigned by the user. The hook functions + must not allocate or change the heap in any way. */ +typedef void (*caml_timing_hook) (void); +extern caml_timing_hook caml_major_slice_begin_hook, caml_major_slice_end_hook; +extern caml_timing_hook caml_minor_gc_begin_hook, caml_minor_gc_end_hook; +extern caml_timing_hook caml_finalise_begin_hook, caml_finalise_end_hook; + /* Assertions */ #ifdef DEBUG From 3471de4c630b0edcb01a2e2df67367e9df45e114 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 10 Feb 2015 22:39:13 +0000 Subject: [PATCH 142/494] GPR#143: fix getsockopt behaviour for boolean socket options git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15836 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ VERSION | 2 +- otherlibs/unix/sockopt.c | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 382be3cdc4..08dcfb0c0c 100644 --- a/Changes +++ b/Changes @@ -59,6 +59,8 @@ Bug fixes: (Mark Shinwell and Jérémie Dimino) - PR#6763: #show with -short-paths doesn't select shortest type paths - PR#6768: Typechecker overflow the stack on cyclic type +- GPR#143: fix getsockopt behaviour for boolean socket options + (Anil Madhavapeddy and Andrew Ray) - ocamlbuild on cygwin cannot find ocamlfind (user 'algoriddle') - allow android build with pthreads support (since SDK r10c) diff --git a/VERSION b/VERSION index 9da3f6af46..e60397391e 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.02.2+dev1-2015-01-20 +4.02.2+dev2-2015-02-08 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli diff --git a/otherlibs/unix/sockopt.c b/otherlibs/unix/sockopt.c index b6167ebf77..ca379f7626 100644 --- a/otherlibs/unix/sockopt.c +++ b/otherlibs/unix/sockopt.c @@ -194,6 +194,7 @@ unix_getsockopt_aux(char * name, switch (ty) { case TYPE_BOOL: + return Val_bool(optval.i); case TYPE_INT: return Val_int(optval.i); case TYPE_LINGER: From af7a7020c8245f427968376fae9a1509050642ae Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 15 Feb 2015 21:10:57 +0000 Subject: [PATCH 143/494] PR#6775: Digest.file leaks file descriptor on error git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15839 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ stdlib/digest.ml | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Changes b/Changes index 08dcfb0c0c..7de9a8bf19 100644 --- a/Changes +++ b/Changes @@ -59,6 +59,8 @@ Bug fixes: (Mark Shinwell and Jérémie Dimino) - PR#6763: #show with -short-paths doesn't select shortest type paths - PR#6768: Typechecker overflow the stack on cyclic type +- PR#6775: Digest.file leaks file descriptor on error + (Valentin Gatien-Baron) - GPR#143: fix getsockopt behaviour for boolean socket options (Anil Madhavapeddy and Andrew Ray) - ocamlbuild on cygwin cannot find ocamlfind diff --git a/stdlib/digest.ml b/stdlib/digest.ml index 14cb4ebd90..695a01dc33 100644 --- a/stdlib/digest.ml +++ b/stdlib/digest.ml @@ -34,9 +34,9 @@ let subbytes b ofs len = substring (Bytes.unsafe_to_string b) ofs len let file filename = let ic = open_in_bin filename in - let d = channel ic (-1) in - close_in ic; - d + match channel ic (-1) with + | d -> close_in ic; d + | exception e -> close_in ic; raise e let output chan digest = output_string chan digest From 982b174cb4ec5b013d647e485c98dee1c7ccfef0 Mon Sep 17 00:00:00 2001 From: Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> Date: Thu, 19 Feb 2015 10:03:46 +0000 Subject: [PATCH 144/494] Fix PR#6787 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15852 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + testsuite/tests/typing-misc/polyvars.ml | 8 +++++++ .../polyvars.ml.principal.reference | 4 +++- .../tests/typing-misc/polyvars.ml.reference | 4 +++- typing/ctype.ml | 23 +++++++++++-------- 5 files changed, 29 insertions(+), 11 deletions(-) diff --git a/Changes b/Changes index 7de9a8bf19..7a07bd7a96 100644 --- a/Changes +++ b/Changes @@ -61,6 +61,7 @@ Bug fixes: - PR#6768: Typechecker overflow the stack on cyclic type - PR#6775: Digest.file leaks file descriptor on error (Valentin Gatien-Baron) +- PR#6787: Soundness bug with polymorphic variants - GPR#143: fix getsockopt behaviour for boolean socket options (Anil Madhavapeddy and Andrew Ray) - ocamlbuild on cygwin cannot find ocamlfind diff --git a/testsuite/tests/typing-misc/polyvars.ml b/testsuite/tests/typing-misc/polyvars.ml index 00dacf7540..de8cb221bb 100644 --- a/testsuite/tests/typing-misc/polyvars.ml +++ b/testsuite/tests/typing-misc/polyvars.ml @@ -5,3 +5,11 @@ let f x = ignore (match x with `A|`B -> 1); ignore (x : [`A]);; let f (x : [< `A | `B]) = match x with `A | `B | `C -> 0;; (* warn *) let f (x : [`A | `B]) = match x with `A | `B | `C -> 0;; (* fail *) + +(* PR#6787 *) +let revapply x f = f x;; + +let f x (g : [< `Foo]) = + let y = `Bar x, g in + revapply y (fun ((`Bar i), _) -> i);; +(* f : 'a -> [< `Foo ] -> 'a *) diff --git a/testsuite/tests/typing-misc/polyvars.ml.principal.reference b/testsuite/tests/typing-misc/polyvars.ml.principal.reference index bc0741abb6..6732640e9f 100644 --- a/testsuite/tests/typing-misc/polyvars.ml.principal.reference +++ b/testsuite/tests/typing-misc/polyvars.ml.principal.reference @@ -29,4 +29,6 @@ val f : [< `A | `B ] -> int = <fun> Error: This pattern matches values of type [? `C ] but a pattern was expected which matches values of type [ `A | `B ] The second variant type does not allow tag(s) `C -# +# val revapply : 'a -> ('a -> 'b) -> 'b = <fun> +# val f : 'a -> [< `Foo ] -> 'a = <fun> +# diff --git a/testsuite/tests/typing-misc/polyvars.ml.reference b/testsuite/tests/typing-misc/polyvars.ml.reference index 27c4cd4304..751b02fc07 100644 --- a/testsuite/tests/typing-misc/polyvars.ml.reference +++ b/testsuite/tests/typing-misc/polyvars.ml.reference @@ -29,4 +29,6 @@ val f : [< `A | `B ] -> int = <fun> Error: This pattern matches values of type [? `C ] but a pattern was expected which matches values of type [ `A | `B ] The second variant type does not allow tag(s) `C -# +# val revapply : 'a -> ('a -> 'b) -> 'b = <fun> +# val f : 'a -> [< `Foo ] -> 'a = <fun> +# diff --git a/typing/ctype.ml b/typing/ctype.ml index c357e0c6c0..0d8a0e3ae6 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -1055,20 +1055,25 @@ let rec copy ?env ?partial ?keep_names ty = (* Open row if partial for pattern and contains Reither *) let more', row = match partial with - Some (free_univars, false) when row.row_closed - && not row.row_fixed && TypeSet.is_empty (free_univars ty) -> + Some (free_univars, false) -> + let more' = + if more.id != more'.id then more' else + let lv = if keep then more.level else !current_level in + newty2 lv (Tvar None) + in let not_reither (_, f) = match row_field_repr f with Reither _ -> false | _ -> true in - if List.for_all not_reither row.row_fields - then (more', row) else - (newty2 (if keep then more.level else !current_level) - (Tvar None), - {row_fields = List.filter not_reither row.row_fields; - row_more = more; row_bound = (); - row_closed = false; row_fixed = false; row_name = None}) + if row.row_closed && not row.row_fixed + && TypeSet.is_empty (free_univars ty) + && not (List.for_all not_reither row.row_fields) then + (more', + {row_fields = List.filter not_reither row.row_fields; + row_more = more'; row_bound = (); + row_closed = false; row_fixed = false; row_name = None}) + else (more', row) | _ -> (more', row) in (* Register new type first for recursion *) From a75a4e6495c10ca79363ca3ea0c53820002bdfcb Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sat, 21 Feb 2015 13:11:27 +0000 Subject: [PATCH 145/494] Revert "PR#6475: accept -o in ocamlc when compiling C files" This reverts commit 4.02@15753 (4892549bfe2737eef0b452f42729181c45581a44 ). The feature is not ready yet, it breaks compilation of programs that merely link .c files inside a standard executable. See PR#6475 for further discussion. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15863 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 -- bytecomp/bytelink.ml | 2 +- driver/compile.ml | 2 +- driver/optcompile.ml | 2 +- ocamlbuild/ocaml_specific.ml | 4 +++- ocamlbuild/testsuite/internal.ml | 7 ------- utils/ccomp.ml | 7 ++----- utils/ccomp.mli | 2 +- 8 files changed, 9 insertions(+), 19 deletions(-) diff --git a/Changes b/Changes index 7a07bd7a96..1a674998c8 100644 --- a/Changes +++ b/Changes @@ -2,8 +2,6 @@ OCaml 4.02.2: ------------- Compilers: -- PR#6475: accept -o in ocamlc when compiling C files - (Vincent Laporte, Peter Zotov) - PR#6600: make -short-paths faster by building the printing map incrementally (Jacques Garrigue) - PR#6642: replace $CAMLORIGIN in -ccopt with the path to cma or cmxa diff --git a/bytecomp/bytelink.ml b/bytecomp/bytelink.ml index 2a729b81dc..596f624358 100644 --- a/bytecomp/bytelink.ml +++ b/bytecomp/bytelink.ml @@ -581,7 +581,7 @@ let link ppf objfiles output_name = link_bytecode_as_c ppf tolink c_file; if not (Filename.check_suffix output_name ".c") then begin temps := c_file :: !temps; - if Ccomp.compile_file ~output_name:(Some obj_file) c_file <> 0 then raise(Error Custom_runtime); + if Ccomp.compile_file c_file <> 0 then raise(Error Custom_runtime); if not (Filename.check_suffix output_name Config.ext_obj) then begin temps := obj_file :: !temps; if not ( diff --git a/driver/compile.ml b/driver/compile.ml index 7ce751ec70..3b5d2ae077 100644 --- a/driver/compile.ml +++ b/driver/compile.ml @@ -107,4 +107,4 @@ let implementation ppf sourcefile outputprefix = let c_file name = Location.input_name := name; - if Ccomp.compile_file ~output_name:!Clflags.output_name name <> 0 then exit 2 + if Ccomp.compile_file name <> 0 then exit 2 diff --git a/driver/optcompile.ml b/driver/optcompile.ml index 9a0f703f2b..f0ef78d1cb 100644 --- a/driver/optcompile.ml +++ b/driver/optcompile.ml @@ -100,4 +100,4 @@ let implementation ppf sourcefile outputprefix = raise x let c_file name = - if Ccomp.compile_file ~output_name:!Clflags.output_name name <> 0 then exit 2 + if Ccomp.compile_file name <> 0 then exit 2 diff --git a/ocamlbuild/ocaml_specific.ml b/ocamlbuild/ocaml_specific.ml index 04459c7ff3..1d0b8a8e47 100644 --- a/ocamlbuild/ocaml_specific.ml +++ b/ocamlbuild/ocaml_specific.ml @@ -472,7 +472,9 @@ rule "ocaml C stubs: c -> o" let c = env "%.c" in let o = env x_o in let comp = if Tags.mem "native" (tags_of_pathname c) then !Options.ocamlopt else !Options.ocamlc in - Cmd(S[comp; T(tags_of_pathname c++"c"++"compile"); A"-c"; A"-o"; P o; Px c]) + let cc = Cmd(S[comp; T(tags_of_pathname c++"c"++"compile"); A"-c"; Px c]) in + if Pathname.dirname o = Pathname.current_dir_name then cc + else Seq[cc; mv (Pathname.basename o) o] end;; rule "ocaml: ml & ml.depends & *cmi -> .inferred.mli" diff --git a/ocamlbuild/testsuite/internal.ml b/ocamlbuild/testsuite/internal.ml index d02946bf4d..d0071543f0 100644 --- a/ocamlbuild/testsuite/internal.ml +++ b/ocamlbuild/testsuite/internal.ml @@ -314,11 +314,4 @@ let () = test "OpenDependencies" ~matching:[M.f "b.byte"] ~targets:("b.byte",[]) ();; -let () = test "OCamlcC" - ~options:[`no_ocamlfind] - ~description:"Build a C file using ocamlc (PR#6475)" - ~tree:[T.d "nested" [T.f "foo.c" ~content:"void f(){}"]] - ~matching:[_build [M.d "nested" [M.f "foo.o"]]] - ~targets:("nested/foo.o",[]) ();; - run ~root:"_test_internal";; diff --git a/utils/ccomp.ml b/utils/ccomp.ml index 4bea26866b..bfe077aa35 100644 --- a/utils/ccomp.ml +++ b/utils/ccomp.ml @@ -48,19 +48,16 @@ let quote_optfile = function | None -> "" | Some f -> Filename.quote f -let compile_file ~output_name name = +let compile_file name = command (Printf.sprintf - "%s%s -c %s %s %s %s %s" + "%s -c %s %s %s %s %s" (match !Clflags.c_compiler with | Some cc -> cc | None -> if !Clflags.native_code then Config.native_c_compiler else Config.bytecomp_c_compiler) - (match output_name with - | Some n -> " -o " ^ Filename.quote n - | None -> "") (if !Clflags.debug then "-g" else "") (String.concat " " (List.rev !Clflags.all_ccopts)) (quote_prefixed "-I" (List.rev !Clflags.include_dirs)) diff --git a/utils/ccomp.mli b/utils/ccomp.mli index 897c2abbfa..63a190c339 100644 --- a/utils/ccomp.mli +++ b/utils/ccomp.mli @@ -14,7 +14,7 @@ val command: string -> int val run_command: string -> unit -val compile_file: output_name:string option -> string -> int +val compile_file: string -> int val create_archive: string -> string list -> int val expand_libname: string -> string val quote_files: string list -> string From 55fa61bb9c5875684eaa4be3385c5980d27988e8 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 24 Feb 2015 20:52:20 +0000 Subject: [PATCH 146/494] PR#6781 Add higher baud rates to Unix termios git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15864 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 4 +++ VERSION | 2 +- otherlibs/unix/termios.c | 72 ++++++++++++++++++++++++++++++++++++++-- 3 files changed, 74 insertions(+), 4 deletions(-) diff --git a/Changes b/Changes index 1a674998c8..ad5bddc888 100644 --- a/Changes +++ b/Changes @@ -23,6 +23,10 @@ OCamlbuild: - PR#6720: pass -g to C compilers when tag 'debug' is set (Peter Zotov, Gabriel Scherer) +Libraries: +- PR#6781: Add higher baud rates to Unix termios + (Damien Doligez, report by Berke Durak) + Tools: - PR#6641: add -g, -ocamlcflags, -ocamloptflags options to ocamlmklib (Peter Zotov) diff --git a/VERSION b/VERSION index e60397391e..73a5266f4d 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.02.2+dev2-2015-02-08 +4.02.2+dev3-2015-02-24 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli diff --git a/otherlibs/unix/termios.c b/otherlibs/unix/termios.c index 9dd168aeb7..3b42bc5741 100644 --- a/otherlibs/unix/termios.c +++ b/otherlibs/unix/termios.c @@ -90,17 +90,22 @@ static long terminal_io_descr[] = { #undef cflags #undef lflags -struct speedtable_entry ; - static struct { speed_t speed; int baud; } speedtable[] = { + + /* standard speeds */ + {B0, 0}, {B50, 50}, {B75, 75}, {B110, 110}, {B134, 134}, {B150, 150}, +#ifdef B200 + /* Shouldn't need to be ifdef'd but I'm not sure it's available everywhere. */ + {B200, 200}, +#endif {B300, 300}, {B600, 600}, {B1200, 1200}, @@ -110,6 +115,8 @@ static struct { {B9600, 9600}, {B19200, 19200}, {B38400, 38400}, + + /* usual extensions */ #ifdef B57600 {B57600, 57600}, #endif @@ -119,7 +126,66 @@ static struct { #ifdef B230400 {B230400, 230400}, #endif - {B0, 0} + + /* Linux extensions */ +#ifdef B460800 + {B460800, 460800}, +#endif +#ifdef B500000 + {B500000, 500000}, +#endif +#ifdef B576000 + {B576000, 576000}, +#endif +#ifdef B921600 + {B921600, 921600}, +#endif +#ifdef B1000000 + {B1000000, 1000000}, +#endif +#ifdef B1152000 + {B1152000, 1152000}, +#endif +#ifdef B1500000 + {B1500000, 1500000}, +#endif +#ifdef B2000000 + {B2000000, 2000000}, +#endif +#ifdef B2500000 + {B2500000, 2500000}, +#endif +#ifdef B3000000 + {B3000000, 3000000}, +#endif +#ifdef B3500000 + {B3500000, 3500000}, +#endif +#ifdef B4000000 + {B4000000, 4000000}, +#endif + + /* MacOS extensions */ +#ifdef B7200 + {B7200, 7200}, +#endif +#ifdef B14400 + {B14400, 14400}, +#endif +#ifdef B28800 + {B28800, 28800}, +#endif +#ifdef B76800 + {B76800, 76800}, +#endif + + /* Cygwin extensions (in addition to the Linux ones) */ +#ifdef B128000 + {B128000, 128000}, +#endif +#ifdef B256000 + {B256000, 256000}, +#endif }; #define NSPEEDS (sizeof(speedtable) / sizeof(speedtable[0])) From 03d93647636d921224adf865a97d2da7be07346c Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Wed, 25 Feb 2015 20:43:18 +0000 Subject: [PATCH 147/494] PR#6790: otherlibs should be built with -g git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15865 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + otherlibs/dynlink/Makefile | 4 +++- otherlibs/threads/Makefile | 4 +++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Changes b/Changes index ad5bddc888..82b74348f5 100644 --- a/Changes +++ b/Changes @@ -64,6 +64,7 @@ Bug fixes: - PR#6775: Digest.file leaks file descriptor on error (Valentin Gatien-Baron) - PR#6787: Soundness bug with polymorphic variants +- PR#6790: otherlibs should be built with -g - GPR#143: fix getsockopt behaviour for boolean socket options (Anil Madhavapeddy and Andrew Ray) - ocamlbuild on cygwin cannot find ocamlfind diff --git a/otherlibs/dynlink/Makefile b/otherlibs/dynlink/Makefile index 6284a5283e..a0563c536e 100644 --- a/otherlibs/dynlink/Makefile +++ b/otherlibs/dynlink/Makefile @@ -13,6 +13,8 @@ # Makefile for the dynamic link library +# FIXME reduce redundancy by including ../Makefile + include ../../config/Makefile ROOTDIR = ../.. @@ -21,7 +23,7 @@ OCAMLC = $(OCAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib OCAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib INCLUDES=-I ../../utils -I ../../typing -I ../../bytecomp -I ../../asmcomp -COMPFLAGS=-w +33..39 -warn-error A -bin-annot -safe-string \ +COMPFLAGS=-w +33..39 -warn-error A -bin-annot -g -safe-string \ -I ../../stdlib $(INCLUDES) OBJS=dynlinkaux.cmo dynlink.cmo diff --git a/otherlibs/threads/Makefile b/otherlibs/threads/Makefile index 4b78333364..632decc492 100644 --- a/otherlibs/threads/Makefile +++ b/otherlibs/threads/Makefile @@ -11,6 +11,8 @@ # # ######################################################################### +# FIXME reduce redundancy by including ../Makefile + include ../../config/Makefile CC=$(BYTECC) @@ -19,7 +21,7 @@ ROOTDIR=../.. CAMLC=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlc -nostdlib \ -I $(ROOTDIR)/stdlib -I $(ROOTDIR)/otherlibs/unix MKLIB=../../boot/ocamlrun ../../tools/ocamlmklib -COMPFLAGS=-w +33..39 -warn-error A -bin-annot -safe-string +COMPFLAGS=-w +33..39 -warn-error A -bin-annot -g -safe-string C_OBJS=scheduler.o From 91616fc1dabfe559b081b581f2b5d821e0966435 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Thu, 26 Feb 2015 19:36:47 +0000 Subject: [PATCH 148/494] PR#5271: parsing/Location.prerr_warning is hard-coded to use Format.err_formatter git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15867 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ parsing/location.ml | 3 ++- parsing/location.mli | 1 + toplevel/toploop.ml | 1 + 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 82b74348f5..d4cea910a8 100644 --- a/Changes +++ b/Changes @@ -36,6 +36,8 @@ Runtime: (Damien Doligez and Roshan James) Bug fixes: +- PR#5271: parsing/Location.prerr_warning is hard-coded to use Format.err_formatter + (Damien Doligez, report by Rolf Rolles) - PR#5836, PR#6684: printing lazy values in ocamldebug may segfault (Gabriel Scherer) - PR#6616: allow meaningful use of -use-runtime without -custom. diff --git a/parsing/location.ml b/parsing/location.ml index 174377eecb..60d3484d6c 100644 --- a/parsing/location.ml +++ b/parsing/location.ml @@ -274,7 +274,8 @@ let print_warning loc ppf w = end ;; -let prerr_warning loc w = print_warning loc err_formatter w;; +let formatter_for_warnings = ref err_formatter;; +let prerr_warning loc w = print_warning loc !formatter_for_warnings w;; let echo_eof () = print_newline (); diff --git a/parsing/location.mli b/parsing/location.mli index 1a7feeb4da..158fd671da 100644 --- a/parsing/location.mli +++ b/parsing/location.mli @@ -52,6 +52,7 @@ val print_loc: formatter -> t -> unit val print_error: formatter -> t -> unit val print_error_cur_file: formatter -> unit val print_warning: t -> formatter -> Warnings.t -> unit +val formatter_for_warnings : formatter ref val prerr_warning: t -> Warnings.t -> unit val echo_eof: unit -> unit val reset: unit -> unit diff --git a/toplevel/toploop.ml b/toplevel/toploop.ml index 772b83ad99..a3cb06b043 100644 --- a/toplevel/toploop.ml +++ b/toplevel/toploop.ml @@ -474,6 +474,7 @@ let initialize_toplevel_env () = exception PPerror let loop ppf = + Location.formatter_for_warnings := ppf; fprintf ppf " OCaml version %s@.@." Config.version; initialize_toplevel_env (); let lb = Lexing.from_function refill_lexbuf in From 426037395c6cc8f666d3c3f7a90dbc29d41cd29c Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Fri, 27 Feb 2015 04:16:21 +0000 Subject: [PATCH 149/494] PR#6607: The manual doesn't mention 0x200 flag for OCAMLRUNPARAM=v git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15870 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 10 ++++++---- man/ocamlrun.m | 3 +++ stdlib/gc.mli | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Changes b/Changes index d4cea910a8..4c991160fc 100644 --- a/Changes +++ b/Changes @@ -36,10 +36,14 @@ Runtime: (Damien Doligez and Roshan James) Bug fixes: -- PR#5271: parsing/Location.prerr_warning is hard-coded to use Format.err_formatter +- PR#5271: Location.prerr_warning is hard-coded to use Format.err_formatter (Damien Doligez, report by Rolf Rolles) - PR#5836, PR#6684: printing lazy values in ocamldebug may segfault (Gabriel Scherer) +- PR#6573: extern "C" for systhreads/threads.h + (Mickaël Delahaye) +- PR#6607: The manual doesn't mention 0x200 flag for OCAMLRUNPARAM=v + (Alain Frisch) - PR#6616: allow meaningful use of -use-runtime without -custom. (Peter Zotov) - PR#6628: Configure script rejects legitimate arguments @@ -48,11 +52,9 @@ Bug fixes: (report by user 'william') - PR#6665: Failure of tests/asmcomp on sparc (Stéphane Glondu) -- PR#6573: extern "C" for systhreads/threads.h - (Mickaël Delahaye) - PR#6669: fix 4.02 regression in toplevel printing of lazy values (Leo White, review by Gabriel Scherer) -- PR#6680: Missing parentheses when printing polymorphic variant value in warning +- PR#6680: Missing parens when printing polymorphic variant value in warning - PR#6690: Uncaught exception (Not_found) with (wrong) wildcard or unification type variable in place of a local abstract type - PR#6717: Pprintast does not print let-pattern attributes diff --git a/man/ocamlrun.m b/man/ocamlrun.m index ea467ea463..810f525887 100644 --- a/man/ocamlrun.m +++ b/man/ocamlrun.m @@ -193,6 +193,9 @@ The limit (in words) of the stack size. Startup messages (loading the bytecode executable file, resolving shared libraries). +.BR 0x200 +Computation of compaction-triggering condition. + The multiplier is .BR k , .BR M ,\ or diff --git a/stdlib/gc.mli b/stdlib/gc.mli index 14088c1648..d02084034a 100644 --- a/stdlib/gc.mli +++ b/stdlib/gc.mli @@ -114,7 +114,7 @@ type control = - [0x040] Computation of major GC slice size. - [0x080] Calling of finalisation functions. - [0x100] Bytecode executable search at start-up. - - [0x200] Computation of compaction triggering condition. + - [0x200] Computation of compaction-triggering condition. Default: 0. *) mutable max_overhead : int; From 3aa48ddf92b5ac036d40d84f726fcd6ce6e631d7 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Mon, 2 Mar 2015 16:59:48 +0000 Subject: [PATCH 150/494] small change in doc git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15871 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- stdlib/gc.mli | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/gc.mli b/stdlib/gc.mli index d02084034a..a37edc6753 100644 --- a/stdlib/gc.mli +++ b/stdlib/gc.mli @@ -113,7 +113,7 @@ type control = - [0x020] Change of GC parameters. - [0x040] Computation of major GC slice size. - [0x080] Calling of finalisation functions. - - [0x100] Bytecode executable search at start-up. + - [0x100] Bytecode executable and shared library search at start-up. - [0x200] Computation of compaction-triggering condition. Default: 0. *) From bbf645d00352f81e34826bf5b3cf9e4ef3d43037 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Mon, 2 Mar 2015 17:00:14 +0000 Subject: [PATCH 151/494] GPR#139: more versatile specification of locations of .annot git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15872 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + emacs/caml-types.el | 57 +++++++++++++++++++++++++++++++++------------ 2 files changed, 43 insertions(+), 15 deletions(-) diff --git a/Changes b/Changes index 4c991160fc..d05d7b1c65 100644 --- a/Changes +++ b/Changes @@ -30,6 +30,7 @@ Libraries: Tools: - PR#6641: add -g, -ocamlcflags, -ocamloptflags options to ocamlmklib (Peter Zotov) +- GPR#139: more versatile specification of locations of .annot Runtime: - PR#6675: GC hooks diff --git a/emacs/caml-types.el b/emacs/caml-types.el index 4bc2266557..0af667bdd2 100644 --- a/emacs/caml-types.el +++ b/emacs/caml-types.el @@ -20,6 +20,18 @@ (require 'caml-emacs))) +(defvar caml-types-build-dirs '("_build" "_obuild") + "List of possible compilation directories created by build systems. +It is expected that the files under `caml-types-build-dir' preserve +the paths relative to the parent directory of `caml-types-build-dir'.") +(make-variable-buffer-local 'caml-types-build-dir) + +(defvar caml-annot-dir nil + "A directory, generally relative to the file location, containing the +.annot file. Intended to be set as a local variable in the .ml file. +See \"Specifying File Variables\" in the Emacs info manual.") +(make-variable-buffer-local 'caml-annot-dir) +(put 'caml-annot-dir 'safe-local-variable #'stringp) (defvar caml-types-location-re nil "Regexp to parse *.annot files. @@ -349,21 +361,36 @@ See `caml-types-location-re' for annotation file format. (defun caml-types-parent-dir (d) (file-name-directory (directory-file-name d))) (defun caml-types-locate-type-file (target-path) - (let ((sibling (concat (file-name-sans-extension target-path) ".annot"))) - (if (file-exists-p sibling) - sibling - (let ((project-dir (file-name-directory sibling)) - type-path) - (while (not (file-exists-p - (setq type-path - (expand-file-name - (file-relative-name sibling project-dir) - (expand-file-name "_build" project-dir))))) - (if (equal project-dir (caml-types-parent-dir project-dir)) - (error (concat "No annotation file. " - "You should compile with option \"-annot\"."))) - (setq project-dir (caml-types-parent-dir project-dir))) - type-path)))) + "Given the path to an OCaml file, this function tries to locate +and return the corresponding .annot file." + (let ((sibling (concat (file-name-sans-extension target-path) ".annot"))) + (if (file-exists-p sibling) + sibling + (let* ((dir (file-name-directory sibling))) + (if caml-annot-dir + ;; Use the relative path set by the user + (let* ((annot-dir (expand-file-name caml-annot-dir dir)) + (fname (file-name-nondirectory sibling)) + (path-fname (expand-file-name fname annot-dir))) + (if (file-exists-p path-fname) + path-fname + (error (concat "No annotation file in " caml-annot-dir + ". Compile with option \"-annot\".")))) + ;; Else, try to get the .annot from one of build dirs. + (let* ((is-build (regexp-opt caml-types-build-dirs)) + (project-dir (locate-dominating-file + dir + (lambda(d) (directory-files d nil is-build)))) + (annot + (if project-dir + (locate-file + (file-relative-name sibling project-dir) + (mapcar (lambda(d) (expand-file-name d project-dir)) + caml-types-build-dirs))))) + (if annot + annot + (error (concat "No annotation file. Compile with option " + "\"-annot\" or set `caml-annot-dir'."))))))))) (defun caml-types-date< (date1 date2) (or (< (car date1) (car date2)) From 67097f56946c3002234b9c6c35cae8d9ab10a0b3 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 3 Mar 2015 21:47:29 +0000 Subject: [PATCH 152/494] PR#6799: include guards missing for unixsupport.h and other files git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15873 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + VERSION | 2 +- byterun/hash.h | 9 ++++++++- byterun/misc.h | 8 ++++++++ otherlibs/bigarray/bigarray.h | 8 ++++++++ otherlibs/unix/socketaddr.h | 13 +++++++++++++ otherlibs/unix/unixsupport.h | 13 +++++++++++++ otherlibs/win32unix/socketaddr.h | 13 +++++++++++++ otherlibs/win32unix/unixsupport.h | 13 +++++++++++++ 9 files changed, 78 insertions(+), 2 deletions(-) diff --git a/Changes b/Changes index d05d7b1c65..8548ce2b44 100644 --- a/Changes +++ b/Changes @@ -70,6 +70,7 @@ Bug fixes: (Valentin Gatien-Baron) - PR#6787: Soundness bug with polymorphic variants - PR#6790: otherlibs should be built with -g +- PR#6799: include guards missing for unixsupport.h and other files - GPR#143: fix getsockopt behaviour for boolean socket options (Anil Madhavapeddy and Andrew Ray) - ocamlbuild on cygwin cannot find ocamlfind diff --git a/VERSION b/VERSION index 73a5266f4d..a0077bfab3 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.02.2+dev3-2015-02-24 +4.02.2+dev3-2015-03-03 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli diff --git a/byterun/hash.h b/byterun/hash.h index 436a8bb167..452a0925a7 100644 --- a/byterun/hash.h +++ b/byterun/hash.h @@ -18,6 +18,10 @@ #include "mlvalues.h" +#ifdef __cplusplus +extern "C" { +#endif + CAMLextern uint32 caml_hash_mix_uint32(uint32 h, uint32 d); CAMLextern uint32 caml_hash_mix_intnat(uint32 h, intnat d); CAMLextern uint32 caml_hash_mix_int64(uint32 h, int64 d); @@ -25,5 +29,8 @@ CAMLextern uint32 caml_hash_mix_double(uint32 h, double d); CAMLextern uint32 caml_hash_mix_float(uint32 h, float d); CAMLextern uint32 caml_hash_mix_string(uint32 h, value s); - +#ifdef __cplusplus +} #endif + +#endif /* CAML_HASH_H */ diff --git a/byterun/misc.h b/byterun/misc.h index a473bd13f4..db0971d2bb 100644 --- a/byterun/misc.h +++ b/byterun/misc.h @@ -59,6 +59,10 @@ typedef char * addr; #define CAMLweakdef #endif +#ifdef __cplusplus +extern "C" { +#endif + /* GC timing hooks. These can be assigned by the user. The hook functions must not allocate or change the heap in any way. */ typedef void (*caml_timing_hook) (void); @@ -159,4 +163,8 @@ extern int caml_snprintf(char * buf, size_t size, const char * format, ...); /* </private> */ +#ifdef __cplusplus +} +#endif + #endif /* CAML_MISC_H */ diff --git a/otherlibs/bigarray/bigarray.h b/otherlibs/bigarray/bigarray.h index c10e20cfb3..14e0a5fed8 100644 --- a/otherlibs/bigarray/bigarray.h +++ b/otherlibs/bigarray/bigarray.h @@ -106,10 +106,18 @@ struct caml_ba_array { #define CAMLBAextern CAMLextern #endif +#ifdef __cplusplus +extern "C" { +#endif + CAMLBAextern value caml_ba_alloc(int flags, int num_dims, void * data, intnat * dim); CAMLBAextern value caml_ba_alloc_dims(int flags, int num_dims, void * data, ... /*dimensions, with type intnat */); CAMLBAextern uintnat caml_ba_byte_size(struct caml_ba_array * b); +#ifdef __cplusplus +} #endif + +#endif /* CAML_BIGARRAY_H */ diff --git a/otherlibs/unix/socketaddr.h b/otherlibs/unix/socketaddr.h index cf25e2f99c..a581b33133 100644 --- a/otherlibs/unix/socketaddr.h +++ b/otherlibs/unix/socketaddr.h @@ -11,6 +11,9 @@ /* */ /***********************************************************************/ +#ifndef CAML_SOCKETADDR_H +#define CAML_SOCKETADDR_H + #include "misc.h" #include <sys/types.h> #include <sys/socket.h> @@ -33,6 +36,10 @@ typedef socklen_t socklen_param_type; typedef int socklen_param_type; #endif +#ifdef __cplusplus +extern "C" { +#endif + extern void get_sockaddr (value mladdr, union sock_addr_union * addr /*out*/, socklen_param_type * addr_len /*out*/); @@ -45,3 +52,9 @@ CAMLexport value alloc_inet_addr (struct in_addr * inaddr); CAMLexport value alloc_inet6_addr (struct in6_addr * inaddr); #define GET_INET6_ADDR(v) (*((struct in6_addr *) (v))) #endif + +#ifdef __cplusplus +} +#endif + +#endif /* CAML_SOCKETADDR_H */ diff --git a/otherlibs/unix/unixsupport.h b/otherlibs/unix/unixsupport.h index a8065d973a..d4312ab4fd 100644 --- a/otherlibs/unix/unixsupport.h +++ b/otherlibs/unix/unixsupport.h @@ -11,10 +11,17 @@ /* */ /***********************************************************************/ +#ifndef CAML_UNIXSUPPORT_H +#define CAML_UNIXSUPPORT_H + #ifdef HAS_UNISTD #include <unistd.h> #endif +#ifdef __cplusplus +extern "C" { +#endif + #define Nothing ((value) 0) extern value unix_error_of_code (int errcode); @@ -25,3 +32,9 @@ extern void uerror (char * cmdname, value arg) Noreturn; #define UNIX_BUFFER_SIZE 65536 #define DIR_Val(v) *((DIR **) &Field(v, 0)) + +#ifdef __cplusplus +} +#endif + +#endif /* CAML_UNIXSUPPORT_H */ diff --git a/otherlibs/win32unix/socketaddr.h b/otherlibs/win32unix/socketaddr.h index fde691ec6e..e21b12fa83 100644 --- a/otherlibs/win32unix/socketaddr.h +++ b/otherlibs/win32unix/socketaddr.h @@ -11,6 +11,9 @@ /* */ /***********************************************************************/ +#ifndef CAML_SOCKETADDR_H +#define CAML_SOCKETADDR_H + #include "misc.h" union sock_addr_union { @@ -29,6 +32,10 @@ typedef socklen_t socklen_param_type; typedef int socklen_param_type; #endif +#ifdef __cplusplus +extern "C" { +#endif + extern void get_sockaddr (value mladdr, union sock_addr_union * addr /*out*/, socklen_param_type * addr_len /*out*/); @@ -41,3 +48,9 @@ CAMLprim value alloc_inet_addr (struct in_addr * inaddr); CAMLexport value alloc_inet6_addr (struct in6_addr * inaddr); #define GET_INET6_ADDR(v) (*((struct in6_addr *) (v))) #endif + +#ifdef __cplusplus +} +#endif + +#endif /* CAML_SOCKETADDR_H */ diff --git a/otherlibs/win32unix/unixsupport.h b/otherlibs/win32unix/unixsupport.h index b8f8acad5c..b8efb27806 100644 --- a/otherlibs/win32unix/unixsupport.h +++ b/otherlibs/win32unix/unixsupport.h @@ -11,6 +11,9 @@ /* */ /***********************************************************************/ +#ifndef CAML_UNIXSUPPORT_H +#define CAML_UNIXSUPPORT_H + #define WIN32_LEAN_AND_MEAN #include <wtypes.h> #include <winbase.h> @@ -24,6 +27,10 @@ #include <wspiapi.h> #endif +#ifdef __cplusplus +extern "C" { +#endif + struct filedescr { union { HANDLE handle; @@ -62,3 +69,9 @@ extern value unix_freeze_buffer (value); #define FLAGS_FD_IS_BLOCKING (1<<0) #define UNIX_BUFFER_SIZE 65536 + +#ifdef __cplusplus +} +#endif + +#endif /* CAML_UNIXSUPPORT_H */ From fc8040f97cc3afa592134282dc8a7c0aac9e2b68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Dimino?= <jeremie@dimino.org> Date: Thu, 5 Mar 2015 12:48:11 +0000 Subject: [PATCH 153/494] PR#6078: release the runtime system when calling caml_dlopen git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15879 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- asmrun/natdynlink.c | 14 ++++++++++++-- byterun/dynlink.c | 9 ++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/asmrun/natdynlink.c b/asmrun/natdynlink.c index 86c4f3e6f3..58bb659a08 100644 --- a/asmrun/natdynlink.c +++ b/asmrun/natdynlink.c @@ -51,10 +51,15 @@ CAMLprim value caml_natdynlink_open(value filename, value global) CAMLlocal1 (res); void *sym; void *handle; + char *p; /* TODO: dlclose in case of error... */ - handle = caml_dlopen(String_val(filename), 1, Int_val(global)); + p = caml_strdup(String_val(filename)); + caml_enter_blocking_section(); + handle = caml_dlopen(p, 1, Int_val(global)); + caml_leave_blocking_section(); + caml_stat_free(p); if (NULL == handle) CAMLreturn(caml_copy_string(caml_dlerror())); @@ -117,10 +122,15 @@ CAMLprim value caml_natdynlink_run_toplevel(value filename, value symbol) CAMLparam2 (filename, symbol); CAMLlocal2 (res, v); void *handle; + char *p; /* TODO: dlclose in case of error... */ - handle = caml_dlopen(String_val(filename), 1, 1); + p = caml_strdup(String_val(filename)); + caml_enter_blocking_section(); + handle = caml_dlopen(p, 1, 1); + caml_leave_blocking_section(); + caml_stat_free(p); if (NULL == handle) { res = caml_alloc(1,1); diff --git a/byterun/dynlink.c b/byterun/dynlink.c index 8b4498b9d2..3bfbf86af6 100644 --- a/byterun/dynlink.c +++ b/byterun/dynlink.c @@ -119,7 +119,9 @@ static void open_shared_lib(char * name) realname = caml_search_dll_in_path(&caml_shared_libs_path, name); caml_gc_message(0x100, "Loading shared library %s\n", (uintnat) realname); + caml_enter_blocking_section(); handle = caml_dlopen(realname, 1, 1); + caml_leave_blocking_section(); if (handle == NULL) caml_fatal_error_arg2("Fatal error: cannot load shared library %s\n", name, "Reason: %s\n", caml_dlerror()); @@ -202,10 +204,15 @@ CAMLprim value caml_dynlink_open_lib(value mode, value filename) { void * handle; value result; + char * p; caml_gc_message(0x100, "Opening shared library %s\n", (uintnat) String_val(filename)); - handle = caml_dlopen(String_val(filename), Int_val(mode), 1); + p = caml_strdup(String_val(filename)); + caml_enter_blocking_section(); + handle = caml_dlopen(p, Int_val(mode), 1); + caml_leave_blocking_section(); + caml_stat_free(p); if (handle == NULL) caml_failwith(caml_dlerror()); result = caml_alloc_small(1, Abstract_tag); Handle_val(result) = handle; From 14b2a51191c9a834254f48ca8eff4255ba7742bc Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sat, 7 Mar 2015 10:55:18 +0000 Subject: [PATCH 154/494] =?UTF-8?q?PR#6791:=20"%s@[",=20"%s@{"=20regressio?= =?UTF-8?q?n=20in=20Scanf=20(Beno=C3=AEt=20Vaugon)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15882 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ stdlib/scanf.ml | 6 ++++++ testsuite/tests/lib-scanf/tscanf.ml | 7 ++++++- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 8548ce2b44..421de55c02 100644 --- a/Changes +++ b/Changes @@ -70,6 +70,8 @@ Bug fixes: (Valentin Gatien-Baron) - PR#6787: Soundness bug with polymorphic variants - PR#6790: otherlibs should be built with -g +- PR#6791: "%s@[", "%s@{" regression in Scanf + (Benoît Vaugon) - PR#6799: include guards missing for unixsupport.h and other files - GPR#143: fix getsockopt behaviour for boolean socket options (Anil Madhavapeddy and Andrew Ray) diff --git a/stdlib/scanf.ml b/stdlib/scanf.ml index 1372c41ae8..0144d38bdb 100644 --- a/stdlib/scanf.ml +++ b/stdlib/scanf.ml @@ -1125,6 +1125,12 @@ fun ib fmt readers -> match fmt with let scan width _ ib = scan_string (Some stp) width ib in let str_rest = String_literal (str, rest) in pad_prec_scanf ib str_rest readers pad No_precision scan token_string + | String (pad, Formatting_gen (Open_tag (Format (fmt', _)), rest)) -> + let scan width _ ib = scan_string (Some '{') width ib in + pad_prec_scanf ib (concat_fmt fmt' rest) readers pad No_precision scan token_string + | String (pad, Formatting_gen (Open_box (Format (fmt', _)), rest)) -> + let scan width _ ib = scan_string (Some '[') width ib in + pad_prec_scanf ib (concat_fmt fmt' rest) readers pad No_precision scan token_string | String (pad, rest) -> let scan width _ ib = scan_string None width ib in pad_prec_scanf ib rest readers pad No_precision scan token_string diff --git a/testsuite/tests/lib-scanf/tscanf.ml b/testsuite/tests/lib-scanf/tscanf.ml index 33054b66e7..056bd5c789 100644 --- a/testsuite/tests/lib-scanf/tscanf.ml +++ b/testsuite/tests/lib-scanf/tscanf.ml @@ -1268,7 +1268,12 @@ sscanf "Hello \n" "%s%s%_1[ ]\n" (fun s1 s2 -> sscanf "Hello\nWorld!" "%s\n%s%!" (fun s1 s2 -> s1 = "Hello" && s2 = "World!") && sscanf "Hello\nWorld!" "%s\n%s@!%!" (fun s1 s2 -> - s1 = "Hello" && s2 = "World") + s1 = "Hello" && s2 = "World") && + (* PR#6791 *) + sscanf "Hello{foo}" "%s@{%s" (fun s1 s2 -> + s1 = "Hello" && s2 = "foo}") && + sscanf "Hello[foo]" "%s@[%s" (fun s1 s2 -> + s1 = "Hello" && s2 = "foo]") ;; test (test52 ()) From 429a3975ba7746d0cbed743014797450d9585aa4 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Mon, 9 Mar 2015 15:14:58 +0000 Subject: [PATCH 155/494] PR#6794: pass package-specific include flags when building C files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (Jérémie Dimino, request by Peter Zotov) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15891 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ ocamlbuild/findlib.ml | 6 +++--- ocamlbuild/ocaml_specific.ml | 14 +++++++++++--- ocamlbuild/signatures.mli | 7 +++++-- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/Changes b/Changes index 421de55c02..75507b6a4b 100644 --- a/Changes +++ b/Changes @@ -22,6 +22,8 @@ OCamlbuild: (Peter Zotov) - PR#6720: pass -g to C compilers when tag 'debug' is set (Peter Zotov, Gabriel Scherer) +- PR#6794: pass package-specific include flags when building C files + (Jérémie Dimino, request by Peter Zotov) Libraries: - PR#6781: Add higher baud rates to Unix termios diff --git a/ocamlbuild/findlib.ml b/ocamlbuild/findlib.ml index 18f4d2c956..7d4d78afd5 100644 --- a/ocamlbuild/findlib.ml +++ b/ocamlbuild/findlib.ml @@ -153,7 +153,7 @@ let add_atom a l = match a, l with | A "", _ -> l | _ -> a :: l -let compile_flags l = +let include_flags l = let pkgs = topological_closure l in let locations = List.fold_left begin fun acc p -> SSet.add p.location acc @@ -166,8 +166,8 @@ let compile_flags l = end flags (SSet.elements locations) in S (List.rev flags) -let compile_flags_byte = compile_flags -let compile_flags_native = compile_flags +let compile_flags_byte = include_flags +let compile_flags_native = include_flags let link_flags f l = let pkgs = topological_closure l in diff --git a/ocamlbuild/ocaml_specific.ml b/ocamlbuild/ocaml_specific.ml index 1d0b8a8e47..26205e7a98 100644 --- a/ocamlbuild/ocaml_specific.ml +++ b/ocamlbuild/ocaml_specific.ml @@ -578,6 +578,8 @@ let () = ["ocaml"; "doc"]; ["ocaml"; "mktop"]; ["ocaml"; "infer_interface"]; + (* PR#6794: ocamlbuild should pass -package flags when building C files *) + ["c"; "compile"]; ] in (* tags package(X), predicate(X) and syntax(X) *) @@ -586,7 +588,8 @@ let () = if not (List.mem "ocamldep" tags) then (* PR#6184: 'ocamlfind ocamldep' does not support -predicate *) pflag tags "predicate" (fun pkg -> S [A "-predicates"; A pkg]); - pflag tags "syntax" (fun pkg -> S [A "-syntax"; A pkg]) + if List.mem "ocaml" tags then + pflag tags "syntax" (fun pkg -> S [A "-syntax"; A pkg]) end all_tags end else begin try @@ -595,7 +598,9 @@ let () = flag ["ocaml"; "byte"; "compile"] (Findlib.compile_flags_byte pkgs); flag ["ocaml"; "native"; "compile"] (Findlib.compile_flags_native pkgs); flag ["ocaml"; "byte"; "link"] (Findlib.link_flags_byte pkgs); - flag ["ocaml"; "native"; "link"] (Findlib.link_flags_native pkgs) + flag ["ocaml"; "native"; "link"] (Findlib.link_flags_native pkgs); + (* PR#6794: ocamlbuild should pass -package flags when building C files *) + flag ["c"; "compile"] (Findlib.include_flags pkgs) with Findlib.Findlib_error e -> Findlib.report_error e end @@ -715,7 +720,10 @@ flag ["ocaml"; "byte"; "compile"; "compat_32";] (A "-compat-32"); (* threads, with or without findlib *) flag ["ocaml"; "compile"; "thread"] (A "-thread");; flag ["ocaml"; "link"; "thread"] (A "-thread");; -if not !Options.use_ocamlfind then begin +if !Options.use_ocamlfind then + (* PR#6794: Needed as we pass -package when compiling C files *) + flag ["c"; "compile"; "thread"] (A "-thread") +else begin flag ["ocaml"; "doc"; "thread"] (S[A"-I"; A"+threads"]); flag ["ocaml"; "link"; "thread"; "native"; "program"] (A "threads.cmxa"); flag ["ocaml"; "link"; "thread"; "byte"; "program"] (A "threads.cma"); diff --git a/ocamlbuild/signatures.mli b/ocamlbuild/signatures.mli index 0c323e2026..e7feaf2a6c 100644 --- a/ocamlbuild/signatures.mli +++ b/ocamlbuild/signatures.mli @@ -505,12 +505,15 @@ Given any list of package [l], [topological_closure l] returns a list of packages including [l] and their dependencies, in an order where any element may only depend on the previous ones. *) + val include_flags: package list -> command_spec + (** Return the list of include directories. *) + val compile_flags_byte: package list -> command_spec (** Return the flags to add when compiling in byte mode (include directories). *) val compile_flags_native: package list -> command_spec - (** Same as [link_flags_byte] but for native mode. *) + (** Same as [compile_flags_byte] but for native mode. *) val link_flags_byte: package list -> command_spec (** Return the flags to add when linking in byte mode. It includes: @@ -603,7 +606,7 @@ module type PLUGIN = sig target (or phony target), since it will be filled up by a digest of it dependencies. - The ~tags argument in deprecated, don't use it. - + Finally, the optional ~doc argument allows to give an informal explanation of the rule purpose and behavior, that will be displayed by [ocamlbuild -documentation]. For example, it is From 57818c2505c75b067f0e780f533565efbf491eb5 Mon Sep 17 00:00:00 2001 From: Alain Frisch <alain@frisch.fr> Date: Mon, 9 Mar 2015 17:41:25 +0000 Subject: [PATCH 156/494] #6583: support for custom #... binary operators (also allowing '#' in trailing symbols, although the operator is then rejected by the type-checker). (Cherry-picked from trunk, rev 15892.) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15893 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 8 ++++++++ ocamldoc/odoc_name.ml | 1 + parsing/lexer.mll | 2 ++ parsing/parser.mly | 6 +++++- typing/env.ml | 21 ++++++++++++++++++++- typing/env.mli | 2 ++ typing/typetexp.ml | 1 + 7 files changed, 39 insertions(+), 2 deletions(-) diff --git a/Changes b/Changes index 75507b6a4b..9e4b0b2a28 100644 --- a/Changes +++ b/Changes @@ -1,6 +1,14 @@ OCaml 4.02.2: ------------- +Language features: +- PR#6583: add a new class of binary operators with the same syntactic + precedence as method calls; these operators start with # followed + by a non-empty sequence of operator symbols (for instance #+, #!?). + It is also possible to use '#' as part of these extra symbols + (for instance ##, or #+#); this is rejected by the type-checker, + but can be used e.g. by ppx rewriters. + Compilers: - PR#6600: make -short-paths faster by building the printing map incrementally (Jacques Garrigue) diff --git a/ocamldoc/odoc_name.ml b/ocamldoc/odoc_name.ml index bdb1f58c48..296331ad57 100644 --- a/ocamldoc/odoc_name.ml +++ b/ocamldoc/odoc_name.ml @@ -28,6 +28,7 @@ let infix_chars = [ '|' ; ':' ; '~' ; '!' ; + '#' ; ] type t = string diff --git a/parsing/lexer.mll b/parsing/lexer.mll index 237b44764c..171e5a536d 100644 --- a/parsing/lexer.mll +++ b/parsing/lexer.mll @@ -483,6 +483,8 @@ rule token = parse | '%' { PERCENT } | ['*' '/' '%'] symbolchar * { INFIXOP3(Lexing.lexeme lexbuf) } + | '#' (symbolchar | '#') + + { SHARPOP(Lexing.lexeme lexbuf) } | eof { EOF } | _ { raise (Error(Illegal_character (Lexing.lexeme_char lexbuf 0), diff --git a/parsing/parser.mly b/parsing/parser.mly index ba8e98e6b9..e773bca5cd 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -393,6 +393,7 @@ let mkctf_attrs d attrs = %token SEMI %token SEMISEMI %token SHARP +%token <string> SHARPOP %token SIG %token STAR %token <string * string option> STRING @@ -469,7 +470,7 @@ The precedences must be listed from low to high. %nonassoc prec_constant_constructor /* cf. simple_expr (C versus C x) */ %nonassoc prec_constr_appl /* above AS BAR COLONCOLON COMMA */ %nonassoc below_SHARP -%nonassoc SHARP /* simple_expr/toplevel_directive */ +%nonassoc SHARP SHARPOP /* simple_expr/toplevel_directive */ %nonassoc below_DOT %nonassoc DOT /* Finally, the first tokens of simple_expr are above everything else. */ @@ -1276,6 +1277,8 @@ simple_expr: { unclosed "{<" 3 ">}" 6 } | simple_expr SHARP label { mkexp(Pexp_send($1, $3)) } + | simple_expr SHARPOP simple_expr + { mkinfix $1 $2 $3 } | LPAREN MODULE module_expr RPAREN { mkexp (Pexp_pack $3) } | LPAREN MODULE module_expr COLON package_type RPAREN @@ -1961,6 +1964,7 @@ operator: | INFIXOP2 { $1 } | INFIXOP3 { $1 } | INFIXOP4 { $1 } + | SHARPOP { $1 } | BANG { "!" } | PLUS { "+" } | PLUSDOT { "+." } diff --git a/typing/env.ml b/typing/env.ml index b30ef659c6..2760338f78 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -58,6 +58,7 @@ type error = | Inconsistent_import of string * string * string | Need_recursive_types of string * string | Missing_module of Location.t * Path.t * Path.t + | Illegal_value_name of Location.t * string exception Error of error @@ -1308,7 +1309,20 @@ and check_usage loc id warn tbl = (fun () -> if not !used then Location.prerr_warning loc (warn name)) end; +and check_value_name name loc = + (* Note: we could also check here general validity of the + identifier, to protect against bad identifiers forged by -pp or + -ppx preprocessors. *) + + if String.length name > 0 && (name.[0] = '#') then + for i = 1 to String.length name - 1 do + if name.[i] = '#' then + raise (Error(Illegal_value_name(loc, name))) + done + + and store_value ?check slot id path decl env renv = + check_value_name (Ident.name id) decl.val_loc; may (fun f -> check_usage decl.val_loc id f value_declarations) check; { env with values = EnvTbl.add "value" slot id (path, decl) env.values renv.values; @@ -1820,11 +1834,16 @@ let report_error ppf = function fprintf ppf "@]@ @[%s@ %s@ %s.@]@]" "The compiled interface for module" (Ident.name (Path.head path2)) "was not found" + | Illegal_value_name(_loc, name) -> + fprintf ppf "'%s' is not a valid value identifier." + name let () = Location.register_error_of_exn (function - | Error (Missing_module (loc, _, _) as err) when loc <> Location.none -> + | Error (Missing_module (loc, _, _) + | Illegal_value_name (loc, _) + as err) when loc <> Location.none -> Some (Location.error_of_printer loc report_error err) | Error err -> Some (Location.error_of_printer_file report_error err) | _ -> None diff --git a/typing/env.mli b/typing/env.mli index 607406a914..ab0b0b97bd 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -191,6 +191,7 @@ type error = | Inconsistent_import of string * string * string | Need_recursive_types of string * string | Missing_module of Location.t * Path.t * Path.t + | Illegal_value_name of Location.t * string exception Error of error @@ -258,3 +259,4 @@ val fold_cltypes: (** Utilities *) val scrape_alias: t -> module_type -> module_type +val check_value_name: string -> Location.t -> unit diff --git a/typing/typetexp.ml b/typing/typetexp.ml index 523d435bca..605366bc4c 100644 --- a/typing/typetexp.ml +++ b/typing/typetexp.ml @@ -240,6 +240,7 @@ let find_class env loc lid = r let find_value env loc lid = + Env.check_value_name (Longident.last lid) loc; let (path, decl) as r = find_component Env.lookup_value (fun lid -> Unbound_value lid) env loc lid in From 45d26d93ad7c3d2b04475bfce0401a50740c764c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Dimino?= <jeremie@dimino.org> Date: Wed, 11 Mar 2015 12:52:55 +0000 Subject: [PATCH 157/494] PR#6285: add support for nanosecond precision in Unix.stat() git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15894 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- config/auto-aux/nanosecond_stat.c | 28 ++++++++++++++++++++++++++++ configure | 9 +++++++++ otherlibs/unix/nanosecond_stat.h | 25 +++++++++++++++++++++++++ otherlibs/unix/stat.c | 8 +++++--- 4 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 config/auto-aux/nanosecond_stat.c create mode 100644 otherlibs/unix/nanosecond_stat.h diff --git a/config/auto-aux/nanosecond_stat.c b/config/auto-aux/nanosecond_stat.c new file mode 100644 index 0000000000..5451126a4b --- /dev/null +++ b/config/auto-aux/nanosecond_stat.c @@ -0,0 +1,28 @@ +/***********************************************************************/ +/* */ +/* OCaml */ +/* */ +/* Jeremie Dimino, Jane Street Capital */ +/* */ +/* Copyright 2015 Institut National de Recherche en Informatique et */ +/* en Automatique. All rights reserved. This file is distributed */ +/* under the terms of the GNU Library General Public License, with */ +/* the special exception on linking described in file ../../LICENSE. */ +/* */ +/***********************************************************************/ + +#define _GNU_SOURCE +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> + +#include "../../otherlibs/unix/nanosecond_stat.h" + +int main() { + struct stat *buf; + double a, m, c; + a = (double)NSEC(buf, a); + m = (double)NSEC(buf, m); + c = (double)NSEC(buf, c); + return 0; +} diff --git a/configure b/configure index f3c14c8743..06f8ad4c63 100755 --- a/configure +++ b/configure @@ -1304,6 +1304,15 @@ if sh ./hasgot pwrite; then echo "#define HAS_PWRITE" >> s.h fi +nanosecond_stat=none +for i in 1 2 3; do + if sh ./trycompile -DHAS_NANOSECOND_STAT=$i nanosecond_stat.c; then nanosecond_stat=$i; break; fi +done +if test $nanosecond_stat != "none"; then + inf "stat() supports nanosecond precision." + echo "#define HAS_NANOSECOND_STAT $nanosecond_stat" >> s.h +fi + nargs=none for i in 5 6; do if sh ./trycompile -DNUM_ARGS=${i} gethostbyname.c; then nargs=$i; break; fi diff --git a/otherlibs/unix/nanosecond_stat.h b/otherlibs/unix/nanosecond_stat.h new file mode 100644 index 0000000000..e545ee712e --- /dev/null +++ b/otherlibs/unix/nanosecond_stat.h @@ -0,0 +1,25 @@ +/***********************************************************************/ +/* */ +/* OCaml */ +/* */ +/* Jeremie Dimino, Jane Street Capital */ +/* */ +/* Copyright 2015 Institut National de Recherche en Informatique et */ +/* en Automatique. All rights reserved. This file is distributed */ +/* under the terms of the GNU Library General Public License, with */ +/* the special exception on linking described in file ../../LICENSE. */ +/* */ +/***********************************************************************/ + +/* This file is used by the configure test program nanosecond_stat.c + and stat.c in this directory */ + +#if HAS_NANOSECOND_STAT == 1 +# define NSEC(buf, field) buf->st_##field##tim.tv_nsec +#elif HAS_NANOSECOND_STAT == 2 +# define NSEC(buf, field) buf->st_##field##timespec.tv_nsec +#elif HAS_NANOSECOND_STAT == 3 +# define NSEC(buf, field) buf->st_##field##timensec +#else +# define NSEC(buf, field) 0 +#endif diff --git a/otherlibs/unix/stat.c b/otherlibs/unix/stat.c index f6d8c06d3d..b90b80c5e9 100644 --- a/otherlibs/unix/stat.c +++ b/otherlibs/unix/stat.c @@ -48,9 +48,11 @@ static value stat_aux(int use_64, struct stat *buf) CAMLparam0(); CAMLlocal5(atime, mtime, ctime, offset, v); - atime = copy_double((double) buf->st_atime); - mtime = copy_double((double) buf->st_mtime); - ctime = copy_double((double) buf->st_ctime); + #include "nanosecond_stat.h" + atime = caml_copy_double((double) buf->st_atime + (NSEC(buf, a) / 1000000000.0)); + mtime = caml_copy_double((double) buf->st_mtime + (NSEC(buf, m) / 1000000000.0)); + ctime = caml_copy_double((double) buf->st_ctime + (NSEC(buf, c) / 1000000000.0)); + #undef NSEC offset = use_64 ? Val_file_offset(buf->st_size) : Val_int (buf->st_size); v = alloc_small(12, 0); Field (v, 0) = Val_int (buf->st_dev); From 3fc8bda0c5a478782658cdddba1149e8d1c7e9a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Dimino?= <jeremie@dimino.org> Date: Wed, 11 Mar 2015 13:06:38 +0000 Subject: [PATCH 158/494] Update Changes. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15895 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Changes b/Changes index 9e4b0b2a28..380b12d4fc 100644 --- a/Changes +++ b/Changes @@ -36,6 +36,8 @@ OCamlbuild: Libraries: - PR#6781: Add higher baud rates to Unix termios (Damien Doligez, report by Berke Durak) +- PR#6285: Add support for nanosecond precision in Unix.stat() + (Jérémie Dimino, report by user 'gfxmonk') Tools: - PR#6641: add -g, -ocamlcflags, -ocamloptflags options to ocamlmklib @@ -45,6 +47,8 @@ Tools: Runtime: - PR#6675: GC hooks (Damien Doligez and Roshan James) +- PR#6078: Release the runtime system when calling caml_dlopen + (Jérémie Dimino) Bug fixes: - PR#5271: Location.prerr_warning is hard-coded to use Format.err_formatter From 5a252235f7f0b6bf4f1edafba392676555158029 Mon Sep 17 00:00:00 2001 From: Alain Frisch <alain@frisch.fr> Date: Wed, 11 Mar 2015 14:56:48 +0000 Subject: [PATCH 159/494] #6612: attribute in type expressions bind less then product types; attributes come after constructor/field declarations. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15896 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- parsing/parser.mly | 56 +++++++++++++++++++++++++++----------------- parsing/pprintast.ml | 16 ++++++------- 2 files changed, 42 insertions(+), 30 deletions(-) diff --git a/parsing/parser.mly b/parsing/parser.mly index e773bca5cd..8e0c162245 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -1635,10 +1635,10 @@ constructor_declarations: | constructor_declarations BAR constructor_declaration { $3 :: $1 } ; constructor_declaration: - | constr_ident attributes generalized_constructor_arguments + | constr_ident generalized_constructor_arguments attributes { - let args,res = $3 in - Type.constructor (mkrhs $1 1) ~args ?res ~loc:(symbol_rloc()) ~attrs:$2 + let args,res = $2 in + Type.constructor (mkrhs $1 1) ~args ?res ~loc:(symbol_rloc()) ~attrs:$3 } ; str_exception_declaration: @@ -1662,10 +1662,10 @@ sig_exception_declaration: ; generalized_constructor_arguments: /*empty*/ { ([],None) } - | OF core_type_list { (List.rev $2,None) } - | COLON core_type_list MINUSGREATER simple_core_type + | OF core_type_list_no_attr { (List.rev $2,None) } + | COLON core_type_list_no_attr MINUSGREATER simple_core_type_no_attr { (List.rev $2,Some $4) } - | COLON simple_core_type + | COLON simple_core_type_no_attr { ([],Some $2) } ; @@ -1676,9 +1676,9 @@ label_declarations: | label_declarations SEMI label_declaration { $3 :: $1 } ; label_declaration: - mutable_flag label attributes COLON poly_type + mutable_flag label COLON poly_type_no_attr attributes { - Type.field (mkrhs $2 2) $5 ~mut:$1 ~attrs:$3 ~loc:(symbol_rloc()) + Type.field (mkrhs $2 2) $4 ~mut:$1 ~attrs:$5 ~loc:(symbol_rloc()) } ; @@ -1710,13 +1710,13 @@ sig_extension_constructors: { $3 :: $1 } ; extension_constructor_declaration: - | constr_ident attributes generalized_constructor_arguments - { let args, res = $3 in - Te.decl (mkrhs $1 1) ~args ?res ~loc:(symbol_rloc()) ~attrs:$2 } + | constr_ident generalized_constructor_arguments attributes + { let args, res = $2 in + Te.decl (mkrhs $1 1) ~args ?res ~loc:(symbol_rloc()) ~attrs:$3 } ; extension_constructor_rebind: - | constr_ident attributes EQUAL constr_longident - { Te.rebind (mkrhs $1 1) (mkrhs $4 4) ~loc:(symbol_rloc()) ~attrs:$2 } + | constr_ident EQUAL constr_longident attributes + { Te.rebind (mkrhs $1 1) (mkrhs $3 3) ~loc:(symbol_rloc()) ~attrs:$4 } ; /* "with" constraints (additional type equations over signature components) */ @@ -1726,7 +1726,7 @@ with_constraints: | with_constraints AND with_constraint { $3 :: $1 } ; with_constraint: - TYPE type_parameters label_longident with_type_binder core_type constraints + TYPE type_parameters label_longident with_type_binder core_type_no_attr constraints { Pwith_type (mkrhs $3 3, (Type.mk (mkrhs (Longident.last $3) 3) @@ -1737,7 +1737,7 @@ with_constraint: ~loc:(symbol_rloc()))) } /* used label_longident instead of type_longident to disallow functor applications in type path */ - | TYPE type_parameters label COLONEQUAL core_type + | TYPE type_parameters label COLONEQUAL core_type_no_attr { Pwith_typesubst (Type.mk (mkrhs $3 3) ~params:$2 @@ -1765,10 +1765,24 @@ poly_type: | typevar_list DOT core_type { mktyp(Ptyp_poly(List.rev $1, $3)) } ; +poly_type_no_attr: + core_type_no_attr + { $1 } + | typevar_list DOT core_type_no_attr + { mktyp(Ptyp_poly(List.rev $1, $3)) } +; /* Core types */ core_type: + core_type_no_attr + { $1 } +/* + | core_type attribute + { Typ.attr $1 $2 } +*/ +; +core_type_no_attr: core_type2 { $1 } | core_type2 AS QUOTE ident @@ -1792,8 +1806,6 @@ simple_core_type: { $1 } | LPAREN core_type_comma_list RPAREN %prec below_SHARP { match $2 with [sty] -> sty | _ -> raise Parse_error } - | simple_core_type attribute - { Typ.attr $1 $2 } ; simple_core_type_no_attr: @@ -1867,8 +1879,8 @@ row_field: | simple_core_type { Rinherit $1 } ; tag_field: - name_tag attributes OF opt_ampersand amper_type_list - { Rtag ($1, $2, $4, List.rev $5) } + name_tag OF opt_ampersand amper_type_list attributes + { Rtag ($1, $5, $3, List.rev $4) } | name_tag attributes { Rtag ($1, $2, true, []) } ; @@ -1877,8 +1889,8 @@ opt_ampersand: | /* empty */ { false } ; amper_type_list: - core_type { [$1] } - | amper_type_list AMPERSAND core_type { $3 :: $1 } + core_type_no_attr { [$1] } + | amper_type_list AMPERSAND core_type_no_attr { $3 :: $1 } ; name_tag_list: name_tag { [$1] } @@ -1913,7 +1925,7 @@ meth_list: | DOTDOT { [], Open } ; field: - label attributes COLON poly_type { ($1, $2, $4) } + label COLON poly_type_no_attr attributes { ($1, $4, $3) } ; label: LIDENT { $1 } diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index 8f4ebce4be..48cb4b5415 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -268,12 +268,12 @@ class printer ()= object(self:'self) | Ptyp_variant (l, closed, low) -> let type_variant_helper f x = match x with - | Rtag (l, attrs, _, ctl) -> pp f "@[<2>%a%a%a@]" self#string_quot l - self#attributes attrs + | Rtag (l, attrs, _, ctl) -> pp f "@[<2>%a%a@;%a@]" self#string_quot l (fun f l -> match l with |[] -> () | _ -> pp f "@;of@;%a" (self#list self#core_type ~sep:"&") ctl) ctl + self#attributes attrs | Rinherit ct -> self#core_type f ct in pp f "@[<2>[%a%a]@]" (fun f l @@ -609,7 +609,7 @@ class printer ()= object(self:'self) pp f "@[<hov2>assert@ %a@]" self#simple_expr e | Pexp_lazy (e) -> pp f "@[<hov2>lazy@ %a@]" self#simple_expr e - (* Pexp_poly: impossible but we should print it anyway, rather than assert false *) + (* Pexp_poly: impossible but we should print it anyway, rather than assert false *) | Pexp_poly (e, None) -> pp f "@[<hov2>!poly!@ %a@]" self#simple_expr e | Pexp_poly (e, Some ct) -> @@ -1256,22 +1256,22 @@ class printer ()= object(self:'self) match pcd.pcd_res with | None -> pp f "|@;%s%a%a" pcd.pcd_name.txt - self#attributes pcd.pcd_attributes (fun f -> function | [] -> () | l -> pp f "@;of@;%a" (self#list self#core_type1 ~sep:"*@;") l) pcd.pcd_args - | Some x -> - pp f "|@;%s%a:@;%a" pcd.pcd_name.txt self#attributes pcd.pcd_attributes + | Some x -> + pp f "|@;%s:@;%a%a" pcd.pcd_name.txt (self#list self#core_type1 ~sep:"@;->@;") (pcd.pcd_args@[x]) + self#attributes pcd.pcd_attributes in let label_declaration f pld = - pp f "@[<2>%a%s%a:@;%a;@]" + pp f "@[<2>%a%s:@;%a%a;@]" self#mutable_flag pld.pld_mutable pld.pld_name.txt - self#attributes pld.pld_attributes self#core_type pld.pld_type + self#attributes pld.pld_attributes in let repr f = let intro f = From 88b1c61ff83dbbb0a12ff726bec772c125a9655f Mon Sep 17 00:00:00 2001 From: Alain Frisch <alain@frisch.fr> Date: Wed, 11 Mar 2015 15:13:11 +0000 Subject: [PATCH 160/494] #6575: fail early in Array.init when size < 0 to avoid calling the callback in that case. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15898 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ stdlib/array.ml | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/Changes b/Changes index 380b12d4fc..b5738e949d 100644 --- a/Changes +++ b/Changes @@ -145,6 +145,8 @@ Standard library: (Jacques Garrigue, report by Mark Shinwell) - PR#6572: Fatal error with recursive modules (Jacques Garrigue, report by Quentin Stievenart) +- PR#6575: Array.init evaluates callback although it should not do so + (Alain Frisch, report by Gerd Stolpmann) - PR#6578: Recursive module containing alias causes Segmentation fault (Jacques Garrigue) - PR#6581: Some bugs in generative functors diff --git a/stdlib/array.ml b/stdlib/array.ml index 1990a78b86..243eeade17 100644 --- a/stdlib/array.ml +++ b/stdlib/array.ml @@ -29,6 +29,10 @@ external make_float: int -> float array = "caml_make_float_vect" let init l f = if l = 0 then [||] else + if l < 0 then invalid_arg "Array.init" + (* See #6575. We could also check for maximum array size, but this depends + on whether we create a float array or a regular one... *) + else let res = create l (f 0) in for i = 1 to pred l do unsafe_set res i (f i) From 317ac428a133162a78c2102a6b5f52974864a5e3 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Wed, 11 Mar 2015 22:03:15 +0000 Subject: [PATCH 161/494] Revert "PR#6794: pass package-specific include flags when building C files" This break oasis-using packages because -thread, as explained in PR#6809. This reverts commit 429a3975ba7746d0cbed743014797450d9585aa4. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15903 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 -- ocamlbuild/findlib.ml | 6 +++--- ocamlbuild/ocaml_specific.ml | 14 +++----------- ocamlbuild/signatures.mli | 7 ++----- 4 files changed, 8 insertions(+), 21 deletions(-) diff --git a/Changes b/Changes index b5738e949d..9a773b02b8 100644 --- a/Changes +++ b/Changes @@ -30,8 +30,6 @@ OCamlbuild: (Peter Zotov) - PR#6720: pass -g to C compilers when tag 'debug' is set (Peter Zotov, Gabriel Scherer) -- PR#6794: pass package-specific include flags when building C files - (Jérémie Dimino, request by Peter Zotov) Libraries: - PR#6781: Add higher baud rates to Unix termios diff --git a/ocamlbuild/findlib.ml b/ocamlbuild/findlib.ml index 7d4d78afd5..18f4d2c956 100644 --- a/ocamlbuild/findlib.ml +++ b/ocamlbuild/findlib.ml @@ -153,7 +153,7 @@ let add_atom a l = match a, l with | A "", _ -> l | _ -> a :: l -let include_flags l = +let compile_flags l = let pkgs = topological_closure l in let locations = List.fold_left begin fun acc p -> SSet.add p.location acc @@ -166,8 +166,8 @@ let include_flags l = end flags (SSet.elements locations) in S (List.rev flags) -let compile_flags_byte = include_flags -let compile_flags_native = include_flags +let compile_flags_byte = compile_flags +let compile_flags_native = compile_flags let link_flags f l = let pkgs = topological_closure l in diff --git a/ocamlbuild/ocaml_specific.ml b/ocamlbuild/ocaml_specific.ml index 26205e7a98..1d0b8a8e47 100644 --- a/ocamlbuild/ocaml_specific.ml +++ b/ocamlbuild/ocaml_specific.ml @@ -578,8 +578,6 @@ let () = ["ocaml"; "doc"]; ["ocaml"; "mktop"]; ["ocaml"; "infer_interface"]; - (* PR#6794: ocamlbuild should pass -package flags when building C files *) - ["c"; "compile"]; ] in (* tags package(X), predicate(X) and syntax(X) *) @@ -588,8 +586,7 @@ let () = if not (List.mem "ocamldep" tags) then (* PR#6184: 'ocamlfind ocamldep' does not support -predicate *) pflag tags "predicate" (fun pkg -> S [A "-predicates"; A pkg]); - if List.mem "ocaml" tags then - pflag tags "syntax" (fun pkg -> S [A "-syntax"; A pkg]) + pflag tags "syntax" (fun pkg -> S [A "-syntax"; A pkg]) end all_tags end else begin try @@ -598,9 +595,7 @@ let () = flag ["ocaml"; "byte"; "compile"] (Findlib.compile_flags_byte pkgs); flag ["ocaml"; "native"; "compile"] (Findlib.compile_flags_native pkgs); flag ["ocaml"; "byte"; "link"] (Findlib.link_flags_byte pkgs); - flag ["ocaml"; "native"; "link"] (Findlib.link_flags_native pkgs); - (* PR#6794: ocamlbuild should pass -package flags when building C files *) - flag ["c"; "compile"] (Findlib.include_flags pkgs) + flag ["ocaml"; "native"; "link"] (Findlib.link_flags_native pkgs) with Findlib.Findlib_error e -> Findlib.report_error e end @@ -720,10 +715,7 @@ flag ["ocaml"; "byte"; "compile"; "compat_32";] (A "-compat-32"); (* threads, with or without findlib *) flag ["ocaml"; "compile"; "thread"] (A "-thread");; flag ["ocaml"; "link"; "thread"] (A "-thread");; -if !Options.use_ocamlfind then - (* PR#6794: Needed as we pass -package when compiling C files *) - flag ["c"; "compile"; "thread"] (A "-thread") -else begin +if not !Options.use_ocamlfind then begin flag ["ocaml"; "doc"; "thread"] (S[A"-I"; A"+threads"]); flag ["ocaml"; "link"; "thread"; "native"; "program"] (A "threads.cmxa"); flag ["ocaml"; "link"; "thread"; "byte"; "program"] (A "threads.cma"); diff --git a/ocamlbuild/signatures.mli b/ocamlbuild/signatures.mli index e7feaf2a6c..0c323e2026 100644 --- a/ocamlbuild/signatures.mli +++ b/ocamlbuild/signatures.mli @@ -505,15 +505,12 @@ Given any list of package [l], [topological_closure l] returns a list of packages including [l] and their dependencies, in an order where any element may only depend on the previous ones. *) - val include_flags: package list -> command_spec - (** Return the list of include directories. *) - val compile_flags_byte: package list -> command_spec (** Return the flags to add when compiling in byte mode (include directories). *) val compile_flags_native: package list -> command_spec - (** Same as [compile_flags_byte] but for native mode. *) + (** Same as [link_flags_byte] but for native mode. *) val link_flags_byte: package list -> command_spec (** Return the flags to add when linking in byte mode. It includes: @@ -606,7 +603,7 @@ module type PLUGIN = sig target (or phony target), since it will be filled up by a digest of it dependencies. - The ~tags argument in deprecated, don't use it. - + Finally, the optional ~doc argument allows to give an informal explanation of the rule purpose and behavior, that will be displayed by [ocamlbuild -documentation]. For example, it is From bd45b40f3da467557c47fd5e6e0e467a6aca2d56 Mon Sep 17 00:00:00 2001 From: Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> Date: Fri, 13 Mar 2015 03:48:52 +0000 Subject: [PATCH 162/494] fix PR#6812 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15916 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + typing/env.ml | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 9a773b02b8..954e50dd21 100644 --- a/Changes +++ b/Changes @@ -85,6 +85,7 @@ Bug fixes: - PR#6791: "%s@[", "%s@{" regression in Scanf (Benoît Vaugon) - PR#6799: include guards missing for unixsupport.h and other files +- PR#6812: -short-paths and -no-alias-deps can create inconsistent assumptions - GPR#143: fix getsockopt behaviour for boolean socket options (Anil Madhavapeddy and Andrew Ray) - ocamlbuild on cygwin cannot find ocamlfind diff --git a/typing/env.ml b/typing/env.ml index 2760338f78..2d00ee7117 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -70,6 +70,7 @@ module EnvLazy : sig val force : ('a -> 'b) -> ('a,'b) t -> 'b val create : 'a -> ('a,'b) t val is_val : ('a,'b) t -> bool + val get_arg : ('a,'b) t -> 'a option end = struct @@ -96,6 +97,9 @@ end = struct let is_val x = match !x with Done _ -> true | _ -> false + let get_arg x = + match !x with Thunk a -> Some a | _ -> None + let create x = let x = ref (Thunk x) in x @@ -931,11 +935,23 @@ let lookup_cltype lid env = type iter_cont = unit -> unit let iter_env_cont = ref [] +let rec scrape_alias_safe env mty = + match mty with + | Mty_alias (Pident id) when Ident.persistent id -> false + | Mty_alias path -> + scrape_alias_safe env (find_module path env).md_type + | _ -> true + let iter_env proj1 proj2 f env () = Ident.iter (fun id (x,_) -> f (Pident id) x) (proj1 env); let rec iter_components path path' mcomps = - (* if EnvLazy.is_val mcomps then *) let cont () = + let safe = + match EnvLazy.get_arg mcomps with + None -> true + | Some (env, sub, path, mty) -> scrape_alias_safe env mty + in + if not safe then () else match EnvLazy.force !components_of_module_maker' mcomps with Structure_comps comps -> Tbl.iter From 77cd2c8f203fff107ddb9a1ce83d8f825a62d5d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Dimino?= <jeremie@dimino.org> Date: Fri, 13 Mar 2015 11:10:12 +0000 Subject: [PATCH 163/494] Add rec_flag to type items in the parsetree and typedtree git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15926 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- parsing/parsetree.mli | 4 ++-- typing/typedtree.ml | 4 ++-- typing/typedtree.mli | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index 295e3eaa07..adc606e60a 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -643,7 +643,7 @@ and signature_item_desc = val x: T external x: T = "s1" ... "sn" *) - | Psig_type of type_declaration list + | Psig_type of rec_flag * type_declaration list (* type t1 = ... and ... and tn = ... *) | Psig_typext of type_extension (* type t1 += ... *) @@ -769,7 +769,7 @@ and structure_item_desc = *) | Pstr_primitive of value_description (* external x: T = "s1" ... "sn" *) - | Pstr_type of type_declaration list + | Pstr_type of rec_flag * type_declaration list (* type t1 = ... and ... and tn = ... *) | Pstr_typext of type_extension (* type t1 += ... *) diff --git a/typing/typedtree.ml b/typing/typedtree.ml index ecd0f132ee..30369d5b11 100644 --- a/typing/typedtree.ml +++ b/typing/typedtree.ml @@ -210,7 +210,7 @@ and structure_item_desc = Tstr_eval of expression * attributes | Tstr_value of rec_flag * value_binding list | Tstr_primitive of value_description - | Tstr_type of type_declaration list + | Tstr_type of rec_flag * type_declaration list | Tstr_typext of type_extension | Tstr_exception of extension_constructor | Tstr_module of module_binding @@ -276,7 +276,7 @@ and signature_item = and signature_item_desc = Tsig_value of value_description - | Tsig_type of type_declaration list + | Tsig_type of rec_flag * type_declaration list | Tsig_typext of type_extension | Tsig_exception of extension_constructor | Tsig_module of module_declaration diff --git a/typing/typedtree.mli b/typing/typedtree.mli index c4feae1d86..603fab02e0 100644 --- a/typing/typedtree.mli +++ b/typing/typedtree.mli @@ -209,7 +209,7 @@ and structure_item_desc = Tstr_eval of expression * attributes | Tstr_value of rec_flag * value_binding list | Tstr_primitive of value_description - | Tstr_type of type_declaration list + | Tstr_type of rec_flag * type_declaration list | Tstr_typext of type_extension | Tstr_exception of extension_constructor | Tstr_module of module_binding @@ -275,7 +275,7 @@ and signature_item = and signature_item_desc = Tsig_value of value_description - | Tsig_type of type_declaration list + | Tsig_type of rec_flag * type_declaration list | Tsig_typext of type_extension | Tsig_exception of extension_constructor | Tsig_module of module_declaration From 5a1903f3b4d4e3bf7499c86e1894dbbd35492614 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Dimino?= <jeremie@dimino.org> Date: Fri, 13 Mar 2015 11:10:25 +0000 Subject: [PATCH 164/494] Add the "nonrec" keyword and allow it on type git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15927 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- parsing/ast_helper.ml | 4 ++-- parsing/ast_helper.mli | 4 ++-- parsing/ast_mapper.ml | 4 ++-- parsing/lexer.mll | 1 + parsing/parser.mly | 23 +++++++++++++++-------- parsing/pprintast.ml | 28 +++++++++++++++++----------- parsing/pprintast.mli | 3 ++- parsing/printast.ml | 8 ++++---- 8 files changed, 45 insertions(+), 30 deletions(-) diff --git a/parsing/ast_helper.ml b/parsing/ast_helper.ml index 47c7bd338a..c8817f04e9 100644 --- a/parsing/ast_helper.ml +++ b/parsing/ast_helper.ml @@ -157,7 +157,7 @@ module Sig = struct let mk ?(loc = !default_loc) d = {psig_desc = d; psig_loc = loc} let value ?loc a = mk ?loc (Psig_value a) - let type_ ?loc a = mk ?loc (Psig_type a) + let type_ ?loc rec_flag a = mk ?loc (Psig_type (rec_flag, a)) let type_extension ?loc a = mk ?loc (Psig_typext a) let exception_ ?loc a = mk ?loc (Psig_exception a) let module_ ?loc a = mk ?loc (Psig_module a) @@ -177,7 +177,7 @@ module Str = struct let eval ?loc ?(attrs = []) a = mk ?loc (Pstr_eval (a, attrs)) let value ?loc a b = mk ?loc (Pstr_value (a, b)) let primitive ?loc a = mk ?loc (Pstr_primitive a) - let type_ ?loc a = mk ?loc (Pstr_type a) + let type_ ?loc rec_flag a = mk ?loc (Pstr_type (rec_flag, a)) let type_extension ?loc a = mk ?loc (Pstr_typext a) let exception_ ?loc a = mk ?loc (Pstr_exception a) let module_ ?loc a = mk ?loc (Pstr_module a) diff --git a/parsing/ast_helper.mli b/parsing/ast_helper.mli index b9b04f8223..b91e6b29c5 100644 --- a/parsing/ast_helper.mli +++ b/parsing/ast_helper.mli @@ -209,7 +209,7 @@ module Sig: val mk: ?loc:loc -> signature_item_desc -> signature_item val value: ?loc:loc -> value_description -> signature_item - val type_: ?loc:loc -> type_declaration list -> signature_item + val type_: ?loc:loc -> rec_flag -> type_declaration list -> signature_item val type_extension: ?loc:loc -> type_extension -> signature_item val exception_: ?loc:loc -> extension_constructor -> signature_item val module_: ?loc:loc -> module_declaration -> signature_item @@ -231,7 +231,7 @@ module Str: val eval: ?loc:loc -> ?attrs:attributes -> expression -> structure_item val value: ?loc:loc -> rec_flag -> value_binding list -> structure_item val primitive: ?loc:loc -> value_description -> structure_item - val type_: ?loc:loc -> type_declaration list -> structure_item + val type_: ?loc:loc -> rec_flag -> type_declaration list -> structure_item val type_extension: ?loc:loc -> type_extension -> structure_item val exception_: ?loc:loc -> extension_constructor -> structure_item val module_: ?loc:loc -> module_binding -> structure_item diff --git a/parsing/ast_mapper.ml b/parsing/ast_mapper.ml index 669d01449c..8ad3ce400a 100644 --- a/parsing/ast_mapper.ml +++ b/parsing/ast_mapper.ml @@ -236,7 +236,7 @@ module MT = struct let loc = sub.location sub loc in match desc with | Psig_value vd -> value ~loc (sub.value_description sub vd) - | Psig_type l -> type_ ~loc (List.map (sub.type_declaration sub) l) + | Psig_type (rf, l) -> type_ ~loc rf (List.map (sub.type_declaration sub) l) | Psig_typext te -> type_extension ~loc (sub.type_extension sub te) | Psig_exception ed -> exception_ ~loc (sub.extension_constructor sub ed) | Psig_module x -> module_ ~loc (sub.module_declaration sub x) @@ -284,7 +284,7 @@ module M = struct eval ~loc ~attrs:(sub.attributes sub attrs) (sub.expr sub x) | Pstr_value (r, vbs) -> value ~loc r (List.map (sub.value_binding sub) vbs) | Pstr_primitive vd -> primitive ~loc (sub.value_description sub vd) - | Pstr_type l -> type_ ~loc (List.map (sub.type_declaration sub) l) + | Pstr_type (rf, l) -> type_ ~loc rf (List.map (sub.type_declaration sub) l) | Pstr_typext te -> type_extension ~loc (sub.type_extension sub te) | Pstr_exception ed -> exception_ ~loc (sub.extension_constructor sub ed) | Pstr_module x -> module_ ~loc (sub.module_binding sub x) diff --git a/parsing/lexer.mll b/parsing/lexer.mll index 171e5a536d..dfa604d238 100644 --- a/parsing/lexer.mll +++ b/parsing/lexer.mll @@ -63,6 +63,7 @@ let keyword_table = "module", MODULE; "mutable", MUTABLE; "new", NEW; + "nonrec", NONREC; "object", OBJECT; "of", OF; "open", OPEN; diff --git a/parsing/parser.mly b/parsing/parser.mly index 8e0c162245..4ef8335e1f 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -372,6 +372,7 @@ let mkctf_attrs d attrs = %token MUTABLE %token <nativeint> NATIVEINT %token NEW +%token NONREC %token OBJECT %token OF %token OPEN @@ -643,10 +644,11 @@ structure_item: { mkstr (Pstr_primitive (Val.mk (mkrhs $2 2) $4 ~prim:$6 ~attrs:$7 ~loc:(symbol_rloc ()))) } - | TYPE type_declarations - { mkstr(Pstr_type (List.rev $2) ) } - | TYPE str_type_extension - { mkstr(Pstr_typext $2) } + | TYPE nonrec_flag type_declarations + { mkstr(Pstr_type ($2, List.rev $3) ) } + | TYPE nonrec_flag str_type_extension + { if $2 <> Recursive then not_expecting 2 "nonrec flag"; + mkstr(Pstr_typext $3) } | EXCEPTION str_exception_declaration { mkstr(Pstr_exception $2) } | MODULE module_binding @@ -730,10 +732,11 @@ signature_item: { mksig(Psig_value (Val.mk (mkrhs $2 2) $4 ~prim:$6 ~attrs:$7 ~loc:(symbol_rloc()))) } - | TYPE type_declarations - { mksig(Psig_type (List.rev $2)) } - | TYPE sig_type_extension - { mksig(Psig_typext $2) } + | TYPE nonrec_flag type_declarations + { mksig(Psig_type ($2, List.rev $3)) } + | TYPE nonrec_flag sig_type_extension + { if $2 <> Recursive then not_expecting 2 "nonrec flag"; + mksig(Psig_typext $3) } | EXCEPTION sig_exception_declaration { mksig(Psig_exception $2) } | MODULE UIDENT module_declaration post_item_attributes @@ -2066,6 +2069,10 @@ rec_flag: /* empty */ { Nonrecursive } | REC { Recursive } ; +nonrec_flag: + /* empty */ { Recursive } + | NONREC { Nonrecursive } +; direction_flag: TO { Upto } | DOWNTO { Downto } diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index 48cb4b5415..538b0600bd 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -197,9 +197,14 @@ class printer ()= object(self:'self) | Virtual -> pp f "virtual@;" (* trailing space added *) - method rec_flag f = function + method rec_flag f rf = + match rf with | Nonrecursive -> () | Recursive -> pp f "rec " + method nonrec_flag f rf = + match rf with + | Nonrecursive -> pp f "nonrec " + | Recursive -> () method direction_flag f = function | Upto -> pp f "to@ " | Downto -> pp f "downto@ " @@ -930,8 +935,8 @@ class printer ()= object(self:'self) method signature_item f x :unit= begin match x.psig_desc with - | Psig_type l -> - self#type_def_list f l + | Psig_type (rf, l) -> + self#type_def_list f (rf, l) | Psig_value vd -> let intro = if vd.pval_prim = [] then "val" else "external" in pp f "@[<2>%s@ %a@ :@ %a@]%a" intro @@ -1100,8 +1105,8 @@ class printer ()= object(self:'self) pp f "@[<hov2>let@ _ =@ %a@]%a" self#expression e self#item_attributes attrs - | Pstr_type [] -> assert false - | Pstr_type l -> self#type_def_list f l + | Pstr_type (_, []) -> assert false + | Pstr_type (rf, l) -> self#type_def_list f (rf, l) | Pstr_value (rf, l) -> (* pp f "@[<hov2>let %a%a@]" self#rec_flag rf self#bindings l *) pp f "@[<2>%a@]" self#bindings (rf,l) | Pstr_typext te -> self#type_extension f te @@ -1222,14 +1227,15 @@ class printer ()= object(self:'self) method type_params f = function [] -> () | l -> pp f "%a " (self#list self#type_param ~first:"(" ~last:")" ~sep:",") l - method type_def_list f l = - let type_decl kwd f x = + method type_def_list f (rf, l) = + let type_decl kwd rf f x = let eq = if (x.ptype_kind = Ptype_abstract) && (x.ptype_manifest = None) then "" else " =" in - pp f "@[<2>%s %a%s%s%a@]%a" kwd + pp f "@[<2>%s %a%a%s%s%a@]%a" kwd + self#nonrec_flag rf self#type_params x.ptype_params x.ptype_name.txt eq self#type_declaration x @@ -1237,10 +1243,10 @@ class printer ()= object(self:'self) in match l with | [] -> assert false - | [x] -> type_decl "type" f x + | [x] -> type_decl "type" rf f x | x :: xs -> pp f "@[<v>%a@,%a@]" - (type_decl "type") x - (self#list ~sep:"@," (type_decl "and")) xs + (type_decl "type" rf) x + (self#list ~sep:"@," (type_decl "and" Recursive)) xs method type_declaration f x = let priv f = match x.ptype_private with diff --git a/parsing/pprintast.mli b/parsing/pprintast.mli index 13e3d09aee..a08b225923 100644 --- a/parsing/pprintast.mli +++ b/parsing/pprintast.mli @@ -80,6 +80,7 @@ class printer : method payload : Format.formatter -> Parsetree.payload -> unit method private_flag : Format.formatter -> Asttypes.private_flag -> unit method rec_flag : Format.formatter -> Asttypes.rec_flag -> unit + method nonrec_flag : Format.formatter -> Asttypes.rec_flag -> unit method reset : 'b method reset_semi : 'b @@ -103,7 +104,7 @@ class printer : method type_declaration : Format.formatter -> Parsetree.type_declaration -> unit method type_def_list : - Format.formatter -> Parsetree.type_declaration list -> unit + Format.formatter -> Asttypes.rec_flag * Parsetree.type_declaration list -> unit method type_extension : Format.formatter -> Parsetree.type_extension -> unit method type_param : diff --git a/parsing/printast.ml b/parsing/printast.ml index f0472bcdb0..0d705237d8 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -640,8 +640,8 @@ and signature_item i ppf x = | Psig_value vd -> line i ppf "Psig_value\n"; value_description i ppf vd; - | Psig_type (l) -> - line i ppf "Psig_type\n"; + | Psig_type (rf, l) -> + line i ppf "Psig_type %a\n" fmt_rec_flag rf; list i type_declaration ppf l; | Psig_typext te -> line i ppf "Psig_typext\n"; @@ -748,8 +748,8 @@ and structure_item i ppf x = | Pstr_primitive vd -> line i ppf "Pstr_primitive\n"; value_description i ppf vd; - | Pstr_type l -> - line i ppf "Pstr_type\n"; + | Pstr_type (rf, l) -> + line i ppf "Pstr_type %a\n" fmt_rec_flag rf; list i type_declaration ppf l; | Pstr_typext te -> line i ppf "Pstr_typext\n"; From f28085181582ced4b19603d83d77a23e8ab27740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Dimino?= <jeremie@dimino.org> Date: Fri, 13 Mar 2015 11:10:38 +0000 Subject: [PATCH 165/494] Bump ast magic numbers git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15928 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- utils/config.mlbuild | 4 ++-- utils/config.mlp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/utils/config.mlbuild b/utils/config.mlbuild index c887ac2b4e..98cd17c299 100644 --- a/utils/config.mlbuild +++ b/utils/config.mlbuild @@ -66,8 +66,8 @@ and cmo_magic_number = "Caml1999O009" and cma_magic_number = "Caml1999A010" and cmx_magic_number = "Caml1999Y011" and cmxa_magic_number = "Caml1999Z010" -and ast_impl_magic_number = "Caml1999M016" -and ast_intf_magic_number = "Caml1999N015" +and ast_impl_magic_number = "Caml1999M017" +and ast_intf_magic_number = "Caml1999N016" and cmxs_magic_number = "Caml2007D001" and cmt_magic_number = "Caml2012T002" diff --git a/utils/config.mlp b/utils/config.mlp index db6fd20ed0..a603ba06c6 100644 --- a/utils/config.mlp +++ b/utils/config.mlp @@ -54,8 +54,8 @@ and cmo_magic_number = "Caml1999O010" and cma_magic_number = "Caml1999A011" and cmx_magic_number = "Caml1999Y014" and cmxa_magic_number = "Caml1999Z013" -and ast_impl_magic_number = "Caml1999M016" -and ast_intf_magic_number = "Caml1999N015" +and ast_impl_magic_number = "Caml1999M017" +and ast_intf_magic_number = "Caml1999N016" and cmxs_magic_number = "Caml2007D002" and cmt_magic_number = "Caml2012T004" From 6286c42ecc43ef07f5404274261e7417168fab3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Dimino?= <jeremie@dimino.org> Date: Fri, 13 Mar 2015 11:10:50 +0000 Subject: [PATCH 166/494] Support non-recursive types git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15929 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- typing/printtyped.ml | 8 ++++---- typing/typedecl.ml | 20 ++++++++++++++------ typing/typedecl.mli | 2 +- typing/typemod.ml | 14 +++++++------- 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/typing/printtyped.ml b/typing/printtyped.ml index 0e97e586bb..949cacdfe3 100644 --- a/typing/printtyped.ml +++ b/typing/printtyped.ml @@ -613,8 +613,8 @@ and signature_item i ppf x = | Tsig_value vd -> line i ppf "Psig_value\n"; value_description i ppf vd; - | Tsig_type l -> - line i ppf "Psig_type\n"; + | Tsig_type (rf, l) -> + line i ppf "Psig_type %a\n" fmt_rec_flag rf; list i type_declaration ppf l; | Tsig_typext e -> line i ppf "Psig_typext\n"; @@ -719,8 +719,8 @@ and structure_item i ppf x = | Tstr_primitive vd -> line i ppf "Pstr_primitive\n"; value_description i ppf vd; - | Tstr_type l -> - line i ppf "Pstr_type\n"; + | Tstr_type (rf, l) -> + line i ppf "Pstr_type %a\n" fmt_rec_flag rf; list i type_declaration ppf l; | Tstr_typext te -> line i ppf "Pstr_typext\n"; diff --git a/typing/typedecl.ml b/typing/typedecl.ml index 781d3cf46a..7df0073732 100644 --- a/typing/typedecl.ml +++ b/typing/typedecl.ml @@ -969,8 +969,8 @@ let name_recursion sdecl id decl = else decl | _ -> decl -(* Translate a set of mutually recursive type declarations *) -let transl_type_decl env sdecl_list = +(* Translate a set of type declarations, mutually recursive or not *) +let transl_type_decl env rec_flag sdecl_list = (* Add dummy types for fixed rows *) let fixed_types = List.filter is_fixed_type sdecl_list in let sdecl_list = @@ -996,7 +996,11 @@ let transl_type_decl env sdecl_list = Ctype.init_def(Ident.current_time()); Ctype.begin_def(); (* Enter types. *) - let temp_env = List.fold_left2 enter_type env sdecl_list id_list in + let temp_env = + match rec_flag with + | Asttypes.Nonrecursive -> env + | Asttypes.Recursive -> List.fold_left2 enter_type env sdecl_list id_list + in (* Translate each declaration. *) let current_slot = ref None in let warn_unused = Warnings.is_active (Warnings.Unused_type_declaration "") in @@ -1036,9 +1040,13 @@ let transl_type_decl env sdecl_list = decls env in (* Update stubs *) - List.iter2 - (fun id sdecl -> update_type temp_env newenv id sdecl.ptype_loc) - id_list sdecl_list; + begin match rec_flag with + | Asttypes.Nonrecursive -> () + | Asttypes.Recursive -> + List.iter2 + (fun id sdecl -> update_type temp_env newenv id sdecl.ptype_loc) + id_list sdecl_list + end; (* Generalize type declarations. *) Ctype.end_def(); List.iter (fun (_, decl) -> generalize_decl decl) decls; diff --git a/typing/typedecl.mli b/typing/typedecl.mli index 452674958b..8be29fe28b 100644 --- a/typing/typedecl.mli +++ b/typing/typedecl.mli @@ -16,7 +16,7 @@ open Types open Format val transl_type_decl: - Env.t -> Parsetree.type_declaration list -> + Env.t -> Asttypes.rec_flag -> Parsetree.type_declaration list -> Typedtree.type_declaration list * Env.t val transl_exception: diff --git a/typing/typemod.ml b/typing/typemod.ml index a053d53aa7..c5211e7e27 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -347,7 +347,7 @@ and approx_sig env ssg = [] -> [] | item :: srem -> match item.psig_desc with - | Psig_type sdecls -> + | Psig_type (_, sdecls) -> let decls = Typedecl.approx_type_decl env sdecls in let rem = approx_sig env srem in map_rec' (fun rs (id, info) -> Sig_type(id, info, rs)) decls rem @@ -560,14 +560,14 @@ and transl_signature env sg = (if List.exists (Ident.equal tdesc.val_id) (get_values rem) then rem else Sig_value(tdesc.val_id, tdesc.val_val) :: rem), final_env - | Psig_type sdecls -> + | Psig_type (rec_flag, sdecls) -> List.iter (fun decl -> check_name "type" type_names decl.ptype_name) sdecls; - let (decls, newenv) = Typedecl.transl_type_decl env sdecls in + let (decls, newenv) = Typedecl.transl_type_decl env rec_flag sdecls in let (trem, rem, final_env) = transl_sig newenv srem in - mksig (Tsig_type decls) env loc :: trem, + mksig (Tsig_type (rec_flag, decls)) env loc :: trem, map_rec'' (fun rs td -> Sig_type(td.typ_id, td.typ_type, rs)) decls rem, final_env @@ -1234,12 +1234,12 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = | Pstr_primitive sdesc -> let (desc, newenv) = Typedecl.transl_value_decl env loc sdesc in Tstr_primitive desc, [Sig_value(desc.val_id, desc.val_val)], newenv - | Pstr_type sdecls -> + | Pstr_type (rec_flag, sdecls) -> List.iter (fun decl -> check_name "type" type_names decl.ptype_name) sdecls; - let (decls, newenv) = Typedecl.transl_type_decl env sdecls in - Tstr_type decls, + let (decls, newenv) = Typedecl.transl_type_decl env rec_flag sdecls in + Tstr_type (rec_flag, decls), map_rec'' (fun rs info -> Sig_type(info.typ_id, info.typ_type, rs)) decls [], enrich_type_decls anchor decls env newenv From 16b4c974fd981c34db34c333f0491965e76facd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Dimino?= <jeremie@dimino.org> Date: Fri, 13 Mar 2015 11:11:00 +0000 Subject: [PATCH 167/494] Ignore rec_flag on "type" items in Translmod git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15930 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- bytecomp/translmod.ml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/bytecomp/translmod.ml b/bytecomp/translmod.ml index a2944f3dc2..09c881e57b 100644 --- a/bytecomp/translmod.ml +++ b/bytecomp/translmod.ml @@ -405,7 +405,7 @@ and transl_structure fields cc rootpath = function | Tstr_primitive descr -> record_primitive descr.val_val; transl_structure fields cc rootpath rem - | Tstr_type(decls) -> + | Tstr_type(_, decls) -> transl_structure fields cc rootpath rem | Tstr_typext(tyext) -> let ids = List.map (fun ext -> ext.ext_id) tyext.tyext_constructors in @@ -490,7 +490,7 @@ let rec defined_idents = function | Tstr_value(rec_flag, pat_expr_list) -> let_bound_idents pat_expr_list @ defined_idents rem | Tstr_primitive desc -> defined_idents rem - | Tstr_type decls -> defined_idents rem + | Tstr_type (_, decls) -> defined_idents rem | Tstr_typext tyext -> List.map (fun ext -> ext.ext_id) tyext.tyext_constructors @ defined_idents rem @@ -516,7 +516,7 @@ let rec more_idents = function | Tstr_eval (expr, _attrs) -> more_idents rem | Tstr_value(rec_flag, pat_expr_list) -> more_idents rem | Tstr_primitive _ -> more_idents rem - | Tstr_type decls -> more_idents rem + | Tstr_type (_, decls) -> more_idents rem | Tstr_typext tyext -> more_idents rem | Tstr_exception _ -> more_idents rem | Tstr_recmodule decls -> more_idents rem @@ -538,7 +538,7 @@ and all_idents = function | Tstr_value(rec_flag, pat_expr_list) -> let_bound_idents pat_expr_list @ all_idents rem | Tstr_primitive _ -> all_idents rem - | Tstr_type decls -> all_idents rem + | Tstr_type (_, decls) -> all_idents rem | Tstr_typext tyext -> List.map (fun ext -> ext.ext_id) tyext.tyext_constructors @ all_idents rem @@ -596,7 +596,7 @@ let transl_store_structure glob map prims str = | Tstr_primitive descr -> record_primitive descr.val_val; transl_store rootpath subst rem - | Tstr_type(decls) -> + | Tstr_type(_, decls) -> transl_store rootpath subst rem | Tstr_typext(tyext) -> let ids = List.map (fun ext -> ext.ext_id) tyext.tyext_constructors in From 91c9870c439a1ed7135c24faea190552f6867d67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Dimino?= <jeremie@dimino.org> Date: Fri, 13 Mar 2015 11:11:10 +0000 Subject: [PATCH 168/494] Update ocamldoc and other utilities to support "type git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15931 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- ocamldoc/odoc_ast.ml | 24 ++++++++++++++---------- ocamldoc/odoc_sig.ml | 20 ++++++++++++-------- tools/depend.ml | 4 ++-- tools/eqparsetree.ml | 10 ++++++---- tools/tast_iter.ml | 4 ++-- tools/untypeast.ml | 8 ++++---- typing/typedtreeIter.ml | 27 +++++++++++++++++++-------- typing/typedtreeIter.mli | 7 +++++-- typing/typedtreeMap.ml | 6 +++--- 9 files changed, 67 insertions(+), 43 deletions(-) diff --git a/ocamldoc/odoc_ast.ml b/ocamldoc/odoc_ast.ml index 358a71a51c..1c327c5a53 100644 --- a/ocamldoc/odoc_ast.ml +++ b/ocamldoc/odoc_ast.ml @@ -83,11 +83,11 @@ module Typedtree_search = end | Typedtree.Tstr_exception ext -> Hashtbl.add table (E (Name.from_ident ext.ext_id)) tt - | Typedtree.Tstr_type ident_type_decl_list -> + | Typedtree.Tstr_type (rf, ident_type_decl_list) -> List.iter (fun td -> Hashtbl.add table (T (Name.from_ident td.typ_id)) - (Typedtree.Tstr_type [td])) + (Typedtree.Tstr_type (rf, [td]))) ident_type_decl_list | Typedtree.Tstr_class info_list -> List.iter @@ -145,7 +145,7 @@ module Typedtree_search = let search_type_declaration table name = match Hashtbl.find table (T name) with - | (Typedtree.Tstr_type [td]) -> td + | (Typedtree.Tstr_type (_, [td])) -> td | _ -> assert false let search_class_exp table name = @@ -1179,10 +1179,9 @@ module Analyser = let new_env = Odoc_env.add_value env new_value.val_name in (0, new_env, [Element_value new_value]) - | Parsetree.Pstr_type name_typedecl_list -> + | Parsetree.Pstr_type (rf, name_typedecl_list) -> (* of (string * type_declaration) list *) - (* we start by extending the environment *) - let new_env = + let extended_env = List.fold_left (fun acc_env {Parsetree.ptype_name = { txt = name }} -> let complete_name = Name.concat current_module_name name in @@ -1191,6 +1190,11 @@ module Analyser = env name_typedecl_list in + let env = + match rf with + | Recursive -> extended_env + | Nonrecursive -> env + in let rec f ?(first=false) maybe_more_acc last_pos name_type_decl_list = match name_type_decl_list with [] -> (maybe_more_acc, []) @@ -1220,7 +1224,7 @@ module Analyser = get_comments_in_module last_pos loc_start in let kind = Sig.get_type_kind - new_env name_comment_list + env name_comment_list tt_type_decl.Types.type_kind in let new_end = loc_end + maybe_more in @@ -1232,7 +1236,7 @@ module Analyser = List.map2 (fun p v -> let (co, cn) = Types.Variance.get_upper v in - (Odoc_env.subst_type new_env p, co, cn)) + (Odoc_env.subst_type env p, co, cn)) tt_type_decl.Types.type_params tt_type_decl.Types.type_variance ; ty_kind = kind ; @@ -1241,7 +1245,7 @@ module Analyser = (match tt_type_decl.Types.type_manifest with None -> None | Some t -> - Some (Sig.manifest_structure new_env name_comment_list t)); + Some (Sig.manifest_structure env name_comment_list t)); ty_loc = { loc_impl = Some loc ; loc_inter = None } ; ty_code = ( @@ -1262,7 +1266,7 @@ module Analyser = (maybe_more3, ele_comments @ ((Element_type t) :: eles)) in let (maybe_more, eles) = f ~first: true 0 loc.Location.loc_start.Lexing.pos_cnum name_typedecl_list in - (maybe_more, new_env, eles) + (maybe_more, extended_env, eles) | Parsetree.Pstr_typext tyext -> (* we get the extension declaration in the typed tree *) diff --git a/ocamldoc/odoc_sig.ml b/ocamldoc/odoc_sig.ml index e41cf2b8db..f9f6e6fdfa 100644 --- a/ocamldoc/odoc_sig.ml +++ b/ocamldoc/odoc_sig.ml @@ -329,10 +329,10 @@ module Analyser = | Parsetree.Psig_include _ | Parsetree.Psig_class _ | Parsetree.Psig_class_type _ as tp -> take_item tp - | Parsetree.Psig_type types -> + | Parsetree.Psig_type (rf, types) -> (match List.filter (fun td -> not (Name.Set.mem td.Parsetree.ptype_name.txt erased)) types with | [] -> acc - | types -> take_item (Parsetree.Psig_type types)) + | types -> take_item (Parsetree.Psig_type (rf, types))) | Parsetree.Psig_module {Parsetree.pmd_name=name} | Parsetree.Psig_modtype {Parsetree.pmtd_name=name} as m -> if Name.Set.mem name.txt erased then acc else take_item m @@ -722,9 +722,8 @@ module Analyser = let new_env = Odoc_env.add_extension env e.ex_name in (maybe_more, new_env, [ Element_exception e ]) - | Parsetree.Psig_type name_type_decl_list -> - (* we start by extending the environment *) - let new_env = + | Parsetree.Psig_type (rf, name_type_decl_list) -> + let extended_env = List.fold_left (fun acc_env td -> let complete_name = Name.concat current_module_name td.Parsetree.ptype_name.txt in @@ -733,6 +732,11 @@ module Analyser = env name_type_decl_list in + let env = + match rf with + | Recursive -> extended_env + | Nonrecursive -> env + in let rec f ?(first=false) acc_maybe_more last_pos name_type_decl_list = match name_type_decl_list with [] -> @@ -768,7 +772,7 @@ module Analyser = raise (Failure (Odoc_messages.type_not_found current_module_name name.txt)) in (* get the type kind with the associated comments *) - let type_kind = get_type_kind new_env name_comment_list sig_type_decl.Types.type_kind in + let type_kind = get_type_kind env name_comment_list sig_type_decl.Types.type_kind in let loc_start = type_decl.Parsetree.ptype_loc.Location.loc_start.Lexing.pos_cnum in let new_end = type_decl.Parsetree.ptype_loc.Location.loc_end.Lexing.pos_cnum + maybe_more in (* associate the comments to each constructor and build the [Type.t_type] *) @@ -779,7 +783,7 @@ module Analyser = ty_parameters = List.map2 (fun p v -> let (co, cn) = Types.Variance.get_upper v in - (Odoc_env.subst_type new_env p,co, cn)) + (Odoc_env.subst_type env p,co, cn)) sig_type_decl.Types.type_params sig_type_decl.Types.type_variance; ty_kind = type_kind; @@ -814,7 +818,7 @@ module Analyser = (new_maybe_more, (ele_comments @ [Element_type new_type]) @ eles) in let (maybe_more, types) = f ~first: true 0 pos_start_ele name_type_decl_list in - (maybe_more, new_env, types) + (maybe_more, extended_env, types) | Parsetree.Psig_open _ -> (* A VOIR *) let ele_comments = match comment_opt with diff --git a/tools/depend.ml b/tools/depend.ml index aeb121cbc8..048f0ed5db 100644 --- a/tools/depend.ml +++ b/tools/depend.ml @@ -239,7 +239,7 @@ and add_sig_item bv item = match item.psig_desc with Psig_value vd -> add_type bv vd.pval_type; bv - | Psig_type dcls -> + | Psig_type (_, dcls) -> List.iter (add_type_declaration bv) dcls; bv | Psig_typext te -> add_type_extension bv te; bv @@ -298,7 +298,7 @@ and add_struct_item bv item = let bv = add_bindings rf bv pel in bv | Pstr_primitive vd -> add_type bv vd.pval_type; bv - | Pstr_type dcls -> + | Pstr_type (_, dcls) -> List.iter (add_type_declaration bv) dcls; bv | Pstr_typext te -> add_type_extension bv te; diff --git a/tools/eqparsetree.ml b/tools/eqparsetree.ml index 128453e0c3..c2571c3609 100644 --- a/tools/eqparsetree.ml +++ b/tools/eqparsetree.ml @@ -273,12 +273,13 @@ let rec eq_structure_item_desc : | (Pstr_primitive (a0, a1), Pstr_primitive (b0, b1)) -> (Asttypes.eq_loc eq_string (a0, b0)) && (eq_value_description (a1, b1)) - | (Pstr_type a0, Pstr_type b0) -> + | (Pstr_type (a0, a1), Pstr_type (b0, b1)) -> + (Asttypes.eq_rec_flag (a0, b0) && eq_list (fun ((a0, a1), (b0, b1)) -> (Asttypes.eq_loc eq_string (a0, b0)) && (eq_type_declaration (a1, b1))) - (a0, b0) + (a1, b1) | (Pstr_exception (a0, a1), Pstr_exception (b0, b1)) -> (Asttypes.eq_loc eq_string (a0, b0)) && (eq_exception_declaration (a1, b1)) @@ -359,12 +360,13 @@ and eq_signature_item_desc : | (Psig_value (a0, a1), Psig_value (b0, b1)) -> (Asttypes.eq_loc eq_string (a0, b0)) && (eq_value_description (a1, b1)) - | (Psig_type a0, Psig_type b0) -> + | (Psig_type (a0, a1), Psig_type (b0, b1)) -> + (Asttypes.eq_rec_flag (a0, b0) && eq_list (fun ((a0, a1), (b0, b1)) -> (Asttypes.eq_loc eq_string (a0, b0)) && (eq_type_declaration (a1, b1))) - (a0, b0) + (a1, b1) | (Psig_exception (a0, a1), Psig_exception (b0, b1)) -> (Asttypes.eq_loc eq_string (a0, b0)) && (eq_exception_declaration (a1, b1)) diff --git a/tools/tast_iter.ml b/tools/tast_iter.ml index 791fb6a513..e858d69aee 100644 --- a/tools/tast_iter.ml +++ b/tools/tast_iter.ml @@ -22,7 +22,7 @@ let structure_item sub x = | Tstr_eval (exp, _attrs) -> sub # expression exp | Tstr_value (rec_flag, list) -> sub # bindings (rec_flag, list) | Tstr_primitive v -> sub # value_description v - | Tstr_type list -> List.iter (sub # type_declaration) list + | Tstr_type (_, list) -> List.iter (sub # type_declaration) list | Tstr_typext te -> sub # type_extension te | Tstr_exception ext -> sub # extension_constructor ext | Tstr_module mb -> sub # module_binding mb @@ -179,7 +179,7 @@ let signature_item sub item = match item.sig_desc with | Tsig_value v -> sub # value_description v - | Tsig_type list -> + | Tsig_type (_rec_flag, list) -> List.iter (sub # type_declaration) list | Tsig_typext te -> sub # type_extension te diff --git a/tools/untypeast.ml b/tools/untypeast.ml index 7641c91d0a..57865673b2 100644 --- a/tools/untypeast.ml +++ b/tools/untypeast.ml @@ -54,8 +54,8 @@ and untype_structure_item item = Pstr_value (rec_flag, List.map untype_binding list) | Tstr_primitive vd -> Pstr_primitive (untype_value_description vd) - | Tstr_type list -> - Pstr_type (List.map untype_type_declaration list) + | Tstr_type (rec_flag, list) -> + Pstr_type (rec_flag, List.map untype_type_declaration list) | Tstr_typext tyext -> Pstr_typext (untype_type_extension tyext) | Tstr_exception ext -> @@ -367,8 +367,8 @@ and untype_signature_item item = match item.sig_desc with Tsig_value v -> Psig_value (untype_value_description v) - | Tsig_type list -> - Psig_type (List.map untype_type_declaration list) + | Tsig_type (rec_flag, list) -> + Psig_type (rec_flag, List.map untype_type_declaration list) | Tsig_typext tyext -> Psig_typext (untype_type_extension tyext) | Tsig_exception ext -> diff --git a/typing/typedtreeIter.ml b/typing/typedtreeIter.ml index 3d1a19fa8d..45d7cb7c05 100644 --- a/typing/typedtreeIter.ml +++ b/typing/typedtreeIter.ml @@ -23,7 +23,6 @@ module type IteratorArgument = sig val enter_structure : structure -> unit val enter_value_description : value_description -> unit - val enter_type_declaration : type_declaration -> unit val enter_type_extension : type_extension -> unit val enter_extension_constructor : extension_constructor -> unit val enter_pattern : pattern -> unit @@ -50,7 +49,6 @@ module type IteratorArgument = sig val leave_structure : structure -> unit val leave_value_description : value_description -> unit - val leave_type_declaration : type_declaration -> unit val leave_type_extension : type_extension -> unit val leave_extension_constructor : extension_constructor -> unit val leave_pattern : pattern -> unit @@ -79,6 +77,11 @@ module type IteratorArgument = sig val leave_binding : value_binding -> unit val leave_bindings : rec_flag -> unit + val enter_type_declarations : rec_flag -> unit + val enter_type_declaration : type_declaration -> unit + val leave_type_declaration : type_declaration -> unit + val leave_type_declarations : rec_flag -> unit + end module MakeIterator(Iter : IteratorArgument) : sig @@ -133,7 +136,7 @@ module MakeIterator(Iter : IteratorArgument) : sig | Tstr_value (rec_flag, list) -> iter_bindings rec_flag list | Tstr_primitive vd -> iter_value_description vd - | Tstr_type list -> List.iter iter_type_declaration list + | Tstr_type (rf, list) -> iter_type_declarations rf list | Tstr_typext tyext -> iter_type_extension tyext | Tstr_exception ext -> iter_extension_constructor ext | Tstr_module x -> iter_module_binding x @@ -188,6 +191,11 @@ module MakeIterator(Iter : IteratorArgument) : sig option iter_core_type decl.typ_manifest; Iter.leave_type_declaration decl + and iter_type_declarations rec_flag decls = + Iter.enter_type_declarations rec_flag; + List.iter iter_type_declaration decls; + Iter.leave_type_declarations rec_flag + and iter_extension_constructor ext = Iter.enter_extension_constructor ext; begin match ext.ext_kind with @@ -352,8 +360,8 @@ module MakeIterator(Iter : IteratorArgument) : sig match item.sig_desc with Tsig_value vd -> iter_value_description vd - | Tsig_type list -> - List.iter iter_type_declaration list + | Tsig_type (rf, list) -> + iter_type_declarations rf list | Tsig_exception ext -> iter_extension_constructor ext | Tsig_typext tyext -> @@ -590,7 +598,6 @@ module DefaultIteratorArgument = struct let enter_structure _ = () let enter_value_description _ = () - let enter_type_declaration _ = () let enter_type_extension _ = () let enter_extension_constructor _ = () let enter_pattern _ = () @@ -618,7 +625,6 @@ module DefaultIteratorArgument = struct let leave_structure _ = () let leave_value_description _ = () - let leave_type_declaration _ = () let leave_type_extension _ = () let leave_extension_constructor _ = () let leave_pattern _ = () @@ -649,4 +655,9 @@ module DefaultIteratorArgument = struct let enter_bindings _ = () let leave_bindings _ = () - end + let enter_type_declaration _ = () + let leave_type_declaration _ = () + + let enter_type_declarations _ = () + let leave_type_declarations _ = () +end diff --git a/typing/typedtreeIter.mli b/typing/typedtreeIter.mli index 547fc5c34b..921afb7dbf 100644 --- a/typing/typedtreeIter.mli +++ b/typing/typedtreeIter.mli @@ -17,7 +17,6 @@ open Typedtree module type IteratorArgument = sig val enter_structure : structure -> unit val enter_value_description : value_description -> unit - val enter_type_declaration : type_declaration -> unit val enter_type_extension : type_extension -> unit val enter_extension_constructor : extension_constructor -> unit val enter_pattern : pattern -> unit @@ -44,7 +43,6 @@ module type IteratorArgument = sig val leave_structure : structure -> unit val leave_value_description : value_description -> unit - val leave_type_declaration : type_declaration -> unit val leave_type_extension : type_extension -> unit val leave_extension_constructor : extension_constructor -> unit val leave_pattern : pattern -> unit @@ -73,6 +71,11 @@ module type IteratorArgument = sig val leave_binding : value_binding -> unit val leave_bindings : rec_flag -> unit + val enter_type_declarations : rec_flag -> unit + val enter_type_declaration : type_declaration -> unit + val leave_type_declaration : type_declaration -> unit + val leave_type_declarations : rec_flag -> unit + end module MakeIterator : diff --git a/typing/typedtreeMap.ml b/typing/typedtreeMap.ml index b5ca25b178..2c5c67d4e6 100644 --- a/typing/typedtreeMap.ml +++ b/typing/typedtreeMap.ml @@ -117,8 +117,8 @@ module MakeMap(Map : MapArgument) = struct Tstr_value (rec_flag, map_bindings rec_flag list) | Tstr_primitive vd -> Tstr_primitive (map_value_description vd) - | Tstr_type list -> - Tstr_type (List.map map_type_declaration list) + | Tstr_type (rf, list) -> + Tstr_type (rf, List.map map_type_declaration list) | Tstr_typext tyext -> Tstr_typext (map_type_extension tyext) | Tstr_exception ext -> @@ -408,7 +408,7 @@ module MakeMap(Map : MapArgument) = struct match item.sig_desc with Tsig_value vd -> Tsig_value (map_value_description vd) - | Tsig_type list -> Tsig_type (List.map map_type_declaration list) + | Tsig_type (rf, list) -> Tsig_type (rf, List.map map_type_declaration list) | Tsig_typext tyext -> Tsig_typext (map_type_extension tyext) | Tsig_exception ext -> From afbc68fd6a28c9f491d4c2e8df1286f4de957597 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Dimino?= <jeremie@dimino.org> Date: Fri, 13 Mar 2015 11:11:19 +0000 Subject: [PATCH 169/494] Update printing of nonrec types git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15932 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- typing/oprint.ml | 5 ++++- typing/typemod.ml | 15 +++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/typing/oprint.ml b/typing/oprint.ml index 994d932750..4f48232505 100644 --- a/typing/oprint.ml +++ b/typing/oprint.ml @@ -419,7 +419,10 @@ and print_out_sig_item ppf = name !out_module_type mty | Osig_type(td, rs) -> print_out_type_decl - (if rs = Orec_next then "and" else "type") + (match rs with + | Orec_not -> "type nonrec" + | Orec_first -> "type" + | Orec_next -> "and") ppf td | Osig_value (name, ty, prims) -> let kwd = if prims = [] then "val" else "external" in diff --git a/typing/typemod.ml b/typing/typemod.ml index c5211e7e27..6273774502 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -299,6 +299,11 @@ let rec map_rec'' fn decls rem = fn Trec_not d1 :: map_rec'' fn dl rem | _ -> map_rec fn decls rem +let maybe_rec rec_flag k fn decls rem = + match rec_flag with + | Recursive -> k fn decls rem + | Nonrecursive -> map_end (fn Trec_not) decls rem + (* Add type extension flags to extension contructors *) let map_ext fn exts rem = match exts with @@ -347,10 +352,11 @@ and approx_sig env ssg = [] -> [] | item :: srem -> match item.psig_desc with - | Psig_type (_, sdecls) -> + | Psig_type (rf, sdecls) -> let decls = Typedecl.approx_type_decl env sdecls in let rem = approx_sig env srem in - map_rec' (fun rs (id, info) -> Sig_type(id, info, rs)) decls rem + maybe_rec rf map_rec' + (fun rs (id, info) -> Sig_type(id, info, rs)) decls rem | Psig_module pmd -> let md = approx_module_declaration env pmd in let (id, newenv) = @@ -568,7 +574,7 @@ and transl_signature env sg = let (decls, newenv) = Typedecl.transl_type_decl env rec_flag sdecls in let (trem, rem, final_env) = transl_sig newenv srem in mksig (Tsig_type (rec_flag, decls)) env loc :: trem, - map_rec'' (fun rs td -> + maybe_rec rec_flag map_rec'' (fun rs td -> Sig_type(td.typ_id, td.typ_type, rs)) decls rem, final_env | Psig_typext styext -> @@ -1240,7 +1246,8 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = sdecls; let (decls, newenv) = Typedecl.transl_type_decl env rec_flag sdecls in Tstr_type (rec_flag, decls), - map_rec'' (fun rs info -> Sig_type(info.typ_id, info.typ_type, rs)) + maybe_rec rec_flag map_rec'' + (fun rs info -> Sig_type(info.typ_id, info.typ_type, rs)) decls [], enrich_type_decls anchor decls env newenv | Pstr_typext styext -> From 4553f345dcd5e45c1ce5a7182bfc8e56b0759575 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Dimino?= <jeremie@dimino.org> Date: Fri, 13 Mar 2015 11:11:31 +0000 Subject: [PATCH 170/494] Update Changes. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15933 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Changes b/Changes index 954e50dd21..b6accd4996 100644 --- a/Changes +++ b/Changes @@ -8,6 +8,8 @@ Language features: It is also possible to use '#' as part of these extra symbols (for instance ##, or #+#); this is rejected by the type-checker, but can be used e.g. by ppx rewriters. +- PR#6016: add a "nonrec" keyword for type declarations + (Jérémie Dimino) Compilers: - PR#6600: make -short-paths faster by building the printing map From 73ee71276cbfa097bbe24ec07b68d9b41e12c169 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Dimino?= <jeremie@dimino.org> Date: Fri, 13 Mar 2015 14:09:51 +0000 Subject: [PATCH 171/494] Uncomment production for attributes on types git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15934 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- parsing/parser.mly | 2 -- 1 file changed, 2 deletions(-) diff --git a/parsing/parser.mly b/parsing/parser.mly index 4ef8335e1f..d43b5a1ba9 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -1780,10 +1780,8 @@ poly_type_no_attr: core_type: core_type_no_attr { $1 } -/* | core_type attribute { Typ.attr $1 $2 } -*/ ; core_type_no_attr: core_type2 From ea452cce44f2a187c86d4a33e7d706d400baf916 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Fri, 13 Mar 2015 15:33:29 +0000 Subject: [PATCH 172/494] mark "nonrec" as a compatibility-breaking change git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15935 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index b6accd4996..9c1a8083d5 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,6 @@ OCaml 4.02.2: ------------- +(Changes that can break existing programs are marked with a "*") Language features: - PR#6583: add a new class of binary operators with the same syntactic @@ -8,7 +9,7 @@ Language features: It is also possible to use '#' as part of these extra symbols (for instance ##, or #+#); this is rejected by the type-checker, but can be used e.g. by ppx rewriters. -- PR#6016: add a "nonrec" keyword for type declarations +* PR#6016: add a "nonrec" keyword for type declarations (Jérémie Dimino) Compilers: From a0433b021895763049b2f59da5452d60eb8ad7b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Dimino?= <jeremie@dimino.org> Date: Mon, 16 Mar 2015 17:26:39 +0000 Subject: [PATCH 173/494] Fix printing of sequence of type delcarations with -short-paths git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15940 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- .../tests/typing-short-paths/short-paths.ml | 3 +++ .../short-paths.ml.reference | 2 ++ typing/printtyp.ml | 18 ++++++++++-------- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/testsuite/tests/typing-short-paths/short-paths.ml b/testsuite/tests/typing-short-paths/short-paths.ml index a9812f4fad..5d691acaab 100644 --- a/testsuite/tests/typing-short-paths/short-paths.ml +++ b/testsuite/tests/typing-short-paths/short-paths.ml @@ -52,3 +52,6 @@ module N2 = struct type u = v and v = M1.v end;; module type PR6566 = sig type t = string end;; module PR6566 = struct type t = int end;; module PR6566' : PR6566 = PR6566;; + +module A = struct module B = struct type t = T end end;; +module M2 = struct type u = A.B.t type foo = int type v = A.B.t end;; diff --git a/testsuite/tests/typing-short-paths/short-paths.ml.reference b/testsuite/tests/typing-short-paths/short-paths.ml.reference index 53309ad383..b45fdd0d61 100644 --- a/testsuite/tests/typing-short-paths/short-paths.ml.reference +++ b/testsuite/tests/typing-short-paths/short-paths.ml.reference @@ -80,4 +80,6 @@ Error: Signature mismatch: type t = int is not included in type t = bytes +# module A : sig module B : sig type t = T end end +# module M2 : sig type u = A.B.t type foo = int type v = u end # diff --git a/typing/printtyp.ml b/typing/printtyp.ml index 881e410653..cbce373949 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -1142,7 +1142,7 @@ let dummy = let hide_rec_items = function | Sig_type(id, decl, rs) ::rem - when rs <> Trec_next && not !Clflags.real_paths -> + when rs = Trec_first && not !Clflags.real_paths -> let rec get_ids = function Sig_type (id, _, Trec_next) :: rem -> id :: get_ids rem @@ -1171,15 +1171,17 @@ let rec tree_of_modtype = function Omty_alias (tree_of_path p) and tree_of_signature sg = - wrap_env (fun env -> env) (tree_of_signature_rec !printing_env) sg + wrap_env (fun env -> env) (tree_of_signature_rec !printing_env false) sg -and tree_of_signature_rec env' = function +and tree_of_signature_rec env' in_type_group = function [] -> [] | item :: rem -> - begin match item with - Sig_type (_, _, rs) when rs <> Trec_next -> () - | _ -> set_printing_env env' - end; + let in_type_group = + match in_type_group, item with + true, Sig_type (_, _, Trec_next) -> true + | _, Sig_type (_, _, (Trec_not | Trec_first)) -> set_printing_env env'; true + | _ -> set_printing_env env'; false + in let (sg, rem) = filter_rem_sig item rem in let trees = match item with @@ -1203,7 +1205,7 @@ and tree_of_signature_rec env' = function [tree_of_cltype_declaration id decl rs] in let env' = Env.add_signature (item :: sg) env' in - trees @ tree_of_signature_rec env' rem + trees @ tree_of_signature_rec env' in_type_group rem and tree_of_modtype_declaration id decl = let mty = From 7a3f88bc1db03444ebf9514b3c9c31505dcd2034 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Dimino?= <jeremie@dimino.org> Date: Mon, 16 Mar 2015 17:33:01 +0000 Subject: [PATCH 174/494] Fix printing of nonrec types By allowing Trec_next after Trec_not. Also renamed some functions with more explicit names: - map_rec' -> map_rec_type - map_Rec'' -> map_rec_type_with_row_types git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15941 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- typing/typemod.ml | 65 ++++++++++++++++++++++++----------------------- typing/types.ml | 4 +-- typing/types.mli | 4 +-- 3 files changed, 37 insertions(+), 36 deletions(-) diff --git a/typing/typemod.ml b/typing/typemod.ml index 6273774502..6bc76e940c 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -120,15 +120,16 @@ let rec make_params n = function [] -> [] | _ :: l -> ("a" ^ string_of_int n) :: make_params (n+1) l -let make_next_first rs rem = - if rs = Trec_first then - match rem with - Sig_type (id, decl, Trec_next) :: rem -> - Sig_type (id, decl, Trec_first) :: rem - | Sig_module (id, mty, Trec_next) :: rem -> - Sig_module (id, mty, Trec_first) :: rem - | _ -> rem - else rem +let update_rec_next rs rem = + match rs with + Trec_next -> rem + | Trec_first | Trec_not -> + match rem with + Sig_type (id, decl, Trec_next) :: rem -> + Sig_type (id, decl, rs) :: rem + | Sig_module (id, mty, Trec_next) :: rem -> + Sig_module (id, mty, rs) :: rem + | _ -> rem let sig_item desc typ env loc = { Typedtree.sig_desc = desc; sig_loc = loc; sig_env = env @@ -207,7 +208,7 @@ let merge_constraint initial_env loc sg constr = check_type_decl env sdecl.ptype_loc id row_id newdecl decl rs rem; real_id := Some id; (Pident id, lid, Twith_typesubst tdecl), - make_next_first rs rem + update_rec_next rs rem | (Sig_module(id, md, rs) :: rem, [s], Pwith_module (_, lid')) when Ident.name id = s -> let path, md' = Typetexp.find_module initial_env loc lid'.txt in @@ -223,7 +224,7 @@ let merge_constraint initial_env loc sg constr = ignore(Includemod.modtypes env newmd.md_type md.md_type); real_id := Some id; (Pident id, lid, Twith_modsubst (path, lid')), - make_next_first rs rem + update_rec_next rs rem | (Sig_module(id, md, rs) :: rem, s :: namelist, _) when Ident.name id = s -> let ((path, path_loc, tcstr), newsg) = @@ -284,25 +285,25 @@ let map_rec fn decls rem = | [] -> rem | d1 :: dl -> fn Trec_first d1 :: map_end (fn Trec_next) dl rem -let map_rec' = map_rec -(* -let rec map_rec' fn decls rem = +let map_rec_type ~rec_flag fn decls rem = match decls with - | (id,_ as d1) :: dl when Btype.is_row_name (Ident.name id) -> - fn Trec_not d1 :: map_rec' fn dl rem - | _ -> map_rec fn decls rem -*) + | [] -> rem + | d1 :: dl -> + let first = + match rec_flag with + | Recursive -> Trec_first + | Nonrecursive -> Trec_not + in + fn first d1 :: map_end (fn Trec_next) dl rem -let rec map_rec'' fn decls rem = +let rec map_rec_type_with_row_types ~rec_flag fn decls rem = match decls with - | d1 :: dl when Btype.is_row_name (Ident.name d1.typ_id) -> - fn Trec_not d1 :: map_rec'' fn dl rem - | _ -> map_rec fn decls rem - -let maybe_rec rec_flag k fn decls rem = - match rec_flag with - | Recursive -> k fn decls rem - | Nonrecursive -> map_end (fn Trec_not) decls rem + | [] -> rem + | d1 :: dl -> + if Btype.is_row_name (Ident.name d1.typ_id) then + fn Trec_not d1 :: map_rec_type_with_row_types ~rec_flag fn dl rem + else + map_rec_type ~rec_flag fn decls rem (* Add type extension flags to extension contructors *) let map_ext fn exts rem = @@ -352,10 +353,10 @@ and approx_sig env ssg = [] -> [] | item :: srem -> match item.psig_desc with - | Psig_type (rf, sdecls) -> + | Psig_type (rec_flag, sdecls) -> let decls = Typedecl.approx_type_decl env sdecls in let rem = approx_sig env srem in - maybe_rec rf map_rec' + map_rec_type ~rec_flag (fun rs (id, info) -> Sig_type(id, info, rs)) decls rem | Psig_module pmd -> let md = approx_module_declaration env pmd in @@ -574,8 +575,8 @@ and transl_signature env sg = let (decls, newenv) = Typedecl.transl_type_decl env rec_flag sdecls in let (trem, rem, final_env) = transl_sig newenv srem in mksig (Tsig_type (rec_flag, decls)) env loc :: trem, - maybe_rec rec_flag map_rec'' (fun rs td -> - Sig_type(td.typ_id, td.typ_type, rs)) decls rem, + map_rec_type_with_row_types ~rec_flag + (fun rs td -> Sig_type(td.typ_id, td.typ_type, rs)) decls rem, final_env | Psig_typext styext -> let (tyext, newenv) = @@ -1246,7 +1247,7 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = sdecls; let (decls, newenv) = Typedecl.transl_type_decl env rec_flag sdecls in Tstr_type (rec_flag, decls), - maybe_rec rec_flag map_rec'' + map_rec_type_with_row_types ~rec_flag (fun rs info -> Sig_type(info.typ_id, info.typ_type, rs)) decls [], enrich_type_decls anchor decls env newenv diff --git a/typing/types.ml b/typing/types.ml index 8d3982ed9a..6ab98419a4 100644 --- a/typing/types.ml +++ b/typing/types.ml @@ -297,9 +297,9 @@ and modtype_declaration = } and rec_status = - Trec_not (* not recursive *) + Trec_not (* first in a nonrecursive group *) | Trec_first (* first in a recursive group *) - | Trec_next (* not first in a recursive group *) + | Trec_next (* not first in a recursive/nonrecursive group *) and ext_status = Text_first (* first constructor of an extension *) diff --git a/typing/types.mli b/typing/types.mli index c3999826cc..fd7ef10084 100644 --- a/typing/types.mli +++ b/typing/types.mli @@ -287,9 +287,9 @@ and modtype_declaration = } and rec_status = - Trec_not (* not recursive *) + Trec_not (* first in a nonrecursive group *) | Trec_first (* first in a recursive group *) - | Trec_next (* not first in a recursive group *) + | Trec_next (* not first in a recursive/nonrecursive group *) and ext_status = Text_first (* first constructor in an extension *) From 749d89e9e0c7f69192eeea4618a0a85bda317c4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Dimino?= <jeremie@dimino.org> Date: Mon, 16 Mar 2015 18:14:17 +0000 Subject: [PATCH 175/494] Fix pretty-printing of extensions in patterns git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15944 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- parsing/pprintast.ml | 1 + 1 file changed, 1 insertion(+) diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index 538b0600bd..0739ad3065 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -403,6 +403,7 @@ class printer ()= object(self:'self) pp f "@[<2>(lazy@;%a)@]" self#pattern1 p | Ppat_exception p -> pp f "@[<2>exception@;%a@]" self#pattern1 p + | Ppat_extension e -> self#extension f e | _ -> self#paren true self#pattern f x method label_exp f (l,opt,p) = From c9eeb48abbdd47df83b6fb058c5c7a83abf72591 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Dimino?= <jeremie@dimino.org> Date: Tue, 17 Mar 2015 16:38:47 +0000 Subject: [PATCH 176/494] Encode nonrec as an attribute To avoid modifying the Parsetree git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15948 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- bytecomp/translmod.ml | 12 ++++++------ ocamldoc/odoc_ast.ml | 19 ++++++++++++------- ocamldoc/odoc_sig.ml | 17 +++++++++++------ parsing/ast_helper.ml | 5 +++-- parsing/ast_helper.mli | 4 ++-- parsing/ast_mapper.ml | 4 ++-- parsing/parser.mly | 15 +++++++++++++-- parsing/parsetree.mli | 4 ++-- parsing/pprintast.ml | 20 +++++++++++++++----- parsing/pprintast.mli | 2 +- parsing/printast.ml | 8 ++++---- tools/depend.ml | 4 ++-- tools/tast_iter.ml | 4 ++-- tools/untypeast.ml | 10 +++++----- typing/printtyped.ml | 8 ++++---- typing/typedtree.ml | 4 ++-- typing/typedtree.mli | 4 ++-- typing/typedtreeIter.ml | 18 ++++++++++++++---- typing/typedtreeMap.ml | 6 +++--- typing/typemod.ml | 23 ++++++++++++++++++----- 20 files changed, 123 insertions(+), 68 deletions(-) diff --git a/bytecomp/translmod.ml b/bytecomp/translmod.ml index 09c881e57b..d3c6ca2b04 100644 --- a/bytecomp/translmod.ml +++ b/bytecomp/translmod.ml @@ -121,7 +121,7 @@ and wrap_id_pos_list id_pos_list get_field lam = (lam, Ident.empty) id_pos_list in if s == Ident.empty then lam else subst_lambda s lam - + (* Compose two coercions apply_coercion c1 (apply_coercion c2 e) behaves like @@ -405,7 +405,7 @@ and transl_structure fields cc rootpath = function | Tstr_primitive descr -> record_primitive descr.val_val; transl_structure fields cc rootpath rem - | Tstr_type(_, decls) -> + | Tstr_type decls -> transl_structure fields cc rootpath rem | Tstr_typext(tyext) -> let ids = List.map (fun ext -> ext.ext_id) tyext.tyext_constructors in @@ -490,7 +490,7 @@ let rec defined_idents = function | Tstr_value(rec_flag, pat_expr_list) -> let_bound_idents pat_expr_list @ defined_idents rem | Tstr_primitive desc -> defined_idents rem - | Tstr_type (_, decls) -> defined_idents rem + | Tstr_type decls -> defined_idents rem | Tstr_typext tyext -> List.map (fun ext -> ext.ext_id) tyext.tyext_constructors @ defined_idents rem @@ -516,7 +516,7 @@ let rec more_idents = function | Tstr_eval (expr, _attrs) -> more_idents rem | Tstr_value(rec_flag, pat_expr_list) -> more_idents rem | Tstr_primitive _ -> more_idents rem - | Tstr_type (_, decls) -> more_idents rem + | Tstr_type decls -> more_idents rem | Tstr_typext tyext -> more_idents rem | Tstr_exception _ -> more_idents rem | Tstr_recmodule decls -> more_idents rem @@ -538,7 +538,7 @@ and all_idents = function | Tstr_value(rec_flag, pat_expr_list) -> let_bound_idents pat_expr_list @ all_idents rem | Tstr_primitive _ -> all_idents rem - | Tstr_type (_, decls) -> all_idents rem + | Tstr_type decls -> all_idents rem | Tstr_typext tyext -> List.map (fun ext -> ext.ext_id) tyext.tyext_constructors @ all_idents rem @@ -596,7 +596,7 @@ let transl_store_structure glob map prims str = | Tstr_primitive descr -> record_primitive descr.val_val; transl_store rootpath subst rem - | Tstr_type(_, decls) -> + | Tstr_type decls -> transl_store rootpath subst rem | Tstr_typext(tyext) -> let ids = List.map (fun ext -> ext.ext_id) tyext.tyext_constructors in diff --git a/ocamldoc/odoc_ast.ml b/ocamldoc/odoc_ast.ml index 1c327c5a53..18723b7532 100644 --- a/ocamldoc/odoc_ast.ml +++ b/ocamldoc/odoc_ast.ml @@ -83,11 +83,11 @@ module Typedtree_search = end | Typedtree.Tstr_exception ext -> Hashtbl.add table (E (Name.from_ident ext.ext_id)) tt - | Typedtree.Tstr_type (rf, ident_type_decl_list) -> + | Typedtree.Tstr_type ident_type_decl_list -> List.iter (fun td -> Hashtbl.add table (T (Name.from_ident td.typ_id)) - (Typedtree.Tstr_type (rf, [td]))) + (Typedtree.Tstr_type [td])) ident_type_decl_list | Typedtree.Tstr_class info_list -> List.iter @@ -145,7 +145,7 @@ module Typedtree_search = let search_type_declaration table name = match Hashtbl.find table (T name) with - | (Typedtree.Tstr_type (_, [td])) -> td + | (Typedtree.Tstr_type [td]) -> td | _ -> assert false let search_class_exp table name = @@ -1179,7 +1179,7 @@ module Analyser = let new_env = Odoc_env.add_value env new_value.val_name in (0, new_env, [Element_value new_value]) - | Parsetree.Pstr_type (rf, name_typedecl_list) -> + | Parsetree.Pstr_type name_typedecl_list -> (* of (string * type_declaration) list *) let extended_env = List.fold_left @@ -1191,9 +1191,14 @@ module Analyser = name_typedecl_list in let env = - match rf with - | Recursive -> extended_env - | Nonrecursive -> env + let is_nonrec = + List.exists + (fun td -> + List.exists (fun (n, _) -> n.txt = "nonrec") + td.Parsetree.ptype_attributes) + name_typedecl_list + in + if is_nonrec then env else extended_env in let rec f ?(first=false) maybe_more_acc last_pos name_type_decl_list = match name_type_decl_list with diff --git a/ocamldoc/odoc_sig.ml b/ocamldoc/odoc_sig.ml index f9f6e6fdfa..a10837ff22 100644 --- a/ocamldoc/odoc_sig.ml +++ b/ocamldoc/odoc_sig.ml @@ -329,10 +329,10 @@ module Analyser = | Parsetree.Psig_include _ | Parsetree.Psig_class _ | Parsetree.Psig_class_type _ as tp -> take_item tp - | Parsetree.Psig_type (rf, types) -> + | Parsetree.Psig_type types -> (match List.filter (fun td -> not (Name.Set.mem td.Parsetree.ptype_name.txt erased)) types with | [] -> acc - | types -> take_item (Parsetree.Psig_type (rf, types))) + | types -> take_item (Parsetree.Psig_type types)) | Parsetree.Psig_module {Parsetree.pmd_name=name} | Parsetree.Psig_modtype {Parsetree.pmtd_name=name} as m -> if Name.Set.mem name.txt erased then acc else take_item m @@ -722,7 +722,7 @@ module Analyser = let new_env = Odoc_env.add_extension env e.ex_name in (maybe_more, new_env, [ Element_exception e ]) - | Parsetree.Psig_type (rf, name_type_decl_list) -> + | Parsetree.Psig_type name_type_decl_list -> let extended_env = List.fold_left (fun acc_env td -> @@ -733,9 +733,14 @@ module Analyser = name_type_decl_list in let env = - match rf with - | Recursive -> extended_env - | Nonrecursive -> env + let is_nonrec = + List.exists + (fun td -> + List.exists (fun (n, _) -> n.txt = "nonrec") + td.Parsetree.ptype_attributes) + name_type_decl_list + in + if is_nonrec then env else extended_env in let rec f ?(first=false) acc_maybe_more last_pos name_type_decl_list = match name_type_decl_list with diff --git a/parsing/ast_helper.ml b/parsing/ast_helper.ml index c8817f04e9..588451423f 100644 --- a/parsing/ast_helper.ml +++ b/parsing/ast_helper.ml @@ -157,7 +157,7 @@ module Sig = struct let mk ?(loc = !default_loc) d = {psig_desc = d; psig_loc = loc} let value ?loc a = mk ?loc (Psig_value a) - let type_ ?loc rec_flag a = mk ?loc (Psig_type (rec_flag, a)) + let type_ ?loc a = mk ?loc (Psig_type a) let type_extension ?loc a = mk ?loc (Psig_typext a) let exception_ ?loc a = mk ?loc (Psig_exception a) let module_ ?loc a = mk ?loc (Psig_module a) @@ -177,7 +177,7 @@ module Str = struct let eval ?loc ?(attrs = []) a = mk ?loc (Pstr_eval (a, attrs)) let value ?loc a b = mk ?loc (Pstr_value (a, b)) let primitive ?loc a = mk ?loc (Pstr_primitive a) - let type_ ?loc rec_flag a = mk ?loc (Pstr_type (rec_flag, a)) + let type_ ?loc a = mk ?loc (Pstr_type a) let type_extension ?loc a = mk ?loc (Pstr_typext a) let exception_ ?loc a = mk ?loc (Pstr_exception a) let module_ ?loc a = mk ?loc (Pstr_module a) @@ -435,3 +435,4 @@ module Cstr = struct pcstr_fields = fields; } end + diff --git a/parsing/ast_helper.mli b/parsing/ast_helper.mli index b91e6b29c5..b9b04f8223 100644 --- a/parsing/ast_helper.mli +++ b/parsing/ast_helper.mli @@ -209,7 +209,7 @@ module Sig: val mk: ?loc:loc -> signature_item_desc -> signature_item val value: ?loc:loc -> value_description -> signature_item - val type_: ?loc:loc -> rec_flag -> type_declaration list -> signature_item + val type_: ?loc:loc -> type_declaration list -> signature_item val type_extension: ?loc:loc -> type_extension -> signature_item val exception_: ?loc:loc -> extension_constructor -> signature_item val module_: ?loc:loc -> module_declaration -> signature_item @@ -231,7 +231,7 @@ module Str: val eval: ?loc:loc -> ?attrs:attributes -> expression -> structure_item val value: ?loc:loc -> rec_flag -> value_binding list -> structure_item val primitive: ?loc:loc -> value_description -> structure_item - val type_: ?loc:loc -> rec_flag -> type_declaration list -> structure_item + val type_: ?loc:loc -> type_declaration list -> structure_item val type_extension: ?loc:loc -> type_extension -> structure_item val exception_: ?loc:loc -> extension_constructor -> structure_item val module_: ?loc:loc -> module_binding -> structure_item diff --git a/parsing/ast_mapper.ml b/parsing/ast_mapper.ml index 8ad3ce400a..669d01449c 100644 --- a/parsing/ast_mapper.ml +++ b/parsing/ast_mapper.ml @@ -236,7 +236,7 @@ module MT = struct let loc = sub.location sub loc in match desc with | Psig_value vd -> value ~loc (sub.value_description sub vd) - | Psig_type (rf, l) -> type_ ~loc rf (List.map (sub.type_declaration sub) l) + | Psig_type l -> type_ ~loc (List.map (sub.type_declaration sub) l) | Psig_typext te -> type_extension ~loc (sub.type_extension sub te) | Psig_exception ed -> exception_ ~loc (sub.extension_constructor sub ed) | Psig_module x -> module_ ~loc (sub.module_declaration sub x) @@ -284,7 +284,7 @@ module M = struct eval ~loc ~attrs:(sub.attributes sub attrs) (sub.expr sub x) | Pstr_value (r, vbs) -> value ~loc r (List.map (sub.value_binding sub) vbs) | Pstr_primitive vd -> primitive ~loc (sub.value_description sub vd) - | Pstr_type (rf, l) -> type_ ~loc rf (List.map (sub.type_declaration sub) l) + | Pstr_type l -> type_ ~loc (List.map (sub.type_declaration sub) l) | Pstr_typext te -> type_extension ~loc (sub.type_extension sub te) | Pstr_exception ed -> exception_ ~loc (sub.extension_constructor sub ed) | Pstr_module x -> module_ ~loc (sub.module_binding sub x) diff --git a/parsing/parser.mly b/parsing/parser.mly index d43b5a1ba9..f658205d21 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -289,6 +289,17 @@ let mkcf_attrs d attrs = let mkctf_attrs d attrs = Ctf.mk ~loc:(symbol_rloc()) ~attrs d +let add_nonrec_attr rf tds = + match rf with + | Recursive -> tds + | Nonrecursive -> + let add_attr td = + let name = { txt = "nonrec"; loc = td.ptype_loc } in + let attrs = (name, PStr []) :: td.ptype_attributes in + { td with ptype_attributes = attrs } + in + List.map add_attr tds + %} /* Tokens */ @@ -645,7 +656,7 @@ structure_item: (Pstr_primitive (Val.mk (mkrhs $2 2) $4 ~prim:$6 ~attrs:$7 ~loc:(symbol_rloc ()))) } | TYPE nonrec_flag type_declarations - { mkstr(Pstr_type ($2, List.rev $3) ) } + { mkstr(Pstr_type (add_nonrec_attr $2 (List.rev $3)) ) } | TYPE nonrec_flag str_type_extension { if $2 <> Recursive then not_expecting 2 "nonrec flag"; mkstr(Pstr_typext $3) } @@ -733,7 +744,7 @@ signature_item: (Val.mk (mkrhs $2 2) $4 ~prim:$6 ~attrs:$7 ~loc:(symbol_rloc()))) } | TYPE nonrec_flag type_declarations - { mksig(Psig_type ($2, List.rev $3)) } + { mksig(Psig_type (add_nonrec_attr $2 (List.rev $3))) } | TYPE nonrec_flag sig_type_extension { if $2 <> Recursive then not_expecting 2 "nonrec flag"; mksig(Psig_typext $3) } diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index adc606e60a..295e3eaa07 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -643,7 +643,7 @@ and signature_item_desc = val x: T external x: T = "s1" ... "sn" *) - | Psig_type of rec_flag * type_declaration list + | Psig_type of type_declaration list (* type t1 = ... and ... and tn = ... *) | Psig_typext of type_extension (* type t1 += ... *) @@ -769,7 +769,7 @@ and structure_item_desc = *) | Pstr_primitive of value_description (* external x: T = "s1" ... "sn" *) - | Pstr_type of rec_flag * type_declaration list + | Pstr_type of type_declaration list (* type t1 = ... and ... and tn = ... *) | Pstr_typext of type_extension (* type t1 += ... *) diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index 0739ad3065..93cd0344ff 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -936,8 +936,8 @@ class printer ()= object(self:'self) method signature_item f x :unit= begin match x.psig_desc with - | Psig_type (rf, l) -> - self#type_def_list f (rf, l) + | Psig_type l -> + self#type_def_list f l | Psig_value vd -> let intro = if vd.pval_prim = [] then "val" else "external" in pp f "@[<2>%s@ %a@ :@ %a@]%a" intro @@ -1106,8 +1106,8 @@ class printer ()= object(self:'self) pp f "@[<hov2>let@ _ =@ %a@]%a" self#expression e self#item_attributes attrs - | Pstr_type (_, []) -> assert false - | Pstr_type (rf, l) -> self#type_def_list f (rf, l) + | Pstr_type [] -> assert false + | Pstr_type l -> self#type_def_list f l | Pstr_value (rf, l) -> (* pp f "@[<hov2>let %a%a@]" self#rec_flag rf self#bindings l *) pp f "@[<2>%a@]" self#bindings (rf,l) | Pstr_typext te -> self#type_extension f te @@ -1228,7 +1228,17 @@ class printer ()= object(self:'self) method type_params f = function [] -> () | l -> pp f "%a " (self#list self#type_param ~first:"(" ~last:")" ~sep:",") l - method type_def_list f (rf, l) = + method type_def_list f l = + let rf = + let is_nonrec = + List.exists + (fun td -> + List.exists (fun (n, _) -> n.txt = "nonrec") + td.ptype_attributes) + l + in + if is_nonrec then Nonrecursive else Recursive + in let type_decl kwd rf f x = let eq = if (x.ptype_kind = Ptype_abstract) diff --git a/parsing/pprintast.mli b/parsing/pprintast.mli index a08b225923..45556b84e4 100644 --- a/parsing/pprintast.mli +++ b/parsing/pprintast.mli @@ -104,7 +104,7 @@ class printer : method type_declaration : Format.formatter -> Parsetree.type_declaration -> unit method type_def_list : - Format.formatter -> Asttypes.rec_flag * Parsetree.type_declaration list -> unit + Format.formatter -> Parsetree.type_declaration list -> unit method type_extension : Format.formatter -> Parsetree.type_extension -> unit method type_param : diff --git a/parsing/printast.ml b/parsing/printast.ml index 0d705237d8..c069c7132d 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -640,8 +640,8 @@ and signature_item i ppf x = | Psig_value vd -> line i ppf "Psig_value\n"; value_description i ppf vd; - | Psig_type (rf, l) -> - line i ppf "Psig_type %a\n" fmt_rec_flag rf; + | Psig_type l -> + line i ppf "Psig_type\n"; list i type_declaration ppf l; | Psig_typext te -> line i ppf "Psig_typext\n"; @@ -748,8 +748,8 @@ and structure_item i ppf x = | Pstr_primitive vd -> line i ppf "Pstr_primitive\n"; value_description i ppf vd; - | Pstr_type (rf, l) -> - line i ppf "Pstr_type %a\n" fmt_rec_flag rf; + | Pstr_type l -> + line i ppf "Pstr_type\n"; list i type_declaration ppf l; | Pstr_typext te -> line i ppf "Pstr_typext\n"; diff --git a/tools/depend.ml b/tools/depend.ml index 048f0ed5db..aeb121cbc8 100644 --- a/tools/depend.ml +++ b/tools/depend.ml @@ -239,7 +239,7 @@ and add_sig_item bv item = match item.psig_desc with Psig_value vd -> add_type bv vd.pval_type; bv - | Psig_type (_, dcls) -> + | Psig_type dcls -> List.iter (add_type_declaration bv) dcls; bv | Psig_typext te -> add_type_extension bv te; bv @@ -298,7 +298,7 @@ and add_struct_item bv item = let bv = add_bindings rf bv pel in bv | Pstr_primitive vd -> add_type bv vd.pval_type; bv - | Pstr_type (_, dcls) -> + | Pstr_type dcls -> List.iter (add_type_declaration bv) dcls; bv | Pstr_typext te -> add_type_extension bv te; diff --git a/tools/tast_iter.ml b/tools/tast_iter.ml index e858d69aee..791fb6a513 100644 --- a/tools/tast_iter.ml +++ b/tools/tast_iter.ml @@ -22,7 +22,7 @@ let structure_item sub x = | Tstr_eval (exp, _attrs) -> sub # expression exp | Tstr_value (rec_flag, list) -> sub # bindings (rec_flag, list) | Tstr_primitive v -> sub # value_description v - | Tstr_type (_, list) -> List.iter (sub # type_declaration) list + | Tstr_type list -> List.iter (sub # type_declaration) list | Tstr_typext te -> sub # type_extension te | Tstr_exception ext -> sub # extension_constructor ext | Tstr_module mb -> sub # module_binding mb @@ -179,7 +179,7 @@ let signature_item sub item = match item.sig_desc with | Tsig_value v -> sub # value_description v - | Tsig_type (_rec_flag, list) -> + | Tsig_type list -> List.iter (sub # type_declaration) list | Tsig_typext te -> sub # type_extension te diff --git a/tools/untypeast.ml b/tools/untypeast.ml index 57865673b2..a8b992ef14 100644 --- a/tools/untypeast.ml +++ b/tools/untypeast.ml @@ -54,8 +54,8 @@ and untype_structure_item item = Pstr_value (rec_flag, List.map untype_binding list) | Tstr_primitive vd -> Pstr_primitive (untype_value_description vd) - | Tstr_type (rec_flag, list) -> - Pstr_type (rec_flag, List.map untype_type_declaration list) + | Tstr_type list -> + Pstr_type (List.map untype_type_declaration list) | Tstr_typext tyext -> Pstr_typext (untype_type_extension tyext) | Tstr_exception ext -> @@ -367,8 +367,8 @@ and untype_signature_item item = match item.sig_desc with Tsig_value v -> Psig_value (untype_value_description v) - | Tsig_type (rec_flag, list) -> - Psig_type (rec_flag, List.map untype_type_declaration list) + | Tsig_type list -> + Psig_type (List.map untype_type_declaration list) | Tsig_typext tyext -> Psig_typext (untype_type_extension tyext) | Tsig_exception ext -> @@ -624,7 +624,7 @@ and untype_class_field cf = in let exp = remove_fun_self exp in Pcf_method (lab, priv, Cfk_concrete (o, untype_expression exp)) - | Tcf_initializer exp -> + | Tcf_initializer exp -> let remove_fun_self = function | { exp_desc = Texp_function("", [case], _) } when is_self_pat case.c_lhs && case.c_guard = None -> case.c_rhs | e -> e diff --git a/typing/printtyped.ml b/typing/printtyped.ml index 949cacdfe3..0e97e586bb 100644 --- a/typing/printtyped.ml +++ b/typing/printtyped.ml @@ -613,8 +613,8 @@ and signature_item i ppf x = | Tsig_value vd -> line i ppf "Psig_value\n"; value_description i ppf vd; - | Tsig_type (rf, l) -> - line i ppf "Psig_type %a\n" fmt_rec_flag rf; + | Tsig_type l -> + line i ppf "Psig_type\n"; list i type_declaration ppf l; | Tsig_typext e -> line i ppf "Psig_typext\n"; @@ -719,8 +719,8 @@ and structure_item i ppf x = | Tstr_primitive vd -> line i ppf "Pstr_primitive\n"; value_description i ppf vd; - | Tstr_type (rf, l) -> - line i ppf "Pstr_type %a\n" fmt_rec_flag rf; + | Tstr_type l -> + line i ppf "Pstr_type\n"; list i type_declaration ppf l; | Tstr_typext te -> line i ppf "Pstr_typext\n"; diff --git a/typing/typedtree.ml b/typing/typedtree.ml index 30369d5b11..ecd0f132ee 100644 --- a/typing/typedtree.ml +++ b/typing/typedtree.ml @@ -210,7 +210,7 @@ and structure_item_desc = Tstr_eval of expression * attributes | Tstr_value of rec_flag * value_binding list | Tstr_primitive of value_description - | Tstr_type of rec_flag * type_declaration list + | Tstr_type of type_declaration list | Tstr_typext of type_extension | Tstr_exception of extension_constructor | Tstr_module of module_binding @@ -276,7 +276,7 @@ and signature_item = and signature_item_desc = Tsig_value of value_description - | Tsig_type of rec_flag * type_declaration list + | Tsig_type of type_declaration list | Tsig_typext of type_extension | Tsig_exception of extension_constructor | Tsig_module of module_declaration diff --git a/typing/typedtree.mli b/typing/typedtree.mli index 603fab02e0..c4feae1d86 100644 --- a/typing/typedtree.mli +++ b/typing/typedtree.mli @@ -209,7 +209,7 @@ and structure_item_desc = Tstr_eval of expression * attributes | Tstr_value of rec_flag * value_binding list | Tstr_primitive of value_description - | Tstr_type of rec_flag * type_declaration list + | Tstr_type of type_declaration list | Tstr_typext of type_extension | Tstr_exception of extension_constructor | Tstr_module of module_binding @@ -275,7 +275,7 @@ and signature_item = and signature_item_desc = Tsig_value of value_description - | Tsig_type of rec_flag * type_declaration list + | Tsig_type of type_declaration list | Tsig_typext of type_extension | Tsig_exception of extension_constructor | Tsig_module of module_declaration diff --git a/typing/typedtreeIter.ml b/typing/typedtreeIter.ml index 45d7cb7c05..4b829067c2 100644 --- a/typing/typedtreeIter.ml +++ b/typing/typedtreeIter.ml @@ -136,7 +136,7 @@ module MakeIterator(Iter : IteratorArgument) : sig | Tstr_value (rec_flag, list) -> iter_bindings rec_flag list | Tstr_primitive vd -> iter_value_description vd - | Tstr_type (rf, list) -> iter_type_declarations rf list + | Tstr_type list -> iter_type_declarations list | Tstr_typext tyext -> iter_type_extension tyext | Tstr_exception ext -> iter_extension_constructor ext | Tstr_module x -> iter_module_binding x @@ -191,7 +191,17 @@ module MakeIterator(Iter : IteratorArgument) : sig option iter_core_type decl.typ_manifest; Iter.leave_type_declaration decl - and iter_type_declarations rec_flag decls = + and iter_type_declarations decls = + let rec_flag = + let is_nonrec = + List.exists + (fun td -> + List.exists (fun (n, _) -> n.txt = "nonrec") + td.typ_attributes) + decls + in + if is_nonrec then Nonrecursive else Recursive + in Iter.enter_type_declarations rec_flag; List.iter iter_type_declaration decls; Iter.leave_type_declarations rec_flag @@ -360,8 +370,8 @@ module MakeIterator(Iter : IteratorArgument) : sig match item.sig_desc with Tsig_value vd -> iter_value_description vd - | Tsig_type (rf, list) -> - iter_type_declarations rf list + | Tsig_type list -> + iter_type_declarations list | Tsig_exception ext -> iter_extension_constructor ext | Tsig_typext tyext -> diff --git a/typing/typedtreeMap.ml b/typing/typedtreeMap.ml index 2c5c67d4e6..b5ca25b178 100644 --- a/typing/typedtreeMap.ml +++ b/typing/typedtreeMap.ml @@ -117,8 +117,8 @@ module MakeMap(Map : MapArgument) = struct Tstr_value (rec_flag, map_bindings rec_flag list) | Tstr_primitive vd -> Tstr_primitive (map_value_description vd) - | Tstr_type (rf, list) -> - Tstr_type (rf, List.map map_type_declaration list) + | Tstr_type list -> + Tstr_type (List.map map_type_declaration list) | Tstr_typext tyext -> Tstr_typext (map_type_extension tyext) | Tstr_exception ext -> @@ -408,7 +408,7 @@ module MakeMap(Map : MapArgument) = struct match item.sig_desc with Tsig_value vd -> Tsig_value (map_value_description vd) - | Tsig_type (rf, list) -> Tsig_type (rf, List.map map_type_declaration list) + | Tsig_type list -> Tsig_type (List.map map_type_declaration list) | Tsig_typext tyext -> Tsig_typext (map_type_extension tyext) | Tsig_exception ext -> diff --git a/typing/typemod.ml b/typing/typemod.ml index 6bc76e940c..f3d46b0496 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -305,6 +305,16 @@ let rec map_rec_type_with_row_types ~rec_flag fn decls rem = else map_rec_type ~rec_flag fn decls rem +let rec_flag_of_ptype_declarations tds = + let is_nonrec = + List.exists + (fun td -> + List.exists (fun (n, _) -> n.txt = "nonrec") + td.ptype_attributes) + tds + in + if is_nonrec then Nonrecursive else Recursive + (* Add type extension flags to extension contructors *) let map_ext fn exts rem = match exts with @@ -353,7 +363,8 @@ and approx_sig env ssg = [] -> [] | item :: srem -> match item.psig_desc with - | Psig_type (rec_flag, sdecls) -> + | Psig_type sdecls -> + let rec_flag = rec_flag_of_ptype_declarations sdecls in let decls = Typedecl.approx_type_decl env sdecls in let rem = approx_sig env srem in map_rec_type ~rec_flag @@ -567,14 +578,15 @@ and transl_signature env sg = (if List.exists (Ident.equal tdesc.val_id) (get_values rem) then rem else Sig_value(tdesc.val_id, tdesc.val_val) :: rem), final_env - | Psig_type (rec_flag, sdecls) -> + | Psig_type sdecls -> + let rec_flag = rec_flag_of_ptype_declarations sdecls in List.iter (fun decl -> check_name "type" type_names decl.ptype_name) sdecls; let (decls, newenv) = Typedecl.transl_type_decl env rec_flag sdecls in let (trem, rem, final_env) = transl_sig newenv srem in - mksig (Tsig_type (rec_flag, decls)) env loc :: trem, + mksig (Tsig_type decls) env loc :: trem, map_rec_type_with_row_types ~rec_flag (fun rs td -> Sig_type(td.typ_id, td.typ_type, rs)) decls rem, final_env @@ -1241,12 +1253,13 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = | Pstr_primitive sdesc -> let (desc, newenv) = Typedecl.transl_value_decl env loc sdesc in Tstr_primitive desc, [Sig_value(desc.val_id, desc.val_val)], newenv - | Pstr_type (rec_flag, sdecls) -> + | Pstr_type sdecls -> + let rec_flag = rec_flag_of_ptype_declarations sdecls in List.iter (fun decl -> check_name "type" type_names decl.ptype_name) sdecls; let (decls, newenv) = Typedecl.transl_type_decl env rec_flag sdecls in - Tstr_type (rec_flag, decls), + Tstr_type decls, map_rec_type_with_row_types ~rec_flag (fun rs info -> Sig_type(info.typ_id, info.typ_type, rs)) decls [], From 48baa3c336c4c34f4fbe8a8111a25d297adc4f57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Dimino?= <jeremie@dimino.org> Date: Mon, 23 Mar 2015 14:13:11 +0000 Subject: [PATCH 177/494] revert ast magic numbers to 4.02.1 numbers git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15951 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- utils/config.mlbuild | 4 ++-- utils/config.mlp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/utils/config.mlbuild b/utils/config.mlbuild index 98cd17c299..c887ac2b4e 100644 --- a/utils/config.mlbuild +++ b/utils/config.mlbuild @@ -66,8 +66,8 @@ and cmo_magic_number = "Caml1999O009" and cma_magic_number = "Caml1999A010" and cmx_magic_number = "Caml1999Y011" and cmxa_magic_number = "Caml1999Z010" -and ast_impl_magic_number = "Caml1999M017" -and ast_intf_magic_number = "Caml1999N016" +and ast_impl_magic_number = "Caml1999M016" +and ast_intf_magic_number = "Caml1999N015" and cmxs_magic_number = "Caml2007D001" and cmt_magic_number = "Caml2012T002" diff --git a/utils/config.mlp b/utils/config.mlp index a603ba06c6..db6fd20ed0 100644 --- a/utils/config.mlp +++ b/utils/config.mlp @@ -54,8 +54,8 @@ and cmo_magic_number = "Caml1999O010" and cma_magic_number = "Caml1999A011" and cmx_magic_number = "Caml1999Y014" and cmxa_magic_number = "Caml1999Z013" -and ast_impl_magic_number = "Caml1999M017" -and ast_intf_magic_number = "Caml1999N016" +and ast_impl_magic_number = "Caml1999M016" +and ast_intf_magic_number = "Caml1999N015" and cmxs_magic_number = "Caml2007D002" and cmt_magic_number = "Caml2012T004" From bd9aef086b1319b0b3b2358b38a50e96bea22e2a Mon Sep 17 00:00:00 2001 From: Alain Frisch <alain@frisch.fr> Date: Tue, 24 Mar 2015 13:07:12 +0000 Subject: [PATCH 178/494] #6583: custom # operators are left associative. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15952 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- parsing/parser.mly | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/parsing/parser.mly b/parsing/parser.mly index f658205d21..0a9a9009ec 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -482,7 +482,8 @@ The precedences must be listed from low to high. %nonassoc prec_constant_constructor /* cf. simple_expr (C versus C x) */ %nonassoc prec_constr_appl /* above AS BAR COLONCOLON COMMA */ %nonassoc below_SHARP -%nonassoc SHARP SHARPOP /* simple_expr/toplevel_directive */ +%nonassoc SHARP /* simple_expr/toplevel_directive */ +%left SHARPOP %nonassoc below_DOT %nonassoc DOT /* Finally, the first tokens of simple_expr are above everything else. */ From be034a1ed2392fb7658f7cf764075653dd9139ec Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 24 Mar 2015 23:01:33 +0000 Subject: [PATCH 179/494] check out the right version of camlp4 for Travis builds git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15955 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- .travis-ci.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis-ci.sh b/.travis-ci.sh index 788c997ade..f6871ce079 100644 --- a/.travis-ci.sh +++ b/.travis-ci.sh @@ -4,7 +4,7 @@ i386) make world.opt sudo make install cd testsuite && make all - git clone git://github.com/ocaml/camlp4 + git clone git://github.com/ocaml/camlp4 -b 4.02 cd camlp4 && ./configure && make && sudo make install git clone git://github.com/ocaml/opam cd opam && ./configure && make lib-ext && make && sudo make install From 61547267a4b4fe98332b8a0278969e38018ba18a Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Wed, 25 Mar 2015 00:44:53 +0000 Subject: [PATCH 180/494] fix wrong output file name for ocamlrund git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15956 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- byterun/Makefile.nt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/byterun/Makefile.nt b/byterun/Makefile.nt index a363669db8..086cc86efd 100644 --- a/byterun/Makefile.nt +++ b/byterun/Makefile.nt @@ -24,7 +24,7 @@ ocamlrun$(EXE): libcamlrun.$(A) prims.$(O) $(EXTRALIBS) libcamlrun.$(A) ocamlrund$(EXE): libcamlrund.$(A) prims.$(O) main.$(O) - $(MKEXE) -o ocamlrun$(EXE) $(BYTECCDBGCOMPOPTS) prims.$(O) \ + $(MKEXE) -o ocamlrund$(EXE) $(BYTECCDBGCOMPOPTS) prims.$(O) \ $(call SYSLIB,ws2_32) $(EXTRALIBS) libcamlrund.$(A) libcamlrun.$(A): $(OBJS) From 0e63e8d28c56a9d9407648f371387a6e4f05ccc1 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Wed, 25 Mar 2015 00:46:34 +0000 Subject: [PATCH 181/494] Makefile.nt: stop in case of error git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15957 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Makefile.nt | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/Makefile.nt b/Makefile.nt index 16b53fe269..0538f2863e 100644 --- a/Makefile.nt +++ b/Makefile.nt @@ -277,7 +277,9 @@ installopt: if test -n "$(WITH_OCAMLDOC)"; then (cd ocamldoc; $(MAKEREC) installopt); fi if test -n "$(WITH_OCAMLBUILD)"; then (cd ocamlbuild; $(MAKE) installopt); \ else :; fi - for i in $(OTHERLIBRARIES); do $(MAKEREC) -C otherlibs/$$i installopt; done + for i in $(OTHERLIBRARIES); do \ + $(MAKEREC) -C otherlibs/$$i installopt || exit $$?; \ + done if test -f ocamlopt.opt ; then $(MAKEREC) installoptopt; fi cd tools; $(MAKE) installopt @@ -659,15 +661,25 @@ alldepend:: # The extra libraries otherlibraries: - for i in $(OTHERLIBRARIES); do $(MAKEREC) -C otherlibs/$$i all; done + for i in $(OTHERLIBRARIES); do \ + $(MAKEREC) -C otherlibs/$$i all || exit $$?; \ + done otherlibrariesopt: - for i in $(OTHERLIBRARIES); do $(MAKEREC) -C otherlibs/$$i allopt; done + for i in $(OTHERLIBRARIES); \ + do $(MAKEREC) -C otherlibs/$$i allopt || exit $$?; \ + done partialclean:: - for i in $(OTHERLIBRARIES); do $(MAKEREC) -C otherlibs/$$i partialclean; done + for i in $(OTHERLIBRARIES); \ + do $(MAKEREC) -C otherlibs/$$i partialclean || exit $$?; \ + done clean:: - for i in $(OTHERLIBRARIES); do $(MAKEREC) -C otherlibs/$$i clean; done + for i in $(OTHERLIBRARIES); do \ + $(MAKEREC) -C otherlibs/$$i clean || exit $$?; \ + done alldepend:: - for i in $(OTHERLIBRARIES); do $(MAKEREC) -C otherlibs/$$i depend; done + for i in $(OTHERLIBRARIES); do \ + $(MAKEREC) -C otherlibs/$$i depend || exit $$?; \ + done # The replay debugger From 48c9ecb458e117d20f553f3dcd80f9bf19f75d1b Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Wed, 25 Mar 2015 00:49:33 +0000 Subject: [PATCH 182/494] PR#6671: Windows: environment variable 'TZ' affects Unix.gettimeofday git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15958 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ otherlibs/win32unix/gettimeofday.c | 38 ++++++------------------------ 2 files changed, 9 insertions(+), 31 deletions(-) diff --git a/Changes b/Changes index 9c1a8083d5..84b4a28767 100644 --- a/Changes +++ b/Changes @@ -70,6 +70,8 @@ Bug fixes: (Stéphane Glondu) - PR#6669: fix 4.02 regression in toplevel printing of lazy values (Leo White, review by Gabriel Scherer) +- PR#6671: Windows: environment variable 'TZ' affects Unix.gettimeofday + (Mickael Delahaye and Damien Doligez) - PR#6680: Missing parens when printing polymorphic variant value in warning - PR#6690: Uncaught exception (Not_found) with (wrong) wildcard or unification type variable in place of a local abstract type diff --git a/otherlibs/win32unix/gettimeofday.c b/otherlibs/win32unix/gettimeofday.c index 573821fd75..211ade2fa8 100644 --- a/otherlibs/win32unix/gettimeofday.c +++ b/otherlibs/win32unix/gettimeofday.c @@ -17,38 +17,14 @@ #include "unixsupport.h" -#ifdef HAS_MKTIME -static double initial_time = 0; /* 0 means uninitialized */ -#else -static time_t initial_time = 0; /* 0 means uninitialized */ -#endif -static DWORD initial_tickcount; +/* Unix epoch as a Windows timestamp in hundreds of ns */ +#define epoch_ft 116444736000000000.0; CAMLprim value unix_gettimeofday(value unit) { - DWORD tickcount = GetTickCount(); - SYSTEMTIME st; - struct tm tm; - if (initial_time == 0 || tickcount < initial_tickcount) { - initial_tickcount = tickcount; -#ifdef HAS_MKTIME - GetLocalTime(&st); - tm.tm_sec = st.wSecond; - tm.tm_min = st.wMinute; - tm.tm_hour = st.wHour; - tm.tm_mday = st.wDay; - tm.tm_mon = st.wMonth - 1; - tm.tm_year = st.wYear - 1900; - tm.tm_wday = 0; - tm.tm_yday = 0; - tm.tm_isdst = -1; - initial_time = ((double) mktime(&tm) + (double) st.wMilliseconds * 1e-3); -#else - initial_time = time(NULL); -#endif - return copy_double((double) initial_time); - } else { - return copy_double((double) initial_time + - (double) (tickcount - initial_tickcount) * 1e-3); - } + FILETIME ft; + double tm; + GetSystemTimeAsFileTime(&ft); + tm = *(uint64 *)&ft - epoch_ft; /* shift to Epoch-relative time */ + return copy_double(tm * 1e-7); /* tm is in 100ns */ } From a2abc28df5fc93d7263c24ea8f032316ece9725e Mon Sep 17 00:00:00 2001 From: Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> Date: Wed, 25 Mar 2015 01:51:45 +0000 Subject: [PATCH 183/494] Fix PR#6817 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15960 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + testsuite/tests/typing-gadts/pr6817.ml | 24 +++++++++++++++++++ .../tests/typing-gadts/pr6817.ml.reference | 9 +++++++ typing/ctype.ml | 2 +- 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 testsuite/tests/typing-gadts/pr6817.ml create mode 100644 testsuite/tests/typing-gadts/pr6817.ml.reference diff --git a/Changes b/Changes index 84b4a28767..ad620ad4f0 100644 --- a/Changes +++ b/Changes @@ -91,6 +91,7 @@ Bug fixes: (Benoît Vaugon) - PR#6799: include guards missing for unixsupport.h and other files - PR#6812: -short-paths and -no-alias-deps can create inconsistent assumptions +- PR#6817: GADT exhaustiveness breakage with modules - GPR#143: fix getsockopt behaviour for boolean socket options (Anil Madhavapeddy and Andrew Ray) - ocamlbuild on cygwin cannot find ocamlfind diff --git a/testsuite/tests/typing-gadts/pr6817.ml b/testsuite/tests/typing-gadts/pr6817.ml new file mode 100644 index 0000000000..73c1f6351e --- /dev/null +++ b/testsuite/tests/typing-gadts/pr6817.ml @@ -0,0 +1,24 @@ +module A = struct + type nil = Cstr + end +open A +;; + +type _ s = + | Nil : nil s + | Cons : 't s -> ('h -> 't) s + +type ('stack, 'typ) var = + | Head : (('typ -> _) s, 'typ) var + | Tail : ('tail s, 'typ) var -> ((_ -> 'tail) s, 'typ) var + +type _ lst = + | CNil : nil lst + | CCons : 'h * ('t lst) -> ('h -> 't) lst +;; + +let rec get_var : type stk ret. (stk s, ret) var -> stk lst -> ret = fun n s -> + match n, s with + | Head, CCons (h, _) -> h + | Tail n', CCons (_, t) -> get_var n' t +;; diff --git a/testsuite/tests/typing-gadts/pr6817.ml.reference b/testsuite/tests/typing-gadts/pr6817.ml.reference new file mode 100644 index 0000000000..ec47bcc99e --- /dev/null +++ b/testsuite/tests/typing-gadts/pr6817.ml.reference @@ -0,0 +1,9 @@ + +# module A : sig type nil = Cstr end +# type _ s = Nil : A.nil s | Cons : 't s -> ('h -> 't) s +type ('stack, 'typ) var = + Head : (('typ -> 'a) s, 'typ) var + | Tail : ('tail s, 'typ) var -> (('b -> 'tail) s, 'typ) var +type _ lst = CNil : A.nil lst | CCons : 'h * 't lst -> ('h -> 't) lst +# val get_var : ('stk s, 'ret) var -> 'stk lst -> 'ret = <fun> +# diff --git a/typing/ctype.ml b/typing/ctype.ml index 0d8a0e3ae6..eba502b6f3 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -2059,7 +2059,7 @@ let rec mcomp type_pairs env t1 t2 = | (Tconstr (p, _, _), _) | (_, Tconstr (p, _, _)) -> begin try let decl = Env.find_type p env in - if non_aliasable p decl then raise (Unify []) + if non_aliasable p decl || is_datatype decl then raise (Unify []) with Not_found -> () end (* From af15f03b42a0a95832bb734c1fd4df4c48dbb7c4 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Wed, 25 Mar 2015 04:14:32 +0000 Subject: [PATCH 184/494] resolve warnings raised by MSVC compiler git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15961 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- VERSION | 2 +- asmrun/Makefile | 2 +- asmrun/Makefile.nt | 2 +- byterun/Makefile | 2 +- byterun/Makefile.nt | 2 +- byterun/backtrace.c | 16 ++++++++-------- byterun/floats.c | 1 + config/Makefile.mingw | 2 +- config/Makefile.mingw64 | 2 +- config/Makefile.msvc | 2 +- config/Makefile.msvc64 | 2 +- configure | 6 ++++++ otherlibs/Makefile | 2 +- otherlibs/systhreads/Makefile | 4 ++-- otherlibs/threads/Makefile | 2 +- tools/Makefile.shared | 9 ++++++++- yacc/Makefile | 2 +- yacc/Makefile.nt | 2 +- 18 files changed, 38 insertions(+), 24 deletions(-) diff --git a/VERSION b/VERSION index a0077bfab3..4e914ef292 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.02.2+dev3-2015-03-03 +4.02.2+dev4-2015-03-25 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli diff --git a/asmrun/Makefile b/asmrun/Makefile index 15732755ce..4a33005fee 100644 --- a/asmrun/Makefile +++ b/asmrun/Makefile @@ -16,7 +16,7 @@ include ../config/Makefile CC=$(NATIVECC) FLAGS=-I../byterun -DCAML_NAME_SPACE -DNATIVE_CODE \ -DTARGET_$(ARCH) -DSYS_$(SYSTEM) $(IFLEXDIR) -CFLAGS=$(FLAGS) -O $(NATIVECCCOMPOPTS) +CFLAGS=$(FLAGS) $(NATIVECCCOMPOPTS) DFLAGS=$(FLAGS) -g -DDEBUG $(NATIVECCCOMPOPTS) PFLAGS=$(FLAGS) -pg -O -DPROFILING $(NATIVECCPROFOPTS) diff --git a/asmrun/Makefile.nt b/asmrun/Makefile.nt index 2b4c090a43..dba8343c94 100644 --- a/asmrun/Makefile.nt +++ b/asmrun/Makefile.nt @@ -69,7 +69,7 @@ win32.$(O): ../byterun/win32.c $(CC) -c $(NATIVECCCOMPOPTS) -DNATIVE_CODE $(IFLEXDIR) ../byterun/win32.c %.$(O): %.c - $(CC) $(CFLAGS) -c -o $@ $< + $(CC) $(CFLAGS) -c $< clean:: rm -f $(LINKEDFILES) diff --git a/byterun/Makefile b/byterun/Makefile index f77ed4956c..e33fb6bc3f 100644 --- a/byterun/Makefile +++ b/byterun/Makefile @@ -13,7 +13,7 @@ include Makefile.common -CFLAGS=-DCAML_NAME_SPACE -O $(BYTECCCOMPOPTS) $(IFLEXDIR) +CFLAGS=-DCAML_NAME_SPACE $(BYTECCCOMPOPTS) $(IFLEXDIR) DFLAGS=-DCAML_NAME_SPACE -g -DDEBUG $(BYTECCCOMPOPTS) $(IFLEXDIR) OBJS=$(COMMONOBJS) $(UNIX_OR_WIN32).o main.o diff --git a/byterun/Makefile.nt b/byterun/Makefile.nt index 086cc86efd..b8932eb70d 100644 --- a/byterun/Makefile.nt +++ b/byterun/Makefile.nt @@ -34,7 +34,7 @@ libcamlrund.$(A): $(DOBJS) $(call MKLIB,libcamlrund.$(A),$(DOBJS)) %.$(O): %.c - $(CC) $(CFLAGS) $(BYTECCCOMPOPTS) -c -o $@ $< + $(CC) $(CFLAGS) $(BYTECCCOMPOPTS) -c $< %.$(DBGO): %.c $(CC) $(CFLAGS) $(BYTECCDBGCOMPOPTS) -c -o $@ $< diff --git a/byterun/backtrace.c b/byterun/backtrace.c index 76e3ddf5af..7787ab28ec 100644 --- a/byterun/backtrace.c +++ b/byterun/backtrace.c @@ -133,17 +133,17 @@ void caml_stash_backtrace(value exn, code_t pc, value * sp, int reraise) #define Codet_Val(v) ((code_t)(Long_val(v)<<1)) /* returns the next frame pointer (or NULL if none is available); - updates *sp to point to the following one, and *trapsp to the next + updates *sp to point to the following one, and *trsp to the next trap frame, which we will skip when we reach it */ -code_t caml_next_frame_pointer(value ** sp, value ** trapsp) +code_t caml_next_frame_pointer(value ** sp, value ** trsp) { code_t end_code = (code_t) ((char *) caml_start_code + caml_code_size); while (*sp < caml_stack_high) { code_t *p = (code_t*) (*sp)++; - if(&Trap_pc(*trapsp) == p) { - *trapsp = Trap_link(*trapsp); + if(&Trap_pc(*trsp) == p) { + *trsp = Trap_link(*trsp); continue; } if (*p >= caml_start_code && *p < end_code) return *p; @@ -170,10 +170,10 @@ CAMLprim value caml_get_current_callstack(value max_frames_value) { /* first compute the size of the trace */ { value * sp = caml_extern_sp; - value * trapsp = caml_trapsp; + value * trsp = caml_trapsp; for (trace_size = 0; trace_size < max_frames; trace_size++) { - code_t p = caml_next_frame_pointer(&sp, &trapsp); + code_t p = caml_next_frame_pointer(&sp, &trsp); if (p == NULL) break; } } @@ -183,11 +183,11 @@ CAMLprim value caml_get_current_callstack(value max_frames_value) { /* then collect the trace */ { value * sp = caml_extern_sp; - value * trapsp = caml_trapsp; + value * trsp = caml_trapsp; uintnat trace_pos; for (trace_pos = 0; trace_pos < trace_size; trace_pos++) { - code_t p = caml_next_frame_pointer(&sp, &trapsp); + code_t p = caml_next_frame_pointer(&sp, &trsp); Assert(p != NULL); Field(trace, trace_pos) = Val_Codet(p); } diff --git a/byterun/floats.c b/byterun/floats.c index 7ff6d89ddd..b67bca1210 100644 --- a/byterun/floats.c +++ b/byterun/floats.c @@ -150,6 +150,7 @@ CAMLprim value caml_float_of_string(value vs) error: if (buf != parse_buffer) caml_stat_free(buf); caml_failwith("float_of_string"); + return Val_unit; /* not reached */ } CAMLprim value caml_int_of_float(value f) diff --git a/config/Makefile.mingw b/config/Makefile.mingw index c204980367..5b4658f71b 100644 --- a/config/Makefile.mingw +++ b/config/Makefile.mingw @@ -68,7 +68,7 @@ X11_INCLUDES= X11_LINK= BYTECCRPATH= SUPPORTS_SHARED_LIBRARIES=true -SHAREDCCCOMPOPTS= +SHAREDCCCOMPOPTS=-O MKSHAREDLIBRPATH= NATIVECCPROFOPTS= NATIVECCRPATH= diff --git a/config/Makefile.mingw64 b/config/Makefile.mingw64 index 0a3bdfbd09..19a9b94376 100644 --- a/config/Makefile.mingw64 +++ b/config/Makefile.mingw64 @@ -68,7 +68,7 @@ X11_INCLUDES= X11_LINK= BYTECCRPATH= SUPPORTS_SHARED_LIBRARIES=true -SHAREDCCCOMPOPTS= +SHAREDCCCOMPOPTS=-O MKSHAREDLIBRPATH= NATIVECCPROFOPTS= NATIVECCRPATH= diff --git a/config/Makefile.msvc b/config/Makefile.msvc index 93cf94b618..e014510230 100644 --- a/config/Makefile.msvc +++ b/config/Makefile.msvc @@ -60,7 +60,7 @@ X11_INCLUDES= X11_LINK= BYTECCRPATH= SUPPORTS_SHARED_LIBRARIES=true -SHAREDCCCOMPOPTS= +SHAREDCCCOMPOPTS=-Ox NATIVECCPROFOPTS= NATIVECCRPATH= ASM=ml -nologo -coff -Cp -c -Fo diff --git a/config/Makefile.msvc64 b/config/Makefile.msvc64 index 1b2e18880d..783ce95340 100644 --- a/config/Makefile.msvc64 +++ b/config/Makefile.msvc64 @@ -60,7 +60,7 @@ X11_INCLUDES= X11_LINK= BYTECCRPATH= SUPPORTS_SHARED_LIBRARIES=true -SHAREDCCCOMPOPTS= +SHAREDCCCOMPOPTS=-Ox NATIVECCPROFOPTS= NATIVECCRPATH= ASM=ml64 -nologo -Cp -c -Fo diff --git a/configure b/configure index 06f8ad4c63..d7e9fad600 100755 --- a/configure +++ b/configure @@ -1660,6 +1660,12 @@ if $no_naked_pointers; then echo "#define NO_NAKED_POINTERS" >> m.h fi +# Add Unix-style optimization flag +bytecccompopts="-O $bytecccompopts" +dllcccompopts="-O $dllcccompopts" +nativecccompopts="-O $nativecccompopts" +sharedcccompopts="-O $sharedcccompopts" + # Final twiddling of compiler options to work around known bugs nativeccprofopts="$nativecccompopts" diff --git a/otherlibs/Makefile b/otherlibs/Makefile index 397497dd55..8f8dc7157a 100644 --- a/otherlibs/Makefile +++ b/otherlibs/Makefile @@ -16,7 +16,7 @@ CAMLC=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib CAMLOPT=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlopt -nostdlib \ -I $(ROOTDIR)/stdlib -CFLAGS=-I$(ROOTDIR)/byterun -O $(SHAREDCCCOMPOPTS) $(EXTRACFLAGS) +CFLAGS=-I$(ROOTDIR)/byterun $(SHAREDCCCOMPOPTS) $(EXTRACFLAGS) include ../Makefile.shared # Note .. is the current directory (this makefile is included from diff --git a/otherlibs/systhreads/Makefile b/otherlibs/systhreads/Makefile index f24af23b67..c0e58d20ac 100644 --- a/otherlibs/systhreads/Makefile +++ b/otherlibs/systhreads/Makefile @@ -34,7 +34,7 @@ libthreads.a: $(BYTECODE_C_OBJS) $(MKLIB) -o threads $(BYTECODE_C_OBJS) $(PTHREAD_LINK) st_stubs_b.o: st_stubs.c st_posix.h - $(BYTECC) -O -I../../byterun $(BYTECCCOMPOPTS) $(SHAREDCCCOMPOPTS) \ + $(BYTECC) -I../../byterun $(BYTECCCOMPOPTS) $(SHAREDCCCOMPOPTS) \ -c st_stubs.c mv st_stubs.o st_stubs_b.o @@ -44,7 +44,7 @@ libthreadsnat.a: $(NATIVECODE_C_OBJS) $(AR) rc libthreadsnat.a $(NATIVECODE_C_OBJS) st_stubs_n.o: st_stubs.c st_posix.h - $(NATIVECC) -O -I../../asmrun -I../../byterun $(NATIVECCCOMPOPTS) \ + $(NATIVECC) -I../../asmrun -I../../byterun $(NATIVECCCOMPOPTS) \ $(SHAREDCCCOMPOPTS) -DNATIVE_CODE -DTARGET_$(ARCH) \ -DSYS_$(SYSTEM) -c st_stubs.c mv st_stubs.o st_stubs_n.o diff --git a/otherlibs/threads/Makefile b/otherlibs/threads/Makefile index 632decc492..a2adad860f 100644 --- a/otherlibs/threads/Makefile +++ b/otherlibs/threads/Makefile @@ -16,7 +16,7 @@ include ../../config/Makefile CC=$(BYTECC) -CFLAGS=-I../../byterun -O $(BYTECCCOMPOPTS) $(SHAREDCCCOMPOPTS) -g +CFLAGS=-I../../byterun $(BYTECCCOMPOPTS) $(SHAREDCCCOMPOPTS) -g ROOTDIR=../.. CAMLC=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlc -nostdlib \ -I $(ROOTDIR)/stdlib -I $(ROOTDIR)/otherlibs/unix diff --git a/tools/Makefile.shared b/tools/Makefile.shared index 251743449f..ebceb05a7a 100644 --- a/tools/Makefile.shared +++ b/tools/Makefile.shared @@ -276,8 +276,15 @@ beforedepend:: opnames.ml # Display info on compiled files +ifeq "$(CCOMPTYPE)" "msvc" +CCOUT = -Fe +else +EMPTY = +CCOUT = -o $(EMPTY) +endif + objinfo_helper$(EXE): objinfo_helper.c ../config/s.h - $(BYTECC) -o objinfo_helper$(EXE) $(BYTECCCOMPOPTS) \ + $(BYTECC) $(CCOUT)objinfo_helper$(EXE) $(BYTECCCOMPOPTS) \ objinfo_helper.c $(LIBBFD_LINK) OBJINFO=../compilerlibs/ocamlcommon.cma \ diff --git a/yacc/Makefile b/yacc/Makefile index f5b37e0008..e7acf86908 100644 --- a/yacc/Makefile +++ b/yacc/Makefile @@ -15,7 +15,7 @@ include ../config/Makefile CC=$(BYTECC) -CFLAGS=-O -DNDEBUG $(BYTECCCOMPOPTS) +CFLAGS=-DNDEBUG $(BYTECCCOMPOPTS) OBJS= closure.o error.o lalr.o lr0.o main.o mkpar.o output.o reader.o \ skeleton.o symtab.o verbose.o warshall.o diff --git a/yacc/Makefile.nt b/yacc/Makefile.nt index b7284055aa..9537365a5f 100644 --- a/yacc/Makefile.nt +++ b/yacc/Makefile.nt @@ -30,7 +30,7 @@ clean: rm -f *.$(O) ocamlyacc.exe *~ version.h %.$(O): %.c - $(BYTECC) -DNDEBUG -DNO_UNIX $(BYTECCCOMPOPTS) -c -o $@ $< + $(BYTECC) -DNDEBUG -DNO_UNIX $(BYTECCCOMPOPTS) -c $< depend: From 5f0945cd84f153ae554f74a726b7b63e2c9e9df8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Dimino?= <jeremie@dimino.org> Date: Wed, 25 Mar 2015 15:48:16 +0000 Subject: [PATCH 185/494] PR#6078: Include signals.h in {nat,}dynlink.c git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15962 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- asmrun/natdynlink.c | 1 + byterun/dynlink.c | 1 + 2 files changed, 2 insertions(+) diff --git a/asmrun/natdynlink.c b/asmrun/natdynlink.c index 58bb659a08..b95f3d6abb 100644 --- a/asmrun/natdynlink.c +++ b/asmrun/natdynlink.c @@ -20,6 +20,7 @@ #include "intext.h" #include "osdeps.h" #include "fail.h" +#include "signals.h" #include <stdio.h> #include <string.h> diff --git a/byterun/dynlink.c b/byterun/dynlink.c index 3bfbf86af6..d8dbbca004 100644 --- a/byterun/dynlink.c +++ b/byterun/dynlink.c @@ -30,6 +30,7 @@ #include "misc.h" #include "osdeps.h" #include "prims.h" +#include "signals.h" #ifndef NATIVE_CODE From 3108c9a41a8448b3f2fb44eebd53eb47ed1ef03d Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Thu, 26 Mar 2015 16:41:09 +0000 Subject: [PATCH 186/494] fix bug reported in https://github.com/ocaml/ocaml/pull/149 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15967 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- typing/subst.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typing/subst.ml b/typing/subst.ml index 2e84be01ff..b21d6befa0 100644 --- a/typing/subst.ml +++ b/typing/subst.ml @@ -306,7 +306,7 @@ let extension_constructor s ext = ext_args = List.map (typexp s) ext.ext_args; ext_ret_type = may_map (typexp s) ext.ext_ret_type; ext_private = ext.ext_private; - ext_attributes = ext.ext_attributes; + ext_attributes = attrs s ext.ext_attributes; ext_loc = if s.for_saving then Location.none else ext.ext_loc; } in cleanup_types (); From b369b8c13d33ecc02e6329aa2d4803ad1ac2b06f Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Thu, 26 Mar 2015 16:49:17 +0000 Subject: [PATCH 187/494] travis-ci: fix "opam already exists" bug git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15969 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- .travis-ci.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis-ci.sh b/.travis-ci.sh index f6871ce079..e34353afb5 100644 --- a/.travis-ci.sh +++ b/.travis-ci.sh @@ -3,11 +3,11 @@ i386) ./configure make world.opt sudo make install - cd testsuite && make all + (cd testsuite && make all) git clone git://github.com/ocaml/camlp4 -b 4.02 - cd camlp4 && ./configure && make && sudo make install + (cd camlp4 && ./configure && make && sudo make install) git clone git://github.com/ocaml/opam - cd opam && ./configure && make lib-ext && make && sudo make install + (cd opam && ./configure && make lib-ext && make && sudo make install) opam init -y -a git://github.com/ocaml/opam-repository opam install -y utop ;; From b275b1f8789d3fe80531c54476ab6364f1702ea8 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Fri, 27 Mar 2015 15:27:39 +0000 Subject: [PATCH 188/494] PR#5395: OCamlbuild mishandles relative symlinks and include paths git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15970 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + ocamlbuild/main.ml | 2 ++ ocamlbuild/my_unix.ml | 6 ++++++ ocamlbuild/ocamlbuild_unix_plugin.ml | 11 ++++++++++- 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index ad620ad4f0..8199a82052 100644 --- a/Changes +++ b/Changes @@ -54,6 +54,7 @@ Runtime: Bug fixes: - PR#5271: Location.prerr_warning is hard-coded to use Format.err_formatter (Damien Doligez, report by Rolf Rolles) +- PR#5395: OCamlbuild mishandles relative symlinks and include paths - PR#5836, PR#6684: printing lazy values in ocamldebug may segfault (Gabriel Scherer) - PR#6573: extern "C" for systhreads/threads.h diff --git a/ocamlbuild/main.ml b/ocamlbuild/main.ml index 8f7d6f76e0..85cae90074 100644 --- a/ocamlbuild/main.ml +++ b/ocamlbuild/main.ml @@ -67,6 +67,8 @@ let builtin_useful_tags = let proceed () = Hooks.call_hook Hooks.Before_options; Options.init (); + Options.include_dirs := List.map Pathname.normalize !Options.include_dirs; + Options.exclude_dirs := List.map Pathname.normalize !Options.exclude_dirs; if !Options.must_clean then clean (); Hooks.call_hook Hooks.After_options; let options_wd = Sys.getcwd () in diff --git a/ocamlbuild/my_unix.ml b/ocamlbuild/my_unix.ml index fa1c5d45f4..5bfbee01af 100644 --- a/ocamlbuild/my_unix.ml +++ b/ocamlbuild/my_unix.ml @@ -84,6 +84,12 @@ let rec readlink x = if sys_file_exists x then try let y = readlinkcmd x in + let y = + if Filename.is_relative y then + Filename.concat (Filename.dirname x) y + else + y + in if (lstat y).stat_file_kind = FK_dir then raise Link_to_directories_not_supported else y with Failure(_) -> raise Not_a_link else raise No_such_file diff --git a/ocamlbuild/ocamlbuild_unix_plugin.ml b/ocamlbuild/ocamlbuild_unix_plugin.ml index 9966c4dc0f..2ed88b99d9 100644 --- a/ocamlbuild/ocamlbuild_unix_plugin.ml +++ b/ocamlbuild/ocamlbuild_unix_plugin.ml @@ -72,13 +72,22 @@ let execute_many = in Ocamlbuild_executor.execute ~exit +(* Ocamlbuild code assumes throughout that [readlink] will return a file name + relative to the current directory. Let's make it so. *) +let myunixreadlink x = + let y = Unix.readlink x in + if Filename.is_relative y then + Filename.concat (Filename.dirname x) y + else + y + let setup () = implem.is_degraded <- false; implem.stdout_isatty <- stdout_isatty; implem.gettimeofday <- Unix.gettimeofday; implem.report_error <- report_error; implem.execute_many <- execute_many; - implem.readlink <- Unix.readlink; + implem.readlink <- myunixreadlink; implem.run_and_open <- run_and_open; implem.at_exit_once <- at_exit_once; implem.is_link <- is_link; From 4f6d31e01b7e5c6014607d8f8c5ee4d83be2d771 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Fri, 27 Mar 2015 21:12:17 +0000 Subject: [PATCH 189/494] warnings: change some wordings and update documentation with new warnings git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15971 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- man/ocamlc.m | 15 ++++++++++++++- man/ocamlopt.m | 3 ++- utils/warnings.ml | 10 +++++----- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/man/ocamlc.m b/man/ocamlc.m index 3b526f7eec..96923483b4 100644 --- a/man/ocamlc.m +++ b/man/ocamlc.m @@ -829,6 +829,18 @@ compilation in any way (even if it is fatal). If a warning is enabled, 45 \ \ Open statement shadows an already defined label or constructor. +46 +\ \ Error in environment variable. + +47 +\ \ Illegal attribute payload. + +48 +\ \ Implicit elimination of optional arguments. + +49 +\ \ Missing cmi file when looking up module alias. + The letters stand for the following sets of warnings. Any letter not mentioned here corresponds to the empty set. @@ -911,7 +923,8 @@ compilation in any way (even if it is fatal). If a warning is enabled, warnings or modify existing warnings. The default setting is -.B \-warn\-error\ -a (all warnings are non-fatal). +.B \-warn\-error \-a +(all warnings are non-fatal). .TP .B \-warn\-help Show the description of all available warning numbers. diff --git a/man/ocamlopt.m b/man/ocamlopt.m index fa3db5df8c..839247962f 100644 --- a/man/ocamlopt.m +++ b/man/ocamlopt.m @@ -600,7 +600,8 @@ Print the version number of the compiler in short form (e.g. "3.11.0"), warnings or modify existing warnings. The default setting is -.B \-warn\-error\ -a (all warnings are non-fatal). +.B \-warn\-error \-a +(all warnings are non-fatal). .TP .B \-warn\-help Show the description of all available warning numbers. diff --git a/utils/warnings.ml b/utils/warnings.ml index 103789c4ed..6c951d2509 100644 --- a/utils/warnings.ml +++ b/utils/warnings.ml @@ -474,24 +474,24 @@ let descriptions = 43, "Nonoptional label applied as optional."; 44, "Open statement shadows an already defined identifier."; 45, "Open statement shadows an already defined label or constructor."; - 46, "Illegal environment variable."; + 46, "Error in environment variable."; 47, "Illegal attribute payload."; 48, "Implicit elimination of optional arguments."; - 49, "Absent cmi file when looking up module alias."; + 49, "Missing cmi file when looking up module alias."; ] ;; let help_warnings () = List.iter (fun (i, s) -> Printf.printf "%3i %s\n" i s) descriptions; - print_endline " A All warnings."; + print_endline " A all warnings"; for i = Char.code 'b' to Char.code 'z' do let c = Char.chr i in match letter c with | [] -> () | [n] -> - Printf.printf " %c Synonym for warning %i.\n" (Char.uppercase c) n + Printf.printf " %c warning %i\n" (Char.uppercase c) n | l -> - Printf.printf " %c Set of warnings %s.\n" + Printf.printf " %c warnings %s.\n" (Char.uppercase c) (String.concat ", " (List.map string_of_int l)) done; From de32bb3715bc507d23991f1f8c8cc6da514541d0 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Fri, 27 Mar 2015 21:23:12 +0000 Subject: [PATCH 190/494] PR#6759: big_int_of_string incorrectly parses some hexa literals git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15972 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 3 +++ otherlibs/num/nat.ml | 8 +++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 8199a82052..153d16b25c 100644 --- a/Changes +++ b/Changes @@ -55,6 +55,7 @@ Bug fixes: - PR#5271: Location.prerr_warning is hard-coded to use Format.err_formatter (Damien Doligez, report by Rolf Rolles) - PR#5395: OCamlbuild mishandles relative symlinks and include paths + (Damien Doligez, report by Didier Le Botlan) - PR#5836, PR#6684: printing lazy values in ocamldebug may segfault (Gabriel Scherer) - PR#6573: extern "C" for systhreads/threads.h @@ -82,6 +83,8 @@ Bug fixes: (Benoît Vaugon, report by Vassili Karpov) - PR#6749: ocamlopt returns n for (n mod 1) instead of 0 (Mark Shinwell and Jérémie Dimino) +- PR#6759: big_int_of_string incorrectly parses some hexa literals. + (Damien Doligez, report by Pierre-yves Strub) - PR#6763: #show with -short-paths doesn't select shortest type paths - PR#6768: Typechecker overflow the stack on cyclic type - PR#6775: Digest.file leaks file descriptor on error diff --git a/otherlibs/num/nat.ml b/otherlibs/num/nat.ml index 90cb471c1b..5ea5fda751 100644 --- a/otherlibs/num/nat.ml +++ b/otherlibs/num/nat.ml @@ -318,6 +318,12 @@ let digits = "0123456789ABCDEF" A la fin de la boucle i-1 est la plus grande puissance de la base qui tient sur un seul digit et j est la plus grande puissance de la base qui tient sur un int. + + This function returns [(pmax, pint)] where: + [pmax] is the index of the digit of [power_base] that contains the + the maximum power of [base] that fits in a digit. This is also one + less than the exponent of that power. + [pint] is the exponent of the maximum power of [base] that fits in an [int]. *) let make_power_base base power_base = let i = ref 0 @@ -329,7 +335,7 @@ let make_power_base base power_base = power_base (pred !i) 1 power_base 0) done; - while !j <= !i && is_digit_int power_base !j do incr j done; + while !j < !i - 1 && is_digit_int power_base !j do incr j done; (!i - 2, !j) (* From f5c21f93d26ba7e8eac427fbbca94bb6c2c3f9d4 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Fri, 27 Mar 2015 21:55:25 +0000 Subject: [PATCH 191/494] PR#6652: ocamlbuild -clean does not print a newline after output git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15973 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 3 ++- ocamlbuild/main.ml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Changes b/Changes index 153d16b25c..184f24a130 100644 --- a/Changes +++ b/Changes @@ -68,6 +68,7 @@ Bug fixes: (Michael Grünewald, Damien Doligez) - PR#6640: ocamlbuild: wrong "unused tag" warning on "precious" (report by user 'william') +- PR#6652: ocamlbuild -clean does not print a newline after output - PR#6665: Failure of tests/asmcomp on sparc (Stéphane Glondu) - PR#6669: fix 4.02 regression in toplevel printing of lazy values @@ -83,7 +84,7 @@ Bug fixes: (Benoît Vaugon, report by Vassili Karpov) - PR#6749: ocamlopt returns n for (n mod 1) instead of 0 (Mark Shinwell and Jérémie Dimino) -- PR#6759: big_int_of_string incorrectly parses some hexa literals. +- PR#6759: big_int_of_string incorrectly parses some hexa literals (Damien Doligez, report by Pierre-yves Strub) - PR#6763: #show with -short-paths doesn't select shortest type paths - PR#6768: Typechecker overflow the stack on cyclic type diff --git a/ocamlbuild/main.ml b/ocamlbuild/main.ml index 85cae90074..50721396f1 100644 --- a/ocamlbuild/main.ml +++ b/ocamlbuild/main.ml @@ -25,7 +25,6 @@ exception Exit_build_error of string exception Exit_silently let clean () = - Log.finish (); Shell.rm_rf !Options.build_dir; if !Options.make_links then begin let entry = @@ -34,6 +33,7 @@ let clean () = in Slurp.force (Resource.clean_up_links entry) end; + Log.finish (); raise Exit_silently ;; From 3916618fc20aa9afe6dacd70151d3652d2075e76 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Mon, 30 Mar 2015 15:59:14 +0000 Subject: [PATCH 192/494] PR#6758: Ocamldoc fails with "analyse_module: parsetree and typedtree don't match" git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15974 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + ocamldoc/odoc_ast.ml | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 184f24a130..fcccad7591 100644 --- a/Changes +++ b/Changes @@ -84,6 +84,7 @@ Bug fixes: (Benoît Vaugon, report by Vassili Karpov) - PR#6749: ocamlopt returns n for (n mod 1) instead of 0 (Mark Shinwell and Jérémie Dimino) +- PR#6758: Ocamldoc "analyse_module: parsetree and typedtree don't match" - PR#6759: big_int_of_string incorrectly parses some hexa literals (Damien Doligez, report by Pierre-yves Strub) - PR#6763: #show with -short-paths doesn't select shortest type paths diff --git a/ocamldoc/odoc_ast.ml b/ocamldoc/odoc_ast.ml index 18723b7532..2e6d1ded69 100644 --- a/ocamldoc/odoc_ast.ml +++ b/ocamldoc/odoc_ast.ml @@ -1718,7 +1718,11 @@ module Analyser = } in match (p_module_expr.Parsetree.pmod_desc, tt_module_expr.Typedtree.mod_desc) with - (Parsetree.Pmod_ident longident, Typedtree.Tmod_ident (path, _)) -> + (Parsetree.Pmod_ident longident, Typedtree.Tmod_ident (path, _)) + | (Parsetree.Pmod_ident longident, + Typedtree.Tmod_constraint + ({Typedtree.mod_desc = Typedtree.Tmod_ident (path, _)}, _, _, _)) + -> let alias_name = Odoc_env.full_module_name env (Name.from_path path) in { m_base with m_kind = Module_alias { ma_name = alias_name ; ma_module = None ; } } @@ -1868,6 +1872,7 @@ module Analyser = (*DEBUG*) | Parsetree.Pmod_apply _ -> "Pmod_apply" (*DEBUG*) | Parsetree.Pmod_constraint _ -> "Pmod_constraint" (*DEBUG*) | Parsetree.Pmod_unpack _ -> "Pmod_unpack" + (*DEBUG*) | Parsetree.Pmod_extension _ -> "Pmod_extension" (*DEBUG*)in (*DEBUG*)let s_typed = (*DEBUG*) match typedtree with From b026c2743f37a9d140704332c7a86c10fa9f5bfe Mon Sep 17 00:00:00 2001 From: Fabrice Le Fessant <Fabrice.Le_fessant@inria.fr> Date: Wed, 1 Apr 2015 10:04:36 +0000 Subject: [PATCH 193/494] Cosmetic changes to decrease OCamlPro's patch git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15976 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- driver/compenv.ml | 14 +++++---- driver/compenv.mli | 8 +++++- driver/compile.ml | 68 ++++++++++++++++++++------------------------ driver/optcompile.ml | 16 ++++------- driver/pparse.ml | 18 ++++++++---- driver/pparse.mli | 5 ++++ 6 files changed, 69 insertions(+), 60 deletions(-) diff --git a/driver/compenv.ml b/driver/compenv.ml index 82704fd8f9..4e2e17f873 100644 --- a/driver/compenv.ml +++ b/driver/compenv.ml @@ -56,26 +56,28 @@ let first_objfiles = ref [] let last_objfiles = ref [] (* Check validity of module name *) -let check_unit_name ppf filename name = +let is_unit_name name = try begin match name.[0] with | 'A'..'Z' -> () | _ -> - Location.print_warning (Location.in_file filename) ppf - (Warnings.Bad_module_name name); raise Exit; end; for i = 1 to String.length name - 1 do match name.[i] with | 'A'..'Z' | 'a'..'z' | '0'..'9' | '_' | '\'' -> () | _ -> - Location.print_warning (Location.in_file filename) ppf - (Warnings.Bad_module_name name); raise Exit; done; - with Exit -> () + true + with Exit -> false ;; +let check_unit_name ppf filename name = + if not (is_unit_name name) then + Location.print_warning (Location.in_file filename) ppf + (Warnings.Bad_module_name name);; + (* Compute name of module from output file name *) let module_of_filename ppf inputfile outputprefix = let basename = Filename.basename outputprefix in diff --git a/driver/compenv.mli b/driver/compenv.mli index 85d588ef6e..59cd10124f 100644 --- a/driver/compenv.mli +++ b/driver/compenv.mli @@ -10,7 +10,6 @@ (* *) (***********************************************************************) -(* val check_unit_name : Format.formatter -> string -> string -> unit *) val module_of_filename : Format.formatter -> string -> string -> string val output_prefix : string -> string @@ -35,3 +34,10 @@ type readenv_position = Before_args | Before_compile | Before_link val readenv : Format.formatter -> readenv_position -> unit + +(* [is_unit_name name] returns true only if [name] can be used as a + correct module name *) +val is_unit_name : string -> bool +(* [check_unit_name ppf filename name] prints a warning in [filename] + on [ppf] if [name] should not be used as a module name. *) +val check_unit_name : Format.formatter -> string -> string -> unit diff --git a/driver/compile.ml b/driver/compile.ml index 3b5d2ae077..9edfb80456 100644 --- a/driver/compile.ml +++ b/driver/compile.ml @@ -60,50 +60,44 @@ let implementation ppf sourcefile outputprefix = let modulename = module_of_filename ppf sourcefile outputprefix in Env.set_unit_name modulename; let env = Compmisc.initial_env() in - if !Clflags.print_types then begin - let comp ast = - ast + try + let (typedtree, coercion) = + Pparse.parse_implementation ~tool_name ppf sourcefile ++ print_if ppf Clflags.dump_parsetree Printast.implementation ++ print_if ppf Clflags.dump_source Pprintast.structure ++ Typemod.type_implementation sourcefile outputprefix modulename env ++ print_if ppf Clflags.dump_typedtree - Printtyped.implementation_with_coercion - ++ (fun _ -> ()); - Warnings.check_fatal (); - Stypes.dump (Some (outputprefix ^ ".annot")) + Printtyped.implementation_with_coercion in - try comp (Pparse.parse_implementation ~tool_name ppf sourcefile) - with x -> - Stypes.dump (Some (outputprefix ^ ".annot")); - raise x - end else begin - let objfile = outputprefix ^ ".cmo" in - let oc = open_out_bin objfile in - let comp ast = - ast - ++ print_if ppf Clflags.dump_parsetree Printast.implementation - ++ print_if ppf Clflags.dump_source Pprintast.structure - ++ Typemod.type_implementation sourcefile outputprefix modulename env - ++ print_if ppf Clflags.dump_typedtree - Printtyped.implementation_with_coercion - ++ Translmod.transl_implementation modulename - ++ print_if ppf Clflags.dump_rawlambda Printlambda.lambda - ++ Simplif.simplify_lambda - ++ print_if ppf Clflags.dump_lambda Printlambda.lambda - ++ Bytegen.compile_implementation modulename - ++ print_if ppf Clflags.dump_instr Printinstr.instrlist - ++ Emitcode.to_file oc modulename objfile; + if !Clflags.print_types then begin Warnings.check_fatal (); - close_out oc; Stypes.dump (Some (outputprefix ^ ".annot")) - in - try comp (Pparse.parse_implementation ~tool_name ppf sourcefile) - with x -> - close_out oc; - remove_file objfile; - Stypes.dump (Some (outputprefix ^ ".annot")); - raise x - end + end else begin + let bytecode = + (typedtree, coercion) + ++ Translmod.transl_implementation modulename + ++ print_if ppf Clflags.dump_rawlambda Printlambda.lambda + ++ Simplif.simplify_lambda + ++ print_if ppf Clflags.dump_lambda Printlambda.lambda + ++ Bytegen.compile_implementation modulename + ++ print_if ppf Clflags.dump_instr Printinstr.instrlist + in + let objfile = outputprefix ^ ".cmo" in + let oc = open_out_bin objfile in + try + bytecode + ++ Emitcode.to_file oc modulename objfile; + Warnings.check_fatal (); + close_out oc; + Stypes.dump (Some (outputprefix ^ ".annot")) + with x -> + close_out oc; + remove_file objfile; + raise x + end + with x -> + Stypes.dump (Some (outputprefix ^ ".annot")); + raise x let c_file name = Location.input_name := name; diff --git a/driver/optcompile.ml b/driver/optcompile.ml index f0ef78d1cb..9a5f3b9357 100644 --- a/driver/optcompile.ml +++ b/driver/optcompile.ml @@ -66,22 +66,16 @@ let implementation ppf sourcefile outputprefix = let cmxfile = outputprefix ^ ".cmx" in let objfile = outputprefix ^ ext_obj in let comp ast = - if !Clflags.print_types - then + let (typedtree, coercion) = ast ++ print_if ppf Clflags.dump_parsetree Printast.implementation ++ print_if ppf Clflags.dump_source Pprintast.structure ++ Typemod.type_implementation sourcefile outputprefix modulename env ++ print_if ppf Clflags.dump_typedtree - Printtyped.implementation_with_coercion - ++ (fun _ -> ()) - else begin - ast - ++ print_if ppf Clflags.dump_parsetree Printast.implementation - ++ print_if ppf Clflags.dump_source Pprintast.structure - ++ Typemod.type_implementation sourcefile outputprefix modulename env - ++ print_if ppf Clflags.dump_typedtree - Printtyped.implementation_with_coercion + Printtyped.implementation_with_coercion + in + if not !Clflags.print_types then begin + (typedtree, coercion) ++ Translmod.transl_store_implementation modulename +++ print_if ppf Clflags.dump_rawlambda Printlambda.lambda +++ Simplif.simplify_lambda diff --git a/driver/pparse.ml b/driver/pparse.ml index 4b2553f272..b67c1805d3 100644 --- a/driver/pparse.ml +++ b/driver/pparse.ml @@ -20,10 +20,7 @@ exception Error of error (* Optionally preprocess a source file *) -let preprocess sourcefile = - match !Clflags.preprocessor with - None -> sourcefile - | Some pp -> +let call_external_preprocessor sourcefile pp = let tmpfile = Filename.temp_file "ocamlpp" "" in let comm = Printf.sprintf "%s %s > %s" pp (Filename.quote sourcefile) tmpfile @@ -34,6 +31,12 @@ let preprocess sourcefile = end; tmpfile +let preprocess sourcefile = + match !Clflags.preprocessor with + None -> sourcefile + | Some pp -> call_external_preprocessor sourcefile pp + + let remove_preprocessed inputfile = match !Clflags.preprocessor with None -> () @@ -124,7 +127,7 @@ let apply_rewriters ?restore ~tool_name magic ast = exception Outdated_version -let file ppf ~tool_name inputfile parse_fun ast_magic = +let open_and_check_magic inputfile ast_magic = let ic = open_in_bin inputfile in let is_ast_file = try @@ -138,6 +141,10 @@ let file ppf ~tool_name inputfile parse_fun ast_magic = Misc.fatal_error "OCaml and preprocessor have incompatible versions" | _ -> false in + (ic, is_ast_file) + +let file ppf ~tool_name inputfile parse_fun ast_magic = + let (ic, is_ast_file) = open_and_check_magic inputfile ast_magic in let ast = try if is_ast_file then begin @@ -159,6 +166,7 @@ let file ppf ~tool_name inputfile parse_fun ast_magic = close_in ic; apply_rewriters ~restore:false ~tool_name ast_magic ast + let report_error ppf = function | CannotRun cmd -> fprintf ppf "Error while running external preprocessor@.\ diff --git a/driver/pparse.mli b/driver/pparse.mli index bcff4e7815..6497698939 100644 --- a/driver/pparse.mli +++ b/driver/pparse.mli @@ -34,3 +34,8 @@ val report_error : formatter -> error -> unit val parse_implementation: formatter -> tool_name:string -> string -> Parsetree.structure val parse_interface: formatter -> tool_name:string -> string -> Parsetree.signature + +(* [call_external_preprocessor sourcefile pp] *) +val call_external_preprocessor : string -> string -> string +val open_and_check_magic : string -> string -> in_channel * bool +val read_ast : string -> string -> 'a From bc5ef954c3343806b20260d6b10523adb92c32d1 Mon Sep 17 00:00:00 2001 From: Fabrice Le Fessant <Fabrice.Le_fessant@inria.fr> Date: Wed, 1 Apr 2015 17:35:18 +0000 Subject: [PATCH 194/494] Cosmetic changes to decrease OCamlPro's patch #2 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15978 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- byterun/callback.c | 11 ++++++++ byterun/callback.h | 2 ++ byterun/fix_code.c | 66 +++++++++++++++++++++++++++++----------------- byterun/major_gc.c | 3 +++ byterun/md5.c | 14 ++++++---- byterun/sys.c | 2 +- 6 files changed, 68 insertions(+), 30 deletions(-) diff --git a/byterun/callback.c b/byterun/callback.c index 5da37ec9a9..476a043715 100644 --- a/byterun/callback.c +++ b/byterun/callback.c @@ -245,3 +245,14 @@ CAMLexport value * caml_named_value(char const *name) } return NULL; } + +CAMLexport void caml_iterate_named_values(caml_named_action f) +{ + int i; + for(i = 0; i < Named_value_size; i++){ + struct named_value * nv; + for (nv = named_value_table[i]; nv != NULL; nv = nv->next) { + f( &nv->val, nv->name ); + } + } +} diff --git a/byterun/callback.h b/byterun/callback.h index ded0b9801c..ef50945cfc 100644 --- a/byterun/callback.h +++ b/byterun/callback.h @@ -42,6 +42,8 @@ CAMLextern value caml_callbackN_exn (value closure, int narg, value args[]); #define Extract_exception(v) ((v) & ~3) CAMLextern value * caml_named_value (char const * name); +typedef void (*caml_named_action) (value*, char *); +CAMLextern void caml_iterate_named_values(caml_named_action f); CAMLextern void caml_main (char ** argv); CAMLextern void caml_startup (char ** argv); diff --git a/byterun/fix_code.c b/byterun/fix_code.c index 3380dc9195..d98495aa10 100644 --- a/byterun/fix_code.c +++ b/byterun/fix_code.c @@ -95,33 +95,44 @@ void caml_fixup_endianness(code_t code, asize_t len) char ** caml_instr_table; char * caml_instr_base; -void caml_thread_code (code_t code, asize_t len) +static int* opcode_nargs = NULL; +int* caml_init_opcode_nargs() { - code_t p; - int l [FIRST_UNIMPLEMENTED_OP]; - int i; + if( opcode_nargs == NULL ){ + int* l = (int*)caml_stat_alloc(sizeof(int) * FIRST_UNIMPLEMENTED_OP); + int i; - for (i = 0; i < FIRST_UNIMPLEMENTED_OP; i++) { - l [i] = 0; + for (i = 0; i < FIRST_UNIMPLEMENTED_OP; i++) { + l [i] = 0; + } + /* Instructions with one operand */ + l[PUSHACC] = l[ACC] = l[POP] = l[ASSIGN] = + l[PUSHENVACC] = l[ENVACC] = l[PUSH_RETADDR] = l[APPLY] = + l[APPTERM1] = l[APPTERM2] = l[APPTERM3] = l[RETURN] = + l[GRAB] = l[PUSHGETGLOBAL] = l[GETGLOBAL] = l[SETGLOBAL] = + l[PUSHATOM] = l[ATOM] = l[MAKEBLOCK1] = l[MAKEBLOCK2] = + l[MAKEBLOCK3] = l[MAKEFLOATBLOCK] = l[GETFIELD] = + l[GETFLOATFIELD] = l[SETFIELD] = l[SETFLOATFIELD] = + l[BRANCH] = l[BRANCHIF] = l[BRANCHIFNOT] = l[PUSHTRAP] = + l[C_CALL1] = l[C_CALL2] = l[C_CALL3] = l[C_CALL4] = l[C_CALL5] = + l[CONSTINT] = l[PUSHCONSTINT] = l[OFFSETINT] = + l[OFFSETREF] = l[OFFSETCLOSURE] = l[PUSHOFFSETCLOSURE] = 1; + + /* Instructions with two operands */ + l[APPTERM] = l[CLOSURE] = l[PUSHGETGLOBALFIELD] = + l[GETGLOBALFIELD] = l[MAKEBLOCK] = l[C_CALLN] = + l[BEQ] = l[BNEQ] = l[BLTINT] = l[BLEINT] = l[BGTINT] = l[BGEINT] = + l[BULTINT] = l[BUGEINT] = l[GETPUBMET] = 2; + + opcode_nargs = l; } - /* Instructions with one operand */ - l[PUSHACC] = l[ACC] = l[POP] = l[ASSIGN] = - l[PUSHENVACC] = l[ENVACC] = l[PUSH_RETADDR] = l[APPLY] = - l[APPTERM1] = l[APPTERM2] = l[APPTERM3] = l[RETURN] = - l[GRAB] = l[PUSHGETGLOBAL] = l[GETGLOBAL] = l[SETGLOBAL] = - l[PUSHATOM] = l[ATOM] = l[MAKEBLOCK1] = l[MAKEBLOCK2] = - l[MAKEBLOCK3] = l[MAKEFLOATBLOCK] = l[GETFIELD] = - l[GETFLOATFIELD] = l[SETFIELD] = l[SETFLOATFIELD] = - l[BRANCH] = l[BRANCHIF] = l[BRANCHIFNOT] = l[PUSHTRAP] = - l[C_CALL1] = l[C_CALL2] = l[C_CALL3] = l[C_CALL4] = l[C_CALL5] = - l[CONSTINT] = l[PUSHCONSTINT] = l[OFFSETINT] = - l[OFFSETREF] = l[OFFSETCLOSURE] = l[PUSHOFFSETCLOSURE] = 1; - - /* Instructions with two operands */ - l[APPTERM] = l[CLOSURE] = l[PUSHGETGLOBALFIELD] = - l[GETGLOBALFIELD] = l[MAKEBLOCK] = l[C_CALLN] = - l[BEQ] = l[BNEQ] = l[BLTINT] = l[BLEINT] = l[BGTINT] = l[BGEINT] = - l[BULTINT] = l[BUGEINT] = l[GETPUBMET] = 2; + return opcode_nargs; +} + +void caml_thread_code (code_t code, asize_t len) +{ + code_t p; + int* l = caml_init_opcode_nargs(); len /= sizeof(opcode_t); for (p = code; p < code + len; /*nothing*/) { opcode_t instr = *p; @@ -149,6 +160,13 @@ void caml_thread_code (code_t code, asize_t len) Assert(p == code + len); } +#else + +int* caml_init_opcode_nargs() +{ + return NULL; +} + #endif /* THREADED_CODE */ void caml_set_instruction(code_t pos, opcode_t instr) diff --git a/byterun/major_gc.c b/byterun/major_gc.c index eb7f3d0b62..a60193dd0f 100644 --- a/byterun/major_gc.c +++ b/byterun/major_gc.c @@ -59,6 +59,8 @@ static value *weak_prev; static unsigned long major_gc_counter = 0; #endif +void (*caml_major_gc_hook)(void) = NULL; + static void realloc_gray_vals (void) { value *new; @@ -308,6 +310,7 @@ static void mark_slice (intnat work) limit = chunk + Chunk_size (chunk); work = 0; caml_fl_size_at_phase_change = caml_fl_cur_size; + if (caml_major_gc_hook) (*caml_major_gc_hook)(); } break; default: Assert (0); diff --git a/byterun/md5.c b/byterun/md5.c index 10ac76abc3..f9508d53f6 100644 --- a/byterun/md5.c +++ b/byterun/md5.c @@ -33,18 +33,16 @@ CAMLprim value caml_md5_string(value str, value ofs, value len) return res; } -CAMLprim value caml_md5_chan(value vchan, value len) +CAMLexport value caml_md5_channel(struct channel *chan, intnat toread) { - CAMLparam2 (vchan, len); - struct channel * chan = Channel(vchan); + CAMLparam0(); struct MD5Context ctx; value res; - intnat toread, read; + intnat read; char buffer[4096]; Lock(chan); caml_MD5Init(&ctx); - toread = Long_val(len); if (toread < 0){ while (1){ read = caml_getblock (chan, buffer, sizeof(buffer)); @@ -66,6 +64,12 @@ CAMLprim value caml_md5_chan(value vchan, value len) CAMLreturn (res); } +CAMLprim value caml_md5_chan(value vchan, value len) +{ + CAMLparam2 (vchan, len); + CAMLreturn (caml_md5_channel(Channel(vchan), Long_val(len))); +} + CAMLexport void caml_md5_block(unsigned char digest[16], void * data, uintnat len) { diff --git a/byterun/sys.c b/byterun/sys.c index 03ca1e3e34..059d4407e9 100644 --- a/byterun/sys.c +++ b/byterun/sys.c @@ -268,7 +268,7 @@ CAMLprim value caml_sys_getenv(value var) } char * caml_exe_name; -static char ** caml_main_argv; +char ** caml_main_argv; CAMLprim value caml_sys_get_argv(value unit) { From e5e607f113863fa078281f93f99396e24ada3bf3 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Thu, 2 Apr 2015 04:00:38 +0000 Subject: [PATCH 195/494] PR#6658: cross-compiler: version check not working on OS X git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15981 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + configure | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Changes b/Changes index fcccad7591..c619ae2cde 100644 --- a/Changes +++ b/Changes @@ -69,6 +69,7 @@ Bug fixes: - PR#6640: ocamlbuild: wrong "unused tag" warning on "precious" (report by user 'william') - PR#6652: ocamlbuild -clean does not print a newline after output +- PR#6658: cross-compiler: version check not working on OS X - PR#6665: Failure of tests/asmcomp on sparc (Stéphane Glondu) - PR#6669: fix 4.02 regression in toplevel printing of lazy values diff --git a/configure b/configure index d7e9fad600..4dbd213188 100755 --- a/configure +++ b/configure @@ -466,8 +466,8 @@ if test x"$target" != x"$host"; then "(the ocamlrun binary). Moreover, its version must be the same\n" \ "as the one you're trying to build (`cut -f1 -d+ < ../../VERSION`)." else - ocaml_system_version=`ocamlrun -version | sed 's/[^0-9]*\([0-9.]\+\).*/\1/'` - ocaml_source_version=`sed -n '1 s/\([0-9\.]\+\).*/\1/ p' < ../../VERSION` + ocaml_system_version=`ocamlrun -version | sed 's/[^0-9]*\([0-9.]*\).*/\1/'` + ocaml_source_version=`sed -n '1 s/\([0-9\.]*\).*/\1/ p' < ../../VERSION` if test x"$ocaml_system_version" != x"$ocaml_source_version"; then err "While you have an ocaml runtime environment, its version\n" \ "($ocaml_system_version) doesn't match the version of these sources\n" \ From 74aee418a16ed41a33b607cc051063ea551ea6a1 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Thu, 2 Apr 2015 16:11:42 +0000 Subject: [PATCH 196/494] use the official name of Jane Street in headers git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15983 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- config/auto-aux/nanosecond_stat.c | 2 +- otherlibs/unix/nanosecond_stat.h | 2 +- testsuite/tests/misc/weaklifetime.ml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config/auto-aux/nanosecond_stat.c b/config/auto-aux/nanosecond_stat.c index 5451126a4b..fc92e67b9c 100644 --- a/config/auto-aux/nanosecond_stat.c +++ b/config/auto-aux/nanosecond_stat.c @@ -2,7 +2,7 @@ /* */ /* OCaml */ /* */ -/* Jeremie Dimino, Jane Street Capital */ +/* Jeremie Dimino, Jane Street Group, LLC */ /* */ /* Copyright 2015 Institut National de Recherche en Informatique et */ /* en Automatique. All rights reserved. This file is distributed */ diff --git a/otherlibs/unix/nanosecond_stat.h b/otherlibs/unix/nanosecond_stat.h index e545ee712e..c1a648ef12 100644 --- a/otherlibs/unix/nanosecond_stat.h +++ b/otherlibs/unix/nanosecond_stat.h @@ -2,7 +2,7 @@ /* */ /* OCaml */ /* */ -/* Jeremie Dimino, Jane Street Capital */ +/* Jeremie Dimino, Jane Street Group, LLC */ /* */ /* Copyright 2015 Institut National de Recherche en Informatique et */ /* en Automatique. All rights reserved. This file is distributed */ diff --git a/testsuite/tests/misc/weaklifetime.ml b/testsuite/tests/misc/weaklifetime.ml index bc6d0f7348..d6b23f3d22 100644 --- a/testsuite/tests/misc/weaklifetime.ml +++ b/testsuite/tests/misc/weaklifetime.ml @@ -2,7 +2,7 @@ (* *) (* OCaml *) (* *) -(* Damien Doligez, Jane Street Capital *) +(* Damien Doligez, Jane Street Group, LLC *) (* *) (* Copyright 2015 Institut National de Recherche en Informatique et *) (* en Automatique. All rights reserved. This file is distributed *) From 2b55561b88e93edb6a0bfff766feb71f1fe7f57c Mon Sep 17 00:00:00 2001 From: Fabrice Le Fessant <Fabrice.Le_fessant@inria.fr> Date: Fri, 3 Apr 2015 16:59:28 +0000 Subject: [PATCH 197/494] Cosmetic changes to decrease OCamlPro's patch #3 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15985 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- asmrun/backtrace.c | 19 +++++-------------- asmrun/stack.h | 13 +++++++++++++ typing/subst.mli | 2 ++ typing/typemod.ml | 5 ++++- typing/typemod.mli | 2 ++ 5 files changed, 26 insertions(+), 15 deletions(-) diff --git a/asmrun/backtrace.c b/asmrun/backtrace.c index 05e0d6b2a7..a73aeb12f9 100644 --- a/asmrun/backtrace.c +++ b/asmrun/backtrace.c @@ -204,17 +204,8 @@ CAMLprim value caml_get_current_callstack(value max_frames_value) { /* Extract location information for the given frame descriptor */ -struct loc_info { - int loc_valid; - int loc_is_raise; - char * loc_filename; - int loc_lnum; - int loc_startchr; - int loc_endchr; -}; - -static void extract_location_info(frame_descr * d, - /*out*/ struct loc_info * li) +CAMLexport void extract_location_info(frame_descr * d, + /*out*/ struct caml_loc_info * li) { uintnat infoptr; uint32 info1, info2; @@ -260,7 +251,7 @@ static void extract_location_info(frame_descr * d, useless. We kept it to keep code identical to the byterun/ implementation. */ -static void print_location(struct loc_info * li, int index) +static void print_location(struct caml_loc_info * li, int index) { char * info; @@ -293,7 +284,7 @@ static void print_location(struct loc_info * li, int index) void caml_print_exception_backtrace(void) { int i; - struct loc_info li; + struct caml_loc_info li; for (i = 0; i < caml_backtrace_pos; i++) { extract_location_info((frame_descr *) (caml_backtrace_buffer[i]), &li); @@ -306,7 +297,7 @@ void caml_print_exception_backtrace(void) CAMLprim value caml_convert_raw_backtrace_slot(value backtrace_slot) { CAMLparam1(backtrace_slot); CAMLlocal2(p, fname); - struct loc_info li; + struct caml_loc_info li; extract_location_info(Descrptr_Val(backtrace_slot), &li); diff --git a/asmrun/stack.h b/asmrun/stack.h index 92b3c28a35..6e55942926 100644 --- a/asmrun/stack.h +++ b/asmrun/stack.h @@ -78,6 +78,15 @@ typedef struct { unsigned short live_ofs[1]; } frame_descr; +struct caml_loc_info { + int loc_valid; + int loc_is_raise; + char * loc_filename; + int loc_lnum; + int loc_startchr; + int loc_endchr; +}; + /* Hash table of frame descriptors */ extern frame_descr ** caml_frame_descriptors; @@ -90,6 +99,10 @@ extern void caml_init_frame_descriptors(void); extern void caml_register_frametable(intnat *); extern void caml_register_dyn_global(void *); +CAMLextern void extract_location_info(frame_descr * d, + /*out*/ struct caml_loc_info * li); + + extern uintnat caml_stack_usage (void); extern uintnat (*caml_stack_usage_hook)(void); diff --git a/typing/subst.mli b/typing/subst.mli index a197f82f48..7f6870e939 100644 --- a/typing/subst.mli +++ b/typing/subst.mli @@ -51,6 +51,8 @@ val modtype: t -> module_type -> module_type val signature: t -> signature -> signature val modtype_declaration: t -> modtype_declaration -> modtype_declaration val module_declaration: t -> module_declaration -> module_declaration +val typexp : t -> Types.type_expr -> Types.type_expr +val class_signature: t -> class_signature -> class_signature (* Composition of substitutions: apply (compose s1 s2) x = apply s2 (apply s1 x) *) diff --git a/typing/typemod.ml b/typing/typemod.ml index f3d46b0496..bd5ed8138c 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -870,6 +870,9 @@ let rec path_of_module mexp = path_of_module mexp | _ -> raise Not_a_path +let path_of_module mexp = + try Some (path_of_module mexp) with Not_a_path -> None + (* Check that all core type schemes in a structure are closed *) let rec closed_modtype = function @@ -1134,7 +1137,7 @@ let rec type_module ?(alias=false) sttn funct_body anchor env smod = mod_loc = smod.pmod_loc } | Pmod_apply(sfunct, sarg) -> let arg = type_module true funct_body None env sarg in - let path = try Some (path_of_module arg) with Not_a_path -> None in + let path = path_of_module arg in let funct = type_module (sttn && path <> None) funct_body None env sfunct in begin match Env.scrape_alias env funct.mod_type with diff --git a/typing/typemod.mli b/typing/typemod.mli index 8895017885..a658d2e432 100644 --- a/typing/typemod.mli +++ b/typing/typemod.mli @@ -38,6 +38,8 @@ val type_open_: val simplify_signature: signature -> signature +val path_of_module : Typedtree.module_expr -> Path.t option + val save_signature: string -> Typedtree.signature -> string -> string -> Env.t -> Types.signature_item list -> unit From b3ec8e2f815bd9bd5b7d29bc19458d9c5a83c477 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sat, 11 Apr 2015 17:40:47 +0000 Subject: [PATCH 198/494] =?UTF-8?q?PR#6774:=20new=20menhir-specific=20flag?= =?UTF-8?q?s=20"only=5Ftokens"=20and=20"external=5Ftokens(Foo)"=20(Fran?= =?UTF-8?q?=C3=A7ois=20Pottier)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15994 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ ocamlbuild/ocaml_specific.ml | 12 +++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index c619ae2cde..69495a8536 100644 --- a/Changes +++ b/Changes @@ -33,6 +33,8 @@ OCamlbuild: (Peter Zotov) - PR#6720: pass -g to C compilers when tag 'debug' is set (Peter Zotov, Gabriel Scherer) +- PR#6774: new menhir-specific flags "only_tokens" and "external_tokens(Foo)" + (François Pottier) Libraries: - PR#6781: Add higher baud rates to Unix termios diff --git a/ocamlbuild/ocaml_specific.ml b/ocamlbuild/ocaml_specific.ml index 1d0b8a8e47..2c72b8b314 100644 --- a/ocamlbuild/ocaml_specific.ml +++ b/ocamlbuild/ocaml_specific.ml @@ -527,12 +527,22 @@ end;; flag ["ocaml"; "ocamlyacc"] (atomize !Options.ocaml_yaccflags);; flag ["ocaml"; "menhir"] (atomize !Options.ocaml_yaccflags);; flag ["ocaml"; "doc"] (atomize !Options.ocaml_docflags);; +flag ["ocaml"; "ocamllex"] (atomize !Options.ocaml_lexflags);; (* Tell menhir to explain conflicts *) flag [ "ocaml" ; "menhir" ; "explain" ] (S[A "--explain"]);; flag [ "ocaml" ; "menhir" ; "infer" ] (S[A "--infer"]);; -flag ["ocaml"; "ocamllex"] (atomize !Options.ocaml_lexflags);; +(* Define two ocamlbuild flags [only_tokens] and [external_tokens(Foo)] + which correspond to menhir's [--only-tokens] and [--external-tokens Foo]. + When they are used, these flags should be passed both to [menhir] and to + [menhir --raw-depend]. *) +let () = + List.iter begin fun mode -> + flag [ mode; "only_tokens" ] (S[A "--only-tokens"]); + pflag [ mode ] "external_tokens" (fun name -> + S[A "--external-tokens"; A name]); + end [ "menhir"; "menhir_ocamldep" ];; (* Tell ocamllex to generate ml code *) flag [ "ocaml" ; "ocamllex" ; "generate_ml" ] (S[A "-ml"]);; From ba658d6ba991c27aebf6c9893441b424e353cabd Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sat, 11 Apr 2015 17:40:49 +0000 Subject: [PATCH 199/494] PR#6793: ocamlbuild passes nonsensical "-ocamlc ..." commands to menhir git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15995 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ ocamlbuild/ocaml_tools.ml | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Changes b/Changes index 69495a8536..157dc38cc2 100644 --- a/Changes +++ b/Changes @@ -98,6 +98,8 @@ Bug fixes: - PR#6790: otherlibs should be built with -g - PR#6791: "%s@[", "%s@{" regression in Scanf (Benoît Vaugon) +- PR#6793: ocamlbuild passes nonsensical "-ocamlc ..." commands to menhir + (Gabriel Scherer, report by Damien Doligez) - PR#6799: include guards missing for unixsupport.h and other files - PR#6812: -short-paths and -no-alias-deps can create inconsistent assumptions - PR#6817: GADT exhaustiveness breakage with modules diff --git a/ocamlbuild/ocaml_tools.ml b/ocamlbuild/ocaml_tools.ml index a615f28e2e..be6fed38e1 100644 --- a/ocamlbuild/ocaml_tools.ml +++ b/ocamlbuild/ocaml_tools.ml @@ -99,10 +99,10 @@ let infer_interface ml mli env build = let menhir mly env build = let mly = env mly in + let ml = Pathname.update_extension "ml" mly in let menhir = if !Options.ocamlyacc = N then V"MENHIR" else !Options.ocamlyacc in - let tags = tags_of_pathname mly in - let ocamlc_tags = tags++"ocaml"++"byte"++"compile" in - let menhir_tags = tags++"ocaml"++"parser"++"menhir" in + let ocamlc_tags = tags_of_pathname ml ++"ocaml"++"byte"++"compile" in + let menhir_tags = tags_of_pathname mly ++"ocaml"++"parser"++"menhir" in Ocaml_compiler.prepare_compile build mly; Cmd(S[menhir; A"--ocamlc"; Quote(S[!Options.ocamlc; T ocamlc_tags; ocaml_include_flags mly]); From a9c9c114f694c98d2018b67ab6a209ea189b8e27 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 12 Apr 2015 08:47:36 +0000 Subject: [PATCH 200/494] fix minor mistake in tools/eqparsetree.ml git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15996 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- tools/eqparsetree.ml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/eqparsetree.ml b/tools/eqparsetree.ml index c2571c3609..4c699e9988 100644 --- a/tools/eqparsetree.ml +++ b/tools/eqparsetree.ml @@ -274,7 +274,7 @@ let rec eq_structure_item_desc : (Asttypes.eq_loc eq_string (a0, b0)) && (eq_value_description (a1, b1)) | (Pstr_type (a0, a1), Pstr_type (b0, b1)) -> - (Asttypes.eq_rec_flag (a0, b0) && + (Asttypes.eq_rec_flag (a0, b0)) && eq_list (fun ((a0, a1), (b0, b1)) -> (Asttypes.eq_loc eq_string (a0, b0)) && @@ -361,7 +361,7 @@ and eq_signature_item_desc : (Asttypes.eq_loc eq_string (a0, b0)) && (eq_value_description (a1, b1)) | (Psig_type (a0, a1), Psig_type (b0, b1)) -> - (Asttypes.eq_rec_flag (a0, b0) && + (Asttypes.eq_rec_flag (a0, b0)) && eq_list (fun ((a0, a1), (b0, b1)) -> (Asttypes.eq_loc eq_string (a0, b0)) && From 13b87091098a2a2513a3a5f539156e0c84fe1eb5 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 12 Apr 2015 09:03:05 +0000 Subject: [PATCH 201/494] headers move, step 1: move .h files in a caml/ subdirectory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (Jérôme Vouillon and Adrien Nader) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15997 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- byterun/{ => caml}/alloc.h | 0 byterun/{ => caml}/backtrace.h | 0 byterun/{ => caml}/callback.h | 0 byterun/{ => caml}/compact.h | 0 byterun/{ => caml}/compare.h | 0 byterun/{ => caml}/compatibility.h | 0 byterun/{ => caml}/config.h | 0 byterun/{ => caml}/custom.h | 0 byterun/{ => caml}/debugger.h | 0 byterun/{ => caml}/dynlink.h | 0 byterun/{ => caml}/exec.h | 0 byterun/{ => caml}/fail.h | 0 byterun/{ => caml}/finalise.h | 0 byterun/{ => caml}/fix_code.h | 0 byterun/{ => caml}/freelist.h | 0 byterun/{ => caml}/gc.h | 0 byterun/{ => caml}/gc_ctrl.h | 0 byterun/{ => caml}/globroots.h | 0 byterun/{ => caml}/hash.h | 0 byterun/{ => caml}/instrtrace.h | 0 byterun/{ => caml}/instruct.h | 0 byterun/{ => caml}/int64_emul.h | 0 byterun/{ => caml}/int64_format.h | 0 byterun/{ => caml}/int64_native.h | 0 byterun/{ => caml}/interp.h | 0 byterun/{ => caml}/intext.h | 0 byterun/{ => caml}/io.h | 0 byterun/{ => caml}/major_gc.h | 0 byterun/{ => caml}/md5.h | 0 byterun/{ => caml}/memory.h | 0 byterun/{ => caml}/minor_gc.h | 0 byterun/{ => caml}/misc.h | 0 byterun/{ => caml}/mlvalues.h | 0 byterun/{ => caml}/osdeps.h | 0 byterun/{ => caml}/prims.h | 0 byterun/{ => caml}/printexc.h | 0 byterun/{ => caml}/reverse.h | 0 byterun/{ => caml}/roots.h | 0 byterun/{ => caml}/signals.h | 0 byterun/{ => caml}/signals_machdep.h | 0 byterun/{ => caml}/stacks.h | 0 byterun/{ => caml}/startup.h | 0 byterun/{ => caml}/sys.h | 0 byterun/{ => caml}/ui.h | 0 byterun/{ => caml}/weak.h | 0 45 files changed, 0 insertions(+), 0 deletions(-) rename byterun/{ => caml}/alloc.h (100%) rename byterun/{ => caml}/backtrace.h (100%) rename byterun/{ => caml}/callback.h (100%) rename byterun/{ => caml}/compact.h (100%) rename byterun/{ => caml}/compare.h (100%) rename byterun/{ => caml}/compatibility.h (100%) rename byterun/{ => caml}/config.h (100%) rename byterun/{ => caml}/custom.h (100%) rename byterun/{ => caml}/debugger.h (100%) rename byterun/{ => caml}/dynlink.h (100%) rename byterun/{ => caml}/exec.h (100%) rename byterun/{ => caml}/fail.h (100%) rename byterun/{ => caml}/finalise.h (100%) rename byterun/{ => caml}/fix_code.h (100%) rename byterun/{ => caml}/freelist.h (100%) rename byterun/{ => caml}/gc.h (100%) rename byterun/{ => caml}/gc_ctrl.h (100%) rename byterun/{ => caml}/globroots.h (100%) rename byterun/{ => caml}/hash.h (100%) rename byterun/{ => caml}/instrtrace.h (100%) rename byterun/{ => caml}/instruct.h (100%) rename byterun/{ => caml}/int64_emul.h (100%) rename byterun/{ => caml}/int64_format.h (100%) rename byterun/{ => caml}/int64_native.h (100%) rename byterun/{ => caml}/interp.h (100%) rename byterun/{ => caml}/intext.h (100%) rename byterun/{ => caml}/io.h (100%) rename byterun/{ => caml}/major_gc.h (100%) rename byterun/{ => caml}/md5.h (100%) rename byterun/{ => caml}/memory.h (100%) rename byterun/{ => caml}/minor_gc.h (100%) rename byterun/{ => caml}/misc.h (100%) rename byterun/{ => caml}/mlvalues.h (100%) rename byterun/{ => caml}/osdeps.h (100%) rename byterun/{ => caml}/prims.h (100%) rename byterun/{ => caml}/printexc.h (100%) rename byterun/{ => caml}/reverse.h (100%) rename byterun/{ => caml}/roots.h (100%) rename byterun/{ => caml}/signals.h (100%) rename byterun/{ => caml}/signals_machdep.h (100%) rename byterun/{ => caml}/stacks.h (100%) rename byterun/{ => caml}/startup.h (100%) rename byterun/{ => caml}/sys.h (100%) rename byterun/{ => caml}/ui.h (100%) rename byterun/{ => caml}/weak.h (100%) diff --git a/byterun/alloc.h b/byterun/caml/alloc.h similarity index 100% rename from byterun/alloc.h rename to byterun/caml/alloc.h diff --git a/byterun/backtrace.h b/byterun/caml/backtrace.h similarity index 100% rename from byterun/backtrace.h rename to byterun/caml/backtrace.h diff --git a/byterun/callback.h b/byterun/caml/callback.h similarity index 100% rename from byterun/callback.h rename to byterun/caml/callback.h diff --git a/byterun/compact.h b/byterun/caml/compact.h similarity index 100% rename from byterun/compact.h rename to byterun/caml/compact.h diff --git a/byterun/compare.h b/byterun/caml/compare.h similarity index 100% rename from byterun/compare.h rename to byterun/caml/compare.h diff --git a/byterun/compatibility.h b/byterun/caml/compatibility.h similarity index 100% rename from byterun/compatibility.h rename to byterun/caml/compatibility.h diff --git a/byterun/config.h b/byterun/caml/config.h similarity index 100% rename from byterun/config.h rename to byterun/caml/config.h diff --git a/byterun/custom.h b/byterun/caml/custom.h similarity index 100% rename from byterun/custom.h rename to byterun/caml/custom.h diff --git a/byterun/debugger.h b/byterun/caml/debugger.h similarity index 100% rename from byterun/debugger.h rename to byterun/caml/debugger.h diff --git a/byterun/dynlink.h b/byterun/caml/dynlink.h similarity index 100% rename from byterun/dynlink.h rename to byterun/caml/dynlink.h diff --git a/byterun/exec.h b/byterun/caml/exec.h similarity index 100% rename from byterun/exec.h rename to byterun/caml/exec.h diff --git a/byterun/fail.h b/byterun/caml/fail.h similarity index 100% rename from byterun/fail.h rename to byterun/caml/fail.h diff --git a/byterun/finalise.h b/byterun/caml/finalise.h similarity index 100% rename from byterun/finalise.h rename to byterun/caml/finalise.h diff --git a/byterun/fix_code.h b/byterun/caml/fix_code.h similarity index 100% rename from byterun/fix_code.h rename to byterun/caml/fix_code.h diff --git a/byterun/freelist.h b/byterun/caml/freelist.h similarity index 100% rename from byterun/freelist.h rename to byterun/caml/freelist.h diff --git a/byterun/gc.h b/byterun/caml/gc.h similarity index 100% rename from byterun/gc.h rename to byterun/caml/gc.h diff --git a/byterun/gc_ctrl.h b/byterun/caml/gc_ctrl.h similarity index 100% rename from byterun/gc_ctrl.h rename to byterun/caml/gc_ctrl.h diff --git a/byterun/globroots.h b/byterun/caml/globroots.h similarity index 100% rename from byterun/globroots.h rename to byterun/caml/globroots.h diff --git a/byterun/hash.h b/byterun/caml/hash.h similarity index 100% rename from byterun/hash.h rename to byterun/caml/hash.h diff --git a/byterun/instrtrace.h b/byterun/caml/instrtrace.h similarity index 100% rename from byterun/instrtrace.h rename to byterun/caml/instrtrace.h diff --git a/byterun/instruct.h b/byterun/caml/instruct.h similarity index 100% rename from byterun/instruct.h rename to byterun/caml/instruct.h diff --git a/byterun/int64_emul.h b/byterun/caml/int64_emul.h similarity index 100% rename from byterun/int64_emul.h rename to byterun/caml/int64_emul.h diff --git a/byterun/int64_format.h b/byterun/caml/int64_format.h similarity index 100% rename from byterun/int64_format.h rename to byterun/caml/int64_format.h diff --git a/byterun/int64_native.h b/byterun/caml/int64_native.h similarity index 100% rename from byterun/int64_native.h rename to byterun/caml/int64_native.h diff --git a/byterun/interp.h b/byterun/caml/interp.h similarity index 100% rename from byterun/interp.h rename to byterun/caml/interp.h diff --git a/byterun/intext.h b/byterun/caml/intext.h similarity index 100% rename from byterun/intext.h rename to byterun/caml/intext.h diff --git a/byterun/io.h b/byterun/caml/io.h similarity index 100% rename from byterun/io.h rename to byterun/caml/io.h diff --git a/byterun/major_gc.h b/byterun/caml/major_gc.h similarity index 100% rename from byterun/major_gc.h rename to byterun/caml/major_gc.h diff --git a/byterun/md5.h b/byterun/caml/md5.h similarity index 100% rename from byterun/md5.h rename to byterun/caml/md5.h diff --git a/byterun/memory.h b/byterun/caml/memory.h similarity index 100% rename from byterun/memory.h rename to byterun/caml/memory.h diff --git a/byterun/minor_gc.h b/byterun/caml/minor_gc.h similarity index 100% rename from byterun/minor_gc.h rename to byterun/caml/minor_gc.h diff --git a/byterun/misc.h b/byterun/caml/misc.h similarity index 100% rename from byterun/misc.h rename to byterun/caml/misc.h diff --git a/byterun/mlvalues.h b/byterun/caml/mlvalues.h similarity index 100% rename from byterun/mlvalues.h rename to byterun/caml/mlvalues.h diff --git a/byterun/osdeps.h b/byterun/caml/osdeps.h similarity index 100% rename from byterun/osdeps.h rename to byterun/caml/osdeps.h diff --git a/byterun/prims.h b/byterun/caml/prims.h similarity index 100% rename from byterun/prims.h rename to byterun/caml/prims.h diff --git a/byterun/printexc.h b/byterun/caml/printexc.h similarity index 100% rename from byterun/printexc.h rename to byterun/caml/printexc.h diff --git a/byterun/reverse.h b/byterun/caml/reverse.h similarity index 100% rename from byterun/reverse.h rename to byterun/caml/reverse.h diff --git a/byterun/roots.h b/byterun/caml/roots.h similarity index 100% rename from byterun/roots.h rename to byterun/caml/roots.h diff --git a/byterun/signals.h b/byterun/caml/signals.h similarity index 100% rename from byterun/signals.h rename to byterun/caml/signals.h diff --git a/byterun/signals_machdep.h b/byterun/caml/signals_machdep.h similarity index 100% rename from byterun/signals_machdep.h rename to byterun/caml/signals_machdep.h diff --git a/byterun/stacks.h b/byterun/caml/stacks.h similarity index 100% rename from byterun/stacks.h rename to byterun/caml/stacks.h diff --git a/byterun/startup.h b/byterun/caml/startup.h similarity index 100% rename from byterun/startup.h rename to byterun/caml/startup.h diff --git a/byterun/sys.h b/byterun/caml/sys.h similarity index 100% rename from byterun/sys.h rename to byterun/caml/sys.h diff --git a/byterun/ui.h b/byterun/caml/ui.h similarity index 100% rename from byterun/ui.h rename to byterun/caml/ui.h diff --git a/byterun/weak.h b/byterun/caml/weak.h similarity index 100% rename from byterun/weak.h rename to byterun/caml/weak.h From 26dade98db91dc7db100566c75e67f77f29bf921 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 12 Apr 2015 09:03:39 +0000 Subject: [PATCH 202/494] header moves, step 2: adapt all header references (Peter Zotov, Gabriel Scherer) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15998 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- .gitignore | 6 +- Makefile | 10 ++-- Makefile.nt | 8 +-- asmrun/backtrace.c | 10 ++-- asmrun/fail.c | 20 +++---- asmrun/natdynlink.c | 18 +++--- asmrun/roots.c | 16 ++--- asmrun/signals_asm.c | 10 ++-- asmrun/startup.c | 32 +++++----- byterun/.ignore | 6 +- byterun/Makefile | 2 +- byterun/Makefile.common | 24 ++++---- byterun/alloc.c | 12 ++-- byterun/array.c | 10 ++-- byterun/backtrace.c | 28 ++++----- byterun/callback.c | 16 ++--- byterun/caml/config.h | 4 +- byterun/compact.c | 20 +++---- byterun/compare.c | 10 ++-- byterun/custom.c | 10 ++-- byterun/debugger.c | 24 ++++---- byterun/dynlink.c | 20 +++---- byterun/extern.c | 24 ++++---- byterun/fail.c | 20 +++---- byterun/finalise.c | 10 ++-- byterun/fix_code.c | 20 +++---- byterun/floats.c | 16 ++--- byterun/freelist.c | 16 ++--- byterun/gc_ctrl.c | 24 ++++---- byterun/globroots.c | 10 ++-- byterun/hash.c | 8 +-- byterun/instrtrace.c | 12 ++-- byterun/intern.c | 26 ++++----- byterun/interp.c | 34 +++++------ byterun/ints.c | 14 ++--- byterun/io.c | 20 +++---- byterun/lexing.c | 6 +- byterun/main.c | 6 +- byterun/major_gc.c | 26 ++++----- byterun/md5.c | 14 ++--- byterun/memory.c | 22 +++---- byterun/meta.c | 26 ++++----- byterun/minor_gc.c | 26 ++++----- byterun/misc.c | 6 +- byterun/obj.c | 20 +++---- byterun/parsing.c | 8 +-- byterun/printexc.c | 14 ++--- byterun/roots.c | 18 +++--- byterun/signals.c | 22 +++---- byterun/signals_byt.c | 10 ++-- byterun/stacks.c | 10 ++-- byterun/startup.c | 58 +++++++++---------- byterun/str.c | 8 +-- byterun/sys.c | 20 +++---- byterun/terminfo.c | 10 ++-- byterun/unix.c | 8 +-- byterun/weak.c | 10 ++-- byterun/win32.c | 12 ++-- otherlibs/bigarray/bigarray.h | 6 +- otherlibs/bigarray/bigarray_stubs.c | 14 ++--- otherlibs/bigarray/mmap_unix.c | 12 ++-- otherlibs/bigarray/mmap_win32.c | 10 ++-- otherlibs/graph/draw.c | 2 +- otherlibs/graph/dump_img.c | 4 +- otherlibs/graph/events.c | 4 +- otherlibs/graph/fill.c | 2 +- otherlibs/graph/image.c | 4 +- otherlibs/graph/libgraph.h | 2 +- otherlibs/graph/make_img.c | 2 +- otherlibs/graph/open.c | 8 +-- otherlibs/graph/text.c | 2 +- otherlibs/num/bng.c | 2 +- otherlibs/num/bng.h | 2 +- otherlibs/num/nat_stubs.c | 16 ++--- otherlibs/str/strstubs.c | 8 +-- otherlibs/systhreads/st_stubs.c | 28 ++++----- otherlibs/threads/scheduler.c | 28 ++++----- otherlibs/unix/accept.c | 10 ++-- otherlibs/unix/access.c | 8 +-- otherlibs/unix/addrofstr.c | 6 +- otherlibs/unix/alarm.c | 2 +- otherlibs/unix/bind.c | 4 +- otherlibs/unix/chdir.c | 6 +- otherlibs/unix/chmod.c | 6 +- otherlibs/unix/chown.c | 6 +- otherlibs/unix/chroot.c | 6 +- otherlibs/unix/close.c | 4 +- otherlibs/unix/closedir.c | 6 +- otherlibs/unix/connect.c | 6 +- otherlibs/unix/cst2constr.c | 4 +- otherlibs/unix/cstringv.c | 4 +- otherlibs/unix/dup.c | 2 +- otherlibs/unix/dup2.c | 2 +- otherlibs/unix/envir.c | 4 +- otherlibs/unix/errmsg.c | 4 +- otherlibs/unix/execv.c | 4 +- otherlibs/unix/execve.c | 4 +- otherlibs/unix/execvp.c | 4 +- otherlibs/unix/exit.c | 2 +- otherlibs/unix/fchmod.c | 6 +- otherlibs/unix/fchown.c | 6 +- otherlibs/unix/fcntl.c | 4 +- otherlibs/unix/fork.c | 4 +- otherlibs/unix/ftruncate.c | 8 +-- otherlibs/unix/getaddrinfo.c | 12 ++-- otherlibs/unix/getcwd.c | 6 +- otherlibs/unix/getegid.c | 2 +- otherlibs/unix/geteuid.c | 2 +- otherlibs/unix/getgid.c | 2 +- otherlibs/unix/getgr.c | 8 +-- otherlibs/unix/getgroups.c | 6 +- otherlibs/unix/gethost.c | 10 ++-- otherlibs/unix/gethostname.c | 6 +- otherlibs/unix/getlogin.c | 4 +- otherlibs/unix/getnameinfo.c | 10 ++-- otherlibs/unix/getpeername.c | 4 +- otherlibs/unix/getpid.c | 2 +- otherlibs/unix/getppid.c | 2 +- otherlibs/unix/getproto.c | 8 +-- otherlibs/unix/getpw.c | 8 +-- otherlibs/unix/getserv.c | 8 +-- otherlibs/unix/getsockname.c | 4 +- otherlibs/unix/gettimeofday.c | 6 +- otherlibs/unix/getuid.c | 2 +- otherlibs/unix/gmtime.c | 8 +-- otherlibs/unix/initgroups.c | 6 +- otherlibs/unix/isatty.c | 2 +- otherlibs/unix/itimer.c | 8 +-- otherlibs/unix/kill.c | 6 +- otherlibs/unix/link.c | 6 +- otherlibs/unix/listen.c | 4 +- otherlibs/unix/lockf.c | 6 +- otherlibs/unix/lseek.c | 8 +-- otherlibs/unix/mkdir.c | 6 +- otherlibs/unix/mkfifo.c | 8 +-- otherlibs/unix/nice.c | 2 +- otherlibs/unix/open.c | 10 ++-- otherlibs/unix/opendir.c | 8 +-- otherlibs/unix/pipe.c | 4 +- otherlibs/unix/putenv.c | 6 +- otherlibs/unix/read.c | 6 +- otherlibs/unix/readdir.c | 8 +-- otherlibs/unix/readlink.c | 10 ++-- otherlibs/unix/rename.c | 6 +- otherlibs/unix/rewinddir.c | 4 +- otherlibs/unix/rmdir.c | 6 +- otherlibs/unix/select.c | 10 ++-- otherlibs/unix/sendrecv.c | 10 ++-- otherlibs/unix/setgid.c | 2 +- otherlibs/unix/setgroups.c | 8 +-- otherlibs/unix/setsid.c | 4 +- otherlibs/unix/setuid.c | 2 +- otherlibs/unix/shutdown.c | 4 +- otherlibs/unix/signals.c | 10 ++-- otherlibs/unix/sleep.c | 4 +- otherlibs/unix/socket.c | 4 +- otherlibs/unix/socketaddr.c | 6 +- otherlibs/unix/socketaddr.h | 2 +- otherlibs/unix/socketpair.c | 6 +- otherlibs/unix/sockopt.c | 8 +-- otherlibs/unix/stat.c | 14 ++--- otherlibs/unix/strofaddr.c | 6 +- otherlibs/unix/symlink.c | 8 +-- otherlibs/unix/termios.c | 6 +- otherlibs/unix/time.c | 4 +- otherlibs/unix/times.c | 6 +- otherlibs/unix/truncate.c | 10 ++-- otherlibs/unix/umask.c | 2 +- otherlibs/unix/unixsupport.c | 10 ++-- otherlibs/unix/unlink.c | 6 +- otherlibs/unix/utimes.c | 8 +-- otherlibs/unix/wait.c | 10 ++-- otherlibs/unix/write.c | 6 +- otherlibs/win32graph/dib.c | 4 +- otherlibs/win32graph/draw.c | 10 ++-- otherlibs/win32graph/events.c | 4 +- otherlibs/win32graph/open.c | 6 +- otherlibs/win32unix/accept.c | 8 +-- otherlibs/win32unix/bind.c | 2 +- otherlibs/win32unix/channels.c | 8 +-- otherlibs/win32unix/close.c | 4 +- otherlibs/win32unix/close_on.c | 2 +- otherlibs/win32unix/connect.c | 4 +- otherlibs/win32unix/createprocess.c | 4 +- otherlibs/win32unix/dup.c | 2 +- otherlibs/win32unix/dup2.c | 2 +- otherlibs/win32unix/errmsg.c | 4 +- otherlibs/win32unix/getpeername.c | 2 +- otherlibs/win32unix/getpid.c | 2 +- otherlibs/win32unix/getsockname.c | 2 +- otherlibs/win32unix/gettimeofday.c | 4 +- otherlibs/win32unix/link.c | 4 +- otherlibs/win32unix/listen.c | 2 +- otherlibs/win32unix/lockf.c | 8 +-- otherlibs/win32unix/lseek.c | 4 +- otherlibs/win32unix/mkdir.c | 2 +- otherlibs/win32unix/nonblock.c | 4 +- otherlibs/win32unix/open.c | 4 +- otherlibs/win32unix/pipe.c | 6 +- otherlibs/win32unix/read.c | 6 +- otherlibs/win32unix/rename.c | 2 +- otherlibs/win32unix/select.c | 10 ++-- otherlibs/win32unix/sendrecv.c | 8 +-- otherlibs/win32unix/shutdown.c | 2 +- otherlibs/win32unix/sleep.c | 4 +- otherlibs/win32unix/socket.c | 2 +- otherlibs/win32unix/socketaddr.h | 2 +- otherlibs/win32unix/sockopt.c | 8 +-- otherlibs/win32unix/startup.c | 2 +- otherlibs/win32unix/stat.c | 6 +- otherlibs/win32unix/system.c | 8 +-- otherlibs/win32unix/times.c | 4 +- otherlibs/win32unix/unixsupport.c | 12 ++-- otherlibs/win32unix/windir.c | 8 +-- otherlibs/win32unix/winwait.c | 8 +-- otherlibs/win32unix/winworker.c | 8 +-- otherlibs/win32unix/write.c | 6 +- stdlib/header.c | 4 +- stdlib/headernt.c | 4 +- testsuite/tests/asmcomp/mainarith.c | 2 +- testsuite/tests/basic-manyargs/manyargsprim.c | 2 +- testsuite/tests/callback/callbackprim.c | 6 +- testsuite/tests/embedded/Makefile | 11 +--- testsuite/tests/gc-roots/globrootsprim.c | 8 +-- testsuite/tests/lib-bigarray-2/bigarrfstub.c | 2 +- testsuite/tests/lib-dynlink-bytecode/Makefile | 9 +-- testsuite/tests/lib-dynlink-native/Makefile | 10 +--- testsuite/tests/lib-marshal/intextaux.c | 4 +- tools/Makefile.shared | 4 +- tools/objinfo_helper.c | 4 +- 230 files changed, 957 insertions(+), 971 deletions(-) diff --git a/.gitignore b/.gitignore index 62c0f7076d..87f7cda487 100644 --- a/.gitignore +++ b/.gitignore @@ -202,11 +202,11 @@ /byterun/.depend /byterun/.depend.nt /byterun/.DS_Store -/byterun/jumptbl.h +/byterun/caml/jumptbl.h /byterun/primitives /byterun/prims.c -/byterun/opnames.h -/byterun/version.h +/byterun/caml/opnames.h +/byterun/caml/version.h /byterun/ocamlrun /byterun/ocamlrun.exe /byterun/ocamlrund diff --git a/Makefile b/Makefile index 8666fe17b4..10c88bc1bf 100644 --- a/Makefile +++ b/Makefile @@ -192,7 +192,7 @@ coldstart: if test -f boot/libcamlrun.a; then :; else \ ln -s ../byterun/libcamlrun.a boot/libcamlrun.a; fi if test -d stdlib/caml; then :; else \ - ln -s ../byterun stdlib/caml; fi + ln -s ../byterun/caml stdlib/caml; fi # Build the core system: the minimum needed to make depend and bootstrap core: @@ -538,8 +538,8 @@ $(COMMON:.cmo=.cmx) $(BYTECOMP:.cmo=.cmx) $(ASMCOMP:.cmo=.cmx): ocamlopt # The numeric opcodes -bytecomp/opcodes.ml: byterun/instruct.h - sed -n -e '/^enum/p' -e 's/,//g' -e '/^ /p' byterun/instruct.h | \ +bytecomp/opcodes.ml: byterun/caml/instruct.h + sed -n -e '/^enum/p' -e 's/,//g' -e '/^ /p' byterun/caml/instruct.h | \ awk -f tools/make-opcodes > bytecomp/opcodes.ml partialclean:: @@ -552,9 +552,9 @@ beforedepend:: bytecomp/opcodes.ml byterun/primitives: cd byterun; $(MAKE) primitives -bytecomp/runtimedef.ml: byterun/primitives byterun/fail.h +bytecomp/runtimedef.ml: byterun/primitives byterun/caml/fail.h (echo 'let builtin_exceptions = [|'; \ - sed -n -e 's|.*/\* \("[A-Za-z_]*"\) \*/$$| \1;|p' byterun/fail.h | \ + sed -n -e 's|.*/\* \("[A-Za-z_]*"\) \*/$$| \1;|p' byterun/caml/fail.h | \ sed -e '$$s/;$$//'; \ echo '|]'; \ echo 'let builtin_primitives = [|'; \ diff --git a/Makefile.nt b/Makefile.nt index 0538f2863e..6dab428d9c 100644 --- a/Makefile.nt +++ b/Makefile.nt @@ -465,8 +465,8 @@ $(COMMON:.cmo=.cmx) $(BYTECOMP:.cmo=.cmx) $(ASMCOMP:.cmo=.cmx): ocamlopt # The numeric opcodes -bytecomp/opcodes.ml: byterun/instruct.h - sed -n -e "/^enum/p" -e "s|,||g" -e "/^ /p" byterun/instruct.h | \ +bytecomp/opcodes.ml: byterun/caml/instruct.h + sed -n -e "/^enum/p" -e "s|,||g" -e "/^ /p" byterun/caml/instruct.h | \ gawk -f tools/make-opcodes > bytecomp/opcodes.ml partialclean:: @@ -479,9 +479,9 @@ beforedepend:: bytecomp/opcodes.ml byterun/primitives: cd byterun ; $(MAKEREC) primitives -bytecomp/runtimedef.ml: byterun/primitives byterun/fail.h +bytecomp/runtimedef.ml: byterun/primitives byterun/caml/fail.h (echo 'let builtin_exceptions = [|'; \ - sed -n -e 's|.*/\* \("[A-Za-z_]*"\) \*/$$| \1;|p' byterun/fail.h | \ + sed -n -e 's|.*/\* \("[A-Za-z_]*"\) \*/$$| \1;|p' byterun/caml/fail.h | \ sed -e '$$s/;$$//'; \ echo '|]'; \ echo 'let builtin_primitives = [|'; \ diff --git a/asmrun/backtrace.c b/asmrun/backtrace.c index a73aeb12f9..fafe13a016 100644 --- a/asmrun/backtrace.c +++ b/asmrun/backtrace.c @@ -17,11 +17,11 @@ #include <stdlib.h> #include <string.h> -#include "alloc.h" -#include "backtrace.h" -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" +#include "caml/alloc.h" +#include "caml/backtrace.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" #include "stack.h" int caml_backtrace_active = 0; diff --git a/asmrun/fail.c b/asmrun/fail.c index cb2c1cbd77..c674d1a879 100644 --- a/asmrun/fail.c +++ b/asmrun/fail.c @@ -15,17 +15,17 @@ #include <stdio.h> #include <signal.h> -#include "alloc.h" -#include "fail.h" -#include "io.h" -#include "gc.h" -#include "memory.h" -#include "mlvalues.h" -#include "printexc.h" -#include "signals.h" +#include "caml/alloc.h" +#include "caml/fail.h" +#include "caml/io.h" +#include "caml/gc.h" +#include "caml/memory.h" +#include "caml/mlvalues.h" +#include "caml/printexc.h" +#include "caml/signals.h" #include "stack.h" -#include "roots.h" -#include "callback.h" +#include "caml/roots.h" +#include "caml/callback.h" /* The globals holding predefined exceptions */ diff --git a/asmrun/natdynlink.c b/asmrun/natdynlink.c index b95f3d6abb..82e8795fc8 100644 --- a/asmrun/natdynlink.c +++ b/asmrun/natdynlink.c @@ -11,16 +11,16 @@ /* */ /***********************************************************************/ -#include "misc.h" -#include "mlvalues.h" -#include "memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/memory.h" #include "stack.h" -#include "callback.h" -#include "alloc.h" -#include "intext.h" -#include "osdeps.h" -#include "fail.h" -#include "signals.h" +#include "caml/callback.h" +#include "caml/alloc.h" +#include "caml/intext.h" +#include "caml/osdeps.h" +#include "caml/fail.h" +#include "caml/signals.h" #include <stdio.h> #include <string.h> diff --git a/asmrun/roots.c b/asmrun/roots.c index 93e7a655cd..32325e2efc 100644 --- a/asmrun/roots.c +++ b/asmrun/roots.c @@ -13,15 +13,15 @@ /* To walk the memory roots for garbage collection */ -#include "finalise.h" -#include "globroots.h" -#include "memory.h" -#include "major_gc.h" -#include "minor_gc.h" -#include "misc.h" -#include "mlvalues.h" +#include "caml/finalise.h" +#include "caml/globroots.h" +#include "caml/memory.h" +#include "caml/major_gc.h" +#include "caml/minor_gc.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" #include "stack.h" -#include "roots.h" +#include "caml/roots.h" #include <string.h> #include <stdio.h> diff --git a/asmrun/signals_asm.c b/asmrun/signals_asm.c index df76c50102..d0259b9630 100644 --- a/asmrun/signals_asm.c +++ b/asmrun/signals_asm.c @@ -19,11 +19,11 @@ #include <signal.h> #include <errno.h> #include <stdio.h> -#include "fail.h" -#include "memory.h" -#include "osdeps.h" -#include "signals.h" -#include "signals_machdep.h" +#include "caml/fail.h" +#include "caml/memory.h" +#include "caml/osdeps.h" +#include "caml/signals.h" +#include "caml/signals_machdep.h" #include "signals_osdep.h" #include "stack.h" diff --git a/asmrun/startup.c b/asmrun/startup.c index 9a00f2d7d5..1fefe7fd0e 100644 --- a/asmrun/startup.c +++ b/asmrun/startup.c @@ -15,24 +15,24 @@ #include <stdio.h> #include <stdlib.h> -#include "callback.h" -#include "backtrace.h" -#include "custom.h" -#include "debugger.h" -#include "fail.h" -#include "freelist.h" -#include "gc.h" -#include "gc_ctrl.h" -#include "intext.h" -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" -#include "osdeps.h" -#include "printexc.h" +#include "caml/callback.h" +#include "caml/backtrace.h" +#include "caml/custom.h" +#include "caml/debugger.h" +#include "caml/fail.h" +#include "caml/freelist.h" +#include "caml/gc.h" +#include "caml/gc_ctrl.h" +#include "caml/intext.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/osdeps.h" +#include "caml/printexc.h" #include "stack.h" -#include "sys.h" +#include "caml/sys.h" #ifdef HAS_UI -#include "ui.h" +#include "caml/ui.h" #endif extern int caml_parser_trace; diff --git a/byterun/.ignore b/byterun/.ignore index 7b178a46d2..7eab2b6250 100644 --- a/byterun/.ignore +++ b/byterun/.ignore @@ -1,8 +1,8 @@ -jumptbl.h +caml/jumptbl.h primitives prims.c -opnames.h -version.h +caml/opnames.h +caml/version.h ocamlrun ocamlrun.exe ocamlrund diff --git a/byterun/Makefile b/byterun/Makefile index e33fb6bc3f..11b4fb713d 100644 --- a/byterun/Makefile +++ b/byterun/Makefile @@ -57,7 +57,7 @@ clean:: %.pic.o: %.c $(CC) -c $(CFLAGS) $(SHAREDCCCOMPOPTS) $< -o $@ -depend : prims.c opnames.h jumptbl.h version.h +depend : prims.c caml/opnames.h caml/jumptbl.h caml/version.h -gcc -MM $(BYTECCCOMPOPTS) *.c > .depend -gcc -MM $(BYTECCCOMPOPTS) -DDEBUG *.c | sed -e 's/\.o/.d.o/' >> .depend -gcc -MM $(BYTECCCOMPOPTS) *.c | sed -e 's/\.o/.pic.o/' >> .depend diff --git a/byterun/Makefile.common b/byterun/Makefile.common index b6bff21948..fb9ea10a2f 100755 --- a/byterun/Makefile.common +++ b/byterun/Makefile.common @@ -62,7 +62,7 @@ install:: if test -d $(INSTALL_LIBDIR)/caml; then : ; \ else mkdir $(INSTALL_LIBDIR)/caml; fi for i in $(PUBLIC_INCLUDES); do \ - sed -f ../tools/cleanup-header $$i > $(INSTALL_LIBDIR)/caml/$$i; \ + sed -f ../tools/cleanup-header caml/$$i > $(INSTALL_LIBDIR)/caml/$$i; \ done cp ld.conf $(INSTALL_LIBDIR)/ld.conf .PHONY: install @@ -96,8 +96,8 @@ primitives : $(PRIMS) | sort | uniq > primitives prims.c : primitives - (echo '#include "mlvalues.h"'; \ - echo '#include "prims.h"'; \ + (echo '#include "caml/mlvalues.h"'; \ + echo '#include "caml/prims.h"'; \ sed -e 's/.*/extern value &();/' primitives; \ echo 'c_primitive caml_builtin_cprim[] = {'; \ sed -e 's/.*/ &,/' primitives; \ @@ -106,23 +106,23 @@ prims.c : primitives sed -e 's/.*/ "&",/' primitives; \ echo ' 0 };') > prims.c -opnames.h : instruct.h +caml/opnames.h : caml/instruct.h sed -e '/\/\*/d' \ -e '/^#/d' \ -e 's/enum /char * names_of_/' \ -e 's/{$$/[] = {/' \ - -e 's/\([[:upper:]][[:upper:]_0-9]*\)/"\1"/g' instruct.h > opnames.h + -e 's/\([[:upper:]][[:upper:]_0-9]*\)/"\1"/g' caml/instruct.h > caml/opnames.h -# jumptbl.h is required only if you have GCC 2.0 or later -jumptbl.h : instruct.h +# caml/jumptbl.h is required only if you have GCC 2.0 or later +caml/jumptbl.h : caml/instruct.h sed -n -e '/^ /s/ \([A-Z]\)/ \&\&lbl_\1/gp' \ - -e '/^}/q' instruct.h > jumptbl.h + -e '/^}/q' caml/instruct.h > caml/jumptbl.h -version.h : ../VERSION ../tools/make-version-header.sh - ../tools/make-version-header.sh ../VERSION > version.h +caml/version.h : ../VERSION ../tools/make-version-header.sh + ../tools/make-version-header.sh ../VERSION > caml/version.h clean :: rm -f ocamlrun$(EXE) ocamlrund$(EXE) *.$(O) *.$(A) *.$(SO) - rm -f primitives prims.c opnames.h jumptbl.h ld.conf - rm -f version.h + rm -f primitives prims.c caml/opnames.h caml/jumptbl.h ld.conf + rm -f caml/version.h .PHONY: clean diff --git a/byterun/alloc.c b/byterun/alloc.c index 1fc33b55a2..4e15a50b9d 100644 --- a/byterun/alloc.c +++ b/byterun/alloc.c @@ -17,12 +17,12 @@ */ #include <string.h> -#include "alloc.h" -#include "custom.h" -#include "major_gc.h" -#include "memory.h" -#include "mlvalues.h" -#include "stacks.h" +#include "caml/alloc.h" +#include "caml/custom.h" +#include "caml/major_gc.h" +#include "caml/memory.h" +#include "caml/mlvalues.h" +#include "caml/stacks.h" #define Setup_for_gc #define Restore_after_gc diff --git a/byterun/array.c b/byterun/array.c index ba6fd701bc..76713bf894 100644 --- a/byterun/array.c +++ b/byterun/array.c @@ -14,11 +14,11 @@ /* Operations on arrays */ #include <string.h> -#include "alloc.h" -#include "fail.h" -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" +#include "caml/alloc.h" +#include "caml/fail.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" CAMLexport mlsize_t caml_array_length(value array) { diff --git a/byterun/backtrace.c b/byterun/backtrace.c index 7787ab28ec..008b199f03 100644 --- a/byterun/backtrace.c +++ b/byterun/backtrace.c @@ -18,24 +18,24 @@ #include <stdlib.h> #include <string.h> -#include "config.h" +#include "caml/config.h" #ifdef HAS_UNISTD #include <unistd.h> #endif -#include "mlvalues.h" -#include "alloc.h" -#include "io.h" -#include "instruct.h" -#include "intext.h" -#include "exec.h" -#include "fix_code.h" -#include "memory.h" -#include "startup.h" -#include "stacks.h" -#include "sys.h" -#include "backtrace.h" -#include "fail.h" +#include "caml/mlvalues.h" +#include "caml/alloc.h" +#include "caml/io.h" +#include "caml/instruct.h" +#include "caml/intext.h" +#include "caml/exec.h" +#include "caml/fix_code.h" +#include "caml/memory.h" +#include "caml/startup.h" +#include "caml/stacks.h" +#include "caml/sys.h" +#include "caml/backtrace.h" +#include "caml/fail.h" CAMLexport int caml_backtrace_active = 0; CAMLexport int caml_backtrace_pos = 0; diff --git a/byterun/callback.c b/byterun/callback.c index 476a043715..3010985162 100644 --- a/byterun/callback.c +++ b/byterun/callback.c @@ -14,19 +14,19 @@ /* Callbacks from C to OCaml */ #include <string.h> -#include "callback.h" -#include "fail.h" -#include "memory.h" -#include "mlvalues.h" +#include "caml/callback.h" +#include "caml/fail.h" +#include "caml/memory.h" +#include "caml/mlvalues.h" #ifndef NATIVE_CODE /* Bytecode callbacks */ -#include "interp.h" -#include "instruct.h" -#include "fix_code.h" -#include "stacks.h" +#include "caml/interp.h" +#include "caml/instruct.h" +#include "caml/fix_code.h" +#include "caml/stacks.h" CAMLexport int caml_callback_depth = 0; diff --git a/byterun/caml/config.h b/byterun/caml/config.h index f77598850c..6f608364d6 100644 --- a/byterun/caml/config.h +++ b/byterun/caml/config.h @@ -17,8 +17,8 @@ /* <include ../config/m.h> */ /* <include ../config/s.h> */ /* <private> */ -#include "../config/m.h" -#include "../config/s.h" +#include "../../config/m.h" +#include "../../config/s.h" /* </private> */ #ifndef CAML_NAME_SPACE diff --git a/byterun/compact.c b/byterun/compact.c index 0afbd9dc4f..7e34d38fbc 100644 --- a/byterun/compact.c +++ b/byterun/compact.c @@ -13,16 +13,16 @@ #include <string.h> -#include "config.h" -#include "finalise.h" -#include "freelist.h" -#include "gc.h" -#include "gc_ctrl.h" -#include "major_gc.h" -#include "memory.h" -#include "mlvalues.h" -#include "roots.h" -#include "weak.h" +#include "caml/config.h" +#include "caml/finalise.h" +#include "caml/freelist.h" +#include "caml/gc.h" +#include "caml/gc_ctrl.h" +#include "caml/major_gc.h" +#include "caml/memory.h" +#include "caml/mlvalues.h" +#include "caml/roots.h" +#include "caml/weak.h" extern uintnat caml_percent_free; /* major_gc.c */ extern void caml_shrink_heap (char *); /* memory.c */ diff --git a/byterun/compare.c b/byterun/compare.c index 6593ed9a82..4e8d25af37 100644 --- a/byterun/compare.c +++ b/byterun/compare.c @@ -13,11 +13,11 @@ #include <string.h> #include <stdlib.h> -#include "custom.h" -#include "fail.h" -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" +#include "caml/custom.h" +#include "caml/fail.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" /* Structural comparison on trees. */ diff --git a/byterun/custom.c b/byterun/custom.c index e4f9eaf573..eeb976d929 100644 --- a/byterun/custom.c +++ b/byterun/custom.c @@ -13,11 +13,11 @@ #include <string.h> -#include "alloc.h" -#include "custom.h" -#include "fail.h" -#include "memory.h" -#include "mlvalues.h" +#include "caml/alloc.h" +#include "caml/custom.h" +#include "caml/fail.h" +#include "caml/memory.h" +#include "caml/mlvalues.h" CAMLexport value caml_alloc_custom(struct custom_operations * ops, uintnat size, diff --git a/byterun/debugger.c b/byterun/debugger.c index 6024ed92fe..41a64b1c4e 100644 --- a/byterun/debugger.c +++ b/byterun/debugger.c @@ -19,10 +19,10 @@ #include <string.h> -#include "alloc.h" -#include "config.h" -#include "debugger.h" -#include "misc.h" +#include "caml/alloc.h" +#include "caml/config.h" +#include "caml/debugger.h" +#include "caml/misc.h" int caml_debugger_in_use = 0; uintnat caml_event_count; @@ -64,14 +64,14 @@ void caml_debugger_cleanup_fork(void) #include <process.h> #endif -#include "fail.h" -#include "fix_code.h" -#include "instruct.h" -#include "intext.h" -#include "io.h" -#include "mlvalues.h" -#include "stacks.h" -#include "sys.h" +#include "caml/fail.h" +#include "caml/fix_code.h" +#include "caml/instruct.h" +#include "caml/intext.h" +#include "caml/io.h" +#include "caml/mlvalues.h" +#include "caml/stacks.h" +#include "caml/sys.h" static int sock_domain; /* Socket domain for the debugger */ static union { /* Socket address for the debugger */ diff --git a/byterun/dynlink.c b/byterun/dynlink.c index d8dbbca004..6d09a3c079 100644 --- a/byterun/dynlink.c +++ b/byterun/dynlink.c @@ -18,19 +18,19 @@ #include <string.h> #include <fcntl.h> #include <sys/stat.h> -#include "config.h" +#include "caml/config.h" #ifdef HAS_UNISTD #include <unistd.h> #endif -#include "alloc.h" -#include "dynlink.h" -#include "fail.h" -#include "mlvalues.h" -#include "memory.h" -#include "misc.h" -#include "osdeps.h" -#include "prims.h" -#include "signals.h" +#include "caml/alloc.h" +#include "caml/dynlink.h" +#include "caml/fail.h" +#include "caml/mlvalues.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/osdeps.h" +#include "caml/prims.h" +#include "caml/signals.h" #ifndef NATIVE_CODE diff --git a/byterun/extern.c b/byterun/extern.c index 33fa89a913..5965b8d53f 100644 --- a/byterun/extern.c +++ b/byterun/extern.c @@ -13,20 +13,20 @@ /* Structured output */ -/* The interface of this file is "intext.h" */ +/* The interface of this file is "caml/intext.h" */ #include <string.h> -#include "alloc.h" -#include "custom.h" -#include "fail.h" -#include "gc.h" -#include "intext.h" -#include "io.h" -#include "md5.h" -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" -#include "reverse.h" +#include "caml/alloc.h" +#include "caml/custom.h" +#include "caml/fail.h" +#include "caml/gc.h" +#include "caml/intext.h" +#include "caml/io.h" +#include "caml/md5.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/reverse.h" static uintnat obj_counter; /* Number of objects emitted so far */ static uintnat size_32; /* Size in words of 32-bit block for struct. */ diff --git a/byterun/fail.c b/byterun/fail.c index 148e47a994..7943f9aee1 100644 --- a/byterun/fail.c +++ b/byterun/fail.c @@ -15,16 +15,16 @@ #include <stdio.h> #include <stdlib.h> -#include "alloc.h" -#include "fail.h" -#include "io.h" -#include "gc.h" -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" -#include "printexc.h" -#include "signals.h" -#include "stacks.h" +#include "caml/alloc.h" +#include "caml/fail.h" +#include "caml/io.h" +#include "caml/gc.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/printexc.h" +#include "caml/signals.h" +#include "caml/stacks.h" CAMLexport struct longjmp_buffer * caml_external_raise = NULL; value caml_exn_bucket; diff --git a/byterun/finalise.c b/byterun/finalise.c index 15b7a753e0..b9ce1b1b0c 100644 --- a/byterun/finalise.c +++ b/byterun/finalise.c @@ -13,11 +13,11 @@ /* Handling of finalised values. */ -#include "callback.h" -#include "fail.h" -#include "mlvalues.h" -#include "roots.h" -#include "signals.h" +#include "caml/callback.h" +#include "caml/fail.h" +#include "caml/mlvalues.h" +#include "caml/roots.h" +#include "caml/signals.h" struct final { value fun; diff --git a/byterun/fix_code.c b/byterun/fix_code.c index d98495aa10..95a7591b03 100644 --- a/byterun/fix_code.c +++ b/byterun/fix_code.c @@ -13,21 +13,21 @@ /* Handling of blocks of bytecode (endianness switch, threading). */ -#include "config.h" +#include "caml/config.h" #ifdef HAS_UNISTD #include <unistd.h> #endif -#include "debugger.h" -#include "fix_code.h" -#include "instruct.h" -#include "intext.h" -#include "md5.h" -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" -#include "reverse.h" +#include "caml/debugger.h" +#include "caml/fix_code.h" +#include "caml/instruct.h" +#include "caml/intext.h" +#include "caml/md5.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/reverse.h" code_t caml_start_code; asize_t caml_code_size; diff --git a/byterun/floats.c b/byterun/floats.c index b67bca1210..b2fac8ad25 100644 --- a/byterun/floats.c +++ b/byterun/floats.c @@ -11,20 +11,20 @@ /* */ /***********************************************************************/ -/* The interface of this file is in "mlvalues.h" and "alloc.h" */ +/* The interface of this file is in "caml/mlvalues.h" and "caml/alloc.h" */ #include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> -#include "alloc.h" -#include "fail.h" -#include "memory.h" -#include "mlvalues.h" -#include "misc.h" -#include "reverse.h" -#include "stacks.h" +#include "caml/alloc.h" +#include "caml/fail.h" +#include "caml/memory.h" +#include "caml/mlvalues.h" +#include "caml/misc.h" +#include "caml/reverse.h" +#include "caml/stacks.h" #ifdef _MSC_VER #include <float.h> diff --git a/byterun/freelist.c b/byterun/freelist.c index 1bbbc25f6a..a588a8b72f 100644 --- a/byterun/freelist.c +++ b/byterun/freelist.c @@ -18,14 +18,14 @@ #include <string.h> -#include "config.h" -#include "freelist.h" -#include "gc.h" -#include "gc_ctrl.h" -#include "memory.h" -#include "major_gc.h" -#include "misc.h" -#include "mlvalues.h" +#include "caml/config.h" +#include "caml/freelist.h" +#include "caml/gc.h" +#include "caml/gc_ctrl.h" +#include "caml/memory.h" +#include "caml/major_gc.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" /* The free-list is kept sorted by increasing addresses. This makes the merging of adjacent free blocks possible. diff --git a/byterun/gc_ctrl.c b/byterun/gc_ctrl.c index 1ab099da9e..1f2a023895 100644 --- a/byterun/gc_ctrl.c +++ b/byterun/gc_ctrl.c @@ -11,21 +11,21 @@ /* */ /***********************************************************************/ -#include "alloc.h" -#include "compact.h" -#include "custom.h" -#include "finalise.h" -#include "freelist.h" -#include "gc.h" -#include "gc_ctrl.h" -#include "major_gc.h" -#include "minor_gc.h" -#include "misc.h" -#include "mlvalues.h" +#include "caml/alloc.h" +#include "caml/compact.h" +#include "caml/custom.h" +#include "caml/finalise.h" +#include "caml/freelist.h" +#include "caml/gc.h" +#include "caml/gc_ctrl.h" +#include "caml/major_gc.h" +#include "caml/minor_gc.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" #ifdef NATIVE_CODE #include "stack.h" #else -#include "stacks.h" +#include "caml/stacks.h" #endif #ifndef NATIVE_CODE diff --git a/byterun/globroots.c b/byterun/globroots.c index ded393e893..d3dd925260 100644 --- a/byterun/globroots.c +++ b/byterun/globroots.c @@ -13,11 +13,11 @@ /* Registration of global memory roots */ -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" -#include "roots.h" -#include "globroots.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/roots.h" +#include "caml/globroots.h" /* The sets of global memory roots are represented as skip lists (see William Pugh, "Skip lists: a probabilistic alternative to diff --git a/byterun/hash.c b/byterun/hash.c index f8964265db..8663a3db1b 100644 --- a/byterun/hash.c +++ b/byterun/hash.c @@ -16,10 +16,10 @@ /* The interface of this file is in "mlvalues.h" (for [caml_hash_variant]) and in "hash.h" (for the other exported functions). */ -#include "mlvalues.h" -#include "custom.h" -#include "memory.h" -#include "hash.h" +#include "caml/mlvalues.h" +#include "caml/custom.h" +#include "caml/memory.h" +#include "caml/hash.h" /* The new implementation, based on MurmurHash 3, http://code.google.com/p/smhasher/ */ diff --git a/byterun/instrtrace.c b/byterun/instrtrace.c index 0a19fd2f13..712b463662 100644 --- a/byterun/instrtrace.c +++ b/byterun/instrtrace.c @@ -19,12 +19,12 @@ #include <string.h> #include <ctype.h> -#include "instruct.h" -#include "misc.h" -#include "mlvalues.h" -#include "opnames.h" -#include "prims.h" -#include "stacks.h" +#include "caml/instruct.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/opnames.h" +#include "caml/prims.h" +#include "caml/stacks.h" extern code_t caml_start_code; diff --git a/byterun/intern.c b/byterun/intern.c index e0fcc5db78..d2943afb84 100644 --- a/byterun/intern.c +++ b/byterun/intern.c @@ -13,22 +13,22 @@ /* Structured input, compact format */ -/* The interface of this file is "intext.h" */ +/* The interface of this file is "caml/intext.h" */ #include <string.h> #include <stdio.h> -#include "alloc.h" -#include "callback.h" -#include "custom.h" -#include "fail.h" -#include "gc.h" -#include "intext.h" -#include "io.h" -#include "md5.h" -#include "memory.h" -#include "mlvalues.h" -#include "misc.h" -#include "reverse.h" +#include "caml/alloc.h" +#include "caml/callback.h" +#include "caml/custom.h" +#include "caml/fail.h" +#include "caml/gc.h" +#include "caml/intext.h" +#include "caml/io.h" +#include "caml/md5.h" +#include "caml/memory.h" +#include "caml/mlvalues.h" +#include "caml/misc.h" +#include "caml/reverse.h" static unsigned char * intern_src; /* Reading pointer in block holding input data. */ diff --git a/byterun/interp.c b/byterun/interp.c index 9b682ba6ea..fd4740b250 100644 --- a/byterun/interp.c +++ b/byterun/interp.c @@ -13,22 +13,22 @@ /* The bytecode interpreter */ #include <stdio.h> -#include "alloc.h" -#include "backtrace.h" -#include "callback.h" -#include "debugger.h" -#include "fail.h" -#include "fix_code.h" -#include "instrtrace.h" -#include "instruct.h" -#include "interp.h" -#include "major_gc.h" -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" -#include "prims.h" -#include "signals.h" -#include "stacks.h" +#include "caml/alloc.h" +#include "caml/backtrace.h" +#include "caml/callback.h" +#include "caml/debugger.h" +#include "caml/fail.h" +#include "caml/fix_code.h" +#include "caml/instrtrace.h" +#include "caml/instruct.h" +#include "caml/interp.h" +#include "caml/major_gc.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/prims.h" +#include "caml/signals.h" +#include "caml/stacks.h" /* Registers for the abstract machine: pc the code pointer @@ -220,7 +220,7 @@ value caml_interprete(code_t prog, asize_t prog_size) #ifdef THREADED_CODE static void * jumptable[] = { -# include "jumptbl.h" +# include "caml/jumptbl.h" }; #endif diff --git a/byterun/ints.c b/byterun/ints.c index d762c761fe..4a73276205 100644 --- a/byterun/ints.c +++ b/byterun/ints.c @@ -13,13 +13,13 @@ #include <stdio.h> #include <string.h> -#include "alloc.h" -#include "custom.h" -#include "fail.h" -#include "intext.h" -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" +#include "caml/alloc.h" +#include "caml/custom.h" +#include "caml/fail.h" +#include "caml/intext.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" static char * parse_sign_and_base(char * p, /*out*/ int * base, diff --git a/byterun/io.c b/byterun/io.c index 5f04a966e6..11f941dc6d 100644 --- a/byterun/io.c +++ b/byterun/io.c @@ -18,22 +18,22 @@ #include <limits.h> #include <string.h> #include <sys/types.h> -#include "config.h" +#include "caml/config.h" #ifdef HAS_UNISTD #include <unistd.h> #endif #ifdef __CYGWIN__ #include </usr/include/io.h> #endif -#include "alloc.h" -#include "custom.h" -#include "fail.h" -#include "io.h" -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" -#include "signals.h" -#include "sys.h" +#include "caml/alloc.h" +#include "caml/custom.h" +#include "caml/fail.h" +#include "caml/io.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/signals.h" +#include "caml/sys.h" #ifndef SEEK_SET #define SEEK_SET 0 diff --git a/byterun/lexing.c b/byterun/lexing.c index 22ef6acde3..eac302e31a 100644 --- a/byterun/lexing.c +++ b/byterun/lexing.c @@ -13,9 +13,9 @@ /* The table-driven automaton for lexers generated by camllex. */ -#include "fail.h" -#include "mlvalues.h" -#include "stacks.h" +#include "caml/fail.h" +#include "caml/mlvalues.h" +#include "caml/stacks.h" struct lexer_buffer { value refill_buff; diff --git a/byterun/main.c b/byterun/main.c index b51c31c5c0..1ad20280e3 100644 --- a/byterun/main.c +++ b/byterun/main.c @@ -14,9 +14,9 @@ /* Main entry point (can be overridden by a user-provided main() function that calls caml_main() later). */ -#include "misc.h" -#include "mlvalues.h" -#include "sys.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/sys.h" CAMLextern void caml_main (char **); diff --git a/byterun/major_gc.c b/byterun/major_gc.c index a60193dd0f..f31226e9e1 100644 --- a/byterun/major_gc.c +++ b/byterun/major_gc.c @@ -13,19 +13,19 @@ #include <limits.h> -#include "compact.h" -#include "custom.h" -#include "config.h" -#include "fail.h" -#include "finalise.h" -#include "freelist.h" -#include "gc.h" -#include "gc_ctrl.h" -#include "major_gc.h" -#include "misc.h" -#include "mlvalues.h" -#include "roots.h" -#include "weak.h" +#include "caml/compact.h" +#include "caml/custom.h" +#include "caml/config.h" +#include "caml/fail.h" +#include "caml/finalise.h" +#include "caml/freelist.h" +#include "caml/gc.h" +#include "caml/gc_ctrl.h" +#include "caml/major_gc.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/roots.h" +#include "caml/weak.h" #if defined (NATIVE_CODE) && defined (NO_NAKED_POINTERS) #define NATIVE_CODE_AND_NO_NAKED_POINTERS diff --git a/byterun/md5.c b/byterun/md5.c index f9508d53f6..5d748c1ae3 100644 --- a/byterun/md5.c +++ b/byterun/md5.c @@ -12,13 +12,13 @@ /***********************************************************************/ #include <string.h> -#include "alloc.h" -#include "fail.h" -#include "md5.h" -#include "memory.h" -#include "mlvalues.h" -#include "io.h" -#include "reverse.h" +#include "caml/alloc.h" +#include "caml/fail.h" +#include "caml/md5.h" +#include "caml/memory.h" +#include "caml/mlvalues.h" +#include "caml/io.h" +#include "caml/reverse.h" /* MD5 message digest */ diff --git a/byterun/memory.c b/byterun/memory.c index 54d91c96da..17359291cc 100644 --- a/byterun/memory.c +++ b/byterun/memory.c @@ -13,17 +13,17 @@ #include <stdlib.h> #include <string.h> -#include "fail.h" -#include "freelist.h" -#include "gc.h" -#include "gc_ctrl.h" -#include "major_gc.h" -#include "memory.h" -#include "major_gc.h" -#include "minor_gc.h" -#include "misc.h" -#include "mlvalues.h" -#include "signals.h" +#include "caml/fail.h" +#include "caml/freelist.h" +#include "caml/gc.h" +#include "caml/gc_ctrl.h" +#include "caml/major_gc.h" +#include "caml/memory.h" +#include "caml/major_gc.h" +#include "caml/minor_gc.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/signals.h" extern uintnat caml_percent_free; /* major_gc.c */ diff --git a/byterun/meta.c b/byterun/meta.c index e5c6f941bd..edec4079c8 100644 --- a/byterun/meta.c +++ b/byterun/meta.c @@ -14,19 +14,19 @@ /* Primitives for the toplevel */ #include <string.h> -#include "alloc.h" -#include "config.h" -#include "fail.h" -#include "fix_code.h" -#include "interp.h" -#include "intext.h" -#include "major_gc.h" -#include "memory.h" -#include "minor_gc.h" -#include "misc.h" -#include "mlvalues.h" -#include "prims.h" -#include "stacks.h" +#include "caml/alloc.h" +#include "caml/config.h" +#include "caml/fail.h" +#include "caml/fix_code.h" +#include "caml/interp.h" +#include "caml/intext.h" +#include "caml/major_gc.h" +#include "caml/memory.h" +#include "caml/minor_gc.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/prims.h" +#include "caml/stacks.h" #ifndef NATIVE_CODE diff --git a/byterun/minor_gc.c b/byterun/minor_gc.c index ffaf4c7334..4aaec96602 100644 --- a/byterun/minor_gc.c +++ b/byterun/minor_gc.c @@ -12,19 +12,19 @@ /***********************************************************************/ #include <string.h> -#include "config.h" -#include "fail.h" -#include "finalise.h" -#include "gc.h" -#include "gc_ctrl.h" -#include "major_gc.h" -#include "memory.h" -#include "minor_gc.h" -#include "misc.h" -#include "mlvalues.h" -#include "roots.h" -#include "signals.h" -#include "weak.h" +#include "caml/config.h" +#include "caml/fail.h" +#include "caml/finalise.h" +#include "caml/gc.h" +#include "caml/gc_ctrl.h" +#include "caml/major_gc.h" +#include "caml/memory.h" +#include "caml/minor_gc.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/roots.h" +#include "caml/signals.h" +#include "caml/weak.h" asize_t caml_minor_heap_size; static void *caml_young_base = NULL; diff --git a/byterun/misc.c b/byterun/misc.c index 75e1ff992c..a951ee2be9 100644 --- a/byterun/misc.c +++ b/byterun/misc.c @@ -14,9 +14,9 @@ #include <stdio.h> #include <string.h> #include <stdarg.h> -#include "config.h" -#include "misc.h" -#include "memory.h" +#include "caml/config.h" +#include "caml/misc.h" +#include "caml/memory.h" caml_timing_hook caml_major_slice_begin_hook = NULL; caml_timing_hook caml_major_slice_end_hook = NULL; diff --git a/byterun/obj.c b/byterun/obj.c index b045fee263..ce7ffcd028 100644 --- a/byterun/obj.c +++ b/byterun/obj.c @@ -14,16 +14,16 @@ /* Operations on objects */ #include <string.h> -#include "alloc.h" -#include "fail.h" -#include "gc.h" -#include "interp.h" -#include "major_gc.h" -#include "memory.h" -#include "minor_gc.h" -#include "misc.h" -#include "mlvalues.h" -#include "prims.h" +#include "caml/alloc.h" +#include "caml/fail.h" +#include "caml/gc.h" +#include "caml/interp.h" +#include "caml/major_gc.h" +#include "caml/memory.h" +#include "caml/minor_gc.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/prims.h" CAMLprim value caml_static_alloc(value size) { diff --git a/byterun/parsing.c b/byterun/parsing.c index a857e39221..bd51a41eeb 100644 --- a/byterun/parsing.c +++ b/byterun/parsing.c @@ -15,10 +15,10 @@ #include <stdio.h> #include <string.h> -#include "config.h" -#include "mlvalues.h" -#include "memory.h" -#include "alloc.h" +#include "caml/config.h" +#include "caml/mlvalues.h" +#include "caml/memory.h" +#include "caml/alloc.h" #define ERRCODE 256 diff --git a/byterun/printexc.c b/byterun/printexc.c index a371a71f69..7647b3a1fd 100644 --- a/byterun/printexc.c +++ b/byterun/printexc.c @@ -16,13 +16,13 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> -#include "backtrace.h" -#include "callback.h" -#include "debugger.h" -#include "fail.h" -#include "misc.h" -#include "mlvalues.h" -#include "printexc.h" +#include "caml/backtrace.h" +#include "caml/callback.h" +#include "caml/debugger.h" +#include "caml/fail.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/printexc.h" struct stringbuf { char * ptr; diff --git a/byterun/roots.c b/byterun/roots.c index 43afbedc6f..f812cd75af 100644 --- a/byterun/roots.c +++ b/byterun/roots.c @@ -13,15 +13,15 @@ /* To walk the memory roots for garbage collection */ -#include "finalise.h" -#include "globroots.h" -#include "major_gc.h" -#include "memory.h" -#include "minor_gc.h" -#include "misc.h" -#include "mlvalues.h" -#include "roots.h" -#include "stacks.h" +#include "caml/finalise.h" +#include "caml/globroots.h" +#include "caml/major_gc.h" +#include "caml/memory.h" +#include "caml/minor_gc.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/roots.h" +#include "caml/stacks.h" CAMLexport struct caml__roots_block *caml_local_roots = NULL; diff --git a/byterun/signals.c b/byterun/signals.c index 10f452b49a..3d642f1993 100644 --- a/byterun/signals.c +++ b/byterun/signals.c @@ -15,17 +15,17 @@ #include <signal.h> #include <errno.h> -#include "alloc.h" -#include "callback.h" -#include "config.h" -#include "fail.h" -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" -#include "roots.h" -#include "signals.h" -#include "signals_machdep.h" -#include "sys.h" +#include "caml/alloc.h" +#include "caml/callback.h" +#include "caml/config.h" +#include "caml/fail.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/roots.h" +#include "caml/signals.h" +#include "caml/signals_machdep.h" +#include "caml/sys.h" #ifndef NSIG #define NSIG 64 diff --git a/byterun/signals_byt.c b/byterun/signals_byt.c index 9703afaa67..e9c6c662c8 100644 --- a/byterun/signals_byt.c +++ b/byterun/signals_byt.c @@ -15,11 +15,11 @@ #include <signal.h> #include <errno.h> -#include "config.h" -#include "memory.h" -#include "osdeps.h" -#include "signals.h" -#include "signals_machdep.h" +#include "caml/config.h" +#include "caml/memory.h" +#include "caml/osdeps.h" +#include "caml/signals.h" +#include "caml/signals_machdep.h" #ifndef NSIG #define NSIG 64 diff --git a/byterun/stacks.c b/byterun/stacks.c index bc2bdc46be..94bff0b9f6 100644 --- a/byterun/stacks.c +++ b/byterun/stacks.c @@ -14,11 +14,11 @@ /* To initialize and resize the stacks */ #include <string.h> -#include "config.h" -#include "fail.h" -#include "misc.h" -#include "mlvalues.h" -#include "stacks.h" +#include "caml/config.h" +#include "caml/fail.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/stacks.h" CAMLexport value * caml_stack_low; CAMLexport value * caml_stack_high; diff --git a/byterun/startup.c b/byterun/startup.c index 3697220664..fb6e777809 100644 --- a/byterun/startup.c +++ b/byterun/startup.c @@ -17,41 +17,41 @@ #include <stdlib.h> #include <string.h> #include <fcntl.h> -#include "config.h" +#include "caml/config.h" #ifdef HAS_UNISTD #include <unistd.h> #endif #ifdef _WIN32 #include <process.h> #endif -#include "alloc.h" -#include "backtrace.h" -#include "callback.h" -#include "custom.h" -#include "debugger.h" -#include "dynlink.h" -#include "exec.h" -#include "fail.h" -#include "fix_code.h" -#include "freelist.h" -#include "gc_ctrl.h" -#include "instrtrace.h" -#include "interp.h" -#include "intext.h" -#include "io.h" -#include "memory.h" -#include "minor_gc.h" -#include "misc.h" -#include "mlvalues.h" -#include "osdeps.h" -#include "prims.h" -#include "printexc.h" -#include "reverse.h" -#include "signals.h" -#include "stacks.h" -#include "sys.h" -#include "startup.h" -#include "version.h" +#include "caml/alloc.h" +#include "caml/backtrace.h" +#include "caml/callback.h" +#include "caml/custom.h" +#include "caml/debugger.h" +#include "caml/dynlink.h" +#include "caml/exec.h" +#include "caml/fail.h" +#include "caml/fix_code.h" +#include "caml/freelist.h" +#include "caml/gc_ctrl.h" +#include "caml/instrtrace.h" +#include "caml/interp.h" +#include "caml/intext.h" +#include "caml/io.h" +#include "caml/memory.h" +#include "caml/minor_gc.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/osdeps.h" +#include "caml/prims.h" +#include "caml/printexc.h" +#include "caml/reverse.h" +#include "caml/signals.h" +#include "caml/stacks.h" +#include "caml/sys.h" +#include "caml/startup.h" +#include "caml/version.h" #ifndef O_BINARY #define O_BINARY 0 diff --git a/byterun/str.c b/byterun/str.c index 6effa91aac..a72b34c4e4 100644 --- a/byterun/str.c +++ b/byterun/str.c @@ -17,10 +17,10 @@ #include <ctype.h> #include <stdio.h> #include <stdarg.h> -#include "alloc.h" -#include "fail.h" -#include "mlvalues.h" -#include "misc.h" +#include "caml/alloc.h" +#include "caml/fail.h" +#include "caml/mlvalues.h" +#include "caml/misc.h" #ifdef HAS_LOCALE #include <locale.h> #endif diff --git a/byterun/sys.c b/byterun/sys.c index 059d4407e9..292f664bff 100644 --- a/byterun/sys.c +++ b/byterun/sys.c @@ -25,7 +25,7 @@ #if !_WIN32 #include <sys/wait.h> #endif -#include "config.h" +#include "caml/config.h" #ifdef HAS_UNISTD #include <unistd.h> #endif @@ -39,15 +39,15 @@ #ifdef HAS_GETTIMEOFDAY #include <sys/time.h> #endif -#include "alloc.h" -#include "debugger.h" -#include "fail.h" -#include "instruct.h" -#include "mlvalues.h" -#include "osdeps.h" -#include "signals.h" -#include "stacks.h" -#include "sys.h" +#include "caml/alloc.h" +#include "caml/debugger.h" +#include "caml/fail.h" +#include "caml/instruct.h" +#include "caml/mlvalues.h" +#include "caml/osdeps.h" +#include "caml/signals.h" +#include "caml/stacks.h" +#include "caml/sys.h" static char * error_message(void) { diff --git a/byterun/terminfo.c b/byterun/terminfo.c index 04086a3fbd..1d0fdc42d1 100644 --- a/byterun/terminfo.c +++ b/byterun/terminfo.c @@ -13,11 +13,11 @@ /* Read and output terminal commands */ -#include "config.h" -#include "alloc.h" -#include "fail.h" -#include "io.h" -#include "mlvalues.h" +#include "caml/config.h" +#include "caml/alloc.h" +#include "caml/fail.h" +#include "caml/io.h" +#include "caml/mlvalues.h" #define Uninitialised (Val_int(0)) #define Bad_term (Val_int(1)) diff --git a/byterun/unix.c b/byterun/unix.c index be2c39b158..a76ab22f72 100644 --- a/byterun/unix.c +++ b/byterun/unix.c @@ -22,7 +22,7 @@ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> -#include "config.h" +#include "caml/config.h" #ifdef SUPPORT_DYNAMIC_LINKING #ifdef __CYGWIN32__ #include "flexdll.h" @@ -38,9 +38,9 @@ #else #include <sys/dir.h> #endif -#include "memory.h" -#include "misc.h" -#include "osdeps.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/osdeps.h" #ifndef S_ISREG #define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) diff --git a/byterun/weak.c b/byterun/weak.c index 756996710c..65da99dc27 100644 --- a/byterun/weak.c +++ b/byterun/weak.c @@ -15,11 +15,11 @@ #include <string.h> -#include "alloc.h" -#include "fail.h" -#include "major_gc.h" -#include "memory.h" -#include "mlvalues.h" +#include "caml/alloc.h" +#include "caml/fail.h" +#include "caml/major_gc.h" +#include "caml/memory.h" +#include "caml/mlvalues.h" value caml_weak_list_head = 0; diff --git a/byterun/win32.c b/byterun/win32.c index 67e9683211..e22ad66c0f 100644 --- a/byterun/win32.c +++ b/byterun/win32.c @@ -25,12 +25,12 @@ #include <errno.h> #include <string.h> #include <signal.h> -#include "fail.h" -#include "memory.h" -#include "misc.h" -#include "osdeps.h" -#include "signals.h" -#include "sys.h" +#include "caml/fail.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/osdeps.h" +#include "caml/signals.h" +#include "caml/sys.h" #include <flexdll.h> diff --git a/otherlibs/bigarray/bigarray.h b/otherlibs/bigarray/bigarray.h index 14e0a5fed8..23bde23336 100644 --- a/otherlibs/bigarray/bigarray.h +++ b/otherlibs/bigarray/bigarray.h @@ -15,10 +15,10 @@ #define CAML_BIGARRAY_H #ifndef CAML_NAME_SPACE -#include "compatibility.h" +#include "caml/compatibility.h" #endif -#include "config.h" -#include "mlvalues.h" +#include "caml/config.h" +#include "caml/mlvalues.h" typedef signed char caml_ba_int8; typedef unsigned char caml_ba_uint8; diff --git a/otherlibs/bigarray/bigarray_stubs.c b/otherlibs/bigarray/bigarray_stubs.c index 7e63cbf4db..c98a92f035 100644 --- a/otherlibs/bigarray/bigarray_stubs.c +++ b/otherlibs/bigarray/bigarray_stubs.c @@ -14,14 +14,14 @@ #include <stddef.h> #include <stdarg.h> #include <string.h> -#include "alloc.h" +#include "caml/alloc.h" #include "bigarray.h" -#include "custom.h" -#include "fail.h" -#include "intext.h" -#include "hash.h" -#include "memory.h" -#include "mlvalues.h" +#include "caml/custom.h" +#include "caml/fail.h" +#include "caml/intext.h" +#include "caml/hash.h" +#include "caml/memory.h" +#include "caml/mlvalues.h" #define int8 caml_ba_int8 #define uint8 caml_ba_uint8 diff --git a/otherlibs/bigarray/mmap_unix.c b/otherlibs/bigarray/mmap_unix.c index cdcfe3ce32..027b1e5cf5 100644 --- a/otherlibs/bigarray/mmap_unix.c +++ b/otherlibs/bigarray/mmap_unix.c @@ -18,12 +18,12 @@ #include <stddef.h> #include <string.h> #include "bigarray.h" -#include "custom.h" -#include "fail.h" -#include "io.h" -#include "mlvalues.h" -#include "sys.h" -#include "signals.h" +#include "caml/custom.h" +#include "caml/fail.h" +#include "caml/io.h" +#include "caml/mlvalues.h" +#include "caml/sys.h" +#include "caml/signals.h" extern int caml_ba_element_size[]; /* from bigarray_stubs.c */ diff --git a/otherlibs/bigarray/mmap_win32.c b/otherlibs/bigarray/mmap_win32.c index cd9da4af38..5d7ec6bb88 100644 --- a/otherlibs/bigarray/mmap_win32.c +++ b/otherlibs/bigarray/mmap_win32.c @@ -15,11 +15,11 @@ #include <stdio.h> #include <string.h> #include "bigarray.h" -#include "alloc.h" -#include "custom.h" -#include "fail.h" -#include "mlvalues.h" -#include "sys.h" +#include "caml/alloc.h" +#include "caml/custom.h" +#include "caml/fail.h" +#include "caml/mlvalues.h" +#include "caml/sys.h" #include "unixsupport.h" extern int caml_ba_element_size[]; /* from bigarray_stubs.c */ diff --git a/otherlibs/graph/draw.c b/otherlibs/graph/draw.c index dc65787542..195860fa9f 100644 --- a/otherlibs/graph/draw.c +++ b/otherlibs/graph/draw.c @@ -12,7 +12,7 @@ /***********************************************************************/ #include "libgraph.h" -#include <alloc.h> +#include <caml/alloc.h> value caml_gr_plot(value vx, value vy) { diff --git a/otherlibs/graph/dump_img.c b/otherlibs/graph/dump_img.c index 4ba5c066ca..26f816076c 100644 --- a/otherlibs/graph/dump_img.c +++ b/otherlibs/graph/dump_img.c @@ -13,8 +13,8 @@ #include "libgraph.h" #include "image.h" -#include <alloc.h> -#include <memory.h> +#include <caml/alloc.h> +#include <caml/memory.h> value caml_gr_dump_image(value image) { diff --git a/otherlibs/graph/events.c b/otherlibs/graph/events.c index 94bd8bc478..a8fe119baa 100644 --- a/otherlibs/graph/events.c +++ b/otherlibs/graph/events.c @@ -13,8 +13,8 @@ #include <signal.h> #include "libgraph.h" -#include <alloc.h> -#include <signals.h> +#include <caml/alloc.h> +#include <caml/signals.h> #include <sys/types.h> #include <sys/time.h> #ifdef HAS_SYS_SELECT_H diff --git a/otherlibs/graph/fill.c b/otherlibs/graph/fill.c index 1e2965f179..8dc2f8777d 100644 --- a/otherlibs/graph/fill.c +++ b/otherlibs/graph/fill.c @@ -12,7 +12,7 @@ /***********************************************************************/ #include "libgraph.h" -#include <memory.h> +#include <caml/memory.h> value caml_gr_fill_rect(value vx, value vy, value vw, value vh) { diff --git a/otherlibs/graph/image.c b/otherlibs/graph/image.c index 31693bbd3e..12588bf71c 100644 --- a/otherlibs/graph/image.c +++ b/otherlibs/graph/image.c @@ -13,8 +13,8 @@ #include "libgraph.h" #include "image.h" -#include <alloc.h> -#include <custom.h> +#include <caml/alloc.h> +#include <caml/custom.h> static void caml_gr_free_image(value im) { diff --git a/otherlibs/graph/libgraph.h b/otherlibs/graph/libgraph.h index e75ee801cc..9b2972bc07 100644 --- a/otherlibs/graph/libgraph.h +++ b/otherlibs/graph/libgraph.h @@ -14,7 +14,7 @@ #include <stdio.h> #include <X11/Xlib.h> #include <X11/Xutil.h> -#include <mlvalues.h> +#include <caml/mlvalues.h> struct canvas { int w, h; /* Dimensions of the drawable */ diff --git a/otherlibs/graph/make_img.c b/otherlibs/graph/make_img.c index 932d4605d9..b9c4bfca22 100644 --- a/otherlibs/graph/make_img.c +++ b/otherlibs/graph/make_img.c @@ -13,7 +13,7 @@ #include "libgraph.h" #include "image.h" -#include <memory.h> +#include <caml/memory.h> value caml_gr_make_image(value m) { diff --git a/otherlibs/graph/open.c b/otherlibs/graph/open.c index 14a00eafd4..e8d26acfa9 100644 --- a/otherlibs/graph/open.c +++ b/otherlibs/graph/open.c @@ -15,10 +15,10 @@ #include <fcntl.h> #include <signal.h> #include "libgraph.h" -#include <alloc.h> -#include <callback.h> -#include <fail.h> -#include <memory.h> +#include <caml/alloc.h> +#include <caml/callback.h> +#include <caml/fail.h> +#include <caml/memory.h> #ifdef HAS_UNISTD #include <unistd.h> #endif diff --git a/otherlibs/graph/text.c b/otherlibs/graph/text.c index 8ac422d58d..7450df89d7 100644 --- a/otherlibs/graph/text.c +++ b/otherlibs/graph/text.c @@ -12,7 +12,7 @@ /***********************************************************************/ #include "libgraph.h" -#include <alloc.h> +#include <caml/alloc.h> XFontStruct * caml_gr_font = NULL; diff --git a/otherlibs/num/bng.c b/otherlibs/num/bng.c index 0483ef51f5..585e434e2c 100644 --- a/otherlibs/num/bng.c +++ b/otherlibs/num/bng.c @@ -14,7 +14,7 @@ /* $Id$ */ #include "bng.h" -#include "config.h" +#include "caml/config.h" #if defined(__GNUC__) && BNG_ASM_LEVEL > 0 #if defined(BNG_ARCH_ia32) diff --git a/otherlibs/num/bng.h b/otherlibs/num/bng.h index 19f2e2b9cf..527bee6abe 100644 --- a/otherlibs/num/bng.h +++ b/otherlibs/num/bng.h @@ -14,7 +14,7 @@ /* $Id$ */ #include <string.h> -#include "config.h" +#include "caml/config.h" typedef uintnat bngdigit; typedef bngdigit * bng; diff --git a/otherlibs/num/nat_stubs.c b/otherlibs/num/nat_stubs.c index 9a62759fac..ae109ac972 100644 --- a/otherlibs/num/nat_stubs.c +++ b/otherlibs/num/nat_stubs.c @@ -13,14 +13,14 @@ /* $Id$ */ -#include "alloc.h" -#include "config.h" -#include "custom.h" -#include "intext.h" -#include "fail.h" -#include "hash.h" -#include "memory.h" -#include "mlvalues.h" +#include "caml/alloc.h" +#include "caml/config.h" +#include "caml/custom.h" +#include "caml/intext.h" +#include "caml/fail.h" +#include "caml/hash.h" +#include "caml/memory.h" +#include "caml/mlvalues.h" #include "bng.h" #include "nat.h" diff --git a/otherlibs/str/strstubs.c b/otherlibs/str/strstubs.c index 9de349a9db..6c928704b1 100644 --- a/otherlibs/str/strstubs.c +++ b/otherlibs/str/strstubs.c @@ -13,10 +13,10 @@ #include <string.h> #include <ctype.h> -#include <mlvalues.h> -#include <alloc.h> -#include <memory.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/memory.h> +#include <caml/fail.h> /* The backtracking NFA interpreter */ diff --git a/otherlibs/systhreads/st_stubs.c b/otherlibs/systhreads/st_stubs.c index dd99c7369a..eab89ab49e 100644 --- a/otherlibs/systhreads/st_stubs.c +++ b/otherlibs/systhreads/st_stubs.c @@ -11,24 +11,24 @@ /* */ /***********************************************************************/ -#include "alloc.h" -#include "backtrace.h" -#include "callback.h" -#include "custom.h" -#include "fail.h" -#include "io.h" -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" -#include "printexc.h" -#include "roots.h" -#include "signals.h" +#include "caml/alloc.h" +#include "caml/backtrace.h" +#include "caml/callback.h" +#include "caml/custom.h" +#include "caml/fail.h" +#include "caml/io.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/printexc.h" +#include "caml/roots.h" +#include "caml/signals.h" #ifdef NATIVE_CODE #include "stack.h" #else -#include "stacks.h" +#include "caml/stacks.h" #endif -#include "sys.h" +#include "caml/sys.h" #include "threads.h" /* Initial size of bytecode stack when a thread is created (4 Ko) */ diff --git a/otherlibs/threads/scheduler.c b/otherlibs/threads/scheduler.c index 45ef854db9..585a89030e 100644 --- a/otherlibs/threads/scheduler.c +++ b/otherlibs/threads/scheduler.c @@ -17,20 +17,20 @@ #include <stdlib.h> #include <stdio.h> -#include "alloc.h" -#include "backtrace.h" -#include "callback.h" -#include "config.h" -#include "fail.h" -#include "io.h" -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" -#include "printexc.h" -#include "roots.h" -#include "signals.h" -#include "stacks.h" -#include "sys.h" +#include "caml/alloc.h" +#include "caml/backtrace.h" +#include "caml/callback.h" +#include "caml/config.h" +#include "caml/fail.h" +#include "caml/io.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/printexc.h" +#include "caml/roots.h" +#include "caml/signals.h" +#include "caml/stacks.h" +#include "caml/sys.h" #if ! (defined(HAS_SELECT) && \ defined(HAS_SETITIMER) && \ diff --git a/otherlibs/unix/accept.c b/otherlibs/unix/accept.c index 183b8e869e..3fd019188f 100644 --- a/otherlibs/unix/accept.c +++ b/otherlibs/unix/accept.c @@ -11,11 +11,11 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/access.c b/otherlibs/unix/access.c index 7df4f9c5f5..28c26b820d 100644 --- a/otherlibs/unix/access.c +++ b/otherlibs/unix/access.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #ifdef HAS_UNISTD diff --git a/otherlibs/unix/addrofstr.c b/otherlibs/unix/addrofstr.c index e17841f954..c4bd2e72b1 100644 --- a/otherlibs/unix/addrofstr.c +++ b/otherlibs/unix/addrofstr.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/fail.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/alarm.c b/otherlibs/unix/alarm.c index 30472765ff..eb92a68293 100644 --- a/otherlibs/unix/alarm.c +++ b/otherlibs/unix/alarm.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_alarm(value t) diff --git a/otherlibs/unix/bind.c b/otherlibs/unix/bind.c index e3d0046c14..4ea75c21f9 100644 --- a/otherlibs/unix/bind.c +++ b/otherlibs/unix/bind.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <fail.h> -#include <mlvalues.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/chdir.c b/otherlibs/unix/chdir.c index 0d5326a0dc..247321119f 100644 --- a/otherlibs/unix/chdir.c +++ b/otherlibs/unix/chdir.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_chdir(value path) diff --git a/otherlibs/unix/chmod.c b/otherlibs/unix/chmod.c index 90dd6024f4..2d3f30fe60 100644 --- a/otherlibs/unix/chmod.c +++ b/otherlibs/unix/chmod.c @@ -13,9 +13,9 @@ #include <sys/types.h> #include <sys/stat.h> -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_chmod(value path, value perm) diff --git a/otherlibs/unix/chown.c b/otherlibs/unix/chown.c index 697f447714..6c9e896a4e 100644 --- a/otherlibs/unix/chown.c +++ b/otherlibs/unix/chown.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_chown(value path, value uid, value gid) diff --git a/otherlibs/unix/chroot.c b/otherlibs/unix/chroot.c index b41c09ff00..c30a0da9cd 100644 --- a/otherlibs/unix/chroot.c +++ b/otherlibs/unix/chroot.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_chroot(value path) diff --git a/otherlibs/unix/close.c b/otherlibs/unix/close.c index 8a56c413b9..aff8911f79 100644 --- a/otherlibs/unix/close.c +++ b/otherlibs/unix/close.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_close(value fd) diff --git a/otherlibs/unix/closedir.c b/otherlibs/unix/closedir.c index 4196acd4e1..5e8008d5dc 100644 --- a/otherlibs/unix/closedir.c +++ b/otherlibs/unix/closedir.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #include <errno.h> #include <sys/types.h> diff --git a/otherlibs/unix/connect.c b/otherlibs/unix/connect.c index ed8b12c3f2..b4b3e19c33 100644 --- a/otherlibs/unix/connect.c +++ b/otherlibs/unix/connect.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <fail.h> -#include <mlvalues.h> -#include <signals.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> +#include <caml/signals.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/cst2constr.c b/otherlibs/unix/cst2constr.c index f27cace7b5..87721ce36f 100644 --- a/otherlibs/unix/cst2constr.c +++ b/otherlibs/unix/cst2constr.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/fail.h> #include "cst2constr.h" value cst_to_constr(int n, int *tbl, int size, int deflt) diff --git a/otherlibs/unix/cstringv.c b/otherlibs/unix/cstringv.c index d85411007a..0e61491853 100644 --- a/otherlibs/unix/cstringv.c +++ b/otherlibs/unix/cstringv.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> #include "unixsupport.h" char ** cstringvect(value arg) diff --git a/otherlibs/unix/dup.c b/otherlibs/unix/dup.c index 36e3efac59..c6e9dcf2d0 100644 --- a/otherlibs/unix/dup.c +++ b/otherlibs/unix/dup.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_dup(value fd) diff --git a/otherlibs/unix/dup2.c b/otherlibs/unix/dup2.c index c501802234..fd9ea3d257 100644 --- a/otherlibs/unix/dup2.c +++ b/otherlibs/unix/dup2.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #ifdef HAS_DUP2 diff --git a/otherlibs/unix/envir.c b/otherlibs/unix/envir.c index 4b1893342d..366608b634 100644 --- a/otherlibs/unix/envir.c +++ b/otherlibs/unix/envir.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> #ifndef _WIN32 extern char ** environ; diff --git a/otherlibs/unix/errmsg.c b/otherlibs/unix/errmsg.c index 5df3e1e736..0f610e9d81 100644 --- a/otherlibs/unix/errmsg.c +++ b/otherlibs/unix/errmsg.c @@ -13,8 +13,8 @@ #include <errno.h> #include <string.h> -#include <mlvalues.h> -#include <alloc.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> extern int error_table[]; diff --git a/otherlibs/unix/execv.c b/otherlibs/unix/execv.c index ee59fa48ec..9a77548917 100644 --- a/otherlibs/unix/execv.c +++ b/otherlibs/unix/execv.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> #include "unixsupport.h" extern char ** cstringvect(); diff --git a/otherlibs/unix/execve.c b/otherlibs/unix/execve.c index 62b2d2c9a2..92171c2d37 100644 --- a/otherlibs/unix/execve.c +++ b/otherlibs/unix/execve.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> #include "unixsupport.h" extern char ** cstringvect(); diff --git a/otherlibs/unix/execvp.c b/otherlibs/unix/execvp.c index 8e28fa067d..ce6900abf1 100644 --- a/otherlibs/unix/execvp.c +++ b/otherlibs/unix/execvp.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> #include "unixsupport.h" extern char ** cstringvect(); diff --git a/otherlibs/unix/exit.c b/otherlibs/unix/exit.c index 94f5fb5e98..cfc4e16c6a 100644 --- a/otherlibs/unix/exit.c +++ b/otherlibs/unix/exit.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_exit(value n) diff --git a/otherlibs/unix/fchmod.c b/otherlibs/unix/fchmod.c index 711097eb47..11578ff261 100644 --- a/otherlibs/unix/fchmod.c +++ b/otherlibs/unix/fchmod.c @@ -13,9 +13,9 @@ #include <sys/types.h> #include <sys/stat.h> -#include <fail.h> -#include <mlvalues.h> -#include <signals.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> +#include <caml/signals.h> #include "unixsupport.h" #ifdef HAS_FCHMOD diff --git a/otherlibs/unix/fchown.c b/otherlibs/unix/fchown.c index 2a6746ca64..24872ec8ee 100644 --- a/otherlibs/unix/fchown.c +++ b/otherlibs/unix/fchown.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <fail.h> -#include <mlvalues.h> -#include <signals.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> +#include <caml/signals.h> #include "unixsupport.h" #ifdef HAS_FCHMOD diff --git a/otherlibs/unix/fcntl.c b/otherlibs/unix/fcntl.c index 886c12de9f..c89e9a6f16 100644 --- a/otherlibs/unix/fcntl.c +++ b/otherlibs/unix/fcntl.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <fail.h> -#include <mlvalues.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #ifdef HAS_UNISTD #include <unistd.h> diff --git a/otherlibs/unix/fork.c b/otherlibs/unix/fork.c index b21d80c60e..ac0d6772cc 100644 --- a/otherlibs/unix/fork.c +++ b/otherlibs/unix/fork.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <debugger.h> +#include <caml/mlvalues.h> +#include <caml/debugger.h> #include "unixsupport.h" CAMLprim value unix_fork(value unit) diff --git a/otherlibs/unix/ftruncate.c b/otherlibs/unix/ftruncate.c index ec494ba525..08a4a775ed 100644 --- a/otherlibs/unix/ftruncate.c +++ b/otherlibs/unix/ftruncate.c @@ -12,10 +12,10 @@ /***********************************************************************/ #include <sys/types.h> -#include <fail.h> -#include <mlvalues.h> -#include <io.h> -#include <signals.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> +#include <caml/io.h> +#include <caml/signals.h> #include "unixsupport.h" #ifdef HAS_UNISTD #include <unistd.h> diff --git a/otherlibs/unix/getaddrinfo.c b/otherlibs/unix/getaddrinfo.c index 28d8903a3c..2817934331 100644 --- a/otherlibs/unix/getaddrinfo.c +++ b/otherlibs/unix/getaddrinfo.c @@ -12,12 +12,12 @@ /***********************************************************************/ #include <string.h> -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> -#include <memory.h> -#include <misc.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/memory.h> +#include <caml/misc.h> +#include <caml/signals.h> #include "unixsupport.h" #include "cst2constr.h" diff --git a/otherlibs/unix/getcwd.c b/otherlibs/unix/getcwd.c index 8d1b8e50a3..043c96b6f6 100644 --- a/otherlibs/unix/getcwd.c +++ b/otherlibs/unix/getcwd.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> #include "unixsupport.h" #if !defined (_WIN32) && !macintosh diff --git a/otherlibs/unix/getegid.c b/otherlibs/unix/getegid.c index b1977ec910..c0ab2b398a 100644 --- a/otherlibs/unix/getegid.c +++ b/otherlibs/unix/getegid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_getegid(value unit) diff --git a/otherlibs/unix/geteuid.c b/otherlibs/unix/geteuid.c index 9bf8971462..095d3fe16c 100644 --- a/otherlibs/unix/geteuid.c +++ b/otherlibs/unix/geteuid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_geteuid(value unit) diff --git a/otherlibs/unix/getgid.c b/otherlibs/unix/getgid.c index 8cfe3ddba6..8a4991a532 100644 --- a/otherlibs/unix/getgid.c +++ b/otherlibs/unix/getgid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_getgid(value unit) diff --git a/otherlibs/unix/getgr.c b/otherlibs/unix/getgr.c index d1e610d858..14338ccffc 100644 --- a/otherlibs/unix/getgr.c +++ b/otherlibs/unix/getgr.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <fail.h> -#include <alloc.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/fail.h> +#include <caml/alloc.h> +#include <caml/memory.h> #include "unixsupport.h" #include <stdio.h> #include <grp.h> diff --git a/otherlibs/unix/getgroups.c b/otherlibs/unix/getgroups.c index 6d420b5e07..84cd45406a 100644 --- a/otherlibs/unix/getgroups.c +++ b/otherlibs/unix/getgroups.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> #ifdef HAS_GETGROUPS diff --git a/otherlibs/unix/gethost.c b/otherlibs/unix/gethost.c index 8d5bb03f5b..d5220415cc 100644 --- a/otherlibs/unix/gethost.c +++ b/otherlibs/unix/gethost.c @@ -12,11 +12,11 @@ /***********************************************************************/ #include <string.h> -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/gethostname.c b/otherlibs/unix/gethostname.c index 77b183cb33..a3aba5748b 100644 --- a/otherlibs/unix/gethostname.c +++ b/otherlibs/unix/gethostname.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> #ifndef _WIN32 #include <sys/param.h> #endif diff --git a/otherlibs/unix/getlogin.c b/otherlibs/unix/getlogin.c index 27a508e02d..7f40e442f0 100644 --- a/otherlibs/unix/getlogin.c +++ b/otherlibs/unix/getlogin.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> #include "unixsupport.h" #include <errno.h> diff --git a/otherlibs/unix/getnameinfo.c b/otherlibs/unix/getnameinfo.c index d7dddb3fe4..d4663957ba 100644 --- a/otherlibs/unix/getnameinfo.c +++ b/otherlibs/unix/getnameinfo.c @@ -12,11 +12,11 @@ /***********************************************************************/ #include <string.h> -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #if defined(HAS_SOCKETS) && defined(HAS_IPV6) diff --git a/otherlibs/unix/getpeername.c b/otherlibs/unix/getpeername.c index 9692202c5a..183b210d3a 100644 --- a/otherlibs/unix/getpeername.c +++ b/otherlibs/unix/getpeername.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <fail.h> -#include <mlvalues.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/getpid.c b/otherlibs/unix/getpid.c index cf4c3f90c7..4cf46e4c07 100644 --- a/otherlibs/unix/getpid.c +++ b/otherlibs/unix/getpid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_getpid(value unit) diff --git a/otherlibs/unix/getppid.c b/otherlibs/unix/getppid.c index 616393b4a9..8c30a77a1b 100644 --- a/otherlibs/unix/getppid.c +++ b/otherlibs/unix/getppid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_getppid(value unit) diff --git a/otherlibs/unix/getproto.c b/otherlibs/unix/getproto.c index 291a71da5c..b89cbba411 100644 --- a/otherlibs/unix/getproto.c +++ b/otherlibs/unix/getproto.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/memory.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/getpw.c b/otherlibs/unix/getpw.c index 0061ca8032..82fb4d8fdf 100644 --- a/otherlibs/unix/getpw.c +++ b/otherlibs/unix/getpw.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <memory.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/memory.h> +#include <caml/fail.h> #include "unixsupport.h" #include <pwd.h> diff --git a/otherlibs/unix/getserv.c b/otherlibs/unix/getserv.c index de91cbe05f..deb5f14729 100644 --- a/otherlibs/unix/getserv.c +++ b/otherlibs/unix/getserv.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/memory.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/getsockname.c b/otherlibs/unix/getsockname.c index 69e20cccc9..b28cfd1454 100644 --- a/otherlibs/unix/getsockname.c +++ b/otherlibs/unix/getsockname.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <fail.h> -#include <mlvalues.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/gettimeofday.c b/otherlibs/unix/gettimeofday.c index f6a8615ed5..9cbfbeaa07 100644 --- a/otherlibs/unix/gettimeofday.c +++ b/otherlibs/unix/gettimeofday.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> #include "unixsupport.h" #ifdef HAS_GETTIMEOFDAY diff --git a/otherlibs/unix/getuid.c b/otherlibs/unix/getuid.c index f51722a57d..7d0ce399b9 100644 --- a/otherlibs/unix/getuid.c +++ b/otherlibs/unix/getuid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_getuid(value unit) diff --git a/otherlibs/unix/gmtime.c b/otherlibs/unix/gmtime.c index c8f6ac11e2..566f174f85 100644 --- a/otherlibs/unix/gmtime.c +++ b/otherlibs/unix/gmtime.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/memory.h> #include "unixsupport.h" #include <time.h> #include <errno.h> diff --git a/otherlibs/unix/initgroups.c b/otherlibs/unix/initgroups.c index e9541e5a48..ca3ed4c99e 100644 --- a/otherlibs/unix/initgroups.c +++ b/otherlibs/unix/initgroups.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> #ifdef HAS_INITGROUPS diff --git a/otherlibs/unix/isatty.c b/otherlibs/unix/isatty.c index 800afc4629..935c39d45e 100644 --- a/otherlibs/unix/isatty.c +++ b/otherlibs/unix/isatty.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_isatty(value fd) diff --git a/otherlibs/unix/itimer.c b/otherlibs/unix/itimer.c index 537c2d9ed8..f1950264c3 100644 --- a/otherlibs/unix/itimer.c +++ b/otherlibs/unix/itimer.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/memory.h> #include "unixsupport.h" #ifdef HAS_SETITIMER diff --git a/otherlibs/unix/kill.c b/otherlibs/unix/kill.c index b3f7d88789..c0f74d48d4 100644 --- a/otherlibs/unix/kill.c +++ b/otherlibs/unix/kill.c @@ -11,11 +11,11 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/fail.h> #include "unixsupport.h" #include <signal.h> -#include <signals.h> +#include <caml/signals.h> CAMLprim value unix_kill(value pid, value signal) { diff --git a/otherlibs/unix/link.c b/otherlibs/unix/link.c index c71118a596..0ec42f5fe9 100644 --- a/otherlibs/unix/link.c +++ b/otherlibs/unix/link.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_link(value path1, value path2) diff --git a/otherlibs/unix/listen.c b/otherlibs/unix/listen.c index 26b0185bdf..38efc9fde5 100644 --- a/otherlibs/unix/listen.c +++ b/otherlibs/unix/listen.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <fail.h> -#include <mlvalues.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/lockf.c b/otherlibs/unix/lockf.c index 813a4f7f60..aeaf451313 100644 --- a/otherlibs/unix/lockf.c +++ b/otherlibs/unix/lockf.c @@ -13,9 +13,9 @@ #include <errno.h> #include <fcntl.h> -#include <fail.h> -#include <mlvalues.h> -#include <signals.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> +#include <caml/signals.h> #include "unixsupport.h" #if defined(F_GETLK) && defined(F_SETLK) && defined(F_SETLKW) diff --git a/otherlibs/unix/lseek.c b/otherlibs/unix/lseek.c index 826d84f21c..5a7b7770af 100644 --- a/otherlibs/unix/lseek.c +++ b/otherlibs/unix/lseek.c @@ -13,10 +13,10 @@ #include <errno.h> #include <sys/types.h> -#include <mlvalues.h> -#include <alloc.h> -#include <io.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/io.h> +#include <caml/signals.h> #include "unixsupport.h" #ifdef HAS_UNISTD diff --git a/otherlibs/unix/mkdir.c b/otherlibs/unix/mkdir.c index d72a066c51..6b9c76e6f0 100644 --- a/otherlibs/unix/mkdir.c +++ b/otherlibs/unix/mkdir.c @@ -13,9 +13,9 @@ #include <sys/types.h> #include <sys/stat.h> -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_mkdir(value path, value perm) diff --git a/otherlibs/unix/mkfifo.c b/otherlibs/unix/mkfifo.c index a00bcf2d04..074813856d 100644 --- a/otherlibs/unix/mkfifo.c +++ b/otherlibs/unix/mkfifo.c @@ -13,10 +13,10 @@ #include <sys/types.h> #include <sys/stat.h> -#include <fail.h> -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #ifdef HAS_MKFIFO diff --git a/otherlibs/unix/nice.c b/otherlibs/unix/nice.c index d0956a1685..e8f4f2b0a7 100644 --- a/otherlibs/unix/nice.c +++ b/otherlibs/unix/nice.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #include <errno.h> #ifdef HAS_UNISTD diff --git a/otherlibs/unix/open.c b/otherlibs/unix/open.c index 32c332f232..1bad2c5b91 100644 --- a/otherlibs/unix/open.c +++ b/otherlibs/unix/open.c @@ -11,11 +11,11 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <memory.h> -#include <misc.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/memory.h> +#include <caml/misc.h> +#include <caml/signals.h> #include "unixsupport.h" #include <string.h> #ifdef HAS_UNISTD diff --git a/otherlibs/unix/opendir.c b/otherlibs/unix/opendir.c index 9cb6829cd1..bdf031b35f 100644 --- a/otherlibs/unix/opendir.c +++ b/otherlibs/unix/opendir.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> -#include <alloc.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/alloc.h> +#include <caml/signals.h> #include "unixsupport.h" #include <sys/types.h> #ifdef HAS_DIRENT diff --git a/otherlibs/unix/pipe.c b/otherlibs/unix/pipe.c index 7c6b1438a8..5f8f23dadf 100644 --- a/otherlibs/unix/pipe.c +++ b/otherlibs/unix/pipe.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> #include "unixsupport.h" CAMLprim value unix_pipe(value unit) diff --git a/otherlibs/unix/putenv.c b/otherlibs/unix/putenv.c index 28ad962f8d..ccb8f1abef 100644 --- a/otherlibs/unix/putenv.c +++ b/otherlibs/unix/putenv.c @@ -14,9 +14,9 @@ #include <stdlib.h> #include <string.h> -#include <fail.h> -#include <memory.h> -#include <mlvalues.h> +#include <caml/fail.h> +#include <caml/memory.h> +#include <caml/mlvalues.h> #include "unixsupport.h" diff --git a/otherlibs/unix/read.c b/otherlibs/unix/read.c index 3bbd0b47fd..14305d37cf 100644 --- a/otherlibs/unix/read.c +++ b/otherlibs/unix/read.c @@ -12,9 +12,9 @@ /***********************************************************************/ #include <string.h> -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_read(value fd, value buf, value ofs, value len) diff --git a/otherlibs/unix/readdir.c b/otherlibs/unix/readdir.c index e6daf5f61c..4c309268ac 100644 --- a/otherlibs/unix/readdir.c +++ b/otherlibs/unix/readdir.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <fail.h> -#include <alloc.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/fail.h> +#include <caml/alloc.h> +#include <caml/signals.h> #include "unixsupport.h" #include <errno.h> #include <sys/types.h> diff --git a/otherlibs/unix/readlink.c b/otherlibs/unix/readlink.c index 5706ba0350..836718d1dc 100644 --- a/otherlibs/unix/readlink.c +++ b/otherlibs/unix/readlink.c @@ -11,11 +11,11 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> -#include <alloc.h> -#include <fail.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/signals.h> #ifdef HAS_SYMLINK diff --git a/otherlibs/unix/rename.c b/otherlibs/unix/rename.c index 78da709485..78e0846cd2 100644 --- a/otherlibs/unix/rename.c +++ b/otherlibs/unix/rename.c @@ -12,9 +12,9 @@ /***********************************************************************/ #include <stdio.h> -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_rename(value path1, value path2) diff --git a/otherlibs/unix/rewinddir.c b/otherlibs/unix/rewinddir.c index 17cc639f6f..c37713231e 100644 --- a/otherlibs/unix/rewinddir.c +++ b/otherlibs/unix/rewinddir.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <fail.h> -#include <mlvalues.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #include <errno.h> #include <sys/types.h> diff --git a/otherlibs/unix/rmdir.c b/otherlibs/unix/rmdir.c index 12d521a72c..20359ce6cb 100644 --- a/otherlibs/unix/rmdir.c +++ b/otherlibs/unix/rmdir.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_rmdir(value path) diff --git a/otherlibs/unix/select.c b/otherlibs/unix/select.c index 12d8cc55a0..23c480249d 100644 --- a/otherlibs/unix/select.c +++ b/otherlibs/unix/select.c @@ -11,11 +11,11 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #ifdef HAS_SELECT diff --git a/otherlibs/unix/sendrecv.c b/otherlibs/unix/sendrecv.c index 679dde3c7c..7d251a4375 100644 --- a/otherlibs/unix/sendrecv.c +++ b/otherlibs/unix/sendrecv.c @@ -12,11 +12,11 @@ /***********************************************************************/ #include <string.h> -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/setgid.c b/otherlibs/unix/setgid.c index 8e635aa481..b7204745b7 100644 --- a/otherlibs/unix/setgid.c +++ b/otherlibs/unix/setgid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_setgid(value gid) diff --git a/otherlibs/unix/setgroups.c b/otherlibs/unix/setgroups.c index 2279a6b368..7284b735cb 100644 --- a/otherlibs/unix/setgroups.c +++ b/otherlibs/unix/setgroups.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/memory.h> #ifdef HAS_SETGROUPS diff --git a/otherlibs/unix/setsid.c b/otherlibs/unix/setsid.c index 252b85c4bb..92814eba59 100644 --- a/otherlibs/unix/setsid.c +++ b/otherlibs/unix/setsid.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <fail.h> -#include <mlvalues.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #ifdef HAS_UNISTD #include <unistd.h> diff --git a/otherlibs/unix/setuid.c b/otherlibs/unix/setuid.c index 8a2a8074b8..c8a9c622a6 100644 --- a/otherlibs/unix/setuid.c +++ b/otherlibs/unix/setuid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_setuid(value uid) diff --git a/otherlibs/unix/shutdown.c b/otherlibs/unix/shutdown.c index c428afbd8e..1ceafd6ec8 100644 --- a/otherlibs/unix/shutdown.c +++ b/otherlibs/unix/shutdown.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <fail.h> -#include <mlvalues.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/signals.c b/otherlibs/unix/signals.c index d4d97ef07a..d30a70db82 100644 --- a/otherlibs/unix/signals.c +++ b/otherlibs/unix/signals.c @@ -14,11 +14,11 @@ #include <errno.h> #include <signal.h> -#include <alloc.h> -#include <fail.h> -#include <memory.h> -#include <mlvalues.h> -#include <signals.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/memory.h> +#include <caml/mlvalues.h> +#include <caml/signals.h> #include "unixsupport.h" #ifndef NSIG diff --git a/otherlibs/unix/sleep.c b/otherlibs/unix/sleep.c index 58affd394d..a39c5f829d 100644 --- a/otherlibs/unix/sleep.c +++ b/otherlibs/unix/sleep.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_sleep(value t) diff --git a/otherlibs/unix/socket.c b/otherlibs/unix/socket.c index 9e23231a90..9cf3ed3a8b 100644 --- a/otherlibs/unix/socket.c +++ b/otherlibs/unix/socket.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <fail.h> -#include <mlvalues.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/socketaddr.c b/otherlibs/unix/socketaddr.c index 24babcaba2..2f4bdadfbf 100644 --- a/otherlibs/unix/socketaddr.c +++ b/otherlibs/unix/socketaddr.c @@ -12,9 +12,9 @@ /***********************************************************************/ #include <string.h> -#include <mlvalues.h> -#include <alloc.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/memory.h> #include <errno.h> #include "unixsupport.h" diff --git a/otherlibs/unix/socketaddr.h b/otherlibs/unix/socketaddr.h index a581b33133..0077daeaad 100644 --- a/otherlibs/unix/socketaddr.h +++ b/otherlibs/unix/socketaddr.h @@ -14,7 +14,7 @@ #ifndef CAML_SOCKETADDR_H #define CAML_SOCKETADDR_H -#include "misc.h" +#include "caml/misc.h" #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> diff --git a/otherlibs/unix/socketpair.c b/otherlibs/unix/socketpair.c index 301ebf8612..4f85f9a6b7 100644 --- a/otherlibs/unix/socketpair.c +++ b/otherlibs/unix/socketpair.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/sockopt.c b/otherlibs/unix/sockopt.c index ca379f7626..8137e42c97 100644 --- a/otherlibs/unix/sockopt.c +++ b/otherlibs/unix/sockopt.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> -#include <alloc.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/alloc.h> +#include <caml/fail.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/stat.c b/otherlibs/unix/stat.c index b90b80c5e9..f938645a93 100644 --- a/otherlibs/unix/stat.c +++ b/otherlibs/unix/stat.c @@ -12,15 +12,15 @@ /***********************************************************************/ #include <errno.h> -#include <mlvalues.h> -#include <memory.h> -#include <alloc.h> -#include <signals.h> -#include "unixsupport.h" -#include "cst2constr.h" #include <sys/types.h> #include <sys/stat.h> -#include <io.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/alloc.h> +#include <caml/signals.h> +#include <caml/io.h> +#include "unixsupport.h" +#include "cst2constr.h" #ifndef S_IFLNK #define S_IFLNK 0 diff --git a/otherlibs/unix/strofaddr.c b/otherlibs/unix/strofaddr.c index 5381bc3174..c4ea6bad04 100644 --- a/otherlibs/unix/strofaddr.c +++ b/otherlibs/unix/strofaddr.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/symlink.c b/otherlibs/unix/symlink.c index d1dbf37c5b..dbbd26655e 100644 --- a/otherlibs/unix/symlink.c +++ b/otherlibs/unix/symlink.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <fail.h> -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #ifdef HAS_SYMLINK diff --git a/otherlibs/unix/termios.c b/otherlibs/unix/termios.c index 3b42bc5741..40173737dd 100644 --- a/otherlibs/unix/termios.c +++ b/otherlibs/unix/termios.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> #include "unixsupport.h" #ifdef HAS_TERMIOS diff --git a/otherlibs/unix/time.c b/otherlibs/unix/time.c index 042a1f60c9..495adb660b 100644 --- a/otherlibs/unix/time.c +++ b/otherlibs/unix/time.c @@ -12,8 +12,8 @@ /***********************************************************************/ #include <time.h> -#include <mlvalues.h> -#include <alloc.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> #include "unixsupport.h" CAMLprim value unix_time(value unit) diff --git a/otherlibs/unix/times.c b/otherlibs/unix/times.c index 8ab6006d41..8760ad2ab2 100644 --- a/otherlibs/unix/times.c +++ b/otherlibs/unix/times.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/memory.h> #include "unixsupport.h" #include <time.h> #include <sys/types.h> diff --git a/otherlibs/unix/truncate.c b/otherlibs/unix/truncate.c index 520320ebbc..62683fcf88 100644 --- a/otherlibs/unix/truncate.c +++ b/otherlibs/unix/truncate.c @@ -12,11 +12,11 @@ /***********************************************************************/ #include <sys/types.h> -#include <mlvalues.h> -#include <memory.h> -#include <fail.h> -#include <signals.h> -#include <io.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/fail.h> +#include <caml/signals.h> +#include <caml/io.h> #include "unixsupport.h" #ifdef HAS_UNISTD #include <unistd.h> diff --git a/otherlibs/unix/umask.c b/otherlibs/unix/umask.c index 311e4ed926..9b88f105c5 100644 --- a/otherlibs/unix/umask.c +++ b/otherlibs/unix/umask.c @@ -13,7 +13,7 @@ #include <sys/types.h> #include <sys/stat.h> -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_umask(value perm) diff --git a/otherlibs/unix/unixsupport.c b/otherlibs/unix/unixsupport.c index f1df3fc72c..6c7171fdd6 100644 --- a/otherlibs/unix/unixsupport.c +++ b/otherlibs/unix/unixsupport.c @@ -11,11 +11,11 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <callback.h> -#include <memory.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/callback.h> +#include <caml/memory.h> +#include <caml/fail.h> #include "unixsupport.h" #include "cst2constr.h" #include <errno.h> diff --git a/otherlibs/unix/unlink.c b/otherlibs/unix/unlink.c index ae63f69a13..687c69c26a 100644 --- a/otherlibs/unix/unlink.c +++ b/otherlibs/unix/unlink.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_unlink(value path) diff --git a/otherlibs/unix/utimes.c b/otherlibs/unix/utimes.c index 0c3b77d1be..bf2ae2fb26 100644 --- a/otherlibs/unix/utimes.c +++ b/otherlibs/unix/utimes.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <fail.h> -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #ifdef HAS_UTIME diff --git a/otherlibs/unix/wait.c b/otherlibs/unix/wait.c index 81f3683909..a8eb42b78e 100644 --- a/otherlibs/unix/wait.c +++ b/otherlibs/unix/wait.c @@ -11,11 +11,11 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #include <sys/types.h> diff --git a/otherlibs/unix/write.c b/otherlibs/unix/write.c index d6fe40932d..d6842d9f87 100644 --- a/otherlibs/unix/write.c +++ b/otherlibs/unix/write.c @@ -13,9 +13,9 @@ #include <errno.h> #include <string.h> -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #ifndef EAGAIN diff --git a/otherlibs/win32graph/dib.c b/otherlibs/win32graph/dib.c index 100beba39e..26fccf7f18 100644 --- a/otherlibs/win32graph/dib.c +++ b/otherlibs/win32graph/dib.c @@ -42,9 +42,9 @@ #include <windows.h> -#include <memory.h> +#include <caml/memory.h> #include <string.h> -#include <io.h> +#include <caml/io.h> #include <stdio.h> // Size of window extra bytes (we store a handle to a PALINFO structure). diff --git a/otherlibs/win32graph/draw.c b/otherlibs/win32graph/draw.c index 11426734b0..99e1c5c7e8 100644 --- a/otherlibs/win32graph/draw.c +++ b/otherlibs/win32graph/draw.c @@ -12,12 +12,12 @@ /***********************************************************************/ #include <math.h> -#include "mlvalues.h" -#include "alloc.h" -#include "fail.h" +#include "caml/mlvalues.h" +#include "caml/alloc.h" +#include "caml/fail.h" #include "libgraph.h" -#include "custom.h" -#include "memory.h" +#include "caml/custom.h" +#include "caml/memory.h" HDC gcMetaFile; int grdisplay_mode; diff --git a/otherlibs/win32graph/events.c b/otherlibs/win32graph/events.c index 81242729e5..837e53ac14 100755 --- a/otherlibs/win32graph/events.c +++ b/otherlibs/win32graph/events.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include "mlvalues.h" -#include "alloc.h" +#include "caml/mlvalues.h" +#include "caml/alloc.h" #include "libgraph.h" #include <windows.h> diff --git a/otherlibs/win32graph/open.c b/otherlibs/win32graph/open.c index ded2e28ae0..d3a61a5da1 100644 --- a/otherlibs/win32graph/open.c +++ b/otherlibs/win32graph/open.c @@ -13,10 +13,10 @@ #include <fcntl.h> #include <signal.h> -#include "mlvalues.h" -#include "fail.h" +#include "caml/mlvalues.h" +#include "caml/fail.h" #include "libgraph.h" -#include "callback.h" +#include "caml/callback.h" #include <windows.h> static value gr_reset(void); diff --git a/otherlibs/win32unix/accept.c b/otherlibs/win32unix/accept.c index f2e14467aa..f705f0f090 100644 --- a/otherlibs/win32unix/accept.c +++ b/otherlibs/win32unix/accept.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #include <mswsock.h> // for SO_OPENTYPE and SO_SYNCHRONOUS_NONALERT #include "socketaddr.h" diff --git a/otherlibs/win32unix/bind.c b/otherlibs/win32unix/bind.c index bc09230893..4b1d3def6b 100644 --- a/otherlibs/win32unix/bind.c +++ b/otherlibs/win32unix/bind.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #include "socketaddr.h" diff --git a/otherlibs/win32unix/channels.c b/otherlibs/win32unix/channels.c index 1e7e823acf..b6350e1742 100644 --- a/otherlibs/win32unix/channels.c +++ b/otherlibs/win32unix/channels.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <io.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/io.h> +#include <caml/memory.h> #include "unixsupport.h" #include <fcntl.h> diff --git a/otherlibs/win32unix/close.c b/otherlibs/win32unix/close.c index 20b131b05c..7f8da29dac 100644 --- a/otherlibs/win32unix/close.c +++ b/otherlibs/win32unix/close.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" -#include <io.h> +#include <caml/io.h> extern int _close(int); diff --git a/otherlibs/win32unix/close_on.c b/otherlibs/win32unix/close_on.c index 9ba342ed0e..7a316abcae 100644 --- a/otherlibs/win32unix/close_on.c +++ b/otherlibs/win32unix/close_on.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #include <windows.h> diff --git a/otherlibs/win32unix/connect.c b/otherlibs/win32unix/connect.c index 190eb742a2..37cdbdaa87 100644 --- a/otherlibs/win32unix/connect.c +++ b/otherlibs/win32unix/connect.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/signals.h> #include "unixsupport.h" #include "socketaddr.h" diff --git a/otherlibs/win32unix/createprocess.c b/otherlibs/win32unix/createprocess.c index 0e1e37a245..9766df5cd1 100644 --- a/otherlibs/win32unix/createprocess.c +++ b/otherlibs/win32unix/createprocess.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #include <windows.h> -#include <osdeps.h> +#include <caml/osdeps.h> static int win_has_console(void); diff --git a/otherlibs/win32unix/dup.c b/otherlibs/win32unix/dup.c index 76cbdf670e..5db19e3073 100644 --- a/otherlibs/win32unix/dup.c +++ b/otherlibs/win32unix/dup.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_dup(value fd) diff --git a/otherlibs/win32unix/dup2.c b/otherlibs/win32unix/dup2.c index 5f19710c37..5184207798 100644 --- a/otherlibs/win32unix/dup2.c +++ b/otherlibs/win32unix/dup2.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" extern int _dup2(int, int); diff --git a/otherlibs/win32unix/errmsg.c b/otherlibs/win32unix/errmsg.c index c3bc19c6b0..6107abc395 100644 --- a/otherlibs/win32unix/errmsg.c +++ b/otherlibs/win32unix/errmsg.c @@ -14,8 +14,8 @@ #include <stdio.h> #include <errno.h> #include <string.h> -#include <mlvalues.h> -#include <alloc.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> #include "unixsupport.h" extern int error_table[]; diff --git a/otherlibs/win32unix/getpeername.c b/otherlibs/win32unix/getpeername.c index ad6674bf6b..3467e03fd2 100644 --- a/otherlibs/win32unix/getpeername.c +++ b/otherlibs/win32unix/getpeername.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #include "socketaddr.h" diff --git a/otherlibs/win32unix/getpid.c b/otherlibs/win32unix/getpid.c index 65c8828a19..06d95356ee 100644 --- a/otherlibs/win32unix/getpid.c +++ b/otherlibs/win32unix/getpid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" extern value val_process_id; diff --git a/otherlibs/win32unix/getsockname.c b/otherlibs/win32unix/getsockname.c index 1e28f4b221..21e9d0630d 100644 --- a/otherlibs/win32unix/getsockname.c +++ b/otherlibs/win32unix/getsockname.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #include "socketaddr.h" diff --git a/otherlibs/win32unix/gettimeofday.c b/otherlibs/win32unix/gettimeofday.c index 211ade2fa8..f4e25b5ff0 100644 --- a/otherlibs/win32unix/gettimeofday.c +++ b/otherlibs/win32unix/gettimeofday.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> #include <time.h> #include "unixsupport.h" diff --git a/otherlibs/win32unix/link.c b/otherlibs/win32unix/link.c index 97748ba2cc..93d21508a2 100644 --- a/otherlibs/win32unix/link.c +++ b/otherlibs/win32unix/link.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/fail.h> #include "unixsupport.h" #include <windows.h> diff --git a/otherlibs/win32unix/listen.c b/otherlibs/win32unix/listen.c index 9602a3736f..767db61d79 100644 --- a/otherlibs/win32unix/listen.c +++ b/otherlibs/win32unix/listen.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_listen(sock, backlog) diff --git a/otherlibs/win32unix/lockf.c b/otherlibs/win32unix/lockf.c index 6e6ca0ad63..9c705a6788 100644 --- a/otherlibs/win32unix/lockf.c +++ b/otherlibs/win32unix/lockf.c @@ -15,12 +15,12 @@ #include <errno.h> #include <fcntl.h> -#include <mlvalues.h> -#include <memory.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/fail.h> #include "unixsupport.h" #include <stdio.h> -#include <signals.h> +#include <caml/signals.h> #ifndef INVALID_SET_FILE_POINTER #define INVALID_SET_FILE_POINTER (-1) diff --git a/otherlibs/win32unix/lseek.c b/otherlibs/win32unix/lseek.c index 5306331c63..6c30a62ae9 100644 --- a/otherlibs/win32unix/lseek.c +++ b/otherlibs/win32unix/lseek.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> #include "unixsupport.h" #ifdef HAS_UNISTD diff --git a/otherlibs/win32unix/mkdir.c b/otherlibs/win32unix/mkdir.c index 998b32baf4..21bca10ce4 100644 --- a/otherlibs/win32unix/mkdir.c +++ b/otherlibs/win32unix/mkdir.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_mkdir(path, perm) diff --git a/otherlibs/win32unix/nonblock.c b/otherlibs/win32unix/nonblock.c index a9aaeca5c7..4001beca6c 100755 --- a/otherlibs/win32unix/nonblock.c +++ b/otherlibs/win32unix/nonblock.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_set_nonblock(socket) diff --git a/otherlibs/win32unix/open.c b/otherlibs/win32unix/open.c index afb8d0fb9f..f9e9df21ad 100644 --- a/otherlibs/win32unix/open.c +++ b/otherlibs/win32unix/open.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> #include "unixsupport.h" #include <fcntl.h> diff --git a/otherlibs/win32unix/pipe.c b/otherlibs/win32unix/pipe.c index fe553778ad..88debb023a 100644 --- a/otherlibs/win32unix/pipe.c +++ b/otherlibs/win32unix/pipe.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> -#include <alloc.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/alloc.h> #include "unixsupport.h" #include <fcntl.h> diff --git a/otherlibs/win32unix/read.c b/otherlibs/win32unix/read.c index e7a2b38d7a..d65683cc60 100644 --- a/otherlibs/win32unix/read.c +++ b/otherlibs/win32unix/read.c @@ -12,9 +12,9 @@ /***********************************************************************/ #include <string.h> -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_read(value fd, value buf, value ofs, value vlen) diff --git a/otherlibs/win32unix/rename.c b/otherlibs/win32unix/rename.c index b8c0f3edc5..ad46ead246 100644 --- a/otherlibs/win32unix/rename.c +++ b/otherlibs/win32unix/rename.c @@ -12,7 +12,7 @@ /***********************************************************************/ #include <stdio.h> -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_rename(value path1, value path2) diff --git a/otherlibs/win32unix/select.c b/otherlibs/win32unix/select.c index d4afe49866..0e21db897e 100644 --- a/otherlibs/win32unix/select.c +++ b/otherlibs/win32unix/select.c @@ -11,11 +11,11 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <memory.h> -#include <fail.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/memory.h> +#include <caml/fail.h> +#include <caml/signals.h> #include "winworker.h" #include <stdio.h> #include "windbug.h" diff --git a/otherlibs/win32unix/sendrecv.c b/otherlibs/win32unix/sendrecv.c index 32532553fc..5957f6ed8f 100644 --- a/otherlibs/win32unix/sendrecv.c +++ b/otherlibs/win32unix/sendrecv.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #include "socketaddr.h" diff --git a/otherlibs/win32unix/shutdown.c b/otherlibs/win32unix/shutdown.c index 2d5707a353..9602311161 100644 --- a/otherlibs/win32unix/shutdown.c +++ b/otherlibs/win32unix/shutdown.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" static int shutdown_command_table[] = { diff --git a/otherlibs/win32unix/sleep.c b/otherlibs/win32unix/sleep.c index 28e60e40a3..6d630d2057 100644 --- a/otherlibs/win32unix/sleep.c +++ b/otherlibs/win32unix/sleep.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_sleep(t) diff --git a/otherlibs/win32unix/socket.c b/otherlibs/win32unix/socket.c index ad8165b291..9385e82e7e 100644 --- a/otherlibs/win32unix/socket.c +++ b/otherlibs/win32unix/socket.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #include <mswsock.h> // for SO_OPENTYPE and SO_SYNCHRONOUS_NONALERT diff --git a/otherlibs/win32unix/socketaddr.h b/otherlibs/win32unix/socketaddr.h index e21b12fa83..f3b6caf0fd 100644 --- a/otherlibs/win32unix/socketaddr.h +++ b/otherlibs/win32unix/socketaddr.h @@ -14,7 +14,7 @@ #ifndef CAML_SOCKETADDR_H #define CAML_SOCKETADDR_H -#include "misc.h" +#include "caml/misc.h" union sock_addr_union { struct sockaddr s_gen; diff --git a/otherlibs/win32unix/sockopt.c b/otherlibs/win32unix/sockopt.c index eefa9a3097..aebc517a0d 100644 --- a/otherlibs/win32unix/sockopt.c +++ b/otherlibs/win32unix/sockopt.c @@ -12,10 +12,10 @@ /***********************************************************************/ #include <errno.h> -#include <mlvalues.h> -#include <memory.h> -#include <alloc.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/alloc.h> +#include <caml/fail.h> #include "unixsupport.h" #include "socketaddr.h" diff --git a/otherlibs/win32unix/startup.c b/otherlibs/win32unix/startup.c index 65aedc6a81..be66c8a822 100644 --- a/otherlibs/win32unix/startup.c +++ b/otherlibs/win32unix/startup.c @@ -14,7 +14,7 @@ #include <stdio.h> #include <fcntl.h> #include <stdlib.h> -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "winworker.h" #include "windbug.h" diff --git a/otherlibs/win32unix/stat.c b/otherlibs/win32unix/stat.c index 56b45d0370..46fc9841b1 100644 --- a/otherlibs/win32unix/stat.c +++ b/otherlibs/win32unix/stat.c @@ -12,9 +12,9 @@ /***********************************************************************/ #include <errno.h> -#include <mlvalues.h> -#include <memory.h> -#include <alloc.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/alloc.h> #include "unixsupport.h" #include "cst2constr.h" #define _INTEGRAL_MAX_BITS 64 diff --git a/otherlibs/win32unix/system.c b/otherlibs/win32unix/system.c index 13d5658e61..202dcd0813 100644 --- a/otherlibs/win32unix/system.c +++ b/otherlibs/win32unix/system.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> -#include <alloc.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/alloc.h> +#include <caml/signals.h> #include "unixsupport.h" #include <process.h> #include <stdio.h> diff --git a/otherlibs/win32unix/times.c b/otherlibs/win32unix/times.c index e6b5ab0ab6..e97d3a5c28 100644 --- a/otherlibs/win32unix/times.c +++ b/otherlibs/win32unix/times.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> #include "unixsupport.h" #include <windows.h> diff --git a/otherlibs/win32unix/unixsupport.c b/otherlibs/win32unix/unixsupport.c index f954dfc967..5c606e0d00 100644 --- a/otherlibs/win32unix/unixsupport.c +++ b/otherlibs/win32unix/unixsupport.c @@ -12,12 +12,12 @@ /***********************************************************************/ #include <stddef.h> -#include <mlvalues.h> -#include <callback.h> -#include <alloc.h> -#include <memory.h> -#include <fail.h> -#include <custom.h> +#include <caml/mlvalues.h> +#include <caml/callback.h> +#include <caml/alloc.h> +#include <caml/memory.h> +#include <caml/fail.h> +#include <caml/custom.h> #include "unixsupport.h" #include "cst2constr.h" #include <errno.h> diff --git a/otherlibs/win32unix/windir.c b/otherlibs/win32unix/windir.c index 7a08e510ad..ef952aa902 100644 --- a/otherlibs/win32unix/windir.c +++ b/otherlibs/win32unix/windir.c @@ -11,11 +11,11 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> #include <errno.h> -#include <alloc.h> -#include <fail.h> +#include <caml/alloc.h> +#include <caml/fail.h> #include "unixsupport.h" CAMLprim value win_findfirst(name) diff --git a/otherlibs/win32unix/winwait.c b/otherlibs/win32unix/winwait.c index 0436072f1c..510a16fea1 100644 --- a/otherlibs/win32unix/winwait.c +++ b/otherlibs/win32unix/winwait.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #include <windows.h> #include <sys/types.h> diff --git a/otherlibs/win32unix/winworker.c b/otherlibs/win32unix/winworker.c index f8ef33e1f0..bcd5947aec 100644 --- a/otherlibs/win32unix/winworker.c +++ b/otherlibs/win32unix/winworker.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "winworker.h" #include "winlist.h" #include "windbug.h" diff --git a/otherlibs/win32unix/write.c b/otherlibs/win32unix/write.c index 65f82ccb5d..dc0ae91b7d 100644 --- a/otherlibs/win32unix/write.c +++ b/otherlibs/win32unix/write.c @@ -13,9 +13,9 @@ #include <errno.h> #include <string.h> -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_write(value fd, value buf, value vofs, value vlen) diff --git a/stdlib/header.c b/stdlib/header.c index cb3d9953a3..5caed8d8ac 100644 --- a/stdlib/header.c +++ b/stdlib/header.c @@ -23,8 +23,8 @@ #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> -#include "../byterun/mlvalues.h" -#include "../byterun/exec.h" +#include "../byterun/caml/mlvalues.h" +#include "../byterun/caml/exec.h" char * default_runtime_path = RUNTIME_NAME; diff --git a/stdlib/headernt.c b/stdlib/headernt.c index aa113ac9d2..e95223dbc1 100644 --- a/stdlib/headernt.c +++ b/stdlib/headernt.c @@ -15,8 +15,8 @@ #define WIN32_LEAN_AND_MEAN #include <windows.h> -#include "mlvalues.h" -#include "exec.h" +#include "caml/mlvalues.h" +#include "caml/exec.h" #ifndef __MINGW32__ #pragma comment(linker , "/entry:headerentry") diff --git a/testsuite/tests/asmcomp/mainarith.c b/testsuite/tests/asmcomp/mainarith.c index d102c16dc3..94ff371e3c 100644 --- a/testsuite/tests/asmcomp/mainarith.c +++ b/testsuite/tests/asmcomp/mainarith.c @@ -16,7 +16,7 @@ #include <stdlib.h> #include <string.h> -#include "../../../byterun/config.h" +#include "../../../byterun/caml/config.h" #define FMT ARCH_INTNAT_PRINTF_FORMAT void caml_ml_array_bound_error(void) diff --git a/testsuite/tests/basic-manyargs/manyargsprim.c b/testsuite/tests/basic-manyargs/manyargsprim.c index 65e9cf5eb8..55fbc2e03d 100644 --- a/testsuite/tests/basic-manyargs/manyargsprim.c +++ b/testsuite/tests/basic-manyargs/manyargsprim.c @@ -10,7 +10,7 @@ /* */ /***********************************************************************/ -#include "mlvalues.h" +#include "caml/mlvalues.h" #include "stdio.h" value manyargs(value a, value b, value c, value d, value e, value f, diff --git a/testsuite/tests/callback/callbackprim.c b/testsuite/tests/callback/callbackprim.c index f3c5981102..71a123d18e 100644 --- a/testsuite/tests/callback/callbackprim.c +++ b/testsuite/tests/callback/callbackprim.c @@ -10,9 +10,9 @@ /* */ /***********************************************************************/ -#include "mlvalues.h" -#include "memory.h" -#include "callback.h" +#include "caml/mlvalues.h" +#include "caml/memory.h" +#include "caml/callback.h" value mycallback1(value fun, value arg) { diff --git a/testsuite/tests/embedded/Makefile b/testsuite/tests/embedded/Makefile index a8de4dc00e..088b021656 100644 --- a/testsuite/tests/embedded/Makefile +++ b/testsuite/tests/embedded/Makefile @@ -18,16 +18,12 @@ default: $(MAKE) run .PHONY: compile -compile: caml - @$(OCAMLC) -ccopt -I -ccopt . cmstub.c - @$(OCAMLC) -ccopt -I -ccopt . cmmain.c +compile: + @$(OCAMLC) -ccopt -I -ccopt $(CTOPDIR)/byterun cmstub.c + @$(OCAMLC) -ccopt -I -ccopt $(CTOPDIR)/byterun cmmain.c @$(OCAMLC) -c cmcaml.ml @$(OCAMLC) -custom -o program cmstub.$(O) cmcaml.cmo cmmain.$(O) -caml: - @mkdir -p caml || : - @cp -f $(TOPDIR)/byterun/*.h caml/ - .PHONY: run run: @printf " ... testing 'cmmain':" @@ -41,6 +37,5 @@ promote: defaultpromote .PHONY: clean clean: defaultclean @rm -f *.result program - @rm -rf caml include $(BASEDIR)/makefiles/Makefile.common diff --git a/testsuite/tests/gc-roots/globrootsprim.c b/testsuite/tests/gc-roots/globrootsprim.c index f7bb32ceab..5c540acf55 100644 --- a/testsuite/tests/gc-roots/globrootsprim.c +++ b/testsuite/tests/gc-roots/globrootsprim.c @@ -13,10 +13,10 @@ /* For testing global root registration */ -#include "mlvalues.h" -#include "memory.h" -#include "alloc.h" -#include "gc.h" +#include "caml/mlvalues.h" +#include "caml/memory.h" +#include "caml/alloc.h" +#include "caml/gc.h" struct block { value header; value v; }; diff --git a/testsuite/tests/lib-bigarray-2/bigarrfstub.c b/testsuite/tests/lib-bigarray-2/bigarrfstub.c index 354082848a..7287298746 100644 --- a/testsuite/tests/lib-bigarray-2/bigarrfstub.c +++ b/testsuite/tests/lib-bigarray-2/bigarrfstub.c @@ -11,7 +11,7 @@ /***********************************************************************/ #include <stdio.h> -#include <mlvalues.h> +#include <caml/mlvalues.h> #include <bigarray.h> extern void filltab_(void); diff --git a/testsuite/tests/lib-dynlink-bytecode/Makefile b/testsuite/tests/lib-dynlink-bytecode/Makefile index 832e367ee6..f9b1c6f9c3 100644 --- a/testsuite/tests/lib-dynlink-bytecode/Makefile +++ b/testsuite/tests/lib-dynlink-bytecode/Makefile @@ -24,10 +24,10 @@ default: fi .PHONY: compile -compile: caml +compile: @$(OCAMLC) -c registry.ml @for file in stub*.c; do \ - $(OCAMLC) -ccopt -I -ccopt . -c $$file; \ + $(OCAMLC) -ccopt -I -ccopt $(CTOPDIR)/byterun/caml -c $$file; \ $(OCAMLMKLIB) -o `echo $$file | sed -e 's/stub/plug/' -e 's/\.c//'` \ `basename $$file c`$(O); \ done @@ -43,10 +43,6 @@ compile: caml @$(OCAMLC) -o custom$(EXE) -custom -linkall registry.cmo plug2.cma \ plug1.cma -I . -caml: - @mkdir -p caml || : - @cp -f $(TOPDIR)/byterun/*.h caml/ - .PHONY: run run: @printf " ... testing 'main'" @@ -70,6 +66,5 @@ promote: defaultpromote .PHONY: clean clean: defaultclean @rm -f main static custom custom.exe *.result marshal.data - @rm -rf caml include $(BASEDIR)/makefiles/Makefile.common diff --git a/testsuite/tests/lib-dynlink-native/Makefile b/testsuite/tests/lib-dynlink-native/Makefile index f4f9d09942..f27438c298 100644 --- a/testsuite/tests/lib-dynlink-native/Makefile +++ b/testsuite/tests/lib-dynlink-native/Makefile @@ -102,14 +102,11 @@ mypack.cmx: packed1.cmx mylib.cmxa: plugin.cmx plugin2.cmx @$(OCAMLOPT) $(COMPFLAGS) -a -o mylib.cmxa plugin.cmx plugin2.cmx -factorial.$(O): factorial.c caml - @$(OCAMLOPT) -c -ccopt "$(SHAREDCCCOMPOPTS)" -ccopt -I -ccopt . \ +factorial.$(O): factorial.c + @$(OCAMLOPT) -c -ccopt "$(SHAREDCCCOMPOPTS)" -ccopt -I \ + -ccopt $(TOPDIR)/byterun/caml \ factorial.c -caml: - @mkdir -p caml || : - @cp $(TOPDIR)/byterun/*.h caml/ - .PHONY: promote promote: @cp result reference @@ -120,6 +117,5 @@ clean: defaultclean @rm -f *.a *.lib @rm -f sub/*.so sub/*.o sub/*.cm* sub/*.s sub/*.asm sub/*.obj @rm -f marshal.data - @rm -rf caml include $(BASEDIR)/makefiles/Makefile.common diff --git a/testsuite/tests/lib-marshal/intextaux.c b/testsuite/tests/lib-marshal/intextaux.c index 924b896e50..03688462d6 100644 --- a/testsuite/tests/lib-marshal/intextaux.c +++ b/testsuite/tests/lib-marshal/intextaux.c @@ -10,8 +10,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <intext.h> +#include <caml/mlvalues.h> +#include <caml/intext.h> value marshal_to_block(value vbuf, value vlen, value v, value vflags) { diff --git a/tools/Makefile.shared b/tools/Makefile.shared index ebceb05a7a..417c2a6f17 100644 --- a/tools/Makefile.shared +++ b/tools/Makefile.shared @@ -257,7 +257,7 @@ dumpobj: $(DUMPOBJ) clean:: rm -f dumpobj -opnames.ml: ../byterun/instruct.h +opnames.ml: ../byterun/caml/instruct.h unset LC_ALL || : ; \ unset LC_CTYPE || : ; \ unset LC_COLLATE LANG || : ; \ @@ -267,7 +267,7 @@ opnames.ml: ../byterun/instruct.h -e 's/.*};$$/ |]/' \ -e 's/\([A-Z][A-Z_0-9a-z]*\)/"\1"/g' \ -e 's/,/;/g' \ - ../byterun/instruct.h > opnames.ml + ../byterun/caml/instruct.h > opnames.ml clean:: rm -f opnames.ml diff --git a/tools/objinfo_helper.c b/tools/objinfo_helper.c index a8c79bd39d..74cfc2ebd6 100644 --- a/tools/objinfo_helper.c +++ b/tools/objinfo_helper.c @@ -10,8 +10,8 @@ /***********************************************************************/ #include "../config/s.h" -#include "../byterun/mlvalues.h" -#include "../byterun/alloc.h" +#include "../byterun/caml/mlvalues.h" +#include "../byterun/caml/alloc.h" #include <stdio.h> #ifdef HAS_LIBBFD From 13990eef7c9f68cecf730f366457c2aafb56fc13 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 12 Apr 2015 09:03:46 +0000 Subject: [PATCH 203/494] headers move, step 3: update .depend (Peter Zotov) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@15999 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- .depend | 3 +- asmrun/.depend | 1737 +++++++++++++++++++--------------- byterun/.depend | 1091 +++++++++++++-------- otherlibs/bigarray/.depend | 41 +- otherlibs/graph/.depend | 125 +-- otherlibs/num/.depend | 25 +- otherlibs/str/.depend | 14 +- otherlibs/systhreads/.depend | 25 +- otherlibs/threads/.depend | 42 +- otherlibs/unix/.depend | 1090 +++++++++++---------- 10 files changed, 2403 insertions(+), 1790 deletions(-) diff --git a/.depend b/.depend index 32b0b62b3c..b475333bed 100644 --- a/.depend +++ b/.depend @@ -130,7 +130,8 @@ typing/typecore.cmi : typing/types.cmi typing/typedtree.cmi typing/path.cmi \ typing/ident.cmi typing/env.cmi parsing/asttypes.cmi typing/annot.cmi typing/typedecl.cmi : typing/types.cmi typing/typedtree.cmi typing/path.cmi \ parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ - typing/includecore.cmi typing/ident.cmi typing/env.cmi + typing/includecore.cmi typing/ident.cmi typing/env.cmi \ + parsing/asttypes.cmi typing/typedtreeIter.cmi : typing/typedtree.cmi parsing/asttypes.cmi typing/typedtreeMap.cmi : typing/typedtree.cmi typing/typedtree.cmi : typing/types.cmi typing/primitive.cmi typing/path.cmi \ diff --git a/asmrun/.depend b/asmrun/.depend index 30043c16fe..ed5b1f26ac 100644 --- a/asmrun/.depend +++ b/asmrun/.depend @@ -1,753 +1,990 @@ -alloc.o: alloc.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/custom.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/stacks.h \ - ../byterun/memory.h -array.o: array.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h -backtrace.o: backtrace.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/backtrace.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h stack.h -callback.o: callback.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/mlvalues.h -compact.o: compact.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/misc.h ../byterun/config.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/memory.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/weak.h -compare.o: compare.c ../byterun/custom.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h -custom.o: custom.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/custom.h ../byterun/fail.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/mlvalues.h -debugger.o: debugger.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/config.h ../byterun/debugger.h \ - ../byterun/misc.h -dynlink.o: dynlink.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/dynlink.h \ - ../byterun/fail.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/osdeps.h \ - ../byterun/prims.h -extern.o: extern.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/custom.h ../byterun/fail.h \ - ../byterun/gc.h ../byterun/intext.h ../byterun/io.h ../byterun/io.h \ - ../byterun/md5.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/reverse.h -fail.o: fail.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/io.h ../byterun/gc.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/printexc.h \ - ../byterun/signals.h stack.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/callback.h -finalise.o: finalise.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/mlvalues.h \ - ../byterun/roots.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/signals.h -floats.o: floats.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/fail.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/reverse.h ../byterun/stacks.h ../byterun/memory.h -freelist.o: freelist.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/major_gc.h ../byterun/misc.h ../byterun/mlvalues.h -gc_ctrl.o: gc_ctrl.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/compact.h ../byterun/custom.h \ - ../byterun/finalise.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/freelist.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h stack.h -globroots.o: globroots.c ../byterun/memory.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/globroots.h ../byterun/roots.h -hash.o: hash.c ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/hash.h -intern.o: intern.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/callback.h ../byterun/custom.h \ - ../byterun/fail.h ../byterun/gc.h ../byterun/intext.h ../byterun/io.h \ - ../byterun/io.h ../byterun/md5.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/reverse.h -ints.o: ints.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/custom.h ../byterun/fail.h ../byterun/intext.h \ - ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h -io.o: io.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/custom.h \ - ../byterun/fail.h ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/signals.h \ - ../byterun/sys.h -lexing.o: lexing.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/mlvalues.h ../byterun/stacks.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h -main.o: main.c ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/sys.h -major_gc.o: major_gc.c ../byterun/compact.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/fail.h ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/weak.h -md5.o: md5.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/md5.h ../byterun/io.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/io.h \ - ../byterun/reverse.h -memory.o: memory.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/freelist.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/signals.h -meta.o: meta.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/fail.h ../byterun/fix_code.h \ - ../byterun/interp.h ../byterun/intext.h ../byterun/io.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/prims.h ../byterun/stacks.h ../byterun/memory.h -minor_gc.o: minor_gc.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/finalise.h \ - ../byterun/roots.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/memory.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/roots.h ../byterun/signals.h \ - ../byterun/weak.h -misc.o: misc.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h -natdynlink.o: natdynlink.c ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h stack.h ../byterun/callback.h ../byterun/alloc.h \ - ../byterun/intext.h ../byterun/io.h ../byterun/osdeps.h \ - ../byterun/fail.h -obj.o: obj.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/gc.h ../byterun/interp.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/prims.h -parsing.o: parsing.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/alloc.h -printexc.o: printexc.c ../byterun/backtrace.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/callback.h ../byterun/debugger.h \ - ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/printexc.h -roots.o: roots.c ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/misc.h ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/globroots.h ../byterun/memory.h \ - ../byterun/major_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h stack.h ../byterun/roots.h -signals_asm.o: signals_asm.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/osdeps.h ../byterun/signals.h ../byterun/signals_machdep.h \ +alloc.o: alloc.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h +array.o: array.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h +backtrace.o: backtrace.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/backtrace.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h +callback.o: callback.c ../byterun/caml/callback.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/mlvalues.h +compact.o: compact.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/finalise.h ../byterun/caml/roots.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ + ../byterun/caml/major_gc.h ../byterun/caml/memory.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/weak.h +compare.o: compare.c ../byterun/caml/custom.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h +custom.o: custom.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/mlvalues.h +debugger.o: debugger.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/config.h ../byterun/caml/debugger.h \ + ../byterun/caml/misc.h +dynlink.o: dynlink.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/dynlink.h \ + ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/osdeps.h ../byterun/caml/prims.h \ + ../byterun/caml/signals.h +extern.o: extern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/gc.h \ + ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/io.h \ + ../byterun/caml/md5.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/reverse.h +fail.o: fail.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/gc.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/printexc.h \ + ../byterun/caml/signals.h stack.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/callback.h +finalise.o: finalise.c ../byterun/caml/callback.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/signals.h +floats.o: floats.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h ../byterun/caml/reverse.h \ + ../byterun/caml/stacks.h ../byterun/caml/memory.h +freelist.o: freelist.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/freelist.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/mlvalues.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h +gc_ctrl.o: gc_ctrl.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/compact.h ../byterun/caml/custom.h \ + ../byterun/caml/finalise.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h stack.h +globroots.o: globroots.c ../byterun/caml/memory.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/globroots.h \ + ../byterun/caml/roots.h +hash.o: hash.c ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/custom.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/hash.h +intern.o: intern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/callback.h ../byterun/caml/custom.h \ + ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/intext.h \ + ../byterun/caml/io.h ../byterun/caml/io.h ../byterun/caml/md5.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/reverse.h +ints.o: ints.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/intext.h \ + ../byterun/caml/io.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h +io.o: io.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/custom.h \ + ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/signals.h ../byterun/caml/sys.h +lexing.o: lexing.c ../byterun/caml/fail.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h +main.o: main.c ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h ../byterun/caml/sys.h +major_gc.o: major_gc.c ../byterun/caml/compact.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/custom.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/fail.h ../byterun/caml/finalise.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ + ../byterun/caml/major_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/weak.h +md5.o: md5.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/md5.h ../byterun/caml/io.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/io.h \ + ../byterun/caml/reverse.h +memory.o: memory.c ../byterun/caml/fail.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/signals.h +meta.o: meta.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/config.h ../byterun/caml/fail.h \ + ../byterun/caml/fix_code.h ../byterun/caml/interp.h \ + ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/prims.h \ + ../byterun/caml/stacks.h ../byterun/caml/memory.h +minor_gc.o: minor_gc.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/fail.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/finalise.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/memory.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/signals.h ../byterun/caml/weak.h +misc.o: misc.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h +natdynlink.o: natdynlink.c ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h stack.h \ + ../byterun/caml/callback.h ../byterun/caml/alloc.h \ + ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/osdeps.h \ + ../byterun/caml/fail.h ../byterun/caml/signals.h +obj.o: obj.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/interp.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/prims.h +parsing.o: parsing.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/alloc.h +printexc.o: printexc.c ../byterun/caml/backtrace.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/callback.h \ + ../byterun/caml/debugger.h ../byterun/caml/fail.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/printexc.h +roots.o: roots.c ../byterun/caml/finalise.h ../byterun/caml/roots.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/globroots.h \ + ../byterun/caml/memory.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h stack.h ../byterun/caml/roots.h +signals_asm.o: signals_asm.c ../byterun/caml/fail.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/osdeps.h \ + ../byterun/caml/signals.h ../byterun/caml/signals_machdep.h \ signals_osdep.h stack.h -signals.o: signals.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/callback.h ../byterun/config.h \ - ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/memory.h ../byterun/signals.h ../byterun/signals_machdep.h \ - ../byterun/sys.h -startup.o: startup.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/backtrace.h ../byterun/custom.h \ - ../byterun/debugger.h ../byterun/fail.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/intext.h ../byterun/io.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/osdeps.h ../byterun/printexc.h stack.h \ - ../byterun/sys.h -str.o: str.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/mlvalues.h ../byterun/misc.h -sys.o: sys.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/debugger.h \ - ../byterun/fail.h ../byterun/instruct.h ../byterun/mlvalues.h \ - ../byterun/osdeps.h ../byterun/signals.h ../byterun/stacks.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/sys.h -terminfo.o: terminfo.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/fail.h \ - ../byterun/io.h ../byterun/mlvalues.h -unix.o: unix.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/osdeps.h -weak.o: weak.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h -alloc.d.o: alloc.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/custom.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/stacks.h \ - ../byterun/memory.h -array.d.o: array.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h -backtrace.d.o: backtrace.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/backtrace.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h stack.h -callback.d.o: callback.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/mlvalues.h -compact.d.o: compact.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/misc.h ../byterun/config.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/memory.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/weak.h -compare.d.o: compare.c ../byterun/custom.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h -custom.d.o: custom.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/custom.h ../byterun/fail.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/mlvalues.h -debugger.d.o: debugger.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/config.h ../byterun/debugger.h \ - ../byterun/misc.h -dynlink.d.o: dynlink.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/dynlink.h \ - ../byterun/fail.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/osdeps.h \ - ../byterun/prims.h -extern.d.o: extern.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/custom.h ../byterun/fail.h \ - ../byterun/gc.h ../byterun/intext.h ../byterun/io.h ../byterun/io.h \ - ../byterun/md5.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/reverse.h -fail.d.o: fail.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/io.h ../byterun/gc.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/printexc.h \ - ../byterun/signals.h stack.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/callback.h -finalise.d.o: finalise.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/mlvalues.h \ - ../byterun/roots.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/signals.h -floats.d.o: floats.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/fail.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/reverse.h ../byterun/stacks.h ../byterun/memory.h -freelist.d.o: freelist.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/major_gc.h ../byterun/misc.h ../byterun/mlvalues.h -gc_ctrl.d.o: gc_ctrl.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/compact.h ../byterun/custom.h \ - ../byterun/finalise.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/freelist.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h stack.h -globroots.d.o: globroots.c ../byterun/memory.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/globroots.h ../byterun/roots.h -hash.d.o: hash.c ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/hash.h -intern.d.o: intern.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/callback.h ../byterun/custom.h \ - ../byterun/fail.h ../byterun/gc.h ../byterun/intext.h ../byterun/io.h \ - ../byterun/io.h ../byterun/md5.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/reverse.h -ints.d.o: ints.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/custom.h ../byterun/fail.h ../byterun/intext.h \ - ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h -io.d.o: io.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/custom.h \ - ../byterun/fail.h ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/signals.h \ - ../byterun/sys.h -lexing.d.o: lexing.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/mlvalues.h ../byterun/stacks.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h -main.d.o: main.c ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/sys.h -major_gc.d.o: major_gc.c ../byterun/compact.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/fail.h ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/weak.h -md5.d.o: md5.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/md5.h ../byterun/io.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/io.h \ - ../byterun/reverse.h -memory.d.o: memory.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/freelist.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/signals.h -meta.d.o: meta.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/fail.h ../byterun/fix_code.h \ - ../byterun/interp.h ../byterun/intext.h ../byterun/io.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/prims.h ../byterun/stacks.h ../byterun/memory.h -minor_gc.d.o: minor_gc.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/finalise.h \ - ../byterun/roots.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/memory.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/roots.h ../byterun/signals.h \ - ../byterun/weak.h -misc.d.o: misc.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h -natdynlink.d.o: natdynlink.c ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h stack.h ../byterun/callback.h ../byterun/alloc.h \ - ../byterun/intext.h ../byterun/io.h ../byterun/osdeps.h \ - ../byterun/fail.h -obj.d.o: obj.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/gc.h ../byterun/interp.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/prims.h -parsing.d.o: parsing.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/alloc.h -printexc.d.o: printexc.c ../byterun/backtrace.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/callback.h ../byterun/debugger.h \ - ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/printexc.h -roots.d.o: roots.c ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/misc.h ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/globroots.h ../byterun/memory.h \ - ../byterun/major_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h stack.h ../byterun/roots.h -signals_asm.d.o: signals_asm.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/osdeps.h ../byterun/signals.h ../byterun/signals_machdep.h \ +signals.o: signals.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/callback.h ../byterun/caml/config.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/signals.h \ + ../byterun/caml/signals_machdep.h ../byterun/caml/sys.h +startup.o: startup.c ../byterun/caml/callback.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/backtrace.h \ + ../byterun/caml/custom.h ../byterun/caml/debugger.h \ + ../byterun/caml/fail.h ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/intext.h ../byterun/caml/io.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/osdeps.h ../byterun/caml/printexc.h stack.h \ + ../byterun/caml/sys.h +str.o: str.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/mlvalues.h ../byterun/caml/misc.h +sys.o: sys.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/debugger.h \ + ../byterun/caml/fail.h ../byterun/caml/instruct.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/osdeps.h \ + ../byterun/caml/signals.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/sys.h +terminfo.o: terminfo.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/fail.h ../byterun/caml/io.h \ + ../byterun/caml/mlvalues.h +unix.o: unix.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/memory.h \ + ../byterun/caml/config.h ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/osdeps.h +weak.o: weak.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/mlvalues.h +alloc.d.o: alloc.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h +array.d.o: array.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h +backtrace.d.o: backtrace.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/backtrace.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h +callback.d.o: callback.c ../byterun/caml/callback.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/mlvalues.h +compact.d.o: compact.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/finalise.h ../byterun/caml/roots.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ + ../byterun/caml/major_gc.h ../byterun/caml/memory.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/weak.h +compare.d.o: compare.c ../byterun/caml/custom.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h +custom.d.o: custom.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/mlvalues.h +debugger.d.o: debugger.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/config.h ../byterun/caml/debugger.h \ + ../byterun/caml/misc.h +dynlink.d.o: dynlink.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/dynlink.h \ + ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/osdeps.h ../byterun/caml/prims.h \ + ../byterun/caml/signals.h +extern.d.o: extern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/gc.h \ + ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/io.h \ + ../byterun/caml/md5.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/reverse.h +fail.d.o: fail.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/gc.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/printexc.h \ + ../byterun/caml/signals.h stack.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/callback.h +finalise.d.o: finalise.c ../byterun/caml/callback.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/signals.h +floats.d.o: floats.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h ../byterun/caml/reverse.h \ + ../byterun/caml/stacks.h ../byterun/caml/memory.h +freelist.d.o: freelist.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/freelist.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/mlvalues.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h +gc_ctrl.d.o: gc_ctrl.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/compact.h ../byterun/caml/custom.h \ + ../byterun/caml/finalise.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h stack.h +globroots.d.o: globroots.c ../byterun/caml/memory.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/globroots.h \ + ../byterun/caml/roots.h +hash.d.o: hash.c ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/custom.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/hash.h +intern.d.o: intern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/callback.h ../byterun/caml/custom.h \ + ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/intext.h \ + ../byterun/caml/io.h ../byterun/caml/io.h ../byterun/caml/md5.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/reverse.h +ints.d.o: ints.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/intext.h \ + ../byterun/caml/io.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h +io.d.o: io.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/custom.h \ + ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/signals.h ../byterun/caml/sys.h +lexing.d.o: lexing.c ../byterun/caml/fail.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h +main.d.o: main.c ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h ../byterun/caml/sys.h +major_gc.d.o: major_gc.c ../byterun/caml/compact.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/custom.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/fail.h ../byterun/caml/finalise.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ + ../byterun/caml/major_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/weak.h +md5.d.o: md5.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/md5.h ../byterun/caml/io.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/io.h \ + ../byterun/caml/reverse.h +memory.d.o: memory.c ../byterun/caml/fail.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/signals.h +meta.d.o: meta.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/config.h ../byterun/caml/fail.h \ + ../byterun/caml/fix_code.h ../byterun/caml/interp.h \ + ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/prims.h \ + ../byterun/caml/stacks.h ../byterun/caml/memory.h +minor_gc.d.o: minor_gc.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/fail.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/finalise.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/memory.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/signals.h ../byterun/caml/weak.h +misc.d.o: misc.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h +natdynlink.d.o: natdynlink.c ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h stack.h \ + ../byterun/caml/callback.h ../byterun/caml/alloc.h \ + ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/osdeps.h \ + ../byterun/caml/fail.h ../byterun/caml/signals.h +obj.d.o: obj.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/interp.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/prims.h +parsing.d.o: parsing.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/alloc.h +printexc.d.o: printexc.c ../byterun/caml/backtrace.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/callback.h \ + ../byterun/caml/debugger.h ../byterun/caml/fail.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/printexc.h +roots.d.o: roots.c ../byterun/caml/finalise.h ../byterun/caml/roots.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/globroots.h \ + ../byterun/caml/memory.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h stack.h ../byterun/caml/roots.h +signals_asm.d.o: signals_asm.c ../byterun/caml/fail.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/osdeps.h \ + ../byterun/caml/signals.h ../byterun/caml/signals_machdep.h \ signals_osdep.h stack.h -signals.d.o: signals.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/callback.h ../byterun/config.h \ - ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/memory.h ../byterun/signals.h ../byterun/signals_machdep.h \ - ../byterun/sys.h -startup.d.o: startup.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/backtrace.h ../byterun/custom.h \ - ../byterun/debugger.h ../byterun/fail.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/intext.h ../byterun/io.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/osdeps.h ../byterun/printexc.h stack.h \ - ../byterun/sys.h -str.d.o: str.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/mlvalues.h ../byterun/misc.h -sys.d.o: sys.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/debugger.h \ - ../byterun/fail.h ../byterun/instruct.h ../byterun/mlvalues.h \ - ../byterun/osdeps.h ../byterun/signals.h ../byterun/stacks.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/sys.h -terminfo.d.o: terminfo.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/fail.h \ - ../byterun/io.h ../byterun/mlvalues.h -unix.d.o: unix.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/osdeps.h -weak.d.o: weak.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h -alloc.p.o: alloc.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/custom.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/stacks.h \ - ../byterun/memory.h -array.p.o: array.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h -backtrace.p.o: backtrace.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/backtrace.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h stack.h -callback.p.o: callback.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/mlvalues.h -compact.p.o: compact.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/misc.h ../byterun/config.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/memory.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/weak.h -compare.p.o: compare.c ../byterun/custom.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h -custom.p.o: custom.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/custom.h ../byterun/fail.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/mlvalues.h -debugger.p.o: debugger.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/config.h ../byterun/debugger.h \ - ../byterun/misc.h -dynlink.p.o: dynlink.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/dynlink.h \ - ../byterun/fail.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/osdeps.h \ - ../byterun/prims.h -extern.p.o: extern.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/custom.h ../byterun/fail.h \ - ../byterun/gc.h ../byterun/intext.h ../byterun/io.h ../byterun/io.h \ - ../byterun/md5.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/reverse.h -fail.p.o: fail.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/io.h ../byterun/gc.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/printexc.h \ - ../byterun/signals.h stack.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/callback.h -finalise.p.o: finalise.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/mlvalues.h \ - ../byterun/roots.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/signals.h -floats.p.o: floats.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/fail.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/reverse.h ../byterun/stacks.h ../byterun/memory.h -freelist.p.o: freelist.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/major_gc.h ../byterun/misc.h ../byterun/mlvalues.h -gc_ctrl.p.o: gc_ctrl.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/compact.h ../byterun/custom.h \ - ../byterun/finalise.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/freelist.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h stack.h -globroots.p.o: globroots.c ../byterun/memory.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/globroots.h ../byterun/roots.h -hash.p.o: hash.c ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/hash.h -intern.p.o: intern.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/callback.h ../byterun/custom.h \ - ../byterun/fail.h ../byterun/gc.h ../byterun/intext.h ../byterun/io.h \ - ../byterun/io.h ../byterun/md5.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/reverse.h -ints.p.o: ints.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/custom.h ../byterun/fail.h ../byterun/intext.h \ - ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h -io.p.o: io.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/custom.h \ - ../byterun/fail.h ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/signals.h \ - ../byterun/sys.h -lexing.p.o: lexing.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/mlvalues.h ../byterun/stacks.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h -main.p.o: main.c ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/sys.h -major_gc.p.o: major_gc.c ../byterun/compact.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/fail.h ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/weak.h -md5.p.o: md5.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/md5.h ../byterun/io.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/io.h \ - ../byterun/reverse.h -memory.p.o: memory.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/freelist.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/signals.h -meta.p.o: meta.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/fail.h ../byterun/fix_code.h \ - ../byterun/interp.h ../byterun/intext.h ../byterun/io.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/prims.h ../byterun/stacks.h ../byterun/memory.h -minor_gc.p.o: minor_gc.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/finalise.h \ - ../byterun/roots.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/memory.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/roots.h ../byterun/signals.h \ - ../byterun/weak.h -misc.p.o: misc.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h -natdynlink.p.o: natdynlink.c ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h stack.h ../byterun/callback.h ../byterun/alloc.h \ - ../byterun/intext.h ../byterun/io.h ../byterun/osdeps.h \ - ../byterun/fail.h -obj.p.o: obj.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/gc.h ../byterun/interp.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/prims.h -parsing.p.o: parsing.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/alloc.h -printexc.p.o: printexc.c ../byterun/backtrace.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/callback.h ../byterun/debugger.h \ - ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/printexc.h -roots.p.o: roots.c ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/misc.h ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/globroots.h ../byterun/memory.h \ - ../byterun/major_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h stack.h ../byterun/roots.h -signals_asm.p.o: signals_asm.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/osdeps.h ../byterun/signals.h ../byterun/signals_machdep.h \ +signals.d.o: signals.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/callback.h ../byterun/caml/config.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/signals.h \ + ../byterun/caml/signals_machdep.h ../byterun/caml/sys.h +startup.d.o: startup.c ../byterun/caml/callback.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/backtrace.h \ + ../byterun/caml/custom.h ../byterun/caml/debugger.h \ + ../byterun/caml/fail.h ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/intext.h ../byterun/caml/io.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/osdeps.h ../byterun/caml/printexc.h stack.h \ + ../byterun/caml/sys.h +str.d.o: str.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/mlvalues.h ../byterun/caml/misc.h +sys.d.o: sys.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/debugger.h \ + ../byterun/caml/fail.h ../byterun/caml/instruct.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/osdeps.h \ + ../byterun/caml/signals.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/sys.h +terminfo.d.o: terminfo.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/fail.h ../byterun/caml/io.h \ + ../byterun/caml/mlvalues.h +unix.d.o: unix.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/memory.h \ + ../byterun/caml/config.h ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/osdeps.h +weak.d.o: weak.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/mlvalues.h +alloc.p.o: alloc.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h +array.p.o: array.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h +backtrace.p.o: backtrace.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/backtrace.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h +callback.p.o: callback.c ../byterun/caml/callback.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/mlvalues.h +compact.p.o: compact.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/finalise.h ../byterun/caml/roots.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ + ../byterun/caml/major_gc.h ../byterun/caml/memory.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/weak.h +compare.p.o: compare.c ../byterun/caml/custom.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h +custom.p.o: custom.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/mlvalues.h +debugger.p.o: debugger.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/config.h ../byterun/caml/debugger.h \ + ../byterun/caml/misc.h +dynlink.p.o: dynlink.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/dynlink.h \ + ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/osdeps.h ../byterun/caml/prims.h \ + ../byterun/caml/signals.h +extern.p.o: extern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/gc.h \ + ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/io.h \ + ../byterun/caml/md5.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/reverse.h +fail.p.o: fail.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/gc.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/printexc.h \ + ../byterun/caml/signals.h stack.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/callback.h +finalise.p.o: finalise.c ../byterun/caml/callback.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/signals.h +floats.p.o: floats.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h ../byterun/caml/reverse.h \ + ../byterun/caml/stacks.h ../byterun/caml/memory.h +freelist.p.o: freelist.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/freelist.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/mlvalues.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h +gc_ctrl.p.o: gc_ctrl.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/compact.h ../byterun/caml/custom.h \ + ../byterun/caml/finalise.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h stack.h +globroots.p.o: globroots.c ../byterun/caml/memory.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/globroots.h \ + ../byterun/caml/roots.h +hash.p.o: hash.c ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/custom.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/hash.h +intern.p.o: intern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/callback.h ../byterun/caml/custom.h \ + ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/intext.h \ + ../byterun/caml/io.h ../byterun/caml/io.h ../byterun/caml/md5.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/reverse.h +ints.p.o: ints.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/intext.h \ + ../byterun/caml/io.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h +io.p.o: io.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/custom.h \ + ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/signals.h ../byterun/caml/sys.h +lexing.p.o: lexing.c ../byterun/caml/fail.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h +main.p.o: main.c ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h ../byterun/caml/sys.h +major_gc.p.o: major_gc.c ../byterun/caml/compact.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/custom.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/fail.h ../byterun/caml/finalise.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ + ../byterun/caml/major_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/weak.h +md5.p.o: md5.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/md5.h ../byterun/caml/io.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/io.h \ + ../byterun/caml/reverse.h +memory.p.o: memory.c ../byterun/caml/fail.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/signals.h +meta.p.o: meta.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/config.h ../byterun/caml/fail.h \ + ../byterun/caml/fix_code.h ../byterun/caml/interp.h \ + ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/prims.h \ + ../byterun/caml/stacks.h ../byterun/caml/memory.h +minor_gc.p.o: minor_gc.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/fail.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/finalise.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/memory.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/signals.h ../byterun/caml/weak.h +misc.p.o: misc.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h +natdynlink.p.o: natdynlink.c ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h stack.h \ + ../byterun/caml/callback.h ../byterun/caml/alloc.h \ + ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/osdeps.h \ + ../byterun/caml/fail.h ../byterun/caml/signals.h +obj.p.o: obj.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/interp.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/prims.h +parsing.p.o: parsing.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/alloc.h +printexc.p.o: printexc.c ../byterun/caml/backtrace.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/callback.h \ + ../byterun/caml/debugger.h ../byterun/caml/fail.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/printexc.h +roots.p.o: roots.c ../byterun/caml/finalise.h ../byterun/caml/roots.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/globroots.h \ + ../byterun/caml/memory.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h stack.h ../byterun/caml/roots.h +signals_asm.p.o: signals_asm.c ../byterun/caml/fail.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/osdeps.h \ + ../byterun/caml/signals.h ../byterun/caml/signals_machdep.h \ signals_osdep.h stack.h -signals.p.o: signals.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/callback.h ../byterun/config.h \ - ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/memory.h ../byterun/signals.h ../byterun/signals_machdep.h \ - ../byterun/sys.h -startup.p.o: startup.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/backtrace.h ../byterun/custom.h \ - ../byterun/debugger.h ../byterun/fail.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/intext.h ../byterun/io.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/osdeps.h ../byterun/printexc.h stack.h \ - ../byterun/sys.h -str.p.o: str.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/mlvalues.h ../byterun/misc.h -sys.p.o: sys.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/debugger.h \ - ../byterun/fail.h ../byterun/instruct.h ../byterun/mlvalues.h \ - ../byterun/osdeps.h ../byterun/signals.h ../byterun/stacks.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/sys.h -terminfo.p.o: terminfo.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/fail.h \ - ../byterun/io.h ../byterun/mlvalues.h -unix.p.o: unix.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/osdeps.h -weak.p.o: weak.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h +signals.p.o: signals.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/callback.h ../byterun/caml/config.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/signals.h \ + ../byterun/caml/signals_machdep.h ../byterun/caml/sys.h +startup.p.o: startup.c ../byterun/caml/callback.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/backtrace.h \ + ../byterun/caml/custom.h ../byterun/caml/debugger.h \ + ../byterun/caml/fail.h ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/intext.h ../byterun/caml/io.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/osdeps.h ../byterun/caml/printexc.h stack.h \ + ../byterun/caml/sys.h +str.p.o: str.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/mlvalues.h ../byterun/caml/misc.h +sys.p.o: sys.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/debugger.h \ + ../byterun/caml/fail.h ../byterun/caml/instruct.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/osdeps.h \ + ../byterun/caml/signals.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/sys.h +terminfo.p.o: terminfo.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/fail.h ../byterun/caml/io.h \ + ../byterun/caml/mlvalues.h +unix.p.o: unix.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/memory.h \ + ../byterun/caml/config.h ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/osdeps.h +weak.p.o: weak.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/mlvalues.h diff --git a/byterun/.depend b/byterun/.depend index 823b58101f..6cfcbd2b55 100644 --- a/byterun/.depend +++ b/byterun/.depend @@ -1,419 +1,676 @@ -alloc.o: alloc.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h major_gc.h freelist.h memory.h gc.h \ - minor_gc.h stacks.h -array.o: array.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h -backtrace.o: backtrace.c config.h ../config/m.h ../config/s.h \ - compatibility.h mlvalues.h misc.h alloc.h io.h instruct.h intext.h \ - exec.h fix_code.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - startup.h stacks.h sys.h backtrace.h fail.h -callback.o: callback.c callback.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h interp.h instruct.h fix_code.h stacks.h -compact.o: compact.c config.h ../config/m.h ../config/s.h compatibility.h \ - finalise.h roots.h misc.h memory.h gc.h mlvalues.h major_gc.h freelist.h \ - minor_gc.h gc_ctrl.h weak.h -compare.o: compare.c custom.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h -custom.o: custom.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h -debugger.o: debugger.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h debugger.h fail.h fix_code.h \ - instruct.h intext.h io.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h sys.h -dynlink.o: dynlink.c config.h ../config/m.h ../config/s.h compatibility.h \ - alloc.h misc.h mlvalues.h dynlink.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h osdeps.h prims.h -extern.o: extern.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h gc.h intext.h io.h md5.h \ - memory.h major_gc.h freelist.h minor_gc.h reverse.h -fail.o: fail.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h io.h gc.h memory.h major_gc.h freelist.h \ - minor_gc.h printexc.h signals.h stacks.h -finalise.o: finalise.c callback.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h roots.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h signals.h -fix_code.o: fix_code.c config.h ../config/m.h ../config/s.h \ - compatibility.h debugger.h misc.h mlvalues.h fix_code.h instruct.h \ - intext.h io.h md5.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - reverse.h -floats.o: floats.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h reverse.h stacks.h -freelist.o: freelist.c config.h ../config/m.h ../config/s.h \ - compatibility.h freelist.h misc.h mlvalues.h gc.h gc_ctrl.h memory.h \ - major_gc.h minor_gc.h -gc_ctrl.o: gc_ctrl.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h compact.h custom.h finalise.h \ - roots.h memory.h gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h \ - stacks.h -globroots.o: globroots.c memory.h compatibility.h config.h ../config/m.h \ - ../config/s.h gc.h mlvalues.h misc.h major_gc.h freelist.h minor_gc.h \ - roots.h globroots.h -hash.o: hash.c mlvalues.h compatibility.h config.h ../config/m.h \ - ../config/s.h misc.h custom.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h hash.h +alloc.o: alloc.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/major_gc.h caml/freelist.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h caml/mlvalues.h \ + caml/stacks.h caml/memory.h +array.o: array.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/misc.h caml/mlvalues.h +backtrace.o: backtrace.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/mlvalues.h caml/config.h \ + caml/misc.h caml/alloc.h caml/mlvalues.h caml/io.h caml/instruct.h \ + caml/intext.h caml/io.h caml/exec.h caml/fix_code.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/startup.h \ + caml/exec.h caml/stacks.h caml/memory.h caml/sys.h caml/backtrace.h \ + caml/fail.h +callback.o: callback.c caml/callback.h caml/compatibility.h \ + caml/mlvalues.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/fail.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/mlvalues.h \ + caml/interp.h caml/instruct.h caml/fix_code.h caml/stacks.h \ + caml/memory.h +compact.o: compact.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/finalise.h caml/roots.h \ + caml/misc.h caml/config.h caml/memory.h caml/gc.h caml/mlvalues.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/freelist.h \ + caml/gc.h caml/gc_ctrl.h caml/major_gc.h caml/memory.h caml/mlvalues.h \ + caml/roots.h caml/weak.h +compare.o: compare.c caml/custom.h caml/compatibility.h caml/mlvalues.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h caml/misc.h \ + caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h +custom.o: custom.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/mlvalues.h +debugger.o: debugger.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/config.h caml/debugger.h caml/misc.h caml/fail.h \ + caml/fix_code.h caml/instruct.h caml/intext.h caml/io.h caml/io.h \ + caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/sys.h +dynlink.o: dynlink.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/dynlink.h caml/fail.h caml/mlvalues.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/misc.h caml/osdeps.h caml/prims.h caml/signals.h +extern.o: extern.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \ + caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/misc.h caml/mlvalues.h \ + caml/reverse.h +fail.o: fail.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/io.h caml/gc.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/printexc.h caml/signals.h caml/stacks.h \ + caml/memory.h +finalise.o: finalise.c caml/callback.h caml/compatibility.h \ + caml/mlvalues.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/fail.h caml/mlvalues.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/signals.h +fix_code.o: fix_code.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/debugger.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/fix_code.h caml/instruct.h \ + caml/intext.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/reverse.h +floats.o: floats.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/mlvalues.h caml/misc.h \ + caml/reverse.h caml/stacks.h caml/memory.h +freelist.o: freelist.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/freelist.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/gc.h caml/gc_ctrl.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/major_gc.h caml/misc.h caml/mlvalues.h +gc_ctrl.o: gc_ctrl.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/compact.h caml/custom.h caml/finalise.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/stacks.h +globroots.o: globroots.c caml/memory.h caml/compatibility.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/gc.h caml/mlvalues.h \ + caml/misc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/roots.h caml/memory.h caml/globroots.h caml/roots.h +hash.o: hash.c caml/mlvalues.h caml/compatibility.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/custom.h \ + caml/mlvalues.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/hash.h instrtrace.o: instrtrace.c -intern.o: intern.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h callback.h custom.h fail.h gc.h intext.h io.h \ - md5.h memory.h major_gc.h freelist.h minor_gc.h reverse.h -interp.o: interp.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h backtrace.h callback.h debugger.h fail.h \ - fix_code.h instrtrace.h instruct.h interp.h major_gc.h freelist.h \ - memory.h gc.h minor_gc.h prims.h signals.h stacks.h jumptbl.h -ints.o: ints.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h intext.h io.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h -io.o: io.c config.h ../config/m.h ../config/s.h compatibility.h alloc.h \ - misc.h mlvalues.h custom.h fail.h io.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h signals.h sys.h -lexing.o: lexing.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h -main.o: main.c misc.h compatibility.h config.h ../config/m.h \ - ../config/s.h mlvalues.h sys.h -major_gc.o: major_gc.c compact.h config.h ../config/m.h ../config/s.h \ - compatibility.h misc.h custom.h mlvalues.h fail.h finalise.h roots.h \ - memory.h gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h weak.h -md5.o: md5.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h md5.h io.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h reverse.h -memory.o: memory.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h freelist.h gc.h gc_ctrl.h major_gc.h memory.h \ - minor_gc.h signals.h -meta.o: meta.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h fix_code.h interp.h intext.h io.h \ - major_gc.h freelist.h memory.h gc.h minor_gc.h prims.h stacks.h -minor_gc.o: minor_gc.c config.h ../config/m.h ../config/s.h \ - compatibility.h fail.h misc.h mlvalues.h finalise.h roots.h memory.h \ - gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h signals.h weak.h -misc.o: misc.c config.h ../config/m.h ../config/s.h compatibility.h \ - misc.h memory.h gc.h mlvalues.h major_gc.h freelist.h minor_gc.h -obj.o: obj.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h gc.h interp.h major_gc.h freelist.h \ - memory.h minor_gc.h prims.h -parsing.o: parsing.c config.h ../config/m.h ../config/s.h compatibility.h \ - mlvalues.h misc.h memory.h gc.h major_gc.h freelist.h minor_gc.h alloc.h -prims.o: prims.c mlvalues.h compatibility.h config.h ../config/m.h \ - ../config/s.h misc.h prims.h -printexc.o: printexc.c backtrace.h mlvalues.h compatibility.h config.h \ - ../config/m.h ../config/s.h misc.h callback.h debugger.h fail.h \ - printexc.h -roots.o: roots.c finalise.h roots.h misc.h compatibility.h config.h \ - ../config/m.h ../config/s.h memory.h gc.h mlvalues.h major_gc.h \ - freelist.h minor_gc.h globroots.h stacks.h -signals_byt.o: signals_byt.c config.h ../config/m.h ../config/s.h \ - compatibility.h memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h \ - minor_gc.h osdeps.h signals.h signals_machdep.h -signals.o: signals.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h callback.h fail.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h roots.h signals.h signals_machdep.h \ - sys.h -stacks.o: stacks.c config.h ../config/m.h ../config/s.h compatibility.h \ - fail.h misc.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h -startup.o: startup.c config.h ../config/m.h ../config/s.h compatibility.h \ - alloc.h misc.h mlvalues.h backtrace.h callback.h custom.h debugger.h \ - dynlink.h exec.h fail.h fix_code.h freelist.h gc_ctrl.h instrtrace.h \ - interp.h intext.h io.h memory.h gc.h major_gc.h minor_gc.h osdeps.h \ - prims.h printexc.h reverse.h signals.h stacks.h sys.h startup.h \ - version.h -str.o: str.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h -sys.o: sys.c config.h ../config/m.h ../config/s.h compatibility.h alloc.h \ - misc.h mlvalues.h debugger.h fail.h instruct.h osdeps.h signals.h \ - stacks.h memory.h gc.h major_gc.h freelist.h minor_gc.h sys.h -terminfo.o: terminfo.c config.h ../config/m.h ../config/s.h \ - compatibility.h alloc.h misc.h mlvalues.h fail.h io.h -unix.o: unix.c config.h ../config/m.h ../config/s.h compatibility.h \ - memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h minor_gc.h \ - osdeps.h -weak.o: weak.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h major_gc.h freelist.h memory.h gc.h \ - minor_gc.h -win32.o: win32.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - osdeps.h signals.h sys.h -alloc.d.o: alloc.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h major_gc.h freelist.h memory.h gc.h \ - minor_gc.h stacks.h -array.d.o: array.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h -backtrace.d.o: backtrace.c config.h ../config/m.h ../config/s.h \ - compatibility.h mlvalues.h misc.h alloc.h io.h instruct.h intext.h \ - exec.h fix_code.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - startup.h stacks.h sys.h backtrace.h fail.h -callback.d.o: callback.c callback.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h interp.h instruct.h fix_code.h stacks.h -compact.d.o: compact.c config.h ../config/m.h ../config/s.h compatibility.h \ - finalise.h roots.h misc.h memory.h gc.h mlvalues.h major_gc.h freelist.h \ - minor_gc.h gc_ctrl.h weak.h -compare.d.o: compare.c custom.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h -custom.d.o: custom.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h -debugger.d.o: debugger.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h debugger.h fail.h fix_code.h \ - instruct.h intext.h io.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h sys.h -dynlink.d.o: dynlink.c config.h ../config/m.h ../config/s.h compatibility.h \ - alloc.h misc.h mlvalues.h dynlink.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h osdeps.h prims.h -extern.d.o: extern.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h gc.h intext.h io.h md5.h \ - memory.h major_gc.h freelist.h minor_gc.h reverse.h -fail.d.o: fail.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h io.h gc.h memory.h major_gc.h freelist.h \ - minor_gc.h printexc.h signals.h stacks.h -finalise.d.o: finalise.c callback.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h roots.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h signals.h -fix_code.d.o: fix_code.c config.h ../config/m.h ../config/s.h \ - compatibility.h debugger.h misc.h mlvalues.h fix_code.h instruct.h \ - intext.h io.h md5.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - reverse.h -floats.d.o: floats.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h reverse.h stacks.h -freelist.d.o: freelist.c config.h ../config/m.h ../config/s.h \ - compatibility.h freelist.h misc.h mlvalues.h gc.h gc_ctrl.h memory.h \ - major_gc.h minor_gc.h -gc_ctrl.d.o: gc_ctrl.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h compact.h custom.h finalise.h \ - roots.h memory.h gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h \ - stacks.h -globroots.d.o: globroots.c memory.h compatibility.h config.h ../config/m.h \ - ../config/s.h gc.h mlvalues.h misc.h major_gc.h freelist.h minor_gc.h \ - roots.h globroots.h -hash.d.o: hash.c mlvalues.h compatibility.h config.h ../config/m.h \ - ../config/s.h misc.h custom.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h hash.h -instrtrace.d.o: instrtrace.c instruct.h misc.h compatibility.h config.h \ - ../config/m.h ../config/s.h mlvalues.h opnames.h prims.h stacks.h \ - memory.h gc.h major_gc.h freelist.h minor_gc.h -intern.d.o: intern.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h callback.h custom.h fail.h gc.h intext.h io.h \ - md5.h memory.h major_gc.h freelist.h minor_gc.h reverse.h -interp.d.o: interp.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h backtrace.h callback.h debugger.h fail.h \ - fix_code.h instrtrace.h instruct.h interp.h major_gc.h freelist.h \ - memory.h gc.h minor_gc.h prims.h signals.h stacks.h -ints.d.o: ints.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h intext.h io.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h -io.d.o: io.c config.h ../config/m.h ../config/s.h compatibility.h alloc.h \ - misc.h mlvalues.h custom.h fail.h io.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h signals.h sys.h -lexing.d.o: lexing.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h -main.d.o: main.c misc.h compatibility.h config.h ../config/m.h \ - ../config/s.h mlvalues.h sys.h -major_gc.d.o: major_gc.c compact.h config.h ../config/m.h ../config/s.h \ - compatibility.h misc.h custom.h mlvalues.h fail.h finalise.h roots.h \ - memory.h gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h weak.h -md5.d.o: md5.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h md5.h io.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h reverse.h -memory.d.o: memory.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h freelist.h gc.h gc_ctrl.h major_gc.h memory.h \ - minor_gc.h signals.h -meta.d.o: meta.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h fix_code.h interp.h intext.h io.h \ - major_gc.h freelist.h memory.h gc.h minor_gc.h prims.h stacks.h -minor_gc.d.o: minor_gc.c config.h ../config/m.h ../config/s.h \ - compatibility.h fail.h misc.h mlvalues.h finalise.h roots.h memory.h \ - gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h signals.h weak.h -misc.d.o: misc.c config.h ../config/m.h ../config/s.h compatibility.h \ - misc.h memory.h gc.h mlvalues.h major_gc.h freelist.h minor_gc.h -obj.d.o: obj.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h gc.h interp.h major_gc.h freelist.h \ - memory.h minor_gc.h prims.h -parsing.d.o: parsing.c config.h ../config/m.h ../config/s.h compatibility.h \ - mlvalues.h misc.h memory.h gc.h major_gc.h freelist.h minor_gc.h alloc.h -prims.d.o: prims.c mlvalues.h compatibility.h config.h ../config/m.h \ - ../config/s.h misc.h prims.h -printexc.d.o: printexc.c backtrace.h mlvalues.h compatibility.h config.h \ - ../config/m.h ../config/s.h misc.h callback.h debugger.h fail.h \ - printexc.h -roots.d.o: roots.c finalise.h roots.h misc.h compatibility.h config.h \ - ../config/m.h ../config/s.h memory.h gc.h mlvalues.h major_gc.h \ - freelist.h minor_gc.h globroots.h stacks.h -signals_byt.d.o: signals_byt.c config.h ../config/m.h ../config/s.h \ - compatibility.h memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h \ - minor_gc.h osdeps.h signals.h signals_machdep.h -signals.d.o: signals.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h callback.h fail.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h roots.h signals.h signals_machdep.h \ - sys.h -stacks.d.o: stacks.c config.h ../config/m.h ../config/s.h compatibility.h \ - fail.h misc.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h -startup.d.o: startup.c config.h ../config/m.h ../config/s.h compatibility.h \ - alloc.h misc.h mlvalues.h backtrace.h callback.h custom.h debugger.h \ - dynlink.h exec.h fail.h fix_code.h freelist.h gc_ctrl.h instrtrace.h \ - interp.h intext.h io.h memory.h gc.h major_gc.h minor_gc.h osdeps.h \ - prims.h printexc.h reverse.h signals.h stacks.h sys.h startup.h \ - version.h -str.d.o: str.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h -sys.d.o: sys.c config.h ../config/m.h ../config/s.h compatibility.h alloc.h \ - misc.h mlvalues.h debugger.h fail.h instruct.h osdeps.h signals.h \ - stacks.h memory.h gc.h major_gc.h freelist.h minor_gc.h sys.h -terminfo.d.o: terminfo.c config.h ../config/m.h ../config/s.h \ - compatibility.h alloc.h misc.h mlvalues.h fail.h io.h -unix.d.o: unix.c config.h ../config/m.h ../config/s.h compatibility.h \ - memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h minor_gc.h \ - osdeps.h -weak.d.o: weak.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h major_gc.h freelist.h memory.h gc.h \ - minor_gc.h -win32.d.o: win32.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - osdeps.h signals.h sys.h -alloc.pic.o: alloc.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h major_gc.h freelist.h memory.h gc.h \ - minor_gc.h stacks.h -array.pic.o: array.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h -backtrace.pic.o: backtrace.c config.h ../config/m.h ../config/s.h \ - compatibility.h mlvalues.h misc.h alloc.h io.h instruct.h intext.h \ - exec.h fix_code.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - startup.h stacks.h sys.h backtrace.h fail.h -callback.pic.o: callback.c callback.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h interp.h instruct.h fix_code.h stacks.h -compact.pic.o: compact.c config.h ../config/m.h ../config/s.h compatibility.h \ - finalise.h roots.h misc.h memory.h gc.h mlvalues.h major_gc.h freelist.h \ - minor_gc.h gc_ctrl.h weak.h -compare.pic.o: compare.c custom.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h -custom.pic.o: custom.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h -debugger.pic.o: debugger.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h debugger.h fail.h fix_code.h \ - instruct.h intext.h io.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h sys.h -dynlink.pic.o: dynlink.c config.h ../config/m.h ../config/s.h compatibility.h \ - alloc.h misc.h mlvalues.h dynlink.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h osdeps.h prims.h -extern.pic.o: extern.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h gc.h intext.h io.h md5.h \ - memory.h major_gc.h freelist.h minor_gc.h reverse.h -fail.pic.o: fail.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h io.h gc.h memory.h major_gc.h freelist.h \ - minor_gc.h printexc.h signals.h stacks.h -finalise.pic.o: finalise.c callback.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h roots.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h signals.h -fix_code.pic.o: fix_code.c config.h ../config/m.h ../config/s.h \ - compatibility.h debugger.h misc.h mlvalues.h fix_code.h instruct.h \ - intext.h io.h md5.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - reverse.h -floats.pic.o: floats.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h reverse.h stacks.h -freelist.pic.o: freelist.c config.h ../config/m.h ../config/s.h \ - compatibility.h freelist.h misc.h mlvalues.h gc.h gc_ctrl.h memory.h \ - major_gc.h minor_gc.h -gc_ctrl.pic.o: gc_ctrl.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h compact.h custom.h finalise.h \ - roots.h memory.h gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h \ - stacks.h -globroots.pic.o: globroots.c memory.h compatibility.h config.h ../config/m.h \ - ../config/s.h gc.h mlvalues.h misc.h major_gc.h freelist.h minor_gc.h \ - roots.h globroots.h -hash.pic.o: hash.c mlvalues.h compatibility.h config.h ../config/m.h \ - ../config/s.h misc.h custom.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h hash.h +intern.o: intern.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/callback.h caml/custom.h caml/fail.h caml/gc.h \ + caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/mlvalues.h \ + caml/misc.h caml/reverse.h +interp.o: interp.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/backtrace.h caml/callback.h caml/debugger.h \ + caml/fail.h caml/fix_code.h caml/instrtrace.h caml/instruct.h \ + caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h \ + caml/signals.h caml/stacks.h caml/memory.h caml/jumptbl.h +ints.o: ints.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/intext.h caml/io.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/misc.h caml/mlvalues.h +io.o: io.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/io.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/signals.h caml/sys.h +lexing.o: lexing.c caml/fail.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h +main.o: main.c caml/misc.h caml/compatibility.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/misc.h \ + caml/sys.h +major_gc.o: major_gc.c caml/compact.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/misc.h caml/custom.h \ + caml/mlvalues.h caml/config.h caml/fail.h caml/finalise.h caml/roots.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h caml/misc.h \ + caml/mlvalues.h caml/roots.h caml/weak.h +md5.o: md5.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/md5.h caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/mlvalues.h caml/io.h caml/reverse.h +memory.o: memory.c caml/fail.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h \ + caml/freelist.h caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/signals.h +meta.o: meta.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/config.h caml/fail.h caml/fix_code.h caml/interp.h \ + caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/prims.h caml/stacks.h caml/memory.h +minor_gc.o: minor_gc.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/finalise.h caml/roots.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/gc.h \ + caml/gc_ctrl.h caml/major_gc.h caml/memory.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/roots.h caml/signals.h caml/weak.h +misc.o: misc.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/compatibility.h caml/misc.h caml/config.h caml/memory.h caml/gc.h \ + caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h +obj.o: obj.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/gc.h caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/prims.h +parsing.o: parsing.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/mlvalues.h caml/config.h \ + caml/misc.h caml/memory.h caml/gc.h caml/mlvalues.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/alloc.h +prims.o: prims.c caml/mlvalues.h caml/compatibility.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/prims.h +printexc.o: printexc.c caml/backtrace.h caml/mlvalues.h \ + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/callback.h caml/debugger.h \ + caml/fail.h caml/misc.h caml/mlvalues.h caml/printexc.h +roots.o: roots.c caml/finalise.h caml/roots.h caml/misc.h \ + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/memory.h caml/gc.h caml/mlvalues.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/globroots.h \ + caml/major_gc.h caml/memory.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/roots.h caml/stacks.h +signals_byt.o: signals_byt.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/memory.h caml/config.h \ + caml/gc.h caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/osdeps.h caml/signals.h caml/signals_machdep.h +signals.o: signals.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/callback.h caml/config.h caml/fail.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/roots.h caml/memory.h caml/signals.h \ + caml/signals_machdep.h caml/sys.h +stacks.o: stacks.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/misc.h caml/mlvalues.h caml/stacks.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h +startup.o: startup.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/backtrace.h caml/callback.h \ + caml/custom.h caml/debugger.h caml/dynlink.h caml/exec.h caml/fail.h \ + caml/fix_code.h caml/freelist.h caml/gc_ctrl.h caml/instrtrace.h \ + caml/interp.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/minor_gc.h \ + caml/misc.h caml/mlvalues.h caml/osdeps.h caml/prims.h caml/printexc.h \ + caml/reverse.h caml/signals.h caml/stacks.h caml/memory.h caml/sys.h \ + caml/startup.h caml/exec.h caml/version.h +str.o: str.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/mlvalues.h caml/misc.h +sys.o: sys.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ + caml/mlvalues.h caml/debugger.h caml/fail.h caml/instruct.h \ + caml/mlvalues.h caml/osdeps.h caml/signals.h caml/stacks.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/sys.h +terminfo.o: terminfo.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/fail.h caml/io.h caml/mlvalues.h +unix.o: unix.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/compatibility.h caml/memory.h caml/config.h caml/gc.h \ + caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/misc.h caml/osdeps.h +weak.o: weak.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/major_gc.h caml/freelist.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h caml/mlvalues.h +win32.o: win32.c caml/fail.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/misc.h caml/osdeps.h caml/signals.h caml/sys.h +alloc.d.o: alloc.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/major_gc.h caml/freelist.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h caml/mlvalues.h \ + caml/stacks.h caml/memory.h +array.d.o: array.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/misc.h caml/mlvalues.h +backtrace.d.o: backtrace.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/mlvalues.h caml/config.h \ + caml/misc.h caml/alloc.h caml/mlvalues.h caml/io.h caml/instruct.h \ + caml/intext.h caml/io.h caml/exec.h caml/fix_code.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/startup.h \ + caml/exec.h caml/stacks.h caml/memory.h caml/sys.h caml/backtrace.h \ + caml/fail.h +callback.d.o: callback.c caml/callback.h caml/compatibility.h \ + caml/mlvalues.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/fail.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/mlvalues.h \ + caml/interp.h caml/instruct.h caml/fix_code.h caml/stacks.h \ + caml/memory.h +compact.d.o: compact.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/finalise.h caml/roots.h \ + caml/misc.h caml/config.h caml/memory.h caml/gc.h caml/mlvalues.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/freelist.h \ + caml/gc.h caml/gc_ctrl.h caml/major_gc.h caml/memory.h caml/mlvalues.h \ + caml/roots.h caml/weak.h +compare.d.o: compare.c caml/custom.h caml/compatibility.h caml/mlvalues.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h caml/misc.h \ + caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h +custom.d.o: custom.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/mlvalues.h +debugger.d.o: debugger.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/config.h caml/debugger.h caml/misc.h caml/fail.h \ + caml/fix_code.h caml/instruct.h caml/intext.h caml/io.h caml/io.h \ + caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/sys.h +dynlink.d.o: dynlink.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/dynlink.h caml/fail.h caml/mlvalues.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/misc.h caml/osdeps.h caml/prims.h caml/signals.h +extern.d.o: extern.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \ + caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/misc.h caml/mlvalues.h \ + caml/reverse.h +fail.d.o: fail.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/io.h caml/gc.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/printexc.h caml/signals.h caml/stacks.h \ + caml/memory.h +finalise.d.o: finalise.c caml/callback.h caml/compatibility.h \ + caml/mlvalues.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/fail.h caml/mlvalues.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/signals.h +fix_code.d.o: fix_code.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/debugger.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/fix_code.h caml/instruct.h \ + caml/intext.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/reverse.h +floats.d.o: floats.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/mlvalues.h caml/misc.h \ + caml/reverse.h caml/stacks.h caml/memory.h +freelist.d.o: freelist.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/freelist.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/gc.h caml/gc_ctrl.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/major_gc.h caml/misc.h caml/mlvalues.h +gc_ctrl.d.o: gc_ctrl.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/compact.h caml/custom.h caml/finalise.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/stacks.h +globroots.d.o: globroots.c caml/memory.h caml/compatibility.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/gc.h caml/mlvalues.h \ + caml/misc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/roots.h caml/memory.h caml/globroots.h caml/roots.h +hash.d.o: hash.c caml/mlvalues.h caml/compatibility.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/custom.h \ + caml/mlvalues.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/hash.h +instrtrace.d.o: instrtrace.c caml/instruct.h caml/misc.h \ + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/mlvalues.h caml/misc.h caml/opnames.h \ + caml/prims.h caml/stacks.h caml/mlvalues.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h +intern.d.o: intern.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/callback.h caml/custom.h caml/fail.h caml/gc.h \ + caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/mlvalues.h \ + caml/misc.h caml/reverse.h +interp.d.o: interp.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/backtrace.h caml/callback.h caml/debugger.h \ + caml/fail.h caml/fix_code.h caml/instrtrace.h caml/instruct.h \ + caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h \ + caml/signals.h caml/stacks.h caml/memory.h +ints.d.o: ints.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/intext.h caml/io.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/misc.h caml/mlvalues.h +io.d.o: io.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/io.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/signals.h caml/sys.h +lexing.d.o: lexing.c caml/fail.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h +main.d.o: main.c caml/misc.h caml/compatibility.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/misc.h \ + caml/sys.h +major_gc.d.o: major_gc.c caml/compact.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/misc.h caml/custom.h \ + caml/mlvalues.h caml/config.h caml/fail.h caml/finalise.h caml/roots.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h caml/misc.h \ + caml/mlvalues.h caml/roots.h caml/weak.h +md5.d.o: md5.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/md5.h caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/mlvalues.h caml/io.h caml/reverse.h +memory.d.o: memory.c caml/fail.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h \ + caml/freelist.h caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/signals.h +meta.d.o: meta.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/config.h caml/fail.h caml/fix_code.h caml/interp.h \ + caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/prims.h caml/stacks.h caml/memory.h +minor_gc.d.o: minor_gc.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/finalise.h caml/roots.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/gc.h \ + caml/gc_ctrl.h caml/major_gc.h caml/memory.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/roots.h caml/signals.h caml/weak.h +misc.d.o: misc.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/compatibility.h caml/misc.h caml/config.h caml/memory.h caml/gc.h \ + caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h +obj.d.o: obj.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/gc.h caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/prims.h +parsing.d.o: parsing.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/mlvalues.h caml/config.h \ + caml/misc.h caml/memory.h caml/gc.h caml/mlvalues.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/alloc.h +prims.d.o: prims.c caml/mlvalues.h caml/compatibility.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/prims.h +printexc.d.o: printexc.c caml/backtrace.h caml/mlvalues.h \ + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/callback.h caml/debugger.h \ + caml/fail.h caml/misc.h caml/mlvalues.h caml/printexc.h +roots.d.o: roots.c caml/finalise.h caml/roots.h caml/misc.h \ + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/memory.h caml/gc.h caml/mlvalues.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/globroots.h \ + caml/major_gc.h caml/memory.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/roots.h caml/stacks.h +signals_byt.d.o: signals_byt.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/memory.h caml/config.h \ + caml/gc.h caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/osdeps.h caml/signals.h caml/signals_machdep.h +signals.d.o: signals.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/callback.h caml/config.h caml/fail.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/roots.h caml/memory.h caml/signals.h \ + caml/signals_machdep.h caml/sys.h +stacks.d.o: stacks.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/misc.h caml/mlvalues.h caml/stacks.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h +startup.d.o: startup.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/backtrace.h caml/callback.h \ + caml/custom.h caml/debugger.h caml/dynlink.h caml/exec.h caml/fail.h \ + caml/fix_code.h caml/freelist.h caml/gc_ctrl.h caml/instrtrace.h \ + caml/interp.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/minor_gc.h \ + caml/misc.h caml/mlvalues.h caml/osdeps.h caml/prims.h caml/printexc.h \ + caml/reverse.h caml/signals.h caml/stacks.h caml/memory.h caml/sys.h \ + caml/startup.h caml/exec.h caml/version.h +str.d.o: str.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/mlvalues.h caml/misc.h +sys.d.o: sys.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ + caml/mlvalues.h caml/debugger.h caml/fail.h caml/instruct.h \ + caml/mlvalues.h caml/osdeps.h caml/signals.h caml/stacks.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/sys.h +terminfo.d.o: terminfo.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/fail.h caml/io.h caml/mlvalues.h +unix.d.o: unix.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/compatibility.h caml/memory.h caml/config.h caml/gc.h \ + caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/misc.h caml/osdeps.h +weak.d.o: weak.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/major_gc.h caml/freelist.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h caml/mlvalues.h +win32.d.o: win32.c caml/fail.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/misc.h caml/osdeps.h caml/signals.h caml/sys.h +alloc.pic.o: alloc.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/major_gc.h caml/freelist.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h caml/mlvalues.h \ + caml/stacks.h caml/memory.h +array.pic.o: array.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/misc.h caml/mlvalues.h +backtrace.pic.o: backtrace.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/mlvalues.h caml/config.h \ + caml/misc.h caml/alloc.h caml/mlvalues.h caml/io.h caml/instruct.h \ + caml/intext.h caml/io.h caml/exec.h caml/fix_code.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/startup.h \ + caml/exec.h caml/stacks.h caml/memory.h caml/sys.h caml/backtrace.h \ + caml/fail.h +callback.pic.o: callback.c caml/callback.h caml/compatibility.h \ + caml/mlvalues.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/fail.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/mlvalues.h \ + caml/interp.h caml/instruct.h caml/fix_code.h caml/stacks.h \ + caml/memory.h +compact.pic.o: compact.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/finalise.h caml/roots.h \ + caml/misc.h caml/config.h caml/memory.h caml/gc.h caml/mlvalues.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/freelist.h \ + caml/gc.h caml/gc_ctrl.h caml/major_gc.h caml/memory.h caml/mlvalues.h \ + caml/roots.h caml/weak.h +compare.pic.o: compare.c caml/custom.h caml/compatibility.h caml/mlvalues.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h caml/misc.h \ + caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h +custom.pic.o: custom.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/mlvalues.h +debugger.pic.o: debugger.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/config.h caml/debugger.h caml/misc.h caml/fail.h \ + caml/fix_code.h caml/instruct.h caml/intext.h caml/io.h caml/io.h \ + caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/sys.h +dynlink.pic.o: dynlink.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/dynlink.h caml/fail.h caml/mlvalues.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/misc.h caml/osdeps.h caml/prims.h caml/signals.h +extern.pic.o: extern.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \ + caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/misc.h caml/mlvalues.h \ + caml/reverse.h +fail.pic.o: fail.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/io.h caml/gc.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/printexc.h caml/signals.h caml/stacks.h \ + caml/memory.h +finalise.pic.o: finalise.c caml/callback.h caml/compatibility.h \ + caml/mlvalues.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/fail.h caml/mlvalues.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/signals.h +fix_code.pic.o: fix_code.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/debugger.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/fix_code.h caml/instruct.h \ + caml/intext.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/reverse.h +floats.pic.o: floats.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/mlvalues.h caml/misc.h \ + caml/reverse.h caml/stacks.h caml/memory.h +freelist.pic.o: freelist.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/freelist.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/gc.h caml/gc_ctrl.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/major_gc.h caml/misc.h caml/mlvalues.h +gc_ctrl.pic.o: gc_ctrl.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/compact.h caml/custom.h caml/finalise.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/stacks.h +globroots.pic.o: globroots.c caml/memory.h caml/compatibility.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/gc.h caml/mlvalues.h \ + caml/misc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/roots.h caml/memory.h caml/globroots.h caml/roots.h +hash.pic.o: hash.c caml/mlvalues.h caml/compatibility.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/custom.h \ + caml/mlvalues.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/hash.h instrtrace.pic.o: instrtrace.c -intern.pic.o: intern.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h callback.h custom.h fail.h gc.h intext.h io.h \ - md5.h memory.h major_gc.h freelist.h minor_gc.h reverse.h -interp.pic.o: interp.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h backtrace.h callback.h debugger.h fail.h \ - fix_code.h instrtrace.h instruct.h interp.h major_gc.h freelist.h \ - memory.h gc.h minor_gc.h prims.h signals.h stacks.h jumptbl.h -ints.pic.o: ints.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h intext.h io.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h -io.pic.o: io.c config.h ../config/m.h ../config/s.h compatibility.h alloc.h \ - misc.h mlvalues.h custom.h fail.h io.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h signals.h sys.h -lexing.pic.o: lexing.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h -main.pic.o: main.c misc.h compatibility.h config.h ../config/m.h \ - ../config/s.h mlvalues.h sys.h -major_gc.pic.o: major_gc.c compact.h config.h ../config/m.h ../config/s.h \ - compatibility.h misc.h custom.h mlvalues.h fail.h finalise.h roots.h \ - memory.h gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h weak.h -md5.pic.o: md5.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h md5.h io.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h reverse.h -memory.pic.o: memory.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h freelist.h gc.h gc_ctrl.h major_gc.h memory.h \ - minor_gc.h signals.h -meta.pic.o: meta.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h fix_code.h interp.h intext.h io.h \ - major_gc.h freelist.h memory.h gc.h minor_gc.h prims.h stacks.h -minor_gc.pic.o: minor_gc.c config.h ../config/m.h ../config/s.h \ - compatibility.h fail.h misc.h mlvalues.h finalise.h roots.h memory.h \ - gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h signals.h weak.h -misc.pic.o: misc.c config.h ../config/m.h ../config/s.h compatibility.h \ - misc.h memory.h gc.h mlvalues.h major_gc.h freelist.h minor_gc.h -obj.pic.o: obj.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h gc.h interp.h major_gc.h freelist.h \ - memory.h minor_gc.h prims.h -parsing.pic.o: parsing.c config.h ../config/m.h ../config/s.h compatibility.h \ - mlvalues.h misc.h memory.h gc.h major_gc.h freelist.h minor_gc.h alloc.h -prims.pic.o: prims.c mlvalues.h compatibility.h config.h ../config/m.h \ - ../config/s.h misc.h prims.h -printexc.pic.o: printexc.c backtrace.h mlvalues.h compatibility.h config.h \ - ../config/m.h ../config/s.h misc.h callback.h debugger.h fail.h \ - printexc.h -roots.pic.o: roots.c finalise.h roots.h misc.h compatibility.h config.h \ - ../config/m.h ../config/s.h memory.h gc.h mlvalues.h major_gc.h \ - freelist.h minor_gc.h globroots.h stacks.h -signals_byt.pic.o: signals_byt.c config.h ../config/m.h ../config/s.h \ - compatibility.h memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h \ - minor_gc.h osdeps.h signals.h signals_machdep.h -signals.pic.o: signals.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h callback.h fail.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h roots.h signals.h signals_machdep.h \ - sys.h -stacks.pic.o: stacks.c config.h ../config/m.h ../config/s.h compatibility.h \ - fail.h misc.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h -startup.pic.o: startup.c config.h ../config/m.h ../config/s.h compatibility.h \ - alloc.h misc.h mlvalues.h backtrace.h callback.h custom.h debugger.h \ - dynlink.h exec.h fail.h fix_code.h freelist.h gc_ctrl.h instrtrace.h \ - interp.h intext.h io.h memory.h gc.h major_gc.h minor_gc.h osdeps.h \ - prims.h printexc.h reverse.h signals.h stacks.h sys.h startup.h \ - version.h -str.pic.o: str.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h -sys.pic.o: sys.c config.h ../config/m.h ../config/s.h compatibility.h alloc.h \ - misc.h mlvalues.h debugger.h fail.h instruct.h osdeps.h signals.h \ - stacks.h memory.h gc.h major_gc.h freelist.h minor_gc.h sys.h -terminfo.pic.o: terminfo.c config.h ../config/m.h ../config/s.h \ - compatibility.h alloc.h misc.h mlvalues.h fail.h io.h -unix.pic.o: unix.c config.h ../config/m.h ../config/s.h compatibility.h \ - memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h minor_gc.h \ - osdeps.h -weak.pic.o: weak.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h major_gc.h freelist.h memory.h gc.h \ - minor_gc.h -win32.pic.o: win32.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - osdeps.h signals.h sys.h +intern.pic.o: intern.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/callback.h caml/custom.h caml/fail.h caml/gc.h \ + caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/mlvalues.h \ + caml/misc.h caml/reverse.h +interp.pic.o: interp.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/backtrace.h caml/callback.h caml/debugger.h \ + caml/fail.h caml/fix_code.h caml/instrtrace.h caml/instruct.h \ + caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h \ + caml/signals.h caml/stacks.h caml/memory.h caml/jumptbl.h +ints.pic.o: ints.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/intext.h caml/io.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/misc.h caml/mlvalues.h +io.pic.o: io.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/io.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/signals.h caml/sys.h +lexing.pic.o: lexing.c caml/fail.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h +main.pic.o: main.c caml/misc.h caml/compatibility.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/misc.h \ + caml/sys.h +major_gc.pic.o: major_gc.c caml/compact.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/misc.h caml/custom.h \ + caml/mlvalues.h caml/config.h caml/fail.h caml/finalise.h caml/roots.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h caml/misc.h \ + caml/mlvalues.h caml/roots.h caml/weak.h +md5.pic.o: md5.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/md5.h caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/mlvalues.h caml/io.h caml/reverse.h +memory.pic.o: memory.c caml/fail.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h \ + caml/freelist.h caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/signals.h +meta.pic.o: meta.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/config.h caml/fail.h caml/fix_code.h caml/interp.h \ + caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/prims.h caml/stacks.h caml/memory.h +minor_gc.pic.o: minor_gc.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/finalise.h caml/roots.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/gc.h \ + caml/gc_ctrl.h caml/major_gc.h caml/memory.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/roots.h caml/signals.h caml/weak.h +misc.pic.o: misc.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/compatibility.h caml/misc.h caml/config.h caml/memory.h caml/gc.h \ + caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h +obj.pic.o: obj.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/gc.h caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/prims.h +parsing.pic.o: parsing.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/mlvalues.h caml/config.h \ + caml/misc.h caml/memory.h caml/gc.h caml/mlvalues.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/alloc.h +prims.pic.o: prims.c caml/mlvalues.h caml/compatibility.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/prims.h +printexc.pic.o: printexc.c caml/backtrace.h caml/mlvalues.h \ + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/callback.h caml/debugger.h \ + caml/fail.h caml/misc.h caml/mlvalues.h caml/printexc.h +roots.pic.o: roots.c caml/finalise.h caml/roots.h caml/misc.h \ + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/memory.h caml/gc.h caml/mlvalues.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/globroots.h \ + caml/major_gc.h caml/memory.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/roots.h caml/stacks.h +signals_byt.pic.o: signals_byt.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/memory.h caml/config.h \ + caml/gc.h caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/osdeps.h caml/signals.h caml/signals_machdep.h +signals.pic.o: signals.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/callback.h caml/config.h caml/fail.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/roots.h caml/memory.h caml/signals.h \ + caml/signals_machdep.h caml/sys.h +stacks.pic.o: stacks.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/misc.h caml/mlvalues.h caml/stacks.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h +startup.pic.o: startup.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/backtrace.h caml/callback.h \ + caml/custom.h caml/debugger.h caml/dynlink.h caml/exec.h caml/fail.h \ + caml/fix_code.h caml/freelist.h caml/gc_ctrl.h caml/instrtrace.h \ + caml/interp.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/minor_gc.h \ + caml/misc.h caml/mlvalues.h caml/osdeps.h caml/prims.h caml/printexc.h \ + caml/reverse.h caml/signals.h caml/stacks.h caml/memory.h caml/sys.h \ + caml/startup.h caml/exec.h caml/version.h +str.pic.o: str.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/mlvalues.h caml/misc.h +sys.pic.o: sys.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ + caml/mlvalues.h caml/debugger.h caml/fail.h caml/instruct.h \ + caml/mlvalues.h caml/osdeps.h caml/signals.h caml/stacks.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/sys.h +terminfo.pic.o: terminfo.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/fail.h caml/io.h caml/mlvalues.h +unix.pic.o: unix.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/compatibility.h caml/memory.h caml/config.h caml/gc.h \ + caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/misc.h caml/osdeps.h +weak.pic.o: weak.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/major_gc.h caml/freelist.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h caml/mlvalues.h +win32.pic.o: win32.c caml/fail.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/misc.h caml/osdeps.h caml/signals.h caml/sys.h diff --git a/otherlibs/bigarray/.depend b/otherlibs/bigarray/.depend index d19e796b38..e55dfce825 100644 --- a/otherlibs/bigarray/.depend +++ b/otherlibs/bigarray/.depend @@ -1,21 +1,26 @@ -bigarray_stubs.o: bigarray_stubs.c ../../byterun/alloc.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h bigarray.h \ - ../../byterun/config.h ../../byterun/mlvalues.h ../../byterun/custom.h \ - ../../byterun/fail.h ../../byterun/intext.h ../../byterun/io.h \ - ../../byterun/hash.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h -mmap_unix.o: mmap_unix.c bigarray.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/mlvalues.h ../../byterun/config.h ../../byterun/misc.h \ - ../../byterun/custom.h ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/io.h ../../byterun/sys.h ../../byterun/signals.h -mmap_win32.o: mmap_win32.c bigarray.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/mlvalues.h ../../byterun/config.h ../../byterun/misc.h \ - ../../byterun/alloc.h ../../byterun/mlvalues.h ../../byterun/custom.h \ - ../../byterun/fail.h ../../byterun/sys.h ../unix/unixsupport.h +bigarray_stubs.o: bigarray_stubs.c ../../byterun/caml/alloc.h \ + ../../byterun/caml/misc.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/mlvalues.h bigarray.h ../../byterun/caml/config.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/custom.h \ + ../../byterun/caml/fail.h ../../byterun/caml/intext.h \ + ../../byterun/caml/io.h ../../byterun/caml/hash.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h +mmap_unix.o: mmap_unix.c bigarray.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/config.h \ + ../../byterun/caml/misc.h ../../byterun/caml/custom.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/io.h ../../byterun/caml/sys.h \ + ../../byterun/caml/signals.h +mmap_win32.o: mmap_win32.c bigarray.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/config.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/custom.h \ + ../../byterun/caml/fail.h ../../byterun/caml/sys.h ../unix/unixsupport.h bigarray.cmi : bigarray.cmo : bigarray.cmi bigarray.cmx : bigarray.cmi diff --git a/otherlibs/graph/.depend b/otherlibs/graph/.depend index b4b531d43a..10f44a683e 100644 --- a/otherlibs/graph/.depend +++ b/otherlibs/graph/.depend @@ -1,63 +1,68 @@ -color.o: color.c libgraph.h ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h -draw.o: draw.c libgraph.h ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h -dump_img.o: dump_img.c libgraph.h ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h image.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h -events.o: events.c libgraph.h ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/signals.h -fill.o: fill.c libgraph.h ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h -image.o: image.c libgraph.h ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h image.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/custom.h -make_img.o: make_img.c libgraph.h ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h image.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h -open.o: open.c libgraph.h ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/callback.h ../../byterun/fail.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h -point_col.o: point_col.c libgraph.h ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h -sound.o: sound.c libgraph.h ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h -subwindow.o: subwindow.c libgraph.h ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h -text.o: text.c libgraph.h ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h +color.o: color.c libgraph.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h +draw.o: draw.c libgraph.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h +dump_img.o: dump_img.c libgraph.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h image.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h +events.o: events.c libgraph.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/signals.h +fill.o: fill.c libgraph.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h +image.o: image.c libgraph.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h image.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/custom.h +make_img.o: make_img.c libgraph.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h image.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h +open.o: open.c libgraph.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/callback.h \ + ../../byterun/caml/fail.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h +point_col.o: point_col.c libgraph.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h +sound.o: sound.c libgraph.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h +subwindow.o: subwindow.c libgraph.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h +text.o: text.c libgraph.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h graphics.cmi : graphicsX11.cmi : graphics.cmo : graphics.cmi diff --git a/otherlibs/num/.depend b/otherlibs/num/.depend index 62a525057d..1a16696320 100644 --- a/otherlibs/num/.depend +++ b/otherlibs/num/.depend @@ -1,21 +1,22 @@ bng_amd64.o: bng_amd64.c bng_arm64.o: bng_arm64.c -bng.o: bng.c bng.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/compatibility.h bng_amd64.c \ - bng_digit.c +bng.o: bng.c bng.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/compatibility.h bng_amd64.c bng_digit.c bng_digit.o: bng_digit.c bng_ia32.o: bng_ia32.c bng_ppc.o: bng_ppc.c bng_sparc.o: bng_sparc.c -nat_stubs.o: nat_stubs.c ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/config.h ../../byterun/custom.h ../../byterun/intext.h \ - ../../byterun/io.h ../../byterun/fail.h ../../byterun/hash.h \ - ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/mlvalues.h bng.h nat.h +nat_stubs.o: nat_stubs.c ../../byterun/caml/alloc.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/config.h ../../byterun/caml/custom.h \ + ../../byterun/caml/intext.h ../../byterun/caml/io.h \ + ../../byterun/caml/fail.h ../../byterun/caml/hash.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/mlvalues.h bng.h nat.h arith_flags.cmi : arith_status.cmi : big_int.cmi : nat.cmi diff --git a/otherlibs/str/.depend b/otherlibs/str/.depend index b0ff35895b..e0d6abec89 100644 --- a/otherlibs/str/.depend +++ b/otherlibs/str/.depend @@ -1,9 +1,11 @@ -strstubs.o: strstubs.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/fail.h +strstubs.o: strstubs.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/fail.h str.cmi : str.cmo : str.cmi str.cmx : str.cmi diff --git a/otherlibs/systhreads/.depend b/otherlibs/systhreads/.depend index 93b01d6876..868bcc7ad6 100644 --- a/otherlibs/systhreads/.depend +++ b/otherlibs/systhreads/.depend @@ -1,14 +1,17 @@ -st_stubs.o: st_stubs.c ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/backtrace.h ../../byterun/callback.h \ - ../../byterun/custom.h ../../byterun/fail.h ../../byterun/io.h \ - ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/printexc.h ../../byterun/roots.h \ - ../../byterun/memory.h ../../byterun/signals.h ../../byterun/stacks.h \ - ../../byterun/sys.h threads.h st_posix.h +st_stubs.o: st_stubs.c ../../byterun/caml/alloc.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/backtrace.h ../../byterun/caml/callback.h \ + ../../byterun/caml/custom.h ../../byterun/caml/fail.h \ + ../../byterun/caml/io.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/misc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/printexc.h ../../byterun/caml/roots.h \ + ../../byterun/caml/memory.h ../../byterun/caml/signals.h \ + ../../byterun/caml/stacks.h ../../byterun/caml/sys.h threads.h \ + st_posix.h condition.cmi : mutex.cmi event.cmi : mutex.cmi : diff --git a/otherlibs/threads/.depend b/otherlibs/threads/.depend index 8728bad9e2..ad7fef4be9 100644 --- a/otherlibs/threads/.depend +++ b/otherlibs/threads/.depend @@ -1,21 +1,21 @@ -scheduler.o: scheduler.c ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/backtrace.h ../../byterun/callback.h \ - ../../byterun/config.h ../../byterun/fail.h ../../byterun/io.h \ - ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/printexc.h ../../byterun/roots.h \ - ../../byterun/memory.h ../../byterun/signals.h ../../byterun/stacks.h \ - ../../byterun/sys.h +scheduler.o: scheduler.c ../../byterun/caml/alloc.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/backtrace.h ../../byterun/caml/callback.h \ + ../../byterun/caml/config.h ../../byterun/caml/fail.h \ + ../../byterun/caml/io.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/misc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/printexc.h ../../byterun/caml/roots.h \ + ../../byterun/caml/memory.h ../../byterun/caml/signals.h \ + ../../byterun/caml/stacks.h ../../byterun/caml/sys.h condition.cmi : mutex.cmi event.cmi : mutex.cmi : -pervasives.cmi : -thread.cmi : unix.cmi -threadUnix.cmi : unix.cmi -unix.cmi : +thread.cmi : unix.cmo +threadUnix.cmi : unix.cmo condition.cmo : thread.cmi mutex.cmi condition.cmi condition.cmx : thread.cmx mutex.cmx condition.cmi event.cmo : mutex.cmi condition.cmi event.cmi @@ -24,11 +24,11 @@ marshal.cmo : marshal.cmx : mutex.cmo : thread.cmi mutex.cmi mutex.cmx : thread.cmx mutex.cmi -pervasives.cmo : unix.cmi pervasives.cmi -pervasives.cmx : unix.cmx pervasives.cmi -thread.cmo : unix.cmi thread.cmi +pervasives.cmo : unix.cmo +pervasives.cmx : unix.cmx +thread.cmo : unix.cmo thread.cmi thread.cmx : unix.cmx thread.cmi -threadUnix.cmo : unix.cmi thread.cmi threadUnix.cmi +threadUnix.cmo : unix.cmo thread.cmi threadUnix.cmi threadUnix.cmx : unix.cmx thread.cmx threadUnix.cmi -unix.cmo : unix.cmi -unix.cmx : unix.cmi +unix.cmo : +unix.cmx : diff --git a/otherlibs/unix/.depend b/otherlibs/unix/.depend index 048b855412..6e7193f8bf 100644 --- a/otherlibs/unix/.depend +++ b/otherlibs/unix/.depend @@ -1,499 +1,601 @@ -accept.o: accept.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h \ - socketaddr.h ../../byterun/misc.h -access.o: access.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h -addrofstr.o: addrofstr.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/fail.h \ - unixsupport.h socketaddr.h ../../byterun/misc.h -alarm.o: alarm.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h -bind.o: bind.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h socketaddr.h ../../byterun/misc.h -chdir.o: chdir.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h -chmod.o: chmod.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h -chown.o: chown.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h -chroot.o: chroot.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h -close.o: close.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/signals.h \ - ../../byterun/mlvalues.h unixsupport.h -closedir.o: closedir.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h -connect.o: connect.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h ../../byterun/signals.h unixsupport.h \ - socketaddr.h ../../byterun/misc.h -cst2constr.o: cst2constr.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/fail.h ../../byterun/mlvalues.h \ - cst2constr.h -cstringv.o: cstringv.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h -dup2.o: dup2.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h -dup.o: dup.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h -envir.o: envir.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h -errmsg.o: errmsg.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h -execv.o: execv.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h -execve.o: execve.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h -execvp.o: execvp.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h -exit.o: exit.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h -fchmod.o: fchmod.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h ../../byterun/signals.h unixsupport.h -fchown.o: fchown.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h ../../byterun/signals.h unixsupport.h -fcntl.o: fcntl.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h -fork.o: fork.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h \ - ../../byterun/debugger.h ../../byterun/mlvalues.h unixsupport.h -ftruncate.o: ftruncate.c ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h ../../byterun/io.h ../../byterun/signals.h \ - unixsupport.h -getaddrinfo.o: getaddrinfo.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/misc.h ../../byterun/signals.h \ - unixsupport.h cst2constr.h socketaddr.h -getcwd.o: getcwd.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h unixsupport.h -getegid.o: getegid.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h unixsupport.h -geteuid.o: geteuid.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h unixsupport.h -getgid.o: getgid.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h -getgr.o: getgr.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/fail.h \ - ../../byterun/mlvalues.h ../../byterun/alloc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h unixsupport.h -getgroups.o: getgroups.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h unixsupport.h -gethost.o: gethost.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h \ - socketaddr.h ../../byterun/misc.h -gethostname.o: gethostname.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h unixsupport.h -getlogin.o: getlogin.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ +accept.o: accept.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h \ + socketaddr.h ../../byterun/caml/misc.h +access.o: access.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/signals.h unixsupport.h +addrofstr.o: addrofstr.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/fail.h unixsupport.h \ + socketaddr.h ../../byterun/caml/misc.h +alarm.o: alarm.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +bind.o: bind.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h +chdir.o: chdir.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h +chmod.o: chmod.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h +chown.o: chown.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h +chroot.o: chroot.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h +close.o: close.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/signals.h \ + ../../byterun/caml/mlvalues.h unixsupport.h +closedir.o: closedir.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h +connect.o: connect.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/signals.h unixsupport.h \ + socketaddr.h ../../byterun/caml/misc.h +cst2constr.o: cst2constr.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/fail.h \ + ../../byterun/caml/mlvalues.h cst2constr.h +cstringv.o: cstringv.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h unixsupport.h +dup2.o: dup2.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +dup.o: dup.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +envir.o: envir.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h +errmsg.o: errmsg.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h +execv.o: execv.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h unixsupport.h +execve.o: execve.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h unixsupport.h +execvp.o: execvp.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h unixsupport.h +exit.o: exit.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +fchmod.o: fchmod.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/signals.h unixsupport.h +fchown.o: fchown.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/signals.h unixsupport.h +fcntl.o: fcntl.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h +fork.o: fork.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/debugger.h \ + ../../byterun/caml/mlvalues.h unixsupport.h +ftruncate.o: ftruncate.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/io.h \ + ../../byterun/caml/signals.h unixsupport.h +getaddrinfo.o: getaddrinfo.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/misc.h \ + ../../byterun/caml/signals.h unixsupport.h cst2constr.h socketaddr.h +getcwd.o: getcwd.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h +getegid.o: getegid.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +geteuid.o: geteuid.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +getgid.o: getgid.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +getgr.o: getgr.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/fail.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h unixsupport.h +getgroups.o: getgroups.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h +gethost.o: gethost.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h \ + socketaddr.h ../../byterun/caml/misc.h +gethostname.o: gethostname.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h +getlogin.o: getlogin.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h unixsupport.h +getnameinfo.o: getnameinfo.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h \ + socketaddr.h ../../byterun/caml/misc.h +getpeername.o: getpeername.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h +getpid.o: getpid.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +getppid.o: getppid.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +getproto.o: getproto.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h unixsupport.h +getpw.o: getpw.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/fail.h unixsupport.h +getserv.o: getserv.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h unixsupport.h +getsockname.o: getsockname.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h +gettimeofday.o: gettimeofday.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h +getuid.o: getuid.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +gmtime.o: gmtime.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h unixsupport.h +initgroups.o: initgroups.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h +isatty.o: isatty.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +itimer.o: itimer.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h unixsupport.h +kill.o: kill.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/fail.h \ + ../../byterun/caml/mlvalues.h unixsupport.h ../../byterun/caml/signals.h +link.o: link.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h +listen.o: listen.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h +lockf.o: lockf.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/signals.h unixsupport.h +lseek.o: lseek.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/io.h \ + ../../byterun/caml/signals.h unixsupport.h +mkdir.o: mkdir.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h +mkfifo.o: mkfifo.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/signals.h unixsupport.h +nice.o: nice.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +open.o: open.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/misc.h ../../byterun/caml/signals.h unixsupport.h +opendir.o: opendir.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/signals.h unixsupport.h +pipe.o: pipe.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h unixsupport.h +putenv.o: putenv.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/mlvalues.h \ unixsupport.h -getnameinfo.o: getnameinfo.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h \ - socketaddr.h ../../byterun/misc.h -getpeername.o: getpeername.c ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h socketaddr.h ../../byterun/misc.h -getpid.o: getpid.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h -getppid.o: getppid.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h unixsupport.h -getproto.o: getproto.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h unixsupport.h -getpw.o: getpw.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/fail.h unixsupport.h -getserv.o: getserv.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h unixsupport.h -getsockname.o: getsockname.c ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h socketaddr.h ../../byterun/misc.h -gettimeofday.o: gettimeofday.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h unixsupport.h -getuid.o: getuid.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h -gmtime.o: gmtime.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h unixsupport.h -initgroups.o: initgroups.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h unixsupport.h -isatty.o: isatty.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h -itimer.o: itimer.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h unixsupport.h -kill.o: kill.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/fail.h \ - ../../byterun/mlvalues.h unixsupport.h ../../byterun/signals.h -link.o: link.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h -listen.o: listen.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h -lockf.o: lockf.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h ../../byterun/signals.h unixsupport.h -lseek.o: lseek.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/io.h ../../byterun/signals.h \ +read.o: read.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h +readdir.o: readdir.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/fail.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/signals.h unixsupport.h +readlink.o: readlink.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/fail.h ../../byterun/caml/signals.h unixsupport.h +rename.o: rename.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h +rewinddir.o: rewinddir.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h +rmdir.o: rmdir.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h +select.o: select.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h +sendrecv.o: sendrecv.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h \ + socketaddr.h ../../byterun/caml/misc.h +setgid.o: setgid.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +setgroups.o: setgroups.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h unixsupport.h +setsid.o: setsid.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h +setuid.o: setuid.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +shutdown.o: shutdown.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h +signals.o: signals.c ../../byterun/caml/alloc.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/fail.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/signals.h unixsupport.h +sleep.o: sleep.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/signals.h \ + ../../byterun/caml/mlvalues.h unixsupport.h +socketaddr.o: socketaddr.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + unixsupport.h socketaddr.h ../../byterun/caml/misc.h +socket.o: socket.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h +socketpair.o: socketpair.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h +sockopt.o: sockopt.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/fail.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h +stat.o: stat.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/signals.h ../../byterun/caml/io.h unixsupport.h \ + cst2constr.h nanosecond_stat.h +strofaddr.o: strofaddr.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h \ + socketaddr.h ../../byterun/caml/misc.h +symlink.o: symlink.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/signals.h unixsupport.h +termios.o: termios.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h +time.o: time.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h unixsupport.h +times.o: times.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ unixsupport.h -mkdir.o: mkdir.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h -mkfifo.o: mkfifo.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h -nice.o: nice.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h -open.o: open.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/misc.h ../../byterun/signals.h \ - unixsupport.h -opendir.o: opendir.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/alloc.h \ - ../../byterun/signals.h unixsupport.h -pipe.o: pipe.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h unixsupport.h -putenv.o: putenv.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/mlvalues.h unixsupport.h -read.o: read.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h -readdir.o: readdir.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/fail.h ../../byterun/mlvalues.h \ - ../../byterun/alloc.h ../../byterun/signals.h unixsupport.h -readlink.o: readlink.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/alloc.h \ - ../../byterun/fail.h ../../byterun/signals.h unixsupport.h -rename.o: rename.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h -rewinddir.o: rewinddir.c ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h -rmdir.o: rmdir.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h -select.o: select.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h -sendrecv.o: sendrecv.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h \ - socketaddr.h ../../byterun/misc.h -setgid.o: setgid.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h -setgroups.o: setgroups.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h unixsupport.h -setsid.o: setsid.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h -setuid.o: setuid.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h -shutdown.o: shutdown.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h -signals.o: signals.c ../../byterun/alloc.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/mlvalues.h \ - ../../byterun/signals.h unixsupport.h -sleep.o: sleep.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/signals.h \ - ../../byterun/mlvalues.h unixsupport.h -socketaddr.o: socketaddr.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h \ - socketaddr.h ../../byterun/misc.h -socket.o: socket.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h -socketpair.o: socketpair.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h unixsupport.h -sockopt.o: sockopt.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/alloc.h \ - ../../byterun/fail.h unixsupport.h socketaddr.h ../../byterun/misc.h -stat.o: stat.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/alloc.h \ - ../../byterun/signals.h unixsupport.h cst2constr.h ../../byterun/io.h -strofaddr.o: strofaddr.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h unixsupport.h socketaddr.h ../../byterun/misc.h -symlink.o: symlink.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h -termios.o: termios.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h unixsupport.h -time.o: time.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h unixsupport.h -times.o: times.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h unixsupport.h -truncate.o: truncate.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/fail.h \ - ../../byterun/signals.h ../../byterun/io.h unixsupport.h -umask.o: umask.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h -unixsupport.o: unixsupport.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/callback.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/fail.h unixsupport.h cst2constr.h -unlink.o: unlink.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h -utimes.o: utimes.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h -wait.o: wait.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h -write.o: write.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h +truncate.o: truncate.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/fail.h \ + ../../byterun/caml/signals.h ../../byterun/caml/io.h unixsupport.h +umask.o: umask.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +unixsupport.o: unixsupport.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/callback.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/fail.h unixsupport.h \ + cst2constr.h +unlink.o: unlink.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h +utimes.o: utimes.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/signals.h unixsupport.h +wait.o: wait.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h +write.o: write.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h unixLabels.cmi : unix.cmi unix.cmi : unixLabels.cmo : unix.cmi unixLabels.cmi From d028cfa4d06f81d3406d6f0f226244b706b12e58 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 12 Apr 2015 09:03:55 +0000 Subject: [PATCH 204/494] update Changes git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16000 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Changes b/Changes index 157dc38cc2..a9f5d4702e 100644 --- a/Changes +++ b/Changes @@ -60,6 +60,9 @@ Bug fixes: (Damien Doligez, report by Didier Le Botlan) - PR#5836, PR#6684: printing lazy values in ocamldebug may segfault (Gabriel Scherer) +- PR#5887: move the byterun/*.h headers to byterun/caml/*.h to avoid + header name clashes + (Jérôme Vouillon and Adrien Nader and Peter Zotov) - PR#6573: extern "C" for systhreads/threads.h (Mickaël Delahaye) - PR#6607: The manual doesn't mention 0x200 flag for OCAMLRUNPARAM=v From 600a93dfaa2efe3a9f3c526f0f25288e5cda3a84 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 12 Apr 2015 10:44:54 +0000 Subject: [PATCH 205/494] Update with instructions to compile native mingw 64-bit flavor (Matthieu Dubuget) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16005 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- README.win32 | 47 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/README.win32 b/README.win32 index 111c9a107c..0f520f466e 100644 --- a/README.win32 +++ b/README.win32 @@ -1,11 +1,14 @@ Release notes on the MS Windows ports of OCaml ---------------------------------------------- -There are no less than four ports of OCaml for MS Windows available: +There are no less than five ports of OCaml for MS Windows available: - a native Win32 port, built with the Microsoft development tools; - a native Win32 port, built with the 32-bit version of the gcc compiler from the mingw-w64 project, packaged in Cygwin (under the name mingw64-i686); + - a native Win32 port, built with the 64-bit version of the gcc + compiler from the mingw-w64 project, packaged in Cygwin + (under the name mingw64-x86_64); - a port consisting of the Unix sources compiled under the Cygwin Unix-like environment for Windows; - a native Win64 port (64-bit Windows), built with the Microsoft @@ -15,7 +18,7 @@ Here is a summary of the main differences between these ports: Native MS Native MinGW Cygwin -64 bits? Win32 or Win64 Win32 only Win32 only +64 bits? Win32 or Win64 Win32 or Win64 Win32 only Third-party software required - for base bytecode system none none none @@ -161,12 +164,12 @@ contributed his changes to the OCaml project. ------------------------------------------------------------------------------ - The native Win32 port built with Mingw - -------------------------------------- + The native Win32 and Win64 ports built with Mingw + ------------------------------------------------- REQUIREMENTS: -This port runs under MS Windows Seven, Vista, XP, and 2000. +Those ports run under MS Windows Seven, Vista, XP, and 2000. The base bytecode system (ocamlc, ocaml, ocamllex, ocamlyacc, ...) runs without any additional tools. @@ -177,14 +180,18 @@ the Cygwin development tools, available at http://www.cygwin.com/ and the flexdll tool, available at http://alain.frisch.fr/flexdll.html -You will need to install at least the following Cygwin packages (use -the Setup tool from Cygwin): +You will need to install at least the following Cygwin packages for +the 32-bit flavor (use the Setup tool from Cygwin): mingw64-i686-binutils - mingw64-i686-gcc mingw64-i686-gcc-core mingw64-i686-runtime +and the following packages for the 64-bit: + + mingw64-x86_64-binutils + mingw64-x86_64-gcc-core + mingw64-x86_64-runtime NOTES: @@ -218,13 +225,22 @@ You will need the following software components to perform the recompilation: - Cygwin: http://cygwin.com/ Install at least the following packages (and their dependencies, as computed by Cygwin's setup.exe): - mingw64-i686-binutils - mingw64-i686-gcc - mingw64-i686-gcc-core - mingw64-i686-runtime + + For both flavor of OCaml (32-bit and 64-bit): diffutils make ncurses + + For the 32 bit flavor of OCaml: + mingw64-i686-binutils + mingw64-i686-gcc-core + mingw64-i686-runtime + + For the 64 bit flavor of OCaml: + mingw64-x86_64-binutils + mingw64-x86_64-gcc-core + mingw64-x86_64-runtime + - The flexdll tool (see above). Do not forget to add the flexdll directory to your PATH @@ -238,8 +254,13 @@ directory of the OCaml distribution. Then, do cp config/m-nt.h config/m.h cp config/s-nt.h config/s.h + +For a 32 bit OCaml: cp config/Makefile.mingw config/Makefile +For a 64 bit OCaml: + cp config/Makefile.mingw64 config/Makefile + Then, edit config/Makefile as needed, following the comments in this file. Normally, the only variable that need to be changed is PREFIX where to install everything @@ -260,7 +281,7 @@ NOTES: * The replay debugger is partially supported (no reverse execution). -* The default Makefile.mingw passes -static-libgcc to the linker. +* The default Makefile.mingw and Makefile.mingw64 pass -static-libgcc to the linker. For more information on this topic: http://gcc.gnu.org/onlinedocs/gcc-4.9.1/gcc/Link-Options.html#Link-Options From 914e47e662c95b961ae3d8c7c133da69498fad20 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 12 Apr 2015 16:57:32 +0000 Subject: [PATCH 206/494] PR#5887: minor Makefile.nt fix git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16007 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- byterun/Makefile.nt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/byterun/Makefile.nt b/byterun/Makefile.nt index b8932eb70d..71873f2190 100644 --- a/byterun/Makefile.nt +++ b/byterun/Makefile.nt @@ -41,10 +41,12 @@ libcamlrund.$(A): $(DOBJS) .depend.nt: .depend rm -f .depend.win32 - echo "win32.o: win32.c fail.h compatibility.h \\" >> .depend.win32 - echo " misc.h config.h ../config/m.h ../config/s.h \\" >> .depend.win32 - echo " mlvalues.h memory.h gc.h major_gc.h \\" >> .depend.win32 - echo " freelist.h minor_gc.h osdeps.h signals.h" >> .depend.win32 + echo "win32.o: win32.c \\" >> .depend.win32 + echo " caml/fail.h caml/compatibility.h caml/misc.h \\" >> .depend.win32 + echo " caml/config.h ../config/m.h ../config/s.h \\" >> .depend.win32 + echo " caml/mlvalues.h caml/memory.h caml/gc.h \\" >> .depend.win32 + echo " caml/major_gc.h caml/freelist.h caml/minor_gc.h \\" >> .depend.win32 + echo " caml/osdeps.h caml/signals.h" >> .depend.win32 cat .depend >> .depend.win32 sed -e '/\.d\.o/q' -e 's/^\(.*\)\.o:/\1.$$(O) \1.$$(DBGO):/' \ .depend.win32 > .depend.nt From 3650a898dce4bdb5eca7d2e1516e36bd93298e9c Mon Sep 17 00:00:00 2001 From: Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> Date: Mon, 13 Apr 2015 07:26:10 +0000 Subject: [PATCH 207/494] Fix PR#6836: Assertion failure using -short-paths git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16014 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + testsuite/tests/typing-short-paths/pr6836.ml | 6 ++++ .../typing-short-paths/pr6836.ml.reference | 7 +++++ typing/printtyp.ml | 31 ++++++++++++------- 4 files changed, 33 insertions(+), 12 deletions(-) create mode 100644 testsuite/tests/typing-short-paths/pr6836.ml create mode 100644 testsuite/tests/typing-short-paths/pr6836.ml.reference diff --git a/Changes b/Changes index a9f5d4702e..bf346ea4a9 100644 --- a/Changes +++ b/Changes @@ -106,6 +106,7 @@ Bug fixes: - PR#6799: include guards missing for unixsupport.h and other files - PR#6812: -short-paths and -no-alias-deps can create inconsistent assumptions - PR#6817: GADT exhaustiveness breakage with modules +- PR#6836: Assertion failure using -short-paths - GPR#143: fix getsockopt behaviour for boolean socket options (Anil Madhavapeddy and Andrew Ray) - ocamlbuild on cygwin cannot find ocamlfind diff --git a/testsuite/tests/typing-short-paths/pr6836.ml b/testsuite/tests/typing-short-paths/pr6836.ml new file mode 100644 index 0000000000..121bc463d5 --- /dev/null +++ b/testsuite/tests/typing-short-paths/pr6836.ml @@ -0,0 +1,6 @@ +type t = [`A | `B];; +type 'a u = t;; +let a : [< int u] = `A;; + +type 'a s = 'a;; +let b : [< t s] = `B;; diff --git a/testsuite/tests/typing-short-paths/pr6836.ml.reference b/testsuite/tests/typing-short-paths/pr6836.ml.reference new file mode 100644 index 0000000000..3f8c6dbd01 --- /dev/null +++ b/testsuite/tests/typing-short-paths/pr6836.ml.reference @@ -0,0 +1,7 @@ + +# type t = [ `A | `B ] +# type 'a u = t +# val a : [< int u > `A ] = `A +# type 'a s = 'a +# val b : [< t > `B ] = `B +# diff --git a/typing/printtyp.ml b/typing/printtyp.ml index cbce373949..52fddd478e 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -202,6 +202,10 @@ let () = Btype.print_raw := raw_type_expr type param_subst = Id | Nth of int | Map of int list +let is_nth = function + Nth _ -> true + | _ -> false + let compose l1 = function | Id -> Map l1 | Map l2 -> Map (List.map (List.nth l1) l2) @@ -443,7 +447,7 @@ let aliasable ty = match ty.desc with Tvar _ | Tunivar _ | Tpoly _ -> false | Tconstr (p, _, _) -> - (match best_type_path p with (_, Nth _) -> false | _ -> true) + not (is_nth (snd (best_type_path p))) | _ -> true let namable_row row = @@ -562,12 +566,10 @@ let rec tree_of_typexp sch ty = | Ttuple tyl -> Otyp_tuple (tree_of_typlist sch tyl) | Tconstr(p, tyl, abbrev) -> - begin match best_type_path p with - (_, Nth n) -> tree_of_typexp sch (List.nth tyl n) - | (p', s) -> - let tyl' = apply_subst s tyl in - Otyp_constr (tree_of_path p', tree_of_typlist sch tyl') - end + let p', s = best_type_path p in + let tyl' = apply_subst s tyl in + if is_nth s then tree_of_typexp sch (List.hd tyl') else + Otyp_constr (tree_of_path p', tree_of_typlist sch tyl') | Tvariant row -> let row = row_repr row in let fields = @@ -586,17 +588,22 @@ let rec tree_of_typexp sch ty = begin match row.row_name with | Some(p, tyl) when namable_row row -> let (p', s) = best_type_path p in - assert (s = Id); let id = tree_of_path p' in - let args = tree_of_typlist sch tyl in + let args = tree_of_typlist sch (apply_subst s tyl) in if row.row_closed && all_present then - Otyp_constr (id, args) + if is_nth s then List.hd args else Otyp_constr (id, args) else let non_gen = is_non_gen sch px in let tags = if all_present then None else Some (List.map fst present) in - Otyp_variant (non_gen, Ovar_name(id, args), - row.row_closed, tags) + let inh = + match args with + [Otyp_constr (i, a)] when is_nth s -> Ovar_name (i, a) + | _ -> + (* fallback case, should change outcometree... *) + Ovar_name (tree_of_path p, tree_of_typlist sch tyl) + in + Otyp_variant (non_gen, inh, row.row_closed, tags) | _ -> let non_gen = not (row.row_closed && all_present) && is_non_gen sch px in From d3f33a1296b6c081d7427573f1b7fd0d7f8f175e Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 14 Apr 2015 19:07:47 +0000 Subject: [PATCH 208/494] update ignore lists git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16015 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 From 3a866653d6ba8c66ed971a9d243b45f21dd8ad20 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 14 Apr 2015 19:10:39 +0000 Subject: [PATCH 209/494] Makefile.nt: "make distclean" should remove {asm,byte}run/.depend.nt git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16016 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Makefile.nt | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile.nt b/Makefile.nt index 6dab428d9c..3b3148e5bd 100644 --- a/Makefile.nt +++ b/Makefile.nt @@ -741,6 +741,7 @@ alldepend:: depend distclean: $(MAKE) clean + rm -f asmrun/.depend.nt byterun/.depend.nt rm -f boot/ocamlrun boot/ocamlrun.exe boot/camlheader boot/ocamlyacc \ boot/*.cm* boot/libcamlrun.a rm -f config/Makefile config/m.h config/s.h From 79f4982fec1b2d7b0ddb26bec52d8c54847d11e0 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 14 Apr 2015 19:12:48 +0000 Subject: [PATCH 210/494] Makefile.nt: fix TAB problem git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16017 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Makefile.nt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.nt b/Makefile.nt index 3b3148e5bd..a436d26997 100644 --- a/Makefile.nt +++ b/Makefile.nt @@ -741,7 +741,7 @@ alldepend:: depend distclean: $(MAKE) clean - rm -f asmrun/.depend.nt byterun/.depend.nt + rm -f asmrun/.depend.nt byterun/.depend.nt rm -f boot/ocamlrun boot/ocamlrun.exe boot/camlheader boot/ocamlyacc \ boot/*.cm* boot/libcamlrun.a rm -f config/Makefile config/m.h config/s.h From 8b780a688cd44c23e141a8759106db893bfc2cf4 Mon Sep 17 00:00:00 2001 From: Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> Date: Mon, 20 Apr 2015 07:35:01 +0000 Subject: [PATCH 211/494] Fix PR#6841 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16023 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + debugger/command_line.ml | 6 +++++- debugger/source.ml | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index bf346ea4a9..d8bb3fdb63 100644 --- a/Changes +++ b/Changes @@ -107,6 +107,7 @@ Bug fixes: - PR#6812: -short-paths and -no-alias-deps can create inconsistent assumptions - PR#6817: GADT exhaustiveness breakage with modules - PR#6836: Assertion failure using -short-paths +- PR#6841: Changing compilation unit name with -o breaks ocamldebug - GPR#143: fix getsockopt behaviour for boolean socket options (Anil Madhavapeddy and Andrew Ray) - ocamlbuild on cygwin cannot find ocamlfind diff --git a/debugger/command_line.ml b/debugger/command_line.ml index a4647110d6..b4f9f69303 100644 --- a/debugger/command_line.ml +++ b/debugger/command_line.ml @@ -610,8 +610,12 @@ let instr_break ppf lexbuf = let module_name = convert_module (module_of_longident mdle) in new_breakpoint (try + let ev = event_at_pos module_name 0 in + let ev_pos = + {Lexing.dummy_pos with + pos_fname = (Events.get_pos ev).pos_fname} in let buffer = - try get_buffer Lexing.dummy_pos module_name with + try get_buffer ev_pos module_name with | Not_found -> eprintf "No source file for %s.@." module_name; raise Toplevel diff --git a/debugger/source.ml b/debugger/source.ml index aa9ec70831..fa2b3c7e46 100644 --- a/debugger/source.ml +++ b/debugger/source.ml @@ -21,6 +21,8 @@ let source_extensions = [".ml"] (*** Conversion function. ***) let source_of_module pos mdle = + let pos_fname = pos.Lexing.pos_fname in + if Sys.file_exists pos_fname then pos_fname else let is_submodule m m' = let len' = String.length m' in try From 6c25c1962a84de9c3c80fc715d15a55851a5f291 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 21 Apr 2015 17:33:17 +0000 Subject: [PATCH 212/494] fix a 15-year-old bug noted in passing in GPR#170 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16026 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- parsing/printast.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parsing/printast.ml b/parsing/printast.ml index c069c7132d..cb94856ae7 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -875,7 +875,7 @@ and directive_argument i ppf x = match x with | Pdir_none -> line i ppf "Pdir_none\n" | Pdir_string (s) -> line i ppf "Pdir_string \"%s\"\n" s; - | Pdir_int (i) -> line i ppf "Pdir_int %d\n" i; + | Pdir_int (n) -> line i ppf "Pdir_int %d\n" n; | Pdir_ident (li) -> line i ppf "Pdir_ident %a\n" fmt_longident li; | Pdir_bool (b) -> line i ppf "Pdir_bool %s\n" (string_of_bool b); ;; From 5c6ed2fa32c9024f892dfdc20c14ee3fcbcce168 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 21 Apr 2015 18:47:50 +0000 Subject: [PATCH 213/494] GPR#159: Better locations for structure/signature items git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16027 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 + parsing/parser.mly | 520 +++++++++++------- .../typing-extensions/open_types.ml.reference | 12 +- .../tests/typing-gadts/pr5985.ml.reference | 40 +- .../yallop_bugs.ml.principal.reference | 4 +- .../typing-gadts/yallop_bugs.ml.reference | 4 +- .../typing-misc/constraints.ml.reference | 12 +- .../wellfounded.ml.principal.reference | 4 +- .../typing-misc/wellfounded.ml.reference | 4 +- .../Exemples.ml.principal.reference | 4 +- .../typing-objects/Exemples.ml.reference | 4 +- .../Tests.ml.principal.reference | 32 +- .../tests/typing-objects/Tests.ml.reference | 32 +- .../typing-poly/poly.ml.principal.reference | 20 +- testsuite/tests/typing-poly/poly.ml.reference | 20 +- .../private.ml.principal.reference | 4 +- .../tests/typing-private/private.ml.reference | 4 +- 17 files changed, 418 insertions(+), 304 deletions(-) diff --git a/Changes b/Changes index d8bb3fdb63..583e749103 100644 --- a/Changes +++ b/Changes @@ -17,6 +17,8 @@ Compilers: incrementally (Jacques Garrigue) - PR#6642: replace $CAMLORIGIN in -ccopt with the path to cma or cmxa (Peter Zotov, Gabriel Scherer, review by Damien Doligez) +- GPR#159: Better locations for structure/signature items + (Leo White) Toplevel and debugger: - PR#5958: generalized polymorphic #install_printer diff --git a/parsing/parser.mly b/parsing/parser.mly index 0a9a9009ec..aa001dc0b8 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -289,16 +289,89 @@ let mkcf_attrs d attrs = let mkctf_attrs d attrs = Ctf.mk ~loc:(symbol_rloc()) ~attrs d -let add_nonrec_attr rf tds = +let add_nonrec rf attrs pos = match rf with - | Recursive -> tds + | Recursive -> attrs | Nonrecursive -> - let add_attr td = - let name = { txt = "nonrec"; loc = td.ptype_loc } in - let attrs = (name, PStr []) :: td.ptype_attributes in - { td with ptype_attributes = attrs } + let name = { txt = "nonrec"; loc = rhs_loc pos } in + (name, PStr []) :: attrs + +type let_binding = + { lb_pattern: pattern; + lb_expression: expression; + lb_attributes: attributes; + lb_loc: Location.t; } + +type let_bindings = + { lbs_bindings: let_binding list; + lbs_rec: rec_flag; + lbs_extension: string Asttypes.loc option; + lbs_attributes: attributes; + lbs_loc: Location.t } + +let mklb (p, e) attrs = + { lb_pattern = p; + lb_expression = e; + lb_attributes = attrs; + lb_loc = symbol_rloc (); } + +let mklbs (ext, attrs) rf lb = + { lbs_bindings = [lb]; + lbs_rec = rf; + lbs_extension = ext ; + lbs_attributes = attrs; + lbs_loc = symbol_rloc (); } + +let addlb lbs lb = + { lbs with lbs_bindings = lb :: lbs.lbs_bindings } + +let val_of_let_bindings lbs = + match lbs.lbs_bindings with + | [ {lb_pattern = { ppat_desc = Ppat_any; ppat_loc = _ }; _} as lb ] -> + let exp = wrap_exp_attrs lb.lb_expression + (lbs.lbs_extension, lbs.lbs_attributes) in + mkstr (Pstr_eval (exp, lb.lb_attributes)) + | bindings -> + let bindings = + List.map + (fun lb -> + Vb.mk ~loc:lb.lb_loc ~attrs:lb.lb_attributes + lb.lb_pattern lb.lb_expression) + bindings in - List.map add_attr tds + let str = mkstr(Pstr_value(lbs.lbs_rec, List.rev bindings)) in + if lbs.lbs_attributes <> [] then + raise Syntaxerr.(Error(Not_expecting(lbs.lbs_loc, "attributes"))); + match lbs.lbs_extension with + | None -> str + | Some id -> ghstr (Pstr_extension((id, PStr [str]), [])) + +let expr_of_let_bindings lbs body = + let bindings = + List.map + (fun lb -> + if lb.lb_attributes <> [] then + raise Syntaxerr.(Error(Not_expecting(lb.lb_loc, "item attribute"))); + Vb.mk ~loc:lb.lb_loc lb.lb_pattern lb.lb_expression) + lbs.lbs_bindings + in + mkexp_attrs (Pexp_let(lbs.lbs_rec, List.rev bindings, body)) + (lbs.lbs_extension, lbs.lbs_attributes) + +let class_of_let_bindings lbs body = + let bindings = + List.map + (fun lb -> + if lb.lb_attributes <> [] then + raise Syntaxerr.(Error(Not_expecting(lb.lb_loc, "item attribute"))); + Vb.mk ~loc:lb.lb_loc lb.lb_pattern lb.lb_expression) + lbs.lbs_bindings + in + if lbs.lbs_extension <> None then + raise Syntaxerr.(Error(Not_expecting(lbs.lbs_loc, "extension"))); + if lbs.lbs_attributes <> [] then + raise Syntaxerr.(Error(Not_expecting(lbs.lbs_loc, "attributes"))); + mkclass(Pcl_let (lbs.lbs_rec, List.rev bindings, body)) %} @@ -636,55 +709,38 @@ structure_tail: | structure_item structure_tail { $1 :: $2 } ; structure_item: - LET ext_attributes rec_flag let_bindings - { - match $4 with - [ {pvb_pat = { ppat_desc = Ppat_any; ppat_loc = _ }; - pvb_expr = exp; pvb_attributes = attrs}] -> - let exp = wrap_exp_attrs exp $2 in - mkstr(Pstr_eval (exp, attrs)) - | l -> - let str = mkstr(Pstr_value($3, List.rev l)) in - let (ext, attrs) = $2 in - if attrs <> [] then not_expecting 2 "attribute"; - match ext with - | None -> str - | Some id -> ghstr (Pstr_extension((id, PStr [str]), [])) - } - | EXTERNAL val_ident COLON core_type EQUAL primitive_declaration - post_item_attributes - { mkstr - (Pstr_primitive (Val.mk (mkrhs $2 2) $4 - ~prim:$6 ~attrs:$7 ~loc:(symbol_rloc ()))) } - | TYPE nonrec_flag type_declarations - { mkstr(Pstr_type (add_nonrec_attr $2 (List.rev $3)) ) } - | TYPE nonrec_flag str_type_extension - { if $2 <> Recursive then not_expecting 2 "nonrec flag"; - mkstr(Pstr_typext $3) } - | EXCEPTION str_exception_declaration - { mkstr(Pstr_exception $2) } - | MODULE module_binding - { mkstr(Pstr_module $2) } - | MODULE REC module_bindings - { mkstr(Pstr_recmodule(List.rev $3)) } - | MODULE TYPE ident post_item_attributes - { mkstr(Pstr_modtype (Mtd.mk (mkrhs $3 3) - ~attrs:$4 ~loc:(symbol_rloc()))) } - | MODULE TYPE ident EQUAL module_type post_item_attributes - { mkstr(Pstr_modtype (Mtd.mk (mkrhs $3 3) - ~typ:$5 ~attrs:$6 ~loc:(symbol_rloc()))) } + let_bindings + { val_of_let_bindings $1 } + | primitive_declaration + { mkstr (Pstr_primitive $1) } + | type_declarations + { mkstr(Pstr_type (List.rev $1)) } + | str_type_extension + { mkstr(Pstr_typext $1) } + | str_exception_declaration + { mkstr(Pstr_exception $1) } + | module_binding + { mkstr(Pstr_module $1) } + | rec_module_bindings + { mkstr(Pstr_recmodule(List.rev $1)) } + | module_type_declaration + { mkstr(Pstr_modtype $1) } | open_statement { mkstr(Pstr_open $1) } - | CLASS class_declarations - { mkstr(Pstr_class (List.rev $2)) } - | CLASS TYPE class_type_declarations - { mkstr(Pstr_class_type (List.rev $3)) } - | INCLUDE module_expr post_item_attributes - { mkstr(Pstr_include (Incl.mk $2 ~attrs:$3 ~loc:(symbol_rloc()))) } + | class_declarations + { mkstr(Pstr_class (List.rev $1)) } + | class_type_declarations + { mkstr(Pstr_class_type (List.rev $1)) } + | str_include_statement + { mkstr(Pstr_include $1) } | item_extension post_item_attributes { mkstr(Pstr_extension ($1, $2)) } | floating_attribute { mkstr(Pstr_attribute $1) } ; +str_include_statement: + INCLUDE module_expr post_item_attributes + { Incl.mk $2 ~attrs:$3 ~loc:(symbol_rloc()) } +; module_binding_body: EQUAL module_expr { $2 } @@ -693,13 +749,21 @@ module_binding_body: | functor_arg module_binding_body { mkmod(Pmod_functor(fst $1, snd $1, $2)) } ; -module_bindings: - module_binding { [$1] } - | module_bindings AND module_binding { $3 :: $1 } -; module_binding: - UIDENT module_binding_body post_item_attributes - { Mb.mk (mkrhs $1 1) $2 ~attrs:$3 ~loc:(symbol_rloc ()) } + MODULE UIDENT module_binding_body post_item_attributes + { Mb.mk (mkrhs $2 2) $3 ~attrs:$4 ~loc:(symbol_rloc ()) } +; +rec_module_bindings: + rec_module_binding { [$1] } + | rec_module_bindings and_module_binding { $2 :: $1 } +; +rec_module_binding: + MODULE REC UIDENT module_binding_body post_item_attributes + { Mb.mk (mkrhs $3 3) $4 ~attrs:$5 ~loc:(symbol_rloc ()) } +; +and_module_binding: + AND UIDENT module_binding_body post_item_attributes + { Mb.mk (mkrhs $2 2) $3 ~attrs:$4 ~loc:(symbol_rloc ()) } ; /* Module types */ @@ -736,47 +800,32 @@ signature: | signature_item signature { $1 :: $2 } ; signature_item: - VAL val_ident COLON core_type post_item_attributes - { mksig(Psig_value - (Val.mk (mkrhs $2 2) $4 ~attrs:$5 ~loc:(symbol_rloc()))) } - | EXTERNAL val_ident COLON core_type EQUAL primitive_declaration - post_item_attributes - { mksig(Psig_value - (Val.mk (mkrhs $2 2) $4 ~prim:$6 ~attrs:$7 - ~loc:(symbol_rloc()))) } - | TYPE nonrec_flag type_declarations - { mksig(Psig_type (add_nonrec_attr $2 (List.rev $3))) } - | TYPE nonrec_flag sig_type_extension - { if $2 <> Recursive then not_expecting 2 "nonrec flag"; - mksig(Psig_typext $3) } - | EXCEPTION sig_exception_declaration - { mksig(Psig_exception $2) } - | MODULE UIDENT module_declaration post_item_attributes - { mksig(Psig_module (Md.mk (mkrhs $2 2) - $3 ~attrs:$4 ~loc:(symbol_rloc()))) } - | MODULE UIDENT EQUAL mod_longident post_item_attributes - { mksig(Psig_module (Md.mk (mkrhs $2 2) - (Mty.alias ~loc:(rhs_loc 4) (mkrhs $4 4)) - ~attrs:$5 - ~loc:(symbol_rloc()) - )) } - | MODULE REC module_rec_declarations - { mksig(Psig_recmodule (List.rev $3)) } - | MODULE TYPE ident post_item_attributes - { mksig(Psig_modtype (Mtd.mk (mkrhs $3 3) - ~attrs:$4 ~loc:(symbol_rloc()))) } - | MODULE TYPE ident EQUAL module_type post_item_attributes - { mksig(Psig_modtype (Mtd.mk (mkrhs $3 3) ~typ:$5 - ~loc:(symbol_rloc()) - ~attrs:$6)) } + value_description + { mksig(Psig_value $1) } + | primitive_declaration + { mksig(Psig_value $1) } + | type_declarations + { mksig(Psig_type (List.rev $1)) } + | sig_type_extension + { mksig(Psig_typext $1) } + | sig_exception_declaration + { mksig(Psig_exception $1) } + | module_declaration + { mksig(Psig_module $1) } + | module_alias + { mksig(Psig_module $1) } + | rec_module_declarations + { mksig(Psig_recmodule (List.rev $1)) } + | module_type_declaration + { mksig(Psig_modtype $1) } | open_statement { mksig(Psig_open $1) } - | INCLUDE module_type post_item_attributes %prec below_WITH - { mksig(Psig_include (Incl.mk $2 ~attrs:$3 ~loc:(symbol_rloc()))) } - | CLASS class_descriptions - { mksig(Psig_class (List.rev $2)) } - | CLASS TYPE class_type_declarations - { mksig(Psig_class_type (List.rev $3)) } + | sig_include_statement + { mksig(Psig_include $1) } + | class_descriptions + { mksig(Psig_class (List.rev $1)) } + | class_type_declarations + { mksig(Psig_class_type (List.rev $1)) } | item_extension post_item_attributes { mksig(Psig_extension ($1, $2)) } | floating_attribute @@ -786,37 +835,65 @@ open_statement: | OPEN override_flag mod_longident post_item_attributes { Opn.mk (mkrhs $3 3) ~override:$2 ~attrs:$4 ~loc:(symbol_rloc()) } ; -module_declaration: +sig_include_statement: + INCLUDE module_type post_item_attributes %prec below_WITH + { Incl.mk $2 ~attrs:$3 ~loc:(symbol_rloc()) } +; +module_declaration_body: COLON module_type { $2 } - | LPAREN UIDENT COLON module_type RPAREN module_declaration + | LPAREN UIDENT COLON module_type RPAREN module_declaration_body { mkmty(Pmty_functor(mkrhs $2 2, Some $4, $6)) } - | LPAREN RPAREN module_declaration + | LPAREN RPAREN module_declaration_body { mkmty(Pmty_functor(mkrhs "*" 1, None, $3)) } ; -module_rec_declarations: - module_rec_declaration { [$1] } - | module_rec_declarations AND module_rec_declaration { $3 :: $1 } +module_declaration: + MODULE UIDENT module_declaration_body post_item_attributes + { Md.mk (mkrhs $2 2) $3 ~attrs:$4 ~loc:(symbol_rloc()) } +; +module_alias: + MODULE UIDENT EQUAL mod_longident post_item_attributes + { Md.mk (mkrhs $2 2) + (Mty.alias ~loc:(rhs_loc 4) (mkrhs $4 4)) + ~attrs:$5 ~loc:(symbol_rloc()) } ; -module_rec_declaration: - UIDENT COLON module_type post_item_attributes - { Md.mk (mkrhs $1 1) $3 ~attrs:$4 ~loc:(symbol_rloc()) } +rec_module_declarations: + rec_module_declaration { [$1] } + | rec_module_declarations and_module_declaration { $2 :: $1 } +; +rec_module_declaration: + MODULE REC UIDENT COLON module_type post_item_attributes + { Md.mk (mkrhs $3 3) $5 ~attrs:$6 ~loc:(symbol_rloc()) } +; +and_module_declaration: + AND UIDENT COLON module_type post_item_attributes + { Md.mk (mkrhs $2 2) $4 ~attrs:$5 ~loc:(symbol_rloc()) } +; +module_type_declaration_body: + /* empty */ { None } + | EQUAL module_type { Some $2 } +; +module_type_declaration: + MODULE TYPE ident module_type_declaration_body post_item_attributes + { Mtd.mk (mkrhs $3 3) ?typ:$4 ~loc:(symbol_rloc()) ~attrs:$5 } ; - /* Class expressions */ class_declarations: - class_declarations AND class_declaration { $3 :: $1 } - | class_declaration { [$1] } + class_declaration { [$1] } + | class_declarations and_class_declaration { $2 :: $1 } ; class_declaration: - virtual_flag class_type_parameters LIDENT class_fun_binding + CLASS virtual_flag class_type_parameters LIDENT class_fun_binding post_item_attributes - { - Ci.mk (mkrhs $3 3) $4 - ~virt:$1 ~params:$2 - ~attrs:$5 ~loc:(symbol_rloc ()) - } + { Ci.mk (mkrhs $4 4) $5 ~virt:$2 ~params:$3 + ~attrs:$6 ~loc:(symbol_rloc ()) } +; +and_class_declaration: + AND virtual_flag class_type_parameters LIDENT class_fun_binding + post_item_attributes + { Ci.mk (mkrhs $4 4) $5 ~virt:$2 ~params:$3 + ~attrs:$6 ~loc:(symbol_rloc ()) } ; class_fun_binding: EQUAL class_expr @@ -843,8 +920,8 @@ class_expr: { $2 } | class_simple_expr simple_labeled_expr_list { mkclass(Pcl_apply($1, List.rev $2)) } - | LET rec_flag let_bindings_no_attrs IN class_expr - { mkclass(Pcl_let ($2, List.rev $3, $5)) } + | let_bindings IN class_expr + { class_of_let_bindings $1 $3 } | class_expr attribute { Cl.attr $1 $2 } | extension @@ -1019,30 +1096,36 @@ constrain_field: core_type EQUAL core_type { $1, $3 } ; class_descriptions: - class_descriptions AND class_description { $3 :: $1 } - | class_description { [$1] } + class_description { [$1] } + | class_descriptions and_class_description { $2 :: $1 } ; class_description: - virtual_flag class_type_parameters LIDENT COLON class_type + CLASS virtual_flag class_type_parameters LIDENT COLON class_type post_item_attributes - { - Ci.mk (mkrhs $3 3) $5 - ~virt:$1 ~params:$2 - ~attrs:$6 ~loc:(symbol_rloc ()) - } + { Ci.mk (mkrhs $4 4) $6 ~virt:$2 ~params:$3 + ~attrs:$7 ~loc:(symbol_rloc ()) } +; +and_class_description: + AND virtual_flag class_type_parameters LIDENT COLON class_type + post_item_attributes + { Ci.mk (mkrhs $4 4) $6 ~virt:$2 ~params:$3 + ~attrs:$7 ~loc:(symbol_rloc ()) } ; class_type_declarations: - class_type_declarations AND class_type_declaration { $3 :: $1 } - | class_type_declaration { [$1] } + class_type_declaration { [$1] } + | class_type_declarations and_class_type_declaration { $2 :: $1 } ; class_type_declaration: - virtual_flag class_type_parameters LIDENT EQUAL class_signature - post_item_attributes - { - Ci.mk (mkrhs $3 3) $5 - ~virt:$1 ~params:$2 - ~attrs:$6 ~loc:(symbol_rloc ()) - } + CLASS TYPE virtual_flag class_type_parameters LIDENT EQUAL + class_signature post_item_attributes + { Ci.mk (mkrhs $5 5) $7 ~virt:$3 ~params:$4 + ~attrs:$8 ~loc:(symbol_rloc ()) } +; +and_class_type_declaration: + AND virtual_flag class_type_parameters LIDENT EQUAL + class_signature post_item_attributes + { Ci.mk (mkrhs $4 4) $6 ~virt:$2 ~params:$3 + ~attrs:$7 ~loc:(symbol_rloc ()) } ; /* Core expressions */ @@ -1098,8 +1181,8 @@ expr: { $1 } | simple_expr simple_labeled_expr_list { mkexp(Pexp_apply($1, List.rev $2)) } - | LET ext_attributes rec_flag let_bindings_no_attrs IN seq_expr - { mkexp_attrs (Pexp_let($3, List.rev $4, $6)) $2 } + | let_bindings IN seq_expr + { expr_of_let_bindings $1 $3 } | LET MODULE ext_attributes UIDENT module_binding_body IN seq_expr { mkexp_attrs (Pexp_letmodule(mkrhs $4 4, $5, $7)) $3 } | LET OPEN override_flag ext_attributes mod_longident IN seq_expr @@ -1335,32 +1418,11 @@ label_expr: label_ident: LIDENT { ($1, mkexp(Pexp_ident(mkrhs (Lident $1) 1))) } ; -let_bindings: - let_binding { [$1] } - | let_bindings AND let_binding { $3 :: $1 } -; -let_bindings_no_attrs: - let_bindings { - let l = $1 in - List.iter - (fun vb -> - if vb.pvb_attributes <> [] then - raise Syntaxerr.(Error(Not_expecting(vb.pvb_loc,"item attribute"))) - ) - l; - l - } - lident_list: LIDENT { [$1] } | LIDENT lident_list { $1 :: $2 } ; -let_binding: - let_binding_ post_item_attributes { - let (p, e) = $1 in Vb.mk ~loc:(symbol_rloc()) ~attrs:$2 p e - } -; -let_binding_: +let_binding_body: val_ident fun_binding { (mkpatvar $1 1, $2) } | val_ident COLON typevar_list DOT core_type EQUAL seq_expr @@ -1375,6 +1437,18 @@ let_binding_: | simple_pattern_not_ident COLON core_type EQUAL seq_expr { (ghpat(Ppat_constraint($1, $3)), $5) } ; +let_bindings: + let_binding { $1 } + | let_bindings and_let_binding { addlb $1 $2 } +; +let_binding: + LET ext_attributes rec_flag let_binding_body post_item_attributes + { mklbs $2 $3 (mklb $4 $5) } +; +and_let_binding: + AND let_binding_body post_item_attributes + { mklb $2 $3 } +; fun_binding: strict_binding { $1 } @@ -1557,27 +1631,45 @@ lbl_pattern: { (mkrhs $1 1, pat_of_label $1 1) } ; +/* Value descriptions */ + +value_description: + VAL val_ident COLON core_type post_item_attributes + { Val.mk (mkrhs $2 2) $4 ~attrs:$5 ~loc:(symbol_rloc()) } +; + /* Primitive declarations */ -primitive_declaration: +primitive_declaration_body: STRING { [fst $1] } - | STRING primitive_declaration { fst $1 :: $2 } + | STRING primitive_declaration_body { fst $1 :: $2 } +; +primitive_declaration: + EXTERNAL val_ident COLON core_type EQUAL primitive_declaration_body + post_item_attributes + { Val.mk (mkrhs $2 2) $4 ~prim:$6 ~attrs:$7 ~loc:(symbol_rloc ()) } ; /* Type declarations */ type_declarations: type_declaration { [$1] } - | type_declarations AND type_declaration { $3 :: $1 } + | type_declarations and_type_declaration { $2 :: $1 } ; type_declaration: - optional_type_parameters LIDENT type_kind constraints post_item_attributes - { let (kind, priv, manifest) = $3 in - Type.mk (mkrhs $2 2) - ~params:$1 ~cstrs:(List.rev $4) - ~kind ~priv ?manifest ~attrs:$5 ~loc:(symbol_rloc()) - } + TYPE nonrec_flag optional_type_parameters LIDENT type_kind constraints + post_item_attributes + { let (kind, priv, manifest) = $5 in + Type.mk (mkrhs $4 4) ~params:$3 ~cstrs:(List.rev $6) ~kind + ~priv ?manifest ~attrs:(add_nonrec $2 $7 2) ~loc:(symbol_rloc ()) } +; +and_type_declaration: + AND optional_type_parameters LIDENT type_kind constraints + post_item_attributes + { let (kind, priv, manifest) = $4 in + Type.mk (mkrhs $3 3) ~params:$2 ~cstrs:(List.rev $5) + ~kind ~priv ?manifest ~attrs:$6 ~loc:(symbol_rloc ()) } ; constraints: constraints CONSTRAINT constrain { $3 :: $1 } @@ -1594,18 +1686,16 @@ type_kind: { (Ptype_variant(List.rev $2), Public, None) } | EQUAL PRIVATE constructor_declarations { (Ptype_variant(List.rev $3), Private, None) } - | EQUAL private_flag BAR constructor_declarations - { (Ptype_variant(List.rev $4), $2, None) } | EQUAL DOTDOT { (Ptype_open, Public, None) } - | EQUAL private_flag LBRACE label_declarations opt_semi RBRACE - { (Ptype_record(List.rev $4), $2, None) } - | EQUAL core_type EQUAL private_flag opt_bar constructor_declarations - { (Ptype_variant(List.rev $6), $4, Some $2) } + | EQUAL private_flag LBRACE label_declarations RBRACE + { (Ptype_record $4, $2, None) } + | EQUAL core_type EQUAL private_flag constructor_declarations + { (Ptype_variant(List.rev $5), $4, Some $2) } | EQUAL core_type EQUAL DOTDOT { (Ptype_open, Public, Some $2) } - | EQUAL core_type EQUAL private_flag LBRACE label_declarations opt_semi RBRACE - { (Ptype_record(List.rev $6), $4, Some $2) } + | EQUAL core_type EQUAL private_flag LBRACE label_declarations RBRACE + { (Ptype_record $6, $4, Some $2) } ; optional_type_parameters: /*empty*/ { [] } @@ -1646,8 +1736,9 @@ type_parameter_list: | type_parameter_list COMMA type_parameter { $3 :: $1 } ; constructor_declarations: - constructor_declaration { [$1] } - | constructor_declarations BAR constructor_declaration { $3 :: $1 } + constructor_declaration { [$1] } + | bar_constructor_declaration { [$1] } + | constructor_declarations bar_constructor_declaration { $2 :: $1 } ; constructor_declaration: | constr_ident generalized_constructor_arguments attributes @@ -1656,24 +1747,26 @@ constructor_declaration: Type.constructor (mkrhs $1 1) ~args ?res ~loc:(symbol_rloc()) ~attrs:$3 } ; -str_exception_declaration: - | extension_constructor_declaration post_item_attributes +bar_constructor_declaration: + | BAR constr_ident generalized_constructor_arguments attributes { - let ext = $1 in - {ext with pext_attributes = ext.pext_attributes @ $2} - } - | extension_constructor_rebind post_item_attributes - { - let ext = $1 in - {ext with pext_attributes = ext.pext_attributes @ $2} + let args,res = $3 in + Type.constructor (mkrhs $2 2) ~args ?res ~loc:(symbol_rloc()) ~attrs:$4 } ; +str_exception_declaration: + | sig_exception_declaration { $1 } + | EXCEPTION constr_ident EQUAL constr_longident attributes + post_item_attributes + { Te.rebind (mkrhs $2 2) (mkrhs $4 4) + ~loc:(symbol_rloc()) ~attrs:($5 @ $6) } +; sig_exception_declaration: - | extension_constructor_declaration post_item_attributes - { - let ext = $1 in - {ext with pext_attributes = ext.pext_attributes @ $2} - } + | EXCEPTION constr_ident generalized_constructor_arguments attributes + post_item_attributes + { let args, res = $3 in + Te.decl (mkrhs $2 2) ~args ?res + ~loc:(symbol_rloc()) ~attrs:($4 @ $5) } ; generalized_constructor_arguments: /*empty*/ { ([],None) } @@ -1688,7 +1781,8 @@ generalized_constructor_arguments: label_declarations: label_declaration { [$1] } - | label_declarations SEMI label_declaration { $3 :: $1 } + | label_declaration_semi { [$1] } + | label_declaration_semi label_declarations { $1 :: $2 } ; label_declaration: mutable_flag label COLON poly_type_no_attr attributes @@ -1696,43 +1790,61 @@ label_declaration: Type.field (mkrhs $2 2) $4 ~mut:$1 ~attrs:$5 ~loc:(symbol_rloc()) } ; +label_declaration_semi: + mutable_flag label COLON poly_type_no_attr attributes SEMI + { + Type.field (mkrhs $2 2) $4 ~mut:$1 ~attrs:$5 ~loc:(symbol_rloc()) + } +; /* Type Extensions */ str_type_extension: - optional_type_parameters type_longident - PLUSEQ private_flag opt_bar str_extension_constructors post_item_attributes - { Te.mk (mkrhs $2 2) (List.rev $6) - ~params:$1 ~priv:$4 ~attrs:$7 } + TYPE nonrec_flag optional_type_parameters type_longident + PLUSEQ private_flag str_extension_constructors post_item_attributes + { if $2 <> Recursive then not_expecting 2 "nonrec flag"; + Te.mk (mkrhs $4 4) (List.rev $7) ~params:$3 ~priv:$6 ~attrs:$8 } ; sig_type_extension: - optional_type_parameters type_longident - PLUSEQ private_flag opt_bar sig_extension_constructors post_item_attributes - { Te.mk (mkrhs $2 2) (List.rev $6) - ~params:$1 ~priv:$4 ~attrs:$7 } + TYPE nonrec_flag optional_type_parameters type_longident + PLUSEQ private_flag sig_extension_constructors post_item_attributes + { if $2 <> Recursive then not_expecting 2 "nonrec flag"; + Te.mk (mkrhs $4 4) (List.rev $7) ~params:$3 ~priv:$6 ~attrs:$8 } ; str_extension_constructors: extension_constructor_declaration { [$1] } + | bar_extension_constructor_declaration { [$1] } | extension_constructor_rebind { [$1] } - | str_extension_constructors BAR extension_constructor_declaration - { $3 :: $1 } - | str_extension_constructors BAR extension_constructor_rebind - { $3 :: $1 } + | bar_extension_constructor_rebind { [$1] } + | str_extension_constructors bar_extension_constructor_declaration + { $2 :: $1 } + | str_extension_constructors bar_extension_constructor_rebind + { $2 :: $1 } ; sig_extension_constructors: extension_constructor_declaration { [$1] } - | sig_extension_constructors BAR extension_constructor_declaration - { $3 :: $1 } + | bar_extension_constructor_declaration { [$1] } + | sig_extension_constructors bar_extension_constructor_declaration + { $2 :: $1 } ; extension_constructor_declaration: | constr_ident generalized_constructor_arguments attributes { let args, res = $2 in Te.decl (mkrhs $1 1) ~args ?res ~loc:(symbol_rloc()) ~attrs:$3 } ; +bar_extension_constructor_declaration: + | BAR constr_ident generalized_constructor_arguments attributes + { let args, res = $3 in + Te.decl (mkrhs $2 2) ~args ?res ~loc:(symbol_rloc()) ~attrs:$4 } +; extension_constructor_rebind: | constr_ident EQUAL constr_longident attributes { Te.rebind (mkrhs $1 1) (mkrhs $3 3) ~loc:(symbol_rloc()) ~attrs:$4 } ; +bar_extension_constructor_rebind: + | BAR constr_ident EQUAL constr_longident attributes + { Te.rebind (mkrhs $2 2) (mkrhs $4 4) ~loc:(symbol_rloc()) ~attrs:$5 } +; /* "with" constraints (additional type equations over signature components) */ diff --git a/testsuite/tests/typing-extensions/open_types.ml.reference b/testsuite/tests/typing-extensions/open_types.ml.reference index 4c143a564b..e639c9df5b 100644 --- a/testsuite/tests/typing-extensions/open_types.ml.reference +++ b/testsuite/tests/typing-extensions/open_types.ml.reference @@ -13,21 +13,21 @@ type bar += Bar of int (* Error: type is not open *) ^^^^^^^^^^ Error: Cannot extend type definition bar -# Characters 6-20: +# Characters 1-20: type baz = bar = .. (* Error: type kinds don't match *) - ^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^ Error: This variant or record definition does not match that of type bar Their kinds differ. # type 'a foo = .. -# Characters 6-32: +# Characters 1-32: type ('a, 'b) bar = 'a foo = .. (* Error: arrities do not match *) - ^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: This variant or record definition does not match that of type 'a foo They have different arities. # type ('a, 'b) foo = .. -# Characters 6-38: +# Characters 1-38: type ('a, 'b) bar = ('a, 'a) foo = .. (* Error: constraints do not match *) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: This variant or record definition does not match that of type ('a, 'a) foo Their constraints differ. diff --git a/testsuite/tests/typing-gadts/pr5985.ml.reference b/testsuite/tests/typing-gadts/pr5985.ml.reference index af6154dda7..4c29f6dae2 100644 --- a/testsuite/tests/typing-gadts/pr5985.ml.reference +++ b/testsuite/tests/typing-gadts/pr5985.ml.reference @@ -1,43 +1,43 @@ -# Characters 92-115: +# Characters 88-115: type _ t = T : 'a -> 'a s t - ^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In this definition, a type variable cannot be deduced from the type parameters. # * * * Characters 140-141: module F (S : sig type #'a s end) = struct ^ Error: Syntax error -# * * * * * Characters 296-374: - ........['a] c x = +# * * * * * Characters 290-374: + ..class ['a] c x = object constraint 'a = 'b T.t val x' : 'b = x method x = x' end Error: In this definition, a type variable cannot be deduced from the type parameters. -# Characters 83-128: +# Characters 79-128: type 'x t = A of 'a constraint 'x = [< `X of 'a ] ;; (* fail *) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In this definition, a type variable cannot be deduced from the type parameters. # Characters 36-37: let A x = A x in ^ Error: Unbound constructor A -# Characters 4-37: +# Characters 0-37: type 'a t = A : 'a -> [< `X of 'a ] t;; (* fail *) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In this definition, a type variable cannot be deduced from the type parameters. # type (_, _) eq = Eq : ('a, 'a) eq # val eq : 'a = <poly> # val eq : ('a Queue.t, 'b Queue.t) eq = Eq -# Characters 4-33: +# Characters 0-33: type _ t = T : 'a -> 'a Queue.t t;; (* fail *) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In this definition, a type variable cannot be deduced from the type parameters. -# * * * * Characters 254-277: +# * * * * Characters 250-277: type _ t = T : 'a -> 'a s t - ^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In this definition, a type variable cannot be deduced from the type parameters. # Characters 59-60: @@ -50,17 +50,17 @@ Error: Unbound module type S ^ Error: Syntax error # * * * * type 'a q = Q -# Characters 5-36: +# Characters 0-36: type +'a t = 'b constraint 'a = 'b q;; - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In this definition, a type variable has a variance that cannot be deduced from the type parameters. It was expected to be unrestricted, but it is covariant. # type 'a t = T of 'a # type +'a s = 'b constraint 'a = 'b t -# Characters 5-36: +# Characters 0-36: type -'a s = 'b constraint 'a = 'b t;; (* fail *) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In this definition, a type variable has a variance that is not reflected by its occurrence in type parameters. It was expected to be contravariant, but it is covariant. @@ -68,9 +68,9 @@ Error: In this definition, a type variable has a variance that # type 'a t = T of ('a -> 'a) # type -'a s = 'b constraint 'a = 'b t # type +'a s = 'b constraint 'a = 'b q t -# Characters 5-38: +# Characters 0-38: type +'a s = 'b constraint 'a = 'b t q;; (* fail *) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In this definition, a type variable has a variance that cannot be deduced from the type parameters. It was expected to be unrestricted, but it is covariant. @@ -81,9 +81,9 @@ Error: In this definition, a type variable has a variance that method virtual add : 'a -> unit end # type +'a t = unit constraint 'a = 'b list -# Characters 4-27: +# Characters 0-27: type _ g = G : 'a -> 'a t g;; (* fail *) - ^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In this definition, a type variable cannot be deduced from the type parameters. # diff --git a/testsuite/tests/typing-gadts/yallop_bugs.ml.principal.reference b/testsuite/tests/typing-gadts/yallop_bugs.ml.principal.reference index ddae4d248e..b9f0cac915 100644 --- a/testsuite/tests/typing-gadts/yallop_bugs.ml.principal.reference +++ b/testsuite/tests/typing-gadts/yallop_bugs.ml.principal.reference @@ -3,9 +3,9 @@ let f (Refl : (a T.t, b T.t) eq) = (x :> b) ^^^^^^^^ Error: Type a is not a subtype of b -# Characters 36-67: +# Characters 31-67: type (_, +_) eq = Refl : ('a, 'a) eq - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In this GADT definition, the variance of some parameter cannot be checked # Characters 115-175: diff --git a/testsuite/tests/typing-gadts/yallop_bugs.ml.reference b/testsuite/tests/typing-gadts/yallop_bugs.ml.reference index ddae4d248e..b9f0cac915 100644 --- a/testsuite/tests/typing-gadts/yallop_bugs.ml.reference +++ b/testsuite/tests/typing-gadts/yallop_bugs.ml.reference @@ -3,9 +3,9 @@ let f (Refl : (a T.t, b T.t) eq) = (x :> b) ^^^^^^^^ Error: Type a is not a subtype of b -# Characters 36-67: +# Characters 31-67: type (_, +_) eq = Refl : ('a, 'a) eq - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In this GADT definition, the variance of some parameter cannot be checked # Characters 115-175: diff --git a/testsuite/tests/typing-misc/constraints.ml.reference b/testsuite/tests/typing-misc/constraints.ml.reference index 83a3dc1f99..41a324c69a 100644 --- a/testsuite/tests/typing-misc/constraints.ml.reference +++ b/testsuite/tests/typing-misc/constraints.ml.reference @@ -7,16 +7,16 @@ Error: Constraints are not satisfied in this type. [ `A of 'a ] t t as 'a should be an instance of ([ `A of 'b t t ] as 'b) t -# Characters 5-27: +# Characters 1-27: type 'a t = [`A of 'a t t];; (* fails *) - ^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In the definition of t, type 'a t t should be 'a t # type 'a t = [ `A of 'a t t ] constraint 'a = 'a t # type 'a t = [ `A of 'a t ] constraint 'a = 'a t # type 'a t = 'a constraint 'a = [ `A of 'a ] -# Characters 47-52: +# Characters 43-52: type 'a v = [`A of u v] constraint 'a = t and t = u and u = t;; (* fails *) - ^^^^^ + ^^^^^^^^^ Error: The type abbreviation t is cyclic # type 'a t = 'a # Characters 11-21: @@ -26,9 +26,9 @@ Error: This alias is bound to type 'a t = 'a but is used as an instance of type 'a The type variable 'a occurs inside 'a # val f : 'a t -> 'a -> bool = <fun> -# Characters 83-122: +# Characters 80-122: and 'o abs constraint 'o = 'o is_an_object - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: The definition of abs contains a cycle: 'a is_an_object as 'a # diff --git a/testsuite/tests/typing-misc/wellfounded.ml.principal.reference b/testsuite/tests/typing-misc/wellfounded.ml.principal.reference index 0c9e64ad01..04bf5586bb 100644 --- a/testsuite/tests/typing-misc/wellfounded.ml.principal.reference +++ b/testsuite/tests/typing-misc/wellfounded.ml.principal.reference @@ -1,7 +1,7 @@ # type _ prod = Prod : ('a * 'y) prod -# Characters 87-96: +# Characters 82-96: type d = d * d - ^^^^^^^^^ + ^^^^^^^^^^^^^^ Error: The type abbreviation d is cyclic # diff --git a/testsuite/tests/typing-misc/wellfounded.ml.reference b/testsuite/tests/typing-misc/wellfounded.ml.reference index 0c9e64ad01..04bf5586bb 100644 --- a/testsuite/tests/typing-misc/wellfounded.ml.reference +++ b/testsuite/tests/typing-misc/wellfounded.ml.reference @@ -1,7 +1,7 @@ # type _ prod = Prod : ('a * 'y) prod -# Characters 87-96: +# Characters 82-96: type d = d * d - ^^^^^^^^^ + ^^^^^^^^^^^^^^ Error: The type abbreviation d is cyclic # diff --git a/testsuite/tests/typing-objects/Exemples.ml.principal.reference b/testsuite/tests/typing-objects/Exemples.ml.principal.reference index 2b12a7d9b7..f0f3812ea3 100644 --- a/testsuite/tests/typing-objects/Exemples.ml.principal.reference +++ b/testsuite/tests/typing-objects/Exemples.ml.principal.reference @@ -24,8 +24,8 @@ # val get_x : < get_x : 'a; .. > -> 'a = <fun> # val set_x : < set_x : 'a; .. > -> 'a = <fun> # - : int list = [10; 5] -# Characters 7-96: - ......ref x_init = object +# Characters 1-96: + class ref x_init = object val mutable x = x_init method get = x method set y = x <- y diff --git a/testsuite/tests/typing-objects/Exemples.ml.reference b/testsuite/tests/typing-objects/Exemples.ml.reference index 7cbd68ec29..085a9e92ec 100644 --- a/testsuite/tests/typing-objects/Exemples.ml.reference +++ b/testsuite/tests/typing-objects/Exemples.ml.reference @@ -24,8 +24,8 @@ # val get_x : < get_x : 'a; .. > -> 'a = <fun> # val set_x : < set_x : 'a; .. > -> 'a = <fun> # - : int list = [10; 5] -# Characters 7-96: - ......ref x_init = object +# Characters 1-96: + class ref x_init = object val mutable x = x_init method get = x method set y = x <- y diff --git a/testsuite/tests/typing-objects/Tests.ml.principal.reference b/testsuite/tests/typing-objects/Tests.ml.principal.reference index e5d9bb8d59..6c9449441e 100644 --- a/testsuite/tests/typing-objects/Tests.ml.principal.reference +++ b/testsuite/tests/typing-objects/Tests.ml.principal.reference @@ -4,8 +4,8 @@ = <fun> # class ['a] c : unit -> object constraint 'a = int method f : int c end and ['a] d : unit -> object constraint 'a = int method f : int c end -# Characters 238-275: - ........d () = object +# Characters 234-275: + ....and d () = object inherit ['a] c () end.. Error: Some type variables are unbound in this type: @@ -19,8 +19,8 @@ and ['a] d : unit -> object constraint 'a = int #c end # * class ['a] c : 'a -> object ('a) constraint 'a = < f : 'a; .. > method f : 'a end # - : ('a c as 'a) -> 'a = <fun> -# * Characters 134-176: - ......x () = object +# * Characters 128-176: + class x () = object method virtual f : int end.. Error: This class should be virtual. The following methods are undefined : f @@ -29,8 +29,8 @@ Error: This class should be virtual. The following methods are undefined : f ^^^^^^^^ Error: This pattern cannot match self: it only matches values of type < f : int > -# Characters 38-110: - ......['a] c () = object +# Characters 32-110: + class ['a] c () = object constraint 'a = int method f x = (x : bool c) end.. @@ -51,17 +51,17 @@ Error: The abbreviation c is used with parameters bool c method f : 'a -> 'b -> unit end # val x : '_a list ref = {contents = []} -# Characters 6-50: - ......['a] c () = object +# Characters 0-50: + class ['a] c () = object method f = (x : 'a) end.. Error: The type of this class, class ['a] c : unit -> object constraint 'a = '_b list ref method f : 'a end, contains type variables that cannot be generalized -# Characters 24-52: +# Characters 20-52: type 'a c = <f : 'a c; g : 'a d> - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In the definition of d, type int c should be 'a c # type 'a c = < f : 'a c; g : 'a d > and 'a d = < f : 'a c > @@ -69,14 +69,14 @@ and 'a d = < f : 'a c > and 'a d = < f : int c > # type 'a u = < x : 'a > and 'a t = 'a t u -# Characters 18-32: +# Characters 15-32: and 'a t = 'a t u;; - ^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^ Error: The type abbreviation t is cyclic # type 'a u = 'a -# Characters 5-18: +# Characters 0-18: type t = t u * t u;; - ^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^ Error: The type abbreviation t is cyclic # type t = < x : 'a > as 'a # type 'a u = 'a @@ -217,8 +217,8 @@ class e : # * * * * * * * * * * * * * * * * * * * * * module M : sig class c : unit -> object method xc : int end end # class d : unit -> object val x : int method xc : int method xd : int end # - : int * int = (1, 2) -# Characters 7-154: - ......virtual ['a] matrix (sz, init : int * 'a) = object +# Characters 1-154: + class virtual ['a] matrix (sz, init : int * 'a) = object val m = Array.make_matrix sz sz init method add (mtx : 'a matrix) = (mtx#m.(0).(0) : 'a) end.. diff --git a/testsuite/tests/typing-objects/Tests.ml.reference b/testsuite/tests/typing-objects/Tests.ml.reference index ed4df922d4..57628351dd 100644 --- a/testsuite/tests/typing-objects/Tests.ml.reference +++ b/testsuite/tests/typing-objects/Tests.ml.reference @@ -4,8 +4,8 @@ = <fun> # class ['a] c : unit -> object constraint 'a = int method f : 'a c end and ['a] d : unit -> object constraint 'a = int method f : 'a c end -# Characters 238-275: - ........d () = object +# Characters 234-275: + ....and d () = object inherit ['a] c () end.. Error: Some type variables are unbound in this type: @@ -19,8 +19,8 @@ and ['a] d : unit -> object constraint 'a = int #c end # * class ['a] c : 'a -> object ('a) constraint 'a = < f : 'a; .. > method f : 'a end # - : ('a c as 'a) -> 'a = <fun> -# * Characters 134-176: - ......x () = object +# * Characters 128-176: + class x () = object method virtual f : int end.. Error: This class should be virtual. The following methods are undefined : f @@ -29,8 +29,8 @@ Error: This class should be virtual. The following methods are undefined : f ^^^^^^^^ Error: This pattern cannot match self: it only matches values of type < f : int > -# Characters 38-110: - ......['a] c () = object +# Characters 32-110: + class ['a] c () = object constraint 'a = int method f x = (x : bool c) end.. @@ -51,17 +51,17 @@ Error: The abbreviation c is used with parameters bool c method f : 'a -> 'b -> unit end # val x : '_a list ref = {contents = []} -# Characters 6-50: - ......['a] c () = object +# Characters 0-50: + class ['a] c () = object method f = (x : 'a) end.. Error: The type of this class, class ['a] c : unit -> object constraint 'a = '_b list ref method f : 'a end, contains type variables that cannot be generalized -# Characters 24-52: +# Characters 20-52: type 'a c = <f : 'a c; g : 'a d> - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In the definition of d, type int c should be 'a c # type 'a c = < f : 'a c; g : 'a d > and 'a d = < f : 'a c > @@ -69,14 +69,14 @@ and 'a d = < f : 'a c > and 'a d = < f : int c > # type 'a u = < x : 'a > and 'a t = 'a t u -# Characters 18-32: +# Characters 15-32: and 'a t = 'a t u;; - ^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^ Error: The type abbreviation t is cyclic # type 'a u = 'a -# Characters 5-18: +# Characters 0-18: type t = t u * t u;; - ^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^ Error: The type abbreviation t is cyclic # type t = < x : 'a > as 'a # type 'a u = 'a @@ -217,8 +217,8 @@ class e : # * * * * * * * * * * * * * * * * * * * * * module M : sig class c : unit -> object method xc : int end end # class d : unit -> object val x : int method xc : int method xd : int end # - : int * int = (1, 2) -# Characters 7-154: - ......virtual ['a] matrix (sz, init : int * 'a) = object +# Characters 1-154: + class virtual ['a] matrix (sz, init : int * 'a) = object val m = Array.make_matrix sz sz init method add (mtx : 'a matrix) = (mtx#m.(0).(0) : 'a) end.. diff --git a/testsuite/tests/typing-poly/poly.ml.principal.reference b/testsuite/tests/typing-poly/poly.ml.principal.reference index 53acb415ba..4de2912dbe 100644 --- a/testsuite/tests/typing-poly/poly.ml.principal.reference +++ b/testsuite/tests/typing-poly/poly.ml.principal.reference @@ -169,9 +169,9 @@ val f4 : id -> int * bool = <fun> # class c : object method m : #id -> int * bool end # class id2 : object method id : 'a -> 'a method mono : int -> int end # val app : int * bool = (1, true) -# Characters 4-25: +# Characters 0-25: type 'a foo = 'a foo list - ^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^ Error: The type abbreviation foo is cyclic # class ['a] bar : 'a -> object end # type 'a foo = 'a foo bar @@ -271,9 +271,9 @@ Error: The universal type variable 'a cannot be generalized: type 'b alist = < visit : 'a. ('a, 'b) list_visitor -> 'a > class type ct = object ('a) method fold : ('b -> 'a -> 'b) -> 'b -> 'b end type t = { f : 'a 'b. ('b -> (#ct as 'a) -> 'b) -> 'b; } -# Characters 20-25: +# Characters 15-25: type t = u and u = t;; - ^^^^^ + ^^^^^^^^^^ Error: The type abbreviation t is cyclic # class ['a] a : object constraint 'a = [> `A of 'a a ] end type t = [ `A of t a ] @@ -301,9 +301,9 @@ Error: Constraints are not satisfied in this type. Type 'a u t should be an instance of g t # type 'a u = 'a constraint 'a = g and 'a v = 'a u t constraint 'a = g -# Characters 38-58: +# Characters 34-58: type 'a u = < m : 'a v > and 'a v = 'a list u;; - ^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^ Error: In the definition of v, type 'a list u should be 'a u # type 'a t = 'a type 'a u = A of 'a t @@ -346,9 +346,9 @@ Characters 21-24: ^^^ Warning 11: this match case is unused. - : int * [< `B ] -> int = <fun> -# Characters 69-135: +# Characters 64-135: type ('a, 'b) a = 'a -> unit constraint 'a = [> `B of ('a, 'b) b as 'b] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: Constraints are not satisfied in this type. Type ([> `B of 'a ], 'a) b as 'a @@ -640,9 +640,9 @@ Error: This field value has type unit -> unit which is less general than # Exception: Pervasives.Exit. # Exception: Pervasives.Exit. # Exception: Pervasives.Exit. -# Characters 20-44: +# Characters 16-44: type 'x t = < f : 'y. 'y t >;; - ^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In the definition of t, type 'y t should be 'x t # val using_match : bool -> int * ('a -> 'a) = <fun> # - : ('a -> 'a) * ('b -> 'b) = (<fun>, <fun>) diff --git a/testsuite/tests/typing-poly/poly.ml.reference b/testsuite/tests/typing-poly/poly.ml.reference index 9929020d54..8855c1f6be 100644 --- a/testsuite/tests/typing-poly/poly.ml.reference +++ b/testsuite/tests/typing-poly/poly.ml.reference @@ -161,9 +161,9 @@ Error: This expression has type bool but an expression was expected of type # class c : object method m : #id -> int * bool end # class id2 : object method id : 'a -> 'a method mono : int -> int end # val app : int * bool = (1, true) -# Characters 4-25: +# Characters 0-25: type 'a foo = 'a foo list - ^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^ Error: The type abbreviation foo is cyclic # class ['a] bar : 'a -> object end # type 'a foo = 'a foo bar @@ -254,9 +254,9 @@ Error: The universal type variable 'a cannot be generalized: type 'b alist = < visit : 'a. ('a, 'b) list_visitor -> 'a > class type ct = object ('a) method fold : ('b -> 'a -> 'b) -> 'b -> 'b end type t = { f : 'a 'b. ('b -> (#ct as 'a) -> 'b) -> 'b; } -# Characters 20-25: +# Characters 15-25: type t = u and u = t;; - ^^^^^ + ^^^^^^^^^^ Error: The type abbreviation t is cyclic # class ['a] a : object constraint 'a = [> `A of 'a a ] end type t = [ `A of t a ] @@ -284,9 +284,9 @@ Error: Constraints are not satisfied in this type. Type 'a u t should be an instance of g t # type 'a u = 'a constraint 'a = g and 'a v = 'a u t constraint 'a = g -# Characters 38-58: +# Characters 34-58: type 'a u = < m : 'a v > and 'a v = 'a list u;; - ^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^ Error: In the definition of v, type 'a list u should be 'a u # type 'a t = 'a type 'a u = A of 'a t @@ -329,9 +329,9 @@ Characters 21-24: ^^^ Warning 11: this match case is unused. - : int * [< `B ] -> int = <fun> -# Characters 69-135: +# Characters 64-135: type ('a, 'b) a = 'a -> unit constraint 'a = [> `B of ('a, 'b) b as 'b] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: Constraints are not satisfied in this type. Type ([> `B of 'a ], 'a) b as 'a @@ -598,9 +598,9 @@ Error: This field value has type unit -> unit which is less general than # Exception: Pervasives.Exit. # Exception: Pervasives.Exit. # Exception: Pervasives.Exit. -# Characters 20-44: +# Characters 16-44: type 'x t = < f : 'y. 'y t >;; - ^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In the definition of t, type 'y t should be 'x t # val using_match : bool -> int * ('a -> 'a) = <fun> # - : ('a -> 'a) * ('b -> 'b) = (<fun>, <fun>) diff --git a/testsuite/tests/typing-private/private.ml.principal.reference b/testsuite/tests/typing-private/private.ml.principal.reference index 96b1d75955..db933583f5 100644 --- a/testsuite/tests/typing-private/private.ml.principal.reference +++ b/testsuite/tests/typing-private/private.ml.principal.reference @@ -84,9 +84,9 @@ Error: Signature mismatch: # module M1 : sig type t = M.t val mk : int -> t end # module M2 : sig type t = M.t val mk : int -> t end # module M3 : sig type t = M.t val mk : int -> t end -# Characters 26-44: +# Characters 21-44: type t = M.t = T of int - ^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^ Error: This variant or record definition does not match that of type M.t A private type would be revealed. # module M5 : sig type t = M.t = private T of int val mk : int -> t end diff --git a/testsuite/tests/typing-private/private.ml.reference b/testsuite/tests/typing-private/private.ml.reference index cb1573ed49..341bc93686 100644 --- a/testsuite/tests/typing-private/private.ml.reference +++ b/testsuite/tests/typing-private/private.ml.reference @@ -84,9 +84,9 @@ Error: Signature mismatch: # module M1 : sig type t = M.t val mk : int -> t end # module M2 : sig type t = M.t val mk : int -> t end # module M3 : sig type t = M.t val mk : int -> t end -# Characters 26-44: +# Characters 21-44: type t = M.t = T of int - ^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^ Error: This variant or record definition does not match that of type M.t A private type would be revealed. # module M5 : sig type t = M.t = private T of int val mk : int -> t end From b22fc865dd085e3499c5c1f406114755521c2164 Mon Sep 17 00:00:00 2001 From: Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> Date: Thu, 23 Apr 2015 07:10:43 +0000 Subject: [PATCH 214/494] Fix PR#6842: export Typemod.modtype_of_package git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16034 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + typing/typemod.mli | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 583e749103..abd7cb2312 100644 --- a/Changes +++ b/Changes @@ -110,6 +110,7 @@ Bug fixes: - PR#6817: GADT exhaustiveness breakage with modules - PR#6836: Assertion failure using -short-paths - PR#6841: Changing compilation unit name with -o breaks ocamldebug +- PR#6842: export Typemod.modtype_of_package - GPR#143: fix getsockopt behaviour for boolean socket options (Anil Madhavapeddy and Andrew Ray) - ocamlbuild on cygwin cannot find ocamlfind diff --git a/typing/typemod.mli b/typing/typemod.mli index a658d2e432..9f8e617086 100644 --- a/typing/typemod.mli +++ b/typing/typemod.mli @@ -35,7 +35,9 @@ val check_nongen_schemes: val type_open_: ?toplevel:bool -> Asttypes.override_flag -> Env.t -> Location.t -> Longident.t Asttypes.loc -> Path.t * Env.t - +val modtype_of_package: + Env.t -> Location.t -> + Path.t -> Longident.t list -> type_expr list -> module_type val simplify_signature: signature -> signature val path_of_module : Typedtree.module_expr -> Path.t option From fe37a88a88f4e8a413b0738178da8365a2f73112 Mon Sep 17 00:00:00 2001 From: Mark Shinwell <mshinwell@janestreet.com> Date: Fri, 24 Apr 2015 08:37:32 +0000 Subject: [PATCH 215/494] Fix PR#6686 and PR#6770 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16035 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- asmcomp/cmmgen.ml | 25 +++++++++++++----- testsuite/makefiles/Makefile.one | 3 ++- testsuite/tests/float-unboxing/Makefile | 7 +++++ .../float_subst_boxed_number.ml | 26 +++++++++++++++++++ .../float_subst_boxed_number.reference | 0 5 files changed, 53 insertions(+), 8 deletions(-) create mode 100644 testsuite/tests/float-unboxing/Makefile create mode 100644 testsuite/tests/float-unboxing/float_subst_boxed_number.ml create mode 100644 testsuite/tests/float-unboxing/float_subst_boxed_number.reference diff --git a/asmcomp/cmmgen.ml b/asmcomp/cmmgen.ml index 3bd65a5349..08213395c7 100644 --- a/asmcomp/cmmgen.ml +++ b/asmcomp/cmmgen.ml @@ -1254,13 +1254,21 @@ let subst_boxed_number unbox_fn boxed_id unboxed_id box_chunk box_offset exp = Cassign(id, subst arg) | Ctuple argv -> Ctuple(List.map subst argv) | Cop(Cload chunk, [Cvar id]) as e -> - if Ident.same id boxed_id && chunk = box_chunk && box_offset = 0 - then Cvar unboxed_id - else e + if not (Ident.same id boxed_id) then e + else if chunk = box_chunk && box_offset = 0 then + Cvar unboxed_id + else begin + need_boxed := true; + e + end | Cop(Cload chunk, [Cop(Cadda, [Cvar id; Cconst_int ofs])]) as e -> - if Ident.same id boxed_id && chunk = box_chunk && ofs = box_offset - then Cvar unboxed_id - else e + if not (Ident.same id boxed_id) then e + else if chunk = box_chunk && ofs = box_offset then + Cvar unboxed_id + else begin + need_boxed := true; + e + end | Cop(op, argv) -> Cop(op, List.map subst argv) | Csequence(e1, e2) -> Csequence(subst e1, subst e2) | Cifthenelse(e1, e2, e3) -> Cifthenelse(subst e1, subst e2, subst e3) @@ -1270,7 +1278,10 @@ let subst_boxed_number unbox_fn boxed_id unboxed_id box_chunk box_offset exp = | Ccatch(nfail, ids, e1, e2) -> Ccatch(nfail, ids, subst e1, subst e2) | Cexit (nfail, el) -> Cexit (nfail, List.map subst el) | Ctrywith(e1, id, e2) -> Ctrywith(subst e1, id, subst e2) - | e -> e in + | Cconst_int _ | Cconst_natint _ | Cconst_float _ | Cconst_symbol _ + | Cconst_pointer _ | Cconst_natpointer _ + | Cconst_blockheader _ as e -> e + in let res = subst exp in (res, !need_boxed, !assigned) diff --git a/testsuite/makefiles/Makefile.one b/testsuite/makefiles/Makefile.one index 9f95b3656d..11c227ee4c 100644 --- a/testsuite/makefiles/Makefile.one +++ b/testsuite/makefiles/Makefile.one @@ -48,7 +48,8 @@ compile: $(ML_FILES) $(CMO_FILES) $(MAIN_MODULE).cmo @if $(BYTECODE_ONLY); then : ; else \ rm -f program.native program.native.exe; \ $(MAKE) $(CMX_FILES) $(MAIN_MODULE).cmx; \ - $(OCAMLOPT) $(ADD_COMPFLAGS) -o program.native$(EXE) $(O_FILES) \ + $(OCAMLOPT) $(ADD_COMPFLAGS) $(ADD_OPTCOMPFLAGS) \ + -o program.native$(EXE) $(O_FILES) \ $(CMXA_FILES) $(CMX_FILES) $(ADD_CMX_FILES) \ $(MAIN_MODULE).cmx; \ fi diff --git a/testsuite/tests/float-unboxing/Makefile b/testsuite/tests/float-unboxing/Makefile new file mode 100644 index 0000000000..6852411858 --- /dev/null +++ b/testsuite/tests/float-unboxing/Makefile @@ -0,0 +1,7 @@ +BASEDIR=../.. +MODULES= +MAIN_MODULE=float_subst_boxed_number +ADD_OPTCOMPFLAGS=-inline 20 + +include $(BASEDIR)/makefiles/Makefile.one +include $(BASEDIR)/makefiles/Makefile.common diff --git a/testsuite/tests/float-unboxing/float_subst_boxed_number.ml b/testsuite/tests/float-unboxing/float_subst_boxed_number.ml new file mode 100644 index 0000000000..f77620ec5c --- /dev/null +++ b/testsuite/tests/float-unboxing/float_subst_boxed_number.ml @@ -0,0 +1,26 @@ +module PR_6686 = struct + type t = + | A of float + | B of (int * int) + + let rec foo = function + | A x -> x + | B (x, y) -> float x +. float y + + let (_ : float) = foo (A 4.) +end + +module PR_6770 = struct + type t = + | Constant of float + | Exponent of (float * float) + + let to_string = function + | Exponent (_b, _e) -> + ignore _b; + ignore _e; + "" + | Constant _ -> "" + + let _ = to_string (Constant 4.) +end diff --git a/testsuite/tests/float-unboxing/float_subst_boxed_number.reference b/testsuite/tests/float-unboxing/float_subst_boxed_number.reference new file mode 100644 index 0000000000..e69de29bb2 From fb71b3b9e3c2618e1d943aaccb0590367d5d4c0a Mon Sep 17 00:00:00 2001 From: Mark Shinwell <mshinwell@janestreet.com> Date: Fri, 24 Apr 2015 09:37:10 +0000 Subject: [PATCH 216/494] forgot to update Changes git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16037 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Changes b/Changes index abd7cb2312..d146619759 100644 --- a/Changes +++ b/Changes @@ -84,6 +84,7 @@ Bug fixes: - PR#6671: Windows: environment variable 'TZ' affects Unix.gettimeofday (Mickael Delahaye and Damien Doligez) - PR#6680: Missing parens when printing polymorphic variant value in warning +- PR#6686: Bug in [subst_boxed_number] (Jérémie Dimino, Mark Shinwell) - PR#6690: Uncaught exception (Not_found) with (wrong) wildcard or unification type variable in place of a local abstract type - PR#6717: Pprintast does not print let-pattern attributes @@ -97,6 +98,7 @@ Bug fixes: (Damien Doligez, report by Pierre-yves Strub) - PR#6763: #show with -short-paths doesn't select shortest type paths - PR#6768: Typechecker overflow the stack on cyclic type +- PR#6770: (duplicate of PR#6686) - PR#6775: Digest.file leaks file descriptor on error (Valentin Gatien-Baron) - PR#6787: Soundness bug with polymorphic variants From 2b10015cc841e2e0559615f3811b0ab09d63edc0 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 26 Apr 2015 20:00:44 +0000 Subject: [PATCH 217/494] make the edit_distance testsuite bytecode-only (Leo White) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16039 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- testsuite/tests/utils/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/testsuite/tests/utils/Makefile b/testsuite/tests/utils/Makefile index 4b7ab0dd42..1d50868024 100644 --- a/testsuite/tests/utils/Makefile +++ b/testsuite/tests/utils/Makefile @@ -18,3 +18,5 @@ CMO_FILES+="misc.cmo" include $(BASEDIR)/makefiles/Makefile.several include $(BASEDIR)/makefiles/Makefile.common + +BYTECODE_ONLY=true From b0500d098c8856bbf7cb7082b7cc8a2f50b0bd5f Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 26 Apr 2015 20:00:46 +0000 Subject: [PATCH 218/494] PR#6824: fix buffer sharing on partial application of Format.asprintf git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16040 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ stdlib/format.ml | 15 ++++++++++----- testsuite/tests/lib-format/pr6824.ml | 7 +++++++ testsuite/tests/lib-format/pr6824.reference | 6 ++++++ 4 files changed, 25 insertions(+), 5 deletions(-) create mode 100644 testsuite/tests/lib-format/pr6824.ml create mode 100644 testsuite/tests/lib-format/pr6824.reference diff --git a/Changes b/Changes index d146619759..68bdb65429 100644 --- a/Changes +++ b/Changes @@ -110,6 +110,8 @@ Bug fixes: - PR#6799: include guards missing for unixsupport.h and other files - PR#6812: -short-paths and -no-alias-deps can create inconsistent assumptions - PR#6817: GADT exhaustiveness breakage with modules +- PR#6824: fix buffer sharing on partial application of Format.asprintf + (Gabriel Scherer, report by Alain Frisch) - PR#6836: Assertion failure using -short-paths - PR#6841: Changing compilation unit name with -o breaks ocamldebug - PR#6842: export Typemod.modtype_of_package diff --git a/stdlib/format.ml b/stdlib/format.ml index 5e206e11f6..1d196a51bd 100644 --- a/stdlib/format.ml +++ b/stdlib/format.ml @@ -976,6 +976,12 @@ let flush_str_formatter () = s ;; +let flush_buf_formatter buf ppf = + pp_flush_queue ppf false; + let s = Buffer.contents buf in + Buffer.reset buf; + s + (************************************************************** Basic functions on the standard formatter @@ -1176,12 +1182,11 @@ let printf fmt = fprintf std_formatter fmt let eprintf fmt = fprintf err_formatter fmt let ksprintf k (Format (fmt, _)) = + let b = Buffer.create 512 in + let ppf = formatter_of_buffer b in let k' () acc = - let b = Buffer.create 512 in - let ppf = formatter_of_buffer b in strput_acc ppf acc; - pp_flush_queue ppf false; - k (Buffer.contents b) in + k (flush_buf_formatter b ppf) in make_printf k' () End_of_acc fmt let sprintf fmt = @@ -1194,7 +1199,7 @@ let asprintf (Format (fmt, _)) = = fun ppf acc -> output_acc ppf acc; pp_flush_queue ppf false; - Buffer.contents b in + flush_buf_formatter b ppf in make_printf k' ppf End_of_acc fmt (************************************************************** diff --git a/testsuite/tests/lib-format/pr6824.ml b/testsuite/tests/lib-format/pr6824.ml new file mode 100644 index 0000000000..aa5e7eed6d --- /dev/null +++ b/testsuite/tests/lib-format/pr6824.ml @@ -0,0 +1,7 @@ +let f = Format.sprintf "[%i]";; +print_endline (f 1);; +print_endline (f 2);; + +let f = Format.asprintf "[%i]";; +print_endline (f 1);; +print_endline (f 2);; diff --git a/testsuite/tests/lib-format/pr6824.reference b/testsuite/tests/lib-format/pr6824.reference new file mode 100644 index 0000000000..69035c7649 --- /dev/null +++ b/testsuite/tests/lib-format/pr6824.reference @@ -0,0 +1,6 @@ +[1] +[2] +[1] +[2] + +All tests succeeded. From 53edec141f09b5dd931819c0bfdb04b348f9ba80 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 26 Apr 2015 20:50:09 +0000 Subject: [PATCH 219/494] PR#6846: build failure with prefixed tools (Niels Ole Salscheider) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16047 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- asmrun/Makefile | 6 +++--- byterun/Makefile | 4 ++-- configure | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/asmrun/Makefile b/asmrun/Makefile index 4a33005fee..4e6322fda4 100644 --- a/asmrun/Makefile +++ b/asmrun/Makefile @@ -37,7 +37,7 @@ all: libasmrun.a all-$(RUNTIMED) all-$(PROFILING) libasmrun.a: $(OBJS) rm -f libasmrun.a - ar rc libasmrun.a $(OBJS) + $(ARCMD) rc libasmrun.a $(OBJS) $(RANLIB) libasmrun.a all-noruntimed: @@ -48,7 +48,7 @@ all-runtimed: libasmrund.a libasmrund.a: $(DOBJS) rm -f libasmrund.a - ar rc libasmrund.a $(DOBJS) + $(ARCMD) rc libasmrund.a $(DOBJS) $(RANLIB) libasmrund.a all-noprof: @@ -57,7 +57,7 @@ all-prof: libasmrunp.a libasmrunp.a: $(POBJS) rm -f libasmrunp.a - ar rc libasmrunp.a $(POBJS) + $(ARCMD) rc libasmrunp.a $(POBJS) $(RANLIB) libasmrunp.a INSTALL_LIBDIR=$(DESTDIR)$(LIBDIR) diff --git a/byterun/Makefile b/byterun/Makefile index 11b4fb713d..6194a20ec0 100644 --- a/byterun/Makefile +++ b/byterun/Makefile @@ -34,11 +34,11 @@ ocamlrund$(EXE): libcamlrund.a prims.o prims.o libcamlrund.a $(BYTECCLIBS) libcamlrun.a: $(OBJS) - ar rc libcamlrun.a $(OBJS) + $(ARCMD) rc libcamlrun.a $(OBJS) $(RANLIB) libcamlrun.a libcamlrund.a: $(DOBJS) - ar rc libcamlrund.a $(DOBJS) + $(ARCMD) rc libcamlrund.a $(DOBJS) $(RANLIB) libcamlrund.a libcamlrun_shared.so: $(PICOBJS) diff --git a/configure b/configure index 4dbd213188..d09fc7bb15 100755 --- a/configure +++ b/configure @@ -1694,8 +1694,8 @@ SYSLIB=-l\$(1) #ml let syslib x = "-l"^x;; ### How to build a static library -MKLIB=ar rc \$(1) \$(2); ranlib \$(1) -#ml let mklib out files opts = Printf.sprintf "ar rc %s %s %s; ranlib %s" out opts files out;; +MKLIB=${TOOLPREF}ar rc \$(1) \$(2); ${TOOLPREF}ranlib \$(1) +#ml let mklib out files opts = Printf.sprintf "${TOOLPREF}ar rc %s %s %s; ${TOOLPREF}ranlib %s" out opts files out;; EOF echo "ARCH=$arch" >> Makefile echo "MODEL=$model" >> Makefile From a2d4954bf0fd990a06617ec8e9d6cb1e003a52de Mon Sep 17 00:00:00 2001 From: Fabrice Le Fessant <Fabrice.Le_fessant@inria.fr> Date: Mon, 27 Apr 2015 14:24:36 +0000 Subject: [PATCH 220/494] backport r16049 to 4.02 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16053 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ parsing/location.ml | 42 ++++++++++++++++++++++++++++++++---------- parsing/location.mli | 10 ++++++++++ utils/warnings.ml | 12 +----------- utils/warnings.mli | 4 +--- 5 files changed, 46 insertions(+), 24 deletions(-) diff --git a/Changes b/Changes index 68bdb65429..c9c2f250af 100644 --- a/Changes +++ b/Changes @@ -121,6 +121,8 @@ Bug fixes: (user 'algoriddle') - allow android build with pthreads support (since SDK r10c) (Peter Zotov) +- GPR#171: allow custom warning printers / catchers + (Benjamin Canou, review by Damien Doligez) OCaml 4.02.1: ------------- diff --git a/parsing/location.ml b/parsing/location.ml index 60d3484d6c..a4910bdc2f 100644 --- a/parsing/location.ml +++ b/parsing/location.ml @@ -72,6 +72,22 @@ let status = ref Terminfo.Uninitialised let num_loc_lines = ref 0 (* number of lines already printed after input *) +let print_updating_num_loc_lines ppf f arg = + let open Format in + let out_functions = pp_get_formatter_out_functions ppf () in + let out_string str start len = + let rec count i c = + if i = start + len then c + else if String.get str i = '\n' then count (succ i) (succ c) + else count (succ i) c in + num_loc_lines := !num_loc_lines + count start 0 ; + out_functions.out_string str start len in + pp_set_formatter_out_functions ppf + { out_functions with out_string } ; + f ppf arg ; + pp_print_flush ppf (); + pp_set_formatter_out_functions ppf out_functions + (* Highlight the locations using standout mode. *) let highlight_terminfo ppf num_lines lb locs = @@ -261,19 +277,19 @@ let print_error ppf loc = let print_error_cur_file ppf = print_error ppf (in_file !input_name);; -let print_warning loc ppf w = +let default_warning_printer loc ppf w = if Warnings.is_active w then begin - let printw ppf w = - let n = Warnings.print ppf w in - num_loc_lines := !num_loc_lines + n - in print ppf loc; - fprintf ppf "Warning %a@." printw w; - pp_print_flush ppf (); - incr num_loc_lines; + fprintf ppf "Warning %a@." Warnings.print w end ;; +let warning_printer = ref default_warning_printer ;; + +let print_warning loc ppf w = + print_updating_num_loc_lines ppf (!warning_printer loc) w +;; + let formatter_for_warnings = ref err_formatter;; let prerr_warning loc w = print_warning loc !formatter_for_warnings w;; @@ -318,7 +334,7 @@ let error_of_exn exn = in loop !error_of_exn -let rec report_error ppf ({loc; msg; sub; if_highlight} as err) = +let rec default_error_reporter ppf ({loc; msg; sub; if_highlight} as err) = let highlighted = if if_highlight <> "" then let rec collect_locs locs {loc; sub; if_highlight; _} = @@ -334,10 +350,16 @@ let rec report_error ppf ({loc; msg; sub; if_highlight} as err) = else begin print ppf loc; Format.pp_print_string ppf msg; - List.iter (fun err -> Format.fprintf ppf "@\n@[<2>%a@]" report_error err) + List.iter (fun err -> Format.fprintf ppf "@\n@[<2>%a@]" default_error_reporter err) sub end +let error_reporter = ref default_error_reporter + +let report_error ppf err = + print_updating_num_loc_lines ppf !error_reporter err +;; + let error_of_printer loc print x = let buf = Buffer.create 64 in let ppf = Format.formatter_of_buffer buf in diff --git a/parsing/location.mli b/parsing/location.mli index 158fd671da..ba98049ef4 100644 --- a/parsing/location.mli +++ b/parsing/location.mli @@ -57,6 +57,11 @@ val prerr_warning: t -> Warnings.t -> unit val echo_eof: unit -> unit val reset: unit -> unit +val warning_printer : (t -> formatter -> Warnings.t -> unit) ref +(** Hook for intercepting warnings. *) +val default_warning_printer : t -> formatter -> Warnings.t -> unit +(** Original warning printer for use in hooks. *) + val highlight_locations: formatter -> t list -> bool type 'a loc = { @@ -116,5 +121,10 @@ val register_error_of_exn: (exn -> error option) -> unit val report_error: formatter -> error -> unit +val error_reporter : (formatter -> error -> unit) ref +(** Hook for intercepting error reports. *) +val default_error_reporter : formatter -> error -> unit +(** Original error reporter for use in hooks. *) + val report_exception: formatter -> exn -> unit (* Reraise the exception if it is unknown. *) diff --git a/utils/warnings.ml b/utils/warnings.ml index 6c951d2509..aeab0a4bba 100644 --- a/utils/warnings.ml +++ b/utils/warnings.ml @@ -391,19 +391,9 @@ let nerrors = ref 0;; let print ppf w = let msg = message w in let num = number w in - let newlines = ref 0 in - for i = 0 to String.length msg - 1 do - if msg.[i] = '\n' then incr newlines; - done; - let out_functions = Format.pp_get_formatter_out_functions ppf () in - let countnewline x = incr newlines; out_functions.Format.out_newline x in - Format.pp_set_formatter_out_functions ppf - {out_functions with Format.out_newline = countnewline}; Format.fprintf ppf "%d: %s" num msg; Format.pp_print_flush ppf (); - Format.pp_set_formatter_out_functions ppf out_functions; - if (!current).error.(num) then incr nerrors; - !newlines + if (!current).error.(num) then incr nerrors ;; exception Errors of int;; diff --git a/utils/warnings.mli b/utils/warnings.mli index edfd732c31..628ad16e5f 100644 --- a/utils/warnings.mli +++ b/utils/warnings.mli @@ -72,9 +72,7 @@ val is_error : t -> bool;; val defaults_w : string;; val defaults_warn_error : string;; -val print : formatter -> t -> int;; - (* returns the number of newlines in the printed string *) - +val print : formatter -> t -> unit;; exception Errors of int;; From 19d3bccf48fee6e5e91e65e9f8a5d07c49d2afd4 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Mon, 27 Apr 2015 16:04:21 +0000 Subject: [PATCH 221/494] PR#6797: new option -output-complete-obj git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16054 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 3 +++ asmcomp/asmlink.ml | 5 +++-- bytecomp/bytelink.ml | 18 ++++++++++++++---- driver/main.ml | 2 ++ driver/main_args.ml | 10 +++++++++- driver/main_args.mli | 1 + driver/optmain.ml | 2 ++ tools/ocamlcp.ml | 1 + tools/ocamloptp.ml | 1 + utils/ccomp.ml | 16 ++++++++++++---- utils/clflags.ml | 1 + utils/clflags.mli | 1 + 12 files changed, 50 insertions(+), 11 deletions(-) diff --git a/Changes b/Changes index c9c2f250af..fa069b8dd2 100644 --- a/Changes +++ b/Changes @@ -17,6 +17,9 @@ Compilers: incrementally (Jacques Garrigue) - PR#6642: replace $CAMLORIGIN in -ccopt with the path to cma or cmxa (Peter Zotov, Gabriel Scherer, review by Damien Doligez) +- PR#6797: new option -output-complete-obj + to output an object file with included runtime and autolink libraries + (Peter Zotov) - GPR#159: Better locations for structure/signature items (Leo White) diff --git a/asmcomp/asmlink.ml b/asmcomp/asmlink.ml index bc62b017f5..cea7b568cc 100644 --- a/asmcomp/asmlink.ml +++ b/asmcomp/asmlink.ml @@ -285,12 +285,13 @@ let link_shared ppf objfiles output_name = let call_linker file_list startup_file output_name = let main_dll = !Clflags.output_c_object && Filename.check_suffix output_name Config.ext_dll + and main_obj_runtime = !Clflags.output_complete_object in let files = startup_file :: (List.rev file_list) in let files, c_lib = - if (not !Clflags.output_c_object) || main_dll then + if (not !Clflags.output_c_object) || main_dll || main_obj_runtime then files @ (List.rev !Clflags.ccobjs) @ runtime_lib (), - (if !Clflags.nopervasives then "" else Config.native_c_libraries) + (if !Clflags.nopervasives || main_obj_runtime then "" else Config.native_c_libraries) else files, "" in diff --git a/bytecomp/bytelink.ml b/bytecomp/bytelink.ml index 596f624358..9b8b9747f1 100644 --- a/bytecomp/bytelink.ml +++ b/bytecomp/bytelink.ml @@ -574,7 +574,11 @@ let link ppf objfiles output_name = end else begin let basename = Filename.chop_extension output_name in let c_file = basename ^ ".c" - and obj_file = basename ^ Config.ext_obj in + and obj_file = + if !Clflags.output_complete_object + then Filename.temp_file "camlobj" Config.ext_obj + else basename ^ Config.ext_obj + in if Sys.file_exists c_file then raise(Error(File_exists c_file)); let temps = ref [] in try @@ -582,13 +586,19 @@ let link ppf objfiles output_name = if not (Filename.check_suffix output_name ".c") then begin temps := c_file :: !temps; if Ccomp.compile_file c_file <> 0 then raise(Error Custom_runtime); - if not (Filename.check_suffix output_name Config.ext_obj) then begin + if not (Filename.check_suffix output_name Config.ext_obj) || + !Clflags.output_complete_object then begin temps := obj_file :: !temps; + let mode, c_libs = + if Filename.check_suffix output_name Config.ext_obj + then Ccomp.Partial, "" + else Ccomp.MainDll, Config.bytecomp_c_libraries + in if not ( let runtime_lib = "-lcamlrun" ^ !Clflags.runtime_variant in - Ccomp.call_linker Ccomp.MainDll output_name + Ccomp.call_linker mode output_name ([obj_file] @ List.rev !Clflags.ccobjs @ [runtime_lib]) - Config.bytecomp_c_libraries + c_libs ) then raise (Error Custom_runtime); end end; diff --git a/driver/main.ml b/driver/main.ml index f8358a0cbd..a390c7cbc9 100644 --- a/driver/main.ml +++ b/driver/main.ml @@ -106,6 +106,8 @@ module Options = Main_args.Make_bytecomp_options (struct let _o s = output_name := Some s let _open s = open_modules := s :: !open_modules let _output_obj () = output_c_object := true; custom_runtime := true + let _output_complete_obj () = + output_c_object := true; output_complete_object := true; custom_runtime := true let _pack = set make_package let _pp s = preprocessor := Some s let _ppx s = first_ppx := s :: !first_ppx diff --git a/driver/main_args.ml b/driver/main_args.ml index 7636abe030..0f33e52766 100644 --- a/driver/main_args.ml +++ b/driver/main_args.ml @@ -214,7 +214,12 @@ let mk_open f = "-open", Arg.String f, "<module> Opens the module <module> before typing" let mk_output_obj f = - "-output-obj", Arg.Unit f, " Output a C object file instead of an executable" + "-output-obj", Arg.Unit f, " Output an object file instead of an executable" +;; + +let mk_output_complete_obj f = + "-output-complete-obj", Arg.Unit f, + " Output an object file, including runtime, instead of an executable" ;; let mk_p f = @@ -521,6 +526,7 @@ module type Compiler_options = sig val _noautolink : unit -> unit val _o : string -> unit val _output_obj : unit -> unit + val _output_complete_obj : unit -> unit val _pack : unit -> unit val _pp : string -> unit val _principal : unit -> unit @@ -668,6 +674,7 @@ struct mk_o F._o; mk_open F._open; mk_output_obj F._output_obj; + mk_output_complete_obj F._output_complete_obj; mk_pack_byt F._pack; mk_pp F._pp; mk_ppx F._ppx; @@ -783,6 +790,7 @@ struct mk_o F._o; mk_open F._open; mk_output_obj F._output_obj; + mk_output_complete_obj F._output_complete_obj; mk_p F._p; mk_pack_opt F._pack; mk_pp F._pp; diff --git a/driver/main_args.mli b/driver/main_args.mli index 18ade80bae..021a9529eb 100644 --- a/driver/main_args.mli +++ b/driver/main_args.mli @@ -67,6 +67,7 @@ module type Compiler_options = sig val _noautolink : unit -> unit val _o : string -> unit val _output_obj : unit -> unit + val _output_complete_obj : unit -> unit val _pack : unit -> unit val _pp : string -> unit val _principal : unit -> unit diff --git a/driver/optmain.ml b/driver/optmain.ml index 947d43073a..0e2eb3c3f7 100644 --- a/driver/optmain.ml +++ b/driver/optmain.ml @@ -104,6 +104,8 @@ module Options = Main_args.Make_optcomp_options (struct let _o s = output_name := Some s let _open s = open_modules := s :: !open_modules let _output_obj = set output_c_object + let _output_complete_obj s = + set output_c_object s; set output_complete_object s let _p = set gprofile let _pack = set make_package let _pp s = preprocessor := Some s diff --git a/tools/ocamlcp.ml b/tools/ocamlcp.ml index 51559aea3e..b5a124fba8 100644 --- a/tools/ocamlcp.ml +++ b/tools/ocamlcp.ml @@ -74,6 +74,7 @@ module Options = Main_args.Make_bytecomp_options (struct let _o s = option_with_arg "-o" s let _open s = option_with_arg "-open" s let _output_obj = option "-output-obj" + let _output_complete_obj = option "-output-complete-obj" let _pack = option "-pack" let _pp _s = incompatible "-pp" let _ppx _s = incompatible "-ppx" diff --git a/tools/ocamloptp.ml b/tools/ocamloptp.ml index 0b788843fe..a0d20ed5e3 100644 --- a/tools/ocamloptp.ml +++ b/tools/ocamloptp.ml @@ -75,6 +75,7 @@ module Options = Main_args.Make_optcomp_options (struct let _o s = option_with_arg "-o" s let _open s = option_with_arg "-open" s let _output_obj = option "-output-obj" + let _output_complete_obj = option "-output-complete-obj" let _p = option "-p" let _pack = option "-pack" let _pp _s = incompatible "-pp" diff --git a/utils/ccomp.ml b/utils/ccomp.ml index bfe077aa35..5871f689d1 100644 --- a/utils/ccomp.ml +++ b/utils/ccomp.ml @@ -98,14 +98,22 @@ type link_mode = | MainDll | Partial +let remove_Wl cclibs = + cclibs |> List.map (fun cclib -> + (* -Wl,-foo,bar -> -foo bar *) + if String.length cclib >= 4 && "-Wl," = String.sub cclib 0 4 then + String.map (function ',' -> ' ' | c -> c) + (String.sub cclib 4 (String.length cclib - 4)) + else cclib) + let call_linker mode output_name files extra = - let files = quote_files files in let cmd = if mode = Partial then - Printf.sprintf "%s%s %s %s" + Printf.sprintf "%s%s %s %s %s" Config.native_pack_linker (Filename.quote output_name) - files + (quote_prefixed "-L" !Config.load_path) + (quote_files (remove_Wl files)) extra else Printf.sprintf "%s -o %s %s %s %s %s %s %s" @@ -121,7 +129,7 @@ let call_linker mode output_name files extra = "" (*(Clflags.std_include_flag "-I")*) (quote_prefixed "-L" !Config.load_path) (String.concat " " (List.rev !Clflags.all_ccopts)) - files + (quote_files files) extra in command cmd = 0 diff --git a/utils/clflags.ml b/utils/clflags.ml index 57834ccf91..e470cf5a60 100644 --- a/utils/clflags.ml +++ b/utils/clflags.ml @@ -28,6 +28,7 @@ and link_everything = ref false (* -linkall *) and custom_runtime = ref false (* -custom *) and bytecode_compatible_32 = ref false (* -compat-32 *) and output_c_object = ref false (* -output-obj *) +and output_complete_object = ref false (* -output-complete-obj *) and all_ccopts = ref ([] : string list) (* -ccopt *) and classic = ref false (* -nolabels *) and nopervasives = ref false (* -nopervasives *) diff --git a/utils/clflags.mli b/utils/clflags.mli index 7e51cf33db..7ee86c3f54 100644 --- a/utils/clflags.mli +++ b/utils/clflags.mli @@ -25,6 +25,7 @@ val link_everything : bool ref val custom_runtime : bool ref val bytecode_compatible_32 : bool ref val output_c_object : bool ref +val output_complete_object : bool ref val all_ccopts : string list ref val classic : bool ref val nopervasives : bool ref From 5b0054176c88b6222ab244432c7ebe0261141383 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Wed, 29 Apr 2015 16:44:33 +0000 Subject: [PATCH 222/494] PR#6831: Build breaks for -aspp gcc on solaris-like OSs git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16055 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + asmrun/i386.S | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index fa069b8dd2..a556ac7228 100644 --- a/Changes +++ b/Changes @@ -115,6 +115,7 @@ Bug fixes: - PR#6817: GADT exhaustiveness breakage with modules - PR#6824: fix buffer sharing on partial application of Format.asprintf (Gabriel Scherer, report by Alain Frisch) +- PR#6831: Build breaks for -aspp gcc on solaris-like OSs - PR#6836: Assertion failure using -short-paths - PR#6841: Changing compilation unit name with -o breaks ocamldebug - PR#6842: export Typemod.modtype_of_package diff --git a/asmrun/i386.S b/asmrun/i386.S index 347e967c14..e55969ee97 100644 --- a/asmrun/i386.S +++ b/asmrun/i386.S @@ -19,7 +19,7 @@ /* Linux/BSD with ELF binaries and Solaris do not prefix identifiers with _. Linux/BSD with a.out binaries and NextStep do. */ -#if defined(SYS_solaris) +#if (defined(SYS_solaris) && !defined(__GNUC__)) #define CONCAT(a,b) a/**/b #else #define CONCAT(a,b) a##b From fe372748cdcf2ef6a151db55dfe76c14e3a55eb8 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Thu, 30 Apr 2015 17:06:33 +0000 Subject: [PATCH 223/494] cherry-pick trunk@15784: use $(CC) to generate dependencies git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16056 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + asmrun/Makefile | 6 +++--- byterun/Makefile | 6 +++--- otherlibs/bigarray/Makefile | 2 +- otherlibs/bigarray/Makefile.nt | 2 +- otherlibs/graph/Makefile | 2 +- otherlibs/num/Makefile | 2 +- otherlibs/str/Makefile | 2 +- otherlibs/systhreads/Makefile | 2 +- otherlibs/threads/.depend | 23 +++++++++++++---------- otherlibs/threads/Makefile | 2 +- otherlibs/unix/Makefile | 2 +- 12 files changed, 28 insertions(+), 24 deletions(-) diff --git a/Changes b/Changes index a556ac7228..5441a8d605 100644 --- a/Changes +++ b/Changes @@ -932,6 +932,7 @@ Feature wishes: (Benedikt Meurer) - PR#5243: improve the ocamlbuild API documentation in signatures.mli (Christophe Troestler) +- PR#5418 (comments) : generate dependencies with $(CC) instead of gcc - PR#5546: moving a function into an internal module slows down its use (Alain Frisch, report by Fabrice Le Fessant) - PR#5597: add instruction trace option 't' to OCAMLRUNPARAM diff --git a/asmrun/Makefile b/asmrun/Makefile index 4e6322fda4..ff277e748a 100644 --- a/asmrun/Makefile +++ b/asmrun/Makefile @@ -199,8 +199,8 @@ clean:: rm -f *.o *.a *~ depend: $(COBJS:.o=.c) ${LINKEDFILES} - -gcc -MM $(FLAGS) *.c > .depend - gcc -MM $(FLAGS) -DDEBUG *.c | sed -e 's/\.o/.d.o/' >> .depend - gcc -MM $(FLAGS) -DPROFILING *.c | sed -e 's/\.o/.p.o/' >> .depend + $(CC) -MM $(FLAGS) *.c > .depend + $(CC) -MM $(FLAGS) -DDEBUG *.c | sed -e 's/\.o/.d.o/' >> .depend + $(CC) -MM $(FLAGS) -DPROFILING *.c | sed -e 's/\.o/.p.o/' >> .depend include .depend diff --git a/byterun/Makefile b/byterun/Makefile index 6194a20ec0..67d6ec5e75 100644 --- a/byterun/Makefile +++ b/byterun/Makefile @@ -58,9 +58,9 @@ clean:: $(CC) -c $(CFLAGS) $(SHAREDCCCOMPOPTS) $< -o $@ depend : prims.c caml/opnames.h caml/jumptbl.h caml/version.h - -gcc -MM $(BYTECCCOMPOPTS) *.c > .depend - -gcc -MM $(BYTECCCOMPOPTS) -DDEBUG *.c | sed -e 's/\.o/.d.o/' >> .depend - -gcc -MM $(BYTECCCOMPOPTS) *.c | sed -e 's/\.o/.pic.o/' >> .depend + -$(CC) -MM $(BYTECCCOMPOPTS) *.c > .depend + -$(CC) -MM $(BYTECCCOMPOPTS) -DDEBUG *.c | sed -e 's/\.o/.d.o/' >> .depend + -$(CC) -MM $(BYTECCCOMPOPTS) *.c | sed -e 's/\.o/.pic.o/' >> .depend .PHONY: depend include .depend diff --git a/otherlibs/bigarray/Makefile b/otherlibs/bigarray/Makefile index 3f8c52f20f..3f9afd5fdb 100644 --- a/otherlibs/bigarray/Makefile +++ b/otherlibs/bigarray/Makefile @@ -21,7 +21,7 @@ HEADERS=bigarray.h include ../Makefile depend: - gcc -MM $(CFLAGS) *.c > .depend + $(CC) -MM $(CFLAGS) *.c > .depend ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/bigarray/Makefile.nt b/otherlibs/bigarray/Makefile.nt index db5ed60586..32642e107f 100644 --- a/otherlibs/bigarray/Makefile.nt +++ b/otherlibs/bigarray/Makefile.nt @@ -21,7 +21,7 @@ HEADERS=bigarray.h include ../Makefile.nt depend: - gcc -MM $(CFLAGS) *.c > .depend + $(CC) -MM $(CFLAGS) *.c > .depend ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/graph/Makefile b/otherlibs/graph/Makefile index 9586f1c4bb..2fb45807f2 100644 --- a/otherlibs/graph/Makefile +++ b/otherlibs/graph/Makefile @@ -26,7 +26,7 @@ EXTRACFLAGS=$(X11_INCLUDES) include ../Makefile depend: - gcc -MM $(CFLAGS) *.c | sed -e 's, /[^ ]*\.h,,g' > .depend + $(CC) -MM $(CFLAGS) *.c | sed -e 's, /[^ ]*\.h,,g' > .depend ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/num/Makefile b/otherlibs/num/Makefile index e5bcb97cad..c867b2cd26 100644 --- a/otherlibs/num/Makefile +++ b/otherlibs/num/Makefile @@ -31,7 +31,7 @@ bng.$(O): bng.h bng_digit.c \ bng_amd64.c bng_ia32.c bng_ppc.c bng_sparc.c depend: - gcc -MM $(CFLAGS) *.c > .depend + $(CC) -MM $(CFLAGS) *.c > .depend ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/str/Makefile b/otherlibs/str/Makefile index 509be62a5c..4a58d46744 100644 --- a/otherlibs/str/Makefile +++ b/otherlibs/str/Makefile @@ -27,7 +27,7 @@ str.cmo: str.cmi str.cmx: str.cmi depend: - gcc -MM $(CFLAGS) *.c > .depend + $(CC) -MM $(CFLAGS) *.c > .depend ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/systhreads/Makefile b/otherlibs/systhreads/Makefile index c0e58d20ac..cc36a52c80 100644 --- a/otherlibs/systhreads/Makefile +++ b/otherlibs/systhreads/Makefile @@ -106,7 +106,7 @@ installopt: $(CAMLOPT) -c $(COMPFLAGS) $< depend: $(GENFILES) - -gcc -MM -I../../byterun *.c > .depend + -$(CC) -MM -I../../byterun *.c > .depend ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/threads/.depend b/otherlibs/threads/.depend index ad7fef4be9..5f0c45edce 100644 --- a/otherlibs/threads/.depend +++ b/otherlibs/threads/.depend @@ -13,22 +13,25 @@ scheduler.o: scheduler.c ../../byterun/caml/alloc.h \ ../../byterun/caml/stacks.h ../../byterun/caml/sys.h condition.cmi : mutex.cmi event.cmi : +marshal.cmi : mutex.cmi : -thread.cmi : unix.cmo -threadUnix.cmi : unix.cmo +pervasives.cmi : +thread.cmi : unix.cmi +threadUnix.cmi : unix.cmi +unix.cmi : condition.cmo : thread.cmi mutex.cmi condition.cmi condition.cmx : thread.cmx mutex.cmx condition.cmi event.cmo : mutex.cmi condition.cmi event.cmi event.cmx : mutex.cmx condition.cmx event.cmi -marshal.cmo : -marshal.cmx : +marshal.cmo : marshal.cmi +marshal.cmx : marshal.cmi mutex.cmo : thread.cmi mutex.cmi mutex.cmx : thread.cmx mutex.cmi -pervasives.cmo : unix.cmo -pervasives.cmx : unix.cmx -thread.cmo : unix.cmo thread.cmi +pervasives.cmo : unix.cmi pervasives.cmi +pervasives.cmx : unix.cmx pervasives.cmi +thread.cmo : unix.cmi thread.cmi thread.cmx : unix.cmx thread.cmi -threadUnix.cmo : unix.cmo thread.cmi threadUnix.cmi +threadUnix.cmo : unix.cmi thread.cmi threadUnix.cmi threadUnix.cmx : unix.cmx thread.cmx threadUnix.cmi -unix.cmo : -unix.cmx : +unix.cmo : unix.cmi +unix.cmx : unix.cmi diff --git a/otherlibs/threads/Makefile b/otherlibs/threads/Makefile index a2adad860f..50fb422bae 100644 --- a/otherlibs/threads/Makefile +++ b/otherlibs/threads/Makefile @@ -123,7 +123,7 @@ installopt: $(CAMLC) -c $(COMPFLAGS) $< depend: - gcc -MM $(CFLAGS) *.c > .depend + $(CC) -MM $(CFLAGS) *.c > .depend ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/unix/Makefile b/otherlibs/unix/Makefile index 5f4d72b835..e41a1e1ddd 100644 --- a/otherlibs/unix/Makefile +++ b/otherlibs/unix/Makefile @@ -41,7 +41,7 @@ HEADERS=unixsupport.h socketaddr.h include ../Makefile depend: - gcc -MM $(CFLAGS) *.c > .depend + $(CC) -MM $(CFLAGS) *.c > .depend ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend include .depend From 6616aa432b0acb23cf3d48ffc0bd0569c693b054 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Thu, 30 Apr 2015 19:50:36 +0000 Subject: [PATCH 224/494] #6779: Cross-compilers cannot link bytecode using custom primitives git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16057 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + bytecomp/symtable.ml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 5441a8d605..7864b8a130 100644 --- a/Changes +++ b/Changes @@ -104,6 +104,7 @@ Bug fixes: - PR#6770: (duplicate of PR#6686) - PR#6775: Digest.file leaks file descriptor on error (Valentin Gatien-Baron) +- PR#6779: Cross-compilers cannot link bytecode using custom primitives - PR#6787: Soundness bug with polymorphic variants - PR#6790: otherlibs should be built with -g - PR#6791: "%s@[", "%s@{" regression in Scanf diff --git a/bytecomp/symtable.ml b/bytecomp/symtable.ml index 1cc3a5314d..fbec1deb5a 100644 --- a/bytecomp/symtable.ml +++ b/bytecomp/symtable.ml @@ -81,7 +81,7 @@ let num_of_prim name = try find_numtable !c_prim_table name with Not_found -> - if !Clflags.custom_runtime then + if !Clflags.custom_runtime || Config.host <> Config.target then enter_numtable c_prim_table name else begin let symb = From 2c9626bdef8d788a80fd84b8da3f8fcc45c1c08e Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Fri, 1 May 2015 17:17:49 +0000 Subject: [PATCH 225/494] add a .merlin file The file was generated using the following command (from the root directory): find . -name '*.cmt' -exec dirname {} \; | uniq | sed 's/\(.*\)/S \1\nB \1\n/' > .merlin For more information about merlin support in trunk, see https://github.com/the-lambda-church/merlin/pull/365 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16062 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- .merlin | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 .merlin diff --git a/.merlin b/.merlin new file mode 100644 index 0000000000..9977984088 --- /dev/null +++ b/.merlin @@ -0,0 +1,51 @@ +S ./asmcomp +B ./asmcomp + +S ./bytecomp +B ./bytecomp + +S ./driver +B ./driver + +S ./lex +B ./lex + +S ./otherlibs/bigarray +B ./otherlibs/bigarray + +S ./otherlibs/dynlink +B ./otherlibs/dynlink + +S ./otherlibs/graph +B ./otherlibs/graph + +S ./otherlibs/num +B ./otherlibs/num + +S ./otherlibs/str +B ./otherlibs/str + +S ./otherlibs/systhreads +B ./otherlibs/systhreads + +S ./otherlibs/threads +B ./otherlibs/threads + +S ./otherlibs/unix +B ./otherlibs/unix + +S ./parsing +B ./parsing + +S ./stdlib +B ./stdlib + +S ./toplevel +B ./toplevel + +S ./typing +B ./typing + +S ./utils +B ./utils + From cc99e9c7f9d29edb248528b0d4ad5de28ba3f697 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Fri, 1 May 2015 17:17:51 +0000 Subject: [PATCH 226/494] PR#6843: weak dependencies recorded even when .cmi missing (Leo White, Gabriel Scherer) The save_pers_struct auxiliary function is only there for code readability: it helps makes add_import's usage more localized, as now only *_pers_struct function use it directly. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16063 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ typing/env.ml | 14 +++++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/Changes b/Changes index 7864b8a130..f59ef5189d 100644 --- a/Changes +++ b/Changes @@ -120,6 +120,8 @@ Bug fixes: - PR#6836: Assertion failure using -short-paths - PR#6841: Changing compilation unit name with -o breaks ocamldebug - PR#6842: export Typemod.modtype_of_package +- PR#6843: record weak dependencies even when the .cmi is missing + (Leo White, Gabriel Scherer) - GPR#143: fix getsockopt behaviour for boolean socket options (Anil Madhavapeddy and Andrew Ray) - ocamlbuild on cygwin cannot find ocamlfind diff --git a/typing/env.ml b/typing/env.ml index 2d00ee7117..3597c5c521 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -341,6 +341,12 @@ let check_consistency ps = (* Reading persistent structures from .cmi files *) +let save_pers_struct crc ps = + let modname = ps.ps_name in + Hashtbl.add persistent_structures modname (Some ps); + Consistbl.set crc_units modname crc ps.ps_filename; + add_import modname + let read_pers_struct modname filename = let cmi = read_cmi filename in let name = cmi.cmi_name in @@ -382,6 +388,10 @@ let find_pers_struct ?(check=true) name = | Some None -> raise Not_found | Some (Some sg) -> sg | None -> + (* PR#6843: record the weak dependency ([add_import]) even if + the [find_in_path_uncap] call below fails to find the .cmi, + to help make builds more deterministic. *) + add_import name; let filename = try find_in_path_uncap !load_path (name ^ ".cmi") with Not_found -> @@ -1685,9 +1695,7 @@ let save_signature_with_imports sg modname filename imports = ps_flags = cmi.cmi_flags; ps_crcs_checked = false; } in - Hashtbl.add persistent_structures modname (Some ps); - Consistbl.set crc_units modname crc filename; - add_import modname; + save_pers_struct crc ps; sg with exn -> close_out oc; From 4e316f9d8904d9c8589d524a3c4aae2474868d38 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Fri, 1 May 2015 17:17:52 +0000 Subject: [PATCH 227/494] GPR#179: fix -jN race condition in ocamlbuild's Makefile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (Frédéric Bour) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16064 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- ocamlbuild/Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ocamlbuild/Makefile b/ocamlbuild/Makefile index b40d0eada1..0a4054ddbd 100644 --- a/ocamlbuild/Makefile +++ b/ocamlbuild/Makefile @@ -125,9 +125,11 @@ ocamlbuildlib.cmxa: ocamlbuild_pack.cmx $(EXTRA_CMX) # The packs -ocamlbuild_pack.cmo ocamlbuild_pack.cmi: $(PACK_CMO) +ocamlbuild_pack.cmo: $(PACK_CMO) $(OCAMLC) -pack $(PACK_CMO) -o ocamlbuild_pack.cmo +ocamlbuild_pack.cmi: ocamlbuild_pack.cmo + ocamlbuild_pack.cmx: $(PACK_CMX) $(OCAMLOPT) -pack $(PACK_CMX) -o ocamlbuild_pack.cmx From 1954f1ee984d8f794b43c8f0ef234b4cc719a2a6 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Fri, 1 May 2015 21:45:17 +0000 Subject: [PATCH 228/494] GPR#168: fix bad interaction of warning 34 (unused type declaration) with "nonrec" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (Frédéric Bour) Typechecking of nonrec types was still looking for uses in the temporary environment. This made the compiler fail with "exception Not_found" when warning 34 was enabled. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16066 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- .../tests/typing-warnings/unused_types.ml | 18 +++++++++ .../typing-warnings/unused_types.ml.reference | 21 ++++++++++ typing/typedecl.ml | 38 ++++++++++--------- 3 files changed, 59 insertions(+), 18 deletions(-) create mode 100644 testsuite/tests/typing-warnings/unused_types.ml create mode 100644 testsuite/tests/typing-warnings/unused_types.ml.reference diff --git a/testsuite/tests/typing-warnings/unused_types.ml b/testsuite/tests/typing-warnings/unused_types.ml new file mode 100644 index 0000000000..afe7d4cf16 --- /dev/null +++ b/testsuite/tests/typing-warnings/unused_types.ml @@ -0,0 +1,18 @@ +module Unused : sig +end = struct + type unused = int +end +;; + +module Unused_nonrec : sig +end = struct + type nonrec used = int + type nonrec unused = used +end +;; + +module Unused_rec : sig +end = struct + type unused = A of unused +end +;; diff --git a/testsuite/tests/typing-warnings/unused_types.ml.reference b/testsuite/tests/typing-warnings/unused_types.ml.reference new file mode 100644 index 0000000000..7b28abfb71 --- /dev/null +++ b/testsuite/tests/typing-warnings/unused_types.ml.reference @@ -0,0 +1,21 @@ + +# Characters 40-52: + type unused = int + ^^^^^^^^^^^^ +Warning 34: unused type unused. +module Unused : sig end +# Characters 80-93: + type nonrec unused = used + ^^^^^^^^^^^^^ +Warning 34: unused type unused. +module Unused_nonrec : sig end +# Characters 45-65: + type unused = A of unused + ^^^^^^^^^^^^^^^^^^^^ +Warning 34: unused type unused. +Characters 45-65: + type unused = A of unused + ^^^^^^^^^^^^^^^^^^^^ +Warning 37: unused constructor A. +module Unused_rec : sig end +# diff --git a/typing/typedecl.ml b/typing/typedecl.ml index 7df0073732..2fdda9dc28 100644 --- a/typing/typedecl.ml +++ b/typing/typedecl.ml @@ -1005,24 +1005,26 @@ let transl_type_decl env rec_flag sdecl_list = let current_slot = ref None in let warn_unused = Warnings.is_active (Warnings.Unused_type_declaration "") in let id_slots id = - if not warn_unused then id, None - else - (* See typecore.ml for a description of the algorithm used - to detect unused declarations in a set of recursive definitions. *) - let slot = ref [] in - let td = Env.find_type (Path.Pident id) temp_env in - let name = Ident.name id in - Env.set_type_used_callback - name td - (fun old_callback -> - match !current_slot with - | Some slot -> slot := (name, td) :: !slot - | None -> - List.iter (fun (name, d) -> Env.mark_type_used env name d) - (get_ref slot); - old_callback () - ); - id, Some slot + match rec_flag with + | Asttypes.Recursive when warn_unused -> + (* See typecore.ml for a description of the algorithm used + to detect unused declarations in a set of recursive definitions. *) + let slot = ref [] in + let td = Env.find_type (Path.Pident id) temp_env in + let name = Ident.name id in + Env.set_type_used_callback + name td + (fun old_callback -> + match !current_slot with + | Some slot -> slot := (name, td) :: !slot + | None -> + List.iter (fun (name, d) -> Env.mark_type_used env name d) + (get_ref slot); + old_callback () + ); + id, Some slot + | Asttypes.Recursive | Asttypes.Nonrecursive -> + id, None in let transl_declaration name_sdecl (id, slot) = current_slot := slot; transl_declaration temp_env name_sdecl id in From a9bdb8fe2b37fba7f6043e55b8e7186b581bae47 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sat, 2 May 2015 10:28:36 +0000 Subject: [PATCH 229/494] minor testsuite fix The test reference was built on trunk and cherry-pick in 4.02, but only 4.02 has merged GPR#159 which change the location of type declarations -- which are printed in this test. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16067 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- .../typing-warnings/unused_types.ml.reference | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/testsuite/tests/typing-warnings/unused_types.ml.reference b/testsuite/tests/typing-warnings/unused_types.ml.reference index 7b28abfb71..d515c24e47 100644 --- a/testsuite/tests/typing-warnings/unused_types.ml.reference +++ b/testsuite/tests/typing-warnings/unused_types.ml.reference @@ -1,21 +1,21 @@ -# Characters 40-52: +# Characters 35-52: type unused = int - ^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^ Warning 34: unused type unused. module Unused : sig end -# Characters 80-93: +# Characters 68-93: type nonrec unused = used - ^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 34: unused type unused. module Unused_nonrec : sig end -# Characters 45-65: +# Characters 40-65: type unused = A of unused - ^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 34: unused type unused. -Characters 45-65: +Characters 40-65: type unused = A of unused - ^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^ Warning 37: unused constructor A. module Unused_rec : sig end # From 4fa09e302c6f873d20f04b6ea5fd479b2a328368 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sat, 2 May 2015 15:30:48 +0000 Subject: [PATCH 230/494] PR#6693: also build libasmrun_shared.so and lib{asm,caml}run_pic.a (Peter Zotov, review by Mark Shinwell) NB: after applying this change you need to run ./configure again. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16070 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 16 ++++++++++------ asmrun/Makefile | 39 +++++++++++++++++++++++++++++++++++++-- byterun/Makefile | 30 ++++++++++++++++++++++-------- configure | 5 +++++ 4 files changed, 74 insertions(+), 16 deletions(-) diff --git a/Changes b/Changes index f59ef5189d..10832b0e02 100644 --- a/Changes +++ b/Changes @@ -47,11 +47,6 @@ Libraries: - PR#6285: Add support for nanosecond precision in Unix.stat() (Jérémie Dimino, report by user 'gfxmonk') -Tools: -- PR#6641: add -g, -ocamlcflags, -ocamloptflags options to ocamlmklib - (Peter Zotov) -- GPR#139: more versatile specification of locations of .annot - Runtime: - PR#6675: GC hooks (Damien Doligez and Roshan James) @@ -119,7 +114,6 @@ Bug fixes: - PR#6831: Build breaks for -aspp gcc on solaris-like OSs - PR#6836: Assertion failure using -short-paths - PR#6841: Changing compilation unit name with -o breaks ocamldebug -- PR#6842: export Typemod.modtype_of_package - PR#6843: record weak dependencies even when the .cmi is missing (Leo White, Gabriel Scherer) - GPR#143: fix getsockopt behaviour for boolean socket options @@ -131,6 +125,16 @@ Bug fixes: - GPR#171: allow custom warning printers / catchers (Benjamin Canou, review by Damien Doligez) +Feature wishes: +- PR#6641: add -g, -ocamlcflags, -ocamloptflags options to ocamlmklib + (Peter Zotov) +- PR#6693: also build libasmrun_shared.so and lib{asm,caml}run_pic.a + (Peter Zotov, review by Mark Shinwell) +- PR#6842: export Typemod.modtype_of_package + (Jacques Garrigue, request by Jun Furuse) +- GPR#139: more versatile specification of locations of .annot + (Christophe Troestler, review by Damien Doligez) + OCaml 4.02.1: ------------- (Changes that can break existing programs are marked with a "*") diff --git a/asmrun/Makefile b/asmrun/Makefile index ff277e748a..84a9aaabaf 100644 --- a/asmrun/Makefile +++ b/asmrun/Makefile @@ -19,6 +19,7 @@ FLAGS=-I../byterun -DCAML_NAME_SPACE -DNATIVE_CODE \ CFLAGS=$(FLAGS) $(NATIVECCCOMPOPTS) DFLAGS=$(FLAGS) -g -DDEBUG $(NATIVECCCOMPOPTS) PFLAGS=$(FLAGS) -pg -O -DPROFILING $(NATIVECCPROFOPTS) +PICFLAGS=$(FLAGS) -O $(SHAREDCCCOMPOPTS) $(NATIVECCCOMPOPTS) COBJS=startup.o main.o fail.o roots.o globroots.o signals.o signals_asm.o \ misc.o freelist.o major_gc.o minor_gc.o memory.o alloc.o compare.o ints.o \ @@ -32,8 +33,9 @@ ASMOBJS=$(ARCH).o OBJS=$(COBJS) $(ASMOBJS) DOBJS=$(COBJS:.o=.d.o) $(ASMOBJS) POBJS=$(COBJS:.o=.p.o) $(ASMOBJS:.o=.p.o) +PICOBJS=$(COBJS:.o=.pic.o) $(ASMOBJS:.o=.pic.o) -all: libasmrun.a all-$(RUNTIMED) all-$(PROFILING) +all: libasmrun.a all-$(RUNTIMED) all-$(PROFILING) all-$(SHARED) libasmrun.a: $(OBJS) rm -f libasmrun.a @@ -60,13 +62,26 @@ libasmrunp.a: $(POBJS) $(ARCMD) rc libasmrunp.a $(POBJS) $(RANLIB) libasmrunp.a +all-noshared: + +all-shared: libasmrun_pic.a libasmrun_shared.so + +libasmrun_pic.a: $(PICOBJS) + rm -f libasmrun_pic.a + ar rc libasmrun_pic.a $(PICOBJS) + $(RANLIB) libasmrun_pic.a + +libasmrun_shared.so: $(PICOBJS) + $(MKDLL) -o libasmrun_shared.so $(PICOBJS) $(NATIVECCLIBS) + INSTALL_LIBDIR=$(DESTDIR)$(LIBDIR) -install: install-default install-$(RUNTIMED) install-$(PROFILING) +install: install-default install-$(RUNTIMED) install-$(PROFILING) install-$(SHARED) install-default: cp libasmrun.a $(INSTALL_LIBDIR)/libasmrun.a cd $(INSTALL_LIBDIR); $(RANLIB) libasmrun.a +.PHONY: install-default install-noruntimed: .PHONY: install-noruntimed @@ -79,10 +94,21 @@ install-runtimed: install-noprof: rm -f $(INSTALL_LIBDIR)/libasmrunp.a ln -s libasmrun.a $(INSTALL_LIBDIR)/libasmrunp.a +.PHONY: install-noprof install-prof: cp libasmrunp.a $(INSTALL_LIBDIR)/libasmrunp.a cd $(INSTALL_LIBDIR); $(RANLIB) libasmrunp.a +.PHONY: install-prof + +install-noshared: +.PHONY: install-noshared + +install-shared: + cp libasmrun_pic.a $(INSTALL_LIBDIR)/libasmrun_pic.a + cd $(INSTALL_LIBDIR); $(RANLIB) libasmrunp.a + cp libasmrun_shared.so $(INSTALL_LIBDIR)/libasmrun_shared.so +.PHONY: install-prof power-bsd_elf.S: power-elf.S cp power-elf.S power-bsd_elf.S @@ -183,18 +209,27 @@ clean:: %.p.o: %.S $(ASPP) -DSYS_$(SYSTEM) -DMODEL_$(MODEL) $(ASPPPROFFLAGS) -o $@ $< +%.pic.o: %.S + $(ASPP) -DSYS_$(SYSTEM) -DMODEL_$(MODEL) $(SHAREDCCCOMPOPTS) -o $@ $< + %.d.o: %.c $(CC) -c $(DFLAGS) -o $@ $< %.p.o: %.c $(CC) -c $(PFLAGS) -o $@ $< +%.pic.o: %.c + $(CC) -c $(PICFLAGS) -o $@ $< + %.o: %.s $(ASPP) -DSYS_$(SYSTEM) -o $@ $< %.p.o: %.s $(ASPP) -DSYS_$(SYSTEM) $(ASPPPROFFLAGS) -o $@ $< +%.pic.o: %.s + $(ASPP) -DSYS_$(SYSTEM) $(SHAREDCCCOMPOPTS) -o $@ $< + clean:: rm -f *.o *.a *~ diff --git a/byterun/Makefile b/byterun/Makefile index 67d6ec5e75..ae57e2a7aa 100644 --- a/byterun/Makefile +++ b/byterun/Makefile @@ -20,10 +20,7 @@ OBJS=$(COMMONOBJS) $(UNIX_OR_WIN32).o main.o DOBJS=$(OBJS:.o=.d.o) instrtrace.d.o PICOBJS=$(OBJS:.o=.pic.o) -SHARED_LIBS_TMP=$(SUPPORTS_SHARED_LIBRARIES:%false=) -SHARED_LIBS_DEPS=$(SHARED_LIBS_TMP:%true=libcamlrun_shared.so) - -all:: $(SHARED_LIBS_DEPS) +all:: all-$(SHARED) ocamlrun$(EXE): libcamlrun.a prims.o $(MKEXE) $(BYTECCLINKOPTS) -o ocamlrun$(EXE) \ @@ -41,15 +38,32 @@ libcamlrund.a: $(DOBJS) $(ARCMD) rc libcamlrund.a $(DOBJS) $(RANLIB) libcamlrund.a +all-noshared: +.PHONY: all-noshared + +all-shared: libcamlrun_pic.a libcamlrun_shared.so +.PHONY: all-shared + +libcamlrun_pic.a: $(PICOBJS) + ar rc libcamlrun_pic.a $(PICOBJS) + $(RANLIB) libcamlrun_pic.a + libcamlrun_shared.so: $(PICOBJS) $(MKDLL) -o libcamlrun_shared.so $(PICOBJS) $(BYTECCLIBS) -install:: - if test -f libcamlrun_shared.so; then \ - cp libcamlrun_shared.so $(INSTALL_LIBDIR)/libcamlrun_shared.so; fi +install:: install-$(SHARED) + +install-noshared: +.PHONY: install-noshared + +install-shared: + cp libcamlrun_shared.so $(INSTALL_LIBDIR)/libcamlrun_shared.so + cp libcamlrun_pic.a $(INSTALL_LIBDIR)/libcamlrun_pic.a + cd $(INSTALL_LIBDIR); $(RANLIB) libcamlrun_pic.a +.PHONY: install-shared clean:: - rm -f libcamlrun_shared.so + rm -f libcamlrun_shared.so libcamlrun_pic.a %.d.o: %.c $(CC) -c $(DFLAGS) $< -o $@ diff --git a/configure b/configure index d09fc7bb15..94cbab9cb4 100755 --- a/configure +++ b/configure @@ -1736,6 +1736,11 @@ echo "MKEXEDEBUGFLAG=$mkexedebugflag" >> Makefile echo "MKDLL=$mksharedlib" >> Makefile echo "MKMAINDLL=$mkmaindll" >> Makefile echo "RUNTIMED=${debugruntime}" >>Makefile +if $shared_libraries_supported; then + echo "SHARED=shared" >>Makefile +else + echo "SHARED=noshared" >>Makefile +fi echo "WITH_DEBUGGER=${with_debugger}" >>Makefile echo "WITH_OCAMLDOC=${with_ocamldoc}" >>Makefile echo "WITH_OCAMLBUILD=${with_ocamlbuild}" >>Makefile From a0500e859cdc46c3862ee2a8db23ca2cd681c9d9 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sat, 2 May 2015 15:30:50 +0000 Subject: [PATCH 231/494] bootstrap git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16071 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- boot/ocamlc | Bin 1715892 -> 1727944 bytes boot/ocamldep | Bin 532330 -> 540825 bytes boot/ocamllex | Bin 254330 -> 254461 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/boot/ocamlc b/boot/ocamlc index ea306b374018d4386ed8df7ad05ade44321ba6f6..8cd7d040d10e98890fbafce702b693e20e66d89f 100755 GIT binary patch delta 308450 zcmc${4R{nq);65}88RUWnLvJk1d<RiV1NWr0Ra;P1Oz1-1QawuP*6~!prW7?1w{oV zIzpj<L_tA8i5ql8P@>|>uDC?Szm;9^Z)I0pqUef(=DY9e>Pbx#+}-zm-tWnERcg*% zr%s(Zb?Q`gb@$Aczf9k??W$9Aa|))<y5@?4X_IG9nSMn<&si0duPHdKXJPN2z4K?z znlgE2k7-xU=|SMRcAdJIyM3Vx&N^3&8Jys+UD_ojEj0#zckv(o{79!G^$gWbOAoCb zu&(Xvjg5_QK=P6JCqTDkzUQNq%+ty|rDu6)(?jq1wXspGxi&sie6l_z5F8Ft7w-4a z|N6x#?~VoywvIpZ=f+0nREXF%#p5bC+d~flJso^!AQd1LBOOJ$6n(hOXCxb|LNf<t z8CjtvgM!B1P{LUQjKbOxXMJLY-a9)x)Hp09G;dU4XwN17(9*Mq8ofgYhGmKT3$27u z<JncA@k6sin}=*LP775H$qE%+>8}kAEjL1I&SA}J<BZzsb82m)uV@GcvO+t4?}x1U zM!(vlqsk1ke~h^9>XcJzgXc|eYn%zWxwY|E&Nqw!p}VK`H3nh?%0d&TXNCq$&o<5q zWlzr#8$YlzYeUng+D1|B(V1(F(8g;=`#4;~Y7bqTYZ&K*0u^hF;k7jtvy9M>*QbQ~ zT)#8)=IoSE{Os+a8FNxXjr{{+*8D(bD0a@&(Cj->LcuxZ#_-UAIT`qWe9i**bM2}d z7PK^qLfMro(bV?Juo3FJU}z|OM`h^E1u3CX3+9KW-O1VswO=i$G>kE!?CaBOgLfXa zjgrvZdy9M}P^x37;{No|#(NWh9k@47VwoCNxOjk3B8tDUvO<R!r+}$?aRL6<FYY5* z(?b=D3*@IX5%{B#CDu$g{l0z>T(Yb>DLoWi(pHwHgbplC7me#vGedip9EE^g_vINE zgc|OfhtD(b--G`Hm-dycfl%?%Tv0GIKEQ@QN=+AspGr(|WY+Fm+ShQp+^q<W&@DS5 z(Zyt=$g`2UAhC>Qzfe@h85yCZh5pd72iQ&jgL(L0_#pdHF8^0On2}0j^hIKxjU>f| z>K-gjBtl^lsm%_pG>y{Q?aO{NjIpA^XQYeG@3u?`eJE0li$uwVZDxtG`Bt_VGtVjv zZCo+a7#C{$a2cAK`|!k2{v#=&{Yb|iE)2beyy%f7p)o6oRT!6qN>+YlObqo~H9T}= z)oCJpz8MJhU0o7dvnnN&x4PK4EL6EFt9H?9+W^;+N3)EHwVNL8V;W_l1J!-w%Aw(9 zNRvVXAIk_0cr0LC9vc1FfRR&x#jCPu$h#uZTr|y8B)9A$eAdgZ0L|HWrOKy;>L2SH z=g!fqLV?GZ8dry^AMYDC0~~Dm`q1&mGeXB64;a^k64nkFc`YzkdJvy=>9e#l*4N7_ zK(poRRDQi|dA6eF$d+#im9Og?cOx*i{Bmgfx{T1abpc~;X!p7SBX0)gw)_Wt)}`N~ zmA&XGn+KXL&sX`ap^_*1b{hvO7Ks6s{Xn#AB-d?7Z2k90q=TWFC)OI3wPT;mH96iJ zO7Va9hT-_1^3)8Yq_*;@Mgv6U#tb;cs*Tgk+has>Yb!03v1t;D=WY@xt_?i9(lG7_ zZQ9(|SWx@LW)KT&E1yfUjXP_ro?mYog`s{gPHDFg4e~D$iAt<MqJu6BZFzABc#g{d z1Gn;XrTo8h>j2}f2Vcr)w+L*-NJo(nUt>N;qW*V_x<|~6WGMwC{~U?sFJ&1ELzORO z$p7h~H(yGree<Q=M$3D^G8XAYzsUI|KCQNPdzH_)7x67!EL{^w2$h}XubuT;wqY!; zt$KZSys@O#-V<vgSS7r(-!kuu5jkbC?Zv!RtrL<*!l-o11l4L$ZRhv1tknAz*$p}W z<irlm{5WIn?2n8NRY0g>R4His_5-z5A7`{M9<1H8f4I*GMJtu{<vPFdP^fT2M(zG@ zzA(&XG2-@H0;kp<KKzAYEDu$kl~sG>+YPay@J}hB%|H1=Lyo1?zV*{w!+1Ef>Zc6j zk=pWOi+#q*WrvJBqex`;N=ldUsVH1%7;Ox5RgCDBZg&(@OyfY#YA8b^(d_)A8`10^ zB2oD=k)7KzLj*0Otx+acSjKQ<9;lDlUts&i7~3dDVU=ynLzdt(rWlVh1ckzjVvPob zB~d@pg6&%xbKK8|_q9$57sMMWmN8BYZDlmZxdARmRBtwO#jGS_CIaogB%=sfX2AH- zC<&(|8<v3zZCe{z$ojQLKgWsk*2XLp*0(ll4H>Fiiu(1wjL_lh62#^dV=C&Wq=K_V z40N)osYV|kr%#*+tZ12Tj0<l`H8yXAZc|@1#v7&K?XMcMEs%w87~4P|dc&B8UWCW) zG8+9IWJOfwOuiL~bSorA>2cwTcZ>}3E_u&5mW2H7&y5dTKvelZj2R$z|HD{hCJzTI zy($NZwk{1%{l@swq<_S41|=c+kO*`HBLjtr#5%5Hv7GheMOA}wIGBYp4rebUR?Aj& z4@KuFnm)<$PKu`IlFn6hj-op&x`U#-D7u}ZPf>KLL!TX!r+{R|&{ffl1Z<$2qT>{O zs-oR~=8NL*jEv+`6!VYEr!<Y2`5nx+=R0F(H$7hVM|F;X<U!5}n&Z-<{&To)*+VV; z;XOx;O$c9N{tvXjDEZMyH%gZO3ocqBrvA$)i(q2kzl=Tr13$v!Tt+edM+2Jx(eEhS zzf@E@*{-9;*PyoiB(v(DW!b@>;gcm{|1o1@tZ`;|i)qfVi~-^77Up5Y7#I%t%{_)O zNF0bWg;><moYaCw8ES}6`x<HDa7(i=s_P7V!@`B}X08=?j_PWL2n5V@v1h%R5DvC7 z>kVVLC<&O@euZZS%(wi~_hZF@pY04zpMaRw&O8l1x2m0)#Q-08Ha+}ad+dYSyK{|$ zZz1uIhAfE@gFg+Vg$joI#aA88eqvO%S&U9C$u>7y=5Rw?=QBEn$9Fa}ZDWL()76}Y zY+qM%iZLQw+|8V5fLwK|nU8GOspc3(`9`1vv10eB<|yzzln;%Kk)o!%`4xiHiXLWP zWcA3*a}Dv%lEgHT)zjS7L3afD&~&5#lH(M10b0QXEil(0t1mF~j8WmE1?B<+<osU9 z$1U$|j)@zMrdea8nAr#9c@eUvH?($m&X0hSXH0|yPakpYLn}dKbhk3YS*O7maE9{J z(e?!*(9c{HZgU35;X(&14FfCS{!6l4Bw56f{^kZoDb^bAKw|~~n&3beJJ7~~X4^P- z?|4e6q(!<Ie}<VYtU+d>#5wUgiHbAKd@*g1+5MDDpeDU!qRJ;B&j6i`WFxWcQbT;Z z+DZ%W8Du6H#${sPS!TXjW`sU%*WM@>or}yNsgqHyBUt@N(ompnQMC#C$54@3oO*e) z<;5?@W7}M0c21qrY`LsIrWoZ@PhP&J*z7L8DmDY+lVa$1W%yvR`JR<H4K-X%%uo&X z=lh466B4Hbc30t%V(2i8c#)Vn46c2Z$Ues`O1&BkGysjrKN?_$I55mCGG;m)*EGX% zEjjYVnsdz4OkDVUThK{lRmHXyNyE*li4~~e`rJrSIo#~i|2jaFe7(wNBX18n8;NG8 ztFn9!@Ycv9b`^()o3&86dW4yqcmqlq%~)fKI5fiSE0UhK{KnjHU?ir6akDsjuGz=9 zMRXr!_KlkdZfTM5%u(i2BW}J+3;R5?Pu#5$viLl6THI|BvgSN=DHzT^-~7-@t^^$E z3qISTywn^c#$RZ5Hf|U5FErmvyaO=9w=-cTm6~OV3jn!ccBI%<Y8JFx2#C5PlY#wC zmlg*~&GgoHxuhyyWP~1T-(HlCHRs3OjWS30M`O*><a=BaIm1vVQJ0ATS9+0I=qm)B zAPzhTKU;H=SrvD$%gc$JCB~04i{lnYu<CK<n_}sBGeOKAZ)O_ziK_AF+r$X~z8-J3 zMYypinB&EV6VO=<Bt9EeV$uXN7u4|y=8?DuBBG97Z07fW5G4D^MVE0pq|sBU84^dG zs}x83p-A=WtCD$nnIM9fn4LQ;b8+PC;VDR5@VHkf6LpuEc{$5}iv?^gAAB@J<W5Ad zgeabf*ttSXnrPl+JRIK33>&V|mtsyo65e#F8E?d`ggEX4O2T!Qfmx)Nn{CCBGW2`3 zXj_iBI9#kMNB2v__vI$`RN~NNbE61OOY!G$WuAt_3kmK(xPN~H=@KN0^oy$g2^q#j zX1QXsozm91`V|K+H)oiS8ljx)(?a`aCy1M-z~m*OY6_+vg7Xx!RP>o@X7|1hg4swu z68|m*&21-Xs2!8xDSz)*@yy<qXNaU5F^=J>5V|H@KNTS?u^Q~IGhZ$I)68Ruj{$O> z_XZJ|Zf-Ol7u%<s?-^@F)m1RXI#GVLnIBsEaDqJcctWD0>}mv|f~(C!V|^Iq@g^3O z&;!%ji_PsVzgRlctTQ%*ORj;XrAzun-OPk^G3~tAK={bDrr$6s!^dZt*p)u@!gW}} zT0X7pe@BbZs|jgh{A>)|xbU3W<^aRk7_OOPVi#N}ii0MufWixd=AJmL4P);ykAW<? zmwSXYB6|rO^Jy`3iCKzl#S-&tvEx27MTq;%uEsN>?mn}R`K%#coon?LdH0(EtnvNs zH#eJcn^ohB!VOjCTb3~*oW06SGQw{yGw0eEiY1SmK~WYmCxkOrnz&w<<ukZFMafsr za-G*B6GK7Ao`S@=?>ag@%B6xqi-DHTY>QoMu}Ho*sYOZ$;(x^ux~nyFCeHW~qVqa) zlqi~K_`7fdus+-1sz#bi5bL{bWrix3W{5p&u>x*eY9$QjgriSVH`b-gu-+$Hd(%Nj z+JhxpfbNV$xh+H0I7FM391u&pne#&vuS^i1KVgnQm%BfSv6b7F-0+)Enum<gg7-7U z(pIKl9PVl+bf5*;gY`&$q#PvvF+5n|nhoY+!>ADhpGIJQPV9c#TxtAHRBtph5bVX^ z6;^v=i$gw-wfI&mO}w|!tTA7}=<PPs!YenKbr_iNr02}p7>00t*gTwObQE=e!qf@B zum@gZv=u|^5yxK)Z>h&F%(yUIz8CwhsQnQqQFkPCTBgq7FW$$tD#!(BAd)-5#(dw{ z$V(OC3|s6At*X<URyxf&rPKUOJ9sfpY+~mlQ7%3Q<wd0jlrH7PIK0G$HdU5G>BU^- zbw0NPI_7i&ry@f%fo@NRX&4(|8lYiq6n3VDr6`QnRK1Jgr4Q>CYgn4X&L)QTB}2N( zbq(9<jOsHd0|jyi<2J$x;l(%sycj12v9plex<OvN5iHg~&NO1DX;@Y>Shm9G`>sGY z*D=mw${Vcl<vLg}3hdkrW0z(yh83^CJcac}?kd3vNIrc?x<z5IKN(Jq0v(Jq!dsa$ z$cy!82J5M?tC73P6ew(_h84Qwf4v6wQjFJWSZ{^#EYTI%M`3zh4jC2HG43RYO-5p; zOr%qfG&T|wYc{8}6-8Z5e;4XShzAzTE0M?^i}dDq&N7@J?*7Cq3hw*HIr3sCCF>O` zzeeTPtNaF)->&jIk<)|*5(C8A!;Ty`_$)y)`s#l*=y>qC<)scCi~vQ7flAP=$;j>% z08c>f#XAFcqZgfm<(&VlXCeLaZS;0yKWOr}k&A7#W+Y&MU;&NA$~Mv##mrF4GA|Ds zxKq^ZGjroER4ik~zJ2C2A^zMlAbz|iHV_w51))$$=XB$WP-W+W;7tm<S>;}Ot-_yB zIhP@}|CGv~RQVE5zEsf<sN8LPg`!tEdG8qYA(B6$7~FidqTL3c64}2?NsoI@!Ow}p zD^s&X-tSVn8h3|kI;ZE{txE1yxtG3QWIvaZ9?sZr&N1THo&HE$!z&J$ANsLXs`xuD zX|StZ_Z<!#%EE`fGt+UnEbJe!pcRUNKj5;cP*nV24(Y%!$)VwtiAOpQiT=zfF;3L~ zV18v5#)wZtZPLV^f0>=*3W3w9JBgYgE+I00#QI+-Dn}*al=DZk#CR!O|D%~@8rwv} zPuK+(iK?HmxEG1cW7vlkiHc)blZ!;nF&rEeiIn45n<dMT@XF(6KivKit1g46!@r<k zMPll&*uxct@BS5=a*z)-LhmB6s}YAJMaw!{qm0636;@v#`;aB7e>C%#eQ4FY>g>Nc zAtAiSuqq88C6=`acKOJ%zA|&hfuDV3_+b3uD!v^vZi@Q+vN+Jf>T9eNZDXxI$VSU7 zTp4R+#2T-JSGBUzdE&Yy*_vqV5P{a#JnTD{w6?M=w6rPJ%0*V6YUKevnrgk(61+RJ ztx~!74T$=lu^G4=i}#D79P0pBvpZQ|$+CD+H_l2Ii<7L=#H>y@F`4mbT!NUDYb^oS z@m%X`dEVO6J#V$UShFmnE<C3z^e|ox*LOq9=4*yXzNB@Uh|jm?8?T4&&bMZ0+u^o7 ztb(|m=qp#Bk)osrw0v63?O_!O(bGy1Z}qSWv6DUC!&+(nUS5od%{?t{j_Z0_<DCr? zXK5}HO*b8h?m%(sgnIvHw!Z~U`X)}IKC{!pvkI-YcDGU>ZcPRrSpzvY0Iu^nQff}K z#*6W%TPaW^^K@%K>K~x*iH*%fk@(SJ+fKH(z%~QYqI3!;oMElyc~(tdYfS3yW+lnm zZ#P$4pmwPU_p>HJLc^IDoc#V)9X=oGZ;kiKE{W_L<FdrGGp%gjpCBS2N=`}45*yF7 zhB{RiBbz_K8iQ>20GM!3xbr}()<~`gGp+QF%HI_S2U(@Ydt%^OaJs#s;w&r6cwbbV zWvxm6K=FL2@{dGu5qLkAyyl;=DIR8a6ib)JV!K^rebM?8#kWu8e*wpBEqaQZb|&GR zD94{53I<ybC2}5cNT|kNMg3qaL&TnK1;om)jRfOB*nhTl*f2lEC>FQs6wVlG?KE0` z28q0k{d;UEXK-4$ahNsNG(U&<8~mL@1%v%!?Fefxx;l5HH9+pJ-63ae;lOb78F7{& z$zMQTF(CdCE)t#3g-e!-(dSwVj4ws~xfU;f1EZ|r?Q{<+W(EAoI^l{@uoY%o)oAN0 z8~NM|tgnq!c8|*v{quUoJ5J0kg{!zlbi}5jU8NR|Ge!5YRz}nf3dRX;L!hf{5QpAl zq1HIDZY&0LT=@7{s||0^1jbuGBJ)qM#<#l|ylmWul!?UcCbyxvV*7@K+-~%GF2gLk z6zO@SSxD5Cm^2Y`OH|yJlzxHiCP+r=E=ZKhzXy@n2U@q;>cBZw*}B^d`L7LCx5*NX z2MsvPkoZ84?!eePj@C=K8k~Zhqeb3MNRcUy&n-lGi@5Y~*#yfrQt1yZ0p=i42`c)T zn0v7t!|IEzj9&Vvan1F+T&T%zuqKCtO>oiqOdPt{8en`Tx?W;U^ijS)RI(~Pyyg;X zgze+Sxh*QH0~zvmHJjTk0%cZi<k+{9D16n#Rcg9lOewQQr0VTAX;@cgE$%?!>@j;t z3$eGd1H?uBCxLVkEVrg&NWUnD(~zA*nuF9NY18YNuAhkmuUq+I)J_Dg&%}nwRz9-5 zldW3WfhJkFmv*_;&-g5S@N%%2f5R2*eO5<N_D+gl447&KaDE_f4~Q94t<IBM9BpiL zM+R-iwDZvU9(t6Ap5&o#@X$guOtp3x_llY;tXV-0V?Gjk8FSO|=xt^<4}Isc=<-`V z^bH>R8V`MihraY!V=!u8dy$9XJP)1Vp})s7NgNw?fPa7S&^tl1gB)V=aPB<}%%u%Z zlL`QIL)Qw!L31zc(!E6CG^@1Jc9>Cb>q!sY{^+t~`)V=kw1mA~=za8h=I-_zA7k1e zQ7pG@2Vb}fn}fu^!|?9Z-zv(lwQfrO2Ougyr`(Fq(?#7eOufcyt%Zh&z20gYURhzy zG;rP`2A^T1g|n`=8Vutb5tw7;iWzgP1f0wk&$03o52G@p4+V`BbLUtCPHzCj&eHkQ zkj_B*R>RU2_ML{cU48?Wz{WY2KlytNZU@#DqL5_;H=yiao-)5EXIUA`j(W;kiYk^Z zW!cZ3vIJ4bvK=ft?kQ_48d!E1W$k|Tl(DDmPNN9iXr;H~U~`<=Q>scMv)B;DC{8v} z>>7f_9YrNz5xmjz2W?MTwyNsWaJf?k&PYPBEwnPqgJVfN)`NFexF5K#UXH@!Oe{LO zVx3e$OOGJ(u;F+Q&ZU-kf(K7hc%lcVr;)!^1jnMs9we)Rq)35-)3I40;KAwK#FITZ z&wq%w_TXF$iMR3KX<RE<kRlT1T6xLi@X@tqDtO~W<y<)Ww7FJS+-a+tYfTf4bFEG7 zSfwY*xq|W9fPcga#P*x50&(PKE2S0bKH#|u`Sci(dW&_ctk)kHX9?SKNAyflatroG zi*CW*Xx=TDRRhJ{w^+G3gTTwp5U(XpM><Q<tVg;iy!#ewjcF8%nYUU6$X4BI<>w3r zS67t6Y2|`f44R+al_wx7-{B;`75jHFD~L9i25~KL<aVp8SXpT;4EL?XHBHWNRB;2- zPk3sRgE2zGz7!wbj$P4EQ5Cdu!x?v251E&eX9E%=(M3r7<6!Y~f23hh<xKVY9Mzd8 zk#_@jDiS-!zlBKroQssD=oX@8e~a`Wy_Y><ujpt)kZ9}SpgHk6A<>^Ay~Ss}jvqAn zM}VI^BViggm5s!+Xxe)!5}Umoi5MN1>o?>CWhM55ARDI;Isvy%Y>2`~D&dUE6wnE& zIi=49pQ|+MjZ*a}pEjZVaY&TGFi>pbKc^kFq}KF;(O{<Gx%@QOYYID6WZ#7?Q@j{) zmz8xEZAWfOVNFN0v-u##3GZU@_)Ls;V{7M`!swUSF_G$?4>{6?q8`#y-A&^H6m>_U zMPfwNGjQ$v$-ac(B87EEK23d|j-0`XVrVUPDi?|3$3XmL$iG3N71EIS=WaBE_>6r+ z<4ojit2sH^Ix1R~CdSEYsyI=1Q4+3$yW+0)=9Jccd4V4<?tT_$BuR@be`*O@z8Vs# z9gQKi6WteKPgN`?ERvhg%0=-03q&=jRNWcLdk{{QAgWGF&KLXlVh@~jx0T(CAU&2& z!ap){%ST5dMw)_X0(KwIE8K16cPVv^3|7}VT!7qdx*RA`16FgaDVJ$+<Zdfd>f}c5 zi(DC^^F6W;CHEj+j1!gjSm|c5DK025)5PX`tU%CpEU$7@XuOg_hZ+sqRhl%%eh3ol zd1u1}lymxYQsv}7$?VCJJ--+X6y%*g!%XqOO|fYmE<w4gD1CCG;&(i~{9Y^XB7Pi+ zBI-onX_`UKXI7`rxNgqRj8rhPRAG`5sfUNyP+|M@P~!*wj&4ug;p14Kf}9|inxfa= zQ`?LE8)6gW<3pEWRPJw;78+0#5Hl8I179R67hAcVXeQ3CPDq@M`k=B`WllZu$zrSR zATqm=!aLDjo9n_jUgfF}cmijMl@~Wzk$B2wi8Y{$>yEDOs33cOIoPNQrH&MJORS9c zQvgxmROFlzOf3G)5XNmu9YdS_evxq>PH~Dv_xr5j<`t$$?i!mW7T;%Ow&O@}^xctQ zaAx<e#4S>5TmPL{TIi;Px!iy|W`gG>fp`!73m*8#DOCsTy;y}~mrn>e{fZ$iPL$MO z1?58IN8%rcmnPyuG!4zr1(u7zQY$@fI!LF#g-fvyps^V^Iw4WjtHkuB))3s3-?Y>k zK1?4sTIFh0S@%{q6mb!?kT_MyJ0sFizbdHbEuQHX!wu<)xuRiVa)H=bWmQP`3I4UU z|5D2408u8j%t9hYGq_u_YaobbVBgs>xw%K4jYPgFNN!+b8K+7oq!>}M0ejQWAGA_@ zT|wHy4p|?H{D-Vf=g<;2LoRVDNBR~IJ<mhW_t3YR;@c-$rx~}2n&noOJjDyb&DW=< zB~o0aVmHNsWmaD?Wtlb5SRksGSs6VSqNo@w{G%oB1kIkgRzC%wIms#JE>k?V(QI!n zl786UyxSC?wvFp3o4dzpt{wUAb(_Oy{!#8?(Xi6WFqViaD2QiNpy#Mo_k)opCc{!Q z)N5>72Y##qT#TH5q#pn+brSWfVa2Sju?a071je$EDPE0BYcDo#Gy~>CO0i{7<_x2K zyX9b_YjTc|S?GeY@Gwd73h4B(qthb}wNg~Bu(HIIhpkMpV>xzlhlSrSADUS0@I6Z1 zan!xS%8py31dbGKAI1S~b%ZQ=*h)7Zb1FRU2*#5b?D{%~!V?&zo^+`74z<Cdo^q(C z<zNc&h}G8Is7${JQ7|5hO4g%Rpe0v5+WQ%&(0Eqb7|%k;VZx31l9g6p^Ep-Zcg<C; zm4z8j#pfMPk+B-xE?b7p>$YX_0kP(2Qi3R3Wpy^gO7e@MdX+Uibt}5-4&O_<Y5R(x zuu{zJrufV7r1s{^sCIelP9lFxY(R+BR(88rRL!AkV0P%Wvy3{?uo?%4uX?y%i{cX2 z8Y`tGXB};@(;0H(4aauBcP#m)L+x^gENhJwi2H*QGE!8n!ST}{qsh0T$=wlh`x+}N z__iY5$<YZ7)4%AP3}5_X_*jU<sm#@z%KZuT^o4Z~X!>KllIO05d8!Vwh|j*Gc)G!T z&s||98}G_KneSoB^O1^-k;#EXIyh}fMG8e-HN3hoysz5A6E#I*)8n|~GF%*e9Jd*Y z!kKGvKnt{boi)4z11023rPWS6vfYy`dExvgtldW3UZus&FRZt4m*{<w{gkys6g+LM z8paMDKr!PNWs&~WLx1L>KljjIgzKKRUbo}E1Wv>JO)S}Lm9=^lCp6PR68g&I30s;- zs<9F}1yMloAo#gFF(xx{*#Z>P`luLGV_j+dU97`$)sCl+e!!iO_~)*}o5g_|Yo)PS z%zqAhPjvW>qztj+IqW4ii@ncTYZE!pZIR>vi-o_FT$_-|15KYeG}E6E+JRd_jr*;H zWX=U9a;pQ+BZyZ8wU`T=4bkiExHK`b*4hvuGPYQEqp5XUAa}Fay~WCE&3belx7+_P zL&i((jju)9=dC?)htN4X(i@`Td24*!Hy~+-e~OY9tl4tAZHV%4>-6yc7p!6<@i59c ztW;>LsGJ|4E5^KNWuvDRFIstKgDEC2YK0x@i&lxTb@^5th;9|9ZN*NuNR)52N|V1u zeVWzn)K;-`D~`&)6Wd>cFO3ujUb2L7L>$_N+fYd<t$kwqHtc`DC$O>u*T3GVoP$Iq ze}FJ|vTPOWwxiEm#cpQ*65k^eo2O$-U$Ci#-#|RNEID0dylfpeeiUtAu{N7W5$E4Y zN)!8E!IPr0WgKX|f-~8zqTdcQs;ca1&(L+u@VDTU$iXWlfA)1ckNy8Unx|o@&Nw9Y zi+}7J{h<>QSfs7U%ehOnf5K<?=7)2ZSMrH3UEEY>6(|0TvZgMT@APHJh2og_qRuKy zJg(OiC9mR!-Y;VNtJajnUs2*-Om7w4U$X`zHv*zck==us`<hjh%v}y)Zb+O_-1V9j zOf&#D4a(Tpts(#Rl)C^Y+ku@J+t0+nofy5(MEOpvQ8@J9i6QtbT)h)_w|beXJ$Enc z-QaL?Tj1f+<LI;S_o#<KcoR1>w~B|}gy^l}#W!(-WvdA6l7rlD7Xr{$v2YhUWP2MB zdw1cM*jBOq4{)Msf3U_npJycdPT=hKN2?&Y#R>4-KjJWaYq;NAxcy+pTH>8|Qm{wf zZ55k-MSQ;7>I|RuzYPw|@{HE$V&dD@?o`B7c|JnFNJrvaxmIKgKcc`T7T)cNHxiN= z%xMlLG6qGUBTlbGI$kI&>JbPG?yd@;Sj=8^6Nbac0qTTA?;3)1t@_MOA$iHegjXBd z+3CID0CN8raVRu)1u%+W+Z5x*w?Cs9y!&!n0Q-=$V-tcAuR)!us*a7EIERWdrYKqt z8~CUOarVhupS!+TB-U~Dxkq6+$X(wfhTWlf&`3zlVZ#htY=8xvL1d0#c(M;0r!{}F z5>iiEzTb!w)qAWmqvi5?Yk=>3+0leONg3wz$Hnb)TBKd#nw$Om1?vE9!oT})W<fh~ zy69IuLlsUw_O%aax12QZk#M5NTjHAiNvDYY^@#uR;`@55;HqleuAofvQ!WDm<#70T zuY_f;+{+bBzBDA}9aTB`FF-l%=JNMa{Bq+Us<yREPs{}54o@#pbxuOYm3}~!)K;r` z6!$mc6pbwA5NNmOofS@RIslw?U5vebQDI#aAF)M0i=1sO+Xrt%S-gf%SG@Ef%ISdQ zTA%VWe{x<Zceg&S4)iMal00WZhHmW^pk2PMD5u;)B=Ap@X8jIA39^ICyQ#bvatfs> zH-m>lbCBq|{H!b1TPa3<cJL9<?t+?N$vbsj?@;Z;qnvV>v%S-hSdYqI1Rjxfvym;n z+7=fO8GpgSRzVxwt?&C_Tp*4uv&Pw?dOj|h`zZ2MmD36=?j*|J!?iGFlI$;P&c}IJ z(LC%L@;0Yri}YKqu7k#_Qa7KdXy&}wrm6VX28m}Yyx2~JDYzL}B^qYOwi8$EwZ_G@ z0!9xyxO_LBR@uMT%EVpJ<9l(HT`G#-$8B=?um{51`_`N^jvGDN-F7m#Ct2dv2jV-5 zX&+c!;{vWUvEl=)^vU7E53L<}Mq;?(SL;YhTx+Gku23Bw3%6425kBhFS(K#M3);28 zNBTQk;QUHa!bXZiDRzEbYJ|*Awew}g4x%L0E=Z;fP8_-|V~AhuO0x@cyfCjy`8O1a z^3z3is-4xLIW~5zEu>Bt<s(zm<7gnsCQ7y@rYF)JIr<dRPL!v4gs>ey5{0xsQ3#ZV z5FaaNNDVqRr@<5ylO@xV+qn*+Fx?&?JDn>k((M^7J3=xCv%?^K$wZnsmTu2CT8p`D z?J0PHe_va>08~Oddo8k>b^x<QN_)G&$04w|eq@O~OYqe8toC+-agUha-tOyUI4O0Y zLx6k?yEs6-&Bzs_GVBDM4uVFNB^h=fWOW&Kx|w5za;D?`Jg1~`u$_exmDT+LP42i; z)~U<3ao;V|PC;=)M>`$arc8SPvhu+wX^bkVybFCn$wN|FVXkDaJVRzBSzw>o(e5q| zcd$EytNG%7C{gX8#*ikeysMon_GC$={w+gvf2e88tJNrVvcv;DW7{WQ37Vckhlwat zz6?r+vhD6@mp#W@ilSFnJFQ8L;<IEI1B0MV<6}~r%rZMqEX|Q7D(+<$ByuDeKo})v zEbk1?HNEViO)|<m*?ICIKX-!C4V%}eEA$D!YzM@c`|N~dT`)cFl;ycn8^@H(=h*3q zd2kxHt6jy+Tzw>9!gR4M*Up40%K8l$qr`5ga}~r<<f)=&Xv7zC^af`rj(m-~yJ$E? za#!TDmkXpll<2C3XszH;yheSjv&~@*Om+O>9GNv0FX&>IG-=d?$DbmrNfmo&jrJ7V zZ;*|$L@elKXNw)Duw@!RH1>|rt|L{iK#Q$Kah|MIo~PMNDDSMxYx3#+*W+{~tE=sY zQp%B(!zur+8ip59mpb#qe}-KkcRcQZGvd&vaG7;E)XC3x{32gA3NvwnR3q!6+cr`O z6>TIgT8!YaqVi5V;{^FE^2;I!lLlMb!)|*5o1@0|9(MjoijMcdL{}Z@x&kA(qqjc4 zq`!R9Q~Jx%o+lI+12PgtT|YZLhq21NKfxu39z6xAX@;qwpe$KlAVZO&>Mw((w)L{x zic$C3fhJ$z;6yn+#a%6SVe+YlF{}p)LBYE?BUR8+VjJ#jW~3V?pwAx;!l*c^I}&g~ zdY10I|4qx@`QPlU>7zODX`-r^T?(CDV;~;L3;b5%zzjJ#Sa6ato7r1-s+bc_4HuoX zlkQILR6Sj5^bAYntTfW%nnpy<+2|2hGi6C1J0I#b>-;iA9$R6z1w-WXNp#(Jx|G8? z0`8JOVwA_6VJEmQhdvNzb`k*t`!zWzCk?pk`=jIZ*%PWX&59F>oSCrV%#+RpOcE@4 zCwhOM0n+<R2FSKmWK%JtW&mP_<3w`1#I5uY5va5?pr#ty|89<S9VlJ7e3TO?)xtR( zW(y6pPwS`;F(U@Iy;mVIZuhms>VbB9(YMooH-Wlv=5i}H1c|#ch97Q;nq7}n&nwp3 z>FwNu6>2e4RivF0MO9x+Tgs)JbC7b8qNc6f+aw78KpBynnYvhJbH%(t-YH4Ldgkwc z-+|wbC~_#JK}6ve-0_}xnKWoay>w;G13Ku#!5PODz%@#Os42uCI^H3BoA?{Ot$S8R zL$yE_j+Vn;H$i5_mv}+}C$O~l@{1$>*NxUrLxDSrjKA!}G$f8_)2#nLZv>HY`z4Np zIvYGUd=<b!KPi$EML~gLdwe_HK2ZytDC{J=rkHDr?NLoL233cM!#(Bdi;bJMEhYO& zW;TK%jz6(QYLZhuOAeT7gMm#BLy8EL$_c8r0VfD`ErqX{83HfohM&gdicEt_52vw3 z$q+jadyX5}@`bYV-2732p>`jUF;w^6Vn8TS-ot%M;+YWQPTm3kcGERb;~wO0x~O}% zlUmuMbZb#DOj;AW7wGNkQa{Wd(_}P#+PP84*{&5ko41;C<UUDRwS=K5W4J!@fY?*T zP<4?`N%lrBd%74kLP}7ZBV2vJqB%G(-jki|*VZdnAtx+Wjk5cS0VC}|)DUq;-84iE z2&7`oI5`s0wdKmSXQX`^bd8=7s-vUNm3Bd-V>Az75+bWVH!>wL@}ulBV9|1+)$rd| zh_-LG#q!a=S+#C-)Y=d=DhQzIV#s-R=ig|$@;o{0+c(=8QISiA5?GDVi<a~BQUuPo zheU~WkB2!k(!|X3aV?|!AmuUcyOZS}oQX&q?nV|B6RrlAE9{=-W29-Z564Br7<)ui zlRN`z8r7;X(h|)smQ^JvJ4@6|gqV#3?SSVp&ofwH7Mmwx+xb?BoqfVs*1d#ne%}jp z?+$FU)8mTK@xjo@6vg*N*7~Tx^nV#cn%zJS)*`^!dIW&pYTK4jDkpf;K1<us{1<Uz zl_Lhh7nd&&<JxoS&v;m6KvzAw2F5y}4iO0L%ZWW}tZpd@Z5u1is@%OY%4a)Yq;G+n z2^2>zlJWxMWJ}Q_S20e8p=fZQ1FFzdI6e}oqQ-{X73oW2#dy6B>e{ZEy$Dw4yhI*W zxx;#ohz<+?V=MLlR3l9*_5X|R`2N$4$NzkHoGX&$6J;n<16@2(Ut5<<L;x7V0KldA z0I8v*vPA4oc_r@p44g44ZgFs#+#}6lvQ{!TPgA4D-d+1}o+VEP&mm*vXbLT6iN$}z zol12&)C5FdoXYdC9hcgf?e*yCZtJ<FAC9x9C+v>shP=XDv)#tmH*hMJT_&d@7D`^F zMPFFsQkt77)L<4}R$V47rCruV&5Xz%O=OpI369!MRoo&C+U&}8+GM#_He0rPvQ$Ld zH%F}jTqWFTB~MJ)BaInU@f5_N^~DL9;_&6oL}?WBH1fn46V(n^x2AUXO_7H9uj*7x z)#K2MQ|-Ky81MV3`o<F*jeIfX3OzK|ErW}MuaJFFfkbWj)!w7?mGa=z^;BoSv*Jp- z=)`_b!4j1_&CZT;WiG+I!`HL~mrrYc37!G2$Pz4SropA9H;RV0+u)J5X?7u+q{Bz` zwJC%aPlr;8qH?-ikvVR^%^0{U!U)0YY7%QcUR1tH&d%te|9@AaCh?@1`u=o76!m=+ zReX)kxg?7ED2nQQt<G5yMQx9w{Ihh<v9oZDyk<sZm5s6_=O$wU?)1!%i~I?L;&P1r zw;UJ!TaIyJ`m9JR7^vuLDHRH$-E(M#JzR57$7ic6u{{_sD&}H<Yp=6Y#F%evzj?7G zk`LKwEib{2hJBidICscCRUBI=UBI1{nutkKgmI~8sIW84%T)a`RloeV>gz6~2EF<L z1eDD;;b8jn>*XX=IL>O)MW5OFRFzQBfs|`X=q(+R=kAlW?b+q-<(%7~d+}+z7oReq zH?ENVt)Iidg6l|5@8TPzOH{71^P1fSPSKi~>Yjru&2U>GUBusLXGYzCz{^}aTBN7) z`jy7M0s@-0(&aZst_7QI?n<q>X`=2%=@hCtI0X)mXGi=M+7G-*1}>LD*_km!K@Gg} zoerT4JXGf@kvUfn3DRS(mcxy&nRNVQCiuyFjT+~oay?W?k=JS>XEi6X!V!6$5_!E6 zIs2p{eRC*Ml+1%o^XKXfD)-lVB=YCup2Oi=q$!TyVh@NKfEnVW`B+Y;&C`W|D^F~j zXBT^HbBorIdAh-)qCwM2ws5|7EJa6bH6IeLQr5i{-TT0omUA00o=kN?;=OO43Po?u z+{uhx(MejGeyiNCYm896>QR`dF^Jx4$LA*zz~dCG6@@E38YkYaX?%y+cboJFt(_kF z1}V~Ybb)&_`Zd=(p3ykl`bj~1B2?1^C`A(&XvSSA5-OuY97ENeVp65_V7g()yTD!y zvHUBR|C=nk$P%|M!*T23O6PRYxejW3yPU*yjguH*;q9K@x4K*F{XJ^D?gjRLJzjU5 zY`lu@#6~jfHeGRfr>AUzy3g3;lb#jYpBTLrp1(luiPThRx^wsW0(r0^r{;ZH|Lzw9 z7s}CfW4v=kh>AfqVyEb1?e1eZ`IkbB8#Jo$yuw*6^jjG-?{s#jC*A|%{n|8LsJl)+ zfQKQf<nCJA4?_$09=3DzSbrCs<U!Hk+}Kv}oTmUrNR%v+jaDv_hHmCctC?HYSbGXY z-o4WH&F=kp0OEYNwWz*VI`T=`MA>3{EHqYH$<_`pmZDwfch=CtCDN&*`^oTqlGBl> z>vZs?cj29EZlSqX<b!m)#m7UQXm@azJ1z_pN62UxeE}j@sL~NK5JqbgxKBR=u3C!d zh;QKLaW3pC4^^ERrf%t}mUs;%jn!I=y<e_m(H-X@1l5)ob&L+JMg9HK0sl?w+7V`S zi<vKDD^paZZyV%E$5IEXsdD{L(^+?e=-$8^c<r+90l9Zlof`O{bLkd!6X?YUo$XbW zG1RjNb3^ih5LF#l7kD`6Pc87cZSQ2i2xjqn%sWU^7C#H;>-&)16>UZj3>NNOvF#x{ zGwR+5=iNi1W{sT{70sHi6EksfqdDL*y&KSjeWO-UwWBT`^2NsDM7)5o9LN2MLR}pk z6;NjLa;fqOq4YPZYgZvrr(FyqbXIm}Il>5OE*+$WyT&T($w2stXvPpLq#@8F+$iVZ zPH-|+FLHkY59~Pi7xXP&xjIVYJyYBa%@qSW$=>OW%BMV(&(}T7b!7P?axZw=Bhru+ z$eP`wJ*)-TNAxXWl-VQero64u+&U~uS79ArBO-Q>x~7cOSH{Z`Ro!vlpASy0h64I( zbp<e&-QD@gJ@TWPrfb|i@=3S4)f)F>!tXql;w&}GS4+#Nb%)E0SpTR}{sa$RC#qM= zIS(ht%vdewuBz%TStBqoE`%*jt0%O!pFCl;+570pLsBF_oS?^g*MXvAfSSZ5PoNWJ z)$++G_j6lMd{*xAQFUZyLG1&@cs_pfE-dL~<8`NMiY)^?VpK=DwnsS>$Lwk(o`AXc zF{k4usNA;kDGzz8mHWmaNS%@RISy$GQqzbhJg#5XPI%nTOFnVK8NCDG!AF$4CO{%} zNfLDfV3_=OTO^30Eiy`+R1?OfXib_~lmG2uF7NR~9UWaoHITS|$lDZArEV~hMiUMF z@oGb8EnKWfY*}mPc4HrS_kvG{awX#8nTy0{75LW_&e$z^8<#s-*T4*0Y@7CD$Z9gO zvfsbCS3CoCn$@f?A^=;&NwK|7&JN{V#p~=o<_26QIZwUe_$ouJUnl1bmX8cEFC0iw zN1M20b+;<nPskYo$IU>`LFIN}WO&MIdiC+jDD~-sQO-w0aL}1(90O^vm^nzETWKB} z_1Kil4Bkj(4wF;?C%)t5W~gvI?#Biv$jPC(-M^J2)ev>_@RfS%#5LkiQNBvQb6PFm z5V;?OnW<)Wv(p`RO&2S-BWCF*y8o5@<xe{sd`eQ!<22ip6siuRBMm@3HQ>!YBvn$2 zp%$OwdLZ}R7AYspJi6#mBs~T+7xm={UzDvlA2<)%i>gnd_kS!sdR}{O{Wa}Zd+9rU zcWTP^&?YyrY@ZX#jc@omn?K^4*po&l`XgUn<;)Bj>|()s4iY=c`Nv=v?a1zivq=Y- zcKTZEfb%~{N=S6)Idw=9)yauX-;w1s(~(bZu$f^<u082doIg)T=3(_Sn5#u1An@dO zQlTE_x!+S4422Kj#}zhbOQ*+V<x|4{X7KfE25oB4c@dGLmN2<G;LZ=en8Fi`BT>uS zg%hKG^tBA{oBfAvAWl8B`M<e=9TlWc2;t}HenNjB$1O<Xkm%jC{zi-p{e>}`zQd3t z=Q(mZgM0K~izP3>EEyNu&iBSc)tdjGRo(P|uIh8n1v#&r^&oMw&(SxrqHhB?1-xik z(RKdIfP;~*sl{d7|44jsgz<4vZAk%zNBJ_u+CuEUBFkbq_B|)xIH3-FIX%veBT-Mc zp%v6t52b1sg4lcT!t$g`H_FPNw{zo?F`9I?98t0vL9(C-k4$cU9+SREY=0h?aBFtp z>h8^cnCDo%Uyw&mZWwYd_~*P}PmJO^_=3J;Eez`y+o1Z0H^cH)PqPb1^rfPF)}Tn# zy(lmJeyc3{8e2W1(6CLOx*d8^KYWu{T?4ktlXp*ScRC~=>v%@gZ<Pj&?yM|(mSuS& z_);^+A9#*~p-`=N@)3^Bu<&45*uXFB$R%6pTDaXFAR`9@J>Song4DF>`p>xBwH=q) z^69WqFJt_+^_H3`C2*C%+q0yimPfZKe6Q}ya$IrMmnDw8Y^QXnfy(r@E=cAHnst6f zvMcfPU-@_9zjydg+aXVe)V{5}4zpnM4ymY`AFAa09nypjsO|euBe%nI9?edisZl#U zUUvTuRooq)+B(&tqqA<3ZEGu0ly$f)I^3gQh5O)sF%@3)s;m@w3?6pf^(x(+dWxji z<Rz6dj68nxTqnIIuco3szv*ERZThP4hKu<uw1J2H@LtqT=Q(I~R@1Zzi0W}<RH47S za3qQbI}KYv=b;2gJ*n{io%TS8kJd+ztkKcbRjTQU%#)aG-|yuRY7_Ri8BeCbi3W-0 zj6N@OuTFX7q{g6Om))mbEgYaL%)u}hy`j<q^9g%{crhOj2SSt@1N8)i9E!XT<guch zFn#|hhXoHp@puZ)m*XkG-A*w-@A#wqd|<Z|!kqEUe(NL$#anRw|0909Yu;N@=tFPG z7_`gDjysuB<iBcA^+ClHW*6wYk{PfJr^@rN6n7{5{DPWk+$YkJ+?`4oICm<H52ql3 zlslLg#lE+tv#PfKgG|2fW$m#yi9LJlV)<oEyCS<#Ss1RjyGwj`1XmA7s{t;rmy3;j zf9h>Zy!?TErpQoFk2z0KM>95C`#%7y-j(erhmp4<)v5D;P+2M2ENA&%eYM=MS3ho% zzV`ZF{Q!9M`}+Dqs<l3l9JqHZF?c_|&|_kzop3_oyQ;9@1G%rqAj$XY5<;_X!};w8 z_6RX6$4CezEyXV21Dx|r`OqFH2jD|XT=0S2Nfdl&pC*m~b<M2CnIjPH^O3#DlwU*? z3zu={9QU_=4;|;B`TZ+8f4nVE1)^@pF^DrH^I=f1%RR9h?wkiiD{jP<i!=G7?!z?I z6c-$9lV&E^;`Y?EQz9>LriuF5vZfke>=77xnxzn~alc@noYl&=nt^z+Bkh)GdtT~8 z37$ati$19GRDX{Hovcmj(@Y3LJj9ov{#8Z`rA_vJyKhu9qs?%gxZlqDUx1?mztjZU z#EbHhL_9S6dSXDH>bAmgawN||Dn{a-gS>p16<>Lk*CM?ei-#a_D0zWPR`-IJth}`4 z;nxsR_#(a>Agi#YUrapSG9mZ@-ux#6nJI)<SIl_<Nn!4l7>};#sY%d<XFbD_=w-!7 zQTiwhncTH;RiQG?$qLwb0r@wDh3dMecXQQqotpg{io{(bF?TCwi|W@CGo;1%tl<A6 zi^WAOCXS~iWb`P82K=K|?2A`h8qU?$6eVxt$LEq74gcxnrIFoH`pr=TUuPs+6sF-7 z@WZoPCZuu)#t~<_9cdg=hA2NXE~`r_K5|TGcZy{*#Yp_4Rj5v;=-SQB_4)9zjmSPV zIXzg{j3-34d0>M{WlV9+UksX~OY`R-xgBV3q+6ph4e=XZlNM2tn|-*eRJ*0v(haw= zT8N5oarT#WQDPvp<{z2D+JK|a%_|a8L|ImvU%udNixMLtJ&vtVgXHBK0_mX{pQR*E z0mVUy#6?lkDg|Nv=~gKs>vKFEx~F3szt}M}HK8|Kb)A{)EkLttTsPXF3&qI!$FU=p zVvEV&;n9Oxwef*a(i?uU`2aS+&ULGN#ih;iH(KEL*PAIxMG3xQ{?&xGqF_}^oTxvW zoFL|XY9GgUN6r1rp3U!$I`p|c1KIqvG~DQX4R2wrnb#s)to#DO6~7Vk1uiU##PKh% zb1D*r7sRHEqA&3_J1$JW#Fa$R^1tDhwJgXI^ZsV9!cT%^C*XTbcE@IlF<;pgD69Jl zXCocO!LP85N*0+1aov(ECL#0jTMzR@^+Ck>L{Wbbhs!e7gv!s$@bP;QhKY(pI50|u zP53rF?Z)7cCQkdiy-1XPjpxhu{2fbZTao<@9usS4i*GAnr#Df6CJudVXT<RpRoXC9 z6duBJnK%6dMI9XWjt+Z=EY0M_VC5f!7^`KA1OLF~VvbWg?`zn-ldLVqe}mR%{S)_E zXXBG}2v+FgaE8HYo`P{Rum{*rMZY3HpN13GKkXFx&9L3jFzcMkIz@)+ZN8_s-NlMS z_9CN)qjXQDbir>ZUFax{?;QEY9$@xXHTwKUjnkYOr^_0~8Di2u@y<x!W-8F{sd7K3 zn>+q#XPf<<28=UB0HYN*0M*Dc&|%5{5!b?5$MF3-n{!%p7Qw^z2K;t#*9PpM5=D7~ zJLb!~x6F%r1Ed%tIPW>9I*RQLc79Yb=LVILQ*QaUcE;(_b$}Ej@sIPHPDGr7NOwaz z6^XRtU?r$(o@I+y^YB%i3%<3Nz+nU5*-I0P(G7P#r-@D9;VJ~r5`1U(NgNzi5;%hM z8?JjmvF=sO4`j)Q#LpJxN8mX_!t;;V8x3=)EiSFJ+smS1V#E*jc;g(0V|aM`5B5gW z9HDWH6n7uB7qsUWmeJ|+kSLyiH0`;tIKM4!z)#q6jFOIFj20C?*+q%xY09OF?LT4a zAyE7*@B1A82?xgvI6hHah8+ukBSsAP851bNQvNgg8KG7+Q8Lcp*K~*BcY%`b#5bqJ z9>Yv>-u#qh79)*3mQECtj@enVp)^r>Od4(-vqW+H7`APPkI5GCd0OK6n!0JC;yBg{ z+R~)34zBs#_{c@Y#lSoazwq*UKRZR%NEOvT<2)g9P$t1P9uOl~`3sIcBU}Ks|AOl! zEtbZMnZN3Sz)}c6v4EQXt1dyd<3F*T15sS4Mq4&DEKkt61`I)Rhj$u2^R+*Ibu+z` z9(qr>veAw;(=L0>`3bV_!05e9>t746HhixbiE$wEk@(k3RPMzZ7Hj(g!LR=1e6tSk zMdl(g=NH?M7wyE{sLDxGU@>U&^hR>AkAHB!P-zTCii+(;q7RmM=nFs-zfk3+HogX& zz*q%br1EhpACG({%6FaXRGgsji&cJ!$|oY%J9rlq(&-yL^pz1BUk&6-6T;^Uh%o<s z$bYdd@GlSlf`{=FlDeP+9{P_SdW(l%<)IgN=y@LcifCF~8S6_9j)(?h27Bmy51s0v z8}S2qdM7^e(64*wZPE0FF}2Y^%tjBr)<duK&>;`KSoq_7S;2W8c(#Y0;i0E^=!qV> z)I*Q*&_kl>PB8<bftWrXI$wN5Ju^IT8xI}tp)C)648PQ;+y97%{@O!-9!&>hK8Xfm z-t*9JdFa<Y^fnJ&>!CM#=(SOFFeYYY6oBvG_0Wqw^a2k(&qL4l&@(*r6rD!<F%xwF zbg73P<)Mdo=)N90-$Unm=nRc!`!Q`afONcvwmmd|eNi9te|hM`9{Qk%{<Mjf?Z<rF z1hD;>cRchTJoKv`daH;2orm7&q1Q!dr~R1K5kR&dv)n^3_0V^F=-WN?EgpKdho0%u zVotm-J$SK8I<3cy@X&odbe4yX_0WeKq6g>$5B>XS+Kj0Yn-UNV7DwYT^F8#H9(p`z zu9puYx$EU%4^O^_&h*eNnrLS*e#DQB>fZIKhkn;XZ}-s8c<3iQ^lA^iEJCL{=D#lj zIP~pedMg-bk_R5^p+|e@p&ojmhc5KcT|IPmG~GL<Z8Q)Q@X&q_9V0%X-VOhZw&y_) zeZWJ1<e}?5^ezuw=b>MWrh_px(Ll^P552-eFY(Zo9(s<4p6;P1fu>jPlwJv^;@0j0 z1->Cc2Rlb$Z)#XCkFYKtx}Aqk^w5Tf{w{#u;MLvvbMaA<FRRxZ9{2?h{e*{pNE~ey zo7L-D4}6)2zR*Jt5#<42meEC2Aq(1`(jN{*>-IMf{bvvTvWI@&L$C7Cw@1^#m>JPP z%tQ}8%tN2<p|d=65@-%}0*2TPK;M2H-Kj4@lc$vdS8$o$^e}Dn&`)^iWga@{p=WvM z=^lDAX~s7yz`qe5hK?RO$wONn`kQ}5_wp|u`b`fV1|6gs+GwU)4UkxhhAmK7s)o%{ zSdNBWrm#*LcAmm=H7r+Qoef+Mx#ssNu#3ic?C*{;r)bz;6_%%AuPCgmhOJjvHw}A0 zVOhY~$$WSGdD%Hj6=ti#?y4fo#;7v(mKA$wW&Ko{i=il{r^0$FK4R?^hF(h<g)HOv zvw@=rou0DyY@inlRoO?Xj8<S-Z>{WARpw$Sig{6CeH0(D^}zIybHAd4uJhgDVYtde zUkaLy_tS(9QCNQs%T*YAPW}O^jGg@XD@R6wDjVpIKMU(osB5@WF%Qy&Z}RX|d+578 z^n4{_uqLBCiU;-|tC)spO#Pym@ZGx}I?Y43@X(Eai|))((6q)`S{r{R#_=!G!0n2$ zSi|m6nBI$gV7j$ZJ+x2N8LG+I`=z7AFb(UrPJ!oW;Pna{u3^QZUz#r~r#*`Fc3XPr z@5L&x1^@I#G}|j4`dJVCC}`TJFIr@Np=z0qF<O<;^H^4@mHqs=Q_sav6!Y5WjX^1F ztYRd%7>v5!H+bkPJoH5#dWeV4^U!UgXpCw+0BSo)Q{qpbIoPEd_5d(lu{#w{nZ{G9 zuyPH{@zjggX?oSMPoo8Y?V;cI&~JdI!q;hyZ1M0s<DsAQ&}$SOi7NMa7;g5^S9$2m zK~ssFH6<=q*ex11!c(tzG#!lT6b-~Ac<AE?qOEhtLx1U^U-!^89(r*U4f|go1>ngP z4_)e^2YTpk9y-lKxAM@jI?eI_cE4lFJ2bPcRoErKXy%2gjMMBKl<AIG=%KS!-Mch- zfB$QAop%)-8UI%Su%UajN+E?^rIc8#DRGM`b1@Xflq;d`N;S+wclXfk{)+jp_oRh~ zq2VvlS|0%Ib-Fzso)<iHwW_m5>)29--RABpsQqjOE(O6xR;YZfs>n0v(Tc}g#$h=_ zl~pQ!WHFr;rVp)OVNZ~c<4?wheNNBZaVGYO!d8+|@$FWaKDIRqdrISbQejVP*kXn0 zLmZr?K)2VAsR}Zlt1^9z`zq{NO>nNl*dto5Mw5}K%3KUZF~>e}I=h~`3Rd`?R^ba( z=whs}TVb_|kJvVaZPBpb0n`2INyW1XJZvYdc-grs$qW0t-a1z?zo-eErZE2Yh&u%1 z6ecumn8LPcSPz9gqG17rJr0ZtJrh)g)ac7UJ7&?xd#}RQsS5l}9x6iqr&L*;!jQ!* zRTz89242(nD^!__kv}+5fz^tU;JFHW2?T|_p~~2350vR9&QZM5n^DgCZ58&Usz)rz zQ}36Lr5xv~0_8EEJ3wSO-to}eJoHA;RPJ@HkwpsIsbN<u%yrJ+t1@=xf{%la5ErDT zeLW53dFW&hZFuN!KZ>@{#~!*)r#b(h2Ed+tsA>J6!v3IPbM%VfpYEZDdFXr(o$8@| zpo47quUaGDeCQ}suVH(D>0|!7;?Yh2jECnj#iP&r#Tv$TF~yzn=U7b93f-x8o=50l z#iLuQqld?@c($VhY~;@>|BLDn!+1TOPh#1}jQ{-biDGgsL8j%3$*l;MnEAkTOI+!p z$EiABDtU)hqwL_B9^Q_mIsR?{YT;q{`Tgj|zVOf=dFVGi^m88iG0^Pnk4h<aC|IRH z-K4V>#@`QRg|Aiqoyz$`>Qox{He&`V-j5ZAEanu2@wew${~MM6qIhUs)8PrmxWZWR z+r5s4Y}oaIy$btP!?r8T9WK^=SYhlP8#Q2a%Ao0IsxlWN|K$>c{Xf+NpQ9KpRhf+W z3VUA(b`_@JR;ui%D&r5gyNw=x&*{uhs*FG0?v}l!%KqlYe>Sv1fx5Zeo-pT+vr_=g zK1=cHmMT>kosRsC$lV4DRT+nb7~4w(Cg(qU%L@E8celcUcOC6rj1@jm7!`DdyreMx zu)B+`QJCxftb2#T{HiVffIIkua(pJL!f!Rf=O~Q7=<W*ct*|2+U#i0N#(sUrQT_*w z?^A`jLlq|#!T7gR4bUr}QB3+2sZ!X_5atd8^9-%tB*nwAc9kts7<)?oOvR5ZCR>%Y z397;lTA`&1-SLCWm~ZNx9=TJ9*t-gA&>DSSVeVArZ`@NMHo8)kk#Lm^-lf1a4ZKNV zxf*tb!q{u}ri&^=7IVHTb1^D6NMY<4`SUdXJd~*@%J_%Pfns*22n8J3<MfzjceVXQ zVaGJ=b%nXpl65yKj2&R(J+#K}S7pvrMf<E!p+I^uD`cy@P*tRF6eym6D$7whe=Us) zlINd)a+GFoDaS1X8S@8K=K34ktqm&BbtZzV71mJ+CU&R7vNY@(g;818LKi8F%DLDe zg>}-fE(#0kW1OhK&KlznZ#zBG$M!D@J4NGrLt*YXQ|V_E)>Y$Mrm$`f7L?|{Re`5! zj8`ZuU&GE*Sa%IOU19DRv*ET1>#6Y_+wF9uK*RpJTkZecac1RL6{9<L#MUW{0y(bz zl@MexH*11fcBWQ#zA9_4Fv?0%m>hEYKf&+ca<p@U1hKseb7KRsrxkXdCa_9jd?1wy zjL{UhPL;VBWlT~SJ1wvO2@Y4F?j#))ru)c|KRSx)KJuQzbRT(EVY-hjQJ6bB&NsFF zUzsYTvv_;aTb1cvovE;kRd3me7-0JL?E61B%1+XF_5o|+f&J?h(^%DTnPNs3^MWdK zF*dRyN<d7^5)XZ=hrUtCn4&3hjlwQ*<Np;}qvJgShI#0o9y-HA`#tp6yYwE%#Js7| zGX6fR0kq;$&>RB(R=FEQZc^A}4V&(%H%akasqwT|*fb6M=*@^ivi+FXngF&R^E=Q~ zfWN!$Do~*?{=T}4_4L$h>!JM~`n%sp8kX&R_<QkO4`0XN8V_Cxn(g19wKYp&qcv>2 z!t~i#q%b&lM9<a=(`Vt&Z#Zp~xRZds^%=k>=fuH>hkip<x=Rzj-NRGkp&wFpZrAE8 zh~mK@%ur0zHKuV2<L|P&79XatJAlzbt|A~~da5!PV~6|-TcpYO=T4{Rce@y!;7<y? zQwin|x3f`XF;A#63TC5=wX%6A(=9ej@p3|u*HxZ!vQ(LiQNjJMt4%N)c6<3WK=1fp zr?49}zOxi|vubRqDnl02LY27~8~fxnM{boS<Hgq+gR-$(H1JL^>b<(nL(fuzmT7hP zkS&$IR>RIw*eng}sj!L&2K%Qe@VW>X6Z7k<j=<|R>~9L2tzmV*bY-9R&}&tl<yxIb z6t;mF$Dii8LxHO`#@QZW;}y?68qe7to--7W>nD`mUSYC9)t;%a;C-5~Z|a<0KdoW= z6t*51O}t5!A&YrKmAM!jTcfaNG#U2;)2(!);+e0{|8fP^XcdQgD)#fx-Bq1htxhY2 zZPBoX9nlILh|sh@{yql4-i5VF+Z6VqhOLcMl+|K{;(0;i8P|-gR8PIeSCm4k{g}f5 zsK85_px0a`r>&S;54}m%d0DFyRM;yTcA=-<K#i8|cUP5O)hd1SvZK&z8dj&U*MU*l z-Kq>(%z9O}Q<c4~l~tllAOAT`wA24mRryU-iH_7+VS6;Jjl$|R?AUfk(RVcLZwh-? z!`@NYdm2`^J?K>4tAU#p<NF%+sKP$buzM8tp@z*>*hd;RO<^Bv*f@p#nVTRt^bS+t zCmL3$uzebqrLezfSSw(<iH~lJrVn}OFBKiR3HCMsj_K!`(CrH2n7T@?_Xt|4c>bpG z+^ev!H0)Z19n`Q3w>1W3qkquALdEzG4a-s(m7|h}R2j0EI92wA#=q|+r!!w_*k)k5 zg&vkP{Et23-#x05uHhtw9o7U5R#=0Eb(6xHWOeY+$G18PeW%s=ni&26hz7o=7{AxB z*A(`HhCQROe`(kXh5e{uixhTL!){dAPrxD<L6a5uv&LAWuwxolq_E=})>C1>XjnUi z{i<Ppg}Jc-(>xgS(~HsL^0|lp&_maI=$)YH6JKi$ty36(rQUVikf+`}$picAj&?;e z!p11fbvg#8{t9D{**H%?nDZqqHpl~!6vaaeu*^_A{BdZP=d)ng(Y{eJnTjb%V|qpL zxD~0uGYb1w>-7p?x`!`OJi32XD2y*_Q3)Qx#!OJ4?qCBI#@~x}O_--J{%Ev|B`GXT z!;ZY*bczn<^1Y)l{s6R#)xDtRKYyf}CgKk}vk>)So<;?|H;;Jeg&umohpqrknR<g` z71l1I1jc`ur(%B(-NQrYc<6W!-SB+0;(zwgJ3vQ#h4Y_7@Q8;g<e`_SO8hNw*L>4F zJQF?iFb{o}hwcqJNKN$dZ0li4_Ru~L{jV+2z5R!W{;P+64>W&Dolc3rR`QK=z8lUL z1o8V+{e25AUjv?akZwos2hI0JUHVqgtm4u$K=Ykam%bP@zbek9hlA$(#4dgM7BRWl zI#raN=?f%ZhywnO`y||3;LFNwMCF;jiKz?mkuMYHBJnl%B}fxQ!<oK5!He;c>2{=* zNNbSRBCSW-jI<4D2NEC8eh=w8q(&q^2AWT&_D33q#Ai$HLwXL0cj4N?Bs^v7hcpa{ zm(k;q<{&+a#GMNQPB4ZqqMw1(ABpcB79$Ns8i6z#sRU^((gdVQNaaXVk@#~C{E3DN zB>rf^TqOPoK_${cB!0pD5~M1mhmckvtwO3sT8Fd&X_Ez)t-*&aNG~F7N2){GiL?u8 zH&Q*)UZjtZ_8}cW`U2@7(m>dm=@35ufb=U8zwZR!_J9}W@zd)_ry!k*)DBk5LmGm_ zK^TXWELIKljgs#aqh?GF5?|<d-zi?We2{OpF;&bN<SR(N3<X`0$T$t@VzFhAuMDr; zrkv%Q;#&v=zw<FSIU|m<fDX7>RHMXLDDaYdZn9(m$~KCSl10Df;h9Cg3{<+i$Ty}n zmjG8WzD9W|zKdlLUT179@&&*XDE9S5Hlny0*2@&@j$&V1@O;!9Pgyk2^uf)@DOWuE z2m1!%{nyO1ebbD9Sa`NC7g9^c`0|ZXvG;5rU*5Ne_-6Y!H@f0G0(|*m)F5Ai{OJJB zH(F$&s2k$TLp@{}@~i!tN&-WDH#rhB#Id7xAk}^EITsb(Ih`nW4fXXwQ^$w;La8(~ zM})5i!{wdVg2lRFzWg{Ej<dFtDF0n6e2c{}-<)2}vTFvu3jFb|7}ggLodcc5iG<<4 zAym!D9vbeOXp9vN!+m|lk0bFOY2Oj}_Z9wub;1bWQt=}{mx`k!d_iN3m^;!J6gQDE z_FP|uIoTHXoa^gpoGUh*i>@pb`_82)myePL?d)VDM)|T*heH?F;oR;m6!S;<GTKE* zu)wt=PL(8<P(Y%n8Rbid&_O=DX+6s4M>9tu(zso8p8)H0QN3I!MvwM|z<yw~uQt_n zHkQ(){Fa5w`5wIUMWcAldyEh7i=XFPl}rbA+vULG`yDRu;oIBK_jNa?*uv<S*ijri z-#6A7(EO8(CFF&FQ`FQZQQgIn65sabxrduq*kbS*Mw-aF(D#t>nCzt3f1&L6!3%xs zp+;4yoQmI<`d&ZX?I@?>Or%((sDTIF326$F>v@=L7x~hqH%CFG5wlSmZ6RGx%)Q7b z&}?9wudi<l&;(Jw*uZa1w~O^Bb_Cr)aW52=<9vseo!~U9#v`UI6vxM7M!n3A&_&88 z_}&a&5z{8-Uex+uO2PlFhE=;*DgKvw?zB7g{|D30T|Uuw1m8XJ{X}0-esw~&sK2KT zejaR+uWRC!m~gI_ZWYygQZqU*LNFB2^|(At1B)9`w~CU-V>2dC*CFt7dCNoMm+^3d zU!_Y`<);7#EJY7R?s_#_XERr$(47QZMfN4BS&1_MMYlY7rVcgJ@---T`=ifDx3we@ zxXf4EG&345^QCv#3_+Z(oSt03sRnj3D)e_Q^DQt+#D+58*U9?wL8Y%<J{i$#Te<JF z6N+Y`Xw(U4g{&}pvM<xPPE<|y6+xBy$=DCbtW2!E93{g=-Q}363q`}_a$##b1q<Rr zF?5P=c2r<+ZL?79CdY7bbc*j7RQ-M``NP>)_~H$a-LLfB)a`m0rWhI@MdFt&e2&B( z%m&VIwG4?yIw*Eu>04tYhG$OmjWLpG!(6~QNMxTQc2D=c)urHj?2(aHA8l-0hcxi# z#>P=ddB++Xdm%lJ^px0s75cYR9KQ+{zd_VojV;IxV)xaEKBdcNpy&qtc${xu>J3nV ze{6#uL^W;@^)s;8+#?RofC+98ftkKhaW{fd4y34?>B|xeX8Kahj+VHtI-z|c-R>s6 zypR0J30|MkA8tmv2#I?%`PD5VaE;ITS{U>&(!IG62_@I~`sOtE#V^yqPB)+;_lOPG z__E~B9JUhW<NfJk={H7#IDCz-ILO^P|JXWvMt)-OHR;qkMrWhb=@`}GmQlwjk{b{m zqs6#A(lIQw;@N9`BU|2#8oXrqbDH>ec5GYGZkDfo;w=DO*V!tHXZi9H=K*r}r&~qC zYJWlEd_ZiAdT$jqv#__i6%fBH%Yic2_;V3fir4u2nzz~F<~9B^#Ec5xBqJzxRrnSg zm16957`xlW{OhoLxI_GZyuAxtRmB%S>fW&To`W2D2m*p06crQ{OiL3D%6Cv;npjd$ zT3Y%GeC3M*(|n`}hO#UyFfA=DFwLWBifQ>QC@n25C@t}onwnPDx!<)Pa3H(?`}y3@ zz30O)d)BO3GqYyRnl+C-yL5swPMXbL1jSBNdP1TzCn+hEGEu?pRTE*|yhv3OF`y>U zv^PZrWdJVCWt<FY9#u?I(xmx}fG?g*#(<1(OHWqD$S-+Po3)|^rA$#qNDDdML9rhQ zZ>pZJ;NKLbyR?V`o&}AUY4Wp>?8Ou?6`d=e!e;_C<vCzwO-1Gfls8owDlIYK8Jj`E zH5FFwD-=8p)hMLIX)w{2GFBwzPgDZv=rpCBw2W>}Lz#;xb2?HJV<jjojLZ2kf^uI_ z!l~?e1$S0WLz>E2c#2=9`06;X88|y<AfIC6xooNuW@Gu{-nN1Z6Cu4`7ZpsoGoc{f z;8Hj!_jz!xate&V!!uFO5)wJk^raN{93r#c7v8o9OhPLe7B9U?adT0o{O6QZX%*Ex z2bQibdJ)KJ&nu(JF<a?P*PlnF-Y%M_B+$rQ6g_ATfN8k^uH^){j5`-i_YM<^#TWa) zy~;ck;NqL$S1igSy$gb9;8{wPw2o8Yg93RFiuF|W0%+1KB|yUE%lv$9mJ&nxbCq^X zGmLi6RpKarqv*~Q1Eg|BN|82D_-srLKHv-^scg0~md?#nq9|dG5+iM5oLDNJql}h5 zM7}A~W=ee#6?HOtH}aW{hTTF{FQWOkGAKj(hzjOnezVQ+wxgmMFo`nfDM``}z2uei zz~G$>iKc~HP^*af$f<%-=cAc-F%bvtouUNOx%tW<=@aU{KygXCsryUFeGkoH?^8PR zk}{O?^TC)N3zcMPFU?tqcHBp67oslv$#)Tk6kIvH6*n2i4pV(;=OQIfI)HD0EAuF5 z36dRs86`hN`(B29{W*!np!x-kSPTiQq)m%ak}3+$2gxs~AYZ{X`g=tHjmt+XeZ_zb z=`dZ&R|ZN)sAmB}U(@me5c-C;aOfzNE<v-zE>W_jWBeQ~eM^UyAdBxP>=l&kIF-Hv zVLm}uUjdEpsdu3=Q~H5{4mw&0NvkIBrAi^Cy^4~SEd}#`q=040RQV@Z%)8MUV~Zd( z)ytHg^2vHgqI8O~i<EiN&y-0@Uy3Ib_ZNQ7l1@_<fitz#b2%z?hSHZqSDZCM=jc3# z&eMojfpUQ=UIogpbm~<AFB+jsH2F2eU8WPSDf!ZG<oh~Hd9e~FU7?C%H1}2ZBFV8r znI>H`o_DTLQmNaUXh@$o(2ZhW$Hd~g5#_T10+xhMN+t6li8q*@gM!{b&Htd}H!!*R zlWN{TPJdB$iLy$*Y3iWpQV9Lu<h@c!<Jt>yOu;{>HsQr%4)^GP+)-VOI#O<;&{Hdw zCuK>YFIOs$%d$cfN|e^L?M-wI=927D4;dtTDx|DZ9*`A<9$JNDszSTi*A(iwT4^f_ zh3;FeJT2SIu$MyLuSR@Rh5Emx%*FUru?B+{>nL0t{T7<N8701r;kcIa-i9prFffw9 zAISLIN;oFwI-uJc)ZdR$9W-wZlz=}InkqG?o@-&i1W?>N=rTvwLU02q?p=`Zc?YRm zFg#ugGNS)FB4WIFF38LXRt()e5NRmkL;Q<;4~oF?E=YthiE(nvTcMy_?<)Q9siL@b zD18{^t%D+KW#s8v2c<>jpcT6wBZ7l2t%oeETMztjeqMze_m;kgUeK1Vz6Y6!p!D}4 zPwgo0ee|mK976wIErKb3sUmDVqvE1=pqMg<ZX|6g19lYk-hleK%9JR%BU)`DR!<Vj zp(YF#(z;E^KWPIP=$HYKh&Iq6RxwfxKaZ3<o2kk+D06IGFoyF=o*%_+M918DShS@7 zeW2VU#ZvhPN)~BO)G1*j*x!}1H-X6|8^NL5@GS#$&u%)%@0bhL7ib7LZrbh!W(G<k z-OkVPxO@)@BI)oZrJvlx<ZJAQP&_@U{6kQ>(};I$MyvIr#LeJsJQZw46ZfWUC%72x z1Q+`_@th$^cTv?AbOF|4N)I_vp(Ved=a+3&Dx|w9`y(YyzQ=@Be*`x5H3N=q7!3MR z&NisB{&Z{`^zHy^w;c**AeC-c%A`S*`Z0R;VA}pM8suII-+^3`sC);?kxWrLl~MA2 z3O)7}F4c?gV#77YJJHSWr<$G0NP9Rc9&Iupg$7k95pt?hxFMhgCGGO|R=FXE)Q9yC zE->r?%KHRLw7NnGlZP7dDGz)37FK%W#>(gHVTG|V-jurwqM5Y|azBicKS3kJ#`p_5 zzDx0z9%Mi_c{tkig6O1Q#FwUnq!CQHhx`!w@2{el{IEiIUlgq=;nx7%T)0~i@<@e# z{8ilM&ubrStMU|tn=f6*Y@uH<{D}VCi8k(5!ft2NfPak0Wq%a1Q#WmrjHwtK>}*oj z8+qjyMJ$c{3}xL)V?V=Cu$40RD6yR%LuzZfwAD;)P1Lv;kGsbkNk+MYZjofPd%Th4 z33t#fl04}iZzLJx4!T8>vF`CklBe83w@C7|d%TfkoIB_iNyfX!Q^6T8e98VHO;E;f zqMiMJh^*%@&x`HPGyuV}h8flh*P@ObX7~2v*2)4xol#wMMTFY30dcdu6a9j8#0d>3 z>BJ}g8#L+PpvetEV{lPyhL0@h;z=)9pOuQxFH*!jewPP~(|t;?{aK`_D-&ft;}H?a zMm`sJDx&Iyi}EITN0P^WCDm^l;Jon35^GEbM(@XJ^mO;UnVppRn;c46j|z;hCvi{b zwvX(-bnq}6=KGa!`^*M8dmm5|>^T6jDm18OCi#WZqyw-MS~-^=P!3DEK4)C6$IrT4 zGvKPvxm@ipx?B&#Jpp$U&i9hbbw6AI+&Q>*mtC&WaKFGQzqwphaJOA?xt78`iwW#9 zxRPrw*CDtrzk?>+Ik<RCYKOwDg?sc5m+NV`<A1t3xqini*AKJX+u^3eZHGGw*YqZ4 zzHrHKW8m^A;BzHXc^QwGV|}j7^Lh?d<GEPR?)2s7N=tOX^Pi(9K2P3XD4`v>_uY$F ztM`qvm;gBU#5QnjM4;uqP@;8o2DgXfnd1K~I#wvYfE}}ys=k0S%7ymKP&-g;rILwB zT0td-{#jI2iAm9pqADo;9h6$dfks}90c_}Hf2r)1Ur=b)4Bt+a;)(BXW__ism1iro z;kZXj^4a0R%fwZOF=)O>nTKKO%{4;v=;~o8eaz?(7r4NbgyE=)1CFcq60JRgL1H0! zeyyCwB<}pzN`m~dLPOHj7P|Gam@>b?8bQ9{6&T(U-IHHY3jM~kq{;<NF;DvjhHfDZ zI*KuFDHR+=S(eeJqcG!&=+ZIF9}XVFoNFQmP?mYBgSC^E^Yc*oRajcT$!#gC6FO4X zx0oNiMvJ}$D~taXv4SHa=;F5+c3&_04#j)Jfau9e^k;p5D5bpbFs)o^cyChGcNj5O zp=rjet>x8V=y<gY?VPF#$~_KRZ&AT<Wt;rALVkQ-^OzHu!L1?R@0C!U6>I6(37EO> zFeF2Im$JWyWUZru?@{{odV9Af$1apUHvtzgNB^KC%I{(1Nq`s>{-ET^?}P48wKe4z z`QQt$`F`HbUH~gt=9ndAurPOcx1e#=82`(uyc&bu1`J9AR1El?aARxJ8kqVYz@+d6 z4c7u(^gONxi}o8qHJfp2Fu&bI`)U+N$cJVxV4>w!-i$Ek;Vk-5DU`Pu%}eWkgq5(> zs0L<i-=mQruHJU;9q17H#o*qw;wRX#tb*+{`6ng96NfrowCyLDFWczEPq0b1Q|d`2 zNd6cl+bnk=M-|vfC$Z(UgN~e3GW>R$nOB(pF6wtm=_`MNQY5IoXiPhNukPq6WjW?| z*+0V?-2*}c&_16kv~mclniUL!`Cmhy#r~pnmp?<Z-L1By++UQjw!NUqI<gtX9fug~ zqvTpPp-wA_{`<}B4w(Kym<M;LEp_|kkWK@}|7oQFGe0DnjhSCntr9O+f}QCgA9)56 zSVhT~*bx62mS#qKOd)gosNv34XB1Bflft+wY)76|=3_oM=p3x$!&G_>B5{N&&M61w zuOSk*L!isfD>vkC6ncHK+S0lE0_L;wQH8p8gZ+8(iW0EQ1-eNW0sfYjUPQO~&dBuW zMaa)_vozf<p>a=eL>i`w=v|?-^OABC^Tq9#l_a?uvXh2Fk7}ca=?sN%6tqztb_uIi ztm%W`dQ$RlC|yq)&t45J`VH$sd#_;@cJMba*XIiC-_YOjFXakM=#!LlMRCZdAb~8E z7yF|Twq1dp{WI0vR6^xnjM~{NK$(9mUZ*MUD(+qRPzM+n$UlhZ4Q9A6d`7FK?5nVp zJ!t(^bf+`a`x?q~mOQT^bj}E!r}S$uS}z!d_|+^#^)*P<MdrJM;(u3y<xB3R)8%C5 z?~1Q{*$r&7a{Y~S#RsQ;SG?sbZU|KUG(J_Tx324VWjtoF<F7+8U!xV*!R(=Q^*R<- zf2XxK&@|WS&<%9`8x->g%K8V5{zEC2{w(?v_<uR${#15L@=cvDP|7!<5C5jTn@Ywq zQUhe~Cd=MK3;F!5gv(7->iW0RQpSb#kdT%XJ0buo?{8(aB4bg}hr(S-kiQ2Wc_g#? zu&3&j{=tYQD=M{eDJ}igMhKcpgI&revT&oiELQcEZ7ThE6WMv05m^@$u`E{&zOyMP zuwlyk<G;fVhx-6FEvpRgTf|*8he`XgDm7GY2C~swTk?@q5$FSSHe%dKEvD?IYADOM zGfh&nCCqF0$?8DK-|6e2&XX{wUG9ls0M)>29e4{0GeMCH(?X?PZ#Qr0%uv)}k`(0J zq^h|Ru8lu$Q)6kAP<vt~yF#E$Ee%9UL7AM#h3YFwp-y0RlQ4q~Z>pxXZgq=nSV%dW z)@JImrs@eyYJne1J9{=2wA))Pm%^Qs?P?FcaesX?b*9`#r6u1hT`0{*Z6~)?>B~x` zbz#Djf>!ycIhgT=`=XBRoNIm66v^J+<R)8O3FPUI0u7~}{_04n19>;c75^Lk)e)HZ z;@OFb@1Eu=NgXLYKpiD@qKW`@H>S5Yg4GCG6R7sa^!8Ms8Yy=M5^vW=w*XhVP+kjl zHYT&4L27~&N6EpUIx0ww!gO{~keY#+?D-%y0yA0PU^QOq&Is|CwCZ^44q#<#TQEr9 z!P&%1J?N%G4W*P2HJK-_tyG6|TZrl@WBOVViuhi1GgQsO%oQPgpWtrvAXgZY_iha6 zV*p0BLJ{wBf=~n)=seO|^^l}QI_5z5ZYT0ek)(SlaR5Gt>C;C*&nBqe&fGR?fF$+B z_qmaWHE3cs_%*tCKQtBVrHl`uJuh~ay-ABeqxGjtOyjQzwYxOH8P`t57ZL_ic@(l4 zMB}4TrIYQ|5g~)o96TQggX;jt`%)|b_tLNq>PAe2MI=%rQ%ode>OPfbZS!wUV<J(U z`za?9t(HQ^B2ng4ii%Prr6H6W1r9%;XVhvah_k8B#M{APJ-=?j0EZ8vkQ{T_j_O}H zbTFusnqf;r0@jNosJs)}?jgF=N$o2=Ox>d)ZX>zaypDN^L%Qdn>KL`1luiX*RD4B; zpC561ew3dbRF;iKiS4YW)0l2*9Bu22=E<arSY~k-u;($iB#-lRyflhZ(-58e99E-T zb}0P6x~OqDMAHD;j2??sAC;b9QmdpV$+xRIkk-YiqopzYJWm=+d40j?ja}8N@>430 z<t=IVZEBSKv`QPQv54ciyD5g7ZfZ|?oJteES6WNsDK!Cot-7b$jNa;|PL%#<(CF4( zEs&m}yt_fKy1RNx%A%aX=mq)zL)}7Wz;MXA4NuMQQ2R;QRGy*+VZ$%`4mHAWB6w<T z*f4J=QAHYv?7TzumL@w7-N71RN>NX>n|^`_2>SLan>oDA%H7mX$vxFE(zCRwr@Bp= zO4)a+WzsYX@1^ET)2X}{<YWei@ExLfb-gr`VtT7Hr5sw@TTPRmE9!&xecs?)^SjVO zxyEzKT~H2rMl-~I+02{r2VmZI{Vp(LmdT74m>K!l#HmS87s9T$YVS)aeb6Q)iE28` ze7#eI-VL_TWsFhSy#Xkan%<+vz~HwM1=F~D)X9*WntRkNzXhhGy=3|eDYLKYfZ2~0 zOT*p`bQVtB^hI&?1d$ZqPwnZq*u>5^eM|y4)e>6WPaP<~qN_d(1N~8!LN0VHt?CZ} zTS}!vP#{--H4#$*^zBKQ3gkVYMpN|wC}vCn20)81r|f}h5BXJ<?yFTGC<9eC{A&h6 z9E+I%gq_D{pWD&Tv)ZHn8H3ObSJdl@LZ3O9cn?*Bv4gXHkh&9d0mw)K4BPF4(Kkz& zo6+QRFC?jyO7Df%T1mc1=-zKq_arqxWEE=VKF+R2m<PoHlzJbyaU}^|;4NpnWEI=I zZ&TcT>L|*60Oja$pBhXX?^BmcYbp7Dki}N){m=sMvNDLEgcOW;>vWlv*JHdN2@}0K zMfLT25A@w7^ZlY!6tm13m8v$EVEF3{95)0E+`#oul0VS<P-|%;*Eyap-VYm(27pbQ zn49s^hs;O^9e)5xHnR{6#m<c0{<%YewWT2!!|VA44h;fpO1{B#Bz~A$gKZmV%uwp_ zAOv6=r9TJ_w;ktTP@BpJRe>FxV-G?H?O@P2c_+rdO0*aaSGVxaO&Yq?E}D~u5`Ds* zZK$-{=yS0n&^CJvZId-Z&67TLUK+sz>1X7dj_mqAtPYa)(xQhk%I%}nkznP1su+pP z4=_TmbdU<t)e>yf#61Fa{5j+elG2L%D)W(h_ZQ$Po4M9{U8O;}<PpeOm9zX2kc7P+ zo&mA=iZV0Mb@9m?{`PWorh3zol*5$z7!VS0Vn7`#A5qD#%C9B49#h9+YiI1^=-l7X zsmIkMZ0*F2QbVO$XYwdjld!v^b1iE$xb|(mTpHSJ|7dlF?K`u0VN?@_O!c8Gw<)Ia zJ%S<2$7#_MP&C*GdII@=uhPnB-wu@Zq*@{U;EWpswzjPX0iNb?eXU`IWwbdQk6SfJ z^tgXpa@~invh4}(D!uVkITl6wk)^Yn0nNW3(7sQp;nGhGjnF^tMTJknx;bfx>M0C% zF6d}oRDVXc?xOk&Eqz*z#y(QT(`c4j94vrlJVQ6fsYCtF0+*ZOoavvZ%<)hX7btH$ zlt9^eS@;b=^c*<;ap^s9!axme^(#`icfgAX^WZ!XPNj;UFv*(q628LZx(9Y9M_7wu zY}vE(ry9v0$J?f(av9#}nyYSCgS&DLT%b!J$0>M7<|Q{ClG##a81wEj;u#lL4KHp6 z```(fLMizkLgCe7e5T}_9NLDL;G*I9cLDQX-HgL?3pkcJFY?X7BAVkOzL$159>bCg zC9uB)OfK(mxNcO@CJ-a<BWkd1G{Ri6-*kb-?in;-Xlr+QzKSxr%kwo|JGSn?jluQc z)V~9V!(1OvIIaWN=Q{f3Bzq@X_Y4Mt8>UKsM(r;Df$`->G;Mqq6vdyEorOW;FFKNi z4ttY)v(Z?8Q(QKBz&}RFMFrVty6V4du(`6)hwaoe9g4;$87y{XtC+`V)MkSEs4Qvv zFfPj)t(>6VCCOBk4dJ?Sqgenpy7KtD@vg7%^{nO-)pq?oU~KU*I!w#;4|VezNVpm1 z`dF>Xb@T)-^TBF2w$u1<iJ3u<$HD57#a`YmnE^#$cVhyIMt@IK?^RT!Y(@p0p>D=Z zQe$KdCEeuJlFBBjkW7u|=EMDMK;m4zOuwmFEpN@R^pi3$kF#sMu-BSm+3+ZwqK=T8 z0SyZaq&*8`*@uQbt7gc)W>P;hsmD|`RrWW5&A~Qb3<npV0V9)MxB1elsp=-ogGNk) zq6(ya(=d#*ps49Erh=$^I+`SyE=`Bd4bf=G&(OIJtb7r4DdfGEui{)jgYDd*<edX$ z5lV?UYAmKZ**UNxThS(j<kl$1Q6zNbsQqjX)Q@{WORCuB9fTdb(a!;;4QON0k5aIS zL+2`BW4G04)^|!<96P}B!1d>#OSh7E9%aM!#`93%5mfp-a@ygndR|TO>@yG~EytZJ z0FM1$rXK;H8{X<n+-9r(F<ye`P06#>(A-gGke4es>7Ay}8-(sjJrLgfw~@5HiNku4 z({wfcIMeTB`uD?kr-AO%WPwS;)GGALY_)U9DXb<lAuccb+`-ttmty9q(YAqR^kB-I zqsHe}U|E`D2U}RCpJMu*O`lZ;<8^~;T#RN|?&i2;6URz>TO(Yq_5!StGwu)rm;7H; zTZQn#IRhUsfb~8NdJ!}1(NyrF8tXUCj2&e9_v6fl8flw&-AH_Y(Ofm?_5o%jx0-u7 zxx0?S`aNgE&B1;b)5q7uUc$IGYOWg4F#&7+9LH(df55^q{o70*8<BI>(Ayo@B49KY z9QGeH{k!0^#>Hwx6aHq4dt4e_nyV&-bi^(LgZsj<|ET5Duz3*6|554xv>;n|6FQMr z1KNKzwkzCe4L76v!ME}|i!BbuvEnjK9IJ^Rrr`N%U-{y%^vHaDu2MB$4Qj=EhMX!1 z&Yf{A=E3B-0PXN7B`<*C`8s7UP$OGEYbM~9bWgy7S#_2^T%g_|O{VjlB7%HhQhV4Q zH&Z-EsV@Qg0ZoQCcz>-?T&r0#8_{DHzGvcCg=9+Zc{0uts(DH6_RKgF6{mLf`aF3H z)MyjO;t<c78k6%earhM(=F8K!z`1goW-U}(%0HZ@*Wq{Ef7+;uB@IlM)6Ovcbkm<e zH4D|)5Q~GBpKV4jqtxY6Xb86_4+x+BY*4kR%%t>1YJ~jHDVnuNy$weFrbW<yvzyS8 z<6bSO<hYl(dyz?LqUk?j`qNC`VvZG_XTn#Qeo0X;d@Fq9%W9loc8!tyV`kJWTJf?P z@xR*d46v1Qv>E-P>GRT;J4;!NLd-PJm^e?FeoiCbqBY8dPovVsYD9Y;IalEb19Q~M zcD{-7yyesQ#cF7qSB@HJ7I=giooD&9cCqTPz4(oRmP=KO)yR+~X6);xZ*gfZ`R2o5 z_NJJ8=o^biZ%{fz@26?`YV6?GzcNT!vHV6A7nDoj&Ii_k6HMGOjpBIIB9n3o)X)c0 zOq5l(K)K6|n{<n~NHgx0Tg2gehajE%yLmZT!7Wg#&A3-@5x38b+jNV#4QAXj#Br?~ zr|16ZW8idYl4l|<h40Q9Mmknyu(8O*DI)JBsw49?6HJYgFvlJ=<4SK4*TIZid5gHq zmGvz~WAa6K?i>@c9@t!qJUH%zoXZ3=t{l&e;~q8RHkfg<;almF%(xHDxH)cdJ<Yg% zMqI8g)mFmxX5=9=;Y)4_{mr<~0lN#1<M_t~yBCfJ>m4XH_n5YD0*<wRQ#iJq*aqi( zJmG3_Wmpvadz(1lc?BvPr<`gEF;8s|Ly@<C97|z1B{(tNT*Yh0`m{6uAJ|w~cldje zRHW{p*{`VqUh$y8_IsqJ?+sxUxF%YQaE20QYi&Ae#tTKvNk;0_C>)K$e5%7grV+R^ zEY8<`TT;qeOiap_W9_R8ZC{S%u~;Au10C*7OfQZuEk|G6O5U%+u<J_wUWLB6tr1c; zguQ`mae=wCl@`6K7VC4R5UL8o;p~KY$SdhJwI>z6g_Vku*RV`d__o^4dHgjjaf1Un zD|pd<1tt{w^FYJH0^bTXs_Pxd;||d6VfsBy|4!5IW%}`^-<x{AuAW4}!`@Ic0-N9< z0k;`b=mQMB9jV|AHDNGc8^#4^Q;(aDJIgY_xI!Fe&dx-bo7W0IZif9#7^mq^!6jHf zxQh;zU<mf7OC_+m6R2IO8r#bHj40bs5pZKo$Hnlc>{7MI{~0BSj+bIXAwi=JV=$xl zS?%RZ-BzmUesLheMi>)jf^k&35@!E!3V2h^4;&5%SAlDuXx4l%jqiq&A&1|D1QpZO zH?dvdPm5Mz1;d}p-@#PKv8ic5Va8noxv10RyLExZoaimA8M{`iOXYj&A*ZOvW?pXH z8sJOE*Q(1YWewJoL2ixOLx10;Eu9BR%n`-Am?L_uRX5Sl&1nC!x7AW|?ZZrG<~x{o z>N)>A#TY4(vfsrzSRyS)dU#vd!`ZcWvEYFB6W3vdB$39iQ^)Z;Z&?8jy1q_b)W+iY zKvbI>o|(h*cK$Id22jm<EDHNm=}s7^l{?S_1~vfsyoW*!(z_asc@Il{3C`v3VX-M> zFqmkyAN$O5eow<esb%VM`CiP8PI$MJlXMngxu#ql8<PB=X)cwkr=|N0#c;o&7@R>L zVBstz<v-I@#PH%Lmc*Tbo7A>aNa}xLrhcfNZaoCiEZ~pA{SL<x!G=0_?+1)5Y3gP* zFJ$O{((!d-S!Wm(IMI*~(t3Dz4hJ&ZQ0`RkF{!5ABCe|$H=<|@h&)7L>^)39x2Oa4 z&qX(<^et)xcDA8J^+&XE)fP2UkL*G>x9F`NwiTNsctc?;R;3f1Ra@1AQpm{vEVllw z`pRvPa%}%>Q-kDmjlP`i)6&Lm#&1w}p_uK^$d5DvH>dFoe$)+YluHL^xPh67Vqj+) zV1H(HC|nyjmbAwVIHi1y-AI3$|FNzevUfo%TcQIj9rba&Z{ys|-`EH7*nw38Y`pBi zdgtf{qNz*k6AeI3cdDr%p1u>E;z_rd2x*L4$U%SYRD)YueS@`8BpeS`J>cvf^w^_5 zE$QON=#(iHSOE2><Xu*ABjvFWmTmrs@8ypU{~0eb>`{A@&nH-`OelIt!}}ataLg>} z6Lk*SsOl5-I=p?mu`b|GQG3+G@bW&z@{i+FHPd)r2QTI`XicoteWn(}%h`+3(4WHh zVWY#}S-y`K*A3bk3nk$<5XB6KW9BmV%xw2yVKd@@Ivyzt4q!LNpArvZ#ROkDKd4U9 zKjPd1$bBjNODyE=+y#9#@(_A_!ZKfc_B{8Hx(_J^eGV1kPn!%c{0ns|Ld(Cva<xC5 z{{l-bC~76z!rz%w3C#iGORKO#hHpn#F%-1bLU^0L#NtW<-C)n3dVi&+>0@A13i}*w z<4=3OLc#p0`(d5%{KIM`LL-jo*ej0cyt;Wr&#m{@Ixz2R<dQ(yN1+7$>D1SHDO10} z8XYqGhWi0kRqJuxkGf+nKdO$?KVs}b>D5@xFFOgPTYVG@zu?Y?;6wf~Xf>Q7Kc*Mo z_gmh8rxD-kp|!f_yzwmv0~&rD%3K#4O7zrla`CttWmYTCQ;RmE$~`rlP&}dM5OqQy zR4PuWeNDug@AX;@`ra&-CyiGjGUL9-B0qBY!M*Hre$bhu>*l7_=m#iRH5#O@syC{2 zHjJ*pN*J1_#yxTBk1RV>^P^59^(Wn{_z4?8kiV09=+a5Ot>&D9HUZ`-z0PqzV<<tB z|BRNY<9EO>*ki>g@dMsCFZ)Fw+0Or>qxU|IK^CLdX}uvmYta(ufVFz4yjIU9{EQx& zd`3NvxYV<35a=RTd=}E@PixQWEUDEaxP^oC<Dvf4^PJxFIfhqZc%J8Bf$0Ua&_<j$ z#K!Py{uST-LgN(kFX$-_UC=Z3{#BQv>|b%V0A2K=nxwa+&1mG<OX%SXkE_1+V7DGu zOM5PY+x|tD^eSc>Ud<)Frrj^ADJF?Uht<Ax@Ul8y?|wW4_oGW^(FGdRVE%7<LG~G* zxT2RX`AXwrml_eL3@_@cjyC>kW3-BYK?1I+33`FNsOkb#&&+FTZ!=u}1{UVa7HQC8 z?SyciyQa>U^e90w7lB%QT^Hnv>!_JkX-d7JOWL9vdI_p-s6)*pJumCl)8s$&UbOuW zRLf}Ud>6Rr_)`@+BHqJTiNU+<ka`<E_ow;**k1LgF3P?C()qdmFLkPp*_>8<fkpO| zn=ps*ZStGC%x$@ejo$?7_cylyK6$PKtNzwgCjO&0!P0+p(T;LqTPlIV4>ZR~v=_X^ zG8Ya`A9P_moQuUu1FA7-S+3SjZyyYyyw9-@=cjf~#Cf4__iD|SRcpP07ba=(Ru|q1 zb?GSc3#NsVR)M%=S!3NaU)InSoHwz0&f3D$Q|ke*x2MLMZoQ|DW9lzo1#t-!qXOtp za}>=|51FS7t69;p&G@mZHWFxi)W&FWnjW!8)2nhy)2W3Ejg|Fe!9eFBp>5M(-p=>c z21-vkt9-TNvh=ibeRJ)KCXI8Jh9ZqTUNbHks62>Q0$gF*jjsO#E8HhQ&mhc0I!_P! z!SRru1sKotcm&!?1$&?y5?X8G_H4j;nxMmBbhCLF3C9a}Fcj+2PjJU`=Csz<N%BOE zF2C-97g@r!?((GiKsd$z(F}(SAH>KSy2QhmLi^zuOj;W)z<E7ftCg`5SQDYS@RDv# zJMd(Rvv+&6f;<Hjx(9Tjzs7su<%tejG7t`R(AL149I3_1&tjiro!k<~7b+sP2pnHH z6$v&?r<f?M8;&nzMrpI<nb?ka$D=iQbkxF-F1#bM$)WI0nnQYy5<6*QT0M`7B%)&c zW2SK>`NvGkr9GX{5P1|9jRX+I%TlO5r^txbVsPYnQ8ZfX1vapq@@&%#-4+9p!@U+U zNbw>CcLv5>8sAxqw9P|K%+^|3(HX)v-|5>$o9Q7HI~R4;aN_F~r*}6ECx;d|eY<Og zk}j_jRn+(gId|T!t?=OdlQm2wd!ifU-l?Sn5ch%)088w61+AABVB^_=4X!O!+<_r3 zrI*%Ieo3PrgKe!T^nf2eHQ!4MSNNj>UX)nn>!1=}y#J!bYXx*=6khHvi$`lL(u@<r z8+&VOacm;Jk2VH5?dhWn{mnjTAmlp)<SXw-L1y2jZIT!3BG^*Shw+zdZ%J7RS`@IB zCuqFooG83QomUdHb`n@0jG35R0DJN}&ITU5TMJWiz?LSII4B^Lw0pEFz22Ubc@L&R zmES{RDyLvG*{82IOkQFp%k8Vp!CSSS{q(YA_CqeasI(tieHR_+hX&i_jOnkf@<6a^ z5C<u0u(lWHH!cm<lBA)|-uI$WP_Tj|Z64kN4o=o0xtL%syma<zozs#bO9)onr$+)6 z`+WC-pG!64U|QP!8ZUi}y<fY+c<HHt<BEh-?)y&gXPyL=yX66G6rdmtrQ-p1`3%*( z0YBfgDQ2h)7&lZ)1x8h|0H7nzS62_!1OR%=CKThWYtvyGW^UAbn4UrS2pAk?4?^X; zhG~f?ed2>!ETXd?)XG3Oe7H8LUJQ!%Vq&;)xR%-o6p^My$+Z$~7_JSlv%pxkXf2hd zK^7rtBQzf7lG)RNu{a8eq9@R%5y(%^$l>&ONaIzHW!d}|>W_ARTJW&;bQ?<wJAg1x z>iNfNhgTz5{u3x*q?Q6wqenu{VP}riJ6CYJwhCQzd%89bM{1%T0dOdl_wa~xW<8>n zOHz?DJOe!%33{Kf!vuazn=BL7fKr=d4d`)gw7eWWu)BsM==X{+=f%f0Pf32&(2WXD z4Hl5^Xf49;6+H6Ks<H{@C0YK}gQtx~-OFh8XsEW=oT*P}J}Lw&bDWms;Z+QoWo6OH z$9OCL^Jlb9_7woutJLy^=&Oz_sGY6UJ4*{y`27sL>()UtOrNdJX;~Ot?5`sgD`rCx z<Hh+%3Z0;N+uvwREr^mPXgPjNhL_XY!twOCgpN&s_S;G~CqQtwQt(7AqJ1e6TkO{J zH4}`2Uk9hmiKrnKxh87!+OI?k-oEP&CroTsfo}p{Hy%*l6W*az>4y`E8I!b_+gBmd zeV|!wX4?`8IT1T1@)qDcpET-NF-Z%uzYP$NNd_qHIY>31&nKVB+A#YXMAmaMd$N{f zUkgw@oAyoCR^9#%K<>G}YohcAS*seH`#QjRnr~!PIt7BYl`5v7e`Cw{SuNVW9tiby zOnla0=Ls)I*WpOUBFv0_uTggIBh2K>8mA7TgU@Pte&r@USA^4Vp!BJl!|#JeWH!>G zsaj~qO^v`GBFxk`!{?P-wmyvtRDp`!32=Qw-khopY{lJ<tI5kmoZprPD4ElA=}64c zz2(!i*bo+szCdJ2V!^0yj+$xOY`?8$&h_BQ)3w+>ADQ5~+(Ctngm5@!70<+(Z7f7w zjBUWL=YGv}t#AA70J%5Z#|U#>cfhZ2he0#6Nc&EJ>I;xFLyPEK;SMr0XI0~2X1L2e z9=8@ivK$4_m)B>YFMdJ+Gob`_1BbcFg*3Q2Xr?ww=LoaW;z+#=?wP60gt(aOOV5D} z?V+3;E%NsN<RXgJ+l^LTEdU>=s{y*0qXp~lVGRTxSAlsK1t-HX?>=o@m3Y6;0IK5= z*Ph~jQX&g;`+0X}7Vbqf_cU%-?uA?vhVQ#ovd(0C9s|IB#MQS@`tz`r4*=vt*)u$X z<bxQ~gImC;bNGo6F4Q5!G0D&2^Ww3=zw^&)8TK#SDHRpLM#wk<+ihO1*4<voB<s+j z9dW2BSBtr?3UGH}_|nAV5o0)<)&0I|gm)NWF2)h~^`#$?r}Yi_x)JI(2y@o`XzW}x zKBxM&L8{t3ZL0k{fa>crewG$tKMqj6(pfPJ9q$A{b^I^7id#l-3zABgXK7vR-@C_A z<_nr5khA6derOyOZLe+&s>iNzkJ2-__=2_vBOfkni=~9rK->^BTf5=+Bk&q3hZ}RW z6#GvA*R!O2NFd&zd=VFXodleP!f3JV2Lc^5a|cdsasf{vuC7bdpgv6<wv*OjFv{-J zG?JTArI5K=OWcxBGgs^D_cM~Xx7;r@f3D`}c)Ag|7Gcie4E%<Du4=A^vvrNo&lyzC zHv(TUsr-5?DnV2@Pa9;vh`9RZs-33|wO?ug8Z;j&<uX9^+{u}*jkN#P0CZ};Hn7hX zfVgsO9kJA3HN%!TUNgh!f_m+KN4Q>k3f|B{ZQSEoRQgdk_MbXkZ$$A%BZ`02QKStE zv`%gQG{cr&`wL+%O*9<;s_EteE&joq05e<N^$Y9cc5sZ&4B-m=4ZOxU?rQTN_jp5X zVjAsD&X=@Iy9<%^owwaW^bOXXb@V9lA-^CRw@~Y8mjJIvML!>Emm7e57ikH0j|QpJ z7hx3kbjK<h=!aJ?Cc!}7wn!UcR}fd%>nQwX<gYfMkovMV%C5Onpo*74R5S*K+Ulh| zY_ZnOZUaWWZIZrN>!Hs;Z2I9y=f=faPsz^<ILzbvBHYZ^#>sej=BWa$wV$^cT|Y)I zFVG_W>?RnVHFN_kHxu*+Qg!tKyiQ_RlLL(#jU|jJ@vlyr5f9sOh7HpQeg$#N5-n=5 zF9^8zKR<-Iqxr+HYXLXHD&i2OOG9%!)VH4RQjBM~eq*T?Ee8tvF;;G2Zvl*YR^<VM z#=N4X+JgYE?>;wQ;Th>G8Wz|Z!yWbzfa+>MnaeO9Bo%5SI<^Gdz2Kn;Gi$l<VGYQz zso1#{Ky_s`>*FrDt=;2EuZzQ|OSoB=Ho$05mn?hR2Kn4X&FvA5L7}>4YzJ_IT1@TO z9w7G$bU@guK%_gB%|)6ICP+@`?F7j$3Q-NkD08_M>(|i)*Nac-axKHJlL@XbxbLgL zj{X;RD!}#_fa|0Q`_|exduM>^<baI%$ZJ}dUl+jZD#ZMxRJ>nGqh5ok52qEc;TnQi zpwzLP_Phq}#5Dlj1nADL?jW~@VF_jvhQ}H<M7UjV18#ly$t>1_@U~WYF|5(<hIhN+ z;ffIe?LFK{vo^vT(c`fg;8>xB+j};kmApcWm+usXmtV#kh!1-hmvr<JbT_1!4z9o~ zJ)Tai&>Zc1Bbj@v^+A}6b{G75K83%oMRraAsE+Su%_4znY5zpT*Yk&M%&tu7?*Buw zd;XQoupZ95u04x)!7|@~Uh4;(`i8_n5^L|@0CeaL4Dka1sxNa?3DyR1=U)kCE`unn z6x`BEwE$d!g6GJPd(CWlpR)jtOU}hjGNP0JBl<og`u_ijPN5T}S_xhg%UOvA8v?BQ z_SG+6d;p+2CQ{W(EloFe*}%4pU9h%JLWVX#*DtIX_HWRG{{{{J7f4Do3N->T^@S>U z(mRMER>2m1r~!QRDp&;%15~fpmaozh<dM)Gcn37lG6B*Xr1D*@MYgi$*0-w9BSsk> zbx&3F8`LGO)&lGq0M|2T%WCwnOm|GWv|1Zzf2;wh-&?S{9tVh(NWHdL{uai*QSO*d z@iz31UOMi7JPF|b$obXh*?kRGwzg9G8q6I>BXyLC#cjgU@dRLODGtUZO<IEON%tUz zp|x6+ZA=|3buCtf@N(Q*E!6KRK%-1zY<WCQ>(@ds$5GW<?cCt;h^;F`qprnS*L5od z+(m^c{SRra_ynityIOO}{tRICZH!h4@)`wHu0fWd35wL3My*3%*iX~eX@!2rF1cJW zh~upIcY(szYguis0^Iqs%k=`B|8Fi=Adcm}4EG+~w{RNeReA)`?)BOrr5jEGFCpLe zwByY_#^W`(i8ws$y5{`jJ*~Cmm5mayo~gk4HD8%{XPMRs?~2q^c}G)znYJ7Y`q>*X zoDM9<>RB<BmSgapKo#ZSQ8Aq=*Ji`eAG<+cb*<W<t!l%IO>6|RR^VCDOt|52e2|<M zwu))#2UrO$rb{1aV?r34wR;;lmJv?D%~<S2rX&GPe5mIX^P#p=o(LHaw&5twW-Kz| z0>RBXp%t4^q+;5>8EYiP<mtp}T`@%kcty}uCzg8?n$VZ6yj#-1En0U(<ZRLA>DhWB z8<sV0BCAP?DQqj&LKBL5z(Cx#Rja}h-=dGSzVNC(LT0+xgGOz`^05BgjjI2_wMe@e zfMrmAk;%198>{eFX=SQN!1~z8hdqL6-FB^?Z4y|`m8+$y%Xmx1=VL6(Podr)V|}-l z3O?4b)8q`>p{2+Oj<3*;>r|w|?1d4yhzTPD-r(7#MYpnM%3SaPaLip5PCrpV+jnW* zx`rXhEY)*EQ5co$%1XGu>AT}#3H1{#sC@$v(5z(KmfSVj52eyjFJn;<ZMY8`&?TQ} z)4*8$IbpY!14eA$tv87gy$g1^&mJs_VtslKmc4aUY~alI#Cs^8YS<v75ua)q@UVk~ z8}~ki{4b#MpMoE?H0?89(RP-8#?pXSA;Y~ex7(+M<2i4izAjs}&&rG6Q$&_Q)OWwO z0?#%3v2kIFa_#}FD^IR#fbxm{4r99SaS%;+fuas-(Y7gd@#zP(V%xJ;u;`E$s~?Mb zfVv;j`pSH6<4+k^j2wc=UxI%jd@SVwlS>c6uWyfvLs;Wxall`b2&(aiS})6$gN@r& z4t}l$P=1(~uya$@qm|~$k#!hRh9FQ?m{({URu>j79{>GJ-M>I@d>Xr%*i7)EtMF`7 zQ4`iN(`Z;Fq`4I>uLRD}qAIO8fYoyVTr?ba+#YzVg0fzK(C)0l8hRQXs?t(gZN`fc z(Rjfk5pES6-vh)c_~%JIztkdH?FESYFcV}!W4}2Z4^+OdEDI`(T!wA6uLA_G2q;bT z2;wX3b~g{gd-qjHPCgq0L}xw%+5(P$oHhcEUp<+Q3b2;qZ;0`aIe-naue2cEc<Z{9 z-<J7GTaSBuZ+?ZXA2h!2H>l_Wnsx*-P#22(TB~jlN}#Mq@H$lSHxOHQtXSv5qZ(ea zFQ$TT!71Gfa{7D+6=DWx<Z%d&o$`*O`y%NHY^5~z5`Xj!DolCBo7SDsM&wR`uHzr~ zDywrcjH|?B48ypQW}vR_;h6}tg0kXs5VmwC<3EQm^V^Dl9%1IW70yK%JvX-wkOu%a z4!k<pEEC4&gO%_F6UL2d!DgE<s}fv*IVQ}#&@Y;>`hr7R=9)nF($6zt?lqY2jQIgt zAN)+M#z_7D$jh$5PE2D=07EJ5M=dIs2O74At$Hjlv+d#rd&z{wy1^EjusAo^A`{lt z4fe7LyUh)@*o0xHqMrHrCa}93Vu1-`tHCPZ5);M@wqUQAFxK=Itk8sUkFa1%O&Iqa zhWR(4=YG<<Kw2}WHjSm@KWPEE%S@a^w{%4&>~1$0nXr4@V9QMyj|o<uubMC(!7bQp zCX9z13s!8voX?!p`pCDl&BUVA7H&M;X=ot5Z=<;^8AbyARUXcb;}V=TKXV^n;S4^F zF#<#A>ROF&X6$|j7Je}uIivU3-e)z3KF}kH{!$au;e41zF|9Zc(a1lmjYq<pXE7}0 zIOER21A+f@O5St~y8zLgLdh4j>j?GxRZH_@A+tJ$kxRHs1o;g{hWx8DZYXb!Et3BF z6=NT)n2XrgDyF=DL{K0Tu!eU|VGvpW56p<27d5^#IduRAU&D^NdQn$7ahJ4_fv=-- z+-m$A3&#oVRC);&dV`K!!a`1oAn6MnV|HBD2I2Mlv6r=O`f1@dRC-w(sNcO1j6^JM zD?!Y%h_+%9VB8yS#lDGH?!cS{_85Kxm-#fV6}`$mG0zJedT|qJ#c$YME-AXA7328u ziYpk_6KT&C6flu)T+t#rCPELgR${tC;XqSY|IARXl9lIB@*NuxbSLM>e6W(S^5H4t zHMrq$*5r3J%EKcEljHvNmUHP<Y~9Ll3+fu=*_zUR*HU#xM9})*wQgQ(O#EGKsn0{W zyHdLj>t+h&UB~2q3T`68Ch!Gk+zsr|>lQ&*y7`9|(Lcvcy;yS{*6o%`<P!0-1jiM0 z$L9(%YzmG36U>=X^cQw-rZ{u{Lh~ZaEjKw!${a1?Y2M#3No#4uKiWCJwJ0bjwYtR= z%J$%8O_#RTDA}@L5iPy5te+UDUuzFkJsWN;AF60(b1d5?qNFLyPKkM-KVA|pyMEXL zc-&1Ss%n9k2z<6{zIX@STPUbblhITj6VNKmLuV(q2s{4Ol|rLgPd06dE2Sz%BQ=&R z18ANs(*2klY;v<6Flw8aEF9=L0Ujbr-wx!;aK;w@ST~@KP1=*M!zaR7;vwcRKiVnc zs2}r>TeO~cshV(5v?|)+OiijPMgen^D!@)cOkV((YGTZ-)5X(3A$)-{LWs0LchYsW zqCG<FZq*t&awl#N$MV$zj&+;fqO{s35^!eZlueX?)*LSp|F244peiqL8#y%<d=6qh zy!P%okaOT6nC*H?PPm@lg_%P`3loy?x_46{Zb3KLTkyfKVcsIP{`dr1StQX>Z_z!3 z4JZ~si@{d^E~R#Mq?|&TcCqRfbi@77iqXx)`2ULA*-WfJh0=Y{m^qZ=BSQZZ(??7L zW=~&{@Lwn;z9J4NRsV_7S8~v3KN0&Fo67uSCjEc%OjrFxByLR(^A|~jc_`umo28w7 z7EvDkxw#@tp9P!4;ik`%sc1On`p<Z~nM;a8fc|LsGE4(RD7>2p`Ek=&)(<1qQt#%X z+y4(WtZFWjbk&D@&H_Y|-@7P?Wv_8T&QMMOiaCXr2Y?l2xcv%9{P7U($6RgJr|T#z zP|TK^Q)wVNV0Dk?-i402xEtnPEsDxEV`9UqF9vQjT+_m;X%U5K?*-7B&0fA8If_{c z&9AdI5kAvqHU_~Z!trlpVO3;g;lcO3ZHyTOC)4&o(PIcBa|g7f*<HzS`>?e0kJ)Rr z9i}%f&VbvL+lOiVXl@?XQdkQy#<m`e(91xJT8LcS-|rnH21@VKuplwjWEftsN&-v5 zf+5U}SyJX49}K>A#+1nwZsx%1f=j_<gW<SjTmp6s3!(BrEZL+ihN9IK0wvBv&$}2R z_<Yrk5YeN3IZCBB3z)#t&jQCB<m5cx<hUs`tR+5E(SkBp;J_TU6nIg9O5eeG$=xkQ zTwowjxX!Fnyv#Z$kO&n$8btk!m;ad>^hu}~XWL-1BalkNP^Riok%u>)Gs8p=+eR}A z%^xP#nY>ADB~omgtkTljR>GlcRW2kKnp?ss?1@%-Z}4sn_LkAG)+o9^O=~SC!9qFT zS~zSUn)LlBz#(?pHk&~oDhNkOt~f+$EABr0W81;%r&u2|I8WJOBGTq`Pqx#x#SG$O zTuddajaX~jYQmaQcw1!jkr}iZD6Y0*`JF7p{ObqDQk%vBj04=!EyvBwj(>gOxSDo4 z6d|H@-h|Ul>#+^4WX4iOXb{%is_*jiwzI%<7V&T|QFc4g(5~8s60ra=#jTWA6&U%H zWp*(?xlnp$Xxd;r-vPHBNth#g5=hKgJhy}6f!taq{unr{p}4Tzi<l0l-2u4OPP&x` z*=#R-AKMAI)!TSInQ5{t<FRfq<`I;C3}*r5GVqUaxhx#-37_LRuZjkFRkRn8x$Y=j zjQ>iy3rVf1ta~-Xk%qHi4fP3dxQbTR+&(OZ9ClY2T$J6wh2N~n9z4|Xj<D};Y_EOl zMhjOHj|m8}an0Efo$g%TL9FwDy6o3UjD!JK+6m$e%W6-wn1qYo!5^ym6=x3}7~Uu& zMjS$1OlL6_DS(Q5f$)Y5o$M^O0KTG&DDKa*fml%H!j6LD0<*MR6+o~K=KjnTw<<WD za$-ef8*T<JB(GDogU`*)Fi4Beqt9qhtmuI&c5lX_&;b-4hv6LGD~c0AHmifRq)Usv zf@o%(NVl;F@IG`~O6&^rp_X#Gif+<*D(4WE=?0=cg<}P-@xKi=<~}NaNJJNAy(S71 zVsI(YZDJ6R&ff;RY(K?ygRVS4$=$?IQ-7@PCi=E<mjG6XSiz_}4q}+FP%}8lxyBcF z>vb2wdfFybeiR%Y(_O?2J_t@R$IhV2+(yii2jQ3yi^ZY;h_`yi=T<zO=q}EI8T)R> zSb$UCcR*)k+#$MK&+F=*lK}GViRivP^l1G#-|hK$-E%z5oaCM&1Gl1uFT$&#dwUAp z4d?8Ar#Q|=Zg4zw;1uVgcr*%idseh7jNL4p7ki6z8L`O;A`AL*dxA*nXtfRtE9(bt zSxZn*bA6oF!xWc@?8>Mh5oRh3(L^!ETvyB-Dg~*!2n*V98Xp?Sx?2PTbN<~T$yPVG zVXG7Op=a1|zq`*p!Z^MijttrsrcR1*rraZ9B-AOVuZWkY3%dMUvldj@SG3c`hr3@} z%A4;MN+qF9@e!527}lm!Tt5iSbQ;|cLNgs_qIK^CCM@O~XpYZu#5k$H7^csxEwSg? zlu~(rk#Y;L?*Lfe#Z*23LRE}=Lm{vy2Z(^Wg#b3JS?^dUi?C!jP-N*7?=ApG!0{3e z=TS>b2V#&nq*<z@@Y_T*B@EJKmjzs^(m@X~$1PRKU6y~A{mzoht-^GzxeDVjyaOB$ ziTvaI7|u9W*TvGnU^Eq$1_q-uV(VovtgvF*HyG2pV&~Pt0-N>N??@83(HzN|Qs#!{ z5%gD*=>9MB8a>&VY-J{kgg_k|DVPs+lP%hm3{?b;bf4I3TY#dl78yVlk2E#b8*uXc zei5yU1E)d9@9Py>7&{Qx<=!tADWd>uipxIGC9iL2=G&et#QAV<;(XZhU`APRT}M#? z<KykdFbYZ$i~K`?zzMi<n1gMa(1f<QRz1PfTk!3pz3s4wCPM(T-nZj=uLC{-ik<|Y z-V~7`%uoJtHe5uui;Qea_Xh+8viMlG&nDCMxj??D=&q~w2L$VPlz0HAz>0&?;4~dx zNem^|c^O|IDayf}PO&poZ$B<&2@rYQ=lq%$?Z?$xB~H9>fBkn~Ebga@WL}w`buVnO z!>M8f#dg3tbGIQP%+6zuwaA0(vp&XUWS}W%T?a4kR<D96TLLTyTw2y#yUY@m(b6Fz z!oJ1~>U1b?9?DcbL<9$Z35CVU`ooQdV^-&o_XDCZ@T>odN+Q<-VjpBYJWY(EtV#H2 zLc%bNOi1^j7^t^4^8mNrJmZIRo7jMhjR*hfK`{b%Y@<g+>IcV+tip#27jzg%1+ir6 z+lDDG+Y>3{HgxwRR5}7ZJBMmVpo>nS`42&yzvhu43D*(dd<e?PkJ29&`TAI?(50@h z4ZksZUD8Mq28A?sq!=ZaNhGO0E$HM(T}j;>soRb@OTDq7Gap|t8J8}?k;|fV9iI1y z7)YUyh|x%n=VEwak76lI_mZ5hM@1M8={v(7Ll-l&ViJwK&)3&B%j7c5=f}lSL}ASb z7Y2?JRapPQVoY;Me>Da6;(qkH>KCA?297}~bEx78^xE2@CsF)jihEL&!K--^`l6Ns z#)uRHqlfK%GXpnFyytlmCr~}ciURp4&V<bH>d=Z?nbjw21s<^j;H;6nD;*mvBJ|$Q z0%<9Z1oD1LT){%p)B5Z!>}eF?0zO2D)+wVy<HS&X%Gqde7%w6k>iTG!Hy-tw?p!@y zTx8zp3|RM!C;*k-St2x-hXx2%eZF{h@9!)XjDtTNrv?1RFqZYku;50p_6T#&<Wc(= zGUSd8sifDw2=qf)YO_SdUH|X$A-|9DUPf%B7Dl<*LMY!N7kn(rh3&|7*_cCN?wc)& zTl3VP3&NHUGy5SpZVxWlcMz)Yd|UhRdZha}jQ6J|Kpx8I!~_wm=sJnKC-PKzX`r`X z6jE{rvs$zr4Voy1!VX(85#7Qtz@+I#lSC!@Xw@WB0kc+%ptuW|*5xk3OE+bQRq+UG zTmG>MutvAK!5c6K919X>H_-ICpzOFp+zRJWcqSeW$3Fj9#kHr>19A}2WUK{tn+%H% zx57_Ghs93sWDzZ&mubj;8@{ML8H3|_8Z<?unC4jAP28L3^C~_ow{waR@^Nh7&+%%j zf5YJfU78{y<?kWqcSyK+$}OszwL+wG_OnQWJQht8#}&47aL5~XK$0uU2Ny%O!uIj1 z=^{Yk9uh(|e|o~S{uFw&dO8%ql%g3TQjZFv%!g%%{+=(^0%ySHoI*<t@7N5H5W>m1 z5hLMvIJP8m3dPM7{QBOpnP@o1YC(B_X?-arNA$L_oU`+w@>AH+&2NpjOj7dsHU0C7 zaOUTTObHkJUwRHbFqFKX*QdF?pGT;SMm#U#Z{wEXACHaW;U>V1g|qqs9`!he-2wNb zaXO?hex5H~d0vEv41)UL0`MTgzdi_a(?e`MTZHCv>oF}ZH*ci6qjqYP)Q&I@m@FMk zjx|FqmH@0U7xgoQ-DzxY6kgdd?B8TjLqL<~3s=l@NF%5wS4;}&h)AxPyVFZc<MYJA z+~2TV#xo2q3};@0FpH@bKHMn$8N${q(875SF!usaN0=*V#b+bj)Ga*Hj7O#EY=3XN ze}_f{g8!x^r@dRqUZ(%oO(T5H^p6{U>Om|paf|&V3=0U4dJFTsgX?>%7G@atJ^r<U z<1p`m1jCU__2AEP;<egn+_qf$f(Yuf5P5LnnJHXxRx4aFR!$Efj$4i=1nx}XxB$f2 zi#*ULD~EWAJGpB!N(3AyXYuFFedZJM-y&i0iG`{u;+tVNpPYyBZfx$%rrv&>6k^uo z8!UJ+IWH==^IFzy;oFL}%^N1%U7qFuW-kn17Sz5SFgO*PZ!vJ(;GAmvahD689v47~ z%j`k-asJ(r(7j!w8-*hf=8U*wx#NX2!t<llIU=Z++6eqN?r&sczH##30Cy*M<_}sq zN3^)}heq(P5oWe=dUp~2%%sb_;u>zDOUS+po3C7XZb0@qn*CVQ?`p!By@zg4n{8e# z+w8>EN>+<7DJR12ti{J3UKBwg2i*9_0~eEK5gSIOFN%o!&f=~~PQ|%d)Hpidyn~XN zz)3iVY{0nkR`cMo$$%3s*C_Zb>L<x}F19EK&c=nkI4$qp<}Lu4a3UNhV!})y4T+TR zT`mb%PQv>0rhRio#GO0w0V?Jdr|4|@eN3N6H7*7>{lma>Z-Z8p`L*n5dkx3g+`;D? zg->0hKJ!G&@NXNzzeJcjB}+eZf<hG~tn&^)xghAhdW<{ejg2U*ql$Uh@8Az=xuX@) zd4O|YY6PBTQs%tc!nr4z(g=6FiOXzZTrQEt)KolMjoHV<V>U64TU>4vA2Tx1jJzMd zmGFC<1LOpEn{g>_ac`M%tbr^Mc;*(cD8MWYWXU?Ww3iMiWr6U&^DK@dx>s}$!pwBe zJJO`jX;w7C!%)2dtW9kM#yw>VV5xi23d9C-p_$MlCLvZEc<UZf_$);20<2^OllM!) zA%A(9I=>{^=DvXgldOZ8UHs$3QE--Ev#|dS8HJ~d1ji48W8caw6VJ>Q&TJ&;adTQ+ znu3Mrrf%WK5O%A5Zj-(MFtK~xkUE*LA%Jn*<7OPQ<?uyA8@m@!LkB`sgW>uW6VEEh zGYGq7+@zl#&NWKPi6a{&2yB$#)n6MD7>6(yjx`DUJVLS0Ca_gF9${LVg|iCc>rQ7d z5U$|XZugRHGQ$=Tpfni)B20jPC5UfqoHV;YL-zT%@PGS!Ls~iKNm?Y@hGZih7jByA z&oKSx=uoxXEtj+MhGW@H`oZPuhkHR)YypjidmnD$PcGL0yiZ1OL8tKHJh-)R-@&n3 zaBpE1Mc}NM9{UsFxSIUqFc*cxRyx2^bYqW!RvizWGl*Dx(Y5+5U~if*CT21C<#W{a zWziyc{4L@}+yd6`7O*(LECoEpq|MUT3UFVyynet}2(2;#++;h#+%~8beb>v!E|;C9 zuU{7T$n(!q$YRl}83ax*C=+|?EIqbZ+!LaiiL3_a%FbZUQjNDqG+iIB`Q~;q({V*# z!zU2UO!NljiZi|QxYd?hg1NjB&VtV~Z@aB)bho$=w>XP|C(WB~XPLBSqcV>!61E|X zz#{#HiNNZLGvi9JzZ}lO=?9#~QhJ-2F3QAzf>H}akZzfu|HWwVj%L)8re9+ER(*KX zd&$IQo^ZBfOn;&2FE)KE?J6_;7JM!qn+`#s!4isau0Epg#6`R&Ko74$*izx#Ao&P$ z_h14Xo{F%$BxE4WYTSzNk1!X`T{1hFur~o83&-*8o6xla(Gqs7?-JN3HWOtvq7vZv z$7pX+MVUv?6KnCvIdCgfLPXqUudGqn4`EA8Hkj#HOpc-xv$Enng9!L-;5Z9Qf%SW3 z89r%r01J01f7nD}>@q=n&v^UZ{kDm>+w|Wt{Vda;VERte-)j2Yf0+Kb!ujnSHl9p! zXdf03<RHIrGgxl=n<%@NPY^x`Rlt`NZ~Otrf(L%&hh3BJP@bS(ErM<RP0ap<;q8KK z!_Ck`e5tW5!wjWU#YcXQAzW+DtHAVMG5s~BztQw9K_N5zs_Cz26#o`wJ`w1!Eiu6# zQQl#%Alv6=@BpPg8HmH*PX-3#gC3<%1_s%FGNV?J?*{=v_q}HZE#GB^S=jrT&n(P+ z&F7{NG`4XbhvOelTbZkO!kuzfEfsrtF<?1iH6?+@`!;vb!JfFhbvN-QcToz~hI3=} z+emsY=N$xR-g2x%noHx^2eCXmvWK6y%I$8w5>Wjr7PD|0$!l0qPr$om;<S!#qr8W- zARQCej$9sw9g%It`c677KEX{##&susSBQQ3!KxOZXh~Qgg}pA)ynaSM7zS`y3*)7V zkSwL8{TBea&oM5xRI`*w`)PpK&^AE0P9xS{3lR4_1H_-FrIa`D`Q0;sa}PD(d2fhl z``Le|KGz_1d6p7tKM#<#9)!zTOJEh@j+YW_EM1^!C87}DmiI0d3-L9-<)yI6FHuD) zP%cyIO1v(<a|XWX?z2)P;w$q2jFhhk<MZF!-V{A41)q91zV|)~CF7aERWmyJO_7Xj zroD+RlcDe6>*By4B>hgFt3;Z7y&efyC9M)m<r@}cwMfOs{KD5_QND1sNXN%9F0IBo z(_fVO7S2uGq~y1;vDox&l;>}LUL*e_XvlngN~7r-u~u@?rZpl~ZepXK*WmNhl8wK& z{(vmoXv$jAR`#$_*LMY8A9+`V;lu4%`SsK>I`GHX1x36g;$+2U)NkB7qNl8y3HH7t z+R0jd>Tp@;f%|2fjb^<o9+$mr)N#G&MUHhMSZ->gJJ*SKWp9*Y9Y#aD9{G&i%to)S z2i(U-{ofN$f<Nou6RYrruhjRkI*bYF`&brCc}@wirJL-;Wr6P-hif)~ky&Lp-4;NZ zAK)ZlB|iu9b1W6l!I#(L%fVor``}1Mq$`_IOINu_q@hj`M_C(iv<e6BH(*_{C8GtA z#|I*vBDRPq%AJKzY(7q@TSO22nXZ3;MZQ)Pz7fl1tr<IkieJD7DU&`xKX4cTpV|0O zYq;^8foGb!NyNx)Y(|4@+a#9a_*CkLVx}Bn!qPV2CatL-LUN)vgHAiV!GnsoudBE> zm2AdAybe^p8Tm#s=}_`<ihj6)IdKDOIvX{?*Z2UBCf5Xf-n*0Ab2Mdc0X$_3NW}2- zB&oCW$QFSs(z?)ztyor#rMQo<03SzrAE6(2<q$TMJ_7yQsQWfZeK!M?wM~q^yE{f3 z?yl^3dY%Rs38%vGg75ABhxj`vU^_DFL8G_hI6zOT*p5SqcT&5LkxwsL@iD44>SNIp z?|b5Tl+?Ru2U?~NCGWriq`N?yRk^@zq#{UPE={0gJJ1snsbVJzow8G8<Gb^Cj>gye z&hJD<eW`Z^WThWfRG_N;DPR}0-~dYBCC1=w%RRf$(+AOrPehhH*hYQ!<C~{5=b_OO zmMJm#HanI~@1?}u&;v>A4YhM`PDU|U7d6A(qR2GANWuJmDY{C=9+6Di0rczLdyw)u zs`vucaq;v06#gl4OriOoqN1s^9-%fvK*$e-eBqdvgW<yA*uG(2;=P*Bu%$heR)2;< z52N#+A?<_YyBCy()3m*q@}+SIug>fh!)Rb7<f!>RktaW7c2~y%EHOLxK{_7Bh78ss zeD*^MM)GqOf1Yo@m?}R~kGmEhfY^5c0+K<!4}vk7RCQ1+lpixOO1{9C;AS4edDF*> zJ_mtOl>IpxXEbg990huUy>68D1=Pip^(jm?bi)O(SHD0DjHN-9z<!F#D^aJX=|&~$ zG>*cmz>o2b_`$0k;cyl|{zt2;#5jC!&-Y8Hy)0V(C3Nw;qp0=4FGZp}!OS({EA-M@ zO8yE`Fp;)@iF%iO1(BL$JiESvj+o4evD>hQzf<!)7HGyC1_q9t97e^SCEp|1be~Fz zN0D~Y5wzbl21V1(Bl?Nhsw0rO85H+5By=XnM3D1q^p_k44W*QCL_hgC=)!eS!Rx*e zz44*F+HXV}MShR6rW{31c?RvWqtMy2=+aS)JEpi~Y=fp_^NvOB1<E{zs?Mg`V^E26 z@Zo4M?L|ud4xF4zrQZpM-V5d#kogQ5h}U~+ze6INmO2jJE~KdMQ43d@67I#89+O>U za_X<+IG$i~>SY7ZF+*ubB_~kj#Z++uEtSvkjZy)f_#QjqODMGlGM)8<7>32yOFw~! z^Cp6aSAGCf3po<6EX_w>DA@=#xRe2rG_xAy@XZU3+*ytN$s*&qaxFd@Om2x1YQWy* z3>YWBst-cgCa!@%zh*LX+>baxQcR^kLO~|b5%#e5`y)1hj$!SbjR4#%_7mFfb(;1Q ziu(o^(PS-J+li8<oy10N3AH-~Nh+m+Q;_qO)b3|sy-5YXpf64OS?rNkQO{qX3|BKK z0pH!O`UTzMZR&R#N^1?3o`&47rSqr7Ong;uY%O*Y-=*L)ptz3aoPh+br>kf5Ba)NP zihLZA^gM^clu^z(oMS1c5$93v=V;M+G!|}z*ow0`CA$<MZ?MsQpD3LuHU=+G9^ZxU z0DoXW>b?=Yk;Y%ZP`*hA--a*iRb2q7&AKN$G3tJz+<_13W&a8mz?iy-=1KS!S4ui| zD*|87tNB%Q^Wzx>I-0(K##&|@;~Cm?J3q$X&MRE}YYWHX@-fisj4YU=V*z7P;)z7P z=~jMG#CF~R)TRLI_Lzy<0b#2P?{tsHSwAJVbA>zT7D;xw#~VpLaR=QZ$!_;}Bgr0j z&@GaD>K<<-`OF=3izIv9<BcTy+(EZUvfn-4NOHg(bc-Yh-Q%g?3|`<(c}T-x^Bc_H zLx`+z0sVdZ&l`YXPdg~96%Hqi9A@{{@51;32z91((G?MDuLQ)+-cIxj(h;i~P|}Hi z`ESry{{|gy2*Pnds=guu>_-5vlOtS-6m9>y5hQ|KX?CIK{!OE(X#3Gd5X^M0igtd- z0M@MnOYDlS;W)^*fYu2j#a$Cg_V3)&6RwEE(UfZ<#(o^|I)>1(Yv{&Poc(?mxFhfc zqIkygPZs^X)~hX5=X?7)5B?#B@tiCCCb|vxCVT`i*)ym;cL%0pRZ)*Zn7fhHNO;-z z3v2@YU#xw5T$RPve|rPMbJ?;%ZUPF3iUta$g{B6Erltj^si`HUrKKLJG&Si!X{l*R zVJr(vOgmaya?0A8mX>z1qa|InH%lr@Oid~)J5v0<-`RUM8?^VlfBg1`;d$n^X3bh_ z)~uOlF3TFwTVUJLhd2!8cmqt-O6mCrv;o#;VQZ9>{{cI&Qr7>0ZU%e3|K!pp>G>y= z&VSnx#f4EP{)A3Ykhm}ko2p<^HHKA19Kn!>rUvn0`@|xzyUc{gGmVuv{&AndqB0yt z(qC-1Ds&huext+4C-5L6wrvjp$tEC7rUc=s>0K#1T}F}&bs7aoy3%P7of@ak$Sv{% zf{biDii3<@YPnkT>;=IFmv$8e8+mwa4mR%cC(?whlwKjmxbp<B4KdO?X&pz^!x`y7 zESn&l4l#1NYUDN7=;zp)RO0VqIB&-SMUBfZ=Gt)~q$HL}w=zzt*Lcr@Py+|VV?S(| zu?>%5hA|J1J%*9ritvmJWc8`Y80lde+)!I>8l&+Dvy6#&OtTD9q|7qL!GJhn8QeIV zYr_ZH*(z?QZDgWbueXiSAzXwOR9?Cc!aLq_s}J~IcE~c9k?bc(GhS>^Xqr;g8a%}6 zgw_C_BXQvd2lxZR4ay11!10YK_<C6xZg5ZC=5S*n9(~<Lw!uoY1tB_1?h*`iHXSo< zS?4x-0pVJ=aTk&)QJxxMRO3A{(&&Rn?bld|F(c9l!~2{_#qa7!B}5I8MuPJTL!Eh? zqC}CE0(@f48Ol*`2vSz?mr~G1VK}Fa(WethABUI}Un*in4(s|dK3)#CF?y&vCx|=B z7<W-P+Ge05vpJfa3a7&>1Kz_uE29i7*TPY$(MD>-cIaiIGart>YN?Ah(j#6#F#i0j z%qt%+aK}oY7=vxQG)BpARg96KWQ+!WDjer;n2BoTULSxwyn9<@O{5v?IU55p0oi<V zE2VL0oQI`0PBn*)ZB=_3)7JPI*7UG=BXbn1f*PtdZfxP49@AuG&&xQL$H4~4O!AUw zbOYcR$M9%4;=)e97B=EQSBxBgtBtGV5AQtal?Z3vEI6hg1V{MS!KK52_DcJayo8ei zr`d~FRTjetBMFW$m`*c~&6YT@?Ga`S+(fwHQ}9nas#vY>nVA)4A<Ucz$IP5C<A{_$ zw)b4V;Kz!x(m_&YL;WA_f|Ig#B^blNFL$Cr{W~U65qV{zvC#RIQU2!S7zy8pqZ$Ua zGpgFL8SqD%>3Vd;yHYO_+}>E#mRKai5etnOvxQYWVkUSFv^O?WPb^JV?YcS{LIypN zY~(mAamsa<Xk0#?V(>Pc+!VASeAi1sLM*mRF$SrwCPH@J4f{K^gE0lGU5h#xSa3&? zH$96|ja?44W02EYnu4q>u~RGDWlATdT();IW&>!?&c<Z5C$ghdbq0LZ$fe4OJ}LJ4 za115Wj5uF>R+^FRd!3dBT?EaPhGvgLvAP%~O7V3y5)itvD^|-D%lHe8y*{)u(h-59 zQ3huiYpC8bj7(==r=)Z<E|fvt40p7~mNG;6WIKt+VcSNf^G{4OzF@>lYIoy|^J{}g zT6d6~Ok<{E1Qj!xKtbV?KP7CQnoOflP&DtBp?uJ?Atwkp!IRtrx;KJxl%XhJc%m%o zY3#ZVy}kN$my9Q6nfPeSKv5ZfQkFC78YIC6QX5`X6hSK)k&H{AS@(~@JxSKD2F{PT z4pU%+%->^Db%~L#)*jQ#47wx23hPUhy3V-NnA+A44k?rb<H@3<r20}Y?6-6i8)hyw z!nzT%2Ezo}&o-vp8lQ}dl&Ea<L2YDCHl(eMY|b_&xG2FS1p7`y3YMGR4cKf(gxl18 z4(nx9g6Gw*Q-~{i8)qR?4ZRI4c9n+9jKhfX+Bd(M9m`kc;M}jihOLYXa)h9?%?WAm z3uPH0g?-UWU^2TeG#t)7>8rY_F8z%8USX2zenzbCwJ_7^J#GanXZsnMzR=_wV3w#J z65y$w$VC>V6od@BT=##evh8w%yTEELS4FyS1QC;R49w*G#|Vp{f+FMjqnwzs^i!Bo zlXHxjjwsKe9H?GAYx)}-9BQQ;l^~1JL}qc`oyVRHd1%l7Ez#KlMwcKo=#GP-eb7v% z3{j*FzRE~dHH-6PTxE>l!5gK+(84M`Sy#i*P*L%o`fHF_y(dapfzhWOMU|Q`6^`9a z5S&&59Xxdf#zdO0!$zovTs(qSh^Kah;bB8wah>rw9y3Q7f`^SmQV_XdG<>T4M@aJZ zM(jE5ZzxLOPqjZ8dA%}!YOYs0;l%YyvGyEGmFF2V7EHyd0-MKq``3Nrjr{)`^9pVN z9A&(Kc{dn5$9#_p@_>1t2Ltwrn_;mK`AMou2PYY4gM6PZxUpMS#m3ljcyp-R)8;lK z%c%}!(qhdfeIFdPNjEsJN}n_pCQ_xRj1K_bKFye?)MPKIjkh2$*YXtY>Bh8X4Oq7j zG~nsp2K+bD!?XTx#{LjsJ!hs;{wrrHt7i91BU`l!jfu{VE@_sr45e1hGIC<5oH-xH zR>_|261XE6@NbK3F9#wbF$Fdf_cZ5p!@i%KyJ5fOc*fjq;1~#;Mm3vt5ceG8WjuDz zQHEvmTxCRzoNI8zuzaq<Xv<t<GJMJRDD!RnJ<2@Yd5=QVJ<muo*zb8+3~vv$qdFQv zon_}`SUi{M##;WV^S~KcllL@BUWMeSdC`GzjCbZ4QL4gPrRin1n<T2(n4oH^qu4pH zK&)=>Kbm)+78`ayl0vHxtt<n>v^Bx7K<($nysp?-)r?(JbQ!YpUXTGJw0o6ZeBxds zLE%XSz{X8jUKojg2id-r@qeeX^NcSs_Od~BxnEIn*!_xNGw(-710{C9QKFzwoivA1 zIA67~GxJr8`*;C}kJ+mSlrQc<be9mg2f;)2z!+|!F+d4lAE__Lvg2I~4PGCSya=i` zr(&@}z2jnlL>pObtiogbLui1Iw}$`(nl2W*eiD`#D^%<419aGJ@y81K3F)a>!X6vL z$fc}~$Nezi!(0Cd8W%P|ykI1F%9k128CLM9QPPg41xdqBg?cj+jz2G{PCQB_;0b$- z!dUECUXC`<jQqM2P~9EwVakCRt7}kBJr#kIW1nC{_w0GXm_ZWvT4|*IMPn&iNyRA1 zPpMIhw^Q=$d<sU9k7({3d<$K*%HVlzXI6oM09U2PE*q<imz9mKiQ@2~&#sU^@~sKa zMXOcjJ*#0%;lPt;4DUuMEt1+`K*N28=9cI5Ge#a&cP=(eOa8M4NBb+DWyA9vd=@DH zBx9XwqiXO!W1Znf3XI#QBId+8ul8JTq$<8arWHD*G~YF<(0c1t%^TJmX^KSJuxd)t z>p3+f8S@;+VxF?+42v{fxj|WjOE(#rlDE;=11^EdIx1W8HyM4A4Dm<L;WcLf`1A6* ztXlDUV>M(KPzqi$Qd>3SwI)p<uaoY?k)S)aunbSb7UQTxsTB_EI!M*4L9w2oZN_@i zXyf+3<UK5reChGJcW|xD5h?o<a{A5d#u(>cU{J7Awa@iCF)e|u<U7&vqV>J0CMlM_ zX^7ezr+La2LQ}$9Pg*N-xDOU1WUmg6lG$$=8^N%SyNq=Jv2Pd0>Yj#O##vJL%)h|l z#hzjB80(xE!Xr4r6aH^wP7vZ2y$4;qSP+-#Y4g638|3&-Mt%V8F-wX+Fg^m0U_g~P zoJaAY@aNW@Wx~!@=x&yqVaQZ_6b4JeET`?s{1`j~@y>jLAq$|E9%PL?H3yBUPBhrQ zpBw8`Cm18S(Po1BUQj1thl~vza^O@F91DL4Q_aV`!*Mxv$oSa#Jtp5T4(seW{)I8p zH^7hqhmGR^pH-{Cm)06q5Nf^j8)Zdo{|5NtHkKohLCh?CYy9jyZm4@bJZay7FU}K& zJbEAkbvWGGJ87}lgDO-K@#14fy0dpnH9}I;a8V?Oq+g78wnKK%7s2tT;yks-(a2HL zwI^Z1RLb}tj5IZ2p_+<R|8C@aKL5eU3c;6s`?MNW4L+@AyViSsM@}0vkZ<HK%GTNU zi_u8B?K@+n`wWwYGpHjP>F;dtp3>h@)n-DabtjH|JgbsyKWmhe6$O79X-bZ?@@L;Z z(2qD|G}igo@vrPO&pK68)?%o2P^G6P$P8i|`#9K~&BigTl}X_{-O8Np{6USB;ynvP zP1SI+43i^UWsEN~%t=gVm}$+bp!-bl*ECt#Let!VOxP+)<6)Ske70@&fG^iZp_Q`5 zHk0r;XqzQ?jB%N1u2UE|kSRPd=K?AH9%Jk^E|YVaTU_QiJfd2g(0eknwJM}`2QGnG z)fxhwBkNn6NeZPjWM$9fudEzuZQg}U1>xo@JnF;EJY~Ak3}V8-(HMEIq(Vlz%^6_h zZnw#C$<7FK0({AlW}eb7tZxT#zmI-&RXDcZmPeX>0UOgVeekf`s9N`GV@^=k26{OE zTnCM6`n6orz@}Uh3o2!*iHUGtEIw{yq6^@;n>++(N|afNM{u;6jYr>TlRBp~8i=A= z(dIk^PKyDZVA;kXrH^OxV$G2VLjRqQpyW8ydzE9nB*%k%5(kb}N<$n_h7HozM5iso z+L~#;@x0mzxnoT$Z>vKSy$Ppr?r3X9sY{!1oKb%xwtN%zpL@n&2pJx4(x{jgZw_q{ z@B9&BRTB{}zr~wtkpzcUVr^D}$&<p86H!a_RlRZGdwHT62mQ1$(VU3txZ5dy7qm0q zL4vsUkVME<dx#PC5w|yw<58MqrXjFkvDv45)%Rg?Jjt8_|Hx#MRtt`{WEPxiiOZ@| zVPJ-LFq1uZr9ft&AB#JfSjSK)3sP0>t5cOIW_2{zsAfez>A9L1KTl3{M1c^+PNoOV zd0!_`8la}6nc<GE?D3h493=+>{cOB6a#XlfbwSO5Ul%jru=!Z&(bcR$aPWoZ%ZdRp zQs2*!(2jX8h5HE&g!XO+9~=(VI>_k@O-`GvO*cn4e>UWw*N0uGCU(Kk42VAZ=nQk6 z^EAx;*WEY@x10Gf!rWuP{iJNj#$s9D9c=$a_H{RhqO*z1G!q<(04$bO;qyvgk&uoo z(<AT90=p9~GBHK3rY*PiHj^dvT3BD9mzi$BjJwRt4EYWC=1SG$7LIwm*tDr?5__0w zO>L-RV0f%?2ewLisZ!>S!HS0u!KY<Cyqcy5c)eJ%PQdcd>1lS<@AG<^iE5<Iq4OX( zwi`{A#Zui<3B|#lXep@bC1xxhT`n=#;IZ!#G#K>NmqO^yNZF-|Lg!H9_W){yI<Wl> zi{gIkWum9n)#aDu`ratVSJ(ge>neu_Mq)elWhN(bH(!QkTIo4+nc0TbxBIrNzGN;A zrv_`Pdr4na_al9q>Ymx}|6KQ~eyqD^Pd_t>Rzh8_(v@-jmC`Niuas_ee{&gd%e_L; zr}!}(A&~S0^w{LjBi*QmRzKUXFb64Kd538QH)9Bpnx_<UuRNv8r{%GMdN$GrfVBfu z+Xx%z?J@>}?v*lSAWDHbJJ6hphkd2OAmd7<X>ju11O!%Jsgl%PX>I^H`>w&2cAEy7 zI7dwm4kCqL9Zc#~dZLD)9Mv#-Nm*-Xq6wek_PQBYnaS#~*uZf_ENa0~?paxX6-)H& zxyt;RFt!gfbAmybs!3*ou|tcVCwaKJ%Msmx+H1>~BB>gf=ghTcrqlQXaSX#A#_J&4 zj7pbD*P+ee1gh&)jn7<%4)jk$ew-E7+1co`S$2$qwkei9qfp1<S4X1;U70rvppxMz z!R+9N!1*;lI-*SYJK-`*?6T)<43p^@VP-d_uoCQ81-0vh$I;7$qjSGBuv2r4ne4=7 z4#)LocaS#gdewzsJP_N7Mi6Vjp{@EJ<Ad7;PpU2Nti{gjRWF7k5OKxYJy^7pG}bKh z*)p5Qf<u*3I8O0v#W-_`(`m}1H<&n2U_2T)w8MCF=tY4AaJrE{t@{GU+U)fdLb7MP zlBb68X1Oy+LA)El!frH^oWZJg@e#z3KYuMG>x<SH9ZJ!S=2V5>rBZvNxkkwc%m?i0 zlT{PULT8BSy=!pB1~W{5@#1&VoI*1L*-09s3Fy*7WondtfzMBkg(hdylW#I7E2!8& z4|Oa%?seJan?RXuH<?Sp{lPbz<CM)v^l(Y{)@aK8(p&JcU2UE{bu(nSQsO3>sh6-z zply;0N4Ar<Bmu*fS%GIH99Y~GCq>ALg4~c<*)-8C^u8~{17e)oq)(-`0Uy{(igA)d z=)1vg*>MDSjaavsrCxl}(Ym(WqI6d6ElMuHNt~vAD^xZ<CEjW-^YXc3vg!~sCMy%8 zh(65OPgbH{l@N&)JU{V9#wqBl75PC+y!!~BywaT@v#01XQzhXxlh+pxyG^zAjklTU zohStSQ7E+itHX3pgL&ZFFyc@IldK~_vE|`!he@B?6|Tc>2TuOVRNZdo`AV;y&;|?D zrYc$FfY>zwML6KRa+W()>77Yal>o1ts%nO_K=3tZs+ow|G)zUAL<P1@1MIsV(@gKY ziO*j?&0OJY3|Z679tu5o#drWHnXal?Jzc?6r=<KmT`9}3znMeTors#jx)A~`f5)05 zGykTL!pItPgIk@p??}?ZO`P`no0-vHQ;1ZfE?|d8LTYeb@y`BwEF9Z3b%x&#M#8RA z`zLOE+L4Q!f=gzY^?GbJ^A2;KuTH1$P)r(mr@7(WFa92U@mJ@gB+oQY`7%V!GGCSv z8~FWTma6ROSv0pjQ|>l#gDEvte8n7?lYC2*j5+9yFvyytgs*yz`7(Ty<|+gI;9PUE zGt^WkG^pfmnRbu)j=E{FJ8F`OGv{N1V!SQbGiDy_FJyM#YwqwCBOl*udem!zl>HrI zJ^xi;wg2y`3D^JK>=9`|-;gd82lfr7DR->HZM8#7%v^w4T4GLApTH2M=&1EAMUcM~ z$$G{}mCRC*4qD+pvxn0HzL#Q&@YMUvD)hSc{V+Qbw_-l3v`Xv+=0{H3<o^6C&;mL> zp!(vG53q-p;s;=ELdYLb5}Ev<neD_H`hU)JcJNtmr4Op!bp3<MV1bpKDt#83y^yE= zCn%@GXVJh<W#g!VH4D)Ya~@B|&5Q>Yf(bb2eW7_6>GmyBo$ZN5=Ad>QRB8ERlN$i1 zCrFk3ydTzd@<YlTg4rA^8y*7Xe75tchtN1Mi0~c@pRvTuRG%s}JQ|349v1feQsiE; z1QrW=_9b5Am#RKx{8ICj(`Cxl51ZW;r!JM!hs}A-rxIG5lJW@7GoZ9%g>N2=fr*bO zmACs5GhYqzbh%SduD4xxS%$WQqnMXrlmq*38A@F&$z{-u;b1z`43S}F=ET3qzPpT8 znxJB-lKv=0C1ByBW|G1&PPRX4ZfKT~^(9O&@iEnAH$UcOB9BHo^_Xf0!R6jT>c4TT zZGO2T#>{f18mjmJbG*JY<)-?4`$0WssPmUAl{#g)BG=mGs<nK)T#bUF9yd9^Ui`Q@ zuG#5`-d?-zadWEbgL(t64pP)MI5vfy8ufwJ54z9SpLH>HUja*o$0me``yL#0d$_{v zrF!omWFwXDf#bMz1e_`eOktd+0GZTVl1EsvSfE%a7&(9@Vop%w2ijvSpWQsg&C9CO zV)i(18BF%qWmKg>EzVe>dQz?*l1(cx3iXy>_>(hLj;}D|q63eB(ADlJS-~-AJ5QLj z*^8b~M6G&4;kx|^Fm98l_6e{=eWJp!z7nHXzlp`6_KHd{pjZx8ntM^bwJR0-YF3&P zF46~uu_(U7L{#5cNFx4pxc^-WpHh;t;3;#JLf(+9uW&oxs-bRLPX$k#qdT!qoqd_9 zdI*%N9&8FA<G!Z>2&&*|B~yv3%xq-_sKgbk%!J+qLv2S6;MFe$>?Md-AZVZ-Fhg0r z${c!0V0LySnwsa!PJvSKl2v8qxSCZ!imS{%O0DX8aL$8u@k5o5kp#7Oul7w&7*cOp zNwQ?M8Px*V#?{IQIkTFLtKvH(8uScQBCNP)6o~E5oKt?-8gr_m>G?3HQR%OlWW9@7 ziA`(FMdxkpFmBhPQ^PQ4t!ngf&!Ry>K|YJlOg(x?=s(a6aEOQj6^?h7z5h_Up!OeT zWsIgbSxbVk2XZ%=rr6H&CWg-+tuu4gRQ+X$W>Qj#Nh5rEtWL7ln`_i}E}ewjWs=Ay zXt4U8Gp9M*K$lJk#jb>v7?G}GNR%&4+Vkc#C4d-7g+gm>dfv31(J-|i#U#yv=gneg zj5nnRX7fHyM^?XRrYgD+BMOx^+<dDNm%M1&s#nnQ)F0aX@MZ@TwScj)u$5cRz6eW- zL<yJbsTM8@waut?`!|^!Cf8J>Z;X|Kf0`xgdo;y`)-qY8nkJrX5|gkoqg5Z-vD?Cj z%Y~-BF6SjP$k&bsyn;y-CXSPaSG?-^RmjLJ8UL!8=8W@o+?B7Iixk!@g0-SSP6LZY z;p{*U5b4ksw4VY$9mBcrkwn+&aCb@ntgsk$K2Li&vjv7hJS63{cxM7k3|v6eevfaU z8MtGT&^W7;=uO(r`)KcdBzYgnrmSuobD<~cHFQc4y`|gC%7_%8qjjqiUg@<R{TEh< zZ#R!RPdy^Hyl(!(dGrx+y<uJ$ef*K8jo%?SnL||!TVl)v=dX{*ZEu*JTTfipbnZk4 zg>j6${02n#A=&c=hG3~)ETr+)kT6NufrtZ=wF85{j=sbn?ErdtlDiYu<2<R_34OU& zYWcWClHUZ?$6?P5n(U{t^i51PUn)J{g4&ucg>PZ7C9?f3O!uL`-UX|rZN+YcT_NLl zn+Fv8FqFf^OP>6<O<d>wM}=JXFY_VSuN94r>?_FM2yAVER=8Mty<={3cJiTQ?LnU# zE?Ijp@$tE=--9NL`L;c<&tg2&-o?aU$nSzfGalQH^|b#sdzCx{XdHNz`<{>cp4;%u zfTQ-JG`CyP*!c33jg8;IT~pcEICLd8vcnyGs<Cm%(~XVK!T~9zP6_WZxO6ybn(f#( ztIJ>*Wo{M10NYfF;K%uZgZIMlb4d{%SDeJYd9Yh`xXk(l9J8{AIfyuh-Ruh^xUC2y zs!YS*hOgC$IuM=uz3B0#ioMTF>vl^3RE=DBUl=P%>C&Z~mco5t*2|uy`=IYS#iD*! zRW&wxRyQ`*uWM}Vy}q$A?Kxat1Lt}kwAj$tSRirlV?6JYVedl(cF5BAF+I{-K7QX! zi%31}tq{Qz;YhLfqjml+S^L$%bj*I_Y%5FgNa^}z^RzMWTRzm7_n_1wS;TT2Z4g-J zH0fAlF6)}Rsj;#1OO1_>!5x7s+T7Sk-9(b*!s&{CFNbQ(?19U0Mg^mG!14Jm92w7o z$h`YrX>7zpWn<W#zVu@Q!p6&(56sjdjW{NTAa=oN5X=(vs#i9yz&qn_gwt5m`trQ( z3uF47vik#bb_BC6+6oN<x9YXV#`m#1$xQ3q5jm(72`S%~i-@*HxYjM5eXU{BhZx4L z-;Nqc*+y8TZ9c-x?;A4ZBQWNyRDWcSbCw>EJEnxhU)k-`=G07R;kSK$T``n+LBtL( zX*E;pK9QT=Y|}<cKgRm6C7*byG0%r1Yj%%p{Mg(Sasv5qzU%|oLN)UfvqvX4l9H2w zu#<K-zprhu?EA!g$MrsfFMPML@fNrNQuQe+vJCsApxPVvO2h%PJwAtK9l#7^rVKs+ z`Q0Tm51830AMR_;#e$C-8>gYfOgOJD-FE=(q*Ce*VC<ABVF%4Y(Qm)!&155y=GPgS zbP$T|1*tk{#t!`K1Md+>95Rw0zxq<LnT8;aeA2`@P~(+qHZomN@@=Rz97LHDB=Ivm z+Dl(NB3|F$9N!Snw9m}^ATte0VI(sBqoa2>^cROv<E_$g2;b4VAWnC@TSe`F?usDd zz$$JP>|u_T`Cpim)DdikB==~8ovUA(H3pA1BLh0f&Y8A%iQHB>^QD=oE^cIh*8z^$ z4uB&)6hyF;J-IS%DxMBYa$R_CdF6*ORhf>Sq_A~-2>ZPZoE(DL@NP&-AS0yVFpRhE z+KZr8Qsl;TPEH<{(9Wwh<03K<*#!|qfEG`dtgTgwz3eM&qrb=(8!QE1o2jjs;9|3U z_>-8N{K`y@=+Po`PbvBegvQi6GCMCZ%YO`xksV)Q;tG4Yzc#<=#wx|bvC13-S#bOf zgkuFR1wd^C;o$0T%+aoF1nFsmt+M$WGvCz<K~3CnA3;!W1d;n*Zt#j**JTLulM`RU z%|Wg{=cel0Jk>F?lXUymyv)@P;l$1h5LYqd8lG=)Pr&5}Z^BS*TG{rknd{1F2D<(l z4E>V6Gi_Jyx#{!2L;C(L(<g}MJ2S&|1;U%es{T7rAg^UoT%U5(bh`$$1f9^fCopb+ zS|cq7o)awxj+%-6u0%NLG6;^!n`s9jj1;}n=N}9|iB6FWggHdA>M&Dr6{4AKD4uMa zP0W~6ht@I-!G0R4>p9=4Gvi!WBe<z*>bClzV+g;dS$LOYX0|IIK}|r5cC?Ol6(A^p zolG?xLCtuCS-oRsvg_Jrxp^<HYeci$eZPmuj6_hA$gKEYeaq^5+?0MafmnM=DH8dO zQjWrOd6Z<nGYy}l6lDctt`p{DHP$;{Qi5YLX6G*jPSXTSYEGc1hD~+C9IeI$=cX8T zlAohJ>re7K>ny4M!HkWhh9M&fi(I)5(_;-GF`iRDU@jdSlZ)#)w3ChXW=S-e&L7j> z21i^*NbZm3xW9<1{!wXzx*rvcxSwDaVt(-_Gryar20`g+F)SK>hLKr*5=iY&=20NA z=V$aPn07y{)I`>4K*a|7)2x(iKW!%XhqY9ERGSVsDoG-mCZ|uM-@$y?FKYBL;1_eW zF&bqvvQF0iqEH3UG?wqrMx-cA%@CE2znb#_YW=SY)V^O;{ThBn2ZVKKzhQbWf<28d z8_7DxR}d#|lp0Nt{nN33ICFP|{s^MiS7(7nSYnCGIeX!t+?+F*g1TPDoI#zj^X811 z+HEXgY1$CIi+$yc!gDYjwJ|HDXe?DX0o36$=CtUQkW9`wk+zyD#Zve?jQw%4`*#zo zuC}=%2iX^#0o~XHxv)MHjsx3Ca15V;=iP9Bhg$;w<8YtD5ilDBSE6$`og$_2VX@sP zo|N)jIPzKd7EI1o!sM(ApEy(TKW0ul9ZU?EmC{aTs;p8oD>}A>kl1Ee6Fv!n14Sn1 zJ10L=;7Ads;g1v{DB!B%SfVb9c_=d=ruqfOX*BpG)zAaUi)YOUM~Lh^i_0oC3<^ma zoSsV<@8fu#G$5Iwli@Js2K61bSA&^pocvP{0E-&T^o!otUcd>gkH#Ir3U}hG!en0q zB=A{D&UYk4Yx0v=y7nSvnL()~>^2!hBuNkr{CpLqPG$jA=OkbZ93)3M`Wf$p3na28 zoJN#H?gU5n<JVmknu|9!3o??3PzDGr5D6tOQZ&9z0){J9Bi*sXrv%W1XlaqatAa|D zIP@e+<PT+IwDPxB{3YQ7U6hn<Fw<Rn){914dnp}*ZLRr^R*FsJpucibW!R~*A=>PC z11lMbtCkGXT@yGL@2osAW!+dG5|Tvc`{i&{w~Qwpn3t#oN#UPn+9l^D2ck)?z@iC` z{PYUJ_CL)Y#xZQ`@_OBW;<IF%Ml(xoOkuVV8P;g#sO^L-SaZpevLTVNCB!!nIFsns zKpwH)q%6akj>4cpP}ay14TH4PaZJxR(y1kUhBH2w^2OTdM6K}7nmMJYy^+A;&&f;N zT1oPIR&2YOy3z>J#ql|i*<@$AJNEH+EVrZh@q?JrS{M(7d)Jnr#NNbEX-7O+7-dF> z=^ls}lViH(s#a3yuwo;~u;#&w99AX{x!K~dh8l5*WoFEm;esN6!*4AaPAf@q_&H$B z6dDfeufXF;K_YP|))Wp>00TFt6<hK>j5A`ZlLj_of*Jy+`Jih-FfnjWI2Orw!eBUC zg-*|+7_R+{qkjsVPuS$bD}!9+%dqz+J;>shdUjZz89`Q|nj#Fgur|)SXEMYZiH^A} z#A0{5J;dU~cx{Nq&n1IfS=ln^S!_&Q*2+qB-k?4%wU@oEtS-ilO&YV6g^!lv+flbD z)cV<&;E!Ao27raKKFs>OnHfQ{kf{_`qJAA5#gkQH9KJ&tR)XUu*=Jba0HbQt%ERNd zX=SR(V3Hsej!mEG{g>`q)+Fc6ro4H5r1xtlh9kppQ(_&q_gYJw6ESl+J^W%oQsb6M zraU}7ygN?$!D;ztZEG+nF~FrrFvVr1_tU)@dCVV~a=r$|I9($$lkb>_by-|HRW=Z7 z^Fmu&T#Ko$An4QD;wMw=MNX2+)>dCG)oE>Up=ffr^$}|sZoxS8&d|H9eK_DHD#99y zh{6aYgC!GT@sgh8Nb5J=>G0<JL0H{;Fx-}*ZNT3&+1SSNe!|d#rSJhxT3$)*ShyfK zjW;==(p5xRNf8_(Qx%do-r8hE5h<AzWu>YQRBXA7ZPpy6x{a#ymMAM<!C)yGMw-M$ zqvc`EN3?~7NuHu;3mcNsWM9nx0bLe%UUVfn)|#zm<8k50QXHVb)<OlvpQ@bfj<tH6 z2b-`si}RYfaS(m)Iyv9R<3(|*s@vnNKFT<!LZ`6ls$wZxTkzx7W`^Em#1ctO&x`TS zniHJ@I5uh>XZZ}hw$@)7dhyn{lqmqoEHwN1BRD;rV0fAwinkhFxA~HBFq1BI308JY z%MaFGD3lbeImcZ$G9uB+>PCG*ktX;&xE^p6bvDFwIR0?ntx|tDa;bZ0!bPmjVK~-? zS*UL2!|_M8#veO$0;Nq6Dzyh3u@^CbYJMRcv$9v61ji1Ynvp-9jbK8h?3FeNLzv}3 zIA&qHbHEW{-S21+^tX(gh%hp40Gut={T;C|QVQBx>5`gc;g0imR$Qkb#IY8dv4P_& z&8t``?ST1_I3!~c;c}v#l@QI&M)g~GvNB|iTN2w_eWb@Eobo%Py@fTM?XARigs%tI zDi!<;Q!J4^?X5IJqZuw|+N0}J0D2?=fO?ynWF-z~c@%2qq`J?A<Bw3tcS>6aIP!yO z`D9qC@15zo!cil1hC^Ff?@E&Fp1AHk{U>|@YLg5FHA}iATT@-PgB~n|nYKz*vNa)M zDuQV55C?CtJH=W>EtX;>_|_oA%h41oS$%+uLo!yDiiZ3Rfnzr8v+Q7Dzv(m|I7*rq z+{jex8|QTIhb2#bN2`JT)UeLh<cPl^Et#%iY?a-et%+S{v<wD!D9|0@C@Y9o(_BST zkY>HCMw@J&Bod*qWZijSnAye3i@3uFk<#QvYGxNJHR8^5g4cJk`ru5fBZ!Tj*)o=B zRFq+kaB3|&&b+Qxfp`0+XGK?QGQI^?WLO(~8#=2qR9EwH2EgH>u5Q-Eh`Rxfbk?YC zl?C0beCKRT{f)s%focm%Wkq)=S*(fcZXLzF5}6?AEKhQ#g~imxvOUX6kDlX$;wLYW zlEMetBuMN<Rt=KXU4&$F|2kRT#a5wG^OQ|;lC;xei*0ciTb_t}eA$`AORohzto(lS ze8Ch!73^aS#g0kgRWflYp2g>YaQC$OMBLjl*fYK-`u|RUN4Q@w1Hh8sL2xV%8!a!f z(jz$RBq154u&B5c_5@DIxYQc$VvFIA5ouC-sg*XQ)R*2b;6CsaCkg}`)g^HEAsuT* z2C)YB`||l~EA^Ku?u2DqNv`>brKzGYke=CAcBcghqS_<A1o!~_1oU8FQcqd7737Fm zh%i<H4<CrNy{v^1i+sU;_DbL0);QPVW)Rl)wnhZG9zqy<eJ=t<*J26VguAhIHnX2) zyOtob3Gc!E&?{r7Xg^3JmL>PI)cSs9v83IGuj~1@VZHFF%PqAWGY4t02s+2=(QLH} zmF*N?acQzN$Ld4f&@IXtFC|}N*H%s_04=*EDoky0xIhYS!{_s)Tr1hN6u9_VTTy}a zv&;ISpPG?tWvMAPDy|f`z%EvY%|$pnCUTWsg_o@#=UVBmhXZLM?%`H~<n%Mb;+Z6H zP@%~HZ0~r%i1AG5Zw+H}+IWSP*KC4LC&WgBJVmdJJP6byD8?^2QihmzMZktCi;af- zUDhlK?jgsCOH*(<RL*cK%uyuCgMnK9@F2JU{;DF$9bn}^F_aFlcByUb6dBS$Q<!4h zRmKmrCPXhlFeFw*XXD8|U8z!oD9j;dU1{OMBvl6Yu@ntf2G7dDRu8p8M3Xc}4lxEI zFci3?4nc>ICRKR9B+w3KDVlm@0N)v}m8;fVSY9(!2}$)3D5x~48G^wW&C2E`;h7<d zipf{O<XS8vud*g9a%=luH=bEia}`W3Rfkl`8ESD=Eb!!{;{O*Ev59(^HNIKdS{!jU z;V=}mSZao$CO8aem^I&7hL3~Yu{vbg)fUzdO6?F=Qa4Q&l7f8Fe%e>`Q${HgZ1#`J z>8q_0=VPX{JB1bC%dW8ogivIhlC>I(^G{uak#J>2zM^24eDo98t(b4EQ>~3MNO&w~ zAe<^k>;mgIS2+l*@!m>#&-TeydH8SMxl0_5Fx(npECNzwWeNrzXoG3dF*r(axYZNM zyIgB6b1pZ_zxot6CSGgt^0NACm0%=}Xdw&$;IHNXE)3H~fOgo+%151S9ARZET5GA% zeaI}&nGx1}pRht#4ZzNd4cA#&k&mNdT~HcvCjBbR@{4lf{YMySlJiNYr7~W!p2l$j zIioBt5gRtj@-Bj8aj9?s>P;%uqpZ}f6wezGMB?fwY6(`2VY=~Ssq-kS1TCw0GzMe_ z`9{3*q_7ni*HvL(?eQ@vQRK`RD@ko|zSswXGC<HwPqnZD9t{@f241fQNJV@=?5?*a zwCJnsv0#L6cUt~fs{kae8p}prG0sX4VbhA2EqlXLyHe@XF^E5^AvR4`gIbz#d><q3 zJs{AgaaNRC0;#GhS>Iw6*3og+05uJztFMSEea9<KjvsGLc0B>?HS4xY&3IpT5Ge3e zi_}QydT+3jBA-MK@{xL)e5^Dj!ehr6O$>8?;*M>nL>gcMdC7O0Z}Cz!0z-PtR@`7s zRjZ(qr9L|<O-9^k)gid=1ZyG>r<`EDqhi~7x9gP*#+T4luLng*<@9hI22*Hd$h=R3 z+(TjjljNaU7)<zZgWy<gmPZ4&6C6=yO_XlMlX<R#V>it3BNBF#HAvpcj&x%WNm0MZ zgpzaw6C^%Ft8eq{_z8AA963V}tSU7*H3K<9aLmWw>&T}mqpMGJhQJZ+QaDPIhBY7W z{Ba`cdfE<vt9HiFd?E0OQvZ$<i~O&!6Aj{y&*_a5W#`18Bx$_KN|YUQf)cxtWt0(? zm<z`rc}5J0J;SHK5wkRzbhDM&PG7N1BQFS!KW!pCCDllxHtrA|l9Vk#OTErY^i*9X zY@#()t@&qROioN0O%5~_ynLcEpSMi3lG>7hOi4$gYN3ScnuxY^M3N_2dFp~h+;BNM zG^xL4HrwFSK!;RKg(GIHJB!hF#Wi^6kATS?Q1*gMS-G=SlC0yp!^T^&ko@c<D=V6+ zcOo1q#MHTP7fA3e77oJwPiRI6$F?yt=N8PXg|D#ei%3!a9)s%w7X;T*#6}^E7N}Rm za&JZJJ0gX*qV9$i;%ZA-cG3~nPS=N$K@7B1sir7p@8dXpBE)2&QXh|P5j{FaCPt^j zPXV3i6ExB>Sn4xzI{l2#Bg3MJ6sg_}q_`*J5>_T{B^i@}5BjFbRu47uW6jAbK8b_h z$db~rnCTvRJ<dhmHQAbmvz4=^aJH*_<I`C1d7I@{$D@(}O@feno8{ec8&vUbtJJni zI*_1QBKUES^;RrCwGy$2^Vn}(3jPvyFEn0{b(`T&;qa$bYcRc+aJ$vB+bXbE%bmV0 zJPi=YhfCn95U(-cD#f>339i)$(l*UjS$n&csg#Q0z54HGK)vW0B=L8;4zKKV^g*S( z5b~P9l4Z<PbaGqe&{WHNCt$QR%*G+dJ*HVv(VT=JzexsdQ)1!eG&M-9?huhKhre%Q zqkE{CW+kYGmw}WhR{cg}0TU&KP})>{h;tK@renHxEs7`kaE;M)E6F+ebGc)>6%)A< zsRMI=^|?GT-MaGP5UkG%4DZ>(KemPczC#l6H*3_u2NAvv&izGW<HcBTMov-nP|PSs zpX2)wF!4)9f4oy-NhPM??`>JRE-J~q)AuRqNSM5L)V^>a#f`tf2{3&va9%(-8#Gl4 zK?YXA4R{ww{bFox$?S+dUPEVCgI$$K#2;yGiu==`gi!}D-`_HC1ga7UD-C{Tv*9>C zqqfoUta5IP^uK*6DMeO1PCf2hWc4WD(a$}EwPi6^pg2;5e)4dCgLg5M_7}m=cv6u? z(FGROPqq|c&S=RaIOl)YSxE_wxh&$zv(1<KO_Z!Vtc0;w9QI;OQ6+dX<V!4S4J>{i z{It1s@h`z2$ecyK^sKRlQS=`cd!dAX7!($rj|3!(29U!HP*<U`S;=@M`h?FX8=i*o z8?K`ZEax!%ayTj|PV%1$3+oo=%fg!L+JnazO!QSrm$m}ga8TA~X2R7E;FUFFNmRRh zQn52Bd31*_o=r?+aSOsM_ycP<3SqagA%$cyR_dKtT)k?n9af(7xLeZivbx;b8(9dx zukV?UC$VHJCMYMCsV;>(2A7L#VIG592S=@=G5-%P%?o72arlXfjz4rp{&|-b({>NS zi89OU;EN|CpOf0VV4OdJXhsEQU5v0m+FsqlpCDN?t^A8O<L;Y3a4*kAxF(1Y31&DP zF`)k^T)G#C;o;w~;mW%5(ylGSPygygAu#Q~5Ekg){HvrKwc{fy5FUsc)=tbqe-bHk zX2H(2W$i30ujEz~u9?onZvsI){H-q)??jSZ{p1&K;am-&N%y2Lj9t7Adk|rP1&@GV zcP|#wDTRP1NG-SCZS_yN&6k;xpWr^Zz}mb8zm1C@ur_q`6E3%8PY-q9a5)l^gtz-L zGDG_o8F?8U(@-w?905lRN$wiN1!6b{{wWA2me{N{+sbJ@8m~;wig)~3eoPJRAp2)q z$t4pIKzMifo_FI(3bLoS;U?kQsm*Y^;hsO{RntsA4NjN;#!t-^(F^c1FXO4GD&Y^r z??L!kN3`w|Kae{RNWfRa@j1r#ycti8`2pNn$Bc|8k{W^42xr(VUl<E5L70Un)6q{? z=Bq$c7zAPu0!hWDKrC#)MPCHYU!u6@S_y3%aMhhIyFY?;+3(2q-H}Pt-#g`v4uo<U zpb#=qV@J#9eQ?Z5M)dLB4@W=IONF0l9)Qzf4quu;xMQSdt`!^Y!ToK-C@|__X_#w` zix2lj5!xglG-7h}xZH7%)!BK+arxrosCaq#9xKstwba~WWjbrV_c-QRF%DxD5;Efp zl7+jFhP>kQzJ@0y^+GuQs3{+Vqe^=gcyPe-GOK|f$3^U2|AFu(i>S01h6%oM-UMs- za2$?D|EAc=aIHfczeyz3!=n=}iS}h*k0=}O6y!h~jKWDv={dw(I$nz2XdOHK`Tvq- zLtqwQ%XZQkj{G3VjsGS7g}``Rl8o>7tUQfnR`^A{>k0>kZ$dbU5?GUt@Uv&4wZfvS z13{k$wSS&JUM{;gG#ckjhqRK_f48pe_R{&2sTR#*UJi_xs1i)CY(@~RhCDbvi6ySk zD#47!v$CEkUiqsOn133MV`vjft>oxek%*ie0H-<ntQ3@5gQ7iu6_udQk>7%7KchvR zV!!p=px4d~+IDWx_GUq)W1>@CuOo;(p`yMdkBv^kmYs7-+;MKu&gMZpBtIz?Q#N_` zV{ZFRnRY*>A~CCYzcna?6GGR>&Wu(`<>3p$46T3DByqmA(0mKAY#?uhieo$G0^gZ$ z^;E;6$chElwoaTUpp8QYjDn*$kypErO$+!ePwfIMpNOEvN@>*;o+XnWRC9kzAGA*S zWBs{g=|XFQDk?+j7g{C$6f`$T5X>4c!q|yMb2mA($l8x4x^b~J+n-QVZkF_X$eQX8 z)`Bw2Q~i)t?ugcSk&mp07xtK?R=F;HDLU#|lK8MS(NLu!QL1cw7`qGi|L6+yY<k$L zcBn}#YP4jy;PUDLvE?O$!eq%Zd>msYm((ufSn%;8T*#6CQ<&}fyv&-(v%m_<t(Vop z`e@|rAZ69qr=7Ok+M}`+dQL9~@h}`du@L1gtgt5eYFuAo{S2&*2-mqtuNC+<hD%FU zfTFXcVFjk{aL(HkYRSd!C#=y(lK7-0zHbtxk6}J^|C82k1<S+^R<*vxUTJLrLR(f^ z-mT4%a%iRXj@ldveky~3`jzdTI%78iNi0?`UG_W$D%Hv9r!XH|EE!MxVA$BSYP|zt zi(7^9V4AF4g*omtPu(gE?w!~ecZbIvBdM#c0f?Kj8q1X^kJkZes$`Y8ljQT&Sh7+l z({_fYmgfw_je*Zty&_uftHl<<PcaPK^o&n9M@!u^*4}7pdHz!1v|Qmp>@^Vn$2<*d zfUo0i>GCWP#^&T_u^#A%?0MGelS1&Ua0fW87pCA{SGJ3E{D+mJk`e4*CF?2+bTZ1; zUnRRxj_72h?q4O#kOAwg>~_SBqYEaZfKz8_yt>JXb(o`I5=NabNq4E!N!X6gmn2hq ztp|nX%Cz-XsuN?=H-CyAE63Mcy_B@{klfcf-Ta(21|qiNIV(>QLZi;sMdA2YfN*3; z!*f=)^Br|kOM4mdywy?dDi0R-XLfA)vOBR>VTBpimK_f@1oQ8~yKcZ+rR-LmZh825 zD@>s<L<(+pde1H{#1#S9osho4avSgZima0X8?3Z$-0O`$#r=tRYAW%d+fHy!IEJ&d zf6Iyu5J-r@RZx{5ZLo^5L9t*XMO9XAv`W;B1$*y6QNl?-FZd?g5u>7XUyviqUx02& zlP)i!Wz~6BzG&q;&JU!b+WH&~;!ri_@G#3{zhupG?!&k6NL=Z#>Lq+Q!vS0`VfuTq zguQIdYxf>1$x`Uj;aJ1HzL~AXQuQ**St<1|dsi%6v;;s(2H_)pW-KP9ayDCCl)k@O zif+O|H48UmVcaY^wAo5fbS;pE&EPyv1$xEmq1GFPNbaRj6(z4=30InIe?`qk*1n<^ zK%IF7N+wO_ylTxr1Fd@%)ler#;!FkLL~7$Zk_T#evFzNUX3%Q4SUdcSK1oR?!upD> z06R-Q#zUcTjWle<S3#@=<DD2IUbA{R-j}7XL9^}mY<>-bgv2MdLz~n{(d*DHA4sn^ zkRGei`ACy3Z$KrciM_*0i}(=a3j7rPkqp>@&+IBT$)K>YyZTtFcUXsM;_XEJb7c2U zVDyR9?X(6(d<qEc);N+SzW9Rirj_Sk+D}Ph6n}n0NvhtoruI94oYW6YLVJlN9XwCi zXXgp~9~u0XmDKI?7EvrI4~~cguH>N%ACjGKSqTv>gTFX`@RxD|shb@gu2r1^j@`E4 z@?q(<%gXE85@s#XqWYjE$W{Tbs@+$zb{Dkj*HW_!Jr8vLZhTs%LZ_`wU85<KCPll! zZAJxEyoA-lT8%*(0*+V>ecS5U{D{@223GJ6S|<*#dj}Hl`&xATH{2W&zQ-EbHn2=0 zs<Wj@@gDSXXqWHeTM|>nc_n<tyGp`0z6-|VL+-oQ5<JHL+saW>wpz=RGB7g!jYWNF z61EqKa7M;nEB%~hBuvO@;nrU0r}ir78T-&lr^%juN=(Dv^RCT%4}y)uJ>OHG#a6tB zelrKTJK?r0Gr>i*s?}hc9C^?B4FIYKx5oXsSA|7+!uLZ#Kzqd1U@e978?~FWy{FFy z_%LT2LG38|yK&H~wZ<u#2ZC_~<C|6(_BCTQROlyGR0&Js2$#I!kAglBZV+4?97UIU zl0U{#_84~&92+oy4C@I;-s&*2lVQxG!vgbPjBvn~@4q%9y5U_V?2jjbXTdR(1C9kL zs^h5;mE2FP*c*r!8!vyl{209JvUK^xiRI?P={mB08sEVB`HPZapMpVsr20oIMPB&S zitL|(EIr^ZgUf{*0(U1|0o)C6xBL8foP!QoFrnfA<Z6@@IqlfC49I6n{50;A&lD*< zfF<N?g{%gX^@rn6Cu=Rs4=AD8cK`~ty_`6JRScVgY}<I!*9G7N#e-H-bVp>;y~84Z zQ~_3<hg^s#^+h~EHaKh>dswRuTCx4QAUKd3q#DQmq@<>*rkrLFq7-$raWf%5upYF+ zhIB_*Glnq{epkYg>Wt@;tx}I)@#?Q4Nv-gx$im4!vp=)Cq>wR`3+m56RGJu8mKhPN zwhOXyy55+H^ld;m@tHNK*#ZyJmYo!Tnzn&icj&BGpp1#<|FP`ej3(YDoR%cgNFzrL ztm#KYzePf-4SX<vq;*0F@i!!QSx~G(gt8h~`@mTy%-8tm>6nhCVdB0Rn>Le9nPFXt z0ZYz=BUoZZvN+)UB*D9Z3mYL%WFip@g5!@_+2qKO6e;@*=X{nFw6>)YwS*qBKetAR z=YOoIexxHg9!PSQg{f6Peu27!0R81l_2&@H#xJana_V!eGYXczhwvdt=^M#%8f~SW zfs>w=9Kv!8oceJHpR;iQ))z1(U^;z)#*$cG@K%zH`x#3_Gml$PTwhuTvBjzGOXzJc zl&S$%Te<o>d=Tq%*jf~V$>zomxT_F?c=#|@mefi8VKr@&QEO#JV-`^DRRE5vQmjaw z6xFIR%gS1`CVXqJwWeahLzk~G5`eetYil7Mao+&9c2aX;c&e=W1~h6V8^6Kgr}L@K zR6r$5+DrX6n5hoMtEL{sj4I@OZG$XfI%Z9h+#~1-!ldYkmD)+`RJKmGI@+!i;0SFf z+;#LzL7Y#mTmvtEjAjifN-1*sh&9i6O><4=e9OfYa`0RBI}q?pN3vvnhn0hd4ExR+ z)Q*^FNye)Z7)}ilyKqT7ij+8=>N^-pX%+DJ6&BNKy^A?^U)w{%bez{v_yfeD<fs+a zE&|CkQFL<hP7#K1ae(4cEI8^)Lf~pq<iS#dvSSEOt-~;}uHt(RgzMDus4aEY&~|Jf zEfMA<9}%`C`50>WwG<pfOAb1Q1z!;rb$H!y3;_1YAp|RshaIU>`#p?xT)lP-1>AKU zGbJ!Dj#Dx#PGC8apW#y9)lLW@eczYj6N-u_kYm>gYmTFn^gRgzMUs7O<&Kk92LM@q z(wfnZ3Zx~LR1n0nwIu%lGGR3^$#fU7#N{|A(fvI2gY^t{Is=zbDgJ>KKV|U%<N8y| zTu81*PX$A{UbUay^{nF$SmqMq0~{^EKVs>EA9V!tM}gBxx=F#0%IICdM~tey=fIEF zB!_&{B|J*<f3^l(N5OW&bwK046z&?hiEy*v9)xq@yHOjsj&MEU2E#oE_dXoId!^yK z*duTs!Uf@TUjkfDIr6hLc{sU8D~GC%&#rKn!(kAse!63#I^u5!WF=5tevNN4f&R}W z*$zr7d9OwAzgqZrwD50f;s0j~|MM;UYg+hMHuslY@Oblp3m$3VU)aK5+QL7#h5ybL z{;4helbZP<|2H%X!2DdrPBW=waEs9XE&P|Y@b_rp&uHQA)WYAsg+I2rzvKdU^MDJC z7Jg?7|JfGb&-m>vkl!a;_`hr6Kite8#8Y9q1cxNu^zUZjn6hl)-`>LiN(=vsE&S_R z_^V_LiYa-lMevdq{sk@k_qOog-NHYkg?~y5|4q&PZ7vwwJm7*6zdjxje7k2xPaD@G zm;7#JVOdYKyM#@S<}H6zo_wdJLG{GZn^sjcCuprQoHh>!Cw!;+rcK9p+CMa}_|86$ zCN1A-^;7-xo$8a#oy{En5@k9tfV^b_c6an^Bxvr?uMwdQL%&9bh9mtNA?geIHB!{S z^lQYr`utwxO1z7cm_TEg=1agZB1C(Q@49QDGN(TZj`6g)>5umLsWa)PVq?5kbg@1^ zJ3+?B(NA(D!!e*O95W>O{4@gSr`Be??u^^Xl+sp7CG;|w(M-nV^fNpC1V?`|9Q`bh zewI%^@u8pi(XSOT@u#2lV?66eKkH9F>kog4@-Tn|VgeG7{xqMT6sDh=obluU{p0}s z<PiPj5dGvJ{p2A1<S_l@F#VJO`Y8c}P`(lo26R^eUJ;_7BEt-nG5RS|^oRQV7y10H zeEy4les+yaPuXSqV4t5%qLs@y%J@LOC*vO*0&N*auz}>ku|cs>T!6J2Q3;OkJaK<m zp+V{#);0LQ+s<~>J>FpR!=l^W1_ziq?C~@^YfVgb?sD42c+U;8=i{+E$Q}g4)DE`8 zdD32DE1O#kOKl{a*vcM^_l>QXLTdhjD?+VMI}6rt-%$G-Jd(p~+P1l2_UL9Cgh)iz zg>@vF3SO!l2(uR;`FI1l>O8m*YoZS)S|_C)>?BFI?B#ghY1s&>a03U7KY^?V_-rG3 zeZ%ctD#o7$hgb3(?1OImFw$*_uqQa2bq=|&gB>qBu8zW~&24NNHCe+$V?Ep2*ik6c zQxj#U6I?@#eHXk%v33Gc!Ceiw_9M>bJqR<~+8#VI;uSr{$J=XQ$|cwwLlh<0{2qeG zIGLPi=X&3jX&L6(n`j3+K%1I&_E3OMY!6B~>RwH@KT>%8_*3f`9-kW}jVX31a-!Z# z@UT<uad;qknk-AT`y%VUR21V)fv`??J;F*m+qjJf7YcMGg}g+&t1Ebdvq8N<HC^r5 zNI3XH8`rGB=u0Qc>U`c)`$7{X|7dWS=WM#Y$1smV`;7#5&N}7IH*mpC(wnWqQYfC3 zGJbqx<E6BXf}<F#aO?oGy<cz!VE)NYSEt{z`RbHGc&7l@$%0Gm9wF=4K%_nehjFp3 zQXEz}nr1vPxeFjbG%DN9apcO#Y&%tLK}9<MTGd&eMcEKm=ejWYYJwA=bb8y9K;lKc z?Qzarr~LCyeC9dZ8&t@ZjLYm)+;d-W85pdi$}a<@*GW_#yQEbv>J@*1eD$oWv+U?& zZ*gSFoW4LH%d@txogW-<oO$)k)(JR29EXjk_J;)J%F_N2g`={)Kg9Q#9O`e6P~YVS z`)YO6)AtH{Nf1)(8EE%$es9V}vBB*<saK-una6#!e%)36K?LUB2iZMcClE&UM3QWk z+Ch+)t&(*ww(jJQ#1^9wgY7Q3_@{WVJt*V{Bn_8hECYyU4w9PsgsS0`imKU(9dqGB z>@Y{Y#0|02T!EiEew1ND>}=Oh&B`kqV&}Ev+$%XwbxmMD6BwRel<J4rf=@MzuCh0H zA9=E>2Ai1nU(?2xWkc;n?Pi0MRA8gw_;#1izYx!b(sP(SJK|crQmcdRO4@Fg?ZfOe zz&nD6b8gt<{bRt;tL-8LEx+3KesfKi`m629I32EZn4KPd2w4L`oPfVog{xJ9aRhJd zilU|Fb=;Bm(KU8i$<6Rz565~CH!XEM{*u2O??cs*Ul-X0rNWJcV{@QlXZ;y>6`oXP zB=}r7wgjf-ZvY&~<*R#$q9bT&suvm>m{7<E0pFI=0(*w~_|Qg97ucim1#{SNJM-$m z!dZw$l%Lqx+&aLK+f(2)LK;~X%&v>!Y5};Y&#s4u+r2=?xNGetzOS+Brk!2aLP^b) z;1PDJ^E7TaI1q86j2L0hbe#0;8DWPzoWGdT^@h;)SX6vwB$PeQIl2y7<fLr54%%a` zbQxvyo89<P=uzf+R*XU*R7}_y=){4n#c*Je0;i>!VU$l@1B%wKK$%tq8JP|TvAAHn ze`sERJwTt7jIpXSnmN|)6YO}~Q+=Z?PUmlG^JaS~c@tMm%(w|MKG!qnCVQd7F}GqO zTH0KEMcf4qka<65HpWe~x2tb`gwJx%pj=H^G_Og}SZo_Q`uG1m`adnB)8z0Z+kMel zg!>x`V39{1;n<i^d8GgwkcNEqHm2lTpfCPF5G@dIQ0Xo9l4i*K*|Ie3w!77ib8$tJ zzcj&7XR*;VFIYX6&;${mG84`@<;r2no5vjSPNyaJjl{j!r*5^osN-T&r0Pd>czb)< zws+^gT0f9f(<)3RPqq_XLCs-LhFS?mP*a_DPqy=+hoh$0<03*3OcRBY@2lPvoZ`oR z1Z(}LKz)ys<lAiTWdv-ODR49|S<4%;kkDW5pmG_y8>2vh6lI1B-3yZc~=ZwA<~} zW}k6Gk*lfh>V&x+x7%T^u)y$&(_y#<;#=G^S~;o}Hp@)4W1NQNy$~vID#j^T(jAIj z0C!Eb%bcdgD~vjO7Y^ZcJ52vgv$I?l0OHSAuQ}7~)D$g46s>`9tc8s<v`@X&-#*Pw za=I+}Vw!z<Zzd;oSZQX_5*Zjy5Ul}%>6%I#Io%%DHXMFNyM50HJXs3X6im1K3?~$7 z20~}DNJJ9~B~d?_yk)vJK5$XK^t%0Sm63n5^AyrC$aX%YbvTQQ_GQPzSNEE~*+aXr zv^WHjMO2^~1BNkM4AM7Ab!km>YJUxZS-Aw2B@-#?TFvReID&~qCQZ(*vT+8aG!8*J zIeJzEwdGo)ARjdHOGiH|$whX8VkfngreIq@2&CLr8DI3jLRqPyBnLo=KOd9?wK<Em zAU>=?LNj#Tci2hI#60nTk8am2y7UehDea~D4m-h_goYm<)LtE-z;cq25`TVXuqX6x z?&|8mtL8pCN?@l@OF?=+agk_>l&!+If(a*ZMF{yhSLWQwPC-uG3BxtB*r9{r&qr|b zOjz~f?n3u-L{{Eq-xcvTAVVdnUQ_|_AjxQls{;zs2w>CxEEwOjr0?B!9v-E4qgR+E zd%O?#Y!x`t`&cns#nsNXC*GV27+nCHm7xXNv4y`=3xDSp{<IeUE-n0BEw!g}+Z;Pe zS$^z*DKvRfw4K|L=h)u$Q<1VWCk!V0T))5cY$$A}sW`#<=smW(*&-TJno2`g{w*oG z$6lzCFo^KaO%gQ^-QQeUIS>8v5viGHS9TBljIM>7{qWTQkP63fscvoPF;lwW`piwm zb}|TCQ;gxy5plm1o+Q@2_MCyVR#_+ur>fSt1(u<$50)_uX;=n(KV9}**>kU*-i{xN z$qz=;!Xkf&3VDwr{|-~)LMi>bJ=K|RDT7(85?I@<WM+w-YIMc==R4u%OI3+IKV%MG zKa(z{cD6F7u9Hcn_BSB~0OeF$btc|t_f$Pws;s=v9%p2Lfi&q}ueje{*tr{gQ{bax zXA@`$Qs!x$B;yv8$FZ&@|8*Qkxc`1T*V)~Y;r9f^<5OnFe5jVJ03hK~*3KR4Xz!Ub z-<}bq3T`JS9<=ki5*+mxO#%{-O^AjMDS;@}v@Rkf+4(VO-(F@ewEL*_f231t#T<yw z;f1ISsf(o!i|m)9`Kn@(LQxNXTWS}flVy}|vC=!gM7uqyi!mm~@`37y02~JdJ%m9q zt`7JbH@Eb8$L=Y!m)LVK<f>ny#<5G6+Are-^W2B+Z3t|5SPghH9#NyR+&?e~y6X{i z!`LYMh`q{z6<W(|F3s7w%-)1GO+{t)JiThbdKBaPN-293rB=$uN0A%@(8nO7xFg{) z82y`M{bLvhW1&Pjlm^xs-0UWPg~8Y@d#W5b;~4qn_Usg{ouI6Cf+M;3V;4Y~WYv93 zGSVN%m>6qGD^x9us&IDQxC*<F5J%zr?tuz>fFg}4$$~MPy2p4IVs*;CGJ68H8<czs zUYD$}>l{60$`crdUn0Aou=AXkTH^Q(_EOT5_Fy%=!I1`=1Um+rIaA<>PMR!u5`(vs zQu8E=Nt5~~F<?3=D=Y2&@J(BZfi1rH?QkWzvcYrRnA*$1l^CmHQU-U48lPf&6=C5l zm8a}jWb5@5CJrzm@U%Tz?d3$A>YeVva}*p0=lppyEq|KBd<kA<_fgvjNi~$^SM{W5 z4E$IJ5NX7!joSU;W#eE?II?FFHVKANW>pxLRH91we7Oo!N;p|-mF>NUfv`ymtx?h> zqsmTeM;M%&Vw4_FX}eC*eV6*aYT=_SSUzGkhU_5TYI~gGQwKS++Rkp<3&2TY!Y0>Q zLpG>z>G_OZ;_R*15-<Cov7?-qS@PpkLGjWEkI@GinYd08*Vx`Ga68DbHTFDbUrXHz zET`6Be1zGPwW?Bs*D9iISqllp9iZMv^0SI51D>_hE@5?|08les_k;}Z?F&D*npMxD zAz^{fKkTV$om*>h_jM;23$d%r%dGl;sP<T}4owVgVV%9inT885*5LzL(t110+0T*> za$9$hq3hMm)#ml+@J`B^^_X{I$@r*t3ywbP^Bj6rWPeUcfAR)9M-Dt^Pg53m2dTfj zHKnNVc_o+|pGO}Xn0B5oS=9zRRxP5U6r{jWLlH}8jSY5^is}Y06%UG5QI!=N?Wt%@ z(>9{(RS%r+y3sz!=KX@bBwz}qASyD}n1^pJgt$q@zi5vDp{rlyAWt%)!V{DYf!6G& zM7qq_q*`#zCfE;Yl3We7ffLWF?fK2n1Uw&_wbgdcMU-2%t3WgvMmc7!*jeSm`Ky5I zJ)q`rcFjNSvw&ax5=z5|=a&@k>t9kNwO>Xj8!5|QRx@+;FT*5Bll7Z1FOeqhSCo!Z z$Jpk*Vi&5DIaC8fDXc9HqvJh)dtbrWii@=%{ipEJ_Lo=eE7Y22VoS{Y7$FVK0ET(< zkAD?B%aP5mD*frZZxEMO;__^d-B<NC$x`)t>p^NxPYzEAi<4a*JNaswmIO;s)Di^8 zFt%BmftTZj1Fx3hIS6NbE}rqec#N30*s;@TnBz}n(R)rh!%sCsOY4gN5})^9;s*rA za}EqE$QNTB*?}$goNfaVsjZE`!f9==@GAr3rFg5I;2MM=ZHQpg@m3fjqyT@c;b25J zx9*eQz*l#6qt{ow*<zGA1c|lI#$w?;=tL*HX2&TLT?4!dX|!@cn%C?k*U)AtY=6y8 zXqIDGGpO~i**WUYI|9^zo|W8f=M65~2KZMuhri8Eh`1&&$U*C(;6Mn@PTX!MDxu({ z61hhE%L$hUN2+K+&^iD?{xE=4B+JK(R`y$A@7l4>0!wb{?v8N{Zx&UyyLD_dA(PP8 z24W-!x7$f2Yz#zz(m4uFb8!Tcvg;wK`BRMm3Bi+d(vI|{)#7&@{LH6|9R<H1SrP(q z9pRu3<i^vs%Rd4`n8I_k4*(0@irY;?W7~~E5JgDCygo2VMGY27?$`=bK2WU2BFSHf z)fmZr!|u^6^|*6Vm%ZWZwZ_WMmZ`^|liIz*mwMc}sc$$ZwO_!;pNq+jf1Ucqb5l?F z>(n=#o4W9?Q%~?WHO+>bkhrO-)%S3F2f{k~=4R12Ed_^My=fnTlAQS#W<e$*ni8a? zViNpXZv=J*6wF%?M`n+J({rs1zZKzr-B+;-Q|~+qvWpDc1zRpc5_j9XT$7Q;FI{qC zxBVMBgd=bJ%%8wUq^%eB+MT3et(mUw)jTO<{)O*O%7#vo<Ntz9(qx^FM_0e%9rSu9 zW#>CEy3p~{hpups-NShjU$#!;godem>_kK@+Jos#Lf54NS-;JME*#OI&Y3;-2(^ls zZH?`Y9Zi$*I_X_yU#x%EE=Mta|E)SdWs@f*<51L+f7`>@H~t%`aAyBrWwi9&i=Gmf z@$N-eep1%&wP$oE8Zo{CbmI+d=xiB8fMlNHv*9M}!<U(pQo9cy3Qhud#?#oM?RgT* zmQ|4(-$MuNv+1!gIZ<-nw|gl|C>#@*!ReB8eXCaT!u$56&f6@xqo7TD$L$ilAGXF+ z8M7aT{4}p2Z|EN3h-}}FPW7bJ?}s6FQVMG9WyGS!&UQ{$Y1^y50Jp<LV;qsc$i{89 zUq)l{`2*VxOiDjcwnOy?nDY4OD?3V#e_$`A2^TRkG)9(v2-e^b*$?p{i!`AKlIY$# z)qZHtkKlp%<P?KRs&8fHNA|>!NCbz8yKOKQV80mQ7VBes1t`DvV;~zT2S27MRPhPs z@Ml=O`7<78P33-KH!55^OVMXAYKyVx5?@W{eTolcM`YS(;8L*!AFxMUatEZAy?!zr z%_4aHT{=5HqDj&-T+2qWEInY4ZW@<L)=_NU-%!Wne>gzia2%(DY^uVvM$SQditK0` z8m3fh%lZ-iO@uGGz{sT+@G-cZ#{2X^dp1zc{ZyfhTI}_W34HY`{U5vBc_+G@OPrlm zD?-}OZSO5>X>#UsJHPi`z@6yd2=^=8D7a2=G!kZ>Cyu5)<1oW?2tt3itUP3IYk!Pg zBYq?Xjr%TeluI&du0#5N<&5b>Vln4zK&8UUh2!*rmN4&drTPmyw%r^gVX#i3HIg^U zkuTKPBkoH`)G-<SB|nK_tipTqmVAi?)W>ASmv)Zx9?XsO2#a^lv*fGv&<>v1!*+wi zP#^%hgA~T$+^qa9t>YwfGCz`x#lKai*;nK%JK0(6%YCmmx6DWl&yrI&z`i=%D-<8d zzs5)LzvJE-OsjaYTKYAou5q#4!Dt*;{Watn<M=@lZ9R@}><=Bz66`+0{c@$=$9=we zoAht(jyQ0-;9Cq|Z<m$t<2&a3Z|yN^-U3J}`msG^;yp#`S0mXH3HuHzmU7Tul0S-! zb=6|+9tq8$B$@M_?^AQKtkkb5vhzDT`@%vbq#8?yV^g{eegIefuMQ_88*ruvPD*fm zBz=$C3BA{15Jp8rF6gXFd|~904!aX!)T#9IcaxMIwPQPtL@>J&{s@L+Tb(5paYX&3 z>^q8{nd<BUDGUpWEm?zwiIftZayk6$K(v1W{DFo24Sv=|#}9AezXE<MApT<biH)v* zS6>|K@BB}rJXU9S>NgcDB?Ai?06%LSNDXG_?n{?}cUFPF?sB@$UefjL<Bg58F$Kq? z3Id~lgP+MXzCX$OW0>E0Q;r-%XYr}HzlU#}4Ex?rzo`x@#z=e?%ie-{SnTc=E6Ik# zA4r4GaKJ=howvZxc+E({xC=)-m{Rj#SgiL(5_riF%5>_h$I+J>_X7k?geN??C+wlY z>Igk}l_Dl2CeQIy)!XYF&iP8o#>j-9>@vp!+<R<qb3K6kO<n(%pY0sigXab<Y!*~- z+8!OT2tisos4<LGmAVtu_jgi)RyoZO{<P6BOX^SCu@Q@rlLAfDyg75PzyXJuzu0cq zLx^j#mxld<4;f1k)DuZbn-n<qwo4J_$GYNY3`<x2V)t}BEFb@Ze)kc?5(hlIg~<3{ zp@Wx6>8~ih%oj`1Q7GUZ7&|lKQC~2csV}(hS4<Z?hG0E>(L=Sgib23Pe<gN^_xa6E z>|Ne6E2L}+z;uM8o<+3!5%cAN@TBZFJG~Q|ADdkVI98NwW75Zw)L%)d{mo8FsX$Om zT1c~G$!F~Bh!qGr4~0w4*tYA5=E<MJH2<bQU=B>U5=S6?bjDupdJ-x8RrbvM9UVzT zCBjJ3ChAoE$G%I()kj42MwBWo8qYunulkU99iEgFiYdv#A4TFinRC`oYDYO|ozUdf z-Bl|AuSo=oE_3@3^qjQ^yPgWfjo-dwCAGnx7V)$Xzb2+uHP{ld$`?%8@$!1`A9i{~ zl`q&|8_$A2?3^I1Fx%~#fS#eF!!^#e8i|;P=JEy0aWwV@hikd<j1Kh-cDmL$wH3E* z4^Bte&wu$Zwu+Kdd&0va$Va4BK&bsq85!d0q51|(mWH@EU%V&8mDFjChUwEz?BUsV z*dMReaZ<f5GNF9J<zb%8R<1&>RwxT~{fw1Uo&}~0hq+=lJKWXBv&nXCbQsU-T%Jj- zQI0oqV!%As&PXgSIc&QUJvsl6ws(Q6vdZFyI|nZu<hg(-DCz-0(ZIl4V(NgQX=y=f zYH3MnY3U@TrX>@EPU+|*g|aMdq|~y}lCtS&T2fkBSyI{PjLt}@Ws@^fIce$S_y6zb z*@tsb>wUl9_wjSP&$F*<uf5jVYp;E?jT(>dS)D;5V-0Q~D~>gAH}#6ZkvL-&wzlUR z39@lCbffjHjSVuUz(@#8k2mJ9`eSX3+08C2cLZ{$XW+Rc<K#sW1gg`Fem+le;CPn7 z9T+mchcOl2t{%o*c!PQx=jin^7Qw6SWr**27tpVzsJAiB_vhf}-rh!qJJ{p6GfwMX zZj3^vgO?lg+~7%l49*?O`=F}zmDxrGbdjamsv^6uF{A@`oluV?ACf288``Sms1CUO z^!~_p6-%Col#P9jB*N6!pqVY{3L~+E4>ZLg4?t3Vu6D8DH_IaraQTEPGt(u&zgRjh ztLSv(r;DW{t?P8ywQ7bZl;d~dcD+^0vGu{Sv5n;WD~y@wtttJCo*wT8S8v+h--yJc zi@W-RNVZ6m0Y;wZMHxE480OuGMWXAW`>!8h#JTv}Il##ARl5j3Cegn!(%qQ;zcIE0 z3q}9nb>cZjMv%}tOX<I%Ur)?21~om3W;c`aC|JUF<QP=I>T-a*jgpmXZ1TS3j!kEB z4bBjj4pe<rGtijWh9}e6FDY;s_|!feGA8y;UJ1B!WX_ca_kEtd(ijJCY#v&Ojf4+J z`MWmL+i{SbXymBG865xe;CjG0MeWUFg_VO8`Ar*S^i$O`9lLLe>zH<<)C>aWzYGK| zgPp!)uo3Nv4J;mP?BO=X@k5PA)QUiBsV(!R%bCC6&O!gx#sb8xyV~HA18xQehv8;p zBV8@RP*NwuDL~*;_@%)$mGUu0I$2)!Tw{z?rQ-3io>B3EykVd|lrhb2=?}~sZtU{N zyc@}){h<9G7-FR2`e1`QUH4ySaEg_0B;tb`XT@ItIo~he$o2jOEqE!aqpZp|2Fb>o zjCOJ^ALP)GE?cILL+F?<aiDB^Pa`sl*r!n140HY|+~6H3FyfGYcY!h2T?Hxn8TUk% z1ng*;em&y0NYWor^=ndfy^$VErXtZ2qbz1CW~QrS+sdI!Eu6Bw-iY*W!}|Uo@gjwP zgkgJLm#h)S81EY`xV@{hY#d==*J~hQq;bgO-QL2z{(ev^%;&e+k&=0XQSPe=QfKwO zv3~jL27}vkr;Rq8H)1pifD#n|Z#qP0B;cEIE-8#QHmWCO5E5LlBfM|9m2MrQM2kHZ zB;zdH1xAiFvOL}$V5<aQ2buZ|Hs|0VpDFDhioM3SGYC~tJKnx<6QFuqs&4|*ydy>9 z;JqtZ<BfN{yIj0Z?~B*Y6K^(BJ?}~G&Bl5O+=<SOxCIy;DG9e2Q`-z7Z1^MHP<IGI zA6R*dQR4A_fGOAW5gnvoA?n)ANwq(4s1Pu+dv7!H!wMjEv+1f(EcyB3dsF}T5QXN# z=O4d6YV^IQ(RZ!vyv>;B{TNjzdppSFiAJh%7xIy6nEw-5KGDcCW`zWOD#sX98WOZu zvL_kSy`Q0LmdCb^AzU0h`N!WlZ9d7E2opfB+aavL`?nihf!Te#;{7gn7<p|-W}1gM z22X-x{ePADcaR%o!yU$CcyW^r;n!rAP&vgo<lBc9v65rXVC#Pv55M1OB>DEc;YX#{ zooM0TutYZtZ!a9U)8MY=gu4uEy)KqP(~Nz${@NfAD%=xL6-riBHXbY*3HOF{Qv6$E z6Tr^8+sLH7>TV?{7vF8rdR2Y5F;a128>v4Fv%Y`2G2Hui#Xy&eOgE~KF}ui^4X?UL z$<E_NC<cqN_b6H(dXM^=bB~I9<sPG_??4bI_4gQOya!zpZ9W6U=$@_LcpnslJ@-Y$ z$%Gk3yH>P^6aQ3WD7VQv|B&(-3f`I-2A9|(XF?QW`Ff_3)iY<JOIOJLndqJsm9ro* z(gN*f8EK)Lmy>2gV_E-bi@1uCPLY9<`whFP@1GjB!14!;cn|Jhs4jtYz!+a@?DN$H zV~ZX#HiGg4N%O#K#^-LhJ0N**fl%|`8(B@W0B5vR{mvKP_pc%2hL%`}RXxRI3}f@O zK>R{iC5wNrh${7AMV50OHYWHE>&QUe!^Tu^*xEPglLHZ{j&#evWT}1x$BZ9Yh>`G! zBS4Q{Sb%=11Zam=oS0CBrkz&{*RNy)Mei2b^#{Z6Jq9xqMeSDuW8)Nqumv0q*#iC% z04$9y0vfl-&_zZc<7<E&oZvZE%B)^wWcmK(Hs|Wf#aQM4ChY5Y*w??qzWx*Tbt3Gm zKJ?4;t<)|yoY$iCnl!;nldL})liPpird4`5g4qvE;iw9&kXQa_WE$LW%s=M3KT!Wi zBh9%MgVacgi4q))OV(1%<fd=Jo${0K#m0$=<;K#cw4mdji%z(1E#@)fUm(o0j~O}M zoJ-`PGcDUn{+5=}!F#_9nfADmd2^VA!epZril9^_{!-uw$c55SEPd~`N0B4G2_VBy zy5Y0r^y5Z)_bWk@UIeGZp}T`SjW1U0e`QpKF(Eb!*`D8r<EO~NQh#u5TZb!*p~f4C zNc`KmbGO315XfF?EQ<7=0!@7s+cEIfN~0>mcN#!&-u8i%SAlWY%Kj>&Uktavwniu^ zcQjn4q&{s-7)Y}O|47ud9cpy5^;#$s8*B!%Y5M@<yTV-|Nhez2;nb&%E=q%B7;gAl z9+}vR2xT%&>HNJ`+C5`@gSYN;*FrS-R~ubCKRLfAtTx7DtGx>UbTx+2v(9g84Q5XN zlcF_7dM7S(kxYngN~oV*bcfckMQYX<DZQDLu#&Zi$Hss#%QcPTC1EY3**R7`%nP}K z^BFy4`&uK(i(5?bQRc;o2>1_5^P9ZwIz|9#T~G$Qmf$pL^xZUClAkkvhHOh(hjI-W zy3Tk6Mx0ta+T?8(E#I!g^U<VSB0pIj2WhR|?8X)MsHLr}UuQ%IN}h+Zsy0gC<no`5 zKF-g;?mrt#JlLT&eglSv=CXH#(a(zukYZjiuJ9a{;V)1iOZlt7a>)zEG{A8D1%umy z)TSi8fRP~MUgUTv%U?9cb)sFA^hTWFr<(AS8-jah5Qsr&6-+mo8x0%;!o~<yP5)|R zu98sb50#q@A}<l^82zhJGd6lvtC2k6C8H<LMtwUfuA`w6pjg^2@Zx&s*m$XU338pF zShydiiSq(`jvRRjq>TMNFJsKik%E_vVK_6h@@0dUBH<0bc=`TiBUNRyr91~~a&vEu zibjS(n~c?J`W_|6H(|<w9T2Y=OVmyCocEEm*;H-3D3*l37#|>2@fKJQ4qWH6yAu>G z(wLMWhb|wF#rF+x7(rcmHt1EOr&<rwv`PYLKnFUd4{F%;D%2l$8`zM5QLgs+P{fnE z$!;1q6qXEQDWPHfjU!u|6;>CtvHXFNo54>G@Ds3Bb8rh3gdr078V2lG>HiuM#s((6 z20}ras%=K*MK-e>*#_b3iw+pCgW`d0wP`F0eX56+4zg{#>IZBZV|Tcl#oE=-5)&w{ zLFZtOxa&>SyHU=*2}Pky3g5y6495PZJB%J!!_3}cIOn(Wu`LeE*mHM)%F6-^b|A4k zL#^Kl;=-KuZR3%!@%I6=o1!Qlj(-jwUU?fjbei;f$M_TwMZSw69gTb!3JeJFT^J*< z7it$24XiD`XUsLC(H!0B9c1Twu$bTxg!he4y*O&s_XFd7eCB>;q{UD<)cvTiFa39; zeL1pVw?cgNZex)bmx~Pe(74WH$>I-<=R8LPy*@H54_ZBFkHOt{XE&HBF{A*pmyN2O zlCpBRjic6xyhukB*BU##cwGp~Y^`O?$3_B*D*6~GFO#JoU$p!7GX?5YULffc!ygga z7`B?^6l_eUJolNg1{5;<uf`4(ZSO;^I9v7fZLysLXZ9IM5om4hJveu{;&aHqoC8J? z0;&%{?SR$ifSMThKWL<>PNLAKj>2(-e}mx~X6*A1stLfZgT{J*H1i*{5mo*Z?65G9 z{ZH^R3Y>FDsk7@2sdC%ZL1IGHtut_+#rrVT?W;33B$NGED4Rh_pxB|1Z{V>tpQCdi z>@Ee=hd;+?g3GMFQ2pi7>d-HYKFJ)1DeOW8-XMHyODgPhUns5m;1^2Ho&EyggMbbr z5ZA&T2E=Jnmy2f@_8c}&D*34d8H!*>$DyOS50SVCGOrvvqSWZ5qu`D-8Ff?vT6|Oy z>V~6AM(;ifS`M<+q%VyzNEy0KRV|61`x0hDw6V^jsIQ8&)8xcgm~W@a*kh{D(qpQN zmLF5%7itq$k=x;NEdQB^DCssNGD=PyGiEB?pTdjS)V6EPRj6ex`5HzatRjDH^y|j$ z*qRYEqPdbmt$|r1;Mm)wt1^lE7g||{)fPbVjm)G6BTQT*HcR{tHu&xTg0Wzu)c(s5 zwJ|NbayIN7=Q?1ef5|tH1S@bY36Q){_J5<$6n)${1<}&v-%!!r$x^`|W8*6(cS?{& z|1o&>HsOTfS5lX#XOEI9G@xlxa6)m#On8dhx*?X*Ut0^&$`cS@xEb(T)9>y}%&G?` z;4!g}4`Z{#_8u5s<G(cyD!ZxHlUNB`>>|wnozYH>LVcy~uDCcUemn~2iTgo)DEZD9 zt18wMqBnS?$?@+Lb!A;+`n@oXB=^ACpZxEQT+FD-zenEzkJTq3E|m%=druleTJf<W zc7~pR5QJjM`Y!}GpuF+F#&6JV%l`{|Y3s^UuB2@*1wR-gz415=m~C{B9Y0{?PY8)k zJ!PCyG^|HEB9F*y13ISP))ic{B=@v2<Id3O?`S52qe4$GiT^w}h6e{m{2-BV6d{*s zInH)aeM&^}dIco7sEqJQ&f``mj>p0X_M@@fph!j?jsy$T{m5x#tmOWT30TWBMya<Q z)Ti|3oda9Xz<i2}jk5k{OjK0Xqw>)xzqdoQJhU~ogY5es%mjY7O-Cz#27Sb0za;uX z73TLP={TuQw0WO>ZK9pxOAdyf#V510!@k;%I`q79V9;#`Ti1khMs%wboeC|Wc1pgP zg0;fvc$BmJ9GC>BHqOD)5xcC5nHH0Z<U~AI`q{%rmlc|QI&p&r$!`c8{UkU}rkJvG zFy%HAuq~@IIrPVQ%ny2}Au2fHxka#>Cc?3B>N)HR!W8UAy@NNyYo@tOQ9s*^2XPg7 zmAAla_6g&sDY`h>i##gob_Aus1#1#J!sNJ|8)5q46-Jox+_-XUg4sdl#+h-lKEljK z#E}S-dz0-ZPU<FTQd(eA6SIW}H-Hv3HS-Z!)70FGui|FrJO}}$s&ol$sbn-qHdj@} zKH=sj?MQo@n|&DQ>~gOijPnIKk>-4qw=+`JSs!Uqsz&?FeciQjgqWcQm<Pv&wIJ`~ zw;zt!Bqmo#TolH8@@80YWnaABJt4~6tIptmz8xBVezX}$W%#At;K<q0W;=B`u%ivv z;#h}liZ;1B{YbPqyIWVZOAF`@5l-i`P7fRztqa_FJy&I1r032WW<YI=V3Sx(L(lCp zP5%JWL#7*rii0#lwK*&~(rL97QBFEZwM>qYg%$`<d6+Yl#ze{{%UpxAHe+qzAM+F2 zTmdg5#vB86etwKO%#$v)G3F3&hO6~t#+s?<s8O+IW^jd~qtp$+2ISSTW;vpIwKVmb z#-x_2w&g9&)hM-poOyzUw=&NtkwJ!2gf6{Wn^V<RG(AHk3K*r7Jt=AqwQNsovw##5 zuK+#R4?61Xcr(|tGO#%w1O@+K0;m_Hceah0->8DIZPB2WQr#ArSIV)r=2l-f;E+|! zk`0Mwj!KU&7ogJ!QnQra(!ZTKvQcR(+nGz)koKsz46h%%Y;``;7q?gZw4psoIIzFH zIfS!;BtJsSB-d}IsI3QHREw?og_y?8^8>rsPVNV|X_ZN4i8_;^3npDDgaJKW@tgF| zKL?5Hk`!0&Pg4BSB-z~Fl<I)DqP8B(l*uL)hqK9MpRk>Q6afu%HoT)r4QjFS0=qk! zX?(5oWQzF+LW@&X`5RKrbaj}7;*AiHImmsq$~usoOhrS{-<?$JajqubU=!F*Ccv?u zPUci3INr(3X>}R;f!V33GS=B^l-pV5E$j>_0&eSU=BZO8WZ@LJo8V|tAr_oES&NKI zGrIuM^V2}<S~{u|4}pUa-wO8`W_%k>UF4|ND1ohT0PA(Bnd#1Urd(=b@+7-1H5Yj@ zIV!iOcFOffG8-Z0*vPSyh{$3Jb^K4KXn}h$AjS5jn?uopqzp6VJbkn~nogO;!Z=tv zEt!%5P{E2B3Io-SSDRtZ#%Zjf-9W&Gly)<BczY_np{-1~Ox3XNGLWnq>V?NQ!UzXt zJB446aBybJFT*myOX&Jc(>dNjxkkL`DJBGarW#=OXPQH<Zmd#}Zz<_0nIQ;OtF$`7 zuBSTD%kAhel|rUuaS)NkS!N%lr*)IkpR7c0Z?|#hvdm&cqjwWUx|@aIo73GDb>;Rj z1Byl4%h?|0bR?SA)6DZ+&W=!f6IDl4b~oeI`UfRRP~g1U%PisCrnI-2(yfmx2pV@U zdxl+`9U3pSz0JeO`O4+ybZ=kiHCU>;mJAeRBA{4nl%Zj$KFF_Bw%FG^ILWlcGZ~R# zWmsD`or6!=cz@AM?8H>MHxz}S1_Y^G#I=(vD;tf+6fRqFe^s^`EfrIInr+rLW%HX# zRx>k2KIm&M^;{u^S14Yuy2A7~5^uY&Fej)<$a&IOa{H<A0n&G57=Ov|{^&+rLD(O( zTPDl-h0DA9EAe07Kd8W;cd!WXJCrH80~9=^0~Fa;4N$|?!2#et>{#9hY5&M?%uz~x z(WpFcXpPKKoP$|>VhAUwJS0M*nSTn2Qk<je+m-`_^^;@HS6vZUHZRv4i%Qk+K(3kK z=^v=gH7$=~sbA__-G`XlUTKa~9jCjOFw>E!w8}t&yIg8NiHTP?XovN&R9^{B-zdl6 zg`46fBTr#yc%HdBOwrTDx(iAvgUs>m8}ljk%^;sjeY=+Ny+h4uB+R*Rqu~fG*>(WP zUl$#m1ys~x;%FVl#IeO-b0<VDG&b0n%B0;8liS6shd>8#gi+lP(>aQoAZLdts!SMa z_EgpCDIeuuP|kq5uf%r>oR;#};J4Fhr9(Le1#lZRR8BmYeziiy!K+>20h{J`n0#Q7 zgHyNPxKp>;*O=MADh~DFlqUPH0gbPanZwWlm_=>__|BNLYnYj%Mm{R{BqluwObNo5 zI^3KP&KOn0%@iFHrl_ADj`G81x3$a68S?J6Ah<HAyA~rPw%1+<FIVcX1L6ic-j&Le z{1IlPoVw18^9*vr2Rq(XQkV~EI7Djm&5@p={DLZ7fYJYI8D9Xk;u?9S0HR`;oaWbX zDYza?dM(z*P{nnQmoM9{H^+Gjq+kRBuUDSrj6#KDMxerxPWULtyTOUx7>pj{gpYN+ z8=YwX4LbKYCw#n28EH<I88={dac-m;>A6K}N20a~%9BG(zi%XJyVVK5&G9BW-XzDn z-SO^lyvdG-`5Ozm)A8<dys3^iO=jL;_U!vx&@{~?r0dRb6r*Hbiu=2NA#S?V-2ll} zBuz$x-0zWs(HKYWmD<rj;S9%{>3BFk&%pbXC+BWrYet(Ho;gnV{Z9CyaR{G1)*R%S z%Ya0gI>~G&>kF}C`_Q4NIOtxgl;1htgN|3CJlS(I@}9cUER^QA0EgRA1?Z;yCNzDX z<IQ)x-&c+Ur9G_ve?;oWfh-m{9^Ovi*B=~j5xpGw<|ZJ0F@O8z%y>+8{uuK6QRnxH zo6TO>3R-(J3NDw(ThP+Sr2G~%V9YI;C_c{LeLNMi>lR4yrIIuOJVe|s<Ig^xN*O!B zTqG&Co6A*ovgdX)+xeAv2ipF9p*cl{1%GV{{yG=@l{uN|ZbQ1clTBN!$!3!0>B`BF z4$nw=q1jVTOavdTc7FGpgx_oUJDwOWz!F@;?`Ku6=hXk}7~V&=-VPKzFSWO$lmDzD z)(11Rlaf2o_zh0VZ|*?K7gUlLC2KO$<E;8*sLR!XCR5DqjuP5gcHIf887jx`gy!;+ z^t#JjU2?(MJy4VfcLN;9UK$f9_c%}_z^BZCcnmYKD!GV2itA84BD8$Uwmac;T6Bes zo@#av6N;XY1XQb8Sc6cko@%CtjW$|~!@2gUX8Z+}b8?uflIk1o7?=k24R4!Fb2ZHK zhveF6=01qTb-x8YrO83Zv+o8Cy)47;HYX}OGlwsh%B5=}qaz%7*Qu%YZVnKY)77|; zG#wU+O@X565QrExFrZg(4gjSBR?mCEb+}XTBfR%<C>HA=r|vcJHoQd6P_vxu8D@U+ zD-Z=7uy29;HyrzgnwM5QVr1P6Xb-xS2$*vByo>+N%rNJ8{vtDHn&Np?qGzEwFwxC2 z{V^O!_@_q<LyBghK5R{xW#$B9HExee{Vem5<N&}RveH#nv>Y2N*gI@7Cq%6zw*s3r zryj)0#P<7?d7}P4OkOri!R*F*TFva>z#MKjN}6L%R+sh>pCm%+036_yx*%0^%tZB$ z3L5};Ty*cA19n!bl3!Bp2QT1;g8R+G-Yr<IsE%qYIak8cn)iU2dm{lQE?GQ(`{CG5 ztqTWL3xpBJte%ag3i28%yja?1Quh-UDZhUJBivT8=c3(4plB|pjezB3v3btBEt;o; zI!gS5O06q;5J|8E^`M%~9DC55><;gvN|ef3UIGaU<8z6buhb`2tnm@=0`xinGG)Ux zQM}P&*ELb;GNIHgVyUI3sL?(~rafdnhmg23jHD~1sLXsfjDLs=)qxeI&&T_EHr(^@ ze#=C4fxadcF80zUu1O|M*32^xpVw8C7j9S056)o~U7VP2#wq^PW@IXX<V|K#ToXw8 zz1f`lRF{WgJmeg%C!$DVTJcj2h?hkVLy)eJH4nqY_l6WcVs7+o7kdHlh9iIr%`{om zuX(hm2Ct;SK%#<%;k?KAh2|=Jon07&E9(#7Pwe{p12mAgWZfTNj@bc}DtySaMW#P_ zr~Y&SA=!{5Qs77uZ_9>75VP+DdM!3vc(L~{7f&8|cfpd}%I@IaA5i+JIg&e0?rGw~ zd5yo}Jeq$@6u9$IGecRQn@H&^*xoy22^xh9&6k)JZr7b&0=TfKU5+!$q*eYA8^J!4 z;&Sjb*4)Y!`yVWaNly`QAo4K`sNVNnk}G-K%<#UiKHAEvubV(VAO!C`oqZf_q=*hx zfweK1;a8$M+zvkn_cxBLP`1~_6@X7wB2``=bh@P&@^(w%QrJ(ic)e5^UlW!o#IIWx zR63zlE`nY#z7jI<L)l#kxML~>6C@5QYOOa7%e+Gc4N>cbx~+Ql-kJgUbNXiKax?$V z&`HJrA463Gr4N6?48P#P>p}vP&=YEk8TlmUmPFWPQoE00{YUJ~&41F2Qxgn5#9*j! zC>;sA>c+rlJSnT8*yT^EDP+x)py`hU)4mk(uYkq?6T}MD<!c;o{|fT}0$*8aI`@I- zn)J}n38iYOK?%a}FcXB>PpSE5!BdW{{pMYETbcKiImzwg<4>8xx`hfwn!DH;x};Y4 zO@d@C?3`kWegR}r@+VX8HDCTGH41M2lbIjfuEy3T!0A=C(~`8xoPORsk>X(@91Dgl zTxBM9-{W#*DAfjg3V78RKn^$C=~a%QrV1k*mItcTR33w{UlN}N7o^G1rxk!xo`yw{ z#p<~=n{^dj+h9@EPh%islCCm50UP8~o-xPjS(S68$?|7{BwzCkimjEpXOtj6`;56L zIh156Mv~xy?IZ9~`zKhix36|a&(#1G*MF=*0oaPO2DE?`iZ$A9U%6Hd9SLi7fDBrz zhK|y;=E%N;60CKeGB(K#BT6r1_?acq&zgw}58ApzveYt%?2232-ooDJRf)dHRzx?+ zI<yNWNs;aK%k)>V104&{&nhrCKWmPo6#RAp?$*hA4uT%rSD!O82T-zU2Eb1>B#<-+ zAmd1EBp2d~B+Nhd5aUnFn&-eM*fZ>SCs822QrDS1mBiHL262p+{mjfTDkP4$bfKz~ zSJs(RRZiBF;s!eggkH}p9b?+_ivOyfhipDAr=N$MO_Sk&RunYt&q^4S|5@4Plh!NF zDqN4R(^9|QJfucm-6@(ygSX*eGf2AcV@=-je`r2>L3KIIM}FD&0#wIO<k$<U-mI4) zhw@%Dom-}c%i<T!*~!#asq!Slk*w3<*nOYrO|p`@(R{?^{pyV{kg&rw8Z{Aw-n7P! z*MrmL`28swfTu@VaWh!8={&QEi(9LKCu~1^3Bv<U+RTWIuNX5Lr?Zoq;3Bh^ASxWD zs$Lz75oJAQlr3IXD-dWzK9E=XvboW>H;9_-P3Cl!!<GUIJK4syZy6ofvkBv;%Z$fg zL3LQI{foKv7jYiw@~XMs<NeGX8czhw8h}^58Qlm@+YG%TN9J!abGn5RX|Uta+B`TC zCMl?a$m+K!GE92S?5Q>-_+)$=$ix}1nO$1_6|JB?3s3a|>F#T(ehp*%J~xU3FgwVJ zI`|sK#IGfCE1HBeDO=S#<<70Jogi?VqW%!$&~St(0w#-)fE%D%uuTb&ok$VJ0Z616 z%i(|~uPa?5>veOgA_H}c&ys<9-(+Vbrrn9k&wjwGNrL+(NeYaQaO3|L8n51ZzVhz~ z!avnCoh1$5oMN)b1EE<iP~<@@|2@~Lb$6!y2hw(dPx|E_;iuBr3qH|DYWyeCFno*H z+aZ|Qid3mt>WxokC_jlKo%#?`YwZWu$ZR*`2iN@qKpgt?0LG&DM>Uxhe~x@wYuzHd zx10Xp^(s2a7mbr7Ud^0`5v;9{8bzrHCyI!9{t@_4CS<-N$frlDEqFCn(QtVU1k+Ke zt}zo!zC?lxbr%aJ4ljhiuaF1-92_DMyO{l@N#NK;%G4zAbwj+D*NDGq#+Nh({9hNT zL({}J4P^wM6b~h{<G&LB@9=o};!U$v*lkDuL4qL0#eU0-H%^4+3AyrV%v<K>l6pkq zUl>wC`QqCP#B&5A(SG*}ao=AcF0|Z}PJGElEB^1V6!62Z#Gm?=_|q!B<l-&=@mC7? z=~v><Af7#u=VDiL73upd;uJ@bE^v+2P7LIs@&7}-)(g}vSJ1-W=Id@dq2#TVjJKf$ z!r+Fhs2HA&-@D$%n$yp2m5!9)O<3yOJ1fy*fmZ@F&_@#Q*vflH6<YL;nbL|taD-%X z{;?!%ZQv!3JKiw|smJEYcWea9q4Z~ZRin#ON%+?E?m-%+^}-K|kPzOBL>x&e0`Y)M zl|vYG9Ze8U^~Eh;V)vMBWYxPE9oNd{cQN4$P23cT2@nen0wlFP?0EIcdox7ipA&^k ze#~^EIlhBn3GNSQxH1?C737gf(jZ51DOnDxuH6M0q^o9?gqI!7w(|BHJt_vlKzI@y zWsTNZ_?z)8hcYG<bcXSd<wd#W5zpFeHX7!}%g#0R{iX#XIgQamDjMI+WVo4vpoer0 zbzvgiG~}iC%m=)dp{^~Du^W{YBV*q;XP~*e--n$o7P0sjg4xp4X7PP>3pCXbkU?-- zI%_NusFujzK-R-Q0LjLMmMZ66-qs4y!6r!Xo+?cqt;3>uV_a|6tzlv^=4Q|6F#J>q ziVuTDT_l$f2Fv)}W@h&`p%sMCEm6onwyJGt8rinnOl*_r2C-uN4AR(Iso#x8w?i0% z3DXv7_aW>EYq6`^OljX9!7Q_b>-*t1U~Kn?&}Y`l=?_hR-z3D~Uqg4`Hw82QbXzr= zl98~1%z33;-;Vzm*;B%@SAB#@!&=$<k?GtKuPaGKsvxV1y~j-H%f8oiL8@n8kUkp2 z*9loesUJiB9y4)ZX9Nd3zY+2|kGoK}riJEdAQ+@pc<mAzjl1PWDi}F1rNT9XBjYtL zTsN_6Xl}t(f{F56Ei7MbC$5D$5*3$)6!;eg8e2^4lQP-2=|~Xl)5^-`{`M0QN}O<S zQ4{#da5@Y-oj+DHvEq->`Pfg`#7y*QQHf>zkIi=*wq{6a0LR!jePUL_J~io6^N_Qf zLv2@@u-EL5{44jm+pxMw-Ch_Gv18*i&H^hx#VqH8&tL#sAysp6*yPZhNL(k-45!Z$ z|7s3LXl{Rmmi!g-GVDS8D`o{Nq~@=jo>lI{2NsC;L0G_)x=)#Vu)n~$FUv2r`=Pky z1nT#jQ`J%Q1Ll}cdJ>{_0<>5mNViNaMM%5xxZB8*s7P8iKSA{^51LsQy8(3SK{M<I z&;jY#(Yz6XlAn$<pda8DirIhA%sFq$&;zxz1F&}d4;Uy=8E^lb_zw(>xMletXygj1 z{fC<NrT!DW5sM3?&`NC1_$QhkD^>qA^VHTok}EcIK8l;$n;*iguS_xyVFjxUTmIGT zrs|MVWp~00d&h}1GZ2oHMnKY}Nu8N_ftGGIu-W=hJKQ=owa&~^OXt*KNiqBjHUt8y zjbn>VjK+Gwp*nVK<>#s;xu2_jEo#kX)#qkG&?d&tpk%wKJ&cj=`zL<{2>re=6Z&d{ zn$FB=OsH<p*>G!w5kxYVY94-ca_(te`-OQ0u!}3Rc~H2?VRJ5MsPwQIudF__uQMYv zkz|M;N;wv!Nre@JrIXsjW=dBk=k!D;*F_*m6{)l1;Q4xNLM@qx_jYoQfV#1d{s?xo zar(t}u=-Hp1n7={Z?OODC`jdN>3`Hr>&C?7Z6@Ztf|c=lGcEl%nbG13+;i0Q->f-+ z@bOP)VbfR)1psGc{Oy5bJgZ^nbb_Ox;H-_so>!$*$F%fI$#vdHS&v6YB<D-BT5Y9c z?<B!Bsr(VM`0f9KdBXpdIbO+$E>ijxY=X3sbdmjEnK|AJLmpZf(Yj6JGoal-uY~8Q z3_YgUVVdKWA5$`F+c9&@)uHAYq9GlQe=lqE41P15?Pr@7qHSy^+e6&&k991R@n1u* zz|!)yxmE4z(IS$uvt;GJFuQkPj{Zj3Ls5OAZ2HEW1ZzveaWlR5#XzaK04Q23TOo6f zD?`}w<H}fZ{J6OZKvex3`(jjiQvV;U&P4nNJE|{}1^+Q8HUuxh`DlAEY=bLKn9*%Q zYu8h3r-YglN+=vVp@eBdy*aOaCNRrHNpL_&aM)HoUumLY=lHn6fqEs(j@4reBlPoc zvB;}V>G*>ufD!tgGS({PUB1IY9k=o*NuBh)nJHhj!{ve#?!Y}P)4zv_oEXG4jPcO) zzyIFkwIIbOv6;5J+tXjmx|8NUB{((uN$)+}=#e;xfmH)%!Dickv9k-S_Pc)oZS<7- zAHdTaW!fp!ji-1|sX?dzX|<QV<}?hdxDMnrhz)nyJhmKnLuBs69_pMQ)yBlCA2HJ@ zlVd-cXE1^s`N?eVbq#vBM<CG~6Cp9Lx5TSf|HD!x4siX??CHgAJjr*rXe&$pXO2hM z@&93Myf?rk50l<VHO`t(($C5m-T!B^kCGOl!iA|wg`~)2I4zjbfS;8JulZS7pw9lR zn~h@?%Gxyi9Hc9F{G49El5OW8c5x33<2NqrV)^m^P%E=*mRl}4fSj!B;KefRd)BMq zSXN~X!_#ud`F|kWWA))MS`=Y%MQvAvmG8S8?NcHKKs1eS+XtValY(q~v$y&h^7MLd zTkjP(ILQ0<=QXj$yXefirD<Z|ToY@h2L~5dHna9X#hcdLO7X<tJ||1P*@pwE@qrzY zRwR?`_E|eZu0<?5jKO(hltqk}e}@&e6^EfXZ10ErMkW;FKwW+diybtrg*90{m_`~> zO_RD7)-XkUEhH=2@^>R0QUnqy09&QvDIDr%M2HS!x@)C4+8U$Gl8I6^Bnt0LM_Z|C z)TDyNBG~MH(#x<ay!{Qi=P9fR9X70N&{R9qdc-@xP&dW|wwo3VuIjW;MLkYwSu44! zX<6GaCMm^Zk8LebsJcYzX2MK6BgWe7upEwb9rxNkwubtfC54M{*UXGqD}hS{o;xCO zJJWispskO!qLl%cx*%JkRa<v+;Wx3?Ak>!C(wZB*s)ETV57~;}NKH#iF-uFUpW1M) z+o+XG2cfv_oqL@}#aTn(t&Fp1YORm6Xspg{WqpHv6B(^7uGcp@Z5JsYw6=;`g_^YV zq+wQ|Al|}iW@sF#m9VkaU^tHGL2(LfXl_VNg2i=_T?tku&ujgdV0A>*?b=vV5sIU{ zX%LdtZBXhgIoQUUfv<wL)@;wQz^=B|BJMQ6j>I&X+s+#9qwpiPk}F&K;=MVb-fWyJ z@js5+Xj-(lsMRI3x2DGAf;Kp+U*$rzLYB6-xKp6My_K(S&LRI(Pa*7_0S{C~b&xY1 zaO`r(=w`M-jlm1YRzVT&VC5nIkq*{#-Yea->-|=?T4&Bhk|a3N@=b7E;PmJL>C2}! zaE7rLT2j*y$0sub0N0;{omKOatT<0uWr`K=<G@G#rJ2;;h708mBw3@pd4_yGANL>S zbOcRe3wAQtFRk)JJY2s%*}`6Y7MG*)`(@7zT#+{>8Rdl~l#byEGrfZh=U&snC>-~i z@@7&VC_I~D_48h(n4q&vNVTZ_6s1}v@ai3}sFSs*6_;7Lo1WO!eO@efXDi1$#85Zn zwjT=Q6KUj24}2}m_}xJkbOtpZmD<i$&*ZBcr6jj&Wz0#Png+oG-6GAJ+eTMC5UC>I zSO+m?NvYrn{HZjnox0%+!NIu8@S7?UJ5uYigh}VUP`vJRmVKdkEwL^Tf1O%})=juT z0u`?X*Tv#B!Z40^fuKJo8C|VYK8^*X+O&#-2Vtta6g|CB3a^R7?I4$0N$A1yORcn~ zOw~eaM<Dpnu()2*Jl*1D-N(~0*5LSj20WCP!SO?XEzbZ4Vw+WlHCZVxQDSF+O7pr| zyq^ofIDFI%f)ZENb+ep@Q8f2Z6cb&f1U=yhmOJw@YY8fAk_leMIr&Vh4^IUobw_z0 zWPvK(-z~bMCF=J)cx$?&!;e+|s|Dcit}0FFfsmX){~p#V4-VHJ?1=*mkRmbnK!8su zj*L|MQNEF+UcvCz72EHLR#!`0<B+6xnClP6us1fcql&v0g8=TW_Fji$qp!8~<iFaR z!X_uM_;Txn2itRtv#mZ#Q67iJkzUHACfiz%9lO)|x-sN+6%(lLYgx_OQ<+FXSTY=y zjIM4xX?e69%(1>{GXkB@0l6IMCc>ZMCQ&+Didvv<jUbjlGRcF}<bdZb23maAXVgIJ z5v6}IrXyS^-{9m_RkYuyGvTS8D=9UcP1_?KJjmp`Z3v$$t>K8Mz0#Tt#AoNBY$W3$ z{Uy%<^Vk5MXKhpia#txDWIcjJrw1ugNg8aWs}*j&p3Lz_*GTO>0^dX6G^<d5Vp=wf z2!q%ktZJ<vY>iZdsalZ3^#E5v@Qjk8tE>vo4U#nkw30Xk^f8*h)7y>#PP!mJ%jJnE z5WAAzV~vViF}f}qV%ae_x)>%5l<YUj24uxuxci5I_{YoXAy%g6X7%O0#j$sKCqV8+ z8?BS6dl9}+qiZ3`V^=U73vOITxfS2KxwwI4sFkAL7oo`4!iF{9<|bn&GB;j5e3JLu zU2V0CnRwy2{N)kRznv6XJeo)v;aH_xbo;Nw-|;K)lSAXV41~SNS6f9_PYDeVsh8Mh zd+tO$+mQ>F=gg!8jy*t~<SxYFpNl0fGTuJ*SBjhVEAhWYJd3{D^{2aj5q#<ZPKRU- zv;4+A2+~q_ixfQ5JkhxK{Gb_OLAleL#t$Ipu$)l)BtC;->}A%)E+i~7QG`~7wp0$c zQmzioNl`e+O*soGnd3g!pADZi@o_dHGzCtB%raU?{{kz~2(>S4k)^|}bhWxbftw6R zbZdAaRL%<{ykVu{n^4Skp(utQR)yQmsYnC9RaDKc{vFb}6wVdS+-srztd;rKV%)%* z$F=_-Kt*vttZD&BjhlF(JR`&p{xYO;%e67SZW`GoNUWQ!SC?53JA{=GWl$rpgK}9a zsrk@A9+GMKR{ovDd;}s{V;KseKM#J8zC!Rr_9l*qpZRWuy716)e(#p^F#I5`NcE!T z@yQzAN8BU}Tz?^aMI1OqVkLHKjEg_G$ric(V)zuf%z~$O3NZa!D+Q%3;!6f2<YE~8 zqnrCt_-r46xmemIZVjRBLvn?ma<`nv;FFd}n+g)oCGz<7R;%uhBZ9qgq0AL-=B4n% zkb@c9^;TB$GB>``^#y)dB{<*$&2hOK{e<g3d0w(LOt!*}Ug`QzotNx1ll{q!Ugi2# zZn6d$KYXM$%y=5X4QR&_49sRDt!TAgtBL3tq`^P8Ym#ni<?pr{-;Ieg4M|8(q@^{8 zZ>TA26o%`yGJF(>)SYpzA7#z&!I=+pbb=$FFz2(#Nz8}F5fH{bXUJof5goki42ikg zy43qT40y{UI?A3KFirZi9J~S5te4X_U>H`*y5rz&8x1z!P&vjLqPFmwQZw4><GT;G zG4jO=vUrR&fmatiHXQfvPJb9TRJ0gt@xXf4Sg4)~ips&5^3NEHIX+gU$6~-;E7fCF zi*_ST%!`1S-PwS~CO2YYRxE`#q6Df5t;N0tMXbKjDn`LcH$nNEC3PjZ?q%Z$Z)8k5 zl28ch_bjlJ=_Uvzs4+KLJukRDkV+Z<Na~ucwT?m-AOep`|8Z)PJbxUZ!2z*xfV`}7 zJoE<WQ{%0E@YFGjlJQpIfZ!Y#Id#WU#k&^YDR2|vSn7oraoXK%^;3J9*yj{dnhh{- zyBU~*ZgjKd82kq!HW`kEVg8I@>R>lx9*?_bZb4sd#91I~NBe3Qt8Cs7I7%tzag19< z6Cn0*rx-l7y=)w=N`zh|voO=0S7?=o+%%ANALb1`Z?$q&LLYPk+;+F*R%;z9%)ZUa zRK|weP%@z+{F-hTNa=0XbhS_IYB`CNIEj-w(Q;OudQ0RaYhJ4hqoZmPRLYgIiyo$$ zlQ0HyUPLl?ntk?;MnT6U_jZ^+aIE<bYnYVWiK}_n-wrZ7B84}=<dEpc?mKm1;`G<; zIO9&YAa>BDl6r@tcjTP->(!)A#sp@eyfXQszz?4S@+_00DHi80C#P7O!t`>Eahk+1 zle!a$UzQ_xDjhodF4dd;??T`vDZI;?juL9|rOpjyA}48syaH?}R1huU6wz*~HMKXH zMw5~j=S<pIWeCUWwyCHWH$B61H}lzo-LL*>ik}Bf1Lec8I1SdnS0wkhm>OVy`FT`4 z4&E&OEeH=M@P2E(i>5EX+nNX?;Mu#aM0JEeAJ8PhQABy*f)Gis=?)uB2aTie9B<up z#k?n-xU3=-2Tn_o=|$EwW&NViBe^w{R9~bpm~f9ZTTM@*Wa&LHExigQo=-R)dI!r~ znP+jM_?dekhhP%A7Z9(I@%Lf|nig1kuNC3(1{@nsATR^AHZ<<+Ol9gQo&^tIvmgy{ zt^0k*2!6cJ+Um}OhR(K1)X!^W_iSr&NvK7iX4iB$HXGMfs&_EhIqV4bCB*{81xcGS zsWsd@IR0h8(X7J8j)v<3$Mnq4KN_Q$SAUZ=K+!FO22w4DW;K`3k3u?s+CLVT{Lis$ z1??zla=!%$TF?ULLG6~&QF+MEGLXEx$J5$JDy59yEaUG7VH}mx`>n|p({r)izqv0` zU0lej)he3QzJMntck347T9ek;-ui%*a3hm6CPfNMN;q~QYa|&`KJl9^)M1fs7zsyX zh57t&rc^y(C0@?rIqOS;V=~U8y>Jn5qz=aOj}6)44vk-XrTcZQFj{?zwUR^6n~^?t z5z%~&M9;Mn)dlRVM<Xz_4dmZoxD+6{?|ASm(agD4UbheQCsMMM6gcuMa}lHm;MkuW z?;>UQTq~{p^C4Ln%q$b(6e7efw*0=OI*DW#TWP)rgP&9InLI&%B9o>q{0!3GRZ?AS z;T>n4Ob!++ZjSsNLVx_9OPEslI}8HDey5Bt_?_naBp6lBl$(N|xqodLA47!m-~#Zf zK*fOaJB*dEBtMA6vxAAJJ&2*RwG<}fLbcToTGPPmb_s%D&n{6?duWL@Offb~Bwy$f zaW=680(YZimx8}vlfqIwR_Y94rKK=h;{vr(2qG1q;>$x$cJx-sdMKE#;315S8)eNy zgsiemN!YA1v>p$kmO-{`lsRRT9f7Jc3ky@&6g|(H*M1uyV26>qH3NSXB=3UxfF81N zzH066`Br-G*O7r7N=~P)^+u!b?IGWKK{G;<c0$1B{oYDwt7%M6>QRKkDY)_a{HCyD z{2oGSq165!kT1lm&j4Uypxwh5x&X-hN310wLw0pCR&V<(u=*ov<^n5SUBslBkTiux zE`W^2g5@Nf$I4uYRU24)7OJ3?3$64{S{b6|z&=r#;D;M*jxV%Ql;xad6L7RqHNFN4 z=66ln26Fyjjq-TkR2H@lvYopEwl1=G5=C8s(tNR%tBwt|Mm}AIhLb}a*+uaHK4@6e z0t3sBixseSi><ldx18E!_8(Cj6wiO-NXDUTTra!v176YpM{B67Mb>|dJvkGGM%d!F zumJVQqgF0xaMz<419ns{!Hj94j9r2esS%o`j@VvNS#I?ks1Y*=&`{P8A;Ip%@4;?3 zThTb2Em??@Y#_RYI0Xb&+gOf1S}4bzpvcDn0u=AZAZ-`Q{KwGKn4mtU7^U_x0Exr0 zk6ZoJsZf%+#>PS!^|+O(F6komvCoJ+3K4?AYN>}49A=?-bU>;5%9r9}pShopD}|$= z!rG3i?4?*oz-(iwmG}QatM{Tb)eCL;#0SoJl{b%*{ADot;!HfikQK`?2U#fVmZ|3M zT4o)<SJ5*N4+~{mrL{For=eISv+JhmW@;v)2vKpeL4Y^NC9y`T60~$B5|~;eLr<58 zpfJjlY0H&XRK6VD0sH52S5wyo5v$C6i6pJWnoimiFrb3#o>12GnkUGnQul;v#%bp( z;Yk&k4X?c>C-xZ&NrR&SU6GE=d=k3GLfQNzAaLh>-#=*$joOJmQ(e|vUYZHnkpF0O zq*5}e?6ce10==046t}`kcNDscg4}qc6(TjlK<O*2O{io3N-L#rC^Q@niN;_t051aH zgjB1M>;{)~Rw|-)X}kO>3lC<w8ORY%qFe-Duns+*>MWskG>|7t?W&UmOAP@_gY48+ z`xNZO3uV%uFg~berm0l{+;8_Mh<h-d69GQN_5Ct*6(&TWv{kBa4l;0|)JJ38I<X4F z;X=u(0&_y|!(zLuVD86HC3F=jNPPf_&-60esizk;oL8asJ>WF2LUKK=X7M|pRwGeq z8g>`8cm`{E3nlfL5ZSJ2f59_~{5Cv;VQ_`?U#-N`oYe}L+SM>rP<f*KWDWX|F?mCG zF%F5Xu~uU`y=#rK=AT`o<Vu&dYU#IlEog)DAiHvIlX!!ff<jkn*SeEVa!NxB>}Rz~ zj<M@mU<bPppS8XMc5<JyGJS8m)ET~Tu<JQ1&3H#g0p{*vzk{~7TxV5bMd+1v3M*&V zVNk~@v*#6zxLDRN^1Rhwok}8Xq(~CCp0u;^ac;N{E3W)AmcYrA%t5e8Um6`)D)}>J zrD`$XIoEsm&uBuioJKBqz1FLV!JPGq=T<sjb?Y&iTOpG+fU9xa_6Dp{uaI^xSb1v6 z{t6cWjs>JWTxIiuYR$G6(8suS?FEztmFGq1Bs^i4Dp~l+X1<7-#R}Q|qSaGrKh*X) zj1pE#0N22fzEQ1WXKz%LTDZ~5>#8IUQm~_`TcQKi;7j~yJP<dxOVS6}xw*XzO8()E zRw*h~JAO*4t-|i?b|RCRSO_z+K(>KB&Of40w+nmWUIN_jO2$i8AGIuXEn<`4s3P0| zM-HU&vkMQpgOTo+DrAV^!v-FNrogf6`(^h_z(}#wzl25Z_gtDd60l!}tj08Q=q4-A z`#v`6^oYDv0-LZ%j>XDN)^_g)uva}`Us~ZG3cdXmEQaqk_!v+J8Tl75&@7qu7i*mN zLm0XE^3I9BK&x3Hr~hIJ@|VA=RJG%;s@Ypsz?$m)$X&AE8nF7S+d(?H@UiWoO0<?W zM5s=~Ngi>>?uvlpU*mL4i|$r`8n2;cgw!MVZMFsi%*~rA6)L}Mks>X&U<DVJrY&kV ze7v;{ic#zQi^k)Q;2m2qDPJhZwpi!5(X>BS=+3<cGAWbjt)OEdaVzBdtiai=T)`}p z1+Sw&%4FT^pxFx=T`J!|Hcb9g;^Kn_wVgqQchVbH&zL>vDe63%;n>TyvhEElz17DE zCW%mLgXvTkcaURmSi_XwsWC}{&XqyiVew<b)wIz~4WYQ*ntlN-_3U<QVyjOsR(_su zLvTJ*Q=`Nru4Bg@xEiI;M!pFlg4;3Q#5kaAV?D)xvQ?yy-9_*}mFTyi;^5Awx0H@B z|1EcD*AP#1!Aq09Z=v~n0f%N2lCfI4!z}j)BU(vN9B=I&nd$vZ5pHK$u>;o1v_Qg6 ztEESwoVX!7Y59r^Dc=Tnus8TeE>xT+Y=rMX5clOsg$8V(=dy496?if0o42997E8uE zN~{;Y!)+f@^^TQ)evy^$D(s}bi(#XzayTySMap-vw$GkuQBik?Up8hnPpH_AyHtkl z0%bw+?1FyU(rYKks$JN)g_|sQp$x1yzo%s2wD$nb3R&=;mDzM35M$zc9!!PF5^Myv z>@varz}fe(NUZi;^+T|3qtgFJwjoJy2L~tc#DZp$;>z6+b!zz=2YYv03GRqnxLeWa z%H39`nl@<3&tB2;oeaiSrND8@&;<@vD5%Ik6NA^DYSvY{7CI+F?Av*kcNp#}Uh$!l zI<+5CfLDH`s_p-gqNmzj*hF9QkrmgO^0O<7PKBccWHlr#3TM&|b@absXH9$)T($fW zroE5jHhgQIulvDs=a_D!)b3F@t?!2&;a07cUGm1M@aI;C{t*7$YI}UMwRGul6syPF zCs_6O8z;kGm|cNy_KS{R&?tTio{c5RBfc3tTtFwgYb}4<if@DAD)@#I+I}TZ?}=#b z$&hv*TmG2k{|PUCpbSUwwUhrHp8M2sCmF}$3^+ng;rJ?$LCE;`1=6^XsPA|1?XbjV z6xnG>qv$w%6A?*px^c<4_1~J?;oYyDC@MrulIA91jT^s|fzM!D==x7E?&nI)Csur` z{3A|!cBd|ClN|rV8d5U+3nz-KtE2XO9^U5X@y%-5!qL}O16EgrxX?y5ZIpLOT?1lR zKJ(1^hZBaf+A8%?N6ZDbh!M4`M0S4)wdC(ouooL9)L<et!<yr2oOEpLKJh*#SSR*k zT*QjWSdgs$Gl+|YQuvwDJIg<_0^qQrf3^0(OWJ4UDckprDBHn!(LRu7nk?O?)aPCM zltOlLpOvFj9`+y+qSC_mvE~$4!7kcw<tdgAOBIA7$w^lEH>G3e-q1Wv^8cnJcF_&Z z6V+BpGI55K_m1-iR{RZM1MY)=htjoBh91ChUKXf3fT=1BAO-)xUPTDA>VHzQ$-$qY zFy?>K)Rra7aV%t^<Q_sRaM<M#Bs{h|9<rQgNvN@Rgd>L@fb?QB(&QMTk*b~ZoIrM+ zl0glR3*bJ~I%{}0%4?Dpn@^EWOTZL3mO-tbl0XZxg<^kh^-(K3RIVtKbW+?9^SRPR zsy>Hw!Fs_Rm_45QTxrvdwq9a`>=)KCb+<51ZH&g#lp_x-m37KtYeIM8suv1od&uUj zo9)wGgP#gkfbE3I>BE*^!E}C9#u2pzXXz1aYQp$*6q6$L97dw-Icg<c&AM0)+fE6` zI>IhlLHuQIJb8imJqY~%20roPfpc)3{UvmCZhWH1NrGdv#toJNzO=@4{l^7zQnofl zQbN#>Jo>9&DlJg>724sW)tP_E*!$ijJ<$AXt4jn(B<naPLJI@)k6SzRr3&@V4JVWS zW2Lm$!!!Gi=w)}a3C>j+7r$OLQ2QTDWl(-nJxK7MGN>L?f`ziU-rd|}$&q?+;vtFq z)^c7n3SN&f<y%nR2r2(o4ftw}F%a*|kQ3ip#cBe9lwmhpR()r!K-vAj2bC+&AE@}= zn(2jR82N*$w%`W<Q71E<uWdgBfrvW=AU>Btr@&n>Hl4C|c)x&_jn@Gx=GNLVBy@Hf ziHfaOs;1w^`6fTHDtZ8F!uO{w=fW#J@Nz(pfFs78{#LV&oFBo<I3e?+m8Mn=X+K~` zQe?&llh*tQRds~a{isaCr+<WAgG<hSQh{TCQc|fHU*5w?f5&^CKRF5uue_T(1IJm; z{RBn$h(w>koOGd_JVUGmGR|5py`<@%fh#2`9GgfRT;YQIZFsCei5?PIv>bl`7S!pN zHn&4gOiVim1xKqF&|v084fCv$gXgeF&CpAwy0z_>C093(T$X9$Jk_!S8z#GD3+!|? zT}wg(*;o*DkRM3N3O~qCWONcc1=r)HPqU+!owIwX<@0E%{|vhdHV(mK8k0RX7q8}f z?2*99evj?%paCL%YJG=82wCr_vwvN^kgDtieGy1Gq3a~l36s-DW4-pou&v`P<4eHn zL_<8L%Q>$dsnU=llHka<dV+|7Bm%l6-kgfC^U;M%BkT!b1?IXLoC2ep06`$S+c>r1 zmgv>Dt5FPz2;@XKCJYt0k@#k9nhVbpxad7XMCi15I4_M%X=*>BObX`-We7JvvJxk( zUKfEup&8!4zzyroY+B?>o7vnfyStg4rYM3&vgC?_(|Aa@xy?~_@o2k`ENO1@9;>?M zHkKD8GScSg(mzraG#-!Du+hP%Yo@xKZTsx-OG_e9_Em611+GZ**^ca{7}j0s$fEf^ zoAaG&dKfQ#cAsRTQ%|%)b&!6+rI}t)Hm7|>QFb49U1dX*JpqtKx3K4`#}Sy16*b^u zWeYp)GSXc)1gC^V>1`DxW%4w8i(q37<IU_Qt+9kSzBM*&WJcS(F3EjAqafPO3p-Ze z<Uls(8G`N6wxj=dk%Q6pBZ?<_RID77QgLn)mUH=1@hZdKs|+YTk&AstC6mRtx9F`h zZQi1{*|gVtzrq&xv#^=Ywa_^uDq~@SI&9e)-eXuqSYWo5bep^@!)<#Jy#2Pl0^ZCR zTi;Ue-lVrH2DHoUnV|EmSWxf?8ICVCrV(XHaHK?z83YB~5Nl6HS!ZKy|BYX}T*VF| zz(nv3aLh@pv3JRR|GGfB(QZ8FEgIt_WK~OGW=ngkCrsne$Z#I$iK0yA?Bg5k`+d}G z>p3o^t?cP)hUJr!t?ZQl_gzcV-G<gS<+Wq42%dAm;(NT^-&@u~Vy?ob+!NQ~{?8@x z_E4qNv<g#dA`|S1JR9?I`{=f=LRmcqx{<osa#MmG7pA&2H11%6%Nb}}7!km1)yAI6 z?dEOl9UkAmU6fwvy_^5&xUlzbP6R_k-@B>Tp%;GdCeHV*P9WRbsmF5;w&QC#mF+<W zu`;E--A_Ga!%6HAIIReAOkmf47tHR|ikECs#Oh$jA#-X6dx+Kq99?BW2k`L-+1bHP zNmk+jB~S>GSjdi)W+V`@t<Sl8&F=>rj*u>XC7uf4b>)nfe>!C={MLN0NsX|5FI9fK zXDhz5nSjr5@o>y<=c`EqiJ8Prieri3sw6wd6*J{YU>%I2N%oRXC(%@@tXisvKJ7v( zcjTL^l`T%T^K{!CE$DbMgcsAqNSBUwdKi6>kyv+*OzDUUak(5)z}wl;PH`bQ-q9Wc zLrt#~h<4y(PO1{nO6}U1YVU&7n$t<4sH&5_Ni~c-&4y{DmdTXP_Aq7SAp*mrc6A0w z9K#w%;nMmv+pi`{g>Ei|cgaq((=QzCmx?qH0B-P1vmXKWvbxwMP-d#T*kkY&+12)| zGv7Vj;@J7DmEGtRoqMTj+@!8*<Xzbnr1*c653k8_#9n@>JwZJkN3p}sCqf3p1r-4V zBuR~h6_LzzJ5r62-4LH5wF7+dC}C_maQ<JZO1HUeupq-8raHs9f=lggCOdS7BRf!B z{Qw%#ovF9;GCsnMKlLl|r++2>$A)<BZdN<sGxy*D)0UUnUA#ZRsAo58Eh8_pQ@v-@ zM+a$f8P1%nzRb=j37wS?7eqF<|LQI$kUETw2pt^NMsGKa977zE$Ib$v&~&=dsfc5_ z<Z2@3f5s)3{vu|6ZfF@AHYd|gG0q`KOU^B_F4Oj3PwW3L;n(vE@qj{s>_r+*``A?6 zDmJ2(U#!8A(YMuWTPDKUMD`oUM$#pl8i9O4a6FF4NpsV%iA{c?ZpJq?)m>@H{M`&` zyTC^=>W}3&N0<W>?nZO2`-wylkf4Kcg5z4>uhbItEAcHt<DHwdO1j&{-J%iRxOJhF zZG^^4mmU~D*Ggeu40+?kiWBK!_d>w#9=2cYD&~}ojWUr9|J)W7u4o=_Sm7o0v@>tD zLsNyImNFR<Q;iX!6su)6qEyM6I$2{3%Ay|&Ut1Wq2rlY5|6Zh)q1B#$(MnucG;ijS zoL+YB^{kE1P=XS=P@d7fr6EEQVey2l6#~gKK|+?=UYIJamDJvlSgjGu^$WJ0q!RCb zYY~zlYkJ#xF>TyJbcI{wbZ;njte1bRr!A5+U?BH$2s3rz7Oo1t+|E$1H0x%N4nv!v zDFK)LTyDp!tMZtHr6#%+Gpj?cseLd?y@l@xDcyoco!TKq16W0UFr!#2Ymmrjj~Fd| zaUyAt8K0aNQZr&z6&>({zn$WVcy(TaWrikC!Z-VXQ2E2M1TR_AB_@SMFUYntRhvRf zNJf$d*!E^)oLwuqyq>IQUz<0Uf!NbyJ0cZ(NB2gGDYq_c+1f}&IAxs!a!p?hV4b86 z?9r+-VhCXxeEf4$*jLzoqf1yOTuPKEiymkeZFCJwT6Bfd1y)`GJmPJ`E1<>4%5et9 zN<u$-YhP+hdd{qSg<*P*h)Pwh3=5x27mk4~VAUbq3!4+@)!)Wt-!Q|z&y!yFnF-HL z9bkLBmzu)sGt?z)EQkmv;c_6=oiR(Qegmjx$u`H^{~LQqUrrjBkR$IDIAZ4iXiKGx z%|T0ZWO0t&PhBuWyr#ghZB)K=X}Ik<N2xr~xwc=`7n)L2;NS6sIkg7Ba7rf**@P)a zCgmywm*;|v71WZnpb567)q3LOt6ZB8O-&l8ECve(+G$GX(K8~afSQ4JA8$Ht^$#BD z&L503(&<;)S;#y7N@_EBwXKhO?o4y!2&uV}%4MMbO5m<5m!J8^68W285@eF3#xoV) z%cR#JJLSCOq%58MD*R?KOr9yFgY5Vl8<(y-hNTaIqp-OXPG{?i-$`&B{|E`wG=tO7 z;ivOk>Id0=H7&zY%innt1DS*E{vL44w5!l++z57+y$LwT9fCHx8wLD#+jwSmh&`&& zKK8mHcDk|?cXA8YtJiE7E7xcs9qTkX(toI(sMgtZP-r$HmF~h>7Y_v!hL(0rHV;+G zX42I*6u?0C)qp-(?~)<yb%CQKq{1Hzm#P#iZP^JsyQvD6qG6ckV3IiuQe7`(rVh6c zC<U7+B@<1ABRcUGz_p6rhhA%^2d`ULbggYe&0oo=5jeMIrzg`69ZC(PK`$H&V?iUN z-E|=35i;~TJ4FeF#=|6=TIl8=OQ`DcBU~t~xz2X3tYvoMp6zuYt-B8Q5VDjE1nGKV zG|ET4Fp*K3>^X~d{|Wha^Z=&gw2?*V@#JC<_}%j0xmB%0ncbK?jMWfL{z-wO8Ih8h zN{WK6vH-Zk%i;z0Y$Cs)f#MDoU^;?l9|~YWV3EDJi>QrmeIW{9TM*&az5IG*_Nuv_ zL?HXGw=@5bAju3Cpr&QRM!*c3CR0YJ!pcY3v(;`CwkH&RQj~*Tm8;)KSau*ZMyjdP zk&z0s_9)eur1dynkUz@CyWWACQE07VyvuMF%1%>1GbMGjny`+7WzRA2iRy=2Q3=~f zwWBp$Xn*LTL*pZy8ZboAF1Uc6>f%oo3cE>tGLEdQ8f)`Tp3`I1thLLHwsT{9A*#^T zvA8L4ZX0h@f^;c7Wpkz7Pp3=`rmDRW>Ln~9H>tX_Z-Si`Alzi{fj4%Xz1o>sSB|&i z2eUsfbqmofb)GF1;*Fe=2S-qX;2<x_siTx0#2z0VY)J8Vd#;Pyv*Uq!LlSO=ZOsv= z!*8|^02N(svBxQ1P$i%gr-4gvv3mx06;fg__?Ya!1#LKjw}Y?{kuw2ETP4x+@j%GA zJ6j~kfeCiBC#M20e#p5AFn3@h&@irr7Ah-kVWGVdeQDncfqGQ3Zng8g8Kyj)(7Lrj z%u%=K2JvrKD*Fu#FnAR8R!EOnsbiMQDsRL8c>ee{kVKh`#T^~+)Iy%z28&~;X<Oa) z5se3w03bG_OthyXy8rvpuIx_nvAbAdrZk!42ueJhDf1>_pmX>4d@#u_N2c+&gA2=K z@9nN_odZY`97kO}0;(K|oX{vFDWIGkTa9^yZ#KI0!}Sx6AnLp^B^1HQl9PAXt1rl2 z_k?HtU@~ka-DT+%d$qTR8nHXbf!^K(nSLiw2AlbvU@M%Qy3?N6DfBRFsLt0D5OYu@ zL|DkW3kb!E^<6ME(fULkBvfju6p21hFauJi$cejb`_|CpT#RBGRzxh5UR4F4T@D!} zC3g2{IHu*_#o{@-bL!Ab3a4TuS|}^0Di~{~+7)dyb5Kj5>|~EP!`8HEDpmP3B|>VZ zLG++qg|IzG{8n}9(%;%M(6>rXp%3Cby#u}Owj(^?kL>9%?ktq@>9%u`S?|gsdyHb3 zE;7F1=jI~2UkAQWk5;MXzzf^q?A(vhQH{zC%lx_b*y~a8@q1iLRJe%BodFPg-V1ng zWaz!B|BCO0EfpKj?zM*~9z8Dujci3TV2Psqpyoil6VF5i!>9p8NkO_7&)Y=d3aC$K zz@~CJUW$6Ht+$V<w#&3X>{<+HSka`I4dP(G;JTri_9m~|22bUMB*E~Nfw<ZB8Jh6y z`|TOZo|GaB?zhK8^+irXF|@OMJEM7meE4niC~5Hknl($39>8+P6;k?uy-6Xpt7Ojw zgY}c@xpsQRgw~NwNf%wEG`>ar^`WOcStY^K2+-ui0hb`NAE;E2yy(;QfJ=fSI!H=W zq;7Sy_+%0agUGMi(T<YphQnan2N(9`9Kj78D~fI2Pqnw$o``L;*}sEkO(>$I=-y`W zMt>Jal&9G;|93XGz9l?}`Dt08@IfqEsWxUvbqOd@ouQq8QgTb}o^38eW!J;afGdZ4 z3T_9TEH1Uvx}oEga?hrbTL?ZGl4#&WK=%aUw`F%J^gmvp$0VE+L`uQeIKtcfAv;@L zpu(Xs39gA$SAxbSK4j<mO0}6tHaukGuDamo-iN?2`ITib{IX$J$c9Q-M<$lp%eyyL zzx9y8dI=)IV;*9jgknjxADb)l=h<;hNfr@OQ;Paa=GjT@cVIUmVP(&yz%ei7C9-p6 z_VcEGIWW)e0)$PgX`X_UaM99pzCB3YI><Cci^?Ml=G%KN5Ip7g_U!Y61NFbhz#|(M z*-0{T0mhBCGHn6$+qP1(0KIff>KE84d?LMlTFbULtYb&3XW7^xtdVrZ;g`~SfbM=t zT589)nSvk!bl&7p7B95tp#u94(1l<V|AXDL_uDAYgTyS8oyamZ21uN`u3Y?%fFq{b zRxW~YYAdC7M7%l>NIN$ZCQJDfF#f6w1XnBqqqV_h2N)&WO4StXUpcqP-t7I2Dfc{p zOIY_TwvWh;*K9oWcVA>=#iB3c<eNX*{blPmkbB7kxN0ruQ9Jj1yh-_^_89L#x0L)j zQPIEnaxdFP9_=YvOYA;fm*VGVa0v*X3HKu00l2epcVLL9hWiPwy_7G3p7M9uu*A;k zM3PE|3q=sI8{YkPIb@_EwNKcY@?5_tdm#HraRK~vIFx%ynI>=iCR25UL*0sMsZ6p+ z;-AcQiHz@x_d?R2u<dS4OBq8D*e`?NNc9Y7+58)evROuy6lO)ncVbualS$~aL}npz zvr2-7hw&;f$tZaY1paqf_ZSvssmf|-Z4GVZ<5=_lQFDr9J&sX9<xTSi#epn+-0stf z*@-LGritl%T-860B@9&nZ7`*8VH$+=!B!D8voapGqOU423nVM|mDHtJ<20mhDU3~Q zPh-?}4{i(2SOyKvmf_1_bMi|0GLWEw16Fp9!8{!8=|d=F;YqvnN-PN*m4YSe)s^;m z^|PPHl>TC8HhL0xj@aqg9SaTfk@uk8U@L&w&I?~X<ha-q+Uv%%mso`+9R7}yn)|TP zv}8F@t)NMiGo1ltdW1K+8@pX2y`x^HN0=rN{0ypjeI@z{dt|G9XC1jkYDj@|WYEed z?S8VPBerX>n~7A$@i&Vi94>`sMtCE;hgSOp%F~>G!D`Vcuh>suneWDnR_z<0OOd)K zG22s>rQvNa2!k@|wE{}JLbY1r#S+#Edq`K(Bq@bJ@{d4XFpOudG9gn69^>0q-WIm3 zj`Su;zbAch*JmITiJF}|4=_xG&(=^kVk=3KQ{1r7ttA}5SQ*oj%&v#8$X9AA!5Hf8 z<(%D^L*Ultr@#X&kJw3;QV(_=`ftaD*sGQ|i<CuA*-5@U;E3Q`^2$?=^#1mgjfL;0 z(0tr~_9u5*d4**C$v$BWLTc7a_P9i9>SE*DlVIpbKosqR-6RApT?$u$u4hT<Dtj)7 z@9ZkOk8xF4g4`+$nYdE3%I;|lX&jRxd#db6Wsx(b_H`&?-&cY3ak%|yH7%U>G_0!} zUo;_Jueo1VJ`G)>g&cVr)5sP$v82)uf5x7uCXRTY?HM(q^k1#?+3M90gt*pmjeQDU z!CKHkj%2KbGOWJ>Q`Ta(gV5S%)qMQyv-Wh~<B*Sg;HqTibI@6E$=Y-F40T+Eok~G@ z103ZFJDP~&go0WWJ4|<Ayi8gL?T84Amc{Graq4HB9A5`k%>Ztji@g;W+NM2kr+VJT znIk~{c3|)G0J0OM3d<rJvph|a3}dgTFkTJqXe1+K?0UP8Ndc%Kz<B-ncB8FtzblK5 zNzHnDh%q#zFS4Z|g<@v|uB5oy4R<J@_DNrSVB!W?ISh6K35hLFmbw@0$*LKJQfK4n z@WdDGLhLEo`62|{HFEYvVEt_=+GtPizy|V<Os@?(`Yc~Y3mN#i7uTQ9#BRCxYD`J* zm!fLhIjIA@2c^jUva;Hq-hNmJ&?Jc@I0_qL;q5?|m(X+4GdD6proL>?cPt3vuGU9y z0x8kHM#^T-F^{{RAGU{a+9psmX3Rsu(d##HZw{@v*iiL~9p`%|C`)?1Vu!zn$RVAS z5CL};9LuLd%<mF7P_7bYgaOS^FpP!Ie8eqhbHfqA9%pZJIAs}X1}Vp1ftm7csrn1H z0hLMrS7Cu*4~2F#_A|Z;Vf2kuzY1OG8;K0q6}*h_set`H4&Y4L4D5KW4J_S)MBeKh zZKcA(8<k(ZW-m~EnW5~v;?IJrBU@pEnuX`CP;Y)<+cpp*?j79wx=YADtOFT1J^O~8 zHDE8G{4ZRL2RCEE9fUgt7mXgwg_{X?7S19n@RtWiOtEz%WbqsJNTW4=4u&IvwU*;= z*b^EBjol7KbcAf!jz%1n{oBz;ut{yVbG(1Y-ogi)wUv=Ic7d#l#}&5zl`)Y6IU8bW zl#C=5)PG5imL6_+NBDqKF_M<JO3OhQp5UypQ<U%_l37$M*S91qs&)L;6Y<F?T?2kz zLhXbd$S`K1EKh<Xk+M_CzQn>nIR15k^GV^Gz$z>D%CsF2@z1>pQmb=Sn@HLDrrlFT zduY^@mT%e9ViJ&%()fB%jB2Kozh$R%Cy08WVldInR`Pco+?{aDHp0yoD@We4b9}mG zwq)$E`zc!JOHcv>{91!SCNeS$(~^KNsJh{66t@UTkG=TYjd<TltvpESPEb*_v&m}X zPAJu59y9IkT5%%WERM{<;)uJIIxl`}&7p;qZ#Lt7_v<LZs!qI*u>`J#B)y4RZjiBW z+e3V95W+HBRK5(O()PDuZEIQijy<ydg~%f^SYl0$9j|6(mne*<pg&rX^;s09dkP$> z7wXnKcA{@hP%6~FWB0sZ*$aY6Shlw>))Xg2wiQ+K^%pO>Z$q|s?U6CM3#XuN!h#K0 zyX^EvD&hEDcE0MumQuaTj&F70A?e^Qs1B>n=yNU6@7WUvYi#L`)ktE8C&6h^ODZOX z6W<i4Bn+a1Bb-t@)8){6Ky?{b8eyDL8~0PB<bAtcCl*Ei*W(ylab6g1ZNY;Y2i~_w zwb8ssqF`Dw5&afYupCkvXPNA-Bo>1HB#_0jGT_M8bkF{D?pz=El=Q8o>I3k|mk3gw zhhW_b@-o9NsGG^j54g%BLw7^T_(qC$Lk8z8D~d>z{O=%Ndwz)JFqq6fgzXxSeSc(^ zsHHoSvm!{hXo_n>lnlpKu)0}t>?7FIX*&RXimZCTXEt^*lNge<$1Z8ulr%)n>;Y=m zO8;7Wt}zmL(b&gLh&!9cl^}#1egk}6joz`7hH#Q^Z@AH+IRO{z>kP*}X8f36i648B zcv-)vm96$DB%l;RawAe|agQAV_eA^KP$wXJGy10Uqq)OD=N|XV(c>>1jdE4tH-|+R zeq#H(>ADFLDUnDH-BNK2vXJT+zD3=PC|lodX&V#5ic-yBHiW903PYnSziXa$-tL22 zLsK|-2yN(X=SOqs*Laxt%h8k0k7nVd4I=sWUyi;bEPCc%JMG#~luSmn9v}Z7#=ZwW z=c@hReb3mvKX!lqZDZJ&zfEmIBdgstg-n}>30YByY$ef?+KQr5)Yzq_uNB1;HAQ_C zJ=W7dJ(QJ-qO9mi(PKUIP$|Fn``n+;c5f!X`?a(4IoJ7jo$FlZI@kH{@=`KVC9jaB z2f(;wbaR~CAjw0YLe<8x{7PKewz*fVsovw_Dz4hFj_7Q+OyXO>*eE+V?%}ZG95)Lx zMT$PdlrAMr08X|Pf^R`?_zNZ>>pt@*s>wYf$5h{yPd~%5K4bAm5NX>?0v|`ms|%N> zwvxxKxH!rB9ODs{x|IBk`{u@99O;)CpZgPrQDU)hp^cMmnjH_Z<&O!w6M-xl!@6j( zw46(IOBRrQpJRE+#mQ}}See=f6=2eCfADs!fXvyAJ+{-3j4pZ8yoo(2qe%H=7&apQ z7@JH>THMN@ut`QD)I-cY{?x%u;m^!jdBlljON9ZN%{qlBO76COCPgVaL>BBpWlk^q z5=!y=doX>;R4$jAJs3$BO8OU2%??Z67ye#8j%rDQXxzuZ8<)PoTt*S%F+eh+t7q{j zxrz2|K%04x!O~%?Zz-7*l{l284VBO=HBlZ7(;dNGKdRQG0{vVVk)wJ;7(0Ud<()6p z<jbiqf$tTPvlr^{b24WyPCHOpC7)-*kb*8#9+EA4{ry|qt_UlaCC9~C#E!w49fQ+- zNV@IwXQ{IaaMew4(M#28mcv+8`}`S71R{R3WEjfi$uJCwMT4&})SMw>zfyFX^Ob*+ z_l{Qbad>20ANKzYL>bm(WDtM_a0?r(uk^2>5Y1%GBw8#Mic!avB+q3s`)hP?cgl{h z-MYhi(0+eGpV01*`LbR}6sAvp3WIS8#X6it3Mno{4R73!q4^v+z8}5j92{oEL6lLE zS^|$n;zp#WaY1KsjXzqg&JgF0Fto{U%!?~D*s4?(%?0|Z8cfdNZLe?qDQdBMA_5Qz zmud`*k|-D~l>i&3OAMDAaN7JEf7f$P&ock}<;XXfSh@>EV$uEvn_v<Q<K=JtE7kUH zwi;qyhloTR@b8AGt2y9*A3DRDgFyUU>GqxfZuMqJC@U%vgt%<HG)#kr+1)MG-$4^s zgJ-GwcTBvehm`z?xxV55R_k;J|BdO+EJ^s@IcwmyQkP|MnZWmGrI^qB-oMDxqwEmo ze%#S^?f{JMPQQUWu!bD+cT-FmBeM_r2e#8#q4=?&q4GkxW#1vpc4E`@4@j8rLZrz4 zA24%xmqh%CIgL<MZKCRd&$`3@Sut}$NSBIZj_{f(V~>F4a7gHgKdmRTLKvn0kf6-Y z6{D15sWAMlaK)1NfAWt(>}fwCHbYV(uo{?(t7{O>=1I6KUEc+LypnzpXWJ^<gyHIf zpZuLHH!DVDgkWhq{YSCy#Q&hQ@8abofB$Q#Ns~fuYUD7=CUPRh{bev77>ao&!rXv_ zDi`ChY|LZ|4E@PV-6i>`iK`+W$5HA2N3jbL2Lz5{B@ox-993t#%vuZ%$={<T{b#HY z4X^cYLZIlM{e`V507)Ps;r65?W;00_?s<MCGC`7N=n1muM$8A6|LmU!$|wKVzZ&xa z+y0B%RFj7&1t$;xgO$DUvAC0L^Ks1g9F{%DAt#}`{{jJt<BGrdC$$bOFbhL!kz4PP zs$U>Fu#Wc&M9sa*)gZ7-S_Uqb^#9@b6bp}+oGeUy?f#!XU%4Zt_X&{uOUXZh**#2m zoKVwxwW%$Vd@fP(O3VpxP?oekiMjMcQgG7WKZY7>2`ZmRWlO<h*k*a)rU+c@wJ0n? zu~!^Cy1+OLuBhg+Rp_p8hU+Nl{cw9n+PcUD%+*&d#|g}%_ryf>By-UWfVl;RrDxT% zD%ra;?GzY>$%ctmi>eZPALb->XBd7t{X-Ze-%0HLIV9C5Q9@k*`Kv#z!+nS`0ufl1 zEXn<j+tt<Q+LM0;c|qTzFwC{B_zinWunzPaQUEnZKuuY6X^RMTPiByJ+y1U7#2X^Q zN%DEB(?u7+J7~*)ch0eOmrcJTi7#I}g~sG2KI0GY;FnVIhyR%OfmZS|_Mk}G(_s;= z|MowzThc*f{AsSyl%2vlMaI`2(|-FjHi@{NQ64QBeAC0DWqIF?l((YvIE~fg_CTtE z$P(Pi0nxU_qpffw&hV;;OT1btSfI+Q0vz&c^TD(%e{kuzr@gSbHpJ`2+gd%Z#p2!3 z7TPNBgU)u34K1}LXE}W{HbUb$!(|cL_lo75%TngI;w?X2)FQxLQsdL&TT?8sHM2@t z)kL01-zEM?ZJ>97lh>?Bt@mZrbU0d0hGAn=;mF|lF<z)l^1{tD39C=@NF+*AC!wRX zJnU^a>ve7LONiET!{;LjZ>fK1qTC&=6-Y)rSpI0VHX!&lFh=Vk#rUTR+FjPiXh9XE zyBv?vW`XR}T4`);i(z>m!r6t-qT5G?Ax)wm+@=v%TKEDEGPlw;suOa!JCn~w?Tpoe z4Yrr`@M{?=eP<%L*slej=~M2h-iL$xDIN*#r;z!YW_nkBAx~@C-@NO;kk-1^(fj2W za*3`@9~>&{^M5^aF#ic|u1y7M{9OY7(C|LENli9BzZCV0gM|MnHsW%MjUF(p6$-ka zkVfH`r%!(YvkiCKu##AFOqaF&)yanGt~@C{TZXmi@C5w$>i`2`tk{^HF5|IAZ<lqu zyh)d*IMJCUljHAIWE1Mn+SkxM25z@l;V0$8<5BJPy|{lRw0Q5HkQ)MFmrCm2u*S6W zEdzJon$V?Ucj^(Pg-at!?T-E{dm}HlF4mq~Wa=9?ApP5M*~b?!8*zyUi%c@PMSc)@ zO@^D2Vj;NtBfVp>2OD4DR9&50L>qU$5GSV1BJ-Doa2LU_tjwDlq8q*t;YlhtpDUgC zbn}<q$lbBtU91AMtOqFfzi`0}Gog%h6MeyfT?m*<WFqs4QvjDBE>f2?x`d{s<0jGA z%iauoFy~4c@nRS^qtavYjip^IEx*KwaDO?j?R<Y%Sb~g+(-J(HlJ|xdUs{|Jaef}6 zFzPihE};_ey&3pCfO}%_S(oG>*%YS@zv35wV{l7N91Pi%(b*5tzQnPwgiTE7ztg!V z$1N^E*cOr(uO$`_!lxT70>L;qWyv@)A}b7rVfA-{A)In68nz2h4uMlX5k3Kis9Xlq z0me;_DAJ!l2d1m(3IfR=jC84-ir12glO5*}*u;-LTSxS}KF1BK*)d$}!zdjc7;EuM zz!)a9sBJ(dfK>81u$dmSi*~}&&EI_p=dj;M)fT5a0A_ME3~g2yBT(vH3V#-adU*<L z7B&io;c^{&7;FwI2*XyVyQAXAaXOMtdeQFc*cUps8=MPg^moH^$0OZIFqgtG9DfW) zwEDq3YL95G8DYN1&|Zn!At`FBWuT{A(^i`wxyXfj<h~XDHl^b)jVN6)(3HY<TJRM> z%)tMQ$%MrA+QM)(vmyny9<K(kbdnR?8XYcs+9Tz~g8g@i-p5<XTU~Ke_x4skQ${6e zeSJ?jc@36jN!reirEqpbbXF3Z<B~@1rLE+TWUZsUHdz}Kyzzw9*iizPVAreBQCp5O ztna8zq5?DAv}I?C#!azXE;p&#r4K`>)0g9-iL_1{RpPODE)iD6dw33LWhW$=RW{DV zHENwzEC#o;I%}J_ew%rtS#FnhMXSW<XI(cfcyz(EtGj8t_#ow~RBa`!K|M4MpptWt zQ)v%q99j0p9vXJ-VN7y?HY0eAQQ23xm3UDk?l>EgrtxLS^e=D&_LFtPki}^l2Qlhe zqsnbsv`p>NGFlFoNBCv!XL!M2`vrhyrE3!rsJc7?PjaLKFZGSBU+H*2RE3D`sU7!~ zIRu_5(HCmP2(<7*&Gv~4wR3uDSspKLFnIY_?|HJQvSnM5ku6%uH@&s%QPMyk6l<m& z?4wP9HRvME_GG=5p)Dd67WdWGBEiglS|zL_{ZP-ijPqjcZiKA3SQ`TC$i*nhG70pD ze)Xi}_tylMgyA}{yFE|Y(=xSkPls|~LM62=n*@IBEtUi3>g6HlEPZtvwNwqpjbe{n zu0?xZ=Ufg|uc}M6Suy{In66TUchs}A#F!Olf-24gJ#!}L*)u^a&j9sV6$%2|P6qyL zsvJ6!i?d-^rsoijB9YAvQ|g7`Nu?{QBV=ws>#aQxKQ>wNa?roxRCMqh=W2N2&jHs4 zw1Iurz|BUjLOMB8@KX3O1-6^NBTQXx3?nsdJn=Cvgo0)9WgyR5fH=kr=1W?tfejPl zz=j<IfAr=sjcBqs>kzHJiV!VD`ri^2y>tRDZo>Z9OYoLmF{&r##WRwJcgdAnO3X_Q zeAZv7Wwhh0EV1t3WK!86i2n*LP0|Kxrtg!wma-~aOO08NV0DERq=fw**;<13GT`{D zCzRyv#U9NAmuqIsD-DuHoL(A>wV?rc*#NC;%*F<wx{$9n00TE3G$;UyuohpTWyHLO z0QIb>usVE&mJnkDPQ5=!aQ~IaVpD^(9DY_rdcA=U63I~GU$++C2=y)-h$e>#nt|Ht z27xw*29oGOTK2dt0ELR#HygSC(a60u#0}KX;D##r*K@<VL0bRLZ-s&!E@c<YpBof1 zX|R?S^G^h2>km?7&|s~XI=rVOJHX`Uw-KbiikA&mVw*xB<{kJn<X_MLvY@kE(!-3D z;a6$-kVEUP(uT*pi=cH4N1}&l17qF;$W>-umx3YM40T-5rSJRj=65}IwL`#g+ZrU) zEl10W`Je&ljvOsJ=3fm!>k6^QZ-0&!=(!zmN<8WYEZYva**Swqs%d=)H#2278YD^H zP;E%eM*!EOx@M@>KV~OD^{iAoR2!vLJCW-}N&eMZs+yT(nhZ^ebRi7+{o@9S)?SUK zv-N7NQ_Lrg;b}3u8f3<&y`<&;MI^+0dM3O$S4-DE13a{tpG#G)mehc}yAgy~QJo5w z^i-~v+JJfYG)O&=htBE?Daq54v@aW_zgO1hp%w3Q(yXtt<9XV^4qrK;IaVXlzit$J zzl<HG<!UvJz~9K0VOpy8?HP%l1h@gB2N0ybE()fHrO5bev;{E-&w$(U!?ih{nD5|G zk7UJ2EeU;DRnV$YR@o>8OAcCrpj8mGN`h8J(5ebrHOeZ>4@L`GfuL0ov`T_jMbN4W zS~bcl8y$=WtJqzQb9(?%?DtT7odzB1f9f3mf1Jbr&wBr2wOYfTG&F<L^#PjnC;96L z+6020bNGAf{4q>yiUMJE0h;!2eh&ZebNIJ#{U@U2O(D?I4R99!h;#UJ2Xh^T%Eqet z4va<z6a|lZ@mexQOKiZ~(eSSC%G4Tls4fuGz`JI&mNA-J1?yrsb>V77Kwin7*uMxv zS?Fp`euS$>uIM@~rH=+ssBF=lAdJESQnVR>fn$P#g(yhvik3m8%50FLdOFi;0HS)< zngc4TKTIqxG%?8=1N|kwK@8HY9d%g?p*uLS5*h@l9Sf1oohNlwAbqb_b&wylX2ZIy zsd{f08p)w%Xv=6H>Ms>z(Jdx5$XXRKxdDjS6n6-X*hIn|&*7hP4*yPn?O)ui^Ir#O z*5w@jUC-g)?Jxb&&b$9*02~lKhkxoh{CoU`zen;$Yb~YndW<&Dmrbbs@Cy(;QT*?R z<F3@}F?vi>U{89`>KU{y3|hT{R_~zICum(1v@(KL-=NhmXk9F`3!ozQmzn}C5tB>G zx+G{_8nm#$NWXyO-2hGYGAX$M!`aJe#anKB%m$A2?Xl(tw1okorIf`J6<4pHh$LQ@ z8s#dxNjcJQQeJsMS4q&7exsIheokl-O|at7P=8TTt_}q?5hXX&KNux16x2kNVWIxP zDA$C7nuszy)IS(yL@20<DA$Ji2cwJ(1vL?6RH%P2N`5G)i72B({ew}i3k5Y1WlX5Q zRNSOx+%Og(idw3kR0GC2Zc2B$uXo(;$aB2ob{Cln95-@PdLE_e4S?144$}8#@WhRh zf3w!>@(J(>9hgjP<i4qq`{qXONwK9pv)V}UJK_HGC&RB!)HYGrDWU#S@D7HC{U>S3 z9c}@fC3Z_R)p5HenkI85X}QI>I^doNN<vI`+~+&)LdV_RaThu6&W`&w$KAnk-|o0M zf5-G@IBsraq5BTUZ3W$zH=F4I+?u)5al17$%W=EqnC-aTa@-{gCu>RGzs0IKxz?QP zq+tc!jiB{ojeV1~UNLh3s;{$xrI;~08tcWYlij&!Fa@{E-h&X-;s;B?6fNF&Z$oEs zowH&JM#m)$lB*sYg|+G_7#-gScwMh8oo><6I^GXZC{N67<enER-&_}q7sPJS4n;ly zPgdTGUh&L`!6oQ3G}B%^Rm=2vAB>gTj`-Wi>1kS(HXq^0929CqnvXkj{>qM+u1)Z2 zy!4sNH?EwUBXf$h%?gZ&b!;_9@^07S6_^7{m)qt@(QR6a0&`$j4_*auKc-FM)`2-D z!H=WkYhlPR+*0J?P#3NYd8ybOKi5GU#U^{Wu{kcT3#U-Em?+nm>cEUH>Ai7tPwDMi z@FLPkS%15lfNVZP`@M-W`|r>an<#VU9a=AExgGH_!FdO$j;+jhXeWH!;=o@Q3G9qY zlC(H)L}xCGqyokU;G#oVf4E5tR!dh&xKk^STmYhzFCU7PkN<^ZM!W9R0-lG(oTaUe zc?5nguMWlwm6-gklr32ixF>$LcFMaDQTRe;@m-qVQ)w^0OWPdgeKc0I<9H!)!aZ8D z?=d70K;k%<v=_%xR^Fo>_gISnBm%6A1Q>n~w$~MFhg*0TBgqrqHui=GwNv59Z2dw^ zN2J?(7HW@p!qX8jTE;%xJVmw^WAjDnV_FIFH5X}zJ)XzQ9@j=8M*ia(AF{2@GLlMn zE^jNlAJ+!J-S!ELRG&c3_-l4O%rcm1Ff89>7-E6<Z<k`2UjBr($5#ol#=&z(Dbix& z?b1?|5$PPsFjHmc60KV>&HjR2@z@5kR2xAGEXC|A>}b)BdOf9b>Pc;&XNe4WN-IPm zHa?||itMu#2)I=;7<usLDx7q>sz4dSxlLrS1fBz5NGOP5rDBseQRY9V<#ZrzD1B03 z*vMI=(3uWg#_${(VY=PpdF}lc(0Y!q)5f<8jYSE>Sgwdjm!cQ7A=<LW_;QBbBF8)l zA6IOtlHlEDD^Yvu3@r0r#Xgn7^^p;F?n_#g2T1tWW4>G~M@ZsGDXN$NZ~kagwdDZg zF9-@2^E_{gWWAz|X#F%i7_<TJs4(f9u)90!Wv!DOenrdI{?AFfo`fSdXc^iH2V9rF zEZ=~+?FzW-Dn*hvYH2;62?a3+{6g!A6nGY4>N2oPHew1MwV&`BmSa3C?cSTT4Pjaq z!jVdDvrCtgo3*KGt3v}Yf<QP-jY_g*i-!Bx%Q=^i6J}erfOl1F@FkG>TeY0X=a4DI z@Z_x0VVB|{Rvr!y{=QZF)cbs_dg4fauhOc#t7A*=8+cJ^C7wI_{VnZKIPY84C4Cgq zZ~3;?+oP>PGK%OZo0s^NrDI>uqFLBPFykGp`2Rgto*4!yzv3ONf1H#}?`U1sdyT9t zmk#VZUvR=jy{jd7*Vadhkiuv6Xgl{^Z5vl;65hv(M3!uX<y{vmmtEv(<9$)taX!ja z;ukK-c*0M{_l!xGz1tw+u-WDVY$++10Uu~->b*2FC$7adu{U++dswMi@d2b2H0uwr zD?(X#jfM~0r2b3Wq-Hu<t0X=9kPa{?wJP?>*S2d05i@r{!hC0E?$CCHd0rBKwU*SK zb;jW-Be?b3Buw(Fv3OH1i$Bwb*eyTSRx!nOpJ2ZVE^FSS;U%VB5K&kd+J&}P54t0g zsgin?kd}DuQf*?vTb!S2?;~{1XAog3(M8_%K^jTM=Uj%e^FBvGy)Op|h}WMN@5U0@ zhM>??cPBNC=CVCR(*{aYiQ(igwY}br=ZrObFJ|5q9@%!(J}uho#e-NckB;afSzm+f zuh}JE2Wc2cG!pH~{aTJk>~QQ|i@nI_m)Pl^Xglp20FmRIZ?#e0O~D-H=(pNQu+*Ug zAj<2Kd{FD9>Q+^iEPfUG%B+JBu;o&55Sw~9@^1lB4TND==QgBrsXnMBTJ%1na?8F$ zK~I)#hcKV}omT680|a})hrQydQ4x0OzqJaF=cL{H5L7hpW{1E@*MvvNnE&8Xk-0x& z4l(Ps!<Y{RmVqN!V%%b9{-n+I_}+9H%^_L8T93E){|9|b<Ud?sa7|azzKPLgbglN! z?qq5x1$BJH60*$^&c;vvqC3kT@H1#}Atxw$J1}ZnaH`@?aA5Q&*DxOC&sMZ}Tm$Gi zWWV!YZM<4)?0J7|8_7DZ;WjE+e_Sn@)Ew8gqw?4NqTL+^qIUZg3}0^N{R%xKoYeD5 z!8jw{-ujz1!pqglo@*l8+r9q4g0IYo)!WM9Kd}~w*U<h%=Z5>tPeXLSCC5)|UAzAi zI8qda!4R*v9ZFC-Qx_+mguk<NfZo;f?$T*`uJ^s5h<J6Ep6_iPN+4DuJ3ogYVLEoW zos^2^`f#Wt$D8W{*TQf;)%!kD$d70*#cyFh?EY|ln{S(21G2t_o``TeTId@<fRdIv z#lotVI#+LMY2h8j2>lV?2Tly=rV;vT`M$kANVfX)5x(tp9&ID_O79LRwzKp$@_nR^ z=2sS__d*J7TkA=RyC7_KMMucpQM%vzp%Zd^g6{V{UAKx>6{Sx_-aVp000=0)F;*C@ zbK!h;w9a*{<Zf8c+aIl0cs`Pn7`<3yl{8=u@wd`9dv`jG=lfRrLT|Nl;GwWseX;jr zhl8{I`a4K4LesN6pHPtDo)b;4Vzz^0k|bN#`}%gdlq%bS^I9u(9joY4rRx)XpSnKK zQ1ztJtn;E{*e!hJmZWTSOQ>BZaq73!&@(~fYD3Rf-AcF=J&l6}y-eK%aR!;Hq(!Da z5J_(`bu1v;#|iX&CT-*NY^-h<#DOR=;y=$QkD=Dg=|EO{d07i1zRl;rBmfs1J#GHT z?Ym=TSaUN@HplB*kaR_B9DrVwppW(LfyXiEp|P!XGHT=Mna~>es_<K-Wd_C5)joe| z)G6%BO2NjU)ot_uigT!qo~xRJQC0xbj7rq8WkD(u^{v3ape?u%PV{2A64qW%$9M1c z;IS{|P<wr~Z*M*EAQz-ENuQ_Eijms?g(u4JWIfq&SDfdKw-+Vr>u?Ft85NzAqR&Os ztWMG2_WJfYY0i}8UBLY1(z~m&@;<@sC<nUg(*Vlr26|@65@p$Yx`AVTU)9B1oT^Xq zejO{f{%k-=A7pYH8aDEe=?ft@u!p|IM+~Ur;^gdDw443X?R=E8T;`mwr+RAaHRmIB z?>7#6g{A4qzHjRi?~$f+J$7uG-qm{`R$5Qj+smX_Y<1g^rpR+Jji}k(()G>FWz=PQ zLO3PCcV&I_W0HNj<NRLy7wM094+VQcS(E{Bla+y|=D)v4Pxk)M2;AHIV?AUIGUrR; zlG|73W{r(~^}AuE_tU5P4g*Va%n@1DPtWlE<T(E$2kAWOIBT(?0?wZu=YM75#rj^R z+F$2!fP_pi1iRCyvVX>)AISv8Aw&T69K)s<eGy7meF>#hmfa&uf5gLUB5#`<+op8u zbrG^Rpr>D<Vj~51S)sB&t_he080DoBe@=L%XNiA;-nBI8K(x%gOz+|SMRmdF$==IU z+dXxeKG6F=2Ud8wjtfQXlFJ=zZdlt23gQuOgq=D-zr*7>Ar)8XDQX-QDd~$L6c!a? z_sg*>^ls=6+g_=cdOg459KF8R`&(@3TSMdQm4nfCJiklLRjB4uZdW-(Zwn<pa|j9_ z&T&$>1a6ENBH!mg0#wSW9LU*988lQ+Yp~eNUgAopWU7?1WGIA0rR*CDiIruyy&C)t z5^u~^5@cVlj`50^d2TgeBNeW-E6$@NwwLAUW4yjUP<KpfChkq4H1Od?kEG#x9vV^6 zaQ$c)QY#pxx&kv_$)mCP`e`)wv7=QM^G54C5oE-5DyN0lv74~>T&JgarSMj8VeB}) zljpSb9;dHRoDeJ37eF=~8;8CNTUMdOVw`)uzRKr8=cVwlfyejkw@w!5Sw61=#x+?t z=#!MNY$1Vtcr$48f5W4FE=y#|z8lcuv5)_m8}%ENmW?v09@OnwoBQRPd68Z0tO@!) zPh_~8u17w86&E{Y-2`EEQnpOiC&|&9&~jS%MY~yl9<WU}>%mtIsJD|3`6H_7_Q{*| zQJ%<_XH9Fq7n`D9E{<s<<EQ8mq1fl%3_4F85d-~uie3Uqo_vd*?en=Qv2RgIJr6St zmc_T|1AUQ>Ck`Ck0=8KpnNuNZ#>?WVda4!$&j4_u#3yd!r8*MTd0?tO&lg=6v1po} z=!>ayE`c_IbPi5Kt&NxTTlFk2uJ^s|R=tZA8<HM}w81pjF$j*ZBMAD6>3Y6ex(EB# zwL2bgpxfO<L3eLiI9(53<k?Ot-h%AiIUQV~;Z{9}OkMniP)Tr7AgGARh(dIDX3*18 zo^oI=I2KoN6++U*`=vvn-o~3y7h!#oUXFUoxlJ#Yfe-QE$8<9SfFrk|TqmXP?RufF zjZ^4DHu~m)*q#p@lVDh%EE^toze6ts)6c#`pWuN2-#1fVtL}C)B{>it&$@R4uDerD z@+N}Qs6lOg6dKgAJN3TE$Uhep&z`0C@U)epS$cn8J2z7@Z!h_NmY(i(_a*Vzpiula zW+<~}>l@v;QFrOxBHO!>Jf%P16jyqBMzlTtF7&SmRPi@`Ok`5Mzb7ZIH1-5;=(<t& z+r91v5|BaD=IBSc|84BOx_Fa8tnn?|NNlk_G01*p`!UccE!GP>-VUm@oF_^5>4Ur- zoyJ&vpT13nj4XQsGJDZ=k<q0)qa*5W$V`!v`@!^`WY7I*@~Y5Tk)0dhB!zSJJG@=c zfL^jNp*dIg>(o-g$#v>%SATGls{cHFBK9ZR6%V2cJ>4X8fxa2y<m3Wqi6^DULwcgO zJL(zF4$F*(^bvq<dkC5%9zuOskN1?9JsjeYz7OlAh`i%r)L@pK{s<x?Le8U9HD%hP z5L-Ar^%(S749H-qQbyxBIxmFy*05*<I{28r!FQfp7`tMTo)zXxb=^v>lcO0%L<hw( z==wRDa=RR=0&IR9WwnsxQ<3pXVQC>n({PRjS(k#_aouaFo^_TNmjdH)%pms@Y;ufU zqMN~<Q>uHQlNks%@Ef~CpM)gdS)vE`YQ~l(-vLEysh$td^-EFU9znv&_e*uNLulto zj9ClrV4UB$sFbg-ZNECgR3-Y$@G`AT|6UCxsahw)aD0z4t7gHGVu~yhFn_sh5y+>L zlCTUtJUzO~&Sm-*@A(dkRrbg9!rCYGJnscT4z#;Ih4u~J4V3HelhGrd)*n&Dx1^wj zFVWucw2pa!a>-wTZm!&3wgRjNXLW`CHmoJj=##WGr<OR4Mo#M})pz2sUfQ#eG#DcE z#Qn5KzrdNK;?JWZE*XFT)Naz9NE~e?z>rApjA9DD`Ev(UBp6GKP3K$C&eslu?B4sV zZYojYb`4a}E-YKAC$$e9h%zdLB83e@^zzG#5685@$UT3h-v5jQdLsesnq7%1S9^7F z5^E&{05r2z=xk5E_MG0*WA$kYb!q#&(q;>uci6iXZuf_zS@FC|3tCOQy8LGM^VD*L zZaMwD8jEDEhSWVNvsdeBzKiNPezl(A^xJ{+Fj2Z<1*Cuc8of7y=B!aM7Oc_7ga!%w zJ9q%N{+&YE-tl*RmdBUjCTQoZ)r+a2>{zG&jx@HtsI-XM7dgfeSh!x|6}_8X_>z8z z`<4-Gyd>QXMPmEQ`YA?uMbA<VH$p1nF%s;$0pb(A{{{#>1mCES^7VByliJ%L!LnZk zqxA#py%N?&Dqn?Uy4YX()({-<T8PuQ*{|u_oN10+n^M%)2Y9^wRV!-W!Q~0J?%C8? zftht#Y}%wxRi$qxCBI>>bJh<QN2WQiLoH@36QMgw!Pl54xdf`f=!gqS$1g+(j0N%V z>NaQ@iEpT}6=L9y(J^Ql#cx3Szf{)0p=bAVTO`$3Dl+`JXN6rqa+TZNGE2?}cfpOR zIQ5pj8SN@KiBnk7JVK2hQ0<%b@!o*K1`oA2kBU}vXK1fmP#Ku6*#bFonP1*|G%T)7 zDEAWqmjagu{adpoxuPZ1KilPDC^$o-BI>l*(1N(}!ln9K2)?8@b+gF=GhAqMYI0u3 zp7th2Q{Dl%a}_t)UI85?+!JT-{D;1nlA@proxpQaQUxXPO6AvHCcLGWcn1a@cGy4l zPT?H}p<daPQ(^eK=|>#&fjt;-+E>|w-q#O%d_x>}j%0oSi8R!n^8u8K?pHhDT*uCH z>|u_5jbjhDkNgWN4-iWD5W4P&*FJ(K?!DH*c}6wxQnT9}<dER5%*OiPF1_6A8ELQj zOpgkK-oJhi`jm3nu?Nlmp!mN)1(r+SFZ7H{*c(v}24MIj5&wT+EaoU#_XV0~xvcq8 zsr<EHA{RXAxff#hpgmx(-rtM7OTN<Mebnz1nq|Xd;#-p?F`iIMD6ZDX5SCPbrOycB z3%%zfD_V|@#%t$=U+X>8jb($S;%ha_6TKhf<}ADKehlM*z?K>nE&Ut4f9HHqkEP(| zF8)Xv4!zkOx%`jir*HIueV8YI#DxVKji>?G9vCJ;f39S+>9`z@gZ6&2m-jlTElFA% z@0g%^iJM<bZ+jZcx8GvGRw)Hn;oRxgZ_zm`T1w3#Pm28ht-jndR+b%rI(|@&98fw* z^g;cYXI$BL`dUs1dUmvIFDvedjj(rpryulqulLIheZ06&Hs6e}_kNG5D{DM(WHE>n zi=~Pxi+_L^jgcNdg7n|X#2=xfekY&)$f2`LJd9Cxfn*-h4~LIK?3S|lUZ9iv6UJ6I zIEvrfKk1)36kh%xeLr?G%sC1TXo6H6)zdmmY=Weu*G(>5YLB7<Zf5BC(WDfm-z3*J zq#_t=@>$?h&H}&1h0CY4`Z3>B$BARYKclqecEo>CK9sZOn3^Z?AIF$HOO_u8GftCD z$Mq!j*4|*`Ow96OM#2y&VtFf))1(B5OYAS0E}Sk2zaUvW;`s|%Oy<xkwAcKi8y;^F zYQ0)(WAFYSCIG#+If}}Lljt_fW!p*A=<Raoq-tIMUsYd~^DD5als&&f1sN&Je}l}N z5llpO{iauY?vPc#1MQLW>F-d6&>x=Chj?fDmv+G0=Y?LJ!Y@Ci&j#H5LtlYBHvR!@ z%BAKHJ>Gk#Uxs-REcQ?I(ol8(#GJ}3IrXPr>YH6hqh+Tdh#r>N$wt?uYmFSw!%I&Z zX-Kb|$6!}FQCW6{$G|hl<#w&tfPOtr7B)AwYVH*bZVN4!vEc^vs$lMSf$@Jt?%Tr+ z7QQCjfWFOHMepB$*EKpi&K3qA^c>W}Nb=oXSBFI{jQ(ob#}xo%;Lxn7D%LeNCg_{v zL>^}!Z($^QJokt{!pLgPF)v#J1G7e{RC9r=TqZ{t(BAEZ5eOYVo?cQLZ6p@ETMC#p z#R0Q^m=65dp00%{gmJ?m-?N6hDI^?Mw$GN{nEG(Vs+&Jsz+v?P)&9$~h2yxvMKJC! zGUn+>H(b052i9+@#JxfSCj3Q$)PCIrxu2&VLGj$K#a+z#W!6VM91i?k%3An#<8xC- zeK;A0_-Zo-m6kfVEQvC*L+VdXL>XfpcL7=e=J$<E?OvC)TrpGj2nH*=qrsK|ITCGT z`-<HV(l^E^=j7pizZ-F-#ZO>J9%JAEXRsWm7p7yzA-k2qDb6*mj4W@ZM{amJvb|*e z4dd^-r{PfRic?x|85L__2ZF4NH3qih%?98?wM^^uCCz%mO)}&C4!^-BJ<V@S)k}Z_ ziNoHAzPNd`!@tmcPWufW_gk(RClGXrZp?xeZJ;sTCp`=!RrQt7))W;fJ@0o5V;31l zES299%ixN~8q4U#3&>Tn<74A+!Ncf?7IsXW(TbtkCKxHcxo%_`lmIa>(w+?{M^ejM zBgc8NrM0mVvZ$bqVIxXHqDmNRjwx_e9LE&!-HApw1Xz^_K`>Gd(&qt*XlsmOthUB* z&x5j&mU3lCRy!jPxh!sHsOw`-wl}y`5lBKQmB_#pPm<w>e5y$@Bq*j1Ai&rTMrvnO zD=09vnp_xnD+!4(-z|r|t^-g|T97-oay##IIoMGl9+3iskZ6h$d=PcGyEMfp@GOw% zPR0t~LvC8Kv6DjYR3~GS_hHC(ocNc$j~V_J%<>Vx^!y23@%W^;2q3?uv(XEstnF+J z@hp_gF2-KZqms}SE>-jtnco$>IudC&;|1;*KXnD=g6mSgtKFp@$>|0$JW>{P1E+wV z-N5gZg~?L=kkM7LzQJWQW4as3Lmxvz<N~q|bzI71>c|{vvKL!)4*$iW{=v=Fj|1dt zjIT>=cQ8Q6LQxVDWoAmG<G5q>c}5CuQ&5uKj!HEuJh&ffT@T<(C261>?_o>@q~Lrb zc$x1&S#Z9w8IS=N)Ip|QV7wi(1la}~08*F0yI43Lo@Sf`X>!sH&JkDlHu_8dL=%r> zeQ&Okt*^F7m%<Co<#O~8VEZpL)<Co`=!L3+0*Jud+4nEMNU@Zep=!J@Ep%5I;9oq% z9t5t*FoKf>v88!8C-PiNggvIO(YK{<se=+`OpCF+w)H98!<jTW#+2Pz=)o#&>~QMu z?OEoAa^;LeA-C^h^-!_pj|Ciwm(Nspx%_e?12=K2ofy7lZYpx}a&XX-(j(iLfdW)y zg99q<Q`yFZFrAW=-I7~94`bQQm5_*E50_;FjruKmb-`uFK%=XYr|g;P!OaIbU`nET zaONN*RfVQhZU9bHuU>HBnFCZ;cvDC>3}){fWDN460VfPG9)Y!L2=oc8B?qkmIm)#p zXdTQkCWN!sZ7x+$#3q)m7=oH!*BpzxL(yWI@`$?H*wgMQ6r7n-4EzsfBn(HD<o@!q zT=ewIr7f&}Pd5=T#R>R-P531^ek-JisZ_|qTqEtWXArU*d??+S#j}mvD;v32HF7^E zr*e%{XU)d{Ls;-8z32V%^UR1Yp4C#6hxWEc7UvlQ2mc*$ry&owfwNa(#j)e0=y}2M z=b?AE>4f^Pg+IfsljLE>81IYDz_omsu?{RX=o%x;<2<yIH{6(jtv4HogE1@R_;4ku z2aPaRc*}9=>TUiw`}7Fo9X6=yA8<|3{*gu}wPA$Jh#B2~<2+c}D5JM;J#r)_GiBN+ z)NPi%Wt4%bHY`8q8>O68PQT4a41WosJd(a2DZPE2!S(Nh*BNt>f9>turZ&_QA&bTs z^E$ljrWVq&Se{p0xbz;Y8gzPvkz~&rYhVI9%U(auz}Wa9d*65i6WK4xjvI_5X9!b! zgAtG1B5s7t+7KL|p^qH^C!mvWL}&DnRNrV6B3596k>T6uWHe4nCK$&cGVYiNLH?># zO@wrQO-@Y&oovaw$yn*EJjO}X%|<m6+jq0ESM@$@6Ra<{T|6W^CK-ouQ&sefzQoeX z9ueM6!70~1q#OG-_E*#fSkl+sl7>(qbiW?9HB3>RSjiM48`-`y1s&HLp;%*c;w{D| z-{w$QicFnqB>1*8gjG&8GEwj&Q;n{whMG(A#h3$1n`WFs$$Q+249cbGR#3297Tjv^ z5u}O@*g3KNR`lh#t8O|v`!`+Q**4u+p?ZK;_OwFdZMW)?e$H(O=TtRsd9t_PW^`gb zq4FP5_j9xFatZJcd*KWtJB$+jPNOs|hJ$yvLm!D}9Pl1Bc25*T16lDmqpf$Vzx0L? zaq|98;k~8h-Qb5RJ8-wL*^62}b&rwjeG8rSpV4vlgnNy#<YvU|<^3n7vaZ2xNKqxm zLBMKD4D7Cb6dS+euZS}3jQfn)9?v_n{(dyfccuD%aO!)sQe@U#BhULjn(l+m+so9; zEWdqXuF-=$*y#bXJ2qcDh)lORA-c{tssKAQAHB~9;$Hx5;$M!JEHLJIw+9`iD=@k* z#s)PR^^lS5-Qfm#2pVaf4$y1xhp0U=6=fYYV~%#nG9LlXp%U52)d)J_n_E-KMHE^) z5yllNI2g>s0l!}rh3)PSL(3f}pFV7q`>GpqNBJX0jpt*Tv(QNOeNyMOej(JepenFS z3LZ65&bT<4Js+NWxY3)a-jO4QpURd;k;-Rvsnk9S9pQ5s`xs<JFtOdT?lH&@?ALqD z=&v@IQQih%_+uh_m|dcpd4$IJ0yO*ii_j^f!(3zx@qJO3HX3fcL@kCgiESy1p&Td+ zPg&#}5itR#h948e^<9gB)!xvUDRN>l)Nm{jJZ@w;Q#M5jxFn9Tas8ap*0--=_<>It zIliw#VToctVe|%KN1iYyS-jkyT_*Y4tpSWnOM{AUDYQkXkW0{{zZU;eW4mv^lN2tg zSPBu1QF9rz)hlFnnXy9Ag;mPL+$u*)6=)1KvH+I%8@0^XQCcoDdW5s>U|sZAf8wpK ztZ`#=!ich*Oyv4;*gO!1j6)b}QptPR?i@0wjTnyc=;y|To}#c)ZmC*k#NR~G<|avR z3PpOmNesp}6$#hPB&m0}Niy!0jyn_;qV5V;Y%O~dT{RYZo;1dz&2M^A4OD8LBx6a! zQ$}jcx4_sPNa7ibr;H@En1)0Y!tTu3IGOj9F`+ee*f4kzSu)81w>rwojp7amT^GrS zpDVP!bKz1^ZjAT+yUrQ099;}9kXQ~``n_yiZVd4r3hIB|e{cgeO6y0!De<Y9krY9k zdxlP860yT)iGIX|%aW&!uAND^t}rZ*TU3`NnL7QWus;Bo$Q*wfYAALO{U5qR5O3KE zBc;PnZfcE?{ErKleJjAb<$?~G6rWsSq^ad8vbsydqq3&L$h|~m<$&oOfZ>m&sYQAL z*sOE+@&FQnEk~irHz9pj*ImRu;u)xpOt3BPMhuJhec|3#Ztr^r{WdVEUTO4dQjYvA z39Ag-_g|+3<7Ce&4i3tmGsdXSh$z%kCcRzr_!we%%n3hS79*thIObztGu!wchZhCx zFXDe59mKIUhABy#%?O$GcVmehcphEJDH*%kNbK+j5+EOjs;#6DWB*A%NnhV09$R15 zBeWMYksq!$p73JR!wqYUj_tir^BTuacVdTW^2{2ejkmcbFaO<W6CTd6;y)T5?`@&U zThC)BTKwOQ0&h!AhCPpP5l(oY6F#y&e3TPD>IHO9(OPi3&FUA>uPT|#)$%*mD!pLS zTBSqnTWe(Wi$Ma4RU2_ht0v$K=MI!6OY(&n^_@<_uJXcl=%Asyt-~M)GwUxJ@l#@( zh|a3;p9QX+1+Je3Zn$u}>P2I|$1>p#AboNGK2?!0cC19tj*|hEP$4Z)<dc@|OVcjH z`IGg=Y+sy{gwhu=lzbVz#Qyb0Iv!2)zl_c$;SB#z!};!{M~V`n;+4LLj2g&uOvS!} zUh5%Q_lhyW*V;*7rX*}Y^K2tI8=#0`C+h|%CyBCb1NuI;10|=W`Zug!mTzhmEwLL7 zE-NN%M5pQ?H+Q2k*4MTnLSe5OgOt{03Qmj^LxNW0;E1nXU9KlzMXt~S-$bXH{hHCY zb$fVm7)T*W)=g@dVC8E@kuSL+EZa8v`Z_d(t+0)Sz^}(9^l^ACbCc2E*Rf%UqnnI* z2vKtiBZSh|jUs2sxaL1$SowRy$ZVa0@S&J=3XPA)D&H{LV&sYWq!jhMm&>58vgx`p zD|2NFR9zy@6h&<|j(Z+1+kzhVB}v}`f^?SkTNI;XIzC=0ALFEU3ur%1{BNSmQKSh@ z)!=B*(Xe=X=bOeBkGG4aj*r-Dw;FqR#$n#uMus!=s(RZ<wYoaUe-CLF2Qm_y^0Id@ zL!ugo<Ov9#^^URS3~Aa;qTj{bJl5LY#XMejr_eLy(|3(t-Pz}|W+?KhHG5##uZFfd zexr2nVa7%Umy#b^B#FESrM_Gay=Npf(8(2<un8ALm?@d>8}l0|A+AO<Q}(>i-b13d zfi^Rx$2O3#+#b6P?1v47>poCSyXONnt(N>RW4G@-2k}F%ZHM^vrMgZ@-(lqXdbq{1 z7wo{G6^JeT&{z$k_x=bib)0PZ2noL=(K{)+rT0!%6G|zp+-dZVaRrPjs$IJi+9s}K zUVqR?lfr#yqPhPyy2<8`G1-J6@FzxE_;>8~CGZl4Kc_!20ssegA(Gne%GHrMpJNkL z*r&#_;6^aFcVqfEeDWD2L}*YhtE~GR^UdeG#gLPq8<oBb>I%7jH^-&wq2v9#jR-xo zZ={Gz)41+4TBQ$XD9=*rvnQwSK|2+O)%=_DE{m&nvD#g|$A#6YQ!;r^6CHKBtl2~T z$*$gmX#uPo`oF~J7xT(r8(F?r>ZU4{v%Jn(^p(-ePTFfU_twR*0gL5u2thf|%OHXv z$&$F=NKktK*~?SgqZT*;h6?5o7;1#nbqq=0V5LgsLq^;BK~Ps&v@9}0y_>-zlTtlF zQ@5Cyyj+D{5=IS{x618;8mJ`R3pI7xM>c$8bmN%)n_?We+=(q&^7}W2U#&m6waMgq zA-Mo-_5pPFuB*Y`-(vXYCUCeLW(K!@YxvJ-o_(a|TjOpp<=6vCO3XQ+^wVW<dB<Um z^`>xSe*nE}d8^02X(NRP!EK5)k10r;k})qy)pv;foz#4%VxNMghUi|Y$Y~KT^N$;T zAKz;YGGN~KD%9kE8{dQ2j%(WYXd<{PkbYUR=X<5(98$8Z(;@KYMRg@BI%HG=;p88X zCA!`pjBIZV?hCfC%XP&MP+;)r_m7Y`>MBCKS@WY2&3<B9RD5R(6e6FIf<%QCN6L{m zT@`(%bUO^uFw-7;7;`Az3{AdC@U?Hp;G7oXkHM+#x{|6~K0ShdVVv~+NlBCZpOF1H zIsOwS5@t%ye~i=E+nI9|B4#F5r;Yi(zD`*VNpvmBIa7MmN|&*<&{byI6}1>`H5LF= zX%_s~IBJDrL4=4I6k0BFtUQLbqwi$XF^I31<lr&12IW%-ieeRH5naDPE|trkU(|Hb zj{h0EmChZ?Q~g4C%B2bxiBG6`oVF*8wMcE-NhLl{omAR%-mj>ji|Z<A`LF1SFpT{T z1jJD1H&w)v-;5193C`gfDM)t3jfC738{CA@#@7>|U~x)*XC27K-=W;kluoCNG;b!3 zPWFvyFG*ixN9v+ZkqM>apN{ZeqH&|;d8J7UqhlDIDKiPx6Q?zjtZn}QKLPu|pG3)? z{HM_}{0y8f4dR3<!@k>;?riK#ki)((*vx=1R~X<^`C|YaX6CZZ{5%IIP=+)&7bB;A z&CLm5$UwLWA!`?fn^*;ok%cYHA)bJ}r-cczRc<Flm^024)akO^XQni0u*4%>ssV1W zx~9PJQeswiVA`^0sDN(Z?F1u?QWo{0uuqr#NOQ0EGEHvFLp#ciGV{nYQ6|o0$+jqS zYWU@--fmKLBW6;^M4LHePd=vieze*5(roxqwV{x7=i0gbgk0q|688)`#}Ff7$Ocr% z2B2EM_O+2wF=p_JX<T3)V+Nlf$0H}LoX_*6sFj)Oy#ix_3`~VB`VL#>#(V|MaaSvI zIY?R*YnGp}E#^w#6+j*y7?$`iw#5vD+~u~IK@B)kPG66)(RROi$WiB#PvYj)-I{4) zLh*=ZQg?{fQMZF7Q#X5IlX;O2gh^SPo*3C8zBFx8gnI6ZWI5xd0cmcSrQWN8x|i67 z+08S=t})CpoNmmt%rR<8#3=g&I^+h++}0rn1!6(ij#wx%<7AjAFbZxjk27&*j|xSK z9FI3wV(-?n1Yib4ceI8VHe9wbGn!P2%4J#`6OG$WNHnKnM$(?w4%H8PU3(MF1~N3s zoR0+ZlTBXHzdYGYRaA+Rf_2#5b|BeQ(_6gFHL-)4i6HqM%v5Xz%+T;u>_rg6S@w<& zrosKtH7RCGPdl~wAE=W@$P?rj{#cYOY2Mj9#-|Q{?QBk08Tn*!ceATq+Qr07KT_`o zJg|b+4cHyBtGby-Jq-TxdFEpP2T}pX;3U=TswUUt?8T{OSn~#B7`Gq58g!aD|14eu z(oM?GnhVXKLj99nosRYj(0~h-53Y~JB=d#f2^EUHSb8t>Si7HCL-<_?L$0Tjlc6l# zPZH=28KA5bsqAfX`)h4)b8gVW5TcJcLN#&(R@Dras-IpeyU1MOx!SI{2x)jKZQMA} zHS8?tSM|q36xsdF$!GV+TEE>k(~M$L-7YaFg?V!E{GPcR&dHa7XMj_qD}0G<ARF9) z)#<Tl1&3tLSaXbz>p!X|k>qSM-nS7?x2dW;<67VG1I#5{+sC!OGi1_0vp4#Q<pWVB z=<I{cNubNBK@gmk5;52;g|&Pz1m{n(X)x-vQi>*+1KY7dh4Rm}aI-I0a0y%mtkib4 zsff2D=sI$hiIaM=Ziu-b*1{a*0HWtmG)wYOlNDDqR26F3P?LIK%~0g7{BZ33YV!zE zoRbUmD(!>0NMDU)Ic(`tHW`|D?2nKY`@3L=YwiIYayz;YtG>Cz%s~yRk-A^KTDyLj zDc(GY9_-DM3D=mD(b{%g!`24GhMU`AZ5e^qn`Prci0qbdg6c`Wb#-qVhEN}suxBi> z2esMGM~pL5x~rpC$ddfW?tv|hwh|T)B9IeKYpWOs63>(^h=s^C<Ir-;CHi_cU|f_2 zMz6HjTyJ8ntWs*mgHJ2%i3MO0_@WYRK#$)D3RcR135cTVh*xc>{e=4`pf{<M^oeGF z?=XmaTtzR7CYq~SUjuQ*K43WPaj-vyp;|CPa&9uaMqUdryA`|!@s?j}qX)dfYhj4| zT^M6{n#toAv^X!0Zu%v_cKxtK4?mm$j>EYm0%OFy+1#omV+X1Dx#js1KFN%W8Hqex zCFgZfH?@sw2%3cUGvp_n8|wP7$6w64W7oxoOp!$i?6RUuU{{o}X!%HtMH&s8GlZO3 zCOYoQM+&|<Tq3MH%s?2XsZd7ku!H89!wDmQPBvS6VkKdUnPgGQH}Y>bPjaT9B4cFo z6f;f2thlyP+Algmwoftrp6g^EJY_{6+y}99r4=Dt`$hZ1FF^7wq~ci1B#%~F`zU1D zB(trLd`%>VOYJ1^`f%}2M!J?%#l^+<p)jHb%*K8f3`<N*SmH4#DI-!C@W;}qIZ|9g zj&6c)uZ5FhfwEh`P66plYpfLAVh&V-8b>0gnn`_bL3$)8IhWbEvf5<=W>4ZV4AEhh zw}^kLIV2<%&n;3i)r{}#az~SqkP#E_A_ZM6Y|oGO1Q`a4zEc(V`=^<UyyKk7#Vj)p zdpRbX(I9d4H0W=K#DA-@@@_R#tm~cX9uJ!xGqL&>tC42X6yD8FeVz1h_4ZJh%N^vF z0*8h?tAR>xmJCA<aGUNVa65lYi`lRaTp|FW>1e};r1y05eeVsJL|qx#QIZPH9)RT( zn%V7cbda17iX?I(6;fnzGG5tuyU@hz&{9(f9fVTWlt2-x|B#G@<v@zwjY<q>+i4?t zJ6fg`v+^f8N#E2|((or&CBbn1j|FqrWI_pnsH(}_j1SW9|C0!E=dzZXYU+5h?KZPl z<OC<3Nl<FTJ?*uBVgO14roy1K&0dt64lR>9P63#-bHQKZv0I`^H-8KNl*{5hahDeY z9vb~}xJfZLp5^$HB80JueuSWA{jg3a2hk{A0vOX_PvC~@23TmGe6*Hf$P*-y8?M&r zQI&oNIP0JJF&xti4NvmEf$*U?KY!|U#|B70fdGueL`Zjj8&a_a%jPZb^r92H1RJ?3 z0~m4fg^bQTg?}jw^Wu-~nuZ%ZrXW70^;dR}8D@4Qbcpr$nMsm64?DnT-DB?YNMSKL z$Wg^64lwfT1ivczCH&gSFPmRS`85k)o(!ojMjB})IPW-2su$urz62o(0gzGrTEwqe z{Ho-a@M|Z(Y<?Z(*KU60^6Ny2*;jJ!!&mNOCSKN2f$7}&nAz8JwbT;fqXfj?k2taS z<12$-Y5W>>znL#P`DGK9%dg%1s^r%RejVjk{9Js+&c#>8TyvA8@$1A~#68NdQS;1N z$z=({W+L3A2h4r;s8X~xd;ENJa&rj8#rFb>LPd>x5n>U)PVlReU-5Oc%BZ8&Zu;il z%hXA=zEb2;O-9jc^+Gc_NHbxaMT$QBs#Nsh*G_)LlOUBUojU5x;#Vwvg<rY++W9EH z7BSpz!qnFZ<*R6SA7F+2%HUTlzee$^l3%lk&`$M5SQ@{CUyJy4^f7aGkj9`kV5H|P zm&SJGBD2UNJDG9(JSKxLd*I_3Y0FUp=aQnaq|!=$rSa=+er1$`0J(H-c-Tx>J*(98 zShs**qrk5mDpR(yjZVd)wi$1Sm6;V@wnqhgL;>aPWoC&+8TUj;#AZ_Tq?xF|OB#ST zJqaDDxnw>C3s;*xg>E<2)Wc0k1vj&25kbi}8H+UJ*i%^4bi=Um5}{QM!mLgzH$6x- zc{w_!=907A994&<?O?gwoQMp&J#D7ed2J1P&3M{e>~k}JU%_IwH9$K3|B!Ao8B43V zEPz!PerGU^UH@kug4dQ63}GKy0nHB)DxOjCb_A`Hu<G(Y5zOaggM9LyRpI9Ztu@ao zQuSB~tA(tG73pFbtBbZ2vnj(@A=_q>`J6&*GOW5FNluUr&zU7{SUp`J!`ym>Q;`wZ zVlbV!ZXted9^D<k^P2EWb^LlX;dj2{cR`4sn_rsam)?Y5Psi`VCj5Fie!ZLU>l5^| zE^5Lr!%lwQEN?D%-yG)mJZJBC!F<~j!#ZHc!QWwf;W~^BeB<$r_{}EB;!9(@%C5O# zgIYh}z~(#lLyo;r2E1fu$cdM6E6CQHtlmB*HV~$ZRJ~+YLco{2p`~HYqYBR?d2T5! z>J%Td0NxCi0<+EDSBdeHR9+hEFP-1XFN<D=aJmoM(Xc_~eWdDnT*l4|>*{%0sy@P| z`1n`MOpVBGauOK^dxbsr6{w%VT+;9q?cy&Z<NN##J`7pn*!MfOTa+gp_fxQmPA`~e z<m3i(zBbhH%5&@yQgtgP;g7z9j&9V;5EJiLn*MO=DARD+PRrB|)9|S_Fd{?tZ}&i7 zv|wk$u=!pgfmhAoA=2iu{zJSoaI{TqwBVr~Ty*lPnWwZRzeK!dra78v=4;T;`bhyS z@5QK9EON_=*U-iF$Dv3w(Z^DdlQU(<YY+@wH$yONwOimYC%)96lfD?2+R()UK&w@7 zE&eh|f748nyKOU5<rFU?wwP%a^|v@g2*B`1xsqMB$r(U!9y0*LAAJTWAI4#!12Fv2 z=L(s;$($=Ewg8>en;=V#H}O^cyb%#TNFh<R2CGE4i12l2idO}3DSq8tug<$r;UdLc zg^#0y_EOU$E)koBCca^&D2&gOh4}OgAstfM<uFym3EhG)5pI@#sMLZ~=(D3Yn~7F# z6Cu0FzJGvvg|CBsCv7%+^kbQ>Le#-9*THmy;fw*xHVg?+xuLSeN)26+i;*47gVEWf z0x<kB+BJ2=V!H^y@JFBFbw1RU0x<m1X9RszX)l)bTXEcO#TGLed+4jSpgf~wAFS|v zMbCoOnA4wIg*tDIcr5jGq-rmP3fVdU!yl6!Q<otJIRO~{=rgv?rz>0m82;!pPHNr+ z8?a<ia0X!bqu2FySY9J{yaj<CKp+lVa9PLEXrT2EGr?OBWM1EKz=_@sQuPni+l@`s z2HP@&OeoumVosE{u;j!)F==K=^xJMd&Dv_3iZs{;h5!n)?uZqD;g6V2s>7^>On%#G zRJts8KQ*a-8?B%abZa-Y2~60AiODpnr~)dt$`)AG^d>^KmWp>=%;MiN{R*Aoh#G+5 zkLVOB8g?fQLwP_+2EZCOqT7IdywCN`Q^iyz?j-r|I)&*d3*SWv68~wIc<u;_gel00 zNY4zi$(=zqnN`Oo?PfQHzZ2;$Nq^hnnw|g!VE7~Uf2-q-1h@h){L$y`I-kyP1z`B2 z&zw4+E^q~4_@mD~bv~@_01SWhxmU(kVdClve6kqDQUuC|mni&;o;Tvd?^B;jg5X(N zN|3oy^Nu+~(Y&#Ynpc+(+iL)ZKj!m*EPvPGXm&vX82;$>pj5-F4=XAc&HxO5^qP;% z+4|X3*+yEzP+)QB#;W>3I=!c+#Rk1+X2&c*XhPLZ3{strMq2rv8PWO&q|6_w5)R`| z3k{a)_sqGfk_X%Q@1q;W7Lt-}=9mi~MoIyM<XVXa!&Dncp0FTJEDFi?h%UEf;wVqo z56mh|ydC<$EcPu#8u)AGljKd<kM*c5_?J0~GkE_pv-&+2f-2Ig+v2t;Bx4T!&d6Bu zx10U(ZrqaXW>@dyy4+9*Eo|3zb3ix+_j%HG2WBOoz_{OB?Jd=%gU=Ut#@&*nCKJYV z_!2AvXMKpa&Dh-~|3gd_ek*G}1TBV3#ptj^SVum@y2o%C^bvH9MX|o<(fNow5{6v{ zNlQhYVv5F1o77@Wb%1dT;npH$J7qizJ{snBm<cekvhX9btJsCu`*!*x%;dzDR?kj} zxf)($VVInTi;~R=Qk;Z2vb8(SZZc$Km_IxYK2Sn`@T90WZ|Rx`LyifPf)RLCZdSFK z-fkl%6qpYO#>AUlmfPQWr1~mo8%YIWru<%QCd32~f)b91dSvm9EmL?K@W*CWIDHVD zpK7{H(m%ny!j&I$i1P{9ZD~l|66cOEbpg{nWm517RxBE&a)nfVg0^*q><d~aKS4EP zs%V#a?1GJrCODQga*u_ZErKmZz=@bs(K7*Kr^w!jzd3(MyXjFKOV>`t!^oeSW@%wX zLJU30WrsK$AtftX^ok^itt|PZ;HlU)9m4R!D$1j#M`^QNvmR;aj+5F&-gw-aRC2Y2 z1M08imDEXd!u;oxZ1j(Z;lu=65r3pT`$3A|We7l_{|~8I9g`wQKQkkSasiED$v190 zrDV^BA<vO_2<M6+>yYuAhrmd1@*AazE(1O{Q~ErKY?vkM!Sx~<Op<PQoXITdCR))_ zl@85!!{=)0Y{%zjlJ*q9^seJ<@dvOy&)AK{!AB)?x0!SWGfhAc7g;t4w-6LOgtL;$ zkyHRSe=Gor<%UDwhNLtm6&hu^RPQ$9E#k&1aB)|`B<~X|(Yp-7U_?xtVpmgA42Gb@ znXTKM;-uScu_OsOhcG5J6gJ5~#NBYDIKvU~r$Z2@Kl7jz7z{H32Cx>YYA%sYd$8E? ze-ix#R&iF?nO~SGE!AEcvsZI<dm@?4rFgl$>YzEPIfP^M4{Bkj;s-1a5=lH+ekTsN zSLkZ9hYWcl%9O+(&4Zr1$_`_(=o!1_Fqg-kl_N*Y@t&2E^AlD=SJCQk$NtCM=)s`t zoud$m-sjOUxPor{j5YG7?Sh}p&0IQdd(7m!jLVK;A!VjS95=_DvF~8D?p_eK@Hkhd z?Aqg4FFCUiywes(4^Nl_+C2@-K^jFjFsf2dU2%>}@=lmpYP3Kyca-G+L6?a?X>M^! zoQxfva`Yr52`OMX$&mR;V)9A3_<uFyo4}y&uNa48ZS_~RLY4j-=D)FYrYw8?Z{|)7 zRZtRbZRP4vpq0hdsBW=V7S`&mwm3Uh+saDv{9XL97B-dH@EOH`C4LKu+Uxw*Vcr0; z%&;Z_{F-Hzdb}^_YHP2(HqL4epuIlc;tH(YskOD%+hJ`8yO4d>HFCcwwTV_Q&r8y& ztz~;Fb$NNVhPMe~EWd=cv*w{f7PPa(w;s{RZJ0i8Z*ehjc6;E7dj#8C$H+7bQ!Flc zZcMRG1G=%3)skp$>1@4^;?C=0z3pxNGLoPoK~X_wjfY{9PfI~}l<sL+*xgFQoy=Rh zTjSwsd!98F)`Igaft8$U^@lY!)tax~e=-q~eTyrLD6_E5Y@ME@X1TNM<Q^8LUjnk{ ze5AcWnqOdzYPSLy@HYpBb?HVX+*39t40nfLU<JJLNH43$wbUtWcu+8qkLcdi$o+aF z_ZyAen;W^eNPbT%O?$Hu_#d(i;Er1xfvXz1-_qr053Wo+-P7Wcl-?Iw#omAFkH3XW z8FI0OZTE%NJSp#EwUu3ctYlmwjemA8t1pf#)%JpL`WIA@{)`@m%U4o+TL~SvI~jzb zXp>-AGb}FMEbfjoVtg19gCRa@<lfmhM)&GQAwF*8{={|5v<z#YOz30vmAx4#gv~<y z?tGaoD66`9#OiBx^g)s;QMgyS^#K>|3tC?Vt*?U?E@P!%P0;!#Xnh;B4g{@(LF>Dq z^>100VP#8YKdVO<7VSp|F}LmyH*z0Av)hXc-n08!$=;t(H4iq&tsVWK6wU2xrF;Jq z3fa}y>f}9I5Ahe*HcIX1M(+PMavy8tKHkXvOC$IH8o5t2bYIx)WJ5r+UmLl9Yvlf2 zs{2{JZaM`pyG!Z^q|zUbo4N?ye>!gJJ#<rXVR-hVbW{1Dn^iakhT@lE$pbirfm+X! zqP|dMiZ8YzI(q@9)Xs*X0>L)#rWNMIIfM%{ac#u)Sh(GOv6axLxs!*BL%8F1<F#<y z#DRD-Uu^8@4?&^Cf0EQ<&xjOeS`prshTN5Do#%}(+ztpE-;(UTnN~r|NS}*<r_{ZT zG3i=dGdFdBH90b}fu|H6iix&Q53m+;19U+Rx|^if7}MT-rM0IygzS<b)+i;|5KAGX z1e*J8H_x#uJvzHIBHaOoM2j*?zgZk7dxt_ExYu0S=~r9W>l1C*9rCQJJTWmy(4AL$ zT^7HCD_|E5v&@)QfV(TLugm&jR<D>?fLwZD`|U6*F~$!N$xaf5Ja>G)``mFlv4H6U zL+QaEG1Efh*+ti&b12pUbCnu*h2M=w)-cZDZ=S>7`fLB<W^sQVpjrGm{1eXM-}*28 zi$Tf141jHu=kRZP4*zz4<&XTEwg0OC@J~92fATr}JN$*eS_1F*7XiovDd+I-bPoT{ zXZJ5w@~6w$11SHl=kV`#4*%|F^&cJ-fajexK+r$+9R58*{necxl69TM$HvwEoD1OX zYPmrWZgH*mPCwIoe~9;mXL_fNQL#(%t(2JF@U9mS$=6}2qB!WS^1i4+Y!xG;L5!lU zt>Ue|05ui^9mU_>8-M<F7%(eg3{If%?g&G9HvooGrC);#RGt?%0G;tXX#WQJpYc3s z=9%8SUywiMcS)#s*?(K6sE4>O4TTD+5R(N^L#oFF&IDc708}v!LeZ(U>;^unU;`S1 z+D12qB*t9X095g8%ccSiY7nSo3Hr+IW2|ItFyM7P0LVO9)|W&j#$44fcvFvu4rv&K ztdRpyJ!=H+#5Lb7$7!94hXUTXwnK&f)#vcfJ%@kZU;AIsY}j81Xm(AgfA9{S;Q%$N z%@JpUu5AFS9cK-R83|B*Upwe}jAKS&W1uy}=gGH^PqKaw^W;nIRH&u-;-6+sfOW?- ztE)HPkZ(SQW}bU1^xmD*tU>TdxYbGu&qsp2rDB?uW>3A<3U~ltH{BY7)J{&vXbsNw zw^@a7Cf{!1+Kh5L=MD=)@q9_Y6ADz}Ok78rFL`&OoyttBhmXlk17Eih|D*6fFw@Ej zh9yD>Hb!NbDap55@#^yu=8a{dJFRFR=QKF*&9_h8X>Dze7+dbP9#NB)T_tCZRqA{m zoMTlwpUdvy7*RIeV~uaYX$k{JcAkUEd~_G?fXuqrn&yOCe=i2RSID+|ag>fzJ6zGB zjzd}SZCSDPcKB#u9*IT4nE0VXp?Y#WPmPcP7GPw+0gEd*$ZZrHlN}gmsVG30pga6@ z<Koa_i8av2L)2*uB2@=0yj50W<$H=rED9mcuXl#wI6##j@a|`U=bi<gcNX}tv%s&x zDnOGN4?jzU{IkHXI}4n1xlI-9);c)Uh0qdDuk&aKFFXsp=q&Kt&H}%^F`ViOt6)ZB z4+nn7S>Q9z0>ASt@L6Yp7tcP6$9-pkKXexO{bzwcb{6=eAY5*qXI-WmA@0*!;IzjG z2|R$t{QW#D9qljS0V@So<^xt&70?j>eDo>#viJcEWzaq!um&oR4$>CU)Ms)qg&_}G z-4NoA2d!QT+=*c9Y<v)NQ2A2xpo$+oUs-+UTLS?sna>$1SvKDq;v6`r`Zrd0PS3Y8 z;hVX@!pbb_E1fA3t&#;Q_PPbuF1jAF5@9WW$jVT`CK1;pIq?vNF8R{qVJG$^#!i$; z532&EKY}bF;~rL}+Ve2x!XVm$z(J2#{Z&esih9sWQ=gXxOR?(_t9NVSa&ZWWDI!$! zmE?t1whErD2#X|3TnN_ZL25v17CJN?q-d&wU+t2&;8Dy)p)8L=V5$L-6h(P4UHGUK zVJSDVVjtI{F3a@Ctbq!nF#w&>?r<T!%5=?RD&2#RVLlGEyU5B_`4-osP~xIcwa6N- zJg=21kXtQ+<V#>Nrsh!ni>-K-+dSmP(OU!YB~`BX{3g9?;jNNhApSADj&ZS-tc2lR zO$7&)|8^Gm-DiQ{a~3#f<<7ts>EDYP=zl(LwZjhWn#Zle4xv3ns6cnsjBlmr39#O` z_VOpJSzg~5B*DJnkhEP2#>AxSQmfGEcs4Et|8ru#s~oBS>{M0<9a{#T8!H>jtSnX4 z5t4p0?%RnKYmjeTUBU%oZD@Vg$wle0%sT4ilKdq2Dwtu;li>N_=d>p=`c|L7b0AD} zW|JuIKWQa6K@QeO^gmUXMrQrz<fl;P;ZnUbHl_0uNP<6hdF<~wG*={GN#SJo*Fn;o z$Ke64r5ZL{mZRBUZzq>q`@=lr%T_?8z?Ah0ws(8M3agk?xe?D;xjZsE?7TSKVf&0V z0CTGwpFzV6;F=B)sb5wwAC)PqA{7StH9O=UZN;~%)LZzj?}MkUM7;#;#VesL;7a55 ztE>~A8)VIMnDW5UyXUQySByk>Hef2{H-hX;|9Y7J!O)Lv!{OtECj0<WeiJ3I8cNbl zhWva_L>rmE+DgXV#%oqvkAQ5w*H{^_0-xao-=a0pv_Q!<)>LbfQ^(X^SQt|ATRZRX zAPs1;ek9)7tE|9%zK^_M_4Q6Rf_H4>c8W4f$6p%p|7d#;Fe_^IZ+McKIlD`5XAXTA z7NjgoFCr?7fPkWaC>B(@NUsXkLs0}93bIi_1;vU|6a_^ob`(1*qDZr#qM{;*fcyP^ z$>f~bmFIc?|L=O=<jN$uTka%xGMSmo%=}*K@tvWk;^Wzx%WxaJqq^&CtiH3K*7tAk z8Wc0Xd7<!zs&_NYA#<OO*NoE=xc;n*V4o!IQ5&De{TOZqr_*|12L|4KD|#BM6}))% zO#Bf!0va@vC#l@!@rLcSSkR`%1$a3nQ7jwHF6jP6r*2vv&x?;l)klJi>nOXj*DpFG z)R)WS^(yuSoPCmuz<$B@&=t6UkMXqv!-v*TQ;p8X`)+gJDwDb9p%w81B5O2c^6p<; z-Mb2>1$;&ISuDRut1SZ`h`>Jp1{}j~vz^bzGf(h(=U>mpr$k><S@K-GcG)qIT4KFE z_TQj!{|1dO4jNu1q5r5dZa999J8Ct?#LsHuTV)#PfAQ!S)>QMZ_>U|t8(rq?3@!U- z_08&dudE4>W+s|bpN~I;%6;{GydA&)J!mlQ4ClQNpRH@kO<TEYC8pMjs~~`i+aAJ8 zr8Dpo(Pjq(e*d@zb~8~;TZ8lFB(-QwyfbWa*BXqJzRFvRD~ri$=vvCJtTx56YU`&S zqt(W>u*|E~wzU|vgVaSY#xKm8l2U8!i#W01Q&ulRBnI?Lu*iOD@k<zW*qiiHJU2cF zq+D9pL9h)vNd5Iv{5jAMe3=V`b@4@*6p(&|1K>a&_AcPgW~M4%0pI=0TOVJfKRHPg ztAN1f!29a!<E^r$rqsZXd~#L04e?8{Z}FZDsMiH*+lF{{MV>loXk_M@x~tm15hmZl zX3^w1s`<wFI=x$@jykY0o_)?W5KHU37O`FNbC9q}X_>Su?r)&MV;0mJ@hK~-*cpMm z*M+L}P?v6sH^@q%)wI*`*NewDq00MImsjI`+i+x-2M4+7IMGs7zKjJ_>iUB9POSt~ z&Qmfmzuhy~Wc?SuIb8m=c!jdpqeu!OVGniSwRq=7HvnWCop-_M*c6=CZj9p8rLW^! zGx=``)1p)*ButOujD#8gl2CSLlxmIl2G%3^esIB?m>hprQ{RlwZ(jgybmyQAsV&>^ z0tB`<;hapGAZEpw=2+1)wW|3RtZ%gH{Z{-sL|fj9f1bsA-0T!wcRf)$SAFnyyo&g_ z@OFIn=IGn;D^cXo&GB9>IPxGVb&q)n((JaIp=<%-zYs1%*o(koF&sC?i!L}&Vu!{K z<Y`{ih>i1l34F3dej@U$p{4&Cubos-)9%4ne|x<f$BWG+UQ1bWOjRtvUq<E@xMlLm z#K#TOu&aY6$UI#>@}&{iL7=YY{J-&CjKL{t7ovP8eCebLu(s%Z_*PaW<aye(u$_RF zRU5ZfNmO$IegWBNK_ieaH9uzowqJdOmoBf{5-*c{1|Qa<m>?o%X$VV1U<*Q6)d*}R zU{sv^bwfBiWmrgCD}=FSYlbi`&aAqX{x0gL3(t-K4<0G5^k*gVw<FK96bo$_^0Cm# zfV1_u63kVXzK7G!#rUX9{DV@nU=uvStSqH|J165Lb=&(m%kNiDzaJl!K5gWwZXd*( z<lh2XR*8~M^gLpA6t5P45U){<1+rCWesh4f=fxM5zO@)d-&zc<?-JeykR9PKs)BKT zq6N#Q&g>Ej>x^J)W(&F<csp0TsHS}wZ!pXj#B)iP6R_L?7CZmis?`G>#+#lI*-IxX z>Q3<empaWYhQ{|<vQxjQtE5JM1S9UMZvP1FbQcH<PzD{lgSF;7cDLFHH1@`Q1!BFm zf)&d};6;(usH-|~JZ^U0Qqdj=cFL)sc0G^pK5&X={Zc4({m1b<4W@mh!D~N`cj!ZE zwiM-auHuCTwV4ks*^~DmKGC^@xCJ3iVU$L7`6NC>D%`c>-K-6t#4{_g6WO{P*pz*5 zh{Ua~fi0*2?UxGlLtqn=m^~dmrEqnoVQSje_}O|LXwNom2!q<SHD03<PjQ(5u{f%E zUuD&2w5)zEOCn3OBs(qhDv-4IN2>xk90R!s>?lqlX?iu`(+bs9w@<N$-~l!5(|CjW z3&G3LXpMw=*fr%vfU|Z<wdGSRQ--SppT=8t;z@ud|2Hmn3TI2(%h4KKta^SH&%WaS zB!&f31lxWQlw@Vt#I`cTaWz|jK*zRZWA#SN#$v-fP+2Xx#SPkUilWLqHF0#&HmFho z0-fbW-8C=sSh{_I`x$Q)R<59qeumG_K?nVioWe;kT-E$M-cJ2`ip-2tFk!aujesjZ zk7u7-3<MH(NL>WFc?hfz>*^v<=Lb;^J1}}R#Li(mJXBdd@D;vx|HtQ8%3|rhEuI@& z4Ei#TYEfF&o<A3R6$Wg>J>n(!gcMHB_-w_tc!y$Um(o=2-xklVRI<e$Hc!RNv3J<Q z)aVgdelr=AU5b)eG4k|O8^6SP^SUq4FwFm}<+{OK_I(k*O+Jb%7!In(_hJLm!tGcP z%u*}2$0zA8PTIy`Bk=yt+_1>Uk*0kS&m!&eiB`>qctQ>Q5?89T)a);Dk^Cfcxn+6H zSO<YRKcy;s6|Yf|gP1Zbc$o(4u^k<3PghnI_j`eOMtuk_e1#16(v~ybKud^D11ks~ za+>W`3Z}C?$+lpDG!phI=QJw35{hufVr6hUV+Yn@`_$7rFm<j{TXx55oYn{k+c#Xb z(^0sEu_o*g!YJ@r<Y~ebI7sDu9j{U6xhM!}0aRTCD`Jqk^lRMs+o$mEHa?&Kb-ZWU z)e)8+s_M>o2l;$uHDM|GYt+v8!HO>c&wj9~_gFK27aClDT!Yo5c+^;HfiDQ5BKQC| z>my!P`*!0FCEG(U>=TWtJvCnonH<bCayvgn2knb6!JMFaMVg?UH(1MkYU&=8t!+A6 zy|yPlv|6;GtSB~6XEp8S@`?IP76T*CC5-J)8p=y*aaG(k>Gdcsd2ZW_hiK~}O+xuX z9Vi``J!rGkuD$UZ`a3SHw4Dfe4NONR@lnTb;@L^+o)?0c<^q}n`ey{Le`p%b5Uh5b zaiij_hQya_2Nq{7ffquQ$2=!BssOxt;hXpzv{b>jXfRxpe~XJTvQcZ>D7fAEZG1|b zmjPxEQ;N1F<gMXwh;ZtmwmAq^+a{{}caZo>Nme!WJB*n1{{pZ4E}m#l17<Z@KFwf5 zNiyVZ!K_vSK^Iu~eLPWrBe1rDlti1RB&u$QL4S4X_woJ}H<c8uSbm+71L)O%k?s0E z-m1=PCBevBwX`~_^*$_2UN1?e3&Cag?0wh(x=($z4`X1D`fDF%sXh338#Zv_4L1I^ za@h~KSJYhX`T+zT)v+Hi6X?50*=ob>xJxnM$M|IVMrCz(p<5dtHb3}d{1!P2L-Mzb zy6T~y;`e~K_5S#mnEERGj0<PZLk-l2KchQXL3VIm1k-T8#D|0gSN;<3t1rhn=u!k~ z%P*KV$>#!W%=g$Y@oc$Ys#V+YYp7Pg#;ann-SgM@Ohh04ipuO)fBhQopZWnHWnF^6 z0bMN=vR{oq5TBCIn?OAAlEhjUm$`PD#uc_MQ^Qo1-_WW|va#8-RHv-!{TuEXb}jr} z-{-A|s6NHosRv2@c^R%XwfYvPn$N{2YBtO$gKwwdU#se&-{TcdFrjSxJw7GtHZZZh z3RJ-#y!)xH`~%g+U6nuL9kR|!A)6n>jhGH<+8?Mrt&TddOfHyMJ?cz7>Z&IW#`CgH zvo}fCe04DHN|n7SR;Ir07HOsi4)==?IJnM6u(&#^$zhy>vJc}l-nH;>Ji7%a54K7d z1X6Pp4Mkw-oL{*X?|~3Upwu$zz%JZI?D$wblLJkk58py3lb-g%D?4_IU7>S`pNT*@ zq=7kB2yh!z2AO)%!?F_yM)uo>;|<E9RK0JyE#kM;;%Y&jDjHupr(z*$&4%IJM>j_` z&%o<0^VIAL8F`Hc14{#Bfux|6Gs8P(Ji}O6BYbc#-k@AxT(8?P4~rZ$Dg#?x$Cs|E z@{YtSBp2gqof=0OhXO|7oDr<B3jm`O+6^81D$4T%U(*1LeTqg(@jV<~*b`nQ0v~JW zJL=}Lg_Hx(3T1QsTH@k;ONspBN7YC8p`|MScf6*2;fSiUu2l89r<J%^K8CkMxPD+E z6#DF6YD_);WpG_N+@8aG9c^g|9~>^;<kytQpH(7X<FF}u=il+xZO;6&IP;4K(~VIt zESkNv1aO)L2WYP9eiV-f@E5_O@y?|-qs=(@VdA(xZ>oNMKi)8XVIF>V=p7JQ>%s*u zcAyly@O~F)b{k93UkSx)E5~q|U!W=+j}LFeo-2(&o7MJ-n5U*X2sIICmxOm!i;v?$ z3Wr1mHC_faveFn{f8tuU!awnMF*{=cl&y~b^PlE~X6o#scyAORP6)3TVfx;@;N)Nc zV4MdQtOy2HWX;(&DYaCN2soKvDuNHR7I~_<4DwLyr84*&QEL~ueQKZ^BoXa$gKV*- z&<i%`?>6Q_6l+vo-SraYuDxE+T)d~M_`z#>7by*ZXqqD%gB89?9q@zPiuOZ$G(ZFH zospTyve|3abcvzdXs0a62<o<AUseSRTb@&kX2rt8Lz*RVY`>2>S~=*M2Qq8u|DvRB z^MQo@YTMb0B<lyoSPOp7$S&6B9~SF#Y%ju_!GB`E@50QWLNUURKxohK*w%VmMh(4Z z>tle^CUqb)$UedRo|6?!IVoyBwl16oIsMssexk3ovF-i=H?tyVbWUPKvQhA|URKc2 zzXQx=RP$27aCF|ir2_rraYa1A$wN2RR$N7lt8|inGmtF=F<M5tyK0sWy6H1AUY*B> z@l~=keo}^ih?myFo-Q3UgMocjI+!G`QN7CqkHcpEDigE=N%OJ*ZdO>Bv)H%G21E3R z!8@zw<pMkcSTnR7jB^aD%F`-si8F^CR8ehgqjA>_yPCADC5H|BjeXe<fm+iMXMfR4 z{HJJm!d_I(D+GyZWss%gD6ms2(F4@L3aE}gmndl7up$&hRVxM$Rb=avjYaFzo;tZw zFdx`0mGl70tQ?ptEZapC_^)08EI?o{QLoP;27#9?E2G)$0A7<>C72?_=lBI*&^hZG z%pE*c;y=!(;up`Q@4~NLYV?v-R7Mc+x!b@1Z|UQs(g8*({!@cot-c^<yRwpO8?w`} z+-<yo$OGlT1iC22ejtG&{|D?}SoSSdgN3-J=i}b^JT2YSjpr_wvwaOtv%~GjF3Z#i z1~mE-Rp#8Qry)daCJsSfJ#axlN0`2GgOz8Epq?5xp+Xt`bG+n(oJ!!>farTYnyhi~ zjW{~?5POwUxb2DtM*1Nkj55%f8pa{Rh5H@^_UcyvP%e3CT&)pPET?XCY&k8QOxXzK z)U-lwWWT3EX3`E)4mi}t$w8o{QqbwB8+okImPk`5m87*$Vd8GU6%iG)bghsk9j)5Z z**q7dOox>puD|U>Eh&sAn7aQZwgs@wJ0s9M0)!z5#PKz0;@E0jjeUhaGYTtlxNPlY zCQ4;15zoGyiNMyo5OmQBP!{=Ed0PRyg0^FjGDv5KtJRI>V=HTUiNgm8lZZ~tL}kgu zIm9wqA!O$KLB~Ql*YFfV5F4QYf$sm*cs04MjJ7T{-N6=8y+`BW`G7sRp|vmv-=Hfx z7SBAb0kFK%r5ZF67E4tIfP*d<fhyQyi}eBi+8(b_inaP$cY*4Z6V%O0HNVQ-5yt~7 z+&rts>4|3?){Jf*0!wgJ&bgIq#C9TG!O^|P53t@)C%C-qE)6r<yr}lo336M|df8dF zQyzth@(PJn+zoOn&O7<d5$m*?c0D#9%+0QxnPmR|_V8ps($ekd;s?yA9~+J3afr4; zjQ&$CbAxJaIE3h^@E$14R<}dXK7z;rj6+k;;t<eMHOURKYjKov0FiZXNmiA!zD$ic zn}?k2eOr8M&E1|82OYV;3AybgRI*^w(ektibs!fr@uR9{y`V<>CK&2yUR^(H2<M>@ zXf*5-3yTg=T@5uJ?DE^nN^GxCy&?_4&WfA?JE^txf@XR#P+IK=rT9)|)(^T>^l`O9 z#q$v8epCbN2f10_qXHb)_p96M2Mxr%YBiuEuAyddZ2Vye9AK;h=UsLXTg58Kjv=f7 zfzGy;i*x}2a2A%2bO8Zyrb!A;3UZU2w(X!Gn0Y$3!w7`y5c(m+5o}jRCp6ZJBWE8f zLw>4hCpA`%Y2tr40Uq*_+PG*Coe@|Nr+iz#sG-}!X&I!og`o+wvR6i6G-y`9w%vOu zoGur^$~K)l+z?XJhY@TcY%CT+g_<B(rvKjx6~2u7J3AW$W#ZBEqSf!q!iGUY{Gh5f z46<vpQ{Axqi$WdPibglJyJh7dIXIO!24HnPEdu{f4aJ5lKpFKB^PI<g^wG`*$X7vN zd8BKIxCC8oZG|M{;A8jxh!#!}smw;0<t%TsJdWF+LQBwZ{~@1?K$?5irHz8@`mBCQ z)!7{EPus^2s>O|hL?hZ-$*$(57agSzL7?Ox)UHNYrE~q$K#gyOeI6Yf2bo#>Lq+aY zy&DIK^H?wo>4CsH3j{h!AT9^-f5P=Hfn(e8`v7lN3G^p!sA-lOm=|OxDT>V-6*Uxj zTMWlDaZwm&nvyWiJpUURA$`+S-K?#%!8#+b`w9@~tTL6g&bZc?mKW6MO4V(#QT5nb zCDo&}sCrgvf!dW9B=loio<#mr!Nf(`qs4JBlq?RP9YN#jOY5d;bd$h*MXQPaQiFaZ z%TXK^XlsuurIcW;d4@Ni<I*3<A-W_RJ2NxFR)91e+3!`&^Kt3JmZJUG>J^u))f8!s z8{_<r=ZUZ72L<{wCHd;WM^&=Rvd(sfxK|BqiW68g%AQ~Tsxoaj_<lwgvR_zA$&qXa z=r2(kwZAFOPWP&n&4L<rc^aawxd^sZkkq<!y#9&{U_9ef&E{0jJcmWFa&)#`T%^g! z0nbw?D}5q$IGLV=z`{&hvHVk5K3%l@==_V;KA~O*{wI2|d47vl9fkAOSY3qZ{Pla3 zMvZSCBy=Y^YFdjRadF8SvjHgik0@6}GHYt5Q1V8r!||PJW-VS120&8{O7XTqIZL0Y zF{wPqn5AnFrPCF_sJ*^LP(y!^i%o93D=M8MHzi$j$*xj~C$a*)(4_7pkFv7f2medG z>j7_jm|aW$ItaGT#L+@%0kjxakY@HLXxTQQ5tl2rLf)gUZy7Yur^b?1VV?Yl%;RaF z>nC3oeC(SCbN@plKO8Y8y}c4YLT?o`sK&9*66zqZp=@J)uNJooI%fR^rKvC$_N{^` zx+6I=kcu2c@vOs9Y)@2#v0VeitgodbEP=eeywG%NW$U1`o=wQkk-+hsVo_z<1l`cj z=Ofay+<74t)Jju9FfV<`T@0?av<VvM^HGZs&GJ*i!A7GZTS>UREapW^l-?F&pX1oN z=7n<D4pDlHL^ZK(a9T182olk`xGQfNIdG@|nHZvU`~-9~zY}@OS2yINF-8kyp7LmP z5qaiP_w9&)z9Av!tEd1@QWU_JiNYz6@J1!z<R`pw33$~I&Pvze#~7{VY*I2b(TFsh z{Z2SrBwDalv}p)eA3Ry5W^zV}wwV%EjppowlBL=7m0{j~wT;q8oB&21($K&yKc`Zw zIXjmcBA+a#B7qF;5u&QM4B@AgfVT?a9ZJAkhwxKNz&RsPJ{P}6K6;14iPHiRr>77G zPK^o2$9US~!YhCNw%i74O8ekSRa6%H`+Kd%hcX`@lTkqpc&TD$)@32}fceeqarbnE zRaH8Q(etM*$W=vKO4U@&UaDAiega>0{eC6B<f^}-nov_tFQ1b?GUOZ^#y23QE@vRn zaWobnP@j`k&kjL@x|6Y;k{!aSopoW`kc@e@-;v5{P)`|T5zhSIYgTs%mc=W53j64p z;fO^u9nq$HrqgTxnhAY^wh|v1dZKSor*z{^6DJP3rs;^WBPOre+&B10RBV|yblBCc z^IJA=(I&rntNfO2)-1aq_*|};c~O9$v(Hv9UmWCA*fM;jS6TRb2CVd|2!HPY^~%LT zwKe`F!A=i9IQ{nW;2nP5d_WMy$6uP;Ag_T5ISp2N&xlgDU#xz)Bxtdw%)sDv8LMBv zX^WP_*L*lQ__=JdWwR^CjTzQ#_@GHct{m2^>A3NO#x!f)w0X;>E%Qc?8!~8g{_qi# z^9g7+dc@#nfQ%X4uvh0!=k)B^<BSGjoYm%kEM)MAu|~+mtH#zHG9)YLK77cKocvxn z`B#h`mp^pa6~iXxj~_Q))t(UK<!f;79-U9kA3Y`~Cx7(N(KrmbYT~3}laLrc`O1mI z1`W+>ZX}SU@#&3Hq>V=p&B>n#wsAQpO&l~9+SeU4F*kqw@H|aF>B>P9hYig|I+9oY zCI*Gw>yI8W_Nu9M2TiKmbX?u0I1b8fI%(X=Q%`O?pl$2?tHzERJ8sI@d`*-;eC$>K z5uwhS6tt;PH^1lNhYKDqczR$u6y(>RRDV*Ax@%I9BW_TuCSkc*FaN^PP1J9bf}U=+ zbG9m&95iTDH-C5zn3vVd$sdxFX1AgWT0;mh^(U#DCkNfGY@U<TDQD2=(K%BFO&mL7 z?C?o-o8&BBRyQZ-u4Ro=FvwX}w`r+@mN_}~hoqtPCp9e<(l)ZtoYy-S6g+)a0pzAh zbLx*+bNN-l$f{YVcbzzK+{By_W7YH-L0o-%N6<I3={X}NO+wLYI^G$S%2?BPK_G-0 zQW*5Dnm2ab*oni2<Xka&(C}z_%?pLWN^xe>5tE0F$r&_x^28B?ubMop(XgqLhmD;y zV%*rqDcGbEG!e{6M)+N7*uBA5SWcgDU+`h_JR!~(;sPQ134zafT_nUMLf}7E_>28z zLR^jyI14dQh(SUO7Gj7H!-Tj(h%1E{A;d@_MhP)mh%rKp6=J*)6NH#31U~UK86Qs* zVoCvK-`<W8WrV={Q;mhl69WIS&ljSp5G{mgsqVZ#C>P*YMHdS(R0w=I3_pdwx&YII z|D9TKe=w_JBb;04bDetd`A$=H#=@X|@+3?{9kg$QiL)L2shCkuhp&&bT?0&1op3vi zzB7Ce_^uIu7S3T&e=a^PO5Yp4PceU<bDq;T^ylOLm+@zg#y$h%FT)0Z>jyf6;0MDG ziTI(oI3DU;fdzbf_~E!M&=7tE_I#Gnz8l`Fi~4cSIJ_D++8G5u#u@93RRb3Vm#J}! zf-=bo&i`9~Hg<5#guf~DH{;WqmpZeo?}A-twVm6X+nw3){k5O$Om^;sze@Y7ovU#^ zO=ABe{ax@g;HSY~WWAd9Ku{}L$r%rS>;J;v?a(iPzbEvCP9gr%rQoxj9Qb>k`<w^h z7oET_bm$j5OW+@I9!WY&wSUxkSo_DE?(h$4|G4u6uDI&rInPs}f5@R<?ySIBu9dSY z;-7WspL13_&pR*R7I<@KP3YI+d+2lEFNR+UUlIOA_;uPR8NCAk4E*~4k*|)s-fuXs z!*7Cr6@DZ9oA7VJzXty@{N?aH;opXT8h(TJn{jXO#;8x?VZe!eN8D1qCFS37{x|+f z$NC$b8=NUAe?7Lf&xfxH|C092oMba+0Q@=drHlEg&K>ag!(Rh`3H*idXTT3j`BSja zm;^r^{#y9!;NSh<`O*J7@{oFqvjta2?_=>_7JeE0MD1&0#r$6AvCN4$Gm{Nm9E?;S zFAb^|J{ov=t|M{JkU`++>)6FjR4)v!hVxofs*jciHOQ1pq{PhtlKGk-rq{+4Kru1= z3#!wSATC^W;gaCG@`Po;GtP7})Q%-VK5(TU4xU%*9}enPhIF7aA<zi$@mT1Ohl3>z zOxAE_=n`2UsmrGhKD-BsYaR(2oJR3fNr2GTWUQIc#rl9{!ZT+e7DEnHLuH|MzOJsS zvoxrz+Aa;=QU5Fr&Qe_-4Yr8S@QwYTdW{a!H0We`T9{(~6nVPrs0N*tsFqwR9|fWy zL_Q`T*QrzGRXV;F$NeFWjGY88Ai3H;8S^ohraX1f6(F2}Y2YJqHBxUPq+KOZS&WnC ziKj#w#?;ReA}&FK6F=Q>go`n0UWS1<0O=tJ<1kp+I=_T!WFXC}?qAhck6|vnUS`Sz zKvk1j@^3BwAAS5SBnPE-=ce*Ei{Ewnew=BE>Lh21n~G_6j_fIK2Td!1Pqk~zy~vH0 zV{jZRM`~^()lp;4N|aT1JdQK*Fi^G=?KO6yKH|qBj{5oWpk{Kdd{Mq6*U6XVD{{Tu zAUDcQ@>ThSd`-SC-;i(0x8&P$vwTOsE4Rq^<oogi`Jwzsek?zcTji7TQ~8<vTyB$J zL`!!1$SdS9K!zd=mjmTsdA__r_LCRNi{zk?a)=zkR4M05M3dyja)4Tum#AFkA!J($ zUVhyr)yyY?g6g<)pljL}$7KjTfSZEw7Je$XAqY-8Lv+=6+*A`8VG8KbosU^F8J2mW zhDn^YFG6ZO!fPt$$)HAjDhTRoq9r)S5!%VJTAyTwoQZ5XS=l*SOm-<*#hDJsG%;Ju z5m#&Gut?`Fz%S8|%k}Y6*%xtVd4}wQTU%$!?y{TgA<vR$%Ue@2<IW7ErwaS%jk3Ox zSh>J}QbeOt#axC||5VNvyfsYlGT6G#4lm1%J4w`66DlU+1NNm@@6@UDa7^f80vvnG zUMaj~ZLP8M!|dDQE#%i}7@raEiqKyt$8!K@s}G+F%9Pz=1t8wVk)Nn_mgp`{0c$tW zITT=NMmQIcB%ZugVq3Ai4N_-I-p(zLvq>G~vJvXZimB4dAk{XNvtq81H-xYjh|BBr z?c%m#h0RB9p12wd+9XofAv~b*x8V3~Aoqj<YKrQjszx}@J8Zkk`JakbA@UOx_$k6? z&WFyIh~G!}7=i8^eeAFPS{Bq9G87VqYbk9-8^q19Qf@37i7&OF@8tKPK=Pc5#WqF+ zLJjeC1kO#c-GHwka2C){q1GcdZj*RL>sJ1P6bR1^#W|`|HB6*^vD$T<bM=RwNxvUN z(;||`7$N#t4#!Heeuxbuf00D@muQ1j)i76D$2Z}4qdX32Q*{0jr0x`Vh`YsHt%eeX zh`%xe%ZRxV(Hk0R^5*!7R^A<eZ!ui)OprU~d{CSoQk?~ot2EhNQ5LNF?s4{M$jhMQ zpEWlk?2rvbgOC%?P(&@!Tjwsq@nW4?A<hov)Dv|9$<bw>^O{DEHD9lA9@DuT*#Pyb zEF0<Ck?Ulgs)1t#gqHFV`LL#3Anp;lq7E*H9Oqr^CgT_z^h{Wejb??3+0In`M&M_n zwftDK&y#njiZDbUA-W8>OEsQ1=y)%#o_;>@Q%HN7?p>Vq?gwfE2%p!)$Y{4kyr=W` zfczJyy*L?{X3cSt)<m^0m#Cw19t$#)KZ^;PcA`G!%7knzkBC20a_$rNB0XKMG9n|# z=fm{M6l_K+bu&^=h$q4MEmGT@53q)^j(2ezVqLY{*~43OcO!c*!hIoLIfY^E3PT8^ z_q9S#hidH<yTop>M-(96GlcaK&xmVM9Ixxt>mkm9zZKsB(h%}%BfJeTZ`x_M0#^an zEpwV`6{Z1jC&C@Ln3<!IgK*`HCpl(@S{q8=hWG=7<zaq@*ekvf9d+&!vDx`m{2^9| zQ4sL8_+Gq$_y%#km?57=>Nzde9A3tS#*;dEi#|5O)y{$tzch>;=fkj+7pjQuVbVM< zJQumAs9EKVb)df8xlK)wiOTBK*KvLMgZNSO5-;HrW|4d#Y+wG^=?PpUJ(7~WMDO?c zDJ9l%9!=qx_)5GO<{#q|0P$cZmRiHGNS}$J_#iGy+R7_n*f(M2)LSHR6@Lqc<UVnZ zOvc@LB3pi@S7htu7;!o-M;7B!{tR5icfkcbC${c5ub+kM)Sj58&XwmnlQE>GxMQ)% z8jnl(iMTG9jCtT{oHUlmDb8Zi$z33NJ6DT0oh<p1dy#jxSH}HCe(hcC%@CW!C0-wS zp6uZsaL@N|OM0`to4h{G<^CXdt-rt<>^|o8^v?0l^|pGSdZ+m}`^){O{Gt9-=V5Uk zPQh=wBfPiVH(bwMiF*Wf#0#RlTh=`vm-_vjVcvyUJnX<)@Dk^1=X<A_{KmOS+$`>t zH_HCb5cfs@d8`u0i&JF<cc-%pow^3^r#jok4)LWJ>|N$e6!-+5JmlW*6?y~wi{&}) zCGtGCrguQDag}$kcb`{IO8JNE<qh-)`FFb&{d~WYU)itX$Ni~pBcE5p_ha^3ge&5g z#Y(wKJ}aAet-RLWt!^XlkbFg)E^1=lYbW~%^it{1j%Osj(;L^nwn?2PL63DEH+9Bj z;hiF9blu?L@uR=Rc?B_H#@Ew1<~Mb1U3BT`FPtt<k*D}RzCO}co<bh16p$lzLuQ;A zT|M4V2IR{k9wAk<E2@-nyW{bE<y_6>mzk<@Q(v3c@8Wd8+JW3SPJ>?8iBM`r*L5A& zb+mA!V0&+j-?;vlMO1X5Yh|4-$=|qsnsx_d9u3X=6vR8_PnstAWd?S9U;@23qg~O( zNS~QC$DLl(-+SHN-aY7X*gXYnSR>}lP+ECdm*f2IUXJ2M_*ctKoi}yaEuTH(uQTwC z_ER45xBAC5M;B+VZV}+ou5?d(uX}8<Tz^Ja1L<`^JCi8eaR-PGYX<$gA)dXxcIG|) zrp~{2n&YnPIL;sKdZ+*9QzV)1^LL9S{!G;JN;EjWj_%)vcw;w(qw>{~YE_3;{mx%@ z+OpHw6%T0|!@1PwR1hS$n}YSxs`F3L-9^hzTi5Y^{}lN=D!v(f%QP?B{ZEfa{0I$A z#jY$BI{?W4#yifY&PEdE_h%rOm1e+tv13J-UHq}X1FiG1-?^)~B3jq+A7N65y`&iD zxA!)o!+Awx^dIOx=X0s_r<WTukZqyd*Fp+HZSS&&`vG6*jm4fIzZF=RWx(nx)*!au z4|?Rgxqd$(W1Y0XQ$n#9xqJLWz+P0w8pL&c(4*byvD0EJi~jcKxkn+1;kf?@j-!jV zYRONBZN5*eJN4+P9rU&5?;5kI^GkBsX}Nwba{q`sU{bHj!`^DI4oV$W_OKXLmY5;P z1wB4?H+5;)q0s%w|I?q?iEVkze*xJ2=!I6IwU-HQN*UtsmS&tV-r?T}`x#NRT*%}p zK@ZwuW-Kd~5n~r_>f8{bxqKVb^mm-{%IL~gjCrx=<)yLqUOn%5Jxn%r-U{jkt{+>i zdus}c>gElPEz?!m)OCkXGuWVwc~$pS-LLPyD{Eu7>$`U>Wqg*`E7mKP>{u$x%kr-8 z-YdqKzpU&Po8h%98c{G21s9;u!`@+UV>e?{U1PTE9cO}8?E3EAV}1Q6iaN%&d*AEY zUhhtWn#=q$e!HS6ZqQ>^%#0zn#7&xqT~7B$5o~V02KDprDyk@&;9~J02GE7EGh$6+ zL60QZgC0+4u}8!y@^a92Mp)~b@w){hJ=baG4UH*?JI~xeK<Ztz-UFcfTkuN$d|iU6 z0E>kY#BMDb1n92?$?e^*LgI4wlGupYuo!!mGu;h>y)_3IJ5k(*G{b!z)^%i0<J-K* znLfod8skKK&zX3_raOaDvU$MxXIKqdlV(hp>+8$0r1QL7hK5?#aSZB>nnQD=#2mL> zQG0YmH*r`i)mIDdine$g`TNB4vFl=-HmStaSXJjXACru~-MJ64P*mx49ZQ}1bipgS z;GoCzv35oG#_o&N>z3*N;5-hR_t8mQ(>dl8GB#G=f2oOChuh==x2gOH`PsOq)!thi zdjv(9F&Xq&D!$f~r^va&C>x;Trl9pW4lj=_0`?kBaZwpuwz;<>Jx_Nc)!o!NU#EXT zdT_GaA?Mkm53~)lHV3+IN4<Y7h|6*1MwR6$V@B*$=gwFue`{=OY;SB{Y?&6!-rUrA zMz{7JTW4C)JWzgwz}8sT@!eQAKzE_(?|~Ju3wdo?&!d__kA|RW=nOBS^dwm}b><K% zcP7qP5dOU`0OsU%7Z3U?z)1H-j2A4Mfm_${6{Ki92Vx&<+Rt$OJhrjhf$q1-!~Q?9 z>i%kPJ?i+qYo^5Z9_5aezP9_THTPT;9`rbcC)>+oyK$@nB=w_P=;Jm@%6X^@{<2t5 zI%9kHZ)4-ieFb6VGIIT0h~JEj$62rC89|TjE>8^`Fj02yYFLwDlg~ik6GFq~n&Q3K zhiDaC3xhxTBM$32&Zhz(*@m34Q#)L8{TE}0{f}f>m?FET8p2Pp-?T`MfGwb3+5Ma| zaS7-hjWyLZOp4Wjo)#8QiFAcUZ^TZ@2zu<)C9cLO^Za#5^wzqL?TYsJdwgDbHqXe_ zBG$`S!F~Yed&A6QgN!M$%VTD$4&kv0?wvUAk1N+&20eD86A#DQWNg=*qso5mK8u0c zORN{adW4yFX#x4hXc;Fbc3RhwW7OCri#ff!>4>ICe-T?4+o79(hreB?lCb!u8EeH) zs6{T$J#2v+<vnB!-8aAlJ<jo-E(igz40^0^+?`M(=<y4hzp32fB*kXl%`i(Vin<56 zpWGt1D3)}u(Br+0d!YNca#ml~f<x>8RHVZs(vk7cTA3^?0(RhB-Lg~Hj2-?yeF7UG zcKAntrMiP4@j-bw9J1sa=_Tz9#w^T1tCMaZQ&iBy^JlnC^?)H&DHtEWyV+TH6<#>b zI45Htj4tTWJ7ZnPE`a_7OE^zsv0y`iq-ROz0|sM^{Shk<6?b?)C1V#r>vWBp^k~xK z4NN4xGCD}pyz4qv&uG%ah+yH?T}A=A0}P}eiVi@>9FI+U49XY@McJ;oepQshbIEAk zs+2}`N@4t${tRD-%e*c#JFJYBb|#NQL2<j5$DHUg@r(|gD-|%Uou;vw>pI6OGM&a} zcxQ=tC=-G-t_OO-P{i7Hbgr+sv0Rdf<JhWEE4;cLsN-AOJcsyr2qO*dVI*cHmc{D? zCTEXU!LuC-H*Px21hZP^(dOo5@DS|ewS<WwL|nF0A3CP%-Yd%>XJ^eus&)e|Osi+U z-5BTGOwmxSS{>vhFXe_JT$?_li@|<<e>iubIgPm~rG%q;-6JjAxV0td)WxJ+|9G3) zx|N?PT8(&n5#bvR(ixBb%F_3Op0quoo~Ty!vdSadHpys`5oGlAriX&=r>=?ai%vcm z>d~|PQtWqGA4+1>B%%p#cBS3Yur3{)vzlGknO(xVHmQC^cADnNkcM@-T`wQ2B<~H* z<h%)YEHSAn<L(*L%QD9OZT}UYT@ZD)90Q}IqvfJ_+x`YN4LaTw(b-at(XevTQA5s3 z)KVK)2bHQV0rF4WcjA3B(^ju(@*4WS6KSgFG|6au@+#b(`cZ32U0X(^H)y~*H;oUh zX3N3Nbx3<0eb8FpcauSe+VoUVJ6VZ${Nd6TdMzN=fiUf&jcuW~Rk*jVm%AgoO1bg5 zeRJN)=~QP;oulPHt9DNHrgh`BZmYFD_qFP>_BFMCt&L|(xGmnQ^|$^hVaIpR=$^5x zo|Y7Mey{j)l{RrBmOrY+RboADt3zyyr>*WISZ{H62IhpQ8y~g;$JQ0*GC75A*$C^& z2rMCVTg1y$0Mjn$)-N_W#)hj~>E>o1H8Xs#Ycs#LmFkqJT3^&K<K`f6k0I>V7LK_% zRR$`XacZh3TBXLwN>F@+9>BAuE*Y2%*vNN<O;2bA6mQ1Sff9B$-n&?&Mhr=D4O;uL zpmdp4Ehvbtc6WW%S?wA5H;Ue=2mU$IHXjUA)p<Ke@XlkbQKU@A++$W~mZ<x{sS8EF zrFqmkHELD1xTvvIlpQiUWYof$Eb8uVfP06f*jDu#)QFV07iLvYuJX=JwGa*M3gkXj zEj9+t&fcvJfbTedSh+%dG-it$r7uL&ST(wZjq@qkY??!h?#fe4d`#D8K1;82YF~^= z^NjHmtODj?ddA8e<?RW(*UTN$TR)*^LM$1=0?uiLE{B9BU5<r)OwP`-LCx=VeOQBY zGcM0KH)8-ia}V-GD(yyRtSqy?1y(tFf_|j=$_#c-mAZ35W!=h*bZgp*obGGuiVrDf z<tsJUK{NL8WT)JvdqZ9MyvWEi&-SiGgQeXTG!fkdG~Y02YI1lSqEnAFAKdcMmdnHd z<gS9QbX8g(Z=*+Ea%INO`dv<1eiHV|mUS`9;EN<Zc!V_1n3dJ}3rIKawy@<YYshkK z`Q^e^wlsJEgI=&MiPK!#5(o`7LHEObA2xgyi1M?jSk=Z8!b;iaB$`kkMxY`CQ)YNe zQ$4%&9gwjra+dV7wub}qbW~~}9*~a87z@4$=)x$smCA?6xJZMV*7Yy7UETdeP(L|H z53;VII`#q0A@{6|v=VsX!7Z;Ta6eE)=Ljus1U@T_>n7)T(Pf$WneCj<i?-oW`W1jZ z`%k@$UPaS0a1Zo&Mdx`p6T2k3=|`tVkAY6|I;3tw;QoPb{}9|yADLRfL+B3uv+S5j z7U||(TD19}rT^p{yZzYUqWirsa2~weyZ!j&qG73;kh-ILhV%K+_x`El+;wb(`_$1M z$C@6S8=f<@G*uHbQ1WFz%WtZ?dt%YiqN&cZA|-?4Zx<D2-H)q9x^YDfGkz>HDfV|! zx1y_KbD(11j0LfkrPm%i|M(Z7!sY!ny71kxtBYc>rkVKar_NuMd8@q2uXpUDqx+8k za2(HxHGLgjjSr6=DS9z^bPDcaG%{eV-AUeiM;+%A_YDXbe0-)q1H?BKb^oVv?3SX( z{+WYZov@xY(BX7toF;&xe-_NU(Ye{VO+17rQE!Qj*ebRK3yv;wo_to^<^C<76R(QZ z;tTPi*eW*QKI2zTX43ls+i&K%1vnPK{~=Bj@49uQ*_88=vs%{iewE#E|G&0qA(weA zWk*pB*n@JdIEwfgJP(<My<nv8>9)iZnEOO^*;o7pj<>}$Pz=X|uYQpHpqMGD`nTYT zcNzard5`>4o-cN}$=k(lJdb=@tdYybTDjMezUPl{GX2rmFI3te<7CK2ZhNO2c6RJ^ z&lG!5v+v-?IJ>+(&S&1Y@;mv6SmyT<HRMR=W%nsD$y?`i#FMDkoMUp7v&d`aKQG?% zK5#yCKEmVG*F{IStGvql!s+6casq!s(z(SIUJvYeT#Ys;K>W0SzF6gT!M=c_-eytR z8}ANx=7?LxS$IzWvU86302)^I)_J!B?xOC!<T7z3THrJ>%Q+(Y`!P_Bz*C4K?1Q<| zY3yDthx=E!LU!=hi4jgs`LmqjeJoyfPLf}VuSD`?)N+nDQhX-w79(-Hc#X)Dqr_2h z49~!Z`=gxt@_BcpbE{nIH1sxlcer<p0_RNBthSu&UF~K26PyBHdRP0mxTD1xZh<`6 zuM9~&0e>0sC{e|m;EsXnFN#jsd~r3l5#RxdEbzvNwRnzOJt>R4qwY=eZSQ7TTHYrg z@;`SsI-|w8@-g=l`MbAOR+kH88F{w&Mm{JW^6&G{M9)t3`ufk}LHr){>PRS5;5>^M z5Ls8YbY8*kgi&IP{6ahmiRa6MqPgE6Ht?qy?q2C`me;$p-FM_6F~mDpBoB+-@-i?L zIG4)XP>0U4to+E&MSWj#X8Zk|PW~8iorEQzYo^Ov{F~f+<py`HlkNT}|L~5v)$ySJ zcKM~d*}F^b^Ja=w{x<h%`MA4WzKgph3AYH6&IkR2Fv|_7LO=f<`KtGh9PQMSyX6>c z`t#e%U*%=~C9<<y-f!uQ6*tI@@=<JnT_|hGW$p+u)Eg_Vki+Gb*mW{ej*{FlGggk1 z<K+Z7QBIPRv8(86IYmyD*T`$JTjP3pg_tV^s&&3dz?#Y;Jnql($BEC}S+bYARD1x- z`q&%m-|8nP`M=8HxGgXr7XFrVr?<d)*5B#Pat69Ir&-QJ;&N|*ccoL&d)t{H+WAMs zsop~{r0Vh;w-yRrEGl|WyS>B_aS3WWR(#?-ik-K8ybY+r2yw38$NN)`5Y4?u{c|xw zj(~16p15O6EfnnSk4idMiX3N&nC{*J`|mHeI#-CkK(+7_-ovQD5j^DGA$OvwHozYg zOGUP~NB)U;EljhT`-rUX9TNAs?>L9i|L;2QqdJeseD@1c-Tf5G-|sGT9}<<k#a>%y zFJ^;sFy_;|k#2ph`Z_n+(VHSa@Mx0{V?Mgjy~y1w`*@dnm$)0{cj(={@*}sIJJ;I? zinVxzISJi^c5>^xTih!}Rd<P?trR%xy}h9AFYCH*qir6R_1rVviC#l@mOIKF4Vk;; zcz>-k(ccR*KO$JhUMN~4>0aaC>(6s)d7E53^meaxXN%+RKe+3$!P|_FbRU9wHuaWx z3$ZtE9=3G;fp$96&vQq*^YFB$l{;T@I@*K+o50BCLxua~YNwlj5baad8|eOtn@`+S z`H*`)y7-WI$La1LMmt^Vmz8;bb(x&!yyTtXJ?^b_p7K^ZBOvw+sIyzXCvNuU%Uir# zVGFC=XWiA#cDcuG?=|x#K+qA0HQ|W3*1t;p?s_s$9&|V0Mpa$84uwAqb=EqKy+_@n zsB4~_=e*+{La#q7+IYRhX7PaAz`Ir~OnP^LwW8Akg>7*9;J6xhu-CagU}(+cJeTIv z&Z{Y#V@%YPkKtkb2Ing@@OJkwHhN4D8=TkO)$Vjq<jF6bzvN2yUGX3~Bu{RJsZ9~> zytZyqOcNU+eS=)&Zx+9}n=#S->i*>(aX;~sd2%5HZNQ`TBf|9_gn7g~km4!m20Vi! zYb)mi_d(efo1=FFI}*=Np_ptY*SU*fG0kC|&E;j@NQZVXR_w&|yWRN$x0b5Q^?rZn zB!93!OVmUg^zpuSH-LYQR~lvJdpiLenFL_7Xz#Z}5zQdv3K+>EoTGMPh>Ub*i`P9N z$Ll;{o5d@D%@(EQ92}|2S`6JIVu#n+I|9g?-h+N2B(89lLe^#x_qIDfVW(Dg6jc_+ z`=K}18|OVIwmGZOMP;!cFS%1H|33FZu&;Hl^{UHCFu7B_{kSo<#Gfr55|5#E?$ZrF z8xztj??HK7R>j9QsynZWvM?yt`Zw=!)aW5hSA9IHH$(EcM3i&y1NI3>WXC<}HFoZk zZ;C_kP2JB?-fZz?5~FyiEJxcFulld~Z;1A82lUXZVzF%OleDGtIRrf{-x2GbLZ6-W zg#5(02BZEp?@1K<7e@AdP~;HQJ0!OG>m7m4dc-YsR-#?jJ4*%kWal{L{kG06GU?C8 z9CJjxg=uOR?Y}MdynHU^V6)<SG}{X22bagU5x($Vz&u?YLcfQYY5tEMF}2;j$gRha zT92*G7kZyMTSXn`xc8&`le-87|LGm_>N_*s>Ha|XBzH45b@s;&?S+!OUwLi)n7<A0 z1N`Id$K2B2`6P*6dS28=&u$hKFlyI3%6$X#TYu+ng#M_*g{bMfqJeuD6f^vqehxN3 z_s6rGcbz$6t8<^b+?@mbyP}CdNBoTRx$Z!B4$^aQj_(hemEr?T$luEY-aZugCM>5q zM*c#i=b>ejKj4YhTh4kE_9=|%pb)OaZ2qTc>pbD-$S-h4dmH_CuiGCJ>`P*vv&Y-! zEOK8G*SNj>e=w?9#9psITH;Cn0Vp{~wDy;v1J6UZT!_=m^WK{x$FJkp^*1|j3fG+? zhG7DtdV4(_ld$N+;;`uJy(Hd*N#tPP<z}SL6K{y~Vf!_m&Zx_~pjzQf2IFBdR37nO zaV~)9>(Ha`I8V4=c<(w_q3D`!dv_3C3VBUDiQHjP$~z3cnf|-ph5k+cd~p%xluP_i za2{xj=R+JzZ^~pX_Z<wmz21Wm`igV4`wH6NeUatAiB7l!Iu1t%<lx!GAvAv>RNaa& z#{Wn>f`KMvAsTVCcvx-~F9N$6r?S2BA*j6-jen<j0EKKttG$Ajr4h~*52K5J@K=EH zPhem>Nkp8l4vCjho5K*b)|u<y<?r>jihKM$PJj0<@w$J%{~%5vy)jDu#`)k8EUea| zJ?PiM{MJGd0R!9TZiTe1q7Pam>3s^Gt)eHkxXthiotX$*#WSetjZl2EAn#`Jh)muC ztNvPRM6J8IANU{oZ;EXYJjunATFmuBAo5z#!QUzhk=rbO^q)g<g%I$j*o+!>chACc z1!lbYax!|JHKjT4_D}Wu$p`h^F<(n;37QqyhcZP}@Xq!xlvBj^r2i$FWQv#z;Gg1I zyo@jfx%qN9tbP_+<}k*8O|bRDaSHPE18~tfNDh{B0jr5u9cp2(^52+Zh5)z1dCm*m z3t%_KzvK0jH;Et6h4T^rjPuL89x-dN@nwp*P$q9e^R<_6IQXRm#LpMqyqm-#k%L-b z%?iR&X!4pcN-L1+t<_4_#I4>!=SKHhw8ixh`hasS#=}BzcG7Jy&6^^UZcP+a)2Z&0 zzXsa+0p|?t97QY0JG@fzfh53%cyXmBwrSl8>#vDdS!!Xg@k()rW9vE2eb_rF_!dbe z7-fz-1hp)59>MwuQ#BqkzU4jOG{D-Zmb}Y(7!;&rL3cabK+y=Z{9zQ>6I?%t*Bu2V z=i{x7-`pmg|F=0xC?w`%8amG(ipArP;wP~mhGYC0*hRMpHLl}ci}(R27x56kr_7hv z;)05>rkFdg1;x)|w12Jm1<?6e>(3O;vDWVis#Z95fLtSQfq$C(RU8n%p@bfCYSQnG z{nuk*9zEraFt9@B4(PeUspL+;>b4NmXHV>5?kV>m?kRs44?y62QQ58HZgXae3CQ)7 zz8iCUN`)#s0veu>dI{gnbm!}n(+iMtEffroP_&oGaI@T{*g#U~B)Nh7Rcs-DOLEir zJm+nQd=H34Vy5@LoQ{|q#y^#d(1eRH`TT};@*+{uZSJ;k7l}1~8}}vuRQD{epLZJ0 z9E)_%FBBX7mTrN&P@L|b?e;}HSS%EqoT2V8q*pj&pxQ#=$>q-2q&rv6m23Pp{&hf2 zL~fI_)t~9k!TD>2^SQIhxfwMr#136dA1L@9cY#~ze&x@VPocQ?#A49x#Ch^Lmv7+g zgrpTvYmxZI=aI6%$Fr|Z&I^$Kio4!@A6%q71?qf@7l@LJ#B0#rcRzFs#TV|MAX_L7 z>*L?hGRrILmGd5Q0<W4^+r!Oj?<C|3F)CVmZM}u!O*zQxgsEkWcd~bdccr(<8Rd=k zuJdm67J6GiN!s2B4}b>Oqx!uJzJrkg%%d0$g-NHM_k{P1CVdvi8^v;*FkbO)6f3-y z-W!NNVj3boM_dkZp;(R$kK6R|6AvkGJ1}2*KY8Wx@r?amDWCXXy<fb!p70MsW<M|C zRP$ZGp<lyq;Ggcd^gH^a{BtmP(f<?t8~i)`3;c`y+x?xg4p^5v=ZX3LO8;{_c&_g} z=dbo}6wiaWk+TkuFgAc{i?_wkci!^LIc1T1+yB`A0uSGA6gP@J`gj&<+XCCZD>$F| zd;M?ymYDNapmTP@uG--3lLV^yAeQRrx+D%aI4yy!Bm1G|WPKPTU?*mIs?*Q=0dIKx zC_l&iRVeD?xBx@%9#AxL&KCE`FGZoeM%*X!o%`kEFusN0T7a>z6CA6(uKqVzdKZe_ z-VD5xv{OC?b?5oRbSu8?zA3Kv@t^U&@&PO@mw|=)jYO}sb}w*uio4~vUO#uKdq1$H zy~iMYJe1ojKga#5XT(}>q(9$ng?1^YH<<87&`yc1r21H>E5bZmp`X_q&~1bX(izGG zt}+Uf*avCdiV(p(mEo(8^mR1Bd770X>+2$VJ5M34?^A0$5BabTlR3+)hsyB&t&tBo zI!$?L*V{>Qt1f$m&Y*T;jY=2|4KXGq!cB-WljAIXD~uLSJ2#Fw;~3MPD91XJwiMfv zT3?$bxlNmx%vv}so!C{OoJ~6ZJXK%r<fYpt%v&3H;AsH5@I16s9<Gq`Fy+wU$9_6~ z-^2BfAv9<_P<IS!dB{Lk>xOB@VVH`)M9M;q=uP0`#6ov}F&rU=+LS>lRD(G@ao!DG zp3w{>8iqU>=!gl)G_hs~F*mrou_7|6(!y;Kj0t}q9b>Td{QCYX=TlJdB}pFXXbmhW zX(FO1P~XPHhWzEoZPJsBrq-lPZG`EOmF__Va!|P8HD*hkX$MMq5M4wn8m@iFH5(~& zx?i5e`JRsFdpZuE<<4SQKVST$GmM`{(pJn)obTxj<%4=ZI(I}Fcb3aBgq_d0q@N$c z-p2%OB`!uq7R%&fxfnzYJQB!Mc31<W0wKnI?pzuc&=YDdhb35EOR*TIV5Tp|iJ37K zzd=?<QN$RJElQB0OG=`rtW6sRJVX#&#gmy0X_}J9O;~VZ=Z`KFyXPVPhLk|k4#lhB zR4eUB!(xWx_3#n6Lx>$h2u5w<ddgw8(9uAoT~B#2Y{24djQ)q-8#S3ZGHDC^9GF$k z0AbWGhF3>pi5khZAU0rXiVVo<jes5Q<49Xg4c$g(ue(ir>u%J1M|6XZ#*KC3J{4>^ z=8Sc7^c&3T5Kf%oecya3u}o;YBqMT_K4$A&cBl%Q$haIY8<s$4H&z=sRVD_WkCZB7 zeZgeMwuxHFG`Hb2M_N=i*2Yw{KXf3pk24UdK1f*_Bi+E5Cfo!|Vc&!|lm=>X*_3s@ z#+VkpJyO}#xOe6tm}8&Nl1RK9Y<)E5P2HYUi0x_|bIWxllT7w;Ui2)v<Gh?Ifb}BY z9!>nXhM1!jX;foZKdZY9`)M_mJv{ChAAKECQzRq89Opal<kU!KlbdEwi!y~qg_?p1 zvADmX{xJ_ZpRK@M^2SjL-{pQzQ&QDWML9p2p0(QON$YXEsBwoT879eC%dhQ+57YIQ zBO~li6X`Q-8yxWtJ`_)e!*rFn8~ERZ<!civ;o)YdowPy$D*Lg(FW&~u_8G|eiaVN6 zwP>5DoMeWMQrHu8>841(D#P-Pv%P`mgjyV-W}iA!X<kb=F4Z_&A)iKM9Pw8r{pZkD zQ}l5*Qf6w$E=x_rnVtBk`xGzF(H7H!tk9A2P82mVoY|QoFB@qj?)_WEMr!Ws^_ARe zC&?_)=^`v4dnO9U%Vw#Xn8Iy)B{lyhO?^Gm#pR8Zmd=#)hW}<L2Q7ad%6(5~ZBb<Q z(NMG^IvyDe-ctRhyUH9%MQ4=yjZf+m$?yE%aGgkRkmk55l_Q+FRbo2oX<WLYZQs$p zh_gp4&)AHC+S-}iCL<~tYO@tLyMM#fMWkgm6kBn}!Wf?wZiUiJcrS)@tW$dM&@KpH ziT9;H13yi6HH?s^XdOAwug_`1cS5MSxnoZG1X0M{DJD~t6_Fl2G#|E!!Sl5(<_sNc zZQvG5xu&abmWwN)PYpSNWP47}grm}i%TC7pfg>wmQobOmFD&jkowhjxx7ba-nL9`y z<)SPt!x+LUEo{2BDRwp4SK}BGMY^B3S!h)XTa9W?m&T`ywMCPc64P>wG#)9%RtcFT z2u(NgU27vyQ=x#VD8QuIX)N$FQM|K>#g}q0*^+WP9@DWgd1P!1{v8eHkx;y?s{{L* zU%Sv#|2ybx^XUsi!1Qw(lJ0DSv3SO82O~r$bl$)?@g3ASLt!dNsieOdikLLA=F~%g zajStQfpL~)6&@}b#yovqG=fND_$;@H4S!mSP0=z<+M3?Y(w1+^3r#J|XmZP(hS3HH zorQk<cbJ7<p9MQ1y&W=48;Hda;z7>p;^mv>BeC&JrNvPMDLzYKDJHFiEyPgS0u7C& znk6=QMhQxOjxWxp32n;8M$js~x2a>qXtl^!L%~+(gO2f*&g9O;`9r5vpVEnT;-K14 zIuYmglyWTy##<=5N`{y@>#f?1Lpn8`ya!4r%5*R-Yv7i`(4})s(V6LksR`({SM@wI z+yFh@P3A}fPte<x%@>CfZ>dOWoTuj)!qdeeXXcpaz(6uvkYTql#<md+jin1^Yfi$* zXLwnwni^uIT4{zSE#W!m+$5ea(-UP<|Lyp18Y9xc|GSJdFRNrqX)lw};?g8kh!`V2 zN@JjDd>YpQyEiO6ouV8oh4*%iXMby-Oo1%Q#$>W-8yi6eej>c3qcPcZnl23^&g7DY zEG@D)ktMWvD|CX)#a(DCB%LCiQF4N;2`ivy-lqQ*Cqp8Vl|&jr2L4}#M0nG5#pOkF zX^EKQ|6Qn6CCXAKtcj(zB24X=Gs<=l);o?({im259g-;qLuSMnW=&86pB9!bAWfHs zkuI7`ON>H0h@>U71nB~@b<t_^G=)*JgUAg%^EUmT<A2kD&75P%^xuV~nbUM>nBh+s zZ7`%PPGjjTK360yQx{#AG<llDim8K-MbI;E)BidCH;s{F;3*kN2>iECGp7hqY?LmV zGif6}O2ag97N5qQ35<a!4KPh&#h5r7pU0qQ&Zhr!{BIf~#lTM}BN-OJBCOyvVH!qU zG?x|`g&GNjSiF^)Eqa6%u@FN6`!ls;+$H7l2ar_y#3?FS5<?gr;WjQwWAZ89WP~sU z)I~>gX^~NAT9n0G2sUJwkdda)8bZZ0wNEm_dlO;yKgDD!i8F!>{6zRPeVR8-7s8TZ z!D$k!juD?0Vp60tw3dT(aV^C{q7+t&iF?2bjK?RbbSh~9|BlI05^BU4_=)go`ZRBv zE)64{&W$Rjj}f01Vp1eDtX9BIO_&m*Wuz&rlq&e(7`@5k-H!vm1hv)TUjt9&{2G+f zS1YRNuR&cNVpY?GmccNqfxiY-%{(0<tl+eG@*3(i?rT8EP@IZ+BZgl?Gd>iHZlq_< zVp4GjjYwrfvMA#T*|abvmIqamMs!qsv=}St-%<?3&_+3afRbryOGOH%O}x`F9$A%t zI8f@<!$Hl`coY%(AJzAVg9d8Pp`eO7_fSwle60o?3T{x-4xx{}J`_|1?bq7>1PMil zf?U;DB<cxA^%99T>Rgd1qXN7iqLzw8Lp5F`ysr4xcFJo#a3CZNFAD{kH^+3!LJ_M8 zNAZc=um29Zs{?-rrA!%Jjs^`?g`?1H?9reqcIp49Jzhf=>aL?fU1+uHC_azc<ycTb z)jk%qRp%Ykwf)JV{}VNsaxBOlf=}8D<Fyhvq;nRNj!BcwQTMbXoVh4or}b4~(x9Ux zQPQ*+LQjOT{EQE2ax2Sl6hAUoF7%rCd>jpcS&K@?C85k)M=GY%)M3ih%%GzrQBo_! z2sjbO@-xQk5pY&kG-cC_|3v@MYo}&rCMt?Q)q>1KJN0yCB2#V6Of>9fDJ*SBZFn^A zzcEIph4X!rKUK%9M0Oqgm?88be<Y_d>h5xhM7ANaB#a5M@gcROT%rcwUMtnkz$3Vj z_CylWg&$IN$|n*n_G)4ymPnhjX~xGxuaRmKK0DXOf*8}4%xho>PvO;j6+@lXNtF^6 z8jv;3Xju$-1f$NW#Cyk@IE}O^5*o+&Sm;AgBxf<{m^A5J_(o93NO&=PrUn4aI~moI z1|Ow~$_j;q5>AA%{EUy`%T1)A<1wAGX%p|o_HlZ+emua1*$`m~P6Rdd=6E8!<~4OQ zXkAVy*c7BmqH?q@25NYs;w}7d0IjTO%BC4}%R9YxoL%rdEX-O|I<{B~(d6ObKXRFx z8MG<Ku$zKxIxUJc25NW=#-uGAZ&js~jHYbb#NVTL>EYA^S&0nwSXQE(x-l!!R^6GE zsLIz?%cyNxi82`>otm4KsD{&{W&B>1EtN?4haup5)u2=&`(k|gCG?a^XY%Qk#WOAm z)qwC&0<Zd1z*pL;KZeuX#tNAHT31L^NTy|5PRcaF@)KjyhWc;kFH0O!8jAFh^hZN) zNll(Pi$Q#9geU^GJUS+vE{zX!rrQlVN>Y+kb87*_SZo@ah8=Z|Sa3+mtd(t0%pDFr zl2tU+0GQM%^;?-lqD~s9X+mU*$T_SAlnw9Pwj(W>)7W$=2C7jZjiCjPnqD@M==!e3 z6%%4a859}*3cV#ZdFFIV)uGO5V3aIH<ou=Pma#gMmdt5vx{$Pm7_6Z)1+79soeyZX zC^9X|p#DN<7;j0_Ih|7ZKLm-qG%!lWw88Kg=Cr}IGk_FOql=SjdM$uLLP6>kl$O-5 zUTVBSFlj|;u+G_Ui5m#s!PlNSi%G{Np_a$OZLB#mtpH>Dgjr`KvINUvF(z-ywrPVi z{Du>JSi4#7Xv(Hde84dt5>%F(sEqY<EjQ6V%SZ%HtEQ&9iJ(1Uq>eh~ibIGsR7Uav z=Xdp*o5&sTk7K-LPv@Azx5*-&G$r#<zBE1sRfFOQ{fz)mb&unc<ji=YrVA-*KpZAM zHJ&J!{KFE5<ryjIBg=#np=X-T<Za64i$hEDq^T`E{tX478dw?Ha4qP91;6u7)XyLV zf|`D6)yg$=(iB-lA;uYk#pLaD99Kolj|HXBRWBY3+Lg96zoVhK;K@J&u-{eL<M?R8 zXUBqaxE><}8c<H?LMmWPDh;>PhQ}N!Z%#&Hp_D?^%S_b8<LN(~KUA&EL^U-yGf`<! zkz>3Slg=^agxKOxlZ#X{q@#>9Wth`-D`SP>vv)#GtCFaB9!X6gVcJ>B;(|!&3UZjE z$-BbB*h1=`BSDZyifDULvdI^RBd4#2&a_B$C4?9v3o9;&x#AEboG>-^@1W`+sVU5n zI0;plV~R14)?28BGoN-*E(-;xRyofi9cOSTl%h#S;g($I^{0u|_#^oEuPHc<C8fmc zD(NF}Lm+`LrWo^Ry@gsh^Jy35vQQ&K=hQV76J?u~(IN>j<mqAz%tAGbGeoOjV5CH~ z2+@Lnvth^Cve|_eX3`)L>R^RLyNW;%WL>6Er&dg~R%0tBnkG%>3%!TZ9!WSDENo+@ z81rbog<3fCX&2?PP$Pr6{T5{6rid(qff!N?GqL3vtXm~%NsK=DrhwM7OsFUGgYnBA z3NDk12{pNN%I2;3v?L?Zz|&Nvbvby=B<*a`QBn(w3V~>&yOGADNo8u8nOaXWFhv-T zHYU{M(kYuyt3v9_HDwfL<YTKcumhY5=<k#>D03VbGFq5rGsNj!ofNlGrGBUyDF%hO zOtBx(d~~&y#!ff6<o?hC_TxhwOdET!DaJ#zn4zJtG(H4qQPzsGP;7B$=?&D#w=l%2 zhnFZV_H%BItASo3bA&D0bS`k<WMGOg9&Jph$)!^^pH{<4GO>Y!%FJK{PL&pAm`m$T z-z5c=HU?u!7?X`1$s^MyUs@2xqm79-xpd0r(|TG-CN}VYQK??l5~b@|(kPLIG5#3{ zwd;?dDpv|#(n#U4xV%y#OY3Nk)QufzVWu+;Buit6Gbx)-Yj3GdY~Uf4>RK%k&$k3o zl!Zl^Sct2CfuSn=fwP4z(iTNp%g4UU5>v4)i!mvt>K6e_%5WGg)4Ri``UYY)aT%K3 z;J2><MB$+Hz_gpcm53(|hTJTNo_wA@5@sb3n=Z|kV0bL2m1T7@yjHg9!Kw1+Q0Lu9 z;XexOR-$Zd($QQRYl=1WQ7!|A434?VWt%`#QyPw{lb=YGH54J89+|!_QVAb-495Ey zq=v(VR<5KsD!5t}8Ewj7qXG@Y;teL9OQ$Hqm68pg$TMJjB*GS9(&++R(^HnjqCK#9 z+8a{lnIhE2#2c(R8v2qjOA&=@&L}VcfKxipkl3RUpUzo9j6I{ZB{4C+@du5XXm5y_ z*W`fNn0SM=G*J!<vlLNU(upXq(b|yMqY<CZSwW1O7_BWyv|I_fQaeqE6l=q@4E0T8 z38ga-Ql?!xmrfbVB0btcsd`jPl+QD0d!#6m89_D<b4F`RVoC*y#QcYqEnkb!LNo+I zqS#Q@31J3jB&O5ynAMmtvu2rN3M+mzDx}n~5_C-6gQTSh6=Elv#XM;a;5!{*C2aSa z^|qC$1=+>F&V+}wF{D#Qa+C@!KK`sksXRl&<1Z+Yp0tM2#$nF1xFxZ~M6wr)1U++t z-#rS26tNnb!eW`DGxVwc4`DjeSer7Gshm2Sc4FA<(TKL9OuRd+Ly<Y%TM|<$Zq7r) zWB9<5m3u7Iy(ok+w)n7nHNAzU`Q}K2Ps_5BEgxv@`tX1*)*LCq6fy@!bpYSLFlynw zv`}}7oFfkaM?W3(hQ=ySZpunKql{6-Ds&9*gZH7BUqEWejX<&yW}!^c8Jb@}Pj6rr zP8_*^VY625XvG;K=B^1v8pe_$qT*0E*KUc@1e&0w#*>!UoP2-L%Q&7`?TI;^GUeL7 zPUkGOr8E>gMrn&v+1wLJ=)(-fr3F~D6=En%E=_9+u+V61q}gLyn&r*H3*F`(j(WHr zo;1|%hP(MWT@&@Nvr)zBCr*lC?ghJQUO!Q_w57&7#p>>^iEd)LYS9fJUd^nZs23$v zd2a`$%3jN2;aVchRF~C9qhs-93sg($;nArruWiknochj5plpC2?U=WF8|(j?r%KmC zT?kdv>m?GM>^{qOdcURFhiPDTho;@J32`ZBafr>2(#UAX38^9kz%XZ_HntQdZ)m1# zC8j&mLkSk=0Ag_DV#;{pnVa4)g|<aoR*JGOvOtJlN+oA%zM1%U4betAQ_}%4I6|4C zGc?Q@tOkZ~!$m%PT3**NO=V?Udd6C2G89d5Myw&>KU(Sdr`B}w8ub5__a1;%71{sz zo%ilbBMB*xdy`NCq!2oYfFST*LhntmP!d7{(U62BAc**|VnwixyB3OKLo_IBK<v8f zuI}1hS6x@Jtg^1|>e}1=ea@Ua@7@Gdbp8H+<$qst@02s=oH=vm%$d1m+%yUkl%JV% z@P;dwU`RzmK~S7Aa*l>lPhoUE$DlXhbUx?BVsd?=-7)%-(5*`QzcMg^FfgYvYHoWj zevX2r+(X~vpf}$9dg8~yn0VhM3P%}`HlE!?Q5P+}v=hQB4cw}HW=Q=W2c?BnV^BK( zGX%dcs`bIE9KdjR=^Ur89CwIPv+i~qH(P}X3mue`-DZ0%opV-zevC(-DQ`DQa5<eC zr=TcZbHHybzpmi$fdklO{QD8Ujt|vo<P7YO@oUQ(J+pZhN>Dms;)9_m-P2skp*F|I z57e1hE9Ib0)NemiDjiIoVlRo8-1oJ-bjk-ZHQwM$S^f+PGd1r_C^#M8Y6cJ7h<v6T z4iSV7g%lLUxNImuVLFEb%?cNn!#Pc14uKyRgj^yk%9vW884Giw!y3XZtdRI2IG<@# zI!|t<Gl&tVIHEK29_O-w=H>P$xR44Hhg^zs;(YlmZQZ<HIhTgp78K)g$-_c;C`Q<b zw9bj6SA#f#i4h48u?E$7obv*{yb_0R9cfe)V&pI2V_6(}9r;>0D1~A#_|${a6jRhM z37O_irK>cL4NB9bDNN9ePLtjZ7AUn@u|iBR440!SF=L$0`2;~<2tgtG_X7|Z35i7A z%swc~>~4V4QHFmmpo?h)1UFsfann;=!@M4tu2v-o10mPxRF*d@*XrWWZ^m~Sr?dG| z<xr5bIp&?I(Wk4XXEX;uPKOA}ANI%C8Cv2ZA}Ic6T%4@v?@_g9G<@dFX65AZnNk=b zg{X#F7rD0nn3frrp|dWlB||AKM3p{sK@nY?!n={tEci@uig7_o(_-haKek(yAqYCS zM58LJVJW?dPB=I}>TyImuv^?M$`k_xq7kxo>_!e=3{osGlN`HSl_A}sd?s}>SRq_U zz)_~oeB%5VLs5L7mC*2+0SO@i-{m97VS*$rq1auj3?uc}qOydGF^zGvm$+<G<>=ru z!9|xS2Jns}irpnx6A0ukL5i~kKT0D|I=p<!r80X|nbyoGP`4bx>C%)=aeXW?TF9;6 zBS;nYfFSOL;>tvndMG5Ws<^ChtVNY!M9d;H#JDs8zBU5O3yOkHCmkUCjYgEoP?STI z^#a0;xYEAmbhId;Q%;ksJ~~}xtFl_HIEBtPyI2?(r4T-XyIIhga5P0@`lzDFqHH>A zO=VJCSf{h4U}hTe0V766WhkdfVc|2L>R0&2s2s9;jDuju;6JLPjFOV+ph9DCUK?YE z(}@73Ycw}2$#C9**!aV7f~14bbmb6HI)FSi-r-KJIy8_09UuTcw=OKZ{T6N;Lz1S9 zRr<npcG0MdPWJ{2o%@0q>IO+42!nTiL2x<Bp%G1Uz#|?*B8L>#BS~O9{Ar@ZJk`uY z!{{ikYK+n^h!KRuJ@oL&EK!UHDSg&)0)GJ?7*_JZCJ%_vnFx+jVFtiA2^C^Wr-O+y za>_YP>5ImqK-?3T!~Ps9zE(aw7@v^f2xsy6K!8zD&RYC*F*f2l#^tnGr!qXd*5q{# z!5s)_EQF78c%(rdkB?jze-_n>fG9_kqQZ1gnjWeM*;-?$8>ce5Br`zzpjqK^3I$G7 zW~dQm01d*K1UM9AbSlO5;SUoltZ;lD0U!=B6ye~Im&15sScYK7)uH%j04}UajY6Pp zLCzZ`zdhQribg;&NI6C+FkOs_@WBX1tGV+~N*;}WqD2{0P#?6l>j?Z)zL!e5qvV5w z;cV+fqU9X~K0N3Zq7Wai2fQ$)j8=_Cp;*l+q6kt7k*2Gbm&!zpQjs1-To?4_rmqJs zQgAdk^$v#9&>H1NRo=^^sVT)Y+-8Nq%cm%j=BcSW1!C}5+&0A?MFIX%x))|vUh(M+ zL3+@-j0fk3)p%N6qY4=%Q6Zh>g%~}@>8wNgs`GW+yHbd8a+-&m;@w3Lkq;}B%?nor z2o~Z$+2H$JMc4|8Hq9<7MxtS)8yQ9>p5p9?a4(gTMaf2Q(MR+Z{X~Dcd#KelIsjSS z@oIm*$^=GS2Z}*RJqrKcsuyJs7DtOAVkox3K1LyQi{LAc9HLiTkHwc#^>LIj7{MWi zW_+kxaBIak7V2>P|B3OT-!JhKf<GW}o<Ox0@qvIAF`Ij`p`JBXqE&GnqAQtE{?}!6 zt~Rh<TtmdJQP&Dn0wZf3(lO11hSIQ_G?UN-TVE;0c<4;qB5*0gxG|7&W8g+bm?AgQ z(nDAETtFtJ^G|bsBQL4yM4ipWeMo!=6;cm9LK=>c5{88_=p6z25pUSz8zF|EGaUr0 zN_XM7Lc~QhFlFpu9yx>Y=rF~&te3)R9s&+&IE4_LoaAzYeXRoY<1aB%h#?p&Q&Si< zkA#SeXkY@piFxFVwg8M%r!r<r^AK=I!zqN|WWLJ{-0uMWPEx#4h#?r0#)HzDM?%C! zG%$hQ%sg^NTL8wXQyDX*c?dY9;S@r}i9f}_#vK2^YjgAf4@2;i10TA006Wt77asTh z2nqDq=zr9wNIu1jNS_0qp82L%2l)5~Z~uJfhUwzqUZGr;Zgs%}g~6C<#dl-faGZ!o zh@N?(CtB#)9RCww{1zPHNp;~V++M_kk2H~vYlg_gd#4>m7V<4&i)@i2=<!;DpnrT0 zg-d23$_bRHk9c+4Gl(n-WJfgw7v~b3rgJc+xPukpNHX34dK#<nQXWXf2M&myt;p+g z#bO&^Xy{_xdg!8(v7sv}`YTlY{eQ#QZrp&(8;u<bC=X{cu}~iMRX7UK@uqkSsc+-I z7bm!98r0qqf5)Kqt}3N7c~H9zpN(ics1*~)5M$>L)RB?!uom?yrE&9k%(2*btf>DF z)M=WgitG1R3Yo$G_v-YA{|D<7Z~kv-r@scg{*(l5(fujqhx!vu6}I7@dh`$Kp6XBE zulzt^{H+ZGw@@OEwhU0(t#rac&TotX3S$dF+_POV#<Hq+8b3_$jh{qM@4Nba<YxaE zxwiI7SC8$LH_xIE_fhpQ&r;95O+<y%!G1S==<+BPCoM7DyMD17-MH&V^MzDnurm7! zP@OQflK1E1MOS?jd<x7Q-R|z|!t^uxBQya2N2{V5<v_?2x8G@7c71m|OAa1qWyo{# ztq$_!0t=6E%J$=}v7)<laDyJP731-KN`1Z+m;R1-58il>Sd-UGR3PQ!tch(3Jk|q9 zKb&pF$?L~k9dHv!CXKfywFXMZi<$VO`CD%75R#DzR&FjQ40SU-0DvpsVV*9<R}J99 z<HN}`SS}2y;V8|Yk|<xFZFTJAW&1N3Sf-7)#vD;4Wb;HTA(Jrhj~UQ4i0VY0%|tb6 zolB$fTY)>V^^-q`xYp=e*MQ)?gJzlwFiUwWP~u4#A(ZZptc5CzI(ut<B?L-e^RdQ7 zTa|hP_C_O*a@BE@u_(xQsVRDkqD)Hxz3@+zBPf}rDBo)6yVMram@r$J*1f?-uD>?` zH0pNy)@&GU*dU~QFdG!sZ0toXvlLlvX5dw+_&((P7#mUQm2|N6`5`u*S1tiVAIiq& z(D$)H&G5Z!kV$6uMFoz4jYSF_D}uI4t&Q&Cr9pbYhrdxkzjdqpxEzw&FwhS1pUnW( z|EDsb8zKp1NdjXa`k%{ylK)R-prcZ+U!)1R{eLP0S^{Jyv<|!#pdO)*!|Q-&X0#4O zd7Ns^fVNp|hjby&Cg~KGfKE?oW3`ACokt<<c`%D^PSgdVC?^r}A9e-4Z){F-eV@Of zqw*r0=Xz+lyyFJ8!SkRVA^$zb>L7N?^n9!1qC=-H4DGpE6u(6=O3aeL-Fh%!%+qnB zZa!5B0#}Ys%-~QW*V;S#(Qz&z;(SKwrE*;7>zE&xhmBJCc#D@ynfQ@1Kt(kQ8n0Yj zF(G>?I)_uX0hY~<2a&`<A}t>(usR%p(5b}XwVcU$c3;a%lk*9kYfJ!?$!D)tUJ7qr zpb>0U(7IN9)p-=#3S7Kd0>yNWzUmYR{VnWtz<~ZUBcP&wG?yr(oO%gLamYLSQwa8w z0G;X3Ir^$oW)e{X^T2f>UDS^z38-{>N-U%(s1x#J``Nhlp@H;O7bE1l5BuGV*5kUi zVuX_h)OHGauh<g0isHoWyVf`SQVtZ$j7=ZXS`Xu=3pr|zWmnyVJsauJxb^ZpFQlt1 zW1SB#`O{}0?v0i3P_Wx0L9(Gd6JhPba1C8r!+tI;nKsAD!PBz6=UBaSe*lTPQ<Xp* z(xFPp)5qX_^5!{KUi1~WrdqMJLi=k<<t{bp%rghWcwBXa^AYFI({C~_LU@q+hClY_ zj@49m9>&TvHpbK)siffi5q}TaW=xF;^kQSPOO(jp6Cz)cd&uL&i8}O#02FyEaG6Pd z=kHx8g5_IK49n*y)a7#Xa&_fl6hV)?{?xvo{Byy%VxF(PvHiM=5&7qXCx{cp3&E3+ z;<>$qeZFW*egVE}O$U)*C>DvbsM?*xzshF#R@oFRUI(UCHahn51!vmxgKrSUk`U-6 zs)XM2qxFK+i>~iQ&^5k_p#HqdhR^!=YS=#TmN;Id#ViQb5PNM1T4hTQc&lvleW<AX z2(dsM>!uwqR1H-Hb$LIt6rRsd22{k*>@^m+VXC2rz$@t0&`YZjMEn$#WC_)PdA%zN zZ63qSGrU)xm{;vjTf%egHE}}V5pRuv(a^s4T>Jlu`KU3<WbO&=PvxFjITGgA#d?x1 z!^}tjEAD}-LhxtsJmwE7<zzBCk7J(b4{9#*5Ma^kBoe*%t-TY}ixp93R)f$d^>j-S zsMk^&EkWp?PCE!*nUv=BAbPQ1O*AB3JzhaOW+jj@6O#r_oO;sXh!X-$io$gG1$}}~ z$2phJTunc5rsUFZP0HVmTU#$8#rN-98;l2CvYI3tPi-*#)+-4;|9luvw(d1iLFQc} zHDa@NN@JvBpkEBU(cP(JtVx>`_>odfTjcR7Z-P%N$+}N8Hvz({42=YIL|Z?N;Ag-C z)`T@|Yg<f&3sI}W0R1+qFvo~64?&8SI&C&ShO9mo^eYT}JV^<TA_PnbJWxX7#i*D* z2#(6=I9)$xeWqkMOIKbNG)%mcA7=!>UOSxI!{rz$&JyPv`>=KV`Nl>_;|A=$xgB!O z!`7c=!LC?p+ZPaUcBt%axZ|H3e8GK0APY}Yo)Jt43@~zyZuo{*JM$pkfO!UsI_&}% zVu$8JBi?u(<)S8DgXv=&2gWyw#Q>n^Sm-8yEuQtlT{^Hl(5N+LV^_uF@VU2NVUOvH zus`z%V@Pn3Q6K_%=iwgg=Dt^SHZH)P-T~t>b1~3fh4W*$2PTZs>gzG_A|h&W&#x<R z%`qba&5gJ6PBW%N@fqD`LFnVaSpZL@XB0%Tks1gXp9lAw2_j<hBM(^^%_jy7<mMVv z197+p==PZyXskCf#94UC;T)p@jAWTqopa4Afz3dL<{8IRbwD0B(gjw!L=Q6`tn5d* zF(?;ZjDimu=NY?<xX`0U1Vys2mFGV2xe#~M(n4nk?lpD>FGBn|x`l<?SrPHFx;GUO z384lMsl#uvksexz5zi2`|I%4TpU`6C&%jV?tQDo=!r(%TA$8(KY(Z9QTq2$iz7X66 z3H`;ysNXk4^_UFQ&zesgb>dC4*0>+Q1=#Sb3^@ygg^x%sz~GsVFL*3LS`ttm3-}GD zAyxw7ROGM3_QwXw6sVNf0Q)-rBdEf3dJ9lAg%*V3@qy+t>>+R`p7w|U%L36^M7xN4 zfO@Y8gF8b!AW9H>8d=+bXcB<$H>aX_f;a~|bNmUrOD+^oiT1eTXh7`wVg~Lzjs}T) z0_8wGQ`{4xU1(>CF`*psin$O2@vlPVfT|OtLpuVS#Fv3m(F3mvmw`f=I9;rZib26L zxW`rISs+s;ZiS$BirYiGMAtwE0MEz&LXjO95-b<rLHYWbDL`X@$xWgm)K#nsCZgU` z0ttXJupe~>&ROCz)E&1@K|V<t`r`!++$V|oAnTb<l4i8h=O`HhmQ+OPIcP9)qq!4z zS$B!`*xEB!<Y0f=;{%2mV?KmES8_uWLcKzJf}5be=K;FC_)jo|)}3wMDx!g%;yIKv z)W)d9Y!}=EUMT*GP!iaV2EwQ^sV6E-`u`s4eI*3j1Kgo0f;&;y1>!@K_Ejwxn}h2@ zSt#~3UW_b3d!i`1&c`MpJ{JGmQFm(L5+%~qzyoF-w7g7YLQbEG&#+%Lshf%1wZU)E zkmYEgZUG{GcCfvOJ{+il(C)#u@XeuIGYPxuJ{w5Iwss4}BiOmNT#2;~z{3N%un}cq zLtu1Z0g!zJhRekha9NfhcTu1`usDz@vdsO#3f!H}MShOR3LXvSGN4JN;?qD7O4}az z`UNJTd>*hsSE6X)0B-*d0LR6FE+RR&K=cjF2s{%U5ZDzsAMc@#1kXjGQc(=mN)_t@ zV_`hT0}bSWXO|3UKrYm@QCti5<_6~lj}I1`C87+Z@}UU}v5)Bq!A!tq01xTNyI?HE z91g~a<!BiasYA6FE5IiKnus+7%Yq5eZDQ>AV5AH3Yd}5&nruPO6GT~Xr08z$31$I0 z7jPTE*sF@MN#Y;DA>yCG4}!Y_?*$H`0tWW$y&*Usa3$h3z`Y(Ak5>cU43vprR7?g6 z6ScX~{0=<rhrU0Bf71Hr0<W6)n;BrN9a`$kz=q(}!7<|7K$h4L91VSb5PH!CJNJ^( zK5NziZob$L)k+O!Anz6PRdXveAp^f4`g;i~my7&H+!*f)s2mXhT=eh3bX9{A2!;e) zieBF@*gqH)4+K+{!O1}FJ~qok#{?$^M*!i(;0)|NOrk9bmO=_E#kk-}K$s#Hg1xaI zG9C<(UesVe;|L^{gYMV~#wHhK-ZlYA4TNwe=|9??6ahTuD0@|gnx&Xm!?!9E$)OD7 zkHWsXM+aAkk)o5CDozhx8tgA7goxBxAX_FHQ18h=UP|LDpnAdpnPQN+8Mz67N&-VN zScl5B$3Gda#VA#Zp0_<1on_t=+yNCDV&;kvM!k4EbFo6)5nPVK2Eb>T>q5z5ra8v^ zWAIPGG1&5Vj9Cf|$OY6%p#|o?;A6p3@k+4D><aX^1#=+orBK%(n&#QyN+tM7;?KeN zA<c}yKs<<d6w+n_H&q(-A1K}i`4V(LvP~<%Svd+ng`%Zm0z^bDmk1-g61Aj<JO&3M z$Z3RKGtlO5f_Ry+CA2jZ!RFW{fh44na7l5OqU^`mW)}~MV1Ihcw6W=Y4{XLfQuH@# zL{~IKortc47{-bMXzs(IOi_&D^>8^N;x#h|V!8xw$FUG%9lBa36sJTCH`^oqrO<1N z5HWXx*&n0gb|X{J6B}K`&Bhe76O`{mbA_lhK};;eR-AXCIgdAqRvnrnBIcOO&=e!1 zXl>#(3(0HE)6KEiYkR!Ng-tI(3bkefM#X0^C})XF%@>TZXl=?*K~19Y56(2tGS4=z zHBCtFAxMTgZJkoKh&UIlmS9B85LbYe+stF3kj07;VLvAHmw+jvB?ywEu>xum5%WUh zLZl`U5YE840!=YQtT2ZuzH^bEAnr9Mg9O!l9SA@}U@c3baFjAe$?8O4`;+;$Nmio* z(jrWCP)llg3jGVZR)@i=RJ;)dXMZspR2xkakHa-OXm&&9o8|`y&&RISv|n`zLiG?= zdo&Sg$=7JRa!7~tVHlw6f$CUX<3sf#tQbi~|A|0LsMptu-XW549iVe)$cC=esiCfG zC|ZZELl$a5ke(qWw}9GcNpL)xWh4L{b7W|v2!sZQ%uo--{nXI#&`2Q25j&yhVKfz$ zs714w7)z;U322-tq2u5M91Hoh$NukkLIx#}N-ip~Jai9w&R)P(VLk=Y7Tk^sfRfL% z6apqe=3>+L6j<;TsM(+3a!~&^@&CM74Tv0woD2%t$@b#PP#w@0AbebCZs`0_u{Z&Y z=VH}hduSopSODpjLc%1mI)r#sEJd|TMU=YEx2`!D3qjr-IuN`c2q!B;@ounP;9xK% zFiV_;x|X2_w}d(bItK0y6^KuR*@5Rmxq*j54~OvWF|jA~o6vmGBLFjmDy2aR8ITH@ zBy?({y?7yXFf<cAXK>)?K)tvv^jG*usQ>GsW1+WQP^Y&;)Pvu}zUnU{Yl4`fBrzF# z(GtpTVn%>QZEE$oki`?BCqpKPkW)eD<CLh$gtrIbVfY7nXhjZGIM>w*{j4uWK)~fd z&e35I3<-P&{E}SQ{t_hTD&Y<T3#M4Ax=n&O1^qn&9WI8@+T(vN2$Z6h4Up6%i1qrw z43xvBjp)F+U}mI<1LiPt$j*_5km8aI%TeMo^PWH%^7lmpWUb-V0}xxs1{Nu|<4ufG zbuReL=3;cB5{!zZ$#obNC%~%F_*E<Z5*P;I4##5Cv9OP$05w-tM%NRwHB^CgKNT{f zYJL>>IDp3&P=)8=J!AYE2`)@z%vWM0J_FGG3MEF=2OvqoAl#C!Aje&eeExC>Fe|tS zDAVB?CWtQ~oh+DgvhG@b#4Py|J<)7rU+{?>kpkt+Ma%@X3}8u!f>5cLDzY)s(Et*r zVFDTH5MZtn;36=`0wmv$Nss{=1b+w)gg7Ax`C;<507LB}xGiO1ehE4-$*&F&n9?9+ zD#E3r4ypBUZb~7oNvKeS?B5Cm)`ILxmk^2R>>v?MfTKaJb|H|Kiw6}OR=^Gr>MKwp zA4tl@lc)lj@A)t{S%O@SDEwvGnyef@8iH>NCLuopxuuF~lwF7_ZU+08hcN!_4ekpr zgkO@Y++{;tht5ZReI<S!P`DpNMFk`He+qujGw@onFievvEm55=74S2mteIjzjCVjB z2)-G#47i`-@4<J2os5IQxnOh>SXn9lh%Q<J{h0*g^J(z;P?T&vDTrabtY&Zv#cLs| zEeYz)&|9!{^Ht$0u#%$2uQFIVawHp3G7CmJ6_dAIut1VJ9z@7z?hXr23}zy?4vmzG zoCq|dpBV>fPeR!`4A1a7qCh}GB6lJc*Pi%45wl)mX$;mx#+e=A@51FbXpSGk`arxf z5~yaGvrU>v=c=xi29^v=#5TiuF>xIYk_o_<gn89c#bOFN@b$QVO7|yem@dIEP2D}3 z3qh2r{$7TWj>c&cR051o8CW{kqycjZ$dsY4Pr{X$>>xIqmzgIb9zp+aKne}iG)#w) zKS{h`EI>c%sKTk@W{j8AM5&O*E;w+rP$C8498@%y^gm09ju4k)y7>V5JK6RH$brSi z@wk%46J{+mxmby=4*u?9^xz0YP4k1lnDa5+d=)eM*Wf|qLmDG7f-Z#lp?Sg(bkVV3 zH3HU#U|uyD6eGYN5mSsPM2Wz9<4Yhj#3cv^(T8)**US?j{vpBRK&S%zMnfww`s1!} zC>%@(juAscG~(4j&2CWaW`}+k%!Mgm6xd;$Day?<%%dudVo@19!zc<p6)X;Y2d8|$ zd9KmLOb_i3{MH<V0q&`&aMUpp*IMxFICVktcgG?`Qow@=FqdoL@2(9p<SgXSdjHwM z6omMg7jm41Zj9K~CWx>)4q+wijx!cbN~LeWd9q54QWhPv#7>vMy3n7EXlOl9>f(Em z!zPGf={y-d*l{k06evbaIgVjGjq7!xXM)e;O4Ckasto_c6hU}LGfIQ0sOrJQ6&)+l zgE{mdt~^e2oX+1Ws6V<8W`NS3cVmu|9C+CczoxD<Oj8HWGP41h8;Cau-f`NgYmY#8 zlVVZF>8TJoPM^R`myJ#?=+VeAkVemNo0z>)0UB!Q8ZlGE00oy0YnF+$DFJSf8JJ-5 z2ug5#<UlE@Iq_l5K(R}Oa{8yEpU;Mx(Bc{;TqfkqTdhtQmd0a1cAQCQePUv)xJ?x! zK~ILp6D%DmP+!L((?fzTSGJyWa>N$w5ZD<h6tBhn(s4XF7sCwgily9T-ffa?a2&D? zj&pNVF>^lvv<^59*#;UP9VZU|2^f$ki~Yv4f#+QLu?~<Hq@Xi06C^8QjckL~0b+`B zUsg0e3e-Y+AHxkM#iaBcoTH923>O~R1Hn-$gX}#4Bw+@V9E?M6AuCBK#FXP?DFtS| z){M`B`KCN(oCbEsndUO=II{!H)KO|&Bsj+z3fB(wS+9p-^2tm%j>p6VrC^3}j6$u2 z%EcY$gy0!20j!H)K*r~n9cDs9kUgPrdkph*Z2;q0Vx?k&btg(9+6FZ16sh%YH`5}5 zvZ`0UsIcQ;8BL*CkMmjLY9PbJN~MHx*4_idPQX@HlQAH3jLy_-)ESS1?=%m?l;i9R zqW=32(|4;BQeCtb?#fd^UHg@>yl=oZ_YtZ&A8)z@{|=+|ywEo!sn_uFG4lPrMlLwd zN{Dh^DWF(0h<Qq5!;qqMY%p$TehYt-nb*}G9qeRAV5Lbhl2vO|sg6XY$uMxW*)TZH zAXi(-L~ut^7Hc*Nrzs_^^2v)7<LCfYn<}{yrs3GYEFhTUB0-y>lBvi;Yxv4J&Wu2n zDQBK%b;zJR$5{m5R~rNQ^z~L&;9OH~yTQuIS%Qu19p_$@=HCAxLL|&tLPmdQWhMKV z6jGdOb%?UMdX1s+KCZa>(8ousehxkP3m`~O9OpIV-cUDx(|ii_iMH<CEU*t_btHH` z6faRMCs0?Se(pF0F|dz-rY&o&wIkrNma7y!1>SZ%ZetK?Hq<Van0DaZn%JT3H0*`0 z?_zlMI)4mMj#FsaP*XZ9NDKlBLSrW%+H#x&_RlkCiSu!-3SAVd%xsV*I~{M7fyQFh zxqpqN0obYKY6^mNK19f^Ca;>h6d~Se-j1<?N$mEJxhZ7r$Rg6>G?l$xv2(srffzni z=0g3+Ek|>TdLbhhpvkEr!)ndtw&2ZJ7-0%@=88~5Qj9wIepkx-ebS?bqeI(e$9XEI zCe)7HZs{@cu)U@dsy9aw=o-tUW}!i!59-c+L&V^K5RE9q;B6jiMm2-FREqhDJ2%%U zddxS(98e0nwwwl^r;X?{N=DSxV6fGJccRd@X)aQaTL!QvY5??*vAuSjB50+SEa#pb zs|bzxkeMs*V*{ixCz#YhS{qUtq9Euh7jOoghgssL(9JF)7Tz5y<`*={skOas+d)`= zJ=00-kTsyOp3eG^ckZ#00tZ6MqV&2mmPZx42mgEFY-m{KhGLH^3)4X^+NbO*HyP{8 zYi?C|9Dm!5ks+WS`yAH$Kg6<=UtcIECDvrRpMR@ZSqUeUHJhNw4tN7Pjiq2S>QF~v zbDSFrU^#{SGy<n12|APvN0J&q*Myx=Z!jgsD+D(gE4t&bn+87`O2C-3AIY8&>C|_~ znGuLmHg$i^IfL_g5g5VkcjPjIl-im>4|)+sd5(FF$4y3#T9RT=4+-fQF8JL&NABHW zWu{&qI@c{+fE6CO<tD3F^d6;lhMEtMCeT238<r)A2zi8lO`zHTQvo8kKlohC^*o$M zNJ?LgA^Q}Cr*)-i_@+iuM}K7|sh4B@ua)N?z{Hug#c`;UCt>j+8DGTyr)8h$>Bdt5 z_7t8A@EA=u=4ckIhbNW_HKQk$3V4C^Mk6u6?=ya+datr~n{Tr0D327{<<km6@Fagy z5jO5&;Gq7iT|N?)$2GxgRe^aowKqzsT4)=BWD}_)U96g>8lh8orgo^*{A3A<_C_6t zyet-$RuJtXGn{9Zb=)(>I)%F4Q$eCC#a_!^{J2Te4a!wU*agc~DP6FFq|4#?f}rlu zoThy~UO^fRNSX@|!@Xe2KNe>iBvMSdcCVE;jfMj9e;jA7I#cK*gh)hv)ao<!yxb6R zu~b2vjB||&>7Lh!7%9mZQ;Jnq&M<9M2^SevzOsr?J@HvxC<!$R<s=CH*!#SYY=4=x z3_h0Jb{<}+<;I%>%d7oW#-kh0n**`$qZ&`~b-1?UvgG^d5Gj&2emae=?E4rYg-X7@ z#u^}>-ezSb5f$>|azpaK4y%()TV=%sUNhzHomSp_&tambpQFn9ksiu4tuZ*xk24K& z&z@neN}7j-^O5j7Mq}a_wYpCv@yr%;Vjl4cps5?qn<C<#t$MDBD4mSk<kWD~M}1R7 zdGVRn4Zk3|XU?#0nDUEp2TtX-_0~<lFoVA^x*5M@eMxVq&A0!8OdfF?6Y(QcnImfB zBSNR!c+!zbkzE9OR__ONTFCOVt?h^4BW}L0k5C@>5el_6Aqw9iH73ZPhYu}0@Lacr z$zJGrEn%diwY{J^^GN%>_CjvD$SRkYoNJ9!wf-@jT8c#LdvPi$=F8#@))`6_e+(%- zg!to(4mj7f4?l*E6!AyVk?xQrRona+#v`lsPidPY!YHZAzhtw_+~_Lzk5%}HT13d{ z8?76Uh`%Gm_dmhk5jF6U@rMTPw&@q`e0iIWP^W(qgTHK*cVFSFGP!%a2uK#-aQ24N zzt=X%<|}+v{;$zdHzo#SRsO{=#w^!=jq!h=%CKDP<p<L0?(2Odcv_w1<0lUULXQ5G zb-a9kwUs4DZ?n?mYiHwS{%@s~5u>4T>+7L3IOlsC9}82z@>w8_M_+#iKJe^WAdN>~ ze+hhSs2O8xe45G+4uq)huV;BUj?~F#+&>^k)cZU<&xjYctWHPRK7M}b$yZu0)9wn- zrB(|0(Hg4@O<M}(uA3}8n7|Z#eZj**p&ynAEq2tZ85>XR6U0iHcCFRpPy+JZ)9|H- z_LvzB{4Y`FD4w@ly*!kIz8~eGa-ijywsN4Cn`C4gwmJO8*i4pNc3Q)K0H0nc(mIfU zwn~CLS72=?71xz=#tqg8YNcNWRbSkkl-sb3l0e!@iyrdfn{daWSjgSKwsMXq7hAVI zFQagbWII;fndh|$z4%j&+n}dl#nZ22EL;Dg&SGHSVPz#~J(TI!S^2-5Xu4CwJ$sYY z{TC7RVENz;SWyMa1E*m_^dHgI?@=wee!Df6noVKL!15v1=VW>>J9EPKt0`8Ol<-MR z^t2e?Z{|B{`hGKsm77G~xy#B=(07#Oz-CzVk9J{Y#9OSRyT=A@4)C%UFN9HHYGd7k zjEqtaWvoiwPbLU%b#G~a^p@^<=@#XsJc3M-=WNGEVEW%;)qBnH1AX)RDlI>_#hN6K zX||GCaF(pQ5uE@F*2&V57`S4cv=wq<!N9XDEIW$P5|U<<WrvRcr(4l7|7RhmJ3Vxe zXg%(0)lGgjtSMx&oLj76-^2NxcS1IAod!K1rEMh^Lf#tj4~qrQyujs}yu!+3iT@<j z^hLYxm3W%G^w;2U`Zg<p`q<Q6SSvexQ~pGOxQG`uTX}eqie-r#rC4(8aL8z*MZr*q z5rw>CmvuCWIW?|WwTn!70FPtvjR)#hDQZ!kJCVNU#@$Naza}0I?N*FU)79OI;(Aq_ zUgfF9S{^Ndh86ADGdJ><2dor1`T;8ri;bvT`mJqm0>c1w=%8iKRLFkNz=j+t9>+;b zJE6_}V+g9JSCm9VJ=}3Zc!V?Feb%HM_L`+mBp<vRwz2MU4Ce>$wrJlxY3;GP%w@YW zRZIiS4E)m~B(Xu$39R+vUoVI(LfBiQZM}ND90H)#V-`u1kel~dHOk2U#wx@dfH8CR zJj@(tZrNfnx4bS*xix|@Go<4H^NPo@3l+GZ`7-qI&U>u<A3?8+(y}*)2|erEVbE`T z5dvTN8>^oj{Sx-PdjCahh^oh*tqwnn5R>!>Q7fr>bZ)UW%`otMC;59O&Yt86g1iYW zdAx4ndqOA&OJ(E-=yiLRJe6q_a^S6S5$D|tYx~hYt5XRpG(Vc-zhTnqaS3(9M0Y@a zn?~!EoY`#k8o*p@K8cn-^o=0GNPKcT%Jh4!4xabWzuC%BRwRJ0YtF>tyF6)^m0GB| z<L2<wpgXTITp#VVI;3fS^vy{bd7q5ZEmq!KR#@+L4&Ra2caf;w4FgYw10_F<p~>po z9n?Lz`mM;KuXae%WYK}Xz0VrZlW=&$HN~j(p?9gMr`vtJN{|)tp2A^j-r%hId+C0w zS8Ar>lB^INQe0<s$k&3Pn-v}oZYYgIwtv9N8b^3(U?=-V7LRbS#bdm>=30ol(ODe` zn(P}nCBDXk0_2rZ9@n$29ElzuOb>N|6OyS65nD@o?4Mm%`aUYbl2kKecNOWONUCX; ze0{f-DhqDIGZKtZ%T?bWB)P<Fs{&yN??ydKj-{k)N7i{E_#xv&x01;-BZ#0YAwopY zvau7d&~{S~v$gIqx)KBc?|a}%==At~aNo4s&AiYff2?Q3%b}0_v8;(2-_|Bx=uv+n z#@uP0)6$|x{+K((8%};!9GQBZl}Nr;LOyBP;pC&sQTxkow^><bEHMMm_K|*Qd1(FM z79x*Uw<*Ch&tyd@wG|Js^>v*}I+T^hV`r=#;7@PIR-@cg>G4?IA4y_b=jkT7w_Gx- zl|!pXYOg+vAsdRVfDZXbYMtsqatPWhJJFcD1>V77%%kSjZwdT(wWZMb<!|qW1tQ!e z6Ygs)DX&IaCYl#dTS=CF>|XDn8d0AfFoC2_2g|1|F5PpfCHc-bLu)>{B^9>L_bX1h zMfp*L!{hd7cv|A&_VXK)Liz*fv)m8#q$Nf518sfyN{>8{=FC#st~u3pVCzHp-JYRr z1!<?IqpwtwsIgB+5TMEq7$cqRGdWsxx>*Q<h~z-ExQ8pFhyL7Q0J(7_EXG1-?J823 z2NCV)QDx+Thu~x`R?qUb?Ghw<5+Iu$Pk@Ap52_dm#G^;X)n76FFa)a?4P##8P`#8m z=>Z3As<?Ih8s={=k1SU+>{gW8%p*%}rCX7O*On~d@n}SK-RR{C%3`zMx^AR)TDnY@ zUq7R_N11)ydAP3H9JFR%w;8KD(ZVrMo$2+_V)*!4N4$n3u_+Mu1RIEZ{2h+rI#4b% z%-Nc-);s<5i&x(YxpfbAZf8Q8dn(M`*QJ7s_mn8h#mm7E<SI9JM-slCJg{6mZSq_f zg4OI5^J6Vsysa`5GR+vF)^gEfgJz80l_OX_W+@%eY%na9rq?k@`AJGzs<Q-EH(9LQ zJ%g$b(6>|=838kM{uFJFG;;)7tHx4W{%bcc;(Wau-?TbZ2#oe{%Atj;l_Me6o?1G7 z8L)193~1e8Nw5qcT&gm?0!ST!=2Tn@PgS@rymo`OD_E~7+QM=LNS|4AD6U!7eMVO@ znau#Vn|!U&>avWQ-Xllasg2X&S<|SFgdAgI*5tb1VPds&C;W3QB;DwQQj3diC@c_9 z*rUV*$%NY7&nA@_i#}fK+FGwX<*+ul?&Fl+T4yMQ4#LaN*0BUVzKkWYr`s5m7~_!E z0gn0E)Yao0I(uw-<FfbkW3hbbG^?Y0@+K=4t-%&^cAHfNntM>CbTxU-$<_2%isv3) z3RO(2g*Sai*O>meb^c^Mfu61E<V~Pyf=I%mskvW;{10}unVQQkzqhuy2&s_wr~=LP zy`#*HEy0x^&fq+n$<i~L{L~j_vhs~TSXchy2(!4#MAOfqS{&-rnkV}B2lJ!_*8~n} zC4oxwy2qnWSj(nql!uoho<>v!TCWp04o|b004;EkUJ(H~^DkIXx#UUf40m0CsL?^q zW8k|b9AlnXnwqE9>l-9ZhE?kVyZ>Y@`M(q+uNUdM(Bzj^3_@=0sMhW9pAu^?^2q4X zQLO5m@|0D7GBprAjZJOtVL34t)(u2?m8v0@;kj5-&|`3VooEGKQfvf9T0~37KfAbD zE)JSNP-)qf7T*(BVfpo>TM(jW|77%O+~e5wjFr=eJ~z`I?@iKzm(~Y8^QJe%9ETp+ z<frcBv(H*(BU-B|k<bS>J-yo7wj&V)?0~%e8SCbsi9oIW{GWl~%yL7$Kf(2mLv8u3 zpULQmQxWqHe}|@2Ezcj9)Yb!5*Q`Uy5E6Odb*sZr>U|XBLnG!Gn_|6gNoldCUgZ%X zrk>BoPeNQI*S?5ZuQ!g+Q}o29el1R8<!fs;$yUYKM3~pM^pYv*CNG($#&}~adTonh zG&krX|NNp=9ves)sO><a(bDvb(YCf!yx7ELo8&VuT1#C+#p9cQ(U^cVIvSY{Z~9sx zgjWvJ7qilBS>*Uam=jvurWozNldPT_<UBnLaLl#R;!jqUtt~(2c-2-myi@B+vN<N- zK$+u#FIkKKH<V{iVHkfVeSi6B6>(x5ZU^YM@Epfm?q|5REl0gqA2f`Tb}e<^dE`ZT zJ!p|RZNf(|y2|E%TG{gH=dor!@l~k%Y<$^4qaa0R#if)9Xh1fqWEM2~*$Vw!br*r4 z*tKD6O~$r$x6o_f%7D6b{LjZb^4Qn0gT}fSt%SL{GOei*4bN8mbZWBy>sHVIaRT%B zo!tp;6<b?U?Z;46=-^6tFBANL$Yj6QtzsYYNvb9MX8QjY<W%whF|qt_NB%<tO{+dY zBbXX!(k8{Z!)=n=yQmVLrc=zDUv)yiVukS=L4u$GM9zExca!QcdZ|uCEB(3?5eOe` zQG4TgYyBf=|42r0x$S^em`Wk`7gXARJCL^#1K}hiL&u@KvP*e{Vn|E+CE5JN>;3-; z!Z?<qT=bTemHPuNEH}Ny3Yi4m;qiKE%nRVw(Cv}swvJ9c)ZA0fA-Z$vTFk$;yiJdo zyk^DCW*U0p$0HnLWK+greM8%`k~9>NZ>}9fU$>GQ*J4bIk?8l+NXVHjR)=)%S3aay zy<-(9j+6c9<nDJY8?q(-<UqVI<`yKr+?vM<{y<d;T;Gu68EAXezdh&EQm;DG7v@Sp zs*8Go2)!N1JJue4%=XGwpeza2@3_)~BV;QyHR6B{ztETBgE2Jz$EblaZZk$6!c%Sf zT~E3DecX6|@Sj!^IT3MK0Hn9d7#E)tRgCb`m$GO(#SDZ!zk;B0V}61znXhXI9(%<; zV9**nH3VblQlms#R1u@QX&MoEPwbB96uRd7-q`ZcQx4B&DCEEMOR-TdPJaand!la* zs~=B4GkoY-!hRMA!4iC+q)Ny|?^-9~El`>MJibyeO399<uFO92AAHZUar4@ndTBfh z0L6^tyKDj4c@K{fRlH{nZdHVMr(*%sK=a;;09GwM0&>eiD+?M;wI_sgG<&l8pq1Q< zGZKAHDc6|N>G&Q*`wv=kqW)Y3jML$mYK>h(($&MR<-obrXr3G#r*)IM805x(SR-54 zb@y{tPF$4|pi<;0wJ~>-)*7VO1zl8bH}T#U^3<7F83uLc*YB%Tx79fPZm(Wz^t$P6 zF=~=xMfXz=DU+>Gx%5m<>wZf8m|;C+6}0GSMZNi?mjyaMLgw(W9vLkKG6z2hJ3<lC z;LJbA{C4K>h-u9*E0OZ>lv&`@mi!N_9)Y-N)2GcETPnx>%lebJRCf5c)nHDD%$gz3 z`nNT6+~+fz2iBK2G*;Ix?O#*5y0W3)@|qfaOL5j=ld}(>JhUbIBg-<QwRN=(l@&(G z)~$tgi%+hsXfjH-ZtY%IWsKRnHNURDvep<&@djhu)~!YL4b`j4n<|aTTetS0QZsOE ztX^syhtiEr4J%Q49*Q+BL$Tvgtf|g8k>U+2D~*!?+tjeem`@37>MM-}NLbaUyvA4r z%&V#!npPrQhTK!Bc=^_?1*a~nuBkK@Q&M%)GNVF1^Qm=G+{M_E*SSRw{LJbdeJt>9 z-~?=o8w&o@nH6jd-WR;soFD2F*Dii({LqAT#&`IHaR@h&==)|_iGvf(q_3PWofndB zZ1=hIne&13q4O_ifw3xZ5<bNJZXn)#$*c@~7g%Nd)_LDq9Xcnu%vgc1rvJk^=)B{+ zW3D$EjrW{4jFrZ_&Z%*i8-I^Fml<z4=On-B>`cBh;f}ZiPBOlZVdJZZeZ&DL#dsMT z74}G(nDV0Ytn-}nyz{hElXA6jhVgsn56%-#i?Pqy?>ypMn(~12kaJhciz#2E<fgtK z`j7L8lWu(Kj0)Ty|1G{}L|@4G&iTgqeSF{4H;e<=8|rI^s<A$?qD$}-;|phg@GIkU zXL`~%#%E4<@woWh`2yL!#47k)UpZad<(uC+{ne*LzA?XX{?+blEXw~zeB*o=_Z`%9 z5k|;wok{WWcv5^2Rx2~GLWxgLfhaUmTrBs0Zp{iFZyYbvzOb;t0X=oxQEvFcdIWis zzO?qHV;vH}bcd?kSZtIVOJw?2)-mnQqK~Ypj7{>mudJhswyOk6y2Z`nQruM-)Ny_z zcYkGd%zV&z1c3BUK;Wdyhw|mGtUj5Gj7npYQD#&bXXBIhzcscRmr46;>%rVQv{kKf z3ck#~+^8{%j44Jb&ZS1gh{)Yt?aZzvMw2laO*qqNFy<gD-1?`0M2QT4V|8pd&p5$Y zWUMw;8D;X}ZgzjXgK+*g*61Fm8r|Fc=o5MuV;g~>`dw*UA^-7>RS^A^n?T9e0@W5= z%TOBzdjKDYKU+a;b>SYx_wyb@)$TTKN7a@<Ko7Y&TmoMrK+f&Z<~#5UsUJy^Qt)oK zF9kb67>lCDctwzkg%IKb40<EB0f_^ldvT^;1z;Ad(8F#D@9J=`@i1}-1O3MV2gB2u zk7eqz%%Go6q0llTx;~b~8O$SP#Zfl?y+Z2%g6|s{^y7m=oWjiPQyD~<{@0=OI&>sm z=0=siL!A|SvZSMJ6(Ejd8TNN3uHpdRwgyO+zyHoEYEP8u|8xan$nU<hy7jmT2~>{B z(v_4k&RC28dsKLhEOD$JxdgTuiE-GuqF!BDoekqOx!$q5Mv4CAs>&=W$KmQPGpZGD zgqIIpMHbXD<78FJ%VU0)#-Kgkpy+PurC@>J=%4VwVI|(;unohZKf@U27He^@bQ!L~ z+?W)MbCKVm()qN|4IhIm_CZjaJh(}2d5*;yJqW=<V?N^Z-5+OB%uSP#B0IDF0xy98 zugtd#`i?dZ{RNS$dq&Wouex#P5=QTyNxJimF$y)bS>7A4`$DHnuKcsTApaWU(4Vfq z#v<nldpKSkxJ=le%VN_Wo_VKn$WN{^?Va+wZg!!(IcT3H{}8e#b!;{c{e@}Atn73a z+i^zhr!0+}9k7SU<~%z|b_?0J1jj)`KPs^MUR7u(v@?vcup4xoBX{q~Do#INbBMhr zE=2eO`As`}tsGTg7m5w?yCnNeIWWo2OIe5yOvQdww3}E+Tx7P3r5bZp3nVUZQJyPB zf!$vYO}4KXc^}g5`x(D}*d=4X+&s`eS{5bR<Ngag1Au2{Kj3*i(Vi8hjb%3etRH=P z{HOo0eH<wE*FSk|s$C>sO0xGP!qzHzm61>jLKTQCmJi>Sl`Bh%><qDh!kt?ZlkEl} z_odnA%bSzzesW-{{a)tv#vwo1_wQL&5Xpq?XnE}4vl3K{kZ{Ro+uQH;-EAEDQ(VMO zzI=tMoj*Zg8=D3`x+d8fR}HY|$d}UXv-;iz=cVm0hEWB4xs2AIa0pt)FDo+b8J%O@ z-0g(i>2=qCCe!XXalSDFnfm7^Jj0F9mHx@HO~aXfCn9{J3Q;=!<}1aHviajA3i}T> z!aN2sXWATlqmqW_vTO;t1ed0Pg$_<*XdjlSN?|5Alg=7}zYypCATk#LGr@QW7mp%- zT+A$0T8{2$=cIcjs1!y6Il-|y%Lg;<PGC^yY9aBJiSbaZ2Utq;56TR~XI)1cT^XJs zxeTBEDLmA!i>mR~L*$|HkT4U>s1_cV@JZT3fe<4nSn?6{PnV&q7T0(k@sbSVY9!J> zqq#bUKo^q6AwSjI)c~)XkPz$Rb`{vAqqq`!efYx$_F-S9{uyQ`fHXS<e--v(I`rpa zlKb{#jZC2;`oPYyH)UBJbrM~5_*VJRaQhMY(4MTR@yg4GZ~f4hc+j9G+s?`)*P0#d zbKuQ9hK-CaBlriSY1mdZ9kY)doYUbyPrx8wg#Tml8-AEyiZKx-X5fD|;6}FjmBKY| z`<reY`kM=fz8tQ7L%=8}o6}#Kxpr87QjE7q@@~p9+XvOYVC)NQGB(SlxpqPHYM*m( z4ZPdy@tNzz*tE)2zx#~`jIAofXA_?84&za{-8<k=F9D?EJcxYyIJW*d&MxJ6^O-zp znwqftjl0Rp!=@Ch78n(AAQi-fHNBJFvG?8B_lf*%I@7NLB`Z|uAvfh-h3j795jnGy zJvM=m5PEriC%aRi+>rNmvh9RD3TTfZ|BBRvZHOfq+l;F^+daE%!}OM-379D9A0gpG zjswh8EWIii+Hn-?&^Yst>dHr|3Z)wKBlK9xM2OF+kP1<t-yY*Zxxcer)R92W!;WI@ z;e61!JwPht=bi21&gWsnF!~Y5LvBc?JR(PSu}h=mu2MGRz-Ma_vjA$veuw(1BLJgI zu{;<9rQ>NDoSCHM;^t~FjICg}JaCjbT*!}r!xjK7>~~HD=*%I?Yn`U^{8z7pEw^=n z?>fpj^p_2k*|DE5U-_=nN?b;noAVSGofJ3tR-nrB6*<%%A%#oQxx|ojy4v&ee{CH4 z!vebx66*FsS9>_EgQn%#pUIoL!^=I?-rOet)7>5^FUy1X@IW{FJvlBPUhW~jFuY@U zxxMUc`9Qv%As6=m_`)9cd*(Qhlq=%x0q|$dcKDL2ai(J8Ou74LyEua*#QB*j<4i;T zu7^EbewS}o1rVt!u-D5wdfIt`g@$~lr`?C#SiA-;(~9ln+=ZB9wEYn-V3XSl;mlrN zXwS)|cs{nZ%Xe$fA(f&QH>Oes18^2i_3puh@2CE#^gVJ#k$sfhUSv;z_v<)6$BQn& z9((u6fj#ZsGTamMg84n+0&f7a4aQIZZA6)$?f`EDHTox3)K4DM)9yj+m~u`r{NM$~ z0%T*Qn?zU;qKFFS%5ah0t7UyJdzFAU+_$Tpt?UNDI?h!X)!ZMo|3G@w&1@G-Gp-_R zxh?Da*jb|Qb=an`?T^vuvoF_&&Yuc&om=wy0iArayPc7Ct72N0hibmp-R>mc7-Hvh z2>c|sJk+1a`#k8F`|TB^kPpH~-k(b3W!XUcnWN`}uy%DB3&nJrhj%>EPE<_JH^$3F zy=+UKJ_wyDt(V<FJ}}7c8B(R>`-AK=D^6B`Cu7ZkLwG(^h5RY(H4=epK%b0tBF^>7 z)GI9YSjgaz<8Vl&$fu98JI=00AqMb(PE*BBGw8?sbI6~<>BJoUp9UP9i?bX$*dEx9 zDANBrBs31TM}!F1Y4YyD_AyZ|OnLkt#R5<?_T$|3$a9?a2K{sjg}jtY5u^Vz)c>V` ziz;Xhft@-J`6*1&!op{iK4H(FvDXBc%uPsl96oaj5z&V~Oi=3$`e#O{jAn}9FGb#= zKNpkS2P-Mx_`>Rt;-_^J^%JY3PNHip%&NF`wEegEn=pFQk}ll2d*wyL>_2n(5!sw= zUnTbrw}-h2ExSk9gMx{R!N@LnLw6AR9!JrDxEOvUIWYcX0gNui{R5#JR!a&&01$?* znQe_T;)=Z%u-8F|#mp<JXSZZW?9y(>74iLvys!>z-C4M#?$p|*x&(X{AideFh=jvE zIVGI8bti5)xEa;R$Zx8nM19}F&8d^uFSbj~vxIR_zO&e#(s=?vyN5??-QogFjf8Kn zb;C2{v<f@izA6&l*}d;5H}Pb7U4=cQ{i&2#-smQ-m2XzqYg67s;dO4(`|{)^_Be5e z+`Yu^&^sgok?@vq!KiRvLHVYww^xO`6>fDQ?<Z7sRc`EI`L88*w=Qn%DU?#daJYZ? zq+<t-Dkv`~508-DEA5f(2Z7vaF5@9FMAlZ?y~MxduPW^>oxdRw5a`z1jYZ*Zi$L>a z#u*YJ`Fy24HuV(Xj+L&Hg;n;p^lQLNkMi0j8gz^NOO-vi%TCQkb4c6)5Oq^V!`vl% zEw$%~hvivI?b&G;_yrRZm&kXP+82tuW&JX{qu3|UTV@xD-^x3d*~h2;)e~1pye>Ob z+ZT&uxvkpH7nb~8wcT5EQ?Zmj9{E6j+2drpJ~W-`E+d<=JIY-r+apD#eE(#7K-ztg z@b>WS)h=s+hh*<l?4jZeS#b(P^Mc%Xik&@gBd~cOmqAc{M)xde92p)_P+m*|i*65V z1b;_v!RUfUsM2<{((s;JbOVP1+gjn-A-_At&J(xGt~GXcr@N@!87N2cKLaeq+9`0a zoKs_$cN@B8XZL<Ur+Ez)kl>E(t0})K|6F4icb`aLCvCaiSm0&^hqi|MKz3V>dld8K z%;i}3TPjyCw=26xsnlAOa<wrOT;8fwaD{Z1+XKXvazHH#Z<l4Ywv~28YnZF$2Flz^ znH}VlwRTa#A6&dOe$@L~7rS3tb@0tzlVj@aqr3m}5Kdlc4gNRcq>J2HYqt~M5j&ld z+>Q|nZj&FKYInS<-cA-fWlFt0DmBihGG?MYq2BJ9l!kT)7ed$b<bn#@mN(Sf{lwp7 z{0h65{HESc67N&^sMIe=H?$PLmJ?Rk8}an<ODpW|-IeTz4|g-oVzgdic*OAG;StRt zvq=OdOqUy%*<AwW5YpT}xwqHqj$>Zlsye2WXEoSk#18p*gFPw@YT#>A^B&o;(cU2b zEU#;{$BMV*TaEU(l#e~-Hb0d^n(X65oV>Wno+_S{uQb_@cly)^fI4`#C}e&k?_X&* zi7Gj0mAx`^od(pk44o<OU1c{-yc(qnm)9*>SySm&F?6j@7@;jbsfM;|EX|?N4kB0W z+QU%jR(a~F_R>rkEY~P$Y>m`V-OMMEA&0NBbL4>4=)D`{{MGis)QA1pACt4!pez1S zp0UP0K7qPdj}fqEk#p@V`N<l)Yv++7aPf3>nzHT4Dl2G&;aaQ7d@Bc>W?O+cQ%*e1 zj&$e<a;+JO%aPZgW^d^k(Hu61;>J)NmbgPhC=Lc+w_V(1S-I9;7r}55OR9<CMA3R* zQ7zNBl^QyhvPSke-M)SxM7pz}C*9w6`HkD!${NMpNa*xH5{kP;etbGK^-kGs9R}ZI zx#<jav)Xm`5YbugSZB`?{pA<y>^}AopZwyF0rhZEIBz7hz3dW5dhQwaF=7@KE)f;- z`7`V(qCw_G?K$E+xiV^pJ6}mPiYb2luYv6}m%;e!<a1Hz+Y;Gxy*)h#4W;D}|CpcX z<8t$QdvN@jXf2GD)L2JJXT6=5c~F<ovWWjc4m#7GDZZBHoM{hCQ$t&<#_<o+*x9cO z%wd_2rGz{mt%M#j{Ve<P-k$(-%+$t1?YD&c7BuFeM;4STOTE>tL&9YF^jY@NsVDjr zI$?p#INP2pR><nJQN3aE!L#iX#1xr*j(v@&mA^U1o{r8HI@eyEd0pEYBy5wL&b23r zZ{@4!+Cw_E*ZIw%#Ee$$mzX8{o(GHHSx!68&ORoeGGkpOu_tlds{lr+x|YWLt+y}J zvQ6yoYl6f<a_f2akPhPj52@_zo;T91SmIRqkMr!lVxF`&KtE2FGdI9bS|O`8z;LgX za)Z4r^H-WXE&s&pWXAdS+~K!_#IjhUCpP;j-c6+Ru#?!*x>Eb)_Vev>@ds&MU=K)t z2AMv0An^rq2YSdqUTP<0Ccc48zax<NwmkO&`?PM~Qo64jU>8(~Mmsp6q>#+J&~8Y5 z&d<|})ato%|AlsDVJ~FpaVx1W$&vLPLUcuwG$<05q6xM>`64?x?O4^#v{EO9WzUQ3 zX?gGvcG8n7y3Fj>Q1j$f7um<>EYlKf4kf`Migk^oTA6UMJt23UPpy*H`vK0Dr(A4L z%e~AGfWGFjel-DfmH)Ze9++`+Tbb;XQ?J4uty3<syNdhdMVHu<p^?KSg!|Pc_IA-M zuiI#^7!Hl|HDkLhAN_XO{$@;inq(a7X-Ut^376VK($rY%rT$HBywskUI@*t>M80#W zJy1-R)+QU@=pu0!a0iRkq+OxhvI!4<Jh916Nzz)}?o9dQCOdb;`AV!>o!VVY2>K~2 z2(@o4R=OW6GsY*McH?EY&9;3MTuyiRMgx<l<ThA4-$2xEp1<IUvSzd0xl@_H8kh@s z_M+WVxnnb?9JK_2K2@yyRJ$hm5{l-W=0}Gn-V!cGR~><R%N19^3U|NEzFO>&`!BPH zjxJ#CVY9-;!}G!?0dPT{*2LsYAEsoqkEg87q2vz2+$RTKZWngRXXVp^NQQ?I6K`@K zx$<&*R^i7et?T}&FTWjGKb`Tl{NQpJo#`_53iQwUq~nWXCL_5_PQSu#$XVkRNIo5y zv`CYq^3^Nsexax^kDDvEHDHOZ=t{dPazpE`k_>J2yR6A%O>~b;zEdNQF_pYWK6RxX z4&5!xN2fE|e_vpyW+p${M(dLwC#|0*E|k|^WnU-0A%(9Rfx&6Jiwoi#!qc2a*i8Hy z@q@ez$_sfiNXBTB7Jj?Q@>vO|cb*)$5w;-hYC9oxj4<Du!aNMQ+Rn_GsJU$prA+Zv zBW1d*xY{0EJXeirvGz<!CYW#!=mJqO(_FcyWXOlEwkL{0ne;1rKr|-N6nNuXwzwWj zIDC|zqcy65s-S#Cc!6)`l>)yc+@lvJ1sd&G>b5b{m_po!dxl5URna&Xt7r<@GOu^1 zjDsyB2et1gHNQArV>_PPO-G>}TegJzoDN)?A2?Pq=nCol%FgL<GSSQ@dNHo*WZz%g zb2_1GyK_i|vD8;~qrC3d_JVG=wyn>u*7eyfbFZ<p!+SNDR^ycWTUUrY4>ek<Dk(d# z#gp+LWYaZv(To@U&G#27(OYQ;bz8r%{s!FYK|(EuH$fgkrDqF$qW`;m{~Ehn8hV{y zw4cdN*V<(rVOwrM<zc;MYpJAG%FWl>9ksk@Om_*S*2#OXg(r8qJb0}=Efqs~Y~)Ry zD92uB4@o`2pEh4!a2@6d9a^5c&W?)Y-mKb-s%pxYwoKh(ZwN#?U?X;OhIy)4W{x$- znKQ99Yn54Vt}v&YXPb@YIoL_`H1l|Kp;>F5XD-Kv<)@hI&8g<O<|=csSz<PsXP8m! zFTcQ?WUez8ndN4+xzcPfOU*UrN#>d6TyvgTgUw#2nd8k9%~|GJb0Ri%tuT)>r<kkF zC1&Eu*f)K$S!ph7IdQvPkk+v`4d;2xryAO+AIkIZf+sRd?z_t_wot*H-A~UWk)0mv zO@T%7%e(9+CT*t1DkPs3Lc6`j6<a`(TJ*uxni4WLZw-e6aFe{qjoM8K>k>O;${xF@ zU9;Asz@2jR9*m&Bq4`G#*}TiP1A#~6C41}}#5;1}Z|w2nbGha>_9ziA_fjnTs(Uc| z=q7vLV|UK$?;{pGsx7hLU?NtS92~8w1xFDzOa8INUL8tr4h84Sel4~Iw_BlG;YYXf z5Ok|tbZ5rUt&gEQBj*NArEaZ87_D2u9kTYq>|7b$Yo}lp<&wR2!ITHS5B4GM%33v* zNP|!8%<r2wJTFESleCyI4?flM-Cj7mS)c6eHFkAHWqnh1UF~pJ+QCoc!h7wzM5;{R z4+pfXoV4H0i7!H<b;smmMl}SUcBUO?Vv2l}ykI}3AtmzB{a9|9(em|v`)>l1yjSkG zyQjY7BWS)NlOBM{KF~7o0sG{H=<Q3ftdiKhD6hH^>eZB2p0}#Jrg{mTS61d#FR83; zs;;WWW6t5kf}(=PABWo-4mbCOw$cOAm9?wzc(jN+bzHL<5OJqX>s?V-%g-v;H5Am8 zFRqlo|DBz)^t*}8*hJXuzqZ+IFU-QVd3nudh6r9@gqux#E^Z03JBZ*3^O~`9a&X+- zW;06!!t?Wb_Ns5FTvA!pE5BdG^6F+YM~E)-o3Tx^$f;<?E>I#1B{~a{S=nrM5hAT+ z;^TH^=SV_eVY7*kU=q0mku<t;QyBExiPX<$ZURAkws7Ah;wSa~2I8l^4erxK`$-cw zMTo7mJbB&QcGrx?5@IL4tYlNS9?hmLQcsgly=~`+_VVD{_MoaK>YL31k?;r5E))rO zO=&iZM8e&3x>v5oU$fau#6L2-+3YRiuSHfL5myK*eMM+5^7@HT^SHwLm5XbtEA;Yd zvpG<NN+&d%gG4BIvO+Ofn3uJj`Hme;g14IRZ+lwyRbf(%K3;bgm+j1-1Ir=1{l~WB z1ia(zVfpa5Y)jtwZ+l`o2#uKNgT7OK_iuY>0!9mHpqa*yb3U>M#r>WW2u-4RqE-H5 zAK7`>I6Cx-eD5QBbKEC>$j@3qwtQ?4>vVw#T|Y;6u0TeZNV&ErSvLO%>s{^T8~?GF zrsn&zx^PxEm4%ho37^=<i_vo1C-y0+WBq`mWzMJe(BLS{PtNRuwaKoZ+3n@(PvLZ* z;0K#6pZ?Sy7M$e+J3%a$Yd*tlwNXC(ncWyXJ*-gRgOs0RHEpdt|8sjqaFb5V_yX%I zm&#FJ*yF?v^4u@%3sZOc3G9%azqBvM+THFi?fIz>`?L1T+^_8F^gsI3ez!9*U;h3p z-1*w~71j}+kl%cTDfO$qjvM%!9Q`#0viJRIA5vN;x#es0eN(N~$q&EABsD_@zp-b? zlfJPFL`ln;-`M%d@vZ~cvLhk8A{7gdiB|S$37@PXO%LR^Tx4ZGnUu3?;-+qk^12mu zE6T${bG8uODsV-=%4@0bo_)ZaCeWk)AwmuFF3;PHPV+Aje@%VwUX`nxDr*~Ixq2nm zE=rnO-c+#+-9N8xRb>MklE%Ecsyr8JaZM!>8>-7|o8;!A?5p}cJimL7{ATlW5t<79 z{z8PhPir>66rps)z7nAnT)q~eICPV5g!z>`u4i`Ppi5?hub>FNHf6w!@`mL^vES0l zrbSKVOOb)BD<|U`CxYvy;~Fo5-Q=#G+4k^d>kv&6!HPAwwiCgHbWIk)rsI<N*`0rn zMnb9x)*gpzdl3v%`7{_G>GaHA-}k|3h;|i$^)ru((XCopQ?p31fV^%ZP&pCT?jmra zyuCO(TRhV8yW;G<LlZBYiR9;mc|*&F^6XQ3wCg;%d%@IA5&XjPp;g)TP`81$M#5Xe z5tz~Z9u0M;suK$K7sh8*xDF5^-WY?xKp|2nVNlE1bF=T6Bm2FQy;^?ta`sU<%>$O; zRgubu{`K^tN+m3?arzh-U}J8}L$74Nl-j#AZ~Drn`js&DwR!yBNnRCR_UMC^l8Ty@ zOQ`7@R>JNtuk0i5JeZx`ZE)W@RiJN0-SYaH%BIS`D3;jYL(_7@!R&L3Qj03em)9Vx zd%udUrFkvA({qjs2D|s@Cf9e!8JyfZzcey+%Jf+i$4{KrvZq7Nia;_M?z+N$<+T`k zT83FUPl$>oxJg!xr{(JK?EL#%MdsJfs3Y7Q?h$EN8WCbmIMN(0h%_{muZh$@^9(Y2 zMH-tHEvu}luWZ0p?-`V@l9rd(tEBjo396uke5eRCR#s-`bc<#t6JXzxHBFT@)r%XH zMn**Dp9r=mr`Dc=gg;P1A4;e%uQ;WADG|whH5@4^C7eiZj2JT%9}1`uukoNKGy<rc z2n;HPOsZ>}DjRCcYsS@)uA&kX!ZMVTb8K`Af%Nl(OrMVI2Nc7lB<_d^ECsRVaDM5s z@`i{pp0bKcYsgszk-*q+1dQ}5U0%JY%Eg{=Geia`BsRqolinv%MWsNAVL2i)t_Doh zO+o8}-**Y3CqXQ)Zma;v^<k=HVQF1$RW(E(2rIP3h&NU@HZ86}(m$z8K`Dzisfft- z98=y@-cVT&IVC`oOU8@^jxp6sD;ufiTc|k!)niOeO(ZHZYZTG3%d49z>Xr}}i&XAd z;xXZERr5kb%2%$Ah@>YK{&8TpwtP8&#ha@3g)zDAW8_5>${Uv{2F0C<!HML^pzT)@ zf<6<Ko>x}X$Om$B;-ZfzD!p}TT>~&Dy-kq4+%zoRM?||miuy#?gMoa|dL^Y}#*K#r zCe}6`H7H`7?ADIrLk33-MXzv5`SQg}$|EB68bzsK3cWZM5hmwG5k;Si2;&@8oBSyd zZX~Lt)N@K*MLFpc6g!1#Qaq)ucByj9kdm%o@~4(pBR}&?l~0jH<qf188N-O-9#hMq zL<W&A9fS6s3Zt;Bye49t<nkKrsV#Oyq|GHH`BPQ<i}%9NyMn21<NlVg6;A^@t16+; zz`0)W+hh9TlOx6=7hBQvdTL10|KkZ);dH#XM$ifMgsrDGn~>)hgs@=7(PX6{4RmbM zHUKm#>CC6>B8swfE}(e+jPj;sXvov$*`0HWqt&X;GZcw((y#bYM5S<satuNATE+B? zhH5An_y)lFicC)=)i$Xjp>?b@oK(3QnlB(Ng#|EGh)z_3?xo69Q~RTK^8gYJ_f}~& zZUeVJSM?ai1hGMncKC{tAfZT!e^uCLVG38b9N2Fo9(&DVlM8<~BGQjTYf-=HF}sok zeVG>S>}nX`YJ!+WIHCo!n_!dxaUJ34IlF1eA}AAzWPYVot#Eb|>bW#x%%*(AzyX>j zIY9}bVD`$zB(#Jzipj#+c-5~0(rv$kkoTOuW_eRNhHGFuPl<8%8i)+4i|Plv5Qoum z#NrxQz`4Ys!qQ_783yrzLNTYZVR?0JRUItFI6~2TPD6QZV@*X(c_Y|JFH%hQauZd@ zOS?m1DdsfQ@zSRfE;j|k3)FOhl5=r%4(j6~OFc%3K&2>5DYIe;O8^uRDX$REgo)ar zsi6`zOL&L5?i)*+2vd!A`#aI>6H8T{DCu3oSVW16vD8_Y#1iW2A;|U@f&z^T1cD02 zU%=RVQoN~hH58)VSxPYT${T9YFn|dhB#q6VS6PmB6c4wo$;&|nr@#2f8BbQ+_w<g8 z(X)Eoab=5qqFc_Qw2}L+xM*c#UhaUTs;fRYaoeNvnC>}8r9HLjz<^Wgw#@9aclOka zx3vtBr+3fkotFGsdFr6gCNI76)sFL?e{{p(mX_{0{X|-aJr#p?I&Yt``JP>mR&Ln$ zx%{+8PC;7Qfz@wcw&#O(#h=aSm+w?BZRwSt^RehX=SJu6SLV*?fARD6p#|3rUxHUn zXDFv)(}3;AKDA=({r6q*<|p$4=XOqbS&lEvS(i3x{J;0b4_ckDI>l~I9rVmy@`b{j zchgEr7rb>}oOpZdW67^>cw>22`D9Vf>a_izO`m$}f$Y!kdA#Gssq6l-RnG32GbU|9 z$4)0+;B1)ItFh^%vgGoMT5j%{^O#6`>h0%OS=THM4=Ybz_Q5?vcDAhTl>^6Yea7@% zmu<Mc?!@|+AH6rRW2)TLJEuCW;<Keavq$!LPtN^yx2_!r4`@m3lT#h&wV>yiDKqAf qpEqX8l-YEhF>B&f!{~VZn8=)n5qz=B>=UNq<)wtx^4fkm_WuGcKB4UZ delta 291844 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 AVgLXD diff --git a/boot/ocamldep b/boot/ocamldep index 64bb5040f9c41cfdaae71181a7dab18dfb10a5fe..f95b73c0f1064c26d816ef8e39148c4cd7de9e4d 100755 GIT binary patch delta 137477 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 Cw7TzgWmEAndP7K`>MNw1;PBFw|Bi7 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 delta 128355 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 diff --git a/boot/ocamllex b/boot/ocamllex index 82bd72ddda2332ae1a33683d10e6ed34b7561b30..385bbeeaca889938a412c8d7e8a1cd65d75873cc 100755 GIT binary patch delta 14048 zcmai44?vYwvS-c#<tivB2zpU2BBG&zLZM;;q5}B`3{y)J5E0BjkYLhkK}xBKL4M^} z+Dd9+=}YWdpB1~YtDElA_oS^}?dB$BySZsAm6fgT`hN3qFJ8#^_S3oN&YYP!XXebz zIp@3l<F~#4d9?Q}krA=QCCdwAi}K3~iVI_JEh)`k9-DA$+~`|J$1E!;$X_<HXi51< zAsp&II7*%JF=kG<)43rktY5Gfp2y__k1yahz^z7eQHZf8X>aAx>({T_K#2j!!@zr> z^`t%Oq6rTHa=XY(=z^;*`00Oj9^;i8cqP<%c`d&|u<-OQxNjHyhkv#!906{bkUZ)i z*RM<Kp5)su9=Bm-UGOyE#a`XLyl#h3ESLIFIPEl+-4RaVM$H|S^nu|wA&KIg852Iy z#`_Z;#`VcT#+s>d#_4-~joOKmXtdEfIh;SaL;D%mC)OErCOM3QY5OR_s7nhsk{A0r zD<|cVv1^J**3<3I`YBFtN;K*R*o~5@8)*y&tfvrX?`auCW4Zo4iZKq(sCIUr(HcVI zpgPjobMacDBx7SyB8|s-<r?#f!;GY22Td>>#dhcF;wo=Sc3xSwhm8FzruoRaPIg{g z5lJ+~2q@h}>CVQ|5;A^V8Dzw-JZ2m(3o?3^H5p6GgN*BA1B?r0RYuvmAfvK8kJ63S zayve+m9KYyckW!Zz6T{6j;b9PrK!p!BXRvC!(3No9A6*AXZuj7v1?tZv1a`=qv$bF z<Hu8Tm7nvw_2s0pyf|=%8sJ?2*ky0ZHY%P-_Q}Tl1{tMKh8X*w@B^*&iD-)!=0S_w zoP?fbo8$3Wzd074Et}<`MWt!pGFaT6nP0SZg=l*&JYDK}KtB2!HvC3NudET!Gk$ zEzva7Xxp+z)IE6`pW|y2E!F@dr8d&oQ5!(n+&D#r7zc0nZAYDFY7?p5;^E1dtfatT zfJE3BfEeHaL;<8v9DWx!exU3|?`mJ;>QiEs@78F1#%-0k=UJb1TkXLjnh0>Ku+$mN zTXXz{BFZd^(_!pTl;doA=0~Dg5|bguNp{fPTwkZAa>+au#|KX+U!!FEKALTWKAVeC zDxRHZ#5@;doCREcHqJPSHu<?4BWs7yO6guBd&ieF&ls~a-S}>2g5lhmViY~^Fm~+> zGNPYPp#?_O&T!|3=e-F`HNOm}dCmjBj8~LvwALru@-VjrfceJw7wksT3jwsynD#<a zW&vnDU42DphXKS<;*>=Ici-Lk?%7ueTrzI4t1U8GUP!bRyRaoj!0uYQ->Bc6Xj=-J zjJ(pgw%cx8-5o&74Zl4}nJYkZYnSrjslCLbPvkxON`cGB54hTu*2rZptlS!Tm65kM z(e@x{GV-sCroDFK?Y#k1VVv5Vl=%>7?va0w@1EL!;n8=bOWzvcGV)qi`>>JyV&d@G zz)*g?q}qxdD4N%W>k)vA{w_f9N~7_`JyhkK^-`pg<=&Tr&r|!-@fq~;Qp$E#y?mX3 zRPDDTCU)*GqDKwy17+x_IKb#|2E4k1Xq|E3U?Qz|esK^;wX^C_Z*O|cS@(K_qBvvB zk%Io!7)l<0fDFGKAVFDe96pi;o-5Yp_&4QymGyb-%_Mq!>s$7L8^D$VxB|Eja1J0d z-v}r$0$vFTv=jl8r(J2@Tj5k~RJ~=lK0}P-Zv{Dzzjcaelk@4OgFf^GN?3?<-ft6# zHaqK%mi43>r}ydZ3bn}Zy|bFOaD4)@Lx1Q1Wypu&I`~PK?%~!bt~524{n5Us>|+{O zce7s5Bwn9#*8S1mjkY=uoK5#3!y38gUyk_F(?;AryYuYVUl2XRsHNdX_&Go4rAxrK z8FdrFo!@=4ue)LX6l5Iy$=67`8st3rQw7np#?GJY^qe#A>SiC>@ytbv9_X$oLou8; zK%O*!I3wANBkD`oeTu`vxj<2C#PcA}0*Ghjkr)xregqJaTyE7APr1BZQ#zU(SUjhD zQwB(N-n0gdpAQw#FQt?iw9EAFMwd`vxXMN$+|x$olw;yMf}q~=Cnx(+70u>mKeBV* z-W0@_{HO($ve};)&D>s;jAnZ;=-$miz0qWwb-hVbgoLvcGD#4z>|ub=LIG0xX7k|y ziiYkp0c58=d?kPo$UH5OPV&h<B(=(q6Z_E9T+kQeVt;W^_O`xMpkA`}lEF5&zp}Zm zFEnNIk@lvwFU1e^9Ns;2H}}wHToCm1XaFu=4WG!Vk5VYV-j8ORNg;5TrCUPwAkPn_ zL~7)=P>Q5Od_=I<+A*hK(Y&-j)o^SG`H{(fAr#5Ajmp=&-k*YcapGtSHDiX6Uk{#| zfUjAj=^B|u2^2@x{`@<$>NeUDP4Ajv_ffcwj$2;$*BE&+KxS~l%v+4L;+zu5_bjH2 z?)0C+Wrv>-f-!W;+*v|v`l$c%;!$&SKaO2T2|oV~$==(tb%<HHjt&zwaLwbC<$oIF zUI2-i2Cl27Wd9c7>>!<~rjNkv*hpzU;vO4kk5G1gXFZl6=5fk%D|!!oT@?MHtD<Bs z+dx5(*th|~(p70R*KVY>^gjD-qCND1*|>?;c+-dGh$pF%=zq)uwRDu|BQAZ4PIKfo ziZe^L(qT=1<dm%x%UN3~j7zpb|DVk2ZM1{9XgerL+i3)yVaIl|o9nleFVUa5=2^PV zKR!o8_~3I`+p}Er97S60Z)L|0h<?URJ7`Yu=P*D@xOiX6z&U^)2b5B{nZA?u_M$KN z;w!YF|6f3tun7i)1EfL<|6k3T{S@iVeP5>_^XNg!_M!6}^g7Ms)2~w;?~;$$H}G*C z-{=Czy@6c4$Q5r;EPc(TufwX3-k?zWJGTkx5<5&<O>Mm0q)YUTFvPI)2t>a%zc@m* zin)ox%-Xlb%FEo^1o?w+V(3qr$Xg?+Ti>BM$mcQ5QcS)#r~QU<CD#uerMJ-(AHz!j zV5a<zY6)B|?@}7kkKFbvcrNw?1$fgHGvyT3YNTk(X|nhC%&0*ycK|>F^e5B11=FQ} zaKd}El&;FzwFm?F{sHTH%{=f2+CcPAGvNai9{QKL{X@cG=DJz;5oLKRFXGQWp>0H5 zafVj&>Oa#k4*4_XDQ$HO?Iw=(CVrrV2Jz89Q!)9NBR)mZ;kR39h*^6U%T3+QrdH}s z%Gcr>%wK*+VVHpT=co!c9`QLPGJlQ$Ui~>a0(;_AB2ym%@B#R8^XFu@#_=a3uxOAG zJHoG<7}ksUH>EVd*mc?0w4WnCpWxmuS*hCYC<);4=gF=Di4Vo9eq3^%mSOBO=i!PR z&iEUA(1$Pn4dpZPD+-E=g`}7i1Wf^GWoP{XAkLLolD=S0`3n52zoGzM`W5O*2v>Xs zJq;Xo0Y$!nvoBEDz))zA+A67>4gl&E;lgvw)(c2E>dzHlV`&EPzOQkcvGWNu!C~N( zF!u$>a03PB<`N9k_wRJ9KS*A(`Abm{2MNz0i>Kuxs!mV#yF`~N!$FZG80F${xbTrK zJi>*`?kgGwyYMI%9_hj(T=)<dKG20nxp0||$Pabl!R`1&uV@z`(8Vy!g}bwHxC@s( zNEF=S!rdmta8n!E19Q+Nj~wj9l{tLA4GTB#8#;W4cnMOL_!xZg#K!`6yI*wp0U`jF z4z%64s#)31^lzyVXD+_-ofQu$-%|*%wU?0#+1z@Waxs>RIQM%jZZ_9^kLd0oe(^ow zvciXdK&i;#YwgXXAL#<HxGPo@_7kNKmnn#44p%EngBe<nOeq`S07PxO4|~F%pQxrg zjl(%ZE!8Rsaqg}9nNDx@F{$zG7$4Uvl(T+Reta;Me9hC{R1MJ`Jl_{}r>{*->nBc4 z!x)}knM9mAfckNzO$EtESSSBVQcX4w*i@vZDQ1hGx=NJJr+O(|HO=$A)Jb3KM%JC{ z7HHh%R{8PS5H$wHDKu1t%aJzV)etkQzw-6z-(e3_N+!x<*~z7Y6iz0lZ@Aj8RXQqy z4-GQkAFRS~4C1z-Dhmme60JglGcb1v4q175M7)8QMS~;5Y>HO%2m+zQRg6tIC0hn_ z%P^H}`x_4C!ra~qrsm<6Ou#KLgfe+VjQWz2IcS7RL^DmAJGpv<Iy=xa*d$Ji0a67- z8xCP3RScH(z(}<V&9qxpG)*<jZ&mA2pZQ8G+Syz;O3lF#=i8f<(JG#EN2$2>o-Er8 z%v6+F99gz3H)?_tTV(F->abaxpjuEq6V+kvo2d42$XI+U8G~<S<M8d|ShbJla^CHj z%spH`4wFgdlq6MxrZGw7M%@dgvXb*$?R>O$;0}NsWu@;vGhw`nBwE08?@%!+myFN) z51>4*zeA<*t_dmtHZ)Ga!J_vBl@hoR8e~TiAGgmwZ-Pn=Ech82BFTY^x{|jgtMq|| zph^x(L6z4)cLPM9MCoE)l#JQnAd(E9HgIFIT1pLOSc<Z1TM-1?2Te({dW+kex-=E( zU+mJ_&d@A9$$UNy(YS<nPEyIi_k%%<m-D<lV*FBWo1|iR!z2|%%i7tN--K<2u;o$- zXHQnU{7b>%4uwp<Hd)07J^+&FTj^@cI0f$~0?UE+0r`fvil-<i<`tH%BKxgE?=bYr zN)!M@!GkzIzBNFtwi>E1Ytj**wuiteWg^>Ln<;_&3*LSwYQY-*;7){EI?tVoP{TWs zsp>~G`=+V=QIanA0HiGf$Q4z#332*!fO`S6IG{k=r51V3<3-bz+z<9nhr`!$zzpce z5q}1VIb1VC<?y8$$}#Ezs1cPhB82BY;Bvze9Fz32cj<qh<Fb&R51Tbv2rmCez~gq^ z{d{buy6RsEl57mJZmamzU24Bi6-Yg~E=Ps1k)w|Ao>^*^bqHL~(`Lc`YHpqdrH@Gy zW2WD&T1h=j##2QDIBkwPL64h$bKydqL#yvm@kCYTk$Z7Up$%r!Je8<=Y=nMs=elmj zZ~Xf4K^ysT_yR=wY%^{F>{grL{#Ap_&AF<y2M&SPmMC1E&6NAqX&cfvpd8gO&h%TQ zP803oGY=wQH*Q<4a%dyZTCFb76P!{3HJf>D1%|KT#tO*in3pTmK}B24y=x@jp5zm2 zl|i-U{D<N34n2JF5fy8z!wlO4c}OJ!c_UA&RLSZo9C}Iza6_dUhDB+qR6EpGG9p&? zvkn5qut+ME$Vv5*S{rTDT@EpwRVdAnxcDfX=ej|LuTy>)o&(omJ4suI0~xYy+Ikq# z!1e1@B^pPydK=A|YKs{67+j9K$z#yb!22G9Nez7QF;!x1XfjwNK=Rr>fna=(0CeoV zT>ZG36Z|x6yC39E^X0b3RZ{RXH|<K<fUa%mTKY4oI&^X56Ubhiqc*5LVrBIvl@+}G zrkaF3_}QCkf^-gVenQQMhVxITkI*!4Mpor;Xbnt#j_21XIVvBkQJc|ZZ^1s2!}VLh zvV*T|QA-EP9Za4Gz%oEIz-@X1S3POD@63~^)eQ`1#&Tk<as-RiO}4gLRL`B5sMLh# zUF|QqsTNDIiv#LZys9UDYOEUIBOEXAqB^xJaJP$bkE`9wK~F*8#dd+0+6CBrO0@+x zxLEeN+L!srR&~~Tu_a3>N?$>j%wH<T4}jUO?^34sbF+asIAESJ)Fo2?LHt4j&JwW+ zxK3Yq1}WI%RY*&YA!Z|r`kC*uI)hi<+_+Qabi7e<Z|7136+ko}WXJRBOVua^u%8+J zOO-(WhoEa5`o;oY<Gfw!y8)Z<Rbox922wxeeSwHOF<f!Kky7!x1Kj=>cF7GHQPxJ- z-J!aP8|#(5(33?1&3$F|q)XVkFW{c^C7`>@nkQX`lqtB=GMVFEKtbKar7x%ub(na| zZZ)94r-Y1fV`9y_RmeckZYj0WEw>^`vn|~A0_wvij@zq3q}h$S1A|^v;oN&54urg0 z1#}ufOzS)V_&?sQlK(wd#vV&~`%v2&P@Q9Av@gH2SB1G|5ZraHGRI_|zZcV4+MxXY zEnAF>15N$jn~i3Z=#+O-hdAs-6?@YG4{_d$mQyyiH}Hn&J=5O!zNBJ-jd{sh2$$dL zgm{RXU-ED!EEGl$b8{P1C@2*TI8<!n?F}g7TeztKhsI5Oxk07bUPqvc$(fw8uVePZ zJ)I)%7Y?CG5JmtxXxy|<t#J+Te^|EcWo5T@DBOnl0KdzK=9g8-bjcNoe7X0^&RzhJ z5Ofdf&H{-fp$WfCBnlwDT?FXh_tZR6IDOIk?=)K@an&m*kcYVC6>M(Sf`k~GpY-G0 z{mKEnYQLIl1)OA)B&$qIHUtsg!e8uH$phZNc=F=(1Ax>cvjgYp2h=UM3GG*)N&9QG z%h0|C5d0k%z1h|N#?}7T+<8DY;Y~d4AWq9i`QkxUK-Fe;qio65Tz&|(zM795Qk$cy zp+`zfgiGf!=n&6%*24_0e+_l;4sJrjyIxbiqmJK%EgE7{ole}OZy*OakxG|dLwfut zUlVmFIn=4n`p5))j5r<QUx;t+q^)MhVQZ3kuVcu{!w{?Hn!^ZO9E;ur>GWZhU^|78 z#Fv@u_d2$KY6iD(Y<yi!9Vm*Wyh$~bI1rEhSBF5G#c77Vf&DJR(+Q%_^ZqPi|IPI# z4hxvn5!Ha^#1U(>us5xy^i69}%+7ATD0SCVYo;Z((;Z`uc?*o`ocGqxEIaj<nq%vj zFt@&m>!7$o9+^N(hmN^#t9iEffC~8!-1N3evVIv6?noE+`yJc?O|tM@ZZ+n|O-N$4 zH>&^+|Fx<@NBysH_^Iak@2GbI|Hq~DBea8{$(J3!Mn#+2tnv^$2bys-!%weyldy_2 z$(MT`#VMkii;t?QwvRgoY&wdw;B0O?ij<wrzQ<6LsyX49+JM)jxWU;u_c&zF9#c<4 zXZi1NULD(ju^?~drtFXMxGTT($=XRaO5V!T(Z`MNVw46x@vbVPKk@kEDqJ;qaYVfC z$7RRW3H1r_H^piw&&g6@TzNv(;YDn~@6}NpYd`osZaO&hCY)6J@kX}wq^hM)&C*k< zth+i(#>}sWnms>I_{H&%8StT6?Gr3@!G_V@(IjDVh<E-;t+u*klAXJTeWLc?yvscQ ziCUxj%MDF3O~j;41IVJb^4d>PlatK@pUO*yWIlBkK26@%s^V=TW6gpcr}26$r&VpY zeb(Xp%dL1B@OcM1{xclL&ap#jJ3Bv9akeiyx-Nc(w+MgfKpmf}bpO8sm78OGLdAWn zqRkzjs~XKG|E?UI{#R8M>^bF*(#mK4ih6#?ocpCZuJMA|aRFEJ=eh0zYU1;J?E>y@ zpK{ej6rxYr@ipFnJZ~0%jj&XIBYyNYybGN7I~8PJ{kz&O#y;JqVtr(sL7bP2H-zWf z5Gu)B@eKsO;^uEuf&YcB6HNlcvTs$9|3&n;Pa&CR>$iwL^>zEH&5XRP;=1+N0uI?Q z27B=XPa!ley{mkA^FP!n>~V9iA||%*k*g}n`h83IA^-&daZDy41RxIj)C{_&rYico znfEW1qX%AsUdwT4C5YVtEA_CATS#Z&g*jFteBihL59fEni5IO(53^l%^YK2V)98D? zsC0?#hYso@tykNA>_ETJx^m<dpmH3QRFRQ?0xpHY9a{eYe#1X?-Z~vWSDGJp(~08x z0ADTdRH}S+NT95MHy{EacEy?deD!+5m5@I>M?-^SK$8u%9yej>7ye$>Ycf9AkGk>5 zUV0qc{j?vS?tzcWUOLSDv4_qeKG$34@h(3-2CiNkpkvMM{<?yAY9Day=mie^Hj?6} zb2%+Qcueq|Cgr6#)lU!NrG0cMh-dofL|ig??kF9@$-#OOzE=n9InouZL$nVhyzE9x zTZq}aKh#qW{!Sx=cMZ@(lv2i$ut9uofDWUr+w3}tw(@wpwvXKb8{`q2#Y<w7JYwHg z>sx!D)OXLm9cG<f<L?o+^09&XeM@Hu9~=brJD@&<&kfSeYOAX-y&W#Y^2g!&ZCt6I zcIZeX$q|Q6?k}M!kJJNso#H-%e`*Fq=>6WL&88@wqmV@b!*rT04lEL(ksLQn+dF=H zjN__dFe#3khUpkI=Z9h0+?ct2xK7tt<JJ-S9Z>5>>Kqiq%Of>@;o8FGv3fO{i?N8- zEj&I>9|x=VC@t@pM!?e`!r@cV>;<v^r<kzBfcQ%an7eo+n_rBASysQ;<jw`jBk?85 zK)gn#nN{&RnaG=)6LhqX4_3^NOEcjxeVeYska))z!uxO20fF7nCtH$4q-e<GQ@82O z!@Gm*8ScKorGnai#$I*1PM+SQ3wuu&yI)s!*Frd;N<1t>2uU)^-^JUF>q4=c)kdRy z#3mw8dvS51M%Cu+i8`^<-A}}NL(F|F$mENOdY*p(NbWa6nLKNZo-;BKBypr=qH7Z3 zJTY6e^zrQHkH<huUy#DwBAhZ-NBakLBDKxYN&dkgxwp+sZW^n@{rhzyoga%lT0c&Q zMabCh;Eup|@n<M_JIV%UkJFJ>eQ<AwGPV9(Jq}eQnVZJx82<qfaG&Hd`SLiO>u(3C z!(1~jNoVQ6Fwn%_NdU`cvw4D!r@(=rOZ0cp**isl)alwj$R+A|OqD6hT*6K7RBfj~ z2Y6)dGEfeM9>H-F5qA!*o2U=k2BWt<mNL?`6Vz*II@}i7K^-y)N#WqVlaNggZk?nP zeTJa3H@9W$a88=6ms#7PrxT*A{(xx+;rA!&&?uPz{&)PcCzofL$WRd7$&$$dQ*ic; z?nFwMf@E`W-V`0*p~L|}iAGT{%#&LJg<J5GA-_LGhx!jk-woeinSxw)a7H?8y9GUB zv4cy~b>eWDouseSn!W({CJ_U=&;;5Y)RL~FJF&~6x!Fg!*xl!WOm<}G=+u!Qd*<e? zz$KPq(Yh;JrYpuHK^L>)(03zCHfA6e5KtMYC0KwA9Wrth7&?N;B|HRz;uo=5%y9=z zyNLg2PZ7?@gtB;UU4SK8p9yazpxgaU150tIw)YnWk}NXY+kW0X*`xdRuHDi8iJeGm z@6_S_y*(txbnTAuAKR4_-e2r+PhniA?u&OKy^=bStTE)u>XsPaseArZNZiqhBoZTK zy(9?5%n6>|F26cJmzm4LV8ehGN@;go<TSmOQn`K_LTjSc!|^k85XVl}hiQ_~lQ<j% znk=2sJa2{`k898N8Q40kCYpO@=}>$hlBL(s6t2(G>4E8(g9OZnx_!(H$<}$Clda>h z{MFegu2vd`@X2iLz|S>tbFhf9lX1G}JyRF|tRmgn&ai8y4(rIFA<!?eA^|9NO~sg9 z5^-85l1Cy&xU<;-L3bif@5Ehwmrk<H0I5C8PTYl^)4^?b;XIWEswC8nG8&qrqocAx z_RNx*z<-t<d?p8n!pa;y;vT8Yo)sqt{2dwNTDZaBk%gP>;uS+@dGHMfE{6x%Swxrg z-_72$^itf|N~M{@XJ+AWITu3h1z`T&I(pPSKt1PruS=(-j|9;?;9{caY!^FxH!^rW zpTAp2M%~v%dI4~e%0=5@F~`lu=9veQtctrV<OA<8(khpg3q7Sgs)*Ze*%HOB0`R$u zq1Y`W4F*W?%jk>H-;w?vdeCL{7v8*|2h7pIv{)i6XOzSRV%8cb4Xw5KE}A<fi-6w< zG;Gs$Yom3Gy4i|5u~}R95|E_3-J`N~kG$WL<eId+dlBQs$Xftlu^h0JtLN(2pC!jK zJ~mg!TlXxR(bgA#XmO8DK(WoZ2Um?`uDJ($-xl_}S8qnM{a)+nckEsqZh_6iKEH)q z=IN>a%P~yHfrW?7$5CTNCsOHr+<3YMZAmAV17Ptl1*u~l_~ZFHYvu!<TrMjmWW`EB z#Ubecc_ILAT>1o;<y{FK?&Z(qiu-i5tqde<g?Jy(ndLw|gL)Nki8WbB(eNPfj+_<M zc!mIE7E*I1$X0{rh8G<8Q-PTko+Ou;OkN7Rh&=TF^rPDv`WN82vGO$wtlhAA0S+J0 zxu~|^EkK1`D;3sm{c8BI^_A0dbsIgx33)hLKg8vEI?KNjirij!m0R+3NN^QMV&0=@ z-R8Z@*YZ%X*71;hof9mfDbHYlTNrQP@^!lZ8J9ug#-rStuS0w^xQR<2#eu!=LcItR zs931OakSsQP#2)kUt5TahJ&*UtkXz6evifL(WU~hRP&hvoy>`aum&}Kk&g7)1idzH z7A9BkhK^plEd#ysYWxgeT%@P+`|VxR3c;<pxKM}R`Zy*dbCX;M1;}^LqlT<^KY(aS z$Gvhb{z|H{Q2PdNxS1fIFT}NYHqTwG<NI&);E=VEKod2ydGBHr&P^Opq+@)Z0GA&x zE7EfU#kmsy@`%H0IlBn{uXE`UFH0B+i(<cG9XU`+R183zyal&w>5^y@X`@~GX-LU2 z$dYn(J;N!**dia|(qg@Xwz1z5IG4>4OZ0)@z<lgjClR=#5mAM{UOn>6zdfRFSG12E zkLrk?x1_FIng7tOOI9o?H&Y+g?@{3Bm_>yTCX5^%H|n;Laq%NZ-)2Ux*S)>tHclFw zy>iKl^2OsE3-cE_3QATySh%umNy!RF)VxOTKIC(%sL{JG`Fx(+=p95p=gfs0^iSR@ za4L`5q=R{7jXoTcwJ<VT{>8Y!5#8whGW95(-<k9u)T73nxkdk=x<y6ZI%;&0nO>*A z&nR3EgP()9eg#-pPilLM^`tbWM5eARN+o(ICABdn$}%anG-YCA%Fv0c7B4PbnMz&_ zEnth9_)vLaS*lmIAfwarmoI}sg)3L&FPl=ba(R9^RAlfAf7D5pyF}BFwBr1gsb1+V z!ag*uWcl)v6{(~g(iaW1G`|2M%3HdJq?Hwl{GpW8iD}@Tw4|u8Ob8E4@31LLmKCnZ zUtS2pt3rs*$S*4{U$_kT7D!B*jLBuLD32eV>UBSissxMRw<n}}t+I@oR#+i+(3$qh z04*w%$!O^v3UtW|c)+VVMMfVoZ3)J%gd&;Q^!z2lxlK4Dr{|Y~ZHG07>G><miu0GH zdd<TW8dHYP$S+^=U?E(RI+MJr+NC427T%xgm1~WXwW_>yl~|lE;=|j~g-gmndBoB% zG#eVNX&$u(5VU<>oA{PbbaZ8=rRT2v6^lxi!<dc26`3QB^V(`@h{`F?FIWond28;& za>^Iw!ZsO{E!muM1YuFCSB{7d&3R}=d42^ny#{F*9+~qHmUnjh)T3tQFI*-b{}hth zBd6z=n=PN{B|i8=m~o%!@Q778_e`IN4V=^NO2cb^?;?a(cL|D7W5<r28#ijy{{k?V B3u6EP delta 13587 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 From fc2489922f0f158a514c533d2e4c3019db9f782b Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sat, 2 May 2015 17:09:46 +0000 Subject: [PATCH 232/494] Revert "PR#6693: also build libasmrun_shared.so and lib{asm,caml}run_pic.a" Building libasmrun_shared.so fails (at least on MacOS) for non-trivial reasons. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16072 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 16 ++++++---------- asmrun/Makefile | 39 ++------------------------------------- byterun/Makefile | 30 ++++++++---------------------- configure | 5 ----- 4 files changed, 16 insertions(+), 74 deletions(-) diff --git a/Changes b/Changes index 10832b0e02..f59ef5189d 100644 --- a/Changes +++ b/Changes @@ -47,6 +47,11 @@ Libraries: - PR#6285: Add support for nanosecond precision in Unix.stat() (Jérémie Dimino, report by user 'gfxmonk') +Tools: +- PR#6641: add -g, -ocamlcflags, -ocamloptflags options to ocamlmklib + (Peter Zotov) +- GPR#139: more versatile specification of locations of .annot + Runtime: - PR#6675: GC hooks (Damien Doligez and Roshan James) @@ -114,6 +119,7 @@ Bug fixes: - PR#6831: Build breaks for -aspp gcc on solaris-like OSs - PR#6836: Assertion failure using -short-paths - PR#6841: Changing compilation unit name with -o breaks ocamldebug +- PR#6842: export Typemod.modtype_of_package - PR#6843: record weak dependencies even when the .cmi is missing (Leo White, Gabriel Scherer) - GPR#143: fix getsockopt behaviour for boolean socket options @@ -125,16 +131,6 @@ Bug fixes: - GPR#171: allow custom warning printers / catchers (Benjamin Canou, review by Damien Doligez) -Feature wishes: -- PR#6641: add -g, -ocamlcflags, -ocamloptflags options to ocamlmklib - (Peter Zotov) -- PR#6693: also build libasmrun_shared.so and lib{asm,caml}run_pic.a - (Peter Zotov, review by Mark Shinwell) -- PR#6842: export Typemod.modtype_of_package - (Jacques Garrigue, request by Jun Furuse) -- GPR#139: more versatile specification of locations of .annot - (Christophe Troestler, review by Damien Doligez) - OCaml 4.02.1: ------------- (Changes that can break existing programs are marked with a "*") diff --git a/asmrun/Makefile b/asmrun/Makefile index 84a9aaabaf..ff277e748a 100644 --- a/asmrun/Makefile +++ b/asmrun/Makefile @@ -19,7 +19,6 @@ FLAGS=-I../byterun -DCAML_NAME_SPACE -DNATIVE_CODE \ CFLAGS=$(FLAGS) $(NATIVECCCOMPOPTS) DFLAGS=$(FLAGS) -g -DDEBUG $(NATIVECCCOMPOPTS) PFLAGS=$(FLAGS) -pg -O -DPROFILING $(NATIVECCPROFOPTS) -PICFLAGS=$(FLAGS) -O $(SHAREDCCCOMPOPTS) $(NATIVECCCOMPOPTS) COBJS=startup.o main.o fail.o roots.o globroots.o signals.o signals_asm.o \ misc.o freelist.o major_gc.o minor_gc.o memory.o alloc.o compare.o ints.o \ @@ -33,9 +32,8 @@ ASMOBJS=$(ARCH).o OBJS=$(COBJS) $(ASMOBJS) DOBJS=$(COBJS:.o=.d.o) $(ASMOBJS) POBJS=$(COBJS:.o=.p.o) $(ASMOBJS:.o=.p.o) -PICOBJS=$(COBJS:.o=.pic.o) $(ASMOBJS:.o=.pic.o) -all: libasmrun.a all-$(RUNTIMED) all-$(PROFILING) all-$(SHARED) +all: libasmrun.a all-$(RUNTIMED) all-$(PROFILING) libasmrun.a: $(OBJS) rm -f libasmrun.a @@ -62,26 +60,13 @@ libasmrunp.a: $(POBJS) $(ARCMD) rc libasmrunp.a $(POBJS) $(RANLIB) libasmrunp.a -all-noshared: - -all-shared: libasmrun_pic.a libasmrun_shared.so - -libasmrun_pic.a: $(PICOBJS) - rm -f libasmrun_pic.a - ar rc libasmrun_pic.a $(PICOBJS) - $(RANLIB) libasmrun_pic.a - -libasmrun_shared.so: $(PICOBJS) - $(MKDLL) -o libasmrun_shared.so $(PICOBJS) $(NATIVECCLIBS) - INSTALL_LIBDIR=$(DESTDIR)$(LIBDIR) -install: install-default install-$(RUNTIMED) install-$(PROFILING) install-$(SHARED) +install: install-default install-$(RUNTIMED) install-$(PROFILING) install-default: cp libasmrun.a $(INSTALL_LIBDIR)/libasmrun.a cd $(INSTALL_LIBDIR); $(RANLIB) libasmrun.a -.PHONY: install-default install-noruntimed: .PHONY: install-noruntimed @@ -94,21 +79,10 @@ install-runtimed: install-noprof: rm -f $(INSTALL_LIBDIR)/libasmrunp.a ln -s libasmrun.a $(INSTALL_LIBDIR)/libasmrunp.a -.PHONY: install-noprof install-prof: cp libasmrunp.a $(INSTALL_LIBDIR)/libasmrunp.a cd $(INSTALL_LIBDIR); $(RANLIB) libasmrunp.a -.PHONY: install-prof - -install-noshared: -.PHONY: install-noshared - -install-shared: - cp libasmrun_pic.a $(INSTALL_LIBDIR)/libasmrun_pic.a - cd $(INSTALL_LIBDIR); $(RANLIB) libasmrunp.a - cp libasmrun_shared.so $(INSTALL_LIBDIR)/libasmrun_shared.so -.PHONY: install-prof power-bsd_elf.S: power-elf.S cp power-elf.S power-bsd_elf.S @@ -209,27 +183,18 @@ clean:: %.p.o: %.S $(ASPP) -DSYS_$(SYSTEM) -DMODEL_$(MODEL) $(ASPPPROFFLAGS) -o $@ $< -%.pic.o: %.S - $(ASPP) -DSYS_$(SYSTEM) -DMODEL_$(MODEL) $(SHAREDCCCOMPOPTS) -o $@ $< - %.d.o: %.c $(CC) -c $(DFLAGS) -o $@ $< %.p.o: %.c $(CC) -c $(PFLAGS) -o $@ $< -%.pic.o: %.c - $(CC) -c $(PICFLAGS) -o $@ $< - %.o: %.s $(ASPP) -DSYS_$(SYSTEM) -o $@ $< %.p.o: %.s $(ASPP) -DSYS_$(SYSTEM) $(ASPPPROFFLAGS) -o $@ $< -%.pic.o: %.s - $(ASPP) -DSYS_$(SYSTEM) $(SHAREDCCCOMPOPTS) -o $@ $< - clean:: rm -f *.o *.a *~ diff --git a/byterun/Makefile b/byterun/Makefile index ae57e2a7aa..67d6ec5e75 100644 --- a/byterun/Makefile +++ b/byterun/Makefile @@ -20,7 +20,10 @@ OBJS=$(COMMONOBJS) $(UNIX_OR_WIN32).o main.o DOBJS=$(OBJS:.o=.d.o) instrtrace.d.o PICOBJS=$(OBJS:.o=.pic.o) -all:: all-$(SHARED) +SHARED_LIBS_TMP=$(SUPPORTS_SHARED_LIBRARIES:%false=) +SHARED_LIBS_DEPS=$(SHARED_LIBS_TMP:%true=libcamlrun_shared.so) + +all:: $(SHARED_LIBS_DEPS) ocamlrun$(EXE): libcamlrun.a prims.o $(MKEXE) $(BYTECCLINKOPTS) -o ocamlrun$(EXE) \ @@ -38,32 +41,15 @@ libcamlrund.a: $(DOBJS) $(ARCMD) rc libcamlrund.a $(DOBJS) $(RANLIB) libcamlrund.a -all-noshared: -.PHONY: all-noshared - -all-shared: libcamlrun_pic.a libcamlrun_shared.so -.PHONY: all-shared - -libcamlrun_pic.a: $(PICOBJS) - ar rc libcamlrun_pic.a $(PICOBJS) - $(RANLIB) libcamlrun_pic.a - libcamlrun_shared.so: $(PICOBJS) $(MKDLL) -o libcamlrun_shared.so $(PICOBJS) $(BYTECCLIBS) -install:: install-$(SHARED) - -install-noshared: -.PHONY: install-noshared - -install-shared: - cp libcamlrun_shared.so $(INSTALL_LIBDIR)/libcamlrun_shared.so - cp libcamlrun_pic.a $(INSTALL_LIBDIR)/libcamlrun_pic.a - cd $(INSTALL_LIBDIR); $(RANLIB) libcamlrun_pic.a -.PHONY: install-shared +install:: + if test -f libcamlrun_shared.so; then \ + cp libcamlrun_shared.so $(INSTALL_LIBDIR)/libcamlrun_shared.so; fi clean:: - rm -f libcamlrun_shared.so libcamlrun_pic.a + rm -f libcamlrun_shared.so %.d.o: %.c $(CC) -c $(DFLAGS) $< -o $@ diff --git a/configure b/configure index 94cbab9cb4..d09fc7bb15 100755 --- a/configure +++ b/configure @@ -1736,11 +1736,6 @@ echo "MKEXEDEBUGFLAG=$mkexedebugflag" >> Makefile echo "MKDLL=$mksharedlib" >> Makefile echo "MKMAINDLL=$mkmaindll" >> Makefile echo "RUNTIMED=${debugruntime}" >>Makefile -if $shared_libraries_supported; then - echo "SHARED=shared" >>Makefile -else - echo "SHARED=noshared" >>Makefile -fi echo "WITH_DEBUGGER=${with_debugger}" >>Makefile echo "WITH_OCAMLDOC=${with_ocamldoc}" >>Makefile echo "WITH_OCAMLBUILD=${with_ocamlbuild}" >>Makefile From 92f7d464805180e93ca27117532db19d005c1f05 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 5 May 2015 15:52:09 +0000 Subject: [PATCH 233/494] PR#6600 (cont.) [applying patch on behalf of garrigue] git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16078 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 9 ++++++--- typing/env.ml | 5 +++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Changes b/Changes index f59ef5189d..d2fef2d92d 100644 --- a/Changes +++ b/Changes @@ -58,6 +58,9 @@ Runtime: - PR#6078: Release the runtime system when calling caml_dlopen (Jérémie Dimino) +Build system: +- PR#5418 (comments) : generate dependencies with $(CC) instead of gcc + Bug fixes: - PR#5271: Location.prerr_warning is hard-coded to use Format.err_formatter (Damien Doligez, report by Rolf Rolles) @@ -70,6 +73,8 @@ Bug fixes: (Jérôme Vouillon and Adrien Nader and Peter Zotov) - PR#6573: extern "C" for systhreads/threads.h (Mickaël Delahaye) +- PR#6575: Array.init evaluates callback although it should not do so + (Alain Frisch, report by Gerd Stolpmann) - PR#6607: The manual doesn't mention 0x200 flag for OCAMLRUNPARAM=v (Alain Frisch) - PR#6616: allow meaningful use of -use-runtime without -custom. @@ -131,6 +136,7 @@ Bug fixes: - GPR#171: allow custom warning printers / catchers (Benjamin Canou, review by Damien Doligez) + OCaml 4.02.1: ------------- (Changes that can break existing programs are marked with a "*") @@ -182,8 +188,6 @@ Standard library: (Jacques Garrigue, report by Mark Shinwell) - PR#6572: Fatal error with recursive modules (Jacques Garrigue, report by Quentin Stievenart) -- PR#6575: Array.init evaluates callback although it should not do so - (Alain Frisch, report by Gerd Stolpmann) - PR#6578: Recursive module containing alias causes Segmentation fault (Jacques Garrigue) - PR#6581: Some bugs in generative functors @@ -935,7 +939,6 @@ Feature wishes: (Benedikt Meurer) - PR#5243: improve the ocamlbuild API documentation in signatures.mli (Christophe Troestler) -- PR#5418 (comments) : generate dependencies with $(CC) instead of gcc - PR#5546: moving a function into an internal module slows down its use (Alain Frisch, report by Fabrice Le Fessant) - PR#5597: add instruction trace option 't' to OCAMLRUNPARAM diff --git a/typing/env.ml b/typing/env.ml index 3597c5c521..052fec5ca1 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -948,7 +948,7 @@ let iter_env_cont = ref [] let rec scrape_alias_safe env mty = match mty with | Mty_alias (Pident id) when Ident.persistent id -> false - | Mty_alias path -> + | Mty_alias path -> (* PR#6600: find_module may raise Not_found *) scrape_alias_safe env (find_module path env).md_type | _ -> true @@ -959,7 +959,8 @@ let iter_env proj1 proj2 f env () = let safe = match EnvLazy.get_arg mcomps with None -> true - | Some (env, sub, path, mty) -> scrape_alias_safe env mty + | Some (env, sub, path, mty) -> + try scrape_alias_safe env mty with Not_found -> false in if not safe then () else match EnvLazy.force !components_of_module_maker' mcomps with From e6463a03b60960cc47d7e930d57610509c4190c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Dimino?= <jeremie@dimino.org> Date: Tue, 5 May 2015 20:52:11 +0000 Subject: [PATCH 234/494] Fix pretty-printing of GADT constructors git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16083 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- parsing/pprintast.ml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index 93cd0344ff..4425026e65 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -1270,18 +1270,23 @@ class printer ()= object(self:'self) | Some y -> pp f "@;%a" self#core_type y in let constructor_declaration f pcd = - match pcd.pcd_res with - | None -> + match pcd.pcd_args, pcd.pcd_res with + | _, None -> pp f "|@;%s%a%a" pcd.pcd_name.txt (fun f -> function | [] -> () | l -> pp f "@;of@;%a" (self#list self#core_type1 ~sep:"*@;") l) pcd.pcd_args self#attributes pcd.pcd_attributes - | Some x -> + | [], Some x -> pp f "|@;%s:@;%a%a" pcd.pcd_name.txt - (self#list self#core_type1 ~sep:"@;->@;") (pcd.pcd_args@[x]) + self#core_type1 x self#attributes pcd.pcd_attributes + | args, Some x -> + pp f "|@;%s:@;%a@;->@;%a%a" pcd.pcd_name.txt + (self#list self#core_type1 ~sep:"*@;") args + self#core_type1 x + self#attributes pcd.pcd_attributes in let label_declaration f pld = pp f "@[<2>%a%s:@;%a%a;@]" From e611b9e26c72f6bc6797a3feadc525b50e7538a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Dimino?= <jeremie@dimino.org> Date: Tue, 5 May 2015 20:52:50 +0000 Subject: [PATCH 235/494] Fix pretty-printing of constraints on type declarations git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16084 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- parsing/pprintast.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index 4425026e65..5e9b9455d0 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -1313,7 +1313,7 @@ class printer ()= object(self:'self) let constraints f = self#list ~first:"@ " (fun f (ct1,ct2,_) -> - pp f "@[<hov2>constraint@ %a@ =@ %a@]" + pp f "@[<hov2> constraint@ %a@ =@ %a@]" self#core_type ct1 self#core_type ct2) f x.ptype_cstrs in From c66d7805c1c30070430175272d21890dbd28cbf4 Mon Sep 17 00:00:00 2001 From: Xavier Leroy <xavier.leroy@inria.fr> Date: Wed, 6 May 2015 07:19:12 +0000 Subject: [PATCH 236/494] PR#6667: wrong implementation of %bswap16 on ARM64 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16085 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ asmcomp/arm64/emit.mlp | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index d2fef2d92d..0e517e26f3 100644 --- a/Changes +++ b/Changes @@ -87,6 +87,8 @@ Bug fixes: - PR#6658: cross-compiler: version check not working on OS X - PR#6665: Failure of tests/asmcomp on sparc (Stéphane Glondu) +- PR#6667: wrong implementation of %bswap16 on ARM64 + (Xavier Leroy) - PR#6669: fix 4.02 regression in toplevel printing of lazy values (Leo White, review by Gabriel Scherer) - PR#6671: Windows: environment variable 'TZ' affects Unix.gettimeofday diff --git a/asmcomp/arm64/emit.mlp b/asmcomp/arm64/emit.mlp index 734bd23e15..eb360207cd 100644 --- a/asmcomp/arm64/emit.mlp +++ b/asmcomp/arm64/emit.mlp @@ -506,7 +506,7 @@ let emit_instr i = begin match size with | 16 -> ` rev16 {emit_wreg i.res.(0)}, {emit_wreg i.arg.(0)}\n`; - ` ubfm {emit_reg i.res.(0)}, {emit_reg i.res.(0)}, #0, #16\n` + ` ubfm {emit_reg i.res.(0)}, {emit_reg i.res.(0)}, #0, #15\n` | 32 -> ` rev {emit_wreg i.res.(0)}, {emit_wreg i.arg.(0)}\n` | 64 -> From 80f3f568675f651ec09eac2e4be36c3aa2ae8793 Mon Sep 17 00:00:00 2001 From: Xavier Leroy <xavier.leroy@inria.fr> Date: Wed, 6 May 2015 08:37:10 +0000 Subject: [PATCH 237/494] PR#6753: Num.quo_num and Num.mod_num incorrect for some negative arguments git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16086 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 + otherlibs/num/num.ml | 105 +++++++++++++++++++++++-------------------- 2 files changed, 58 insertions(+), 49 deletions(-) diff --git a/Changes b/Changes index 0e517e26f3..901ea3389a 100644 --- a/Changes +++ b/Changes @@ -103,6 +103,8 @@ Bug fixes: (Benoît Vaugon, report by Vassili Karpov) - PR#6749: ocamlopt returns n for (n mod 1) instead of 0 (Mark Shinwell and Jérémie Dimino) +- PR#6753: Num.quo_num and Num.mod_num incorrect for some negative arguments + (Xavier Leroy) - PR#6758: Ocamldoc "analyse_module: parsetree and typedtree don't match" - PR#6759: big_int_of_string incorrectly parses some hexa literals (Damien Doligez, report by Pierre-yves Strub) diff --git a/otherlibs/num/num.ml b/otherlibs/num/num.ml index 67499e2674..924e9eab6c 100644 --- a/otherlibs/num/num.ml +++ b/otherlibs/num/num.ml @@ -160,57 +160,71 @@ let floor_num = function | Big_int bi as n -> n | Ratio r -> num_of_big_int (floor_ratio r) -(* The function [quo_num] is equivalent to - - let quo_num x y = floor_num (div_num x y);; +(* Coercion with ratio type *) +let ratio_of_num = function + Int i -> ratio_of_int i +| Big_int bi -> ratio_of_big_int bi +| Ratio r -> r +;; - However, this definition is vastly inefficient (cf PR #3473): - we define here a better way of computing the same thing. - *) -let quo_num n1 n2 = - match n1 with - | Int i1 -> - begin match n2 with - | Int i2 -> Int (i1 / i2) - | Big_int bi2 -> num_of_big_int (div_big_int (big_int_of_int i1) bi2) - | Ratio r2 -> num_of_big_int (floor_ratio (div_int_ratio i1 r2)) end +(* Euclidean division and remainder. The specification is: - | Big_int bi1 -> - begin match n2 with - | Int i2 -> num_of_big_int (div_big_int bi1 (big_int_of_int i2)) - | Big_int bi2 -> num_of_big_int (div_big_int bi1 bi2) - | Ratio r2 -> num_of_big_int (floor_ratio (div_big_int_ratio bi1 r2)) end + a = b * quo_num a b + mod_num a b + quo_num a b is an integer (Z) + 0 <= mod_num a b < |b| - | Ratio r1 -> - begin match n2 with - | Int i2 -> num_of_big_int (floor_ratio (div_ratio_int r1 i2)) - | Big_int bi2 -> num_of_big_int (floor_ratio (div_ratio_big_int r1 bi2)) - | Ratio r2 -> num_of_big_int (floor_ratio (div_ratio r1 r2)) end -;; +A correct but slow implementation is: -(* The function [mod_num] is equivalent to: + quo_num a b = + if b >= 0 then floor_num (div_num a b) + else minus_num (floor_num (div_num a (minus_num b))) - let mod_num x y = sub_num x (mult_num y (quo_num x y));; + mod_num a b = + sub_num a (mult_num b (quo_num a b)) - However, as for [quo_num] above, this definition is inefficient: + However, this definition is vastly inefficient (cf PR #3473): we define here a better way of computing the same thing. - *) -let mod_num n1 n2 = - match n1 with - | Int i1 -> - begin match n2 with - | Int i2 -> Int (i1 mod i2) - | Big_int bi2 -> num_of_big_int (mod_big_int (big_int_of_int i1) bi2) - | Ratio _r2 -> sub_num n1 (mult_num n2 (quo_num n1 n2)) end - | Big_int bi1 -> - begin match n2 with - | Int i2 -> num_of_big_int (mod_big_int bi1 (big_int_of_int i2)) - | Big_int bi2 -> num_of_big_int (mod_big_int bi1 bi2) - | Ratio _r2 -> sub_num n1 (mult_num n2 (quo_num n1 n2)) end + PR#6753: the previous implementation was based on + quo_num a b = floor_num (div_num a b) + which is incorrect for negative b. +*) - | Ratio _r1 -> sub_num n1 (mult_num n2 (quo_num n1 n2)) -;; +let quo_num n1 n2 = + match n1, n2 with + | Int i1, Int i2 -> + let q = i1 / i2 and r = i1 mod i2 in + Int (if r >= 0 then q else if i2 > 0 then q - 1 else q + 1) + | Int i1, Big_int bi2 -> + num_of_big_int (div_big_int (big_int_of_int i1) bi2) + | Int i1, Ratio r2 -> + num_of_big_int (report_sign_ratio r2 + (floor_ratio (div_int_ratio i1 (abs_ratio r2)))) + | Big_int bi1, Int i2 -> + num_of_big_int (div_big_int bi1 (big_int_of_int i2)) + | Big_int bi1, Big_int bi2 -> + num_of_big_int (div_big_int bi1 bi2) + | Big_int bi1, Ratio r2 -> + num_of_big_int (report_sign_ratio r2 + (floor_ratio (div_big_int_ratio bi1 (abs_ratio r2)))) + | Ratio r1, _ -> + let r2 = ratio_of_num n2 in + num_of_big_int (report_sign_ratio r2 + (floor_ratio (div_ratio r1 (abs_ratio r2)))) + +let mod_num n1 n2 = + match n1, n2 with + | Int i1, Int i2 -> + let r = i1 mod i2 in + Int (if r >= 0 then r else if i2 > 0 then r + i2 else r - i2) + | Int i1, Big_int bi2 -> + num_of_big_int (mod_big_int (big_int_of_int i1) bi2) + | Big_int bi1, Int i2 -> + num_of_big_int (mod_big_int bi1 (big_int_of_int i2)) + | Big_int bi1, Big_int bi2 -> + num_of_big_int (mod_big_int bi1 bi2) + | _, _ -> + sub_num n1 (mult_num n2 (quo_num n1 n2)) let power_num_int a b = match (a,b) with ((Int i), n) -> @@ -368,13 +382,6 @@ let big_int_of_num = function | Big_int bi -> bi | Ratio r -> big_int_of_ratio r -(* Coercion with ratio type *) -let ratio_of_num = function - Int i -> ratio_of_int i -| Big_int bi -> ratio_of_big_int bi -| Ratio r -> r -;; - let string_of_big_int_for_num bi = if !approx_printing_flag then approx_big_int !floating_precision bi From eef9d68685f39387298bb38e2c5d504fac37adde Mon Sep 17 00:00:00 2001 From: Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> Date: Wed, 6 May 2015 09:53:49 +0000 Subject: [PATCH 238/494] fix PR#6857 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16087 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + bytecomp/lambda.ml | 7 +++---- typing/env.ml | 3 +++ typing/env.mli | 1 + 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Changes b/Changes index 901ea3389a..58cd87d2cf 100644 --- a/Changes +++ b/Changes @@ -131,6 +131,7 @@ Bug fixes: - PR#6842: export Typemod.modtype_of_package - PR#6843: record weak dependencies even when the .cmi is missing (Leo White, Gabriel Scherer) +- PR#6857: __MODULE__ doesn't give the current module with -o - GPR#143: fix getsockopt behaviour for boolean socket options (Anil Madhavapeddy and Andrew Ray) - ocamlbuild on cygwin cannot find ocamlfind diff --git a/bytecomp/lambda.ml b/bytecomp/lambda.ml index 5d9fb593fa..d32ac4fbf0 100644 --- a/bytecomp/lambda.ml +++ b/bytecomp/lambda.ml @@ -539,10 +539,9 @@ let lam_of_loc kind loc = | Loc_FILE -> Lconst (Const_immstring file) | Loc_MODULE -> let filename = Filename.basename file in - let module_name = - try String.capitalize (Filename.chop_extension filename) - with Invalid_argument _ -> "//"^filename^"//" - in Lconst (Const_immstring module_name) + let name = Env.get_unit_name () in + let module_name = if name = "" then "//"^filename^"//" else name in + Lconst (Const_immstring module_name) | Loc_LOC -> let loc = Printf.sprintf "File %S, line %d, characters %d-%d" file lnum cnum enum in diff --git a/typing/env.ml b/typing/env.ml index 052fec5ca1..95e6c602e6 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -429,6 +429,9 @@ let reset_cache_toplevel () = let set_unit_name name = current_unit := name +let get_unit_name () = + !current_unit + (* Lookup by identifier *) let rec find_module_descr path env = diff --git a/typing/env.mli b/typing/env.mli index ab0b0b97bd..e894557e0b 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -147,6 +147,7 @@ val reset_cache_toplevel: unit -> unit (* Remember the name of the current compilation unit. *) val set_unit_name: string -> unit +val get_unit_name: unit -> string (* Read, save a signature to/from a file *) From 47ee7925e8e4815e7a89fefd2d8387376042cf0b Mon Sep 17 00:00:00 2001 From: Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> Date: Wed, 6 May 2015 10:06:56 +0000 Subject: [PATCH 239/494] Fix PR#6849 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16088 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + testsuite/tests/typing-gadts/test.ml | 7 +++++++ testsuite/tests/typing-gadts/test.ml.principal.reference | 5 +++++ testsuite/tests/typing-gadts/test.ml.reference | 5 +++++ typing/typecore.ml | 2 +- 5 files changed, 19 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 58cd87d2cf..741a93dad5 100644 --- a/Changes +++ b/Changes @@ -131,6 +131,7 @@ Bug fixes: - PR#6842: export Typemod.modtype_of_package - PR#6843: record weak dependencies even when the .cmi is missing (Leo White, Gabriel Scherer) +- PR#6849: Inverted pattern unification error - PR#6857: __MODULE__ doesn't give the current module with -o - GPR#143: fix getsockopt behaviour for boolean socket options (Anil Madhavapeddy and Andrew Ray) diff --git a/testsuite/tests/typing-gadts/test.ml b/testsuite/tests/typing-gadts/test.ml index 2f0bb91962..315887666e 100644 --- a/testsuite/tests/typing-gadts/test.ml +++ b/testsuite/tests/typing-gadts/test.ml @@ -157,6 +157,13 @@ module Normal_constrs = struct let f = function A -> 1 | B -> 2 end;; +module PR6849 = struct + type 'a t = Foo : int t + + let f : int -> int = function + Foo -> 5 +end;; + type _ t = Int : int t ;; let ky x y = ignore (x = y); x ;; diff --git a/testsuite/tests/typing-gadts/test.ml.principal.reference b/testsuite/tests/typing-gadts/test.ml.principal.reference index fd9fb3501c..465a57b68e 100644 --- a/testsuite/tests/typing-gadts/test.ml.principal.reference +++ b/testsuite/tests/typing-gadts/test.ml.principal.reference @@ -75,6 +75,11 @@ Error: This expression has type bool but an expression was expected of type s ^ Error: This pattern matches values of type b but a pattern was expected which matches values of type a +# Characters 89-92: + Foo -> 5 + ^^^ +Error: This pattern matches values of type 'a t + but a pattern was expected which matches values of type int # type _ t = Int : int t # val ky : 'a -> 'a -> 'a = <fun> # val test : 'a t -> 'a = <fun> diff --git a/testsuite/tests/typing-gadts/test.ml.reference b/testsuite/tests/typing-gadts/test.ml.reference index a5faa02c01..3a28d81cf9 100644 --- a/testsuite/tests/typing-gadts/test.ml.reference +++ b/testsuite/tests/typing-gadts/test.ml.reference @@ -76,6 +76,11 @@ Error: This pattern matches values of type int t ^ Error: This variant pattern is expected to have type a The constructor B does not belong to type a +# Characters 89-92: + Foo -> 5 + ^^^ +Error: This pattern matches values of type 'a t + but a pattern was expected which matches values of type int # type _ t = Int : int t # val ky : 'a -> 'a -> 'a = <fun> # val test : 'a t -> 'a = <fun> diff --git a/typing/typecore.ml b/typing/typecore.ml index b173d99c64..70f9061c35 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -887,7 +887,7 @@ let unify_head_only loc env ty constr = | Tconstr(p,args,m) -> ty_res.desc <- Tconstr(p,List.map (fun _ -> newvar ()) args,m); enforce_constraints env ty_res; - unify_pat_types loc env ty ty_res + unify_pat_types loc env ty_res ty | _ -> assert false (* Typing of patterns *) From 5e57d465f732886598d9c2c9f87e80bf896c23c7 Mon Sep 17 00:00:00 2001 From: Mark Shinwell <mshinwell@janestreet.com> Date: Wed, 6 May 2015 15:10:59 +0000 Subject: [PATCH 240/494] Fix PR#6693 (part two): Incorrect relocation types in x86-64 runtime system git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16089 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + asmrun/amd64.S | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Changes b/Changes index 741a93dad5..24d88adf1d 100644 --- a/Changes +++ b/Changes @@ -97,6 +97,7 @@ Bug fixes: - PR#6686: Bug in [subst_boxed_number] (Jérémie Dimino, Mark Shinwell) - PR#6690: Uncaught exception (Not_found) with (wrong) wildcard or unification type variable in place of a local abstract type +- PR#6693 (part two): Incorrect relocation types in x86-64 runtime system - PR#6717: Pprintast does not print let-pattern attributes (Gabriel Scherer, report by Peter Zotov) - PR#6727: Printf.sprintf "%F" misbehavior diff --git a/asmrun/amd64.S b/asmrun/amd64.S index d2e007529d..be38848ec2 100644 --- a/asmrun/amd64.S +++ b/asmrun/amd64.S @@ -471,7 +471,7 @@ FUNCTION(G(caml_start_program)) /* Save callee-save registers */ PUSH_CALLEE_SAVE_REGS /* Initial entry point is G(caml_program) */ - leaq GCALL(caml_program)(%rip), %r12 + LEA_VAR(caml_program, %r12) /* Common code for caml_start_program and caml_callback* */ LBL(caml_start_program): /* Build a callback link */ @@ -636,7 +636,7 @@ CFI_STARTPROC movq C_ARG_1, %rdi /* closure -- no op with Unix conventions */ movq C_ARG_2, %rax /* first argument */ movq C_ARG_3, %rbx /* second argument */ - leaq GCALL(caml_apply2)(%rip), %r12 /* code pointer */ + LEA_VAR(caml_apply2, %r12) /* code pointer */ jmp LBL(caml_start_program) CFI_ENDPROC @@ -649,13 +649,13 @@ CFI_STARTPROC movq C_ARG_3, %rbx /* second argument */ movq C_ARG_1, %rsi /* closure */ movq C_ARG_4, %rdi /* third argument */ - leaq GCALL(caml_apply3)(%rip), %r12 /* code pointer */ + LEA_VAR(caml_apply3, %r12) /* code pointer */ jmp LBL(caml_start_program) CFI_ENDPROC FUNCTION(G(caml_ml_array_bound_error)) CFI_STARTPROC - leaq GCALL(caml_array_bound_error)(%rip), %rax + LEA_VAR(caml_array_bound_error, %rax) jmp LBL(caml_c_call) CFI_ENDPROC From 3967cb266194907e4a0d298d961a446ec872e9b1 Mon Sep 17 00:00:00 2001 From: Mark Shinwell <mshinwell@janestreet.com> Date: Wed, 6 May 2015 15:18:50 +0000 Subject: [PATCH 241/494] Fix PR#6772: asmrun/signals_asm.c doesn't compile on NetBSD/i386 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16090 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ asmrun/signals_osdep.h | 16 +++++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Changes b/Changes index 24d88adf1d..0784d65977 100644 --- a/Changes +++ b/Changes @@ -112,6 +112,8 @@ Bug fixes: - PR#6763: #show with -short-paths doesn't select shortest type paths - PR#6768: Typechecker overflow the stack on cyclic type - PR#6770: (duplicate of PR#6686) +- PR#6772: asmrun/signals_asm.c doesn't compile on NetBSD/i386 + (Kenji Tokudome) - PR#6775: Digest.file leaks file descriptor on error (Valentin Gatien-Baron) - PR#6779: Cross-compilers cannot link bytecode using custom primitives diff --git a/asmrun/signals_osdep.h b/asmrun/signals_osdep.h index 8dd651f6c5..627e3b727e 100644 --- a/asmrun/signals_osdep.h +++ b/asmrun/signals_osdep.h @@ -152,14 +152,24 @@ #elif defined(TARGET_i386) && defined(SYS_bsd_elf) - #define DECLARE_SIGNAL_HANDLER(name) \ - static void name(int sig, siginfo_t * info, struct sigcontext * context) + #if defined (__NetBSD__) + #include <ucontext.h> + #define DECLARE_SIGNAL_HANDLER(name) \ + static void name(int sig, siginfo_t * info, ucontext_t * context) + #else + #define DECLARE_SIGNAL_HANDLER(name) \ + static void name(int sig, siginfo_t * info, struct sigcontext * context) + #endif #define SET_SIGACT(sigact,name) \ sigact.sa_sigaction = (void (*)(int,siginfo_t *,void *)) (name); \ sigact.sa_flags = SA_SIGINFO - #define CONTEXT_PC (context->sc_eip) + #if defined (__NetBSD__) + #define CONTEXT_PC (_UC_MACHINE_PC(context)) + #else + #define CONTEXT_PC (context->sc_eip) + #endif #define CONTEXT_FAULTING_ADDRESS ((char *) info->si_addr) /****************** I386, BSD */ From 82bcb0826f4f84fd465b7985810d142d7d2db5f1 Mon Sep 17 00:00:00 2001 From: Mark Shinwell <mshinwell@janestreet.com> Date: Wed, 6 May 2015 17:37:43 +0000 Subject: [PATCH 242/494] Fix PR#6490: incorrect backtraces in gdb on AArch64. (Also fixes the same problem for 32-bit ARM.) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16091 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ asmcomp/arm/emit.mlp | 4 +++- asmcomp/arm64/emit.mlp | 6 ++++-- asmcomp/emitaux.ml | 9 +++++++++ asmcomp/emitaux.mli | 1 + 5 files changed, 19 insertions(+), 3 deletions(-) diff --git a/Changes b/Changes index 0784d65977..0239273044 100644 --- a/Changes +++ b/Changes @@ -71,6 +71,8 @@ Bug fixes: - PR#5887: move the byterun/*.h headers to byterun/caml/*.h to avoid header name clashes (Jérôme Vouillon and Adrien Nader and Peter Zotov) +- PR#6490: incorrect backtraces in gdb on AArch64. Also fixes incorrect + backtraces on 32-bit ARM. (Mark Shinwell) - PR#6573: extern "C" for systhreads/threads.h (Mickaël Delahaye) - PR#6575: Array.init evaluates callback although it should not do so diff --git a/asmcomp/arm/emit.mlp b/asmcomp/arm/emit.mlp index 61035b85fd..4948fb2b1b 100644 --- a/asmcomp/arm/emit.mlp +++ b/asmcomp/arm/emit.mlp @@ -852,8 +852,10 @@ let fundecl fundecl = let n = frame_size() in if n > 0 then begin ignore(emit_stack_adjustment (-n)); - if !contains_calls then + if !contains_calls then begin + cfi_offset ~reg:14 (* lr *) ~offset:(-4); ` str lr, [sp, #{emit_int(n - 4)}]\n` + end end; `{emit_label !tailrec_entry_point}:\n`; emit_all 0 fundecl.fun_body; diff --git a/asmcomp/arm64/emit.mlp b/asmcomp/arm64/emit.mlp index eb360207cd..8f174fee46 100644 --- a/asmcomp/arm64/emit.mlp +++ b/asmcomp/arm64/emit.mlp @@ -654,8 +654,10 @@ let fundecl fundecl = let n = frame_size() in if n > 0 then emit_stack_adjustment (-n); - if !contains_calls then - ` str x30, [sp, #{emit_int (n-8)}]\n`; + if !contains_calls then begin + cfi_offset ~reg:30 (* return address *) ~offset:(-8); + ` str x30, [sp, #{emit_int (n-8)}]\n` + end; `{emit_label !tailrec_entry_point}:\n`; emit_all fundecl.fun_body; List.iter emit_call_gc !call_gc_sites; diff --git a/asmcomp/emitaux.ml b/asmcomp/emitaux.ml index 24a621b339..ec2e8f06ca 100644 --- a/asmcomp/emitaux.ml +++ b/asmcomp/emitaux.ml @@ -195,6 +195,15 @@ let cfi_adjust_cfa_offset n = emit_string "\t.cfi_adjust_cfa_offset\t"; emit_int n; emit_string "\n"; end +let cfi_offset ~reg ~offset = + if is_cfi_enabled () then begin + emit_string "\t.cfi_offset "; + emit_int reg; + emit_string ", "; + emit_int offset; + emit_string "\n" + end + (* Emit debug information *) (* This assoc list is expected to be very short *) diff --git a/asmcomp/emitaux.mli b/asmcomp/emitaux.mli index 486a5839ce..e943da3895 100644 --- a/asmcomp/emitaux.mli +++ b/asmcomp/emitaux.mli @@ -56,3 +56,4 @@ val is_generic_function: string -> bool val cfi_startproc : unit -> unit val cfi_endproc : unit -> unit val cfi_adjust_cfa_offset : int -> unit +val cfi_offset : reg:int -> offset:int -> unit From 730f3fbaac079961e5d807f4f1fd14f3b65ccd36 Mon Sep 17 00:00:00 2001 From: Mark Shinwell <mshinwell@janestreet.com> Date: Wed, 6 May 2015 18:13:47 +0000 Subject: [PATCH 243/494] Fix PR#6837: Build profiling libraries on FreeBSD and NetBSD x86-64 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16092 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + configure | 2 ++ 2 files changed, 3 insertions(+) diff --git a/Changes b/Changes index 0239273044..c86ebfab44 100644 --- a/Changes +++ b/Changes @@ -132,6 +132,7 @@ Bug fixes: (Gabriel Scherer, report by Alain Frisch) - PR#6831: Build breaks for -aspp gcc on solaris-like OSs - PR#6836: Assertion failure using -short-paths +- PR#6837: Build profiling libraries on FreeBSD and NetBSD x86-64 - PR#6841: Changing compilation unit name with -o breaks ocamldebug - PR#6842: export Typemod.modtype_of_package - PR#6843: record weak dependencies even when the .cmi is missing diff --git a/configure b/configure index d09fc7bb15..45e9f25db7 100755 --- a/configure +++ b/configure @@ -932,6 +932,8 @@ case "$arch,$system" in case "$nativecc" in gcc*) ;; *) cc_profile='-xpg';; esac;; amd64,linux) profiling='prof';; amd64,openbsd) profiling='prof';; + amd64,freebsd) profiling='prof';; + amd64,netbsd) profiling='prof';; amd64,gnu) profiling='prof';; arm,linux*) profiling='prof';; power,elf) profiling='prof';; From f1f28e10ae4f7b76e7b92a2e72ce1fb8a33d86a9 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Wed, 6 May 2015 18:32:11 +0000 Subject: [PATCH 244/494] PR#6266: Cross compilation for iOs, Android etc git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16093 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + Makefile | 18 +-- Makefile.nt | 13 +- boot/ocamlc | Bin 1727944 -> 1728209 bytes boot/ocamldep | Bin 540825 -> 540825 bytes boot/ocamllex | Bin 254461 -> 254455 bytes bytecomp/symtable.ml | 1 + configure | 18 +++ debugger/Makefile.shared | 11 +- lex/Makefile | 16 ++- lex/Makefile.nt | 12 +- ocamlbuild/Makefile | 10 +- ocamlbuild/Makefile.noboot | 227 ------------------------------- ocamldoc/Makefile | 19 ++- ocamldoc/Makefile.nt | 18 ++- otherlibs/Makefile | 4 +- otherlibs/Makefile.shared | 1 - otherlibs/bigarray/Makefile | 2 +- otherlibs/bigarray/Makefile.nt | 2 +- otherlibs/dynlink/Makefile | 8 +- otherlibs/graph/Makefile | 2 +- otherlibs/num/Makefile | 2 +- otherlibs/str/Makefile | 2 +- otherlibs/systhreads/Makefile | 8 +- otherlibs/systhreads/Makefile.nt | 10 +- otherlibs/threads/Makefile | 2 +- otherlibs/unix/Makefile | 2 +- stdlib/Makefile.shared | 4 +- tools/Makefile.nt | 3 +- tools/Makefile.shared | 8 +- 30 files changed, 108 insertions(+), 316 deletions(-) delete mode 100644 ocamlbuild/Makefile.noboot diff --git a/Changes b/Changes index c86ebfab44..643fdf7131 100644 --- a/Changes +++ b/Changes @@ -60,6 +60,7 @@ Runtime: Build system: - PR#5418 (comments) : generate dependencies with $(CC) instead of gcc +- PR#6266: Cross compilation for iOs, Android etc Bug fixes: - PR#5271: Location.prerr_warning is hard-coded to use Format.err_formatter diff --git a/Makefile b/Makefile index 10c88bc1bf..a48e18c88d 100644 --- a/Makefile +++ b/Makefile @@ -15,18 +15,16 @@ include config/Makefile include stdlib/StdlibModules -CAMLC=boot/ocamlrun boot/ocamlc -nostdlib -I boot -CAMLOPT=boot/ocamlrun ./ocamlopt -nostdlib -I stdlib -I otherlibs/dynlink +CAMLC=$(CAMLRUN) boot/ocamlc -nostdlib -I boot -use-runtime $(CAMLRUN) +CAMLOPT=$(CAMLRUN) ./ocamlopt -nostdlib -I stdlib -I otherlibs/dynlink COMPFLAGS=-strict-sequence -w +33..39+48 -warn-error A -bin-annot \ -safe-string $(INCLUDES) LINKFLAGS= -CAMLYACC=boot/ocamlyacc YACCFLAGS=-v -CAMLLEX=boot/ocamlrun boot/ocamllex -CAMLDEP=boot/ocamlrun tools/ocamldep +CAMLLEX=$(CAMLRUN) boot/ocamllex +CAMLDEP=$(CAMLRUN) tools/ocamldep DEPFLAGS=$(INCLUDES) -CAMLRUN=byterun/ocamlrun SHELL=/bin/sh MKDIR=mkdir -p @@ -391,8 +389,9 @@ partialclean:: rm -f compilerlibs/ocamlbytecomp.cma ocamlc: compilerlibs/ocamlcommon.cma compilerlibs/ocamlbytecomp.cma $(BYTESTART) - $(CAMLC) $(LINKFLAGS) -compat-32 -o ocamlc \ - compilerlibs/ocamlcommon.cma compilerlibs/ocamlbytecomp.cma $(BYTESTART) + $(CAMLC) $(LINKFLAGS) -use-prims byterun/primitives -compat-32 \ + -o ocamlc compilerlibs/ocamlcommon.cma \ + compilerlibs/ocamlbytecomp.cma $(BYTESTART) # The native-code compiler @@ -629,7 +628,8 @@ beforedepend:: asmcomp/emit.ml tools/cvt_emit: tools/cvt_emit.mll cd tools; \ - $(MAKE) CAMLC="../$(CAMLRUN) ../boot/ocamlc -I ../stdlib" cvt_emit + $(MAKE) CAMLC="$(CAMLRUN) ../boot/ocamlc -use-runtime $(CAMLRUN) \ + -I ../stdlib" cvt_emit # The "expunge" utility diff --git a/Makefile.nt b/Makefile.nt index a436d26997..a835d60d2a 100644 --- a/Makefile.nt +++ b/Makefile.nt @@ -15,16 +15,14 @@ include config/Makefile include stdlib/StdlibModules -CAMLC=boot/ocamlrun boot/ocamlc -nostdlib -I boot -CAMLOPT=boot/ocamlrun ./ocamlopt -nostdlib -I stdlib -I otherlibs/dynlink +CAMLC=$(CAMLRUN) boot/ocamlc -nostdlib -I boot -use-runtime $(CAMLRUN) +CAMLOPT=$(CAMLRUN) ./ocamlopt -nostdlib -I stdlib -I otherlibs/dynlink COMPFLAGS=-strict-sequence -w +33..39+48 -warn-error A -bin-annot $(INCLUDES) LINKFLAGS= -CAMLYACC=boot/ocamlyacc YACCFLAGS= -CAMLLEX=boot/ocamlrun boot/ocamllex -CAMLDEP=boot/ocamlrun tools/ocamldep +CAMLLEX=$(CAMLRUN) boot/ocamllex +CAMLDEP=$(CAMLRUN) tools/ocamldep DEPFLAGS=$(INCLUDES) -CAMLRUN=byterun/ocamlrun OCAMLBUILDBYTE=$(WITH_OCAMLBUILD:=.byte) OCAMLBUILDNATIVE=$(WITH_OCAMLBUILD:=.native) @@ -311,7 +309,8 @@ partialclean:: rm -f compilerlibs/ocamlbytecomp.cma ocamlc: compilerlibs/ocamlcommon.cma compilerlibs/ocamlbytecomp.cma $(BYTESTART) - $(CAMLC) $(LINKFLAGS) -compat-32 -o ocamlc compilerlibs/ocamlcommon.cma \ + $(CAMLC) $(LINKFLAGS) -use-prims byterun/primitives \ + -compat-32 -o ocamlc compilerlibs/ocamlcommon.cma \ compilerlibs/ocamlbytecomp.cma $(BYTESTART) partialclean:: diff --git a/boot/ocamlc b/boot/ocamlc index 8cd7d040d10e98890fbafce702b693e20e66d89f..23fe803c54d3a1b0f0ad22fa362bfff5c900e0d5 100755 GIT binary patch delta 85252 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 VyM!dpz8N{$iQT$&8<UWj_&+Ihgl_-< delta 86599 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 Uf3K9B*|WOz>eVZ&bC)jv3p+y=PXGV_ diff --git a/boot/ocamldep b/boot/ocamldep index f95b73c0f1064c26d816ef8e39148c4cd7de9e4d..fd65f1e1527b4affb2f0ad8226aeb771d34f6189 100755 GIT binary patch delta 226 zcmbQ)s5rAxQ9)TzKO;XkRX-&qKPNLiwMsufIWad!-$c*ANIxk*zob#GRgbY%kEvCU zxmAy)RgZP69-FlWuL1)Dmlp%W>}m#v7|ZQt8f-Cg8m4F_<p7P!(a$eP%uUWnP0rTO z%quQQ%*oN8{@smDLBoPb)$KO!Y};+z*+qYH1o?&dGB7Y`O%HV7P**ewj`Ve6U|`XA a4ss4=U|^jDl;Us(I^NLI(lWxp&=3Gx@k9dv delta 225 zcmbQ)s5rAxQBPS>KO;XkRX;tkI5{I#UoXEPF<0M2&%j8}NING#IWb2!J+nj?B%q&^ znb)Y$s=(N)z|^Y1+^WFRs=&Hcfz4WjSBimw%Zq_wb|nKtjK%g04Yn9LRU=}|o&Ls+ zO+nR^7^Uqd?rhsl+}TBcP7ie8P*>Coj`Ve6U|`XA4ss4=U|^lZz`(%noS2(qXlZE~ IVPI$o0K@n{9smFU diff --git a/boot/ocamllex b/boot/ocamllex index 385bbeeaca889938a412c8d7e8a1cd65d75873cc..315c92f755a7de60a3131e6ec4dd67bea56f0df9 100755 GIT binary patch delta 80 zcmex+nE(4>eg$Pk{fzwFRQ;5c{G816)GGb_<iy+@eG@$cBmJcO{E|k!Rz1d6J*KUC j%<T_3g8V{!85kI}rf+@7Y|YEz3{+}pX=xc@U}y*cgnSwU delta 85 zcmex<nE&r#em!MH{fzwFRQ>eC;^d4}eZBmG#9Vz7Jp&^>Bki30<is4^^vn`nkbr(t nW?rL0s{&)I0@GFn=Jtov*FR*o=4E$I%*`>hw6u&cFf;@J^&uO? diff --git a/bytecomp/symtable.ml b/bytecomp/symtable.ml index fbec1deb5a..c4792f9807 100644 --- a/bytecomp/symtable.ml +++ b/bytecomp/symtable.ml @@ -148,6 +148,7 @@ let init () = literal_table := (c, cst) :: !literal_table) Runtimedef.builtin_exceptions; (* Initialize the known C primitives *) + (* Note that -use-prims takes precedence over -use-runtime. see PR#6266 *) if String.length !Clflags.use_prims > 0 then begin let ic = open_in !Clflags.use_prims in try diff --git a/configure b/configure index 45e9f25db7..02b6a54fe7 100755 --- a/configure +++ b/configure @@ -482,6 +482,24 @@ fi echo "CAMLRUN=$CAMLRUN" >> Makefile +# Same holds for ocamlyacc. +if test x"$target" != x"$host"; then + if ! sh ./searchpath ocamlyacc; then + err "Cross-compilation requires an ocamlyacc binary." + else + ocamlyacc 2>/dev/null + if test "$?" -ne 1; then + err "While you have an ocamlyacc binary, it cannot be executed successfully." + else + CAMLYACC="ocamlyacc" + fi + fi +else + CAMLYACC=`cd ../.. && pwd`/boot/ocamlyacc +fi + +echo "CAMLYACC=$CAMLYACC" >> Makefile + # Check the sizes of data types # OCaml needs a 32 or 64 bit architecture, a 32-bit integer type and # a 64-bit integer type diff --git a/debugger/Makefile.shared b/debugger/Makefile.shared index fed1d26dab..9c9991af9f 100644 --- a/debugger/Makefile.shared +++ b/debugger/Makefile.shared @@ -12,14 +12,12 @@ include ../config/Makefile -ROOTDIR=.. -CAMLC=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib +CAMLC=$(CAMLRUN) ../ocamlc -nostdlib -I ../stdlib COMPFLAGS=-warn-error A -safe-string $(INCLUDES) LINKFLAGS=-linkall -I $(UNIXDIR) -CAMLYACC=../boot/ocamlyacc YACCFLAGS= -CAMLLEX=../boot/ocamlrun ../boot/ocamllex -CAMLDEP=../boot/ocamlrun ../tools/ocamldep +CAMLLEX=$(CAMLRUN) ../boot/ocamllex +CAMLDEP=$(CAMLRUN) ../tools/ocamldep DEPFLAGS=$(INCLUDES) INSTALL_BINDIR=$(DESTDIR)$(BINDIR) @@ -83,7 +81,8 @@ OBJS=\ all: ocamldebug$(EXE) ocamldebug$(EXE): $(OBJS) $(OTHEROBJS) - $(CAMLC) $(LINKFLAGS) -o ocamldebug$(EXE) -linkall $(OTHEROBJS) $(OBJS) + $(CAMLC) $(LINKFLAGS) -use-runtime $(CAMLRUN) \ + -o ocamldebug$(EXE) -linkall $(OTHEROBJS) $(OBJS) install: cp ocamldebug$(EXE) $(INSTALL_BINDIR)/ocamldebug$(EXE) diff --git a/lex/Makefile b/lex/Makefile index cb5df8b41c..9c05bb1bdc 100644 --- a/lex/Makefile +++ b/lex/Makefile @@ -11,13 +11,16 @@ ######################################################################### # The lexer generator -CAMLC=../boot/ocamlrun ../boot/ocamlc -strict-sequence -nostdlib -I ../boot -CAMLOPT=../boot/ocamlrun ../ocamlopt -nostdlib -I ../stdlib +include ../config/Makefile + +CAMLC=$(CAMLRUN) ../boot/ocamlc -strict-sequence -nostdlib -I ../boot \ + -use-runtime $(CAMLRUN) +CAMLOPT=$(CAMLRUN) ../ocamlopt -nostdlib -I ../stdlib COMPFLAGS=-w +33..39 -warn-error A -bin-annot -safe-string -CAMLYACC=../boot/ocamlyacc +LINKFLAGS= YACCFLAGS=-v -CAMLLEX=../boot/ocamlrun ../boot/ocamllex -CAMLDEP=../boot/ocamlrun ../tools/ocamldep +CAMLLEX=$(CAMLRUN) ../boot/ocamllex +CAMLDEP=$(CAMLRUN) ../tools/ocamldep OBJS=cset.cmo syntax.cmo parser.cmo lexer.cmo table.cmo lexgen.cmo \ @@ -27,7 +30,8 @@ all: ocamllex allopt: ocamllex.opt ocamllex: $(OBJS) - $(CAMLC) $(LINKFLAGS) -compat-32 -o ocamllex $(OBJS) + $(CAMLC) $(LINKFLAGS) -use-prims ../byterun/primitives \ + -compat-32 -o ocamllex $(OBJS) ocamllex.opt: $(OBJS:.cmo=.cmx) $(CAMLOPT) -o ocamllex.opt $(OBJS:.cmo=.cmx) diff --git a/lex/Makefile.nt b/lex/Makefile.nt index 38c71f2e8a..81e9221f22 100644 --- a/lex/Makefile.nt +++ b/lex/Makefile.nt @@ -14,14 +14,13 @@ include ../config/Makefile -CAMLC=../boot/ocamlrun ../boot/ocamlc -I ../boot -CAMLOPT=../boot/ocamlrun ../ocamlopt -I ../stdlib +CAMLC=$(CAMLRUN) ../boot/ocamlc -I ../boot -use-runtime $(CAMLRUN) +CAMLOPT=$(CAMLRUN) ../ocamlopt -I ../stdlib COMPFLAGS=-warn-error A LINKFLAGS= -CAMLYACC=../boot/ocamlyacc YACCFLAGS=-v -CAMLLEX=../boot/ocamlrun ../boot/ocamllex -CAMLDEP=../boot/ocamlrun ../tools/ocamldep +CAMLLEX=$(CAMLRUN) ../boot/ocamllex +CAMLDEP=$(CAMLRUN) ../tools/ocamldep DEPFLAGS= OBJS=cset.cmo syntax.cmo parser.cmo lexer.cmo table.cmo lexgen.cmo \ @@ -31,7 +30,8 @@ all: ocamllex syntax.cmo allopt: ocamllex.opt ocamllex: $(OBJS) - $(CAMLC) $(LINKFLAGS) -compat-32 -o ocamllex $(OBJS) + $(CAMLC) $(LINKFLAGS) -use-prims ../byterun/primitives \ + -compat-32 -o ocamllex $(OBJS) ocamllex.opt: $(OBJS:.cmo=.cmx) $(CAMLOPT) -o ocamllex.opt $(OBJS:.cmo=.cmx) diff --git a/ocamlbuild/Makefile b/ocamlbuild/Makefile index 0a4054ddbd..48a1f81724 100644 --- a/ocamlbuild/Makefile +++ b/ocamlbuild/Makefile @@ -13,11 +13,11 @@ include ../config/Makefile ROOTDIR = .. -OCAMLRUN = $(ROOTDIR)/boot/ocamlrun -OCAMLC = $(OCAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib -OCAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib -OCAMLDEP = $(OCAMLRUN) $(ROOTDIR)/tools/ocamldep -OCAMLLEX = $(OCAMLRUN) $(ROOTDIR)/boot/ocamllex +OCAMLC = $(CAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib \ + -use-runtime $(CAMLRUN) +OCAMLOPT = $(CAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib +OCAMLDEP = $(CAMLRUN) $(ROOTDIR)/tools/ocamldep +OCAMLLEX = $(CAMLRUN) $(ROOTDIR)/boot/ocamllex CP = cp COMPFLAGS= -warn-error A -w L -w R -w Z -I ../otherlibs/$(UNIXLIB) -safe-string LINKFLAGS= -I ../otherlibs/$(UNIXLIB) diff --git a/ocamlbuild/Makefile.noboot b/ocamlbuild/Makefile.noboot deleted file mode 100644 index 313e56891c..0000000000 --- a/ocamlbuild/Makefile.noboot +++ /dev/null @@ -1,227 +0,0 @@ -#(***********************************************************************) -#(* *) -#(* ocamlbuild *) -#(* *) -#(* Wojciech Meyer *) -#(* *) -#(* Copyright 2012 Institut National de Recherche en Informatique et *) -#(* en Automatique. All rights reserved. This file is distributed *) -#(* under the terms of the Q Public License version 1.0. *) -#(* *) -#(***********************************************************************) - -# This file removes the dependency on ocamlbuild itself, thus removes need -# for bootstrap. The base for this Makefile was ocamldoc Makefile. - -include ../config/Makefile - -# Various commands and dir -########################## - -ROOTDIR = .. -OCAMLRUN = $(ROOTDIR)/boot/ocamlrun -OCAMLC = $(OCAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib -OCAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib -OCAMLDEP = $(OCAMLRUN) $(ROOTDIR)/tools/ocamldep -OCAMLLEX = $(OCAMLRUN) $(ROOTDIR)/boot/ocamllex -OCAMLLIB = $(LIBDIR) -OCAMLBIN = $(BINDIR) - -# For installation -############## -MKDIR=mkdir -p -CP=cp -f -OCAMLBUILD=ocamlbuild -OCAMLBUILD_OPT=$(OCAMLBUILD).opt -OCAMLBUILD_LIBCMA=ocamlbuildlib.cma -OCAMLBUILD_LIBCMI=ocamlbuildlib.cmi -OCAMLBUILD_LIBCMXA=ocamlbuild.cmxa -OCAMLBUILD_LIBA=ocamlbuild.$(A) -INSTALL_LIBDIR=$(DESTDIR)$(OCAMLLIB)/ocamlbuild -INSTALL_CUSTOMDIR=$(INSTALL_LIBDIR)/custom -INSTALL_BINDIR=$(DESTDIR)$(OCAMLBIN) - -INSTALL_MLIS= -INSTALL_CMIS=$(INSTALL_MLIS:.mli=.cmi) - -# Compilation -############# -OCAMLSRCDIR=.. -INCLUDES_DEP= - -INCLUDES_NODEP= -I $(OCAMLSRCDIR)/stdlib \ - -I $(OCAMLSRCDIR)/otherlibs/str \ - -I $(OCAMLSRCDIR)/otherlibs/dynlink \ - -I $(OCAMLSRCDIR)/otherlibs/$(UNIXLIB) - -INCLUDES=$(INCLUDES_DEP) $(INCLUDES_NODEP) - -COMPFLAGS=$(INCLUDES) -warn-error A -safe-string -LINKFLAGS=$(INCLUDES) - -CMOFILES_PACK= \ - ocamlbuild_Myocamlbuild_config.cmo \ - discard_printf.cmo \ - my_std.cmo \ - bool.cmo \ - glob_ast.cmo \ - glob_lexer.cmo \ - glob.cmo \ - lexers.cmo \ - my_unix.cmo \ - tags.cmo \ - display.cmo \ - log.cmo \ - param_tags.cmo \ - shell.cmo \ - slurp.cmo \ - ocamlbuild_where.cmo \ - command.cmo \ - options.cmo \ - pathname.cmo \ - digest_cache.cmo \ - resource.cmo \ - rule.cmo \ - flags.cmo \ - solver.cmo \ - report.cmo \ - ocaml_arch.cmo \ - hygiene.cmo \ - configuration.cmo \ - tools.cmo \ - fda.cmo \ - plugin.cmo \ - ocaml_utils.cmo \ - ocaml_dependencies.cmo \ - ocaml_compiler.cmo \ - ocaml_tools.cmo \ - hooks.cmo \ - findlib.cmo \ - ocaml_specific.cmo \ - exit_codes.cmo \ - main.cmo - -BASE_CMOFILES= ocamlbuild_executor.cmo \ - ocamlbuild_unix_plugin.cmo - -INSTALL_LIBFILES = $(BASE_CMOFILES) \ - $(BASE_CMOFILES:.cmo=.cmi) \ - $(OCAMLBUILD_LIBCMA) \ - $(OCAMLBUILD).cmo \ - $(OCAMLBUILD)_pack.cmi - -INSTALL_BINFILES = $(OCAMLBUILD) - -CMXFILES= $(CMOFILES:.cmo=.cmx) - -CMXFILES_PACK= $(CMOFILES_PACK:.cmo=.cmx) -CMIFILES_PACK= $(CMOFILES_PACK:.cmo=.cmi) signatures.cmi - -EXECMOFILES_PACK= $(CMOFILES_PACK) -EXECMXFILES_PACK= $(EXECMOFILES_PACK:.cmo=.cmx) -EXECMIFILES_PACK= $(EXECMOFILES_PACK:.cmo=.cmi) - -LIBCMOFILES_PACK= $(CMOFILES_PACK) -LIBCMXFILES_PACK= $(LIBCMOFILES_PACK:.cmo=.cmx) -LIBCMIFILES_PACK= $(LIBCMOFILES_PACK:.cmo=.cmi) - -# Les cmo et cmx de la distrib OCAML -OCAMLCMOFILES= -OCAMLCMXFILES=$(OCAMLCMOFILES_PACK:.cmo=.cmx) - -all: exe lib -opt: $(OCAMLBUILD).native -exe: $(OCAMLBUILD) -lib: $(OCAMLBUILD_LIBCMA) - -opt.opt: exeopt libopt -exeopt: $(OCAMLBUILD_OPT) -libopt: $(OCAMLBUILD_LIBCMXA) $(OCAMLBUILD_LIBCMI) - -debug: - $(MAKE) OCAMLPP="" - -$(OCAMLBUILD)_pack.cmo: $(CMOFILES_PACK) $(CMIFILES_PACK) - $(OCAMLC) -pack -o $@ $(LINKFLAGS) $(OCAMLCMOFILES_PACK) $(EXECMOFILES_PACK) signatures.mli - -$(OCAMLBUILD)_pack.cmx: $(EXECMXFILES_PACK) - $(OCAMLOPT) -pack -o $@ $(LINKFLAGS) $(OCAMLCMOFILES_PACK) $(EXECMXFILES_PACK) - -$(OCAMLBUILD): $(OCAMLBUILD)_pack.cmo $(CMOFILES) $(OCAMLBUILD).cmo $(BASE_CMOFILES) - $(OCAMLC) -o $@ unix.cma $(LINKFLAGS) $(OCAMLBUILD)_pack.cmo $(CMOFILES) - -$(OCAMLBUILD).native: $(OCAMLBUILD)_pack.cmx $(CMXFILES) - $(OCAMLOPT) -o $@ $(LINKFLAGS) $(CMXFILES) - -$(OCAMLBUILD_LIBCMA): $(LIBCMOFILES_PACK) - $(OCAMLC) -a -o $@ $(LINKFLAGS) $(OCAMLSRCDIR)/tools/depend.cmo $(LIBCMOFILES_PACK) -$(OCAMLBUILD_LIBCMXA): $(LIBCMXFILES) - $(OCAMLOPT) -a -o $@ $(LINKFLAGS) $(OCAMLSRCDIR)/tools/depend.cmx $(LIBCMXFILES) - -# generic rules : -################# - -.SUFFIXES: .mll .mly .ml .mli .cmo .cmi .cmx .cmxs - -.ml.cmo: - $(OCAMLC) $(OCAMLPP) $(COMPFLAGS) -c $< - -.mli.cmi: - $(OCAMLC) $(OCAMLPP) $(COMPFLAGS) -c $< - -.ml.cmx: - $(OCAMLOPT) $(OCAMLPP) $(COMPFLAGS) -c $< - -.ml.cmxs: - $(OCAMLOPT) -shared -o $@ $(OCAMLPP) $(COMPFLAGS) $< - -.mll.ml: - $(OCAMLLEX) $< - -.mly.ml: - $(OCAMLYACC) -v $< - -.mly.mli: - $(OCAMLYACC) -v $< - -# Installation targets -###################### -install: dummy - if test -d $(INSTALL_BINDIR); then : ; else $(MKDIR) $(INSTALL_BINDIR); fi - if test -d $(INSTALL_LIBDIR); then : ; else $(MKDIR) $(INSTALL_LIBDIR); fi - if test -d $(INSTALL_CUSTOMDIR); then : ; else $(MKDIR) $(INSTALL_CUSTOMDIR); fi - $(CP) $(OCAMLBUILD) $(INSTALL_BINDIR)/$(OCAMLBUILD)$(EXE) - $(CP) $(INSTALL_LIBFILES) $(INSTALL_LIBDIR) - $(CP) $(INSTALL_BINFILES) $(INSTALL_BINDIR) - -installopt: - if test -f $(OCAMLBUILD_OPT) ; then $(MAKE) installopt_really ; fi - -installopt_really: - if test -d $(INSTALL_BINDIR); then : ; else $(MKDIR) $(INSTALL_BINDIR); fi - if test -d $(INSTALL_LIBDIR); then : ; else $(MKDIR) $(INSTALL_LIBDIR); fi - $(CP) ocamlbuild.hva $(OCAMLBUILD_LIBA) $(OCAMLBUILD_LIBCMXA) $(INSTALL_LIBDIR) - $(CP) $(INSTALL_MLIS) $(INSTALL_CMIS) $(INSTALL_LIBDIR) - - -# backup, clean and depend : -############################ - -clean:: dummy - @rm -f *~ \#*\# - @rm -f $(OCAMLBUILD) $(OCAMLBUILD_OPT) *.cma *.cmxa *.cmo *.cmi *.cmx *.$(A) *.$(O) - @rm -f glob_lexer.ml lexers.ml - -depend:: - $(OCAMLDEP) $(INCLUDES_DEP) *.mli *.mll *.mly *.ml > .depend - -dummy: - -include .depend - -# Additional rules -glob_lexer.cmo: glob_lexer.cmi -lexers.cmo: lexers.cmi - -glob_lexer.cmx: glob_lexer.cmi -lexers.cmx: lexers.cmi diff --git a/ocamldoc/Makefile b/ocamldoc/Makefile index 7a487c6ca0..50a242cc29 100644 --- a/ocamldoc/Makefile +++ b/ocamldoc/Makefile @@ -15,12 +15,11 @@ include ../config/Makefile # Various commands and dir ########################## ROOTDIR = .. -OCAMLRUN = $(ROOTDIR)/boot/ocamlrun -OCAMLC = $(OCAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib -OCAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib -OCAMLDEP = $(OCAMLRUN) $(ROOTDIR)/tools/ocamldep -OCAMLLEX = $(OCAMLRUN) $(ROOTDIR)/boot/ocamllex -OCAMLYACC = $(ROOTDIR)/yacc/ocamlyacc +OCAMLC = $(CAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib \ + -use-runtime $(CAMLRUN) +OCAMLOPT = $(CAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib +OCAMLDEP = $(CAMLRUN) $(ROOTDIR)/tools/ocamldep +OCAMLLEX = $(CAMLRUN) $(ROOTDIR)/boot/ocamllex OCAMLLIB = $(LIBDIR) OCAMLBIN = $(BINDIR) @@ -233,10 +232,10 @@ odoc_see_lexer.ml: odoc_see_lexer.mll $(OCAMLLEX) $< .mly.ml: - $(OCAMLYACC) -v $< + $(CAMLYACC) -v $< .mly.mli: - $(OCAMLYACC) -v $< + $(CAMLYACC) -v $< # Installation targets ###################### @@ -343,8 +342,8 @@ clean:: dummy @rm -f generators/*.cm[aiox] generators/*.$(A) generators/*.$(O) generators/*.cmx[as] depend:: - $(OCAMLYACC) odoc_text_parser.mly - $(OCAMLYACC) odoc_parser.mly + $(CAMLYACC) odoc_text_parser.mly + $(CAMLYACC) odoc_parser.mly $(OCAMLLEX) odoc_text_lexer.mll $(OCAMLLEX) odoc_lexer.mll $(OCAMLLEX) odoc_ocamlhtml.mll diff --git a/ocamldoc/Makefile.nt b/ocamldoc/Makefile.nt index 22cd36eb03..6f6744da98 100644 --- a/ocamldoc/Makefile.nt +++ b/ocamldoc/Makefile.nt @@ -15,12 +15,10 @@ include ../config/Makefile # Various commands and dir ########################## ROOTDIR = .. -OCAMLRUN = $(ROOTDIR)/boot/ocamlrun -OCAMLC = $(OCAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib -OCAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib -OCAMLDEP = $(OCAMLRUN) $(ROOTDIR)/tools/ocamldep -OCAMLLEX = $(OCAMLRUN) $(ROOTDIR)/boot/ocamllex -OCAMLYACC = $(ROOTDIR)/yacc/ocamlyacc +OCAMLC = $(CAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib +OCAMLOPT = $(CAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib +OCAMLDEP = $(CAMLRUN) $(ROOTDIR)/tools/ocamldep +OCAMLLEX = $(CAMLRUN) $(ROOTDIR)/boot/ocamllex OCAMLLIB = $(LIBDIR) OCAMLBIN = $(BINDIR) @@ -202,10 +200,10 @@ odoc_see_lexer.ml: odoc_see_lexer.mll $(OCAMLLEX) $< .mly.ml: - $(OCAMLYACC) -v $< + $(CAMLYACC) -v $< .mly.mli: - $(OCAMLYACC) -v $< + $(CAMLYACC) -v $< # Installation targets ###################### @@ -240,8 +238,8 @@ clean:: dummy @rm -f generators/*.cm[aiox] generators/*.$(A) generators/*.$(O) generators/*.cmx[as] depend:: - $(OCAMLYACC) odoc_text_parser.mly - $(OCAMLYACC) odoc_parser.mly + $(CAMLYACC) odoc_text_parser.mly + $(CAMLYACC) odoc_parser.mly $(OCAMLLEX) odoc_text_lexer.mll $(OCAMLLEX) odoc_lexer.mll $(OCAMLLEX) odoc_ocamlhtml.mll diff --git a/otherlibs/Makefile b/otherlibs/Makefile index 8f8dc7157a..3ca2a487ff 100644 --- a/otherlibs/Makefile +++ b/otherlibs/Makefile @@ -13,8 +13,8 @@ # Common Makefile for otherlibs on the Unix ports -CAMLC=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib -CAMLOPT=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlopt -nostdlib \ +CAMLC=$(CAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib +CAMLOPT=$(CAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib \ -I $(ROOTDIR)/stdlib CFLAGS=-I$(ROOTDIR)/byterun $(SHAREDCCCOMPOPTS) $(EXTRACFLAGS) diff --git a/otherlibs/Makefile.shared b/otherlibs/Makefile.shared index 9bed5f7604..a76a0924d9 100644 --- a/otherlibs/Makefile.shared +++ b/otherlibs/Makefile.shared @@ -18,7 +18,6 @@ include $(ROOTDIR)/config/Makefile # Compilation options CC=$(BYTECC) -CAMLRUN=$(ROOTDIR)/boot/ocamlrun COMPFLAGS=-w +33..39 -warn-error A -bin-annot -g -safe-string $(EXTRACAMLFLAGS) MKLIB=$(CAMLRUN) $(ROOTDIR)/tools/ocamlmklib diff --git a/otherlibs/bigarray/Makefile b/otherlibs/bigarray/Makefile index 3f9afd5fdb..3bcc7a4022 100644 --- a/otherlibs/bigarray/Makefile +++ b/otherlibs/bigarray/Makefile @@ -22,6 +22,6 @@ include ../Makefile depend: $(CC) -MM $(CFLAGS) *.c > .depend - ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend + $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/bigarray/Makefile.nt b/otherlibs/bigarray/Makefile.nt index 32642e107f..baeaa7a160 100644 --- a/otherlibs/bigarray/Makefile.nt +++ b/otherlibs/bigarray/Makefile.nt @@ -22,6 +22,6 @@ include ../Makefile.nt depend: $(CC) -MM $(CFLAGS) *.c > .depend - ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend + $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/dynlink/Makefile b/otherlibs/dynlink/Makefile index a0563c536e..634607f399 100644 --- a/otherlibs/dynlink/Makefile +++ b/otherlibs/dynlink/Makefile @@ -18,9 +18,9 @@ include ../../config/Makefile ROOTDIR = ../.. -OCAMLRUN = $(ROOTDIR)/boot/ocamlrun -OCAMLC = $(OCAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib -OCAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib +OCAMLC = $(CAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib \ + -use-runtime $(CAMLRUN) +OCAMLOPT = $(CAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib INCLUDES=-I ../../utils -I ../../typing -I ../../bytecomp -I ../../asmcomp COMPFLAGS=-w +33..39 -warn-error A -bin-annot -g -safe-string \ @@ -71,7 +71,7 @@ dynlink.cmx: dynlink.cmi natdynlink.ml rm -f dynlink.mlopt extract_crc: dynlink.cma extract_crc.cmo - $(OCAMLC) $(COMPFLAGS) -o extract_crc dynlink.cma extract_crc.cmo + $(OCAMLC) -o extract_crc dynlink.cma extract_crc.cmo INSTALL_LIBDIR=$(DESTDIR)$(LIBDIR) diff --git a/otherlibs/graph/Makefile b/otherlibs/graph/Makefile index 2fb45807f2..850e02513e 100644 --- a/otherlibs/graph/Makefile +++ b/otherlibs/graph/Makefile @@ -27,6 +27,6 @@ include ../Makefile depend: $(CC) -MM $(CFLAGS) *.c | sed -e 's, /[^ ]*\.h,,g' > .depend - ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend + $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/num/Makefile b/otherlibs/num/Makefile index c867b2cd26..e08e02943f 100644 --- a/otherlibs/num/Makefile +++ b/otherlibs/num/Makefile @@ -32,6 +32,6 @@ bng.$(O): bng.h bng_digit.c \ depend: $(CC) -MM $(CFLAGS) *.c > .depend - ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend + $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/str/Makefile b/otherlibs/str/Makefile index 4a58d46744..93b2bf9539 100644 --- a/otherlibs/str/Makefile +++ b/otherlibs/str/Makefile @@ -28,6 +28,6 @@ str.cmx: str.cmi depend: $(CC) -MM $(CFLAGS) *.c > .depend - ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend + $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/systhreads/Makefile b/otherlibs/systhreads/Makefile index cc36a52c80..eb8e48aab1 100644 --- a/otherlibs/systhreads/Makefile +++ b/otherlibs/systhreads/Makefile @@ -14,11 +14,11 @@ include ../../config/Makefile ROOTDIR=../.. -CAMLC=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlc -nostdlib \ +CAMLC=$(CAMLRUN) $(ROOTDIR)/ocamlc -nostdlib \ -I $(ROOTDIR)/stdlib -I $(ROOTDIR)/otherlibs/unix -CAMLOPT=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlopt -nostdlib \ +CAMLOPT=$(CAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib \ -I $(ROOTDIR)/stdlib -I $(ROOTDIR)/otherlibs/unix -MKLIB=../../boot/ocamlrun ../../tools/ocamlmklib +MKLIB=$(CAMLRUN) ../../tools/ocamlmklib COMPFLAGS=-w +33..39 -warn-error A -g -bin-annot -safe-string BYTECODE_C_OBJS=st_stubs_b.o @@ -107,6 +107,6 @@ installopt: depend: $(GENFILES) -$(CC) -MM -I../../byterun *.c > .depend - ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend + $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/systhreads/Makefile.nt b/otherlibs/systhreads/Makefile.nt index 341176146f..9d743905ae 100644 --- a/otherlibs/systhreads/Makefile.nt +++ b/otherlibs/systhreads/Makefile.nt @@ -14,10 +14,10 @@ include ../../config/Makefile # Compilation options -CAMLC=../../boot/ocamlrun ../../ocamlc -I ../../stdlib -I ../win32unix -CAMLOPT=../../boot/ocamlrun ../../ocamlopt -I ../../stdlib -I ../win32unix +CAMLC=$(CAMLRUN) ../../ocamlc -I ../../stdlib -I ../win32unix +CAMLOPT=$(CAMLRUN) ../../ocamlopt -I ../../stdlib -I ../win32unix COMPFLAGS=-w +33 -warn-error A -g -MKLIB=../../boot/ocamlrun ../../tools/ocamlmklib +MKLIB=$(CAMLRUN) ../../tools/ocamlmklib CFLAGS=-I../../byterun $(EXTRACFLAGS) CAMLOBJS=thread.cmo mutex.cmo condition.cmo event.cmo threadUnix.cmo @@ -32,7 +32,7 @@ all: lib$(LIBNAME).$(A) $(LIBNAME).cma $(CMIFILES) allopt: lib$(LIBNAME).$(A) $(LIBNAME).cmxa $(LIBNAME).cmxs $(CMIFILES) $(LIBNAME).cma: $(CAMLOBJS) - $(MKLIB) -o $(LIBNAME) -ocamlc "../../boot/ocamlrun ../../ocamlc" \ + $(MKLIB) -o $(LIBNAME) -ocamlc "$(CAMLRUN) ../../ocamlc" \ -linkall $(CAMLOBJS) $(LINKOPTS) lib$(LIBNAME).$(A): $(COBJS) @@ -46,7 +46,7 @@ st_stubs_b.$(O): st_stubs.c st_win32.h $(LIBNAME).cmxa: $(CAMLOBJS:.cmo=.cmx) $(MKLIB) -o $(LIBNAME)nat \ - -ocamlopt "../../boot/ocamlrun ../../ocamlopt" -linkall \ + -ocamlopt "$(CAMLRUN) ../../ocamlopt" -linkall \ $(CAMLOBJS:.cmo=.cmx) $(LINKOPTS) mv $(LIBNAME)nat.cmxa $(LIBNAME).cmxa mv $(LIBNAME)nat.$(A) $(LIBNAME).$(A) diff --git a/otherlibs/threads/Makefile b/otherlibs/threads/Makefile index 50fb422bae..699101fc2e 100644 --- a/otherlibs/threads/Makefile +++ b/otherlibs/threads/Makefile @@ -124,6 +124,6 @@ installopt: depend: $(CC) -MM $(CFLAGS) *.c > .depend - ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend + $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/unix/Makefile b/otherlibs/unix/Makefile index e41a1e1ddd..faebd3f5c8 100644 --- a/otherlibs/unix/Makefile +++ b/otherlibs/unix/Makefile @@ -42,6 +42,6 @@ include ../Makefile depend: $(CC) -MM $(CFLAGS) *.c > .depend - ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend + $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/stdlib/Makefile.shared b/stdlib/Makefile.shared index 54de337cb4..1e9416dc7e 100755 --- a/stdlib/Makefile.shared +++ b/stdlib/Makefile.shared @@ -14,11 +14,11 @@ include ../config/Makefile RUNTIME=../boot/ocamlrun COMPILER=../ocamlc -CAMLC=$(RUNTIME) $(COMPILER) +CAMLC=$(CAMLRUN) $(COMPILER) COMPFLAGS=-strict-sequence -w +33..39 -g -warn-error A -bin-annot -nostdlib \ -safe-string OPTCOMPILER=../ocamlopt -CAMLOPT=$(RUNTIME) $(OPTCOMPILER) +CAMLOPT=$(CAMLRUN) $(OPTCOMPILER) CAMLDEP=../boot/ocamlrun ../tools/ocamldep OBJS=camlinternalFormatBasics.cmo pervasives.cmo $(OTHERS) diff --git a/tools/Makefile.nt b/tools/Makefile.nt index ed9b35946d..7da3b78dc8 100644 --- a/tools/Makefile.nt +++ b/tools/Makefile.nt @@ -18,7 +18,8 @@ OCAMLMKTOP=ocamlmktop.cmo OCAMLMKTOP_IMPORTS=misc.cmo config.cmo clflags.cmo ccomp.cmo ocamlmktop: $(OCAMLMKTOP) - $(CAMLC) $(LINKFLAGS) -o ocamlmktop $(OCAMLMKTOP_IMPORTS) $(OCAMLMKTOP) + $(CAMLC) $(LINKFLAGS) -use-runtime $(CAMLRUN) -o ocamlmktop \ + $(OCAMLMKTOP_IMPORTS) $(OCAMLMKTOP) install:: cp ocamlmktop $(INSTALL_BINDIR)/ocamlmktop$(EXE) diff --git a/tools/Makefile.shared b/tools/Makefile.shared index 417c2a6f17..929f1caed2 100644 --- a/tools/Makefile.shared +++ b/tools/Makefile.shared @@ -12,8 +12,7 @@ include ../config/Makefile -CAMLRUN=../boot/ocamlrun -CAMLC=$(CAMLRUN) ../boot/ocamlc -nostdlib -I ../boot +CAMLC=$(CAMLRUN) ../boot/ocamlc -nostdlib -I ../boot -use-runtime $(CAMLRUN) CAMLOPT=$(CAMLRUN) ../ocamlopt -nostdlib -I ../stdlib CAMLLEX=$(CAMLRUN) ../boot/ocamllex INCLUDES=-I ../utils -I ../parsing -I ../typing -I ../bytecomp -I ../asmcomp \ @@ -42,7 +41,8 @@ CAMLDEP_IMPORTS=misc.cmo config.cmo clflags.cmo terminfo.cmo \ ccomp.cmo ast_mapper.cmo pparse.cmo compenv.cmo ocamldep: depend.cmi $(CAMLDEP_OBJ) - $(CAMLC) $(LINKFLAGS) -compat-32 -o ocamldep $(CAMLDEP_IMPORTS) $(CAMLDEP_OBJ) + $(CAMLC) $(LINKFLAGS) -use-prims ../byterun/primitives -compat-32 \ + -o ocamldep $(CAMLDEP_IMPORTS) $(CAMLDEP_OBJ) ocamldep.opt: depend.cmi $(CAMLDEP_OBJ:.cmo=.cmx) $(CAMLOPT) $(LINKFLAGS) -o ocamldep.opt $(CAMLDEP_IMPORTS:.cmo=.cmx) \ @@ -165,7 +165,7 @@ ADDLABELS_IMPORTS=misc.cmo config.cmo clflags.cmo terminfo.cmo \ addlabels: addlabels.cmo $(CAMLC) $(LINKFLAGS) -w sl -o addlabels \ - $(ADDLABELS_IMPORTS) addlabels.cmo + $(ADDLABELS_IMPORTS) addlabels.cmo #install:: # cp addlabels $(INSTALL_LIBDIR) From 66be34d1af1d2ca5feede437156d118bbf97283c Mon Sep 17 00:00:00 2001 From: Mark Shinwell <mshinwell@janestreet.com> Date: Wed, 6 May 2015 18:44:50 +0000 Subject: [PATCH 245/494] Fix PR#6834: Add Obj.{first,last}_non_constant_constructor_tag git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16094 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + boot/ocamlc | Bin 1728209 -> 1728250 bytes boot/ocamldep | Bin 540825 -> 540866 bytes boot/ocamllex | Bin 254455 -> 254494 bytes stdlib/obj.ml | 3 +++ stdlib/obj.mli | 3 +++ 6 files changed, 7 insertions(+) diff --git a/Changes b/Changes index 643fdf7131..22704c3383 100644 --- a/Changes +++ b/Changes @@ -46,6 +46,7 @@ Libraries: (Damien Doligez, report by Berke Durak) - PR#6285: Add support for nanosecond precision in Unix.stat() (Jérémie Dimino, report by user 'gfxmonk') +- PR#6834: Add Obj.{first,last}_non_constant_constructor_tag Tools: - PR#6641: add -g, -ocamlcflags, -ocamloptflags options to ocamlmklib diff --git a/boot/ocamlc b/boot/ocamlc index 23fe803c54d3a1b0f0ad22fa362bfff5c900e0d5..a150cb31818aec4377eed309f461e6dae024f585 100755 GIT binary patch delta 641 zcmcb(H}lutOeJMS{oK3~{ha*d#2o$Nlte@Q+~SPPyz<nX9DSfzZjSCo@%s5Z84L^z zIY9gsh$l~*-{F}2|Nnn3AV(XB8G+ad$md4lD+2jENPIRRUkJz-1!52_J~@6t_w>AG zW&v4UsE|I8wgX}bAO-<pAeP+BzOX-ukz@LFW=3O1mg%RN8QoEM`qSTCVBwfv$HM3W z6hF+uSk1`MZqLfN-JX?6KZKEcdVVC6Gb7Jr{dv;c&qXrnFfnp%{~gWrdnzN_^zR>; z+!@*0?LRRAF*6Xe05K~NgT&Z@7--TbP9Ww2Vs0Sj0b*Vt<^y7WAQsqe|4A@^7SLVm zdxWf~f7-+>vi)C=Pyi!P#J^7n=oAoTy`8OJ=)i0shg(lrdix_SVG$-MXS$HCZ~`X> z(4!7O%sRdQuCRFfBwgX{lXOM?uueY)RNB7CSY-PmV^N)TjBMM_KNNj4kuiMxo?@{a z`Fb-#QD>rOV5FOwS6q?^jLn?PBuI>E_&YoL`uKP{sY7W_OOgyq%FF{B)V_4G7!ZpC zvBdVJlO=B*7U*X5J6h$gJKs`in_cY7i=VdlhfDor<1}^lcX4G9i{qF+F-}UJF?;&P HI4K1H;0?_$ delta 579 zcmeyhH}m4&OmSsJ{fzwFRQ;5c{G816)GGb_<iy+@{f$cX^Cz#J-{F|{|Nnn31_lOg zAZ7$&S0JAoiLV0W^C0m#fqWq#Ul@o%wCMDCPlTkW&-GxEnY?yE$n?GYcsWEthS>qJ z7!ZR1NU`{4y@mZr(>L03Nld@W%qYXiG(C@nQGdE33!?<OXf-3-^j9p5K&m~Bm2rC- zE0cZ*Bj@yKkxb5vT-$F&GPyG`a%@+MVfsClk!8BvCnk4BmiDwyOhC*G#2_{+5Ce68 zVh3UlAm#*OE+FOxVjdvo1!6uR<_BVd?P;F`^Jf8Fbgf6odiuszA(8E>y+Q$u(?8k^ z%1r0&7gCtMu}{bW=qkTPA?4{a`-CL6>-GyBm_2=~v53faMr~mkCNOilp{{TSnAN^k zS9tqcT@em8pwqS)i)`O!ENZ`wk!Ab0hoWyLGKOw{Tr8F&uVac9J2}AU$<fa*NX$*n zNKMYx&&(?>NzBR7H_<aNnqD(mOh(6o1Rd>1CyN2GI1o#0KRQ|R@nM0c7>B$^7xgac pU(`MD<eseB_8s9;KiN37oc&!~8N_1WOy3nJCC`{S{Z^cm0ss|s#-{)P diff --git a/boot/ocamldep b/boot/ocamldep index fd65f1e1527b4affb2f0ad8226aeb771d34f6189..0a14820135e6f5a40171486e6597040509117551 100755 GIT binary patch delta 427 zcmbQ)sCcMRQAt@*KR2&LKPNvqF-N~RCDBknw>Tp+uRJv;M;|Dbo1?o?yna4U1_J{_ z4iJ9@;>pwIcQ_{h|Noy0$k7I3Mj&<q^0|@tia<UO5}yso7XtD{ffz)KPmW*EJ^h>x zvw*BFR7f94+X1lz5QBg)5KC@mUud4d$T8iXk<pluW%_$YM*ZoF7#Sr{gsOqOY$iq^ z)&87`ar<*7CjAgb?#cS|#HZ_pGwCq$0GZO;%YaNKMy~e7kxW3$48$zk7e})0ILD~8 zJw}5qLr&L>P*|Ag85rqi<`tJD=HyKO;KnASYe|Zhb_;j5?H2CrC0_-)8U2n{x$Dli pRN7`2`|{$a?R#uErZ97wI{Ul0GO!7)m>%iCA<t+wz0!e00RSWHdSw6r delta 466 zcmX@qs5rAxQCwM3KO;XkRX-&qKPNLiwMsufIWad!f1^_U{K;$QcQ~f~|Nozhfq_9A zh#7&{70BmC;;R7pJV<;_AYTZ`7Y1SwEjoSGLq_T8wKG{Irtd9c(wOcl!e}6?36%wz zY6rw(KnwyPUE-Vd7Mdq8vQ1B8WHe@Enm&t>(H(`SKi&5XGskpaCPo*a_#`IAYDTtp zK4!-4e9TPxA&i{U?ZTOy8M#1|`1YCMOa@Gh9POtfnShuXh*`Fuie%k!j!|KIvj$s+ zoQ^440OSBeAV)vHATc*NBQ-f&KQphmBrzvP-$c*AXu5<un~aVH2|C&n-PyJ$y0e#j z6=;fa$a{2A@1p)i-2+eV$*OICYQr&w*;C8e-^G=IO{mAkCm;kA2rfQ8!5}&y$kP`X sfb(1&LmU~H_)LN$eVrH>SoEEPoPqMJlYmM%oPm*LXlZE~VPI$o09n6)LjV8( diff --git a/boot/ocamllex b/boot/ocamllex index 315c92f755a7de60a3131e6ec4dd67bea56f0df9..0b8d77951581ceab013cab6a07cb58d03cfc65ed 100755 GIT binary patch delta 265 zcmex<n19|8ekEl^{oK3~{ha*d#2o$Nlte@Q+~SPPyz<nX9DSfzZjSCo@%s5Z84L^z zIY9gsh$l~*-{F}2|Nnn3AV(XB8G+ad$md4lD+2jENPIRRUkJz-1!52_J~@6t_hhde z0a;zBh(3_E17Zmv1_5CpmfXy~us?~BWBPPvMq@^n>8F_)-BEb@)5};GeSkuTSs1Gs zIoj=68G)E-yFDxO%$ow;jDAO}+;!($Ds8iieR=WI_80e<k1=tYI{Ul0GB9U$OyB;H G*#Q7D!AC&= delta 237 zcmbPtg#Y_tesN_*{fzwFRQ;5c{G816)GGb_<iy+@{f$cX^Cz#J-{F|{|Nnn31_lOg zAZ7$&S0JAoiLV0W^C0m#fqWq#Ul@o%wCLor1>LfmP#(w>J0KPVVh{kS65p)1us?~B zZTdcDMq@^%>3J-S`qLFz7$s1Is)4*$EQ~;^J&lzSh?%yhu`<uRDbN(-koV}K-bMY3 gx(A-zlU3W!f1mjn6Q`E5zl$pab7s!;dk>i%0Nn#X5&!@I diff --git a/stdlib/obj.ml b/stdlib/obj.ml index ac9695cdb8..5cb970b8e4 100644 --- a/stdlib/obj.ml +++ b/stdlib/obj.ml @@ -37,6 +37,9 @@ let marshal (obj : t) = let unmarshal str pos = (Marshal.from_bytes str pos, pos + Marshal.total_size str pos) +let first_non_constant_constructor_tag = 0 +let last_non_constant_constructor_tag = 245 + let lazy_tag = 246 let closure_tag = 247 let object_tag = 248 diff --git a/stdlib/obj.mli b/stdlib/obj.mli index 3395fa86f5..6d06312b4d 100644 --- a/stdlib/obj.mli +++ b/stdlib/obj.mli @@ -36,6 +36,9 @@ external truncate : t -> int -> unit = "caml_obj_truncate" external add_offset : t -> Int32.t -> t = "caml_obj_add_offset" (* @since 3.12.0 *) +val first_non_constant_constructor_tag : int +val last_non_constant_constructor_tag : int + val lazy_tag : int val closure_tag : int val object_tag : int From ed60dece81575305b5f1f7394cdda652b65b037a Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Wed, 6 May 2015 20:00:43 +0000 Subject: [PATCH 246/494] supplemental fix for PR#6797 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16095 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- VERSION | 2 +- bytecomp/bytelink.ml | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 4e914ef292..b871a3ad9e 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.02.2+dev4-2015-03-25 +4.02.2+dev5-2015-05-06 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli diff --git a/bytecomp/bytelink.ml b/bytecomp/bytelink.ml index 9b8b9747f1..67072678a6 100644 --- a/bytecomp/bytelink.ml +++ b/bytecomp/bytelink.ml @@ -573,7 +573,10 @@ let link ppf objfiles output_name = raise x end else begin let basename = Filename.chop_extension output_name in - let c_file = basename ^ ".c" + let c_file = + if !Clflags.output_complete_object + then Filename.temp_file "camlobj" ".c" + else basename ^ ".c" and obj_file = if !Clflags.output_complete_object then Filename.temp_file "camlobj" Config.ext_obj From b06b83f54b21d9f9e3df50f5f1e3bb8cf1fd6ba1 Mon Sep 17 00:00:00 2001 From: Mark Shinwell <mshinwell@janestreet.com> Date: Wed, 6 May 2015 20:03:58 +0000 Subject: [PATCH 247/494] Fix PR#6810: Improve documentation of Bigarray.Genarray.map_file git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16096 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + otherlibs/bigarray/bigarray.mli | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 22704c3383..7f239b35da 100644 --- a/Changes +++ b/Changes @@ -128,6 +128,7 @@ Bug fixes: - PR#6793: ocamlbuild passes nonsensical "-ocamlc ..." commands to menhir (Gabriel Scherer, report by Damien Doligez) - PR#6799: include guards missing for unixsupport.h and other files +- PR#6810: Improve documentation of Bigarray.Genarray.map_file - PR#6812: -short-paths and -no-alias-deps can create inconsistent assumptions - PR#6817: GADT exhaustiveness breakage with modules - PR#6824: fix buffer sharing on partial application of Format.asprintf diff --git a/otherlibs/bigarray/bigarray.mli b/otherlibs/bigarray/bigarray.mli index b3016a7171..6bde90a91c 100644 --- a/otherlibs/bigarray/bigarray.mli +++ b/otherlibs/bigarray/bigarray.mli @@ -452,7 +452,11 @@ module Genarray : the initial call to [map_file]. Therefore, you should make sure no other process modifies the mapped file while you're accessing it, or a SIGBUS signal may be raised. This happens, for instance, if the - file is shrinked. *) + file is shrunk. + + This function raises [Sys_error] in the case of any errors from the + underlying system calls. [Invalid_argument] or [Failure] may be + raised in cases where argument validation fails. *) end From 36a68e6decba3e50565f072ae2212fd5c6012971 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Wed, 6 May 2015 20:29:55 +0000 Subject: [PATCH 248/494] revert 16093 (problem with absolute paths in #! headers) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16097 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 - Makefile | 18 +-- Makefile.nt | 13 +- boot/ocamlc | Bin 1728250 -> 1727944 bytes boot/ocamldep | Bin 540866 -> 540825 bytes boot/ocamllex | Bin 254494 -> 254461 bytes bytecomp/symtable.ml | 1 - configure | 18 --- debugger/Makefile.shared | 11 +- lex/Makefile | 16 +-- lex/Makefile.nt | 12 +- ocamlbuild/Makefile | 10 +- ocamlbuild/Makefile.noboot | 227 +++++++++++++++++++++++++++++++ ocamldoc/Makefile | 19 +-- ocamldoc/Makefile.nt | 18 +-- otherlibs/Makefile | 4 +- otherlibs/Makefile.shared | 1 + otherlibs/bigarray/Makefile | 2 +- otherlibs/bigarray/Makefile.nt | 2 +- otherlibs/dynlink/Makefile | 8 +- otherlibs/graph/Makefile | 2 +- otherlibs/num/Makefile | 2 +- otherlibs/str/Makefile | 2 +- otherlibs/systhreads/Makefile | 8 +- otherlibs/systhreads/Makefile.nt | 10 +- otherlibs/threads/Makefile | 2 +- otherlibs/unix/Makefile | 2 +- stdlib/Makefile.shared | 4 +- tools/Makefile.nt | 3 +- tools/Makefile.shared | 8 +- 30 files changed, 316 insertions(+), 108 deletions(-) create mode 100644 ocamlbuild/Makefile.noboot diff --git a/Changes b/Changes index 7f239b35da..e3180fbe02 100644 --- a/Changes +++ b/Changes @@ -61,7 +61,6 @@ Runtime: Build system: - PR#5418 (comments) : generate dependencies with $(CC) instead of gcc -- PR#6266: Cross compilation for iOs, Android etc Bug fixes: - PR#5271: Location.prerr_warning is hard-coded to use Format.err_formatter diff --git a/Makefile b/Makefile index a48e18c88d..10c88bc1bf 100644 --- a/Makefile +++ b/Makefile @@ -15,16 +15,18 @@ include config/Makefile include stdlib/StdlibModules -CAMLC=$(CAMLRUN) boot/ocamlc -nostdlib -I boot -use-runtime $(CAMLRUN) -CAMLOPT=$(CAMLRUN) ./ocamlopt -nostdlib -I stdlib -I otherlibs/dynlink +CAMLC=boot/ocamlrun boot/ocamlc -nostdlib -I boot +CAMLOPT=boot/ocamlrun ./ocamlopt -nostdlib -I stdlib -I otherlibs/dynlink COMPFLAGS=-strict-sequence -w +33..39+48 -warn-error A -bin-annot \ -safe-string $(INCLUDES) LINKFLAGS= +CAMLYACC=boot/ocamlyacc YACCFLAGS=-v -CAMLLEX=$(CAMLRUN) boot/ocamllex -CAMLDEP=$(CAMLRUN) tools/ocamldep +CAMLLEX=boot/ocamlrun boot/ocamllex +CAMLDEP=boot/ocamlrun tools/ocamldep DEPFLAGS=$(INCLUDES) +CAMLRUN=byterun/ocamlrun SHELL=/bin/sh MKDIR=mkdir -p @@ -389,9 +391,8 @@ partialclean:: rm -f compilerlibs/ocamlbytecomp.cma ocamlc: compilerlibs/ocamlcommon.cma compilerlibs/ocamlbytecomp.cma $(BYTESTART) - $(CAMLC) $(LINKFLAGS) -use-prims byterun/primitives -compat-32 \ - -o ocamlc compilerlibs/ocamlcommon.cma \ - compilerlibs/ocamlbytecomp.cma $(BYTESTART) + $(CAMLC) $(LINKFLAGS) -compat-32 -o ocamlc \ + compilerlibs/ocamlcommon.cma compilerlibs/ocamlbytecomp.cma $(BYTESTART) # The native-code compiler @@ -628,8 +629,7 @@ beforedepend:: asmcomp/emit.ml tools/cvt_emit: tools/cvt_emit.mll cd tools; \ - $(MAKE) CAMLC="$(CAMLRUN) ../boot/ocamlc -use-runtime $(CAMLRUN) \ - -I ../stdlib" cvt_emit + $(MAKE) CAMLC="../$(CAMLRUN) ../boot/ocamlc -I ../stdlib" cvt_emit # The "expunge" utility diff --git a/Makefile.nt b/Makefile.nt index a835d60d2a..a436d26997 100644 --- a/Makefile.nt +++ b/Makefile.nt @@ -15,14 +15,16 @@ include config/Makefile include stdlib/StdlibModules -CAMLC=$(CAMLRUN) boot/ocamlc -nostdlib -I boot -use-runtime $(CAMLRUN) -CAMLOPT=$(CAMLRUN) ./ocamlopt -nostdlib -I stdlib -I otherlibs/dynlink +CAMLC=boot/ocamlrun boot/ocamlc -nostdlib -I boot +CAMLOPT=boot/ocamlrun ./ocamlopt -nostdlib -I stdlib -I otherlibs/dynlink COMPFLAGS=-strict-sequence -w +33..39+48 -warn-error A -bin-annot $(INCLUDES) LINKFLAGS= +CAMLYACC=boot/ocamlyacc YACCFLAGS= -CAMLLEX=$(CAMLRUN) boot/ocamllex -CAMLDEP=$(CAMLRUN) tools/ocamldep +CAMLLEX=boot/ocamlrun boot/ocamllex +CAMLDEP=boot/ocamlrun tools/ocamldep DEPFLAGS=$(INCLUDES) +CAMLRUN=byterun/ocamlrun OCAMLBUILDBYTE=$(WITH_OCAMLBUILD:=.byte) OCAMLBUILDNATIVE=$(WITH_OCAMLBUILD:=.native) @@ -309,8 +311,7 @@ partialclean:: rm -f compilerlibs/ocamlbytecomp.cma ocamlc: compilerlibs/ocamlcommon.cma compilerlibs/ocamlbytecomp.cma $(BYTESTART) - $(CAMLC) $(LINKFLAGS) -use-prims byterun/primitives \ - -compat-32 -o ocamlc compilerlibs/ocamlcommon.cma \ + $(CAMLC) $(LINKFLAGS) -compat-32 -o ocamlc compilerlibs/ocamlcommon.cma \ compilerlibs/ocamlbytecomp.cma $(BYTESTART) partialclean:: diff --git a/boot/ocamlc b/boot/ocamlc index a150cb31818aec4377eed309f461e6dae024f585..8cd7d040d10e98890fbafce702b693e20e66d89f 100755 GIT binary patch delta 86781 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 Jr$fh%{|`0Hcjy2B delta 85646 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 diff --git a/boot/ocamldep b/boot/ocamldep index 0a14820135e6f5a40171486e6597040509117551..f95b73c0f1064c26d816ef8e39148c4cd7de9e4d 100755 GIT binary patch delta 494 zcmX@qs5rAxQBPS>KO;XkRX;tkI5{I#UoXEPF<0M2&%j8}NING#IWb2!J+nj?B%q&^ znYU59Z2si6^E({V{{R2a#lXOz4aAH<><Z*_Bk@&$d>$k|Cy*}$<O>5ah!&l`>LH`_ z^xB!M64Un<F=<S96=5`x)r87|Otk}IF(3v3kS_7fdJD}H7}=($F)|u6GEJYw$mov3 z)1U5phM8l!FB78+P<#>-V>KgNJ0COSc0Oh%{SZdZ>2~2v&Wv0jN__jwa3%vLMvnGV zkxW3$48$zkPerosIL9l+z`*6jz%aX#fg#3Xd%p%-jGU$sv0*e_!ktY<)09}{?TPMe z+Y{Z{OTG#;#W>_Wx~O+i|Dx`JC--F4wm-Gu=w<eB_IGh*U=!+b@d*e4g@lWbPcVoM x2=ep=hT=RI#}G#bCO*C3NM9!g1{QtiAZMUF>m;BOcIU+0979V>%LoHQLja`5f#m=I delta 485 zcmbQ)sCcMRQCnG2KR2&LKPNvqF-N~RCDBknw>Tp+uRJv;M;|Dbo1<%@XJDkCl%HR+ zQLk)1W5)D{%FN=EH_WebO#c7>KNkZ7gEkN|0<ja2&yB=a1oC;1_-sJF5Rfkl#2{LH z`oxEf($hCgVr7{=p@_+5`WhW(hv^+6tUQ8tKxqje1_5CpmfS45&^&>WW4bRRqcJ1P z^hQQTcNCufbb-6f9Mesh7+rwkl}wD)j2!J>nHaZ!Wn$6~VdS1{J5PMNO*oSdBM*=% zy}bp<WMbrM-x$dR#LPg<vVCJD>yC50N(>BKUJMMgs~H$#EVq|wu*Jyfnh_I5x|w;! zC5bsX(|^0M$>>^=qNUxzoo%~=JA27jfo?{>qgC#@^DULO*~PxR_-XqQ8;)LPfgryS zUtl<xI{Ul0GO!7)m>%iCA+Kl_9O>)Cz`&yK9ON9#z`!~QsD#5A7-@!<mX;9)hK2x? CsEf4# diff --git a/boot/ocamllex b/boot/ocamllex index 0b8d77951581ceab013cab6a07cb58d03cfc65ed..385bbeeaca889938a412c8d7e8a1cd65d75873cc 100755 GIT binary patch delta 273 zcmbPtg#Yhhem!MH{fzwFRQ>eC;^d4}eZBmG#9Vz7Jp&^>Bki30<is4^^vn`nkbr(t zX5L2aviXzO&hKzc`~Uwx7Xt%>HV`ucu`7_zjl@?0@_CT>oIt)1kS`3xAX;>C*@A9a zO(+j!iX9M(0Wk=GREclaTiBn($Toc+Govvh)AT$RM*ZoEEQ}H;Le)UtD;7o|)t<)6 z2*ga=(^#2j-V|txamaggQSYMuMco5W?#Zfc=fBUqpNYfS-^G=IIWuSay@$-kyzI`2 OxjBZGmX;9)hK2yd^+{6z delta 314 zcmex+n19|8er;t%{oK3~{ha*d#2o$Nlte@Q+~SPPyz<nX9DSfzZjP>ro`I2mQht8P zM!mB6JQ)lO3^_pj6^JJ<ncv}<{Qv)dE+9u6h#7&{3CQP0;wu9AJV<;tAYTZ`7X@Mv zEk0e4jZu8s6GoQl2mF~-rhhoWBs2NM0)xpBIRdh}P(}Jc+75^%fEWaXfmm|0=)(Ra zMvm!<ER4oL-8Y#T-BEb@(_2^=eSkt2Ss1GsIof?$8G)E-yDuyA%$ow;jDAO}+;!($ zDs8iieR=WI_HXx?_cI9u`Gxob4L5c6cX4H4&g_`J_aU<}FNZTQBn&MrEh7vJ4FO`( BRMP+e diff --git a/bytecomp/symtable.ml b/bytecomp/symtable.ml index c4792f9807..fbec1deb5a 100644 --- a/bytecomp/symtable.ml +++ b/bytecomp/symtable.ml @@ -148,7 +148,6 @@ let init () = literal_table := (c, cst) :: !literal_table) Runtimedef.builtin_exceptions; (* Initialize the known C primitives *) - (* Note that -use-prims takes precedence over -use-runtime. see PR#6266 *) if String.length !Clflags.use_prims > 0 then begin let ic = open_in !Clflags.use_prims in try diff --git a/configure b/configure index 02b6a54fe7..45e9f25db7 100755 --- a/configure +++ b/configure @@ -482,24 +482,6 @@ fi echo "CAMLRUN=$CAMLRUN" >> Makefile -# Same holds for ocamlyacc. -if test x"$target" != x"$host"; then - if ! sh ./searchpath ocamlyacc; then - err "Cross-compilation requires an ocamlyacc binary." - else - ocamlyacc 2>/dev/null - if test "$?" -ne 1; then - err "While you have an ocamlyacc binary, it cannot be executed successfully." - else - CAMLYACC="ocamlyacc" - fi - fi -else - CAMLYACC=`cd ../.. && pwd`/boot/ocamlyacc -fi - -echo "CAMLYACC=$CAMLYACC" >> Makefile - # Check the sizes of data types # OCaml needs a 32 or 64 bit architecture, a 32-bit integer type and # a 64-bit integer type diff --git a/debugger/Makefile.shared b/debugger/Makefile.shared index 9c9991af9f..fed1d26dab 100644 --- a/debugger/Makefile.shared +++ b/debugger/Makefile.shared @@ -12,12 +12,14 @@ include ../config/Makefile -CAMLC=$(CAMLRUN) ../ocamlc -nostdlib -I ../stdlib +ROOTDIR=.. +CAMLC=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib COMPFLAGS=-warn-error A -safe-string $(INCLUDES) LINKFLAGS=-linkall -I $(UNIXDIR) +CAMLYACC=../boot/ocamlyacc YACCFLAGS= -CAMLLEX=$(CAMLRUN) ../boot/ocamllex -CAMLDEP=$(CAMLRUN) ../tools/ocamldep +CAMLLEX=../boot/ocamlrun ../boot/ocamllex +CAMLDEP=../boot/ocamlrun ../tools/ocamldep DEPFLAGS=$(INCLUDES) INSTALL_BINDIR=$(DESTDIR)$(BINDIR) @@ -81,8 +83,7 @@ OBJS=\ all: ocamldebug$(EXE) ocamldebug$(EXE): $(OBJS) $(OTHEROBJS) - $(CAMLC) $(LINKFLAGS) -use-runtime $(CAMLRUN) \ - -o ocamldebug$(EXE) -linkall $(OTHEROBJS) $(OBJS) + $(CAMLC) $(LINKFLAGS) -o ocamldebug$(EXE) -linkall $(OTHEROBJS) $(OBJS) install: cp ocamldebug$(EXE) $(INSTALL_BINDIR)/ocamldebug$(EXE) diff --git a/lex/Makefile b/lex/Makefile index 9c05bb1bdc..cb5df8b41c 100644 --- a/lex/Makefile +++ b/lex/Makefile @@ -11,16 +11,13 @@ ######################################################################### # The lexer generator -include ../config/Makefile - -CAMLC=$(CAMLRUN) ../boot/ocamlc -strict-sequence -nostdlib -I ../boot \ - -use-runtime $(CAMLRUN) -CAMLOPT=$(CAMLRUN) ../ocamlopt -nostdlib -I ../stdlib +CAMLC=../boot/ocamlrun ../boot/ocamlc -strict-sequence -nostdlib -I ../boot +CAMLOPT=../boot/ocamlrun ../ocamlopt -nostdlib -I ../stdlib COMPFLAGS=-w +33..39 -warn-error A -bin-annot -safe-string -LINKFLAGS= +CAMLYACC=../boot/ocamlyacc YACCFLAGS=-v -CAMLLEX=$(CAMLRUN) ../boot/ocamllex -CAMLDEP=$(CAMLRUN) ../tools/ocamldep +CAMLLEX=../boot/ocamlrun ../boot/ocamllex +CAMLDEP=../boot/ocamlrun ../tools/ocamldep OBJS=cset.cmo syntax.cmo parser.cmo lexer.cmo table.cmo lexgen.cmo \ @@ -30,8 +27,7 @@ all: ocamllex allopt: ocamllex.opt ocamllex: $(OBJS) - $(CAMLC) $(LINKFLAGS) -use-prims ../byterun/primitives \ - -compat-32 -o ocamllex $(OBJS) + $(CAMLC) $(LINKFLAGS) -compat-32 -o ocamllex $(OBJS) ocamllex.opt: $(OBJS:.cmo=.cmx) $(CAMLOPT) -o ocamllex.opt $(OBJS:.cmo=.cmx) diff --git a/lex/Makefile.nt b/lex/Makefile.nt index 81e9221f22..38c71f2e8a 100644 --- a/lex/Makefile.nt +++ b/lex/Makefile.nt @@ -14,13 +14,14 @@ include ../config/Makefile -CAMLC=$(CAMLRUN) ../boot/ocamlc -I ../boot -use-runtime $(CAMLRUN) -CAMLOPT=$(CAMLRUN) ../ocamlopt -I ../stdlib +CAMLC=../boot/ocamlrun ../boot/ocamlc -I ../boot +CAMLOPT=../boot/ocamlrun ../ocamlopt -I ../stdlib COMPFLAGS=-warn-error A LINKFLAGS= +CAMLYACC=../boot/ocamlyacc YACCFLAGS=-v -CAMLLEX=$(CAMLRUN) ../boot/ocamllex -CAMLDEP=$(CAMLRUN) ../tools/ocamldep +CAMLLEX=../boot/ocamlrun ../boot/ocamllex +CAMLDEP=../boot/ocamlrun ../tools/ocamldep DEPFLAGS= OBJS=cset.cmo syntax.cmo parser.cmo lexer.cmo table.cmo lexgen.cmo \ @@ -30,8 +31,7 @@ all: ocamllex syntax.cmo allopt: ocamllex.opt ocamllex: $(OBJS) - $(CAMLC) $(LINKFLAGS) -use-prims ../byterun/primitives \ - -compat-32 -o ocamllex $(OBJS) + $(CAMLC) $(LINKFLAGS) -compat-32 -o ocamllex $(OBJS) ocamllex.opt: $(OBJS:.cmo=.cmx) $(CAMLOPT) -o ocamllex.opt $(OBJS:.cmo=.cmx) diff --git a/ocamlbuild/Makefile b/ocamlbuild/Makefile index 48a1f81724..0a4054ddbd 100644 --- a/ocamlbuild/Makefile +++ b/ocamlbuild/Makefile @@ -13,11 +13,11 @@ include ../config/Makefile ROOTDIR = .. -OCAMLC = $(CAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib \ - -use-runtime $(CAMLRUN) -OCAMLOPT = $(CAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib -OCAMLDEP = $(CAMLRUN) $(ROOTDIR)/tools/ocamldep -OCAMLLEX = $(CAMLRUN) $(ROOTDIR)/boot/ocamllex +OCAMLRUN = $(ROOTDIR)/boot/ocamlrun +OCAMLC = $(OCAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib +OCAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib +OCAMLDEP = $(OCAMLRUN) $(ROOTDIR)/tools/ocamldep +OCAMLLEX = $(OCAMLRUN) $(ROOTDIR)/boot/ocamllex CP = cp COMPFLAGS= -warn-error A -w L -w R -w Z -I ../otherlibs/$(UNIXLIB) -safe-string LINKFLAGS= -I ../otherlibs/$(UNIXLIB) diff --git a/ocamlbuild/Makefile.noboot b/ocamlbuild/Makefile.noboot new file mode 100644 index 0000000000..313e56891c --- /dev/null +++ b/ocamlbuild/Makefile.noboot @@ -0,0 +1,227 @@ +#(***********************************************************************) +#(* *) +#(* ocamlbuild *) +#(* *) +#(* Wojciech Meyer *) +#(* *) +#(* Copyright 2012 Institut National de Recherche en Informatique et *) +#(* en Automatique. All rights reserved. This file is distributed *) +#(* under the terms of the Q Public License version 1.0. *) +#(* *) +#(***********************************************************************) + +# This file removes the dependency on ocamlbuild itself, thus removes need +# for bootstrap. The base for this Makefile was ocamldoc Makefile. + +include ../config/Makefile + +# Various commands and dir +########################## + +ROOTDIR = .. +OCAMLRUN = $(ROOTDIR)/boot/ocamlrun +OCAMLC = $(OCAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib +OCAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib +OCAMLDEP = $(OCAMLRUN) $(ROOTDIR)/tools/ocamldep +OCAMLLEX = $(OCAMLRUN) $(ROOTDIR)/boot/ocamllex +OCAMLLIB = $(LIBDIR) +OCAMLBIN = $(BINDIR) + +# For installation +############## +MKDIR=mkdir -p +CP=cp -f +OCAMLBUILD=ocamlbuild +OCAMLBUILD_OPT=$(OCAMLBUILD).opt +OCAMLBUILD_LIBCMA=ocamlbuildlib.cma +OCAMLBUILD_LIBCMI=ocamlbuildlib.cmi +OCAMLBUILD_LIBCMXA=ocamlbuild.cmxa +OCAMLBUILD_LIBA=ocamlbuild.$(A) +INSTALL_LIBDIR=$(DESTDIR)$(OCAMLLIB)/ocamlbuild +INSTALL_CUSTOMDIR=$(INSTALL_LIBDIR)/custom +INSTALL_BINDIR=$(DESTDIR)$(OCAMLBIN) + +INSTALL_MLIS= +INSTALL_CMIS=$(INSTALL_MLIS:.mli=.cmi) + +# Compilation +############# +OCAMLSRCDIR=.. +INCLUDES_DEP= + +INCLUDES_NODEP= -I $(OCAMLSRCDIR)/stdlib \ + -I $(OCAMLSRCDIR)/otherlibs/str \ + -I $(OCAMLSRCDIR)/otherlibs/dynlink \ + -I $(OCAMLSRCDIR)/otherlibs/$(UNIXLIB) + +INCLUDES=$(INCLUDES_DEP) $(INCLUDES_NODEP) + +COMPFLAGS=$(INCLUDES) -warn-error A -safe-string +LINKFLAGS=$(INCLUDES) + +CMOFILES_PACK= \ + ocamlbuild_Myocamlbuild_config.cmo \ + discard_printf.cmo \ + my_std.cmo \ + bool.cmo \ + glob_ast.cmo \ + glob_lexer.cmo \ + glob.cmo \ + lexers.cmo \ + my_unix.cmo \ + tags.cmo \ + display.cmo \ + log.cmo \ + param_tags.cmo \ + shell.cmo \ + slurp.cmo \ + ocamlbuild_where.cmo \ + command.cmo \ + options.cmo \ + pathname.cmo \ + digest_cache.cmo \ + resource.cmo \ + rule.cmo \ + flags.cmo \ + solver.cmo \ + report.cmo \ + ocaml_arch.cmo \ + hygiene.cmo \ + configuration.cmo \ + tools.cmo \ + fda.cmo \ + plugin.cmo \ + ocaml_utils.cmo \ + ocaml_dependencies.cmo \ + ocaml_compiler.cmo \ + ocaml_tools.cmo \ + hooks.cmo \ + findlib.cmo \ + ocaml_specific.cmo \ + exit_codes.cmo \ + main.cmo + +BASE_CMOFILES= ocamlbuild_executor.cmo \ + ocamlbuild_unix_plugin.cmo + +INSTALL_LIBFILES = $(BASE_CMOFILES) \ + $(BASE_CMOFILES:.cmo=.cmi) \ + $(OCAMLBUILD_LIBCMA) \ + $(OCAMLBUILD).cmo \ + $(OCAMLBUILD)_pack.cmi + +INSTALL_BINFILES = $(OCAMLBUILD) + +CMXFILES= $(CMOFILES:.cmo=.cmx) + +CMXFILES_PACK= $(CMOFILES_PACK:.cmo=.cmx) +CMIFILES_PACK= $(CMOFILES_PACK:.cmo=.cmi) signatures.cmi + +EXECMOFILES_PACK= $(CMOFILES_PACK) +EXECMXFILES_PACK= $(EXECMOFILES_PACK:.cmo=.cmx) +EXECMIFILES_PACK= $(EXECMOFILES_PACK:.cmo=.cmi) + +LIBCMOFILES_PACK= $(CMOFILES_PACK) +LIBCMXFILES_PACK= $(LIBCMOFILES_PACK:.cmo=.cmx) +LIBCMIFILES_PACK= $(LIBCMOFILES_PACK:.cmo=.cmi) + +# Les cmo et cmx de la distrib OCAML +OCAMLCMOFILES= +OCAMLCMXFILES=$(OCAMLCMOFILES_PACK:.cmo=.cmx) + +all: exe lib +opt: $(OCAMLBUILD).native +exe: $(OCAMLBUILD) +lib: $(OCAMLBUILD_LIBCMA) + +opt.opt: exeopt libopt +exeopt: $(OCAMLBUILD_OPT) +libopt: $(OCAMLBUILD_LIBCMXA) $(OCAMLBUILD_LIBCMI) + +debug: + $(MAKE) OCAMLPP="" + +$(OCAMLBUILD)_pack.cmo: $(CMOFILES_PACK) $(CMIFILES_PACK) + $(OCAMLC) -pack -o $@ $(LINKFLAGS) $(OCAMLCMOFILES_PACK) $(EXECMOFILES_PACK) signatures.mli + +$(OCAMLBUILD)_pack.cmx: $(EXECMXFILES_PACK) + $(OCAMLOPT) -pack -o $@ $(LINKFLAGS) $(OCAMLCMOFILES_PACK) $(EXECMXFILES_PACK) + +$(OCAMLBUILD): $(OCAMLBUILD)_pack.cmo $(CMOFILES) $(OCAMLBUILD).cmo $(BASE_CMOFILES) + $(OCAMLC) -o $@ unix.cma $(LINKFLAGS) $(OCAMLBUILD)_pack.cmo $(CMOFILES) + +$(OCAMLBUILD).native: $(OCAMLBUILD)_pack.cmx $(CMXFILES) + $(OCAMLOPT) -o $@ $(LINKFLAGS) $(CMXFILES) + +$(OCAMLBUILD_LIBCMA): $(LIBCMOFILES_PACK) + $(OCAMLC) -a -o $@ $(LINKFLAGS) $(OCAMLSRCDIR)/tools/depend.cmo $(LIBCMOFILES_PACK) +$(OCAMLBUILD_LIBCMXA): $(LIBCMXFILES) + $(OCAMLOPT) -a -o $@ $(LINKFLAGS) $(OCAMLSRCDIR)/tools/depend.cmx $(LIBCMXFILES) + +# generic rules : +################# + +.SUFFIXES: .mll .mly .ml .mli .cmo .cmi .cmx .cmxs + +.ml.cmo: + $(OCAMLC) $(OCAMLPP) $(COMPFLAGS) -c $< + +.mli.cmi: + $(OCAMLC) $(OCAMLPP) $(COMPFLAGS) -c $< + +.ml.cmx: + $(OCAMLOPT) $(OCAMLPP) $(COMPFLAGS) -c $< + +.ml.cmxs: + $(OCAMLOPT) -shared -o $@ $(OCAMLPP) $(COMPFLAGS) $< + +.mll.ml: + $(OCAMLLEX) $< + +.mly.ml: + $(OCAMLYACC) -v $< + +.mly.mli: + $(OCAMLYACC) -v $< + +# Installation targets +###################### +install: dummy + if test -d $(INSTALL_BINDIR); then : ; else $(MKDIR) $(INSTALL_BINDIR); fi + if test -d $(INSTALL_LIBDIR); then : ; else $(MKDIR) $(INSTALL_LIBDIR); fi + if test -d $(INSTALL_CUSTOMDIR); then : ; else $(MKDIR) $(INSTALL_CUSTOMDIR); fi + $(CP) $(OCAMLBUILD) $(INSTALL_BINDIR)/$(OCAMLBUILD)$(EXE) + $(CP) $(INSTALL_LIBFILES) $(INSTALL_LIBDIR) + $(CP) $(INSTALL_BINFILES) $(INSTALL_BINDIR) + +installopt: + if test -f $(OCAMLBUILD_OPT) ; then $(MAKE) installopt_really ; fi + +installopt_really: + if test -d $(INSTALL_BINDIR); then : ; else $(MKDIR) $(INSTALL_BINDIR); fi + if test -d $(INSTALL_LIBDIR); then : ; else $(MKDIR) $(INSTALL_LIBDIR); fi + $(CP) ocamlbuild.hva $(OCAMLBUILD_LIBA) $(OCAMLBUILD_LIBCMXA) $(INSTALL_LIBDIR) + $(CP) $(INSTALL_MLIS) $(INSTALL_CMIS) $(INSTALL_LIBDIR) + + +# backup, clean and depend : +############################ + +clean:: dummy + @rm -f *~ \#*\# + @rm -f $(OCAMLBUILD) $(OCAMLBUILD_OPT) *.cma *.cmxa *.cmo *.cmi *.cmx *.$(A) *.$(O) + @rm -f glob_lexer.ml lexers.ml + +depend:: + $(OCAMLDEP) $(INCLUDES_DEP) *.mli *.mll *.mly *.ml > .depend + +dummy: + +include .depend + +# Additional rules +glob_lexer.cmo: glob_lexer.cmi +lexers.cmo: lexers.cmi + +glob_lexer.cmx: glob_lexer.cmi +lexers.cmx: lexers.cmi diff --git a/ocamldoc/Makefile b/ocamldoc/Makefile index 50a242cc29..7a487c6ca0 100644 --- a/ocamldoc/Makefile +++ b/ocamldoc/Makefile @@ -15,11 +15,12 @@ include ../config/Makefile # Various commands and dir ########################## ROOTDIR = .. -OCAMLC = $(CAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib \ - -use-runtime $(CAMLRUN) -OCAMLOPT = $(CAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib -OCAMLDEP = $(CAMLRUN) $(ROOTDIR)/tools/ocamldep -OCAMLLEX = $(CAMLRUN) $(ROOTDIR)/boot/ocamllex +OCAMLRUN = $(ROOTDIR)/boot/ocamlrun +OCAMLC = $(OCAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib +OCAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib +OCAMLDEP = $(OCAMLRUN) $(ROOTDIR)/tools/ocamldep +OCAMLLEX = $(OCAMLRUN) $(ROOTDIR)/boot/ocamllex +OCAMLYACC = $(ROOTDIR)/yacc/ocamlyacc OCAMLLIB = $(LIBDIR) OCAMLBIN = $(BINDIR) @@ -232,10 +233,10 @@ odoc_see_lexer.ml: odoc_see_lexer.mll $(OCAMLLEX) $< .mly.ml: - $(CAMLYACC) -v $< + $(OCAMLYACC) -v $< .mly.mli: - $(CAMLYACC) -v $< + $(OCAMLYACC) -v $< # Installation targets ###################### @@ -342,8 +343,8 @@ clean:: dummy @rm -f generators/*.cm[aiox] generators/*.$(A) generators/*.$(O) generators/*.cmx[as] depend:: - $(CAMLYACC) odoc_text_parser.mly - $(CAMLYACC) odoc_parser.mly + $(OCAMLYACC) odoc_text_parser.mly + $(OCAMLYACC) odoc_parser.mly $(OCAMLLEX) odoc_text_lexer.mll $(OCAMLLEX) odoc_lexer.mll $(OCAMLLEX) odoc_ocamlhtml.mll diff --git a/ocamldoc/Makefile.nt b/ocamldoc/Makefile.nt index 6f6744da98..22cd36eb03 100644 --- a/ocamldoc/Makefile.nt +++ b/ocamldoc/Makefile.nt @@ -15,10 +15,12 @@ include ../config/Makefile # Various commands and dir ########################## ROOTDIR = .. -OCAMLC = $(CAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib -OCAMLOPT = $(CAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib -OCAMLDEP = $(CAMLRUN) $(ROOTDIR)/tools/ocamldep -OCAMLLEX = $(CAMLRUN) $(ROOTDIR)/boot/ocamllex +OCAMLRUN = $(ROOTDIR)/boot/ocamlrun +OCAMLC = $(OCAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib +OCAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib +OCAMLDEP = $(OCAMLRUN) $(ROOTDIR)/tools/ocamldep +OCAMLLEX = $(OCAMLRUN) $(ROOTDIR)/boot/ocamllex +OCAMLYACC = $(ROOTDIR)/yacc/ocamlyacc OCAMLLIB = $(LIBDIR) OCAMLBIN = $(BINDIR) @@ -200,10 +202,10 @@ odoc_see_lexer.ml: odoc_see_lexer.mll $(OCAMLLEX) $< .mly.ml: - $(CAMLYACC) -v $< + $(OCAMLYACC) -v $< .mly.mli: - $(CAMLYACC) -v $< + $(OCAMLYACC) -v $< # Installation targets ###################### @@ -238,8 +240,8 @@ clean:: dummy @rm -f generators/*.cm[aiox] generators/*.$(A) generators/*.$(O) generators/*.cmx[as] depend:: - $(CAMLYACC) odoc_text_parser.mly - $(CAMLYACC) odoc_parser.mly + $(OCAMLYACC) odoc_text_parser.mly + $(OCAMLYACC) odoc_parser.mly $(OCAMLLEX) odoc_text_lexer.mll $(OCAMLLEX) odoc_lexer.mll $(OCAMLLEX) odoc_ocamlhtml.mll diff --git a/otherlibs/Makefile b/otherlibs/Makefile index 3ca2a487ff..8f8dc7157a 100644 --- a/otherlibs/Makefile +++ b/otherlibs/Makefile @@ -13,8 +13,8 @@ # Common Makefile for otherlibs on the Unix ports -CAMLC=$(CAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib -CAMLOPT=$(CAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib \ +CAMLC=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib +CAMLOPT=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlopt -nostdlib \ -I $(ROOTDIR)/stdlib CFLAGS=-I$(ROOTDIR)/byterun $(SHAREDCCCOMPOPTS) $(EXTRACFLAGS) diff --git a/otherlibs/Makefile.shared b/otherlibs/Makefile.shared index a76a0924d9..9bed5f7604 100644 --- a/otherlibs/Makefile.shared +++ b/otherlibs/Makefile.shared @@ -18,6 +18,7 @@ include $(ROOTDIR)/config/Makefile # Compilation options CC=$(BYTECC) +CAMLRUN=$(ROOTDIR)/boot/ocamlrun COMPFLAGS=-w +33..39 -warn-error A -bin-annot -g -safe-string $(EXTRACAMLFLAGS) MKLIB=$(CAMLRUN) $(ROOTDIR)/tools/ocamlmklib diff --git a/otherlibs/bigarray/Makefile b/otherlibs/bigarray/Makefile index 3bcc7a4022..3f9afd5fdb 100644 --- a/otherlibs/bigarray/Makefile +++ b/otherlibs/bigarray/Makefile @@ -22,6 +22,6 @@ include ../Makefile depend: $(CC) -MM $(CFLAGS) *.c > .depend - $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend + ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/bigarray/Makefile.nt b/otherlibs/bigarray/Makefile.nt index baeaa7a160..32642e107f 100644 --- a/otherlibs/bigarray/Makefile.nt +++ b/otherlibs/bigarray/Makefile.nt @@ -22,6 +22,6 @@ include ../Makefile.nt depend: $(CC) -MM $(CFLAGS) *.c > .depend - $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend + ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/dynlink/Makefile b/otherlibs/dynlink/Makefile index 634607f399..a0563c536e 100644 --- a/otherlibs/dynlink/Makefile +++ b/otherlibs/dynlink/Makefile @@ -18,9 +18,9 @@ include ../../config/Makefile ROOTDIR = ../.. -OCAMLC = $(CAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib \ - -use-runtime $(CAMLRUN) -OCAMLOPT = $(CAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib +OCAMLRUN = $(ROOTDIR)/boot/ocamlrun +OCAMLC = $(OCAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib +OCAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib INCLUDES=-I ../../utils -I ../../typing -I ../../bytecomp -I ../../asmcomp COMPFLAGS=-w +33..39 -warn-error A -bin-annot -g -safe-string \ @@ -71,7 +71,7 @@ dynlink.cmx: dynlink.cmi natdynlink.ml rm -f dynlink.mlopt extract_crc: dynlink.cma extract_crc.cmo - $(OCAMLC) -o extract_crc dynlink.cma extract_crc.cmo + $(OCAMLC) $(COMPFLAGS) -o extract_crc dynlink.cma extract_crc.cmo INSTALL_LIBDIR=$(DESTDIR)$(LIBDIR) diff --git a/otherlibs/graph/Makefile b/otherlibs/graph/Makefile index 850e02513e..2fb45807f2 100644 --- a/otherlibs/graph/Makefile +++ b/otherlibs/graph/Makefile @@ -27,6 +27,6 @@ include ../Makefile depend: $(CC) -MM $(CFLAGS) *.c | sed -e 's, /[^ ]*\.h,,g' > .depend - $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend + ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/num/Makefile b/otherlibs/num/Makefile index e08e02943f..c867b2cd26 100644 --- a/otherlibs/num/Makefile +++ b/otherlibs/num/Makefile @@ -32,6 +32,6 @@ bng.$(O): bng.h bng_digit.c \ depend: $(CC) -MM $(CFLAGS) *.c > .depend - $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend + ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/str/Makefile b/otherlibs/str/Makefile index 93b2bf9539..4a58d46744 100644 --- a/otherlibs/str/Makefile +++ b/otherlibs/str/Makefile @@ -28,6 +28,6 @@ str.cmx: str.cmi depend: $(CC) -MM $(CFLAGS) *.c > .depend - $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend + ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/systhreads/Makefile b/otherlibs/systhreads/Makefile index eb8e48aab1..cc36a52c80 100644 --- a/otherlibs/systhreads/Makefile +++ b/otherlibs/systhreads/Makefile @@ -14,11 +14,11 @@ include ../../config/Makefile ROOTDIR=../.. -CAMLC=$(CAMLRUN) $(ROOTDIR)/ocamlc -nostdlib \ +CAMLC=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlc -nostdlib \ -I $(ROOTDIR)/stdlib -I $(ROOTDIR)/otherlibs/unix -CAMLOPT=$(CAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib \ +CAMLOPT=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlopt -nostdlib \ -I $(ROOTDIR)/stdlib -I $(ROOTDIR)/otherlibs/unix -MKLIB=$(CAMLRUN) ../../tools/ocamlmklib +MKLIB=../../boot/ocamlrun ../../tools/ocamlmklib COMPFLAGS=-w +33..39 -warn-error A -g -bin-annot -safe-string BYTECODE_C_OBJS=st_stubs_b.o @@ -107,6 +107,6 @@ installopt: depend: $(GENFILES) -$(CC) -MM -I../../byterun *.c > .depend - $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend + ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/systhreads/Makefile.nt b/otherlibs/systhreads/Makefile.nt index 9d743905ae..341176146f 100644 --- a/otherlibs/systhreads/Makefile.nt +++ b/otherlibs/systhreads/Makefile.nt @@ -14,10 +14,10 @@ include ../../config/Makefile # Compilation options -CAMLC=$(CAMLRUN) ../../ocamlc -I ../../stdlib -I ../win32unix -CAMLOPT=$(CAMLRUN) ../../ocamlopt -I ../../stdlib -I ../win32unix +CAMLC=../../boot/ocamlrun ../../ocamlc -I ../../stdlib -I ../win32unix +CAMLOPT=../../boot/ocamlrun ../../ocamlopt -I ../../stdlib -I ../win32unix COMPFLAGS=-w +33 -warn-error A -g -MKLIB=$(CAMLRUN) ../../tools/ocamlmklib +MKLIB=../../boot/ocamlrun ../../tools/ocamlmklib CFLAGS=-I../../byterun $(EXTRACFLAGS) CAMLOBJS=thread.cmo mutex.cmo condition.cmo event.cmo threadUnix.cmo @@ -32,7 +32,7 @@ all: lib$(LIBNAME).$(A) $(LIBNAME).cma $(CMIFILES) allopt: lib$(LIBNAME).$(A) $(LIBNAME).cmxa $(LIBNAME).cmxs $(CMIFILES) $(LIBNAME).cma: $(CAMLOBJS) - $(MKLIB) -o $(LIBNAME) -ocamlc "$(CAMLRUN) ../../ocamlc" \ + $(MKLIB) -o $(LIBNAME) -ocamlc "../../boot/ocamlrun ../../ocamlc" \ -linkall $(CAMLOBJS) $(LINKOPTS) lib$(LIBNAME).$(A): $(COBJS) @@ -46,7 +46,7 @@ st_stubs_b.$(O): st_stubs.c st_win32.h $(LIBNAME).cmxa: $(CAMLOBJS:.cmo=.cmx) $(MKLIB) -o $(LIBNAME)nat \ - -ocamlopt "$(CAMLRUN) ../../ocamlopt" -linkall \ + -ocamlopt "../../boot/ocamlrun ../../ocamlopt" -linkall \ $(CAMLOBJS:.cmo=.cmx) $(LINKOPTS) mv $(LIBNAME)nat.cmxa $(LIBNAME).cmxa mv $(LIBNAME)nat.$(A) $(LIBNAME).$(A) diff --git a/otherlibs/threads/Makefile b/otherlibs/threads/Makefile index 699101fc2e..50fb422bae 100644 --- a/otherlibs/threads/Makefile +++ b/otherlibs/threads/Makefile @@ -124,6 +124,6 @@ installopt: depend: $(CC) -MM $(CFLAGS) *.c > .depend - $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend + ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/unix/Makefile b/otherlibs/unix/Makefile index faebd3f5c8..e41a1e1ddd 100644 --- a/otherlibs/unix/Makefile +++ b/otherlibs/unix/Makefile @@ -42,6 +42,6 @@ include ../Makefile depend: $(CC) -MM $(CFLAGS) *.c > .depend - $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend + ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/stdlib/Makefile.shared b/stdlib/Makefile.shared index 1e9416dc7e..54de337cb4 100755 --- a/stdlib/Makefile.shared +++ b/stdlib/Makefile.shared @@ -14,11 +14,11 @@ include ../config/Makefile RUNTIME=../boot/ocamlrun COMPILER=../ocamlc -CAMLC=$(CAMLRUN) $(COMPILER) +CAMLC=$(RUNTIME) $(COMPILER) COMPFLAGS=-strict-sequence -w +33..39 -g -warn-error A -bin-annot -nostdlib \ -safe-string OPTCOMPILER=../ocamlopt -CAMLOPT=$(CAMLRUN) $(OPTCOMPILER) +CAMLOPT=$(RUNTIME) $(OPTCOMPILER) CAMLDEP=../boot/ocamlrun ../tools/ocamldep OBJS=camlinternalFormatBasics.cmo pervasives.cmo $(OTHERS) diff --git a/tools/Makefile.nt b/tools/Makefile.nt index 7da3b78dc8..ed9b35946d 100644 --- a/tools/Makefile.nt +++ b/tools/Makefile.nt @@ -18,8 +18,7 @@ OCAMLMKTOP=ocamlmktop.cmo OCAMLMKTOP_IMPORTS=misc.cmo config.cmo clflags.cmo ccomp.cmo ocamlmktop: $(OCAMLMKTOP) - $(CAMLC) $(LINKFLAGS) -use-runtime $(CAMLRUN) -o ocamlmktop \ - $(OCAMLMKTOP_IMPORTS) $(OCAMLMKTOP) + $(CAMLC) $(LINKFLAGS) -o ocamlmktop $(OCAMLMKTOP_IMPORTS) $(OCAMLMKTOP) install:: cp ocamlmktop $(INSTALL_BINDIR)/ocamlmktop$(EXE) diff --git a/tools/Makefile.shared b/tools/Makefile.shared index 929f1caed2..417c2a6f17 100644 --- a/tools/Makefile.shared +++ b/tools/Makefile.shared @@ -12,7 +12,8 @@ include ../config/Makefile -CAMLC=$(CAMLRUN) ../boot/ocamlc -nostdlib -I ../boot -use-runtime $(CAMLRUN) +CAMLRUN=../boot/ocamlrun +CAMLC=$(CAMLRUN) ../boot/ocamlc -nostdlib -I ../boot CAMLOPT=$(CAMLRUN) ../ocamlopt -nostdlib -I ../stdlib CAMLLEX=$(CAMLRUN) ../boot/ocamllex INCLUDES=-I ../utils -I ../parsing -I ../typing -I ../bytecomp -I ../asmcomp \ @@ -41,8 +42,7 @@ CAMLDEP_IMPORTS=misc.cmo config.cmo clflags.cmo terminfo.cmo \ ccomp.cmo ast_mapper.cmo pparse.cmo compenv.cmo ocamldep: depend.cmi $(CAMLDEP_OBJ) - $(CAMLC) $(LINKFLAGS) -use-prims ../byterun/primitives -compat-32 \ - -o ocamldep $(CAMLDEP_IMPORTS) $(CAMLDEP_OBJ) + $(CAMLC) $(LINKFLAGS) -compat-32 -o ocamldep $(CAMLDEP_IMPORTS) $(CAMLDEP_OBJ) ocamldep.opt: depend.cmi $(CAMLDEP_OBJ:.cmo=.cmx) $(CAMLOPT) $(LINKFLAGS) -o ocamldep.opt $(CAMLDEP_IMPORTS:.cmo=.cmx) \ @@ -165,7 +165,7 @@ ADDLABELS_IMPORTS=misc.cmo config.cmo clflags.cmo terminfo.cmo \ addlabels: addlabels.cmo $(CAMLC) $(LINKFLAGS) -w sl -o addlabels \ - $(ADDLABELS_IMPORTS) addlabels.cmo + $(ADDLABELS_IMPORTS) addlabels.cmo #install:: # cp addlabels $(INSTALL_LIBDIR) From 0fb81e3eb7e63093c8c7c9567e1ef7a57b5124c6 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Wed, 6 May 2015 21:20:34 +0000 Subject: [PATCH 249/494] byproduct of PR#6266: remove unused file git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16098 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- ocamlbuild/Makefile.noboot | 227 ------------------------------------- 1 file changed, 227 deletions(-) delete mode 100644 ocamlbuild/Makefile.noboot diff --git a/ocamlbuild/Makefile.noboot b/ocamlbuild/Makefile.noboot deleted file mode 100644 index 313e56891c..0000000000 --- a/ocamlbuild/Makefile.noboot +++ /dev/null @@ -1,227 +0,0 @@ -#(***********************************************************************) -#(* *) -#(* ocamlbuild *) -#(* *) -#(* Wojciech Meyer *) -#(* *) -#(* Copyright 2012 Institut National de Recherche en Informatique et *) -#(* en Automatique. All rights reserved. This file is distributed *) -#(* under the terms of the Q Public License version 1.0. *) -#(* *) -#(***********************************************************************) - -# This file removes the dependency on ocamlbuild itself, thus removes need -# for bootstrap. The base for this Makefile was ocamldoc Makefile. - -include ../config/Makefile - -# Various commands and dir -########################## - -ROOTDIR = .. -OCAMLRUN = $(ROOTDIR)/boot/ocamlrun -OCAMLC = $(OCAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib -OCAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib -OCAMLDEP = $(OCAMLRUN) $(ROOTDIR)/tools/ocamldep -OCAMLLEX = $(OCAMLRUN) $(ROOTDIR)/boot/ocamllex -OCAMLLIB = $(LIBDIR) -OCAMLBIN = $(BINDIR) - -# For installation -############## -MKDIR=mkdir -p -CP=cp -f -OCAMLBUILD=ocamlbuild -OCAMLBUILD_OPT=$(OCAMLBUILD).opt -OCAMLBUILD_LIBCMA=ocamlbuildlib.cma -OCAMLBUILD_LIBCMI=ocamlbuildlib.cmi -OCAMLBUILD_LIBCMXA=ocamlbuild.cmxa -OCAMLBUILD_LIBA=ocamlbuild.$(A) -INSTALL_LIBDIR=$(DESTDIR)$(OCAMLLIB)/ocamlbuild -INSTALL_CUSTOMDIR=$(INSTALL_LIBDIR)/custom -INSTALL_BINDIR=$(DESTDIR)$(OCAMLBIN) - -INSTALL_MLIS= -INSTALL_CMIS=$(INSTALL_MLIS:.mli=.cmi) - -# Compilation -############# -OCAMLSRCDIR=.. -INCLUDES_DEP= - -INCLUDES_NODEP= -I $(OCAMLSRCDIR)/stdlib \ - -I $(OCAMLSRCDIR)/otherlibs/str \ - -I $(OCAMLSRCDIR)/otherlibs/dynlink \ - -I $(OCAMLSRCDIR)/otherlibs/$(UNIXLIB) - -INCLUDES=$(INCLUDES_DEP) $(INCLUDES_NODEP) - -COMPFLAGS=$(INCLUDES) -warn-error A -safe-string -LINKFLAGS=$(INCLUDES) - -CMOFILES_PACK= \ - ocamlbuild_Myocamlbuild_config.cmo \ - discard_printf.cmo \ - my_std.cmo \ - bool.cmo \ - glob_ast.cmo \ - glob_lexer.cmo \ - glob.cmo \ - lexers.cmo \ - my_unix.cmo \ - tags.cmo \ - display.cmo \ - log.cmo \ - param_tags.cmo \ - shell.cmo \ - slurp.cmo \ - ocamlbuild_where.cmo \ - command.cmo \ - options.cmo \ - pathname.cmo \ - digest_cache.cmo \ - resource.cmo \ - rule.cmo \ - flags.cmo \ - solver.cmo \ - report.cmo \ - ocaml_arch.cmo \ - hygiene.cmo \ - configuration.cmo \ - tools.cmo \ - fda.cmo \ - plugin.cmo \ - ocaml_utils.cmo \ - ocaml_dependencies.cmo \ - ocaml_compiler.cmo \ - ocaml_tools.cmo \ - hooks.cmo \ - findlib.cmo \ - ocaml_specific.cmo \ - exit_codes.cmo \ - main.cmo - -BASE_CMOFILES= ocamlbuild_executor.cmo \ - ocamlbuild_unix_plugin.cmo - -INSTALL_LIBFILES = $(BASE_CMOFILES) \ - $(BASE_CMOFILES:.cmo=.cmi) \ - $(OCAMLBUILD_LIBCMA) \ - $(OCAMLBUILD).cmo \ - $(OCAMLBUILD)_pack.cmi - -INSTALL_BINFILES = $(OCAMLBUILD) - -CMXFILES= $(CMOFILES:.cmo=.cmx) - -CMXFILES_PACK= $(CMOFILES_PACK:.cmo=.cmx) -CMIFILES_PACK= $(CMOFILES_PACK:.cmo=.cmi) signatures.cmi - -EXECMOFILES_PACK= $(CMOFILES_PACK) -EXECMXFILES_PACK= $(EXECMOFILES_PACK:.cmo=.cmx) -EXECMIFILES_PACK= $(EXECMOFILES_PACK:.cmo=.cmi) - -LIBCMOFILES_PACK= $(CMOFILES_PACK) -LIBCMXFILES_PACK= $(LIBCMOFILES_PACK:.cmo=.cmx) -LIBCMIFILES_PACK= $(LIBCMOFILES_PACK:.cmo=.cmi) - -# Les cmo et cmx de la distrib OCAML -OCAMLCMOFILES= -OCAMLCMXFILES=$(OCAMLCMOFILES_PACK:.cmo=.cmx) - -all: exe lib -opt: $(OCAMLBUILD).native -exe: $(OCAMLBUILD) -lib: $(OCAMLBUILD_LIBCMA) - -opt.opt: exeopt libopt -exeopt: $(OCAMLBUILD_OPT) -libopt: $(OCAMLBUILD_LIBCMXA) $(OCAMLBUILD_LIBCMI) - -debug: - $(MAKE) OCAMLPP="" - -$(OCAMLBUILD)_pack.cmo: $(CMOFILES_PACK) $(CMIFILES_PACK) - $(OCAMLC) -pack -o $@ $(LINKFLAGS) $(OCAMLCMOFILES_PACK) $(EXECMOFILES_PACK) signatures.mli - -$(OCAMLBUILD)_pack.cmx: $(EXECMXFILES_PACK) - $(OCAMLOPT) -pack -o $@ $(LINKFLAGS) $(OCAMLCMOFILES_PACK) $(EXECMXFILES_PACK) - -$(OCAMLBUILD): $(OCAMLBUILD)_pack.cmo $(CMOFILES) $(OCAMLBUILD).cmo $(BASE_CMOFILES) - $(OCAMLC) -o $@ unix.cma $(LINKFLAGS) $(OCAMLBUILD)_pack.cmo $(CMOFILES) - -$(OCAMLBUILD).native: $(OCAMLBUILD)_pack.cmx $(CMXFILES) - $(OCAMLOPT) -o $@ $(LINKFLAGS) $(CMXFILES) - -$(OCAMLBUILD_LIBCMA): $(LIBCMOFILES_PACK) - $(OCAMLC) -a -o $@ $(LINKFLAGS) $(OCAMLSRCDIR)/tools/depend.cmo $(LIBCMOFILES_PACK) -$(OCAMLBUILD_LIBCMXA): $(LIBCMXFILES) - $(OCAMLOPT) -a -o $@ $(LINKFLAGS) $(OCAMLSRCDIR)/tools/depend.cmx $(LIBCMXFILES) - -# generic rules : -################# - -.SUFFIXES: .mll .mly .ml .mli .cmo .cmi .cmx .cmxs - -.ml.cmo: - $(OCAMLC) $(OCAMLPP) $(COMPFLAGS) -c $< - -.mli.cmi: - $(OCAMLC) $(OCAMLPP) $(COMPFLAGS) -c $< - -.ml.cmx: - $(OCAMLOPT) $(OCAMLPP) $(COMPFLAGS) -c $< - -.ml.cmxs: - $(OCAMLOPT) -shared -o $@ $(OCAMLPP) $(COMPFLAGS) $< - -.mll.ml: - $(OCAMLLEX) $< - -.mly.ml: - $(OCAMLYACC) -v $< - -.mly.mli: - $(OCAMLYACC) -v $< - -# Installation targets -###################### -install: dummy - if test -d $(INSTALL_BINDIR); then : ; else $(MKDIR) $(INSTALL_BINDIR); fi - if test -d $(INSTALL_LIBDIR); then : ; else $(MKDIR) $(INSTALL_LIBDIR); fi - if test -d $(INSTALL_CUSTOMDIR); then : ; else $(MKDIR) $(INSTALL_CUSTOMDIR); fi - $(CP) $(OCAMLBUILD) $(INSTALL_BINDIR)/$(OCAMLBUILD)$(EXE) - $(CP) $(INSTALL_LIBFILES) $(INSTALL_LIBDIR) - $(CP) $(INSTALL_BINFILES) $(INSTALL_BINDIR) - -installopt: - if test -f $(OCAMLBUILD_OPT) ; then $(MAKE) installopt_really ; fi - -installopt_really: - if test -d $(INSTALL_BINDIR); then : ; else $(MKDIR) $(INSTALL_BINDIR); fi - if test -d $(INSTALL_LIBDIR); then : ; else $(MKDIR) $(INSTALL_LIBDIR); fi - $(CP) ocamlbuild.hva $(OCAMLBUILD_LIBA) $(OCAMLBUILD_LIBCMXA) $(INSTALL_LIBDIR) - $(CP) $(INSTALL_MLIS) $(INSTALL_CMIS) $(INSTALL_LIBDIR) - - -# backup, clean and depend : -############################ - -clean:: dummy - @rm -f *~ \#*\# - @rm -f $(OCAMLBUILD) $(OCAMLBUILD_OPT) *.cma *.cmxa *.cmo *.cmi *.cmx *.$(A) *.$(O) - @rm -f glob_lexer.ml lexers.ml - -depend:: - $(OCAMLDEP) $(INCLUDES_DEP) *.mli *.mll *.mly *.ml > .depend - -dummy: - -include .depend - -# Additional rules -glob_lexer.cmo: glob_lexer.cmi -lexers.cmo: lexers.cmi - -glob_lexer.cmx: glob_lexer.cmi -lexers.cmx: lexers.cmi From b9beb253d25ae4abc79c0431be9b4d660af9b419 Mon Sep 17 00:00:00 2001 From: Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> Date: Sat, 9 May 2015 02:07:25 +0000 Subject: [PATCH 250/494] Fix PR#6862 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16101 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + testsuite/tests/typing-gadts/test.ml | 6 ++++++ .../typing-gadts/test.ml.principal.reference | 18 ++++++++++++++++++ testsuite/tests/typing-gadts/test.ml.reference | 18 ++++++++++++++++++ typing/parmatch.mli | 1 - typing/typeclass.ml | 2 +- typing/typecore.ml | 8 ++++++-- typing/typecore.mli | 3 +++ 8 files changed, 53 insertions(+), 4 deletions(-) diff --git a/Changes b/Changes index e3180fbe02..2b2f00ce05 100644 --- a/Changes +++ b/Changes @@ -141,6 +141,7 @@ Bug fixes: (Leo White, Gabriel Scherer) - PR#6849: Inverted pattern unification error - PR#6857: __MODULE__ doesn't give the current module with -o +- PR#6862: Exhaustiveness check wrong for class constructor arguments - GPR#143: fix getsockopt behaviour for boolean socket options (Anil Madhavapeddy and Andrew Ray) - ocamlbuild on cygwin cannot find ocamlfind diff --git a/testsuite/tests/typing-gadts/test.ml b/testsuite/tests/typing-gadts/test.ml index 315887666e..f4f23e0e55 100644 --- a/testsuite/tests/typing-gadts/test.ml +++ b/testsuite/tests/typing-gadts/test.ml @@ -91,6 +91,12 @@ module Exhaustive = end ;; +module PR6862 = struct + class c (Some x) = object method x : int = x end + type _ opt = Just : 'a -> 'a opt | Nothing : 'a opt + class d (Just x) = object method x : int = x end +end;; + module Existential_escape = struct type _ t = C : int -> int t diff --git a/testsuite/tests/typing-gadts/test.ml.principal.reference b/testsuite/tests/typing-gadts/test.ml.principal.reference index 465a57b68e..cba7f347e7 100644 --- a/testsuite/tests/typing-gadts/test.ml.principal.reference +++ b/testsuite/tests/typing-gadts/test.ml.principal.reference @@ -47,6 +47,24 @@ module Nonexhaustive : type 'a v = Foo : t -> t v | Bar : u -> u v val same_type : 's v * 's v -> bool end +# Characters 34-42: + class c (Some x) = object method x : int = x end + ^^^^^^^^ +Warning 8: this pattern-matching is not exhaustive. +Here is an example of a value that is not matched: +None +Characters 139-147: + class d (Just x) = object method x : int = x end + ^^^^^^^^ +Warning 8: this pattern-matching is not exhaustive. +Here is an example of a value that is not matched: +Nothing +module PR6862 : + sig + class c : int option -> object method x : int end + type _ opt = Just : 'a -> 'a opt | Nothing : 'a opt + class d : int opt -> object method x : int end + end # Characters 118-119: let eval (D x) = x ^ diff --git a/testsuite/tests/typing-gadts/test.ml.reference b/testsuite/tests/typing-gadts/test.ml.reference index 3a28d81cf9..a3ea98d1c6 100644 --- a/testsuite/tests/typing-gadts/test.ml.reference +++ b/testsuite/tests/typing-gadts/test.ml.reference @@ -47,6 +47,24 @@ module Nonexhaustive : type 'a v = Foo : t -> t v | Bar : u -> u v val same_type : 's v * 's v -> bool end +# Characters 34-42: + class c (Some x) = object method x : int = x end + ^^^^^^^^ +Warning 8: this pattern-matching is not exhaustive. +Here is an example of a value that is not matched: +None +Characters 139-147: + class d (Just x) = object method x : int = x end + ^^^^^^^^ +Warning 8: this pattern-matching is not exhaustive. +Here is an example of a value that is not matched: +Nothing +module PR6862 : + sig + class c : int option -> object method x : int end + type _ opt = Just : 'a -> 'a opt | Nothing : 'a opt + class d : int opt -> object method x : int end + end # Characters 118-119: let eval (D x) = x ^ diff --git a/typing/parmatch.mli b/typing/parmatch.mli index 947f16fa2c..dfd955a8bb 100644 --- a/typing/parmatch.mli +++ b/typing/parmatch.mli @@ -53,7 +53,6 @@ val complete_constrs : pattern -> constructor_tag list -> constructor_description list val pressure_variants: Env.t -> pattern list -> unit -val check_partial: Location.t -> case list -> partial val check_partial_gadt: ((string, constructor_description) Hashtbl.t -> (string, label_description) Hashtbl.t -> diff --git a/typing/typeclass.ml b/typing/typeclass.ml index 33b776befd..a29ddddb21 100644 --- a/typing/typeclass.ml +++ b/typing/typeclass.ml @@ -944,7 +944,7 @@ and class_expr cl_num val_env met_env scl = | _ -> true in let partial = - Parmatch.check_partial pat.pat_loc + Typecore.check_partial val_env pat.pat_type pat.pat_loc [{c_lhs=pat; c_guard=None; c_rhs = (* Dummy expression *) diff --git a/typing/typecore.ml b/typing/typecore.ml index 70f9061c35..7fe44f7f58 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1241,6 +1241,9 @@ let partial_pred ~lev env expected_ty constrs labels p = backtrack snap; None +let check_partial ?(lev=get_current_level ()) env expected_ty = + Parmatch.check_partial_gadt (partial_pred ~lev env expected_ty) + let rec iter3 f lst1 lst2 lst3 = match lst1,lst2,lst3 with | x1::xs1,x2::xs2,x3::xs3 -> @@ -3518,7 +3521,7 @@ and type_cases ?in_function env ty_arg ty_res partial_flag loc caselist = end; let partial = if partial_flag then - Parmatch.check_partial_gadt (partial_pred ~lev env ty_arg) loc cases + check_partial ~lev env ty_arg loc cases else Partial in @@ -3696,7 +3699,8 @@ and type_let ?(check = fun s -> Warnings.Unused_var s) Location.prerr_warning (List.hd spat_sexp_list).pvb_pat.ppat_loc Warnings.Unused_rec_flag; List.iter2 - (fun pat exp -> ignore(Parmatch.check_partial pat.pat_loc [case pat exp])) + (fun pat exp -> + ignore(check_partial env pat.pat_type pat.pat_loc [case pat exp])) pat_list exp_list; end_def(); List.iter2 diff --git a/typing/typecore.mli b/typing/typecore.mli index 4ce6b1fc36..ee16c3b7fc 100644 --- a/typing/typecore.mli +++ b/typing/typecore.mli @@ -41,6 +41,9 @@ val type_self_pattern: (Ident.t * Asttypes.mutable_flag * Asttypes.virtual_flag * type_expr) Vars.t ref * Env.t * Env.t * Env.t +val check_partial: + ?lev:int -> Env.t -> type_expr -> + Location.t -> Typedtree.case list -> Typedtree.partial val type_expect: ?in_function:(Location.t * type_expr) -> Env.t -> Parsetree.expression -> type_expr -> Typedtree.expression From 6c557991e2601182e54d4b429d10b7522e5ee52f Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 10 May 2015 05:45:57 +0000 Subject: [PATCH 251/494] Revert "Revert "PR#6693: also build libasmrun_shared.so and lib{asm,caml}run_pic.a"" This reverts commit 452eb3d9fca4fc277ee195906c6a92d484e07c21. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16103 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 16 ++++++++++------ asmrun/Makefile | 39 +++++++++++++++++++++++++++++++++++++-- byterun/Makefile | 30 ++++++++++++++++++++++-------- configure | 5 +++++ 4 files changed, 74 insertions(+), 16 deletions(-) diff --git a/Changes b/Changes index 2b2f00ce05..f6f0cbdcf5 100644 --- a/Changes +++ b/Changes @@ -48,11 +48,6 @@ Libraries: (Jérémie Dimino, report by user 'gfxmonk') - PR#6834: Add Obj.{first,last}_non_constant_constructor_tag -Tools: -- PR#6641: add -g, -ocamlcflags, -ocamloptflags options to ocamlmklib - (Peter Zotov) -- GPR#139: more versatile specification of locations of .annot - Runtime: - PR#6675: GC hooks (Damien Doligez and Roshan James) @@ -101,6 +96,7 @@ Bug fixes: - PR#6690: Uncaught exception (Not_found) with (wrong) wildcard or unification type variable in place of a local abstract type - PR#6693 (part two): Incorrect relocation types in x86-64 runtime system + (Peter Zotov, review by Jacques-Henri Jourdan, Xavier Leroy and Mark Shinwell) - PR#6717: Pprintast does not print let-pattern attributes (Gabriel Scherer, report by Peter Zotov) - PR#6727: Printf.sprintf "%F" misbehavior @@ -136,7 +132,6 @@ Bug fixes: - PR#6836: Assertion failure using -short-paths - PR#6837: Build profiling libraries on FreeBSD and NetBSD x86-64 - PR#6841: Changing compilation unit name with -o breaks ocamldebug -- PR#6842: export Typemod.modtype_of_package - PR#6843: record weak dependencies even when the .cmi is missing (Leo White, Gabriel Scherer) - PR#6849: Inverted pattern unification error @@ -151,6 +146,15 @@ Bug fixes: - GPR#171: allow custom warning printers / catchers (Benjamin Canou, review by Damien Doligez) +Feature wishes: +- PR#6641: add -g, -ocamlcflags, -ocamloptflags options to ocamlmklib + (Peter Zotov) +- PR#6693: also build libasmrun_shared.so and lib{asm,caml}run_pic.a + (Peter Zotov, review by Mark Shinwell) +- PR#6842: export Typemod.modtype_of_package + (Jacques Garrigue, request by Jun Furuse) +- GPR#139: more versatile specification of locations of .annot + (Christophe Troestler, review by Damien Doligez) OCaml 4.02.1: ------------- diff --git a/asmrun/Makefile b/asmrun/Makefile index ff277e748a..84a9aaabaf 100644 --- a/asmrun/Makefile +++ b/asmrun/Makefile @@ -19,6 +19,7 @@ FLAGS=-I../byterun -DCAML_NAME_SPACE -DNATIVE_CODE \ CFLAGS=$(FLAGS) $(NATIVECCCOMPOPTS) DFLAGS=$(FLAGS) -g -DDEBUG $(NATIVECCCOMPOPTS) PFLAGS=$(FLAGS) -pg -O -DPROFILING $(NATIVECCPROFOPTS) +PICFLAGS=$(FLAGS) -O $(SHAREDCCCOMPOPTS) $(NATIVECCCOMPOPTS) COBJS=startup.o main.o fail.o roots.o globroots.o signals.o signals_asm.o \ misc.o freelist.o major_gc.o minor_gc.o memory.o alloc.o compare.o ints.o \ @@ -32,8 +33,9 @@ ASMOBJS=$(ARCH).o OBJS=$(COBJS) $(ASMOBJS) DOBJS=$(COBJS:.o=.d.o) $(ASMOBJS) POBJS=$(COBJS:.o=.p.o) $(ASMOBJS:.o=.p.o) +PICOBJS=$(COBJS:.o=.pic.o) $(ASMOBJS:.o=.pic.o) -all: libasmrun.a all-$(RUNTIMED) all-$(PROFILING) +all: libasmrun.a all-$(RUNTIMED) all-$(PROFILING) all-$(SHARED) libasmrun.a: $(OBJS) rm -f libasmrun.a @@ -60,13 +62,26 @@ libasmrunp.a: $(POBJS) $(ARCMD) rc libasmrunp.a $(POBJS) $(RANLIB) libasmrunp.a +all-noshared: + +all-shared: libasmrun_pic.a libasmrun_shared.so + +libasmrun_pic.a: $(PICOBJS) + rm -f libasmrun_pic.a + ar rc libasmrun_pic.a $(PICOBJS) + $(RANLIB) libasmrun_pic.a + +libasmrun_shared.so: $(PICOBJS) + $(MKDLL) -o libasmrun_shared.so $(PICOBJS) $(NATIVECCLIBS) + INSTALL_LIBDIR=$(DESTDIR)$(LIBDIR) -install: install-default install-$(RUNTIMED) install-$(PROFILING) +install: install-default install-$(RUNTIMED) install-$(PROFILING) install-$(SHARED) install-default: cp libasmrun.a $(INSTALL_LIBDIR)/libasmrun.a cd $(INSTALL_LIBDIR); $(RANLIB) libasmrun.a +.PHONY: install-default install-noruntimed: .PHONY: install-noruntimed @@ -79,10 +94,21 @@ install-runtimed: install-noprof: rm -f $(INSTALL_LIBDIR)/libasmrunp.a ln -s libasmrun.a $(INSTALL_LIBDIR)/libasmrunp.a +.PHONY: install-noprof install-prof: cp libasmrunp.a $(INSTALL_LIBDIR)/libasmrunp.a cd $(INSTALL_LIBDIR); $(RANLIB) libasmrunp.a +.PHONY: install-prof + +install-noshared: +.PHONY: install-noshared + +install-shared: + cp libasmrun_pic.a $(INSTALL_LIBDIR)/libasmrun_pic.a + cd $(INSTALL_LIBDIR); $(RANLIB) libasmrunp.a + cp libasmrun_shared.so $(INSTALL_LIBDIR)/libasmrun_shared.so +.PHONY: install-prof power-bsd_elf.S: power-elf.S cp power-elf.S power-bsd_elf.S @@ -183,18 +209,27 @@ clean:: %.p.o: %.S $(ASPP) -DSYS_$(SYSTEM) -DMODEL_$(MODEL) $(ASPPPROFFLAGS) -o $@ $< +%.pic.o: %.S + $(ASPP) -DSYS_$(SYSTEM) -DMODEL_$(MODEL) $(SHAREDCCCOMPOPTS) -o $@ $< + %.d.o: %.c $(CC) -c $(DFLAGS) -o $@ $< %.p.o: %.c $(CC) -c $(PFLAGS) -o $@ $< +%.pic.o: %.c + $(CC) -c $(PICFLAGS) -o $@ $< + %.o: %.s $(ASPP) -DSYS_$(SYSTEM) -o $@ $< %.p.o: %.s $(ASPP) -DSYS_$(SYSTEM) $(ASPPPROFFLAGS) -o $@ $< +%.pic.o: %.s + $(ASPP) -DSYS_$(SYSTEM) $(SHAREDCCCOMPOPTS) -o $@ $< + clean:: rm -f *.o *.a *~ diff --git a/byterun/Makefile b/byterun/Makefile index 67d6ec5e75..ae57e2a7aa 100644 --- a/byterun/Makefile +++ b/byterun/Makefile @@ -20,10 +20,7 @@ OBJS=$(COMMONOBJS) $(UNIX_OR_WIN32).o main.o DOBJS=$(OBJS:.o=.d.o) instrtrace.d.o PICOBJS=$(OBJS:.o=.pic.o) -SHARED_LIBS_TMP=$(SUPPORTS_SHARED_LIBRARIES:%false=) -SHARED_LIBS_DEPS=$(SHARED_LIBS_TMP:%true=libcamlrun_shared.so) - -all:: $(SHARED_LIBS_DEPS) +all:: all-$(SHARED) ocamlrun$(EXE): libcamlrun.a prims.o $(MKEXE) $(BYTECCLINKOPTS) -o ocamlrun$(EXE) \ @@ -41,15 +38,32 @@ libcamlrund.a: $(DOBJS) $(ARCMD) rc libcamlrund.a $(DOBJS) $(RANLIB) libcamlrund.a +all-noshared: +.PHONY: all-noshared + +all-shared: libcamlrun_pic.a libcamlrun_shared.so +.PHONY: all-shared + +libcamlrun_pic.a: $(PICOBJS) + ar rc libcamlrun_pic.a $(PICOBJS) + $(RANLIB) libcamlrun_pic.a + libcamlrun_shared.so: $(PICOBJS) $(MKDLL) -o libcamlrun_shared.so $(PICOBJS) $(BYTECCLIBS) -install:: - if test -f libcamlrun_shared.so; then \ - cp libcamlrun_shared.so $(INSTALL_LIBDIR)/libcamlrun_shared.so; fi +install:: install-$(SHARED) + +install-noshared: +.PHONY: install-noshared + +install-shared: + cp libcamlrun_shared.so $(INSTALL_LIBDIR)/libcamlrun_shared.so + cp libcamlrun_pic.a $(INSTALL_LIBDIR)/libcamlrun_pic.a + cd $(INSTALL_LIBDIR); $(RANLIB) libcamlrun_pic.a +.PHONY: install-shared clean:: - rm -f libcamlrun_shared.so + rm -f libcamlrun_shared.so libcamlrun_pic.a %.d.o: %.c $(CC) -c $(DFLAGS) $< -o $@ diff --git a/configure b/configure index 45e9f25db7..539e10e461 100755 --- a/configure +++ b/configure @@ -1738,6 +1738,11 @@ echo "MKEXEDEBUGFLAG=$mkexedebugflag" >> Makefile echo "MKDLL=$mksharedlib" >> Makefile echo "MKMAINDLL=$mkmaindll" >> Makefile echo "RUNTIMED=${debugruntime}" >>Makefile +if $shared_libraries_supported; then + echo "SHARED=shared" >>Makefile +else + echo "SHARED=noshared" >>Makefile +fi echo "WITH_DEBUGGER=${with_debugger}" >>Makefile echo "WITH_OCAMLDOC=${with_ocamldoc}" >>Makefile echo "WITH_OCAMLBUILD=${with_ocamlbuild}" >>Makefile From 84787df4198932f7a02301fca9772bb054b1e3c8 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 10 May 2015 05:49:41 +0000 Subject: [PATCH 252/494] PR#6733: ocamlbuild .{byte,native}.so targets and runtime_variant(X) flag (Peter Zotov) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16104 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 5 +++++ ocamlbuild/ocaml_compiler.ml | 8 +++++++- ocamlbuild/ocaml_compiler.mli | 2 ++ ocamlbuild/ocaml_specific.ml | 19 +++++++++++++++++++ ocamlbuild/testsuite/internal.ml | 7 +++++++ 5 files changed, 40 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index f6f0cbdcf5..c66ecf66b6 100644 --- a/Changes +++ b/Changes @@ -38,6 +38,11 @@ OCamlbuild: (Peter Zotov) - PR#6720: pass -g to C compilers when tag 'debug' is set (Peter Zotov, Gabriel Scherer) +- PR#6733: add .byte.so and .native.so targets to pass + -output-obj -cclib -shared. + (Peter Zotov) +- PR#6733: "runtime_variant(X)" to pass -runtime-variant X option. + (Peter Zotov) - PR#6774: new menhir-specific flags "only_tokens" and "external_tokens(Foo)" (François Pottier) diff --git a/ocamlbuild/ocaml_compiler.ml b/ocamlbuild/ocaml_compiler.ml index c270a7f637..7526598f72 100644 --- a/ocamlbuild/ocaml_compiler.ml +++ b/ocamlbuild/ocaml_compiler.ml @@ -156,7 +156,7 @@ let byte_compile_ocaml_interf mli cmi env build = let compile_ocaml_interf mli cmi env build = let mli = env mli and cmi = env cmi in prepare_compile build mli; - let tags = tags_of_pathname mli++"interf" in + let tags = tags_of_pathname mli++"interf" in let comp_c = if Tags.mem "native" tags then ocamlopt_c else ocamlc_c in comp_c tags mli cmi @@ -266,6 +266,9 @@ let byte_link = byte_link_gen ocamlc_link_prog let byte_output_obj = byte_link_gen ocamlc_link_prog (fun tags -> tags++"ocaml"++"link"++"byte"++"output_obj") +let byte_output_shared = byte_link_gen ocamlc_link_prog + (fun tags -> tags++"ocaml"++"link"++"byte"++"output_obj"++"output_shared") + let byte_library_link = byte_link_gen byte_lib_linker byte_lib_linker_tags let byte_debug_link_gen = @@ -286,6 +289,9 @@ let native_link x = native_link_gen ocamlopt_link_prog let native_output_obj x = native_link_gen ocamlopt_link_prog (fun tags -> tags++"ocaml"++"link"++"native"++"output_obj") x +let native_output_shared x = native_link_gen ocamlopt_link_prog + (fun tags -> tags++"ocaml"++"link"++"native"++"output_obj"++"output_shared") x + let native_library_link x = native_link_gen native_lib_linker native_lib_linker_tags x diff --git a/ocamlbuild/ocaml_compiler.mli b/ocamlbuild/ocaml_compiler.mli index 38206e5a44..0c951abd06 100644 --- a/ocamlbuild/ocaml_compiler.mli +++ b/ocamlbuild/ocaml_compiler.mli @@ -43,11 +43,13 @@ val link_gen : string -> string -> Rule.action val byte_link : string -> string -> Rule.action val byte_output_obj : string -> string -> Rule.action +val byte_output_shared : string -> string -> Rule.action val byte_library_link : string -> string -> Rule.action val byte_debug_link : string -> string -> Rule.action val byte_debug_library_link : string -> string -> Rule.action val native_link : string -> string -> Rule.action val native_output_obj : string -> string -> Rule.action +val native_output_shared : string -> string -> Rule.action val native_library_link : string -> string -> Rule.action val native_shared_library_link : ?tags:(string list) -> string -> string -> Rule.action val native_profile_link : string -> string -> Rule.action diff --git a/ocamlbuild/ocaml_specific.ml b/ocamlbuild/ocaml_specific.ml index 2c72b8b314..a64033113e 100644 --- a/ocamlbuild/ocaml_specific.ml +++ b/ocamlbuild/ocaml_specific.ml @@ -61,7 +61,9 @@ let x_p_dll = "%.p"-.-ext_dll;; (* -output-obj targets *) let x_byte_c = "%.byte.c";; let x_byte_o = "%.byte"-.-ext_obj;; +let x_byte_so = "%.byte"-.-ext_dll;; let x_native_o = "%.native"-.-ext_obj;; +let x_native_so = "%.native"-.-ext_dll;; rule "target files" ~dep:"%.itarget" @@ -221,6 +223,15 @@ rule "ocaml: cmo* -> byte.c" ~dep:"%.cmo" (Ocaml_compiler.byte_output_obj "%.cmo" x_byte_c);; +rule "ocaml: cmo* -> byte.(so|dll|dylib)" + ~prod:x_byte_so + ~dep:"%.cmo" + ~doc:"The foo.byte.so target, or foo.byte.dll under Windows, \ + or foo.byte.dylib under Mac OS X will produce a shared library file + by passing the -output-obj and -cclib -shared options \ + to the OCaml compiler. See also foo.native.{so,dll,dylib}." + (Ocaml_compiler.byte_output_shared "%.cmo" x_byte_so);; + rule "ocaml: p.cmx* & p.o* -> p.native" ~prod:"%.p.native" ~deps:["%.p.cmx"; x_p_o] @@ -239,6 +250,11 @@ rule "ocaml: cmx* & o* -> native.(o|obj)" ~deps:["%.cmx"; x_o] (Ocaml_compiler.native_output_obj "%.cmx" x_native_o);; +rule "ocaml: cmx* & o* -> native.(so|dll|dylib)" + ~prod:x_native_so + ~deps:["%.cmx"; x_o] + (Ocaml_compiler.native_output_shared "%.cmx" x_native_so);; + rule "ocaml: mllib & d.cmo* -> d.cma" ~prod:"%.d.cma" ~dep:"%.mllib" @@ -636,6 +652,8 @@ let () = (fun param -> S [A "-open"; A param]); pflag ["ocaml"; "compile"] "open" (fun param -> S [A "-open"; A param]); + pflag ["ocaml"; "link"] "runtime_variant" + (fun param -> S [A "-runtime-variant"; A param]); () let camlp4_flags camlp4s = @@ -690,6 +708,7 @@ flag ["c"; "debug"; "compile"] (A "-g"); flag ["c"; "debug"; "link"] (A "-g"); flag ["ocaml"; "link"; "native"; "output_obj"] (A"-output-obj");; flag ["ocaml"; "link"; "byte"; "output_obj"] (A"-output-obj");; +flag ["ocaml"; "link"; "output_shared"] & (S[A"-cclib"; A"-shared"]);; flag ["ocaml"; "dtypes"; "compile"] (A "-dtypes");; flag ["ocaml"; "annot"; "compile"] (A "-annot");; flag ["ocaml"; "annot"; "pack"] (A "-annot");; diff --git a/ocamlbuild/testsuite/internal.ml b/ocamlbuild/testsuite/internal.ml index d0071543f0..9b48af5273 100644 --- a/ocamlbuild/testsuite/internal.ml +++ b/ocamlbuild/testsuite/internal.ml @@ -160,6 +160,13 @@ let () = test "OutputObj" ~tree:[T.f "hello.ml" ~content:"print_endline \"Hello, World!\""] ~targets:("hello.byte.o",["hello.byte.c";"hello.native.o"]) ();; +let () = test "OutputShared" + ~options:[`no_ocamlfind] + ~description:"output_shared targets for native and bytecode (PR #6733)" + ~tree:[T.f "hello.ml" ~content:"print_endline \"Hello, World!\""; + T.f "_tags" ~content:"<*.so>: runtime_variant(_pic)"] + ~targets:("hello.byte.so",["hello.native.so"]) ();; + let () = test "StrictSequenceFlag" ~options:[`no_ocamlfind; `quiet] ~description:"strict_sequence tag" From d0f735260123a38e0aa729f213a0e36363c09575 Mon Sep 17 00:00:00 2001 From: Mark Shinwell <mshinwell@janestreet.com> Date: Mon, 11 May 2015 18:20:49 +0000 Subject: [PATCH 253/494] Misplaced assertion for no-naked-pointers mode git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16107 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ byterun/major_gc.c | 22 +++++++++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Changes b/Changes index c66ecf66b6..a3d9cf46cc 100644 --- a/Changes +++ b/Changes @@ -150,6 +150,8 @@ Bug fixes: (Peter Zotov) - GPR#171: allow custom warning printers / catchers (Benjamin Canou, review by Damien Doligez) +- Misplaced assertion in major_gc.c for no-naked-pointers mode + (Stephen Dolan, Mark Shinwell) Feature wishes: - PR#6641: add -g, -ocamlcflags, -ocamloptflags options to ocamlmklib diff --git a/byterun/major_gc.c b/byterun/major_gc.c index f31226e9e1..006da8471e 100644 --- a/byterun/major_gc.c +++ b/byterun/major_gc.c @@ -92,13 +92,6 @@ void caml_darken (value v, value *p /* not used */) { #ifdef NATIVE_CODE_AND_NO_NAKED_POINTERS if (Is_block (v) && Wosize_val (v) > 0) { - /* We insist that naked pointers to outside the heap point to things that - look like values with headers coloured black. This isn't always - strictly necessary but is essential in certain cases---in particular - when the value is allocated in a read-only section. (For the values - where it would be safe it is a performance improvement since we avoid - putting them on the grey list.) */ - CAMLassert (Is_in_heap (v) || Is_black_hd (Hd_val (v))); #else if (Is_block (v) && Is_in_heap (v)) { #endif @@ -109,6 +102,15 @@ void caml_darken (value v, value *p /* not used */) h = Hd_val (v); t = Tag_hd (h); } +#ifdef NATIVE_CODE_AND_NO_NAKED_POINTERS + /* We insist that naked pointers to outside the heap point to things that + look like values with headers coloured black. This isn't always + strictly necessary but is essential in certain cases---in particular + when the value is allocated in a read-only section. (For the values + where it would be safe it is a performance improvement since we avoid + putting them on the grey list.) */ + CAMLassert (Is_in_heap (v) || Is_black_hd (h)); +#endif CAMLassert (!Is_blue_hd (h)); if (Is_white_hd (h)){ if (t < No_scan_tag){ @@ -172,8 +174,6 @@ static void mark_slice (intnat work) be reliably determined, so we always use the page table when marking such values. */ && (!marking_closure || Is_in_heap (child))) { - /* See [caml_darken] for a description of this assertion. */ - CAMLassert (Is_in_heap (child) || Is_black_hd (Hd_val (child))); #else if (Is_block (child) && Is_in_heap (child)) { #endif @@ -192,6 +192,10 @@ static void mark_slice (intnat work) child -= Infix_offset_val(child); hd = Hd_val(child); } +#ifdef NATIVE_CODE_AND_NO_NAKED_POINTERS + /* See [caml_darken] for a description of this assertion. */ + CAMLassert (Is_in_heap (child) || Is_black_hd (hd)); +#endif if (Is_white_hd (hd)){ Hd_val (child) = Grayhd_hd (hd); *gray_vals_ptr++ = child; From 651c47c75c46683402a01daded6681b2a95fa044 Mon Sep 17 00:00:00 2001 From: Leo White <leo@lpw25.net> Date: Mon, 11 May 2015 19:40:30 +0000 Subject: [PATCH 254/494] Update VERSION file git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16108 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index b871a3ad9e..b73d959d88 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.02.2+dev5-2015-05-06 +4.02.2+dev6-2015-05-11 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli From 29d53fcca939375cba21c14a844bfa26831ceb28 Mon Sep 17 00:00:00 2001 From: Leo White <leo@lpw25.net> Date: Mon, 11 May 2015 19:43:48 +0000 Subject: [PATCH 255/494] GPR#149: Attach documentation comments to Parsetree git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16109 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- .depend | 23 ++- Changes | 1 + Makefile | 4 +- Makefile.nt | 2 +- debugger/Makefile.shared | 2 +- driver/compenv.ml | 1 + driver/main.ml | 1 + driver/main_args.ml | 7 + driver/main_args.mli | 1 + driver/optmain.ml | 1 + man/ocamlc.m | 8 +- man/ocamlopt.m | 3 + ocamlbuild/ocaml_specific.ml | 1 + otherlibs/dynlink/Makefile | 2 +- parsing/ast_helper.ml | 119 ++++++++---- parsing/ast_helper.mli | 62 +++++-- parsing/docstrings.ml | 344 +++++++++++++++++++++++++++++++++++ parsing/docstrings.mli | 148 +++++++++++++++ parsing/lexer.mli | 5 +- parsing/lexer.mll | 165 +++++++++++++---- parsing/location.mli | 5 +- parsing/parse.ml | 2 + parsing/parser.mly | 246 ++++++++++++++++--------- stdlib/camlinternalFormat.ml | 2 +- stdlib/format.mli | 253 ++++++++++++-------------- stdlib/printf.mli | 7 +- stdlib/scanf.mli | 57 +++--- tools/Makefile.shared | 7 +- tools/ocamlcp.ml | 1 + tools/ocamloptp.ml | 1 + toplevel/genprintval.mli | 1 + typing/ctype.mli | 1 + typing/subst.ml | 19 +- utils/clflags.ml | 1 + utils/clflags.mli | 1 + utils/warnings.ml | 10 +- utils/warnings.mli | 1 + 37 files changed, 1141 insertions(+), 374 deletions(-) create mode 100644 parsing/docstrings.ml create mode 100644 parsing/docstrings.mli diff --git a/.depend b/.depend index b475333bed..7f7c43c5e7 100644 --- a/.depend +++ b/.depend @@ -25,9 +25,10 @@ utils/terminfo.cmx : utils/terminfo.cmi utils/warnings.cmo : utils/warnings.cmi utils/warnings.cmx : utils/warnings.cmi parsing/ast_helper.cmi : parsing/parsetree.cmi parsing/longident.cmi \ - parsing/location.cmi parsing/asttypes.cmi + parsing/location.cmi parsing/docstrings.cmi parsing/asttypes.cmi parsing/ast_mapper.cmi : parsing/parsetree.cmi parsing/location.cmi parsing/asttypes.cmi : parsing/location.cmi +parsing/docstrings.cmi : parsing/location.cmi parsing/parsetree.cmi parsing/lexer.cmi : parsing/parser.cmi parsing/location.cmi parsing/location.cmi : utils/warnings.cmi parsing/longident.cmi : @@ -40,9 +41,11 @@ parsing/pprintast.cmi : parsing/parsetree.cmi parsing/longident.cmi \ parsing/printast.cmi : parsing/parsetree.cmi parsing/syntaxerr.cmi : parsing/location.cmi parsing/ast_helper.cmo : parsing/parsetree.cmi parsing/longident.cmi \ - parsing/location.cmi parsing/asttypes.cmi parsing/ast_helper.cmi + parsing/location.cmi parsing/docstrings.cmi parsing/asttypes.cmi \ + parsing/ast_helper.cmi parsing/ast_helper.cmx : parsing/parsetree.cmi parsing/longident.cmx \ - parsing/location.cmx parsing/asttypes.cmi parsing/ast_helper.cmi + parsing/location.cmx parsing/docstrings.cmx parsing/asttypes.cmi \ + parsing/ast_helper.cmi parsing/ast_mapper.cmo : parsing/parsetree.cmi utils/misc.cmi \ parsing/longident.cmi parsing/location.cmi utils/config.cmi \ utils/clflags.cmi parsing/asttypes.cmi parsing/ast_helper.cmi \ @@ -51,10 +54,14 @@ parsing/ast_mapper.cmx : parsing/parsetree.cmi utils/misc.cmx \ parsing/longident.cmx parsing/location.cmx utils/config.cmx \ utils/clflags.cmx parsing/asttypes.cmi parsing/ast_helper.cmx \ parsing/ast_mapper.cmi +parsing/docstrings.cmo : utils/warnings.cmi parsing/location.cmi \ + parsing/docstrings.cmi +parsing/docstrings.cmx : utils/warnings.cmx parsing/location.cmx \ + parsing/docstrings.cmi parsing/lexer.cmo : utils/warnings.cmi parsing/parser.cmi utils/misc.cmi \ - parsing/location.cmi parsing/lexer.cmi + parsing/location.cmi parsing/docstrings.cmi parsing/lexer.cmi parsing/lexer.cmx : utils/warnings.cmx parsing/parser.cmx utils/misc.cmx \ - parsing/location.cmx parsing/lexer.cmi + parsing/location.cmx parsing/docstrings.cmx parsing/lexer.cmi parsing/location.cmo : utils/warnings.cmi utils/terminfo.cmi \ parsing/location.cmi parsing/location.cmx : utils/warnings.cmx utils/terminfo.cmx \ @@ -62,9 +69,11 @@ parsing/location.cmx : utils/warnings.cmx utils/terminfo.cmx \ parsing/longident.cmo : utils/misc.cmi parsing/longident.cmi parsing/longident.cmx : utils/misc.cmx parsing/longident.cmi parsing/parse.cmo : parsing/syntaxerr.cmi parsing/parser.cmi \ - parsing/location.cmi parsing/lexer.cmi parsing/parse.cmi + parsing/location.cmi parsing/lexer.cmi parsing/docstrings.cmi \ + parsing/parse.cmi parsing/parse.cmx : parsing/syntaxerr.cmx parsing/parser.cmx \ - parsing/location.cmx parsing/lexer.cmx parsing/parse.cmi + parsing/location.cmx parsing/lexer.cmx parsing/docstrings.cmx \ + parsing/parse.cmi parsing/parser.cmo : parsing/syntaxerr.cmi parsing/parsetree.cmi \ parsing/longident.cmi parsing/location.cmi utils/clflags.cmi \ parsing/asttypes.cmi parsing/ast_helper.cmi parsing/parser.cmi diff --git a/Changes b/Changes index a3d9cf46cc..974424c18e 100644 --- a/Changes +++ b/Changes @@ -22,6 +22,7 @@ Compilers: (Peter Zotov) - GPR#159: Better locations for structure/signature items (Leo White) +- GPR#149: Attach documentation comments to parse tree (Leo White) Toplevel and debugger: - PR#5958: generalized polymorphic #install_printer diff --git a/Makefile b/Makefile index 10c88bc1bf..5222cf2422 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ include stdlib/StdlibModules CAMLC=boot/ocamlrun boot/ocamlc -nostdlib -I boot CAMLOPT=boot/ocamlrun ./ocamlopt -nostdlib -I stdlib -I otherlibs/dynlink -COMPFLAGS=-strict-sequence -w +33..39+48 -warn-error A -bin-annot \ +COMPFLAGS=-strict-sequence -w +33..39+48+50 -warn-error A -bin-annot \ -safe-string $(INCLUDES) LINKFLAGS= @@ -43,7 +43,7 @@ UTILS=utils/misc.cmo utils/tbl.cmo utils/config.cmo \ utils/consistbl.cmo PARSING=parsing/location.cmo parsing/longident.cmo \ - parsing/ast_helper.cmo \ + parsing/docstrings.cmo parsing/ast_helper.cmo \ parsing/syntaxerr.cmo parsing/parser.cmo \ parsing/lexer.cmo parsing/parse.cmo parsing/printast.cmo \ parsing/pprintast.cmo \ diff --git a/Makefile.nt b/Makefile.nt index a436d26997..4564cf6b97 100644 --- a/Makefile.nt +++ b/Makefile.nt @@ -39,7 +39,7 @@ UTILS=utils/misc.cmo utils/tbl.cmo utils/config.cmo \ utils/consistbl.cmo PARSING=parsing/location.cmo parsing/longident.cmo \ - parsing/ast_helper.cmo \ + parsing/docstrings.cmo parsing/ast_helper.cmo \ parsing/syntaxerr.cmo parsing/parser.cmo \ parsing/lexer.cmo parsing/parse.cmo parsing/printast.cmo \ parsing/pprintast.cmo \ diff --git a/debugger/Makefile.shared b/debugger/Makefile.shared index fed1d26dab..645c3e1dd4 100644 --- a/debugger/Makefile.shared +++ b/debugger/Makefile.shared @@ -32,7 +32,7 @@ OTHEROBJS=\ $(UNIXDIR)/unix.cma \ ../utils/misc.cmo ../utils/config.cmo ../utils/tbl.cmo \ ../utils/clflags.cmo ../utils/consistbl.cmo ../utils/warnings.cmo \ - ../parsing/location.cmo ../parsing/longident.cmo \ + ../parsing/location.cmo ../parsing/longident.cmo ../parsing/docstrings.cmo \ ../parsing/ast_helper.cmo ../parsing/ast_mapper.cmo \ ../typing/ident.cmo ../typing/path.cmo ../typing/types.cmo \ ../typing/btype.cmo ../typing/primitive.cmo ../typing/typedtree.cmo \ diff --git a/driver/compenv.ml b/driver/compenv.ml index 4e2e17f873..e7b4987ccc 100644 --- a/driver/compenv.ml +++ b/driver/compenv.ml @@ -177,6 +177,7 @@ let read_OCAMLPARAM ppf position = | "verbose" -> set "verbose" [ verbose ] v | "nopervasives" -> set "nopervasives" [ nopervasives ] v | "slash" -> set "slash" [ force_slash ] v (* for ocamldep *) + | "keep-docs" -> set "keep-docs" [ Clflags.keep_docs ] v | "keep-locs" -> set "keep-locs" [ Clflags.keep_locs ] v | "compact" -> clear "compact" [ optimize_for_speed ] v diff --git a/driver/main.ml b/driver/main.ml index a390c7cbc9..e31d00068a 100644 --- a/driver/main.ml +++ b/driver/main.ml @@ -92,6 +92,7 @@ module Options = Main_args.Make_bytecomp_options (struct let _impl = impl let _intf = intf let _intf_suffix s = Config.interface_suffix := s + let _keep_docs = set keep_docs let _keep_locs = set keep_locs let _labels = unset classic let _linkall = set link_everything diff --git a/driver/main_args.ml b/driver/main_args.ml index 0f33e52766..e3352669bc 100644 --- a/driver/main_args.ml +++ b/driver/main_args.ml @@ -126,6 +126,10 @@ let mk_intf_suffix_2 f = "-intf_suffix", Arg.String f, "<string> (deprecated) same as -intf-suffix" ;; +let mk_keep_docs f = + "-keep-docs", Arg.Unit f, " Keep documentation strings in .cmi files" +;; + let mk_keep_locs f = "-keep-locs", Arg.Unit f, " Keep locations in .cmi files" ;; @@ -521,6 +525,7 @@ module type Compiler_options = sig val _impl : string -> unit val _intf : string -> unit val _intf_suffix : string -> unit + val _keep_docs : unit -> unit val _keep_locs : unit -> unit val _linkall : unit -> unit val _noautolink : unit -> unit @@ -659,6 +664,7 @@ struct mk_intf F._intf; mk_intf_suffix F._intf_suffix; mk_intf_suffix_2 F._intf_suffix; + mk_keep_docs F._keep_docs; mk_keep_locs F._keep_locs; mk_labels F._labels; mk_linkall F._linkall; @@ -776,6 +782,7 @@ struct mk_inline F._inline; mk_intf F._intf; mk_intf_suffix F._intf_suffix; + mk_keep_docs F._keep_docs; mk_keep_locs F._keep_locs; mk_labels F._labels; mk_linkall F._linkall; diff --git a/driver/main_args.mli b/driver/main_args.mli index 021a9529eb..cdcd4d0582 100644 --- a/driver/main_args.mli +++ b/driver/main_args.mli @@ -62,6 +62,7 @@ module type Compiler_options = sig val _impl : string -> unit val _intf : string -> unit val _intf_suffix : string -> unit + val _keep_docs : unit -> unit val _keep_locs : unit -> unit val _linkall : unit -> unit val _noautolink : unit -> unit diff --git a/driver/optmain.ml b/driver/optmain.ml index 0e2eb3c3f7..0a680ce4d8 100644 --- a/driver/optmain.ml +++ b/driver/optmain.ml @@ -90,6 +90,7 @@ module Options = Main_args.Make_optcomp_options (struct let _inline n = inline_threshold := n * 8 let _intf = intf let _intf_suffix s = Config.interface_suffix := s + let _keep_docs = set keep_docs let _keep_locs = set keep_locs let _labels = clear classic let _linkall = set link_everything diff --git a/man/ocamlc.m b/man/ocamlc.m index 96923483b4..adb280927f 100644 --- a/man/ocamlc.m +++ b/man/ocamlc.m @@ -374,6 +374,9 @@ compiled interface files (.cmi), compiled object code files .I string as interface files (instead of the default .mli). .TP +.B \-keep-docs +Keep documentation strings in generated .cmi files. +.TP .B \-keep-locs Keep locations in generated .cmi files. .TP @@ -841,6 +844,9 @@ compilation in any way (even if it is fatal). If a warning is enabled, 49 \ \ Missing cmi file when looking up module alias. +50 +\ \ Unexpected documentation comment. + The letters stand for the following sets of warnings. Any letter not mentioned here corresponds to the empty set. @@ -894,7 +900,7 @@ compilation in any way (even if it is fatal). If a warning is enabled, .IP The default setting is -.BR \-w\ +a\-4\-6\-7\-9\-27\-29\-32..39\-41..42\-44\-45 . +.BR \-w\ +a\-4\-6\-7\-9\-27\-29\-32..39\-41\-42\-44\-45\-48\-50 . Note that warnings .BR 5 \ and \ 10 are not always triggered, depending on the internals of the type checker. diff --git a/man/ocamlopt.m b/man/ocamlopt.m index 839247962f..a541e598d4 100644 --- a/man/ocamlopt.m +++ b/man/ocamlopt.m @@ -304,6 +304,9 @@ and libraries (.cmxa). By default, the current directory is searched as interface files (instead of the default .mli). .TP .B \-keep-locs +Keep documentation strings in generated .cmi files. +.TP +.B \-keep-locs Keep locations in generated .cmi files. .TP .B \-labels diff --git a/ocamlbuild/ocaml_specific.ml b/ocamlbuild/ocaml_specific.ml index a64033113e..18ae0944e3 100644 --- a/ocamlbuild/ocaml_specific.ml +++ b/ocamlbuild/ocaml_specific.ml @@ -735,6 +735,7 @@ flag ["ocaml"; "compile"; "no_alias_deps";] (A "-no-alias-deps");; flag ["ocaml"; "compile"; "strict_formats";] (A "-strict-formats");; flag ["ocaml"; "native"; "compile"; "opaque";] (A "-opaque");; flag ["ocaml"; "native"; "compile"; "no_float_const_prop";] (A "-no-float-const-prop"); +flag ["ocaml"; "compile"; "keep_docs";] (A "-keep-docs"); flag ["ocaml"; "compile"; "keep_locs";] (A "-keep-locs"); flag ["ocaml"; "absname"; "compile"] (A "-absname");; flag ["ocaml"; "absname"; "infer_interface"] (A "-absname");; diff --git a/otherlibs/dynlink/Makefile b/otherlibs/dynlink/Makefile index a0563c536e..0197d1db6b 100644 --- a/otherlibs/dynlink/Makefile +++ b/otherlibs/dynlink/Makefile @@ -34,7 +34,7 @@ COMPILEROBJS=\ ../../utils/terminfo.cmo ../../utils/warnings.cmo \ ../../parsing/asttypes.cmi \ ../../parsing/location.cmo ../../parsing/longident.cmo \ - ../../parsing/ast_helper.cmo \ + ../../parsing/docstrings.cmo ../../parsing/ast_helper.cmo \ ../../parsing/ast_mapper.cmo \ ../../typing/ident.cmo ../../typing/path.cmo \ ../../typing/primitive.cmo ../../typing/types.cmo \ diff --git a/parsing/ast_helper.ml b/parsing/ast_helper.ml index 588451423f..b84cda8cdd 100644 --- a/parsing/ast_helper.ml +++ b/parsing/ast_helper.ml @@ -14,6 +14,7 @@ open Asttypes open Parsetree +open Docstrings type lid = Longident.t loc type str = string loc @@ -169,6 +170,10 @@ module Sig = struct let class_type ?loc a = mk ?loc (Psig_class_type a) let extension ?loc ?(attrs = []) a = mk ?loc (Psig_extension (a, attrs)) let attribute ?loc a = mk ?loc (Psig_attribute a) + let text txt = + List.map + (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds)) + txt end module Str = struct @@ -189,6 +194,10 @@ module Str = struct let include_ ?loc a = mk ?loc (Pstr_include a) let extension ?loc ?(attrs = []) a = mk ?loc (Pstr_extension (a, attrs)) let attribute ?loc a = mk ?loc (Pstr_attribute a) + let text txt = + List.map + (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds)) + txt end module Cl = struct @@ -225,13 +234,13 @@ module Cty = struct end module Ctf = struct - let mk ?(loc = !default_loc) ?(attrs = []) d = + let mk ?(loc = !default_loc) ?(attrs = []) + ?(docs = empty_docs) d = { pctf_desc = d; pctf_loc = loc; - pctf_attributes = attrs; + pctf_attributes = add_docs_attrs docs attrs; } - let attr d a = {d with pctf_attributes = d.pctf_attributes @ [a]} let inherit_ ?loc ?attrs a = mk ?loc ?attrs (Pctf_inherit a) let val_ ?loc ?attrs a b c d = mk ?loc ?attrs (Pctf_val (a, b, c, d)) @@ -239,16 +248,23 @@ module Ctf = struct let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Pctf_constraint (a, b)) let extension ?loc ?attrs a = mk ?loc ?attrs (Pctf_extension a) let attribute ?loc a = mk ?loc (Pctf_attribute a) + let text txt = + List.map + (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds)) + txt + + let attr d a = {d with pctf_attributes = d.pctf_attributes @ [a]} + end module Cf = struct - let mk ?(loc = !default_loc) ?(attrs = []) d = + let mk ?(loc = !default_loc) ?(attrs = []) + ?(docs = empty_docs) d = { pcf_desc = d; pcf_loc = loc; - pcf_attributes = attrs; + pcf_attributes = add_docs_attrs docs attrs; } - let attr d a = {d with pcf_attributes = d.pcf_attributes @ [a]} let inherit_ ?loc ?attrs a b c = mk ?loc ?attrs (Pcf_inherit (a, b, c)) let val_ ?loc ?attrs a b c = mk ?loc ?attrs (Pcf_val (a, b, c)) @@ -257,96 +273,117 @@ module Cf = struct let initializer_ ?loc ?attrs a = mk ?loc ?attrs (Pcf_initializer a) let extension ?loc ?attrs a = mk ?loc ?attrs (Pcf_extension a) let attribute ?loc a = mk ?loc (Pcf_attribute a) + let text txt = + List.map + (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds)) + txt let virtual_ ct = Cfk_virtual ct let concrete o e = Cfk_concrete (o, e) + + let attr d a = {d with pcf_attributes = d.pcf_attributes @ [a]} + end module Val = struct - let mk ?(loc = !default_loc) ?(attrs = []) ?(prim = []) name typ = + let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs) + ?(prim = []) name typ = { pval_name = name; pval_type = typ; - pval_attributes = attrs; + pval_attributes = add_docs_attrs docs attrs; pval_loc = loc; pval_prim = prim; } end module Md = struct - let mk ?(loc = !default_loc) ?(attrs = []) name typ = + let mk ?(loc = !default_loc) ?(attrs = []) + ?(docs = empty_docs) ?(text = []) name typ = { pmd_name = name; pmd_type = typ; - pmd_attributes = attrs; + pmd_attributes = + add_text_attrs text (add_docs_attrs docs attrs); pmd_loc = loc; } end module Mtd = struct - let mk ?(loc = !default_loc) ?(attrs = []) ?typ name = + let mk ?(loc = !default_loc) ?(attrs = []) + ?(docs = empty_docs) ?(text = []) ?typ name = { pmtd_name = name; pmtd_type = typ; - pmtd_attributes = attrs; + pmtd_attributes = + add_text_attrs text (add_docs_attrs docs attrs); pmtd_loc = loc; } end module Mb = struct - let mk ?(loc = !default_loc) ?(attrs = []) name expr = + let mk ?(loc = !default_loc) ?(attrs = []) + ?(docs = empty_docs) ?(text = []) name expr = { pmb_name = name; pmb_expr = expr; - pmb_attributes = attrs; + pmb_attributes = + add_text_attrs text (add_docs_attrs docs attrs); pmb_loc = loc; } end module Opn = struct - let mk ?(loc = !default_loc) ?(attrs = []) ?(override = Fresh) lid = + let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs) + ?(override = Fresh) lid = { popen_lid = lid; popen_override = override; popen_loc = loc; - popen_attributes = attrs; + popen_attributes = add_docs_attrs docs attrs; } end module Incl = struct - let mk ?(loc = !default_loc) ?(attrs = []) mexpr = + let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs) mexpr = { pincl_mod = mexpr; pincl_loc = loc; - pincl_attributes = attrs; + pincl_attributes = add_docs_attrs docs attrs; } + end module Vb = struct - let mk ?(loc = !default_loc) ?(attrs = []) pat expr = + let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs) + ?(text = []) pat expr = { pvb_pat = pat; pvb_expr = expr; - pvb_attributes = attrs; + pvb_attributes = + add_text_attrs text (add_docs_attrs docs attrs); pvb_loc = loc; } end module Ci = struct - let mk ?(loc = !default_loc) ?(attrs = []) ?(virt = Concrete) ?(params = []) - name expr = + let mk ?(loc = !default_loc) ?(attrs = []) + ?(docs = empty_docs) ?(text = []) + ?(virt = Concrete) ?(params = []) name expr = { pci_virt = virt; pci_params = params; pci_name = name; pci_expr = expr; - pci_attributes = attrs; + pci_attributes = + add_text_attrs text (add_docs_attrs docs attrs); pci_loc = loc; } end module Type = struct let mk ?(loc = !default_loc) ?(attrs = []) + ?(docs = empty_docs) ?(text = []) ?(params = []) ?(cstrs = []) ?(kind = Ptype_abstract) @@ -360,65 +397,73 @@ module Type = struct ptype_kind = kind; ptype_private = priv; ptype_manifest = manifest; - ptype_attributes = attrs; + ptype_attributes = + add_text_attrs text (add_docs_attrs docs attrs); ptype_loc = loc; } - let constructor ?(loc = !default_loc) ?(attrs = []) ?(args = []) ?res name = + let constructor ?(loc = !default_loc) ?(attrs = []) ?(info = empty_info) + ?(args = []) ?res name = { pcd_name = name; pcd_args = args; pcd_res = res; pcd_loc = loc; - pcd_attributes = attrs; + pcd_attributes = add_info_attrs info attrs; } - let field ?(loc = !default_loc) ?(attrs = []) ?(mut = Immutable) name typ = + let field ?(loc = !default_loc) ?(attrs = []) ?(info = empty_info) + ?(mut = Immutable) name typ = { pld_name = name; pld_mutable = mut; pld_type = typ; pld_loc = loc; - pld_attributes = attrs; + pld_attributes = add_info_attrs info attrs; } + end (** Type extensions *) module Te = struct - let mk ?(attrs = []) ?(params = []) ?(priv = Public) path constructors = + let mk ?(attrs = []) ?(docs = empty_docs) + ?(params = []) ?(priv = Public) path constructors = { ptyext_path = path; ptyext_params = params; ptyext_constructors = constructors; ptyext_private = priv; - ptyext_attributes = attrs; + ptyext_attributes = add_docs_attrs docs attrs; } - let constructor ?(loc = !default_loc) ?(attrs = []) name kind = + let constructor ?(loc = !default_loc) ?(attrs = []) + ?(docs = empty_docs) ?(info = empty_info) name kind = { pext_name = name; pext_kind = kind; pext_loc = loc; - pext_attributes = attrs; + pext_attributes = add_docs_attrs docs (add_info_attrs info attrs); } - let decl ?(loc = !default_loc) ?(attrs = []) ?(args = []) ?res name = + let decl ?(loc = !default_loc) ?(attrs = []) + ?(docs = empty_docs) ?(info = empty_info) ?(args = []) ?res name = { pext_name = name; pext_kind = Pext_decl(args, res); pext_loc = loc; - pext_attributes = attrs; + pext_attributes = add_docs_attrs docs (add_info_attrs info attrs); } - let rebind ?(loc = !default_loc) ?(attrs = []) name lid = + let rebind ?(loc = !default_loc) ?(attrs = []) + ?(docs = empty_docs) ?(info = empty_info) name lid = { pext_name = name; pext_kind = Pext_rebind lid; pext_loc = loc; - pext_attributes = attrs; + pext_attributes = add_docs_attrs docs (add_info_attrs info attrs); } -end +end module Csig = struct let mk self fields = diff --git a/parsing/ast_helper.mli b/parsing/ast_helper.mli index b9b04f8223..4dc96169f6 100644 --- a/parsing/ast_helper.mli +++ b/parsing/ast_helper.mli @@ -14,6 +14,7 @@ open Parsetree open Asttypes +open Docstrings type lid = Longident.t loc type str = string loc @@ -24,6 +25,7 @@ type attrs = attribute list val default_loc: loc ref (** Default value for all optional location arguments. *) + val with_default_loc: loc -> (unit -> 'a) -> 'a (** Set the [default_loc] within the scope of the execution of the provided function. *) @@ -146,27 +148,38 @@ module Exp: (** Value declarations *) module Val: sig - val mk: ?loc:loc -> ?attrs:attrs -> ?prim:string list -> str -> core_type -> value_description + val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> + ?prim:string list -> str -> core_type -> value_description end (** Type declarations *) module Type: sig - val mk: ?loc:loc -> ?attrs:attrs -> ?params:(core_type * variance) list -> ?cstrs:(core_type * core_type * loc) list -> ?kind:type_kind -> ?priv:private_flag -> ?manifest:core_type -> str -> type_declaration - - val constructor: ?loc:loc -> ?attrs:attrs -> ?args:core_type list -> ?res:core_type -> str -> constructor_declaration - val field: ?loc:loc -> ?attrs:attrs -> ?mut:mutable_flag -> str -> core_type -> label_declaration + val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text -> + ?params:(core_type * variance) list -> ?cstrs:(core_type * core_type * loc) list -> + ?kind:type_kind -> ?priv:private_flag -> ?manifest:core_type -> str -> + type_declaration + + val constructor: ?loc:loc -> ?attrs:attrs -> ?info:info -> + ?args:core_type list -> ?res:core_type -> str -> constructor_declaration + val field: ?loc:loc -> ?attrs:attrs -> ?info:info -> + ?mut:mutable_flag -> str -> core_type -> label_declaration end (** Type extensions *) module Te: sig - val mk: ?attrs:attrs -> ?params:(core_type * variance) list -> ?priv:private_flag -> lid -> extension_constructor list -> type_extension + val mk: ?attrs:attrs -> ?docs:docs -> + ?params:(core_type * variance) list -> ?priv:private_flag -> + lid -> extension_constructor list -> type_extension - val constructor: ?loc:loc -> ?attrs:attrs -> str -> extension_constructor_kind -> extension_constructor + val constructor: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?info:info -> + str -> extension_constructor_kind -> extension_constructor - val decl: ?loc:loc -> ?attrs:attrs -> ?args:core_type list -> ?res:core_type -> str -> extension_constructor - val rebind: ?loc:loc -> ?attrs:attrs -> str -> lid -> extension_constructor + val decl: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?info:info -> + ?args:core_type list -> ?res:core_type -> str -> extension_constructor + val rebind: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?info:info -> + str -> lid -> extension_constructor end (** {2 Module language} *) @@ -221,6 +234,7 @@ module Sig: val class_type: ?loc:loc -> class_type_declaration list -> signature_item val extension: ?loc:loc -> ?attrs:attrs -> extension -> signature_item val attribute: ?loc:loc -> attribute -> signature_item + val text: text -> signature_item list end (** Structure items *) @@ -243,43 +257,49 @@ module Str: val include_: ?loc:loc -> include_declaration -> structure_item val extension: ?loc:loc -> ?attrs:attrs -> extension -> structure_item val attribute: ?loc:loc -> attribute -> structure_item + val text: text -> structure_item list end (** Module declarations *) module Md: sig - val mk: ?loc:loc -> ?attrs:attrs -> str -> module_type -> module_declaration + val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text -> + str -> module_type -> module_declaration end (** Module type declarations *) module Mtd: sig - val mk: ?loc:loc -> ?attrs:attrs -> ?typ:module_type -> str -> module_type_declaration + val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text -> + ?typ:module_type -> str -> module_type_declaration end (** Module bindings *) module Mb: sig - val mk: ?loc:loc -> ?attrs:attrs -> str -> module_expr -> module_binding + val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text -> + str -> module_expr -> module_binding end (* Opens *) module Opn: sig - val mk: ?loc: loc -> ?attrs:attrs -> ?override:override_flag -> lid -> open_description + val mk: ?loc: loc -> ?attrs:attrs -> ?docs:docs -> + ?override:override_flag -> lid -> open_description end (* Includes *) module Incl: sig - val mk: ?loc: loc -> ?attrs:attrs -> 'a -> 'a include_infos + val mk: ?loc: loc -> ?attrs:attrs -> ?docs:docs -> 'a -> 'a include_infos end (** Value bindings *) module Vb: sig - val mk: ?loc: loc -> ?attrs:attrs -> pattern -> expression -> value_binding + val mk: ?loc: loc -> ?attrs:attrs -> ?docs:docs -> ?text:text -> + pattern -> expression -> value_binding end @@ -300,7 +320,8 @@ module Cty: (** Class type fields *) module Ctf: sig - val mk: ?loc:loc -> ?attrs:attrs -> class_type_field_desc -> class_type_field + val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> + class_type_field_desc -> class_type_field val attr: class_type_field -> attribute -> class_type_field val inherit_: ?loc:loc -> ?attrs:attrs -> class_type -> class_type_field @@ -309,6 +330,7 @@ module Ctf: val constraint_: ?loc:loc -> ?attrs:attrs -> core_type -> core_type -> class_type_field val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_type_field val attribute: ?loc:loc -> attribute -> class_type_field + val text: text -> class_type_field list end (** Class expressions *) @@ -329,7 +351,7 @@ module Cl: (** Class fields *) module Cf: sig - val mk: ?loc:loc -> ?attrs:attrs -> class_field_desc -> class_field + val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> class_field_desc -> class_field val attr: class_field -> attribute -> class_field val inherit_: ?loc:loc -> ?attrs:attrs -> override_flag -> class_expr -> string option -> class_field @@ -339,15 +361,19 @@ module Cf: val initializer_: ?loc:loc -> ?attrs:attrs -> expression -> class_field val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_field val attribute: ?loc:loc -> attribute -> class_field + val text: text -> class_field list val virtual_: core_type -> class_field_kind val concrete: override_flag -> expression -> class_field_kind + end (** Classes *) module Ci: sig - val mk: ?loc:loc -> ?attrs:attrs -> ?virt:virtual_flag -> ?params:(core_type * variance) list -> str -> 'a -> 'a class_infos + val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text -> + ?virt:virtual_flag -> ?params:(core_type * variance) list -> + str -> 'a -> 'a class_infos end (** Class signatures *) diff --git a/parsing/docstrings.ml b/parsing/docstrings.ml new file mode 100644 index 0000000000..389f6cf75c --- /dev/null +++ b/parsing/docstrings.ml @@ -0,0 +1,344 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Leo White *) +(* *) +(* Copyright 1996 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +open Location + +(* Docstrings *) + +(* A docstring is "attached" if it has been inserted in the AST. This + is used for generating unexpected docstring warnings. *) +type ds_attached = + | Unattached (* Not yet attached anything.*) + | Info (* Attached to a field or constructor. *) + | Docs (* Attached to an item or as floating text. *) + +(* A docstring is "associated" with an item if there are no blank lines between + them. This is used for generating docstring ambiguity warnings. *) +type ds_associated = + | Zero (* Not associated with an item *) + | One (* Associated with one item *) + | Many (* Associated with multiple items (ambiguity) *) + +type docstring = + { ds_body: string; + ds_loc: Location.t; + mutable ds_attached: ds_attached; + mutable ds_associated: ds_associated; } + +(* List of docstrings *) + +let docstrings : docstring list ref = ref [] + +(* Warn for unused and ambiguous docstrings *) + +let warn_bad_docstrings () = + if Warnings.is_active (Warnings.Bad_docstring true) then begin + List.iter + (fun ds -> + match ds.ds_attached with + | Info -> () + | Unattached -> + prerr_warning ds.ds_loc (Warnings.Bad_docstring true) + | Docs -> + match ds.ds_associated with + | Zero | One -> () + | Many -> + prerr_warning ds.ds_loc (Warnings.Bad_docstring false)) + (List.rev !docstrings) +end + +(* Docstring constructors and descturctors *) + +let docstring body loc = + let ds = + { ds_body = body; + ds_loc = loc; + ds_attached = Unattached; + ds_associated = Zero; } + in + docstrings := ds :: !docstrings; + ds + +let docstring_body ds = ds.ds_body + +let docstring_loc ds = ds.ds_loc + +(* Docstrings attached to items *) + +type docs = + { docs_pre: docstring option; + docs_post: docstring option; } + +let empty_docs = { docs_pre = None; docs_post = None } + +let doc_loc = {txt = "ocaml.doc"; loc = Location.none} + +let docs_attr ds = + let open Asttypes in + let open Parsetree in + let exp = + { pexp_desc = Pexp_constant (Const_string(ds.ds_body, None)); + pexp_loc = ds.ds_loc; + pexp_attributes = []; } + in + let item = + { pstr_desc = Pstr_eval (exp, []); pstr_loc = exp.pexp_loc } + in + (doc_loc, PStr [item]) + +let add_docs_attrs docs attrs = + let attrs = + match docs.docs_pre with + | None -> attrs + | Some ds -> docs_attr ds :: attrs + in + let attrs = + match docs.docs_post with + | None -> attrs + | Some ds -> attrs @ [docs_attr ds] + in + attrs + +(* Docstrings attached to consturctors or fields *) + +type info = docstring option + +let empty_info = None + +let info_attr = docs_attr + +let add_info_attrs info attrs = + let attrs = + match info with + | None -> attrs + | Some ds -> attrs @ [info_attr ds] + in + attrs + +(* Docstrings not attached to a specifc item *) + +type text = docstring list + +let empty_text = [] + +let text_loc = {txt = "ocaml.text"; loc = Location.none} + +let text_attr ds = + let open Asttypes in + let open Parsetree in + let exp = + { pexp_desc = Pexp_constant (Const_string(ds.ds_body, None)); + pexp_loc = ds.ds_loc; + pexp_attributes = []; } + in + let item = + { pstr_desc = Pstr_eval (exp, []); pstr_loc = exp.pexp_loc } + in + (text_loc, PStr [item]) + +let add_text_attrs dsl attrs = + (List.map text_attr dsl) @ attrs + +(* Find the first non-info docstring in a list, attach it and return it *) +let get_docstring ~info dsl = + let rec loop = function + | [] -> None + | {ds_attached = Info; _} :: rest -> loop rest + | ds :: rest -> + ds.ds_attached <- if info then Info else Docs; + Some ds + in + loop dsl + +(* Find all the non-info docstrings in a list, attach them and return them *) +let get_docstrings dsl = + let rec loop acc = function + | [] -> List.rev acc + | {ds_attached = Info; _} :: rest -> loop acc rest + | ds :: rest -> + ds.ds_attached <- Docs; + loop (ds :: acc) rest + in + loop [] dsl + +(* "Associate" all the docstrings in a list *) +let associate_docstrings dsl = + List.iter + (fun ds -> + match ds.ds_associated with + | Zero -> ds.ds_associated <- One + | (One | Many) -> ds.ds_associated <- Many) + dsl + +(* Map from positions to pre docstrings *) + +let pre_table : (Lexing.position, docstring list) Hashtbl.t = + Hashtbl.create 50 + +let set_pre_docstrings pos dsl = + if dsl <> [] then Hashtbl.add pre_table pos dsl + +let get_pre_docs pos = + try + let dsl = Hashtbl.find pre_table pos in + associate_docstrings dsl; + get_docstring ~info:false dsl + with Not_found -> None + +let mark_pre_docs pos = + try + let dsl = Hashtbl.find pre_table pos in + associate_docstrings dsl + with Not_found -> () + +(* Map from positions to post docstrings *) + +let post_table : (Lexing.position, docstring list) Hashtbl.t = + Hashtbl.create 50 + +let set_post_docstrings pos dsl = + if dsl <> [] then Hashtbl.add post_table pos dsl + +let get_post_docs pos = + try + let dsl = Hashtbl.find post_table pos in + associate_docstrings dsl; + get_docstring ~info:false dsl + with Not_found -> None + +let mark_post_docs pos = + try + let dsl = Hashtbl.find post_table pos in + associate_docstrings dsl + with Not_found -> () + +let get_info pos = + try + let dsl = Hashtbl.find post_table pos in + get_docstring ~info:true dsl + with Not_found -> None + +(* Map from positions to floating docstrings *) + +let floating_table : (Lexing.position, docstring list) Hashtbl.t = + Hashtbl.create 50 + +let set_floating_docstrings pos dsl = + if dsl <> [] then Hashtbl.add floating_table pos dsl + +let get_text pos = + try + let dsl = Hashtbl.find floating_table pos in + get_docstrings dsl + with Not_found -> [] + +(* Maps from positions to extra docstrings *) + +let pre_extra_table : (Lexing.position, docstring list) Hashtbl.t = + Hashtbl.create 50 + +let set_pre_extra_docstrings pos dsl = + if dsl <> [] then Hashtbl.add pre_extra_table pos dsl + +let get_pre_extra_text pos = + try + let dsl = Hashtbl.find pre_extra_table pos in + get_docstrings dsl + with Not_found -> [] + +let post_extra_table : (Lexing.position, docstring list) Hashtbl.t = + Hashtbl.create 50 + +let set_post_extra_docstrings pos dsl = + if dsl <> [] then Hashtbl.add post_extra_table pos dsl + +let get_post_extra_text pos = + try + let dsl = Hashtbl.find post_extra_table pos in + get_docstrings dsl + with Not_found -> [] + +(* Docstrings from parser actions *) + +let symbol_docs () = + { docs_pre = get_pre_docs (Parsing.symbol_start_pos ()); + docs_post = get_post_docs (Parsing.symbol_end_pos ()); } + +let symbol_docs_lazy () = + let p1 = Parsing.symbol_start_pos () in + let p2 = Parsing.symbol_end_pos () in + lazy { docs_pre = get_pre_docs p1; + docs_post = get_post_docs p2; } + +let rhs_docs pos1 pos2 = + { docs_pre = get_pre_docs (Parsing.rhs_start_pos pos1); + docs_post = get_post_docs (Parsing.rhs_end_pos pos2); } + +let rhs_docs_lazy pos1 pos2 = + let p1 = Parsing.rhs_start_pos pos1 in + let p2 = Parsing.rhs_end_pos pos2 in + lazy { docs_pre = get_pre_docs p1; + docs_post = get_post_docs p2; } + +let mark_symbol_docs () = + mark_pre_docs (Parsing.symbol_start_pos ()); + mark_post_docs (Parsing.symbol_end_pos ()) + +let mark_rhs_docs pos1 pos2 = + mark_pre_docs (Parsing.rhs_start_pos pos1); + mark_post_docs (Parsing.rhs_end_pos pos2) + +let symbol_info () = + get_info (Parsing.symbol_end_pos ()) + +let rhs_info pos = + get_info (Parsing.rhs_end_pos pos) + +let symbol_text () = + get_text (Parsing.symbol_start_pos ()) + +let symbol_text_lazy () = + let pos = Parsing.symbol_start_pos () in + lazy (get_text pos) + +let rhs_text pos = + get_text (Parsing.rhs_start_pos pos) + +let rhs_text_lazy pos = + let pos = Parsing.rhs_start_pos pos in + lazy (get_text pos) + +let symbol_pre_extra_text () = + get_pre_extra_text (Parsing.symbol_start_pos ()) + +let symbol_post_extra_text () = + get_post_extra_text (Parsing.symbol_end_pos ()) + +let rhs_pre_extra_text pos = + get_pre_extra_text (Parsing.rhs_start_pos pos) + +let rhs_post_extra_text pos = + get_post_extra_text (Parsing.rhs_end_pos pos) + + +(* (Re)Initialise all comment state *) + +let init () = + docstrings := []; + Hashtbl.reset pre_table; + Hashtbl.reset post_table; + Hashtbl.reset floating_table; + Hashtbl.reset pre_extra_table; + Hashtbl.reset post_extra_table + + + diff --git a/parsing/docstrings.mli b/parsing/docstrings.mli new file mode 100644 index 0000000000..e873785012 --- /dev/null +++ b/parsing/docstrings.mli @@ -0,0 +1,148 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Leo White *) +(* *) +(* Copyright 1996 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(** (Re)Initialise all docstring state *) +val init : unit -> unit + +(** Emit warnings for unattached and ambiguous docstrings *) +val warn_bad_docstrings : unit -> unit + +(** {3 Docstrings} *) + +(** Documentation comments *) +type docstring + +(** Create a docstring *) +val docstring : string -> Location.t -> docstring + +(** Get the text of a docstring *) +val docstring_body : docstring -> string + +(** Get the location of a docstring *) +val docstring_loc : docstring -> Location.t + +(** {3 Set functions} + + These functions are used by the lexer to associate docstrings to + the locations of tokens. *) + +(** Docstrings immediately preceding a token *) +val set_pre_docstrings : Lexing.position -> docstring list -> unit + +(** Docstrings immediately following a token *) +val set_post_docstrings : Lexing.position -> docstring list -> unit + +(** Docstrings not immediately adjacent to a token *) +val set_floating_docstrings : Lexing.position -> docstring list -> unit + +(** Docstrings immediately following the token which precedes this one *) +val set_pre_extra_docstrings : Lexing.position -> docstring list -> unit + +(** Docstrings immediately preceding the token which follows this one *) +val set_post_extra_docstrings : Lexing.position -> docstring list -> unit + +(** {3 Items} + + The {!docs} type represents documentation attached to an item. *) + +type docs = + { docs_pre: docstring option; + docs_post: docstring option; } + +val empty_docs : docs + +val docs_attr : docstring -> Parsetree.attribute + +(** Convert item documentation to attributes and add them to an + attribute list *) +val add_docs_attrs : docs -> Parsetree.attributes -> Parsetree.attributes + +(** Fetch the item documentation for the current symbol. This also + marks this documentation (for ambiguity warnings). *) +val symbol_docs : unit -> docs +val symbol_docs_lazy : unit -> docs Lazy.t + +(** Fetch the item documentation for the symbols between two + positions. This also marks this documentation (for ambiguity + warnings). *) +val rhs_docs : int -> int -> docs +val rhs_docs_lazy : int -> int -> docs Lazy.t + +(** Mark the item documentation for the current symbol (for ambiguity + warnings). *) +val mark_symbol_docs : unit -> unit + +(** Mark as associated the item documentation for the symbols between + two positions (for ambiguity warnings) *) +val mark_rhs_docs : int -> int -> unit + +(** {3 Fields and constructors} + + The {!info} type represents documentation attached to a field or + constructor. *) + +type info = docstring option + +val empty_info : info + +val info_attr : docstring -> Parsetree.attribute + +(** Convert field info to attributes and add them to an + attribute list *) +val add_info_attrs : info -> Parsetree.attributes -> Parsetree.attributes + +(** Fetch the field info for the current symbol. *) +val symbol_info : unit -> info + +(** Fetch the field info following the symbol at a given position. *) +val rhs_info : int -> info + +(** {3 Unattached comments} + + The {!text} type represents documentation which is not attached to + anything. *) + +type text = docstring list + +val empty_text : text + +val text_attr : docstring -> Parsetree.attribute + +(** Convert text to attributes and add them to an attribute list *) +val add_text_attrs : text -> Parsetree.attributes -> Parsetree.attributes + +(** Fetch the text preceding the current symbol. *) +val symbol_text : unit -> text +val symbol_text_lazy : unit -> text Lazy.t + +(** Fetch the text preceding the symbol at the given position. *) +val rhs_text : int -> text +val rhs_text_lazy : int -> text Lazy.t + +(** {3 Extra text} + + There may be additional text attached to the delimiters of a block + (e.g. [struct] and [end]). This is fetched by the following + functions, which are applied to the contents of the block rather + than the delimiters. *) + +(** Fetch additional text preceding the current symbol *) +val symbol_pre_extra_text : unit -> text + +(** Fetch additional text following the current symbol *) +val symbol_post_extra_text : unit -> text + +(** Fetch additional text preceding the symbol at the given position *) +val rhs_pre_extra_text : int -> text + +(** Fetch additional text following the symbol at the given position *) +val rhs_post_extra_text : int -> text diff --git a/parsing/lexer.mli b/parsing/lexer.mli index 9898e97198..4878a36ebc 100644 --- a/parsing/lexer.mli +++ b/parsing/lexer.mli @@ -49,10 +49,7 @@ by the parser, as [preprocessor lexer lexbuf] where [lexer] is the lexing function. When a preprocessor is configured by calling [set_preprocessor], the lexer -changes its behavior: -- It accepts backslash-newline as a token-separating blank. -- It emits an EOL token for every newline except those preceeded by backslash - and those in strings or comments. +changes its behavior to accept backslash-newline as a token-separating blank. *) val set_preprocessor : diff --git a/parsing/lexer.mll b/parsing/lexer.mll index dfa604d238..de9106c06a 100644 --- a/parsing/lexer.mll +++ b/parsing/lexer.mll @@ -133,6 +133,16 @@ let is_in_string = ref false let in_string () = !is_in_string let print_warnings = ref true +let with_comment_buffer comment lexbuf = + let start_loc = Location.curr lexbuf in + comment_start_loc := [start_loc]; + reset_string_buffer (); + let end_loc = comment lexbuf in + let s = get_stored_string () in + reset_string_buffer (); + let loc = { start_loc with Location.loc_end = end_loc.Location.loc_end } in + s, loc + (* To translate escape sequences *) let char_for_backslash = function @@ -219,6 +229,8 @@ let update_loc lexbuf file line absolute chars = let preprocessor = ref None +let escaped_newlines = ref false + (* Warn about Latin-1 characters used in idents *) let warn_latin1 lexbuf = @@ -226,6 +238,17 @@ let warn_latin1 lexbuf = (Warnings.Deprecated "ISO-Latin1 characters in identifiers") ;; +let comment_list = ref [] + +let add_comment com = + comment_list := com :: !comment_list + +let add_docstring_comment ds = + let com = (Docstrings.docstring_body ds, Docstrings.docstring_loc ds) in + add_comment com + +let comments () = List.rev !comment_list + (* Error report *) open Format @@ -288,19 +311,14 @@ let float_literal = rule token = parse | "\\" newline { - match !preprocessor with - | None -> + if not !escaped_newlines then raise (Error(Illegal_character (Lexing.lexeme_char lexbuf 0), - Location.curr lexbuf)) - | Some _ -> - update_loc lexbuf None 1 false 0; - token lexbuf } + Location.curr lexbuf)); + update_loc lexbuf None 1 false 0; + token lexbuf } | newline { update_loc lexbuf None 1 false 0; - match !preprocessor with - | None -> token lexbuf - | Some _ -> EOL - } + EOL } | blank + { token lexbuf } | "_" @@ -387,26 +405,27 @@ rule token = parse raise (Error(Illegal_escape esc, Location.curr lexbuf)) } | "(*" - { let start_loc = Location.curr lexbuf in - comment_start_loc := [start_loc]; - reset_string_buffer (); - let end_loc = comment lexbuf in - let s = get_stored_string () in - reset_string_buffer (); - COMMENT (s, { start_loc with - Location.loc_end = end_loc.Location.loc_end }) - } + { let s, loc = with_comment_buffer comment lexbuf in + COMMENT (s, loc) } + | "(**" + { let s, loc = with_comment_buffer comment lexbuf in + DOCSTRING (Docstrings.docstring s loc) } + | "(**" ('*'+) as stars + { let s, loc = + with_comment_buffer + (fun lexbuf -> + store_string ("*" ^ stars); + comment lexbuf) + lexbuf + in + COMMENT (s, loc) } | "(*)" - { let loc = Location.curr lexbuf in - if !print_warnings then - Location.prerr_warning loc Warnings.Comment_start; - comment_start_loc := [loc]; - reset_string_buffer (); - let end_loc = comment lexbuf in - let s = get_stored_string () in - reset_string_buffer (); - COMMENT (s, { loc with Location.loc_end = end_loc.Location.loc_end }) - } + { if !print_warnings then + Location.prerr_warning (Location.curr lexbuf) Warnings.Comment_start; + let s, loc = with_comment_buffer comment lexbuf in + COMMENT (s, loc) } + | "(*" ('*'*) as stars "*)" + { COMMENT (stars, Location.curr lexbuf) } | "*)" { let loc = Location.curr lexbuf in Location.prerr_warning loc Warnings.Comment_not_end; @@ -657,24 +676,94 @@ and skip_sharp_bang = parse | None -> token lexbuf | Some (_init, preprocess) -> preprocess token lexbuf - let last_comments = ref [] - let rec token lexbuf = - match token_with_comments lexbuf with - COMMENT (s, comment_loc) -> - last_comments := (s, comment_loc) :: !last_comments; - token lexbuf - | tok -> tok - let comments () = List.rev !last_comments + type newline_state = + | NoLine (* There have been no blank lines yet. *) + | NewLine + (* There have been no blank lines, and the previous + token was a newline. *) + | BlankLine (* There have been blank lines. *) + + type doc_state = + | Initial (* There have been no docstrings yet *) + | After of docstring list + (* There have been docstrings, none of which were + preceeded by a blank line *) + | Before of docstring list * docstring list * docstring list + (* There have been docstrings, some of which were + preceeded by a blank line *) + + and docstring = Docstrings.docstring + + let token lexbuf = + let post_pos = lexeme_end_p lexbuf in + let attach lines docs pre_pos = + let open Docstrings in + match docs, lines with + | Initial, _ -> () + | After a, (NoLine | NewLine) -> + set_post_docstrings post_pos (List.rev a); + set_pre_docstrings pre_pos a; + | After a, BlankLine -> + set_post_docstrings post_pos (List.rev a); + set_pre_extra_docstrings pre_pos (List.rev a) + | Before(a, f, b), (NoLine | NewLine) -> + set_post_docstrings post_pos (List.rev a); + set_post_extra_docstrings post_pos (List.rev b); + set_floating_docstrings pre_pos (List.rev f); + set_pre_extra_docstrings pre_pos (List.rev a); + set_pre_docstrings pre_pos b + | Before(a, f, b), BlankLine -> + set_post_docstrings post_pos (List.rev a); + set_floating_docstrings pre_pos (List.rev_append f (List.rev b)); + set_pre_extra_docstrings pre_pos (List.rev a) + in + let rec loop lines docs lexbuf = + match token_with_comments lexbuf with + | COMMENT (s, loc) -> + add_comment (s, loc); + let lines' = + match lines with + | NoLine -> NoLine + | NewLine -> NoLine + | BlankLine -> BlankLine + in + loop lines' docs lexbuf + | EOL -> + let lines' = + match lines with + | NoLine -> NewLine + | NewLine -> BlankLine + | BlankLine -> BlankLine + in + loop lines' docs lexbuf + | DOCSTRING doc -> + add_docstring_comment doc; + let docs' = + match docs, lines with + | Initial, (NoLine | NewLine) -> After [doc] + | Initial, BlankLine -> Before([], [], [doc]) + | After a, (NoLine | NewLine) -> After (doc :: a) + | After a, BlankLine -> Before (a, [], [doc]) + | Before(a, f, b), (NoLine | NewLine) -> Before(a, f, doc :: b) + | Before(a, f, b), BlankLine -> Before(a, b @ f, [doc]) + in + loop NoLine docs' lexbuf + | tok -> + attach lines docs (lexeme_start_p lexbuf); + tok + in + loop NoLine Initial lexbuf let init () = is_in_string := false; - last_comments := []; comment_start_loc := []; + comment_list := []; match !preprocessor with | None -> () | Some (init, _preprocess) -> init () let set_preprocessor init preprocess = + escaped_newlines := true; preprocessor := Some (init, preprocess) } diff --git a/parsing/location.mli b/parsing/location.mli index ba98049ef4..07e3c0f616 100644 --- a/parsing/location.mli +++ b/parsing/location.mli @@ -29,11 +29,14 @@ type t = { val none : t (** An arbitrary value of type [t]; describes an empty ghost range. *) -val in_file : string -> t;; + +val in_file : string -> t (** Return an empty ghost range located in a given file. *) + val init : Lexing.lexbuf -> string -> unit (** Set the file name and line number of the [lexbuf] to be the start of the named file. *) + val curr : Lexing.lexbuf -> t (** Get the location of the current token from the [lexbuf]. *) diff --git a/parsing/parse.ml b/parsing/parse.ml index 2f4926ff88..0941bf803b 100644 --- a/parsing/parse.ml +++ b/parsing/parse.ml @@ -34,9 +34,11 @@ let maybe_skip_phrase lexbuf = let wrap parsing_fun lexbuf = try + Docstrings.init (); Lexer.init (); let ast = parsing_fun Lexer.token lexbuf in Parsing.clear_parser(); + Docstrings.warn_bad_docstrings (); ast with | Lexer.Error(Lexer.Illegal_character _, _) as err diff --git a/parsing/parser.mly b/parsing/parser.mly index aa001dc0b8..f7d5316450 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -18,6 +18,7 @@ open Asttypes open Longident open Parsetree open Ast_helper +open Docstrings let mktyp d = Typ.mk ~loc:(symbol_rloc()) d let mkpat d = Pat.mk ~loc:(symbol_rloc()) d @@ -28,8 +29,10 @@ let mkmod d = Mod.mk ~loc:(symbol_rloc()) d let mkstr d = Str.mk ~loc:(symbol_rloc()) d let mkclass d = Cl.mk ~loc:(symbol_rloc()) d let mkcty d = Cty.mk ~loc:(symbol_rloc()) d -let mkctf d = Ctf.mk ~loc:(symbol_rloc()) d -let mkcf d = Cf.mk ~loc:(symbol_rloc()) d +let mkctf ?attrs ?docs d = + Ctf.mk ~loc:(symbol_rloc()) ?attrs ?docs d +let mkcf ?attrs ?docs d = + Cf.mk ~loc:(symbol_rloc()) ?attrs ?docs d let mkrhs rhs pos = mkloc rhs (rhs_loc pos) let mkoption d = @@ -283,11 +286,23 @@ let wrap_exp_attrs body (ext, attrs) = let mkexp_attrs d attrs = wrap_exp_attrs (mkexp d) attrs -let mkcf_attrs d attrs = - Cf.mk ~loc:(symbol_rloc()) ~attrs d +let text_str pos = Str.text (rhs_text pos) +let text_sig pos = Sig.text (rhs_text pos) +let text_cstr pos = Cf.text (rhs_text pos) +let text_csig pos = Ctf.text (rhs_text pos) +let text_def pos = [Ptop_def (Str.text (rhs_text pos))] -let mkctf_attrs d attrs = - Ctf.mk ~loc:(symbol_rloc()) ~attrs d +let extra_text text pos items = + let pre_extras = rhs_pre_extra_text pos in + let post_extras = rhs_post_extra_text pos in + text pre_extras @ items @ text post_extras + +let extra_str pos items = extra_text Str.text pos items +let extra_sig pos items = extra_text Sig.text pos items +let extra_cstr pos items = extra_text Cf.text pos items +let extra_csig pos items = extra_text Ctf.text pos items +let extra_def pos items = + extra_text (fun txt -> [Ptop_def (Str.text txt)]) pos items let add_nonrec rf attrs pos = match rf with @@ -300,6 +315,8 @@ type let_binding = { lb_pattern: pattern; lb_expression: expression; lb_attributes: attributes; + lb_docs: docs Lazy.t; + lb_text: text Lazy.t; lb_loc: Location.t; } type let_bindings = @@ -313,6 +330,8 @@ let mklb (p, e) attrs = { lb_pattern = p; lb_expression = e; lb_attributes = attrs; + lb_docs = symbol_docs_lazy (); + lb_text = symbol_text_lazy (); lb_loc = symbol_rloc (); } let mklbs (ext, attrs) rf lb = @@ -336,6 +355,8 @@ let val_of_let_bindings lbs = List.map (fun lb -> Vb.mk ~loc:lb.lb_loc ~attrs:lb.lb_attributes + ~docs:(Lazy.force lb.lb_docs) + ~text:(Lazy.force lb.lb_text) lb.lb_pattern lb.lb_expression) bindings in @@ -497,6 +518,7 @@ let class_of_let_bindings lbs body = %token WHILE %token WITH %token <string * Location.t> COMMENT +%token <Docstrings.docstring> DOCSTRING %token EOL @@ -587,38 +609,52 @@ The precedences must be listed from low to high. /* Entry points */ implementation: - structure EOF { $1 } + structure EOF { extra_str 1 $1 } ; interface: - signature EOF { $1 } + signature EOF { extra_sig 1 $1 } ; toplevel_phrase: - top_structure SEMISEMI { Ptop_def $1 } + top_structure SEMISEMI { Ptop_def (extra_str 1 $1) } | toplevel_directive SEMISEMI { $1 } | EOF { raise End_of_file } ; top_structure: - seq_expr post_item_attributes { [mkstrexp $1 $2] } - | top_structure_tail { $1 } + seq_expr post_item_attributes + { (text_str 1) @ [mkstrexp $1 $2] } + | top_structure_tail + { $1 } ; top_structure_tail: /* empty */ { [] } - | structure_item top_structure_tail { $1 :: $2 } + | structure_item top_structure_tail { (text_str 1) @ $1 :: $2 } ; use_file: + use_file_body { extra_def 1 $1 } +; +use_file_body: use_file_tail { $1 } | seq_expr post_item_attributes use_file_tail - { Ptop_def[mkstrexp $1 $2] :: $3 } + { (text_def 1) @ Ptop_def[mkstrexp $1 $2] :: $3 } ; use_file_tail: - EOF { [] } - | SEMISEMI EOF { [] } + EOF + { [] } + | SEMISEMI EOF + { text_def 1 } | SEMISEMI seq_expr post_item_attributes use_file_tail - { Ptop_def[mkstrexp $2 $3] :: $4 } - | SEMISEMI structure_item use_file_tail { Ptop_def[$2] :: $3 } - | SEMISEMI toplevel_directive use_file_tail { $2 :: $3 } - | structure_item use_file_tail { Ptop_def[$1] :: $2 } - | toplevel_directive use_file_tail { $1 :: $2 } + { mark_rhs_docs 2 3; + (text_def 1) @ (text_def 2) @ Ptop_def[mkstrexp $2 $3] :: $4 } + | SEMISEMI structure_item use_file_tail + { (text_def 1) @ (text_def 2) @ Ptop_def[$2] :: $3 } + | SEMISEMI toplevel_directive use_file_tail + { mark_rhs_docs 2 3; + (text_def 1) @ (text_def 2) @ $2 :: $3 } + | structure_item use_file_tail + { (text_def 1) @ Ptop_def[$1] :: $2 } + | toplevel_directive use_file_tail + { mark_rhs_docs 1 1; + (text_def 1) @ $1 :: $2 } ; parse_core_type: core_type EOF { $1 } @@ -655,7 +691,7 @@ module_expr: mod_longident { mkmod(Pmod_ident (mkrhs $1 1)) } | STRUCT structure END - { mkmod(Pmod_structure($2)) } + { mkmod(Pmod_structure(extra_str 2 $2)) } | STRUCT structure error { unclosed "struct" 1 "end" 3 } | FUNCTOR functor_args MINUSGREATER module_expr @@ -700,13 +736,15 @@ module_expr: ; structure: - seq_expr post_item_attributes structure_tail { mkstrexp $1 $2 :: $3 } + seq_expr post_item_attributes structure_tail + { mark_rhs_docs 1 2; + (text_str 1) @ mkstrexp $1 $2 :: $3 } | structure_tail { $1 } ; structure_tail: /* empty */ { [] } - | SEMISEMI structure { $2 } - | structure_item structure_tail { $1 :: $2 } + | SEMISEMI structure { (text_str 1) @ $2 } + | structure_item structure_tail { (text_str 1) @ $1 :: $2 } ; structure_item: let_bindings @@ -733,9 +771,10 @@ structure_item: | str_include_statement { mkstr(Pstr_include $1) } | item_extension post_item_attributes - { mkstr(Pstr_extension ($1, $2)) } + { mkstr(Pstr_extension ($1, (add_docs_attrs (symbol_docs ()) $2))) } | floating_attribute - { mkstr(Pstr_attribute $1) } + { mark_symbol_docs (); + mkstr(Pstr_attribute $1) } ; str_include_statement: INCLUDE module_expr post_item_attributes @@ -751,7 +790,8 @@ module_binding_body: ; module_binding: MODULE UIDENT module_binding_body post_item_attributes - { Mb.mk (mkrhs $2 2) $3 ~attrs:$4 ~loc:(symbol_rloc ()) } + { Mb.mk (mkrhs $2 2) $3 ~attrs:$4 + ~loc:(symbol_rloc ()) ~docs:(symbol_docs ()) } ; rec_module_bindings: rec_module_binding { [$1] } @@ -759,11 +799,13 @@ rec_module_bindings: ; rec_module_binding: MODULE REC UIDENT module_binding_body post_item_attributes - { Mb.mk (mkrhs $3 3) $4 ~attrs:$5 ~loc:(symbol_rloc ()) } + { Mb.mk (mkrhs $3 3) $4 ~attrs:$5 + ~loc:(symbol_rloc ()) ~docs:(symbol_docs ()) } ; and_module_binding: AND UIDENT module_binding_body post_item_attributes - { Mb.mk (mkrhs $2 2) $3 ~attrs:$4 ~loc:(symbol_rloc ()) } + { Mb.mk (mkrhs $2 2) $3 ~attrs:$4 ~loc:(symbol_rloc ()) + ~text:(symbol_text ()) ~docs:(symbol_docs ()) } ; /* Module types */ @@ -772,7 +814,7 @@ module_type: mty_longident { mkmty(Pmty_ident (mkrhs $1 1)) } | SIG signature END - { mkmty(Pmty_signature $2) } + { mkmty(Pmty_signature (extra_sig 2 $2)) } | SIG signature error { unclosed "sig" 1 "end" 3 } | FUNCTOR functor_args MINUSGREATER module_type @@ -796,8 +838,8 @@ module_type: ; signature: /* empty */ { [] } - | SEMISEMI signature { $2 } - | signature_item signature { $1 :: $2 } + | SEMISEMI signature { (text_sig 1) @ $2 } + | signature_item signature { (text_sig 1) @ $1 :: $2 } ; signature_item: value_description @@ -827,17 +869,20 @@ signature_item: | class_type_declarations { mksig(Psig_class_type (List.rev $1)) } | item_extension post_item_attributes - { mksig(Psig_extension ($1, $2)) } + { mksig(Psig_extension ($1, (add_docs_attrs (symbol_docs ()) $2))) } | floating_attribute - { mksig(Psig_attribute $1) } + { mark_symbol_docs (); + mksig(Psig_attribute $1) } ; open_statement: | OPEN override_flag mod_longident post_item_attributes - { Opn.mk (mkrhs $3 3) ~override:$2 ~attrs:$4 ~loc:(symbol_rloc()) } + { Opn.mk (mkrhs $3 3) ~override:$2 ~attrs:$4 + ~loc:(symbol_rloc()) ~docs:(symbol_docs ()) } ; sig_include_statement: INCLUDE module_type post_item_attributes %prec below_WITH - { Incl.mk $2 ~attrs:$3 ~loc:(symbol_rloc()) } + { Incl.mk $2 ~attrs:$3 + ~loc:(symbol_rloc()) ~docs:(symbol_docs ()) } ; module_declaration_body: COLON module_type @@ -849,13 +894,14 @@ module_declaration_body: ; module_declaration: MODULE UIDENT module_declaration_body post_item_attributes - { Md.mk (mkrhs $2 2) $3 ~attrs:$4 ~loc:(symbol_rloc()) } + { Md.mk (mkrhs $2 2) $3 ~attrs:$4 + ~loc:(symbol_rloc()) ~docs:(symbol_docs ()) } ; module_alias: MODULE UIDENT EQUAL mod_longident post_item_attributes { Md.mk (mkrhs $2 2) - (Mty.alias ~loc:(rhs_loc 4) (mkrhs $4 4)) - ~attrs:$5 ~loc:(symbol_rloc()) } + (Mty.alias ~loc:(rhs_loc 4) (mkrhs $4 4)) ~attrs:$5 + ~loc:(symbol_rloc()) ~docs:(symbol_docs ()) } ; rec_module_declarations: rec_module_declaration { [$1] } @@ -863,11 +909,13 @@ rec_module_declarations: ; rec_module_declaration: MODULE REC UIDENT COLON module_type post_item_attributes - { Md.mk (mkrhs $3 3) $5 ~attrs:$6 ~loc:(symbol_rloc()) } + { Md.mk (mkrhs $3 3) $5 ~attrs:$6 + ~loc:(symbol_rloc()) ~docs:(symbol_docs ()) } ; and_module_declaration: AND UIDENT COLON module_type post_item_attributes - { Md.mk (mkrhs $2 2) $4 ~attrs:$5 ~loc:(symbol_rloc()) } + { Md.mk (mkrhs $2 2) $4 ~attrs:$5 ~loc:(symbol_rloc()) + ~text:(symbol_text()) ~docs:(symbol_docs()) } ; module_type_declaration_body: /* empty */ { None } @@ -875,7 +923,8 @@ module_type_declaration_body: ; module_type_declaration: MODULE TYPE ident module_type_declaration_body post_item_attributes - { Mtd.mk (mkrhs $3 3) ?typ:$4 ~loc:(symbol_rloc()) ~attrs:$5 } + { Mtd.mk (mkrhs $3 3) ?typ:$4 ~attrs:$5 + ~loc:(symbol_rloc()) ~docs:(symbol_docs ()) } ; /* Class expressions */ @@ -886,14 +935,15 @@ class_declarations: class_declaration: CLASS virtual_flag class_type_parameters LIDENT class_fun_binding post_item_attributes - { Ci.mk (mkrhs $4 4) $5 ~virt:$2 ~params:$3 - ~attrs:$6 ~loc:(symbol_rloc ()) } + { Ci.mk (mkrhs $4 4) $5 ~virt:$2 ~params:$3 ~attrs:$6 + ~loc:(symbol_rloc ()) ~docs:(symbol_docs ()) } ; and_class_declaration: AND virtual_flag class_type_parameters LIDENT class_fun_binding post_item_attributes { Ci.mk (mkrhs $4 4) $5 ~virt:$2 ~params:$3 - ~attrs:$6 ~loc:(symbol_rloc ()) } + ~attrs:$6 ~loc:(symbol_rloc ()) + ~text:(symbol_text ()) ~docs:(symbol_docs ()) } ; class_fun_binding: EQUAL class_expr @@ -933,7 +983,7 @@ class_simple_expr: | class_longident { mkclass(Pcl_constr(mkrhs $1 1, [])) } | OBJECT class_structure END - { mkclass(Pcl_structure($2)) } + { mkclass(Pcl_structure $2) } | OBJECT class_structure error { unclosed "object" 1 "end" 3 } | LPAREN class_expr COLON class_type RPAREN @@ -946,8 +996,8 @@ class_simple_expr: { unclosed "(" 1 ")" 3 } ; class_structure: - class_self_pattern class_fields - { Cstr.mk $1 (List.rev $2) } + | class_self_pattern class_fields + { Cstr.mk $1 (extra_cstr 2 (List.rev $2)) } ; class_self_pattern: LPAREN pattern RPAREN @@ -961,23 +1011,24 @@ class_fields: /* empty */ { [] } | class_fields class_field - { $2 :: $1 } + { $2 :: (text_cstr 2) @ $1 } ; class_field: | INHERIT override_flag class_expr parent_binder post_item_attributes - { mkcf_attrs (Pcf_inherit ($2, $3, $4)) $5 } + { mkcf (Pcf_inherit ($2, $3, $4)) ~attrs:$5 ~docs:(symbol_docs ()) } | VAL value post_item_attributes - { mkcf_attrs (Pcf_val $2) $3 } + { mkcf (Pcf_val $2) ~attrs:$3 ~docs:(symbol_docs ()) } | METHOD method_ post_item_attributes - { mkcf_attrs (Pcf_method $2) $3 } + { mkcf (Pcf_method $2) ~attrs:$3 ~docs:(symbol_docs ()) } | CONSTRAINT constrain_field post_item_attributes - { mkcf_attrs (Pcf_constraint $2) $3 } + { mkcf (Pcf_constraint $2) ~attrs:$3 ~docs:(symbol_docs ()) } | INITIALIZER seq_expr post_item_attributes - { mkcf_attrs (Pcf_initializer $2) $3 } + { mkcf (Pcf_initializer $2) ~attrs:$3 ~docs:(symbol_docs ()) } | item_extension post_item_attributes - { mkcf_attrs (Pcf_extension $1) $2 } + { mkcf (Pcf_extension $1) ~attrs:$2 ~docs:(symbol_docs ()) } | floating_attribute - { mkcf (Pcf_attribute $1) } + { mark_symbol_docs (); + mkcf (Pcf_attribute $1) } ; parent_binder: AS LIDENT @@ -1052,7 +1103,7 @@ class_signature: ; class_sig_body: class_self_type class_sig_fields - { Csig.mk $1 (List.rev $2) } + { Csig.mk $1 (extra_csig 2 (List.rev $2)) } ; class_self_type: LPAREN core_type RPAREN @@ -1062,24 +1113,25 @@ class_self_type: ; class_sig_fields: /* empty */ { [] } -| class_sig_fields class_sig_field { $2 :: $1 } +| class_sig_fields class_sig_field { $2 :: (text_csig 2) @ $1 } ; class_sig_field: INHERIT class_signature post_item_attributes - { mkctf_attrs (Pctf_inherit $2) $3 } + { mkctf (Pctf_inherit $2) ~attrs:$3 ~docs:(symbol_docs ()) } | VAL value_type post_item_attributes - { mkctf_attrs (Pctf_val $2) $3 } + { mkctf (Pctf_val $2) ~attrs:$3 ~docs:(symbol_docs ()) } | METHOD private_virtual_flags label COLON poly_type post_item_attributes { let (p, v) = $2 in - mkctf_attrs (Pctf_method ($3, p, v, $5)) $6 + mkctf (Pctf_method ($3, p, v, $5)) ~attrs:$6 ~docs:(symbol_docs ()) } | CONSTRAINT constrain_field post_item_attributes - { mkctf_attrs (Pctf_constraint $2) $3 } + { mkctf (Pctf_constraint $2) ~attrs:$3 ~docs:(symbol_docs ()) } | item_extension post_item_attributes - { mkctf_attrs (Pctf_extension $1) $2 } + { mkctf (Pctf_extension $1) ~attrs:$2 ~docs:(symbol_docs ()) } | floating_attribute - { mkctf(Pctf_attribute $1) } + { mark_symbol_docs (); + mkctf(Pctf_attribute $1) } ; value_type: VIRTUAL mutable_flag label COLON core_type @@ -1102,14 +1154,15 @@ class_descriptions: class_description: CLASS virtual_flag class_type_parameters LIDENT COLON class_type post_item_attributes - { Ci.mk (mkrhs $4 4) $6 ~virt:$2 ~params:$3 - ~attrs:$7 ~loc:(symbol_rloc ()) } + { Ci.mk (mkrhs $4 4) $6 ~virt:$2 ~params:$3 ~attrs:$7 + ~loc:(symbol_rloc ()) ~docs:(symbol_docs ()) } ; and_class_description: AND virtual_flag class_type_parameters LIDENT COLON class_type post_item_attributes { Ci.mk (mkrhs $4 4) $6 ~virt:$2 ~params:$3 - ~attrs:$7 ~loc:(symbol_rloc ()) } + ~attrs:$7 ~loc:(symbol_rloc ()) + ~text:(symbol_text ()) ~docs:(symbol_docs ()) } ; class_type_declarations: class_type_declaration { [$1] } @@ -1118,14 +1171,15 @@ class_type_declarations: class_type_declaration: CLASS TYPE virtual_flag class_type_parameters LIDENT EQUAL class_signature post_item_attributes - { Ci.mk (mkrhs $5 5) $7 ~virt:$3 ~params:$4 - ~attrs:$8 ~loc:(symbol_rloc ()) } + { Ci.mk (mkrhs $5 5) $7 ~virt:$3 ~params:$4 ~attrs:$8 + ~loc:(symbol_rloc ()) ~docs:(symbol_docs ()) } ; and_class_type_declaration: AND virtual_flag class_type_parameters LIDENT EQUAL class_signature post_item_attributes { Ci.mk (mkrhs $4 4) $6 ~virt:$2 ~params:$3 - ~attrs:$7 ~loc:(symbol_rloc ()) } + ~attrs:$7 ~loc:(symbol_rloc ()) + ~text:(symbol_text ()) ~docs:(symbol_docs ()) } ; /* Core expressions */ @@ -1635,7 +1689,8 @@ lbl_pattern: value_description: VAL val_ident COLON core_type post_item_attributes - { Val.mk (mkrhs $2 2) $4 ~attrs:$5 ~loc:(symbol_rloc()) } + { Val.mk (mkrhs $2 2) $4 ~attrs:$5 + ~loc:(symbol_rloc()) ~docs:(symbol_docs ()) } ; /* Primitive declarations */ @@ -1647,7 +1702,8 @@ primitive_declaration_body: primitive_declaration: EXTERNAL val_ident COLON core_type EQUAL primitive_declaration_body post_item_attributes - { Val.mk (mkrhs $2 2) $4 ~prim:$6 ~attrs:$7 ~loc:(symbol_rloc ()) } + { Val.mk (mkrhs $2 2) $4 ~prim:$6 ~attrs:$7 + ~loc:(symbol_rloc ()) ~docs:(symbol_docs ()) } ; /* Type declarations */ @@ -1662,14 +1718,16 @@ type_declaration: post_item_attributes { let (kind, priv, manifest) = $5 in Type.mk (mkrhs $4 4) ~params:$3 ~cstrs:(List.rev $6) ~kind - ~priv ?manifest ~attrs:(add_nonrec $2 $7 2) ~loc:(symbol_rloc ()) } + ~priv ?manifest ~attrs:(add_nonrec $2 $7 2) + ~loc:(symbol_rloc ()) ~docs:(symbol_docs ()) } ; and_type_declaration: AND optional_type_parameters LIDENT type_kind constraints post_item_attributes { let (kind, priv, manifest) = $4 in Type.mk (mkrhs $3 3) ~params:$2 ~cstrs:(List.rev $5) - ~kind ~priv ?manifest ~attrs:$6 ~loc:(symbol_rloc ()) } + ~kind ~priv ?manifest ~attrs:$6 ~loc:(symbol_rloc ()) + ~text:(symbol_text ()) ~docs:(symbol_docs ()) } ; constraints: constraints CONSTRAINT constrain { $3 :: $1 } @@ -1744,29 +1802,31 @@ constructor_declaration: | constr_ident generalized_constructor_arguments attributes { let args,res = $2 in - Type.constructor (mkrhs $1 1) ~args ?res ~loc:(symbol_rloc()) ~attrs:$3 + Type.constructor (mkrhs $1 1) ~args ?res ~attrs:$3 + ~loc:(symbol_rloc()) ~info:(symbol_info ()) } ; bar_constructor_declaration: | BAR constr_ident generalized_constructor_arguments attributes { let args,res = $3 in - Type.constructor (mkrhs $2 2) ~args ?res ~loc:(symbol_rloc()) ~attrs:$4 + Type.constructor (mkrhs $2 2) ~args ?res ~attrs:$4 + ~loc:(symbol_rloc()) ~info:(symbol_info ()) } ; str_exception_declaration: | sig_exception_declaration { $1 } | EXCEPTION constr_ident EQUAL constr_longident attributes post_item_attributes - { Te.rebind (mkrhs $2 2) (mkrhs $4 4) - ~loc:(symbol_rloc()) ~attrs:($5 @ $6) } + { Te.rebind (mkrhs $2 2) (mkrhs $4 4) ~attrs:($5 @ $6) + ~loc:(symbol_rloc()) ~docs:(symbol_docs ()) } ; sig_exception_declaration: | EXCEPTION constr_ident generalized_constructor_arguments attributes post_item_attributes { let args, res = $3 in - Te.decl (mkrhs $2 2) ~args ?res - ~loc:(symbol_rloc()) ~attrs:($4 @ $5) } + Te.decl (mkrhs $2 2) ~args ?res ~attrs:($4 @ $5) + ~loc:(symbol_rloc()) ~docs:(symbol_docs ()) } ; generalized_constructor_arguments: /*empty*/ { ([],None) } @@ -1787,13 +1847,15 @@ label_declarations: label_declaration: mutable_flag label COLON poly_type_no_attr attributes { - Type.field (mkrhs $2 2) $4 ~mut:$1 ~attrs:$5 ~loc:(symbol_rloc()) + Type.field (mkrhs $2 2) $4 ~mut:$1 ~attrs:$5 + ~loc:(symbol_rloc()) ~info:(symbol_info ()) } ; label_declaration_semi: - mutable_flag label COLON poly_type_no_attr attributes SEMI + mutable_flag label COLON poly_type_no_attr attributes SEMI attributes { - Type.field (mkrhs $2 2) $4 ~mut:$1 ~attrs:$5 ~loc:(symbol_rloc()) + Type.field (mkrhs $2 2) $4 ~mut:$1 ~attrs:($5 @ $7) + ~loc:(symbol_rloc()) ~info:(symbol_info ()) } ; @@ -1803,13 +1865,15 @@ str_type_extension: TYPE nonrec_flag optional_type_parameters type_longident PLUSEQ private_flag str_extension_constructors post_item_attributes { if $2 <> Recursive then not_expecting 2 "nonrec flag"; - Te.mk (mkrhs $4 4) (List.rev $7) ~params:$3 ~priv:$6 ~attrs:$8 } + Te.mk (mkrhs $4 4) (List.rev $7) ~params:$3 ~priv:$6 + ~attrs:$8 ~docs:(symbol_docs ()) } ; sig_type_extension: TYPE nonrec_flag optional_type_parameters type_longident PLUSEQ private_flag sig_extension_constructors post_item_attributes { if $2 <> Recursive then not_expecting 2 "nonrec flag"; - Te.mk (mkrhs $4 4) (List.rev $7) ~params:$3 ~priv:$6 ~attrs:$8 } + Te.mk (mkrhs $4 4) (List.rev $7) ~params:$3 ~priv:$6 + ~attrs:$8 ~docs:(symbol_docs ()) } ; str_extension_constructors: extension_constructor_declaration { [$1] } @@ -1830,20 +1894,24 @@ sig_extension_constructors: extension_constructor_declaration: | constr_ident generalized_constructor_arguments attributes { let args, res = $2 in - Te.decl (mkrhs $1 1) ~args ?res ~loc:(symbol_rloc()) ~attrs:$3 } + Te.decl (mkrhs $1 1) ~args ?res ~attrs:$3 + ~loc:(symbol_rloc()) ~info:(symbol_info ()) } ; bar_extension_constructor_declaration: | BAR constr_ident generalized_constructor_arguments attributes { let args, res = $3 in - Te.decl (mkrhs $2 2) ~args ?res ~loc:(symbol_rloc()) ~attrs:$4 } + Te.decl (mkrhs $2 2) ~args ?res ~attrs:$4 + ~loc:(symbol_rloc()) ~info:(symbol_info ()) } ; extension_constructor_rebind: | constr_ident EQUAL constr_longident attributes - { Te.rebind (mkrhs $1 1) (mkrhs $3 3) ~loc:(symbol_rloc()) ~attrs:$4 } + { Te.rebind (mkrhs $1 1) (mkrhs $3 3) ~attrs:$4 + ~loc:(symbol_rloc()) ~info:(symbol_info ()) } ; bar_extension_constructor_rebind: | BAR constr_ident EQUAL constr_longident attributes - { Te.rebind (mkrhs $2 2) (mkrhs $4 4) ~loc:(symbol_rloc()) ~attrs:$5 } + { Te.rebind (mkrhs $2 2) (mkrhs $4 4) ~attrs:$5 + ~loc:(symbol_rloc()) ~info:(symbol_info ()) } ; /* "with" constraints (additional type equations over signature components) */ diff --git a/stdlib/camlinternalFormat.ml b/stdlib/camlinternalFormat.ml index 2c92c25b9d..183a07eef9 100644 --- a/stdlib/camlinternalFormat.ml +++ b/stdlib/camlinternalFormat.ml @@ -1807,7 +1807,7 @@ let fmt_ebb_of_string ?legacy_behavior str = let legacy_behavior = match legacy_behavior with | Some flag -> flag | None -> true - (** When this flag is enabled, the format parser tries to behave as + (* When this flag is enabled, the format parser tries to behave as the <4.02 implementations, in particular it ignores most benine nonsensical format. When the flag is disabled, it will reject any format that is not accepted by the specification. diff --git a/stdlib/format.mli b/stdlib/format.mli index 541ffbe390..05e153b2e8 100644 --- a/stdlib/format.mli +++ b/stdlib/format.mli @@ -74,7 +74,7 @@ (** {6 Boxes} *) -val open_box : int -> unit;; +val open_box : int -> unit (** [open_box d] opens a new pretty-printing box with offset [d]. This box is the general purpose pretty-printing box. @@ -86,41 +86,41 @@ val open_box : int -> unit;; When a new line is printed in the box, [d] is added to the current indentation. *) -val close_box : unit -> unit;; +val close_box : unit -> unit (** Closes the most recently opened pretty-printing box. *) (** {6 Formatting functions} *) -val print_string : string -> unit;; +val print_string : string -> unit (** [print_string str] prints [str] in the current box. *) -val print_as : int -> string -> unit;; +val print_as : int -> string -> unit (** [print_as len str] prints [str] in the current box. The pretty-printer formats [str] as if it were of length [len]. *) -val print_int : int -> unit;; +val print_int : int -> unit (** Prints an integer in the current box. *) -val print_float : float -> unit;; +val print_float : float -> unit (** Prints a floating point number in the current box. *) -val print_char : char -> unit;; +val print_char : char -> unit (** Prints a character in the current box. *) -val print_bool : bool -> unit;; +val print_bool : bool -> unit (** Prints a boolean in the current box. *) (** {6 Break hints} *) -val print_space : unit -> unit;; +val print_space : unit -> unit (** [print_space ()] is used to separate items (typically to print a space between two words). It indicates that the line may be split at this point. It either prints one space or splits the line. It is equivalent to [print_break 1 0]. *) -val print_cut : unit -> unit;; +val print_cut : unit -> unit (** [print_cut ()] is used to mark a good break position. It indicates that the line may be split at this point. It either prints nothing or splits the line. @@ -128,7 +128,7 @@ val print_cut : unit -> unit;; point, without printing spaces or adding indentation. It is equivalent to [print_break 0 0]. *) -val print_break : int -> int -> unit;; +val print_break : int -> int -> unit (** Inserts a break hint in a pretty-printing box. [print_break nspaces offset] indicates that the line may be split (a newline character is printed) at this point, @@ -138,25 +138,25 @@ val print_break : int -> int -> unit;; the current indentation. If the line is not split, [nspaces] spaces are printed. *) -val print_flush : unit -> unit;; +val print_flush : unit -> unit (** Flushes the pretty printer: all opened boxes are closed, and all pending text is displayed. *) -val print_newline : unit -> unit;; +val print_newline : unit -> unit (** Equivalent to [print_flush] followed by a new line. *) -val force_newline : unit -> unit;; +val force_newline : unit -> unit (** Forces a newline in the current box. Not the normal way of pretty-printing, you should prefer break hints. *) -val print_if_newline : unit -> unit;; +val print_if_newline : unit -> unit (** Executes the next formatting command if the preceding line has just been split. Otherwise, ignore the next formatting command. *) (** {6 Margin} *) -val set_margin : int -> unit;; +val set_margin : int -> unit (** [set_margin d] sets the value of the right margin to [d] (in characters): this value is used to detect line overflows that leads to split lines. @@ -164,12 +164,12 @@ val set_margin : int -> unit;; If [d] is too large, the right margin is set to the maximum admissible value (which is greater than [10^9]). *) -val get_margin : unit -> int;; +val get_margin : unit -> int (** Returns the position of the right margin. *) (** {6 Maximum indentation limit} *) -val set_max_indent : int -> unit;; +val set_max_indent : int -> unit (** [set_max_indent d] sets the value of the maximum indentation limit to [d] (in characters): once this limit is reached, boxes are rejected to the left, @@ -178,32 +178,32 @@ val set_max_indent : int -> unit;; If [d] is too large, the limit is set to the maximum admissible value (which is greater than [10^9]). *) -val get_max_indent : unit -> int;; +val get_max_indent : unit -> int (** Return the value of the maximum indentation limit (in characters). *) (** {6 Formatting depth: maximum number of boxes allowed before ellipsis} *) -val set_max_boxes : int -> unit;; +val set_max_boxes : int -> unit (** [set_max_boxes max] sets the maximum number of boxes simultaneously opened. Material inside boxes nested deeper is printed as an ellipsis (more precisely as the text returned by [get_ellipsis_text ()]). Nothing happens if [max] is smaller than 2. *) -val get_max_boxes : unit -> int;; +val get_max_boxes : unit -> int (** Returns the maximum number of boxes allowed before ellipsis. *) -val over_max_boxes : unit -> bool;; +val over_max_boxes : unit -> bool (** Tests if the maximum number of boxes allowed have already been opened. *) (** {6 Advanced formatting} *) -val open_hbox : unit -> unit;; +val open_hbox : unit -> unit (** [open_hbox ()] opens a new pretty-printing box. This box is 'horizontal': the line is not split in this box (new lines may still occur inside boxes nested deeper). *) -val open_vbox : int -> unit;; +val open_vbox : int -> unit (** [open_vbox d] opens a new pretty-printing box with offset [d]. This box is 'vertical': every break hint inside this @@ -211,7 +211,7 @@ val open_vbox : int -> unit;; When a new line is printed in the box, [d] is added to the current indentation. *) -val open_hvbox : int -> unit;; +val open_hvbox : int -> unit (** [open_hvbox d] opens a new pretty-printing box with offset [d]. This box is 'horizontal-vertical': it behaves as an @@ -220,7 +220,7 @@ val open_hvbox : int -> unit;; When a new line is printed in the box, [d] is added to the current indentation. *) -val open_hovbox : int -> unit;; +val open_hovbox : int -> unit (** [open_hovbox d] opens a new pretty-printing box with offset [d]. This box is 'horizontal or vertical': break hints @@ -231,13 +231,13 @@ val open_hovbox : int -> unit;; (** {6 Tabulations} *) -val open_tbox : unit -> unit;; +val open_tbox : unit -> unit (** Opens a tabulation box. *) -val close_tbox : unit -> unit;; +val close_tbox : unit -> unit (** Closes the most recently opened tabulation box. *) -val print_tbreak : int -> int -> unit;; +val print_tbreak : int -> int -> unit (** Break hint in a tabulation box. [print_tbreak spaces offset] moves the insertion point to the next tabulation ([spaces] being added to this position). @@ -249,24 +249,24 @@ val print_tbreak : int -> int -> unit;; If a new line is printed, [offset] is added to the current indentation. *) -val set_tab : unit -> unit;; +val set_tab : unit -> unit (** Sets a tabulation mark at the current insertion point. *) -val print_tab : unit -> unit;; +val print_tab : unit -> unit (** [print_tab ()] is equivalent to [print_tbreak 0 0]. *) (** {6 Ellipsis} *) -val set_ellipsis_text : string -> unit;; +val set_ellipsis_text : string -> unit (** Set the text of the ellipsis printed when too many boxes are opened (a single dot, [.], by default). *) -val get_ellipsis_text : unit -> string;; +val get_ellipsis_text : unit -> string (** Return the text of the ellipsis. *) (** {6:tags Semantics Tags} *) -type tag = string;; +type tag = string (** {i Semantics tags} (or simply {e tags}) are used to decorate printed entities for user's defined purposes, e.g. setting font and giving size @@ -315,38 +315,42 @@ type tag = string;; Tag marking and tag printing functions are user definable and can be set by calling [set_formatter_tag_functions]. *) -val open_tag : tag -> unit;; +val open_tag : tag -> unit (** [open_tag t] opens the tag named [t]; the [print_open_tag] function of the formatter is called with [t] as argument; the tag marker [mark_open_tag t] will be flushed into the output device of the formatter. *) -val close_tag : unit -> unit;; +val close_tag : unit -> unit (** [close_tag ()] closes the most recently opened tag [t]. In addition, the [print_close_tag] function of the formatter is called with [t] as argument. The marker [mark_close_tag t] will be flushed into the output device of the formatter. *) -val set_tags : bool -> unit;; +val set_tags : bool -> unit (** [set_tags b] turns on or off the treatment of tags (default is off). *) -val set_print_tags : bool -> unit;; -val set_mark_tags : bool -> unit;; -(** [set_print_tags b] turns on or off the printing of tags, while - [set_mark_tags b] turns on or off the output of tag markers. *) -val get_print_tags : unit -> bool;; -val get_mark_tags : unit -> bool;; -(** Return the current status of tags printing and tags marking. *) + +val set_print_tags : bool -> unit +(**[set_print_tags b] turns on or off the printing of tags. *) + +val set_mark_tags : bool -> unit +(** [set_mark_tags b] turns on or off the output of tag markers. *) + +val get_print_tags : unit -> bool +(** Return the current status of tags printing. *) + +val get_mark_tags : unit -> bool +(** Return the current status of tags marking. *) (** {6 Redirecting the standard formatter output} *) -val set_formatter_out_channel : Pervasives.out_channel -> unit;; +val set_formatter_out_channel : Pervasives.out_channel -> unit (** Redirect the pretty-printer output to the given channel. (All the output functions of the standard formatter are set to the default output functions printing to the given channel.) *) val set_formatter_output_functions : (string -> int -> int -> unit) -> (unit -> unit) -> unit -;; (** [set_formatter_output_functions out flush] redirects the pretty-printer output functions to the functions [out] and [flush]. @@ -362,7 +366,6 @@ val set_formatter_output_functions : val get_formatter_output_functions : unit -> (string -> int -> int -> unit) * (unit -> unit) -;; (** Return the current output functions of the pretty-printer. *) (** {6:meaning Changing the meaning of standard formatter pretty printing} *) @@ -378,9 +381,9 @@ type formatter_out_functions = { out_newline : unit -> unit; out_spaces : int -> unit; } -;; -val set_formatter_out_functions : formatter_out_functions -> unit;; + +val set_formatter_out_functions : formatter_out_functions -> unit (** [set_formatter_out_functions f] Redirect the pretty-printer output to the functions [f.out_string] and [f.out_flush] as described in @@ -397,7 +400,7 @@ val set_formatter_out_functions : formatter_out_functions -> unit;; default values for [f.out_space] and [f.out_newline] are [f.out_string (String.make n ' ') 0 n] and [f.out_string "\n" 0 1]. *) -val get_formatter_out_functions : unit -> formatter_out_functions;; +val get_formatter_out_functions : unit -> formatter_out_functions (** Return the current output functions of the pretty-printer, including line breaking and indentation functions. Useful to record the current setting and restore it afterwards. *) @@ -410,7 +413,6 @@ type formatter_tag_functions = { print_open_tag : tag -> unit; print_close_tag : tag -> unit; } -;; (** The tag handling functions specific to a formatter: [mark] versions are the 'tag marking' functions that associate a string marker to a tag in order for the pretty-printing engine to flush @@ -418,7 +420,7 @@ type formatter_tag_functions = { [print] versions are the 'tag printing' functions that can perform regular printing when a tag is closed or opened. *) -val set_formatter_tag_functions : formatter_tag_functions -> unit;; +val set_formatter_tag_functions : formatter_tag_functions -> unit (** [set_formatter_tag_functions tag_funs] changes the meaning of opening and closing tags to use the functions in [tag_funs]. @@ -434,12 +436,12 @@ val set_formatter_tag_functions : formatter_tag_functions -> unit;; called at tag opening and tag closing time, to output regular material in the pretty-printer queue. *) -val get_formatter_tag_functions : unit -> formatter_tag_functions;; +val get_formatter_tag_functions : unit -> formatter_tag_functions (** Return the current tag functions of the pretty-printer. *) (** {6 Multiple formatted output} *) -type formatter;; +type formatter (** Abstract data corresponding to a pretty-printer (also called a formatter) and all its machinery. @@ -457,40 +459,39 @@ type formatter;; (convenient to output material to strings for instance). *) -val formatter_of_out_channel : out_channel -> formatter;; +val formatter_of_out_channel : out_channel -> formatter (** [formatter_of_out_channel oc] returns a new formatter that writes to the corresponding channel [oc]. *) -val std_formatter : formatter;; +val std_formatter : formatter (** The standard formatter used by the formatting functions above. It is defined as [formatter_of_out_channel stdout]. *) -val err_formatter : formatter;; +val err_formatter : formatter (** A formatter to use with formatting functions below for output to standard error. It is defined as [formatter_of_out_channel stderr]. *) -val formatter_of_buffer : Buffer.t -> formatter;; +val formatter_of_buffer : Buffer.t -> formatter (** [formatter_of_buffer b] returns a new formatter writing to buffer [b]. As usual, the formatter has to be flushed at the end of pretty printing, using [pp_print_flush] or [pp_print_newline], to display all the pending material. *) -val stdbuf : Buffer.t;; +val stdbuf : Buffer.t (** The string buffer in which [str_formatter] writes. *) -val str_formatter : formatter;; +val str_formatter : formatter (** A formatter to use with formatting functions below for output to the [stdbuf] string buffer. [str_formatter] is defined as [formatter_of_buffer stdbuf]. *) -val flush_str_formatter : unit -> string;; +val flush_str_formatter : unit -> string (** Returns the material printed with [str_formatter], flushes the formatter and resets the corresponding buffer. *) val make_formatter : (string -> int -> int -> unit) -> (unit -> unit) -> formatter -;; (** [make_formatter out flush] returns a new formatter that writes according to the output function [out], and the flushing function [flush]. For instance, a formatter to the [Pervasives.out_channel] [oc] is returned by @@ -498,67 +499,66 @@ val make_formatter : (** {6 Basic functions to use with formatters} *) -val pp_open_hbox : formatter -> unit -> unit;; -val pp_open_vbox : formatter -> int -> unit;; -val pp_open_hvbox : formatter -> int -> unit;; -val pp_open_hovbox : formatter -> int -> unit;; -val pp_open_box : formatter -> int -> unit;; -val pp_close_box : formatter -> unit -> unit;; -val pp_open_tag : formatter -> string -> unit;; -val pp_close_tag : formatter -> unit -> unit;; -val pp_print_string : formatter -> string -> unit;; -val pp_print_as : formatter -> int -> string -> unit;; -val pp_print_int : formatter -> int -> unit;; -val pp_print_float : formatter -> float -> unit;; -val pp_print_char : formatter -> char -> unit;; -val pp_print_bool : formatter -> bool -> unit;; -val pp_print_break : formatter -> int -> int -> unit;; -val pp_print_cut : formatter -> unit -> unit;; -val pp_print_space : formatter -> unit -> unit;; -val pp_force_newline : formatter -> unit -> unit;; -val pp_print_flush : formatter -> unit -> unit;; -val pp_print_newline : formatter -> unit -> unit;; -val pp_print_if_newline : formatter -> unit -> unit;; -val pp_open_tbox : formatter -> unit -> unit;; -val pp_close_tbox : formatter -> unit -> unit;; -val pp_print_tbreak : formatter -> int -> int -> unit;; -val pp_set_tab : formatter -> unit -> unit;; -val pp_print_tab : formatter -> unit -> unit;; -val pp_set_tags : formatter -> bool -> unit;; -val pp_set_print_tags : formatter -> bool -> unit;; -val pp_set_mark_tags : formatter -> bool -> unit;; -val pp_get_print_tags : formatter -> unit -> bool;; -val pp_get_mark_tags : formatter -> unit -> bool;; -val pp_set_margin : formatter -> int -> unit;; -val pp_get_margin : formatter -> unit -> int;; -val pp_set_max_indent : formatter -> int -> unit;; -val pp_get_max_indent : formatter -> unit -> int;; -val pp_set_max_boxes : formatter -> int -> unit;; -val pp_get_max_boxes : formatter -> unit -> int;; -val pp_over_max_boxes : formatter -> unit -> bool;; -val pp_set_ellipsis_text : formatter -> string -> unit;; -val pp_get_ellipsis_text : formatter -> unit -> string;; +val pp_open_hbox : formatter -> unit -> unit +val pp_open_vbox : formatter -> int -> unit +val pp_open_hvbox : formatter -> int -> unit +val pp_open_hovbox : formatter -> int -> unit +val pp_open_box : formatter -> int -> unit +val pp_close_box : formatter -> unit -> unit +val pp_open_tag : formatter -> string -> unit +val pp_close_tag : formatter -> unit -> unit +val pp_print_string : formatter -> string -> unit +val pp_print_as : formatter -> int -> string -> unit +val pp_print_int : formatter -> int -> unit +val pp_print_float : formatter -> float -> unit +val pp_print_char : formatter -> char -> unit +val pp_print_bool : formatter -> bool -> unit +val pp_print_break : formatter -> int -> int -> unit +val pp_print_cut : formatter -> unit -> unit +val pp_print_space : formatter -> unit -> unit +val pp_force_newline : formatter -> unit -> unit +val pp_print_flush : formatter -> unit -> unit +val pp_print_newline : formatter -> unit -> unit +val pp_print_if_newline : formatter -> unit -> unit +val pp_open_tbox : formatter -> unit -> unit +val pp_close_tbox : formatter -> unit -> unit +val pp_print_tbreak : formatter -> int -> int -> unit +val pp_set_tab : formatter -> unit -> unit +val pp_print_tab : formatter -> unit -> unit +val pp_set_tags : formatter -> bool -> unit +val pp_set_print_tags : formatter -> bool -> unit +val pp_set_mark_tags : formatter -> bool -> unit +val pp_get_print_tags : formatter -> unit -> bool +val pp_get_mark_tags : formatter -> unit -> bool +val pp_set_margin : formatter -> int -> unit +val pp_get_margin : formatter -> unit -> int +val pp_set_max_indent : formatter -> int -> unit +val pp_get_max_indent : formatter -> unit -> int +val pp_set_max_boxes : formatter -> int -> unit +val pp_get_max_boxes : formatter -> unit -> int +val pp_over_max_boxes : formatter -> unit -> bool +val pp_set_ellipsis_text : formatter -> string -> unit +val pp_get_ellipsis_text : formatter -> unit -> string val pp_set_formatter_out_channel : formatter -> Pervasives.out_channel -> unit -;; + val pp_set_formatter_output_functions : formatter -> (string -> int -> int -> unit) -> (unit -> unit) -> unit -;; + val pp_get_formatter_output_functions : formatter -> unit -> (string -> int -> int -> unit) * (unit -> unit) -;; + val pp_set_formatter_tag_functions : formatter -> formatter_tag_functions -> unit -;; + val pp_get_formatter_tag_functions : formatter -> unit -> formatter_tag_functions -;; + val pp_set_formatter_out_functions : formatter -> formatter_out_functions -> unit -;; + val pp_get_formatter_out_functions : formatter -> unit -> formatter_out_functions -;; (** These functions are the basic ones: usual functions operating on the standard formatter are defined via partial evaluation of these primitives. For instance, @@ -587,7 +587,7 @@ val pp_print_text : formatter -> string -> unit (** {6 [printf] like functions for pretty-printing.} *) -val fprintf : formatter -> ('a, formatter, unit) format -> 'a;; +val fprintf : formatter -> ('a, formatter, unit) format -> 'a (** [fprintf ff fmt arg1 ... argN] formats the arguments [arg1] to [argN] according to the format string [fmt], and outputs the resulting string on @@ -656,13 +656,13 @@ val fprintf : formatter -> ('a, formatter, unit) format -> 'a;; *) -val printf : ('a, formatter, unit) format -> 'a;; +val printf : ('a, formatter, unit) format -> 'a (** Same as [fprintf] above, but output on [std_formatter]. *) -val eprintf : ('a, formatter, unit) format -> 'a;; +val eprintf : ('a, formatter, unit) format -> 'a (** Same as [fprintf] above, but output on [err_formatter]. *) -val sprintf : ('a, unit, string) format -> 'a;; +val sprintf : ('a, unit, string) format -> 'a (** Same as [printf] above, but instead of printing on a formatter, returns a string containing the result of formatting the arguments. Note that the pretty-printer queue is flushed at the end of {e each @@ -678,7 +678,7 @@ val sprintf : ('a, unit, string) format -> 'a;; pretty-printing returns the desired string. *) -val asprintf : ('a, formatter, unit, string) format4 -> 'a;; +val asprintf : ('a, formatter, unit, string) format4 -> 'a (** Same as [printf] above, but instead of printing on a formatter, returns a string containing the result of formatting the arguments. The type of [asprintf] is general enough to interact nicely with [%a] @@ -686,7 +686,7 @@ val asprintf : ('a, formatter, unit, string) format4 -> 'a;; @since 4.01.0 *) -val ifprintf : formatter -> ('a, formatter, unit) format -> 'a;; +val ifprintf : formatter -> ('a, formatter, unit) format -> 'a (** Same as [fprintf] above, but does not print anything. Useful to ignore some material when conditionally printing. @since 3.10.0 @@ -696,19 +696,17 @@ val ifprintf : formatter -> ('a, formatter, unit) format -> 'a;; val kfprintf : (formatter -> 'a) -> formatter -> ('b, formatter, unit, 'a) format4 -> 'b -;; (** Same as [fprintf] above, but instead of returning immediately, passes the formatter to its first argument at the end of printing. *) val ikfprintf : (formatter -> 'a) -> formatter -> ('b, formatter, unit, 'a) format4 -> 'b -;; (** Same as [kfprintf] above, but does not print anything. Useful to ignore some material when conditionally printing. @since 3.12.0 *) -val ksprintf : (string -> 'a) -> ('b, unit, string, 'a) format4 -> 'b;; +val ksprintf : (string -> 'a) -> ('b, unit, string, 'a) format4 -> 'b (** Same as [sprintf] above, but instead of returning the string, passes it to the first argument. *) @@ -716,7 +714,6 @@ val ksprintf : (string -> 'a) -> ('b, unit, string, 'a) format4 -> 'b;; val bprintf : Buffer.t -> ('a, formatter, unit) format -> 'a [@@ocaml.deprecated] -;; (** @deprecated This function is error prone. Do not use it. If you need to print to some buffer [b], you must first define a @@ -725,7 +722,6 @@ val bprintf : Buffer.t -> ('a, formatter, unit) format -> 'a val kprintf : (string -> 'a) -> ('b, unit, string, 'a) format4 -> 'b [@@ocaml.deprecated "Use Format.ksprintf instead."] -;; (** @deprecated An alias for [ksprintf]. *) val set_all_formatter_output_functions : @@ -735,9 +731,7 @@ val set_all_formatter_output_functions : spaces:(int -> unit) -> unit [@@ocaml.deprecated "Use Format.set_formatter_out_functions instead."] -;; -(** @deprecated Subsumed by [set_formatter_out_functions]. -*) +(** @deprecated Subsumed by [set_formatter_out_functions]. *) val get_all_formatter_output_functions : unit -> @@ -746,22 +740,17 @@ val get_all_formatter_output_functions : (unit -> unit) * (int -> unit) [@@ocaml.deprecated "Use Format.get_formatter_out_functions instead."] -;; -(** @deprecated Subsumed by [get_formatter_out_functions]. -*) +(** @deprecated Subsumed by [get_formatter_out_functions]. *) + val pp_set_all_formatter_output_functions : formatter -> out:(string -> int -> int -> unit) -> flush:(unit -> unit) -> newline:(unit -> unit) -> spaces:(int -> unit) -> unit [@@ocaml.deprecated "Use Format.pp_set_formatter_out_functions instead."] -;; -(** @deprecated Subsumed by [pp_set_formatter_out_functions]. -*) +(** @deprecated Subsumed by [pp_set_formatter_out_functions]. *) val pp_get_all_formatter_output_functions : formatter -> unit -> (string -> int -> int -> unit) * (unit -> unit) * (unit -> unit) * (int -> unit) [@@ocaml.deprecated "Use Format.pp_get_formatter_out_functions instead."] -;; -(** @deprecated Subsumed by [pp_get_formatter_out_functions]. -*) +(** @deprecated Subsumed by [pp_get_formatter_out_functions]. *) diff --git a/stdlib/printf.mli b/stdlib/printf.mli index 4a72566594..573414ec22 100644 --- a/stdlib/printf.mli +++ b/stdlib/printf.mli @@ -136,7 +136,7 @@ val ifprintf : 'a -> ('b, 'a, unit) format -> 'b (** Formatted output functions with continuations. *) val kfprintf : (out_channel -> 'a) -> out_channel -> - ('b, out_channel, unit, 'a) format4 -> 'b;; + ('b, out_channel, unit, 'a) format4 -> 'b (** Same as [fprintf], but instead of returning immediately, passes the out channel to its first argument at the end of printing. @since 3.09.0 @@ -144,20 +144,19 @@ val kfprintf : (out_channel -> 'a) -> out_channel -> val ikfprintf : (out_channel -> 'a) -> out_channel -> ('b, out_channel, unit, 'a) format4 -> 'b -;; (** Same as [kfprintf] above, but does not print anything. Useful to ignore some material when conditionally printing. @since 4.0 *) -val ksprintf : (string -> 'a) -> ('b, unit, string, 'a) format4 -> 'b;; +val ksprintf : (string -> 'a) -> ('b, unit, string, 'a) format4 -> 'b (** Same as [sprintf] above, but instead of returning the string, passes it to the first argument. @since 3.09.0 *) val kbprintf : (Buffer.t -> 'a) -> Buffer.t -> - ('b, Buffer.t, unit, 'a) format4 -> 'b;; + ('b, Buffer.t, unit, 'a) format4 -> 'b (** Same as [bprintf], but instead of returning immediately, passes the buffer to its first argument at the end of printing. @since 3.10.0 diff --git a/stdlib/scanf.mli b/stdlib/scanf.mli index 212aa00b75..f065c4610b 100644 --- a/stdlib/scanf.mli +++ b/stdlib/scanf.mli @@ -83,7 +83,7 @@ module Scanning : sig -type in_channel;; +type in_channel (** The notion of input channel for the [Scanf] module: those channels provide all the machinery necessary to read from a given [Pervasives.in_channel] value. @@ -93,7 +93,7 @@ type in_channel;; @since 3.12.0 *) -type scanbuf = in_channel;; +type scanbuf = in_channel (** The type of scanning buffers. A scanning buffer is the source from which a formatted input function gets characters. The scanning buffer holds the current state of the scan, plus a function to get the next char from the @@ -105,7 +105,7 @@ type scanbuf = in_channel;; character yet to be read. *) -val stdin : in_channel;; +val stdin : in_channel (** The standard input notion for the [Scanf] module. [Scanning.stdin] is the formatted input channel attached to [Pervasives.stdin]. @@ -118,12 +118,12 @@ val stdin : in_channel;; @since 3.12.0 *) -type file_name = string;; +type file_name = string (** A convenient alias to designate a file name. @since 4.00.0 *) -val open_in : file_name -> in_channel;; +val open_in : file_name -> in_channel (** [Scanning.open_in fname] returns a formatted input channel for bufferized reading in text mode from file [fname]. @@ -135,31 +135,32 @@ val open_in : file_name -> in_channel;; @since 3.12.0 *) -val open_in_bin : file_name -> in_channel;; +val open_in_bin : file_name -> in_channel (** [Scanning.open_in_bin fname] returns a formatted input channel for bufferized reading in binary mode from file [fname]. @since 3.12.0 *) -val close_in : in_channel -> unit;; +val close_in : in_channel -> unit (** Closes the [Pervasives.in_channel] associated with the given [Scanning.in_channel] formatted input channel. @since 3.12.0 *) -val from_file : file_name -> in_channel;; +val from_file : file_name -> in_channel (** An alias for [open_in] above. *) -val from_file_bin : string -> in_channel;; + +val from_file_bin : string -> in_channel (** An alias for [open_in_bin] above. *) -val from_string : string -> in_channel;; +val from_string : string -> in_channel (** [Scanning.from_string s] returns a formatted input channel which reads from the given string. Reading starts from the first character in the string. The end-of-input condition is set when the end of the string is reached. *) -val from_function : (unit -> char) -> in_channel;; +val from_function : (unit -> char) -> in_channel (** [Scanning.from_function f] returns a formatted input channel with the given function as its reading method. @@ -169,39 +170,39 @@ val from_function : (unit -> char) -> in_channel;; end-of-input condition by raising the exception [End_of_file]. *) -val from_channel : Pervasives.in_channel -> in_channel;; +val from_channel : Pervasives.in_channel -> in_channel (** [Scanning.from_channel ic] returns a formatted input channel which reads from the regular input channel [ic] argument, starting at the current reading position. *) -val end_of_input : in_channel -> bool;; +val end_of_input : in_channel -> bool (** [Scanning.end_of_input ic] tests the end-of-input condition of the given formatted input channel. *) -val beginning_of_input : in_channel -> bool;; +val beginning_of_input : in_channel -> bool (** [Scanning.beginning_of_input ic] tests the beginning of input condition of the given formatted input channel. *) -val name_of_input : in_channel -> string;; +val name_of_input : in_channel -> string (** [Scanning.name_of_input ic] returns the name of the character source for the formatted input channel [ic]. @since 3.09.0 *) -val stdib : in_channel;; +val stdib : in_channel (** A deprecated alias for [Scanning.stdin], the scanning buffer reading from [Pervasives.stdin]. *) -end;; +end (** {6 Type of formatted input functions} *) type ('a, 'b, 'c, 'd) scanner = - ('a, Scanning.in_channel, 'b, 'c, 'a -> 'd, 'd) format6 -> 'c;; + ('a, Scanning.in_channel, 'b, 'c, 'a -> 'd, 'd) format6 -> 'c (** The type of formatted input scanners: [('a, 'b, 'c, 'd) scanner] is the type of a formatted input function that reads from some formatted input channel according to some format string; more @@ -223,14 +224,14 @@ type ('a, 'b, 'c, 'd) scanner = @since 3.10.0 *) -exception Scan_failure of string;; +exception Scan_failure of string (** The exception that formatted input functions raise when the input cannot be read according to the given format. *) (** {6 The general formatted input function} *) -val bscanf : Scanning.in_channel -> ('a, 'b, 'c, 'd) scanner;; +val bscanf : Scanning.in_channel -> ('a, 'b, 'c, 'd) scanner (** [bscanf ic fmt r1 ... rN f] reads arguments for the function [f], from the formatted input channel [ic], according to the format string [fmt], and applies [f] to these values. @@ -453,7 +454,7 @@ val bscanf : Scanning.in_channel -> ('a, 'b, 'c, 'd) scanner;; (** {6 Specialised formatted input functions} *) -val fscanf : Pervasives.in_channel -> ('a, 'b, 'c, 'd) scanner;; +val fscanf : Pervasives.in_channel -> ('a, 'b, 'c, 'd) scanner (** Same as {!Scanf.bscanf}, but reads from the given regular input channel. Warning: since all formatted input functions operate from a {e formatted @@ -467,17 +468,17 @@ val fscanf : Pervasives.in_channel -> ('a, 'b, 'c, 'd) scanner;; scanning from the same regular input channel. *) -val sscanf : string -> ('a, 'b, 'c, 'd) scanner;; +val sscanf : string -> ('a, 'b, 'c, 'd) scanner (** Same as {!Scanf.bscanf}, but reads from the given string. *) -val scanf : ('a, 'b, 'c, 'd) scanner;; +val scanf : ('a, 'b, 'c, 'd) scanner (** Same as {!Scanf.bscanf}, but reads from the predefined formatted input channel {!Scanf.Scanning.stdin} that is connected to [Pervasives.stdin]. *) val kscanf : Scanning.in_channel -> (Scanning.in_channel -> exn -> 'd) -> - ('a, 'b, 'c, 'd) scanner;; + ('a, 'b, 'c, 'd) scanner (** Same as {!Scanf.bscanf}, but takes an additional function argument [ef] that is called in case of error: if the scanning process or some conversion fails, the scanning function aborts and calls the @@ -501,7 +502,7 @@ val kfscanf : val bscanf_format : Scanning.in_channel -> ('a, 'b, 'c, 'd, 'e, 'f) format6 -> - (('a, 'b, 'c, 'd, 'e, 'f) format6 -> 'g) -> 'g;; + (('a, 'b, 'c, 'd, 'e, 'f) format6 -> 'g) -> 'g (** [bscanf_format ic fmt f] reads a format string token from the formatted input channel [ic], according to the given format string [fmt], and applies [f] to the resulting format string value. @@ -512,14 +513,14 @@ val bscanf_format : val sscanf_format : string -> ('a, 'b, 'c, 'd, 'e, 'f) format6 -> - (('a, 'b, 'c, 'd, 'e, 'f) format6 -> 'g) -> 'g;; + (('a, 'b, 'c, 'd, 'e, 'f) format6 -> 'g) -> 'g (** Same as {!Scanf.bscanf_format}, but reads from the given string. @since 3.09.0 *) val format_from_string : string -> - ('a, 'b, 'c, 'd, 'e, 'f) format6 -> ('a, 'b, 'c, 'd, 'e, 'f) format6;; + ('a, 'b, 'c, 'd, 'e, 'f) format6 -> ('a, 'b, 'c, 'd, 'e, 'f) format6 (** [format_from_string s fmt] converts a string argument to a format string, according to the given format string [fmt]. Raise [Scan_failure] if [s], considered as a format string, does not @@ -527,7 +528,7 @@ val format_from_string : @since 3.10.0 *) -val unescaped : string -> string;; +val unescaped : string -> string (** Return a copy of the argument with escape sequences, following the lexical conventions of OCaml, replaced by their corresponding special characters. If there is no escape sequence in the diff --git a/tools/Makefile.shared b/tools/Makefile.shared index 417c2a6f17..5b34c868d9 100644 --- a/tools/Makefile.shared +++ b/tools/Makefile.shared @@ -37,7 +37,7 @@ opt.opt: ocamldep.opt read_cmt.opt CAMLDEP_OBJ=depend.cmo ocamldep.cmo CAMLDEP_IMPORTS=misc.cmo config.cmo clflags.cmo terminfo.cmo \ - warnings.cmo location.cmo longident.cmo \ + warnings.cmo location.cmo longident.cmo docstrings.cmo \ syntaxerr.cmo ast_helper.cmo parser.cmo lexer.cmo parse.cmo \ ccomp.cmo ast_mapper.cmo pparse.cmo compenv.cmo @@ -67,7 +67,7 @@ install:: CSLPROF=ocamlprof.cmo CSLPROF_IMPORTS=misc.cmo config.cmo clflags.cmo terminfo.cmo \ - warnings.cmo location.cmo longident.cmo \ + warnings.cmo location.cmo longident.cmo docstrings.cmo \ syntaxerr.cmo ast_helper.cmo parser.cmo lexer.cmo parse.cmo ocamlprof: $(CSLPROF) profiling.cmo @@ -160,7 +160,7 @@ clean:: # Insert labels following an interface file (upgrade 3.02 to 3.03) ADDLABELS_IMPORTS=misc.cmo config.cmo clflags.cmo terminfo.cmo \ - warnings.cmo location.cmo longident.cmo \ + warnings.cmo location.cmo longident.cmo docstrings.cmo \ syntaxerr.cmo ast_helper.cmo parser.cmo lexer.cmo parse.cmo addlabels: addlabels.cmo @@ -205,6 +205,7 @@ READ_CMT= \ ../utils/clflags.cmo \ ../parsing/location.cmo \ ../parsing/longident.cmo \ + ../parsing/docstrings.cmo \ ../parsing/lexer.cmo \ ../parsing/pprintast.cmo \ ../parsing/ast_helper.cmo \ diff --git a/tools/ocamlcp.ml b/tools/ocamlcp.ml index b5a124fba8..c8d26d2449 100644 --- a/tools/ocamlcp.ml +++ b/tools/ocamlcp.ml @@ -61,6 +61,7 @@ module Options = Main_args.Make_bytecomp_options (struct let _impl s = with_impl := true; option_with_arg "-impl" s let _intf s = with_intf := true; option_with_arg "-intf" s let _intf_suffix s = option_with_arg "-intf-suffix" s + let _keep_docs = option "-keep-docs" let _keep_locs = option "-keep-locs" let _labels = option "-labels" let _linkall = option "-linkall" diff --git a/tools/ocamloptp.ml b/tools/ocamloptp.ml index a0d20ed5e3..fd15fe5968 100644 --- a/tools/ocamloptp.ml +++ b/tools/ocamloptp.ml @@ -61,6 +61,7 @@ module Options = Main_args.Make_optcomp_options (struct let _inline n = option_with_int "-inline" n let _intf s = with_intf := true; option_with_arg "-intf" s let _intf_suffix s = option_with_arg "-intf-suffix" s + let _keep_docs = option "-keep-docs" let _keep_locs = option "-keep-locs" let _labels = option "-labels" let _linkall = option "-linkall" diff --git a/toplevel/genprintval.mli b/toplevel/genprintval.mli index 14659d62a2..1c2ec471b8 100644 --- a/toplevel/genprintval.mli +++ b/toplevel/genprintval.mli @@ -54,6 +54,7 @@ module type S = unit (** [install_generic_printer' function_path constructor_path printer] function_path is used to remove the printer. *) + val remove_printer : Path.t -> unit val outval_of_untyped_exception : t -> Outcometree.out_value val outval_of_value : diff --git a/typing/ctype.mli b/typing/ctype.mli index 37daf3a428..36cb186fa2 100644 --- a/typing/ctype.mli +++ b/typing/ctype.mli @@ -144,6 +144,7 @@ val try_expand_once_opt: Env.t -> type_expr -> type_expr val expand_head_opt: Env.t -> type_expr -> type_expr (** The compiler's own version of [expand_head] necessary for type-based optimisations. *) + val full_expand: Env.t -> type_expr -> type_expr val extract_concrete_typedecl: Env.t -> type_expr -> Path.t * Path.t * type_declaration diff --git a/typing/subst.ml b/typing/subst.ml index b21d6befa0..c9b18e267b 100644 --- a/typing/subst.ml +++ b/typing/subst.ml @@ -42,11 +42,22 @@ let remove_loc = let open Ast_mapper in {default_mapper with location = (fun _this _loc -> Location.none)} -let attrs s x = - if s.for_saving && not !Clflags.keep_locs - then remove_loc.Ast_mapper.attributes remove_loc x - else x +let is_not_doc = function + | ({Location.txt = "ocaml.doc"}, _) -> false + | ({Location.txt = "ocaml.text"}, _) -> false + | ({Location.txt = "doc"}, _) -> false + | ({Location.txt = "text"}, _) -> false + | _ -> true +let attrs s x = + let x = + if s.for_saving && not !Clflags.keep_docs then + List.filter is_not_doc x + else x + in + if s.for_saving && not !Clflags.keep_locs + then remove_loc.Ast_mapper.attributes remove_loc x + else x let rec module_path s = function Pident id as p -> diff --git a/utils/clflags.ml b/utils/clflags.ml index e470cf5a60..6a9d5781a9 100644 --- a/utils/clflags.ml +++ b/utils/clflags.ml @@ -109,5 +109,6 @@ let dlcode = ref true (* not -nodynlink *) let runtime_variant = ref "";; (* -runtime-variant *) +let keep_docs = ref false (* -keep-docs *) let keep_locs = ref false (* -keep-locs *) let unsafe_string = ref true;; (* -safe-string / -unsafe-string *) diff --git a/utils/clflags.mli b/utils/clflags.mli index 7ee86c3f54..26adb9d684 100644 --- a/utils/clflags.mli +++ b/utils/clflags.mli @@ -92,6 +92,7 @@ val shared : bool ref val dlcode : bool ref val runtime_variant : string ref val force_slash : bool ref +val keep_docs : bool ref val keep_locs : bool ref val unsafe_string : bool ref val opaque : bool ref diff --git a/utils/warnings.ml b/utils/warnings.ml index aeab0a4bba..a613b93420 100644 --- a/utils/warnings.ml +++ b/utils/warnings.ml @@ -67,6 +67,7 @@ type t = | Attribute_payload of string * string (* 47 *) | Eliminated_optional_arguments of string list (* 48 *) | No_cmi_file of string (* 49 *) + | Bad_docstring of bool (* 50 *) ;; (* If you remove a warning, leave a hole in the numbering. NEVER change @@ -125,9 +126,10 @@ let number = function | Attribute_payload _ -> 47 | Eliminated_optional_arguments _ -> 48 | No_cmi_file _ -> 49 + | Bad_docstring _ -> 50 ;; -let last_warning_number = 49 +let last_warning_number = 50 (* Must be the max number returned by the [number] function. *) let letter = function @@ -240,7 +242,7 @@ let parse_options errflag s = current := {error; active} (* If you change these, don't forget to change them in man/ocamlc.m *) -let defaults_w = "+a-4-6-7-9-27-29-32..39-41..42-44-45-48";; +let defaults_w = "+a-4-6-7-9-27-29-32..39-41..42-44-45-48-50";; let defaults_warn_error = "-a";; let () = parse_options false defaults_w;; @@ -384,6 +386,9 @@ let message = function (String.concat ", " sl) | No_cmi_file s -> "no cmi file was found in path for module " ^ s + | Bad_docstring unattached -> + if unattached then "unattached documentation comment (ignored)" + else "ambiguous documentation comment" ;; let nerrors = ref 0;; @@ -468,6 +473,7 @@ let descriptions = 47, "Illegal attribute payload."; 48, "Implicit elimination of optional arguments."; 49, "Missing cmi file when looking up module alias."; + 50, "Unexpected documentation comment."; ] ;; diff --git a/utils/warnings.mli b/utils/warnings.mli index 628ad16e5f..ffd943fa14 100644 --- a/utils/warnings.mli +++ b/utils/warnings.mli @@ -62,6 +62,7 @@ type t = | Attribute_payload of string * string (* 47 *) | Eliminated_optional_arguments of string list (* 48 *) | No_cmi_file of string (* 49 *) + | Bad_docstring of bool (* 50 *) ;; val parse_options : bool -> string -> unit;; From c307e5addd67f706a5a44757df53d12e8da5ae1a Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 12 May 2015 00:41:02 +0000 Subject: [PATCH 256/494] PR#6747: ocamlobjinfo: missing symbol caml_plugin_header due to underscore git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16110 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + tools/objinfo_helper.c | 10 ++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Changes b/Changes index 974424c18e..059058f1d7 100644 --- a/Changes +++ b/Changes @@ -107,6 +107,7 @@ Bug fixes: (Gabriel Scherer, report by Peter Zotov) - PR#6727: Printf.sprintf "%F" misbehavior (Benoît Vaugon, report by Vassili Karpov) +- PR#6747: ocamlobjinfo: missing symbol caml_plugin_header due to underscore - PR#6749: ocamlopt returns n for (n mod 1) instead of 0 (Mark Shinwell and Jérémie Dimino) - PR#6753: Num.quo_num and Num.mod_num incorrect for some negative arguments diff --git a/tools/objinfo_helper.c b/tools/objinfo_helper.c index 74cfc2ebd6..4a76cff1f0 100644 --- a/tools/objinfo_helper.c +++ b/tools/objinfo_helper.c @@ -24,6 +24,12 @@ #include <bfd.h> #undef PACKAGE +#ifdef __APPLE__ +#define plugin_header_sym "_caml_plugin_header" +#else +#define plugin_header_sym "caml_plugin_header" +#endif + int main(int argc, char ** argv) { bfd *fd; @@ -74,14 +80,14 @@ int main(int argc, char ** argv) sym_count = bfd_canonicalize_dynamic_symtab (fd, symbol_table); for (i = 0; i < sym_count; i++) { - if (strcmp(symbol_table[i]->name, "caml_plugin_header") == 0) { + if (strcmp(symbol_table[i]->name, plugin_header_sym) == 0) { printf("%ld\n", (long) (offset + symbol_table[i]->value)); bfd_close(fd); return 0; } } - fprintf(stderr, "Error: missing symbol caml_plugin_header\n"); + fprintf(stderr, "Error: missing symbol %s\n", plugin_header_sym); bfd_close(fd); return 2; } From 2c77edd2a3a134778d50d518aa7382dab199ac19 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 12 May 2015 01:28:49 +0000 Subject: [PATCH 257/494] PR#6281: Graphics window does not acknowledge second click (double click) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16111 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + otherlibs/win32graph/open.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 059058f1d7..6b87fffd15 100644 --- a/Changes +++ b/Changes @@ -73,6 +73,7 @@ Bug fixes: - PR#5887: move the byterun/*.h headers to byterun/caml/*.h to avoid header name clashes (Jérôme Vouillon and Adrien Nader and Peter Zotov) +- PR#6281: Graphics window does not acknowledge second click (double click) - PR#6490: incorrect backtraces in gdb on AArch64. Also fixes incorrect backtraces on 32-bit ARM. (Mark Shinwell) - PR#6573: extern "C" for systhreads/threads.h diff --git a/otherlibs/win32graph/open.c b/otherlibs/win32graph/open.c index d3a61a5da1..e9d10cad00 100644 --- a/otherlibs/win32graph/open.c +++ b/otherlibs/win32graph/open.c @@ -112,7 +112,7 @@ int DoRegisterClass(void) WNDCLASS wc; memset(&wc,0,sizeof(WNDCLASS)); - wc.style = CS_HREDRAW|CS_VREDRAW |CS_DBLCLKS|CS_OWNDC ; + wc.style = CS_HREDRAW|CS_VREDRAW|CS_OWNDC ; wc.lpfnWndProc = (WNDPROC)GraphicsWndProc; wc.hInstance = hInst; wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); From bc574ac054dfc5116bdc09525db9de5f9c5749a5 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 12 May 2015 14:21:31 +0000 Subject: [PATCH 258/494] fix ambiguous documentation comments git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16112 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- boot/ocamlc | Bin 1727944 -> 1742871 bytes boot/ocamldep | Bin 540825 -> 554616 bytes boot/ocamllex | Bin 254461 -> 254492 bytes parsing/location.mli | 2 ++ 4 files changed, 2 insertions(+) diff --git a/boot/ocamlc b/boot/ocamlc index 8cd7d040d10e98890fbafce702b693e20e66d89f..3a3a68cd37a2dbcb89d0d915c5c9ffc5d6e3c178 100755 GIT binary patch delta 201713 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 delta 193763 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 =r9IA@?guQ{)j;9tE>QK+2;VnAS{^E%=t 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≥I}Z6ld#8<$P8`r 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%0A5i(q%Og39%b0+Z;3j`b<_xN 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 JIeq)}`#;a_<dXmZ diff --git a/boot/ocamldep b/boot/ocamldep index f95b73c0f1064c26d816ef8e39148c4cd7de9e4d..161046ff322224253690b99431cb813319a590f2 100755 GIT binary patch delta 100946 zcmd443!F{W`#-+dz8o`VhBIcEVT_q^2_Z8skxOP=LT;nn6UHUfVBE_6n2(Bz8XY_d zHKJ0;Oz04b==!1P@+n1)q7)USqR9XK?7jBPIy-$neJ;Q6>wos^Icq=f^{i(->wY== zti3!x?fmJq`nA#;kC`xTRO68&C*+PDJ!(ed+zBIcavM*`%NaLf%%~A}G#)#C@|2w1 z+{VRM&3Rmmp<}g-gkaI*v$959zI?g7rfCg80@NOSl)|Thk5+ge_)6d_gV;@=#m7Vv z6+LX3R4_?zLmL_znY19@ijKV=-iaXo#DS`AuDrU%FcCpLglH;E$`_(@7}uEmM~w(- zri+fir|V*-h?xJAE<!))dgDGKD%ke11ZvY?Zz!U1n-sbmx4I}FDjulMf0yzWifB4m z--wQ3yQ+aW9WfM}YsAr*33@u6{Mt%n`-X|8v^d$gi@Mh}QfX}?BU9WSoLD=B%xjFy z$ax6G8m0vg)lOJ;RQJ=AYmD5g3_T0tRP_V#hf~#$&R%0AiFKiv#>Or^s;1Ti;I*Ju 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 It52W*0z!Lal>h($ delta 92544 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 ZgMq`QlYkCocTUXBF|@R_j4&`X1OVnNt3?0+ diff --git a/boot/ocamllex b/boot/ocamllex index 385bbeeaca889938a412c8d7e8a1cd65d75873cc..95a30a3a64d77221b4cf230a16ee065f995cf1ed 100755 GIT binary patch delta 302 zcmex+n19X@eobXX{fzwFRQ;5c{G816)GGa){N%(O{rrN&+~kbZ<ZS)SyyB9?oE-g) zYIXB@G8h;ba)9_N5Kmq*zr!*4|NsA7K#n#LGXk*_kk5_8R|N8Tkoassz7UWv3dA5< ze7YbTqxiHZj4aa+_%o?Y|8RmyX7Y&z29qOl1Y~ugiu8fB9S}<ZF$f3)vE*jah5bp4 z9Mct97>$9tZ!$Bwqww^nx3Dn!0EI5HFjg~iwEMC$0x{EeUsh(fIvz7!BLhQIT?12H sL&NR!o0;9C1-cpij#jzr&bL(BW*7VN;-~H3?lB)@V(gf{_aU<b0OSBu2mk;8 delta 282 zcmbPpg#Yhhel=x9{fzwFRQ>eC;^d4}eZBmG#9Vz7Jp&^>Bki30<is4^^vn|7jhc1y zCvTqL;h6US|9>t91_o^)W&~naAfFqFuL9)rAn`eYd?6rT7>Gf%=yU@%M)B#l{h2hT z^PgmrnJk?nFnRh^1zAm~0+7LWKr9BtAOO-RzS(49e-b0xbO#njV@9UwKbRTaQF!{( z7qc+>0EIrVFjh0Nwdb%h0x{F}99CwxIvx{UBLhQIT?1oXBh&5snwj0B1)5?U@*Z8( cyQqIr_rQ~TvTEB!?=v4`V$7L-=OMEL04YICjsO4v diff --git a/parsing/location.mli b/parsing/location.mli index 07e3c0f616..77b754f731 100644 --- a/parsing/location.mli +++ b/parsing/location.mli @@ -62,6 +62,7 @@ val reset: unit -> unit val warning_printer : (t -> formatter -> Warnings.t -> unit) ref (** Hook for intercepting warnings. *) + val default_warning_printer : t -> formatter -> Warnings.t -> unit (** Original warning printer for use in hooks. *) @@ -126,6 +127,7 @@ val report_error: formatter -> error -> unit val error_reporter : (formatter -> error -> unit) ref (** Hook for intercepting error reports. *) + val default_error_reporter : formatter -> error -> unit (** Original error reporter for use in hooks. *) From c1e26ad14aec62cefe3d5fb24cf8702caa39db2b Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 12 May 2015 14:46:37 +0000 Subject: [PATCH 259/494] PR#6266: Cross compilation for iOs, Android etc git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16114 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 3 +- Makefile | 21 +++++++------ Makefile.nt | 16 +++++----- boot/ocamlc | Bin 1742871 -> 1742883 bytes boot/ocamldep | Bin 554616 -> 554628 bytes boot/ocamllex | Bin 254492 -> 254496 bytes byterun/Makefile.common | 8 ++++- byterun/alloc.c | 4 +++ config/auto-aux/searchpath | 11 ++++++- configure | 50 +++++++++++++++++++++++-------- debugger/Makefile.shared | 10 +++---- driver/main.ml | 4 +++ lex/Makefile | 14 +++++---- lex/Makefile.nt | 11 +++---- ocamlbuild/Makefile | 11 +++---- ocamldoc/Makefile | 20 ++++++------- ocamldoc/Makefile.nt | 20 ++++++------- otherlibs/Makefile | 4 +-- otherlibs/Makefile.shared | 3 +- otherlibs/bigarray/Makefile | 2 +- otherlibs/bigarray/Makefile.nt | 2 +- otherlibs/dynlink/Makefile | 9 +++--- otherlibs/graph/Makefile | 2 +- otherlibs/num/Makefile | 2 +- otherlibs/str/Makefile | 2 +- otherlibs/systhreads/Makefile | 10 ++++--- otherlibs/systhreads/Makefile.nt | 12 ++++---- otherlibs/threads/Makefile | 8 +++-- otherlibs/unix/Makefile | 2 +- stdlib/.ignore | 2 ++ stdlib/Makefile | 29 ++++++++++-------- stdlib/Makefile.nt | 6 ++-- stdlib/Makefile.shared | 22 ++++++++------ tools/Makefile.shared | 3 +- 34 files changed, 199 insertions(+), 124 deletions(-) diff --git a/Changes b/Changes index 6b87fffd15..6f2cf62096 100644 --- a/Changes +++ b/Changes @@ -62,7 +62,8 @@ Runtime: Build system: - PR#5418 (comments) : generate dependencies with $(CC) instead of gcc - +- PR#6266: Cross compilation for iOs, Android etc + Bug fixes: - PR#5271: Location.prerr_warning is hard-coded to use Format.err_formatter (Damien Doligez, report by Rolf Rolles) diff --git a/Makefile b/Makefile index 5222cf2422..3be3f56af1 100644 --- a/Makefile +++ b/Makefile @@ -13,20 +13,20 @@ # The main Makefile include config/Makefile +CAMLRUN ?= boot/ocamlrun +CAMLYACC ?= boot/ocamlyacc include stdlib/StdlibModules -CAMLC=boot/ocamlrun boot/ocamlc -nostdlib -I boot -CAMLOPT=boot/ocamlrun ./ocamlopt -nostdlib -I stdlib -I otherlibs/dynlink +CAMLC=$(CAMLRUN) boot/ocamlc -nostdlib -I boot +CAMLOPT=$(CAMLRUN) ./ocamlopt -nostdlib -I stdlib -I otherlibs/dynlink COMPFLAGS=-strict-sequence -w +33..39+48+50 -warn-error A -bin-annot \ -safe-string $(INCLUDES) LINKFLAGS= -CAMLYACC=boot/ocamlyacc YACCFLAGS=-v -CAMLLEX=boot/ocamlrun boot/ocamllex -CAMLDEP=boot/ocamlrun tools/ocamldep +CAMLLEX=$(CAMLRUN) boot/ocamllex +CAMLDEP=$(CAMLRUN) tools/ocamldep DEPFLAGS=$(INCLUDES) -CAMLRUN=byterun/ocamlrun SHELL=/bin/sh MKDIR=mkdir -p @@ -317,7 +317,7 @@ install: cp ocaml $(INSTALL_BINDIR)/ocaml$(EXE) cd stdlib; $(MAKE) install cp lex/ocamllex $(INSTALL_BINDIR)/ocamllex$(EXE) - cp yacc/ocamlyacc$(EXE) $(INSTALL_BINDIR)/ocamlyacc$(EXE) + cp $(CAMLYACC)$(EXE) $(INSTALL_BINDIR)/ocamlyacc$(EXE) cp utils/*.cmi parsing/*.cmi typing/*.cmi bytecomp/*.cmi driver/*.cmi \ toplevel/*.cmi $(INSTALL_COMPLIBDIR) cp compilerlibs/ocamlcommon.cma compilerlibs/ocamlbytecomp.cma \ @@ -628,8 +628,7 @@ partialclean:: beforedepend:: asmcomp/emit.ml tools/cvt_emit: tools/cvt_emit.mll - cd tools; \ - $(MAKE) CAMLC="../$(CAMLRUN) ../boot/ocamlc -I ../stdlib" cvt_emit + cd tools && $(MAKE) cvt_emit # The "expunge" utility @@ -677,7 +676,7 @@ library: ocamlc cd stdlib; $(MAKE) all library-cross: - cd stdlib; $(MAKE) RUNTIME=../byterun/ocamlrun all + cd stdlib; $(MAKE) CAMLRUN=../byterun/ocamlrun all libraryopt: cd stdlib; $(MAKE) allopt @@ -751,7 +750,7 @@ alldepend:: otherlibraries: ocamltools for i in $(OTHERLIBRARIES); do \ - (cd otherlibs/$$i; $(MAKE) RUNTIME=$(RUNTIME) all) || exit $$?; \ + (cd otherlibs/$$i; $(MAKE) all) || exit $$?; \ done otherlibrariesopt: diff --git a/Makefile.nt b/Makefile.nt index 4564cf6b97..3179374c74 100644 --- a/Makefile.nt +++ b/Makefile.nt @@ -13,18 +13,18 @@ # The main Makefile include config/Makefile +CAMLRUN ?= boot/ocamlrun +CAMLYACC ?= boot/ocamlyacc include stdlib/StdlibModules -CAMLC=boot/ocamlrun boot/ocamlc -nostdlib -I boot -CAMLOPT=boot/ocamlrun ./ocamlopt -nostdlib -I stdlib -I otherlibs/dynlink +CAMLC=$(CAMLRUN) boot/ocamlc -nostdlib -I boot +CAMLOPT=$(CAMLRUN) ./ocamlopt -nostdlib -I stdlib -I otherlibs/dynlink COMPFLAGS=-strict-sequence -w +33..39+48 -warn-error A -bin-annot $(INCLUDES) LINKFLAGS= -CAMLYACC=boot/ocamlyacc YACCFLAGS= -CAMLLEX=boot/ocamlrun boot/ocamllex -CAMLDEP=boot/ocamlrun tools/ocamldep +CAMLLEX=$(CAMLRUN) boot/ocamllex +CAMLDEP=$(CAMLRUN) tools/ocamldep DEPFLAGS=$(INCLUDES) -CAMLRUN=byterun/ocamlrun OCAMLBUILDBYTE=$(WITH_OCAMLBUILD:=.byte) OCAMLBUILDNATIVE=$(WITH_OCAMLBUILD:=.native) @@ -552,7 +552,7 @@ beforedepend:: asmcomp/scheduling.ml # Preprocess the code emitters asmcomp/emit.ml: $(ASMCOMP_EMIT) tools/cvt_emit - boot/ocamlrun tools/cvt_emit < $(ASMCOMP_EMIT) > asmcomp/emit.ml + $(CAMLRUN) tools/cvt_emit < $(ASMCOMP_EMIT) > asmcomp/emit.ml partialclean:: rm -f asmcomp/emit.ml @@ -605,7 +605,7 @@ alldepend:: library: cd stdlib ; $(MAKEREC) all library-cross: - cd stdlib ; $(MAKEREC) RUNTIME=../byterun/ocamlrun all + cd stdlib ; $(MAKEREC) CAMLRUN=../byterun/ocamlrun all libraryopt: cd stdlib ; $(MAKEREC) allopt partialclean:: diff --git a/boot/ocamlc b/boot/ocamlc index 3a3a68cd37a2dbcb89d0d915c5c9ffc5d6e3c178..af5f48eabe2d3c3845771af0e4b4979d8f6b62c6 100755 GIT binary patch delta 157 zcmbQfA#3r5tO>d-x+S><jk>M6jIFv%t-8#ux-6}_tgX6it-9>3x*V;#oUOWCt-9Q; zx;(AAysf%?t-AcJx&p1bf~~qjt-8Xkx+1N*qFZ&vX0PJSW?=BqWni3J#K36!fBV%{ xVhQq$mecD_iD`pvnVxt`Ooq`0A<(|^lo$|;1F^*Rm8T?q&ob6e|2|zx0RYM+G&ukO delta 169 zcmW;8yAHu%7zW_)cdApJ{YWHY7KwLgqDEa=SlEb(kl4(IHx`4fgP3flE=}*Di3@Nu zqA@(l^YnJEx4ZSvAQTZJ;zWW-5-GwU(nN;H5;-DIm_&gn5+$NcRER23BkDf%{bg=M zCVf$lqbTbed|rChQI<Ojb<f>~x~+!)U;I!<8j)t;hpp+mdzvq&W0CaLnK^S2GbbX3 Nvp(!$+xB7r`~Y6*GsOS^ diff --git a/boot/ocamldep b/boot/ocamldep index 161046ff322224253690b99431cb813319a590f2..188c9894fe9c779222dae488cc544fc1af158510 100755 GIT binary patch delta 123 zcmezIMzQ6s;sjk5-ICmbM%`9j##UXXR$b;+U6xi|)~&j1#xcCt85p=C7#QYoGBCu< z*`6E279+=KIsH@>o3<iImwrxWl74=2Vs4Ixzq6ySkB_I5I+W(L0V@L=-fmmXw%xXx OUFtXE>**0?90~wX#U_vd delta 86 zcmZp9tN7!M;so7B!&XDaRzs#%L*`aPmR3X7t%hvIF}&v)7`P%B80N4uFvQH>UKqm` oBgbeu{ah8B_VmA1Y%+`%V0OD_HQRR2YIdpLjE|?MlyN8k0Kvo@9{>OV diff --git a/boot/ocamllex b/boot/ocamllex index 95a30a3a64d77221b4cf230a16ee065f995cf1ed..29786c52ab7d38ccf47186cacd5821f984ce3a62 100755 GIT binary patch delta 26 icmbPpgnz*i{t3D)x+S><jk>M6jIFv%TXmV=KLh}WFA3}b delta 21 dcmZ2*gn!Nv{t3E`hOLH-t%gin4Vm9R1OQ%_2zmej diff --git a/byterun/Makefile.common b/byterun/Makefile.common index fb9ea10a2f..c8c5235ab6 100755 --- a/byterun/Makefile.common +++ b/byterun/Makefile.common @@ -12,6 +12,8 @@ ######################################################################### include ../config/Makefile +CAMLRUN ?= ../boot/ocamlrun +CAMLYACC ?= ../boot/ocamlyacc CC=$(BYTECC) @@ -56,7 +58,7 @@ INSTALL_LIBDIR=$(DESTDIR)$(LIBDIR) install:: - cp ocamlrun$(EXE) $(INSTALL_BINDIR)/ocamlrun$(EXE) + cp $(CAMLRUN)$(EXE) $(INSTALL_BINDIR)/ocamlrun$(EXE) cp libcamlrun.$(A) $(INSTALL_LIBDIR)/libcamlrun.$(A) cd $(INSTALL_LIBDIR); $(RANLIB) libcamlrun.$(A) if test -d $(INSTALL_LIBDIR)/caml; then : ; \ @@ -72,6 +74,10 @@ install:: install-$(RUNTIMED) install-noruntimed: .PHONY: install-noruntimed +# TODO: when cross-compiling, do not install ocamlrund +# it doesn't hurt to install it, but it's useless and might be confusing +# because it's an executable for the target machine, while we're installing +# binaries for the host. install-runtimed: cp ocamlrund$(EXE) $(INSTALL_BINDIR)/ocamlrund$(EXE) cp libcamlrund.$(A) $(INSTALL_LIBDIR)/libcamlrund.$(A) diff --git a/byterun/alloc.c b/byterun/alloc.c index 4e15a50b9d..6544a0c5d0 100644 --- a/byterun/alloc.c +++ b/byterun/alloc.c @@ -184,3 +184,7 @@ CAMLprim value caml_update_dummy(value dummy, value newval) } return Val_unit; } + + + + diff --git a/config/auto-aux/searchpath b/config/auto-aux/searchpath index 79d7fcaebc..e229ac921b 100755 --- a/config/auto-aux/searchpath +++ b/config/auto-aux/searchpath @@ -15,9 +15,18 @@ # Find a program in the path +doprint=false +case $1 in + -p) shift; doprint=true;; + *) ;; +esac + IFS=':' for dir in $PATH; do if test -z "$dir"; then dir=.; fi - if test -f $dir/$1; then exit 0; fi + if test -f $dir/$1 -a -x $dir/$1; then + if $doprint; then echo "$dir/$1"; fi + exit 0 + fi done exit 1 diff --git a/configure b/configure index 539e10e461..4ea1498cf1 100755 --- a/configure +++ b/configure @@ -16,6 +16,7 @@ configure_options="$*" prefix=/usr/local bindir='' +target_bindir='' libdir='' mandir='' manext=1 @@ -92,6 +93,8 @@ while : ; do prefix=$2; shift;; -bindir|--bindir) bindir=$2; shift;; + -target-bindir|--target-bindir) + target_bindir="$2"; shift;; -libdir|--libdir) libdir=$2; shift;; -mandir|--mandir) @@ -237,17 +240,23 @@ else fi inf "Configuring for target $target ..." +if [ x"$host" = x"$target" ]; then + cross_compiler=false +else + cross_compiler=true +fi + # Do we have gcc? if test -z "$ccoption"; then if sh ./searchpath "${TOOLPREF}gcc"; then cc="${TOOLPREF}gcc" else - if test x"$host" = x"$target"; then - cc="cc" - else + if $cross_compiler; then err "No cross-compiler found for ${target}.\n" \ "It should be named ${TOOLPREF}gcc and be in the PATH." + else + cc="cc" fi fi else @@ -448,7 +457,7 @@ case $? in 1) err "The C compiler $cc is not ANSI-compliant.\n" \ "You need an ANSI C compiler to build OCaml.";; *) - if test x"$host" != x"$target"; then + if $cross_compiler; then wrn "Unable to compile the test program.\n" \ "This failure is expected for cross-compilation:\n" \ "we will assume the C compiler is ANSI-compliant." @@ -458,9 +467,9 @@ case $? in fi;; esac -# Determine which ocamlrun executable to use; for cross-compilation, a native -# "ocamlrun" executable must be available on the system. -if test x"$target" != x"$host"; then +# For cross-compilation, we need a host-based ocamlrun and ocamlyacc, +# and the user must specify the target BINDIR +if $cross_compiler; then if ! sh ./searchpath ocamlrun; then err "Cross-compilation requires an ocaml runtime environment\n" \ "(the ocamlrun binary). Moreover, its version must be the same\n" \ @@ -473,14 +482,28 @@ if test x"$target" != x"$host"; then "($ocaml_system_version) doesn't match the version of these sources\n" \ "($ocaml_source_version)." else - CAMLRUN="ocamlrun" + echo "CAMLRUN=`./searchpath -p ocamlrun`" >> Makefile fi fi -else - CAMLRUN=`cd ../.. && pwd`/boot/ocamlrun -fi -echo "CAMLRUN=$CAMLRUN" >> Makefile + if ! sh ./searchpath ocamlyacc; then + err "Cross-compilation requires an ocamlyacc binary." + else + ocamlyacc 2>/dev/null + if test "$?" -ne 1; then + err "While you have an ocamlyacc binary, it cannot be executed successfully." + else + echo "CAMLYACC=`./searchpath -p ocamlyacc`" >> Makefile + fi + fi + + if [ -z "$target_bindir" ]; then + err "Cross-compilation requires -target-bindir." + else + echo "TARGET_BINDIR=$target_bindir" >> Makefile + fi +fi # cross-compiler + # Check the sizes of data types # OCaml needs a 32 or 64 bit architecture, a 32-bit integer type and @@ -975,7 +998,8 @@ if (SHELL=/bin/sh; export SHELL; (./sharpbang || ./sharpbang2) >/dev/null); then "under Cygwin" echo "SHARPBANGSCRIPTS=false" >> Makefile;; *-*-mingw*) - inf "We won't use it, though, because it's on the target platform it would be used and windows doesn't support it." + inf "We won't use it, though, because it's on the target platform " \ + "it would be used and windows doesn't support it." echo "SHARPBANGSCRIPTS=false" >> Makefile;; *) echo "SHARPBANGSCRIPTS=true" >> Makefile;; diff --git a/debugger/Makefile.shared b/debugger/Makefile.shared index 645c3e1dd4..f3859c63d2 100644 --- a/debugger/Makefile.shared +++ b/debugger/Makefile.shared @@ -11,15 +11,15 @@ ######################################################################### include ../config/Makefile +CAMLRUN ?= ../boot/ocamlrun +CAMLYACC ?= ../boot/ocamlyacc -ROOTDIR=.. -CAMLC=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib +CAMLC=$(CAMLRUN) ../ocamlc -nostdlib -I ../stdlib COMPFLAGS=-warn-error A -safe-string $(INCLUDES) LINKFLAGS=-linkall -I $(UNIXDIR) -CAMLYACC=../boot/ocamlyacc YACCFLAGS= -CAMLLEX=../boot/ocamlrun ../boot/ocamllex -CAMLDEP=../boot/ocamlrun ../tools/ocamldep +CAMLLEX=$(CAMLRUN) ../boot/ocamllex +CAMLDEP=$(CAMLRUN) ../tools/ocamldep DEPFLAGS=$(INCLUDES) INSTALL_BINDIR=$(DESTDIR)$(BINDIR) diff --git a/driver/main.ml b/driver/main.ml index e31d00068a..076a969ee6 100644 --- a/driver/main.ml +++ b/driver/main.ml @@ -199,3 +199,7 @@ let main () = exit 2 let _ = main () + + + + diff --git a/lex/Makefile b/lex/Makefile index cb5df8b41c..3691cb2b3f 100644 --- a/lex/Makefile +++ b/lex/Makefile @@ -11,13 +11,17 @@ ######################################################################### # The lexer generator -CAMLC=../boot/ocamlrun ../boot/ocamlc -strict-sequence -nostdlib -I ../boot -CAMLOPT=../boot/ocamlrun ../ocamlopt -nostdlib -I ../stdlib +include ../config/Makefile +CAMLRUN ?= ../boot/ocamlrun +CAMLYACC ?= ../boot/ocamlyacc + +CAMLC=$(CAMLRUN) ../boot/ocamlc -strict-sequence -nostdlib -I ../boot +CAMLOPT=$(CAMLRUN) ../ocamlopt -nostdlib -I ../stdlib COMPFLAGS=-w +33..39 -warn-error A -bin-annot -safe-string -CAMLYACC=../boot/ocamlyacc +LINKFLAGS= YACCFLAGS=-v -CAMLLEX=../boot/ocamlrun ../boot/ocamllex -CAMLDEP=../boot/ocamlrun ../tools/ocamldep +CAMLLEX=$(CAMLRUN) ../boot/ocamllex +CAMLDEP=$(CAMLRUN) ../tools/ocamldep OBJS=cset.cmo syntax.cmo parser.cmo lexer.cmo table.cmo lexgen.cmo \ diff --git a/lex/Makefile.nt b/lex/Makefile.nt index 38c71f2e8a..6bd8560406 100644 --- a/lex/Makefile.nt +++ b/lex/Makefile.nt @@ -13,15 +13,16 @@ # The lexer generator include ../config/Makefile +CAMLRUN ?= ../boot/ocamlrun +CAMLYACC ?= ../boot/ocamlyacc -CAMLC=../boot/ocamlrun ../boot/ocamlc -I ../boot -CAMLOPT=../boot/ocamlrun ../ocamlopt -I ../stdlib +CAMLC=$(CAMLRUN) ../boot/ocamlc -I ../boot +CAMLOPT=$(CAMLRUN) ../ocamlopt -I ../stdlib COMPFLAGS=-warn-error A LINKFLAGS= -CAMLYACC=../boot/ocamlyacc YACCFLAGS=-v -CAMLLEX=../boot/ocamlrun ../boot/ocamllex -CAMLDEP=../boot/ocamlrun ../tools/ocamldep +CAMLLEX=$(CAMLRUN) ../boot/ocamllex +CAMLDEP=$(CAMLRUN) ../tools/ocamldep DEPFLAGS= OBJS=cset.cmo syntax.cmo parser.cmo lexer.cmo table.cmo lexgen.cmo \ diff --git a/ocamlbuild/Makefile b/ocamlbuild/Makefile index 0a4054ddbd..ffe57a52e4 100644 --- a/ocamlbuild/Makefile +++ b/ocamlbuild/Makefile @@ -11,13 +11,14 @@ ######################################################################### include ../config/Makefile +CAMLRUN ?= ../boot/ocamlrun +CAMLYACC ?= ../boot/ocamlyacc ROOTDIR = .. -OCAMLRUN = $(ROOTDIR)/boot/ocamlrun -OCAMLC = $(OCAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib -OCAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib -OCAMLDEP = $(OCAMLRUN) $(ROOTDIR)/tools/ocamldep -OCAMLLEX = $(OCAMLRUN) $(ROOTDIR)/boot/ocamllex +OCAMLC = $(CAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib +OCAMLOPT = $(CAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib +OCAMLDEP = $(CAMLRUN) $(ROOTDIR)/tools/ocamldep +OCAMLLEX = $(CAMLRUN) $(ROOTDIR)/boot/ocamllex CP = cp COMPFLAGS= -warn-error A -w L -w R -w Z -I ../otherlibs/$(UNIXLIB) -safe-string LINKFLAGS= -I ../otherlibs/$(UNIXLIB) diff --git a/ocamldoc/Makefile b/ocamldoc/Makefile index 7a487c6ca0..7c6d9885d7 100644 --- a/ocamldoc/Makefile +++ b/ocamldoc/Makefile @@ -11,16 +11,16 @@ #(***********************************************************************) include ../config/Makefile +CAMLRUN ?= ../boot/ocamlrun +CAMLYACC ?= ../boot/ocamlyacc # Various commands and dir ########################## ROOTDIR = .. -OCAMLRUN = $(ROOTDIR)/boot/ocamlrun -OCAMLC = $(OCAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib -OCAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib -OCAMLDEP = $(OCAMLRUN) $(ROOTDIR)/tools/ocamldep -OCAMLLEX = $(OCAMLRUN) $(ROOTDIR)/boot/ocamllex -OCAMLYACC = $(ROOTDIR)/yacc/ocamlyacc +OCAMLC = $(CAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib +OCAMLOPT = $(CAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib +OCAMLDEP = $(CAMLRUN) $(ROOTDIR)/tools/ocamldep +OCAMLLEX = $(CAMLRUN) $(ROOTDIR)/boot/ocamllex OCAMLLIB = $(LIBDIR) OCAMLBIN = $(BINDIR) @@ -233,10 +233,10 @@ odoc_see_lexer.ml: odoc_see_lexer.mll $(OCAMLLEX) $< .mly.ml: - $(OCAMLYACC) -v $< + $(CAMLYACC) -v $< .mly.mli: - $(OCAMLYACC) -v $< + $(CAMLYACC) -v $< # Installation targets ###################### @@ -343,8 +343,8 @@ clean:: dummy @rm -f generators/*.cm[aiox] generators/*.$(A) generators/*.$(O) generators/*.cmx[as] depend:: - $(OCAMLYACC) odoc_text_parser.mly - $(OCAMLYACC) odoc_parser.mly + $(CAMLYACC) odoc_text_parser.mly + $(CAMLYACC) odoc_parser.mly $(OCAMLLEX) odoc_text_lexer.mll $(OCAMLLEX) odoc_lexer.mll $(OCAMLLEX) odoc_ocamlhtml.mll diff --git a/ocamldoc/Makefile.nt b/ocamldoc/Makefile.nt index 22cd36eb03..9c009596be 100644 --- a/ocamldoc/Makefile.nt +++ b/ocamldoc/Makefile.nt @@ -11,16 +11,16 @@ #(***********************************************************************) include ../config/Makefile +CAMLRUN ?= ../boot/ocamlrun +CAMLYACC ?= ../boot/ocamlyacc # Various commands and dir ########################## ROOTDIR = .. -OCAMLRUN = $(ROOTDIR)/boot/ocamlrun -OCAMLC = $(OCAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib -OCAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib -OCAMLDEP = $(OCAMLRUN) $(ROOTDIR)/tools/ocamldep -OCAMLLEX = $(OCAMLRUN) $(ROOTDIR)/boot/ocamllex -OCAMLYACC = $(ROOTDIR)/yacc/ocamlyacc +OCAMLC = $(CAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib +OCAMLOPT = $(CAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib +OCAMLDEP = $(CAMLRUN) $(ROOTDIR)/tools/ocamldep +OCAMLLEX = $(CAMLRUN) $(ROOTDIR)/boot/ocamllex OCAMLLIB = $(LIBDIR) OCAMLBIN = $(BINDIR) @@ -202,10 +202,10 @@ odoc_see_lexer.ml: odoc_see_lexer.mll $(OCAMLLEX) $< .mly.ml: - $(OCAMLYACC) -v $< + $(CAMLYACC) -v $< .mly.mli: - $(OCAMLYACC) -v $< + $(CAMLYACC) -v $< # Installation targets ###################### @@ -240,8 +240,8 @@ clean:: dummy @rm -f generators/*.cm[aiox] generators/*.$(A) generators/*.$(O) generators/*.cmx[as] depend:: - $(OCAMLYACC) odoc_text_parser.mly - $(OCAMLYACC) odoc_parser.mly + $(CAMLYACC) odoc_text_parser.mly + $(CAMLYACC) odoc_parser.mly $(OCAMLLEX) odoc_text_lexer.mll $(OCAMLLEX) odoc_lexer.mll $(OCAMLLEX) odoc_ocamlhtml.mll diff --git a/otherlibs/Makefile b/otherlibs/Makefile index 8f8dc7157a..3ca2a487ff 100644 --- a/otherlibs/Makefile +++ b/otherlibs/Makefile @@ -13,8 +13,8 @@ # Common Makefile for otherlibs on the Unix ports -CAMLC=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib -CAMLOPT=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlopt -nostdlib \ +CAMLC=$(CAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib +CAMLOPT=$(CAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib \ -I $(ROOTDIR)/stdlib CFLAGS=-I$(ROOTDIR)/byterun $(SHAREDCCCOMPOPTS) $(EXTRACFLAGS) diff --git a/otherlibs/Makefile.shared b/otherlibs/Makefile.shared index 9bed5f7604..cb8bf1748c 100644 --- a/otherlibs/Makefile.shared +++ b/otherlibs/Makefile.shared @@ -15,10 +15,11 @@ ROOTDIR=../.. include $(ROOTDIR)/config/Makefile +CAMLRUN ?= $(ROOTDIR)/boot/ocamlrun +CAMLYACC ?= $(ROOTDIR)/boot/ocamlyacc # Compilation options CC=$(BYTECC) -CAMLRUN=$(ROOTDIR)/boot/ocamlrun COMPFLAGS=-w +33..39 -warn-error A -bin-annot -g -safe-string $(EXTRACAMLFLAGS) MKLIB=$(CAMLRUN) $(ROOTDIR)/tools/ocamlmklib diff --git a/otherlibs/bigarray/Makefile b/otherlibs/bigarray/Makefile index 3f9afd5fdb..3bcc7a4022 100644 --- a/otherlibs/bigarray/Makefile +++ b/otherlibs/bigarray/Makefile @@ -22,6 +22,6 @@ include ../Makefile depend: $(CC) -MM $(CFLAGS) *.c > .depend - ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend + $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/bigarray/Makefile.nt b/otherlibs/bigarray/Makefile.nt index 32642e107f..baeaa7a160 100644 --- a/otherlibs/bigarray/Makefile.nt +++ b/otherlibs/bigarray/Makefile.nt @@ -22,6 +22,6 @@ include ../Makefile.nt depend: $(CC) -MM $(CFLAGS) *.c > .depend - ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend + $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/dynlink/Makefile b/otherlibs/dynlink/Makefile index 0197d1db6b..acff7a7a68 100644 --- a/otherlibs/dynlink/Makefile +++ b/otherlibs/dynlink/Makefile @@ -16,11 +16,12 @@ # FIXME reduce redundancy by including ../Makefile include ../../config/Makefile +CAMLRUN ?= ../../boot/ocamlrun +CAMLYACC ?= ../../boot/ocamlyacc ROOTDIR = ../.. -OCAMLRUN = $(ROOTDIR)/boot/ocamlrun -OCAMLC = $(OCAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib -OCAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib +OCAMLC = $(CAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib +OCAMLOPT = $(CAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib INCLUDES=-I ../../utils -I ../../typing -I ../../bytecomp -I ../../asmcomp COMPFLAGS=-w +33..39 -warn-error A -bin-annot -g -safe-string \ @@ -71,7 +72,7 @@ dynlink.cmx: dynlink.cmi natdynlink.ml rm -f dynlink.mlopt extract_crc: dynlink.cma extract_crc.cmo - $(OCAMLC) $(COMPFLAGS) -o extract_crc dynlink.cma extract_crc.cmo + $(OCAMLC) -o extract_crc dynlink.cma extract_crc.cmo INSTALL_LIBDIR=$(DESTDIR)$(LIBDIR) diff --git a/otherlibs/graph/Makefile b/otherlibs/graph/Makefile index 2fb45807f2..850e02513e 100644 --- a/otherlibs/graph/Makefile +++ b/otherlibs/graph/Makefile @@ -27,6 +27,6 @@ include ../Makefile depend: $(CC) -MM $(CFLAGS) *.c | sed -e 's, /[^ ]*\.h,,g' > .depend - ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend + $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/num/Makefile b/otherlibs/num/Makefile index c867b2cd26..e08e02943f 100644 --- a/otherlibs/num/Makefile +++ b/otherlibs/num/Makefile @@ -32,6 +32,6 @@ bng.$(O): bng.h bng_digit.c \ depend: $(CC) -MM $(CFLAGS) *.c > .depend - ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend + $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/str/Makefile b/otherlibs/str/Makefile index 4a58d46744..93b2bf9539 100644 --- a/otherlibs/str/Makefile +++ b/otherlibs/str/Makefile @@ -28,6 +28,6 @@ str.cmx: str.cmi depend: $(CC) -MM $(CFLAGS) *.c > .depend - ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend + $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/systhreads/Makefile b/otherlibs/systhreads/Makefile index cc36a52c80..942a7b7869 100644 --- a/otherlibs/systhreads/Makefile +++ b/otherlibs/systhreads/Makefile @@ -12,13 +12,15 @@ ######################################################################### include ../../config/Makefile +CAMLRUN ?= ../../boot/ocamlrun +CAMLYACC ?= ../../boot/ocamlyacc ROOTDIR=../.. -CAMLC=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlc -nostdlib \ +CAMLC=$(CAMLRUN) $(ROOTDIR)/ocamlc -nostdlib \ -I $(ROOTDIR)/stdlib -I $(ROOTDIR)/otherlibs/unix -CAMLOPT=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlopt -nostdlib \ +CAMLOPT=$(CAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib \ -I $(ROOTDIR)/stdlib -I $(ROOTDIR)/otherlibs/unix -MKLIB=../../boot/ocamlrun ../../tools/ocamlmklib +MKLIB=$(CAMLRUN) ../../tools/ocamlmklib COMPFLAGS=-w +33..39 -warn-error A -g -bin-annot -safe-string BYTECODE_C_OBJS=st_stubs_b.o @@ -107,6 +109,6 @@ installopt: depend: $(GENFILES) -$(CC) -MM -I../../byterun *.c > .depend - ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend + $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/systhreads/Makefile.nt b/otherlibs/systhreads/Makefile.nt index 341176146f..22fb1c7179 100644 --- a/otherlibs/systhreads/Makefile.nt +++ b/otherlibs/systhreads/Makefile.nt @@ -12,12 +12,14 @@ ######################################################################### include ../../config/Makefile +CAMLRUN ?= ../../boot/ocamlrun +CAMLYACC ?= ../../boot/ocamlyacc # Compilation options -CAMLC=../../boot/ocamlrun ../../ocamlc -I ../../stdlib -I ../win32unix -CAMLOPT=../../boot/ocamlrun ../../ocamlopt -I ../../stdlib -I ../win32unix +CAMLC=$(CAMLRUN) ../../ocamlc -I ../../stdlib -I ../win32unix +CAMLOPT=$(CAMLRUN) ../../ocamlopt -I ../../stdlib -I ../win32unix COMPFLAGS=-w +33 -warn-error A -g -MKLIB=../../boot/ocamlrun ../../tools/ocamlmklib +MKLIB=$(CAMLRUN) ../../tools/ocamlmklib CFLAGS=-I../../byterun $(EXTRACFLAGS) CAMLOBJS=thread.cmo mutex.cmo condition.cmo event.cmo threadUnix.cmo @@ -32,7 +34,7 @@ all: lib$(LIBNAME).$(A) $(LIBNAME).cma $(CMIFILES) allopt: lib$(LIBNAME).$(A) $(LIBNAME).cmxa $(LIBNAME).cmxs $(CMIFILES) $(LIBNAME).cma: $(CAMLOBJS) - $(MKLIB) -o $(LIBNAME) -ocamlc "../../boot/ocamlrun ../../ocamlc" \ + $(MKLIB) -o $(LIBNAME) -ocamlc "$(CAMLRUN) ../../ocamlc" \ -linkall $(CAMLOBJS) $(LINKOPTS) lib$(LIBNAME).$(A): $(COBJS) @@ -46,7 +48,7 @@ st_stubs_b.$(O): st_stubs.c st_win32.h $(LIBNAME).cmxa: $(CAMLOBJS:.cmo=.cmx) $(MKLIB) -o $(LIBNAME)nat \ - -ocamlopt "../../boot/ocamlrun ../../ocamlopt" -linkall \ + -ocamlopt "$(CAMLRUN) ../../ocamlopt" -linkall \ $(CAMLOBJS:.cmo=.cmx) $(LINKOPTS) mv $(LIBNAME)nat.cmxa $(LIBNAME).cmxa mv $(LIBNAME)nat.$(A) $(LIBNAME).$(A) diff --git a/otherlibs/threads/Makefile b/otherlibs/threads/Makefile index 50fb422bae..de789afd74 100644 --- a/otherlibs/threads/Makefile +++ b/otherlibs/threads/Makefile @@ -14,13 +14,15 @@ # FIXME reduce redundancy by including ../Makefile include ../../config/Makefile +CAMLRUN ?= ../../boot/ocamlrun +CAMLYACC ?= ../../boot/ocamlyacc CC=$(BYTECC) CFLAGS=-I../../byterun $(BYTECCCOMPOPTS) $(SHAREDCCCOMPOPTS) -g ROOTDIR=../.. -CAMLC=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlc -nostdlib \ +CAMLC=$(CAMLRUN) $(ROOTDIR)/ocamlc -nostdlib \ -I $(ROOTDIR)/stdlib -I $(ROOTDIR)/otherlibs/unix -MKLIB=../../boot/ocamlrun ../../tools/ocamlmklib +MKLIB=$(CAMLRUN) ../../tools/ocamlmklib COMPFLAGS=-w +33..39 -warn-error A -bin-annot -g -safe-string C_OBJS=scheduler.o @@ -124,6 +126,6 @@ installopt: depend: $(CC) -MM $(CFLAGS) *.c > .depend - ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend + $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/unix/Makefile b/otherlibs/unix/Makefile index e41a1e1ddd..faebd3f5c8 100644 --- a/otherlibs/unix/Makefile +++ b/otherlibs/unix/Makefile @@ -42,6 +42,6 @@ include ../Makefile depend: $(CC) -MM $(CFLAGS) *.c > .depend - ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend + $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/stdlib/.ignore b/stdlib/.ignore index ad1b04e137..20d8653fe9 100644 --- a/stdlib/.ignore +++ b/stdlib/.ignore @@ -1,5 +1,7 @@ camlheader +target_camlheader camlheaderd +target_camlheaderd camlheader_ur labelled-* caml diff --git a/stdlib/Makefile b/stdlib/Makefile index 37f9a5f0bf..92fa3740ea 100644 --- a/stdlib/Makefile +++ b/stdlib/Makefile @@ -45,23 +45,28 @@ installopt-prof: stdlib.p.cmxa: $(OBJS:.cmo=.p.cmx) $(CAMLOPT) -a -o stdlib.p.cmxa $(OBJS:.cmo=.p.cmx) -camlheader camlheaderd camlheader_ur: header.c ../config/Makefile +camlheader target_camlheader camlheaderd target_camlheaderd camlheader_ur: \ + header.c ../config/Makefile if $(SHARPBANGSCRIPTS); then \ echo '#!$(BINDIR)/ocamlrun' > camlheader && \ + echo '#!$(TARGET_BINDIR)/ocamlrun' > target_camlheader && \ echo '#!$(BINDIR)/ocamlrund' > camlheaderd && \ + echo '#!$(TARGET_BINDIR)/ocamlrund' > target_camlheaderd && \ echo '#!' | tr -d '\012' > camlheader_ur; \ else \ - $(BYTECC) $(BYTECCCOMPOPTS) $(BYTECCLINKOPTS) \ - -DRUNTIME_NAME='"$(BINDIR)/ocamlrun"' \ - header.c -o tmpheader$(EXE) && \ - strip tmpheader$(EXE) && \ - mv tmpheader$(EXE) camlheader && \ - cp camlheader camlheader_ur && \ - $(BYTECC) $(BYTECCCOMPOPTS) $(BYTECCLINKOPTS) \ - -DRUNTIME_NAME='"$(BINDIR)/ocamlrund"' \ - header.c -o tmpheader$(EXE) && \ - strip tmpheader$(EXE) && \ - mv tmpheader$(EXE) camlheaderd; \ + for suff in '' d; do \ + $(BYTECC) $(BYTECCCOMPOPTS) $(BYTECCLINKOPTS) \ + -DRUNTIME_NAME='"$(BINDIR)/ocamlrun'$$suff'"' \ + header.c -o tmpheader$(EXE) && \ + strip tmpheader$(EXE) && \ + mv tmpheader$(EXE) camlheader$$suff && \ + $(BYTECC) $(BYTECCCOMPOPTS) $(BYTECCLINKOPTS) \ + -DRUNTIME_NAME='"$(TARGET_BINDIR)/ocamlrun'$$suff'"' \ + header.c -o tmpheader$(EXE) && \ + strip tmpheader$(EXE) && \ + mv tmpheader$(EXE) target_camlheader$$suff; \ + done && \ + cp camlheader camlheader_ur; \ fi .PHONY: all allopt allopt-noprof allopt-prof install installopt diff --git a/stdlib/Makefile.nt b/stdlib/Makefile.nt index 590701bf92..5bc2e0edfa 100644 --- a/stdlib/Makefile.nt +++ b/stdlib/Makefile.nt @@ -18,19 +18,21 @@ allopt: stdlib.cmxa std_exit.cmx installopt: cp stdlib.cmxa stdlib.$(A) std_exit.$(O) *.cmx $(INSTALL_LIBDIR) -camlheader camlheader_ur: headernt.c ../config/Makefile +camlheader target_camlheader camlheader_ur: headernt.c ../config/Makefile $(BYTECC) $(BYTECCCOMPOPTS) -c -I../byterun \ -DRUNTIME_NAME='"ocamlrun"' headernt.c $(MKEXE) -o tmpheader.exe headernt.$(O) $(EXTRALIBS) rm -f camlheader.exe mv tmpheader.exe camlheader + cp camlheader target_camlheader cp camlheader camlheader_ur -camlheaderd: headernt.c ../config/Makefile +camlheaderd target_camlheaderd: headernt.c ../config/Makefile $(BYTECC) $(BYTECCCOMPOPTS) -c -I../byterun \ -DRUNTIME_NAME='"ocamlrund"' headernt.c $(MKEXE) -o tmpheader.exe headernt.$(O) $(EXTRALIBS) mv tmpheader.exe camlheaderd + cp camlheaderd target_camlheaderd # TODO: do not call flexlink to build tmpheader.exe (we don't need # the export table) diff --git a/stdlib/Makefile.shared b/stdlib/Makefile.shared index 54de337cb4..8bc6e1bcd9 100755 --- a/stdlib/Makefile.shared +++ b/stdlib/Makefile.shared @@ -12,14 +12,17 @@ ######################################################################### include ../config/Makefile -RUNTIME=../boot/ocamlrun +CAMLRUN ?= ../boot/ocamlrun +CAMLYACC ?= ../boot/ocamlyacc +TARGET_BINDIR ?= $(BINDIR) + COMPILER=../ocamlc -CAMLC=$(RUNTIME) $(COMPILER) +CAMLC=$(CAMLRUN) $(COMPILER) COMPFLAGS=-strict-sequence -w +33..39 -g -warn-error A -bin-annot -nostdlib \ -safe-string OPTCOMPILER=../ocamlopt -CAMLOPT=$(RUNTIME) $(OPTCOMPILER) -CAMLDEP=../boot/ocamlrun ../tools/ocamldep +CAMLOPT=$(CAMLRUN) $(OPTCOMPILER) +CAMLDEP=$(CAMLRUN) ../tools/ocamldep OBJS=camlinternalFormatBasics.cmo pervasives.cmo $(OTHERS) OTHERS=array.cmo list.cmo char.cmo bytes.cmo string.cmo sys.cmo \ @@ -37,19 +40,20 @@ OTHERS=array.cmo list.cmo char.cmo bytes.cmo string.cmo sys.cmo \ arrayLabels.cmo listLabels.cmo bytesLabels.cmo \ stringLabels.cmo moreLabels.cmo stdLabels.cmo -all: stdlib.cma std_exit.cmo camlheader camlheader_ur +all: stdlib.cma std_exit.cmo camlheader target_camlheader camlheader_ur INSTALL_LIBDIR=$(DESTDIR)$(LIBDIR) install: install-$(RUNTIMED) - cp stdlib.cma std_exit.cmo *.cmi *.mli *.ml camlheader camlheader_ur \ + cp stdlib.cma std_exit.cmo *.cmi *.mli *.ml camlheader_ur \ $(INSTALL_LIBDIR) + cp target_camlheader $(INSTALL_LIBDIR)/camlheader install-noruntimed: .PHONY: install-noruntimed -install-runtimed: camlheaderd - cp camlheaderd $(INSTALL_LIBDIR) +install-runtimed: target_camlheaderd + cp target_camlheaderd $(INSTALL_LIBDIR)/camlheaderd .PHONY: install-runtimed stdlib.cma: $(OBJS) @@ -65,7 +69,7 @@ clean:: rm -f sys.ml clean:: - rm -f camlheader camlheader_ur camlheaderd + rm -f camlheader target_camlheader camlheader_ur target_camlheaderd .SUFFIXES: .mli .ml .cmi .cmo .cmx .p.cmx diff --git a/tools/Makefile.shared b/tools/Makefile.shared index 5b34c868d9..0b90cd32b5 100644 --- a/tools/Makefile.shared +++ b/tools/Makefile.shared @@ -11,8 +11,9 @@ ######################################################################### include ../config/Makefile +CAMLRUN ?= ../boot/ocamlrun +CAMLYACC ?= ../boot/ocamlyacc -CAMLRUN=../boot/ocamlrun CAMLC=$(CAMLRUN) ../boot/ocamlc -nostdlib -I ../boot CAMLOPT=$(CAMLRUN) ../ocamlopt -nostdlib -I ../stdlib CAMLLEX=$(CAMLRUN) ../boot/ocamllex From 7a33be2b973dd8eee509bedfdece5fe0862c2edb Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 12 May 2015 15:31:26 +0000 Subject: [PATCH 260/494] PR#6845: -no-check-prims to tell ocamlc not to check primitives in runtime git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16115 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + bytecomp/symtable.ml | 4 +++- driver/main.ml | 1 + driver/main_args.ml | 7 +++++++ driver/main_args.mli | 1 + tools/ocamlcp.ml | 1 + utils/clflags.ml | 1 + utils/clflags.mli | 1 + 8 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 6f2cf62096..c84c905b6e 100644 --- a/Changes +++ b/Changes @@ -20,6 +20,7 @@ Compilers: - PR#6797: new option -output-complete-obj to output an object file with included runtime and autolink libraries (Peter Zotov) +- PR#6845: -no-check-prims to tell ocamlc not to check primitives in runtime - GPR#159: Better locations for structure/signature items (Leo White) - GPR#149: Attach documentation comments to parse tree (Leo White) diff --git a/bytecomp/symtable.ml b/bytecomp/symtable.ml index fbec1deb5a..a0ce27373e 100644 --- a/bytecomp/symtable.ml +++ b/bytecomp/symtable.ml @@ -81,7 +81,9 @@ let num_of_prim name = try find_numtable !c_prim_table name with Not_found -> - if !Clflags.custom_runtime || Config.host <> Config.target then + if !Clflags.custom_runtime || Config.host <> Config.target + || !Clflags.no_check_prims + then enter_numtable c_prim_table name else begin let symb = diff --git a/driver/main.ml b/driver/main.ml index 076a969ee6..e3c59c9e7f 100644 --- a/driver/main.ml +++ b/driver/main.ml @@ -83,6 +83,7 @@ module Options = Main_args.Make_bytecomp_options (struct let _compat_32 = set bytecode_compatible_32 let _config = show_config let _custom = set custom_runtime + let _no_check_prims = set no_check_prims let _dllib s = dllibs := Misc.rev_split_words s @ !dllibs let _dllpath s = dllpaths := !dllpaths @ [s] let _for_pack s = for_package := Some s diff --git a/driver/main_args.ml b/driver/main_args.ml index e3352669bc..f5d7e3164d 100644 --- a/driver/main_args.ml +++ b/driver/main_args.ml @@ -164,6 +164,10 @@ let mk_no_app_funct f = "-no-app-funct", Arg.Unit f, " Deactivate applicative functors" ;; +let mk_no_check_prims f = + "-no-check-prims", Arg.Unit f, " Do not check runtime for primitives" +;; + let mk_no_float_const_prop f = "-no-float-const-prop", Arg.Unit f, " Deactivate constant propagation for floating-point operations" @@ -552,6 +556,7 @@ module type Bytecomp_options = sig include Compiler_options val _compat_32 : unit -> unit val _custom : unit -> unit + val _no_check_prims : unit -> unit val _dllib : string -> unit val _dllpath : string -> unit val _make_runtime : unit -> unit @@ -653,6 +658,7 @@ struct mk_compat_32 F._compat_32; mk_config F._config; mk_custom F._custom; + mk_custom F._no_check_prims; mk_dllib F._dllib; mk_dllpath F._dllpath; mk_dtypes F._annot; @@ -673,6 +679,7 @@ struct mk_modern F._labels; mk_no_alias_deps F._no_alias_deps; mk_no_app_funct F._no_app_funct; + mk_no_check_prims F._no_check_prims; mk_noassert F._noassert; mk_noautolink_byt F._noautolink; mk_nolabels F._nolabels; diff --git a/driver/main_args.mli b/driver/main_args.mli index cdcd4d0582..ddee921d4b 100644 --- a/driver/main_args.mli +++ b/driver/main_args.mli @@ -90,6 +90,7 @@ module type Bytecomp_options = sig include Compiler_options val _compat_32 : unit -> unit val _custom : unit -> unit + val _no_check_prims : unit -> unit val _dllib : string -> unit val _dllpath : string -> unit val _make_runtime : unit -> unit diff --git a/tools/ocamlcp.ml b/tools/ocamlcp.ml index c8d26d2449..26ced6c567 100644 --- a/tools/ocamlcp.ml +++ b/tools/ocamlcp.ml @@ -68,6 +68,7 @@ module Options = Main_args.Make_bytecomp_options (struct let _make_runtime = option "-make-runtime" let _no_alias_deps = option "-no-alias-deps" let _no_app_funct = option "-no-app-funct" + let _no_check_prims = option "-no-check-prims" let _noassert = option "-noassert" let _nolabels = option "-nolabels" let _noautolink = option "-noautolink" diff --git a/utils/clflags.ml b/utils/clflags.ml index 6a9d5781a9..864d68888b 100644 --- a/utils/clflags.ml +++ b/utils/clflags.ml @@ -26,6 +26,7 @@ and debug = ref false (* -g *) and fast = ref false (* -unsafe *) and link_everything = ref false (* -linkall *) and custom_runtime = ref false (* -custom *) +and no_check_prims = ref false (* -no-check-prims *) and bytecode_compatible_32 = ref false (* -compat-32 *) and output_c_object = ref false (* -output-obj *) and output_complete_object = ref false (* -output-complete-obj *) diff --git a/utils/clflags.mli b/utils/clflags.mli index 26adb9d684..aeed7d977c 100644 --- a/utils/clflags.mli +++ b/utils/clflags.mli @@ -23,6 +23,7 @@ val debug : bool ref val fast : bool ref val link_everything : bool ref val custom_runtime : bool ref +val no_check_prims : bool ref val bytecode_compatible_32 : bool ref val output_c_object : bool ref val output_complete_object : bool ref From 4ba1669850ddf60bd3d0dd4cf8f4a0a68b771642 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 12 May 2015 17:33:49 +0000 Subject: [PATCH 261/494] PR#5822: wrong value of Options.ext_dll on windows git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16117 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + ocamlbuild/Makefile | 15 ++++++++------- ocamlbuild/options.ml | 4 +++- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/Changes b/Changes index c84c905b6e..20d51468c9 100644 --- a/Changes +++ b/Changes @@ -70,6 +70,7 @@ Bug fixes: (Damien Doligez, report by Rolf Rolles) - PR#5395: OCamlbuild mishandles relative symlinks and include paths (Damien Doligez, report by Didier Le Botlan) +- PR#5822: wrong value of Options.ext_dll on windows - PR#5836, PR#6684: printing lazy values in ocamldebug may segfault (Gabriel Scherer) - PR#5887: move the byterun/*.h headers to byterun/caml/*.h to avoid diff --git a/ocamlbuild/Makefile b/ocamlbuild/Makefile index ffe57a52e4..d302d20687 100644 --- a/ocamlbuild/Makefile +++ b/ocamlbuild/Makefile @@ -138,13 +138,14 @@ ocamlbuild_pack.cmx: $(PACK_CMX) ocamlbuild_config.ml: ../config/Makefile (echo 'let bindir = "$(BINDIR)"'; \ - echo 'let libdir = "$(LIBDIR)"'; \ - echo 'let supports_shared_libraries = $(SUPPORTS_SHARED_LIBRARIES)';\ - echo 'let a = "$(A)"'; \ - echo 'let o = "$(O)"'; \ - echo 'let so = "$(SO)"'; \ - echo 'let exe = "$(EXE)"'; \ - ) > ocamlbuild_config.ml + echo 'let libdir = "$(LIBDIR)"'; \ + echo 'let supports_shared_libraries = $(SUPPORTS_SHARED_LIBRARIES)';\ + echo 'let a = "$(A)"'; \ + echo 'let o = "$(O)"'; \ + echo 'let so = "$(SO)"'; \ + echo 'let ext_dll = "$(EXT_DLL)"'; \ + echo 'let exe = "$(EXE)"'; \ + ) > ocamlbuild_config.ml clean:: rm -f ocamlbuild_config.ml beforedepend:: ocamlbuild_config.ml diff --git a/ocamlbuild/options.ml b/ocamlbuild/options.ml index 5193b9b904..3d4393d38b 100644 --- a/ocamlbuild/options.ml +++ b/ocamlbuild/options.ml @@ -101,7 +101,9 @@ let show_documentation = ref false let recursive = ref false let ext_lib = ref Ocamlbuild_config.a let ext_obj = ref Ocamlbuild_config.o -let ext_dll = ref Ocamlbuild_config.so +let ext_dll = + let s = Ocamlbuild_config.ext_dll in + ref (String.sub s 1 (String.length s - 1)) let exe = ref Ocamlbuild_config.exe let targets_internal = ref [] From 9399325ba68024292deb2eeb1f81a56af6d2da6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Dimino?= <jeremie@dimino.org> Date: Fri, 15 May 2015 08:45:46 +0000 Subject: [PATCH 262/494] PR6865: Fix parsing of toplevel [let%foo _ = expr] git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16118 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- parsing/parser.mly | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/parsing/parser.mly b/parsing/parser.mly index f7d5316450..2e8a64502a 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -345,27 +345,29 @@ let addlb lbs lb = { lbs with lbs_bindings = lb :: lbs.lbs_bindings } let val_of_let_bindings lbs = - match lbs.lbs_bindings with - | [ {lb_pattern = { ppat_desc = Ppat_any; ppat_loc = _ }; _} as lb ] -> - let exp = wrap_exp_attrs lb.lb_expression - (lbs.lbs_extension, lbs.lbs_attributes) in - mkstr (Pstr_eval (exp, lb.lb_attributes)) - | bindings -> - let bindings = - List.map - (fun lb -> - Vb.mk ~loc:lb.lb_loc ~attrs:lb.lb_attributes - ~docs:(Lazy.force lb.lb_docs) - ~text:(Lazy.force lb.lb_text) - lb.lb_pattern lb.lb_expression) - bindings - in - let str = mkstr(Pstr_value(lbs.lbs_rec, List.rev bindings)) in - if lbs.lbs_attributes <> [] then - raise Syntaxerr.(Error(Not_expecting(lbs.lbs_loc, "attributes"))); - match lbs.lbs_extension with - | None -> str - | Some id -> ghstr (Pstr_extension((id, PStr [str]), [])) + let str = + match lbs.lbs_bindings with + | [ {lb_pattern = { ppat_desc = Ppat_any; ppat_loc = _ }; _} as lb ] -> + let exp = wrap_exp_attrs lb.lb_expression + (None, lbs.lbs_attributes) in + mkstr (Pstr_eval (exp, lb.lb_attributes)) + | bindings -> + if lbs.lbs_attributes <> [] then + raise Syntaxerr.(Error(Not_expecting(lbs.lbs_loc, "attributes"))); + let bindings = + List.map + (fun lb -> + Vb.mk ~loc:lb.lb_loc ~attrs:lb.lb_attributes + ~docs:(Lazy.force lb.lb_docs) + ~text:(Lazy.force lb.lb_text) + lb.lb_pattern lb.lb_expression) + bindings + in + mkstr(Pstr_value(lbs.lbs_rec, List.rev bindings)) + in + match lbs.lbs_extension with + | None -> str + | Some id -> ghstr (Pstr_extension((id, PStr [str]), [])) let expr_of_let_bindings lbs body = let bindings = From 52a39cc58c233938bd7224e187e8a991bf54739c Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Fri, 15 May 2015 16:49:18 +0000 Subject: [PATCH 263/494] GPR#157: store the path of cmos inside debug section at link time git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16119 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ bytecomp/bytelink.ml | 17 ++++++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Changes b/Changes index 20d51468c9..e49264fdaf 100644 --- a/Changes +++ b/Changes @@ -168,6 +168,8 @@ Feature wishes: (Jacques Garrigue, request by Jun Furuse) - GPR#139: more versatile specification of locations of .annot (Christophe Troestler, review by Damien Doligez) +- GPR#157: store the path of cmos inside debug section at link time + (Hugo Heuzard, review by Damien Doligez) OCaml 4.02.1: ------------- diff --git a/bytecomp/bytelink.ml b/bytecomp/bytelink.ml index 67072678a6..2f5c0ec478 100644 --- a/bytecomp/bytelink.ml +++ b/bytecomp/bytelink.ml @@ -197,7 +197,7 @@ let clear_crc_interfaces () = (* Record compilation events *) -let debug_info = ref ([] : (int * LongString.t) list) +let debug_info = ref ([] : (int * Instruct.debug_event list * string list) list) (* Link in a compilation unit *) @@ -208,8 +208,14 @@ let link_compunit ppf output_fun currpos_fun inchan file_name compunit = Symtable.ls_patch_object code_block compunit.cu_reloc; if !Clflags.debug && compunit.cu_debug > 0 then begin seek_in inchan compunit.cu_debug; - let buffer = LongString.input_bytes inchan compunit.cu_debugsize in - debug_info := (currpos_fun(), buffer) :: !debug_info + let debug_event_list : Instruct.debug_event list = input_value inchan in + let debug_dirs : string list = input_value inchan in + let file_path = Filename.dirname (Location.absolute_path file_name) in + let debug_dirs = + if List.mem file_path debug_dirs + then debug_dirs + else file_path :: debug_dirs in + debug_info := (currpos_fun(), debug_event_list, debug_dirs) :: !debug_info end; Array.iter output_fun code_block; if !Clflags.link_everything then @@ -264,9 +270,10 @@ let link_file ppf output_fun currpos_fun = function let output_debug_info oc = output_binary_int oc (List.length !debug_info); List.iter - (fun (ofs, evl) -> + (fun (ofs, evl, debug_dirs) -> output_binary_int oc ofs; - Array.iter (output_bytes oc) evl) + output_value oc evl; + output_value oc debug_dirs) !debug_info; debug_info := [] From 9a73ad6fc0e833b42664ea89f2353be1c156a5cd Mon Sep 17 00:00:00 2001 From: Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> Date: Sun, 17 May 2015 02:33:19 +0000 Subject: [PATCH 264/494] Fix PR#6872 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16120 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ testsuite/tests/typing-warnings/pr6872.ml | 9 +++++ .../pr6872.ml.principal.reference | 35 +++++++++++++++++++ .../tests/typing-warnings/pr6872.ml.reference | 30 ++++++++++++++++ typing/typecore.ml | 1 + 5 files changed, 77 insertions(+) create mode 100644 testsuite/tests/typing-warnings/pr6872.ml create mode 100644 testsuite/tests/typing-warnings/pr6872.ml.principal.reference create mode 100644 testsuite/tests/typing-warnings/pr6872.ml.reference diff --git a/Changes b/Changes index e49264fdaf..1ae8576e8c 100644 --- a/Changes +++ b/Changes @@ -148,6 +148,8 @@ Bug fixes: - PR#6849: Inverted pattern unification error - PR#6857: __MODULE__ doesn't give the current module with -o - PR#6862: Exhaustiveness check wrong for class constructor arguments +- PR#6872: Type-directed propagation fails to disambiguate variants + that are also exception constructors - GPR#143: fix getsockopt behaviour for boolean socket options (Anil Madhavapeddy and Andrew Ray) - ocamlbuild on cygwin cannot find ocamlfind diff --git a/testsuite/tests/typing-warnings/pr6872.ml b/testsuite/tests/typing-warnings/pr6872.ml new file mode 100644 index 0000000000..6eba3e7011 --- /dev/null +++ b/testsuite/tests/typing-warnings/pr6872.ml @@ -0,0 +1,9 @@ +exception A;; +type a = A;; + +A;; +raise A;; +fun (A : a) -> ();; +function Not_found -> 1 | A -> 2 | _ -> 3;; +try raise A with A -> 2;; + diff --git a/testsuite/tests/typing-warnings/pr6872.ml.principal.reference b/testsuite/tests/typing-warnings/pr6872.ml.principal.reference new file mode 100644 index 0000000000..0227cfd9c1 --- /dev/null +++ b/testsuite/tests/typing-warnings/pr6872.ml.principal.reference @@ -0,0 +1,35 @@ + +# exception A +# type a = A +# Characters 1-2: + A;; + ^ +Warning 41: A belongs to several types: a exn +The first one was selected. Please disambiguate if this is wrong. +- : a = A +# Characters 6-7: + raise A;; + ^ +Warning 42: this use of A required disambiguation. +Exception: A. +# - : a -> unit = <fun> +# Characters 26-27: + function Not_found -> 1 | A -> 2 | _ -> 3;; + ^ +Warning 41: A belongs to several types: a exn +The first one was selected. Please disambiguate if this is wrong. +Characters 26-27: + function Not_found -> 1 | A -> 2 | _ -> 3;; + ^ +Error: This pattern matches values of type a + but a pattern was expected which matches values of type exn +# Characters 10-11: + try raise A with A -> 2;; + ^ +Warning 42: this use of A required disambiguation. +Characters 17-18: + try raise A with A -> 2;; + ^ +Warning 42: this use of A required disambiguation. +- : int = 2 +# diff --git a/testsuite/tests/typing-warnings/pr6872.ml.reference b/testsuite/tests/typing-warnings/pr6872.ml.reference new file mode 100644 index 0000000000..7aeebbebf1 --- /dev/null +++ b/testsuite/tests/typing-warnings/pr6872.ml.reference @@ -0,0 +1,30 @@ + +# exception A +# type a = A +# Characters 1-2: + A;; + ^ +Warning 41: A belongs to several types: a exn +The first one was selected. Please disambiguate if this is wrong. +- : a = A +# Characters 6-7: + raise A;; + ^ +Warning 42: this use of A required disambiguation. +Exception: A. +# - : a -> unit = <fun> +# Characters 26-27: + function Not_found -> 1 | A -> 2 | _ -> 3;; + ^ +Warning 42: this use of A required disambiguation. +- : exn -> int = <fun> +# Characters 10-11: + try raise A with A -> 2;; + ^ +Warning 42: this use of A required disambiguation. +Characters 17-18: + try raise A with A -> 2;; + ^ +Warning 42: this use of A required disambiguation. +- : int = 2 +# diff --git a/typing/typecore.ml b/typing/typecore.ml index 7fe44f7f58..aad947dd5a 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -282,6 +282,7 @@ let extract_concrete_record env ty = let extract_concrete_variant env ty = match extract_concrete_typedecl env ty with (p0, p, {type_kind=Type_variant cstrs}) -> (p0, p, cstrs) + | (p0, p, {type_kind=Type_open}) -> (p0, p, []) | _ -> raise Not_found let extract_label_names sexp env ty = From 0415aa680cda8a28de1094836288540d082f2c03 Mon Sep 17 00:00:00 2001 From: Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> Date: Sun, 17 May 2015 03:09:49 +0000 Subject: [PATCH 265/494] Fix PR#6870 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16123 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- testsuite/tests/typing-rectypes-bugs/pr6870_bad.ml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 testsuite/tests/typing-rectypes-bugs/pr6870_bad.ml diff --git a/testsuite/tests/typing-rectypes-bugs/pr6870_bad.ml b/testsuite/tests/typing-rectypes-bugs/pr6870_bad.ml new file mode 100644 index 0000000000..ed83460555 --- /dev/null +++ b/testsuite/tests/typing-rectypes-bugs/pr6870_bad.ml @@ -0,0 +1,2 @@ +module type T = sig type 'a t end +module Fix (T : T) = struct type r = ('r T.t as 'r) end From d49bea27ab367492cac6d08fed2b874809038a21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Dimino?= <jeremie@dimino.org> Date: Mon, 18 May 2015 09:09:37 +0000 Subject: [PATCH 266/494] PR#6452, GPR#140: add internal support for custom printing formats git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16124 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ stdlib/camlinternalFormat.ml | 44 +++++++++++++++++++++++++++++ stdlib/camlinternalFormatBasics.ml | 43 ++++++++++++++++++++++++++++ stdlib/camlinternalFormatBasics.mli | 15 ++++++++++ stdlib/scanf.ml | 4 +++ typing/typecore.ml | 5 ++++ 6 files changed, 113 insertions(+) diff --git a/Changes b/Changes index 1ae8576e8c..a732e0c501 100644 --- a/Changes +++ b/Changes @@ -172,6 +172,8 @@ Feature wishes: (Christophe Troestler, review by Damien Doligez) - GPR#157: store the path of cmos inside debug section at link time (Hugo Heuzard, review by Damien Doligez) +- PR#6452, GPR#140: add internal suport for custom printing formats + (Jérémie Dimino) OCaml 4.02.1: ------------- diff --git a/stdlib/camlinternalFormat.ml b/stdlib/camlinternalFormat.ml index 183a07eef9..8de12bb823 100644 --- a/stdlib/camlinternalFormat.ml +++ b/stdlib/camlinternalFormat.ml @@ -475,6 +475,7 @@ fun buf fmtty -> match fmtty with | Bool_ty rest -> buffer_add_string buf "%B"; bprint_fmtty buf rest; | Alpha_ty rest -> buffer_add_string buf "%a"; bprint_fmtty buf rest; | Theta_ty rest -> buffer_add_string buf "%t"; bprint_fmtty buf rest; + | Any_ty rest -> buffer_add_string buf "%?"; bprint_fmtty buf rest; | Reader_ty rest -> buffer_add_string buf "%r"; bprint_fmtty buf rest; | Ignored_reader_ty rest -> @@ -492,6 +493,12 @@ fun buf fmtty -> match fmtty with (***) +let rec int_of_custom_arity : type a b c d . + (a, b, c, d) custom_arity -> int = + function + | Custom_zero -> 0 + | Custom_succ x -> 1 + int_of_custom_arity x + (* Print a complete format in a buffer. *) let bprint_fmt buf fmt = let rec fmtiter : type a b c d e f . @@ -537,6 +544,12 @@ let bprint_fmt buf fmt = | Theta rest -> buffer_add_char buf '%'; bprint_ignored_flag buf ign_flag; buffer_add_char buf 't'; fmtiter rest false; + | Custom (arity, _, rest) -> + for _i = 1 to int_of_custom_arity arity do + buffer_add_char buf '%'; bprint_ignored_flag buf ign_flag; + buffer_add_char buf '?'; + done; + fmtiter rest false; | Reader rest -> buffer_add_char buf '%'; bprint_ignored_flag buf ign_flag; buffer_add_char buf 'r'; fmtiter rest false; @@ -623,6 +636,7 @@ let rec symm : type a1 b1 c1 d1 e1 f1 a2 b2 c2 d2 e2 f2 . | String_ty rest -> String_ty (symm rest) | Theta_ty rest -> Theta_ty (symm rest) | Alpha_ty rest -> Alpha_ty (symm rest) + | Any_ty rest -> Any_ty (symm rest) | Reader_ty rest -> Reader_ty (symm rest) | Ignored_reader_ty rest -> Ignored_reader_ty (symm rest) | Format_arg_ty (ty, rest) -> @@ -695,6 +709,11 @@ let rec fmtty_rel_det : type a1 b c d1 e1 f1 a2 d2 e2 f2 . (fun Refl -> let Refl = fa Refl in Refl), (fun Refl -> let Refl = af Refl in Refl), ed, de + | Any_ty rest -> + let fa, af, ed, de = fmtty_rel_det rest in + (fun Refl -> let Refl = fa Refl in Refl), + (fun Refl -> let Refl = af Refl in Refl), + ed, de | Reader_ty rest -> let fa, af, ed, de = fmtty_rel_det rest in (fun Refl -> let Refl = fa Refl in Refl), @@ -765,6 +784,10 @@ and trans : type | Theta_ty _, _ -> assert false | _, Theta_ty _ -> assert false + | Any_ty rest1, Any_ty rest2 -> Any_ty (trans rest1 rest2) + | Any_ty _, _ -> assert false + | _, Any_ty _ -> assert false + | Reader_ty rest1, Reader_ty rest2 -> Reader_ty (trans rest1 rest2) | Reader_ty _, _ -> assert false | _, Reader_ty _ -> assert false @@ -835,6 +858,7 @@ fun fmtty -> match fmtty with | Bool rest -> Bool_ty (fmtty_of_fmt rest) | Alpha rest -> Alpha_ty (fmtty_of_fmt rest) | Theta rest -> Theta_ty (fmtty_of_fmt rest) + | Custom (arity, _, rest) -> fmtty_of_custom arity (fmtty_of_fmt rest) | Reader rest -> Reader_ty (fmtty_of_fmt rest) | Format_arg (_, ty, rest) -> @@ -856,6 +880,13 @@ fun fmtty -> match fmtty with | End_of_format -> End_of_fmtty +and fmtty_of_custom : type x y a b c d e f . + (c, a, x, y) custom_arity -> (a, b, c, d, e, f) fmtty -> + (y, b, c, d, e, f) fmtty = +fun arity fmtty -> match arity with + | Custom_zero -> fmtty + | Custom_succ arity -> Any_ty (fmtty_of_custom arity fmtty) + (* Extract the fmtty of an ignored parameter followed by the rest of the format. *) and fmtty_of_ignored_format : type x y a b c d e f . @@ -1404,6 +1435,8 @@ fun k o acc fmt -> match fmt with fun f x -> make_printf k o (Acc_delay (acc, fun o -> f o x)) rest | Theta rest -> fun f -> make_printf k o (Acc_delay (acc, f)) rest + | Custom (arity, f, rest) -> + make_custom k o acc rest arity f | Reader _ -> (* This case is impossible, by typing of formats. *) (* Indeed, since printf and co. take a format4 as argument, the 'd and 'e @@ -1503,6 +1536,7 @@ fun k o acc fmtty fmt -> match fmtty with | Bool_ty rest -> fun _ -> make_from_fmtty k o acc rest fmt | Alpha_ty rest -> fun _ _ -> make_from_fmtty k o acc rest fmt | Theta_ty rest -> fun _ -> make_from_fmtty k o acc rest fmt + | Any_ty rest -> fun _ -> make_from_fmtty k o acc rest fmt | Reader_ty _ -> assert false | Ignored_reader_ty _ -> assert false | Format_arg_ty (_, rest) -> fun _ -> make_from_fmtty k o acc rest fmt @@ -1629,6 +1663,16 @@ and make_float_padding_precision : type x y a b c d e f . let str = fix_padding padty w (convert_float fconv p x) in make_printf k o (Acc_data_string (acc, str)) fmt +and make_custom : type x y a b c d e f . + (b -> (b, c) acc -> f) -> b -> (b, c) acc -> + (a, b, c, d, e, f) fmt -> + (c, a, x, y) custom_arity -> (b -> x) -> y = + fun k o acc rest arity f -> match arity with + | Custom_zero -> make_printf k o (Acc_delay (acc, f)) rest + | Custom_succ arity -> + fun x -> + make_custom k o acc rest arity (fun o -> f o x) + (******************************************************************************) (* Continuations for make_printf *) diff --git a/stdlib/camlinternalFormatBasics.ml b/stdlib/camlinternalFormatBasics.ml index f45f434c8f..28b72d8763 100644 --- a/stdlib/camlinternalFormatBasics.ml +++ b/stdlib/camlinternalFormatBasics.ml @@ -65,6 +65,12 @@ type ('a, 'b) precision = only accept an optional number as precision option (no extra argument) *) type prec_option = int option +(* see the Custom format combinator *) +type ('a, 'b, 'c, 'd) custom_arity = + | Custom_zero : ('a, 'b, 'a, 'b) custom_arity + | Custom_succ : ('a, 'b, 'c, 'd) custom_arity -> + ('a, 'b, 'x -> 'c, 'x -> 'd) custom_arity + (***) (* Relational format types @@ -306,6 +312,11 @@ and ('a1, 'b1, 'c1, 'd1, 'e1, 'f1, 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel -> (('b1 -> 'c1) -> 'a1, 'b1, 'c1, 'd1, 'e1, 'f1, ('b2 -> 'c2) -> 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel + | Any_ty : (* Used for custom formats *) + ('a1, 'b1, 'c1, 'd1, 'e1, 'f1, + 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel -> + ('x -> 'a1, 'b1, 'c1, 'd1, 'e1, 'f1, + 'x -> 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel (* Scanf specific constructor. *) | Reader_ty : (* %r *) @@ -417,6 +428,32 @@ and ('a, 'b, 'c, 'd, 'e, 'f) fmt = ('a, 'b, 'c, 'd, 'y, 'x) ignored * ('x, 'b, 'c, 'y, 'e, 'f) fmt -> ('a, 'b, 'c, 'd, 'e, 'f) fmt + (* Custom printing format (PR#6452, GPR#140) + + We include a type Custom of "custom converters", where an + arbitrary function can be used to convert one or more + arguments. There is no syntax for custom converters, it is only + inteded for custom processors that wish to rely on the + stdlib-defined format GADTs. + + For instance a pre-processor could choose to interpret strings + prefixed with ["!"] as format strings where [%{{ ... }}] is + a special form to pass a to_string function, so that one could + write: + + {[ + type t = { x : int; y : int } + + let string_of_t t = Printf.sprintf "{ x = %d; y = %d }" t.x t.y + + Printf.printf !"t = %{{string_of_t}}" { x = 42; y = 42 } + ]} + *) + | Custom : + ('c, 'a, 'x, 'y) custom_arity * ('b -> 'x) * ('a, 'b, 'c, 'd, 'e, 'f) fmt -> + ('y, 'b, 'c, 'd, 'e, 'f) fmt + + (* end of a format specification *) | End_of_format : ('f, 'b, 'c, 'e, 'e, 'f) fmt @@ -490,6 +527,8 @@ let rec erase_rel : type a b c d e f g h i j k l . Alpha_ty (erase_rel rest) | Theta_ty rest -> Theta_ty (erase_rel rest) + | Any_ty rest -> + Any_ty (erase_rel rest) | Reader_ty rest -> Reader_ty (erase_rel rest) | Ignored_reader_ty rest -> @@ -543,6 +582,8 @@ fun fmtty1 fmtty2 -> match fmtty1 with Alpha_ty (concat_fmtty rest fmtty2) | Theta_ty rest -> Theta_ty (concat_fmtty rest fmtty2) + | Any_ty rest -> + Any_ty (concat_fmtty rest fmtty2) | Reader_ty rest -> Reader_ty (concat_fmtty rest fmtty2) | Ignored_reader_ty rest -> @@ -588,6 +629,8 @@ fun fmt1 fmt2 -> match fmt1 with Alpha (concat_fmt rest fmt2) | Theta rest -> Theta (concat_fmt rest fmt2) + | Custom (arity, f, rest) -> + Custom (arity, f, concat_fmt rest fmt2) | Reader rest -> Reader (concat_fmt rest fmt2) | Flush rest -> diff --git a/stdlib/camlinternalFormatBasics.mli b/stdlib/camlinternalFormatBasics.mli index 4e579f3aa9..72be20607a 100644 --- a/stdlib/camlinternalFormatBasics.mli +++ b/stdlib/camlinternalFormatBasics.mli @@ -29,6 +29,11 @@ type ('a, 'b) precision = type prec_option = int option +type ('a, 'b, 'c, 'd) custom_arity = + | Custom_zero : ('a, 'b, 'a, 'b) custom_arity + | Custom_succ : ('a, 'b, 'c, 'd) custom_arity -> + ('a, 'b, 'x -> 'c, 'x -> 'd) custom_arity + type block_type = Pp_hbox | Pp_vbox | Pp_hvbox | Pp_hovbox | Pp_box | Pp_fits type formatting_lit = @@ -121,6 +126,11 @@ and ('a1, 'b1, 'c1, 'd1, 'e1, 'f1, 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel -> (('b1 -> 'c1) -> 'a1, 'b1, 'c1, 'd1, 'e1, 'f1, ('b2 -> 'c2) -> 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel +| Any_ty : (* Used for custom formats *) + ('a1, 'b1, 'c1, 'd1, 'e1, 'f1, + 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel -> + ('x -> 'a1, 'b1, 'c1, 'd1, 'e1, 'f1, + 'x -> 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel (* Scanf specific constructor. *) | Reader_ty : (* %r *) @@ -234,6 +244,11 @@ and ('a, 'b, 'c, 'd, 'e, 'f) fmt = ('a, 'b, 'c, 'd, 'y, 'x) ignored * ('x, 'b, 'c, 'y, 'e, 'f) fmt -> ('a, 'b, 'c, 'd, 'e, 'f) fmt +(* Custom printing format *) +| Custom : + ('c, 'a, 'x, 'y) custom_arity * ('b -> 'x) * ('a, 'b, 'c, 'd, 'e, 'f) fmt -> + ('y, 'b, 'c, 'd, 'e, 'f) fmt + | End_of_format : ('f, 'b, 'c, 'e, 'e, 'f) fmt diff --git a/stdlib/scanf.ml b/stdlib/scanf.ml index 0144d38bdb..08fc9aba50 100644 --- a/stdlib/scanf.ml +++ b/stdlib/scanf.ml @@ -1029,6 +1029,7 @@ fun k fmt -> match fmt with | Flush rest -> take_format_readers k rest | String_literal (_, rest) -> take_format_readers k rest | Char_literal (_, rest) -> take_format_readers k rest + | Custom (_, _, rest) -> take_format_readers k rest | Scan_char_set (_, _, rest) -> take_format_readers k rest | Scan_get_counter (_, rest) -> take_format_readers k rest @@ -1068,6 +1069,7 @@ fun k fmtty fmt -> match fmtty with | Bool_ty rest -> take_fmtty_format_readers k rest fmt | Alpha_ty rest -> take_fmtty_format_readers k rest fmt | Theta_ty rest -> take_fmtty_format_readers k rest fmt + | Any_ty rest -> take_fmtty_format_readers k rest fmt | Format_arg_ty (_, rest) -> take_fmtty_format_readers k rest fmt | End_of_fmtty -> take_format_readers k fmt | Format_subst_ty (ty1, ty2, rest) -> @@ -1169,6 +1171,8 @@ fun ib fmt readers -> match fmt with invalid_arg "scanf: bad conversion \"%a\"" | Theta _ -> invalid_arg "scanf: bad conversion \"%t\"" + | Custom _ -> + invalid_arg "scanf: bad conversion \"%?\" (custom converter)" | Reader fmt_rest -> let Cons (reader, readers_rest) = readers in let x = reader ib in diff --git a/typing/typecore.ml b/typing/typecore.ml index aad947dd5a..95af7ae6e9 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -2863,6 +2863,7 @@ and type_format loc str env = | Bool_ty rest -> mk_constr "Bool_ty" [ mk_fmtty rest ] | Alpha_ty rest -> mk_constr "Alpha_ty" [ mk_fmtty rest ] | Theta_ty rest -> mk_constr "Theta_ty" [ mk_fmtty rest ] + | Any_ty rest -> mk_constr "Any_ty" [ mk_fmtty rest ] | Reader_ty rest -> mk_constr "Reader_ty" [ mk_fmtty rest ] | Ignored_reader_ty rest -> mk_constr "Ignored_reader_ty" [ mk_fmtty rest ] @@ -2982,6 +2983,10 @@ and type_format loc str env = mk_constr "Ignored_param" [ mk_ignored ign; mk_fmt rest ] | End_of_format -> mk_constr "End_of_format" [] + | Custom _ -> + (* Custom formatters have no syntax so they will never appear + in formats parsed from strings. *) + assert false in let legacy_behavior = not !Clflags.strict_formats in let Fmt_EBB fmt = fmt_ebb_of_string ~legacy_behavior str in From 9cb590b5e3ebda5598a3c5802eb3638750638180 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Dimino?= <jeremie@dimino.org> Date: Mon, 18 May 2015 09:10:40 +0000 Subject: [PATCH 267/494] PR#6452 (part two): make custom_format string-only MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (Jérémie Dimino, Benoît Vaugon) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16125 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- stdlib/camlinternalFormat.ml | 14 +++++++------- stdlib/camlinternalFormatBasics.ml | 10 +++++----- stdlib/camlinternalFormatBasics.mli | 10 +++++----- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/stdlib/camlinternalFormat.ml b/stdlib/camlinternalFormat.ml index 8de12bb823..569f4ca34c 100644 --- a/stdlib/camlinternalFormat.ml +++ b/stdlib/camlinternalFormat.ml @@ -493,8 +493,8 @@ fun buf fmtty -> match fmtty with (***) -let rec int_of_custom_arity : type a b c d . - (a, b, c, d) custom_arity -> int = +let rec int_of_custom_arity : type a b c . + (a, b, c) custom_arity -> int = function | Custom_zero -> 0 | Custom_succ x -> 1 + int_of_custom_arity x @@ -881,7 +881,7 @@ fun fmtty -> match fmtty with | End_of_format -> End_of_fmtty and fmtty_of_custom : type x y a b c d e f . - (c, a, x, y) custom_arity -> (a, b, c, d, e, f) fmtty -> + (a, x, y) custom_arity -> (a, b, c, d, e, f) fmtty -> (y, b, c, d, e, f) fmtty = fun arity fmtty -> match arity with | Custom_zero -> fmtty @@ -1436,7 +1436,7 @@ fun k o acc fmt -> match fmt with | Theta rest -> fun f -> make_printf k o (Acc_delay (acc, f)) rest | Custom (arity, f, rest) -> - make_custom k o acc rest arity f + make_custom k o acc rest arity (f ()) | Reader _ -> (* This case is impossible, by typing of formats. *) (* Indeed, since printf and co. take a format4 as argument, the 'd and 'e @@ -1666,12 +1666,12 @@ and make_float_padding_precision : type x y a b c d e f . and make_custom : type x y a b c d e f . (b -> (b, c) acc -> f) -> b -> (b, c) acc -> (a, b, c, d, e, f) fmt -> - (c, a, x, y) custom_arity -> (b -> x) -> y = + (a, x, y) custom_arity -> x -> y = fun k o acc rest arity f -> match arity with - | Custom_zero -> make_printf k o (Acc_delay (acc, f)) rest + | Custom_zero -> make_printf k o (Acc_data_string (acc, f)) rest | Custom_succ arity -> fun x -> - make_custom k o acc rest arity (fun o -> f o x) + make_custom k o acc rest arity (f x) (******************************************************************************) (* Continuations for make_printf *) diff --git a/stdlib/camlinternalFormatBasics.ml b/stdlib/camlinternalFormatBasics.ml index 28b72d8763..4e5db73db9 100644 --- a/stdlib/camlinternalFormatBasics.ml +++ b/stdlib/camlinternalFormatBasics.ml @@ -66,10 +66,10 @@ type ('a, 'b) precision = type prec_option = int option (* see the Custom format combinator *) -type ('a, 'b, 'c, 'd) custom_arity = - | Custom_zero : ('a, 'b, 'a, 'b) custom_arity - | Custom_succ : ('a, 'b, 'c, 'd) custom_arity -> - ('a, 'b, 'x -> 'c, 'x -> 'd) custom_arity +type ('a, 'b, 'c) custom_arity = + | Custom_zero : ('a, string, 'a) custom_arity + | Custom_succ : ('a, 'b, 'c) custom_arity -> + ('a, 'x -> 'b, 'x -> 'c) custom_arity (***) @@ -450,7 +450,7 @@ and ('a, 'b, 'c, 'd, 'e, 'f) fmt = ]} *) | Custom : - ('c, 'a, 'x, 'y) custom_arity * ('b -> 'x) * ('a, 'b, 'c, 'd, 'e, 'f) fmt -> + ('a, 'x, 'y) custom_arity * (unit -> 'x) * ('a, 'b, 'c, 'd, 'e, 'f) fmt -> ('y, 'b, 'c, 'd, 'e, 'f) fmt (* end of a format specification *) diff --git a/stdlib/camlinternalFormatBasics.mli b/stdlib/camlinternalFormatBasics.mli index 72be20607a..80866e8332 100644 --- a/stdlib/camlinternalFormatBasics.mli +++ b/stdlib/camlinternalFormatBasics.mli @@ -29,10 +29,10 @@ type ('a, 'b) precision = type prec_option = int option -type ('a, 'b, 'c, 'd) custom_arity = - | Custom_zero : ('a, 'b, 'a, 'b) custom_arity - | Custom_succ : ('a, 'b, 'c, 'd) custom_arity -> - ('a, 'b, 'x -> 'c, 'x -> 'd) custom_arity +type ('a, 'b, 'c) custom_arity = + | Custom_zero : ('a, string, 'a) custom_arity + | Custom_succ : ('a, 'b, 'c) custom_arity -> + ('a, 'x -> 'b, 'x -> 'c) custom_arity type block_type = Pp_hbox | Pp_vbox | Pp_hvbox | Pp_hovbox | Pp_box | Pp_fits @@ -246,7 +246,7 @@ and ('a, 'b, 'c, 'd, 'e, 'f) fmt = (* Custom printing format *) | Custom : - ('c, 'a, 'x, 'y) custom_arity * ('b -> 'x) * ('a, 'b, 'c, 'd, 'e, 'f) fmt -> + ('a, 'x, 'y) custom_arity * (unit -> 'x) * ('a, 'b, 'c, 'd, 'e, 'f) fmt -> ('y, 'b, 'c, 'd, 'e, 'f) fmt | End_of_format : From 1ecc9eb8e725257a247b38572f46aac9d531a5d9 Mon Sep 17 00:00:00 2001 From: Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> Date: Mon, 18 May 2015 10:23:39 +0000 Subject: [PATCH 268/494] Fix PR#6870 (not only test...) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16126 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 1 + typing/ctype.ml | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Changes b/Changes index a732e0c501..2ebc5ca885 100644 --- a/Changes +++ b/Changes @@ -148,6 +148,7 @@ Bug fixes: - PR#6849: Inverted pattern unification error - PR#6857: __MODULE__ doesn't give the current module with -o - PR#6862: Exhaustiveness check wrong for class constructor arguments +- PR#6870: Unsoundness when -rectypes fails to detect non-contractive type - PR#6872: Type-directed propagation fails to disambiguate variants that are also exception constructors - GPR#143: fix getsockopt behaviour for boolean socket options diff --git a/typing/ctype.ml b/typing/ctype.ml index eba502b6f3..d1ff9da5e5 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -1667,10 +1667,11 @@ exception Occur let rec occur_rec env visited ty0 ty = if ty == ty0 then raise Occur; + let occur_ok = !Clflags.recursive_types && is_contractive env ty in match ty.desc with Tconstr(p, tl, abbrev) -> begin try - if List.memq ty visited || !Clflags.recursive_types then raise Occur; + if occur_ok || List.memq ty visited then raise Occur; iter_type_expr (occur_rec env (ty::visited) ty0) ty with Occur -> try let ty' = try_expand_head try_expand_once env ty in @@ -1681,15 +1682,15 @@ let rec occur_rec env visited ty0 ty = match ty'.desc with Tobject _ | Tvariant _ -> () | _ -> - if not !Clflags.recursive_types then + if not (!Clflags.recursive_types && is_contractive env ty') then iter_type_expr (occur_rec env (ty'::visited) ty0) ty' with Cannot_expand -> - if not !Clflags.recursive_types then raise Occur + if not occur_ok then raise Occur end | Tobject _ | Tvariant _ -> () | _ -> - if not !Clflags.recursive_types then + if not occur_ok then iter_type_expr (occur_rec env visited ty0) ty let type_changed = ref false (* trace possible changes to the studied type *) From 4b73ec120d72e3b7e11e16cf29ba04afb39a8565 Mon Sep 17 00:00:00 2001 From: Mark Shinwell <mshinwell@janestreet.com> Date: Tue, 19 May 2015 09:48:34 +0000 Subject: [PATCH 269/494] Fix fallout from PR 6693 on POWER architecture git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16127 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- asmrun/Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/asmrun/Makefile b/asmrun/Makefile index 84a9aaabaf..37b6182d0b 100644 --- a/asmrun/Makefile +++ b/asmrun/Makefile @@ -119,6 +119,9 @@ power.o: power-$(SYSTEM).o power.p.o: power-$(SYSTEM).o cp power-$(SYSTEM).o power.p.o +power.pic.o: power-$(SYSTEM).pic.o + cp power-$(SYSTEM).pic.o power.pic.o + main.c: ../byterun/main.c ln -s ../byterun/main.c main.c misc.c: ../byterun/misc.c From 1880401cfb031dbf215e646dc0497fd1aae34086 Mon Sep 17 00:00:00 2001 From: Mark Shinwell <mshinwell@janestreet.com> Date: Tue, 19 May 2015 10:18:20 +0000 Subject: [PATCH 270/494] Fix PR#6869: Improve comment on [Hashtbl.hash_param] git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16128 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ stdlib/hashtbl.mli | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 2ebc5ca885..b1ac561c17 100644 --- a/Changes +++ b/Changes @@ -148,6 +148,8 @@ Bug fixes: - PR#6849: Inverted pattern unification error - PR#6857: __MODULE__ doesn't give the current module with -o - PR#6862: Exhaustiveness check wrong for class constructor arguments +- PR#6869: Improve comment on [Hashtbl.hash_param] + (Mark Shinwell, report by Jun Furuse) - PR#6870: Unsoundness when -rectypes fails to detect non-contractive type - PR#6872: Type-directed propagation fails to disambiguate variants that are also exception constructors diff --git a/stdlib/hashtbl.mli b/stdlib/hashtbl.mli index 0c3e4999f3..386f5a6cc9 100644 --- a/stdlib/hashtbl.mli +++ b/stdlib/hashtbl.mli @@ -345,7 +345,9 @@ val hash_param : int -> int -> 'a -> int hashing. Hashing performs a breadth-first, left-to-right traversal of the structure [x], stopping after [meaningful] meaningful nodes were encountered, or [total] nodes (meaningful or not) were - encountered. Meaningful nodes are: integers; floating-point + encountered. If [total] as specified by the user exceeds a certain + value, currently 256, then it is capped to that value. + Meaningful nodes are: integers; floating-point numbers; strings; characters; booleans; and constant constructors. Larger values of [meaningful] and [total] means that more nodes are taken into account to compute the final hash value, From ddf4db419156b2280541c3cf5d6733224c509b43 Mon Sep 17 00:00:00 2001 From: Mark Shinwell <mshinwell@janestreet.com> Date: Tue, 19 May 2015 10:26:22 +0000 Subject: [PATCH 271/494] Fix PR#6630: Failure of tests/prim-bigstring/{big,}string.ml on big-endian architectures git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16129 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 + .../tests/prim-bigstring/bigstring_access.ml | 65 ++++++++++++------- .../tests/prim-bigstring/string_access.ml | 65 ++++++++++++------- 3 files changed, 84 insertions(+), 48 deletions(-) diff --git a/Changes b/Changes index b1ac561c17..7a0f582f6d 100644 --- a/Changes +++ b/Changes @@ -89,6 +89,8 @@ Bug fixes: (Peter Zotov) - PR#6628: Configure script rejects legitimate arguments (Michael Grünewald, Damien Doligez) +- PR#6630: Failure of tests/prim-bigstring/{big,}string.ml on big-endian + architectures (Pierre Chambart, testing by Mark Shinwell) - PR#6640: ocamlbuild: wrong "unused tag" warning on "precious" (report by user 'william') - PR#6652: ocamlbuild -clean does not print a newline after output diff --git a/testsuite/tests/prim-bigstring/bigstring_access.ml b/testsuite/tests/prim-bigstring/bigstring_access.ml index 8fad87b151..512181f088 100644 --- a/testsuite/tests/prim-bigstring/bigstring_access.ml +++ b/testsuite/tests/prim-bigstring/bigstring_access.ml @@ -63,40 +63,57 @@ let () = assert_bound_check3 caml_bigstring_set_32 empty_s 0 0l; assert_bound_check3 caml_bigstring_set_64 empty_s 0 0L +external bswap16: int -> int = "%bswap16" +external bswap32: int32 -> int32 = "%bswap_int32" +external bswap64: int64 -> int64 = "%bswap_int64" +let swap16 x = + if Sys.big_endian + then bswap16 x + else x + +let swap32 x = + if Sys.big_endian + then bswap32 x + else x + +let swap64 x = + if Sys.big_endian + then bswap64 x + else x let () = - caml_bigstring_set_16 s 0 0x1234; + caml_bigstring_set_16 s 0 (swap16 0x1234); Printf.printf "%x %x %x\n%!" - (caml_bigstring_get_16 s 0) - (caml_bigstring_get_16 s 1) - (caml_bigstring_get_16 s 2); - caml_bigstring_set_16 s 0 0xFEDC; + (swap16 (caml_bigstring_get_16 s 0)) + (swap16 (caml_bigstring_get_16 s 1)) + (swap16 (caml_bigstring_get_16 s 2)); + caml_bigstring_set_16 s 0 (swap16 0xFEDC); Printf.printf "%x %x %x\n%!" - (caml_bigstring_get_16 s 0) - (caml_bigstring_get_16 s 1) - (caml_bigstring_get_16 s 2) + (swap16 (caml_bigstring_get_16 s 0)) + (swap16 (caml_bigstring_get_16 s 1)) + (swap16 (caml_bigstring_get_16 s 2)) let () = - caml_bigstring_set_32 s 0 0x12345678l; + caml_bigstring_set_32 s 0 (swap32 0x12345678l); Printf.printf "%lx %lx %lx\n%!" - (caml_bigstring_get_32 s 0) - (caml_bigstring_get_32 s 1) - (caml_bigstring_get_32 s 2); - caml_bigstring_set_32 s 0 0xFEDCBA09l; + (swap32 (caml_bigstring_get_32 s 0)) + (swap32 (caml_bigstring_get_32 s 1)) + (swap32 (caml_bigstring_get_32 s 2)); + caml_bigstring_set_32 s 0 (swap32 0xFEDCBA09l); Printf.printf "%lx %lx %lx\n%!" - (caml_bigstring_get_32 s 0) - (caml_bigstring_get_32 s 1) - (caml_bigstring_get_32 s 2) + (swap32 (caml_bigstring_get_32 s 0)) + (swap32 (caml_bigstring_get_32 s 1)) + (swap32 (caml_bigstring_get_32 s 2)) let () = - caml_bigstring_set_64 s 0 0x1234567890ABCDEFL; + caml_bigstring_set_64 s 0 (swap64 0x1234567890ABCDEFL); Printf.printf "%Lx %Lx %Lx\n%!" - (caml_bigstring_get_64 s 0) - (caml_bigstring_get_64 s 1) - (caml_bigstring_get_64 s 2); - caml_bigstring_set_64 s 0 0xFEDCBA0987654321L; + (swap64 (caml_bigstring_get_64 s 0)) + (swap64 (caml_bigstring_get_64 s 1)) + (swap64 (caml_bigstring_get_64 s 2)); + caml_bigstring_set_64 s 0 (swap64 0xFEDCBA0987654321L); Printf.printf "%Lx %Lx %Lx\n%!" - (caml_bigstring_get_64 s 0) - (caml_bigstring_get_64 s 1) - (caml_bigstring_get_64 s 2) + (swap64 (caml_bigstring_get_64 s 0)) + (swap64 (caml_bigstring_get_64 s 1)) + (swap64 (caml_bigstring_get_64 s 2)) diff --git a/testsuite/tests/prim-bigstring/string_access.ml b/testsuite/tests/prim-bigstring/string_access.ml index 3afcc6c552..48964c0b33 100644 --- a/testsuite/tests/prim-bigstring/string_access.ml +++ b/testsuite/tests/prim-bigstring/string_access.ml @@ -50,40 +50,57 @@ let () = assert_bound_check3 caml_string_set_32 empty_s 0 0l; assert_bound_check3 caml_string_set_64 empty_s 0 0L +external bswap16: int -> int = "%bswap16" +external bswap32: int32 -> int32 = "%bswap_int32" +external bswap64: int64 -> int64 = "%bswap_int64" +let swap16 x = + if Sys.big_endian + then bswap16 x + else x + +let swap32 x = + if Sys.big_endian + then bswap32 x + else x + +let swap64 x = + if Sys.big_endian + then bswap64 x + else x let () = - caml_string_set_16 s 0 0x1234; + caml_string_set_16 s 0 (swap16 0x1234); Printf.printf "%x %x %x\n%!" - (caml_string_get_16 s 0) - (caml_string_get_16 s 1) - (caml_string_get_16 s 2); - caml_string_set_16 s 0 0xFEDC; + (swap16 (caml_string_get_16 s 0)) + (swap16 (caml_string_get_16 s 1)) + (swap16 (caml_string_get_16 s 2)); + caml_string_set_16 s 0 (swap16 0xFEDC); Printf.printf "%x %x %x\n%!" - (caml_string_get_16 s 0) - (caml_string_get_16 s 1) - (caml_string_get_16 s 2) + (swap16 (caml_string_get_16 s 0)) + (swap16 (caml_string_get_16 s 1)) + (swap16 (caml_string_get_16 s 2)) let () = - caml_string_set_32 s 0 0x12345678l; + caml_string_set_32 s 0 (swap32 0x12345678l); Printf.printf "%lx %lx %lx\n%!" - (caml_string_get_32 s 0) - (caml_string_get_32 s 1) - (caml_string_get_32 s 2); - caml_string_set_32 s 0 0xFEDCBA09l; + (swap32 (caml_string_get_32 s 0)) + (swap32 (caml_string_get_32 s 1)) + (swap32 (caml_string_get_32 s 2)); + caml_string_set_32 s 0 (swap32 0xFEDCBA09l); Printf.printf "%lx %lx %lx\n%!" - (caml_string_get_32 s 0) - (caml_string_get_32 s 1) - (caml_string_get_32 s 2) + (swap32 (caml_string_get_32 s 0)) + (swap32 (caml_string_get_32 s 1)) + (swap32 (caml_string_get_32 s 2)) let () = - caml_string_set_64 s 0 0x1234567890ABCDEFL; + caml_string_set_64 s 0 (swap64 0x1234567890ABCDEFL); Printf.printf "%Lx %Lx %Lx\n%!" - (caml_string_get_64 s 0) - (caml_string_get_64 s 1) - (caml_string_get_64 s 2); - caml_string_set_64 s 0 0xFEDCBA0987654321L; + (swap64 (caml_string_get_64 s 0)) + (swap64 (caml_string_get_64 s 1)) + (swap64 (caml_string_get_64 s 2)); + caml_string_set_64 s 0 (swap64 0xFEDCBA0987654321L); Printf.printf "%Lx %Lx %Lx\n%!" - (caml_string_get_64 s 0) - (caml_string_get_64 s 1) - (caml_string_get_64 s 2) + (swap64 (caml_string_get_64 s 0)) + (swap64 (caml_string_get_64 s 1)) + (swap64 (caml_string_get_64 s 2)) From 8f7a06c19ddb5837c30f6250d56a3501019661ad Mon Sep 17 00:00:00 2001 From: Mark Shinwell <mshinwell@janestreet.com> Date: Tue, 19 May 2015 10:45:26 +0000 Subject: [PATCH 272/494] Update instructions for x86-64 PIC mode and POWER architecture builds git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16130 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 4 ++++ INSTALL | 17 +++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Changes b/Changes index 7a0f582f6d..6fbf805516 100644 --- a/Changes +++ b/Changes @@ -65,6 +65,10 @@ Build system: - PR#5418 (comments) : generate dependencies with $(CC) instead of gcc - PR#6266: Cross compilation for iOs, Android etc +Installation procedure: +- Update instructions for x86-64 PIC mode and POWER architecture builds + (Mark Shinwell) + Bug fixes: - PR#5271: Location.prerr_warning is hard-coded to use Format.err_formatter (Damien Doligez, report by Rolf Rolles) diff --git a/INSTALL b/INSTALL index 63ae5c67bf..a83bbd3bda 100644 --- a/INSTALL +++ b/INSTALL @@ -140,15 +140,24 @@ Examples: or: ./configure -prefix /usr -mandir '$(PREFIX)/man/manl' - On a Linux x86/64 bits host, to build a 32-bit version of OCaml: + On a Linux x86-64 host, to build a 32-bit version of OCaml: ./configure -cc "gcc -m32" -as "as --32" -aspp "gcc -m32 -c" \ -host i386-linux -partialld "ld -r -melf_i386" - On a Linux x86/64 bits host, to build the run-time system in PIC mode - (enables putting the runtime in a shared library, - at a small performance cost): + On a Linux x86-64 host, to build the run-time system in PIC mode, + no special options should be required---the libraries should be built + automatically. The old instructions were: ./configure -cc "gcc -fPIC" -aspp "gcc -c -fPIC" + On a 64-bit POWER architecture host running Linux, OCaml only operates + in a 32-bit environment. If your system compiler is configured as 32-bit, + e.g. Red Hat 5.9, you don't need to do anything special. If that is + not the case (e.g. Red Hat 6.4), then IBM's "Advance Toolchain" can + be used. For example: + export PATH=/opt/at7.0/bin:$PATH + ./configure -cc "gcc -m32" -as "as -a32" -aspp "gcc -m32 -c" \ + -partialld "ld -r -m elf32ppc" + On a MacOSX 10.5/Intel Core 2 or MacOSX 10.5/PowerPC host, to build a 64-bit version of OCaml: ./configure -cc "gcc -m64" From ec49446387c45e13c2feb6d2377ab735685d60e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Dimino?= <jeremie@dimino.org> Date: Wed, 20 May 2015 15:06:21 +0000 Subject: [PATCH 273/494] Support docstring before the semicolon in label declarations git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16134 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- parsing/parser.mly | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/parsing/parser.mly b/parsing/parser.mly index 2e8a64502a..838d436eb8 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -1856,8 +1856,13 @@ label_declaration: label_declaration_semi: mutable_flag label COLON poly_type_no_attr attributes SEMI attributes { + let info = + match rhs_info 5 with + | Some _ as info_before_semi -> info_before_semi + | None -> symbol_info () + in Type.field (mkrhs $2 2) $4 ~mut:$1 ~attrs:($5 @ $7) - ~loc:(symbol_rloc()) ~info:(symbol_info ()) + ~loc:(symbol_rloc()) ~info } ; From c9e7059ff5c1fecc475be62aa900a127e478b200 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 24 May 2015 14:40:03 +0000 Subject: [PATCH 274/494] complete attribution information for the 4.02 Changelog git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16140 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 56 ++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 46 insertions(+), 10 deletions(-) diff --git a/Changes b/Changes index 6fbf805516..eb432d5dea 100644 --- a/Changes +++ b/Changes @@ -9,21 +9,25 @@ Language features: It is also possible to use '#' as part of these extra symbols (for instance ##, or #+#); this is rejected by the type-checker, but can be used e.g. by ppx rewriters. + (Alain Frisch, request by Gabriel Radanne) * PR#6016: add a "nonrec" keyword for type declarations (Jérémie Dimino) Compilers: - PR#6600: make -short-paths faster by building the printing map - incrementally (Jacques Garrigue) + incrementally + (Jacques Garrigue) - PR#6642: replace $CAMLORIGIN in -ccopt with the path to cma or cmxa (Peter Zotov, Gabriel Scherer, review by Damien Doligez) - PR#6797: new option -output-complete-obj to output an object file with included runtime and autolink libraries (Peter Zotov) - PR#6845: -no-check-prims to tell ocamlc not to check primitives in runtime + (Alain Frisch) - GPR#159: Better locations for structure/signature items (Leo White) -- GPR#149: Attach documentation comments to parse tree (Leo White) +- GPR#149: Attach documentation comments to parse tree + (Leo White) Toplevel and debugger: - PR#5958: generalized polymorphic #install_printer @@ -54,6 +58,7 @@ Libraries: - PR#6285: Add support for nanosecond precision in Unix.stat() (Jérémie Dimino, report by user 'gfxmonk') - PR#6834: Add Obj.{first,last}_non_constant_constructor_tag + (Mark Shinwell, request by Gabriel Scherer) Runtime: - PR#6675: GC hooks @@ -63,7 +68,9 @@ Runtime: Build system: - PR#5418 (comments) : generate dependencies with $(CC) instead of gcc + (Damien Doligez and Michael Grünewald) - PR#6266: Cross compilation for iOs, Android etc + (Peter Zotov, review by Damien Doligez and Mark Shinwell) Installation procedure: - Update instructions for x86-64 PIC mode and POWER architecture builds @@ -75,14 +82,17 @@ Bug fixes: - PR#5395: OCamlbuild mishandles relative symlinks and include paths (Damien Doligez, report by Didier Le Botlan) - PR#5822: wrong value of Options.ext_dll on windows + (Damien Doligez and user 'daweil') - PR#5836, PR#6684: printing lazy values in ocamldebug may segfault - (Gabriel Scherer) + (Gabriel Scherer, request by the Coq team) - PR#5887: move the byterun/*.h headers to byterun/caml/*.h to avoid header name clashes (Jérôme Vouillon and Adrien Nader and Peter Zotov) - PR#6281: Graphics window does not acknowledge second click (double click) + (user 'kygron') - PR#6490: incorrect backtraces in gdb on AArch64. Also fixes incorrect - backtraces on 32-bit ARM. (Mark Shinwell) + backtraces on 32-bit ARM. + (Mark Shinwell) - PR#6573: extern "C" for systhreads/threads.h (Mickaël Delahaye) - PR#6575: Array.init evaluates callback although it should not do so @@ -94,11 +104,14 @@ Bug fixes: - PR#6628: Configure script rejects legitimate arguments (Michael Grünewald, Damien Doligez) - PR#6630: Failure of tests/prim-bigstring/{big,}string.ml on big-endian - architectures (Pierre Chambart, testing by Mark Shinwell) + architectures + (Pierre Chambart, testing by Mark Shinwell) - PR#6640: ocamlbuild: wrong "unused tag" warning on "precious" (report by user 'william') - PR#6652: ocamlbuild -clean does not print a newline after output + (Damien Doligez, report by Andi McClure) - PR#6658: cross-compiler: version check not working on OS X + (Gerd Stolpmann) - PR#6665: Failure of tests/asmcomp on sparc (Stéphane Glondu) - PR#6667: wrong implementation of %bswap16 on ARM64 @@ -108,9 +121,12 @@ Bug fixes: - PR#6671: Windows: environment variable 'TZ' affects Unix.gettimeofday (Mickael Delahaye and Damien Doligez) - PR#6680: Missing parens when printing polymorphic variant value in warning -- PR#6686: Bug in [subst_boxed_number] (Jérémie Dimino, Mark Shinwell) + (Jacques Garrigue and Gabriel Scherer, report by Philippe Veber) +- PR#6686: Bug in [subst_boxed_number] + (Jérémie Dimino, Mark Shinwell) - PR#6690: Uncaught exception (Not_found) with (wrong) wildcard or unification - type variable in place of a local abstract type + type variable in place of a local abstract type + (Jacques Garrigue, report by Mikhail Mandrykin) - PR#6693 (part two): Incorrect relocation types in x86-64 runtime system (Peter Zotov, review by Jacques-Henri Jourdan, Xavier Leroy and Mark Shinwell) - PR#6717: Pprintast does not print let-pattern attributes @@ -118,47 +134,67 @@ Bug fixes: - PR#6727: Printf.sprintf "%F" misbehavior (Benoît Vaugon, report by Vassili Karpov) - PR#6747: ocamlobjinfo: missing symbol caml_plugin_header due to underscore + (Damien Doligez, Maverick Woo) - PR#6749: ocamlopt returns n for (n mod 1) instead of 0 (Mark Shinwell and Jérémie Dimino) - PR#6753: Num.quo_num and Num.mod_num incorrect for some negative arguments (Xavier Leroy) - PR#6758: Ocamldoc "analyse_module: parsetree and typedtree don't match" + (Damien Doligez, report by user 'maro') - PR#6759: big_int_of_string incorrectly parses some hexa literals (Damien Doligez, report by Pierre-yves Strub) - PR#6763: #show with -short-paths doesn't select shortest type paths + (Jacques Garrigue, report by David Sheets) - PR#6768: Typechecker overflow the stack on cyclic type -- PR#6770: (duplicate of PR#6686) + (Jacques Garrigue, report by user 'darktenaibre') - PR#6772: asmrun/signals_asm.c doesn't compile on NetBSD/i386 (Kenji Tokudome) - PR#6775: Digest.file leaks file descriptor on error (Valentin Gatien-Baron) - PR#6779: Cross-compilers cannot link bytecode using custom primitives + (Damien Doligez, request by Peter Zotov) - PR#6787: Soundness bug with polymorphic variants + (Jacques Garrigue, with help from Leo White and Grégoire Henry, + report by Michael O'Connor) - PR#6790: otherlibs should be built with -g + (Damien Doligez, report by Peter Zotov) - PR#6791: "%s@[", "%s@{" regression in Scanf (Benoît Vaugon) - PR#6793: ocamlbuild passes nonsensical "-ocamlc ..." commands to menhir (Gabriel Scherer, report by Damien Doligez) - PR#6799: include guards missing for unixsupport.h and other files + (user 'aha') - PR#6810: Improve documentation of Bigarray.Genarray.map_file + (Mark Shinwell and Daniel Bünzli) - PR#6812: -short-paths and -no-alias-deps can create inconsistent assumptions + (Jacques Garrigue, report by Valentin Gatien-Baron) - PR#6817: GADT exhaustiveness breakage with modules + (Leo White, report by Pierre Chambart) - PR#6824: fix buffer sharing on partial application of Format.asprintf (Gabriel Scherer, report by Alain Frisch) - PR#6831: Build breaks for -aspp gcc on solaris-like OSs + (user 'JT') - PR#6836: Assertion failure using -short-paths + (Jacques Garrigue, report by David Sheets) - PR#6837: Build profiling libraries on FreeBSD and NetBSD x86-64 + (Mark Shinwell, report by Michael Grünewald) - PR#6841: Changing compilation unit name with -o breaks ocamldebug + (Jacques Garrigue, report by Jordan Walke) - PR#6843: record weak dependencies even when the .cmi is missing (Leo White, Gabriel Scherer) - PR#6849: Inverted pattern unification error + (Jacques Garrigue, report by Leo White) - PR#6857: __MODULE__ doesn't give the current module with -o + (Jacques Garrigue, report by Valentin Gatien-Baron) - PR#6862: Exhaustiveness check wrong for class constructor arguments + (Jacques Garrigue) - PR#6869: Improve comment on [Hashtbl.hash_param] (Mark Shinwell, report by Jun Furuse) -- PR#6870: Unsoundness when -rectypes fails to detect non-contractive type +- PR#6870: Unsoundness when -rectypes fails to detect non-contractive type + (Jacques Garrigue, report by Stephen Dolan) - PR#6872: Type-directed propagation fails to disambiguate variants - that are also exception constructors + that are also exception constructors + (Jacques Garrigue, report by Romain Beauxis) - GPR#143: fix getsockopt behaviour for boolean socket options (Anil Madhavapeddy and Andrew Ray) - ocamlbuild on cygwin cannot find ocamlfind From c6e312d2086042d3cdeb033550f9a23ed9de3c67 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Mon, 25 May 2015 08:47:35 +0000 Subject: [PATCH 275/494] more changelog love git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16143 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/Changes b/Changes index eb432d5dea..2988184600 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,6 @@ OCaml 4.02.2: ------------- + (Changes that can break existing programs are marked with a "*") Language features: @@ -24,10 +25,10 @@ Compilers: (Peter Zotov) - PR#6845: -no-check-prims to tell ocamlc not to check primitives in runtime (Alain Frisch) -- GPR#159: Better locations for structure/signature items - (Leo White) - GPR#149: Attach documentation comments to parse tree (Leo White) +- GPR#159: Better locations for structure/signature items + (Leo White) Toplevel and debugger: - PR#5958: generalized polymorphic #install_printer @@ -53,18 +54,18 @@ OCamlbuild: (François Pottier) Libraries: -- PR#6781: Add higher baud rates to Unix termios - (Damien Doligez, report by Berke Durak) - PR#6285: Add support for nanosecond precision in Unix.stat() (Jérémie Dimino, report by user 'gfxmonk') +- PR#6781: Add higher baud rates to Unix termios + (Damien Doligez, report by Berke Durak) - PR#6834: Add Obj.{first,last}_non_constant_constructor_tag (Mark Shinwell, request by Gabriel Scherer) Runtime: -- PR#6675: GC hooks - (Damien Doligez and Roshan James) - PR#6078: Release the runtime system when calling caml_dlopen (Jérémie Dimino) +- PR#6675: GC hooks + (Damien Doligez and Roshan James) Build system: - PR#5418 (comments) : generate dependencies with $(CC) instead of gcc @@ -101,6 +102,10 @@ Bug fixes: (Alain Frisch) - PR#6616: allow meaningful use of -use-runtime without -custom. (Peter Zotov) +- PR#6617: allow android build with pthreads support (since SDK r10c) + (Peter Zotov) +- PR#6626: ocamlbuild on cygwin cannot find ocamlfind + (user 'algoriddle') - PR#6628: Configure script rejects legitimate arguments (Michael Grünewald, Damien Doligez) - PR#6630: Failure of tests/prim-bigstring/{big,}string.ml on big-endian @@ -120,7 +125,7 @@ Bug fixes: (Leo White, review by Gabriel Scherer) - PR#6671: Windows: environment variable 'TZ' affects Unix.gettimeofday (Mickael Delahaye and Damien Doligez) -- PR#6680: Missing parens when printing polymorphic variant value in warning +- PR#6680: Missing parentheses in warning about polymorphic variant value (Jacques Garrigue and Gabriel Scherer, report by Philippe Veber) - PR#6686: Bug in [subst_boxed_number] (Jérémie Dimino, Mark Shinwell) @@ -197,16 +202,12 @@ Bug fixes: (Jacques Garrigue, report by Romain Beauxis) - GPR#143: fix getsockopt behaviour for boolean socket options (Anil Madhavapeddy and Andrew Ray) -- ocamlbuild on cygwin cannot find ocamlfind - (user 'algoriddle') -- allow android build with pthreads support (since SDK r10c) - (Peter Zotov) -- GPR#171: allow custom warning printers / catchers - (Benjamin Canou, review by Damien Doligez) - Misplaced assertion in major_gc.c for no-naked-pointers mode (Stephen Dolan, Mark Shinwell) Feature wishes: +- PR#6452, GPR#140: add internal suport for custom printing formats + (Jérémie Dimino) - PR#6641: add -g, -ocamlcflags, -ocamloptflags options to ocamlmklib (Peter Zotov) - PR#6693: also build libasmrun_shared.so and lib{asm,caml}run_pic.a @@ -217,11 +218,10 @@ Feature wishes: (Christophe Troestler, review by Damien Doligez) - GPR#157: store the path of cmos inside debug section at link time (Hugo Heuzard, review by Damien Doligez) -- PR#6452, GPR#140: add internal suport for custom printing formats - (Jérémie Dimino) OCaml 4.02.1: ------------- + (Changes that can break existing programs are marked with a "*") Standard library: From 8b6be46ff041a82b44d9b7fced1c77d5c64c4e8c Mon Sep 17 00:00:00 2001 From: Mark Shinwell <mshinwell@janestreet.com> Date: Wed, 27 May 2015 09:03:34 +0000 Subject: [PATCH 276/494] Fix PR#6879: Wrong optimization of 1 mod n git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16144 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ asmcomp/cmmgen.ml | 4 ++-- testsuite/tests/basic/divint.ml | 3 +++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Changes b/Changes index 2988184600..6678d37664 100644 --- a/Changes +++ b/Changes @@ -200,6 +200,8 @@ Bug fixes: - PR#6872: Type-directed propagation fails to disambiguate variants that are also exception constructors (Jacques Garrigue, report by Romain Beauxis) +- PR#6879: Wrong optimization of 1 mod n (Mark Shinwell, report by + (Jean-Christophe Filliâtre) - GPR#143: fix getsockopt behaviour for boolean socket options (Anil Madhavapeddy and Andrew Ray) - Misplaced assertion in major_gc.c for no-naked-pointers mode diff --git a/asmcomp/cmmgen.ml b/asmcomp/cmmgen.ml index 08213395c7..8314966067 100644 --- a/asmcomp/cmmgen.ml +++ b/asmcomp/cmmgen.ml @@ -351,8 +351,8 @@ let mod_int c1 c2 dbg = [Cconst_symbol "caml_exn_Division_by_zero"])) | (c1, Cconst_int (1 | (-1))) -> Csequence(c1, Cconst_int 0) - | (Cconst_int(0 | 1 | (-1)) as c1, c2) -> - Csequence(c2, c1) + | (Cconst_int 0, c2) -> + Csequence(c2, Cconst_int 0) | (Cconst_int n1, Cconst_int n2) -> Cconst_int (n1 mod n2) | (c1, (Cconst_int n as c2)) when n <> min_int -> diff --git a/testsuite/tests/basic/divint.ml b/testsuite/tests/basic/divint.ml index fea32631e2..60f09962ff 100644 --- a/testsuite/tests/basic/divint.ml +++ b/testsuite/tests/basic/divint.ml @@ -114,3 +114,6 @@ let _ = if !error then printf "TEST FAILED.\n" else printf "Test passed.\n" +(* PR#6879 *) +let f n = assert (1 mod n = 0) +let () = f 1 From 96760331f0b65de411742ac5121aa7221be01d5d Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 31 May 2015 08:05:47 +0000 Subject: [PATCH 277/494] Changelog: add release dates of released versions git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16145 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 206 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 104 insertions(+), 102 deletions(-) diff --git a/Changes b/Changes index 6678d37664..c90df24be8 100644 --- a/Changes +++ b/Changes @@ -221,8 +221,8 @@ Feature wishes: - GPR#157: store the path of cmos inside debug section at link time (Hugo Heuzard, review by Damien Doligez) -OCaml 4.02.1: -------------- +OCaml 4.02.1 (14 Oct 2014): +--------------------------- (Changes that can break existing programs are marked with a "*") @@ -290,8 +290,8 @@ Standard library: - ocamlbuild: add an -ocamlmklib option to change the ocamlmklib command (Jérôme Vouillon) -OCaml 4.02.0: -------------- +OCaml 4.02.0 (29 Aug 2014): +--------------------------- (Changes that can break existing programs are marked with a "*") @@ -643,8 +643,8 @@ Features wishes: - make ocamldebug -I auto-detection work with ocamlbuild (Josh Watzman) -OCaml 4.01.0: -------------- +OCaml 4.01.0 (12 Sep 2013): +--------------------------- (Changes that can break existing programs are marked with a "*") @@ -1079,8 +1079,8 @@ Tools: (Guillaume Melquiond, Alain Frisch) -OCaml 4.00.1: -------------- +OCaml 4.00.1 (5 Oct 2012): +-------------------------- Bug fixes: - PR#4019: better documentation of Str.matched_string @@ -1109,8 +1109,8 @@ Bug fixes: - PR#5761: Incorrect bigarray custom block size -OCaml 4.00.0: -------------- +OCaml 4.00.0 (26 Jul 2012): +--------------------------- (Changes that can break existing programs are marked with a "*") @@ -1436,8 +1436,8 @@ Other changes: - Copy VERSION file to library directory when installing. -OCaml 3.12.1: -------------- +OCaml 3.12.1 (4 Jul 2011): +-------------------------- Bug fixes: - PR#4345, PR#4767: problems with camlp4 printing of float values @@ -1534,8 +1534,8 @@ Other changes: comparing a custom block value with an unboxed integer. -Objective Caml 3.12.0: ----------------------- +Objective Caml 3.12.0 (2 Aug 2010): +----------------------------------- (Changes that can break existing programs are marked with a "*" ) @@ -1665,8 +1665,8 @@ Bug Fixes: - Small problem with representation of Int32, Int64, and Nativeint constants. - Use RTLD_LOCAL for native dynlink in private mode. -Objective Caml 3.11.2: ----------------------- +Objective Caml 3.11.2 (20 Jan 2010): +------------------------------------ Bug fixes: - PR#4151: better documentation for min and max w.r.t. NaN @@ -1714,8 +1714,8 @@ Feature wishes: - PR#4723: "clear_rules" function to empty the set of ocamlbuild rules - PR#4921: configure option to help cross-compilers -Objective Caml 3.11.1: ----------------------- +Objective Caml 3.11.1 (12 Jun 2009): +------------------------------------ Bug fixes: - PR#4095: ocamldebug: strange behaviour of control-C @@ -1770,8 +1770,8 @@ Other changes: - Support for 64-bit mode in Solaris/x86 (PR#4670). -Objective Caml 3.11.0: ----------------------- +Objective Caml 3.11.0 (03 Dec 2008): +------------------------------------ (Changes that can break existing programs are marked with a "*" ) @@ -1901,8 +1901,8 @@ Bug fixes: - PR#4614: Inconsistent declaration of CamlCBCmd in LablTk library. -Objective Caml 3.10.2: ----------------------- +Objective Caml 3.10.2 (29 Feb 2008): +------------------------------------ Bug fixes: - PR#1217 (partial) Typo in ocamldep man page @@ -1919,8 +1919,8 @@ Bug fixes: - Bug in typing of polymorphic variants (reported on caml-list) -Objective Caml 3.10.1: ----------------------- +Objective Caml 3.10.1 (11 Jan 2008): +------------------------------------ Bug fixes: - PR#3830 small bugs in docs @@ -2006,8 +2006,8 @@ New features: emacs files -Objective Caml 3.10.0: ----------------------- +Objective Caml 3.10.0 (18 May 2007): +------------------------------------ (Changes that can break existing programs are marked with a "*" ) @@ -2084,8 +2084,8 @@ Lexer generator (ocamllex): improved error reporting. License: fixed a typo in the "special exception" to the LGPL. -Objective Caml 3.09.3: ----------------------- +Objective Caml 3.09.3 (15 Sep 2006): +------------------------------------ Bug fixes: - ocamldoc: -using modtype constraint to filter module elements displayed @@ -2120,8 +2120,8 @@ New features: -Objective Caml 3.09.2: ----------------------- +Objective Caml 3.09.2 (14 Apr 2006): +------------------------------------ Bug fixes: - Makefile: problem with "make world.opt" PR#3954 @@ -2151,8 +2151,8 @@ New features: - ported to MacOS X on Intel PR#3985 - configure: added support for GNU Hurd PR#3991 -Objective Caml 3.09.1: ----------------------- +Objective Caml 3.09.1 (4 Jan 2006): +----------------------------------- Bug fixes: - compilers: raise not_found with -principal PR#3855 @@ -2186,8 +2186,8 @@ Bug fixes: New features: - otherlibs/labltk: browser uses menu bars instead of menu buttons -Objective Caml 3.09.0: ----------------------- +Objective Caml 3.09.0 (27 Oct 2006): +------------------------------------ (Changes that can break existing programs are marked with a "*" ) @@ -2261,8 +2261,8 @@ Miscellaneous: - Configuration information is installed in `ocamlc -where`/Makefile.config and can be used by client Makefiles or shell scripts. -Objective Caml 3.08.4: ----------------------- +Objective Caml 3.08.4 (11 Aug 2005): +------------------------------------ New features: - configure: find X11 config in some 64-bit Linux distribs @@ -2309,8 +2309,8 @@ Bug fixes: - yacc: avoid name capture for idents of the Parsing module -Objective Caml 3.08.3: ----------------------- +Objective Caml 3.08.3 (24 Mar 2005): +------------------------------------ New features: - support for ocamlopt -pack under Mac OS X (PR#2634, PR#3320) @@ -2354,8 +2354,8 @@ Bug fixes: - windows: better handling of InterpreterPath registry entry (PR#3334, PR#3432) -Objective Caml 3.08.2: ----------------------- +Objective Caml 3.08.2 (22 Nov 2004): +------------------------------------ Bug fixes: - runtime: memory leak when unmarshalling big data structures (PR#3247) @@ -2375,8 +2375,8 @@ Misc: - unix: added missing #includes (PR#3088) -Objective Caml 3.08.1: ----------------------- +Objective Caml 3.08.1 (19 Aug 2004): +------------------------------------ Licence: - The emacs files are now under GPL @@ -2400,8 +2400,8 @@ Misc: - added -v option to ocamllex - ocamldoc: new -intf and -impl options supported (PR#3036) -Objective Caml 3.08.0: ----------------------- +Objective Caml 3.08.0 (13 Jul 2004): +------------------------------------ (Changes that can break existing programs are marked with a "*" ) @@ -2502,8 +2502,8 @@ Camlp4: - See camlp4/CHANGES and camlp4/ICHANGES for more info. -Objective Caml 3.07: --------------------- +Objective Caml 3.07 (29 Sep 2003): +---------------------------------- Language features: - Experimental support for recursive module definitions @@ -2662,8 +2662,8 @@ OCamldoc: - fix: empty [] in generated HTML indexes -Objective Caml 3.06: --------------------- +Objective Caml 3.06 (20 Aug 2002): +---------------------------------- Type-checking: - Apply value restriction to polymorphic record fields. @@ -2688,8 +2688,8 @@ Windows ports: - Fixed two problems with the Mingw port under Cygwin 1.3. -Objective Caml 3.05: --------------------- +Objective Caml 3.05 (29 Jul 2002): +---------------------------------- Language features: - Support for polymorphic methods and record fields. @@ -2820,8 +2820,8 @@ Windows port: - LablTk library: fixed a bug in Fileinput -Objective Caml 3.04: --------------------- +Objective Caml 3.04 (13 Dec 2001): +---------------------------------- Type-checker: - Allowed coercing self to the type of the current class, avoiding @@ -2888,8 +2888,8 @@ License: added special exception to the LGPL'ed code (libraries and runtime system) allowing unrestricted linking, whether static or dynamic. -Objective Caml 3.03 ALPHA: --------------------------- +Objective Caml 3.03 ALPHA (12 Oct 2001): +---------------------------------------- Language: - Removed built-in syntactic sugar for streams and stream patterns @@ -2969,8 +2969,8 @@ Windows port: -Objective Caml 3.02: --------------------- +Objective Caml 3.02 (30 Jul 2001): +---------------------------------- Both compilers: - Fixed embarrassing bug in pattern-matching compilation @@ -3035,8 +3035,8 @@ MacOS 9 port: - Removed the last traces of support for 68k -Objective Caml 3.01: --------------------- +Objective Caml 3.01 (09 Mar 2001): +---------------------------------- New language features: - Variables are allowed in "or" patterns, e.g. @@ -3153,8 +3153,8 @@ Mac OS ports: - Int64.format works on Mac OS 8/9. -Objective Caml 3.00: --------------------- +Objective Caml 3.00 (25 Apr 2000): +---------------------------------- Language: - OCaml/OLabl merger: @@ -3264,8 +3264,8 @@ Macintosh port: program written in O'Caml. -Objective Caml 2.04: --------------------- +Objective Caml 2.04 (26 Nov 1999): +---------------------------------- - C interface: corrected inconsistent change in the CAMLparam* macros. - Fixed internal error in ocamlc -g. @@ -3278,8 +3278,8 @@ Objective Caml 2.04: - Native-code compiler: fixed bug in assembling certain floating-point constants (masm doesn't grok 2e5, wants 2.0e5). -Objective Caml 2.03: --------------------- +Objective Caml 2.03 (19 Nov 1999): +---------------------------------- New ports: - Ported to BeOS / Intel x86 (bytecode and native-code). @@ -3364,8 +3364,8 @@ Others: not loading properly. -Objective Caml 2.02: --------------------- +Objective Caml 2.02 (04 Mar 1999): +---------------------------------- * Type system: - Check that all components of a signature have unique names. @@ -3447,8 +3447,8 @@ Objective Caml 2.02: - Fixed end-of-line bug in ocamlcp causing problems with generated sources. -Objective Caml 2.01: --------------------- +Objective Caml 2.01 (09 Dec 1998): +---------------------------------- * Typing: - Added warning for expressions of the form "a; b" where a does not have @@ -3525,8 +3525,8 @@ Objective Caml 2.01: * Macintosh port: source code for Macintosh application merged in. -Objective Caml 2.00: --------------------- +Objective Caml 2.00 (19 Aug 1998): +---------------------------------- * Language: - New class language. See http://caml.inria.fr/ocaml/refman/ @@ -3624,8 +3624,8 @@ Objective Caml 2.00: - Fixed bug with next-error under Emacs 20. -Objective Caml 1.07: --------------------- +Objective Caml 1.07 (11 Dec 1997): +---------------------------------- * Native-code compiler: - Revised interface between generated code and GC, fixes serious GC @@ -3649,8 +3649,8 @@ Objective Caml 1.07: * MS Windows port: better handling of long command lines in Sys.command -Objective Caml 1.06: --------------------- +Objective Caml 1.06 (18 Nov 1997): +---------------------------------- * Language: - Added two new keywords: "assert" (check assertion) and "lazy" @@ -3747,8 +3747,8 @@ Objective Caml 1.06: * Emacs editing mode and debugger interface updated to July '97 version. -Objective Caml 1.05: --------------------- +Objective Caml 1.05 (21 Mar 1997): +---------------------------------- * Typing: fixed several bugs causing spurious type errors. @@ -3766,8 +3766,8 @@ handling of checkpoints; various other small fixes. * Macintosh port: fixed signed division problem in bytecomp/emitcode.ml -Objective Caml 1.04: --------------------- +Objective Caml 1.04 (11 Mar 1997): +---------------------------------- * Replay debugger ported from Caml Light; added debugger support in compiler (option -g) and runtime system. Debugger is alpha-quality @@ -3829,8 +3829,8 @@ Objective Caml 1.04: * Emacs editing mode and debugger interface included in distribution. -Objective Caml 1.03: --------------------- +Objective Caml 1.03 (29 Oct 1996): +---------------------------------- * Typing: - bug with type names escaping their scope via unification with @@ -3878,8 +3878,9 @@ Objective Caml 1.03: * Perl-free, cpp-free, cholesterol-free installation procedure. -Objective Caml 1.02: --------------------- +Objective Caml 1.02 (27 Sep 1996): +---------------------------------- + * Typing: - fixed bug with type names escaping their scope via unification with non-generalized type variables '_a; @@ -3935,8 +3936,9 @@ Objective Caml 1.02: and call caml_main() later. -Objective Caml 1.01: --------------------- +Objective Caml 1.01 (12 Jun 1996): +---------------------------------- + * Typing: better report of type incompatibilities; non-generalizable type variables in a struct...end no longer flagged immediately as an error; @@ -3987,8 +3989,8 @@ Objective Caml 1.01: some error messages have been made clearer; several bugs fixes. -Objective Caml 1.00: --------------------- +Objective Caml 1.00 (9 May 1996): +--------------------------------- * Merge of Jerome Vouillon and Didier Remy's object-oriented extensions. @@ -4023,8 +4025,8 @@ marshaling to/from strings. * Dynlink library: added support for linking libraries (.cma files). -Caml Special Light 1.15: ------------------------- +Caml Special Light 1.15 (15 Mar 1996): +-------------------------------------- * Caml Special Light now runs under Windows NT and 95. Many thanks to Kevin Gallo (Microsoft Research) who contributed his initial port. @@ -4054,8 +4056,8 @@ manifest module type specifications. * Unix library: bug in gethostbyaddr fixed; bounds checking for read, write, etc. -Caml Special Light 1.14: ------------------------- +Caml Special Light 1.14 (8 Feb 1996): +------------------------------------- * cslopt ported to the PowerPC/RS6000 architecture. Better support for AIX in the bytecode system as well. @@ -4068,8 +4070,8 @@ out-of-order pops fixed. * Several bug fixes in callbacks and signals. -Caml Special Light 1.13: ------------------------- +Caml Special Light 1.13 (4 Jan 1996): +------------------------------------- * Pattern-matching compilation revised to factor out accesses inside matched structures. @@ -4092,13 +4094,13 @@ Intel decided to organize the floating-point registers as a stack). * cslopt for the Sparc: don't use Sparc V8 smul and sdiv instructions, emulation on V7 processors is abysmal. -Caml Special Light 1.12: ------------------------- +Caml Special Light 1.12 (30 Nov 1995): +-------------------------------------- * Fixed an embarrassing bug with references to floats. -Caml Special Light 1.11: ------------------------- +Caml Special Light 1.11 (29 Nov 1995): +-------------------------------------- * Streams and stream parsers a la Caml Light are back (thanks to Daniel de Rauglaudre). @@ -4120,8 +4122,8 @@ core on me). * Lower memory consumption for the native-code compiler. -Caml Special Light 1.10: ------------------------- +Caml Special Light 1.10 (07 Nov 1995): +-------------------------------------- * Many bug fixes (too many to list here). @@ -4138,8 +4140,8 @@ arbitrary-precision arithmetic have been ported (thanks to John Malecki and Victor Manuel Gulias Fernandez); better docs for the Unix and regexp libraries. -Caml Special Light 1.07: ------------------------- +Caml Special Light 1.07 (20 Sep 1995): +-------------------------------------- * Syntax: optional ;; allowed in compilation units and structures (back by popular demand) @@ -4155,7 +4157,7 @@ no calls to ranlib in Solaris * Standard library: added List.memq; documentation of Array fixed. -Caml Special Light 1.06: ------------------------- +Caml Special Light 1.06 (12 Sep 1995): +-------------------------------------- * First public release. From c2e853741d2055fd3adea6b47329ea488c4341f4 Mon Sep 17 00:00:00 2001 From: Gabriel Scherer <gabriel.scherer@gmail.com> Date: Sun, 31 May 2015 08:05:49 +0000 Subject: [PATCH 278/494] minor Changelog changes git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16146 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Changes b/Changes index c90df24be8..2c6e8d543c 100644 --- a/Changes +++ b/Changes @@ -83,14 +83,14 @@ Bug fixes: - PR#5395: OCamlbuild mishandles relative symlinks and include paths (Damien Doligez, report by Didier Le Botlan) - PR#5822: wrong value of Options.ext_dll on windows - (Damien Doligez and user 'daweil') + (Damien Doligez and Daniel Weil) - PR#5836, PR#6684: printing lazy values in ocamldebug may segfault (Gabriel Scherer, request by the Coq team) - PR#5887: move the byterun/*.h headers to byterun/caml/*.h to avoid header name clashes (Jérôme Vouillon and Adrien Nader and Peter Zotov) - PR#6281: Graphics window does not acknowledge second click (double click) - (user 'kygron') + (Kyle Headley) - PR#6490: incorrect backtraces in gdb on AArch64. Also fixes incorrect backtraces on 32-bit ARM. (Mark Shinwell) @@ -105,7 +105,7 @@ Bug fixes: - PR#6617: allow android build with pthreads support (since SDK r10c) (Peter Zotov) - PR#6626: ocamlbuild on cygwin cannot find ocamlfind - (user 'algoriddle') + (Gergely Szilvasy) - PR#6628: Configure script rejects legitimate arguments (Michael Grünewald, Damien Doligez) - PR#6630: Failure of tests/prim-bigstring/{big,}string.ml on big-endian @@ -168,7 +168,7 @@ Bug fixes: - PR#6793: ocamlbuild passes nonsensical "-ocamlc ..." commands to menhir (Gabriel Scherer, report by Damien Doligez) - PR#6799: include guards missing for unixsupport.h and other files - (user 'aha') + (Andreas Hauptmann) - PR#6810: Improve documentation of Bigarray.Genarray.map_file (Mark Shinwell and Daniel Bünzli) - PR#6812: -short-paths and -no-alias-deps can create inconsistent assumptions @@ -178,7 +178,7 @@ Bug fixes: - PR#6824: fix buffer sharing on partial application of Format.asprintf (Gabriel Scherer, report by Alain Frisch) - PR#6831: Build breaks for -aspp gcc on solaris-like OSs - (user 'JT') + (John Tibble) - PR#6836: Assertion failure using -short-paths (Jacques Garrigue, report by David Sheets) - PR#6837: Build profiling libraries on FreeBSD and NetBSD x86-64 @@ -200,8 +200,8 @@ Bug fixes: - PR#6872: Type-directed propagation fails to disambiguate variants that are also exception constructors (Jacques Garrigue, report by Romain Beauxis) -- PR#6879: Wrong optimization of 1 mod n (Mark Shinwell, report by - (Jean-Christophe Filliâtre) +- PR#6879: Wrong optimization of 1 mod n + (Mark Shinwell, report by Jean-Christophe Filliâtre) - GPR#143: fix getsockopt behaviour for boolean socket options (Anil Madhavapeddy and Andrew Ray) - Misplaced assertion in major_gc.c for no-naked-pointers mode @@ -273,6 +273,8 @@ Standard library: (Jacques Garrigue, report by Mark Shinwell) - PR#6572: Fatal error with recursive modules (Jacques Garrigue, report by Quentin Stievenart) +- PR#6575: Array.init evaluates callback although it should not do so + (Alain Frisch, report by Gerd Stolpmann) - PR#6578: Recursive module containing alias causes Segmentation fault (Jacques Garrigue) - PR#6581: Some bugs in generative functors @@ -583,7 +585,7 @@ Features wishes: - PR#4855: 'camlp4 -I +dir' accepted, dir is relative to 'camlp4 -where' (Jun Furuse and Hongbo Zhang, report by Dmitry Grebeniuk) - PR#5201: ocamlbuild: add --norc to the bash invocation to help performances - (user 'daweil') + (Daniel Weil) - PR#5650: Camlp4FoldGenerator doesn't handle well "abstract" types (Hongbo Zhang) - PR#5808: allow simple patterns, not just identifiers, in "let p : t = ..." From 3cb0234fd6d75081c44a91c5856bc808465c810b Mon Sep 17 00:00:00 2001 From: Fabrice Le Fessant <Fabrice.Le_fessant@inria.fr> Date: Mon, 1 Jun 2015 13:08:17 +0000 Subject: [PATCH 279/494] Add @since 4.02.0 to __LOC__, etc. git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16148 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- stdlib/pervasives.mli | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/stdlib/pervasives.mli b/stdlib/pervasives.mli index 4d63a41ef5..15423a33e5 100644 --- a/stdlib/pervasives.mli +++ b/stdlib/pervasives.mli @@ -147,39 +147,55 @@ external ( or ) : bool -> bool -> bool = "%sequor" external __LOC__ : string = "%loc_LOC" (** [__LOC__] returns the location at which this expression appears in the file currently being parsed by the compiler, with the standard - error format of OCaml: "File %S, line %d, characters %d-%d" *) + error format of OCaml: "File %S, line %d, characters %d-%d". + @since 4.02.0 + *) external __FILE__ : string = "%loc_FILE" (** [__FILE__] returns the name of the file currently being - parsed by the compiler. *) + parsed by the compiler. + @since 4.02.0 +*) external __LINE__ : int = "%loc_LINE" (** [__LINE__] returns the line number at which this expression - appears in the file currently being parsed by the compiler. *) + appears in the file currently being parsed by the compiler. + @since 4.02.0 + *) external __MODULE__ : string = "%loc_MODULE" (** [__MODULE__] returns the module name of the file being - parsed by the compiler. *) + parsed by the compiler. + @since 4.02.0 + *) external __POS__ : string * int * int * int = "%loc_POS" (** [__POS__] returns a tuple [(file,lnum,cnum,enum)], corresponding to the location at which this expression appears in the file currently being parsed by the compiler. [file] is the current filename, [lnum] the line number, [cnum] the character position in - the line and [enum] the last character position in the line. *) + the line and [enum] the last character position in the line. + @since 4.02.0 + *) external __LOC_OF__ : 'a -> string * 'a = "%loc_LOC" (** [__LOC_OF__ expr] returns a pair [(loc, expr)] where [loc] is the location of [expr] in the file currently being parsed by the compiler, with the standard error format of OCaml: "File %S, line - %d, characters %d-%d" *) + %d, characters %d-%d". + @since 4.02.0 + *) external __LINE_OF__ : 'a -> int * 'a = "%loc_LINE" (** [__LINE__ expr] returns a pair [(line, expr)], where [line] is the line number at which the expression [expr] appears in the file - currently being parsed by the compiler. *) + currently being parsed by the compiler. + @since 4.02.0 + *) external __POS_OF__ : 'a -> (string * int * int * int) * 'a = "%loc_POS" (** [__POS_OF__ expr] returns a pair [(expr,loc)], where [loc] is a tuple [(file,lnum,cnum,enum)] corresponding to the location at which the expression [expr] appears in the file currently being parsed by the compiler. [file] is the current filename, [lnum] the line number, [cnum] the character position in the line and [enum] - the last character position in the line. *) + the last character position in the line. + @since 4.02.0 + *) (** {6 Composition operators} *) From 1c5c6d7e228a174ddcd070e7afbfccdb547a51b7 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 2 Jun 2015 15:16:56 +0000 Subject: [PATCH 280/494] PR#6884: The __CYGWIN32__ #define should be replaced with __CYGWIN__ git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16149 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ byterun/floats.c | 3 ++- byterun/unix.c | 8 ++++---- stdlib/header.c | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Changes b/Changes index 2c6e8d543c..442a16bde9 100644 --- a/Changes +++ b/Changes @@ -202,6 +202,8 @@ Bug fixes: (Jacques Garrigue, report by Romain Beauxis) - PR#6879: Wrong optimization of 1 mod n (Mark Shinwell, report by Jean-Christophe Filliâtre) +- PR#6884: The __CYGWIN32__ #define should be replaced with __CYGWIN__ + (Adrien Nader) - GPR#143: fix getsockopt behaviour for boolean socket options (Anil Madhavapeddy and Andrew Ray) - Misplaced assertion in major_gc.c for no-naked-pointers mode diff --git a/byterun/floats.c b/byterun/floats.c index b2fac8ad25..de18c33376 100644 --- a/byterun/floats.c +++ b/byterun/floats.c @@ -453,7 +453,8 @@ enum { FP_normal, FP_subnormal, FP_zero, FP_infinite, FP_nan }; CAMLprim value caml_classify_float(value vd) { /* Cygwin 1.3 has problems with fpclassify (PR#1293), so don't use it */ -#if defined(fpclassify) && !defined(__CYGWIN32__) && !defined(__MINGW32__) + /* FIXME Cygwin 1.3 is ancient! Revisit this decision. */ +#if defined(fpclassify) && !defined(__CYGWIN__) && !defined(__MINGW32__) switch (fpclassify(Double_val(vd))) { case FP_NAN: return Val_int(FP_nan); diff --git a/byterun/unix.c b/byterun/unix.c index a76ab22f72..38ddee0056 100644 --- a/byterun/unix.c +++ b/byterun/unix.c @@ -24,7 +24,7 @@ #include <fcntl.h> #include "caml/config.h" #ifdef SUPPORT_DYNAMIC_LINKING -#ifdef __CYGWIN32__ +#ifdef __CYGWIN__ #include "flexdll.h" #else #include <dlfcn.h> @@ -86,7 +86,7 @@ char * caml_search_in_path(struct ext_table * path, char * name) return caml_strdup(name); } -#ifdef __CYGWIN32__ +#ifdef __CYGWIN__ /* Cygwin needs special treatment because of the implicit ".exe" at the end of executable file names */ @@ -137,7 +137,7 @@ char * caml_search_exe_in_path(char * name) caml_ext_table_init(&path, 8); tofree = caml_decompose_path(&path, getenv("PATH")); -#ifndef __CYGWIN32__ +#ifndef __CYGWIN__ res = caml_search_in_path(&path, name); #else res = cygwin_search_exe_in_path(&path, name); @@ -159,7 +159,7 @@ char * caml_search_dll_in_path(struct ext_table * path, char * name) } #ifdef SUPPORT_DYNAMIC_LINKING -#ifdef __CYGWIN32__ +#ifdef __CYGWIN__ /* Use flexdll */ void * caml_dlopen(char * libname, int for_execution, int global) diff --git a/stdlib/header.c b/stdlib/header.c index 5caed8d8ac..b8d02ea1f2 100644 --- a/stdlib/header.c +++ b/stdlib/header.c @@ -40,7 +40,7 @@ char * default_runtime_path = RUNTIME_NAME; #define SEEK_END 2 #endif -#ifndef __CYGWIN32__ +#ifndef __CYGWIN__ /* Normal Unix search path function */ From 9073f1b51009a50635833a30185ff598fe1b8c87 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Wed, 3 Jun 2015 14:57:22 +0000 Subject: [PATCH 281/494] GPR#190: typo in pervasives git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16151 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ stdlib/pervasives.mli | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index 442a16bde9..e751808327 100644 --- a/Changes +++ b/Changes @@ -206,6 +206,8 @@ Bug fixes: (Adrien Nader) - GPR#143: fix getsockopt behaviour for boolean socket options (Anil Madhavapeddy and Andrew Ray) +- GPR#190: typo in pervasives + (Guillaume Bury) - Misplaced assertion in major_gc.c for no-naked-pointers mode (Stephen Dolan, Mark Shinwell) diff --git a/stdlib/pervasives.mli b/stdlib/pervasives.mli index 15423a33e5..f2b684ff3c 100644 --- a/stdlib/pervasives.mli +++ b/stdlib/pervasives.mli @@ -188,7 +188,7 @@ external __LINE_OF__ : 'a -> int * 'a = "%loc_LINE" @since 4.02.0 *) external __POS_OF__ : 'a -> (string * int * int * int) * 'a = "%loc_POS" -(** [__POS_OF__ expr] returns a pair [(expr,loc)], where [loc] is a +(** [__POS_OF__ expr] returns a pair [(loc,expr)], where [loc] is a tuple [(file,lnum,cnum,enum)] corresponding to the location at which the expression [expr] appears in the file currently being parsed by the compiler. [file] is the current filename, [lnum] the From bbd9b2a6f63f3553c22de4d2fa94981e66129ee6 Mon Sep 17 00:00:00 2001 From: Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> Date: Wed, 3 Jun 2015 23:00:01 +0000 Subject: [PATCH 282/494] Fix PR#6886 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16153 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ typing/env.ml | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Changes b/Changes index e751808327..dedfa69c8d 100644 --- a/Changes +++ b/Changes @@ -204,6 +204,8 @@ Bug fixes: (Mark Shinwell, report by Jean-Christophe Filliâtre) - PR#6884: The __CYGWIN32__ #define should be replaced with __CYGWIN__ (Adrien Nader) +- PR#6886: -no-alias-deps allows to build self-referential compilation units + (Jacques Garrigue, report by sliquister) - GPR#143: fix getsockopt behaviour for boolean socket options (Anil Madhavapeddy and Andrew Ray) - GPR#190: typo in pervasives diff --git a/typing/env.ml b/typing/env.ml index 95e6c602e6..b11be4d8ba 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -441,7 +441,7 @@ let rec find_module_descr path env = let (p, desc) = EnvTbl.find_same id env.components in desc with Not_found -> - if Ident.persistent id + if Ident.persistent id && not (Ident.name id = !current_unit) then (find_pers_struct (Ident.name id)).ps_comps else raise Not_found end @@ -505,7 +505,7 @@ let find_module ~alias path env = let (p, data) = EnvTbl.find_same id env.modules in data with Not_found -> - if Ident.persistent id then + if Ident.persistent id && not (Ident.name id = !current_unit) then let ps = find_pers_struct (Ident.name id) in md (Mty_signature(ps.ps_sig)) else raise Not_found From 8935852894b267a692395310acfbb79219929204 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Thu, 4 Jun 2015 17:10:06 +0000 Subject: [PATCH 283/494] fix reporter's name git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16154 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Changes b/Changes index dedfa69c8d..e73c0c2516 100644 --- a/Changes +++ b/Changes @@ -205,7 +205,7 @@ Bug fixes: - PR#6884: The __CYGWIN32__ #define should be replaced with __CYGWIN__ (Adrien Nader) - PR#6886: -no-alias-deps allows to build self-referential compilation units - (Jacques Garrigue, report by sliquister) + (Jacques Garrigue, report by Valentin Gatien-Baron) - GPR#143: fix getsockopt behaviour for boolean socket options (Anil Madhavapeddy and Andrew Ray) - GPR#190: typo in pervasives From 2283df9589ec315ae176da5bbdc6cee93e0081c2 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Thu, 4 Jun 2015 17:30:13 +0000 Subject: [PATCH 284/494] PR#6889: ast_mapper fails to rewrite class attributes git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16155 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ parsing/ast_mapper.ml | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/Changes b/Changes index e73c0c2516..da7b8fcd8d 100644 --- a/Changes +++ b/Changes @@ -206,6 +206,8 @@ Bug fixes: (Adrien Nader) - PR#6886: -no-alias-deps allows to build self-referential compilation units (Jacques Garrigue, report by Valentin Gatien-Baron) +- PR#6889: ast_mapper fails to rewrite class attributes + (Sébastien Briais) - GPR#143: fix getsockopt behaviour for boolean socket options (Anil Madhavapeddy and Andrew Ray) - GPR#190: typo in pervasives diff --git a/parsing/ast_mapper.ml b/parsing/ast_mapper.ml index 669d01449c..d57dabb90e 100644 --- a/parsing/ast_mapper.ml +++ b/parsing/ast_mapper.ml @@ -174,6 +174,7 @@ module CT = struct let map sub {pcty_loc = loc; pcty_desc = desc; pcty_attributes = attrs} = let open Cty in let loc = sub.location sub loc in + let attrs = sub.attributes sub attrs in match desc with | Pcty_constr (lid, tys) -> constr ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tys) @@ -186,6 +187,7 @@ module CT = struct = let open Ctf in let loc = sub.location sub loc in + let attrs = sub.attributes sub attrs in match desc with | Pctf_inherit ct -> inherit_ ~loc ~attrs (sub.class_type sub ct) | Pctf_val (s, m, v, t) -> val_ ~loc ~attrs s m v (sub.typ sub t) @@ -410,6 +412,7 @@ module CE = struct let map sub {pcl_loc = loc; pcl_desc = desc; pcl_attributes = attrs} = let open Cl in let loc = sub.location sub loc in + let attrs = sub.attributes sub attrs in match desc with | Pcl_constr (lid, tys) -> constr ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tys) @@ -437,6 +440,7 @@ module CE = struct let map_field sub {pcf_desc = desc; pcf_loc = loc; pcf_attributes = attrs} = let open Cf in let loc = sub.location sub loc in + let attrs = sub.attributes sub attrs in match desc with | Pcf_inherit (o, ce, s) -> inherit_ ~loc ~attrs o (sub.class_expr sub ce) s | Pcf_val (s, m, k) -> val_ ~loc ~attrs (map_loc sub s) m (map_kind sub k) From 5000f26513fe287b14e98d740e860b99636f2eba Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Thu, 4 Jun 2015 19:59:00 +0000 Subject: [PATCH 285/494] GPR#191: Making gc.h and some part of memory.h public git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16156 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- .depend | 65 ++-- Changes | 2 + asmrun/.depend | 585 +++++++++++++++++++---------------- asmrun/signals_asm.c | 11 +- byterun/.depend | 508 ++++++++++++++++-------------- byterun/Makefile.common | 3 +- byterun/caml/address_class.h | 93 ++++++ byterun/caml/memory.h | 40 +-- byterun/caml/minor_gc.h | 6 +- byterun/compact.c | 3 +- byterun/memory.c | 1 + byterun/win32.c | 7 +- otherlibs/bigarray/.depend | 2 +- otherlibs/graph/.depend | 10 +- otherlibs/num/.depend | 3 +- otherlibs/str/.depend | 2 +- otherlibs/systhreads/.depend | 10 +- otherlibs/threads/.depend | 14 +- otherlibs/unix/.depend | 162 ++++++---- 19 files changed, 862 insertions(+), 665 deletions(-) create mode 100644 byterun/caml/address_class.h diff --git a/.depend b/.depend index 7f7c43c5e7..27df28160c 100644 --- a/.depend +++ b/.depend @@ -28,12 +28,13 @@ parsing/ast_helper.cmi : parsing/parsetree.cmi parsing/longident.cmi \ parsing/location.cmi parsing/docstrings.cmi parsing/asttypes.cmi parsing/ast_mapper.cmi : parsing/parsetree.cmi parsing/location.cmi parsing/asttypes.cmi : parsing/location.cmi -parsing/docstrings.cmi : parsing/location.cmi parsing/parsetree.cmi +parsing/docstrings.cmi : parsing/parsetree.cmi parsing/location.cmi parsing/lexer.cmi : parsing/parser.cmi parsing/location.cmi parsing/location.cmi : utils/warnings.cmi parsing/longident.cmi : parsing/parse.cmi : parsing/parsetree.cmi -parsing/parser.cmi : parsing/parsetree.cmi parsing/location.cmi +parsing/parser.cmi : parsing/parsetree.cmi parsing/location.cmi \ + parsing/docstrings.cmi parsing/parsetree.cmi : parsing/longident.cmi parsing/location.cmi \ parsing/asttypes.cmi parsing/pprintast.cmi : parsing/parsetree.cmi parsing/longident.cmi \ @@ -54,10 +55,10 @@ parsing/ast_mapper.cmx : parsing/parsetree.cmi utils/misc.cmx \ parsing/longident.cmx parsing/location.cmx utils/config.cmx \ utils/clflags.cmx parsing/asttypes.cmi parsing/ast_helper.cmx \ parsing/ast_mapper.cmi -parsing/docstrings.cmo : utils/warnings.cmi parsing/location.cmi \ - parsing/docstrings.cmi -parsing/docstrings.cmx : utils/warnings.cmx parsing/location.cmx \ - parsing/docstrings.cmi +parsing/docstrings.cmo : utils/warnings.cmi parsing/parsetree.cmi \ + parsing/location.cmi parsing/asttypes.cmi parsing/docstrings.cmi +parsing/docstrings.cmx : utils/warnings.cmx parsing/parsetree.cmi \ + parsing/location.cmx parsing/asttypes.cmi parsing/docstrings.cmi parsing/lexer.cmo : utils/warnings.cmi parsing/parser.cmi utils/misc.cmi \ parsing/location.cmi parsing/docstrings.cmi parsing/lexer.cmi parsing/lexer.cmx : utils/warnings.cmx parsing/parser.cmx utils/misc.cmx \ @@ -75,11 +76,13 @@ parsing/parse.cmx : parsing/syntaxerr.cmx parsing/parser.cmx \ parsing/location.cmx parsing/lexer.cmx parsing/docstrings.cmx \ parsing/parse.cmi parsing/parser.cmo : parsing/syntaxerr.cmi parsing/parsetree.cmi \ - parsing/longident.cmi parsing/location.cmi utils/clflags.cmi \ - parsing/asttypes.cmi parsing/ast_helper.cmi parsing/parser.cmi + parsing/longident.cmi parsing/location.cmi parsing/docstrings.cmi \ + utils/clflags.cmi parsing/asttypes.cmi parsing/ast_helper.cmi \ + parsing/parser.cmi parsing/parser.cmx : parsing/syntaxerr.cmx parsing/parsetree.cmi \ - parsing/longident.cmx parsing/location.cmx utils/clflags.cmx \ - parsing/asttypes.cmi parsing/ast_helper.cmx parsing/parser.cmi + parsing/longident.cmx parsing/location.cmx parsing/docstrings.cmx \ + utils/clflags.cmx parsing/asttypes.cmi parsing/ast_helper.cmx \ + parsing/parser.cmi parsing/pprintast.cmo : parsing/parsetree.cmi utils/misc.cmi \ parsing/longident.cmi parsing/location.cmi parsing/asttypes.cmi \ parsing/pprintast.cmi @@ -294,20 +297,20 @@ typing/typeclass.cmo : utils/warnings.cmi typing/typetexp.cmi \ typing/types.cmi typing/typedtree.cmi typing/typedecl.cmi \ typing/typecore.cmi parsing/syntaxerr.cmi typing/subst.cmi \ typing/stypes.cmi typing/printtyp.cmi typing/predef.cmi typing/path.cmi \ - parsing/parsetree.cmi typing/parmatch.cmi utils/misc.cmi \ - parsing/longident.cmi parsing/location.cmi typing/includeclass.cmi \ - typing/ident.cmi typing/env.cmi typing/ctype.cmi typing/cmt_format.cmi \ - utils/clflags.cmi typing/btype.cmi parsing/asttypes.cmi \ - parsing/ast_helper.cmi typing/typeclass.cmi + parsing/parsetree.cmi utils/misc.cmi parsing/longident.cmi \ + parsing/location.cmi typing/includeclass.cmi typing/ident.cmi \ + typing/env.cmi typing/ctype.cmi typing/cmt_format.cmi utils/clflags.cmi \ + typing/btype.cmi parsing/asttypes.cmi parsing/ast_helper.cmi \ + typing/typeclass.cmi typing/typeclass.cmx : utils/warnings.cmx typing/typetexp.cmx \ typing/types.cmx typing/typedtree.cmx typing/typedecl.cmx \ typing/typecore.cmx parsing/syntaxerr.cmx typing/subst.cmx \ typing/stypes.cmx typing/printtyp.cmx typing/predef.cmx typing/path.cmx \ - parsing/parsetree.cmi typing/parmatch.cmx utils/misc.cmx \ - parsing/longident.cmx parsing/location.cmx typing/includeclass.cmx \ - typing/ident.cmx typing/env.cmx typing/ctype.cmx typing/cmt_format.cmx \ - utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi \ - parsing/ast_helper.cmx typing/typeclass.cmi + parsing/parsetree.cmi utils/misc.cmx parsing/longident.cmx \ + parsing/location.cmx typing/includeclass.cmx typing/ident.cmx \ + typing/env.cmx typing/ctype.cmx typing/cmt_format.cmx utils/clflags.cmx \ + typing/btype.cmx parsing/asttypes.cmi parsing/ast_helper.cmx \ + typing/typeclass.cmi typing/typecore.cmo : utils/warnings.cmi typing/typetexp.cmi \ typing/types.cmi typing/typedtree.cmi parsing/syntaxerr.cmi \ typing/subst.cmi typing/stypes.cmi typing/printtyp.cmi \ @@ -441,15 +444,17 @@ bytecomp/bytelibrarian.cmx : utils/misc.cmx parsing/location.cmx \ utils/config.cmx bytecomp/cmo_format.cmi utils/clflags.cmx \ bytecomp/bytelink.cmx bytecomp/bytelibrarian.cmi bytecomp/bytelink.cmo : utils/warnings.cmi bytecomp/symtable.cmi \ - bytecomp/opcodes.cmo utils/misc.cmi parsing/location.cmi typing/ident.cmi \ - bytecomp/dll.cmi utils/consistbl.cmi utils/config.cmi \ - bytecomp/cmo_format.cmi utils/clflags.cmi utils/ccomp.cmi \ - bytecomp/bytesections.cmi bytecomp/bytelink.cmi + bytecomp/opcodes.cmo utils/misc.cmi parsing/location.cmi \ + bytecomp/instruct.cmi typing/ident.cmi bytecomp/dll.cmi \ + utils/consistbl.cmi utils/config.cmi bytecomp/cmo_format.cmi \ + utils/clflags.cmi utils/ccomp.cmi bytecomp/bytesections.cmi \ + bytecomp/bytelink.cmi bytecomp/bytelink.cmx : utils/warnings.cmx bytecomp/symtable.cmx \ - bytecomp/opcodes.cmx utils/misc.cmx parsing/location.cmx typing/ident.cmx \ - bytecomp/dll.cmx utils/consistbl.cmx utils/config.cmx \ - bytecomp/cmo_format.cmi utils/clflags.cmx utils/ccomp.cmx \ - bytecomp/bytesections.cmx bytecomp/bytelink.cmi + bytecomp/opcodes.cmx utils/misc.cmx parsing/location.cmx \ + bytecomp/instruct.cmx typing/ident.cmx bytecomp/dll.cmx \ + utils/consistbl.cmx utils/config.cmx bytecomp/cmo_format.cmi \ + utils/clflags.cmx utils/ccomp.cmx bytecomp/bytesections.cmx \ + bytecomp/bytelink.cmi bytecomp/bytepackager.cmo : typing/typemod.cmi bytecomp/translmod.cmi \ typing/subst.cmi bytecomp/printlambda.cmi typing/path.cmi utils/misc.cmi \ parsing/location.cmi bytecomp/instruct.cmi typing/ident.cmi \ @@ -530,12 +535,12 @@ bytecomp/switch.cmo : bytecomp/switch.cmi bytecomp/switch.cmx : bytecomp/switch.cmi bytecomp/symtable.cmo : utils/tbl.cmi bytecomp/runtimedef.cmi \ typing/predef.cmi utils/misc.cmi bytecomp/meta.cmi parsing/location.cmi \ - bytecomp/lambda.cmi typing/ident.cmi bytecomp/dll.cmi \ + bytecomp/lambda.cmi typing/ident.cmi bytecomp/dll.cmi utils/config.cmi \ bytecomp/cmo_format.cmi utils/clflags.cmi bytecomp/bytesections.cmi \ parsing/asttypes.cmi bytecomp/symtable.cmi bytecomp/symtable.cmx : utils/tbl.cmx bytecomp/runtimedef.cmx \ typing/predef.cmx utils/misc.cmx bytecomp/meta.cmx parsing/location.cmx \ - bytecomp/lambda.cmx typing/ident.cmx bytecomp/dll.cmx \ + bytecomp/lambda.cmx typing/ident.cmx bytecomp/dll.cmx utils/config.cmx \ bytecomp/cmo_format.cmi utils/clflags.cmx bytecomp/bytesections.cmx \ parsing/asttypes.cmi bytecomp/symtable.cmi bytecomp/translclass.cmo : typing/types.cmi bytecomp/typeopt.cmi \ diff --git a/Changes b/Changes index da7b8fcd8d..403d3d4408 100644 --- a/Changes +++ b/Changes @@ -228,6 +228,8 @@ Feature wishes: (Christophe Troestler, review by Damien Doligez) - GPR#157: store the path of cmos inside debug section at link time (Hugo Heuzard, review by Damien Doligez) +- GPR#191: Making gc.h and some part of memory.h public + (Thomas Refis) OCaml 4.02.1 (14 Oct 2014): --------------------------- diff --git a/asmrun/.depend b/asmrun/.depend index ed5b1f26ac..fda72a28c8 100644 --- a/asmrun/.depend +++ b/asmrun/.depend @@ -4,36 +4,38 @@ alloc.o: alloc.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/custom.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/stacks.h \ - ../byterun/caml/memory.h + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/stacks.h ../byterun/caml/memory.h array.o: array.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h backtrace.o: backtrace.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/backtrace.h ../byterun/caml/memory.h \ ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h stack.h callback.o: callback.c ../byterun/caml/callback.h \ ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/mlvalues.h -compact.o: compact.c ../byterun/caml/config.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h +compact.o: compact.c ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ ../byterun/caml/finalise.h ../byterun/caml/roots.h \ - ../byterun/caml/misc.h ../byterun/caml/config.h ../byterun/caml/memory.h \ - ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/freelist.h \ ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ ../byterun/caml/major_gc.h ../byterun/caml/memory.h \ ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ @@ -43,15 +45,15 @@ compare.o: compare.c ../byterun/caml/custom.h ../byterun/caml/mlvalues.h \ ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h custom.o: custom.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/mlvalues.h + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h debugger.o: debugger.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ @@ -64,7 +66,8 @@ dynlink.o: dynlink.c ../byterun/caml/config.h \ ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/osdeps.h ../byterun/caml/prims.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/osdeps.h ../byterun/caml/prims.h \ ../byterun/caml/signals.h extern.o: extern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ @@ -73,40 +76,45 @@ extern.o: extern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/io.h \ ../byterun/caml/md5.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/reverse.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/reverse.h fail.o: fail.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/gc.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/printexc.h \ - ../byterun/caml/signals.h stack.h ../byterun/caml/roots.h \ - ../byterun/caml/memory.h ../byterun/caml/callback.h + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/printexc.h ../byterun/caml/signals.h stack.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h \ + ../byterun/caml/callback.h finalise.o: finalise.c ../byterun/caml/callback.h \ ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/signals.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/signals.h floats.o: floats.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/misc.h ../byterun/caml/reverse.h \ - ../byterun/caml/stacks.h ../byterun/caml/memory.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/reverse.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h freelist.o: freelist.c ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/freelist.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/mlvalues.h ../byterun/caml/gc.h \ ../byterun/caml/gc_ctrl.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/major_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h gc_ctrl.o: gc_ctrl.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ @@ -114,25 +122,26 @@ gc_ctrl.o: gc_ctrl.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/finalise.h ../byterun/caml/roots.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/gc.h \ - ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h stack.h + ../byterun/caml/address_class.h ../byterun/caml/freelist.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h globroots.o: globroots.c ../byterun/caml/memory.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/gc.h \ ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ - ../byterun/caml/memory.h ../byterun/caml/globroots.h \ - ../byterun/caml/roots.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h \ + ../byterun/caml/globroots.h ../byterun/caml/roots.h hash.o: hash.c ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/misc.h ../byterun/caml/custom.h \ ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/hash.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/hash.h intern.o: intern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ @@ -141,16 +150,16 @@ intern.o: intern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/io.h ../byterun/caml/io.h ../byterun/caml/md5.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ - ../byterun/caml/reverse.h + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h ../byterun/caml/reverse.h ints.o: ints.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/intext.h \ ../byterun/caml/io.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h io.o: io.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ ../byterun/caml/misc.h ../byterun/caml/config.h \ @@ -158,14 +167,16 @@ io.o: io.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/memory.h \ ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/signals.h ../byterun/caml/sys.h + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/signals.h \ + ../byterun/caml/sys.h lexing.o: lexing.c ../byterun/caml/fail.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/mlvalues.h ../byterun/caml/stacks.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h main.o: main.c ../byterun/caml/misc.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/mlvalues.h ../byterun/caml/misc.h ../byterun/caml/sys.h @@ -176,28 +187,29 @@ major_gc.o: major_gc.c ../byterun/caml/compact.h ../byterun/caml/config.h \ ../byterun/caml/fail.h ../byterun/caml/finalise.h \ ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ - ../byterun/caml/major_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ - ../byterun/caml/weak.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/weak.h md5.o: md5.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/fail.h ../byterun/caml/md5.h ../byterun/caml/io.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/io.h \ - ../byterun/caml/reverse.h -memory.o: memory.c ../byterun/caml/fail.h ../byterun/caml/misc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/io.h ../byterun/caml/reverse.h +memory.o: memory.c ../byterun/caml/address_class.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/fail.h ../byterun/caml/freelist.h ../byterun/caml/gc.h \ ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/signals.h + ../byterun/caml/address_class.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/signals.h meta.o: meta.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ @@ -206,51 +218,54 @@ meta.o: meta.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/prims.h \ - ../byterun/caml/stacks.h ../byterun/caml/memory.h + ../byterun/caml/address_class.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/prims.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h minor_gc.o: minor_gc.c ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/fail.h ../byterun/caml/misc.h ../byterun/caml/config.h \ ../byterun/caml/mlvalues.h ../byterun/caml/finalise.h \ ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/gc.h \ - ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ - ../byterun/caml/memory.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/roots.h ../byterun/caml/signals.h ../byterun/caml/weak.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ + ../byterun/caml/major_gc.h ../byterun/caml/memory.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/signals.h ../byterun/caml/weak.h misc.o: misc.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h natdynlink.o: natdynlink.c ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h stack.h \ - ../byterun/caml/callback.h ../byterun/caml/alloc.h \ - ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/osdeps.h \ - ../byterun/caml/fail.h ../byterun/caml/signals.h + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h stack.h ../byterun/caml/callback.h \ + ../byterun/caml/alloc.h ../byterun/caml/intext.h ../byterun/caml/io.h \ + ../byterun/caml/osdeps.h ../byterun/caml/fail.h \ + ../byterun/caml/signals.h obj.o: obj.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/interp.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/prims.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/prims.h parsing.o: parsing.c ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/alloc.h + ../byterun/caml/address_class.h ../byterun/caml/alloc.h printexc.o: printexc.c ../byterun/caml/backtrace.h \ ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ @@ -262,16 +277,18 @@ roots.o: roots.c ../byterun/caml/finalise.h ../byterun/caml/roots.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/globroots.h \ - ../byterun/caml/memory.h ../byterun/caml/major_gc.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h stack.h ../byterun/caml/roots.h -signals_asm.o: signals_asm.c ../byterun/caml/fail.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/globroots.h ../byterun/caml/memory.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h \ + ../byterun/caml/roots.h +signals_asm.o: signals_asm.c ../byterun/caml/address_class.h \ ../byterun/caml/misc.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/osdeps.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/fail.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/osdeps.h \ ../byterun/caml/signals.h ../byterun/caml/signals_machdep.h \ signals_osdep.h stack.h signals.o: signals.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ @@ -280,10 +297,11 @@ signals.o: signals.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/callback.h ../byterun/caml/config.h \ ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ - ../byterun/caml/memory.h ../byterun/caml/signals.h \ - ../byterun/caml/signals_machdep.h ../byterun/caml/sys.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h \ + ../byterun/caml/signals.h ../byterun/caml/signals_machdep.h \ + ../byterun/caml/sys.h startup.o: startup.c ../byterun/caml/callback.h \ ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ @@ -293,9 +311,9 @@ startup.o: startup.c ../byterun/caml/callback.h \ ../byterun/caml/gc_ctrl.h ../byterun/caml/intext.h ../byterun/caml/io.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/osdeps.h ../byterun/caml/printexc.h stack.h \ - ../byterun/caml/sys.h + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/osdeps.h \ + ../byterun/caml/printexc.h stack.h ../byterun/caml/sys.h str.o: str.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ @@ -309,7 +327,7 @@ sys.o: sys.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/signals.h ../byterun/caml/stacks.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/sys.h + ../byterun/caml/address_class.h ../byterun/caml/sys.h terminfo.o: terminfo.c ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ @@ -320,50 +338,53 @@ unix.o: unix.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/config.h ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ ../byterun/caml/misc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/osdeps.h + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/osdeps.h weak.o: weak.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/fail.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/mlvalues.h + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h alloc.d.o: alloc.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/custom.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/stacks.h \ - ../byterun/caml/memory.h + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/stacks.h ../byterun/caml/memory.h array.d.o: array.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h backtrace.d.o: backtrace.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/backtrace.h ../byterun/caml/memory.h \ ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h stack.h callback.d.o: callback.c ../byterun/caml/callback.h \ ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/mlvalues.h -compact.d.o: compact.c ../byterun/caml/config.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h +compact.d.o: compact.c ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ ../byterun/caml/finalise.h ../byterun/caml/roots.h \ - ../byterun/caml/misc.h ../byterun/caml/config.h ../byterun/caml/memory.h \ - ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/freelist.h \ ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ ../byterun/caml/major_gc.h ../byterun/caml/memory.h \ ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ @@ -373,15 +394,15 @@ compare.d.o: compare.c ../byterun/caml/custom.h ../byterun/caml/mlvalues.h \ ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h custom.d.o: custom.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/mlvalues.h + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h debugger.d.o: debugger.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ @@ -394,7 +415,8 @@ dynlink.d.o: dynlink.c ../byterun/caml/config.h \ ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/osdeps.h ../byterun/caml/prims.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/osdeps.h ../byterun/caml/prims.h \ ../byterun/caml/signals.h extern.d.o: extern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ @@ -403,40 +425,45 @@ extern.d.o: extern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/io.h \ ../byterun/caml/md5.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/reverse.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/reverse.h fail.d.o: fail.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/gc.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/printexc.h \ - ../byterun/caml/signals.h stack.h ../byterun/caml/roots.h \ - ../byterun/caml/memory.h ../byterun/caml/callback.h + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/printexc.h ../byterun/caml/signals.h stack.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h \ + ../byterun/caml/callback.h finalise.d.o: finalise.c ../byterun/caml/callback.h \ ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/signals.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/signals.h floats.d.o: floats.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/misc.h ../byterun/caml/reverse.h \ - ../byterun/caml/stacks.h ../byterun/caml/memory.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/reverse.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h freelist.d.o: freelist.c ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/freelist.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/mlvalues.h ../byterun/caml/gc.h \ ../byterun/caml/gc_ctrl.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/major_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h gc_ctrl.d.o: gc_ctrl.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ @@ -444,25 +471,26 @@ gc_ctrl.d.o: gc_ctrl.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/finalise.h ../byterun/caml/roots.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/gc.h \ - ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h stack.h + ../byterun/caml/address_class.h ../byterun/caml/freelist.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h globroots.d.o: globroots.c ../byterun/caml/memory.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/gc.h \ ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ - ../byterun/caml/memory.h ../byterun/caml/globroots.h \ - ../byterun/caml/roots.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h \ + ../byterun/caml/globroots.h ../byterun/caml/roots.h hash.d.o: hash.c ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/misc.h ../byterun/caml/custom.h \ ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/hash.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/hash.h intern.d.o: intern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ @@ -471,16 +499,16 @@ intern.d.o: intern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/io.h ../byterun/caml/io.h ../byterun/caml/md5.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ - ../byterun/caml/reverse.h + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h ../byterun/caml/reverse.h ints.d.o: ints.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/intext.h \ ../byterun/caml/io.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h io.d.o: io.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ ../byterun/caml/misc.h ../byterun/caml/config.h \ @@ -488,14 +516,16 @@ io.d.o: io.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/memory.h \ ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/signals.h ../byterun/caml/sys.h + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/signals.h \ + ../byterun/caml/sys.h lexing.d.o: lexing.c ../byterun/caml/fail.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/mlvalues.h ../byterun/caml/stacks.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h main.d.o: main.c ../byterun/caml/misc.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/mlvalues.h ../byterun/caml/misc.h ../byterun/caml/sys.h @@ -506,28 +536,29 @@ major_gc.d.o: major_gc.c ../byterun/caml/compact.h ../byterun/caml/config.h \ ../byterun/caml/fail.h ../byterun/caml/finalise.h \ ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ - ../byterun/caml/major_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ - ../byterun/caml/weak.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/weak.h md5.d.o: md5.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/fail.h ../byterun/caml/md5.h ../byterun/caml/io.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/io.h \ - ../byterun/caml/reverse.h -memory.d.o: memory.c ../byterun/caml/fail.h ../byterun/caml/misc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/io.h ../byterun/caml/reverse.h +memory.d.o: memory.c ../byterun/caml/address_class.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/fail.h ../byterun/caml/freelist.h ../byterun/caml/gc.h \ ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/signals.h + ../byterun/caml/address_class.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/signals.h meta.d.o: meta.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ @@ -536,51 +567,54 @@ meta.d.o: meta.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/prims.h \ - ../byterun/caml/stacks.h ../byterun/caml/memory.h + ../byterun/caml/address_class.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/prims.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h minor_gc.d.o: minor_gc.c ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/fail.h ../byterun/caml/misc.h ../byterun/caml/config.h \ ../byterun/caml/mlvalues.h ../byterun/caml/finalise.h \ ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/gc.h \ - ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ - ../byterun/caml/memory.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/roots.h ../byterun/caml/signals.h ../byterun/caml/weak.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ + ../byterun/caml/major_gc.h ../byterun/caml/memory.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/signals.h ../byterun/caml/weak.h misc.d.o: misc.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h natdynlink.d.o: natdynlink.c ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h stack.h \ - ../byterun/caml/callback.h ../byterun/caml/alloc.h \ - ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/osdeps.h \ - ../byterun/caml/fail.h ../byterun/caml/signals.h + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h stack.h ../byterun/caml/callback.h \ + ../byterun/caml/alloc.h ../byterun/caml/intext.h ../byterun/caml/io.h \ + ../byterun/caml/osdeps.h ../byterun/caml/fail.h \ + ../byterun/caml/signals.h obj.d.o: obj.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/interp.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/prims.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/prims.h parsing.d.o: parsing.c ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/alloc.h + ../byterun/caml/address_class.h ../byterun/caml/alloc.h printexc.d.o: printexc.c ../byterun/caml/backtrace.h \ ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ @@ -592,16 +626,18 @@ roots.d.o: roots.c ../byterun/caml/finalise.h ../byterun/caml/roots.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/globroots.h \ - ../byterun/caml/memory.h ../byterun/caml/major_gc.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h stack.h ../byterun/caml/roots.h -signals_asm.d.o: signals_asm.c ../byterun/caml/fail.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/globroots.h ../byterun/caml/memory.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h \ + ../byterun/caml/roots.h +signals_asm.d.o: signals_asm.c ../byterun/caml/address_class.h \ ../byterun/caml/misc.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/osdeps.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/fail.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/osdeps.h \ ../byterun/caml/signals.h ../byterun/caml/signals_machdep.h \ signals_osdep.h stack.h signals.d.o: signals.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ @@ -610,10 +646,11 @@ signals.d.o: signals.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/callback.h ../byterun/caml/config.h \ ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ - ../byterun/caml/memory.h ../byterun/caml/signals.h \ - ../byterun/caml/signals_machdep.h ../byterun/caml/sys.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h \ + ../byterun/caml/signals.h ../byterun/caml/signals_machdep.h \ + ../byterun/caml/sys.h startup.d.o: startup.c ../byterun/caml/callback.h \ ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ @@ -623,9 +660,9 @@ startup.d.o: startup.c ../byterun/caml/callback.h \ ../byterun/caml/gc_ctrl.h ../byterun/caml/intext.h ../byterun/caml/io.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/osdeps.h ../byterun/caml/printexc.h stack.h \ - ../byterun/caml/sys.h + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/osdeps.h \ + ../byterun/caml/printexc.h stack.h ../byterun/caml/sys.h str.d.o: str.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ @@ -639,7 +676,7 @@ sys.d.o: sys.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/signals.h ../byterun/caml/stacks.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/sys.h + ../byterun/caml/address_class.h ../byterun/caml/sys.h terminfo.d.o: terminfo.c ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ @@ -650,50 +687,53 @@ unix.d.o: unix.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/config.h ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ ../byterun/caml/misc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/osdeps.h + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/osdeps.h weak.d.o: weak.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/fail.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/mlvalues.h + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h alloc.p.o: alloc.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/custom.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/stacks.h \ - ../byterun/caml/memory.h + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/stacks.h ../byterun/caml/memory.h array.p.o: array.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h backtrace.p.o: backtrace.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/backtrace.h ../byterun/caml/memory.h \ ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h stack.h callback.p.o: callback.c ../byterun/caml/callback.h \ ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/mlvalues.h -compact.p.o: compact.c ../byterun/caml/config.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h +compact.p.o: compact.c ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ ../byterun/caml/finalise.h ../byterun/caml/roots.h \ - ../byterun/caml/misc.h ../byterun/caml/config.h ../byterun/caml/memory.h \ - ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/freelist.h \ ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ ../byterun/caml/major_gc.h ../byterun/caml/memory.h \ ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ @@ -703,15 +743,15 @@ compare.p.o: compare.c ../byterun/caml/custom.h ../byterun/caml/mlvalues.h \ ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h custom.p.o: custom.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/mlvalues.h + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h debugger.p.o: debugger.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ @@ -724,7 +764,8 @@ dynlink.p.o: dynlink.c ../byterun/caml/config.h \ ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/osdeps.h ../byterun/caml/prims.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/osdeps.h ../byterun/caml/prims.h \ ../byterun/caml/signals.h extern.p.o: extern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ @@ -733,40 +774,45 @@ extern.p.o: extern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/io.h \ ../byterun/caml/md5.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/reverse.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/reverse.h fail.p.o: fail.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/gc.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/printexc.h \ - ../byterun/caml/signals.h stack.h ../byterun/caml/roots.h \ - ../byterun/caml/memory.h ../byterun/caml/callback.h + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/printexc.h ../byterun/caml/signals.h stack.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h \ + ../byterun/caml/callback.h finalise.p.o: finalise.c ../byterun/caml/callback.h \ ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/signals.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/signals.h floats.p.o: floats.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/misc.h ../byterun/caml/reverse.h \ - ../byterun/caml/stacks.h ../byterun/caml/memory.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/reverse.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h freelist.p.o: freelist.c ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/freelist.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/mlvalues.h ../byterun/caml/gc.h \ ../byterun/caml/gc_ctrl.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/major_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h gc_ctrl.p.o: gc_ctrl.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ @@ -774,25 +820,26 @@ gc_ctrl.p.o: gc_ctrl.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/finalise.h ../byterun/caml/roots.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/gc.h \ - ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h stack.h + ../byterun/caml/address_class.h ../byterun/caml/freelist.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h globroots.p.o: globroots.c ../byterun/caml/memory.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/gc.h \ ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ - ../byterun/caml/memory.h ../byterun/caml/globroots.h \ - ../byterun/caml/roots.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h \ + ../byterun/caml/globroots.h ../byterun/caml/roots.h hash.p.o: hash.c ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/misc.h ../byterun/caml/custom.h \ ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/hash.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/hash.h intern.p.o: intern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ @@ -801,16 +848,16 @@ intern.p.o: intern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/io.h ../byterun/caml/io.h ../byterun/caml/md5.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ - ../byterun/caml/reverse.h + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h ../byterun/caml/reverse.h ints.p.o: ints.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/intext.h \ ../byterun/caml/io.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h io.p.o: io.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ ../byterun/caml/misc.h ../byterun/caml/config.h \ @@ -818,14 +865,16 @@ io.p.o: io.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/memory.h \ ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/signals.h ../byterun/caml/sys.h + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/signals.h \ + ../byterun/caml/sys.h lexing.p.o: lexing.c ../byterun/caml/fail.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/mlvalues.h ../byterun/caml/stacks.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h main.p.o: main.c ../byterun/caml/misc.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/mlvalues.h ../byterun/caml/misc.h ../byterun/caml/sys.h @@ -836,28 +885,29 @@ major_gc.p.o: major_gc.c ../byterun/caml/compact.h ../byterun/caml/config.h \ ../byterun/caml/fail.h ../byterun/caml/finalise.h \ ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ - ../byterun/caml/major_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ - ../byterun/caml/weak.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/weak.h md5.p.o: md5.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/fail.h ../byterun/caml/md5.h ../byterun/caml/io.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/io.h \ - ../byterun/caml/reverse.h -memory.p.o: memory.c ../byterun/caml/fail.h ../byterun/caml/misc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/io.h ../byterun/caml/reverse.h +memory.p.o: memory.c ../byterun/caml/address_class.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/fail.h ../byterun/caml/freelist.h ../byterun/caml/gc.h \ ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/signals.h + ../byterun/caml/address_class.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/signals.h meta.p.o: meta.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ @@ -866,51 +916,54 @@ meta.p.o: meta.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/prims.h \ - ../byterun/caml/stacks.h ../byterun/caml/memory.h + ../byterun/caml/address_class.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/prims.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h minor_gc.p.o: minor_gc.c ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/fail.h ../byterun/caml/misc.h ../byterun/caml/config.h \ ../byterun/caml/mlvalues.h ../byterun/caml/finalise.h \ ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/gc.h \ - ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ - ../byterun/caml/memory.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/roots.h ../byterun/caml/signals.h ../byterun/caml/weak.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ + ../byterun/caml/major_gc.h ../byterun/caml/memory.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/signals.h ../byterun/caml/weak.h misc.p.o: misc.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h natdynlink.p.o: natdynlink.c ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h stack.h \ - ../byterun/caml/callback.h ../byterun/caml/alloc.h \ - ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/osdeps.h \ - ../byterun/caml/fail.h ../byterun/caml/signals.h + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h stack.h ../byterun/caml/callback.h \ + ../byterun/caml/alloc.h ../byterun/caml/intext.h ../byterun/caml/io.h \ + ../byterun/caml/osdeps.h ../byterun/caml/fail.h \ + ../byterun/caml/signals.h obj.p.o: obj.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/interp.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/prims.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/prims.h parsing.p.o: parsing.c ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/alloc.h + ../byterun/caml/address_class.h ../byterun/caml/alloc.h printexc.p.o: printexc.c ../byterun/caml/backtrace.h \ ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ @@ -922,16 +975,18 @@ roots.p.o: roots.c ../byterun/caml/finalise.h ../byterun/caml/roots.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/globroots.h \ - ../byterun/caml/memory.h ../byterun/caml/major_gc.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h stack.h ../byterun/caml/roots.h -signals_asm.p.o: signals_asm.c ../byterun/caml/fail.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/globroots.h ../byterun/caml/memory.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h \ + ../byterun/caml/roots.h +signals_asm.p.o: signals_asm.c ../byterun/caml/address_class.h \ ../byterun/caml/misc.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/osdeps.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/fail.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/osdeps.h \ ../byterun/caml/signals.h ../byterun/caml/signals_machdep.h \ signals_osdep.h stack.h signals.p.o: signals.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ @@ -940,10 +995,11 @@ signals.p.o: signals.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/callback.h ../byterun/caml/config.h \ ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ - ../byterun/caml/memory.h ../byterun/caml/signals.h \ - ../byterun/caml/signals_machdep.h ../byterun/caml/sys.h + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h \ + ../byterun/caml/signals.h ../byterun/caml/signals_machdep.h \ + ../byterun/caml/sys.h startup.p.o: startup.c ../byterun/caml/callback.h \ ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ @@ -953,9 +1009,9 @@ startup.p.o: startup.c ../byterun/caml/callback.h \ ../byterun/caml/gc_ctrl.h ../byterun/caml/intext.h ../byterun/caml/io.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/osdeps.h ../byterun/caml/printexc.h stack.h \ - ../byterun/caml/sys.h + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/osdeps.h \ + ../byterun/caml/printexc.h stack.h ../byterun/caml/sys.h str.p.o: str.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ @@ -969,7 +1025,7 @@ sys.p.o: sys.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/signals.h ../byterun/caml/stacks.h \ ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/sys.h + ../byterun/caml/address_class.h ../byterun/caml/sys.h terminfo.p.o: terminfo.c ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ @@ -980,11 +1036,12 @@ unix.p.o: unix.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/config.h ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ ../byterun/caml/misc.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/osdeps.h + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/osdeps.h weak.p.o: weak.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ ../byterun/caml/fail.h ../byterun/caml/major_gc.h \ ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/mlvalues.h + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h diff --git a/asmrun/signals_asm.c b/asmrun/signals_asm.c index d0259b9630..23507a0cd3 100644 --- a/asmrun/signals_asm.c +++ b/asmrun/signals_asm.c @@ -19,6 +19,7 @@ #include <signal.h> #include <errno.h> #include <stdio.h> +#include "caml/address_class.h" #include "caml/fail.h" #include "caml/memory.h" #include "caml/osdeps.h" @@ -44,16 +45,6 @@ extern signal_handler caml_win32_signal(int sig, signal_handler action); extern void caml_win32_overflow_detection(); #endif -extern char * caml_code_area_start, * caml_code_area_end; -extern char caml_system__code_begin, caml_system__code_end; - -#define Is_in_code_area(pc) \ - ( ((char *)(pc) >= caml_code_area_start && \ - (char *)(pc) <= caml_code_area_end) \ -|| ((char *)(pc) >= &caml_system__code_begin && \ - (char *)(pc) <= &caml_system__code_end) \ -|| (Classify_addr(pc) & In_code_area) ) - /* This routine is the common entry point for garbage collection and signal handling. It can trigger a callback to OCaml code. With system threads, this callback can cause a context switch. diff --git a/byterun/.depend b/byterun/.depend index 6cfcbd2b55..ea58393c76 100644 --- a/byterun/.depend +++ b/byterun/.depend @@ -1,125 +1,133 @@ alloc.o: alloc.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/custom.h caml/major_gc.h caml/freelist.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h caml/mlvalues.h \ - caml/stacks.h caml/memory.h + caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ + caml/address_class.h caml/mlvalues.h caml/stacks.h caml/memory.h array.o: array.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/misc.h caml/mlvalues.h + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h backtrace.o: backtrace.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/mlvalues.h caml/config.h \ caml/misc.h caml/alloc.h caml/mlvalues.h caml/io.h caml/instruct.h \ caml/intext.h caml/io.h caml/exec.h caml/fix_code.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/startup.h \ - caml/exec.h caml/stacks.h caml/memory.h caml/sys.h caml/backtrace.h \ - caml/fail.h + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/startup.h caml/exec.h caml/stacks.h \ + caml/memory.h caml/sys.h caml/backtrace.h caml/fail.h callback.o: callback.c caml/callback.h caml/compatibility.h \ caml/mlvalues.h caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/misc.h caml/fail.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/mlvalues.h \ - caml/interp.h caml/instruct.h caml/fix_code.h caml/stacks.h \ - caml/memory.h -compact.o: compact.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/finalise.h caml/roots.h \ - caml/misc.h caml/config.h caml/memory.h caml/gc.h caml/mlvalues.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/freelist.h \ - caml/gc.h caml/gc_ctrl.h caml/major_gc.h caml/memory.h caml/mlvalues.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h caml/interp.h caml/instruct.h caml/fix_code.h \ + caml/stacks.h caml/memory.h +compact.o: compact.c caml/address_class.h caml/misc.h \ + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/mlvalues.h caml/config.h caml/finalise.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/freelist.h caml/gc.h \ + caml/gc_ctrl.h caml/major_gc.h caml/memory.h caml/mlvalues.h \ caml/roots.h caml/weak.h compare.o: compare.c caml/custom.h caml/compatibility.h caml/mlvalues.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h caml/misc.h \ caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/misc.h caml/mlvalues.h + caml/minor_gc.h caml/address_class.h caml/misc.h caml/mlvalues.h custom.o: custom.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/custom.h caml/fail.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/mlvalues.h + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h debugger.o: debugger.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/config.h caml/debugger.h caml/misc.h caml/fail.h \ caml/fix_code.h caml/instruct.h caml/intext.h caml/io.h caml/io.h \ caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/sys.h + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/sys.h dynlink.o: dynlink.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ caml/config.h caml/mlvalues.h caml/dynlink.h caml/fail.h caml/mlvalues.h \ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/misc.h caml/osdeps.h caml/prims.h caml/signals.h + caml/address_class.h caml/misc.h caml/osdeps.h caml/prims.h \ + caml/signals.h extern.o: extern.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \ caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/misc.h caml/mlvalues.h \ - caml/reverse.h + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h caml/reverse.h fail.o: fail.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/fail.h caml/io.h caml/gc.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/printexc.h caml/signals.h caml/stacks.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/misc.h caml/mlvalues.h caml/printexc.h caml/signals.h caml/stacks.h \ caml/memory.h finalise.o: finalise.c caml/callback.h caml/compatibility.h \ caml/mlvalues.h caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/misc.h caml/fail.h caml/mlvalues.h \ caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/signals.h + caml/minor_gc.h caml/address_class.h caml/signals.h fix_code.o: fix_code.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/debugger.h caml/misc.h \ caml/config.h caml/mlvalues.h caml/fix_code.h caml/instruct.h \ caml/intext.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/reverse.h + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/misc.h caml/mlvalues.h caml/reverse.h floats.o: floats.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/mlvalues.h caml/misc.h \ - caml/reverse.h caml/stacks.h caml/memory.h + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/mlvalues.h \ + caml/misc.h caml/reverse.h caml/stacks.h caml/memory.h freelist.o: freelist.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/freelist.h caml/misc.h \ caml/config.h caml/mlvalues.h caml/gc.h caml/gc_ctrl.h caml/memory.h \ caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/major_gc.h caml/misc.h caml/mlvalues.h + caml/address_class.h caml/major_gc.h caml/misc.h caml/mlvalues.h gc_ctrl.o: gc_ctrl.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/compact.h caml/custom.h caml/finalise.h \ caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h \ - caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/stacks.h + caml/minor_gc.h caml/address_class.h caml/freelist.h caml/gc.h \ + caml/gc_ctrl.h caml/major_gc.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/stacks.h globroots.o: globroots.c caml/memory.h caml/compatibility.h caml/config.h \ caml/../../config/m.h caml/../../config/s.h caml/gc.h caml/mlvalues.h \ - caml/misc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/roots.h caml/memory.h caml/globroots.h caml/roots.h + caml/misc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/memory.h caml/globroots.h caml/roots.h hash.o: hash.c caml/mlvalues.h caml/compatibility.h caml/config.h \ caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/custom.h \ caml/mlvalues.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/hash.h + caml/minor_gc.h caml/address_class.h caml/hash.h instrtrace.o: instrtrace.c intern.o: intern.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/callback.h caml/custom.h caml/fail.h caml/gc.h \ caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/mlvalues.h \ - caml/misc.h caml/reverse.h + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h caml/misc.h caml/reverse.h interp.o: interp.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/backtrace.h caml/callback.h caml/debugger.h \ caml/fail.h caml/fix_code.h caml/instrtrace.h caml/instruct.h \ caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h \ - caml/signals.h caml/stacks.h caml/memory.h caml/jumptbl.h + caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h caml/prims.h caml/signals.h caml/stacks.h caml/memory.h \ + caml/jumptbl.h ints.o: ints.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/custom.h caml/fail.h caml/intext.h caml/io.h \ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/misc.h caml/mlvalues.h + caml/address_class.h caml/misc.h caml/mlvalues.h io.o: io.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ caml/mlvalues.h caml/custom.h caml/fail.h caml/io.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/signals.h caml/sys.h + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/signals.h \ + caml/sys.h lexing.o: lexing.c caml/fail.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h main.o: main.c caml/misc.h caml/compatibility.h caml/config.h \ caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/misc.h \ caml/sys.h @@ -127,42 +135,46 @@ major_gc.o: major_gc.c caml/compact.h caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/misc.h caml/custom.h \ caml/mlvalues.h caml/config.h caml/fail.h caml/finalise.h caml/roots.h \ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h caml/misc.h \ - caml/mlvalues.h caml/roots.h caml/weak.h + caml/address_class.h caml/freelist.h caml/gc.h caml/gc_ctrl.h \ + caml/major_gc.h caml/misc.h caml/mlvalues.h caml/roots.h caml/weak.h md5.o: md5.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ caml/md5.h caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/mlvalues.h caml/io.h caml/reverse.h -memory.o: memory.c caml/fail.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h \ - caml/freelist.h caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ - caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/signals.h + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/mlvalues.h \ + caml/io.h caml/reverse.h +memory.o: memory.c caml/address_class.h caml/misc.h caml/compatibility.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/freelist.h caml/gc.h caml/gc_ctrl.h \ + caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/minor_gc.h caml/address_class.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/signals.h meta.o: meta.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/config.h caml/fail.h caml/fix_code.h caml/interp.h \ caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/minor_gc.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/prims.h caml/stacks.h caml/memory.h + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/stacks.h \ + caml/memory.h minor_gc.o: minor_gc.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ caml/config.h caml/mlvalues.h caml/finalise.h caml/roots.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/gc.h \ - caml/gc_ctrl.h caml/major_gc.h caml/memory.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/roots.h caml/signals.h caml/weak.h + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h \ + caml/memory.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/signals.h caml/weak.h misc.o: misc.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/compatibility.h caml/misc.h caml/config.h caml/memory.h caml/gc.h \ caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h + caml/minor_gc.h caml/address_class.h obj.o: obj.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ caml/gc.h caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/minor_gc.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/prims.h + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h parsing.o: parsing.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/mlvalues.h caml/config.h \ caml/misc.h caml/memory.h caml/gc.h caml/mlvalues.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/alloc.h + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/alloc.h prims.o: prims.c caml/mlvalues.h caml/compatibility.h caml/config.h \ caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/prims.h printexc.o: printexc.c caml/backtrace.h caml/mlvalues.h \ @@ -172,33 +184,35 @@ printexc.o: printexc.c caml/backtrace.h caml/mlvalues.h \ roots.o: roots.c caml/finalise.h caml/roots.h caml/misc.h \ caml/compatibility.h caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/memory.h caml/gc.h caml/mlvalues.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/globroots.h \ - caml/major_gc.h caml/memory.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/roots.h caml/stacks.h + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/globroots.h caml/major_gc.h caml/memory.h caml/minor_gc.h \ + caml/misc.h caml/mlvalues.h caml/roots.h caml/stacks.h signals_byt.o: signals_byt.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/memory.h caml/config.h \ caml/gc.h caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/osdeps.h caml/signals.h caml/signals_machdep.h + caml/minor_gc.h caml/address_class.h caml/osdeps.h caml/signals.h \ + caml/signals_machdep.h signals.o: signals.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/callback.h caml/config.h caml/fail.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/roots.h caml/memory.h caml/signals.h \ - caml/signals_machdep.h caml/sys.h + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/memory.h caml/signals.h caml/signals_machdep.h caml/sys.h stacks.o: stacks.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ caml/config.h caml/mlvalues.h caml/misc.h caml/mlvalues.h caml/stacks.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h startup.o: startup.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ caml/config.h caml/mlvalues.h caml/backtrace.h caml/callback.h \ caml/custom.h caml/debugger.h caml/dynlink.h caml/exec.h caml/fail.h \ caml/fix_code.h caml/freelist.h caml/gc_ctrl.h caml/instrtrace.h \ caml/interp.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/minor_gc.h \ - caml/misc.h caml/mlvalues.h caml/osdeps.h caml/prims.h caml/printexc.h \ - caml/reverse.h caml/signals.h caml/stacks.h caml/memory.h caml/sys.h \ - caml/startup.h caml/exec.h caml/version.h + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/osdeps.h caml/prims.h \ + caml/printexc.h caml/reverse.h caml/signals.h caml/stacks.h \ + caml/memory.h caml/sys.h caml/startup.h caml/exec.h caml/version.h str.o: str.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ caml/mlvalues.h caml/misc.h @@ -206,148 +220,158 @@ sys.o: sys.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ caml/mlvalues.h caml/debugger.h caml/fail.h caml/instruct.h \ caml/mlvalues.h caml/osdeps.h caml/signals.h caml/stacks.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/sys.h + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/sys.h terminfo.o: terminfo.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ caml/config.h caml/mlvalues.h caml/fail.h caml/io.h caml/mlvalues.h unix.o: unix.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/compatibility.h caml/memory.h caml/config.h caml/gc.h \ caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/misc.h caml/osdeps.h + caml/minor_gc.h caml/address_class.h caml/misc.h caml/osdeps.h weak.o: weak.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/fail.h caml/major_gc.h caml/freelist.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h caml/mlvalues.h -win32.o: win32.c caml/fail.h caml/compatibility.h caml/misc.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ + caml/address_class.h caml/mlvalues.h +win32.o: win32.c caml/address_class.h caml/misc.h caml/compatibility.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/misc.h caml/osdeps.h caml/signals.h caml/sys.h + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/osdeps.h caml/signals.h caml/sys.h alloc.d.o: alloc.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/custom.h caml/major_gc.h caml/freelist.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h caml/mlvalues.h \ - caml/stacks.h caml/memory.h + caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ + caml/address_class.h caml/mlvalues.h caml/stacks.h caml/memory.h array.d.o: array.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/misc.h caml/mlvalues.h + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h backtrace.d.o: backtrace.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/mlvalues.h caml/config.h \ caml/misc.h caml/alloc.h caml/mlvalues.h caml/io.h caml/instruct.h \ caml/intext.h caml/io.h caml/exec.h caml/fix_code.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/startup.h \ - caml/exec.h caml/stacks.h caml/memory.h caml/sys.h caml/backtrace.h \ - caml/fail.h + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/startup.h caml/exec.h caml/stacks.h \ + caml/memory.h caml/sys.h caml/backtrace.h caml/fail.h callback.d.o: callback.c caml/callback.h caml/compatibility.h \ caml/mlvalues.h caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/misc.h caml/fail.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/mlvalues.h \ - caml/interp.h caml/instruct.h caml/fix_code.h caml/stacks.h \ - caml/memory.h -compact.d.o: compact.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/finalise.h caml/roots.h \ - caml/misc.h caml/config.h caml/memory.h caml/gc.h caml/mlvalues.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/freelist.h \ - caml/gc.h caml/gc_ctrl.h caml/major_gc.h caml/memory.h caml/mlvalues.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h caml/interp.h caml/instruct.h caml/fix_code.h \ + caml/stacks.h caml/memory.h +compact.d.o: compact.c caml/address_class.h caml/misc.h \ + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/mlvalues.h caml/config.h caml/finalise.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/freelist.h caml/gc.h \ + caml/gc_ctrl.h caml/major_gc.h caml/memory.h caml/mlvalues.h \ caml/roots.h caml/weak.h compare.d.o: compare.c caml/custom.h caml/compatibility.h caml/mlvalues.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h caml/misc.h \ caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/misc.h caml/mlvalues.h + caml/minor_gc.h caml/address_class.h caml/misc.h caml/mlvalues.h custom.d.o: custom.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/custom.h caml/fail.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/mlvalues.h + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h debugger.d.o: debugger.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/config.h caml/debugger.h caml/misc.h caml/fail.h \ caml/fix_code.h caml/instruct.h caml/intext.h caml/io.h caml/io.h \ caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/sys.h + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/sys.h dynlink.d.o: dynlink.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ caml/config.h caml/mlvalues.h caml/dynlink.h caml/fail.h caml/mlvalues.h \ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/misc.h caml/osdeps.h caml/prims.h caml/signals.h + caml/address_class.h caml/misc.h caml/osdeps.h caml/prims.h \ + caml/signals.h extern.d.o: extern.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \ caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/misc.h caml/mlvalues.h \ - caml/reverse.h + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h caml/reverse.h fail.d.o: fail.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/fail.h caml/io.h caml/gc.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/printexc.h caml/signals.h caml/stacks.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/misc.h caml/mlvalues.h caml/printexc.h caml/signals.h caml/stacks.h \ caml/memory.h finalise.d.o: finalise.c caml/callback.h caml/compatibility.h \ caml/mlvalues.h caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/misc.h caml/fail.h caml/mlvalues.h \ caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/signals.h + caml/minor_gc.h caml/address_class.h caml/signals.h fix_code.d.o: fix_code.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/debugger.h caml/misc.h \ caml/config.h caml/mlvalues.h caml/fix_code.h caml/instruct.h \ caml/intext.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/reverse.h + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/misc.h caml/mlvalues.h caml/reverse.h floats.d.o: floats.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/mlvalues.h caml/misc.h \ - caml/reverse.h caml/stacks.h caml/memory.h + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/mlvalues.h \ + caml/misc.h caml/reverse.h caml/stacks.h caml/memory.h freelist.d.o: freelist.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/freelist.h caml/misc.h \ caml/config.h caml/mlvalues.h caml/gc.h caml/gc_ctrl.h caml/memory.h \ caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/major_gc.h caml/misc.h caml/mlvalues.h + caml/address_class.h caml/major_gc.h caml/misc.h caml/mlvalues.h gc_ctrl.d.o: gc_ctrl.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/compact.h caml/custom.h caml/finalise.h \ caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h \ - caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/stacks.h + caml/minor_gc.h caml/address_class.h caml/freelist.h caml/gc.h \ + caml/gc_ctrl.h caml/major_gc.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/stacks.h globroots.d.o: globroots.c caml/memory.h caml/compatibility.h caml/config.h \ caml/../../config/m.h caml/../../config/s.h caml/gc.h caml/mlvalues.h \ - caml/misc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/roots.h caml/memory.h caml/globroots.h caml/roots.h + caml/misc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/memory.h caml/globroots.h caml/roots.h hash.d.o: hash.c caml/mlvalues.h caml/compatibility.h caml/config.h \ caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/custom.h \ caml/mlvalues.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/hash.h + caml/minor_gc.h caml/address_class.h caml/hash.h instrtrace.d.o: instrtrace.c caml/instruct.h caml/misc.h \ caml/compatibility.h caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/mlvalues.h caml/misc.h caml/opnames.h \ caml/prims.h caml/stacks.h caml/mlvalues.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h intern.d.o: intern.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/callback.h caml/custom.h caml/fail.h caml/gc.h \ caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/mlvalues.h \ - caml/misc.h caml/reverse.h + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h caml/misc.h caml/reverse.h interp.d.o: interp.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/backtrace.h caml/callback.h caml/debugger.h \ caml/fail.h caml/fix_code.h caml/instrtrace.h caml/instruct.h \ caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h \ - caml/signals.h caml/stacks.h caml/memory.h + caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h caml/prims.h caml/signals.h caml/stacks.h caml/memory.h ints.d.o: ints.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/custom.h caml/fail.h caml/intext.h caml/io.h \ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/misc.h caml/mlvalues.h + caml/address_class.h caml/misc.h caml/mlvalues.h io.d.o: io.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ caml/mlvalues.h caml/custom.h caml/fail.h caml/io.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/signals.h caml/sys.h + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/signals.h \ + caml/sys.h lexing.d.o: lexing.c caml/fail.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h main.d.o: main.c caml/misc.h caml/compatibility.h caml/config.h \ caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/misc.h \ caml/sys.h @@ -355,42 +379,46 @@ major_gc.d.o: major_gc.c caml/compact.h caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/misc.h caml/custom.h \ caml/mlvalues.h caml/config.h caml/fail.h caml/finalise.h caml/roots.h \ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h caml/misc.h \ - caml/mlvalues.h caml/roots.h caml/weak.h + caml/address_class.h caml/freelist.h caml/gc.h caml/gc_ctrl.h \ + caml/major_gc.h caml/misc.h caml/mlvalues.h caml/roots.h caml/weak.h md5.d.o: md5.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ caml/md5.h caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/mlvalues.h caml/io.h caml/reverse.h -memory.d.o: memory.c caml/fail.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h \ - caml/freelist.h caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ - caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/signals.h + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/mlvalues.h \ + caml/io.h caml/reverse.h +memory.d.o: memory.c caml/address_class.h caml/misc.h caml/compatibility.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/freelist.h caml/gc.h caml/gc_ctrl.h \ + caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/minor_gc.h caml/address_class.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/signals.h meta.d.o: meta.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/config.h caml/fail.h caml/fix_code.h caml/interp.h \ caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/minor_gc.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/prims.h caml/stacks.h caml/memory.h + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/stacks.h \ + caml/memory.h minor_gc.d.o: minor_gc.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ caml/config.h caml/mlvalues.h caml/finalise.h caml/roots.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/gc.h \ - caml/gc_ctrl.h caml/major_gc.h caml/memory.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/roots.h caml/signals.h caml/weak.h + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h \ + caml/memory.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/signals.h caml/weak.h misc.d.o: misc.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/compatibility.h caml/misc.h caml/config.h caml/memory.h caml/gc.h \ caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h + caml/minor_gc.h caml/address_class.h obj.d.o: obj.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ caml/gc.h caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/minor_gc.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/prims.h + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h parsing.d.o: parsing.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/mlvalues.h caml/config.h \ caml/misc.h caml/memory.h caml/gc.h caml/mlvalues.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/alloc.h + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/alloc.h prims.d.o: prims.c caml/mlvalues.h caml/compatibility.h caml/config.h \ caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/prims.h printexc.d.o: printexc.c caml/backtrace.h caml/mlvalues.h \ @@ -400,33 +428,35 @@ printexc.d.o: printexc.c caml/backtrace.h caml/mlvalues.h \ roots.d.o: roots.c caml/finalise.h caml/roots.h caml/misc.h \ caml/compatibility.h caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/memory.h caml/gc.h caml/mlvalues.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/globroots.h \ - caml/major_gc.h caml/memory.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/roots.h caml/stacks.h + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/globroots.h caml/major_gc.h caml/memory.h caml/minor_gc.h \ + caml/misc.h caml/mlvalues.h caml/roots.h caml/stacks.h signals_byt.d.o: signals_byt.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/memory.h caml/config.h \ caml/gc.h caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/osdeps.h caml/signals.h caml/signals_machdep.h + caml/minor_gc.h caml/address_class.h caml/osdeps.h caml/signals.h \ + caml/signals_machdep.h signals.d.o: signals.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/callback.h caml/config.h caml/fail.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/roots.h caml/memory.h caml/signals.h \ - caml/signals_machdep.h caml/sys.h + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/memory.h caml/signals.h caml/signals_machdep.h caml/sys.h stacks.d.o: stacks.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ caml/config.h caml/mlvalues.h caml/misc.h caml/mlvalues.h caml/stacks.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h startup.d.o: startup.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ caml/config.h caml/mlvalues.h caml/backtrace.h caml/callback.h \ caml/custom.h caml/debugger.h caml/dynlink.h caml/exec.h caml/fail.h \ caml/fix_code.h caml/freelist.h caml/gc_ctrl.h caml/instrtrace.h \ caml/interp.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/minor_gc.h \ - caml/misc.h caml/mlvalues.h caml/osdeps.h caml/prims.h caml/printexc.h \ - caml/reverse.h caml/signals.h caml/stacks.h caml/memory.h caml/sys.h \ - caml/startup.h caml/exec.h caml/version.h + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/osdeps.h caml/prims.h \ + caml/printexc.h caml/reverse.h caml/signals.h caml/stacks.h \ + caml/memory.h caml/sys.h caml/startup.h caml/exec.h caml/version.h str.d.o: str.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ caml/mlvalues.h caml/misc.h @@ -434,144 +464,155 @@ sys.d.o: sys.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ caml/mlvalues.h caml/debugger.h caml/fail.h caml/instruct.h \ caml/mlvalues.h caml/osdeps.h caml/signals.h caml/stacks.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/sys.h + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/sys.h terminfo.d.o: terminfo.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ caml/config.h caml/mlvalues.h caml/fail.h caml/io.h caml/mlvalues.h unix.d.o: unix.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/compatibility.h caml/memory.h caml/config.h caml/gc.h \ caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/misc.h caml/osdeps.h + caml/minor_gc.h caml/address_class.h caml/misc.h caml/osdeps.h weak.d.o: weak.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/fail.h caml/major_gc.h caml/freelist.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h caml/mlvalues.h -win32.d.o: win32.c caml/fail.h caml/compatibility.h caml/misc.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ + caml/address_class.h caml/mlvalues.h +win32.d.o: win32.c caml/address_class.h caml/misc.h caml/compatibility.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/misc.h caml/osdeps.h caml/signals.h caml/sys.h + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/osdeps.h caml/signals.h caml/sys.h alloc.pic.o: alloc.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/custom.h caml/major_gc.h caml/freelist.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h caml/mlvalues.h \ - caml/stacks.h caml/memory.h + caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ + caml/address_class.h caml/mlvalues.h caml/stacks.h caml/memory.h array.pic.o: array.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/misc.h caml/mlvalues.h + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h backtrace.pic.o: backtrace.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/mlvalues.h caml/config.h \ caml/misc.h caml/alloc.h caml/mlvalues.h caml/io.h caml/instruct.h \ caml/intext.h caml/io.h caml/exec.h caml/fix_code.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/startup.h \ - caml/exec.h caml/stacks.h caml/memory.h caml/sys.h caml/backtrace.h \ - caml/fail.h + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/startup.h caml/exec.h caml/stacks.h \ + caml/memory.h caml/sys.h caml/backtrace.h caml/fail.h callback.pic.o: callback.c caml/callback.h caml/compatibility.h \ caml/mlvalues.h caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/misc.h caml/fail.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/mlvalues.h \ - caml/interp.h caml/instruct.h caml/fix_code.h caml/stacks.h \ - caml/memory.h -compact.pic.o: compact.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/finalise.h caml/roots.h \ - caml/misc.h caml/config.h caml/memory.h caml/gc.h caml/mlvalues.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/freelist.h \ - caml/gc.h caml/gc_ctrl.h caml/major_gc.h caml/memory.h caml/mlvalues.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h caml/interp.h caml/instruct.h caml/fix_code.h \ + caml/stacks.h caml/memory.h +compact.pic.o: compact.c caml/address_class.h caml/misc.h \ + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/mlvalues.h caml/config.h caml/finalise.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/freelist.h caml/gc.h \ + caml/gc_ctrl.h caml/major_gc.h caml/memory.h caml/mlvalues.h \ caml/roots.h caml/weak.h compare.pic.o: compare.c caml/custom.h caml/compatibility.h caml/mlvalues.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h caml/misc.h \ caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/misc.h caml/mlvalues.h + caml/minor_gc.h caml/address_class.h caml/misc.h caml/mlvalues.h custom.pic.o: custom.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/custom.h caml/fail.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/mlvalues.h + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h debugger.pic.o: debugger.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/config.h caml/debugger.h caml/misc.h caml/fail.h \ caml/fix_code.h caml/instruct.h caml/intext.h caml/io.h caml/io.h \ caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/sys.h + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/sys.h dynlink.pic.o: dynlink.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ caml/config.h caml/mlvalues.h caml/dynlink.h caml/fail.h caml/mlvalues.h \ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/misc.h caml/osdeps.h caml/prims.h caml/signals.h + caml/address_class.h caml/misc.h caml/osdeps.h caml/prims.h \ + caml/signals.h extern.pic.o: extern.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \ caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/misc.h caml/mlvalues.h \ - caml/reverse.h + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h caml/reverse.h fail.pic.o: fail.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/fail.h caml/io.h caml/gc.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/printexc.h caml/signals.h caml/stacks.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/misc.h caml/mlvalues.h caml/printexc.h caml/signals.h caml/stacks.h \ caml/memory.h finalise.pic.o: finalise.c caml/callback.h caml/compatibility.h \ caml/mlvalues.h caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/misc.h caml/fail.h caml/mlvalues.h \ caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/signals.h + caml/minor_gc.h caml/address_class.h caml/signals.h fix_code.pic.o: fix_code.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/debugger.h caml/misc.h \ caml/config.h caml/mlvalues.h caml/fix_code.h caml/instruct.h \ caml/intext.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/reverse.h + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/misc.h caml/mlvalues.h caml/reverse.h floats.pic.o: floats.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/mlvalues.h caml/misc.h \ - caml/reverse.h caml/stacks.h caml/memory.h + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/mlvalues.h \ + caml/misc.h caml/reverse.h caml/stacks.h caml/memory.h freelist.pic.o: freelist.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/freelist.h caml/misc.h \ caml/config.h caml/mlvalues.h caml/gc.h caml/gc_ctrl.h caml/memory.h \ caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/major_gc.h caml/misc.h caml/mlvalues.h + caml/address_class.h caml/major_gc.h caml/misc.h caml/mlvalues.h gc_ctrl.pic.o: gc_ctrl.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/compact.h caml/custom.h caml/finalise.h \ caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h \ - caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/stacks.h + caml/minor_gc.h caml/address_class.h caml/freelist.h caml/gc.h \ + caml/gc_ctrl.h caml/major_gc.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/stacks.h globroots.pic.o: globroots.c caml/memory.h caml/compatibility.h caml/config.h \ caml/../../config/m.h caml/../../config/s.h caml/gc.h caml/mlvalues.h \ - caml/misc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/roots.h caml/memory.h caml/globroots.h caml/roots.h + caml/misc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/memory.h caml/globroots.h caml/roots.h hash.pic.o: hash.c caml/mlvalues.h caml/compatibility.h caml/config.h \ caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/custom.h \ caml/mlvalues.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/hash.h + caml/minor_gc.h caml/address_class.h caml/hash.h instrtrace.pic.o: instrtrace.c intern.pic.o: intern.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/callback.h caml/custom.h caml/fail.h caml/gc.h \ caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/mlvalues.h \ - caml/misc.h caml/reverse.h + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h caml/misc.h caml/reverse.h interp.pic.o: interp.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/backtrace.h caml/callback.h caml/debugger.h \ caml/fail.h caml/fix_code.h caml/instrtrace.h caml/instruct.h \ caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h \ - caml/signals.h caml/stacks.h caml/memory.h caml/jumptbl.h + caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h caml/prims.h caml/signals.h caml/stacks.h caml/memory.h \ + caml/jumptbl.h ints.pic.o: ints.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/custom.h caml/fail.h caml/intext.h caml/io.h \ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/misc.h caml/mlvalues.h + caml/address_class.h caml/misc.h caml/mlvalues.h io.pic.o: io.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ caml/mlvalues.h caml/custom.h caml/fail.h caml/io.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/signals.h caml/sys.h + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/signals.h \ + caml/sys.h lexing.pic.o: lexing.c caml/fail.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h main.pic.o: main.c caml/misc.h caml/compatibility.h caml/config.h \ caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/misc.h \ caml/sys.h @@ -579,42 +620,46 @@ major_gc.pic.o: major_gc.c caml/compact.h caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/misc.h caml/custom.h \ caml/mlvalues.h caml/config.h caml/fail.h caml/finalise.h caml/roots.h \ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h caml/misc.h \ - caml/mlvalues.h caml/roots.h caml/weak.h + caml/address_class.h caml/freelist.h caml/gc.h caml/gc_ctrl.h \ + caml/major_gc.h caml/misc.h caml/mlvalues.h caml/roots.h caml/weak.h md5.pic.o: md5.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ caml/md5.h caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/mlvalues.h caml/io.h caml/reverse.h -memory.pic.o: memory.c caml/fail.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h \ - caml/freelist.h caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ - caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/signals.h + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/mlvalues.h \ + caml/io.h caml/reverse.h +memory.pic.o: memory.c caml/address_class.h caml/misc.h caml/compatibility.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/freelist.h caml/gc.h caml/gc_ctrl.h \ + caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/minor_gc.h caml/address_class.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/signals.h meta.pic.o: meta.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/config.h caml/fail.h caml/fix_code.h caml/interp.h \ caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/minor_gc.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/prims.h caml/stacks.h caml/memory.h + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/stacks.h \ + caml/memory.h minor_gc.pic.o: minor_gc.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ caml/config.h caml/mlvalues.h caml/finalise.h caml/roots.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/gc.h \ - caml/gc_ctrl.h caml/major_gc.h caml/memory.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/roots.h caml/signals.h caml/weak.h + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h \ + caml/memory.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/signals.h caml/weak.h misc.pic.o: misc.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/compatibility.h caml/misc.h caml/config.h caml/memory.h caml/gc.h \ caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h + caml/minor_gc.h caml/address_class.h obj.pic.o: obj.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ caml/gc.h caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/minor_gc.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/prims.h + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h parsing.pic.o: parsing.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/mlvalues.h caml/config.h \ caml/misc.h caml/memory.h caml/gc.h caml/mlvalues.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/alloc.h + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/alloc.h prims.pic.o: prims.c caml/mlvalues.h caml/compatibility.h caml/config.h \ caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/prims.h printexc.pic.o: printexc.c caml/backtrace.h caml/mlvalues.h \ @@ -624,33 +669,35 @@ printexc.pic.o: printexc.c caml/backtrace.h caml/mlvalues.h \ roots.pic.o: roots.c caml/finalise.h caml/roots.h caml/misc.h \ caml/compatibility.h caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/memory.h caml/gc.h caml/mlvalues.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/globroots.h \ - caml/major_gc.h caml/memory.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/roots.h caml/stacks.h + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/globroots.h caml/major_gc.h caml/memory.h caml/minor_gc.h \ + caml/misc.h caml/mlvalues.h caml/roots.h caml/stacks.h signals_byt.pic.o: signals_byt.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/memory.h caml/config.h \ caml/gc.h caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/osdeps.h caml/signals.h caml/signals_machdep.h + caml/minor_gc.h caml/address_class.h caml/osdeps.h caml/signals.h \ + caml/signals_machdep.h signals.pic.o: signals.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/callback.h caml/config.h caml/fail.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/roots.h caml/memory.h caml/signals.h \ - caml/signals_machdep.h caml/sys.h + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/memory.h caml/signals.h caml/signals_machdep.h caml/sys.h stacks.pic.o: stacks.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ caml/config.h caml/mlvalues.h caml/misc.h caml/mlvalues.h caml/stacks.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h startup.pic.o: startup.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ caml/config.h caml/mlvalues.h caml/backtrace.h caml/callback.h \ caml/custom.h caml/debugger.h caml/dynlink.h caml/exec.h caml/fail.h \ caml/fix_code.h caml/freelist.h caml/gc_ctrl.h caml/instrtrace.h \ caml/interp.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/minor_gc.h \ - caml/misc.h caml/mlvalues.h caml/osdeps.h caml/prims.h caml/printexc.h \ - caml/reverse.h caml/signals.h caml/stacks.h caml/memory.h caml/sys.h \ - caml/startup.h caml/exec.h caml/version.h + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/osdeps.h caml/prims.h \ + caml/printexc.h caml/reverse.h caml/signals.h caml/stacks.h \ + caml/memory.h caml/sys.h caml/startup.h caml/exec.h caml/version.h str.pic.o: str.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ caml/mlvalues.h caml/misc.h @@ -658,19 +705,22 @@ sys.pic.o: sys.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ caml/mlvalues.h caml/debugger.h caml/fail.h caml/instruct.h \ caml/mlvalues.h caml/osdeps.h caml/signals.h caml/stacks.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/sys.h + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/sys.h terminfo.pic.o: terminfo.c caml/config.h caml/../../config/m.h \ caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ caml/config.h caml/mlvalues.h caml/fail.h caml/io.h caml/mlvalues.h unix.pic.o: unix.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/compatibility.h caml/memory.h caml/config.h caml/gc.h \ caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/misc.h caml/osdeps.h + caml/minor_gc.h caml/address_class.h caml/misc.h caml/osdeps.h weak.pic.o: weak.c caml/alloc.h caml/compatibility.h caml/misc.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ caml/mlvalues.h caml/fail.h caml/major_gc.h caml/freelist.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h caml/mlvalues.h -win32.pic.o: win32.c caml/fail.h caml/compatibility.h caml/misc.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ + caml/address_class.h caml/mlvalues.h +win32.pic.o: win32.c caml/address_class.h caml/misc.h caml/compatibility.h \ caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/misc.h caml/osdeps.h caml/signals.h caml/sys.h + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/osdeps.h caml/signals.h caml/sys.h diff --git a/byterun/Makefile.common b/byterun/Makefile.common index c8c5235ab6..2c56c43f68 100755 --- a/byterun/Makefile.common +++ b/byterun/Makefile.common @@ -33,7 +33,8 @@ PRIMS=\ dynlink.c backtrace.c PUBLIC_INCLUDES=\ - alloc.h callback.h config.h custom.h fail.h hash.h intext.h \ + address_class.h alloc.h callback.h config.h custom.h fail.h gc.h \ + hash.h intext.h \ memory.h misc.h mlvalues.h printexc.h signals.h compatibility.h \ version.h diff --git a/byterun/caml/address_class.h b/byterun/caml/address_class.h new file mode 100644 index 0000000000..2b0bb539ab --- /dev/null +++ b/byterun/caml/address_class.h @@ -0,0 +1,93 @@ +/***********************************************************************/ +/* */ +/* OCaml */ +/* */ +/* Damien Doligez, projet Para, INRIA Rocquencourt */ +/* */ +/* Copyright 1996 Institut National de Recherche en Informatique et */ +/* en Automatique. All rights reserved. This file is distributed */ +/* under the terms of the GNU Library General Public License, with */ +/* the special exception on linking described in file ../LICENSE. */ +/* */ +/***********************************************************************/ + +/* Classification of addresses for GC and runtime purposes. */ + +#ifndef CAML_ADDRESS_CLASS_H +#define CAML_ADDRESS_CLASS_H + +#include "misc.h" +#include "mlvalues.h" + +/* Use the following macros to test an address for the different classes + it might belong to. */ + +#define Is_young(val) \ + (Assert (Is_block (val)), \ + (addr)(val) < (addr)caml_young_end && (addr)(val) > (addr)caml_young_start) + +#define Is_in_heap(a) (Classify_addr(a) & In_heap) + +#define Is_in_heap_or_young(a) (Classify_addr(a) & (In_heap | In_young)) + +#define Is_in_value_area(a) \ + (Classify_addr(a) & (In_heap | In_young | In_static_data)) + +#ifdef NATIVE_CODE +#define Is_in_code_area(pc) \ + ( ((char *)(pc) >= caml_code_area_start && \ + (char *)(pc) <= caml_code_area_end) \ + || ((char *)(pc) >= &caml_system__code_begin && \ + (char *)(pc) <= &caml_system__code_end) \ + || (Classify_addr(pc) & In_code_area) ) +#else +#define Is_in_code_area(pc) \ + ( ((char *)(pc) >= caml_code_area_start && \ + (char *)(pc) <= caml_code_area_end) \ + || (Classify_addr(pc) & In_code_area) ) +#endif /* NATIVE_CODE */ + + +/***********************************************************************/ +/* The rest of this file is private and may change without notice. */ + +extern char *caml_young_start, *caml_young_end; +extern char * caml_code_area_start, * caml_code_area_end; +#ifdef NATIVE_CODE +extern char caml_system__code_begin, caml_system__code_end; +#endif + +#define Not_in_heap 0 +#define In_heap 1 +#define In_young 2 +#define In_static_data 4 +#define In_code_area 8 + +#ifdef ARCH_SIXTYFOUR + +/* 64 bits: Represent page table as a sparse hash table */ +int caml_page_table_lookup(void * addr); +#define Classify_addr(a) (caml_page_table_lookup((void *)(a))) + +#else + +/* 32 bits: Represent page table as a 2-level array */ +#define Pagetable2_log 11 +#define Pagetable2_size (1 << Pagetable2_log) +#define Pagetable1_log (Page_log + Pagetable2_log) +#define Pagetable1_size (1 << (32 - Pagetable1_log)) +CAMLextern unsigned char * caml_page_table[Pagetable1_size]; + +#define Pagetable_index1(a) (((uintnat)(a)) >> Pagetable1_log) +#define Pagetable_index2(a) \ + ((((uintnat)(a)) >> Page_log) & (Pagetable2_size - 1)) +#define Classify_addr(a) \ + caml_page_table[Pagetable_index1(a)][Pagetable_index2(a)] + +#endif + +int caml_page_table_add(int kind, void * start, void * end); +int caml_page_table_remove(int kind, void * start, void * end); +int caml_page_table_initialize(mlsize_t bytesize); + +#endif /* CAML_ADDRESS_CLASS_H */ diff --git a/byterun/caml/memory.h b/byterun/caml/memory.h index 9befa873c1..fe6d7823a3 100644 --- a/byterun/caml/memory.h +++ b/byterun/caml/memory.h @@ -51,45 +51,7 @@ color_t caml_allocation_color (void *hp); /* void caml_shrink_heap (char *); Only used in compact.c */ /* <private> */ - -#define Not_in_heap 0 -#define In_heap 1 -#define In_young 2 -#define In_static_data 4 -#define In_code_area 8 - -#ifdef ARCH_SIXTYFOUR - -/* 64 bits: Represent page table as a sparse hash table */ -int caml_page_table_lookup(void * addr); -#define Classify_addr(a) (caml_page_table_lookup((void *)(a))) - -#else - -/* 32 bits: Represent page table as a 2-level array */ -#define Pagetable2_log 11 -#define Pagetable2_size (1 << Pagetable2_log) -#define Pagetable1_log (Page_log + Pagetable2_log) -#define Pagetable1_size (1 << (32 - Pagetable1_log)) -CAMLextern unsigned char * caml_page_table[Pagetable1_size]; - -#define Pagetable_index1(a) (((uintnat)(a)) >> Pagetable1_log) -#define Pagetable_index2(a) \ - ((((uintnat)(a)) >> Page_log) & (Pagetable2_size - 1)) -#define Classify_addr(a) \ - caml_page_table[Pagetable_index1(a)][Pagetable_index2(a)] - -#endif - -#define Is_in_value_area(a) \ - (Classify_addr(a) & (In_heap | In_young | In_static_data)) -#define Is_in_heap(a) (Classify_addr(a) & In_heap) -#define Is_in_heap_or_young(a) (Classify_addr(a) & (In_heap | In_young)) - -int caml_page_table_add(int kind, void * start, void * end); -int caml_page_table_remove(int kind, void * start, void * end); -int caml_page_table_initialize(mlsize_t bytesize); - + #ifdef DEBUG #define DEBUG_clear(result, wosize) do{ \ uintnat caml__DEBUG_i; \ diff --git a/byterun/caml/minor_gc.h b/byterun/caml/minor_gc.h index 4727826d70..d3e8ac5071 100644 --- a/byterun/caml/minor_gc.h +++ b/byterun/caml/minor_gc.h @@ -15,7 +15,7 @@ #define CAML_MINOR_GC_H -#include "misc.h" +#include "address_class.h" CAMLextern char *caml_young_start, *caml_young_ptr; CAMLextern char *caml_young_end, *caml_young_limit; @@ -33,10 +33,6 @@ struct caml_ref_table { }; CAMLextern struct caml_ref_table caml_ref_table, caml_weak_ref_table; -#define Is_young(val) \ - (Assert (Is_block (val)), \ - (addr)(val) < (addr)caml_young_end && (addr)(val) > (addr)caml_young_start) - extern void caml_set_minor_heap_size (asize_t); /* size in bytes */ extern void caml_empty_minor_heap (void); CAMLextern void caml_minor_collection (void); diff --git a/byterun/compact.c b/byterun/compact.c index 7e34d38fbc..9af9688d93 100644 --- a/byterun/compact.c +++ b/byterun/compact.c @@ -13,6 +13,7 @@ #include <string.h> +#include "caml/address_class.h" #include "caml/config.h" #include "caml/finalise.h" #include "caml/freelist.h" @@ -58,7 +59,7 @@ static void invert_pointer_at (word *p) /* Use Ecolor (q) == 0 instead of Is_block (q) because q could be an inverted pointer for an infix header (with Ecolor == 2). */ - if (Ecolor (q) == 0 && (Classify_addr (q) & In_heap)){ + if (Ecolor (q) == 0 && Is_in_heap (q)){ switch (Ecolor (Hd_val (q))){ case 0: case 3: /* Pointer or header: insert in inverted list. */ diff --git a/byterun/memory.c b/byterun/memory.c index 17359291cc..4eb63b4065 100644 --- a/byterun/memory.c +++ b/byterun/memory.c @@ -13,6 +13,7 @@ #include <stdlib.h> #include <string.h> +#include "caml/address_class.h" #include "caml/fail.h" #include "caml/freelist.h" #include "caml/gc.h" diff --git a/byterun/win32.c b/byterun/win32.c index e22ad66c0f..f26caf8fd7 100644 --- a/byterun/win32.c +++ b/byterun/win32.c @@ -25,6 +25,7 @@ #include <errno.h> #include <string.h> #include <signal.h> +#include "caml/address_class.h" #include "caml/fail.h" #include "caml/memory.h" #include "caml/misc.h" @@ -418,14 +419,8 @@ static void caml_reset_stack (void *faulting_address) caml_raise_stack_overflow(); } -extern char * caml_code_area_start, * caml_code_area_end; CAMLextern int caml_is_in_code(void *); -#define Is_in_code_area(pc) \ - ( ((char *)(pc) >= caml_code_area_start && \ - (char *)(pc) <= caml_code_area_end) \ - || (Classify_addr(pc) & In_code_area) ) - static LONG CALLBACK caml_UnhandledExceptionFilter (EXCEPTION_POINTERS* exn_info) { diff --git a/otherlibs/bigarray/.depend b/otherlibs/bigarray/.depend index e55dfce825..b46495862c 100644 --- a/otherlibs/bigarray/.depend +++ b/otherlibs/bigarray/.depend @@ -7,7 +7,7 @@ bigarray_stubs.o: bigarray_stubs.c ../../byterun/caml/alloc.h \ ../../byterun/caml/io.h ../../byterun/caml/hash.h \ ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h mmap_unix.o: mmap_unix.c bigarray.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ ../../byterun/caml/mlvalues.h ../../byterun/caml/config.h \ diff --git a/otherlibs/graph/.depend b/otherlibs/graph/.depend index 10f44a683e..ec14b350e5 100644 --- a/otherlibs/graph/.depend +++ b/otherlibs/graph/.depend @@ -13,7 +13,8 @@ dump_img.o: dump_img.c libgraph.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/misc.h image.h ../../byterun/caml/alloc.h \ ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ - ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h events.o: events.c libgraph.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ @@ -25,7 +26,7 @@ fill.o: fill.c libgraph.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h image.o: image.c libgraph.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ @@ -37,7 +38,7 @@ make_img.o: make_img.c libgraph.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/misc.h image.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h open.o: open.c libgraph.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ @@ -45,7 +46,8 @@ open.o: open.c libgraph.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/mlvalues.h ../../byterun/caml/callback.h \ ../../byterun/caml/fail.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ - ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h point_col.o: point_col.c libgraph.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ diff --git a/otherlibs/num/.depend b/otherlibs/num/.depend index 1a16696320..c885abf051 100644 --- a/otherlibs/num/.depend +++ b/otherlibs/num/.depend @@ -16,7 +16,8 @@ nat_stubs.o: nat_stubs.c ../../byterun/caml/alloc.h \ ../../byterun/caml/fail.h ../../byterun/caml/hash.h \ ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/mlvalues.h bng.h nat.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/mlvalues.h bng.h nat.h arith_flags.cmi : arith_status.cmi : big_int.cmi : nat.cmi diff --git a/otherlibs/str/.depend b/otherlibs/str/.depend index e0d6abec89..1d224311c0 100644 --- a/otherlibs/str/.depend +++ b/otherlibs/str/.depend @@ -5,7 +5,7 @@ strstubs.o: strstubs.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ - ../../byterun/caml/fail.h + ../../byterun/caml/address_class.h ../../byterun/caml/fail.h str.cmi : str.cmo : str.cmi str.cmx : str.cmi diff --git a/otherlibs/systhreads/.depend b/otherlibs/systhreads/.depend index 868bcc7ad6..b9e1cabcf4 100644 --- a/otherlibs/systhreads/.depend +++ b/otherlibs/systhreads/.depend @@ -7,11 +7,11 @@ st_stubs.o: st_stubs.c ../../byterun/caml/alloc.h \ ../../byterun/caml/io.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ - ../../byterun/caml/misc.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/printexc.h ../../byterun/caml/roots.h \ - ../../byterun/caml/memory.h ../../byterun/caml/signals.h \ - ../../byterun/caml/stacks.h ../../byterun/caml/sys.h threads.h \ - st_posix.h + ../../byterun/caml/address_class.h ../../byterun/caml/misc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/printexc.h \ + ../../byterun/caml/roots.h ../../byterun/caml/memory.h \ + ../../byterun/caml/signals.h ../../byterun/caml/stacks.h \ + ../../byterun/caml/sys.h threads.h st_posix.h condition.cmi : mutex.cmi event.cmi : mutex.cmi : diff --git a/otherlibs/threads/.depend b/otherlibs/threads/.depend index 5f0c45edce..caeeaee747 100644 --- a/otherlibs/threads/.depend +++ b/otherlibs/threads/.depend @@ -7,13 +7,13 @@ scheduler.o: scheduler.c ../../byterun/caml/alloc.h \ ../../byterun/caml/io.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ - ../../byterun/caml/misc.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/printexc.h ../../byterun/caml/roots.h \ - ../../byterun/caml/memory.h ../../byterun/caml/signals.h \ - ../../byterun/caml/stacks.h ../../byterun/caml/sys.h + ../../byterun/caml/address_class.h ../../byterun/caml/misc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/printexc.h \ + ../../byterun/caml/roots.h ../../byterun/caml/memory.h \ + ../../byterun/caml/signals.h ../../byterun/caml/stacks.h \ + ../../byterun/caml/sys.h condition.cmi : mutex.cmi event.cmi : -marshal.cmi : mutex.cmi : pervasives.cmi : thread.cmi : unix.cmi @@ -23,8 +23,8 @@ condition.cmo : thread.cmi mutex.cmi condition.cmi condition.cmx : thread.cmx mutex.cmx condition.cmi event.cmo : mutex.cmi condition.cmi event.cmi event.cmx : mutex.cmx condition.cmx event.cmi -marshal.cmo : marshal.cmi -marshal.cmx : marshal.cmi +marshal.cmo : +marshal.cmx : mutex.cmo : thread.cmi mutex.cmi mutex.cmx : thread.cmx mutex.cmi pervasives.cmo : unix.cmi pervasives.cmi diff --git a/otherlibs/unix/.depend b/otherlibs/unix/.depend index 6e7193f8bf..4f6a638740 100644 --- a/otherlibs/unix/.depend +++ b/otherlibs/unix/.depend @@ -5,8 +5,9 @@ accept.o: accept.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h \ - socketaddr.h ../../byterun/caml/misc.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h access.o: access.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ @@ -14,15 +15,17 @@ access.o: access.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ - ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/address_class.h ../../byterun/caml/signals.h \ + unixsupport.h addrofstr.o: addrofstr.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/fail.h unixsupport.h \ - socketaddr.h ../../byterun/caml/misc.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/fail.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h alarm.o: alarm.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ @@ -39,28 +42,32 @@ chdir.o: chdir.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h chmod.o: chmod.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h chown.o: chown.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h chroot.o: chroot.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h close.o: close.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ @@ -72,7 +79,8 @@ closedir.o: closedir.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h connect.o: connect.c ../../byterun/caml/fail.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ @@ -90,7 +98,8 @@ cstringv.o: cstringv.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h dup2.o: dup2.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ @@ -115,21 +124,24 @@ execv.o: execv.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h execve.o: execve.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h execvp.o: execvp.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h exit.o: exit.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ @@ -167,8 +179,9 @@ getaddrinfo.o: getaddrinfo.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/misc.h \ - ../../byterun/caml/signals.h unixsupport.h cst2constr.h socketaddr.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/misc.h ../../byterun/caml/signals.h unixsupport.h \ + cst2constr.h socketaddr.h getcwd.o: getcwd.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ @@ -193,7 +206,8 @@ getgr.o: getgr.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/mlvalues.h ../../byterun/caml/alloc.h \ ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h getgroups.o: getgroups.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ @@ -206,8 +220,9 @@ gethost.o: gethost.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h \ - socketaddr.h ../../byterun/caml/misc.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h gethostname.o: gethostname.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ @@ -225,8 +240,9 @@ getnameinfo.o: getnameinfo.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h \ - socketaddr.h ../../byterun/caml/misc.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h getpeername.o: getpeername.c ../../byterun/caml/fail.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ @@ -248,7 +264,8 @@ getproto.o: getproto.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h getpw.o: getpw.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ @@ -256,7 +273,8 @@ getpw.o: getpw.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ - ../../byterun/caml/fail.h unixsupport.h + ../../byterun/caml/address_class.h ../../byterun/caml/fail.h \ + unixsupport.h getserv.o: getserv.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ @@ -264,7 +282,8 @@ getserv.o: getserv.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h getsockname.o: getsockname.c ../../byterun/caml/fail.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ @@ -287,7 +306,8 @@ gmtime.o: gmtime.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h initgroups.o: initgroups.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ @@ -304,7 +324,8 @@ itimer.o: itimer.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h kill.o: kill.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ @@ -316,7 +337,8 @@ link.o: link.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h listen.o: listen.c ../../byterun/caml/fail.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ @@ -339,7 +361,8 @@ mkdir.o: mkdir.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h mkfifo.o: mkfifo.c ../../byterun/caml/fail.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ @@ -347,7 +370,8 @@ mkfifo.o: mkfifo.c ../../byterun/caml/fail.h \ ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ - ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/address_class.h ../../byterun/caml/signals.h \ + unixsupport.h nice.o: nice.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ @@ -359,15 +383,16 @@ open.o: open.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ - ../../byterun/caml/misc.h ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/address_class.h ../../byterun/caml/misc.h \ + ../../byterun/caml/signals.h unixsupport.h opendir.o: opendir.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/alloc.h ../../byterun/caml/signals.h unixsupport.h pipe.o: pipe.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ @@ -379,15 +404,16 @@ putenv.o: putenv.c ../../byterun/caml/fail.h \ ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/mlvalues.h \ - unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/mlvalues.h unixsupport.h read.o: read.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h readdir.o: readdir.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ @@ -400,15 +426,17 @@ readlink.o: readlink.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/fail.h ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/alloc.h ../../byterun/caml/fail.h \ + ../../byterun/caml/signals.h unixsupport.h rename.o: rename.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h rewinddir.o: rewinddir.c ../../byterun/caml/fail.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ @@ -420,7 +448,8 @@ rmdir.o: rmdir.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h select.o: select.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ @@ -428,7 +457,8 @@ select.o: select.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h sendrecv.o: sendrecv.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ @@ -436,8 +466,9 @@ sendrecv.o: sendrecv.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h \ - socketaddr.h ../../byterun/caml/misc.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h setgid.o: setgid.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ @@ -449,7 +480,8 @@ setgroups.o: setgroups.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h setsid.o: setsid.c ../../byterun/caml/fail.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ @@ -471,7 +503,8 @@ signals.o: signals.c ../../byterun/caml/alloc.h \ ../../byterun/caml/fail.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/address_class.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/signals.h unixsupport.h sleep.o: sleep.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ @@ -484,7 +517,8 @@ socketaddr.o: socketaddr.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ - unixsupport.h socketaddr.h ../../byterun/caml/misc.h + ../../byterun/caml/address_class.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h socket.o: socket.c ../../byterun/caml/fail.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ @@ -501,18 +535,18 @@ sockopt.o: sockopt.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/fail.h unixsupport.h socketaddr.h \ - ../../byterun/caml/misc.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/alloc.h ../../byterun/caml/fail.h unixsupport.h \ + socketaddr.h ../../byterun/caml/misc.h stat.o: stat.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/signals.h ../../byterun/caml/io.h unixsupport.h \ - cst2constr.h nanosecond_stat.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/alloc.h ../../byterun/caml/signals.h \ + ../../byterun/caml/io.h unixsupport.h cst2constr.h nanosecond_stat.h strofaddr.o: strofaddr.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ @@ -526,7 +560,8 @@ symlink.o: symlink.c ../../byterun/caml/fail.h \ ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ - ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/address_class.h ../../byterun/caml/signals.h \ + unixsupport.h termios.o: termios.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ @@ -544,15 +579,16 @@ times.o: times.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ - unixsupport.h + ../../byterun/caml/address_class.h unixsupport.h truncate.o: truncate.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/fail.h \ - ../../byterun/caml/signals.h ../../byterun/caml/io.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/fail.h ../../byterun/caml/signals.h \ + ../../byterun/caml/io.h unixsupport.h umask.o: umask.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ @@ -564,15 +600,16 @@ unixsupport.o: unixsupport.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/mlvalues.h ../../byterun/caml/callback.h \ ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/fail.h unixsupport.h \ - cst2constr.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/fail.h unixsupport.h cst2constr.h unlink.o: unlink.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h utimes.o: utimes.c ../../byterun/caml/fail.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ @@ -580,7 +617,8 @@ utimes.o: utimes.c ../../byterun/caml/fail.h \ ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ - ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/address_class.h ../../byterun/caml/signals.h \ + unixsupport.h wait.o: wait.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ @@ -588,14 +626,16 @@ wait.o: wait.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h write.o: write.c ../../byterun/caml/mlvalues.h \ ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h unixLabels.cmi : unix.cmi unix.cmi : unixLabels.cmo : unix.cmi unixLabels.cmi From 0581a076c562036e5bda5b21303a860b33eebe6e Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Fri, 5 Jun 2015 16:09:17 +0000 Subject: [PATCH 286/494] fix commit 16156 for 32-bit Windows/MSVC git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16159 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- asmrun/signals_asm.c | 13 ++++++++++++- byterun/caml/address_class.h | 12 ------------ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/asmrun/signals_asm.c b/asmrun/signals_asm.c index 23507a0cd3..4ac2a64f01 100644 --- a/asmrun/signals_asm.c +++ b/asmrun/signals_asm.c @@ -19,7 +19,6 @@ #include <signal.h> #include <errno.h> #include <stdio.h> -#include "caml/address_class.h" #include "caml/fail.h" #include "caml/memory.h" #include "caml/osdeps.h" @@ -45,6 +44,18 @@ extern signal_handler caml_win32_signal(int sig, signal_handler action); extern void caml_win32_overflow_detection(); #endif +extern char * caml_code_area_start, * caml_code_area_end; +extern char caml_system__code_begin, caml_system__code_end; + +/* Do not use the macro from address_class.h here. */ +#undef Is_in_code_area +#define Is_in_code_area(pc) \ + ( ((char *)(pc) >= caml_code_area_start && \ + (char *)(pc) <= caml_code_area_end) \ +|| ((char *)(pc) >= &caml_system__code_begin && \ + (char *)(pc) <= &caml_system__code_end) \ +|| (Classify_addr(pc) & In_code_area) ) + /* This routine is the common entry point for garbage collection and signal handling. It can trigger a callback to OCaml code. With system threads, this callback can cause a context switch. diff --git a/byterun/caml/address_class.h b/byterun/caml/address_class.h index 2b0bb539ab..71fe68d9a4 100644 --- a/byterun/caml/address_class.h +++ b/byterun/caml/address_class.h @@ -33,19 +33,10 @@ #define Is_in_value_area(a) \ (Classify_addr(a) & (In_heap | In_young | In_static_data)) -#ifdef NATIVE_CODE #define Is_in_code_area(pc) \ ( ((char *)(pc) >= caml_code_area_start && \ (char *)(pc) <= caml_code_area_end) \ - || ((char *)(pc) >= &caml_system__code_begin && \ - (char *)(pc) <= &caml_system__code_end) \ || (Classify_addr(pc) & In_code_area) ) -#else -#define Is_in_code_area(pc) \ - ( ((char *)(pc) >= caml_code_area_start && \ - (char *)(pc) <= caml_code_area_end) \ - || (Classify_addr(pc) & In_code_area) ) -#endif /* NATIVE_CODE */ /***********************************************************************/ @@ -53,9 +44,6 @@ extern char *caml_young_start, *caml_young_end; extern char * caml_code_area_start, * caml_code_area_end; -#ifdef NATIVE_CODE -extern char caml_system__code_begin, caml_system__code_end; -#endif #define Not_in_heap 0 #define In_heap 1 From 779f8d093659e8dbe851c8edea678a65f41b0143 Mon Sep 17 00:00:00 2001 From: Leo White <leo@lpw25.net> Date: Fri, 5 Jun 2015 17:31:12 +0000 Subject: [PATCH 287/494] Attach comments to includes in structures git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16160 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- parsing/parser.mly | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/parsing/parser.mly b/parsing/parser.mly index 838d436eb8..863651c71b 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -780,7 +780,8 @@ structure_item: ; str_include_statement: INCLUDE module_expr post_item_attributes - { Incl.mk $2 ~attrs:$3 ~loc:(symbol_rloc()) } + { Incl.mk $2 ~attrs:$3 + ~loc:(symbol_rloc()) ~docs:(symbol_docs ()) } ; module_binding_body: EQUAL module_expr From 0e515bc77f37934e3d7c335db0fa487193e1eb70 Mon Sep 17 00:00:00 2001 From: Leo White <leo@lpw25.net> Date: Fri, 5 Jun 2015 18:15:30 +0000 Subject: [PATCH 288/494] Floating docstrings are also extra text git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16161 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- parsing/lexer.mll | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/parsing/lexer.mll b/parsing/lexer.mll index de9106c06a..ad71678128 100644 --- a/parsing/lexer.mll +++ b/parsing/lexer.mll @@ -708,13 +708,17 @@ and skip_sharp_bang = parse set_pre_extra_docstrings pre_pos (List.rev a) | Before(a, f, b), (NoLine | NewLine) -> set_post_docstrings post_pos (List.rev a); - set_post_extra_docstrings post_pos (List.rev b); + set_post_extra_docstrings post_pos + (List.rev_append f (List.rev b)); set_floating_docstrings pre_pos (List.rev f); set_pre_extra_docstrings pre_pos (List.rev a); set_pre_docstrings pre_pos b | Before(a, f, b), BlankLine -> set_post_docstrings post_pos (List.rev a); - set_floating_docstrings pre_pos (List.rev_append f (List.rev b)); + set_post_extra_docstrings post_pos + (List.rev_append f (List.rev b)); + set_floating_docstrings pre_pos + (List.rev_append f (List.rev b)); set_pre_extra_docstrings pre_pos (List.rev a) in let rec loop lines docs lexbuf = From 4d1551047da9e2033184e5a8e6591a3c60bfe49a Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Fri, 5 Jun 2015 19:21:16 +0000 Subject: [PATCH 289/494] 6893: "tag not used" warning when using (p)dep to declare linking tags git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16162 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ ocamlbuild/command.ml | 3 +++ ocamlbuild/command.mli | 2 ++ ocamlbuild/configuration.ml | 9 +++++---- ocamlbuild/main.ml | 9 ++++++++- 5 files changed, 20 insertions(+), 5 deletions(-) diff --git a/Changes b/Changes index 403d3d4408..869b679256 100644 --- a/Changes +++ b/Changes @@ -208,6 +208,8 @@ Bug fixes: (Jacques Garrigue, report by Valentin Gatien-Baron) - PR#6889: ast_mapper fails to rewrite class attributes (Sébastien Briais) +- PR#6893: ocamlbuild: "tag not used" warning when using (p)dep + (Gabriel Scherer, report by Christiano Haesbaert) - GPR#143: fix getsockopt behaviour for boolean socket options (Anil Madhavapeddy and Andrew Ray) - GPR#190: typo in pervasives diff --git a/ocamlbuild/command.ml b/ocamlbuild/command.ml index 3bb2614b9f..79e2a1dc4a 100644 --- a/ocamlbuild/command.ml +++ b/ocamlbuild/command.ml @@ -393,6 +393,9 @@ let pdep tags ptag deps = Param_tags.declare ptag (fun param -> dep (Param_tags.make ptag param :: tags) (deps param)) +let list_all_deps () = + !all_deps_of_tags + (* let to_string_for_digest x = let rec cmd_of_spec = diff --git a/ocamlbuild/command.mli b/ocamlbuild/command.mli index 18547a459c..a28c75190b 100644 --- a/ocamlbuild/command.mli +++ b/ocamlbuild/command.mli @@ -46,4 +46,6 @@ val dep : Tags.elt list -> pathname list -> unit val pdep : Tags.elt list -> Tags.elt -> (string -> pathname list) -> unit +val list_all_deps : unit -> (Tags.t * pathname list) list + val file_or_exe_exists: string -> bool diff --git a/ocamlbuild/configuration.ml b/ocamlbuild/configuration.ml index 6290e60a95..bc50a0105e 100644 --- a/ocamlbuild/configuration.ml +++ b/ocamlbuild/configuration.ml @@ -81,10 +81,11 @@ let tag_any tags = let check_tags_usage useful_tags = let check_tag (tag, loc) = if not (Tags.mem tag useful_tags) then - Log.eprintf "%aWarning: the tag %S is not used in any flag declaration, \ - so it will have no effect; it may be a typo. Otherwise use \ - `mark_tag_used` in your myocamlbuild.ml to disable \ - this warning." + + Log.eprintf "%aWarning: the tag %S is not used in any flag or dependency \ + declaration, so it will have no effect; it may be a typo. \ + Otherwise you can use `mark_tag_used` in your myocamlbuild.ml \ + to disable this warning." Loc.print_loc loc tag in let check_conf (_, values) = diff --git a/ocamlbuild/main.ml b/ocamlbuild/main.ml index 50721396f1..d59a450b20 100644 --- a/ocamlbuild/main.ml +++ b/ocamlbuild/main.ml @@ -205,7 +205,14 @@ let proceed () = raise Exit_silently end; - let all_tags = Tags.union builtin_useful_tags (Flags.get_used_tags ()) in + let all_tags = + let builtin = builtin_useful_tags in + let used_in_flags = Flags.get_used_tags () in + let used_in_deps = + List.fold_left (fun acc (tags, _deps) -> Tags.union acc tags) + Tags.empty (Command.list_all_deps ()) + in + Tags.union builtin (Tags.union used_in_flags used_in_deps) in Configuration.check_tags_usage all_tags; Digest_cache.init (); From ef0c79a8de8086c3dc87d68913b59dc06945020e Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 9 Jun 2015 16:31:52 +0000 Subject: [PATCH 290/494] GPR#191 followup: add `Is_in_static_data` to address_class.h git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16165 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- byterun/caml/address_class.h | 1 + 1 file changed, 1 insertion(+) diff --git a/byterun/caml/address_class.h b/byterun/caml/address_class.h index 71fe68d9a4..f7908b6dc9 100644 --- a/byterun/caml/address_class.h +++ b/byterun/caml/address_class.h @@ -38,6 +38,7 @@ (char *)(pc) <= caml_code_area_end) \ || (Classify_addr(pc) & In_code_area) ) +#define Is_in_static_data(a) (Classify_addr(a) & In_static_data) /***********************************************************************/ /* The rest of this file is private and may change without notice. */ From d2a9da66eca1cb769e555b79a23b1ac64c01d1b5 Mon Sep 17 00:00:00 2001 From: Mark Shinwell <mshinwell@janestreet.com> Date: Wed, 10 Jun 2015 09:27:36 +0000 Subject: [PATCH 291/494] Fix PR#6878: AArch64 conditional branches out of range. (Introduces new, generic branch relaxation module.) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16168 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- .depend | 18 +- Changes | 3 + Makefile | 2 + asmcomp/amd64/emit.mlp | 6 + asmcomp/arm64/arch.ml | 13 ++ asmcomp/arm64/emit.mlp | 294 +++++++++++++++++++++++++++--- asmcomp/branch_relaxation.ml | 138 ++++++++++++++ asmcomp/branch_relaxation.mli | 26 +++ asmcomp/branch_relaxation_intf.ml | 63 +++++++ asmcomp/power/emit.mlp | 192 ++++++++----------- 10 files changed, 614 insertions(+), 141 deletions(-) create mode 100644 asmcomp/branch_relaxation.ml create mode 100644 asmcomp/branch_relaxation.mli create mode 100644 asmcomp/branch_relaxation_intf.ml diff --git a/.depend b/.depend index 27df28160c..d7eed05a4d 100644 --- a/.depend +++ b/.depend @@ -597,6 +597,8 @@ asmcomp/asmgen.cmi : bytecomp/lambda.cmi asmcomp/cmm.cmi asmcomp/asmlibrarian.cmi : asmcomp/asmlink.cmi : asmcomp/cmx_format.cmi asmcomp/asmpackager.cmi : typing/env.cmi +asmcomp/branch_relaxation.cmi : asmcomp/linearize.cmi \ + asmcomp/branch_relaxation_intf.cmo asmcomp/clambda.cmi : bytecomp/lambda.cmi typing/ident.cmi \ asmcomp/debuginfo.cmi parsing/asttypes.cmi asmcomp/closure.cmi : bytecomp/lambda.cmi asmcomp/clambda.cmi @@ -686,6 +688,14 @@ asmcomp/asmpackager.cmx : typing/typemod.cmx bytecomp/translmod.cmx \ utils/config.cmx asmcomp/compilenv.cmx asmcomp/cmx_format.cmi \ utils/clflags.cmx utils/ccomp.cmx asmcomp/asmlink.cmx asmcomp/asmgen.cmx \ asmcomp/asmpackager.cmi +asmcomp/branch_relaxation_intf.cmo : asmcomp/linearize.cmi asmcomp/arch.cmo +asmcomp/branch_relaxation_intf.cmx : asmcomp/linearize.cmx asmcomp/arch.cmx +asmcomp/branch_relaxation.cmo : utils/misc.cmi asmcomp/mach.cmi \ + asmcomp/linearize.cmi asmcomp/cmm.cmi asmcomp/branch_relaxation_intf.cmo \ + asmcomp/branch_relaxation.cmi +asmcomp/branch_relaxation.cmx : utils/misc.cmx asmcomp/mach.cmx \ + asmcomp/linearize.cmx asmcomp/cmm.cmx asmcomp/branch_relaxation_intf.cmx \ + asmcomp/branch_relaxation.cmi asmcomp/clambda.cmo : bytecomp/lambda.cmi typing/ident.cmi \ asmcomp/debuginfo.cmi parsing/asttypes.cmi asmcomp/clambda.cmi asmcomp/clambda.cmx : bytecomp/lambda.cmx typing/ident.cmx \ @@ -759,13 +769,13 @@ asmcomp/emitaux.cmx : asmcomp/linearize.cmx asmcomp/debuginfo.cmx \ asmcomp/emit.cmo : asmcomp/reg.cmi asmcomp/proc.cmi utils/misc.cmi \ asmcomp/mach.cmi asmcomp/linearize.cmi bytecomp/lambda.cmi \ asmcomp/emitaux.cmi asmcomp/debuginfo.cmi utils/config.cmi \ - asmcomp/compilenv.cmi asmcomp/cmm.cmi utils/clflags.cmi asmcomp/arch.cmo \ - asmcomp/emit.cmi + asmcomp/compilenv.cmi asmcomp/cmm.cmi utils/clflags.cmi \ + asmcomp/branch_relaxation.cmi asmcomp/arch.cmo asmcomp/emit.cmi asmcomp/emit.cmx : asmcomp/reg.cmx asmcomp/proc.cmx utils/misc.cmx \ asmcomp/mach.cmx asmcomp/linearize.cmx bytecomp/lambda.cmx \ asmcomp/emitaux.cmx asmcomp/debuginfo.cmx utils/config.cmx \ - asmcomp/compilenv.cmx asmcomp/cmm.cmx utils/clflags.cmx asmcomp/arch.cmx \ - asmcomp/emit.cmi + asmcomp/compilenv.cmx asmcomp/cmm.cmx utils/clflags.cmx \ + asmcomp/branch_relaxation.cmx asmcomp/arch.cmx asmcomp/emit.cmi asmcomp/interf.cmo : asmcomp/reg.cmi asmcomp/proc.cmi asmcomp/mach.cmi \ asmcomp/interf.cmi asmcomp/interf.cmx : asmcomp/reg.cmx asmcomp/proc.cmx asmcomp/mach.cmx \ diff --git a/Changes b/Changes index 869b679256..dfa9e700c3 100644 --- a/Changes +++ b/Changes @@ -200,6 +200,9 @@ Bug fixes: - PR#6872: Type-directed propagation fails to disambiguate variants that are also exception constructors (Jacques Garrigue, report by Romain Beauxis) +- PR#6878: AArch64 backend generates invalid asm: conditional branch + out of range (Mark Shinwell, report by Richard Jones, testing by Richard + Jones and Xavier Leroy, code review by Xavier Leroy and Thomas Refis) - PR#6879: Wrong optimization of 1 mod n (Mark Shinwell, report by Jean-Christophe Filliâtre) - PR#6884: The __CYGWIN32__ #define should be replaced with __CYGWIN__ diff --git a/Makefile b/Makefile index 3be3f56af1..1cfc9b400b 100644 --- a/Makefile +++ b/Makefile @@ -94,6 +94,8 @@ ASMCOMP=asmcomp/arch.cmo asmcomp/debuginfo.cmo \ asmcomp/deadcode.cmo \ asmcomp/printlinear.cmo asmcomp/linearize.cmo \ asmcomp/schedgen.cmo asmcomp/scheduling.cmo \ + asmcomp/branch_relaxation_intf.cmo \ + asmcomp/branch_relaxation.cmo \ asmcomp/emitaux.cmo asmcomp/emit.cmo asmcomp/asmgen.cmo \ asmcomp/asmlink.cmo asmcomp/asmlibrarian.cmo asmcomp/asmpackager.cmo \ driver/opterrors.cmo driver/optcompile.cmo diff --git a/asmcomp/amd64/emit.mlp b/asmcomp/amd64/emit.mlp index b576ece983..d56d0f5f2e 100644 --- a/asmcomp/amd64/emit.mlp +++ b/asmcomp/amd64/emit.mlp @@ -20,6 +20,12 @@ open Mach open Linearize open Emitaux +(* [Branch_relaxation] is not used in this file, but is required by + emit.mlp files for certain other targets; the reference here ensures + that when releases are being prepared the .depend files are correct + for all targets. *) +open! Branch_relaxation + let macosx = (Config.system = "macosx") let mingw64 = (Config.system = "mingw64") let cygwin = (Config.system = "cygwin") diff --git a/asmcomp/arm64/arch.ml b/asmcomp/arm64/arch.ml index bfbe183fbd..3e62da89ff 100644 --- a/asmcomp/arm64/arch.ml +++ b/asmcomp/arm64/arch.ml @@ -34,8 +34,12 @@ type addressing_mode = (* Specific operations *) type specific_operation = + | Ifar_alloc of int + | Ifar_intop_checkbound + | Ifar_intop_imm_checkbound of int | Ishiftarith of arith_operation * int | Ishiftcheckbound of int + | Ifar_shiftcheckbound of int | Imuladd (* multiply and add *) | Imulsub (* multiply and subtract *) | Inegmulf (* floating-point negate and multiply *) @@ -91,6 +95,12 @@ let print_addressing printreg addr ppf arg = let print_specific_operation printreg op ppf arg = match op with + | Ifar_alloc n -> + fprintf ppf "(far) alloc %i" n + | Ifar_intop_checkbound -> + fprintf ppf "%a (far) check > %a" printreg arg.(0) printreg arg.(1) + | Ifar_intop_imm_checkbound n -> + fprintf ppf "%a (far) check > %i" printreg arg.(0) n | Ishiftarith(op, shift) -> let op_name = function | Ishiftadd -> "+" @@ -103,6 +113,9 @@ let print_specific_operation printreg op ppf arg = printreg arg.(0) (op_name op) printreg arg.(1) shift_mark | Ishiftcheckbound n -> fprintf ppf "check %a >> %i > %a" printreg arg.(0) n printreg arg.(1) + | Ifar_shiftcheckbound n -> + fprintf ppf + "(far) check %a >> %i > %a" printreg arg.(0) n printreg arg.(1) | Imuladd -> fprintf ppf "(%a * %a) + %a" printreg arg.(0) diff --git a/asmcomp/arm64/emit.mlp b/asmcomp/arm64/emit.mlp index 8f174fee46..750c2b2379 100644 --- a/asmcomp/arm64/emit.mlp +++ b/asmcomp/arm64/emit.mlp @@ -231,6 +231,32 @@ let emit_intconst dst n = in if n < 0n then emit_neg true 48 else emit_pos true 48 +let num_instructions_for_intconst n = + let num_instructions = ref 0 in + let rec count_pos first shift = + if shift < 0 then begin + if first then incr num_instructions + end else begin + let s = Nativeint.(logand (shift_right_logical n shift) 0xFFFFn) in + if s = 0n then count_pos first (shift - 16) else begin + incr num_instructions; + count_pos false (shift - 16) + end + end + and count_neg first shift = + if shift < 0 then begin + if first then incr num_instructions + end else begin + let s = Nativeint.(logand (shift_right_logical n shift) 0xFFFFn) in + if s = 0xFFFFn then count_neg first (shift - 16) else begin + incr num_instructions; + count_neg false (shift - 16) + end + end + in + if n < 0n then count_neg true 48 else count_pos true 48; + !num_instructions + (* Recognize float constants appropriate for FMOV dst, #fpimm instruction: "a normalized binary floating point encoding with 1 sign bit, 4 bits of fraction and a 3-bit exponent" *) @@ -302,6 +328,217 @@ let emit_load_symbol_addr dst s = ` ldr {emit_reg dst}, [{emit_reg dst}, #:got_lo12:{emit_symbol s}]\n` end +(* The following functions are used for calculating the sizes of the + call GC and bounds check points emitted out-of-line from the function + body. See branch_relaxation.mli. *) + +let num_call_gc_and_check_bound_points instr = + let rec loop instr ((call_gc, check_bound) as totals) = + match instr.desc with + | Lend -> totals + | Lop (Ialloc _) when !fastcode_flag -> + loop instr.next (call_gc + 1, check_bound) + | Lop (Iintop Icheckbound) + | Lop (Iintop_imm (Icheckbound, _)) + | Lop (Ispecific (Ishiftcheckbound _)) -> + let check_bound = + (* When not in debug mode, there is at most one check-bound point. *) + if not !Clflags.debug then 1 + else check_bound + 1 + in + loop instr.next (call_gc, check_bound) + (* The following four should never be seen, since this function is run + before branch relaxation. *) + | Lop (Ispecific (Ifar_alloc _)) + | Lop (Ispecific Ifar_intop_checkbound) + | Lop (Ispecific (Ifar_intop_imm_checkbound _)) + | Lop (Ispecific (Ifar_shiftcheckbound _)) -> assert false + | _ -> loop instr.next totals + in + loop instr (0, 0) + +let max_out_of_line_code_offset instr ~num_call_gc ~num_check_bound = + if num_call_gc < 1 && num_check_bound < 1 then 0 + else begin + let size_of_call_gc = 2 in + let size_of_check_bound = 1 in + let size_of_last_thing = + (* Call-GC points come before check-bound points. *) + if num_check_bound >= 1 then size_of_check_bound else size_of_call_gc + in + let total_size = + size_of_call_gc*num_call_gc + size_of_check_bound*num_check_bound + in + let max_offset = total_size - size_of_last_thing in + assert (max_offset >= 0); + max_offset + end + +module BR = Branch_relaxation.Make (struct + (* CR-someday mshinwell: B and BL have +/- 128Mb ranges; for the moment we + assume we will never exceed this. It would seem to be most likely to + occur for branches between functions; in this case, the linker should be + able to insert veneers anyway. (See section 4.6.7 of the document + "ELF for the ARM 64-bit architecture (AArch64)".) *) + + type distance = int + + module Cond_branch = struct + type t = TB | CB | Bcc + + let all = [TB; CB; Bcc] + + (* AArch64 instructions are 32 bits wide, so [distance] in this module + means units of 32-bit words. *) + let max_displacement = function + | TB -> 32 * 1024 / 4 (* +/- 32Kb *) + | CB | Bcc -> 1 * 1024 * 1024 / 4 (* +/- 1Mb *) + + let classify_instr = function + | Lop (Ialloc _) + | Lop (Iintop Icheckbound) + | Lop (Iintop_imm (Icheckbound, _)) + | Lop (Ispecific (Ishiftcheckbound _)) -> Some Bcc + (* The various "far" variants in [specific_operation] don't need to + return [Some] here, since their code sequences never contain any + conditional branches that might need relaxing. *) + | Lcondbranch (Itruetest, _) + | Lcondbranch (Ifalsetest, _) -> Some CB + | Lcondbranch (Iinttest _, _) + | Lcondbranch (Iinttest_imm _, _) + | Lcondbranch (Ifloattest _, _) -> Some Bcc + | Lcondbranch (Ioddtest, _) + | Lcondbranch (Ieventest, _) -> Some TB + | Lcondbranch3 _ -> Some Bcc + | _ -> None + end + + let offset_pc_at_branch = 0 + + let epilogue_size () = + if !contains_calls then 3 else 2 + + let instr_size = function + | Lend -> 0 + | Lop (Imove | Ispill | Ireload) -> 1 + | Lop (Iconst_int n | Iconst_blockheader n) -> + num_instructions_for_intconst n + | Lop (Iconst_float _) -> 2 + | Lop (Iconst_symbol _) -> 2 + | Lop (Icall_ind) -> 1 + | Lop (Icall_imm _) -> 1 + | Lop (Itailcall_ind) -> epilogue_size () + | Lop (Itailcall_imm s) -> + if s = !function_name then 1 else epilogue_size () + | Lop (Iextcall (_, false)) -> 1 + | Lop (Iextcall (_, true)) -> 3 + | Lop (Istackoffset _) -> 2 + | Lop (Iload (size, addr)) | Lop (Istore (size, addr, _)) -> + let based = match addr with Iindexed _ -> 0 | Ibased _ -> 1 in + based + begin match size with Single -> 2 | _ -> 1 end + | Lop (Ialloc _) when !fastcode_flag -> 4 + | Lop (Ispecific (Ifar_alloc _)) when !fastcode_flag -> 5 + | Lop (Ialloc num_words) | Lop (Ispecific (Ifar_alloc num_words)) -> + begin match num_words with + | 16 | 24 | 32 -> 1 + | _ -> 1 + num_instructions_for_intconst (Nativeint.of_int num_words) + end + | Lop (Iintop (Icomp _)) -> 2 + | Lop (Iintop_imm (Icomp _, _)) -> 2 + | Lop (Iintop Icheckbound) -> 2 + | Lop (Ispecific Ifar_intop_checkbound) -> 3 + | Lop (Iintop_imm (Icheckbound, _)) -> 2 + | Lop (Ispecific (Ifar_intop_imm_checkbound _)) -> 3 + | Lop (Ispecific (Ishiftcheckbound _)) -> 2 + | Lop (Ispecific (Ifar_shiftcheckbound _)) -> 3 + | Lop (Iintop Imod) -> 2 + | Lop (Iintop Imulh) -> 1 + | Lop (Iintop _) -> 1 + | Lop (Iintop_imm _) -> 1 + | Lop (Ifloatofint | Iintoffloat | Iabsf | Inegf | Ispecific Isqrtf) -> 1 + | Lop (Iaddf | Isubf | Imulf | Idivf | Ispecific Inegmulf) -> 1 + | Lop (Ispecific (Imuladdf | Inegmuladdf | Imulsubf | Inegmulsubf)) -> 1 + | Lop (Ispecific (Ishiftarith _)) -> 1 + | Lop (Ispecific (Imuladd | Imulsub)) -> 1 + | Lop (Ispecific (Ibswap 16)) -> 2 + | Lop (Ispecific (Ibswap _)) -> 1 + | Lreloadretaddr -> 0 + | Lreturn -> epilogue_size () + | Llabel _ -> 0 + | Lbranch _ -> 1 + | Lcondbranch (tst, _) -> + begin match tst with + | Itruetest -> 1 + | Ifalsetest -> 1 + | Iinttest _ -> 2 + | Iinttest_imm _ -> 2 + | Ifloattest _ -> 2 + | Ioddtest -> 1 + | Ieventest -> 1 + end + | Lcondbranch3 (lbl0, lbl1, lbl2) -> + 1 + begin match lbl0 with None -> 0 | Some _ -> 1 end + + begin match lbl1 with None -> 0 | Some _ -> 1 end + + begin match lbl2 with None -> 0 | Some _ -> 1 end + | Lswitch jumptbl -> 3 + Array.length jumptbl + | Lsetuptrap _ -> 2 + | Lpushtrap -> 3 + | Lpoptrap -> 1 + | Lraise k -> + begin match !Clflags.debug, k with + | true, (Lambda.Raise_regular | Lambda.Raise_reraise) -> 1 + | false, _ + | true, Lambda.Raise_notrace -> 4 + end + + let relax_allocation ~num_words = + Lop (Ispecific (Ifar_alloc num_words)) + + let relax_intop_checkbound () = + Lop (Ispecific Ifar_intop_checkbound) + + let relax_intop_imm_checkbound ~bound = + Lop (Ispecific (Ifar_intop_imm_checkbound bound)) + + let relax_specific_op = function + | Ishiftcheckbound shift -> Lop (Ispecific (Ifar_shiftcheckbound shift)) + | _ -> assert false +end) + +(* Output the assembly code for allocation. *) + +let assembly_code_for_allocation i ~n ~far = + let lbl_frame = record_frame_label i.live i.dbg in + if !fastcode_flag then begin + let lbl_redo = new_label() in + let lbl_call_gc = new_label() in + `{emit_label lbl_redo}:`; + ` sub {emit_reg reg_alloc_ptr}, {emit_reg reg_alloc_ptr}, #{emit_int n}\n`; + ` cmp {emit_reg reg_alloc_ptr}, {emit_reg reg_alloc_limit}\n`; + ` add {emit_reg i.res.(0)}, {emit_reg reg_alloc_ptr}, #8\n`; + if not far then begin + ` b.lo {emit_label lbl_call_gc}\n` + end else begin + let lbl = new_label () in + ` b.cs {emit_label lbl}\n`; + ` b {emit_label lbl_call_gc}\n`; + `{emit_label lbl}:\n` + end; + call_gc_sites := + { gc_lbl = lbl_call_gc; + gc_return_lbl = lbl_redo; + gc_frame_lbl = lbl_frame } :: !call_gc_sites + end else begin + begin match n with + | 16 -> ` bl {emit_symbol "caml_alloc1"}\n` + | 24 -> ` bl {emit_symbol "caml_alloc2"}\n` + | 32 -> ` bl {emit_symbol "caml_alloc3"}\n` + | _ -> emit_intconst reg_x15 (Nativeint.of_int n); + ` bl {emit_symbol "caml_allocN"}\n` + end; + `{emit_label lbl_frame}: add {emit_reg i.res.(0)}, {emit_reg reg_alloc_ptr}, #8\n` + end + (* Output the assembly code for an instruction *) let emit_instr i = @@ -410,29 +647,9 @@ let emit_instr i = ` str {emit_reg src}, {emit_addressing addr base}\n` end | Lop(Ialloc n) -> - let lbl_frame = record_frame_label i.live i.dbg in - if !fastcode_flag then begin - let lbl_redo = new_label() in - let lbl_call_gc = new_label() in - `{emit_label lbl_redo}:`; - ` sub {emit_reg reg_alloc_ptr}, {emit_reg reg_alloc_ptr}, #{emit_int n}\n`; - ` cmp {emit_reg reg_alloc_ptr}, {emit_reg reg_alloc_limit}\n`; - ` add {emit_reg i.res.(0)}, {emit_reg reg_alloc_ptr}, #8\n`; - ` b.lo {emit_label lbl_call_gc}\n`; - call_gc_sites := - { gc_lbl = lbl_call_gc; - gc_return_lbl = lbl_redo; - gc_frame_lbl = lbl_frame } :: !call_gc_sites - end else begin - begin match n with - | 16 -> ` bl {emit_symbol "caml_alloc1"}\n` - | 24 -> ` bl {emit_symbol "caml_alloc2"}\n` - | 32 -> ` bl {emit_symbol "caml_alloc3"}\n` - | _ -> emit_intconst reg_x15 (Nativeint.of_int n); - ` bl {emit_symbol "caml_allocN"}\n` - end; - `{emit_label lbl_frame}: add {emit_reg i.res.(0)}, {emit_reg reg_alloc_ptr}, #8\n` - end + assembly_code_for_allocation i ~n ~far:false + | Lop(Ispecific (Ifar_alloc n)) -> + assembly_code_for_allocation i ~n ~far:true | Lop(Iintop(Icomp cmp)) -> ` cmp {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; ` cset {emit_reg i.res.(0)}, {emit_string (name_for_comparison cmp)}\n` @@ -443,14 +660,35 @@ let emit_instr i = let lbl = bound_error_label i.dbg in ` cmp {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; ` b.ls {emit_label lbl}\n` + | Lop(Ispecific Ifar_intop_checkbound) -> + let lbl = bound_error_label i.dbg in + let lbl2 = new_label () in + ` cmp {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; + ` b.hi {emit_label lbl2}\n`; + ` b {emit_label lbl}\n`; + `{emit_label lbl2}:\n`; | Lop(Iintop_imm(Icheckbound, n)) -> let lbl = bound_error_label i.dbg in ` cmp {emit_reg i.arg.(0)}, #{emit_int n}\n`; ` b.ls {emit_label lbl}\n` + | Lop(Ispecific(Ifar_intop_imm_checkbound bound)) -> + let lbl = bound_error_label i.dbg in + let lbl2 = new_label () in + ` cmp {emit_reg i.arg.(0)}, #{emit_int bound}\n`; + ` b.hi {emit_label lbl2}\n`; + ` b {emit_label lbl}\n`; + `{emit_label lbl2}:\n`; | Lop(Ispecific(Ishiftcheckbound shift)) -> let lbl = bound_error_label i.dbg in ` cmp {emit_reg i.arg.(1)}, {emit_reg i.arg.(0)}, lsr #{emit_int shift}\n`; ` b.cs {emit_label lbl}\n` + | Lop(Ispecific(Ifar_shiftcheckbound shift)) -> + let lbl = bound_error_label i.dbg in + let lbl2 = new_label () in + ` cmp {emit_reg i.arg.(1)}, {emit_reg i.arg.(0)}, lsr #{emit_int shift}\n`; + ` b.lo {emit_label lbl2}\n`; + ` b {emit_label lbl}\n`; + `{emit_label lbl2}:\n`; | Lop(Iintop Imod) -> ` sdiv {emit_reg reg_tmp1}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; ` msub {emit_reg i.res.(0)}, {emit_reg reg_tmp1}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(0)}\n` @@ -659,9 +897,19 @@ let fundecl fundecl = ` str x30, [sp, #{emit_int (n-8)}]\n` end; `{emit_label !tailrec_entry_point}:\n`; + let num_call_gc, num_check_bound = + num_call_gc_and_check_bound_points fundecl.fun_body + in + let max_out_of_line_code_offset = + max_out_of_line_code_offset fundecl.fun_body ~num_call_gc + ~num_check_bound + in + BR.relax fundecl.fun_body ~max_out_of_line_code_offset; emit_all fundecl.fun_body; List.iter emit_call_gc !call_gc_sites; List.iter emit_call_bound_error !bound_error_sites; + assert (List.length !call_gc_sites = num_call_gc); + assert (List.length !bound_error_sites = num_check_bound); cfi_endproc(); ` .type {emit_symbol fundecl.fun_name}, %function\n`; ` .size {emit_symbol fundecl.fun_name}, .-{emit_symbol fundecl.fun_name}\n`; diff --git a/asmcomp/branch_relaxation.ml b/asmcomp/branch_relaxation.ml new file mode 100644 index 0000000000..d4609e4a8e --- /dev/null +++ b/asmcomp/branch_relaxation.ml @@ -0,0 +1,138 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) +(* Mark Shinwell, Jane Street Europe *) +(* *) +(* Copyright 1996 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +open Mach +open Linearize + +module Make (T : Branch_relaxation_intf.S) = struct + let label_map code = + let map = Hashtbl.create 37 in + let rec fill_map pc instr = + match instr.desc with + | Lend -> (pc, map) + | Llabel lbl -> Hashtbl.add map lbl pc; fill_map pc instr.next + | op -> fill_map (pc + T.instr_size op) instr.next + in + fill_map 0 code + + let branch_overflows map pc_branch lbl_dest max_branch_offset = + let pc_dest = Hashtbl.find map lbl_dest in + let delta = pc_dest - (pc_branch + T.offset_pc_at_branch) in + delta <= -max_branch_offset || delta >= max_branch_offset + + let opt_branch_overflows map pc_branch opt_lbl_dest max_branch_offset = + match opt_lbl_dest with + | None -> false + | Some lbl_dest -> + branch_overflows map pc_branch lbl_dest max_branch_offset + + let instr_overflows ~code_size ~max_out_of_line_code_offset instr map pc = + match T.Cond_branch.classify_instr instr.desc with + | None -> false + | Some branch -> + let max_branch_offset = + (* Remember to cut some slack for multi-word instructions (in the + [Linearize] sense of the word) where the branch can be anywhere in + the middle. 12 words of slack is plenty. *) + T.Cond_branch.max_displacement branch - 12 + in + match instr.desc with + | Lop (Ialloc _) + | Lop (Iintop Icheckbound) + | Lop (Iintop_imm (Icheckbound, _)) + | Lop (Ispecific _) -> + (* We assume that any branches eligible for relaxation generated + by these instructions only branch forward. We further assume + that any of these may branch to an out-of-line code block. *) + code_size + max_out_of_line_code_offset - pc >= max_branch_offset + | Lcondbranch (_, lbl) -> + branch_overflows map pc lbl max_branch_offset + | Lcondbranch3 (lbl0, lbl1, lbl2) -> + opt_branch_overflows map pc lbl0 max_branch_offset + || opt_branch_overflows map pc lbl1 max_branch_offset + || opt_branch_overflows map pc lbl2 max_branch_offset + | _ -> + Misc.fatal_error "Unsupported instruction for branch relaxation" + + let fixup_branches ~code_size ~max_out_of_line_code_offset map code = + let expand_optbranch lbl n arg next = + match lbl with + | None -> next + | Some l -> + instr_cons (Lcondbranch (Iinttest_imm (Isigned Cmm.Ceq, n), l)) + arg [||] next + in + let rec fixup did_fix pc instr = + match instr.desc with + | Lend -> did_fix + | _ -> + let overflows = + instr_overflows ~code_size ~max_out_of_line_code_offset instr map pc + in + if not overflows then + fixup did_fix (pc + T.instr_size instr.desc) instr.next + else + match instr.desc with + | Lop (Ialloc num_words) -> + instr.desc <- T.relax_allocation ~num_words; + fixup true (pc + T.instr_size instr.desc) instr.next + | Lop (Iintop Icheckbound) -> + instr.desc <- T.relax_intop_checkbound (); + fixup true (pc + T.instr_size instr.desc) instr.next + | Lop (Iintop_imm (Icheckbound, bound)) -> + instr.desc <- T.relax_intop_imm_checkbound ~bound; + fixup true (pc + T.instr_size instr.desc) instr.next + | Lop (Ispecific specific) -> + instr.desc <- T.relax_specific_op specific; + fixup true (pc + T.instr_size instr.desc) instr.next + | Lcondbranch (test, lbl) -> + let lbl2 = new_label() in + let cont = + instr_cons (Lbranch lbl) [||] [||] + (instr_cons (Llabel lbl2) [||] [||] instr.next) + in + instr.desc <- Lcondbranch (invert_test test, lbl2); + instr.next <- cont; + fixup true (pc + T.instr_size instr.desc) instr.next + | Lcondbranch3 (lbl0, lbl1, lbl2) -> + let cont = + expand_optbranch lbl0 0 instr.arg + (expand_optbranch lbl1 1 instr.arg + (expand_optbranch lbl2 2 instr.arg instr.next)) + in + instr.desc <- cont.desc; + instr.next <- cont.next; + fixup true pc instr + | _ -> + (* Any other instruction has already been rejected in + [instr_overflows] above. + We can *never* get here. *) + assert false + in + fixup false 0 code + + (* Iterate branch expansion till all conditional branches are OK *) + + let rec relax code ~max_out_of_line_code_offset = + let min_of_max_branch_offsets = + List.fold_left (fun min_of_max_branch_offsets branch -> + min min_of_max_branch_offsets + (T.Cond_branch.max_displacement branch)) + max_int T.Cond_branch.all + in + let (code_size, map) = label_map code in + if code_size >= min_of_max_branch_offsets + && fixup_branches ~code_size ~max_out_of_line_code_offset map code + then relax code ~max_out_of_line_code_offset + else () +end diff --git a/asmcomp/branch_relaxation.mli b/asmcomp/branch_relaxation.mli new file mode 100644 index 0000000000..9d517b1311 --- /dev/null +++ b/asmcomp/branch_relaxation.mli @@ -0,0 +1,26 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) +(* Mark Shinwell, Jane Street Europe *) +(* *) +(* Copyright 1996 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* Fix up conditional branches that exceed hardware-allowed ranges. *) + +module Make (T : Branch_relaxation_intf.S) : sig + val relax + : Linearize.instruction + (* [max_offset_of_out_of_line_code] specifies the furthest distance, + measured from the first address immediately after the last instruction + of the function, that may be branched to from within the function in + order to execute "out of line" code blocks such as call GC and + bounds check points. *) + -> max_out_of_line_code_offset:T.distance + -> unit +end diff --git a/asmcomp/branch_relaxation_intf.ml b/asmcomp/branch_relaxation_intf.ml new file mode 100644 index 0000000000..610d0d0753 --- /dev/null +++ b/asmcomp/branch_relaxation_intf.ml @@ -0,0 +1,63 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Mark Shinwell, Jane Street Europe *) +(* *) +(* Copyright 1996 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +module type S = sig + (* The distance between two instructions, in arbitrary units (typically + the natural word size of instructions). *) + type distance = int + + module Cond_branch : sig + (* The various types of conditional branches for a given target that + may require relaxation. *) + type t + + (* All values of type [t] that the emitter may produce. *) + val all : t list + + (* If [max_displacement branch] is [n] then [branch] is assumed to + reach any address in the range [pc - n, pc + n] (inclusive), after + the [pc] of the branch has been adjusted by [offset_pc_at_branch] + (see below). *) + val max_displacement : t -> distance + + (* Which variety of conditional branch may be produced by the emitter for a + given instruction description. For the moment we assume that only one + such variety per instruction description is needed. + + N.B. The only instructions supported are the following: + - Lop (Ialloc _) + - Lop (Iintop Icheckbound) + - Lop (Iintop_imm (Icheckbound, _)) + - Lop (Ispecific _) + - Lcondbranch (_, _) + - Lcondbranch3 (_, _, _) + [classify_instr] is expected to return [None] when called on any + instruction not in this list. *) + val classify_instr : Linearize.instruction_desc -> t option + end + + (* The value to be added to the program counter (in [distance] units) + when it is at a branch instruction, prior to calculating the distance + to a branch target. *) + val offset_pc_at_branch : distance + + (* The maximum size of a given instruction. *) + val instr_size : Linearize.instruction_desc -> distance + + (* Insertion of target-specific code to relax operations that cannot be + relaxed generically. It is assumed that these rewrites do not change + the size of out-of-line code (cf. branch_relaxation.mli). *) + val relax_allocation : num_words:int -> Linearize.instruction_desc + val relax_intop_checkbound : unit -> Linearize.instruction_desc + val relax_intop_imm_checkbound : bound:int -> Linearize.instruction_desc + val relax_specific_op : Arch.specific_operation -> Linearize.instruction_desc +end diff --git a/asmcomp/power/emit.mlp b/asmcomp/power/emit.mlp index 0a26ed1479..434408524d 100644 --- a/asmcomp/power/emit.mlp +++ b/asmcomp/power/emit.mlp @@ -308,126 +308,87 @@ let defined_functions = ref StringSet.empty (* Label of glue code for calling the GC *) let call_gc_label = ref 0 -(* Fixup conditional branches that exceed hardware allowed range *) - -let load_store_size = function - Ibased(s, d) -> 2 - | Iindexed ofs -> if is_immediate ofs then 1 else 3 - | Iindexed2 -> 1 - -let instr_size = function - Lend -> 0 - | Lop(Imove | Ispill | Ireload) -> 1 - | Lop(Iconst_int n | Iconst_blockheader n) -> - if is_native_immediate n then 1 else 2 - | Lop(Iconst_float s) -> 2 - | Lop(Iconst_symbol s) -> 2 - | Lop(Icall_ind) -> 2 - | Lop(Icall_imm s) -> 1 - | Lop(Itailcall_ind) -> 5 - | Lop(Itailcall_imm s) -> if s = !function_name then 1 else 4 - | Lop(Iextcall(s, true)) -> 3 - | Lop(Iextcall(s, false)) -> if pic_externals then 4 else 1 - | Lop(Istackoffset n) -> 1 - | Lop(Iload(chunk, addr)) -> +module BR = Branch_relaxation.Make (struct + type distance = int + + module Cond_branch = struct + type t = Branch + + let all = [Branch] + + let max_displacement = function + (* 14-bit signed offset in words. *) + | Branch -> 8192 + + let classify_instr = function + | Lop (Ialloc _) + (* [Ialloc_far] does not need to be here, since its code sequence + never involves any conditional branches that might need relaxing. *) + | Lcondbranch _ + | Lcondbranch3 _ -> Some Branch + | _ -> None + end + + let offset_pc_at_branch = 1 + + let load_store_size = function + | Ibased(s, d) -> 2 + | Iindexed ofs -> if is_immediate ofs then 1 else 3 + | Iindexed2 -> 1 + + let instr_size = function + | Lend -> 0 + | Lop(Imove | Ispill | Ireload) -> 1 + | Lop(Iconst_int n | Iconst_blockheader n) -> + if is_native_immediate n then 1 else 2 + | Lop(Iconst_float s) -> 2 + | Lop(Iconst_symbol s) -> 2 + | Lop(Icall_ind) -> 2 + | Lop(Icall_imm s) -> 1 + | Lop(Itailcall_ind) -> 5 + | Lop(Itailcall_imm s) -> if s = !function_name then 1 else 4 + | Lop(Iextcall(s, true)) -> 3 + | Lop(Iextcall(s, false)) -> if pic_externals then 4 else 1 + | Lop(Istackoffset n) -> 1 + | Lop(Iload(chunk, addr)) -> if chunk = Byte_signed then load_store_size addr + 1 else load_store_size addr - | Lop(Istore(chunk, addr, _)) -> load_store_size addr - | Lop(Ialloc n) -> 4 - | Lop(Ispecific(Ialloc_far n)) -> 5 - | Lop(Iintop Imod) -> 3 - | Lop(Iintop(Icomp cmp)) -> 4 - | Lop(Iintop op) -> 1 - | Lop(Iintop_imm(Icomp cmp, n)) -> 4 - | Lop(Iintop_imm(op, n)) -> 1 - | Lop(Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf) -> 1 - | Lop(Ifloatofint) -> 9 - | Lop(Iintoffloat) -> 4 - | Lop(Ispecific sop) -> 1 - | Lreloadretaddr -> 2 - | Lreturn -> 2 - | Llabel lbl -> 0 - | Lbranch lbl -> 1 - | Lcondbranch(tst, lbl) -> 2 - | Lcondbranch3(lbl0, lbl1, lbl2) -> + | Lop(Istore(chunk, addr, _)) -> load_store_size addr + | Lop(Ialloc n) -> 4 + | Lop(Ispecific(Ialloc_far n)) -> 5 + | Lop(Iintop Imod) -> 3 + | Lop(Iintop(Icomp cmp)) -> 4 + | Lop(Iintop op) -> 1 + | Lop(Iintop_imm(Icomp cmp, n)) -> 4 + | Lop(Iintop_imm(op, n)) -> 1 + | Lop(Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf) -> 1 + | Lop(Ifloatofint) -> 9 + | Lop(Iintoffloat) -> 4 + | Lop(Ispecific sop) -> 1 + | Lreloadretaddr -> 2 + | Lreturn -> 2 + | Llabel lbl -> 0 + | Lbranch lbl -> 1 + | Lcondbranch(tst, lbl) -> 2 + | Lcondbranch3(lbl0, lbl1, lbl2) -> 1 + (if lbl0 = None then 0 else 1) + (if lbl1 = None then 0 else 1) + (if lbl2 = None then 0 else 1) - | Lswitch jumptbl -> 8 - | Lsetuptrap lbl -> 1 - | Lpushtrap -> 4 - | Lpoptrap -> 2 - | Lraise _ -> 6 - -let label_map code = - let map = Hashtbl.create 37 in - let rec fill_map pc instr = - match instr.desc with - Lend -> (pc, map) - | Llabel lbl -> Hashtbl.add map lbl pc; fill_map pc instr.next - | op -> fill_map (pc + instr_size op) instr.next - in fill_map 0 code - -let max_branch_offset = 8180 -(* 14-bit signed offset in words. Remember to cut some slack - for multi-word instructions where the branch can be anywhere in - the middle. 12 words of slack is plenty. *) - -let branch_overflows map pc_branch lbl_dest = - let pc_dest = Hashtbl.find map lbl_dest in - let delta = pc_dest - (pc_branch + 1) in - delta <= -max_branch_offset || delta >= max_branch_offset - -let opt_branch_overflows map pc_branch opt_lbl_dest = - match opt_lbl_dest with - None -> false - | Some lbl_dest -> branch_overflows map pc_branch lbl_dest - -let fixup_branches codesize map code = - let expand_optbranch lbl n arg next = - match lbl with - None -> next - | Some l -> - instr_cons (Lcondbranch(Iinttest_imm(Isigned Ceq, n), l)) - arg [||] next in - let rec fixup did_fix pc instr = - match instr.desc with - Lend -> did_fix - | Lcondbranch(test, lbl) when branch_overflows map pc lbl -> - let lbl2 = new_label() in - let cont = - instr_cons (Lbranch lbl) [||] [||] - (instr_cons (Llabel lbl2) [||] [||] instr.next) in - instr.desc <- Lcondbranch(invert_test test, lbl2); - instr.next <- cont; - fixup true (pc + 2) instr.next - | Lcondbranch3(lbl0, lbl1, lbl2) - when opt_branch_overflows map pc lbl0 - || opt_branch_overflows map pc lbl1 - || opt_branch_overflows map pc lbl2 -> - let cont = - expand_optbranch lbl0 0 instr.arg - (expand_optbranch lbl1 1 instr.arg - (expand_optbranch lbl2 2 instr.arg instr.next)) in - instr.desc <- cont.desc; - instr.next <- cont.next; - fixup true pc instr - | Lop(Ialloc n) when codesize - pc >= max_branch_offset -> - instr.desc <- Lop(Ispecific(Ialloc_far n)); - fixup true (pc + 4) instr.next - | op -> - fixup did_fix (pc + instr_size op) instr.next - in fixup false 0 code - -(* Iterate branch expansion till all conditional branches are OK *) - -let rec branch_normalization code = - let (codesize, map) = label_map code in - if codesize >= max_branch_offset && fixup_branches codesize map code - then branch_normalization code - else () + | Lswitch jumptbl -> 8 + | Lsetuptrap lbl -> 1 + | Lpushtrap -> 4 + | Lpoptrap -> 2 + | Lraise _ -> 6 + + let relax_allocation ~num_words = Lop (Ispecific (Ialloc_far num_words)) + (* [classify_addr], above, never identifies these instructions as needing + relaxing. As such, these functions should never be called. *) + let relax_specific_op _ = assert false + let relax_intop_checkbound () = assert false + let relax_intop_imm_checkbound ~bound:_ = assert false +end) (* Output the assembly code for an instruction *) @@ -848,7 +809,10 @@ let fundecl fundecl = ` addi {emit_gpr 1}, {emit_gpr 1}, {emit_int(-n)}\n` end; `{emit_label !tailrec_entry_point}:\n`; - branch_normalization fundecl.fun_body; + (* On this target, there is at most one "out of line" code block per + function: a single "call GC" point. It comes immediately after the + function's body. *) + BR.relax fundecl.fun_body ~max_out_of_line_code_offset:0; emit_all fundecl.fun_body; (* Emit the glue code to call the GC *) if !call_gc_label > 0 then begin From d0b9cb164944d5c691f34a82022eb1fdf374724c Mon Sep 17 00:00:00 2001 From: Mark Shinwell <mshinwell@janestreet.com> Date: Wed, 10 Jun 2015 13:30:58 +0000 Subject: [PATCH 292/494] Fix copyright notices for new branch relaxation files git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16169 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- asmcomp/branch_relaxation.ml | 3 ++- asmcomp/branch_relaxation.mli | 3 ++- asmcomp/branch_relaxation_intf.ml | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/asmcomp/branch_relaxation.ml b/asmcomp/branch_relaxation.ml index d4609e4a8e..c2729d2f9a 100644 --- a/asmcomp/branch_relaxation.ml +++ b/asmcomp/branch_relaxation.ml @@ -5,7 +5,8 @@ (* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) (* Mark Shinwell, Jane Street Europe *) (* *) -(* Copyright 1996 Institut National de Recherche en Informatique et *) +(* Copyright 2015 Jane Street Group, LLC. Based on earlier code *) +(* copyright 1996 Institut National de Recherche en Informatique et *) (* en Automatique. All rights reserved. This file is distributed *) (* under the terms of the Q Public License version 1.0. *) (* *) diff --git a/asmcomp/branch_relaxation.mli b/asmcomp/branch_relaxation.mli index 9d517b1311..b2eb328b6b 100644 --- a/asmcomp/branch_relaxation.mli +++ b/asmcomp/branch_relaxation.mli @@ -5,7 +5,8 @@ (* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) (* Mark Shinwell, Jane Street Europe *) (* *) -(* Copyright 1996 Institut National de Recherche en Informatique et *) +(* Copyright 2015 Jane Street Group, LLC. Based on earlier code *) +(* copyright 1996 Institut National de Recherche en Informatique et *) (* en Automatique. All rights reserved. This file is distributed *) (* under the terms of the Q Public License version 1.0. *) (* *) diff --git a/asmcomp/branch_relaxation_intf.ml b/asmcomp/branch_relaxation_intf.ml index 610d0d0753..1a1c5e6d15 100644 --- a/asmcomp/branch_relaxation_intf.ml +++ b/asmcomp/branch_relaxation_intf.ml @@ -2,9 +2,11 @@ (* *) (* OCaml *) (* *) +(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) (* Mark Shinwell, Jane Street Europe *) (* *) -(* Copyright 1996 Institut National de Recherche en Informatique et *) +(* Copyright 2015 Jane Street Group, LLC. Based on earlier code *) +(* copyright 1996 Institut National de Recherche en Informatique et *) (* en Automatique. All rights reserved. This file is distributed *) (* under the terms of the Q Public License version 1.0. *) (* *) From 9a7b9fe31c8b543d706e20ffa053543d3affa181 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Wed, 10 Jun 2015 15:58:19 +0000 Subject: [PATCH 293/494] tweak copyright headers (again) git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16170 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- asmcomp/branch_relaxation.ml | 3 +-- asmcomp/branch_relaxation.mli | 3 +-- asmcomp/branch_relaxation_intf.ml | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/asmcomp/branch_relaxation.ml b/asmcomp/branch_relaxation.ml index c2729d2f9a..d4609e4a8e 100644 --- a/asmcomp/branch_relaxation.ml +++ b/asmcomp/branch_relaxation.ml @@ -5,8 +5,7 @@ (* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) (* Mark Shinwell, Jane Street Europe *) (* *) -(* Copyright 2015 Jane Street Group, LLC. Based on earlier code *) -(* copyright 1996 Institut National de Recherche en Informatique et *) +(* Copyright 1996 Institut National de Recherche en Informatique et *) (* en Automatique. All rights reserved. This file is distributed *) (* under the terms of the Q Public License version 1.0. *) (* *) diff --git a/asmcomp/branch_relaxation.mli b/asmcomp/branch_relaxation.mli index b2eb328b6b..e2a93f83d1 100644 --- a/asmcomp/branch_relaxation.mli +++ b/asmcomp/branch_relaxation.mli @@ -5,8 +5,7 @@ (* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) (* Mark Shinwell, Jane Street Europe *) (* *) -(* Copyright 2015 Jane Street Group, LLC. Based on earlier code *) -(* copyright 1996 Institut National de Recherche en Informatique et *) +(* Copyright 2015 Institut National de Recherche en Informatique et *) (* en Automatique. All rights reserved. This file is distributed *) (* under the terms of the Q Public License version 1.0. *) (* *) diff --git a/asmcomp/branch_relaxation_intf.ml b/asmcomp/branch_relaxation_intf.ml index 1a1c5e6d15..0812c7c1b8 100644 --- a/asmcomp/branch_relaxation_intf.ml +++ b/asmcomp/branch_relaxation_intf.ml @@ -5,8 +5,7 @@ (* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) (* Mark Shinwell, Jane Street Europe *) (* *) -(* Copyright 2015 Jane Street Group, LLC. Based on earlier code *) -(* copyright 1996 Institut National de Recherche en Informatique et *) +(* Copyright 2015 Institut National de Recherche en Informatique et *) (* en Automatique. All rights reserved. This file is distributed *) (* under the terms of the Q Public License version 1.0. *) (* *) From 0e651b7fc31a5bc5763f6f3891fb4833c4b4c587 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Wed, 10 Jun 2015 16:09:22 +0000 Subject: [PATCH 294/494] last commit before 4.02.2+rc1 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16171 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- VERSION | 2 +- asmrun/.depend | 39 ++++++++++++++++++-------------------- boot/ocamlc | Bin 1742883 -> 1745784 bytes boot/ocamldep | Bin 554628 -> 556857 bytes boot/ocamllex | Bin 254496 -> 256437 bytes otherlibs/threads/.depend | 18 ++++++++---------- 6 files changed, 27 insertions(+), 32 deletions(-) diff --git a/VERSION b/VERSION index b73d959d88..01214319bb 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.02.2+dev6-2015-05-11 +4.02.2+dev7-2015-06-10 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli diff --git a/asmrun/.depend b/asmrun/.depend index fda72a28c8..e761606f89 100644 --- a/asmrun/.depend +++ b/asmrun/.depend @@ -282,15 +282,14 @@ roots.o: roots.c ../byterun/caml/finalise.h ../byterun/caml/roots.h \ ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h \ ../byterun/caml/roots.h -signals_asm.o: signals_asm.c ../byterun/caml/address_class.h \ +signals_asm.o: signals_asm.c ../byterun/caml/fail.h \ ../byterun/caml/misc.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/fail.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/osdeps.h \ - ../byterun/caml/signals.h ../byterun/caml/signals_machdep.h \ - signals_osdep.h stack.h + ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/osdeps.h ../byterun/caml/signals.h \ + ../byterun/caml/signals_machdep.h signals_osdep.h stack.h signals.o: signals.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ @@ -631,15 +630,14 @@ roots.d.o: roots.c ../byterun/caml/finalise.h ../byterun/caml/roots.h \ ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h \ ../byterun/caml/roots.h -signals_asm.d.o: signals_asm.c ../byterun/caml/address_class.h \ +signals_asm.d.o: signals_asm.c ../byterun/caml/fail.h \ ../byterun/caml/misc.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/fail.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/osdeps.h \ - ../byterun/caml/signals.h ../byterun/caml/signals_machdep.h \ - signals_osdep.h stack.h + ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/osdeps.h ../byterun/caml/signals.h \ + ../byterun/caml/signals_machdep.h signals_osdep.h stack.h signals.d.o: signals.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ @@ -980,15 +978,14 @@ roots.p.o: roots.c ../byterun/caml/finalise.h ../byterun/caml/roots.h \ ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h \ ../byterun/caml/roots.h -signals_asm.p.o: signals_asm.c ../byterun/caml/address_class.h \ +signals_asm.p.o: signals_asm.c ../byterun/caml/fail.h \ ../byterun/caml/misc.h ../byterun/caml/config.h \ ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/fail.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/osdeps.h \ - ../byterun/caml/signals.h ../byterun/caml/signals_machdep.h \ - signals_osdep.h stack.h + ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/osdeps.h ../byterun/caml/signals.h \ + ../byterun/caml/signals_machdep.h signals_osdep.h stack.h signals.p.o: signals.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ diff --git a/boot/ocamlc b/boot/ocamlc index af5f48eabe2d3c3845771af0e4b4979d8f6b62c6..a70f3df7845ccd7f9921d1fa4d69138b187d3e07 100755 GIT binary patch delta 173600 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 T43}LI%++NT6&0&X%gX)%U#_fE delta 173069 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 diff --git a/boot/ocamldep b/boot/ocamldep index 188c9894fe9c779222dae488cc544fc1af158510..d5231c778996f38482d5e93ca5a26a1cdbac9432 100755 GIT binary patch delta 49272 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 delta 47730 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 M!R8$nI;Zsh4;$kn^#A|> diff --git a/boot/ocamllex b/boot/ocamllex index 29786c52ab7d38ccf47186cacd5821f984ce3a62..7420b7e74b5da17dba0097f54e4e6c861a53d85f 100755 GIT binary patch delta 18194 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 delta 17301 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 X<Ihg%)oSWeo^u*`H-}fB*7pAeBp`#R diff --git a/otherlibs/threads/.depend b/otherlibs/threads/.depend index caeeaee747..2b70d942d0 100644 --- a/otherlibs/threads/.depend +++ b/otherlibs/threads/.depend @@ -15,10 +15,8 @@ scheduler.o: scheduler.c ../../byterun/caml/alloc.h \ condition.cmi : mutex.cmi event.cmi : mutex.cmi : -pervasives.cmi : -thread.cmi : unix.cmi -threadUnix.cmi : unix.cmi -unix.cmi : +thread.cmi : unix.cmo +threadUnix.cmi : unix.cmo condition.cmo : thread.cmi mutex.cmi condition.cmi condition.cmx : thread.cmx mutex.cmx condition.cmi event.cmo : mutex.cmi condition.cmi event.cmi @@ -27,11 +25,11 @@ marshal.cmo : marshal.cmx : mutex.cmo : thread.cmi mutex.cmi mutex.cmx : thread.cmx mutex.cmi -pervasives.cmo : unix.cmi pervasives.cmi -pervasives.cmx : unix.cmx pervasives.cmi -thread.cmo : unix.cmi thread.cmi +pervasives.cmo : unix.cmo +pervasives.cmx : unix.cmx +thread.cmo : unix.cmo thread.cmi thread.cmx : unix.cmx thread.cmi -threadUnix.cmo : unix.cmi thread.cmi threadUnix.cmi +threadUnix.cmo : unix.cmo thread.cmi threadUnix.cmi threadUnix.cmx : unix.cmx thread.cmx threadUnix.cmi -unix.cmo : unix.cmi -unix.cmx : unix.cmi +unix.cmo : +unix.cmx : From 8582bed2dd44a827a80229cd213ad7b64a0c531e Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Wed, 10 Jun 2015 16:13:20 +0000 Subject: [PATCH 295/494] increment version number after 4.02.2+rc1 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16173 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 01214319bb..ff619bfe3a 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.02.2+dev7-2015-06-10 +4.02.2+dev8-2015-06-10 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli From 0194a954b25bba161b1db5cb0dd1b3e74549c2d5 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Wed, 17 Jun 2015 17:44:07 +0000 Subject: [PATCH 296/494] last commit before release 4.02.2 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16177 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- VERSION | 2 +- boot/ocamlc | Bin 1745784 -> 1745784 bytes boot/ocamldep | Bin 556857 -> 556857 bytes boot/ocamllex | Bin 256437 -> 256437 bytes 4 files changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index ff619bfe3a..807e783b16 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.02.2+dev8-2015-06-10 +4.02.2+dev9-2015-06-17 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli diff --git a/boot/ocamlc b/boot/ocamlc index a70f3df7845ccd7f9921d1fa4d69138b187d3e07..591fd7ebbb8fabc4fa123d9a718d54c364ab32bb 100755 GIT binary patch delta 84 zcmexyEbGUytcDiG7N!>F7M2#)7Pc1l7LFFq7OocV7M>Q~7QPn#7J(MQ7NHj57LgXw lEn;%Jcr0{{3=B<m4a{^64cfJKi2<=V5KC;=+9m1t5&+T$8~FeL delta 84 zcmexyEbGUytcDiG7N!>F7M2#)7Pc1l7LFFq7OocV7M>Q~7QPn#7J(MQ7NHj57LgXw lEn;%Jc+7N-3=B<m4NP?n4coPLi2<=V5KC;=+9m1t5&+T18}|SJ diff --git a/boot/ocamldep b/boot/ocamldep index d5231c778996f38482d5e93ca5a26a1cdbac9432..92b60f4cd2eb4b14bc5f5e605653a766017ee982 100755 GIT binary patch delta 48 zcmdn_PjTlz#fBEf7N!>F7M2#)Eo@PlJQlh}28O1(24=d32JLB?Y(UJuJuQ>tvM2zg CNDtZo delta 48 zcmdn_PjTlz#fBEf7N!>F7M2#)Eo@PlJZ8E^28O1(2Bx}(hV5yYY(UJuJuQ>tvM2zg C5f9h^ diff --git a/boot/ocamllex b/boot/ocamllex index 7420b7e74b5da17dba0097f54e4e6c861a53d85f..3d517fa1f1b0e3184059ee1140660b68e50e1048 100755 GIT binary patch delta 34 pcmdmbnSbkL{)QID7N#xCR^2=nx<&?urn&}Zx`qbZ-MX3c;{esG3g`d; delta 34 pcmdmbnSbkL{)QID7N#xCR^2>ix<&?urn&~Ex`u|^-MX3c;{er!3g!R+ From a60a6b493b092ca959bbd2c3fa243fc1f0c00239 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Wed, 17 Jun 2015 18:01:31 +0000 Subject: [PATCH 297/494] increment version number after release 4.02.2 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16180 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 807e783b16..f188d5d62c 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.02.2+dev9-2015-06-17 +4.02.2+dev10-2015-06-17 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli From 0c666ad6f664b5c05b59e8068fbd1fcf58ae6192 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Fri, 10 Jul 2015 14:09:42 +0000 Subject: [PATCH 298/494] PR#6919: corrupted final_table git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16197 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 7 +++++++ byterun/minor_gc.c | 2 ++ 2 files changed, 9 insertions(+) diff --git a/Changes b/Changes index dfa9e700c3..e7fdc9847e 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,10 @@ +OCaml 4.02.3: +------------- + +Bug fixes: +- PR#6919: corrupted final_table + (ygrek) + OCaml 4.02.2: ------------- diff --git a/byterun/minor_gc.c b/byterun/minor_gc.c index 4aaec96602..ca92928b2b 100644 --- a/byterun/minor_gc.c +++ b/byterun/minor_gc.c @@ -259,6 +259,8 @@ void caml_empty_minor_heap (void) ++ caml_stat_minor_collections; caml_final_empty_young (); if (caml_minor_gc_end_hook != NULL) (*caml_minor_gc_end_hook) (); + }else{ + caml_final_empty_young (); } #ifdef DEBUG { From 6497b0310d9db650038ebefb05aedb96ca11bc35 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Fri, 10 Jul 2015 15:32:59 +0000 Subject: [PATCH 299/494] update version number git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16198 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index f188d5d62c..5a239f9eab 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.02.2+dev10-2015-06-17 +4.02.3+dev1-2015-07-10 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli From 541e5e088142d9fb754561c484a8532e8d8edc68 Mon Sep 17 00:00:00 2001 From: Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> Date: Wed, 15 Jul 2015 03:59:14 +0000 Subject: [PATCH 300/494] Fix PR#6930 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16205 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ typing/typecore.ml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Changes b/Changes index e7fdc9847e..ecd4509e8e 100644 --- a/Changes +++ b/Changes @@ -4,6 +4,8 @@ OCaml 4.02.3: Bug fixes: - PR#6919: corrupted final_table (ygrek) +- PR#6930: Aliased result type of GADT constructor results in assertion failure + (Jacques Garrigue) OCaml 4.02.2: ------------- diff --git a/typing/typecore.ml b/typing/typecore.ml index 95af7ae6e9..d237cfe66f 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -597,7 +597,7 @@ end) = struct open Name let get_type_path env d = - match (get_type d).desc with + match (repr (get_type d)).desc with | Tconstr(p, _, _) -> p | _ -> assert false From 5c243caf1f9a9ff77cbd6e64d4df17989b38f135 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Mon, 20 Jul 2015 13:14:48 +0000 Subject: [PATCH 301/494] PR#6908: Top-level custom printing for GADTs: interface change in 4.02.2 git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16221 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ VERSION | 2 +- toplevel/topdirs.ml | 20 +++++++++++--------- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/Changes b/Changes index ecd4509e8e..b52120ca46 100644 --- a/Changes +++ b/Changes @@ -2,6 +2,8 @@ OCaml 4.02.3: ------------- Bug fixes: +- PR#6908: Top-level custom printing for GADTs: interface change in 4.02.2 + (Grégoire Henry, report by Jeremy Yallop) - PR#6919: corrupted final_table (ygrek) - PR#6930: Aliased result type of GADT constructor results in assertion failure diff --git a/VERSION b/VERSION index 5a239f9eab..b3ded4efee 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.02.3+dev1-2015-07-10 +4.02.3+dev2-2015-07-20 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli diff --git a/toplevel/topdirs.ml b/toplevel/topdirs.ml index 42fe0a5dcc..7ba572b2b0 100644 --- a/toplevel/topdirs.ml +++ b/toplevel/topdirs.ml @@ -251,15 +251,17 @@ let match_printer_type ppf desc = let printer_type_new = printer_type ppf "printer_type_new" in let printer_type_old = printer_type ppf "printer_type_old" in Ctype.init_def(Ident.current_time()); - match extract_target_parameters desc.val_type with - | None -> - (try - (match_simple_printer_type ppf desc printer_type_new, false) - with Ctype.Unify _ -> - (match_simple_printer_type ppf desc printer_type_old, true)) - | Some (path, args) -> - (* only 'new' style is available for generic printers *) - match_generic_printer_type ppf desc path args printer_type_new, false + try + (match_simple_printer_type ppf desc printer_type_new, false) + with Ctype.Unify _ -> + try + (match_simple_printer_type ppf desc printer_type_old, true) + with Ctype.Unify _ as exn -> + match extract_target_parameters desc.val_type with + | None -> raise exn + | Some (path, args) -> + (match_generic_printer_type ppf desc path args printer_type_new, + false) let find_printer_type ppf lid = try From 2e6e00c6e2dc3ecdb6da5df4657f6fe2c58f6d32 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Mon, 20 Jul 2015 14:04:29 +0000 Subject: [PATCH 302/494] PR#6393: new primitive caml_alloc_dummy_function git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16222 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 4 ++++ VERSION | 2 +- bytecomp/bytegen.ml | 13 ++++++++++--- byterun/alloc.c | 6 ++++++ 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/Changes b/Changes index b52120ca46..e41f6c961c 100644 --- a/Changes +++ b/Changes @@ -9,6 +9,10 @@ Bug fixes: - PR#6930: Aliased result type of GADT constructor results in assertion failure (Jacques Garrigue) +Feature wish: +- GPR#37: New primitive: caml_alloc_dummy_function + (Hugo Heuzard) + OCaml 4.02.2: ------------- diff --git a/VERSION b/VERSION index b3ded4efee..0b341819ce 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.02.3+dev2-2015-07-20 +4.02.3+dev3-2015-07-20 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli diff --git a/bytecomp/bytegen.ml b/bytecomp/bytegen.ml index aa98a6b34f..10e70c0b9c 100644 --- a/bytecomp/bytegen.ml +++ b/bytecomp/bytegen.ml @@ -128,6 +128,7 @@ type rhs_kind = | RHS_block of int | RHS_floatblock of int | RHS_nonrec + | RHS_function of int * int ;; let rec check_recordwith_updates id e = @@ -140,7 +141,7 @@ let rec check_recordwith_updates id e = let rec size_of_lambda = function | Lfunction(kind, params, body) as funct -> - RHS_block (1 + IdentSet.cardinal(free_variables funct)) + RHS_function (1 + IdentSet.cardinal(free_variables funct), List.length params) | Llet (Strict, id, Lprim (Pduprecord (kind, size), _), body) when check_recordwith_updates id body -> begin match kind with @@ -534,19 +535,25 @@ let rec comp_expr env exp sz cont = Kconst(Const_base(Const_int blocksize)) :: Kccall("caml_alloc_dummy", 1) :: Kpush :: comp_init (add_var id (sz+1) new_env) (sz+1) rem + | (id, exp, RHS_function (blocksize,arity)) :: rem -> + Kconst(Const_base(Const_int arity)) :: + Kpush :: + Kconst(Const_base(Const_int blocksize)) :: + Kccall("caml_alloc_dummy_function", 2) :: Kpush :: + comp_init (add_var id (sz+1) new_env) (sz+1) rem | (id, exp, RHS_nonrec) :: rem -> Kconst(Const_base(Const_int 0)) :: Kpush :: comp_init (add_var id (sz+1) new_env) (sz+1) rem and comp_nonrec new_env sz i = function | [] -> comp_rec new_env sz ndecl decl_size - | (id, exp, (RHS_block _ | RHS_floatblock _)) :: rem -> + | (id, exp, (RHS_block _ | RHS_floatblock _ | RHS_function _)) :: rem -> comp_nonrec new_env sz (i-1) rem | (id, exp, RHS_nonrec) :: rem -> comp_expr new_env exp sz (Kassign (i-1) :: comp_nonrec new_env sz (i-1) rem) and comp_rec new_env sz i = function | [] -> comp_expr new_env body sz (add_pop ndecl cont) - | (id, exp, (RHS_block _ | RHS_floatblock _)) :: rem -> + | (id, exp, (RHS_block _ | RHS_floatblock _ | RHS_function _)) :: rem -> comp_expr new_env exp sz (Kpush :: Kacc i :: Kccall("caml_update_dummy", 2) :: comp_rec new_env sz (i-1) rem) diff --git a/byterun/alloc.c b/byterun/alloc.c index 6544a0c5d0..b421cace62 100644 --- a/byterun/alloc.c +++ b/byterun/alloc.c @@ -153,6 +153,12 @@ CAMLprim value caml_alloc_dummy(value size) return caml_alloc (wosize, 0); } +CAMLprim value caml_alloc_dummy_function(value size,value arity) +{ + /* the arity argument is used by the js_of_ocaml runtime */ + return caml_alloc_dummy(size); +} + CAMLprim value caml_alloc_dummy_float (value size) { mlsize_t wosize = Int_val(size) * Double_wosize; From 1f248748cecc8e079d0e4f858ac85e2bd52f1eb1 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Mon, 20 Jul 2015 14:10:11 +0000 Subject: [PATCH 303/494] PR#6691: install .cmt[i] files for stdlib and compiler-libs git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16223 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 4 +++- Makefile | 10 +++++++--- Makefile.nt | 10 +++++++--- stdlib/Makefile.shared | 3 ++- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/Changes b/Changes index e41f6c961c..1c4936a9a1 100644 --- a/Changes +++ b/Changes @@ -9,7 +9,9 @@ Bug fixes: - PR#6930: Aliased result type of GADT constructor results in assertion failure (Jacques Garrigue) -Feature wish: +Feature wishes: +- PR#6691: install .cmt[i] files for stdlib and compiler-libs + (David Sheets, request by Gabriel Radanne) - GPR#37: New primitive: caml_alloc_dummy_function (Hugo Heuzard) diff --git a/Makefile b/Makefile index 1cfc9b400b..ead65207e3 100644 --- a/Makefile +++ b/Makefile @@ -320,8 +320,12 @@ install: cd stdlib; $(MAKE) install cp lex/ocamllex $(INSTALL_BINDIR)/ocamllex$(EXE) cp $(CAMLYACC)$(EXE) $(INSTALL_BINDIR)/ocamlyacc$(EXE) - cp utils/*.cmi parsing/*.cmi typing/*.cmi bytecomp/*.cmi driver/*.cmi \ - toplevel/*.cmi $(INSTALL_COMPLIBDIR) + cp utils/*.cmi utils/*.cmt utils/*.cmti \ + parsing/*.cmi parsing/*.cmt parsing/*.cmti \ + typing/*.cmi typing/*.cmt typing/*.cmti \ + bytecomp/*.cmi bytecomp/*.cmt bytecomp/*.cmti \ + driver/*.cmi driver/*.cmt driver/*.cmti \ + toplevel/*.cmi toplevel/*.cmt toplevel/*.cmti $(INSTALL_COMPLIBDIR) cp compilerlibs/ocamlcommon.cma compilerlibs/ocamlbytecomp.cma \ compilerlibs/ocamltoplevel.cma $(BYTESTART) $(TOPLEVELSTART) \ $(INSTALL_COMPLIBDIR) @@ -345,7 +349,7 @@ installopt: cd asmrun; $(MAKE) install cp ocamlopt $(INSTALL_BINDIR)/ocamlopt$(EXE) cd stdlib; $(MAKE) installopt - cp asmcomp/*.cmi $(INSTALL_COMPLIBDIR) + cp asmcomp/*.cmi asmcomp/*.cmt asmcomp/*.cmti $(INSTALL_COMPLIBDIR) cp compilerlibs/ocamloptcomp.cma $(OPTSTART) $(INSTALL_COMPLIBDIR) if test -n "$(WITH_OCAMLDOC)"; then (cd ocamldoc; $(MAKE) installopt); \ else :; fi diff --git a/Makefile.nt b/Makefile.nt index 3179374c74..9666b7bd21 100644 --- a/Makefile.nt +++ b/Makefile.nt @@ -244,8 +244,12 @@ installbyt: cd stdlib ; $(MAKEREC) install cp lex/ocamllex $(INSTALL_BINDIR)/ocamllex.exe cp yacc/ocamlyacc.exe $(INSTALL_BINDIR)/ocamlyacc.exe - cp utils/*.cmi parsing/*.cmi typing/*.cmi bytecomp/*.cmi driver/*.cmi \ - toplevel/*.cmi $(INSTALL_COMPLIBDIR) + cp utils/*.cmi utils/*.cmt utils/*.cmti \ + parsing/*.cmi parsing/*.cmt parsing/*.cmti \ + typing/*.cmi typing/*.cmt typing/*.cmti \ + bytecomp/*.cmi bytecomp/*.cmt bytecomp/*.cmti \ + driver/*.cmi driver/*.cmt driver/*.cmti \ + toplevel/*.cmi toplevel/*.cmt toplevel/*.cmti $(INSTALL_COMPLIBDIR) cp compilerlibs/ocamlcommon.cma compilerlibs/ocamlbytecomp.cma \ compilerlibs/ocamltoplevel.cma $(BYTESTART) $(TOPLEVELSTART) \ $(INSTALL_COMPLIBDIR) @@ -272,7 +276,7 @@ installopt: cd asmrun ; $(MAKEREC) install cp ocamlopt $(INSTALL_BINDIR)/ocamlopt.exe cd stdlib ; $(MAKEREC) installopt - cp asmcomp/*.cmi $(INSTALL_COMPLIBDIR) + cp asmcomp/*.cmi asmcomp/*.cmt asmcomp/*.cmti $(INSTALL_COMPLIBDIR) cp compilerlibs/ocamloptcomp.cma $(OPTSTART) $(INSTALL_COMPLIBDIR) if test -n "$(WITH_OCAMLDOC)"; then (cd ocamldoc; $(MAKEREC) installopt); fi if test -n "$(WITH_OCAMLBUILD)"; then (cd ocamlbuild; $(MAKE) installopt); \ diff --git a/stdlib/Makefile.shared b/stdlib/Makefile.shared index 8bc6e1bcd9..b97ca21c6f 100755 --- a/stdlib/Makefile.shared +++ b/stdlib/Makefile.shared @@ -45,7 +45,8 @@ all: stdlib.cma std_exit.cmo camlheader target_camlheader camlheader_ur INSTALL_LIBDIR=$(DESTDIR)$(LIBDIR) install: install-$(RUNTIMED) - cp stdlib.cma std_exit.cmo *.cmi *.mli *.ml camlheader_ur \ + cp stdlib.cma std_exit.cmo *.cmi *.cmt *.cmti *.mli *.ml \ + camlheader_ur \ $(INSTALL_LIBDIR) cp target_camlheader $(INSTALL_LIBDIR)/camlheader From 7ad5340bfef48eacfd80d770f7054d314f092f40 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Mon, 20 Jul 2015 14:46:48 +0000 Subject: [PATCH 304/494] move GC hooks to a safe place for callbacks git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16224 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- VERSION | 2 +- byterun/caml/misc.h | 6 ++++-- byterun/finalise.c | 2 ++ byterun/major_gc.c | 7 +++---- byterun/minor_gc.c | 2 -- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/VERSION b/VERSION index 0b341819ce..2082eb9556 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.02.3+dev3-2015-07-20 +4.02.3+dev4-2015-07-20 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli diff --git a/byterun/caml/misc.h b/byterun/caml/misc.h index db0971d2bb..9319635f60 100644 --- a/byterun/caml/misc.h +++ b/byterun/caml/misc.h @@ -63,8 +63,10 @@ typedef char * addr; extern "C" { #endif -/* GC timing hooks. These can be assigned by the user. The hook functions - must not allocate or change the heap in any way. */ +/* GC timing hooks. These can be assigned by the user. + [caml_minor_gc_begin_hook] must not allocate nor change any heap value. + The others can allocate and even call back to OCaml code. +*/ typedef void (*caml_timing_hook) (void); extern caml_timing_hook caml_major_slice_begin_hook, caml_major_slice_end_hook; extern caml_timing_hook caml_minor_gc_begin_hook, caml_minor_gc_end_hook; diff --git a/byterun/finalise.c b/byterun/finalise.c index b9ce1b1b0c..fd1c29bc07 100644 --- a/byterun/finalise.c +++ b/byterun/finalise.c @@ -125,6 +125,7 @@ void caml_final_do_calls (void) if (running_finalisation_function) return; if (to_do_hd != NULL){ + if (caml_finalise_begin_hook != NULL) (*caml_finalise_begin_hook) (); caml_gc_message (0x80, "Calling finalisation functions.\n", 0); while (1){ while (to_do_hd != NULL && to_do_hd->size == 0){ @@ -143,6 +144,7 @@ void caml_final_do_calls (void) if (Is_exception_result (res)) caml_raise (Extract_exception (res)); } caml_gc_message (0x80, "Done calling finalisation functions.\n", 0); + if (caml_finalise_end_hook != NULL) (*caml_finalise_end_hook) (); } } diff --git a/byterun/major_gc.c b/byterun/major_gc.c index 006da8471e..6a273b9736 100644 --- a/byterun/major_gc.c +++ b/byterun/major_gc.c @@ -149,7 +149,6 @@ static void mark_slice (intnat work) int marking_closure = 0; #endif - if (caml_major_slice_begin_hook != NULL) (*caml_major_slice_begin_hook) (); caml_gc_message (0x40, "Marking %ld words\n", work); caml_gc_message (0x40, "Subphase = %ld\n", caml_gc_subphase); gray_vals_ptr = gray_vals_cur; @@ -322,7 +321,6 @@ static void mark_slice (intnat work) } } gray_vals_cur = gray_vals_ptr; - if (caml_major_slice_end_hook != NULL) (*caml_major_slice_end_hook) (); } static void sweep_slice (intnat work) @@ -330,7 +328,6 @@ static void sweep_slice (intnat work) char *hp; header_t hd; - if (caml_major_slice_begin_hook != NULL) (*caml_major_slice_begin_hook) (); caml_gc_message (0x40, "Sweeping %ld words\n", work); while (work > 0){ if (caml_gc_sweep_hp < limit){ @@ -369,7 +366,6 @@ static void sweep_slice (intnat work) } } } - if (caml_major_slice_end_hook != NULL) (*caml_major_slice_end_hook) (); } /* The main entry point for the GC. Called after each minor GC. @@ -424,6 +420,8 @@ intnat caml_major_collection_slice (intnat howmuch) This slice will either mark MS words or sweep SS words. */ + if (caml_major_slice_begin_hook != NULL) (*caml_major_slice_begin_hook) (); + if (caml_gc_phase == Phase_idle) start_cycle (); p = (double) caml_allocated_words * 3.0 * (100 + caml_percent_free) @@ -471,6 +469,7 @@ intnat caml_major_collection_slice (intnat howmuch) caml_allocated_words = 0; caml_dependent_allocated = 0; caml_extra_heap_resources = 0.0; + if (caml_major_slice_end_hook != NULL) (*caml_major_slice_end_hook) (); return computed_work; } diff --git a/byterun/minor_gc.c b/byterun/minor_gc.c index ca92928b2b..8eb087c77e 100644 --- a/byterun/minor_gc.c +++ b/byterun/minor_gc.c @@ -284,9 +284,7 @@ CAMLexport void caml_minor_collection (void) caml_major_collection_slice (0); caml_force_major_slice = 0; - if (caml_finalise_begin_hook != NULL) (*caml_finalise_begin_hook) (); caml_final_do_calls (); - if (caml_finalise_end_hook != NULL) (*caml_finalise_end_hook) (); caml_empty_minor_heap (); } From 126bc6200349ecb886b0b0dc84dc86088c8cb95a Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 21 Jul 2015 14:46:41 +0000 Subject: [PATCH 305/494] PR#6926: Regression: ocamldoc lost unattached comment git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16229 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- Changes | 2 ++ VERSION | 2 +- ocamldoc/odoc_sig.ml | 14 +++++++++++--- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Changes b/Changes index 1c4936a9a1..3587d44b78 100644 --- a/Changes +++ b/Changes @@ -6,6 +6,8 @@ Bug fixes: (Grégoire Henry, report by Jeremy Yallop) - PR#6919: corrupted final_table (ygrek) +- PR#6926: Regression: ocamldoc lost unattached comment + (Damien Doligez, report by François Bobot) - PR#6930: Aliased result type of GADT constructor results in assertion failure (Jacques Garrigue) diff --git a/VERSION b/VERSION index 2082eb9556..c8b576f1da 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.02.3+dev4-2015-07-20 +4.02.3+dev5-2015-07-21 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli diff --git a/ocamldoc/odoc_sig.ml b/ocamldoc/odoc_sig.ml index a10837ff22..ee65748a18 100644 --- a/ocamldoc/odoc_sig.ml +++ b/ocamldoc/odoc_sig.ml @@ -566,12 +566,20 @@ module Analyser = assoc_com ele.Parsetree.psig_desc in - f (acc_eles @ (ele_comments @ elements)) - new_env - (ele.Parsetree.psig_loc.Location.loc_end.Lexing.pos_cnum + maybe_more) + let new_pos = + match ele.Parsetree.psig_desc with + | Parsetree.Psig_attribute ({Asttypes.txt = "ocaml.text"}, _) -> last_pos + (* This "signature item" is actually a doc comment; the item is ignored + but don't skip the comment. *) + | _ -> + (ele.Parsetree.psig_loc.Location.loc_end.Lexing.pos_cnum + maybe_more) (* for the comments of constructors in types, which are after the constructor definition and can go beyond ele.Parsetree.psig_loc.Location.loc_end.Lexing.pos_cnum *) + in + f (acc_eles @ (ele_comments @ elements)) + new_env + new_pos q in f [] env last_pos sig_item_list From 357304f3232923c0ce4edcbd64257427d9a24576 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Tue, 21 Jul 2015 21:23:53 +0000 Subject: [PATCH 306/494] bootstrap git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.02@16231 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- boot/ocamlc | Bin 1745784 -> 1746248 bytes boot/ocamldep | Bin 556857 -> 557027 bytes boot/ocamllex | Bin 256437 -> 256466 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/boot/ocamlc b/boot/ocamlc index 591fd7ebbb8fabc4fa123d9a718d54c364ab32bb..134408a67acc473375c3159c9ce6cef97cc47d8c 100755 GIT binary patch delta 29576 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 delta 29680 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 QuI?fo`jArpnvnE=0I!QvQUCw| diff --git a/boot/ocamldep b/boot/ocamldep index 92b60f4cd2eb4b14bc5f5e605653a766017ee982..193eadbbed0e1a135f7dd2f2ba68987581282c93 100755 GIT binary patch delta 11513 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 Mxcy-n*=TY9H)6vd4FCWD delta 11460 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 diff --git a/boot/ocamllex b/boot/ocamllex index 3d517fa1f1b0e3184059ee1140660b68e50e1048..f6a6e5dff45ba91151035a2414956afb6283f531 100755 GIT binary patch delta 8254 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 delta 8249 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%0DJ`|0oYbdV-{Of+1(=9H#`I?Sb%bj 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 WbLKU(^`a{69}4JzdgXUo%6|jc0No`3 From bee55c46e931fb987f9ecae60c891939e8208506 Mon Sep 17 00:00:00 2001 From: Damien Doligez <damien.doligez-inria.fr> Date: Thu, 23 Jul 2015 15:14:03 +0000 Subject: [PATCH 307/494] tagging release 4.02.3 git-svn-id: http://caml.inria.fr/svn/ocaml/release/4.02.3@16239 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- .depend | 102 +- VERSION | 2 +- asmrun/.depend | 1893 +++++++++++++++++----------------- boot/ocamlc | Bin 1746248 -> 1746238 bytes boot/ocamldep | Bin 557027 -> 557017 bytes boot/ocamllex | Bin 256466 -> 256452 bytes byterun/.depend | 1185 ++++++++++----------- debugger/.depend | 2 +- lex/.depend | 6 +- ocamlbuild/.depend | 50 +- ocamldoc/.depend | 26 +- otherlibs/bigarray/.depend | 41 +- otherlibs/graph/.depend | 175 ++-- otherlibs/num/.depend | 26 +- otherlibs/str/.depend | 14 +- otherlibs/systhreads/.depend | 25 +- otherlibs/threads/.depend | 26 +- otherlibs/unix/.depend | 1100 ++++++++++---------- stdlib/.depend | 58 +- tools/.depend | 4 +- 20 files changed, 2414 insertions(+), 2321 deletions(-) diff --git a/.depend b/.depend index d7eed05a4d..86652727b7 100644 --- a/.depend +++ b/.depend @@ -106,10 +106,10 @@ typing/ctype.cmi : typing/types.cmi typing/path.cmi parsing/longident.cmi \ typing/ident.cmi typing/env.cmi parsing/asttypes.cmi typing/datarepr.cmi : typing/types.cmi typing/path.cmi typing/ident.cmi \ parsing/asttypes.cmi -typing/envaux.cmi : typing/subst.cmi typing/path.cmi typing/env.cmi typing/env.cmi : utils/warnings.cmi typing/types.cmi typing/subst.cmi \ typing/path.cmi parsing/longident.cmi parsing/location.cmi \ typing/ident.cmi utils/consistbl.cmi parsing/asttypes.cmi +typing/envaux.cmi : typing/subst.cmi typing/path.cmi typing/env.cmi typing/ident.cmi : typing/includeclass.cmi : typing/types.cmi typing/env.cmi typing/ctype.cmi typing/includecore.cmi : typing/types.cmi typing/typedtree.cmi \ @@ -127,10 +127,10 @@ typing/parmatch.cmi : typing/types.cmi typing/typedtree.cmi \ typing/path.cmi : typing/ident.cmi typing/predef.cmi : typing/types.cmi typing/path.cmi typing/ident.cmi typing/primitive.cmi : -typing/printtyped.cmi : typing/typedtree.cmi typing/printtyp.cmi : typing/types.cmi typing/path.cmi \ typing/outcometree.cmi parsing/longident.cmi typing/ident.cmi \ typing/env.cmi +typing/printtyped.cmi : typing/typedtree.cmi typing/stypes.cmi : typing/typedtree.cmi parsing/location.cmi \ typing/annot.cmi typing/subst.cmi : typing/types.cmi typing/path.cmi typing/ident.cmi @@ -144,11 +144,11 @@ typing/typedecl.cmi : typing/types.cmi typing/typedtree.cmi typing/path.cmi \ parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ typing/includecore.cmi typing/ident.cmi typing/env.cmi \ parsing/asttypes.cmi -typing/typedtreeIter.cmi : typing/typedtree.cmi parsing/asttypes.cmi -typing/typedtreeMap.cmi : typing/typedtree.cmi typing/typedtree.cmi : typing/types.cmi typing/primitive.cmi typing/path.cmi \ parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ typing/ident.cmi typing/env.cmi parsing/asttypes.cmi +typing/typedtreeIter.cmi : typing/typedtree.cmi parsing/asttypes.cmi +typing/typedtreeMap.cmi : typing/typedtree.cmi typing/typemod.cmi : typing/types.cmi typing/typedtree.cmi typing/path.cmi \ parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ typing/includemod.cmi typing/ident.cmi typing/env.cmi \ @@ -189,12 +189,6 @@ typing/datarepr.cmo : typing/types.cmi typing/path.cmi parsing/location.cmi \ typing/datarepr.cmx : typing/types.cmx typing/path.cmx parsing/location.cmx \ typing/ident.cmx typing/btype.cmx parsing/asttypes.cmi \ typing/datarepr.cmi -typing/envaux.cmo : typing/types.cmi typing/subst.cmi typing/printtyp.cmi \ - typing/path.cmi utils/misc.cmi typing/ident.cmi typing/env.cmi \ - parsing/asttypes.cmi typing/envaux.cmi -typing/envaux.cmx : typing/types.cmx typing/subst.cmx typing/printtyp.cmx \ - typing/path.cmx utils/misc.cmx typing/ident.cmx typing/env.cmx \ - parsing/asttypes.cmi typing/envaux.cmi typing/env.cmo : utils/warnings.cmi typing/types.cmi utils/tbl.cmi \ typing/subst.cmi typing/predef.cmi typing/path.cmi utils/misc.cmi \ parsing/longident.cmi parsing/location.cmi typing/ident.cmi \ @@ -207,6 +201,12 @@ typing/env.cmx : utils/warnings.cmx typing/types.cmx utils/tbl.cmx \ typing/datarepr.cmx utils/consistbl.cmx utils/config.cmx \ typing/cmi_format.cmx utils/clflags.cmx typing/btype.cmx \ parsing/asttypes.cmi typing/env.cmi +typing/envaux.cmo : typing/types.cmi typing/subst.cmi typing/printtyp.cmi \ + typing/path.cmi utils/misc.cmi typing/ident.cmi typing/env.cmi \ + parsing/asttypes.cmi typing/envaux.cmi +typing/envaux.cmx : typing/types.cmx typing/subst.cmx typing/printtyp.cmx \ + typing/path.cmx utils/misc.cmx typing/ident.cmx typing/env.cmx \ + parsing/asttypes.cmi typing/envaux.cmi typing/ident.cmo : typing/ident.cmi typing/ident.cmx : typing/ident.cmi typing/includeclass.cmo : typing/types.cmi typing/printtyp.cmi \ @@ -265,12 +265,6 @@ typing/predef.cmx : typing/types.cmx typing/path.cmx parsing/location.cmx \ typing/ident.cmx typing/btype.cmx parsing/asttypes.cmi typing/predef.cmi typing/primitive.cmo : utils/misc.cmi typing/primitive.cmi typing/primitive.cmx : utils/misc.cmx typing/primitive.cmi -typing/printtyped.cmo : typing/typedtree.cmi parsing/printast.cmi \ - typing/path.cmi utils/misc.cmi parsing/longident.cmi parsing/location.cmi \ - typing/ident.cmi parsing/asttypes.cmi typing/printtyped.cmi -typing/printtyped.cmx : typing/typedtree.cmx parsing/printast.cmx \ - typing/path.cmx utils/misc.cmx parsing/longident.cmx parsing/location.cmx \ - typing/ident.cmx parsing/asttypes.cmi typing/printtyped.cmi typing/printtyp.cmo : typing/types.cmi typing/primitive.cmi \ typing/predef.cmi typing/path.cmi typing/outcometree.cmi \ typing/oprint.cmi utils/misc.cmi parsing/longident.cmi \ @@ -283,6 +277,12 @@ typing/printtyp.cmx : typing/types.cmx typing/primitive.cmx \ parsing/location.cmx typing/ident.cmx typing/env.cmx typing/ctype.cmx \ utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi \ typing/printtyp.cmi +typing/printtyped.cmo : typing/typedtree.cmi parsing/printast.cmi \ + typing/path.cmi utils/misc.cmi parsing/longident.cmi parsing/location.cmi \ + typing/ident.cmi parsing/asttypes.cmi typing/printtyped.cmi +typing/printtyped.cmx : typing/typedtree.cmx parsing/printast.cmx \ + typing/path.cmx utils/misc.cmx parsing/longident.cmx parsing/location.cmx \ + typing/ident.cmx parsing/asttypes.cmi typing/printtyped.cmi typing/stypes.cmo : typing/typedtree.cmi typing/printtyp.cmi \ parsing/location.cmi utils/clflags.cmi typing/annot.cmi typing/stypes.cmi typing/stypes.cmx : typing/typedtree.cmx typing/printtyp.cmx \ @@ -345,14 +345,6 @@ typing/typedecl.cmx : utils/warnings.cmx typing/typetexp.cmx \ typing/ident.cmx typing/env.cmx typing/ctype.cmx utils/config.cmx \ utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi \ parsing/ast_helper.cmx typing/typedecl.cmi -typing/typedtreeIter.cmo : typing/typedtree.cmi utils/misc.cmi \ - parsing/asttypes.cmi typing/typedtreeIter.cmi -typing/typedtreeIter.cmx : typing/typedtree.cmx utils/misc.cmx \ - parsing/asttypes.cmi typing/typedtreeIter.cmi -typing/typedtreeMap.cmo : typing/typedtree.cmi utils/misc.cmi \ - typing/typedtreeMap.cmi -typing/typedtreeMap.cmx : typing/typedtree.cmx utils/misc.cmx \ - typing/typedtreeMap.cmi typing/typedtree.cmo : typing/types.cmi typing/primitive.cmi typing/path.cmi \ parsing/parsetree.cmi utils/misc.cmi parsing/longident.cmi \ parsing/location.cmi typing/ident.cmi typing/env.cmi parsing/asttypes.cmi \ @@ -361,6 +353,14 @@ typing/typedtree.cmx : typing/types.cmx typing/primitive.cmx typing/path.cmx \ parsing/parsetree.cmi utils/misc.cmx parsing/longident.cmx \ parsing/location.cmx typing/ident.cmx typing/env.cmx parsing/asttypes.cmi \ typing/typedtree.cmi +typing/typedtreeIter.cmo : typing/typedtree.cmi utils/misc.cmi \ + parsing/asttypes.cmi typing/typedtreeIter.cmi +typing/typedtreeIter.cmx : typing/typedtree.cmx utils/misc.cmx \ + parsing/asttypes.cmi typing/typedtreeIter.cmi +typing/typedtreeMap.cmo : typing/typedtree.cmi utils/misc.cmi \ + typing/typedtreeMap.cmi +typing/typedtreeMap.cmx : typing/typedtree.cmx utils/misc.cmx \ + typing/typedtreeMap.cmi typing/typemod.cmo : utils/warnings.cmi typing/typetexp.cmi typing/types.cmi \ typing/typedtree.cmi typing/typedecl.cmi typing/typecore.cmi \ typing/typeclass.cmi typing/subst.cmi typing/stypes.cmi \ @@ -593,6 +593,7 @@ bytecomp/typeopt.cmo : typing/types.cmi typing/typedtree.cmi \ bytecomp/typeopt.cmx : typing/types.cmx typing/typedtree.cmx \ typing/predef.cmx typing/path.cmx bytecomp/lambda.cmx typing/ident.cmx \ typing/env.cmx typing/ctype.cmx bytecomp/typeopt.cmi +asmcomp/CSEgen.cmi : asmcomp/mach.cmi asmcomp/asmgen.cmi : bytecomp/lambda.cmi asmcomp/cmm.cmi asmcomp/asmlibrarian.cmi : asmcomp/asmlink.cmi : asmcomp/cmx_format.cmi @@ -602,20 +603,19 @@ asmcomp/branch_relaxation.cmi : asmcomp/linearize.cmi \ asmcomp/clambda.cmi : bytecomp/lambda.cmi typing/ident.cmi \ asmcomp/debuginfo.cmi parsing/asttypes.cmi asmcomp/closure.cmi : bytecomp/lambda.cmi asmcomp/clambda.cmi +asmcomp/cmm.cmi : bytecomp/lambda.cmi typing/ident.cmi asmcomp/debuginfo.cmi asmcomp/cmmgen.cmi : asmcomp/cmx_format.cmi asmcomp/cmm.cmi \ asmcomp/clambda.cmi -asmcomp/cmm.cmi : bytecomp/lambda.cmi typing/ident.cmi asmcomp/debuginfo.cmi asmcomp/cmx_format.cmi : asmcomp/clambda.cmi asmcomp/codegen.cmi : asmcomp/cmm.cmi asmcomp/coloring.cmi : asmcomp/comballoc.cmi : asmcomp/mach.cmi asmcomp/compilenv.cmi : typing/ident.cmi asmcomp/cmx_format.cmi \ asmcomp/clambda.cmi -asmcomp/CSEgen.cmi : asmcomp/mach.cmi asmcomp/deadcode.cmi : asmcomp/mach.cmi asmcomp/debuginfo.cmi : parsing/location.cmi bytecomp/lambda.cmi -asmcomp/emitaux.cmi : asmcomp/debuginfo.cmi asmcomp/emit.cmi : asmcomp/linearize.cmi asmcomp/cmm.cmi +asmcomp/emitaux.cmi : asmcomp/debuginfo.cmi asmcomp/interf.cmi : asmcomp/mach.cmi asmcomp/linearize.cmi : asmcomp/reg.cmi asmcomp/mach.cmi bytecomp/lambda.cmi \ asmcomp/debuginfo.cmi @@ -628,8 +628,8 @@ asmcomp/printlinear.cmi : asmcomp/linearize.cmi asmcomp/printmach.cmi : asmcomp/reg.cmi asmcomp/mach.cmi asmcomp/proc.cmi : asmcomp/reg.cmi asmcomp/mach.cmi asmcomp/reg.cmi : typing/ident.cmi asmcomp/cmm.cmi -asmcomp/reloadgen.cmi : asmcomp/reg.cmi asmcomp/mach.cmi asmcomp/reload.cmi : asmcomp/mach.cmi +asmcomp/reloadgen.cmi : asmcomp/reg.cmi asmcomp/mach.cmi asmcomp/schedgen.cmi : asmcomp/mach.cmi asmcomp/linearize.cmi asmcomp/scheduling.cmi : asmcomp/linearize.cmi asmcomp/selectgen.cmi : utils/tbl.cmi asmcomp/reg.cmi asmcomp/mach.cmi \ @@ -638,6 +638,12 @@ asmcomp/selection.cmi : asmcomp/mach.cmi asmcomp/cmm.cmi asmcomp/spill.cmi : asmcomp/mach.cmi asmcomp/split.cmi : asmcomp/mach.cmi asmcomp/strmatch.cmi : asmcomp/cmm.cmi +asmcomp/CSE.cmo : asmcomp/mach.cmi asmcomp/CSEgen.cmi asmcomp/arch.cmo +asmcomp/CSE.cmx : asmcomp/mach.cmx asmcomp/CSEgen.cmx asmcomp/arch.cmx +asmcomp/CSEgen.cmo : asmcomp/reg.cmi asmcomp/proc.cmi asmcomp/mach.cmi \ + asmcomp/CSEgen.cmi +asmcomp/CSEgen.cmx : asmcomp/reg.cmx asmcomp/proc.cmx asmcomp/mach.cmx \ + asmcomp/CSEgen.cmi asmcomp/arch.cmo : asmcomp/arch.cmx : asmcomp/asmgen.cmo : bytecomp/translmod.cmi asmcomp/split.cmi \ @@ -688,14 +694,14 @@ asmcomp/asmpackager.cmx : typing/typemod.cmx bytecomp/translmod.cmx \ utils/config.cmx asmcomp/compilenv.cmx asmcomp/cmx_format.cmi \ utils/clflags.cmx utils/ccomp.cmx asmcomp/asmlink.cmx asmcomp/asmgen.cmx \ asmcomp/asmpackager.cmi -asmcomp/branch_relaxation_intf.cmo : asmcomp/linearize.cmi asmcomp/arch.cmo -asmcomp/branch_relaxation_intf.cmx : asmcomp/linearize.cmx asmcomp/arch.cmx asmcomp/branch_relaxation.cmo : utils/misc.cmi asmcomp/mach.cmi \ asmcomp/linearize.cmi asmcomp/cmm.cmi asmcomp/branch_relaxation_intf.cmo \ asmcomp/branch_relaxation.cmi asmcomp/branch_relaxation.cmx : utils/misc.cmx asmcomp/mach.cmx \ asmcomp/linearize.cmx asmcomp/cmm.cmx asmcomp/branch_relaxation_intf.cmx \ asmcomp/branch_relaxation.cmi +asmcomp/branch_relaxation_intf.cmo : asmcomp/linearize.cmi asmcomp/arch.cmo +asmcomp/branch_relaxation_intf.cmx : asmcomp/linearize.cmx asmcomp/arch.cmx asmcomp/clambda.cmo : bytecomp/lambda.cmi typing/ident.cmi \ asmcomp/debuginfo.cmi parsing/asttypes.cmi asmcomp/clambda.cmi asmcomp/clambda.cmx : bytecomp/lambda.cmx typing/ident.cmx \ @@ -710,6 +716,10 @@ asmcomp/closure.cmx : utils/tbl.cmx bytecomp/switch.cmx typing/primitive.cmx \ asmcomp/debuginfo.cmx asmcomp/compilenv.cmx utils/clflags.cmx \ asmcomp/clambda.cmx parsing/asttypes.cmi asmcomp/arch.cmx \ asmcomp/closure.cmi +asmcomp/cmm.cmo : bytecomp/lambda.cmi typing/ident.cmi asmcomp/debuginfo.cmi \ + asmcomp/arch.cmo asmcomp/cmm.cmi +asmcomp/cmm.cmx : bytecomp/lambda.cmx typing/ident.cmx asmcomp/debuginfo.cmx \ + asmcomp/arch.cmx asmcomp/cmm.cmi asmcomp/cmmgen.cmo : typing/types.cmi bytecomp/switch.cmi \ asmcomp/strmatch.cmi asmcomp/proc.cmi typing/primitive.cmi utils/misc.cmi \ bytecomp/lambda.cmi typing/ident.cmi asmcomp/debuginfo.cmi \ @@ -722,10 +732,6 @@ asmcomp/cmmgen.cmx : typing/types.cmx bytecomp/switch.cmx \ utils/config.cmx asmcomp/compilenv.cmx asmcomp/cmx_format.cmi \ asmcomp/cmm.cmx utils/clflags.cmx asmcomp/clambda.cmx \ parsing/asttypes.cmi asmcomp/arch.cmx asmcomp/cmmgen.cmi -asmcomp/cmm.cmo : bytecomp/lambda.cmi typing/ident.cmi asmcomp/debuginfo.cmi \ - asmcomp/arch.cmo asmcomp/cmm.cmi -asmcomp/cmm.cmx : bytecomp/lambda.cmx typing/ident.cmx asmcomp/debuginfo.cmx \ - asmcomp/arch.cmx asmcomp/cmm.cmi asmcomp/codegen.cmo : asmcomp/split.cmi asmcomp/spill.cmi asmcomp/reload.cmi \ asmcomp/reg.cmi asmcomp/printmach.cmi asmcomp/printlinear.cmi \ asmcomp/printcmm.cmi asmcomp/liveness.cmi asmcomp/linearize.cmi \ @@ -748,12 +754,6 @@ asmcomp/compilenv.cmo : utils/misc.cmi parsing/location.cmi typing/ident.cmi \ asmcomp/compilenv.cmx : utils/misc.cmx parsing/location.cmx typing/ident.cmx \ typing/env.cmx utils/config.cmx asmcomp/cmx_format.cmi \ asmcomp/clambda.cmx asmcomp/compilenv.cmi -asmcomp/CSEgen.cmo : asmcomp/reg.cmi asmcomp/proc.cmi asmcomp/mach.cmi \ - asmcomp/CSEgen.cmi -asmcomp/CSEgen.cmx : asmcomp/reg.cmx asmcomp/proc.cmx asmcomp/mach.cmx \ - asmcomp/CSEgen.cmi -asmcomp/CSE.cmo : asmcomp/mach.cmi asmcomp/CSEgen.cmi asmcomp/arch.cmo -asmcomp/CSE.cmx : asmcomp/mach.cmx asmcomp/CSEgen.cmx asmcomp/arch.cmx asmcomp/deadcode.cmo : asmcomp/reg.cmi asmcomp/proc.cmi asmcomp/mach.cmi \ asmcomp/deadcode.cmi asmcomp/deadcode.cmx : asmcomp/reg.cmx asmcomp/proc.cmx asmcomp/mach.cmx \ @@ -762,10 +762,6 @@ asmcomp/debuginfo.cmo : parsing/location.cmi bytecomp/lambda.cmi \ asmcomp/debuginfo.cmi asmcomp/debuginfo.cmx : parsing/location.cmx bytecomp/lambda.cmx \ asmcomp/debuginfo.cmi -asmcomp/emitaux.cmo : asmcomp/linearize.cmi asmcomp/debuginfo.cmi \ - utils/config.cmi utils/clflags.cmi asmcomp/arch.cmo asmcomp/emitaux.cmi -asmcomp/emitaux.cmx : asmcomp/linearize.cmx asmcomp/debuginfo.cmx \ - utils/config.cmx utils/clflags.cmx asmcomp/arch.cmx asmcomp/emitaux.cmi asmcomp/emit.cmo : asmcomp/reg.cmi asmcomp/proc.cmi utils/misc.cmi \ asmcomp/mach.cmi asmcomp/linearize.cmi bytecomp/lambda.cmi \ asmcomp/emitaux.cmi asmcomp/debuginfo.cmi utils/config.cmi \ @@ -776,6 +772,10 @@ asmcomp/emit.cmx : asmcomp/reg.cmx asmcomp/proc.cmx utils/misc.cmx \ asmcomp/emitaux.cmx asmcomp/debuginfo.cmx utils/config.cmx \ asmcomp/compilenv.cmx asmcomp/cmm.cmx utils/clflags.cmx \ asmcomp/branch_relaxation.cmx asmcomp/arch.cmx asmcomp/emit.cmi +asmcomp/emitaux.cmo : asmcomp/linearize.cmi asmcomp/debuginfo.cmi \ + utils/config.cmi utils/clflags.cmi asmcomp/arch.cmo asmcomp/emitaux.cmi +asmcomp/emitaux.cmx : asmcomp/linearize.cmx asmcomp/debuginfo.cmx \ + utils/config.cmx utils/clflags.cmx asmcomp/arch.cmx asmcomp/emitaux.cmi asmcomp/interf.cmo : asmcomp/reg.cmi asmcomp/proc.cmi asmcomp/mach.cmi \ asmcomp/interf.cmi asmcomp/interf.cmx : asmcomp/reg.cmx asmcomp/proc.cmx asmcomp/mach.cmx \ @@ -828,14 +828,14 @@ asmcomp/proc.cmx : asmcomp/reg.cmx utils/misc.cmx asmcomp/mach.cmx \ asmcomp/arch.cmx asmcomp/proc.cmi asmcomp/reg.cmo : typing/ident.cmi asmcomp/cmm.cmi asmcomp/reg.cmi asmcomp/reg.cmx : typing/ident.cmx asmcomp/cmm.cmx asmcomp/reg.cmi -asmcomp/reloadgen.cmo : asmcomp/reg.cmi utils/misc.cmi asmcomp/mach.cmi \ - asmcomp/reloadgen.cmi -asmcomp/reloadgen.cmx : asmcomp/reg.cmx utils/misc.cmx asmcomp/mach.cmx \ - asmcomp/reloadgen.cmi asmcomp/reload.cmo : asmcomp/reloadgen.cmi asmcomp/reg.cmi asmcomp/mach.cmi \ asmcomp/cmm.cmi utils/clflags.cmi asmcomp/arch.cmo asmcomp/reload.cmi asmcomp/reload.cmx : asmcomp/reloadgen.cmx asmcomp/reg.cmx asmcomp/mach.cmx \ asmcomp/cmm.cmx utils/clflags.cmx asmcomp/arch.cmx asmcomp/reload.cmi +asmcomp/reloadgen.cmo : asmcomp/reg.cmi utils/misc.cmi asmcomp/mach.cmi \ + asmcomp/reloadgen.cmi +asmcomp/reloadgen.cmx : asmcomp/reg.cmx utils/misc.cmx asmcomp/mach.cmx \ + asmcomp/reloadgen.cmi asmcomp/schedgen.cmo : asmcomp/reg.cmi asmcomp/proc.cmi asmcomp/mach.cmi \ asmcomp/linearize.cmi asmcomp/cmm.cmi asmcomp/arch.cmo \ asmcomp/schedgen.cmi @@ -874,8 +874,8 @@ driver/compenv.cmi : driver/compile.cmi : driver/compmisc.cmi : typing/env.cmi driver/errors.cmi : -driver/main_args.cmi : driver/main.cmi : +driver/main_args.cmi : driver/optcompile.cmi : driver/opterrors.cmi : driver/optmain.cmi : @@ -910,8 +910,6 @@ driver/compmisc.cmx : typing/typemod.cmx utils/misc.cmx \ parsing/asttypes.cmi driver/compmisc.cmi driver/errors.cmo : parsing/location.cmi driver/errors.cmi driver/errors.cmx : parsing/location.cmx driver/errors.cmi -driver/main_args.cmo : utils/warnings.cmi driver/main_args.cmi -driver/main_args.cmx : utils/warnings.cmx driver/main_args.cmi driver/main.cmo : utils/warnings.cmi utils/misc.cmi driver/main_args.cmi \ parsing/location.cmi utils/config.cmi driver/compmisc.cmi \ driver/compile.cmi driver/compenv.cmi utils/clflags.cmi \ @@ -922,6 +920,8 @@ driver/main.cmx : utils/warnings.cmx utils/misc.cmx driver/main_args.cmx \ driver/compile.cmx driver/compenv.cmx utils/clflags.cmx \ bytecomp/bytepackager.cmx bytecomp/bytelink.cmx \ bytecomp/bytelibrarian.cmx driver/main.cmi +driver/main_args.cmo : utils/warnings.cmi driver/main_args.cmi +driver/main_args.cmx : utils/warnings.cmx driver/main_args.cmi driver/optcompile.cmo : utils/warnings.cmi typing/typemod.cmi \ typing/typedtree.cmi typing/typecore.cmi bytecomp/translmod.cmi \ typing/stypes.cmi bytecomp/simplif.cmi typing/printtyped.cmi \ diff --git a/VERSION b/VERSION index c8b576f1da..dbd6b8fc29 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.02.3+dev5-2015-07-21 +4.02.3 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli diff --git a/asmrun/.depend b/asmrun/.depend index e761606f89..5c1a967c30 100644 --- a/asmrun/.depend +++ b/asmrun/.depend @@ -1,1044 +1,1089 @@ alloc.o: alloc.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/custom.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/stacks.h ../byterun/caml/memory.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h array.o: array.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h backtrace.o: backtrace.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/backtrace.h ../byterun/caml/memory.h \ - ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h stack.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/backtrace.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h stack.h callback.o: callback.c ../byterun/caml/callback.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ - ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h compact.o: compact.c ../byterun/caml/address_class.h \ - ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ - ../byterun/caml/finalise.h ../byterun/caml/roots.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/freelist.h \ - ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ - ../byterun/caml/major_gc.h ../byterun/caml/memory.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ - ../byterun/caml/weak.h + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/finalise.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/memory.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/weak.h compare.o: compare.c ../byterun/caml/custom.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ - ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h custom.o: custom.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ - ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h debugger.o: debugger.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/config.h ../byterun/caml/debugger.h \ - ../byterun/caml/misc.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/config.h ../byterun/caml/debugger.h \ + ../byterun/caml/misc.h dynlink.o: dynlink.c ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/dynlink.h \ - ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/misc.h \ - ../byterun/caml/osdeps.h ../byterun/caml/prims.h \ - ../byterun/caml/signals.h + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/dynlink.h \ + ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/osdeps.h ../byterun/caml/prims.h \ + ../byterun/caml/signals.h extern.o: extern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/gc.h \ - ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/io.h \ - ../byterun/caml/md5.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/reverse.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/gc.h \ + ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/io.h \ + ../byterun/caml/md5.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/reverse.h fail.o: fail.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/gc.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/printexc.h ../byterun/caml/signals.h stack.h \ - ../byterun/caml/roots.h ../byterun/caml/memory.h \ - ../byterun/caml/callback.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/gc.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/printexc.h \ + ../byterun/caml/signals.h stack.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/callback.h finalise.o: finalise.c ../byterun/caml/callback.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/signals.h + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/fail.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/signals.h floats.o: floats.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ - ../byterun/caml/reverse.h ../byterun/caml/stacks.h \ - ../byterun/caml/memory.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/reverse.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h freelist.o: freelist.c ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/freelist.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/mlvalues.h ../byterun/caml/gc.h \ - ../byterun/caml/gc_ctrl.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/major_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/freelist.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/major_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h gc_ctrl.o: gc_ctrl.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/compact.h ../byterun/caml/custom.h \ - ../byterun/caml/finalise.h ../byterun/caml/roots.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/freelist.h \ - ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ - ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/compact.h ../byterun/caml/custom.h \ + ../byterun/caml/finalise.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h stack.h globroots.o: globroots.c ../byterun/caml/memory.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/gc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/roots.h ../byterun/caml/memory.h \ - ../byterun/caml/globroots.h ../byterun/caml/roots.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h \ + ../byterun/caml/globroots.h ../byterun/caml/roots.h hash.o: hash.c ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/misc.h ../byterun/caml/custom.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/hash.h + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/custom.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/hash.h intern.o: intern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/callback.h ../byterun/caml/custom.h \ - ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/intext.h \ - ../byterun/caml/io.h ../byterun/caml/io.h ../byterun/caml/md5.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/misc.h ../byterun/caml/reverse.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/callback.h ../byterun/caml/custom.h \ + ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/intext.h \ + ../byterun/caml/io.h ../byterun/caml/io.h ../byterun/caml/md5.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/reverse.h ints.o: ints.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/intext.h \ - ../byterun/caml/io.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h \ + ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h io.o: io.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ - ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/custom.h \ - ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/memory.h \ - ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/signals.h \ - ../byterun/caml/sys.h + ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/custom.h \ + ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/signals.h \ + ../byterun/caml/sys.h lexing.o: lexing.c ../byterun/caml/fail.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/stacks.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h main.o: main.c ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/misc.h ../byterun/caml/sys.h + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h ../byterun/caml/sys.h major_gc.o: major_gc.c ../byterun/caml/compact.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/misc.h ../byterun/caml/custom.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ - ../byterun/caml/fail.h ../byterun/caml/finalise.h \ - ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/freelist.h ../byterun/caml/gc.h \ - ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/roots.h ../byterun/caml/weak.h + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/custom.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/fail.h ../byterun/caml/finalise.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/weak.h md5.o: md5.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/fail.h ../byterun/caml/md5.h ../byterun/caml/io.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/io.h ../byterun/caml/reverse.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/md5.h ../byterun/caml/io.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/io.h \ + ../byterun/caml/reverse.h memory.o: memory.c ../byterun/caml/address_class.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/fail.h ../byterun/caml/freelist.h ../byterun/caml/gc.h \ - ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/signals.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/signals.h meta.o: meta.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/config.h ../byterun/caml/fail.h \ - ../byterun/caml/fix_code.h ../byterun/caml/interp.h \ - ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/prims.h ../byterun/caml/stacks.h \ - ../byterun/caml/memory.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/config.h ../byterun/caml/fail.h \ + ../byterun/caml/fix_code.h ../byterun/caml/interp.h \ + ../byterun/caml/intext.h ../byterun/caml/io.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/prims.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h minor_gc.o: minor_gc.c ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/fail.h ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/finalise.h \ - ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ - ../byterun/caml/major_gc.h ../byterun/caml/memory.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ - ../byterun/caml/signals.h ../byterun/caml/weak.h + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/fail.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/finalise.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ + ../byterun/caml/major_gc.h ../byterun/caml/memory.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/signals.h ../byterun/caml/weak.h misc.o: misc.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h + ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h natdynlink.o: natdynlink.c ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h stack.h ../byterun/caml/callback.h \ - ../byterun/caml/alloc.h ../byterun/caml/intext.h ../byterun/caml/io.h \ - ../byterun/caml/osdeps.h ../byterun/caml/fail.h \ - ../byterun/caml/signals.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h stack.h ../byterun/caml/callback.h \ + ../byterun/caml/alloc.h ../byterun/caml/intext.h ../byterun/caml/io.h \ + ../byterun/caml/osdeps.h ../byterun/caml/fail.h \ + ../byterun/caml/signals.h obj.o: obj.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/interp.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/prims.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/interp.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/prims.h parsing.o: parsing.c ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ - ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/alloc.h + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/alloc.h printexc.o: printexc.c ../byterun/caml/backtrace.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/misc.h ../byterun/caml/callback.h \ - ../byterun/caml/debugger.h ../byterun/caml/fail.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/printexc.h + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/callback.h \ + ../byterun/caml/debugger.h ../byterun/caml/fail.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/printexc.h roots.o: roots.c ../byterun/caml/finalise.h ../byterun/caml/roots.h \ - ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/globroots.h ../byterun/caml/memory.h \ - ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h \ - ../byterun/caml/roots.h -signals_asm.o: signals_asm.c ../byterun/caml/fail.h \ - ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/osdeps.h ../byterun/caml/signals.h \ - ../byterun/caml/signals_machdep.h signals_osdep.h stack.h + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/globroots.h \ + ../byterun/caml/memory.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h stack.h ../byterun/caml/roots.h signals.o: signals.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/callback.h ../byterun/caml/config.h \ - ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/roots.h ../byterun/caml/memory.h \ - ../byterun/caml/signals.h ../byterun/caml/signals_machdep.h \ - ../byterun/caml/sys.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/callback.h ../byterun/caml/config.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h \ + ../byterun/caml/signals.h ../byterun/caml/signals_machdep.h \ + ../byterun/caml/sys.h +signals_asm.o: signals_asm.c ../byterun/caml/fail.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/osdeps.h \ + ../byterun/caml/signals.h ../byterun/caml/signals_machdep.h \ + signals_osdep.h stack.h startup.o: startup.c ../byterun/caml/callback.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/misc.h ../byterun/caml/backtrace.h \ - ../byterun/caml/custom.h ../byterun/caml/debugger.h \ - ../byterun/caml/fail.h ../byterun/caml/freelist.h ../byterun/caml/gc.h \ - ../byterun/caml/gc_ctrl.h ../byterun/caml/intext.h ../byterun/caml/io.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/osdeps.h \ - ../byterun/caml/printexc.h stack.h ../byterun/caml/sys.h + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/backtrace.h \ + ../byterun/caml/custom.h ../byterun/caml/debugger.h \ + ../byterun/caml/fail.h ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/intext.h ../byterun/caml/io.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/osdeps.h ../byterun/caml/printexc.h stack.h \ + ../byterun/caml/sys.h str.o: str.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/fail.h ../byterun/caml/mlvalues.h ../byterun/caml/misc.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h sys.o: sys.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ - ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/debugger.h \ - ../byterun/caml/fail.h ../byterun/caml/instruct.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/osdeps.h \ - ../byterun/caml/signals.h ../byterun/caml/stacks.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/sys.h + ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/debugger.h \ + ../byterun/caml/fail.h ../byterun/caml/instruct.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/osdeps.h \ + ../byterun/caml/signals.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/sys.h terminfo.o: terminfo.c ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/fail.h ../byterun/caml/io.h \ - ../byterun/caml/mlvalues.h + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/fail.h ../byterun/caml/io.h \ + ../byterun/caml/mlvalues.h unix.o: unix.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/memory.h \ - ../byterun/caml/config.h ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/misc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/misc.h \ - ../byterun/caml/osdeps.h + ../byterun/caml/../../config/s.h ../byterun/caml/memory.h \ + ../byterun/caml/config.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/osdeps.h weak.o: weak.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/fail.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h alloc.d.o: alloc.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/custom.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/stacks.h ../byterun/caml/memory.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h array.d.o: array.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h backtrace.d.o: backtrace.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/backtrace.h ../byterun/caml/memory.h \ - ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h stack.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/backtrace.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h stack.h callback.d.o: callback.c ../byterun/caml/callback.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ - ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h compact.d.o: compact.c ../byterun/caml/address_class.h \ - ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ - ../byterun/caml/finalise.h ../byterun/caml/roots.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/freelist.h \ - ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ - ../byterun/caml/major_gc.h ../byterun/caml/memory.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ - ../byterun/caml/weak.h + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/finalise.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/memory.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/weak.h compare.d.o: compare.c ../byterun/caml/custom.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ - ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h custom.d.o: custom.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ - ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h debugger.d.o: debugger.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/config.h ../byterun/caml/debugger.h \ - ../byterun/caml/misc.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/config.h ../byterun/caml/debugger.h \ + ../byterun/caml/misc.h dynlink.d.o: dynlink.c ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/dynlink.h \ - ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/misc.h \ - ../byterun/caml/osdeps.h ../byterun/caml/prims.h \ - ../byterun/caml/signals.h + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/dynlink.h \ + ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/osdeps.h ../byterun/caml/prims.h \ + ../byterun/caml/signals.h extern.d.o: extern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/gc.h \ - ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/io.h \ - ../byterun/caml/md5.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/reverse.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/gc.h \ + ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/io.h \ + ../byterun/caml/md5.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/reverse.h fail.d.o: fail.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/gc.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/printexc.h ../byterun/caml/signals.h stack.h \ - ../byterun/caml/roots.h ../byterun/caml/memory.h \ - ../byterun/caml/callback.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/gc.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/printexc.h \ + ../byterun/caml/signals.h stack.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/callback.h finalise.d.o: finalise.c ../byterun/caml/callback.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/signals.h + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/fail.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/signals.h floats.d.o: floats.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ - ../byterun/caml/reverse.h ../byterun/caml/stacks.h \ - ../byterun/caml/memory.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/reverse.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h freelist.d.o: freelist.c ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/freelist.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/mlvalues.h ../byterun/caml/gc.h \ - ../byterun/caml/gc_ctrl.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/major_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/freelist.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/major_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h gc_ctrl.d.o: gc_ctrl.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/compact.h ../byterun/caml/custom.h \ - ../byterun/caml/finalise.h ../byterun/caml/roots.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/freelist.h \ - ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ - ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/compact.h ../byterun/caml/custom.h \ + ../byterun/caml/finalise.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h stack.h globroots.d.o: globroots.c ../byterun/caml/memory.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/gc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/roots.h ../byterun/caml/memory.h \ - ../byterun/caml/globroots.h ../byterun/caml/roots.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h \ + ../byterun/caml/globroots.h ../byterun/caml/roots.h hash.d.o: hash.c ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/misc.h ../byterun/caml/custom.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/hash.h + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/custom.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/hash.h intern.d.o: intern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/callback.h ../byterun/caml/custom.h \ - ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/intext.h \ - ../byterun/caml/io.h ../byterun/caml/io.h ../byterun/caml/md5.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/misc.h ../byterun/caml/reverse.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/callback.h ../byterun/caml/custom.h \ + ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/intext.h \ + ../byterun/caml/io.h ../byterun/caml/io.h ../byterun/caml/md5.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/reverse.h ints.d.o: ints.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/intext.h \ - ../byterun/caml/io.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h \ + ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h io.d.o: io.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ - ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/custom.h \ - ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/memory.h \ - ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/signals.h \ - ../byterun/caml/sys.h + ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/custom.h \ + ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/signals.h \ + ../byterun/caml/sys.h lexing.d.o: lexing.c ../byterun/caml/fail.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/stacks.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h main.d.o: main.c ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/misc.h ../byterun/caml/sys.h + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h ../byterun/caml/sys.h major_gc.d.o: major_gc.c ../byterun/caml/compact.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/misc.h ../byterun/caml/custom.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ - ../byterun/caml/fail.h ../byterun/caml/finalise.h \ - ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/freelist.h ../byterun/caml/gc.h \ - ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/roots.h ../byterun/caml/weak.h + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/custom.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/fail.h ../byterun/caml/finalise.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/weak.h md5.d.o: md5.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/fail.h ../byterun/caml/md5.h ../byterun/caml/io.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/io.h ../byterun/caml/reverse.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/md5.h ../byterun/caml/io.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/io.h \ + ../byterun/caml/reverse.h memory.d.o: memory.c ../byterun/caml/address_class.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/fail.h ../byterun/caml/freelist.h ../byterun/caml/gc.h \ - ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/signals.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/signals.h meta.d.o: meta.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/config.h ../byterun/caml/fail.h \ - ../byterun/caml/fix_code.h ../byterun/caml/interp.h \ - ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/prims.h ../byterun/caml/stacks.h \ - ../byterun/caml/memory.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/config.h ../byterun/caml/fail.h \ + ../byterun/caml/fix_code.h ../byterun/caml/interp.h \ + ../byterun/caml/intext.h ../byterun/caml/io.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/prims.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h minor_gc.d.o: minor_gc.c ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/fail.h ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/finalise.h \ - ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ - ../byterun/caml/major_gc.h ../byterun/caml/memory.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ - ../byterun/caml/signals.h ../byterun/caml/weak.h + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/fail.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/finalise.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ + ../byterun/caml/major_gc.h ../byterun/caml/memory.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/signals.h ../byterun/caml/weak.h misc.d.o: misc.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h + ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h natdynlink.d.o: natdynlink.c ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h stack.h ../byterun/caml/callback.h \ - ../byterun/caml/alloc.h ../byterun/caml/intext.h ../byterun/caml/io.h \ - ../byterun/caml/osdeps.h ../byterun/caml/fail.h \ - ../byterun/caml/signals.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h stack.h ../byterun/caml/callback.h \ + ../byterun/caml/alloc.h ../byterun/caml/intext.h ../byterun/caml/io.h \ + ../byterun/caml/osdeps.h ../byterun/caml/fail.h \ + ../byterun/caml/signals.h obj.d.o: obj.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/interp.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/prims.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/interp.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/prims.h parsing.d.o: parsing.c ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ - ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/alloc.h + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/alloc.h printexc.d.o: printexc.c ../byterun/caml/backtrace.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/misc.h ../byterun/caml/callback.h \ - ../byterun/caml/debugger.h ../byterun/caml/fail.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/printexc.h + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/callback.h \ + ../byterun/caml/debugger.h ../byterun/caml/fail.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/printexc.h roots.d.o: roots.c ../byterun/caml/finalise.h ../byterun/caml/roots.h \ - ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/globroots.h ../byterun/caml/memory.h \ - ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h \ - ../byterun/caml/roots.h -signals_asm.d.o: signals_asm.c ../byterun/caml/fail.h \ - ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/osdeps.h ../byterun/caml/signals.h \ - ../byterun/caml/signals_machdep.h signals_osdep.h stack.h + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/globroots.h \ + ../byterun/caml/memory.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h stack.h ../byterun/caml/roots.h signals.d.o: signals.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/callback.h ../byterun/caml/config.h \ - ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/roots.h ../byterun/caml/memory.h \ - ../byterun/caml/signals.h ../byterun/caml/signals_machdep.h \ - ../byterun/caml/sys.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/callback.h ../byterun/caml/config.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h \ + ../byterun/caml/signals.h ../byterun/caml/signals_machdep.h \ + ../byterun/caml/sys.h +signals_asm.d.o: signals_asm.c ../byterun/caml/fail.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/osdeps.h \ + ../byterun/caml/signals.h ../byterun/caml/signals_machdep.h \ + signals_osdep.h stack.h startup.d.o: startup.c ../byterun/caml/callback.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/misc.h ../byterun/caml/backtrace.h \ - ../byterun/caml/custom.h ../byterun/caml/debugger.h \ - ../byterun/caml/fail.h ../byterun/caml/freelist.h ../byterun/caml/gc.h \ - ../byterun/caml/gc_ctrl.h ../byterun/caml/intext.h ../byterun/caml/io.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/osdeps.h \ - ../byterun/caml/printexc.h stack.h ../byterun/caml/sys.h + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/backtrace.h \ + ../byterun/caml/custom.h ../byterun/caml/debugger.h \ + ../byterun/caml/fail.h ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/intext.h ../byterun/caml/io.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/osdeps.h ../byterun/caml/printexc.h stack.h \ + ../byterun/caml/sys.h str.d.o: str.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/fail.h ../byterun/caml/mlvalues.h ../byterun/caml/misc.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h sys.d.o: sys.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ - ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/debugger.h \ - ../byterun/caml/fail.h ../byterun/caml/instruct.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/osdeps.h \ - ../byterun/caml/signals.h ../byterun/caml/stacks.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/sys.h + ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/debugger.h \ + ../byterun/caml/fail.h ../byterun/caml/instruct.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/osdeps.h \ + ../byterun/caml/signals.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/sys.h terminfo.d.o: terminfo.c ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/fail.h ../byterun/caml/io.h \ - ../byterun/caml/mlvalues.h + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/fail.h ../byterun/caml/io.h \ + ../byterun/caml/mlvalues.h unix.d.o: unix.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/memory.h \ - ../byterun/caml/config.h ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/misc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/misc.h \ - ../byterun/caml/osdeps.h + ../byterun/caml/../../config/s.h ../byterun/caml/memory.h \ + ../byterun/caml/config.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/osdeps.h weak.d.o: weak.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/fail.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h alloc.p.o: alloc.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/custom.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/stacks.h ../byterun/caml/memory.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h array.p.o: array.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h backtrace.p.o: backtrace.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/backtrace.h ../byterun/caml/memory.h \ - ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h stack.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/backtrace.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h stack.h callback.p.o: callback.c ../byterun/caml/callback.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ - ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h compact.p.o: compact.c ../byterun/caml/address_class.h \ - ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ - ../byterun/caml/finalise.h ../byterun/caml/roots.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/freelist.h \ - ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ - ../byterun/caml/major_gc.h ../byterun/caml/memory.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ - ../byterun/caml/weak.h + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/finalise.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/memory.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/weak.h compare.p.o: compare.c ../byterun/caml/custom.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ - ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h custom.p.o: custom.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ - ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h debugger.p.o: debugger.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/config.h ../byterun/caml/debugger.h \ - ../byterun/caml/misc.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/config.h ../byterun/caml/debugger.h \ + ../byterun/caml/misc.h dynlink.p.o: dynlink.c ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/dynlink.h \ - ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/misc.h \ - ../byterun/caml/osdeps.h ../byterun/caml/prims.h \ - ../byterun/caml/signals.h + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/dynlink.h \ + ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/osdeps.h ../byterun/caml/prims.h \ + ../byterun/caml/signals.h extern.p.o: extern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/gc.h \ - ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/io.h \ - ../byterun/caml/md5.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/reverse.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/gc.h \ + ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/io.h \ + ../byterun/caml/md5.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/reverse.h fail.p.o: fail.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/gc.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/printexc.h ../byterun/caml/signals.h stack.h \ - ../byterun/caml/roots.h ../byterun/caml/memory.h \ - ../byterun/caml/callback.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/gc.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/printexc.h \ + ../byterun/caml/signals.h stack.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/callback.h finalise.p.o: finalise.c ../byterun/caml/callback.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/signals.h + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/fail.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/signals.h floats.p.o: floats.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ - ../byterun/caml/reverse.h ../byterun/caml/stacks.h \ - ../byterun/caml/memory.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/reverse.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h freelist.p.o: freelist.c ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/freelist.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/mlvalues.h ../byterun/caml/gc.h \ - ../byterun/caml/gc_ctrl.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/major_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/freelist.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/major_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h gc_ctrl.p.o: gc_ctrl.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/compact.h ../byterun/caml/custom.h \ - ../byterun/caml/finalise.h ../byterun/caml/roots.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/freelist.h \ - ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ - ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/compact.h ../byterun/caml/custom.h \ + ../byterun/caml/finalise.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h stack.h globroots.p.o: globroots.c ../byterun/caml/memory.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/gc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/roots.h ../byterun/caml/memory.h \ - ../byterun/caml/globroots.h ../byterun/caml/roots.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h \ + ../byterun/caml/globroots.h ../byterun/caml/roots.h hash.p.o: hash.c ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/misc.h ../byterun/caml/custom.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/hash.h + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/custom.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/hash.h intern.p.o: intern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/callback.h ../byterun/caml/custom.h \ - ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/intext.h \ - ../byterun/caml/io.h ../byterun/caml/io.h ../byterun/caml/md5.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/misc.h ../byterun/caml/reverse.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/callback.h ../byterun/caml/custom.h \ + ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/intext.h \ + ../byterun/caml/io.h ../byterun/caml/io.h ../byterun/caml/md5.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/reverse.h ints.p.o: ints.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/intext.h \ - ../byterun/caml/io.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h \ + ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h io.p.o: io.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ - ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/custom.h \ - ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/memory.h \ - ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/signals.h \ - ../byterun/caml/sys.h + ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/custom.h \ + ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/signals.h \ + ../byterun/caml/sys.h lexing.p.o: lexing.c ../byterun/caml/fail.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/stacks.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h main.p.o: main.c ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/misc.h ../byterun/caml/sys.h + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h ../byterun/caml/sys.h major_gc.p.o: major_gc.c ../byterun/caml/compact.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/misc.h ../byterun/caml/custom.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ - ../byterun/caml/fail.h ../byterun/caml/finalise.h \ - ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/freelist.h ../byterun/caml/gc.h \ - ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/roots.h ../byterun/caml/weak.h + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/custom.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/fail.h ../byterun/caml/finalise.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/weak.h md5.p.o: md5.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/fail.h ../byterun/caml/md5.h ../byterun/caml/io.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/io.h ../byterun/caml/reverse.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/md5.h ../byterun/caml/io.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/io.h \ + ../byterun/caml/reverse.h memory.p.o: memory.c ../byterun/caml/address_class.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/fail.h ../byterun/caml/freelist.h ../byterun/caml/gc.h \ - ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/signals.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/signals.h meta.p.o: meta.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/config.h ../byterun/caml/fail.h \ - ../byterun/caml/fix_code.h ../byterun/caml/interp.h \ - ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/prims.h ../byterun/caml/stacks.h \ - ../byterun/caml/memory.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/config.h ../byterun/caml/fail.h \ + ../byterun/caml/fix_code.h ../byterun/caml/interp.h \ + ../byterun/caml/intext.h ../byterun/caml/io.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/prims.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h minor_gc.p.o: minor_gc.c ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/fail.h ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/finalise.h \ - ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ - ../byterun/caml/major_gc.h ../byterun/caml/memory.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ - ../byterun/caml/signals.h ../byterun/caml/weak.h + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/fail.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/finalise.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ + ../byterun/caml/major_gc.h ../byterun/caml/memory.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/signals.h ../byterun/caml/weak.h misc.p.o: misc.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h + ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h natdynlink.p.o: natdynlink.c ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h stack.h ../byterun/caml/callback.h \ - ../byterun/caml/alloc.h ../byterun/caml/intext.h ../byterun/caml/io.h \ - ../byterun/caml/osdeps.h ../byterun/caml/fail.h \ - ../byterun/caml/signals.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h stack.h ../byterun/caml/callback.h \ + ../byterun/caml/alloc.h ../byterun/caml/intext.h ../byterun/caml/io.h \ + ../byterun/caml/osdeps.h ../byterun/caml/fail.h \ + ../byterun/caml/signals.h obj.p.o: obj.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/interp.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/prims.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/interp.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/prims.h parsing.p.o: parsing.c ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ - ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/alloc.h + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/alloc.h printexc.p.o: printexc.c ../byterun/caml/backtrace.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/misc.h ../byterun/caml/callback.h \ - ../byterun/caml/debugger.h ../byterun/caml/fail.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/printexc.h + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/callback.h \ + ../byterun/caml/debugger.h ../byterun/caml/fail.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/printexc.h roots.p.o: roots.c ../byterun/caml/finalise.h ../byterun/caml/roots.h \ - ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/globroots.h ../byterun/caml/memory.h \ - ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h \ - ../byterun/caml/roots.h -signals_asm.p.o: signals_asm.c ../byterun/caml/fail.h \ - ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/osdeps.h ../byterun/caml/signals.h \ - ../byterun/caml/signals_machdep.h signals_osdep.h stack.h + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/globroots.h \ + ../byterun/caml/memory.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h stack.h ../byterun/caml/roots.h signals.p.o: signals.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/callback.h ../byterun/caml/config.h \ - ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ - ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ - ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/roots.h ../byterun/caml/memory.h \ - ../byterun/caml/signals.h ../byterun/caml/signals_machdep.h \ - ../byterun/caml/sys.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/callback.h ../byterun/caml/config.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h \ + ../byterun/caml/signals.h ../byterun/caml/signals_machdep.h \ + ../byterun/caml/sys.h +signals_asm.p.o: signals_asm.c ../byterun/caml/fail.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/osdeps.h \ + ../byterun/caml/signals.h ../byterun/caml/signals_machdep.h \ + signals_osdep.h stack.h startup.p.o: startup.c ../byterun/caml/callback.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/misc.h ../byterun/caml/backtrace.h \ - ../byterun/caml/custom.h ../byterun/caml/debugger.h \ - ../byterun/caml/fail.h ../byterun/caml/freelist.h ../byterun/caml/gc.h \ - ../byterun/caml/gc_ctrl.h ../byterun/caml/intext.h ../byterun/caml/io.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/misc.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/osdeps.h \ - ../byterun/caml/printexc.h stack.h ../byterun/caml/sys.h + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/backtrace.h \ + ../byterun/caml/custom.h ../byterun/caml/debugger.h \ + ../byterun/caml/fail.h ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/intext.h ../byterun/caml/io.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/osdeps.h ../byterun/caml/printexc.h stack.h \ + ../byterun/caml/sys.h str.p.o: str.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/fail.h ../byterun/caml/mlvalues.h ../byterun/caml/misc.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h sys.p.o: sys.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ - ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/debugger.h \ - ../byterun/caml/fail.h ../byterun/caml/instruct.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/osdeps.h \ - ../byterun/caml/signals.h ../byterun/caml/stacks.h \ - ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/sys.h + ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/debugger.h \ + ../byterun/caml/fail.h ../byterun/caml/instruct.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/osdeps.h \ + ../byterun/caml/signals.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/sys.h terminfo.p.o: terminfo.c ../byterun/caml/config.h \ - ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ - ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ - ../byterun/caml/mlvalues.h ../byterun/caml/fail.h ../byterun/caml/io.h \ - ../byterun/caml/mlvalues.h + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/fail.h ../byterun/caml/io.h \ + ../byterun/caml/mlvalues.h unix.p.o: unix.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/memory.h \ - ../byterun/caml/config.h ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/misc.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/misc.h \ - ../byterun/caml/osdeps.h + ../byterun/caml/../../config/s.h ../byterun/caml/memory.h \ + ../byterun/caml/config.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/osdeps.h weak.p.o: weak.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ - ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ - ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ - ../byterun/caml/fail.h ../byterun/caml/major_gc.h \ - ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ - ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ - ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h diff --git a/boot/ocamlc b/boot/ocamlc index 134408a67acc473375c3159c9ce6cef97cc47d8c..41eb9b40de1e2a8edfe7e6177b2704c8bea529d8 100755 GIT binary patch delta 165 zcmXxdD-Oay07cOb6w0ss8NLEVswOWjfuspLK%rSdEh|90G(q92kVqu0AVHIo;5v(7 z71SV(xaz*r;F$(z6qI)aA&3G|But`2lnINd5LKc^)QJXR6HTH;w22PUC3-}k7~COm zv3)R%?b;BRw;@)3@{OfyT8pKEtGvW}NM|biXs@NpkI_lXnb`a@%(To6bE72F<K0Ju Ik#n8Qe*|?j&j0`b delta 172 zcmW;8yAHun00!V5_gmc^*N8<Tkv8?ylJE#(@C+;-z(@>#tP(>fqtQqQiCIXD=P5jd z#_%QI<F$IeRtIYbLJ$EWNQ8(m5h0>PjEEBnB1xnOok$ZIB1`0mJW(KuMCl57x#?R? zn+`Q``e?$Lc;A~usO$_(3ueE&SgvgYR?jx9p@E*)zRONsjNF-$rn^zHA;$mj-%9$* RzKZu&)%iyp-R8O0`T?NkH(vk% diff --git a/boot/ocamldep b/boot/ocamldep index 193eadbbed0e1a135f7dd2f2ba68987581282c93..383b3d187bb69087432e03b65ebed037b6265b07 100755 GIT binary patch delta 158 zcmaF-U-9OD#R෗_gtp<#(228C6%&i72tp==H4cPvs@Fp@aa78mP%rRnMh}pW` zDwWNMg<Z`=&%j8}czbgun~D^p)$|q3Y<lu~#`-y#N&5N8iMcr%{?3lRK0cmK>QI`~ z7OV(pO}k<X+jhkk_JzL{OM@eQofsHcoSlQ5gBciDH!?6VusZ{_8(LagMi>|x0swgD BEFAy< delta 116 zcmcclU-9vO#R&$DMy*DStwv0(M$D~7EUiYYTaDQMrts!6FmOdPFw8M!V2Ihi-6oaI zh(+AYM9;uT&saMpwair4$iUE4*T7uY$Z&gUCYy>Bqs8=D&1`zpPc^g2Fj|Az?cyzL S+r?Yh7yf2!oW8T3LjeFRe<Pa! diff --git a/boot/ocamllex b/boot/ocamllex index f6a6e5dff45ba91151035a2414956afb6283f531..8a2e0d8ba6b0d91680064ec7cb14b9ed3bc1c893 100755 GIT binary patch delta 92 zcmca~ng7UT{s{(5dd7_gtp<#(225KGnD4gnCNVIuo?~E8v1VY9D%dX7&TPcOu4bZV wV5DcfJ-M6NFHW&6IMUaNfq{9tbC7c|0|QGs0|NuQb7F3ep{1o|gn^+U0Kz2~l>h($ delta 78 zcmX?dng7yd{s{(+My*DStwu~+jhOGY@fI;Ku%2UJP_buVkSf|P)6Q(fB5r1)XJDjf iteuitW~yssU}&mqV6JOqxIMI+*)NW<ZTgaz%nAUh{}!GA diff --git a/byterun/.depend b/byterun/.depend index ea58393c76..7bb76fe0d1 100644 --- a/byterun/.depend +++ b/byterun/.depend @@ -1,726 +1,729 @@ alloc.o: alloc.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/custom.h caml/major_gc.h caml/freelist.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ - caml/address_class.h caml/mlvalues.h caml/stacks.h caml/memory.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/major_gc.h caml/freelist.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ + caml/address_class.h caml/mlvalues.h caml/stacks.h caml/memory.h array.o: array.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ - caml/mlvalues.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h backtrace.o: backtrace.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/mlvalues.h caml/config.h \ - caml/misc.h caml/alloc.h caml/mlvalues.h caml/io.h caml/instruct.h \ - caml/intext.h caml/io.h caml/exec.h caml/fix_code.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/startup.h caml/exec.h caml/stacks.h \ - caml/memory.h caml/sys.h caml/backtrace.h caml/fail.h + caml/../../config/s.h caml/compatibility.h caml/mlvalues.h \ + caml/config.h caml/misc.h caml/alloc.h caml/mlvalues.h caml/io.h \ + caml/instruct.h caml/intext.h caml/io.h caml/exec.h caml/fix_code.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/startup.h caml/exec.h caml/stacks.h \ + caml/memory.h caml/sys.h caml/backtrace.h caml/fail.h callback.o: callback.c caml/callback.h caml/compatibility.h \ - caml/mlvalues.h caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/misc.h caml/fail.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ - caml/mlvalues.h caml/interp.h caml/instruct.h caml/fix_code.h \ - caml/stacks.h caml/memory.h + caml/mlvalues.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/fail.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h caml/interp.h caml/instruct.h caml/fix_code.h \ + caml/stacks.h caml/memory.h compact.o: compact.c caml/address_class.h caml/misc.h \ - caml/compatibility.h caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/mlvalues.h caml/config.h caml/finalise.h \ - caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/address_class.h caml/freelist.h caml/gc.h \ - caml/gc_ctrl.h caml/major_gc.h caml/memory.h caml/mlvalues.h \ - caml/roots.h caml/weak.h + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/mlvalues.h caml/config.h caml/finalise.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/freelist.h caml/gc.h \ + caml/gc_ctrl.h caml/major_gc.h caml/memory.h caml/mlvalues.h \ + caml/roots.h caml/weak.h compare.o: compare.c caml/custom.h caml/compatibility.h caml/mlvalues.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h caml/misc.h \ - caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/address_class.h caml/misc.h caml/mlvalues.h + caml/config.h caml/../../config/m.h caml/../../config/s.h caml/misc.h \ + caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/misc.h caml/mlvalues.h custom.o: custom.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/custom.h caml/fail.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ - caml/mlvalues.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h debugger.o: debugger.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/config.h caml/debugger.h caml/misc.h caml/fail.h \ - caml/fix_code.h caml/instruct.h caml/intext.h caml/io.h caml/io.h \ - caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/sys.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/config.h caml/debugger.h caml/misc.h caml/fail.h \ + caml/fix_code.h caml/instruct.h caml/intext.h caml/io.h caml/io.h \ + caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/sys.h dynlink.o: dynlink.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ - caml/config.h caml/mlvalues.h caml/dynlink.h caml/fail.h caml/mlvalues.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/misc.h caml/osdeps.h caml/prims.h \ - caml/signals.h + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/dynlink.h caml/fail.h \ + caml/mlvalues.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/misc.h caml/osdeps.h \ + caml/prims.h caml/signals.h extern.o: extern.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \ - caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ - caml/mlvalues.h caml/reverse.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \ + caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h caml/reverse.h fail.o: fail.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/fail.h caml/io.h caml/gc.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ - caml/misc.h caml/mlvalues.h caml/printexc.h caml/signals.h caml/stacks.h \ - caml/memory.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/io.h caml/gc.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/misc.h caml/mlvalues.h caml/printexc.h caml/signals.h \ + caml/stacks.h caml/memory.h finalise.o: finalise.c caml/callback.h caml/compatibility.h \ - caml/mlvalues.h caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/misc.h caml/fail.h caml/mlvalues.h \ - caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/address_class.h caml/signals.h + caml/mlvalues.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/fail.h caml/mlvalues.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/signals.h fix_code.o: fix_code.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/debugger.h caml/misc.h \ - caml/config.h caml/mlvalues.h caml/fix_code.h caml/instruct.h \ - caml/intext.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ - caml/misc.h caml/mlvalues.h caml/reverse.h + caml/../../config/s.h caml/compatibility.h caml/debugger.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/fix_code.h caml/instruct.h \ + caml/intext.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/misc.h caml/mlvalues.h caml/reverse.h floats.o: floats.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/mlvalues.h \ - caml/misc.h caml/reverse.h caml/stacks.h caml/memory.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/mlvalues.h \ + caml/misc.h caml/reverse.h caml/stacks.h caml/memory.h freelist.o: freelist.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/freelist.h caml/misc.h \ - caml/config.h caml/mlvalues.h caml/gc.h caml/gc_ctrl.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/major_gc.h caml/misc.h caml/mlvalues.h + caml/../../config/s.h caml/compatibility.h caml/freelist.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/gc.h caml/gc_ctrl.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/major_gc.h caml/misc.h caml/mlvalues.h gc_ctrl.o: gc_ctrl.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/compact.h caml/custom.h caml/finalise.h \ - caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/address_class.h caml/freelist.h caml/gc.h \ - caml/gc_ctrl.h caml/major_gc.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/stacks.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/compact.h caml/custom.h caml/finalise.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/freelist.h caml/gc.h \ + caml/gc_ctrl.h caml/major_gc.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/stacks.h globroots.o: globroots.c caml/memory.h caml/compatibility.h caml/config.h \ - caml/../../config/m.h caml/../../config/s.h caml/gc.h caml/mlvalues.h \ - caml/misc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/misc.h caml/mlvalues.h caml/roots.h \ - caml/memory.h caml/globroots.h caml/roots.h + caml/../../config/m.h caml/../../config/s.h caml/gc.h caml/mlvalues.h \ + caml/misc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/memory.h caml/globroots.h caml/roots.h hash.o: hash.c caml/mlvalues.h caml/compatibility.h caml/config.h \ - caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/custom.h \ - caml/mlvalues.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/address_class.h caml/hash.h + caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/custom.h \ + caml/mlvalues.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/hash.h instrtrace.o: instrtrace.c intern.o: intern.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/callback.h caml/custom.h caml/fail.h caml/gc.h \ - caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ - caml/mlvalues.h caml/misc.h caml/reverse.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/callback.h caml/custom.h caml/fail.h caml/gc.h \ + caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h caml/misc.h caml/reverse.h interp.o: interp.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/backtrace.h caml/callback.h caml/debugger.h \ - caml/fail.h caml/fix_code.h caml/instrtrace.h caml/instruct.h \ - caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/misc.h \ - caml/mlvalues.h caml/prims.h caml/signals.h caml/stacks.h caml/memory.h \ - caml/jumptbl.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/backtrace.h caml/callback.h caml/debugger.h \ + caml/fail.h caml/fix_code.h caml/instrtrace.h caml/instruct.h \ + caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h caml/prims.h caml/signals.h caml/stacks.h caml/memory.h \ + caml/jumptbl.h ints.o: ints.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/custom.h caml/fail.h caml/intext.h caml/io.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/misc.h caml/mlvalues.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/intext.h caml/io.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h io.o: io.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ - caml/mlvalues.h caml/custom.h caml/fail.h caml/io.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/misc.h caml/mlvalues.h caml/signals.h \ - caml/sys.h + caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/io.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/signals.h \ + caml/sys.h lexing.o: lexing.c caml/fail.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h main.o: main.c caml/misc.h caml/compatibility.h caml/config.h \ - caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/misc.h \ - caml/sys.h + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/misc.h \ + caml/sys.h major_gc.o: major_gc.c caml/compact.h caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/misc.h caml/custom.h \ - caml/mlvalues.h caml/config.h caml/fail.h caml/finalise.h caml/roots.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/freelist.h caml/gc.h caml/gc_ctrl.h \ - caml/major_gc.h caml/misc.h caml/mlvalues.h caml/roots.h caml/weak.h + caml/../../config/s.h caml/compatibility.h caml/misc.h caml/custom.h \ + caml/mlvalues.h caml/config.h caml/fail.h caml/finalise.h caml/roots.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/freelist.h caml/gc.h caml/gc_ctrl.h \ + caml/major_gc.h caml/misc.h caml/mlvalues.h caml/roots.h caml/weak.h md5.o: md5.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ - caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ - caml/md5.h caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/mlvalues.h \ - caml/io.h caml/reverse.h + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/md5.h caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/mlvalues.h \ + caml/io.h caml/reverse.h memory.o: memory.c caml/address_class.h caml/misc.h caml/compatibility.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/fail.h caml/freelist.h caml/gc.h caml/gc_ctrl.h \ - caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/minor_gc.h caml/address_class.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/signals.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/freelist.h caml/gc.h caml/gc_ctrl.h \ + caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/minor_gc.h caml/address_class.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/signals.h meta.o: meta.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/config.h caml/fail.h caml/fix_code.h caml/interp.h \ - caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ - caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/stacks.h \ - caml/memory.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/config.h caml/fail.h caml/fix_code.h caml/interp.h \ + caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/stacks.h \ + caml/memory.h minor_gc.o: minor_gc.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ - caml/config.h caml/mlvalues.h caml/finalise.h caml/roots.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h \ - caml/memory.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/roots.h \ - caml/signals.h caml/weak.h + caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/finalise.h caml/roots.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h \ + caml/memory.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/signals.h caml/weak.h misc.o: misc.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/compatibility.h caml/misc.h caml/config.h caml/memory.h caml/gc.h \ - caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/address_class.h + caml/compatibility.h caml/misc.h caml/config.h caml/memory.h caml/gc.h \ + caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h obj.o: obj.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ - caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ - caml/gc.h caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ - caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/gc.h caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h parsing.o: parsing.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/mlvalues.h caml/config.h \ - caml/misc.h caml/memory.h caml/gc.h caml/mlvalues.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/alloc.h + caml/../../config/s.h caml/compatibility.h caml/mlvalues.h \ + caml/config.h caml/misc.h caml/memory.h caml/gc.h caml/mlvalues.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/alloc.h prims.o: prims.c caml/mlvalues.h caml/compatibility.h caml/config.h \ - caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/prims.h + caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/prims.h printexc.o: printexc.c caml/backtrace.h caml/mlvalues.h \ - caml/compatibility.h caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/misc.h caml/callback.h caml/debugger.h \ - caml/fail.h caml/misc.h caml/mlvalues.h caml/printexc.h + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/callback.h caml/debugger.h \ + caml/fail.h caml/misc.h caml/mlvalues.h caml/printexc.h roots.o: roots.c caml/finalise.h caml/roots.h caml/misc.h \ - caml/compatibility.h caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/memory.h caml/gc.h caml/mlvalues.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ - caml/globroots.h caml/major_gc.h caml/memory.h caml/minor_gc.h \ - caml/misc.h caml/mlvalues.h caml/roots.h caml/stacks.h -signals_byt.o: signals_byt.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/memory.h caml/config.h \ - caml/gc.h caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/address_class.h caml/osdeps.h caml/signals.h \ - caml/signals_machdep.h + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/memory.h caml/gc.h caml/mlvalues.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/globroots.h caml/major_gc.h caml/memory.h caml/minor_gc.h \ + caml/misc.h caml/mlvalues.h caml/roots.h caml/stacks.h signals.o: signals.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/callback.h caml/config.h caml/fail.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/misc.h caml/mlvalues.h caml/roots.h \ - caml/memory.h caml/signals.h caml/signals_machdep.h caml/sys.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/callback.h caml/config.h caml/fail.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/memory.h caml/signals.h caml/signals_machdep.h caml/sys.h +signals_byt.o: signals_byt.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/memory.h caml/config.h \ + caml/gc.h caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/osdeps.h caml/signals.h \ + caml/signals_machdep.h stacks.o: stacks.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ - caml/config.h caml/mlvalues.h caml/misc.h caml/mlvalues.h caml/stacks.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h + caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/misc.h caml/mlvalues.h caml/stacks.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h startup.o: startup.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ - caml/config.h caml/mlvalues.h caml/backtrace.h caml/callback.h \ - caml/custom.h caml/debugger.h caml/dynlink.h caml/exec.h caml/fail.h \ - caml/fix_code.h caml/freelist.h caml/gc_ctrl.h caml/instrtrace.h \ - caml/interp.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ - caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/osdeps.h caml/prims.h \ - caml/printexc.h caml/reverse.h caml/signals.h caml/stacks.h \ - caml/memory.h caml/sys.h caml/startup.h caml/exec.h caml/version.h + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/backtrace.h caml/callback.h \ + caml/custom.h caml/debugger.h caml/dynlink.h caml/exec.h caml/fail.h \ + caml/fix_code.h caml/freelist.h caml/gc_ctrl.h caml/instrtrace.h \ + caml/interp.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/osdeps.h caml/prims.h \ + caml/printexc.h caml/reverse.h caml/signals.h caml/stacks.h \ + caml/memory.h caml/sys.h caml/startup.h caml/exec.h caml/version.h str.o: str.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ - caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ - caml/mlvalues.h caml/misc.h + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/mlvalues.h caml/misc.h sys.o: sys.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ - caml/mlvalues.h caml/debugger.h caml/fail.h caml/instruct.h \ - caml/mlvalues.h caml/osdeps.h caml/signals.h caml/stacks.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/sys.h + caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ + caml/mlvalues.h caml/debugger.h caml/fail.h caml/instruct.h \ + caml/mlvalues.h caml/osdeps.h caml/signals.h caml/stacks.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/sys.h terminfo.o: terminfo.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ - caml/config.h caml/mlvalues.h caml/fail.h caml/io.h caml/mlvalues.h + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/fail.h caml/io.h caml/mlvalues.h unix.o: unix.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/compatibility.h caml/memory.h caml/config.h caml/gc.h \ - caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/address_class.h caml/misc.h caml/osdeps.h + caml/compatibility.h caml/memory.h caml/config.h caml/gc.h \ + caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/misc.h caml/osdeps.h weak.o: weak.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/fail.h caml/major_gc.h caml/freelist.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ - caml/address_class.h caml/mlvalues.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/major_gc.h caml/freelist.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ + caml/address_class.h caml/mlvalues.h win32.o: win32.c caml/address_class.h caml/misc.h caml/compatibility.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ - caml/osdeps.h caml/signals.h caml/sys.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/osdeps.h caml/signals.h caml/sys.h alloc.d.o: alloc.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/custom.h caml/major_gc.h caml/freelist.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ - caml/address_class.h caml/mlvalues.h caml/stacks.h caml/memory.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/major_gc.h caml/freelist.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ + caml/address_class.h caml/mlvalues.h caml/stacks.h caml/memory.h array.d.o: array.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ - caml/mlvalues.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h backtrace.d.o: backtrace.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/mlvalues.h caml/config.h \ - caml/misc.h caml/alloc.h caml/mlvalues.h caml/io.h caml/instruct.h \ - caml/intext.h caml/io.h caml/exec.h caml/fix_code.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/startup.h caml/exec.h caml/stacks.h \ - caml/memory.h caml/sys.h caml/backtrace.h caml/fail.h + caml/../../config/s.h caml/compatibility.h caml/mlvalues.h \ + caml/config.h caml/misc.h caml/alloc.h caml/mlvalues.h caml/io.h \ + caml/instruct.h caml/intext.h caml/io.h caml/exec.h caml/fix_code.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/startup.h caml/exec.h caml/stacks.h \ + caml/memory.h caml/sys.h caml/backtrace.h caml/fail.h callback.d.o: callback.c caml/callback.h caml/compatibility.h \ - caml/mlvalues.h caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/misc.h caml/fail.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ - caml/mlvalues.h caml/interp.h caml/instruct.h caml/fix_code.h \ - caml/stacks.h caml/memory.h + caml/mlvalues.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/fail.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h caml/interp.h caml/instruct.h caml/fix_code.h \ + caml/stacks.h caml/memory.h compact.d.o: compact.c caml/address_class.h caml/misc.h \ - caml/compatibility.h caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/mlvalues.h caml/config.h caml/finalise.h \ - caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/address_class.h caml/freelist.h caml/gc.h \ - caml/gc_ctrl.h caml/major_gc.h caml/memory.h caml/mlvalues.h \ - caml/roots.h caml/weak.h + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/mlvalues.h caml/config.h caml/finalise.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/freelist.h caml/gc.h \ + caml/gc_ctrl.h caml/major_gc.h caml/memory.h caml/mlvalues.h \ + caml/roots.h caml/weak.h compare.d.o: compare.c caml/custom.h caml/compatibility.h caml/mlvalues.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h caml/misc.h \ - caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/address_class.h caml/misc.h caml/mlvalues.h + caml/config.h caml/../../config/m.h caml/../../config/s.h caml/misc.h \ + caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/misc.h caml/mlvalues.h custom.d.o: custom.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/custom.h caml/fail.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ - caml/mlvalues.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h debugger.d.o: debugger.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/config.h caml/debugger.h caml/misc.h caml/fail.h \ - caml/fix_code.h caml/instruct.h caml/intext.h caml/io.h caml/io.h \ - caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/sys.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/config.h caml/debugger.h caml/misc.h caml/fail.h \ + caml/fix_code.h caml/instruct.h caml/intext.h caml/io.h caml/io.h \ + caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/sys.h dynlink.d.o: dynlink.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ - caml/config.h caml/mlvalues.h caml/dynlink.h caml/fail.h caml/mlvalues.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/misc.h caml/osdeps.h caml/prims.h \ - caml/signals.h + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/dynlink.h caml/fail.h \ + caml/mlvalues.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/misc.h caml/osdeps.h \ + caml/prims.h caml/signals.h extern.d.o: extern.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \ - caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ - caml/mlvalues.h caml/reverse.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \ + caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h caml/reverse.h fail.d.o: fail.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/fail.h caml/io.h caml/gc.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ - caml/misc.h caml/mlvalues.h caml/printexc.h caml/signals.h caml/stacks.h \ - caml/memory.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/io.h caml/gc.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/misc.h caml/mlvalues.h caml/printexc.h caml/signals.h \ + caml/stacks.h caml/memory.h finalise.d.o: finalise.c caml/callback.h caml/compatibility.h \ - caml/mlvalues.h caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/misc.h caml/fail.h caml/mlvalues.h \ - caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/address_class.h caml/signals.h + caml/mlvalues.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/fail.h caml/mlvalues.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/signals.h fix_code.d.o: fix_code.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/debugger.h caml/misc.h \ - caml/config.h caml/mlvalues.h caml/fix_code.h caml/instruct.h \ - caml/intext.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ - caml/misc.h caml/mlvalues.h caml/reverse.h + caml/../../config/s.h caml/compatibility.h caml/debugger.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/fix_code.h caml/instruct.h \ + caml/intext.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/misc.h caml/mlvalues.h caml/reverse.h floats.d.o: floats.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/mlvalues.h \ - caml/misc.h caml/reverse.h caml/stacks.h caml/memory.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/mlvalues.h \ + caml/misc.h caml/reverse.h caml/stacks.h caml/memory.h freelist.d.o: freelist.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/freelist.h caml/misc.h \ - caml/config.h caml/mlvalues.h caml/gc.h caml/gc_ctrl.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/major_gc.h caml/misc.h caml/mlvalues.h + caml/../../config/s.h caml/compatibility.h caml/freelist.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/gc.h caml/gc_ctrl.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/major_gc.h caml/misc.h caml/mlvalues.h gc_ctrl.d.o: gc_ctrl.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/compact.h caml/custom.h caml/finalise.h \ - caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/address_class.h caml/freelist.h caml/gc.h \ - caml/gc_ctrl.h caml/major_gc.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/stacks.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/compact.h caml/custom.h caml/finalise.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/freelist.h caml/gc.h \ + caml/gc_ctrl.h caml/major_gc.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/stacks.h globroots.d.o: globroots.c caml/memory.h caml/compatibility.h caml/config.h \ - caml/../../config/m.h caml/../../config/s.h caml/gc.h caml/mlvalues.h \ - caml/misc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/misc.h caml/mlvalues.h caml/roots.h \ - caml/memory.h caml/globroots.h caml/roots.h + caml/../../config/m.h caml/../../config/s.h caml/gc.h caml/mlvalues.h \ + caml/misc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/memory.h caml/globroots.h caml/roots.h hash.d.o: hash.c caml/mlvalues.h caml/compatibility.h caml/config.h \ - caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/custom.h \ - caml/mlvalues.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/address_class.h caml/hash.h + caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/custom.h \ + caml/mlvalues.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/hash.h instrtrace.d.o: instrtrace.c caml/instruct.h caml/misc.h \ - caml/compatibility.h caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/mlvalues.h caml/misc.h caml/opnames.h \ - caml/prims.h caml/stacks.h caml/mlvalues.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/mlvalues.h caml/misc.h caml/opnames.h \ + caml/prims.h caml/stacks.h caml/mlvalues.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h intern.d.o: intern.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/callback.h caml/custom.h caml/fail.h caml/gc.h \ - caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ - caml/mlvalues.h caml/misc.h caml/reverse.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/callback.h caml/custom.h caml/fail.h caml/gc.h \ + caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h caml/misc.h caml/reverse.h interp.d.o: interp.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/backtrace.h caml/callback.h caml/debugger.h \ - caml/fail.h caml/fix_code.h caml/instrtrace.h caml/instruct.h \ - caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/misc.h \ - caml/mlvalues.h caml/prims.h caml/signals.h caml/stacks.h caml/memory.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/backtrace.h caml/callback.h caml/debugger.h \ + caml/fail.h caml/fix_code.h caml/instrtrace.h caml/instruct.h \ + caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h caml/prims.h caml/signals.h caml/stacks.h caml/memory.h ints.d.o: ints.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/custom.h caml/fail.h caml/intext.h caml/io.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/misc.h caml/mlvalues.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/intext.h caml/io.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h io.d.o: io.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ - caml/mlvalues.h caml/custom.h caml/fail.h caml/io.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/misc.h caml/mlvalues.h caml/signals.h \ - caml/sys.h + caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/io.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/signals.h \ + caml/sys.h lexing.d.o: lexing.c caml/fail.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h main.d.o: main.c caml/misc.h caml/compatibility.h caml/config.h \ - caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/misc.h \ - caml/sys.h + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/misc.h \ + caml/sys.h major_gc.d.o: major_gc.c caml/compact.h caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/misc.h caml/custom.h \ - caml/mlvalues.h caml/config.h caml/fail.h caml/finalise.h caml/roots.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/freelist.h caml/gc.h caml/gc_ctrl.h \ - caml/major_gc.h caml/misc.h caml/mlvalues.h caml/roots.h caml/weak.h + caml/../../config/s.h caml/compatibility.h caml/misc.h caml/custom.h \ + caml/mlvalues.h caml/config.h caml/fail.h caml/finalise.h caml/roots.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/freelist.h caml/gc.h caml/gc_ctrl.h \ + caml/major_gc.h caml/misc.h caml/mlvalues.h caml/roots.h caml/weak.h md5.d.o: md5.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ - caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ - caml/md5.h caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/mlvalues.h \ - caml/io.h caml/reverse.h + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/md5.h caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/mlvalues.h \ + caml/io.h caml/reverse.h memory.d.o: memory.c caml/address_class.h caml/misc.h caml/compatibility.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/fail.h caml/freelist.h caml/gc.h caml/gc_ctrl.h \ - caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/minor_gc.h caml/address_class.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/signals.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/freelist.h caml/gc.h caml/gc_ctrl.h \ + caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/minor_gc.h caml/address_class.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/signals.h meta.d.o: meta.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/config.h caml/fail.h caml/fix_code.h caml/interp.h \ - caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ - caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/stacks.h \ - caml/memory.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/config.h caml/fail.h caml/fix_code.h caml/interp.h \ + caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/stacks.h \ + caml/memory.h minor_gc.d.o: minor_gc.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ - caml/config.h caml/mlvalues.h caml/finalise.h caml/roots.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h \ - caml/memory.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/roots.h \ - caml/signals.h caml/weak.h + caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/finalise.h caml/roots.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h \ + caml/memory.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/signals.h caml/weak.h misc.d.o: misc.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/compatibility.h caml/misc.h caml/config.h caml/memory.h caml/gc.h \ - caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/address_class.h + caml/compatibility.h caml/misc.h caml/config.h caml/memory.h caml/gc.h \ + caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h obj.d.o: obj.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ - caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ - caml/gc.h caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ - caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/gc.h caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h parsing.d.o: parsing.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/mlvalues.h caml/config.h \ - caml/misc.h caml/memory.h caml/gc.h caml/mlvalues.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/alloc.h + caml/../../config/s.h caml/compatibility.h caml/mlvalues.h \ + caml/config.h caml/misc.h caml/memory.h caml/gc.h caml/mlvalues.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/alloc.h prims.d.o: prims.c caml/mlvalues.h caml/compatibility.h caml/config.h \ - caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/prims.h + caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/prims.h printexc.d.o: printexc.c caml/backtrace.h caml/mlvalues.h \ - caml/compatibility.h caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/misc.h caml/callback.h caml/debugger.h \ - caml/fail.h caml/misc.h caml/mlvalues.h caml/printexc.h + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/callback.h caml/debugger.h \ + caml/fail.h caml/misc.h caml/mlvalues.h caml/printexc.h roots.d.o: roots.c caml/finalise.h caml/roots.h caml/misc.h \ - caml/compatibility.h caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/memory.h caml/gc.h caml/mlvalues.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ - caml/globroots.h caml/major_gc.h caml/memory.h caml/minor_gc.h \ - caml/misc.h caml/mlvalues.h caml/roots.h caml/stacks.h -signals_byt.d.o: signals_byt.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/memory.h caml/config.h \ - caml/gc.h caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/address_class.h caml/osdeps.h caml/signals.h \ - caml/signals_machdep.h + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/memory.h caml/gc.h caml/mlvalues.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/globroots.h caml/major_gc.h caml/memory.h caml/minor_gc.h \ + caml/misc.h caml/mlvalues.h caml/roots.h caml/stacks.h signals.d.o: signals.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/callback.h caml/config.h caml/fail.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/misc.h caml/mlvalues.h caml/roots.h \ - caml/memory.h caml/signals.h caml/signals_machdep.h caml/sys.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/callback.h caml/config.h caml/fail.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/memory.h caml/signals.h caml/signals_machdep.h caml/sys.h +signals_byt.d.o: signals_byt.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/memory.h caml/config.h \ + caml/gc.h caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/osdeps.h caml/signals.h \ + caml/signals_machdep.h stacks.d.o: stacks.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ - caml/config.h caml/mlvalues.h caml/misc.h caml/mlvalues.h caml/stacks.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h + caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/misc.h caml/mlvalues.h caml/stacks.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h startup.d.o: startup.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ - caml/config.h caml/mlvalues.h caml/backtrace.h caml/callback.h \ - caml/custom.h caml/debugger.h caml/dynlink.h caml/exec.h caml/fail.h \ - caml/fix_code.h caml/freelist.h caml/gc_ctrl.h caml/instrtrace.h \ - caml/interp.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ - caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/osdeps.h caml/prims.h \ - caml/printexc.h caml/reverse.h caml/signals.h caml/stacks.h \ - caml/memory.h caml/sys.h caml/startup.h caml/exec.h caml/version.h + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/backtrace.h caml/callback.h \ + caml/custom.h caml/debugger.h caml/dynlink.h caml/exec.h caml/fail.h \ + caml/fix_code.h caml/freelist.h caml/gc_ctrl.h caml/instrtrace.h \ + caml/interp.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/osdeps.h caml/prims.h \ + caml/printexc.h caml/reverse.h caml/signals.h caml/stacks.h \ + caml/memory.h caml/sys.h caml/startup.h caml/exec.h caml/version.h str.d.o: str.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ - caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ - caml/mlvalues.h caml/misc.h + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/mlvalues.h caml/misc.h sys.d.o: sys.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ - caml/mlvalues.h caml/debugger.h caml/fail.h caml/instruct.h \ - caml/mlvalues.h caml/osdeps.h caml/signals.h caml/stacks.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/sys.h + caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ + caml/mlvalues.h caml/debugger.h caml/fail.h caml/instruct.h \ + caml/mlvalues.h caml/osdeps.h caml/signals.h caml/stacks.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/sys.h terminfo.d.o: terminfo.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ - caml/config.h caml/mlvalues.h caml/fail.h caml/io.h caml/mlvalues.h + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/fail.h caml/io.h caml/mlvalues.h unix.d.o: unix.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/compatibility.h caml/memory.h caml/config.h caml/gc.h \ - caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/address_class.h caml/misc.h caml/osdeps.h + caml/compatibility.h caml/memory.h caml/config.h caml/gc.h \ + caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/misc.h caml/osdeps.h weak.d.o: weak.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/fail.h caml/major_gc.h caml/freelist.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ - caml/address_class.h caml/mlvalues.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/major_gc.h caml/freelist.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ + caml/address_class.h caml/mlvalues.h win32.d.o: win32.c caml/address_class.h caml/misc.h caml/compatibility.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ - caml/osdeps.h caml/signals.h caml/sys.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/osdeps.h caml/signals.h caml/sys.h alloc.pic.o: alloc.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/custom.h caml/major_gc.h caml/freelist.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ - caml/address_class.h caml/mlvalues.h caml/stacks.h caml/memory.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/major_gc.h caml/freelist.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ + caml/address_class.h caml/mlvalues.h caml/stacks.h caml/memory.h array.pic.o: array.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ - caml/mlvalues.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h backtrace.pic.o: backtrace.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/mlvalues.h caml/config.h \ - caml/misc.h caml/alloc.h caml/mlvalues.h caml/io.h caml/instruct.h \ - caml/intext.h caml/io.h caml/exec.h caml/fix_code.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/startup.h caml/exec.h caml/stacks.h \ - caml/memory.h caml/sys.h caml/backtrace.h caml/fail.h + caml/../../config/s.h caml/compatibility.h caml/mlvalues.h \ + caml/config.h caml/misc.h caml/alloc.h caml/mlvalues.h caml/io.h \ + caml/instruct.h caml/intext.h caml/io.h caml/exec.h caml/fix_code.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/startup.h caml/exec.h caml/stacks.h \ + caml/memory.h caml/sys.h caml/backtrace.h caml/fail.h callback.pic.o: callback.c caml/callback.h caml/compatibility.h \ - caml/mlvalues.h caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/misc.h caml/fail.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ - caml/mlvalues.h caml/interp.h caml/instruct.h caml/fix_code.h \ - caml/stacks.h caml/memory.h + caml/mlvalues.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/fail.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h caml/interp.h caml/instruct.h caml/fix_code.h \ + caml/stacks.h caml/memory.h compact.pic.o: compact.c caml/address_class.h caml/misc.h \ - caml/compatibility.h caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/mlvalues.h caml/config.h caml/finalise.h \ - caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/address_class.h caml/freelist.h caml/gc.h \ - caml/gc_ctrl.h caml/major_gc.h caml/memory.h caml/mlvalues.h \ - caml/roots.h caml/weak.h + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/mlvalues.h caml/config.h caml/finalise.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/freelist.h caml/gc.h \ + caml/gc_ctrl.h caml/major_gc.h caml/memory.h caml/mlvalues.h \ + caml/roots.h caml/weak.h compare.pic.o: compare.c caml/custom.h caml/compatibility.h caml/mlvalues.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h caml/misc.h \ - caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/address_class.h caml/misc.h caml/mlvalues.h + caml/config.h caml/../../config/m.h caml/../../config/s.h caml/misc.h \ + caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/misc.h caml/mlvalues.h custom.pic.o: custom.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/custom.h caml/fail.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ - caml/mlvalues.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h debugger.pic.o: debugger.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/config.h caml/debugger.h caml/misc.h caml/fail.h \ - caml/fix_code.h caml/instruct.h caml/intext.h caml/io.h caml/io.h \ - caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/sys.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/config.h caml/debugger.h caml/misc.h caml/fail.h \ + caml/fix_code.h caml/instruct.h caml/intext.h caml/io.h caml/io.h \ + caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/sys.h dynlink.pic.o: dynlink.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ - caml/config.h caml/mlvalues.h caml/dynlink.h caml/fail.h caml/mlvalues.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/misc.h caml/osdeps.h caml/prims.h \ - caml/signals.h + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/dynlink.h caml/fail.h \ + caml/mlvalues.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/misc.h caml/osdeps.h \ + caml/prims.h caml/signals.h extern.pic.o: extern.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \ - caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ - caml/mlvalues.h caml/reverse.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \ + caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h caml/reverse.h fail.pic.o: fail.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/fail.h caml/io.h caml/gc.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ - caml/misc.h caml/mlvalues.h caml/printexc.h caml/signals.h caml/stacks.h \ - caml/memory.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/io.h caml/gc.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/misc.h caml/mlvalues.h caml/printexc.h caml/signals.h \ + caml/stacks.h caml/memory.h finalise.pic.o: finalise.c caml/callback.h caml/compatibility.h \ - caml/mlvalues.h caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/misc.h caml/fail.h caml/mlvalues.h \ - caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/address_class.h caml/signals.h + caml/mlvalues.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/fail.h caml/mlvalues.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/signals.h fix_code.pic.o: fix_code.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/debugger.h caml/misc.h \ - caml/config.h caml/mlvalues.h caml/fix_code.h caml/instruct.h \ - caml/intext.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ - caml/misc.h caml/mlvalues.h caml/reverse.h + caml/../../config/s.h caml/compatibility.h caml/debugger.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/fix_code.h caml/instruct.h \ + caml/intext.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/misc.h caml/mlvalues.h caml/reverse.h floats.pic.o: floats.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/mlvalues.h \ - caml/misc.h caml/reverse.h caml/stacks.h caml/memory.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/mlvalues.h \ + caml/misc.h caml/reverse.h caml/stacks.h caml/memory.h freelist.pic.o: freelist.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/freelist.h caml/misc.h \ - caml/config.h caml/mlvalues.h caml/gc.h caml/gc_ctrl.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/major_gc.h caml/misc.h caml/mlvalues.h + caml/../../config/s.h caml/compatibility.h caml/freelist.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/gc.h caml/gc_ctrl.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/major_gc.h caml/misc.h caml/mlvalues.h gc_ctrl.pic.o: gc_ctrl.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/compact.h caml/custom.h caml/finalise.h \ - caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/address_class.h caml/freelist.h caml/gc.h \ - caml/gc_ctrl.h caml/major_gc.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/stacks.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/compact.h caml/custom.h caml/finalise.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/freelist.h caml/gc.h \ + caml/gc_ctrl.h caml/major_gc.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/stacks.h globroots.pic.o: globroots.c caml/memory.h caml/compatibility.h caml/config.h \ - caml/../../config/m.h caml/../../config/s.h caml/gc.h caml/mlvalues.h \ - caml/misc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/misc.h caml/mlvalues.h caml/roots.h \ - caml/memory.h caml/globroots.h caml/roots.h + caml/../../config/m.h caml/../../config/s.h caml/gc.h caml/mlvalues.h \ + caml/misc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/memory.h caml/globroots.h caml/roots.h hash.pic.o: hash.c caml/mlvalues.h caml/compatibility.h caml/config.h \ - caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/custom.h \ - caml/mlvalues.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/address_class.h caml/hash.h + caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/custom.h \ + caml/mlvalues.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/hash.h instrtrace.pic.o: instrtrace.c intern.pic.o: intern.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/callback.h caml/custom.h caml/fail.h caml/gc.h \ - caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ - caml/mlvalues.h caml/misc.h caml/reverse.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/callback.h caml/custom.h caml/fail.h caml/gc.h \ + caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h caml/misc.h caml/reverse.h interp.pic.o: interp.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/backtrace.h caml/callback.h caml/debugger.h \ - caml/fail.h caml/fix_code.h caml/instrtrace.h caml/instruct.h \ - caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/misc.h \ - caml/mlvalues.h caml/prims.h caml/signals.h caml/stacks.h caml/memory.h \ - caml/jumptbl.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/backtrace.h caml/callback.h caml/debugger.h \ + caml/fail.h caml/fix_code.h caml/instrtrace.h caml/instruct.h \ + caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h caml/prims.h caml/signals.h caml/stacks.h caml/memory.h \ + caml/jumptbl.h ints.pic.o: ints.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/custom.h caml/fail.h caml/intext.h caml/io.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/misc.h caml/mlvalues.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/intext.h caml/io.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h io.pic.o: io.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ - caml/mlvalues.h caml/custom.h caml/fail.h caml/io.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/misc.h caml/mlvalues.h caml/signals.h \ - caml/sys.h + caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/io.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/signals.h \ + caml/sys.h lexing.pic.o: lexing.c caml/fail.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h main.pic.o: main.c caml/misc.h caml/compatibility.h caml/config.h \ - caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/misc.h \ - caml/sys.h + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/misc.h \ + caml/sys.h major_gc.pic.o: major_gc.c caml/compact.h caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/misc.h caml/custom.h \ - caml/mlvalues.h caml/config.h caml/fail.h caml/finalise.h caml/roots.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/freelist.h caml/gc.h caml/gc_ctrl.h \ - caml/major_gc.h caml/misc.h caml/mlvalues.h caml/roots.h caml/weak.h + caml/../../config/s.h caml/compatibility.h caml/misc.h caml/custom.h \ + caml/mlvalues.h caml/config.h caml/fail.h caml/finalise.h caml/roots.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/freelist.h caml/gc.h caml/gc_ctrl.h \ + caml/major_gc.h caml/misc.h caml/mlvalues.h caml/roots.h caml/weak.h md5.pic.o: md5.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ - caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ - caml/md5.h caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/mlvalues.h \ - caml/io.h caml/reverse.h + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/md5.h caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/mlvalues.h \ + caml/io.h caml/reverse.h memory.pic.o: memory.c caml/address_class.h caml/misc.h caml/compatibility.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/fail.h caml/freelist.h caml/gc.h caml/gc_ctrl.h \ - caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/minor_gc.h caml/address_class.h caml/minor_gc.h caml/misc.h \ - caml/mlvalues.h caml/signals.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/freelist.h caml/gc.h caml/gc_ctrl.h \ + caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/minor_gc.h caml/address_class.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/signals.h meta.pic.o: meta.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/config.h caml/fail.h caml/fix_code.h caml/interp.h \ - caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ - caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/stacks.h \ - caml/memory.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/config.h caml/fail.h caml/fix_code.h caml/interp.h \ + caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/stacks.h \ + caml/memory.h minor_gc.pic.o: minor_gc.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ - caml/config.h caml/mlvalues.h caml/finalise.h caml/roots.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h \ - caml/memory.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/roots.h \ - caml/signals.h caml/weak.h + caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/finalise.h caml/roots.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h \ + caml/memory.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/signals.h caml/weak.h misc.pic.o: misc.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/compatibility.h caml/misc.h caml/config.h caml/memory.h caml/gc.h \ - caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/address_class.h + caml/compatibility.h caml/misc.h caml/config.h caml/memory.h caml/gc.h \ + caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h obj.pic.o: obj.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ - caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ - caml/gc.h caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ - caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/gc.h caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h parsing.pic.o: parsing.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/mlvalues.h caml/config.h \ - caml/misc.h caml/memory.h caml/gc.h caml/mlvalues.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/alloc.h + caml/../../config/s.h caml/compatibility.h caml/mlvalues.h \ + caml/config.h caml/misc.h caml/memory.h caml/gc.h caml/mlvalues.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/alloc.h prims.pic.o: prims.c caml/mlvalues.h caml/compatibility.h caml/config.h \ - caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/prims.h + caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/prims.h printexc.pic.o: printexc.c caml/backtrace.h caml/mlvalues.h \ - caml/compatibility.h caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/misc.h caml/callback.h caml/debugger.h \ - caml/fail.h caml/misc.h caml/mlvalues.h caml/printexc.h + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/callback.h caml/debugger.h \ + caml/fail.h caml/misc.h caml/mlvalues.h caml/printexc.h roots.pic.o: roots.c caml/finalise.h caml/roots.h caml/misc.h \ - caml/compatibility.h caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/memory.h caml/gc.h caml/mlvalues.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ - caml/globroots.h caml/major_gc.h caml/memory.h caml/minor_gc.h \ - caml/misc.h caml/mlvalues.h caml/roots.h caml/stacks.h -signals_byt.pic.o: signals_byt.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/memory.h caml/config.h \ - caml/gc.h caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/address_class.h caml/osdeps.h caml/signals.h \ - caml/signals_machdep.h + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/memory.h caml/gc.h caml/mlvalues.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/globroots.h caml/major_gc.h caml/memory.h caml/minor_gc.h \ + caml/misc.h caml/mlvalues.h caml/roots.h caml/stacks.h signals.pic.o: signals.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/callback.h caml/config.h caml/fail.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/misc.h caml/mlvalues.h caml/roots.h \ - caml/memory.h caml/signals.h caml/signals_machdep.h caml/sys.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/callback.h caml/config.h caml/fail.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/memory.h caml/signals.h caml/signals_machdep.h caml/sys.h +signals_byt.pic.o: signals_byt.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/memory.h caml/config.h \ + caml/gc.h caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/osdeps.h caml/signals.h \ + caml/signals_machdep.h stacks.pic.o: stacks.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ - caml/config.h caml/mlvalues.h caml/misc.h caml/mlvalues.h caml/stacks.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h + caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/misc.h caml/mlvalues.h caml/stacks.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h startup.pic.o: startup.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ - caml/config.h caml/mlvalues.h caml/backtrace.h caml/callback.h \ - caml/custom.h caml/debugger.h caml/dynlink.h caml/exec.h caml/fail.h \ - caml/fix_code.h caml/freelist.h caml/gc_ctrl.h caml/instrtrace.h \ - caml/interp.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ - caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/osdeps.h caml/prims.h \ - caml/printexc.h caml/reverse.h caml/signals.h caml/stacks.h \ - caml/memory.h caml/sys.h caml/startup.h caml/exec.h caml/version.h + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/backtrace.h caml/callback.h \ + caml/custom.h caml/debugger.h caml/dynlink.h caml/exec.h caml/fail.h \ + caml/fix_code.h caml/freelist.h caml/gc_ctrl.h caml/instrtrace.h \ + caml/interp.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/osdeps.h caml/prims.h \ + caml/printexc.h caml/reverse.h caml/signals.h caml/stacks.h \ + caml/memory.h caml/sys.h caml/startup.h caml/exec.h caml/version.h str.pic.o: str.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ - caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ - caml/mlvalues.h caml/misc.h + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/mlvalues.h caml/misc.h sys.pic.o: sys.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ - caml/mlvalues.h caml/debugger.h caml/fail.h caml/instruct.h \ - caml/mlvalues.h caml/osdeps.h caml/signals.h caml/stacks.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/sys.h + caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ + caml/mlvalues.h caml/debugger.h caml/fail.h caml/instruct.h \ + caml/mlvalues.h caml/osdeps.h caml/signals.h caml/stacks.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/sys.h terminfo.pic.o: terminfo.c caml/config.h caml/../../config/m.h \ - caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ - caml/config.h caml/mlvalues.h caml/fail.h caml/io.h caml/mlvalues.h + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/fail.h caml/io.h caml/mlvalues.h unix.pic.o: unix.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/compatibility.h caml/memory.h caml/config.h caml/gc.h \ - caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ - caml/minor_gc.h caml/address_class.h caml/misc.h caml/osdeps.h + caml/compatibility.h caml/memory.h caml/config.h caml/gc.h \ + caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/misc.h caml/osdeps.h weak.pic.o: weak.c caml/alloc.h caml/compatibility.h caml/misc.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/fail.h caml/major_gc.h caml/freelist.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ - caml/address_class.h caml/mlvalues.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/major_gc.h caml/freelist.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ + caml/address_class.h caml/mlvalues.h win32.pic.o: win32.c caml/address_class.h caml/misc.h caml/compatibility.h \ - caml/config.h caml/../../config/m.h caml/../../config/s.h \ - caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ - caml/osdeps.h caml/signals.h caml/sys.h + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/osdeps.h caml/signals.h caml/sys.h diff --git a/debugger/.depend b/debugger/.depend index c9a56ac144..b62541619a 100644 --- a/debugger/.depend +++ b/debugger/.depend @@ -16,8 +16,8 @@ int64ops.cmi : lexer.cmi : parser.cmi loadprinter.cmi : ../parsing/longident.cmi dynlink.cmi parameters.cmi : -parser_aux.cmi : primitives.cmi ../parsing/longident.cmi parser.cmi : parser_aux.cmi ../parsing/longident.cmi +parser_aux.cmi : primitives.cmi ../parsing/longident.cmi pattern_matching.cmi : ../typing/typedtree.cmi parser_aux.cmi debugcom.cmi pos.cmi : ../bytecomp/instruct.cmi primitives.cmi : $(UNIXDIR)/unix.cmi diff --git a/lex/.depend b/lex/.depend index 10f90c22c6..455421e708 100644 --- a/lex/.depend +++ b/lex/.depend @@ -3,8 +3,8 @@ compact.cmi : lexgen.cmi cset.cmi : lexer.cmi : parser.cmi lexgen.cmi : syntax.cmi -outputbis.cmi : syntax.cmi lexgen.cmi common.cmi output.cmi : syntax.cmi lexgen.cmi compact.cmi common.cmi +outputbis.cmi : syntax.cmi lexgen.cmi common.cmi parser.cmi : syntax.cmi syntax.cmi : cset.cmi table.cmi : @@ -22,10 +22,10 @@ main.cmo : syntax.cmi parser.cmi outputbis.cmi output.cmi lexgen.cmi \ lexer.cmi cset.cmi compact.cmi common.cmi main.cmx : syntax.cmx parser.cmx outputbis.cmx output.cmx lexgen.cmx \ lexer.cmx cset.cmx compact.cmx common.cmx -outputbis.cmo : lexgen.cmi common.cmi outputbis.cmi -outputbis.cmx : lexgen.cmx common.cmx outputbis.cmi output.cmo : lexgen.cmi compact.cmi common.cmi output.cmi output.cmx : lexgen.cmx compact.cmx common.cmx output.cmi +outputbis.cmo : lexgen.cmi common.cmi outputbis.cmi +outputbis.cmx : lexgen.cmx common.cmx outputbis.cmi parser.cmo : syntax.cmi cset.cmi parser.cmi parser.cmx : syntax.cmx cset.cmx parser.cmi syntax.cmo : cset.cmi syntax.cmi diff --git a/ocamlbuild/.depend b/ocamlbuild/.depend index d6dda722ed..3b67d873d4 100644 --- a/ocamlbuild/.depend +++ b/ocamlbuild/.depend @@ -8,9 +8,9 @@ exit_codes.cmi : fda.cmi : slurp.cmi findlib.cmi : signatures.cmi command.cmi flags.cmi : tags.cmi command.cmi +glob.cmi : signatures.cmi glob_ast.cmi bool.cmi glob_ast.cmi : bool.cmi glob_lexer.cmi : glob_ast.cmi -glob.cmi : signatures.cmi glob_ast.cmi bool.cmi hooks.cmi : hygiene.cmi : slurp.cmi lexers.cmi : loc.cmi glob.cmi @@ -20,17 +20,17 @@ main.cmi : my_std.cmi : signatures.cmi my_unix.cmi : ocaml_arch.cmi : signatures.cmi command.cmi -ocamlbuild_executor.cmi : -ocamlbuildlight.cmi : -ocamlbuild.cmi : -ocamlbuild_plugin.cmi : -ocamlbuild_unix_plugin.cmi : -ocamlbuild_where.cmi : ocaml_compiler.cmi : tags.cmi rule.cmi pathname.cmi command.cmi ocaml_dependencies.cmi : pathname.cmi ocaml_specific.cmi : ocaml_tools.cmi : tags.cmi rule.cmi pathname.cmi command.cmi ocaml_utils.cmi : tags.cmi pathname.cmi command.cmi +ocamlbuild.cmi : +ocamlbuild_executor.cmi : +ocamlbuild_plugin.cmi : +ocamlbuild_unix_plugin.cmi : +ocamlbuild_where.cmi : +ocamlbuildlight.cmi : options.cmi : slurp.cmi signatures.cmi command.cmi param_tags.cmi : tags.cmi loc.cmi pathname.cmi : signatures.cmi @@ -75,12 +75,12 @@ findlib.cmx : my_unix.cmx my_std.cmx lexers.cmx const.cmx command.cmx \ findlib.cmi flags.cmo : tags.cmi param_tags.cmi log.cmi command.cmi bool.cmi flags.cmi flags.cmx : tags.cmx param_tags.cmx log.cmx command.cmx bool.cmx flags.cmi +glob.cmo : my_std.cmi glob_lexer.cmi glob_ast.cmi bool.cmi glob.cmi +glob.cmx : my_std.cmx glob_lexer.cmx glob_ast.cmx bool.cmx glob.cmi glob_ast.cmo : bool.cmi glob_ast.cmi glob_ast.cmx : bool.cmx glob_ast.cmi glob_lexer.cmo : glob_ast.cmi bool.cmi glob_lexer.cmi glob_lexer.cmx : glob_ast.cmx bool.cmx glob_lexer.cmi -glob.cmo : my_std.cmi glob_lexer.cmi glob_ast.cmi bool.cmi glob.cmi -glob.cmx : my_std.cmx glob_lexer.cmx glob_ast.cmx bool.cmx glob.cmi hooks.cmo : hooks.cmi hooks.cmx : hooks.cmi hygiene.cmo : slurp.cmi shell.cmi pathname.cmi options.cmi my_std.cmi \ @@ -111,22 +111,6 @@ my_unix.cmo : my_std.cmi my_unix.cmi my_unix.cmx : my_std.cmx my_unix.cmi ocaml_arch.cmo : pathname.cmi my_std.cmi command.cmi ocaml_arch.cmi ocaml_arch.cmx : pathname.cmx my_std.cmx command.cmx ocaml_arch.cmi -ocamlbuild_config.cmo : -ocamlbuild_config.cmx : -ocamlbuild_executor.cmo : ocamlbuild_executor.cmi -ocamlbuild_executor.cmx : ocamlbuild_executor.cmi -ocamlbuildlight.cmo : ocamlbuildlight.cmi -ocamlbuildlight.cmx : ocamlbuildlight.cmi -ocamlbuild.cmo : ocamlbuild_unix_plugin.cmi ocamlbuild.cmi -ocamlbuild.cmx : ocamlbuild_unix_plugin.cmx ocamlbuild.cmi -ocamlbuild_plugin.cmo : ocamlbuild_plugin.cmi -ocamlbuild_plugin.cmx : ocamlbuild_plugin.cmi -ocamlbuild_unix_plugin.cmo : ocamlbuild_executor.cmi my_unix.cmi my_std.cmi \ - exit_codes.cmi ocamlbuild_unix_plugin.cmi -ocamlbuild_unix_plugin.cmx : ocamlbuild_executor.cmx my_unix.cmx my_std.cmx \ - exit_codes.cmx ocamlbuild_unix_plugin.cmi -ocamlbuild_where.cmo : ocamlbuild_config.cmo ocamlbuild_where.cmi -ocamlbuild_where.cmx : ocamlbuild_config.cmx ocamlbuild_where.cmi ocaml_compiler.cmo : tools.cmi tags.cmi rule.cmi resource.cmi pathname.cmi \ options.cmi ocaml_utils.cmi ocaml_dependencies.cmi ocaml_arch.cmi \ my_std.cmi log.cmi command.cmi ocaml_compiler.cmi @@ -157,6 +141,22 @@ ocaml_utils.cmo : tools.cmi tags.cmi pathname.cmi param_tags.cmi options.cmi \ ocaml_utils.cmx : tools.cmx tags.cmx pathname.cmx param_tags.cmx options.cmx \ my_std.cmx log.cmx lexers.cmx flags.cmx const.cmx command.cmx \ ocaml_utils.cmi +ocamlbuild.cmo : ocamlbuild_unix_plugin.cmi ocamlbuild.cmi +ocamlbuild.cmx : ocamlbuild_unix_plugin.cmx ocamlbuild.cmi +ocamlbuild_config.cmo : +ocamlbuild_config.cmx : +ocamlbuild_executor.cmo : ocamlbuild_executor.cmi +ocamlbuild_executor.cmx : ocamlbuild_executor.cmi +ocamlbuild_plugin.cmo : ocamlbuild_plugin.cmi +ocamlbuild_plugin.cmx : ocamlbuild_plugin.cmi +ocamlbuild_unix_plugin.cmo : ocamlbuild_executor.cmi my_unix.cmi my_std.cmi \ + exit_codes.cmi ocamlbuild_unix_plugin.cmi +ocamlbuild_unix_plugin.cmx : ocamlbuild_executor.cmx my_unix.cmx my_std.cmx \ + exit_codes.cmx ocamlbuild_unix_plugin.cmi +ocamlbuild_where.cmo : ocamlbuild_config.cmo ocamlbuild_where.cmi +ocamlbuild_where.cmx : ocamlbuild_config.cmx ocamlbuild_where.cmi +ocamlbuildlight.cmo : ocamlbuildlight.cmi +ocamlbuildlight.cmx : ocamlbuildlight.cmi options.cmo : shell.cmi ocamlbuild_where.cmi ocamlbuild_config.cmo \ my_std.cmi log.cmi lexers.cmi const.cmo command.cmi options.cmi options.cmx : shell.cmx ocamlbuild_where.cmx ocamlbuild_config.cmx \ diff --git a/ocamldoc/.depend b/ocamldoc/.depend index 6c729e3274..b98bb57fe7 100644 --- a/ocamldoc/.depend +++ b/ocamldoc/.depend @@ -1,3 +1,11 @@ +odoc.cmo : ../typing/typedtree.cmi odoc_messages.cmo odoc_info.cmi \ + odoc_global.cmi odoc_gen.cmi odoc_config.cmi odoc_args.cmi \ + odoc_analyse.cmi ../utils/misc.cmi ../utils/config.cmi \ + ../utils/clflags.cmi +odoc.cmx : ../typing/typedtree.cmx odoc_messages.cmx odoc_info.cmx \ + odoc_global.cmx odoc_gen.cmx odoc_config.cmx odoc_args.cmx \ + odoc_analyse.cmx ../utils/misc.cmx ../utils/config.cmx \ + ../utils/clflags.cmx odoc_analyse.cmo : ../utils/warnings.cmi ../typing/types.cmi \ ../typing/typemod.cmi ../typing/typedtree.cmi ../parsing/syntaxerr.cmi \ ../driver/pparse.cmi ../parsing/parse.cmi odoc_types.cmi odoc_text.cmi \ @@ -44,8 +52,6 @@ odoc_class.cmo : ../typing/types.cmi odoc_value.cmo odoc_types.cmi \ odoc_parameter.cmo odoc_name.cmi odoc_class.cmx : ../typing/types.cmx odoc_value.cmx odoc_types.cmx \ odoc_parameter.cmx odoc_name.cmx -odoc_comments_global.cmo : odoc_comments_global.cmi -odoc_comments_global.cmx : odoc_comments_global.cmi odoc_comments.cmo : odoc_types.cmi odoc_text.cmi odoc_see_lexer.cmo \ odoc_parser.cmi odoc_misc.cmi odoc_messages.cmo odoc_merge.cmi \ odoc_lexer.cmo odoc_global.cmi odoc_cross.cmi odoc_comments_global.cmi \ @@ -54,6 +60,8 @@ odoc_comments.cmx : odoc_types.cmx odoc_text.cmx odoc_see_lexer.cmx \ odoc_parser.cmx odoc_misc.cmx odoc_messages.cmx odoc_merge.cmx \ odoc_lexer.cmx odoc_global.cmx odoc_cross.cmx odoc_comments_global.cmx \ odoc_comments.cmi +odoc_comments_global.cmo : odoc_comments_global.cmi +odoc_comments_global.cmx : odoc_comments_global.cmi odoc_config.cmo : ../utils/config.cmi odoc_config.cmi odoc_config.cmx : ../utils/config.cmx odoc_config.cmi odoc_control.cmo : @@ -142,14 +150,6 @@ odoc_misc.cmo : ../typing/types.cmi ../typing/predef.cmi ../typing/path.cmi \ odoc_misc.cmx : ../typing/types.cmx ../typing/predef.cmx ../typing/path.cmx \ odoc_types.cmx odoc_messages.cmx ../parsing/longident.cmx \ ../typing/ctype.cmx ../typing/btype.cmx odoc_misc.cmi -odoc.cmo : ../typing/typedtree.cmi odoc_messages.cmo odoc_info.cmi \ - odoc_global.cmi odoc_gen.cmi odoc_config.cmi odoc_args.cmi \ - odoc_analyse.cmi ../utils/misc.cmi ../utils/config.cmi \ - ../utils/clflags.cmi -odoc.cmx : ../typing/typedtree.cmx odoc_messages.cmx odoc_info.cmx \ - odoc_global.cmx odoc_gen.cmx odoc_config.cmx odoc_args.cmx \ - odoc_analyse.cmx ../utils/misc.cmx ../utils/config.cmx \ - ../utils/clflags.cmx odoc_module.cmo : ../typing/types.cmi odoc_value.cmo odoc_types.cmi \ odoc_type.cmo odoc_name.cmi odoc_extension.cmo odoc_exception.cmo \ odoc_class.cmo @@ -212,12 +212,12 @@ odoc_texi.cmo : ../typing/types.cmi odoc_to_text.cmo odoc_messages.cmo \ odoc_info.cmi ../parsing/asttypes.cmi odoc_texi.cmx : ../typing/types.cmx odoc_to_text.cmx odoc_messages.cmx \ odoc_info.cmx ../parsing/asttypes.cmi -odoc_text_lexer.cmo : odoc_text_parser.cmi odoc_misc.cmi -odoc_text_lexer.cmx : odoc_text_parser.cmx odoc_misc.cmx odoc_text.cmo : odoc_types.cmi odoc_text_parser.cmi odoc_text_lexer.cmo \ odoc_text.cmi odoc_text.cmx : odoc_types.cmx odoc_text_parser.cmx odoc_text_lexer.cmx \ odoc_text.cmi +odoc_text_lexer.cmo : odoc_text_parser.cmi odoc_misc.cmi +odoc_text_lexer.cmx : odoc_text_parser.cmx odoc_misc.cmx odoc_text_parser.cmo : odoc_types.cmi odoc_misc.cmi odoc_text_parser.cmi odoc_text_parser.cmx : odoc_types.cmx odoc_misc.cmx odoc_text_parser.cmi odoc_to_text.cmo : odoc_module.cmo odoc_messages.cmo odoc_info.cmi @@ -236,8 +236,8 @@ odoc_analyse.cmi : odoc_module.cmo odoc_global.cmi odoc_args.cmi : odoc_gen.cmi odoc_ast.cmi : ../typing/types.cmi ../typing/typedtree.cmi \ ../parsing/parsetree.cmi odoc_sig.cmi odoc_name.cmi odoc_module.cmo -odoc_comments_global.cmi : odoc_comments.cmi : odoc_types.cmi odoc_module.cmo +odoc_comments_global.cmi : odoc_config.cmi : odoc_cross.cmi : odoc_types.cmi odoc_module.cmo odoc_dag2html.cmi : odoc_info.cmi diff --git a/otherlibs/bigarray/.depend b/otherlibs/bigarray/.depend index b46495862c..97c6fb7200 100644 --- a/otherlibs/bigarray/.depend +++ b/otherlibs/bigarray/.depend @@ -1,26 +1,27 @@ bigarray_stubs.o: bigarray_stubs.c ../../byterun/caml/alloc.h \ - ../../byterun/caml/misc.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/mlvalues.h bigarray.h ../../byterun/caml/config.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/custom.h \ - ../../byterun/caml/fail.h ../../byterun/caml/intext.h \ - ../../byterun/caml/io.h ../../byterun/caml/hash.h \ - ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h + ../../byterun/caml/misc.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/mlvalues.h bigarray.h ../../byterun/caml/config.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/custom.h \ + ../../byterun/caml/fail.h ../../byterun/caml/intext.h \ + ../../byterun/caml/io.h ../../byterun/caml/hash.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h mmap_unix.o: mmap_unix.c bigarray.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/config.h \ - ../../byterun/caml/misc.h ../../byterun/caml/custom.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ - ../../byterun/caml/io.h ../../byterun/caml/sys.h \ - ../../byterun/caml/signals.h + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/config.h \ + ../../byterun/caml/misc.h ../../byterun/caml/custom.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/io.h ../../byterun/caml/sys.h \ + ../../byterun/caml/signals.h mmap_win32.o: mmap_win32.c bigarray.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/config.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/custom.h \ - ../../byterun/caml/fail.h ../../byterun/caml/sys.h ../unix/unixsupport.h + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/config.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/custom.h \ + ../../byterun/caml/fail.h ../../byterun/caml/sys.h \ + ../unix/unixsupport.h bigarray.cmi : bigarray.cmo : bigarray.cmi bigarray.cmx : bigarray.cmi diff --git a/otherlibs/graph/.depend b/otherlibs/graph/.depend index ec14b350e5..48b345b714 100644 --- a/otherlibs/graph/.depend +++ b/otherlibs/graph/.depend @@ -1,70 +1,111 @@ -color.o: color.c libgraph.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h -draw.o: draw.c libgraph.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h -dump_img.o: dump_img.c libgraph.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h image.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ - ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ - ../../byterun/caml/address_class.h -events.o: events.c libgraph.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/signals.h -fill.o: fill.c libgraph.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h -image.o: image.c libgraph.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h image.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/custom.h -make_img.o: make_img.c libgraph.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h image.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h -open.o: open.c libgraph.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/callback.h \ - ../../byterun/caml/fail.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ - ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ - ../../byterun/caml/address_class.h -point_col.o: point_col.c libgraph.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h -sound.o: sound.c libgraph.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h -subwindow.o: subwindow.c libgraph.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h -text.o: text.c libgraph.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h +color.o: color.c libgraph.h \ + \ + \ + \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/compatibility.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/misc.h \ + +draw.o: draw.c libgraph.h \ + \ + \ + \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/compatibility.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/misc.h \ + ../../byterun/caml/alloc.h ../../byterun/caml/mlvalues.h +dump_img.o: dump_img.c libgraph.h \ + \ + \ + \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/compatibility.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/misc.h image.h \ + ../../byterun/caml/alloc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h +events.o: events.c libgraph.h \ + \ + \ + \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/compatibility.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/misc.h \ + ../../byterun/caml/alloc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/signals.h +fill.o: fill.c libgraph.h \ + \ + \ + \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/compatibility.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/misc.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h +image.o: image.c libgraph.h \ + \ + \ + \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/compatibility.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/misc.h image.h \ + ../../byterun/caml/alloc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/custom.h +make_img.o: make_img.c libgraph.h \ + \ + \ + \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/compatibility.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/misc.h image.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h +open.o: open.c libgraph.h \ + \ + \ + \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/compatibility.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/misc.h \ + ../../byterun/caml/alloc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/callback.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h +point_col.o: point_col.c libgraph.h \ + \ + \ + \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/compatibility.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/misc.h +sound.o: sound.c libgraph.h \ + \ + \ + \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/compatibility.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/misc.h +subwindow.o: subwindow.c libgraph.h \ + \ + \ + \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/compatibility.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/misc.h +text.o: text.c libgraph.h \ + \ + \ + \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/compatibility.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/misc.h \ + ../../byterun/caml/alloc.h ../../byterun/caml/mlvalues.h graphics.cmi : graphicsX11.cmi : graphics.cmo : graphics.cmi diff --git a/otherlibs/num/.depend b/otherlibs/num/.depend index c885abf051..ce7cc9b8cf 100644 --- a/otherlibs/num/.depend +++ b/otherlibs/num/.depend @@ -1,23 +1,23 @@ +bng.o: bng.c bng.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/compatibility.h bng_amd64.c bng_digit.c bng_amd64.o: bng_amd64.c bng_arm64.o: bng_arm64.c -bng.o: bng.c bng.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/compatibility.h bng_amd64.c bng_digit.c bng_digit.o: bng_digit.c bng_ia32.o: bng_ia32.c bng_ppc.o: bng_ppc.c bng_sparc.o: bng_sparc.c nat_stubs.o: nat_stubs.c ../../byterun/caml/alloc.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ - ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ - ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/config.h ../../byterun/caml/custom.h \ - ../../byterun/caml/intext.h ../../byterun/caml/io.h \ - ../../byterun/caml/fail.h ../../byterun/caml/hash.h \ - ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/mlvalues.h bng.h nat.h + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/config.h ../../byterun/caml/custom.h \ + ../../byterun/caml/intext.h ../../byterun/caml/io.h \ + ../../byterun/caml/fail.h ../../byterun/caml/hash.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/mlvalues.h bng.h nat.h arith_flags.cmi : arith_status.cmi : big_int.cmi : nat.cmi diff --git a/otherlibs/str/.depend b/otherlibs/str/.depend index 1d224311c0..148cb312b5 100644 --- a/otherlibs/str/.depend +++ b/otherlibs/str/.depend @@ -1,11 +1,11 @@ strstubs.o: strstubs.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ - ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ - ../../byterun/caml/address_class.h ../../byterun/caml/fail.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h ../../byterun/caml/fail.h str.cmi : str.cmo : str.cmi str.cmx : str.cmi diff --git a/otherlibs/systhreads/.depend b/otherlibs/systhreads/.depend index b9e1cabcf4..abe592e55d 100644 --- a/otherlibs/systhreads/.depend +++ b/otherlibs/systhreads/.depend @@ -1,17 +1,16 @@ st_stubs.o: st_stubs.c ../../byterun/caml/alloc.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ - ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ - ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/backtrace.h ../../byterun/caml/callback.h \ - ../../byterun/caml/custom.h ../../byterun/caml/fail.h \ - ../../byterun/caml/io.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ - ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ - ../../byterun/caml/address_class.h ../../byterun/caml/misc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/printexc.h \ - ../../byterun/caml/roots.h ../../byterun/caml/memory.h \ - ../../byterun/caml/signals.h ../../byterun/caml/stacks.h \ - ../../byterun/caml/sys.h threads.h st_posix.h + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/backtrace.h ../../byterun/caml/callback.h \ + ../../byterun/caml/custom.h ../../byterun/caml/fail.h \ + ../../byterun/caml/io.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h ../../byterun/caml/printexc.h \ + ../../byterun/caml/roots.h ../../byterun/caml/signals.h \ + ../../byterun/caml/stacks.h ../../byterun/caml/sys.h threads.h \ + st_posix.h condition.cmi : mutex.cmi event.cmi : mutex.cmi : diff --git a/otherlibs/threads/.depend b/otherlibs/threads/.depend index 2b70d942d0..aa869a6043 100644 --- a/otherlibs/threads/.depend +++ b/otherlibs/threads/.depend @@ -1,17 +1,17 @@ scheduler.o: scheduler.c ../../byterun/caml/alloc.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ - ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ - ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/backtrace.h ../../byterun/caml/callback.h \ - ../../byterun/caml/config.h ../../byterun/caml/fail.h \ - ../../byterun/caml/io.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ - ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ - ../../byterun/caml/address_class.h ../../byterun/caml/misc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/printexc.h \ - ../../byterun/caml/roots.h ../../byterun/caml/memory.h \ - ../../byterun/caml/signals.h ../../byterun/caml/stacks.h \ - ../../byterun/caml/sys.h + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/backtrace.h ../../byterun/caml/callback.h \ + ../../byterun/caml/config.h ../../byterun/caml/fail.h \ + ../../byterun/caml/io.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h ../../byterun/caml/misc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/printexc.h \ + ../../byterun/caml/roots.h ../../byterun/caml/memory.h \ + ../../byterun/caml/signals.h ../../byterun/caml/stacks.h \ + ../../byterun/caml/sys.h condition.cmi : mutex.cmi event.cmi : mutex.cmi : diff --git a/otherlibs/unix/.depend b/otherlibs/unix/.depend index 4f6a638740..f03f792ae4 100644 --- a/otherlibs/unix/.depend +++ b/otherlibs/unix/.depend @@ -1,644 +1,648 @@ accept.o: accept.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ - ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/signals.h unixsupport.h socketaddr.h \ - ../../byterun/caml/misc.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h access.o: access.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ - ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ - ../../byterun/caml/address_class.h ../../byterun/caml/signals.h \ - unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h ../../byterun/caml/signals.h \ + unixsupport.h addrofstr.o: addrofstr.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/fail.h unixsupport.h socketaddr.h \ - ../../byterun/caml/misc.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/fail.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h alarm.o: alarm.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h bind.o: bind.c ../../byterun/caml/fail.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ - ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ - ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/mlvalues.h unixsupport.h socketaddr.h \ - ../../byterun/caml/misc.h + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h chdir.o: chdir.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h chmod.o: chmod.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h chown.o: chown.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h chroot.o: chroot.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h close.o: close.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/signals.h \ - ../../byterun/caml/mlvalues.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/signals.h \ + ../../byterun/caml/mlvalues.h unixsupport.h closedir.o: closedir.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h connect.o: connect.c ../../byterun/caml/fail.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ - ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ - ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/signals.h unixsupport.h \ - socketaddr.h ../../byterun/caml/misc.h + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/signals.h \ + unixsupport.h socketaddr.h ../../byterun/caml/misc.h cst2constr.o: cst2constr.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/fail.h \ - ../../byterun/caml/mlvalues.h cst2constr.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/fail.h \ + ../../byterun/caml/mlvalues.h cst2constr.h cstringv.o: cstringv.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - unixsupport.h -dup2.o: dup2.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h dup.o: dup.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +dup2.o: dup2.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h envir.o: envir.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h errmsg.o: errmsg.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h execv.o: execv.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h execve.o: execve.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h execvp.o: execvp.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h exit.o: exit.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h fchmod.o: fchmod.c ../../byterun/caml/fail.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ - ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ - ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/signals.h \ + unixsupport.h fchown.o: fchown.c ../../byterun/caml/fail.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ - ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ - ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/signals.h \ + unixsupport.h fcntl.o: fcntl.c ../../byterun/caml/fail.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ - ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ - ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/mlvalues.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h fork.o: fork.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/debugger.h \ - ../../byterun/caml/mlvalues.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/debugger.h \ + ../../byterun/caml/mlvalues.h unixsupport.h ftruncate.o: ftruncate.c ../../byterun/caml/fail.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ - ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ - ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/io.h \ - ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/io.h \ + ../../byterun/caml/signals.h unixsupport.h getaddrinfo.o: getaddrinfo.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ - ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/misc.h ../../byterun/caml/signals.h unixsupport.h \ - cst2constr.h socketaddr.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/misc.h ../../byterun/caml/signals.h unixsupport.h \ + cst2constr.h socketaddr.h getcwd.o: getcwd.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h getegid.o: getegid.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h geteuid.o: geteuid.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h getgid.o: getgid.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h getgr.o: getgr.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/fail.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/fail.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h getgroups.o: getgroups.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h gethost.o: gethost.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ - ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/signals.h unixsupport.h socketaddr.h \ - ../../byterun/caml/misc.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h gethostname.o: gethostname.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h getlogin.o: getlogin.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h unixsupport.h getnameinfo.o: getnameinfo.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ - ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/signals.h unixsupport.h socketaddr.h \ - ../../byterun/caml/misc.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h getpeername.o: getpeername.c ../../byterun/caml/fail.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ - ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ - ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/mlvalues.h unixsupport.h socketaddr.h \ - ../../byterun/caml/misc.h + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h getpid.o: getpid.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h getppid.o: getppid.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h getproto.o: getproto.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ - ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h getpw.o: getpw.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ - ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ - ../../byterun/caml/address_class.h ../../byterun/caml/fail.h \ - unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h ../../byterun/caml/fail.h \ + unixsupport.h getserv.o: getserv.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ - ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h getsockname.o: getsockname.c ../../byterun/caml/fail.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ - ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ - ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/mlvalues.h unixsupport.h socketaddr.h \ - ../../byterun/caml/misc.h + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h gettimeofday.o: gettimeofday.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h getuid.o: getuid.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h gmtime.o: gmtime.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ - ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h initgroups.o: initgroups.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h isatty.o: isatty.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h itimer.o: itimer.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ - ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h kill.o: kill.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/fail.h \ - ../../byterun/caml/mlvalues.h unixsupport.h ../../byterun/caml/signals.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/fail.h \ + ../../byterun/caml/mlvalues.h unixsupport.h \ + ../../byterun/caml/signals.h link.o: link.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h listen.o: listen.c ../../byterun/caml/fail.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ - ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ - ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/mlvalues.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h lockf.o: lockf.c ../../byterun/caml/fail.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ - ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ - ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/signals.h \ + unixsupport.h lseek.o: lseek.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/io.h \ - ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/io.h \ + ../../byterun/caml/signals.h unixsupport.h mkdir.o: mkdir.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h mkfifo.o: mkfifo.c ../../byterun/caml/fail.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ - ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ - ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ - ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ - ../../byterun/caml/address_class.h ../../byterun/caml/signals.h \ - unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h ../../byterun/caml/signals.h \ + unixsupport.h nice.o: nice.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h open.o: open.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ - ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ - ../../byterun/caml/address_class.h ../../byterun/caml/misc.h \ - ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h ../../byterun/caml/misc.h \ + ../../byterun/caml/signals.h unixsupport.h opendir.o: opendir.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/alloc.h ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/alloc.h ../../byterun/caml/signals.h unixsupport.h pipe.o: pipe.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h unixsupport.h putenv.o: putenv.c ../../byterun/caml/fail.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ - ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ - ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/mlvalues.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/mlvalues.h unixsupport.h read.o: read.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h readdir.o: readdir.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/fail.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/fail.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/signals.h unixsupport.h readlink.o: readlink.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/alloc.h ../../byterun/caml/fail.h \ - ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/alloc.h ../../byterun/caml/fail.h \ + ../../byterun/caml/signals.h unixsupport.h rename.o: rename.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h rewinddir.o: rewinddir.c ../../byterun/caml/fail.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ - ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ - ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/mlvalues.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h rmdir.o: rmdir.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h select.o: select.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ - ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h sendrecv.o: sendrecv.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ - ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/signals.h unixsupport.h socketaddr.h \ - ../../byterun/caml/misc.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h setgid.o: setgid.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h setgroups.o: setgroups.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ - ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h setsid.o: setsid.c ../../byterun/caml/fail.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ - ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ - ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/mlvalues.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h setuid.o: setuid.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h shutdown.o: shutdown.c ../../byterun/caml/fail.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ - ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ - ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/mlvalues.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h signals.o: signals.c ../../byterun/caml/alloc.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ - ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ - ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/fail.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ - ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ - ../../byterun/caml/address_class.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/fail.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/signals.h unixsupport.h sleep.o: sleep.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/signals.h \ - ../../byterun/caml/mlvalues.h unixsupport.h -socketaddr.o: socketaddr.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ - ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ - ../../byterun/caml/address_class.h unixsupport.h socketaddr.h \ - ../../byterun/caml/misc.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/signals.h \ + ../../byterun/caml/mlvalues.h unixsupport.h socket.o: socket.c ../../byterun/caml/fail.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ - ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ - ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/mlvalues.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h +socketaddr.o: socketaddr.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h socketpair.o: socketpair.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h sockopt.o: sockopt.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/alloc.h ../../byterun/caml/fail.h unixsupport.h \ - socketaddr.h ../../byterun/caml/misc.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/alloc.h ../../byterun/caml/fail.h unixsupport.h \ + socketaddr.h ../../byterun/caml/misc.h stat.o: stat.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/alloc.h ../../byterun/caml/signals.h \ - ../../byterun/caml/io.h unixsupport.h cst2constr.h nanosecond_stat.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/alloc.h ../../byterun/caml/signals.h \ + ../../byterun/caml/io.h unixsupport.h cst2constr.h nanosecond_stat.h strofaddr.o: strofaddr.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h \ - socketaddr.h ../../byterun/caml/misc.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h \ + socketaddr.h ../../byterun/caml/misc.h symlink.o: symlink.c ../../byterun/caml/fail.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ - ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ - ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ - ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ - ../../byterun/caml/address_class.h ../../byterun/caml/signals.h \ - unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h ../../byterun/caml/signals.h \ + unixsupport.h termios.o: termios.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h time.o: time.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h unixsupport.h times.o: times.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ - ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ - ../../byterun/caml/address_class.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h unixsupport.h truncate.o: truncate.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/fail.h ../../byterun/caml/signals.h \ - ../../byterun/caml/io.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/fail.h ../../byterun/caml/signals.h \ + ../../byterun/caml/io.h unixsupport.h umask.o: umask.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h unixsupport.o: unixsupport.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/callback.h \ - ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/fail.h unixsupport.h cst2constr.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/callback.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/fail.h unixsupport.h cst2constr.h unlink.o: unlink.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h utimes.o: utimes.c ../../byterun/caml/fail.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ - ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ - ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ - ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ - ../../byterun/caml/address_class.h ../../byterun/caml/signals.h \ - unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h ../../byterun/caml/signals.h \ + unixsupport.h wait.o: wait.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ - ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ - ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/signals.h unixsupport.h + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h write.o: write.c ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ - ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ - ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ - ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ - ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ - ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ - ../../byterun/caml/signals.h unixsupport.h -unixLabels.cmi : unix.cmi + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h unix.cmi : -unixLabels.cmo : unix.cmi unixLabels.cmi -unixLabels.cmx : unix.cmx unixLabels.cmi +unixLabels.cmi : unix.cmi unix.cmo : unix.cmi unix.cmx : unix.cmi +unixLabels.cmo : unix.cmi unixLabels.cmi +unixLabels.cmx : unix.cmx unixLabels.cmi diff --git a/stdlib/.depend b/stdlib/.depend index 11f21a8fa0..96f95082d2 100644 --- a/stdlib/.depend +++ b/stdlib/.depend @@ -1,12 +1,12 @@ arg.cmi : -arrayLabels.cmi : array.cmi : +arrayLabels.cmi : buffer.cmi : -bytesLabels.cmi : bytes.cmi : +bytesLabels.cmi : callback.cmi : -camlinternalFormatBasics.cmi : camlinternalFormat.cmi : camlinternalFormatBasics.cmi buffer.cmi +camlinternalFormatBasics.cmi : camlinternalLazy.cmi : camlinternalMod.cmi : obj.cmi camlinternalOO.cmi : obj.cmi @@ -22,8 +22,8 @@ int32.cmi : int64.cmi : lazy.cmi : lexing.cmi : -listLabels.cmi : list.cmi : +listLabels.cmi : map.cmi : marshal.cmi : moreLabels.cmi : set.cmi map.cmi hashtbl.cmi @@ -43,32 +43,32 @@ stack.cmi : stdLabels.cmi : stringLabels.cmi listLabels.cmi bytesLabels.cmi \ arrayLabels.cmi stream.cmi : -stringLabels.cmi : string.cmi : +stringLabels.cmi : sys.cmi : weak.cmi : hashtbl.cmi arg.cmo : sys.cmi string.cmi printf.cmi list.cmi buffer.cmi array.cmi \ arg.cmi arg.cmx : sys.cmx string.cmx printf.cmx list.cmx buffer.cmx array.cmx \ arg.cmi -arrayLabels.cmo : array.cmi arrayLabels.cmi -arrayLabels.cmx : array.cmx arrayLabels.cmi array.cmo : array.cmi array.cmx : array.cmi +arrayLabels.cmo : array.cmi arrayLabels.cmi +arrayLabels.cmx : array.cmx arrayLabels.cmi buffer.cmo : sys.cmi string.cmi bytes.cmi buffer.cmi buffer.cmx : sys.cmx string.cmx bytes.cmx buffer.cmi -bytesLabels.cmo : bytes.cmi bytesLabels.cmi -bytesLabels.cmx : bytes.cmx bytesLabels.cmi bytes.cmo : pervasives.cmi list.cmi char.cmi bytes.cmi bytes.cmx : pervasives.cmx list.cmx char.cmx bytes.cmi +bytesLabels.cmo : bytes.cmi bytesLabels.cmi +bytesLabels.cmx : bytes.cmx bytesLabels.cmi callback.cmo : obj.cmi callback.cmi callback.cmx : obj.cmx callback.cmi -camlinternalFormatBasics.cmo : camlinternalFormatBasics.cmi -camlinternalFormatBasics.cmx : camlinternalFormatBasics.cmi camlinternalFormat.cmo : sys.cmi string.cmi char.cmi \ camlinternalFormatBasics.cmi bytes.cmi buffer.cmi camlinternalFormat.cmi camlinternalFormat.cmx : sys.cmx string.cmx char.cmx \ camlinternalFormatBasics.cmx bytes.cmx buffer.cmx camlinternalFormat.cmi +camlinternalFormatBasics.cmo : camlinternalFormatBasics.cmi +camlinternalFormatBasics.cmx : camlinternalFormatBasics.cmi camlinternalLazy.cmo : obj.cmi camlinternalLazy.cmi camlinternalLazy.cmx : obj.cmx camlinternalLazy.cmi camlinternalMod.cmo : obj.cmi camlinternalOO.cmi array.cmi \ @@ -111,10 +111,10 @@ lazy.cmo : obj.cmi camlinternalLazy.cmi lazy.cmi lazy.cmx : obj.cmx camlinternalLazy.cmx lazy.cmi lexing.cmo : sys.cmi string.cmi bytes.cmi array.cmi lexing.cmi lexing.cmx : sys.cmx string.cmx bytes.cmx array.cmx lexing.cmi -listLabels.cmo : list.cmi listLabels.cmi -listLabels.cmx : list.cmx listLabels.cmi list.cmo : list.cmi list.cmx : list.cmi +listLabels.cmo : list.cmi listLabels.cmi +listLabels.cmx : list.cmx listLabels.cmi map.cmo : map.cmi map.cmx : map.cmi marshal.cmo : bytes.cmi marshal.cmi @@ -157,18 +157,18 @@ sort.cmo : array.cmi sort.cmi sort.cmx : array.cmx sort.cmi stack.cmo : list.cmi stack.cmi stack.cmx : list.cmx stack.cmi -std_exit.cmo : -std_exit.cmx : stdLabels.cmo : stringLabels.cmi listLabels.cmi bytesLabels.cmi \ arrayLabels.cmi stdLabels.cmi stdLabels.cmx : stringLabels.cmx listLabels.cmx bytesLabels.cmx \ arrayLabels.cmx stdLabels.cmi +std_exit.cmo : +std_exit.cmx : stream.cmo : string.cmi obj.cmi list.cmi lazy.cmi bytes.cmi stream.cmi stream.cmx : string.cmx obj.cmx list.cmx lazy.cmx bytes.cmx stream.cmi -stringLabels.cmo : string.cmi stringLabels.cmi -stringLabels.cmx : string.cmx stringLabels.cmi string.cmo : pervasives.cmi list.cmi bytes.cmi string.cmi string.cmx : pervasives.cmx list.cmx bytes.cmx string.cmi +stringLabels.cmo : string.cmi stringLabels.cmi +stringLabels.cmx : string.cmx stringLabels.cmi sys.cmo : sys.cmi sys.cmx : sys.cmi weak.cmo : sys.cmi obj.cmi hashtbl.cmi array.cmi weak.cmi @@ -177,24 +177,24 @@ arg.cmo : sys.cmi string.cmi printf.cmi list.cmi buffer.cmi array.cmi \ arg.cmi arg.p.cmx : sys.p.cmx string.p.cmx printf.p.cmx list.p.cmx buffer.p.cmx array.p.cmx \ arg.cmi -arrayLabels.cmo : array.cmi arrayLabels.cmi -arrayLabels.p.cmx : array.p.cmx arrayLabels.cmi array.cmo : array.cmi array.p.cmx : array.cmi +arrayLabels.cmo : array.cmi arrayLabels.cmi +arrayLabels.p.cmx : array.p.cmx arrayLabels.cmi buffer.cmo : sys.cmi string.cmi bytes.cmi buffer.cmi buffer.p.cmx : sys.p.cmx string.p.cmx bytes.p.cmx buffer.cmi -bytesLabels.cmo : bytes.cmi bytesLabels.cmi -bytesLabels.p.cmx : bytes.p.cmx bytesLabels.cmi bytes.cmo : pervasives.cmi list.cmi char.cmi bytes.cmi bytes.p.cmx : pervasives.p.cmx list.p.cmx char.p.cmx bytes.cmi +bytesLabels.cmo : bytes.cmi bytesLabels.cmi +bytesLabels.p.cmx : bytes.p.cmx bytesLabels.cmi callback.cmo : obj.cmi callback.cmi callback.p.cmx : obj.p.cmx callback.cmi -camlinternalFormatBasics.cmo : camlinternalFormatBasics.cmi -camlinternalFormatBasics.p.cmx : camlinternalFormatBasics.cmi camlinternalFormat.cmo : sys.cmi string.cmi char.cmi \ camlinternalFormatBasics.cmi bytes.cmi buffer.cmi camlinternalFormat.cmi camlinternalFormat.p.cmx : sys.p.cmx string.p.cmx char.p.cmx \ camlinternalFormatBasics.p.cmx bytes.p.cmx buffer.p.cmx camlinternalFormat.cmi +camlinternalFormatBasics.cmo : camlinternalFormatBasics.cmi +camlinternalFormatBasics.p.cmx : camlinternalFormatBasics.cmi camlinternalLazy.cmo : obj.cmi camlinternalLazy.cmi camlinternalLazy.p.cmx : obj.p.cmx camlinternalLazy.cmi camlinternalMod.cmo : obj.cmi camlinternalOO.cmi array.cmi \ @@ -237,10 +237,10 @@ lazy.cmo : obj.cmi camlinternalLazy.cmi lazy.cmi lazy.p.cmx : obj.p.cmx camlinternalLazy.p.cmx lazy.cmi lexing.cmo : sys.cmi string.cmi bytes.cmi array.cmi lexing.cmi lexing.p.cmx : sys.p.cmx string.p.cmx bytes.p.cmx array.p.cmx lexing.cmi -listLabels.cmo : list.cmi listLabels.cmi -listLabels.p.cmx : list.p.cmx listLabels.cmi list.cmo : list.cmi list.p.cmx : list.cmi +listLabels.cmo : list.cmi listLabels.cmi +listLabels.p.cmx : list.p.cmx listLabels.cmi map.cmo : map.cmi map.p.cmx : map.cmi marshal.cmo : bytes.cmi marshal.cmi @@ -283,18 +283,18 @@ sort.cmo : array.cmi sort.cmi sort.p.cmx : array.p.cmx sort.cmi stack.cmo : list.cmi stack.cmi stack.p.cmx : list.p.cmx stack.cmi -std_exit.cmo : -std_exit.p.cmx : stdLabels.cmo : stringLabels.cmi listLabels.cmi bytesLabels.cmi \ arrayLabels.cmi stdLabels.cmi stdLabels.p.cmx : stringLabels.p.cmx listLabels.p.cmx bytesLabels.p.cmx \ arrayLabels.p.cmx stdLabels.cmi +std_exit.cmo : +std_exit.p.cmx : stream.cmo : string.cmi obj.cmi list.cmi lazy.cmi bytes.cmi stream.cmi stream.p.cmx : string.p.cmx obj.p.cmx list.p.cmx lazy.p.cmx bytes.p.cmx stream.cmi -stringLabels.cmo : string.cmi stringLabels.cmi -stringLabels.p.cmx : string.p.cmx stringLabels.cmi string.cmo : pervasives.cmi list.cmi bytes.cmi string.cmi string.p.cmx : pervasives.p.cmx list.p.cmx bytes.p.cmx string.cmi +stringLabels.cmo : string.cmi stringLabels.cmi +stringLabels.p.cmx : string.p.cmx stringLabels.cmi sys.cmo : sys.cmi sys.p.cmx : sys.cmi weak.cmo : sys.cmi obj.cmi hashtbl.cmi array.cmi weak.cmi diff --git a/tools/.depend b/tools/.depend index 810c439bba..c33f5c6f22 100644 --- a/tools/.depend +++ b/tools/.depend @@ -59,10 +59,10 @@ ocamldep.cmx : ../driver/pparse.cmx ../parsing/parsetree.cmi \ ../parsing/parse.cmx ../utils/misc.cmx ../parsing/longident.cmx \ ../parsing/location.cmx depend.cmx ../utils/config.cmx \ ../driver/compenv.cmx ../utils/clflags.cmx -ocamlmklibconfig.cmo : -ocamlmklibconfig.cmx : ocamlmklib.cmo : ocamlmklibconfig.cmo ocamlmklib.cmx : ocamlmklibconfig.cmx +ocamlmklibconfig.cmo : +ocamlmklibconfig.cmx : ocamlmktop.cmo : ../utils/ccomp.cmi ocamlmktop.cmx : ../utils/ccomp.cmx ocamloptp.cmo : ../driver/main_args.cmi From 25d3ef0d7b523e26914cf956f53b896066baab3c Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Thu, 10 Apr 2014 16:14:27 +0100 Subject: [PATCH 308/494] Use module_binding in Pexp_letmodule / Texp_letmodule --- bytecomp/translcore.ml | 2 +- parsing/ast_helper.ml | 2 +- parsing/ast_helper.mli | 2 +- parsing/ast_mapper.ml | 5 ++-- parsing/parser.mly | 8 +++--- parsing/parsetree.mli | 2 +- parsing/pprintast.ml | 62 +++++++++++++++++++---------------------- parsing/pprintast.mli | 1 + parsing/printast.ml | 6 ++-- tools/depend.ml | 4 +-- tools/ocamlprof.ml | 2 +- tools/tast_iter.ml | 4 +-- tools/untypeast.ml | 5 ++-- typing/printtyped.ml | 6 ++-- typing/typecore.ml | 20 +++++++------ typing/typedtree.ml | 2 +- typing/typedtree.mli | 2 +- typing/typedtreeIter.ml | 4 +-- typing/typedtreeMap.ml | 8 ++---- 19 files changed, 71 insertions(+), 76 deletions(-) diff --git a/bytecomp/translcore.ml b/bytecomp/translcore.ml index ef7d82cd0f..cda7321f64 100644 --- a/bytecomp/translcore.ml +++ b/bytecomp/translcore.ml @@ -849,7 +849,7 @@ and transl_exp0 e = Lsequence(transl_setinstvar (Lvar cpy) path expr, rem)) modifs (Lvar cpy)) - | Texp_letmodule(id, _, modl, body) -> + | Texp_letmodule({mb_id = id; mb_expr = modl}, body) -> Llet(Strict, id, !transl_module Tcoerce_none None modl, transl_exp body) | Texp_pack modl -> !transl_module Tcoerce_none None modl diff --git a/parsing/ast_helper.ml b/parsing/ast_helper.ml index b84cda8cdd..c7d86d66c7 100644 --- a/parsing/ast_helper.ml +++ b/parsing/ast_helper.ml @@ -107,7 +107,7 @@ module Exp = struct let new_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_new a) let setinstvar ?loc ?attrs a b = mk ?loc ?attrs (Pexp_setinstvar (a, b)) let override ?loc ?attrs a = mk ?loc ?attrs (Pexp_override a) - let letmodule ?loc ?attrs a b c= mk ?loc ?attrs (Pexp_letmodule (a, b, c)) + let letmodule ?loc ?attrs a b = mk ?loc ?attrs (Pexp_letmodule (a, b)) let assert_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_assert a) let lazy_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_lazy a) let poly ?loc ?attrs a b = mk ?loc ?attrs (Pexp_poly (a, b)) diff --git a/parsing/ast_helper.mli b/parsing/ast_helper.mli index 4dc96169f6..7139786bac 100644 --- a/parsing/ast_helper.mli +++ b/parsing/ast_helper.mli @@ -131,7 +131,7 @@ module Exp: val setinstvar: ?loc:loc -> ?attrs:attrs -> str -> expression -> expression val override: ?loc:loc -> ?attrs:attrs -> (str * expression) list -> expression - val letmodule: ?loc:loc -> ?attrs:attrs -> str -> module_expr -> expression + val letmodule: ?loc:loc -> ?attrs:attrs -> module_binding -> expression -> expression val assert_: ?loc:loc -> ?attrs:attrs -> expression -> expression val lazy_: ?loc:loc -> ?attrs:attrs -> expression -> expression diff --git a/parsing/ast_mapper.ml b/parsing/ast_mapper.ml index d57dabb90e..acee1fd111 100644 --- a/parsing/ast_mapper.ml +++ b/parsing/ast_mapper.ml @@ -360,9 +360,8 @@ module E = struct | Pexp_override sel -> override ~loc ~attrs (List.map (map_tuple (map_loc sub) (sub.expr sub)) sel) - | Pexp_letmodule (s, me, e) -> - letmodule ~loc ~attrs (map_loc sub s) (sub.module_expr sub me) - (sub.expr sub e) + | Pexp_letmodule (mb, e) -> + letmodule ~loc ~attrs (sub.module_binding sub mb) (sub.expr sub e) | Pexp_assert e -> assert_ ~loc ~attrs (sub.expr sub e) | Pexp_lazy e -> lazy_ ~loc ~attrs (sub.expr sub e) | Pexp_poly (e, t) -> diff --git a/parsing/parser.mly b/parsing/parser.mly index 863651c71b..98448657e7 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -1238,10 +1238,10 @@ expr: { $1 } | simple_expr simple_labeled_expr_list { mkexp(Pexp_apply($1, List.rev $2)) } - | let_bindings IN seq_expr - { expr_of_let_bindings $1 $3 } - | LET MODULE ext_attributes UIDENT module_binding_body IN seq_expr - { mkexp_attrs (Pexp_letmodule(mkrhs $4 4, $5, $7)) $3 } + | LET ext_attributes rec_flag let_bindings_no_attrs IN seq_expr + { mkexp_attrs (Pexp_let($3, List.rev $4, $6)) $2 } + | LET MODULE ext_attributes module_binding IN seq_expr + { mkexp_attrs (Pexp_letmodule($4, $6)) $3 } | LET OPEN override_flag ext_attributes mod_longident IN seq_expr { mkexp_attrs (Pexp_open($3, mkrhs $5 5, $7)) $4 } | FUNCTION ext_attributes opt_bar match_cases diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index 295e3eaa07..6cec44369d 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -292,7 +292,7 @@ and expression_desc = (* x <- 2 *) | Pexp_override of (string loc * expression) list (* {< x1 = E1; ...; Xn = En >} *) - | Pexp_letmodule of string loc * module_expr * expression + | Pexp_letmodule of module_binding * expression (* let module M = ME in E *) | Pexp_assert of expression (* assert E diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index 5e9b9455d0..1218808bc6 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -608,9 +608,9 @@ class printer ()= object(self:'self) pp f "@[<hov2>%s@ =@ %a@]" s.txt self#expression e in pp f "@[<hov2>{<%a>}@]" (self#list string_x_expression ~sep:";" ) l; - | Pexp_letmodule (s, me, e) -> - pp f "@[<hov2>let@ module@ %s@ =@ %a@ in@ %a@]" s.txt - self#reset#module_expr me self#expression e + | Pexp_letmodule (mb, e) -> + pp f "@[<hov2>let@ module@ %a@ in@ %a@]" + self#reset#module_binding mb self#expression e | Pexp_assert e -> pp f "@[<hov2>assert@ %a@]" self#simple_expr e | Pexp_lazy (e) -> @@ -888,6 +888,27 @@ class printer ()= object(self:'self) self#class_type ct | Pcl_extension e -> self#extension f e + method module_binding f x = + let rec module_helper me = match me.pmod_desc with + | Pmod_functor(s,mt,me) -> + if mt = None then pp f "()" + else Misc.may (pp f "(%s:%a)" s.txt self#module_type) mt; + module_helper me + | _ -> me in + pp f "%s%a" + x.pmb_name.txt + (fun f me -> + let me = module_helper me in + (match me.pmod_desc with + | Pmod_constraint + (me, + ({pmty_desc=(Pmty_ident (_) + | Pmty_signature (_));_} as mt)) -> + pp f " :@;%a@;=@;%a@;" self#module_type mt self#module_expr me + | _ -> + pp f " =@ %a" self#module_expr me + )) x.pmb_expr + method module_type f x = if x.pmty_attributes <> [] then begin pp f "((%a)%a)" self#module_type {x with pmty_attributes=[]} @@ -1113,36 +1134,11 @@ class printer ()= object(self:'self) | Pstr_typext te -> self#type_extension f te | Pstr_exception ed -> self#exception_declaration f ed | Pstr_module x -> - let rec module_helper me = - match me.pmod_desc with - | Pmod_functor(s,mt,me') when me.pmod_attributes = [] -> - if mt = None then pp f "()" - else Misc.may (pp f "(%s:%a)" s.txt self#module_type) mt; - module_helper me' - | _ -> me - in - pp f "@[<hov2>module %s%a@]%a" - x.pmb_name.txt - (fun f me -> - let me = module_helper me in - (match me.pmod_desc with - | Pmod_constraint - (me', - ({pmty_desc=(Pmty_ident (_) - | Pmty_signature (_));_} as mt)) - when me.pmod_attributes = [] -> - pp f " :@;%a@;=@;%a@;" self#module_type mt self#module_expr me' - | _ -> - pp f " =@ %a" self#module_expr me - )) x.pmb_expr - self#item_attributes x.pmb_attributes - | Pstr_open od -> - pp f "@[<2>open%s@;%a@]%a" - (override od.popen_override) - self#longident_loc od.popen_lid - self#item_attributes od.popen_attributes - | Pstr_modtype {pmtd_name=s; pmtd_type=md; pmtd_attributes=attrs} -> - pp f "@[<hov2>module@ type@ %s%a@]%a" + pp f "@[<hov2>module@ %a@]" self#module_binding x + | Pstr_open (ovf, li, _attrs) -> + pp f "@[<2>open%s@;%a@]" (override ovf) self#longident_loc li; + | Pstr_modtype {pmtd_name=s; pmtd_type=md} -> + pp f "@[<hov2>module@ type@ %s%a@]" s.txt (fun f md -> match md with | None -> () diff --git a/parsing/pprintast.mli b/parsing/pprintast.mli index 45556b84e4..e8dd92cbb4 100644 --- a/parsing/pprintast.mli +++ b/parsing/pprintast.mli @@ -64,6 +64,7 @@ class printer : method longident : Format.formatter -> Longident.t -> unit method longident_loc : Format.formatter -> Longident.t Asttypes.loc -> unit + method module_binding : Format.formatter -> Parsetree.module_binding -> unit method module_expr : Format.formatter -> Parsetree.module_expr -> unit method module_type : Format.formatter -> Parsetree.module_type -> unit method mutable_flag : Format.formatter -> Asttypes.mutable_flag -> unit diff --git a/parsing/printast.ml b/parsing/printast.ml index cb94856ae7..bd476d0917 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -329,9 +329,9 @@ and expression i ppf x = | Pexp_override (l) -> line i ppf "Pexp_override\n"; list i string_x_expression ppf l; - | Pexp_letmodule (s, me, e) -> - line i ppf "Pexp_letmodule %a\n" fmt_string_loc s; - module_expr i ppf me; + | Pexp_letmodule (mb, e) -> + line i ppf "Pexp_letmodule\n"; + module_binding i ppf mb; expression i ppf e; | Pexp_assert (e) -> line i ppf "Pexp_assert\n"; diff --git a/tools/depend.ml b/tools/depend.ml index aeb121cbc8..f9fb9100d6 100644 --- a/tools/depend.ml +++ b/tools/depend.ml @@ -184,8 +184,8 @@ let rec add_expr bv exp = | Pexp_new li -> add bv li | Pexp_setinstvar(_v, e) -> add_expr bv e | Pexp_override sel -> List.iter (fun (_s, e) -> add_expr bv e) sel - | Pexp_letmodule(id, m, e) -> - add_module bv m; add_expr (StringSet.add id.txt bv) e + | Pexp_letmodule(x, e) -> + add_module bv x.pmb_expr; add_expr (StringSet.add x.pmb_name.txt bv) e | Pexp_assert (e) -> add_expr bv e | Pexp_lazy (e) -> add_expr bv e | Pexp_poly (e, t) -> add_expr bv e; add_opt add_type bv t diff --git a/tools/ocamlprof.ml b/tools/ocamlprof.ml index dde248cd48..44d6c22197 100644 --- a/tools/ocamlprof.ml +++ b/tools/ocamlprof.ml @@ -277,7 +277,7 @@ and rw_exp iflag sexp = | Pexp_override l -> List.iter (fun (_, sexp) -> rewrite_exp iflag sexp) l - | Pexp_letmodule (_, smod, sexp) -> + | Pexp_letmodule ({pmb_expr = smod}, sexp) -> rewrite_mod iflag smod; rewrite_exp iflag sexp diff --git a/tools/tast_iter.ml b/tools/tast_iter.ml index 791fb6a513..6afbe8cd00 100644 --- a/tools/tast_iter.ml +++ b/tools/tast_iter.ml @@ -158,8 +158,8 @@ let expression sub exp = sub # expression exp | Texp_override (_, list) -> List.iter (fun (_path, _, exp) -> sub # expression exp) list - | Texp_letmodule (_id, _, mexpr, exp) -> - sub # module_expr mexpr; + | Texp_letmodule (mb, exp) -> + sub # module_binding mb; sub # expression exp | Texp_assert exp -> sub # expression exp | Texp_lazy exp -> sub # expression exp diff --git a/tools/untypeast.ml b/tools/untypeast.ml index a8b992ef14..49b23452d4 100644 --- a/tools/untypeast.ml +++ b/tools/untypeast.ml @@ -341,9 +341,8 @@ and untype_expression exp = Pexp_override (List.map (fun (_path, lid, exp) -> lid, untype_expression exp ) list) - | Texp_letmodule (_id, name, mexpr, exp) -> - Pexp_letmodule (name, untype_module_expr mexpr, - untype_expression exp) + | Texp_letmodule (mb, exp) -> + Pexp_letmodule (untype_module_binding mb, untype_expression exp) | Texp_assert exp -> Pexp_assert (untype_expression exp) | Texp_lazy exp -> Pexp_lazy (untype_expression exp) | Texp_object (cl, _) -> diff --git a/typing/printtyped.ml b/typing/printtyped.ml index 0e97e586bb..1c2b5dbdf0 100644 --- a/typing/printtyped.ml +++ b/typing/printtyped.ml @@ -356,9 +356,9 @@ and expression i ppf x = | Texp_override (_, l) -> line i ppf "Pexp_override\n"; list i string_x_expression ppf l; - | Texp_letmodule (s, _, me, e) -> - line i ppf "Pexp_letmodule \"%a\"\n" fmt_ident s; - module_expr i ppf me; + | Texp_letmodule (mb, e) -> + line i ppf "Pexp_letmodule\n"; + module_binding i ppf mb; expression i ppf e; | Texp_assert (e) -> line i ppf "Pexp_assert"; diff --git a/typing/typecore.ml b/typing/typecore.ml index d237cfe66f..13b4a2e209 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -156,7 +156,7 @@ let iter_expression f e = | Pexp_ifthenelse (e1, e2, eo) -> expr e1; expr e2; may expr eo | Pexp_for (_, e1, e2, _, e3) -> expr e1; expr e2; expr e3 | Pexp_override sel -> List.iter (fun (_, e) -> expr e) sel - | Pexp_letmodule (_, me, e) -> expr e; module_expr me + | Pexp_letmodule ({pmb_expr = me}, e) -> expr e; module_expr me | Pexp_object { pcstr_fields = fs } -> List.iter class_field fs | Pexp_pack me -> module_expr me @@ -1432,8 +1432,8 @@ let rec is_nonexpansive exp = Vars.fold (fun _ (mut,_,_) b -> decr count; b && mut = Immutable) vars true && !count = 0 - | Texp_letmodule (_, _, mexp, e) -> - is_nonexpansive_mod mexp && is_nonexpansive e + | Texp_letmodule (mb, e) -> + is_nonexpansive_mod mb.mb_expr && is_nonexpansive e | Texp_pack mexp -> is_nonexpansive_mod mexp | _ -> false @@ -1609,9 +1609,10 @@ let create_package_type loc env (p, l) = List.fold_left (fun sexp (name, loc) -> Exp.letmodule ~loc:sexp.pexp_loc - name - (Mod.unpack ~loc - (Exp.ident ~loc:name.loc (mkloc (Longident.Lident name.txt) name.loc))) + (Mb.mk ~loc name + (Mod.unpack ~loc + (Exp.ident ~loc:name.loc + (mkloc (Longident.Lident name.txt) name.loc)))) sexp ) sexp unpacks @@ -2493,7 +2494,8 @@ and type_expect_ ?in_function env sexp ty_expected = | _ -> assert false end - | Pexp_letmodule(name, smodl, sbody) -> + | Pexp_letmodule({pmb_name = name; pmb_expr = smodl; + pmb_attributes; pmb_loc}, sbody) -> let ty = newvar() in (* remember original level *) begin_def (); @@ -2516,8 +2518,10 @@ and type_expect_ ?in_function env sexp ty_expected = with Unify _ -> raise(Error(loc, env, Scoping_let_module(name.txt, body.exp_type))) end; + let mb = { mb_id = id; mb_name = name; mb_expr = modl; + mb_attributes = pmb_attributes; mb_loc = pmb_loc } in re { - exp_desc = Texp_letmodule(id, name, modl, body); + exp_desc = Texp_letmodule (mb, body); exp_loc = loc; exp_extra = []; exp_type = ty; exp_attributes = sexp.pexp_attributes; diff --git a/typing/typedtree.ml b/typing/typedtree.ml index ecd0f132ee..0feb62196b 100644 --- a/typing/typedtree.ml +++ b/typing/typedtree.ml @@ -100,7 +100,7 @@ and expression_desc = | Texp_instvar of Path.t * Path.t * string loc | Texp_setinstvar of Path.t * Path.t * string loc * expression | Texp_override of Path.t * (Path.t * string loc * expression) list - | Texp_letmodule of Ident.t * string loc * module_expr * expression + | Texp_letmodule of module_binding * expression | Texp_assert of expression | Texp_lazy of expression | Texp_object of class_structure * string list diff --git a/typing/typedtree.mli b/typing/typedtree.mli index c4feae1d86..947c34c257 100644 --- a/typing/typedtree.mli +++ b/typing/typedtree.mli @@ -99,7 +99,7 @@ and expression_desc = | Texp_instvar of Path.t * Path.t * string loc | Texp_setinstvar of Path.t * Path.t * string loc * expression | Texp_override of Path.t * (Path.t * string loc * expression) list - | Texp_letmodule of Ident.t * string loc * module_expr * expression + | Texp_letmodule of module_binding * expression | Texp_assert of expression | Texp_lazy of expression | Texp_object of class_structure * string list diff --git a/typing/typedtreeIter.ml b/typing/typedtreeIter.ml index 4b829067c2..ff28e1317f 100644 --- a/typing/typedtreeIter.ml +++ b/typing/typedtreeIter.ml @@ -342,8 +342,8 @@ module MakeIterator(Iter : IteratorArgument) : sig List.iter (fun (path, _, exp) -> iter_expression exp ) list - | Texp_letmodule (id, _, mexpr, exp) -> - iter_module_expr mexpr; + | Texp_letmodule (mb, exp) -> + iter_module_binding mb; iter_expression exp | Texp_assert exp -> iter_expression exp | Texp_lazy exp -> iter_expression exp diff --git a/typing/typedtreeMap.ml b/typing/typedtreeMap.ml index b5ca25b178..c31da631c2 100644 --- a/typing/typedtreeMap.ml +++ b/typing/typedtreeMap.ml @@ -356,12 +356,8 @@ module MakeMap(Map : MapArgument) = struct (path, lid, map_expression exp) ) list ) - | Texp_letmodule (id, name, mexpr, exp) -> - Texp_letmodule ( - id, name, - map_module_expr mexpr, - map_expression exp - ) + | Texp_letmodule (mb, exp) -> + Texp_letmodule (map_module_binding mb, map_expression exp) | Texp_assert exp -> Texp_assert (map_expression exp) | Texp_lazy exp -> Texp_lazy (map_expression exp) | Texp_object (cl, string_list) -> From 4b03a6c341e4edf12b4a676fd2cd72233c862e32 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 28 Mar 2014 14:22:02 +0000 Subject: [PATCH 309/494] Introduce Asttypes.arrow_flag to encode labelled arguments --- bytecomp/translcore.mli | 2 +- ocamldoc/odoc_info.mli | 4 +- ocamldoc/odoc_misc.ml | 4 ++ ocamldoc/odoc_misc.mli | 8 +++- ocamldoc/odoc_str.ml | 6 +-- ocamldoc/odoc_value.ml | 16 ++----- parsing/ast_helper.mli | 14 +++--- parsing/asttypes.mli | 6 ++- parsing/parser.mly | 80 +++++++++++++++++------------------ parsing/parsetree.mli | 12 +++--- parsing/pprintast.ml | 94 ++++++++++++++++++++--------------------- parsing/pprintast.mli | 8 ++-- parsing/printast.ml | 17 +++++--- tools/untypeast.ml | 2 +- toplevel/trace.ml | 6 ++- typing/btype.ml | 27 +++++++++--- typing/btype.mli | 12 +++--- typing/ctype.ml | 4 +- typing/ctype.mli | 2 +- typing/printtyp.ml | 29 ++++++++++--- typing/printtyped.ml | 14 +++--- typing/typeclass.ml | 24 ++++++----- typing/typeclass.mli | 2 +- typing/typecore.ml | 54 +++++++++++------------ typing/typecore.mli | 6 +-- typing/typedtree.ml | 15 +++---- typing/typedtree.mli | 15 +++---- typing/types.ml | 4 +- typing/types.mli | 4 +- 29 files changed, 266 insertions(+), 225 deletions(-) diff --git a/bytecomp/translcore.mli b/bytecomp/translcore.mli index 70f700fcee..8d6bd8696c 100644 --- a/bytecomp/translcore.mli +++ b/bytecomp/translcore.mli @@ -18,7 +18,7 @@ open Typedtree open Lambda val transl_exp: expression -> lambda -val transl_apply: lambda -> (label * expression option * optional) list +val transl_apply: lambda -> (arrow_flag * expression option * optional) list -> Location.t -> lambda val transl_let: rec_flag -> value_binding list -> lambda -> lambda val transl_primitive: Location.t -> Primitive.description -> lambda diff --git a/ocamldoc/odoc_info.mli b/ocamldoc/odoc_info.mli index e9a9705c7f..afb30d5974 100644 --- a/ocamldoc/odoc_info.mli +++ b/ocamldoc/odoc_info.mli @@ -774,11 +774,11 @@ val create_index_lists : 'a list -> ('a -> string) -> 'a list list val remove_option : Types.type_expr -> Types.type_expr (** Return [true] if the given label is optional.*) -val is_optional : string -> bool +val is_optional : Asttypes.arrow_flag -> bool (** Return the label name for the given label, i.e. removes the beginning '?' if present.*) -val label_name : string -> string +val label_name : Asttypes.arrow_flag -> string (** Return the given name where the module name or part of it was removed, according to the list of modules diff --git a/ocamldoc/odoc_misc.ml b/ocamldoc/odoc_misc.ml index e938dbe679..46027c5ec1 100644 --- a/ocamldoc/odoc_misc.ml +++ b/ocamldoc/odoc_misc.ml @@ -471,6 +471,10 @@ let create_index_lists elements string_of_ele = let is_optional = Btype.is_optional let label_name = Btype.label_name +let label_prefix = function + | Asttypes.Simple -> "" + | Asttypes.Optional s -> "?" ^ s ^ ":" + | Asttypes.Labelled s -> s ^ ":" let remove_option typ = let rec iter t = diff --git a/ocamldoc/odoc_misc.mli b/ocamldoc/odoc_misc.mli index 5958be91db..22cffd1973 100644 --- a/ocamldoc/odoc_misc.mli +++ b/ocamldoc/odoc_misc.mli @@ -107,8 +107,12 @@ val search_string_backward : pat: string -> s: string -> int val remove_option : Types.type_expr -> Types.type_expr (** Return [true] if the given label is optional.*) -val is_optional : string -> bool +val is_optional : Asttypes.arrow_flag -> bool (** Return the label name for the given label, i.e. removes the beginning '?' if present.*) -val label_name : string -> string +val label_name : Asttypes.arrow_flag -> string + +(** Return the string to print when label is prefixing a type + i.e. appends ':' if label is non-empty .*) +val label_prefix : Asttypes.arrow_flag -> string diff --git a/ocamldoc/odoc_str.ml b/ocamldoc/odoc_str.ml index 7d99ff1079..8a724950e4 100644 --- a/ocamldoc/odoc_str.ml +++ b/ocamldoc/odoc_str.ml @@ -146,11 +146,7 @@ let string_of_class_params c = Types.Cty_arrow (label, t, ctype) -> let parent = is_arrow_type t in Printf.bprintf b "%s%s%s%s -> " - ( - match label with - "" -> "" - | s -> s^":" - ) + (Odoc_misc.label_prefix label) (if parent then "(" else "") (Odoc_print.string_of_type_expr (if Odoc_misc.is_optional label then diff --git a/ocamldoc/odoc_value.ml b/ocamldoc/odoc_value.ml index b35f2c6b52..c326da8a05 100644 --- a/ocamldoc/odoc_value.ml +++ b/ocamldoc/odoc_value.ml @@ -95,26 +95,18 @@ let parameter_list_from_arrows typ = so there is nothing to merge. With this dummy list we can merge the parameter names from the .ml and the type from the .mli file. *) let dummy_parameter_list typ = - let normal_name s = - match s with - "" -> s - | _ -> - match s.[0] with - '?' -> String.sub s 1 ((String.length s) - 1) - | _ -> s - in Printtyp.mark_loops typ; let liste_param = parameter_list_from_arrows typ in let rec iter (label, t) = match t.Types.desc with | Types.Ttuple l -> - if label = "" then + if label = Asttypes.Simple then Odoc_parameter.Tuple - (List.map (fun t2 -> iter ("", t2)) l, t) + (List.map (fun t2 -> iter (Asttypes.Simple, t2)) l, t) else (* if there is a label, then we don't want to decompose the tuple *) Odoc_parameter.Simple_name - { Odoc_parameter.sn_name = normal_name label ; + { Odoc_parameter.sn_name = Odoc_misc.label_name label ; Odoc_parameter.sn_type = t ; Odoc_parameter.sn_text = None } | Types.Tlink t2 @@ -123,7 +115,7 @@ let dummy_parameter_list typ = | _ -> Odoc_parameter.Simple_name - { Odoc_parameter.sn_name = normal_name label ; + { Odoc_parameter.sn_name = Odoc_misc.label_name label ; Odoc_parameter.sn_type = t ; Odoc_parameter.sn_text = None } in diff --git a/parsing/ast_helper.mli b/parsing/ast_helper.mli index 7139786bac..85a3215b28 100644 --- a/parsing/ast_helper.mli +++ b/parsing/ast_helper.mli @@ -40,7 +40,7 @@ module Typ : val any: ?loc:loc -> ?attrs:attrs -> unit -> core_type val var: ?loc:loc -> ?attrs:attrs -> string -> core_type - val arrow: ?loc:loc -> ?attrs:attrs -> label -> core_type -> core_type + val arrow: ?loc:loc -> ?attrs:attrs -> arrow_flag -> core_type -> core_type -> core_type val tuple: ?loc:loc -> ?attrs:attrs -> core_type list -> core_type val constr: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> core_type @@ -95,11 +95,11 @@ module Exp: val constant: ?loc:loc -> ?attrs:attrs -> constant -> expression val let_: ?loc:loc -> ?attrs:attrs -> rec_flag -> value_binding list -> expression -> expression - val fun_: ?loc:loc -> ?attrs:attrs -> label -> expression option -> pattern - -> expression -> expression + val fun_: ?loc:loc -> ?attrs:attrs -> arrow_flag -> expression option + -> pattern -> expression -> expression val function_: ?loc:loc -> ?attrs:attrs -> case list -> expression val apply: ?loc:loc -> ?attrs:attrs -> expression - -> (label * expression) list -> expression + -> (arrow_flag * expression) list -> expression val match_: ?loc:loc -> ?attrs:attrs -> expression -> case list -> expression val try_: ?loc:loc -> ?attrs:attrs -> expression -> case list -> expression @@ -313,7 +313,7 @@ module Cty: val constr: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> class_type val signature: ?loc:loc -> ?attrs:attrs -> class_signature -> class_type - val arrow: ?loc:loc -> ?attrs:attrs -> label -> core_type -> class_type -> class_type + val arrow: ?loc:loc -> ?attrs:attrs -> arrow_flag -> core_type -> class_type -> class_type val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_type end @@ -341,8 +341,8 @@ module Cl: val constr: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> class_expr val structure: ?loc:loc -> ?attrs:attrs -> class_structure -> class_expr - val fun_: ?loc:loc -> ?attrs:attrs -> label -> expression option -> pattern -> class_expr -> class_expr - val apply: ?loc:loc -> ?attrs:attrs -> class_expr -> (label * expression) list -> class_expr + val fun_: ?loc:loc -> ?attrs:attrs -> arrow_flag -> expression option -> pattern -> class_expr -> class_expr + val apply: ?loc:loc -> ?attrs:attrs -> class_expr -> (arrow_flag * expression) list -> class_expr val let_: ?loc:loc -> ?attrs:attrs -> rec_flag -> value_binding list -> class_expr -> class_expr val constraint_: ?loc:loc -> ?attrs:attrs -> class_expr -> class_type -> class_expr val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_expr diff --git a/parsing/asttypes.mli b/parsing/asttypes.mli index b212a2b9a7..41fc9b4d9b 100644 --- a/parsing/asttypes.mli +++ b/parsing/asttypes.mli @@ -42,8 +42,12 @@ type 'a loc = 'a Location.loc = { loc : Location.t; } - type variance = | Covariant | Contravariant | Invariant + +type arrow_flag = + | Simple (* T -> ... *) + | Labelled of string (* label:T -> ... *) + | Optional of string (* ?label:T -> ... *) diff --git a/parsing/parser.mly b/parsing/parser.mly index 98448657e7..869d9e1de8 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -76,7 +76,7 @@ let ghunit () = ghexp (Pexp_construct (mknoloc (Lident "()"), None)) let mkinfix arg1 name arg2 = - mkexp(Pexp_apply(mkoperator name 2, ["", arg1; "", arg2])) + mkexp(Pexp_apply(mkoperator name 2, [Simple, arg1; Simple, arg2])) let neg_float_string f = if String.length f > 0 && f.[0] = '-' @@ -96,7 +96,7 @@ let mkuminus name arg = | ("-" | "-."), Pexp_constant(Const_float f) -> mkexp(Pexp_constant(Const_float(neg_float_string f))) | _ -> - mkexp(Pexp_apply(mkoperator ("~" ^ name) 1, ["", arg])) + mkexp(Pexp_apply(mkoperator ("~" ^ name) 1, [Simple, arg])) let mkuplus name arg = let desc = arg.pexp_desc in @@ -107,7 +107,7 @@ let mkuplus name arg = | "+", Pexp_constant(Const_nativeint _) | ("+" | "+."), Pexp_constant(Const_float _) -> mkexp desc | _ -> - mkexp(Pexp_apply(mkoperator ("~" ^ name) 1, ["", arg])) + mkexp(Pexp_apply(mkoperator ("~" ^ name) 1, [Simple, arg])) let mkexp_cons consloc args loc = Exp.mk ~loc (Pexp_construct(mkloc (Lident "::") consloc, Some args)) @@ -180,34 +180,34 @@ let bigarray_get arr arg = match bigarray_untuplify arg with [c1] -> mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array1" get)), - ["", arr; "", c1])) + [Simple, arr; Simple, c1])) | [c1;c2] -> mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array2" get)), - ["", arr; "", c1; "", c2])) + [Simple, arr; Simple, c1; Simple, c2])) | [c1;c2;c3] -> mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array3" get)), - ["", arr; "", c1; "", c2; "", c3])) + [Simple, arr; Simple, c1; Simple, c2; Simple, c3])) | coords -> mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Genarray" "get")), - ["", arr; "", ghexp(Pexp_array coords)])) + [Simple, arr; Simple, ghexp(Pexp_array coords)])) let bigarray_set arr arg newval = let set = if !Clflags.fast then "unsafe_set" else "set" in match bigarray_untuplify arg with [c1] -> mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array1" set)), - ["", arr; "", c1; "", newval])) + [Simple, arr; Simple, c1; Simple, newval])) | [c1;c2] -> mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array2" set)), - ["", arr; "", c1; "", c2; "", newval])) + [Simple, arr; Simple, c1; Simple, c2; Simple, newval])) | [c1;c2;c3] -> mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array3" set)), - ["", arr; "", c1; "", c2; "", c3; "", newval])) + [Simple, arr; Simple, c1; Simple, c2; Simple, c3; Simple, newval])) | coords -> mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Genarray" "set")), - ["", arr; - "", ghexp(Pexp_array coords); - "", newval])) + [Simple, arr; + Simple, ghexp(Pexp_array coords); + Simple, newval])) let lapply p1 p2 = if !Clflags.applicative_functors @@ -1082,13 +1082,13 @@ class_type: { $1 } | QUESTION LIDENT COLON simple_core_type_or_tuple_no_attr MINUSGREATER class_type - { mkcty(Pcty_arrow("?" ^ $2 , mkoption $4, $6)) } + { mkcty(Pcty_arrow(Optional $2 , mkoption $4, $6)) } | OPTLABEL simple_core_type_or_tuple_no_attr MINUSGREATER class_type - { mkcty(Pcty_arrow("?" ^ $1, mkoption $2, $4)) } + { mkcty(Pcty_arrow(Optional $1, mkoption $2, $4)) } | LIDENT COLON simple_core_type_or_tuple_no_attr MINUSGREATER class_type - { mkcty(Pcty_arrow($1, $3, $5)) } + { mkcty(Pcty_arrow(Labelled $1, $3, $5)) } | simple_core_type_or_tuple_no_attr MINUSGREATER class_type - { mkcty(Pcty_arrow("", $1, $3)) } + { mkcty(Pcty_arrow(Simple, $1, $3)) } ; class_signature: LBRACKET core_type_comma_list RBRACKET clty_longident @@ -1194,21 +1194,21 @@ seq_expr: ; labeled_simple_pattern: QUESTION LPAREN label_let_pattern opt_default RPAREN - { ("?" ^ fst $3, $4, snd $3) } + { (Optional (fst $3), $4, snd $3) } | QUESTION label_var - { ("?" ^ fst $2, None, snd $2) } + { (Optional (fst $2), None, snd $2) } | OPTLABEL LPAREN let_pattern opt_default RPAREN - { ("?" ^ $1, $4, $3) } + { (Optional $1, $4, $3) } | OPTLABEL pattern_var - { ("?" ^ $1, None, $2) } + { (Optional $1, None, $2) } | TILDE LPAREN label_let_pattern RPAREN - { (fst $3, None, snd $3) } + { (Labelled (fst $3), None, snd $3) } | TILDE label_var - { (fst $2, None, snd $2) } + { (Labelled (fst $2), None, snd $2) } | LABEL simple_pattern - { ($1, None, $2) } + { (Labelled $1, None, $2) } | simple_pattern - { ("", None, $1) } + { (Simple, None, $1) } ; pattern_var: LIDENT { mkpat(Ppat_var (mkrhs $1 1)) } @@ -1324,10 +1324,10 @@ expr: { mkexp(Pexp_setfield($1, mkrhs $3 3, $5)) } | simple_expr DOT LPAREN seq_expr RPAREN LESSMINUS expr { mkexp(Pexp_apply(ghexp(Pexp_ident(array_function "Array" "set")), - ["",$1; "",$4; "",$7])) } + [Simple,$1; Simple,$4; Simple,$7])) } | simple_expr DOT LBRACKET seq_expr RBRACKET LESSMINUS expr { mkexp(Pexp_apply(ghexp(Pexp_ident(array_function "String" "set")), - ["",$1; "",$4; "",$7])) } + [Simple,$1; Simple,$4; Simple,$7])) } | simple_expr DOT LBRACE expr RBRACE LESSMINUS expr { bigarray_set $1 $4 $7 } | label LESSMINUS expr @@ -1373,12 +1373,12 @@ simple_expr: { unclosed "(" 3 ")" 5 } | simple_expr DOT LPAREN seq_expr RPAREN { mkexp(Pexp_apply(ghexp(Pexp_ident(array_function "Array" "get")), - ["",$1; "",$4])) } + [Simple,$1; Simple,$4])) } | simple_expr DOT LPAREN seq_expr error { unclosed "(" 3 ")" 5 } | simple_expr DOT LBRACKET seq_expr RBRACKET { mkexp(Pexp_apply(ghexp(Pexp_ident(array_function "String" "get")), - ["",$1; "",$4])) } + [Simple,$1; Simple,$4])) } | simple_expr DOT LBRACKET seq_expr error { unclosed "[" 3 "]" 5 } | simple_expr DOT LBRACE expr RBRACE @@ -1415,9 +1415,9 @@ simple_expr: | mod_longident DOT LBRACKET expr_semi_list opt_semi error { unclosed "[" 3 "]" 6 } | PREFIXOP simple_expr - { mkexp(Pexp_apply(mkoperator $1 1, ["",$2])) } + { mkexp(Pexp_apply(mkoperator $1 1, [Simple,$2])) } | BANG simple_expr - { mkexp(Pexp_apply(mkoperator "!" 1, ["",$2])) } + { mkexp(Pexp_apply(mkoperator "!" 1, [Simple,$2])) } | NEW ext_attributes class_longident { mkexp_attrs (Pexp_new(mkrhs $3 3)) $2 } | LBRACELESS field_expr_list opt_semi GREATERRBRACE @@ -1458,19 +1458,19 @@ simple_labeled_expr_list: ; labeled_simple_expr: simple_expr %prec below_SHARP - { ("", $1) } + { (Simple, $1) } | label_expr { $1 } ; label_expr: LABEL simple_expr %prec below_SHARP - { ($1, $2) } + { (Labelled $1, $2) } | TILDE label_ident - { $2 } + { (Labelled (fst $2), snd $2) } | QUESTION label_ident - { ("?" ^ fst $2, snd $2) } + { (Optional (fst $2), snd $2) } | OPTLABEL simple_expr %prec below_SHARP - { ("?" ^ $1, $2) } + { (Optional $1, $2) } ; label_ident: LIDENT { ($1, mkexp(Pexp_ident(mkrhs (Lident $1) 1))) } @@ -1993,13 +1993,13 @@ core_type2: simple_core_type_or_tuple { $1 } | QUESTION LIDENT COLON core_type2 MINUSGREATER core_type2 - { mktyp(Ptyp_arrow("?" ^ $2 , mkoption $4, $6)) } + { mktyp(Ptyp_arrow(Optional $2 , mkoption $4, $6)) } | OPTLABEL core_type2 MINUSGREATER core_type2 - { mktyp(Ptyp_arrow("?" ^ $1 , mkoption $2, $4)) } + { mktyp(Ptyp_arrow(Optional $1 , mkoption $2, $4)) } | LIDENT COLON core_type2 MINUSGREATER core_type2 - { mktyp(Ptyp_arrow($1, $3, $5)) } + { mktyp(Ptyp_arrow(Labelled $1, $3, $5)) } | core_type2 MINUSGREATER core_type2 - { mktyp(Ptyp_arrow("", $1, $3)) } + { mktyp(Ptyp_arrow(Simple, $1, $3)) } ; simple_core_type: diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index 6cec44369d..f039bb2f05 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -54,7 +54,7 @@ and core_type_desc = (* _ *) | Ptyp_var of string (* 'a *) - | Ptyp_arrow of label * core_type * core_type + | Ptyp_arrow of arrow_flag * core_type * core_type (* T1 -> T2 (label = "") ~l:T1 -> T2 (label = "l") ?l:T1 -> T2 (label = "?l") @@ -219,7 +219,7 @@ and expression_desc = *) | Pexp_function of case list (* function P1 -> E1 | ... | Pn -> En *) - | Pexp_fun of label * expression option * pattern * expression + | Pexp_fun of arrow_flag * expression option * pattern * expression (* fun P -> E1 (lab = "", None) fun ~l:P -> E1 (lab = "l", None) fun ?l:P -> E1 (lab = "?l", None) @@ -230,7 +230,7 @@ and expression_desc = - "fun P1 P2 .. Pn -> E1" is represented as nested Pexp_fun. - "let f P = E" is represented using Pexp_fun. *) - | Pexp_apply of expression * (label * expression) list + | Pexp_apply of expression * (arrow_flag * expression) list (* E0 ~l1:E1 ... ~ln:En li can be empty (non labeled argument) or start with '?' (optional argument). @@ -458,7 +458,7 @@ and class_type_desc = ['a1, ..., 'an] c *) | Pcty_signature of class_signature (* object ... end *) - | Pcty_arrow of label * core_type * class_type + | Pcty_arrow of arrow_flag * core_type * class_type (* T -> CT (label = "") ~l:T -> CT (label = "l") ?l:T -> CT (label = "?l") @@ -534,13 +534,13 @@ and class_expr_desc = ['a1, ..., 'an] c *) | Pcl_structure of class_structure (* object ... end *) - | Pcl_fun of label * expression option * pattern * class_expr + | Pcl_fun of arrow_flag * expression option * pattern * class_expr (* fun P -> CE (lab = "", None) fun ~l:P -> CE (lab = "l", None) fun ?l:P -> CE (lab = "?l", None) fun ?l:(P = E0) -> CE (lab = "?l", Some E0) *) - | Pcl_apply of class_expr * (label * expression) list + | Pcl_apply of class_expr * (arrow_flag * expression) list (* CE ~l1:E1 ... ~ln:En li can be empty (non labeled argument) or start with '?' (optional argument). diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index 1218808bc6..bb5f7b5920 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -223,17 +223,18 @@ class printer ()= object(self:'self) pp f "[%a] " (* space *) (self#list self#type_param ~sep:",") l - method type_with_label f (label,({ptyp_desc;_}as c) ) = + method type_in_arrow f (label,({ptyp_desc;_}as c) ) = match label with - | "" -> self#core_type1 f c (* otherwise parenthesize *) - | s -> - if s.[0]='?' then - match ptyp_desc with - | Ptyp_constr ({txt;_}, l) -> - assert (is_predef_option txt); - pp f "%s:%a" s (self#list self#core_type1) l - | _ -> failwith "invalid input in print_type_with_label" - else pp f "%s:%a" s self#core_type1 c + | Simple -> self#core_type1 f c (* otherwise parenthesize *) + | Optional s -> + begin match ptyp_desc with + | Ptyp_constr ({txt;_}, l) -> + assert (is_predef_option txt); + pp f "?%s:%a" s (self#list self#core_type1) l + | _ -> failwith "invalid input in print#type_in_arrow" + end + | Labelled s -> + pp f "%s:%a" s self#core_type1 c method core_type f x = if x.ptyp_attributes <> [] then begin pp f "((%a)%a)" self#core_type {x with ptyp_attributes=[]} @@ -242,7 +243,7 @@ class printer ()= object(self:'self) else match x.ptyp_desc with | Ptyp_arrow (l, ct1, ct2) -> pp f "@[<2>%a@;->@;%a@]" (* FIXME remove parens later *) - self#type_with_label (l,ct1) self#core_type ct2 + self#type_in_arrow (l,ct1) self#core_type ct2 | Ptyp_alias (ct, s) -> pp f "@[<2>%a@;as@;'%s@]" self#core_type1 ct s | Ptyp_poly (sl, ct) -> @@ -407,28 +408,27 @@ class printer ()= object(self:'self) | _ -> self#paren true self#pattern f x method label_exp f (l,opt,p) = - if l = "" then + match l with + | Simple -> pp f "%a@ " self#simple_pattern p (*single case pattern parens needed here *) - else - if l.[0] = '?' then - let len = String.length l - 1 in - let rest = String.sub l 1 len in begin - match p.ppat_desc with - | Ppat_var {txt;_} when txt = rest -> + | Optional s -> + begin match p.ppat_desc with + | Ppat_var {txt;_} when txt = s -> (match opt with - | Some o -> pp f "?(%s=@;%a)@;" rest self#expression o - | None -> pp f "?%s@ " rest) + | Some o -> pp f "?(%s=@;%a)@;" s self#expression o + | None -> pp f "?%s@ " s) | _ -> (match opt with | Some o -> pp f "%s:(%a=@;%a)@;" l self#pattern1 p self#expression o | None -> pp f "%s:%a@;" l self#simple_pattern p) end - else - (match p.ppat_desc with - | Ppat_var {txt;_} when txt = l -> - pp f "~%s@;" l - | _ -> pp f "~%s:%a@;" l self#simple_pattern p ) + | Labelled s -> + begin match p.ppat_desc with + | Ppat_var {txt;_} when txt = s -> + pp f "~%s@;" s + | _ -> pp f "~%s:%a@;" s self#simple_pattern p + end method sugar_expr f e = if e.pexp_attributes <> [] then false (* should also check attributes underneath *) @@ -768,7 +768,7 @@ class printer ()= object(self:'self) self#attributes x.pcty_attributes | Pcty_arrow (l, co, cl) -> pp f "@[<2>%a@;->@;%a@]" (* FIXME remove parens later *) - self#type_with_label (l,co) + self#type_in_arrow (l,co) self#class_type cl | Pcty_extension e -> self#extension f e; @@ -898,15 +898,15 @@ class printer ()= object(self:'self) pp f "%s%a" x.pmb_name.txt (fun f me -> - let me = module_helper me in + let me = module_helper me in (match me.pmod_desc with | Pmod_constraint (me, ({pmty_desc=(Pmty_ident (_) | Pmty_signature (_));_} as mt)) -> - pp f " :@;%a@;=@;%a@;" self#module_type mt self#module_expr me + pp f " :@;%a@;=@;%a@;" self#module_type mt self#module_expr me | _ -> - pp f " =@ %a" self#module_expr me + pp f " =@ %a" self#module_expr me )) x.pmb_expr method module_type f x = @@ -1081,11 +1081,10 @@ class printer ()= object(self:'self) let rec pp_print_pexp_function f x = if x.pexp_attributes <> [] then pp f "=@;%a" self#expression x else match x.pexp_desc with + | Pexp_fun (Simple, eo, p, e) -> + pp f "%a@ %a" self#simple_pattern p pp_print_pexp_function e | Pexp_fun (label, eo, p, e) -> - if label="" then - pp f "%a@ %a" self#simple_pattern p pp_print_pexp_function e - else - pp f "%a@ %a" self#label_exp (label,eo,p) pp_print_pexp_function e + pp f "%a@ %a" self#label_exp (label,eo,p) pp_print_pexp_function e | Pexp_newtype (str,e) -> pp f "(type@ %s)@ %a" str pp_print_pexp_function e | _ -> pp f "=@;%a" self#expression x in @@ -1357,23 +1356,22 @@ class printer ()= object(self:'self) self#pattern pc_lhs (self#option self#expression ~first:"@;when@;") pc_guard self#under_pipe#expression pc_rhs in self#list aux f l ~sep:"" method label_x_expression_param f (l,e) = + let simple_name = match e.pexp_desc with + | Pexp_ident {txt=Lident l;_} -> Some l + | _ -> None + in match l with - | "" -> self#expression2 f e ; (* level 2*) - | lbl -> - let simple_name = match e.pexp_desc with - | Pexp_ident {txt=Lident l;_} -> Some l - | _ -> None in - if lbl.[0] = '?' then - let str = String.sub lbl 1 (String.length lbl-1) in - if Some str = simple_name then - pp f "%s" lbl - else - pp f "%s:%a" lbl self#simple_expr e + | Simple -> self#expression2 f e ; (* level 2*) + | Optional s -> + if Some s = simple_name then + pp f "?%s" s else - if Some lbl = simple_name then - pp f "~%s" lbl - else - pp f "~%s:%a" lbl self#simple_expr e + pp f "?%s:%a" s self#simple_expr e + | Labelled s -> + if Some s = simple_name then + pp f "~%s" s + else + pp f "~%s:%a" s self#simple_expr e method directive_argument f x = (match x with diff --git a/parsing/pprintast.mli b/parsing/pprintast.mli index e8dd92cbb4..eca2730ef0 100644 --- a/parsing/pprintast.mli +++ b/parsing/pprintast.mli @@ -52,10 +52,10 @@ class printer : Format.formatter -> Parsetree.extension_constructor -> unit method label_exp : Format.formatter -> - Asttypes.label * Parsetree.expression option * Parsetree.pattern -> + Asttypes.arrow_flag * Parsetree.expression option * Parsetree.pattern -> unit method label_x_expression_param : - Format.formatter -> Asttypes.label * Parsetree.expression -> unit + Format.formatter -> Asttypes.arrow_flag * Parsetree.expression -> unit method list : ?sep:space_formatter -> ?first:space_formatter -> @@ -112,8 +112,8 @@ class printer : Format.formatter -> Parsetree.core_type * Asttypes.variance -> unit method type_params : Format.formatter -> (Parsetree.core_type * Asttypes.variance) list -> unit - method type_with_label : - Format.formatter -> Asttypes.label * Parsetree.core_type -> unit + method type_in_arrow : + Format.formatter -> Asttypes.arrow_flag * Parsetree.core_type -> unit method tyvar : Format.formatter -> string -> unit method under_pipe : 'b method under_semi : 'b diff --git a/parsing/printast.ml b/parsing/printast.ml index bd476d0917..5ff7733273 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -125,11 +125,17 @@ let option i f ppf x = f (i+1) ppf x; ;; +let arrow_flag f = function + | Simple -> () + | Optional s -> fprintf f "?%s" s + | Labelled s -> fprintf f "%s" s +;; + let longident_loc i ppf li = line i ppf "%a\n" fmt_longident_loc li;; let string i ppf s = line i ppf "\"%s\"\n" s;; let string_loc i ppf s = line i ppf "%a\n" fmt_string_loc s;; let bool i ppf x = line i ppf "%s\n" (string_of_bool x);; -let label i ppf x = line i ppf "label=\"%s\"\n" x;; +let label i ppf x = line i ppf "label=\"%a\"\n" arrow_flag x;; let rec core_type i ppf x = line i ppf "core_type %a\n" fmt_location x.ptyp_loc; @@ -139,8 +145,7 @@ let rec core_type i ppf x = | Ptyp_any -> line i ppf "Ptyp_any\n"; | Ptyp_var (s) -> line i ppf "Ptyp_var %s\n" s; | Ptyp_arrow (l, ct1, ct2) -> - line i ppf "Ptyp_arrow\n"; - string i ppf l; + line i ppf "Ptyp_arrow \"%a\"\n" arrow_flag l; core_type i ppf ct1; core_type i ppf ct2; | Ptyp_tuple l -> @@ -250,7 +255,7 @@ and expression i ppf x = line i ppf "Pexp_function\n"; list i case ppf l; | Pexp_fun (l, eo, p, e) -> - line i ppf "Pexp_fun \"%s\"\n" l; + line i ppf "Pexp_fun \"%a\"\n" arrow_flag l; option i expression ppf eo; pattern i ppf p; expression i ppf e; @@ -457,7 +462,7 @@ and class_type i ppf x = line i ppf "Pcty_signature\n"; class_signature i ppf cs; | Pcty_arrow (l, co, cl) -> - line i ppf "Pcty_arrow \"%s\"\n" l; + line i ppf "Pcty_arrow \"%a\"\n" arrow_flag l; core_type i ppf co; class_type i ppf cl; | Pcty_extension (s, arg) -> @@ -848,7 +853,7 @@ and longident_x_expression i ppf (li, e) = expression (i+1) ppf e; and label_x_expression i ppf (l,e) = - line i ppf "<label> \"%s\"\n" l; + line i ppf "<label> \"%a\"\n" arrow_flag l; expression (i+1) ppf e; and label_x_bool_x_core_type_list i ppf x = diff --git a/tools/untypeast.ml b/tools/untypeast.ml index 49b23452d4..8c9f97d9e8 100644 --- a/tools/untypeast.ml +++ b/tools/untypeast.ml @@ -266,7 +266,7 @@ and untype_expression exp = untype_expression exp) | Texp_function (label, [{c_lhs=p; c_guard=None; c_rhs=e}], _) -> Pexp_fun (label, None, untype_pattern p, untype_expression e) - | Texp_function ("", cases, _) -> + | Texp_function (Simple, cases, _) -> Pexp_function (untype_cases cases) | Texp_function _ -> assert false diff --git a/toplevel/trace.ml b/toplevel/trace.ml index 6690448363..5bd67309ed 100644 --- a/toplevel/trace.ml +++ b/toplevel/trace.ml @@ -12,6 +12,7 @@ (* The "trace" facility *) +open Asttypes open Format open Misc open Longident @@ -52,7 +53,10 @@ let set_code_pointer cls ptr = Obj.set_field cls 0 ptr let invoke_traced_function codeptr env arg = Meta.invoke_traced_function codeptr env arg -let print_label ppf l = if l <> "" then fprintf ppf "%s:" l +let print_label ppf = function + | Simple -> () + | Optional s -> fprintf ppf "?%s:" s + | Labelled s -> fprintf ppf "%s:" s (* If a function returns a functional value, wrap it into a trace code *) diff --git a/typing/btype.ml b/typing/btype.ml index c1228f6269..f99011aa01 100644 --- a/typing/btype.ml +++ b/typing/btype.ml @@ -12,6 +12,7 @@ (* Basic operations on core types *) +open Asttypes open Misc open Types @@ -545,15 +546,27 @@ let check_memorized_abbrevs () = (* Utilities for labels *) (**********************************) -let is_optional l = - String.length l > 0 && l.[0] = '?' +let is_simple = function + | Simple -> true + | _ -> false + +let is_optional = function + | Optional _ -> true + | _ -> false + +let label_name = function + | Simple -> "" + | Optional s | Labelled s -> s -let label_name l = - if is_optional l then String.sub l 1 (String.length l - 1) - else l +let label_raw = function + | Simple -> "" + | Optional s -> "?" ^ s + | Labelled s -> s -let prefixed_label_name l = - if is_optional l then l else "~" ^ l +let prefixed_label_name = function + | Simple -> assert false + | Optional s -> "?" ^ s + | Labelled s -> "~" ^ s let rec extract_label_aux hd l = function [] -> raise Not_found diff --git a/typing/btype.mli b/typing/btype.mli index e770fa619e..1caa60c867 100644 --- a/typing/btype.mli +++ b/typing/btype.mli @@ -162,15 +162,17 @@ val forget_abbrev: (**** Utilities for labels ****) -val is_optional : label -> bool -val label_name : label -> label +val is_simple : arrow_flag -> bool +val is_optional : arrow_flag -> bool +val label_name : arrow_flag -> label +val label_raw : arrow_flag -> label (* Returns the label name with first character '?' or '~' as appropriate. *) -val prefixed_label_name : label -> label +val prefixed_label_name : arrow_flag -> label val extract_label : - label -> (label * 'a) list -> - label * 'a * (label * 'a) list * (label * 'a) list + label -> (arrow_flag * 'a) list -> + arrow_flag * 'a * (arrow_flag * 'a) list * (arrow_flag * 'a) list (* actual label, value, before list, after list *) (**** Utilities for backtracking ****) diff --git a/typing/ctype.ml b/typing/ctype.ml index d1ff9da5e5..e612ed580f 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -2840,7 +2840,7 @@ let filter_arrow env t l = link_type t t'; (t1, t2) | Tarrow(l', t1, t2, _) - when l = l' || !Clflags.classic && l = "" && not (is_optional l') -> + when l = l' || !Clflags.classic && is_simple l && not (is_optional l') -> (t1, t2) | _ -> raise (Unify []) @@ -3648,7 +3648,7 @@ let match_class_declarations env patt_params patt_type subj_params subj_type = (* Use moregeneral for class parameters, need to recheck everything to keeps relationships (PR#4824) *) let clty_params = - List.fold_right (fun ty cty -> Cty_arrow ("*",ty,cty)) in + List.fold_right (fun ty cty -> Cty_arrow (Labelled "*",ty,cty)) in match_class_types ~trace:false env (clty_params patt_params patt_type) (clty_params subj_params subj_type) diff --git a/typing/ctype.mli b/typing/ctype.mli index 36cb186fa2..1d52765b08 100644 --- a/typing/ctype.mli +++ b/typing/ctype.mli @@ -162,7 +162,7 @@ val unify_gadt: newtype_level:int -> Env.t ref -> type_expr -> type_expr -> unit val unify_var: Env.t -> type_expr -> type_expr -> unit (* Same as [unify], but allow free univars when first type is a variable. *) -val filter_arrow: Env.t -> type_expr -> label -> type_expr * type_expr +val filter_arrow: Env.t -> type_expr -> arrow_flag -> type_expr * type_expr (* A special case of unification (with l:'a -> 'b). *) val filter_method: Env.t -> string -> private_flag -> type_expr -> type_expr (* A special case of unification (with {m : 'a; 'b}). *) diff --git a/typing/printtyp.ml b/typing/printtyp.ml index 52fddd478e..0bed485e63 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -85,6 +85,13 @@ let tree_of_rec = function | Trec_first -> Orec_first | Trec_next -> Orec_next +(* Print arrow lhs flag/label *) + +let arrow_flag ppf = function + | Simple -> () + | Optional s -> fprintf ppf "?%s" s + | Labelled s -> fprintf ppf "%s" s + (* Print a raw type expression, with sharing *) let raw_list pr ppf = function @@ -134,8 +141,8 @@ and raw_type_list tl = raw_list raw_type tl and raw_type_desc ppf = function Tvar name -> fprintf ppf "Tvar %a" print_name name | Tarrow(l,t1,t2,c) -> - fprintf ppf "@[<hov1>Tarrow(%s,@,%a,@,%a,@,%s)@]" - l raw_type t1 raw_type t2 + fprintf ppf "@[<hov1>Tarrow(%a,@,%a,@,%a,@,%s)@]" + arrow_flag l raw_type t1 raw_type t2 (safe_commu_repr [] c) | Ttuple tl -> fprintf ppf "@[<1>Ttuple@,%a@]" raw_type_list tl @@ -535,7 +542,17 @@ let reset_and_mark_loops_list tyl = (* Disabled in classic mode when printing an unification error *) let print_labels = ref true let print_label ppf l = - if !print_labels && l <> "" || is_optional l then fprintf ppf "%s:" l + if match l with + | Simple -> false + | Optional _ -> true + | Labelled _ -> !print_labels + then + fprintf ppf "%a:" arrow_flag l + +let raw_label = function + | Labelled s when !print_labels -> s + | Optional s -> "?" ^ s + | Simple | Labelled _ -> "" let rec tree_of_typexp sch ty = let ty = repr ty in @@ -550,9 +567,7 @@ let rec tree_of_typexp sch ty = Otyp_var (is_non_gen sch ty, name_of_type ty) | Tarrow(l, ty1, ty2, _) -> let pr_arrow l ty1 ty2 = - let lab = - if !print_labels && l <> "" || is_optional l then l else "" - in + let lab = raw_label l in let t1 = if is_optional l then match (repr ty1).desc with @@ -1039,7 +1054,7 @@ let rec tree_of_class_type sch params = in Octy_signature (self_ty, List.rev csil) | Cty_arrow (l, ty, cty) -> - let lab = if !print_labels && l <> "" || is_optional l then l else "" in + let lab = raw_label l in let ty = if is_optional l then match (repr ty).desc with diff --git a/typing/printtyped.ml b/typing/printtyped.ml index 1c2b5dbdf0..ae0c6bedfd 100644 --- a/typing/printtyped.ml +++ b/typing/printtyped.ml @@ -136,6 +136,11 @@ let string_loc i ppf s = line i ppf "\"%s\"\n" s.txt;; let bool i ppf x = line i ppf "%s\n" (string_of_bool x);; let label i ppf x = line i ppf "label=\"%s\"\n" x;; +let arrow_flag f = function + | Simple -> fprintf f "" + | Optional s -> fprintf f "?%s" s + | Labelled s -> fprintf f "%s" s + let attributes i ppf l = let i = i + 1 in List.iter @@ -153,8 +158,7 @@ let rec core_type i ppf x = | Ttyp_any -> line i ppf "Ptyp_any\n"; | Ttyp_var (s) -> line i ppf "Ptyp_var %s\n" s; | Ttyp_arrow (l, ct1, ct2) -> - line i ppf "Ptyp_arrow\n"; - string i ppf l; + line i ppf "Ptyp_arrow \"%a\"\n" arrow_flag l; core_type i ppf ct1; core_type i ppf ct2; | Ttyp_tuple l -> @@ -282,7 +286,7 @@ and expression i ppf x = list i value_binding ppf l; expression i ppf e; | Texp_function (p, l, _partial) -> - line i ppf "Pexp_function \"%s\"\n" p; + line i ppf "Pexp_function \"%a\"\n" arrow_flag p; (* option i expression ppf eo; *) list i case ppf l; | Texp_apply (e, l) -> @@ -449,7 +453,7 @@ and class_type i ppf x = line i ppf "Pcty_signature\n"; class_signature i ppf cs; | Tcty_arrow (l, co, cl) -> - line i ppf "Pcty_arrow \"%s\"\n" l; + line i ppf "Pcty_arrow \"%a\"\n" arrow_flag l; core_type i ppf co; class_type i ppf cl; @@ -817,7 +821,7 @@ and longident_x_expression i ppf (li, _, e) = expression (i+1) ppf e; and label_x_expression i ppf (l, e, _) = - line i ppf "<label> \"%s\"\n" l; + line i ppf "<label> \"%a\"\n" arrow_flag l; (match e with None -> () | Some e -> expression (i+1) ppf e) and ident_x_loc_x_expression_def i ppf (l,_, e) = diff --git a/typing/typeclass.ml b/typing/typeclass.ml index a29ddddb21..5c16d61bdf 100644 --- a/typing/typeclass.ml +++ b/typing/typeclass.ml @@ -23,7 +23,7 @@ type error = | Field_type_mismatch of string * string * (type_expr * type_expr) list | Structure_expected of class_type | Cannot_apply of class_type - | Apply_wrong_label of label + | Apply_wrong_label of arrow_flag | Pattern_type_clash of type_expr | Repeated_parameter | Unbound_class_2 of Longident.t @@ -352,7 +352,7 @@ let type_constraint val_env sty sty' loc = let make_method loc cl_num expr = let open Ast_helper in let mkid s = mkloc s loc in - Exp.fun_ ~loc:expr.pexp_loc "" None + Exp.fun_ ~loc:expr.pexp_loc Simple None (Pat.alias ~loc (Pat.var ~loc (mkid "self-*")) (mkid ("self-" ^ cl_num))) expr @@ -673,7 +673,7 @@ let rec class_field self_loc cl_num self_type meths vars let field = lazy begin let meth_type = - Btype.newgenty (Tarrow("", self_type, ty, Cok)) in + Btype.newgenty (Tarrow(Simple, self_type, ty, Cok)) in Ctype.raise_nongen_level (); vars := vars_local; let texp = type_expect met_env meth_expr meth_type in @@ -698,7 +698,7 @@ let rec class_field self_loc cl_num self_type meths vars Ctype.raise_nongen_level (); let meth_type = Ctype.newty - (Tarrow ("", self_type, + (Tarrow (Simple, self_type, Ctype.instance_def Predef.type_unit, Cok)) in vars := vars_local; let texp = type_expect met_env expr meth_type in @@ -988,8 +988,8 @@ and class_expr cl_num val_env met_env scl = !Clflags.classic || let labels = nonopt_labels [] cl.cl_type in List.length labels = List.length sargs && - List.for_all (fun (l,_) -> l = "") sargs && - List.exists (fun l -> l <> "") labels && + List.for_all (fun (l,_) -> Btype.is_simple l) sargs && + List.exists (fun l -> not (Btype.is_simple l)) labels && begin Location.prerr_warning cl.cl_loc Warnings.Labels_omitted; true @@ -1008,7 +1008,7 @@ and class_expr cl_num val_env met_env scl = (l', sarg0)::_, _ -> raise(Error(sarg0.pexp_loc, val_env, Apply_wrong_label l')) | _, (l', sarg0)::more_sargs -> - if l <> l' && l' <> "" then + if l <> l' && not (Btype.is_simple l') then raise(Error(sarg0.pexp_loc, val_env, Apply_wrong_label l')) else ([], more_sargs, @@ -1028,7 +1028,7 @@ and class_expr cl_num val_env met_env scl = in if optional = Required && Btype.is_optional l' then Location.prerr_warning sarg0.pexp_loc - (Warnings.Nonoptional_label l); + (Warnings.Nonoptional_label (Btype.label_raw l)); sargs, more_sargs, if optional = Required || Btype.is_optional l' then Some (type_argument val_env sarg0 ty ty0) @@ -1040,7 +1040,7 @@ and class_expr cl_num val_env met_env scl = with Not_found -> sargs, more_sargs, if Btype.is_optional l && - (List.mem_assoc "" sargs || List.mem_assoc "" more_sargs) + (List.mem_assoc Simple sargs || List.mem_assoc Simple more_sargs) then Some (option_none ty0 Location.none) else None @@ -1704,8 +1704,10 @@ let report_error env ppf = function "This class expression is not a class function, it cannot be applied" | Apply_wrong_label l -> let mark_label = function - | "" -> "out label" - | l -> sprintf " label ~%s" l in + | Simple -> "out label" + | Optional s -> sprintf " label ?%s" s + | Labelled s -> sprintf " label ~%s" s + in fprintf ppf "This argument cannot be applied with%s" (mark_label l) | Pattern_type_clash ty -> (* XXX Trace *) diff --git a/typing/typeclass.mli b/typing/typeclass.mli index 8e8675fe76..3bd4d95d89 100644 --- a/typing/typeclass.mli +++ b/typing/typeclass.mli @@ -81,7 +81,7 @@ type error = | Field_type_mismatch of string * string * (type_expr * type_expr) list | Structure_expected of class_type | Cannot_apply of class_type - | Apply_wrong_label of label + | Apply_wrong_label of arrow_flag | Pattern_type_clash of type_expr | Repeated_parameter | Unbound_class_2 of Longident.t diff --git a/typing/typecore.ml b/typing/typecore.ml index 13b4a2e209..a2199ef102 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -30,7 +30,7 @@ type error = | Orpat_vars of Ident.t | Expr_type_clash of (type_expr * type_expr) list | Apply_non_function of type_expr - | Apply_wrong_label of label * type_expr + | Apply_wrong_label of arrow_flag * type_expr | Label_multiply_defined of string | Label_missing of Ident.t list | Label_not_mutable of Longident.t @@ -51,7 +51,7 @@ type error = | Coercion_failure of type_expr * type_expr * (type_expr * type_expr) list * bool | Too_many_arguments of bool * type_expr - | Abstract_wrong_label of label * type_expr + | Abstract_wrong_label of arrow_flag * type_expr | Scoping_let_module of string * type_expr | Masked_instance_variable of Longident.t | Not_a_variant_type of Longident.t @@ -1479,7 +1479,8 @@ and is_nonexpansive_opt = function let rec approx_type env sty = match sty.ptyp_desc with Ptyp_arrow (p, _, sty) -> - let ty1 = if is_optional p then type_option (newvar ()) else newvar () in + let ty1 = newvar () in + let ty1 = if is_optional p then type_option ty1 else ty1 in newty (Tarrow (p, ty1, approx_type env sty, Cok)) | Ptyp_tuple args -> newty (Ttuple (List.map (approx_type env) args)) @@ -1503,7 +1504,7 @@ let rec type_approx env sexp = | Pexp_fun (p,_,_, e) -> newty (Tarrow(p, newvar (), type_approx env e, Cok)) | Pexp_function ({pc_rhs=e}::_) -> - newty (Tarrow("", newvar (), type_approx env e, Cok)) + newty (Tarrow(Simple, newvar (), type_approx env e, Cok)) | Pexp_match (_, {pc_rhs=e}::_) -> type_approx env e | Pexp_try (e, _) -> type_approx env e | Pexp_tuple l -> newty (Ttuple(List.map (type_approx env) l)) @@ -1885,7 +1886,7 @@ and type_expect_ ?in_function env sexp ty_expected = l [{pc_lhs=spat; pc_guard=None; pc_rhs=sexp}] | Pexp_function caselist -> type_function ?in_function - loc sexp.pexp_attributes env ty_expected "" caselist + loc sexp.pexp_attributes env ty_expected Simple caselist | Pexp_apply(sfunct, sargs) -> if sargs = [] then Syntaxerr.ill_formed_ast loc "Function application with no argument."; @@ -2354,7 +2355,7 @@ and type_expect_ ?in_function env sexp ty_expected = filter_self_method env met Private meths privty in let method_type = newvar () in - let (obj_ty, res_ty) = filter_arrow env method_type "" in + let (obj_ty, res_ty) = filter_arrow env method_type Simple in unify env obj_ty desc.val_type; unify env res_ty (instance env typ); let exp = @@ -2368,7 +2369,7 @@ and type_expect_ ?in_function env sexp ty_expected = exp_type = method_type; exp_attributes = []; (* check *) exp_env = env}, - ["", + [Simple, Some {exp_desc = Texp_ident(path, lid, desc); exp_loc = obj.exp_loc; exp_extra = []; exp_type = desc.val_type; @@ -3055,7 +3056,7 @@ and type_argument env sarg ty_expected' ty_expected = (* ty_expected' may be generic *) let no_labels ty = let ls, tvar = list_labels env ty in - not tvar && List.for_all ((=) "") ls + not tvar && List.for_all is_simple ls in let rec is_inferred sexp = match sexp.pexp_desc with @@ -3066,7 +3067,7 @@ and type_argument env sarg ty_expected' ty_expected = | _ -> false in match expand_head env ty_expected' with - {desc = Tarrow("",ty_arg,ty_res,_); level = lv} when is_inferred sarg -> + {desc = Tarrow(Simple,ty_arg,ty_res,_); level = lv} when is_inferred sarg -> (* apply optional arguments when expected type is "" *) (* we must be very careful about not breaking the semantics *) if !Clflags.principal then begin_def (); @@ -3080,7 +3081,7 @@ and type_argument env sarg ty_expected' ty_expected = | Tarrow (l,ty_arg,ty_fun,_) when is_optional l -> let ty = option_none (instance env ty_arg) sarg.pexp_loc in make_args ((l, Some ty, Optional) :: args) ty_fun - | Tarrow (l,_,ty_res',_) when l = "" || !Clflags.classic -> + | Tarrow (l,_,ty_res',_) when is_simple l || !Clflags.classic -> List.rev args, ty_fun, no_labels ty_res' | Tvar _ -> List.rev args, ty_fun, false | _ -> [], texp.exp_type, false @@ -3116,10 +3117,10 @@ and type_argument env sarg ty_expected' ty_expected = {texp with exp_type = ty_res; exp_desc = Texp_apply (texp, - args @ ["", Some eta_var, Required])} + args @ [Simple, Some eta_var, Required])} in { texp with exp_type = ty_fun; exp_desc = - Texp_function("", [case eta_pat e], Total) } + Texp_function(Simple, [case eta_pat e], Total) } in Location.prerr_warning texp.exp_loc (Warnings.Eliminated_optional_arguments (List.map (fun (l, _, _) -> l) args)); @@ -3154,7 +3155,7 @@ and type_application env funct sargs = let ignored = ref [] in let rec type_unknown_args (args : - (Asttypes.label * (unit -> Typedtree.expression) option * + (Asttypes.arrow_flag * (unit -> Typedtree.expression) option * Typedtree.optional) list) omitted ty_fun = function [] -> @@ -3180,7 +3181,7 @@ and type_application env funct sargs = unify env ty_fun (newty (Tarrow(l1,t1,t2,Clink(ref Cunknown)))); (t1, t2) | Tarrow (l,t1,t2,_) when l = l1 - || !Clflags.classic && l1 = "" && not (is_optional l) -> + || !Clflags.classic && is_simple l1 && not (is_optional l) -> (t1, t2) | td -> let ty_fun = @@ -3213,8 +3214,8 @@ and type_application env funct sargs = not tvar && let labels = List.filter (fun l -> not (is_optional l)) ls in List.length labels = List.length sargs && - List.for_all (fun (l,_) -> l = "") sargs && - List.exists (fun l -> l <> "") labels && + List.for_all (fun (l,_) -> is_simple l) sargs && + List.exists (fun l -> not (is_simple l)) labels && (Location.prerr_warning funct.exp_loc Warnings.Labels_omitted; true) end @@ -3242,7 +3243,7 @@ and type_application env funct sargs = raise(Error(sarg0.pexp_loc, env, Apply_wrong_label(l', ty_old))) | _, (l', sarg0) :: more_sargs -> - if l <> l' && l' <> "" then + if l <> l' && not (is_simple l') then raise(Error(sarg0.pexp_loc, env, Apply_wrong_label(l', ty_fun'))) else @@ -3268,7 +3269,7 @@ and type_application env funct sargs = in if optional = Required && is_optional l' then Location.prerr_warning sarg0.pexp_loc - (Warnings.Nonoptional_label l); + (Warnings.Nonoptional_label (Btype.label_raw l)); sargs, more_sargs, if optional = Required || is_optional l' then Some (fun () -> type_argument env sarg0 ty ty0) @@ -3282,7 +3283,7 @@ and type_application env funct sargs = with Not_found -> sargs, more_sargs, if optional = Optional && - (List.mem_assoc "" sargs || List.mem_assoc "" more_sargs) + (List.mem_assoc Simple sargs || List.mem_assoc Simple more_sargs) then begin may_warn funct.exp_loc (Warnings.Without_principality "eliminated optional argument"); @@ -3311,8 +3312,8 @@ and type_application env funct sargs = match funct.exp_desc, sargs with (* Special case for ignore: avoid discarding warning *) Texp_ident (_, _, {val_kind=Val_prim{Primitive.prim_name="%ignore"}}), - ["", sarg] -> - let ty_arg, ty_res = filter_arrow env (instance env funct.exp_type) "" in + [Simple, sarg] -> + let ty_arg, ty_res = filter_arrow env (instance env funct.exp_type) Simple in let exp = type_expect env sarg ty_arg in begin match (expand_head env exp.exp_type).desc with | Tarrow _ -> @@ -3321,7 +3322,7 @@ and type_application env funct sargs = add_delayed_check (fun () -> check_application_result env false exp) | _ -> () end; - (["", Some exp, Required], ty_res) + ([Simple, Some exp, Required], ty_res) | _ -> let ty = funct.exp_type in if ignore_labels then @@ -3824,10 +3825,9 @@ let report_error env ppf = function end | Apply_wrong_label (l, ty) -> let print_label ppf = function - | "" -> fprintf ppf "without label" - | l -> - fprintf ppf "with label %s" (prefixed_label_name l) - in + | Simple -> fprintf ppf "without label" + | Optional s -> fprintf ppf "with label ?%s" s + | Labelled s -> fprintf ppf "with label ~%s" s in reset_and_mark_loops ty; fprintf ppf "@[<v>@[<2>The function applied to this argument has type@ %a@]@.\ @@ -3914,7 +3914,7 @@ let report_error env ppf = function end | Abstract_wrong_label (l, ty) -> let label_mark = function - | "" -> "but its first argument is not labelled" + | Simple -> "but its first argument is not labelled" | l -> sprintf "but its first argument is labelled %s" (prefixed_label_name l) in reset_and_mark_loops ty; diff --git a/typing/typecore.mli b/typing/typecore.mli index ee16c3b7fc..f07888d566 100644 --- a/typing/typecore.mli +++ b/typing/typecore.mli @@ -31,7 +31,7 @@ val type_let: val type_expression: Env.t -> Parsetree.expression -> Typedtree.expression val type_class_arg_pattern: - string -> Env.t -> Env.t -> label -> Parsetree.pattern -> + string -> Env.t -> Env.t -> arrow_flag -> Parsetree.pattern -> Typedtree.pattern * (Ident.t * string loc * Ident.t * type_expr) list * Env.t * Env.t val type_self_pattern: @@ -75,7 +75,7 @@ type error = | Orpat_vars of Ident.t | Expr_type_clash of (type_expr * type_expr) list | Apply_non_function of type_expr - | Apply_wrong_label of label * type_expr + | Apply_wrong_label of arrow_flag * type_expr | Label_multiply_defined of string | Label_missing of Ident.t list | Label_not_mutable of Longident.t @@ -96,7 +96,7 @@ type error = | Coercion_failure of type_expr * type_expr * (type_expr * type_expr) list * bool | Too_many_arguments of bool * type_expr - | Abstract_wrong_label of label * type_expr + | Abstract_wrong_label of arrow_flag * type_expr | Scoping_let_module of string * type_expr | Masked_instance_variable of Longident.t | Not_a_variant_type of Longident.t diff --git a/typing/typedtree.ml b/typing/typedtree.ml index 0feb62196b..3c4b0503da 100644 --- a/typing/typedtree.ml +++ b/typing/typedtree.ml @@ -74,8 +74,8 @@ and expression_desc = Texp_ident of Path.t * Longident.t loc * Types.value_description | Texp_constant of constant | Texp_let of rec_flag * value_binding list * expression - | Texp_function of label * case list * partial - | Texp_apply of expression * (label * expression option * optional) list + | Texp_function of arrow_flag * case list * partial + | Texp_apply of expression * (arrow_flag * expression option * optional) list | Texp_match of expression * case list * case list * partial | Texp_try of expression * case list | Texp_tuple of expression list @@ -131,10 +131,9 @@ and class_expr = and class_expr_desc = Tcl_ident of Path.t * Longident.t loc * core_type list | Tcl_structure of class_structure - | Tcl_fun of - label * pattern * (Ident.t * string loc * expression) list * class_expr * - partial - | Tcl_apply of class_expr * (label * expression option * optional) list + | Tcl_fun of arrow_flag * pattern * (Ident.t * string loc * expression) list + * class_expr * partial + | Tcl_apply of class_expr * (arrow_flag * expression option * optional) list | Tcl_let of rec_flag * value_binding list * (Ident.t * string loc * expression) list * class_expr | Tcl_constraint of @@ -345,7 +344,7 @@ and core_type = and core_type_desc = Ttyp_any | Ttyp_var of string - | Ttyp_arrow of label * core_type * core_type + | Ttyp_arrow of arrow_flag * core_type * core_type | Ttyp_tuple of core_type list | Ttyp_constr of Path.t * Longident.t loc * core_type list | Ttyp_object of (string * attributes * core_type) list * closed_flag @@ -451,7 +450,7 @@ and class_type = and class_type_desc = Tcty_constr of Path.t * Longident.t loc * core_type list | Tcty_signature of class_signature - | Tcty_arrow of label * core_type * class_type + | Tcty_arrow of arrow_flag * core_type * class_type and class_signature = { csig_self : core_type; diff --git a/typing/typedtree.mli b/typing/typedtree.mli index 947c34c257..4abd4ccad2 100644 --- a/typing/typedtree.mli +++ b/typing/typedtree.mli @@ -73,8 +73,8 @@ and expression_desc = Texp_ident of Path.t * Longident.t loc * Types.value_description | Texp_constant of constant | Texp_let of rec_flag * value_binding list * expression - | Texp_function of label * case list * partial - | Texp_apply of expression * (label * expression option * optional) list + | Texp_function of arrow_flag * case list * partial + | Texp_apply of expression * (arrow_flag * expression option * optional) list | Texp_match of expression * case list * case list * partial | Texp_try of expression * case list | Texp_tuple of expression list @@ -130,10 +130,9 @@ and class_expr = and class_expr_desc = Tcl_ident of Path.t * Longident.t loc * core_type list | Tcl_structure of class_structure - | Tcl_fun of - label * pattern * (Ident.t * string loc * expression) list * class_expr * - partial - | Tcl_apply of class_expr * (label * expression option * optional) list + | Tcl_fun of arrow_flag * pattern * (Ident.t * string loc * expression) list + * class_expr * partial + | Tcl_apply of class_expr * (arrow_flag * expression option * optional) list | Tcl_let of rec_flag * value_binding list * (Ident.t * string loc * expression) list * class_expr | Tcl_constraint of @@ -344,7 +343,7 @@ and core_type = and core_type_desc = Ttyp_any | Ttyp_var of string - | Ttyp_arrow of label * core_type * core_type + | Ttyp_arrow of arrow_flag * core_type * core_type | Ttyp_tuple of core_type list | Ttyp_constr of Path.t * Longident.t loc * core_type list | Ttyp_object of (string * attributes * core_type) list * closed_flag @@ -451,7 +450,7 @@ and class_type = and class_type_desc = Tcty_constr of Path.t * Longident.t loc * core_type list | Tcty_signature of class_signature - | Tcty_arrow of label * core_type * class_type + | Tcty_arrow of arrow_flag * core_type * class_type and class_signature = { csig_self : core_type; diff --git a/typing/types.ml b/typing/types.ml index 6ab98419a4..8c1b9d23c8 100644 --- a/typing/types.ml +++ b/typing/types.ml @@ -23,7 +23,7 @@ type type_expr = and type_desc = Tvar of string option - | Tarrow of label * type_expr * type_expr * commutable + | Tarrow of arrow_flag * type_expr * type_expr * commutable | Ttuple of type_expr list | Tconstr of Path.t * type_expr list * abbrev_memo ref | Tobject of type_expr * (Path.t * type_expr list) option ref @@ -235,7 +235,7 @@ module Concr = Set.Make(OrderedString) type class_type = Cty_constr of Path.t * type_expr list * class_type | Cty_signature of class_signature - | Cty_arrow of label * type_expr * class_type + | Cty_arrow of arrow_flag * type_expr * class_type and class_signature = { csig_self: type_expr; diff --git a/typing/types.mli b/typing/types.mli index fd7ef10084..b577d345fc 100644 --- a/typing/types.mli +++ b/typing/types.mli @@ -23,7 +23,7 @@ type type_expr = and type_desc = Tvar of string option - | Tarrow of label * type_expr * type_expr * commutable + | Tarrow of arrow_flag * type_expr * type_expr * commutable | Ttuple of type_expr list | Tconstr of Path.t * type_expr list * abbrev_memo ref | Tobject of type_expr * (Path.t * type_expr list) option ref @@ -225,7 +225,7 @@ module Concr : Set.S with type elt = string type class_type = Cty_constr of Path.t * type_expr list * class_type | Cty_signature of class_signature - | Cty_arrow of label * type_expr * class_type + | Cty_arrow of arrow_flag * type_expr * class_type and class_signature = { csig_self: type_expr; From 79f603f4d534fe8014196c605070fd2795493a97 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 2 Apr 2014 11:49:17 +0100 Subject: [PATCH 310/494] Split arrow_flag into Parsetree.arrow_flag and Types.arrow_flag --- bytecomp/translcore.mli | 2 +- ocamldoc/odoc_info.mli | 4 +- ocamldoc/odoc_misc.ml | 6 +- ocamldoc/odoc_misc.mli | 6 +- ocamldoc/odoc_sig.ml | 2 +- ocamldoc/odoc_value.ml | 4 +- parsing/asttypes.mli | 5 -- parsing/parser.mly | 80 ++++++++++++------------ parsing/parsetree.mli | 5 ++ parsing/pprintast.ml | 20 +++--- parsing/pprintast.mli | 6 +- parsing/printast.ml | 6 +- tools/untypeast.ml | 19 +++--- toplevel/trace.ml | 7 +-- typing/btype.ml | 20 +++--- typing/btype.mli | 3 + typing/ctype.ml | 34 +++++++---- typing/ctype.mli | 2 +- typing/printtyp.ml | 51 +++++++++------- typing/printtyped.ml | 7 ++- typing/typeclass.ml | 47 +++++++------- typing/typecore.ml | 131 ++++++++++++++++++++++++---------------- typing/types.ml | 5 ++ typing/types.mli | 5 ++ typing/typetexp.ml | 5 ++ 25 files changed, 280 insertions(+), 202 deletions(-) diff --git a/bytecomp/translcore.mli b/bytecomp/translcore.mli index 8d6bd8696c..8d4b119de3 100644 --- a/bytecomp/translcore.mli +++ b/bytecomp/translcore.mli @@ -18,7 +18,7 @@ open Typedtree open Lambda val transl_exp: expression -> lambda -val transl_apply: lambda -> (arrow_flag * expression option * optional) list +val transl_apply: lambda -> (Types.arrow_flag * expression option * optional) list -> Location.t -> lambda val transl_let: rec_flag -> value_binding list -> lambda -> lambda val transl_primitive: Location.t -> Primitive.description -> lambda diff --git a/ocamldoc/odoc_info.mli b/ocamldoc/odoc_info.mli index afb30d5974..9af83c194b 100644 --- a/ocamldoc/odoc_info.mli +++ b/ocamldoc/odoc_info.mli @@ -774,11 +774,11 @@ val create_index_lists : 'a list -> ('a -> string) -> 'a list list val remove_option : Types.type_expr -> Types.type_expr (** Return [true] if the given label is optional.*) -val is_optional : Asttypes.arrow_flag -> bool +val is_optional : Types.arrow_flag -> bool (** Return the label name for the given label, i.e. removes the beginning '?' if present.*) -val label_name : Asttypes.arrow_flag -> string +val label_name : Types.arrow_flag -> string (** Return the given name where the module name or part of it was removed, according to the list of modules diff --git a/ocamldoc/odoc_misc.ml b/ocamldoc/odoc_misc.ml index 46027c5ec1..519c3f7c72 100644 --- a/ocamldoc/odoc_misc.ml +++ b/ocamldoc/odoc_misc.ml @@ -472,9 +472,9 @@ let create_index_lists elements string_of_ele = let is_optional = Btype.is_optional let label_name = Btype.label_name let label_prefix = function - | Asttypes.Simple -> "" - | Asttypes.Optional s -> "?" ^ s ^ ":" - | Asttypes.Labelled s -> s ^ ":" + | Types.Tarr_simple -> "" + | Types.Tarr_optional s -> "?" ^ s ^ ":" + | Types.Tarr_labelled s -> s ^ ":" let remove_option typ = let rec iter t = diff --git a/ocamldoc/odoc_misc.mli b/ocamldoc/odoc_misc.mli index 22cffd1973..c712530116 100644 --- a/ocamldoc/odoc_misc.mli +++ b/ocamldoc/odoc_misc.mli @@ -107,12 +107,12 @@ val search_string_backward : pat: string -> s: string -> int val remove_option : Types.type_expr -> Types.type_expr (** Return [true] if the given label is optional.*) -val is_optional : Asttypes.arrow_flag -> bool +val is_optional : Types.arrow_flag -> bool (** Return the label name for the given label, i.e. removes the beginning '?' if present.*) -val label_name : Asttypes.arrow_flag -> string +val label_name : Types.arrow_flag -> string (** Return the string to print when label is prefixing a type i.e. appends ':' if label is non-empty .*) -val label_prefix : Asttypes.arrow_flag -> string +val label_prefix : Types.arrow_flag -> string diff --git a/ocamldoc/odoc_sig.ml b/ocamldoc/odoc_sig.ml index ee65748a18..f5f19d63c5 100644 --- a/ocamldoc/odoc_sig.ml +++ b/ocamldoc/odoc_sig.ml @@ -1425,7 +1425,7 @@ module Analyser = | (Parsetree.Pcty_arrow (parse_label, _, pclass_type), Types.Cty_arrow (label, type_expr, class_type)) -> (* label = string. Dans les signatures, pas de nom de parametres a l'interieur des tuples *) (* si label = "", pas de label. ici on a l'information pour savoir si on a un label explicite. *) - if parse_label = label then + if Btype.tarr_of_parr parse_label = label then ( let new_param = Simple_name { diff --git a/ocamldoc/odoc_value.ml b/ocamldoc/odoc_value.ml index c326da8a05..3474753eed 100644 --- a/ocamldoc/odoc_value.ml +++ b/ocamldoc/odoc_value.ml @@ -100,9 +100,9 @@ let dummy_parameter_list typ = let rec iter (label, t) = match t.Types.desc with | Types.Ttuple l -> - if label = Asttypes.Simple then + if label = Types.Tarr_simple then Odoc_parameter.Tuple - (List.map (fun t2 -> iter (Asttypes.Simple, t2)) l, t) + (List.map (fun t2 -> iter (Types.Tarr_simple, t2)) l, t) else (* if there is a label, then we don't want to decompose the tuple *) Odoc_parameter.Simple_name diff --git a/parsing/asttypes.mli b/parsing/asttypes.mli index 41fc9b4d9b..f02f403881 100644 --- a/parsing/asttypes.mli +++ b/parsing/asttypes.mli @@ -46,8 +46,3 @@ type variance = | Covariant | Contravariant | Invariant - -type arrow_flag = - | Simple (* T -> ... *) - | Labelled of string (* label:T -> ... *) - | Optional of string (* ?label:T -> ... *) diff --git a/parsing/parser.mly b/parsing/parser.mly index 869d9e1de8..8f297baf29 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -76,7 +76,7 @@ let ghunit () = ghexp (Pexp_construct (mknoloc (Lident "()"), None)) let mkinfix arg1 name arg2 = - mkexp(Pexp_apply(mkoperator name 2, [Simple, arg1; Simple, arg2])) + mkexp(Pexp_apply(mkoperator name 2, [Parr_simple, arg1; Parr_simple, arg2])) let neg_float_string f = if String.length f > 0 && f.[0] = '-' @@ -96,7 +96,7 @@ let mkuminus name arg = | ("-" | "-."), Pexp_constant(Const_float f) -> mkexp(Pexp_constant(Const_float(neg_float_string f))) | _ -> - mkexp(Pexp_apply(mkoperator ("~" ^ name) 1, [Simple, arg])) + mkexp(Pexp_apply(mkoperator ("~" ^ name) 1, [Parr_simple, arg])) let mkuplus name arg = let desc = arg.pexp_desc in @@ -107,7 +107,7 @@ let mkuplus name arg = | "+", Pexp_constant(Const_nativeint _) | ("+" | "+."), Pexp_constant(Const_float _) -> mkexp desc | _ -> - mkexp(Pexp_apply(mkoperator ("~" ^ name) 1, [Simple, arg])) + mkexp(Pexp_apply(mkoperator ("~" ^ name) 1, [Parr_simple, arg])) let mkexp_cons consloc args loc = Exp.mk ~loc (Pexp_construct(mkloc (Lident "::") consloc, Some args)) @@ -180,34 +180,34 @@ let bigarray_get arr arg = match bigarray_untuplify arg with [c1] -> mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array1" get)), - [Simple, arr; Simple, c1])) + [Parr_simple, arr; Parr_simple, c1])) | [c1;c2] -> mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array2" get)), - [Simple, arr; Simple, c1; Simple, c2])) + [Parr_simple, arr; Parr_simple, c1; Parr_simple, c2])) | [c1;c2;c3] -> mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array3" get)), - [Simple, arr; Simple, c1; Simple, c2; Simple, c3])) + [Parr_simple, arr; Parr_simple, c1; Parr_simple, c2; Parr_simple, c3])) | coords -> mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Genarray" "get")), - [Simple, arr; Simple, ghexp(Pexp_array coords)])) + [Parr_simple, arr; Parr_simple, ghexp(Pexp_array coords)])) let bigarray_set arr arg newval = let set = if !Clflags.fast then "unsafe_set" else "set" in match bigarray_untuplify arg with [c1] -> mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array1" set)), - [Simple, arr; Simple, c1; Simple, newval])) + [Parr_simple, arr; Parr_simple, c1; Parr_simple, newval])) | [c1;c2] -> mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array2" set)), - [Simple, arr; Simple, c1; Simple, c2; Simple, newval])) + [Parr_simple, arr; Parr_simple, c1; Parr_simple, c2; Parr_simple, newval])) | [c1;c2;c3] -> mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array3" set)), - [Simple, arr; Simple, c1; Simple, c2; Simple, c3; Simple, newval])) + [Parr_simple, arr; Parr_simple, c1; Parr_simple, c2; Parr_simple, c3; Parr_simple, newval])) | coords -> mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Genarray" "set")), - [Simple, arr; - Simple, ghexp(Pexp_array coords); - Simple, newval])) + [Parr_simple, arr; + Parr_simple, ghexp(Pexp_array coords); + Parr_simple, newval])) let lapply p1 p2 = if !Clflags.applicative_functors @@ -1082,13 +1082,13 @@ class_type: { $1 } | QUESTION LIDENT COLON simple_core_type_or_tuple_no_attr MINUSGREATER class_type - { mkcty(Pcty_arrow(Optional $2 , mkoption $4, $6)) } + { mkcty(Pcty_arrow(Parr_optional $2 , mkoption $4, $6)) } | OPTLABEL simple_core_type_or_tuple_no_attr MINUSGREATER class_type - { mkcty(Pcty_arrow(Optional $1, mkoption $2, $4)) } + { mkcty(Pcty_arrow(Parr_optional $1, mkoption $2, $4)) } | LIDENT COLON simple_core_type_or_tuple_no_attr MINUSGREATER class_type - { mkcty(Pcty_arrow(Labelled $1, $3, $5)) } + { mkcty(Pcty_arrow(Parr_labelled $1, $3, $5)) } | simple_core_type_or_tuple_no_attr MINUSGREATER class_type - { mkcty(Pcty_arrow(Simple, $1, $3)) } + { mkcty(Pcty_arrow(Parr_simple, $1, $3)) } ; class_signature: LBRACKET core_type_comma_list RBRACKET clty_longident @@ -1194,21 +1194,21 @@ seq_expr: ; labeled_simple_pattern: QUESTION LPAREN label_let_pattern opt_default RPAREN - { (Optional (fst $3), $4, snd $3) } + { (Parr_optional (fst $3), $4, snd $3) } | QUESTION label_var - { (Optional (fst $2), None, snd $2) } + { (Parr_optional (fst $2), None, snd $2) } | OPTLABEL LPAREN let_pattern opt_default RPAREN - { (Optional $1, $4, $3) } + { (Parr_optional $1, $4, $3) } | OPTLABEL pattern_var - { (Optional $1, None, $2) } + { (Parr_optional $1, None, $2) } | TILDE LPAREN label_let_pattern RPAREN - { (Labelled (fst $3), None, snd $3) } + { (Parr_labelled (fst $3), None, snd $3) } | TILDE label_var - { (Labelled (fst $2), None, snd $2) } + { (Parr_labelled (fst $2), None, snd $2) } | LABEL simple_pattern - { (Labelled $1, None, $2) } + { (Parr_labelled $1, None, $2) } | simple_pattern - { (Simple, None, $1) } + { (Parr_simple, None, $1) } ; pattern_var: LIDENT { mkpat(Ppat_var (mkrhs $1 1)) } @@ -1324,10 +1324,10 @@ expr: { mkexp(Pexp_setfield($1, mkrhs $3 3, $5)) } | simple_expr DOT LPAREN seq_expr RPAREN LESSMINUS expr { mkexp(Pexp_apply(ghexp(Pexp_ident(array_function "Array" "set")), - [Simple,$1; Simple,$4; Simple,$7])) } + [Parr_simple,$1; Parr_simple,$4; Parr_simple,$7])) } | simple_expr DOT LBRACKET seq_expr RBRACKET LESSMINUS expr { mkexp(Pexp_apply(ghexp(Pexp_ident(array_function "String" "set")), - [Simple,$1; Simple,$4; Simple,$7])) } + [Parr_simple,$1; Parr_simple,$4; Parr_simple,$7])) } | simple_expr DOT LBRACE expr RBRACE LESSMINUS expr { bigarray_set $1 $4 $7 } | label LESSMINUS expr @@ -1373,12 +1373,12 @@ simple_expr: { unclosed "(" 3 ")" 5 } | simple_expr DOT LPAREN seq_expr RPAREN { mkexp(Pexp_apply(ghexp(Pexp_ident(array_function "Array" "get")), - [Simple,$1; Simple,$4])) } + [Parr_simple,$1; Parr_simple,$4])) } | simple_expr DOT LPAREN seq_expr error { unclosed "(" 3 ")" 5 } | simple_expr DOT LBRACKET seq_expr RBRACKET { mkexp(Pexp_apply(ghexp(Pexp_ident(array_function "String" "get")), - [Simple,$1; Simple,$4])) } + [Parr_simple,$1; Parr_simple,$4])) } | simple_expr DOT LBRACKET seq_expr error { unclosed "[" 3 "]" 5 } | simple_expr DOT LBRACE expr RBRACE @@ -1415,9 +1415,9 @@ simple_expr: | mod_longident DOT LBRACKET expr_semi_list opt_semi error { unclosed "[" 3 "]" 6 } | PREFIXOP simple_expr - { mkexp(Pexp_apply(mkoperator $1 1, [Simple,$2])) } + { mkexp(Pexp_apply(mkoperator $1 1, [Parr_simple,$2])) } | BANG simple_expr - { mkexp(Pexp_apply(mkoperator "!" 1, [Simple,$2])) } + { mkexp(Pexp_apply(mkoperator "!" 1, [Parr_simple,$2])) } | NEW ext_attributes class_longident { mkexp_attrs (Pexp_new(mkrhs $3 3)) $2 } | LBRACELESS field_expr_list opt_semi GREATERRBRACE @@ -1458,19 +1458,19 @@ simple_labeled_expr_list: ; labeled_simple_expr: simple_expr %prec below_SHARP - { (Simple, $1) } + { (Parr_simple, $1) } | label_expr { $1 } ; label_expr: LABEL simple_expr %prec below_SHARP - { (Labelled $1, $2) } + { (Parr_labelled $1, $2) } | TILDE label_ident - { (Labelled (fst $2), snd $2) } + { (Parr_labelled (fst $2), snd $2) } | QUESTION label_ident - { (Optional (fst $2), snd $2) } + { (Parr_optional (fst $2), snd $2) } | OPTLABEL simple_expr %prec below_SHARP - { (Optional $1, $2) } + { (Parr_optional $1, $2) } ; label_ident: LIDENT { ($1, mkexp(Pexp_ident(mkrhs (Lident $1) 1))) } @@ -1993,13 +1993,13 @@ core_type2: simple_core_type_or_tuple { $1 } | QUESTION LIDENT COLON core_type2 MINUSGREATER core_type2 - { mktyp(Ptyp_arrow(Optional $2 , mkoption $4, $6)) } + { mktyp(Ptyp_arrow(Parr_optional $2 , mkoption $4, $6)) } | OPTLABEL core_type2 MINUSGREATER core_type2 - { mktyp(Ptyp_arrow(Optional $1 , mkoption $2, $4)) } + { mktyp(Ptyp_arrow(Parr_optional $1 , mkoption $2, $4)) } | LIDENT COLON core_type2 MINUSGREATER core_type2 - { mktyp(Ptyp_arrow(Labelled $1, $3, $5)) } + { mktyp(Ptyp_arrow(Parr_labelled $1, $3, $5)) } | core_type2 MINUSGREATER core_type2 - { mktyp(Ptyp_arrow(Simple, $1, $3)) } + { mktyp(Ptyp_arrow(Parr_simple, $1, $3)) } ; simple_core_type: diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index f039bb2f05..74c61182d9 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -14,6 +14,11 @@ open Asttypes +type arrow_flag = + | Parr_simple (* T -> ... *) + | Parr_labelled of string (* label:T -> ... *) + | Parr_optional of string (* ?label:T -> ... *) + (** {2 Extension points} *) type attribute = string loc * payload diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index bb5f7b5920..742793a71a 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -225,15 +225,15 @@ class printer ()= object(self:'self) method type_in_arrow f (label,({ptyp_desc;_}as c) ) = match label with - | Simple -> self#core_type1 f c (* otherwise parenthesize *) - | Optional s -> + | Parr_simple -> self#core_type1 f c (* otherwise parenthesize *) + | Parr_optional s -> begin match ptyp_desc with | Ptyp_constr ({txt;_}, l) -> assert (is_predef_option txt); pp f "?%s:%a" s (self#list self#core_type1) l | _ -> failwith "invalid input in print#type_in_arrow" end - | Labelled s -> + | Parr_labelled s -> pp f "%s:%a" s self#core_type1 c method core_type f x = if x.ptyp_attributes <> [] then begin @@ -409,9 +409,9 @@ class printer ()= object(self:'self) method label_exp f (l,opt,p) = match l with - | Simple -> + | Parr_simple -> pp f "%a@ " self#simple_pattern p (*single case pattern parens needed here *) - | Optional s -> + | Parr_optional s -> begin match p.ppat_desc with | Ppat_var {txt;_} when txt = s -> (match opt with @@ -423,7 +423,7 @@ class printer ()= object(self:'self) pp f "%s:(%a=@;%a)@;" l self#pattern1 p self#expression o | None -> pp f "%s:%a@;" l self#simple_pattern p) end - | Labelled s -> + | Parr_labelled s -> begin match p.ppat_desc with | Ppat_var {txt;_} when txt = s -> pp f "~%s@;" s @@ -1081,7 +1081,7 @@ class printer ()= object(self:'self) let rec pp_print_pexp_function f x = if x.pexp_attributes <> [] then pp f "=@;%a" self#expression x else match x.pexp_desc with - | Pexp_fun (Simple, eo, p, e) -> + | Pexp_fun (Parr_simple, eo, p, e) -> pp f "%a@ %a" self#simple_pattern p pp_print_pexp_function e | Pexp_fun (label, eo, p, e) -> pp f "%a@ %a" self#label_exp (label,eo,p) pp_print_pexp_function e @@ -1361,13 +1361,13 @@ class printer ()= object(self:'self) | _ -> None in match l with - | Simple -> self#expression2 f e ; (* level 2*) - | Optional s -> + | Parr_simple -> self#expression2 f e ; (* level 2*) + | Parr_optional s -> if Some s = simple_name then pp f "?%s" s else pp f "?%s:%a" s self#simple_expr e - | Labelled s -> + | Parr_labelled s -> if Some s = simple_name then pp f "~%s" s else diff --git a/parsing/pprintast.mli b/parsing/pprintast.mli index eca2730ef0..b67d2dc212 100644 --- a/parsing/pprintast.mli +++ b/parsing/pprintast.mli @@ -52,10 +52,10 @@ class printer : Format.formatter -> Parsetree.extension_constructor -> unit method label_exp : Format.formatter -> - Asttypes.arrow_flag * Parsetree.expression option * Parsetree.pattern -> + Parsetree.arrow_flag * Parsetree.expression option * Parsetree.pattern -> unit method label_x_expression_param : - Format.formatter -> Asttypes.arrow_flag * Parsetree.expression -> unit + Format.formatter -> Parsetree.arrow_flag * Parsetree.expression -> unit method list : ?sep:space_formatter -> ?first:space_formatter -> @@ -113,7 +113,7 @@ class printer : method type_params : Format.formatter -> (Parsetree.core_type * Asttypes.variance) list -> unit method type_in_arrow : - Format.formatter -> Asttypes.arrow_flag * Parsetree.core_type -> unit + Format.formatter -> Parsetree.arrow_flag * Parsetree.core_type -> unit method tyvar : Format.formatter -> string -> unit method under_pipe : 'b method under_semi : 'b diff --git a/parsing/printast.ml b/parsing/printast.ml index 5ff7733273..e291df46cd 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -126,9 +126,9 @@ let option i f ppf x = ;; let arrow_flag f = function - | Simple -> () - | Optional s -> fprintf f "?%s" s - | Labelled s -> fprintf f "%s" s + | Parr_simple -> () + | Parr_optional s -> fprintf f "?%s" s + | Parr_labelled s -> fprintf f "%s" s ;; let longident_loc i ppf li = line i ppf "%a\n" fmt_longident_loc li;; diff --git a/tools/untypeast.ml b/tools/untypeast.ml index 8c9f97d9e8..65fb88ec71 100644 --- a/tools/untypeast.ml +++ b/tools/untypeast.ml @@ -255,6 +255,11 @@ and untype_binding {vb_pat; vb_expr; vb_attributes; vb_loc} = pvb_loc = vb_loc; } +and untype_arrow_flag = function + | Types.Tarr_simple -> Parr_simple + | Types.Tarr_optional s -> Parr_optional s + | Types.Tarr_labelled s -> Parr_labelled s + and untype_expression exp = let desc = match exp.exp_desc with @@ -265,8 +270,8 @@ and untype_expression exp = List.map untype_binding list, untype_expression exp) | Texp_function (label, [{c_lhs=p; c_guard=None; c_rhs=e}], _) -> - Pexp_fun (label, None, untype_pattern p, untype_expression e) - | Texp_function (Simple, cases, _) -> + Pexp_fun (untype_arrow_flag label, None, untype_pattern p, untype_expression e) + | Texp_function (Types.Tarr_simple, cases, _) -> Pexp_function (untype_cases cases) | Texp_function _ -> assert false @@ -275,7 +280,7 @@ and untype_expression exp = List.fold_right (fun (label, expo, _) list -> match expo with None -> list - | Some exp -> (label, untype_expression exp) :: list + | Some exp -> (untype_arrow_flag label, untype_expression exp) :: list ) list []) | Texp_match (exp, cases, exn_cases, _) -> let merged_cases = untype_cases cases @@ -497,14 +502,14 @@ and untype_class_expr cexpr = | Tcl_structure clstr -> Pcl_structure (untype_class_structure clstr) | Tcl_fun (label, pat, _pv, cl, _partial) -> - Pcl_fun (label, None, untype_pattern pat, untype_class_expr cl) + Pcl_fun (untype_arrow_flag label, None, untype_pattern pat, untype_class_expr cl) | Tcl_apply (cl, args) -> Pcl_apply (untype_class_expr cl, List.fold_right (fun (label, expo, _) list -> match expo with None -> list - | Some exp -> (label, untype_expression exp) :: list + | Some exp -> (untype_arrow_flag label, untype_expression exp) :: list ) args []) | Tcl_let (rec_flat, bindings, _ivars, cl) -> @@ -529,7 +534,7 @@ and untype_class_type ct = | Tcty_constr (_path, lid, list) -> Pcty_constr (lid, List.map untype_core_type list) | Tcty_arrow (label, ct, cl) -> - Pcty_arrow (label, untype_core_type ct, untype_class_type cl) + Pcty_arrow (untype_arrow_flag label, untype_core_type ct, untype_class_type cl) in { pcty_desc = desc; pcty_loc = ct.cltyp_loc; @@ -564,7 +569,7 @@ and untype_core_type ct = Ttyp_any -> Ptyp_any | Ttyp_var s -> Ptyp_var s | Ttyp_arrow (label, ct1, ct2) -> - Ptyp_arrow (label, untype_core_type ct1, untype_core_type ct2) + Ptyp_arrow (untype_arrow_flag label, untype_core_type ct1, untype_core_type ct2) | Ttyp_tuple list -> Ptyp_tuple (List.map untype_core_type list) | Ttyp_constr (_path, lid, list) -> Ptyp_constr (lid, diff --git a/toplevel/trace.ml b/toplevel/trace.ml index 5bd67309ed..de98494071 100644 --- a/toplevel/trace.ml +++ b/toplevel/trace.ml @@ -12,7 +12,6 @@ (* The "trace" facility *) -open Asttypes open Format open Misc open Longident @@ -54,9 +53,9 @@ let invoke_traced_function codeptr env arg = Meta.invoke_traced_function codeptr env arg let print_label ppf = function - | Simple -> () - | Optional s -> fprintf ppf "?%s:" s - | Labelled s -> fprintf ppf "%s:" s + | Tarr_simple -> () + | Tarr_optional s -> fprintf ppf "?%s:" s + | Tarr_labelled s -> fprintf ppf "%s:" s (* If a function returns a functional value, wrap it into a trace code *) diff --git a/typing/btype.ml b/typing/btype.ml index f99011aa01..4510e7bbc1 100644 --- a/typing/btype.ml +++ b/typing/btype.ml @@ -12,7 +12,6 @@ (* Basic operations on core types *) -open Asttypes open Misc open Types @@ -547,21 +546,26 @@ let check_memorized_abbrevs () = (**********************************) let is_simple = function - | Simple -> true + | Tarr_simple -> true | _ -> false let is_optional = function - | Optional _ -> true + | Tarr_optional _ -> true | _ -> false let label_name = function - | Simple -> "" - | Optional s | Labelled s -> s + | Tarr_simple -> "" + | Tarr_optional s | Tarr_labelled s -> s let label_raw = function - | Simple -> "" - | Optional s -> "?" ^ s - | Labelled s -> s + | Tarr_simple -> "" + | Tarr_optional s -> "?" ^ s + | Tarr_labelled s -> s + +let tarr_of_parr = function + | Parsetree.Parr_simple -> Tarr_simple + | Parsetree.Parr_optional s -> Tarr_optional s + | Parsetree.Parr_labelled s -> Tarr_labelled s let prefixed_label_name = function | Simple -> assert false diff --git a/typing/btype.mli b/typing/btype.mli index 1caa60c867..b1db013205 100644 --- a/typing/btype.mli +++ b/typing/btype.mli @@ -164,12 +164,15 @@ val forget_abbrev: val is_simple : arrow_flag -> bool val is_optional : arrow_flag -> bool + val label_name : arrow_flag -> label val label_raw : arrow_flag -> label (* Returns the label name with first character '?' or '~' as appropriate. *) val prefixed_label_name : arrow_flag -> label +val tarr_of_parr : Parsetree.arrow_flag -> Types.arrow_flag + val extract_label : label -> (arrow_flag * 'a) list -> arrow_flag * 'a * (arrow_flag * 'a) list * (arrow_flag * 'a) list diff --git a/typing/ctype.ml b/typing/ctype.ml index e612ed580f..8267634ec8 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -2019,6 +2019,16 @@ let rec expands_to_datatype env ty = end | _ -> false +let arrows_are_compatible l1 l2 = + match l1, l2 with + | (Tarr_simple | Tarr_labelled _), (Tarr_simple | Tarr_labelled _) -> + true + | Tarr_optional _, Tarr_optional _ -> true + | _ -> false + +let classic_arrows_are_compatible l1 l2 = + l1 = l2 || !Clflags.classic && arrows_are_compatible l1 l2 + (* mcomp type_pairs subst env t1 t2 does not raise an exception if it is possible that t1 and t2 are actually equal, assuming the types in type_pairs are equal and @@ -2050,7 +2060,7 @@ let rec mcomp type_pairs env t1 t2 = match (t1'.desc, t2'.desc) with (Tvar _, Tvar _) -> assert false | (Tarrow (l1, t1, u1, _), Tarrow (l2, t2, u2, _)) - when l1 = l2 || not (is_optional l1 || is_optional l2) -> + when arrows_are_compatible l1 l2 -> mcomp type_pairs env t1 t2; mcomp type_pairs env u1 u2; | (Ttuple tl1, Ttuple tl2) -> @@ -2440,8 +2450,8 @@ and unify3 env t1 t1' t2 t2' = end; try begin match (d1, d2) with - (Tarrow (l1, t1, u1, c1), Tarrow (l2, t2, u2, c2)) when l1 = l2 || - !Clflags.classic && not (is_optional l1 || is_optional l2) -> + (Tarrow (l1, t1, u1, c1), Tarrow (l2, t2, u2, c2)) + when classic_arrows_are_compatible l1 l2 -> unify env t1 t2; unify env u1 u2; begin match commu_repr c1, commu_repr c2 with Clink r, c2 -> set_commu r c2 @@ -2840,7 +2850,9 @@ let filter_arrow env t l = link_type t t'; (t1, t2) | Tarrow(l', t1, t2, _) - when l = l' || !Clflags.classic && is_simple l && not (is_optional l') -> + when l = l' || !Clflags.classic + && l = Tarr_simple + && arrows_are_compatible l l' -> (t1, t2) | _ -> raise (Unify []) @@ -2962,8 +2974,8 @@ let rec moregen inst_nongen type_pairs env t1 t2 = (Tvar _, _) when may_instantiate inst_nongen t1' -> moregen_occur env t1'.level t2; link_type t1' t2 - | (Tarrow (l1, t1, u1, _), Tarrow (l2, t2, u2, _)) when l1 = l2 - || !Clflags.classic && not (is_optional l1 || is_optional l2) -> + | (Tarrow (l1, t1, u1, _), Tarrow (l2, t2, u2, _)) + when classic_arrows_are_compatible l1 l2 -> moregen inst_nongen type_pairs env t1 t2; moregen inst_nongen type_pairs env u1 u2 | (Ttuple tl1, Ttuple tl2) -> @@ -3233,8 +3245,8 @@ let rec eqtype rename type_pairs subst env t1 t2 = then raise (Unify []); subst := (t1', t2') :: !subst end - | (Tarrow (l1, t1, u1, _), Tarrow (l2, t2, u2, _)) when l1 = l2 - || !Clflags.classic && not (is_optional l1 || is_optional l2) -> + | (Tarrow (l1, t1, u1, _), Tarrow (l2, t2, u2, _)) + when classic_arrows_are_compatible l1 l2 -> eqtype rename type_pairs subst env t1 t2; eqtype rename type_pairs subst env u1 u2; | (Ttuple tl1, Ttuple tl2) -> @@ -3648,7 +3660,7 @@ let match_class_declarations env patt_params patt_type subj_params subj_type = (* Use moregeneral for class parameters, need to recheck everything to keeps relationships (PR#4824) *) let clty_params = - List.fold_right (fun ty cty -> Cty_arrow (Labelled "*",ty,cty)) in + List.fold_right (fun ty cty -> Cty_arrow (Tarr_labelled "*",ty,cty)) in match_class_types ~trace:false env (clty_params patt_params patt_type) (clty_params subj_params subj_type) @@ -3927,8 +3939,8 @@ let rec subtype_rec env trace t1 t2 cstrs = match (t1.desc, t2.desc) with (Tvar _, _) | (_, Tvar _) -> (trace, t1, t2, !univar_pairs)::cstrs - | (Tarrow(l1, t1, u1, _), Tarrow(l2, t2, u2, _)) when l1 = l2 - || !Clflags.classic && not (is_optional l1 || is_optional l2) -> + | (Tarrow(l1, t1, u1, _), Tarrow(l2, t2, u2, _)) + when classic_arrows_are_compatible l1 l2 -> let cstrs = subtype_rec env ((t2, t1)::trace) t2 t1 cstrs in subtype_rec env ((u1, u2)::trace) u1 u2 cstrs | (Ttuple tl1, Ttuple tl2) -> diff --git a/typing/ctype.mli b/typing/ctype.mli index 1d52765b08..d130009515 100644 --- a/typing/ctype.mli +++ b/typing/ctype.mli @@ -162,7 +162,7 @@ val unify_gadt: newtype_level:int -> Env.t ref -> type_expr -> type_expr -> unit val unify_var: Env.t -> type_expr -> type_expr -> unit (* Same as [unify], but allow free univars when first type is a variable. *) -val filter_arrow: Env.t -> type_expr -> arrow_flag -> type_expr * type_expr +val filter_arrow: Env.t -> type_expr -> Types.arrow_flag -> type_expr * type_expr (* A special case of unification (with l:'a -> 'b). *) val filter_method: Env.t -> string -> private_flag -> type_expr -> type_expr (* A special case of unification (with {m : 'a; 'b}). *) diff --git a/typing/printtyp.ml b/typing/printtyp.ml index 0bed485e63..c7fd5139a9 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -88,9 +88,9 @@ let tree_of_rec = function (* Print arrow lhs flag/label *) let arrow_flag ppf = function - | Simple -> () - | Optional s -> fprintf ppf "?%s" s - | Labelled s -> fprintf ppf "%s" s + | Tarr_simple -> () + | Tarr_optional s -> fprintf ppf "?%s" s + | Tarr_labelled s -> fprintf ppf "%s" s (* Print a raw type expression, with sharing *) @@ -543,16 +543,16 @@ let reset_and_mark_loops_list tyl = let print_labels = ref true let print_label ppf l = if match l with - | Simple -> false - | Optional _ -> true - | Labelled _ -> !print_labels + | Tarr_simple -> false + | Tarr_optional _ -> true + | Tarr_labelled _ -> !print_labels then fprintf ppf "%a:" arrow_flag l let raw_label = function - | Labelled s when !print_labels -> s - | Optional s -> "?" ^ s - | Simple | Labelled _ -> "" + | Tarr_labelled s when !print_labels -> s + | Tarr_optional s -> "?" ^ s + | Tarr_simple | Tarr_labelled _ -> "" let rec tree_of_typexp sch ty = let ty = repr ty in @@ -568,14 +568,16 @@ let rec tree_of_typexp sch ty = | Tarrow(l, ty1, ty2, _) -> let pr_arrow l ty1 ty2 = let lab = raw_label l in - let t1 = - if is_optional l then - match (repr ty1).desc with - | Tconstr(path, [ty], _) - when Path.same path Predef.path_option -> - tree_of_typexp sch ty - | _ -> Otyp_stuff "<hidden>" - else tree_of_typexp sch ty1 in + let t1 = match l with + | Tarr_optional _ -> + begin match (repr ty1).desc with + | Tconstr(path, [ty], _) + when Path.same path Predef.path_option -> + tree_of_typexp sch ty + | _ -> Otyp_stuff "<hidden>" + end + | _ -> tree_of_typexp sch ty1 + in Otyp_arrow (lab, t1, tree_of_typexp sch ty2) in pr_arrow l ty1 ty2 | Ttuple tyl -> @@ -1055,12 +1057,15 @@ let rec tree_of_class_type sch params = Octy_signature (self_ty, List.rev csil) | Cty_arrow (l, ty, cty) -> let lab = raw_label l in - let ty = - if is_optional l then - match (repr ty).desc with - | Tconstr(path, [ty], _) when Path.same path Predef.path_option -> ty - | _ -> newconstr (Path.Pident(Ident.create "<hidden>")) [] - else ty in + let ty = match l with + | Tarr_optional _ -> + begin match (repr ty).desc with + | Tconstr(path, [ty], _) + when Path.same path Predef.path_option -> ty + | _ -> newconstr (Path.Pident(Ident.create "<hidden>")) [] + end + | _ -> ty + in let tr = tree_of_typexp sch ty in Octy_arrow (lab, tr, tree_of_class_type sch params cty) diff --git a/typing/printtyped.ml b/typing/printtyped.ml index ae0c6bedfd..55466d063f 100644 --- a/typing/printtyped.ml +++ b/typing/printtyped.ml @@ -14,6 +14,7 @@ open Asttypes;; open Format;; open Lexing;; open Location;; +open Types;; open Typedtree;; let fmt_position f l = @@ -137,9 +138,9 @@ let bool i ppf x = line i ppf "%s\n" (string_of_bool x);; let label i ppf x = line i ppf "label=\"%s\"\n" x;; let arrow_flag f = function - | Simple -> fprintf f "" - | Optional s -> fprintf f "?%s" s - | Labelled s -> fprintf f "%s" s + | Tarr_simple -> fprintf f "" + | Tarr_optional s -> fprintf f "?%s" s + | Tarr_labelled s -> fprintf f "%s" s let attributes i ppf l = let i = i + 1 in diff --git a/typing/typeclass.ml b/typing/typeclass.ml index 5c16d61bdf..0918e4ddca 100644 --- a/typing/typeclass.ml +++ b/typing/typeclass.ml @@ -352,7 +352,7 @@ let type_constraint val_env sty sty' loc = let make_method loc cl_num expr = let open Ast_helper in let mkid s = mkloc s loc in - Exp.fun_ ~loc:expr.pexp_loc Simple None + Exp.fun_ ~loc:expr.pexp_loc Parr_simple None (Pat.alias ~loc (Pat.var ~loc (mkid "self-*")) (mkid ("self-" ^ cl_num))) expr @@ -495,12 +495,13 @@ and class_type env scty = let typ = Cty_signature clsig.csig_type in cltyp (Tcty_signature clsig) typ - | Pcty_arrow (l, sty, scty) -> + | Pcty_arrow (arr, sty, scty) -> let cty = transl_simple_type env false sty in let ty = cty.ctyp_type in + let arr = Btype.tarr_of_parr arr in let clty = class_type env scty in - let typ = Cty_arrow (l, ty, clty.cltyp_type) in - cltyp (Tcty_arrow (l, cty, clty)) typ + let typ = Cty_arrow (arr, ty, clty.cltyp_type) in + cltyp (Tcty_arrow (arr, cty, clty)) typ | Pcty_extension ext -> raise (Error_forward (Typetexp.error_of_extension ext)) @@ -673,7 +674,7 @@ let rec class_field self_loc cl_num self_type meths vars let field = lazy begin let meth_type = - Btype.newgenty (Tarrow(Simple, self_type, ty, Cok)) in + Btype.newgenty (Tarrow(Tarr_simple, self_type, ty, Cok)) in Ctype.raise_nongen_level (); vars := vars_local; let texp = type_expect met_env meth_expr meth_type in @@ -698,7 +699,7 @@ let rec class_field self_loc cl_num self_type meths vars Ctype.raise_nongen_level (); let meth_type = Ctype.newty - (Tarrow (Simple, self_type, + (Tarrow (Tarr_simple, self_type, Ctype.instance_def Predef.type_unit, Cok)) in vars := vars_local; let texp = type_expect met_env expr meth_type in @@ -914,10 +915,11 @@ and class_expr cl_num val_env met_env scl = is not detected for class-level let bindings. See #5975.*) in class_expr cl_num val_env met_env sfun - | Pcl_fun (l, None, spat, scl') -> + | Pcl_fun (arr, None, spat, scl') -> if !Clflags.principal then Ctype.begin_def (); + let arr = Btype.tarr_of_parr arr in let (pat, pv, val_env', met_env) = - Typecore.type_class_arg_pattern cl_num val_env met_env l spat + Typecore.type_class_arg_pattern cl_num val_env met_env arr spat in if !Clflags.principal then begin Ctype.end_def (); @@ -957,13 +959,13 @@ and class_expr cl_num val_env met_env scl = Ctype.raise_nongen_level (); let cl = class_expr cl_num val_env' met_env scl' in Ctype.end_def (); - if Btype.is_optional l && not_function cl.cl_type then + if Btype.is_optional arr && not_function cl.cl_type then Location.prerr_warning pat.pat_loc Warnings.Unerasable_optional_argument; - rc {cl_desc = Tcl_fun (l, pat, pv, cl, partial); + rc {cl_desc = Tcl_fun (arr, pat, pv, cl, partial); cl_loc = scl.pcl_loc; cl_type = Cty_arrow - (l, Ctype.instance_def pat.pat_type, cl.cl_type); + (arr, Ctype.instance_def pat.pat_type, cl.cl_type); cl_env = val_env; cl_attributes = scl.pcl_attributes; } @@ -971,6 +973,7 @@ and class_expr cl_num val_env met_env scl = if sargs = [] then Syntaxerr.ill_formed_ast scl.pcl_loc "Function application with no argument."; + let sargs = List.map (fun (arr,e) -> Btype.tarr_of_parr arr,e) sargs in if !Clflags.principal then Ctype.begin_def (); let cl = class_expr cl_num val_env met_env scl' in if !Clflags.principal then begin @@ -1040,7 +1043,7 @@ and class_expr cl_num val_env met_env scl = with Not_found -> sargs, more_sargs, if Btype.is_optional l && - (List.mem_assoc Simple sargs || List.mem_assoc Simple more_sargs) + (List.mem_assoc Tarr_simple sargs || List.mem_assoc Tarr_simple more_sargs) then Some (option_none ty0 Location.none) else None @@ -1160,11 +1163,12 @@ let var_option = Predef.type_option (Btype.newgenvar ()) let rec approx_declaration cl = match cl.pcl_desc with - Pcl_fun (l, _, _, cl) -> + Pcl_fun (arr, _, _, cl) -> + let arr = Btype.tarr_of_parr arr in let arg = - if Btype.is_optional l then Ctype.instance_def var_option + if Btype.is_optional arr then Ctype.instance_def var_option else Ctype.newvar () in - Ctype.newty (Tarrow (l, arg, approx_declaration cl, Cok)) + Ctype.newty (Tarrow (arr, arg, approx_declaration cl, Cok)) | Pcl_let (_, _, cl) -> approx_declaration cl | Pcl_constraint (cl, _) -> @@ -1173,11 +1177,12 @@ let rec approx_declaration cl = let rec approx_description ct = match ct.pcty_desc with - Pcty_arrow (l, _, ct) -> + Pcty_arrow (arr, _, ct) -> + let arr = Btype.tarr_of_parr arr in let arg = - if Btype.is_optional l then Ctype.instance_def var_option + if Btype.is_optional arr then Ctype.instance_def var_option else Ctype.newvar () in - Ctype.newty (Tarrow (l, arg, approx_description ct, Cok)) + Ctype.newty (Tarrow (arr, arg, approx_description ct, Cok)) | _ -> Ctype.newvar () (*******************************) @@ -1704,9 +1709,9 @@ let report_error env ppf = function "This class expression is not a class function, it cannot be applied" | Apply_wrong_label l -> let mark_label = function - | Simple -> "out label" - | Optional s -> sprintf " label ?%s" s - | Labelled s -> sprintf " label ~%s" s + | Tarr_simple -> "out label" + | Tarr_optional s -> sprintf " label ?%s" s + | Tarr_labelled s -> sprintf " label ~%s" s in fprintf ppf "This argument cannot be applied with%s" (mark_label l) | Pattern_type_clash ty -> diff --git a/typing/typecore.ml b/typing/typecore.ml index a2199ef102..3645ed36a6 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -117,6 +117,17 @@ let snd3 (_,x,_) = x let case lhs rhs = {c_lhs = lhs; c_guard = None; c_rhs = rhs} +let arrow_is_applicable ~expected ~applied = + expected = applied || + (!Clflags.classic && + match applied, expected with + | Tarr_simple, (Tarr_simple | Tarr_labelled _) -> true + | _ -> false) + +let is_optional = function + | Tarr_optional _ -> true + | _ -> false + (* Upper approximation of free identifiers on the parse tree *) let iter_expression f e = @@ -1294,7 +1305,10 @@ let type_class_arg_pattern cl_num val_env met_env l spat = iter_pattern finalize_variant pat end; List.iter (fun f -> f()) (get_ref pattern_force); - if is_optional l then unify_pat val_env pat (type_option (newvar ())); + begin match l with + | Tarr_optional _ -> unify_pat val_env pat (type_option (newvar ())); + | _ -> () + end; let (pv, met_env) = List.fold_right (fun (id, ty, name, loc, as_var) (pv, env) -> @@ -1478,10 +1492,11 @@ and is_nonexpansive_opt = function let rec approx_type env sty = match sty.ptyp_desc with - Ptyp_arrow (p, _, sty) -> - let ty1 = newvar () in - let ty1 = if is_optional p then type_option ty1 else ty1 in - newty (Tarrow (p, ty1, approx_type env sty, Cok)) + | Ptyp_arrow (Parr_optional s, _, sty) -> + let ty1 = type_option (newvar ()) in + newty (Tarrow (Tarr_optional s, ty1, approx_type env sty, Cok)) + | Ptyp_arrow (p, _, sty) -> + newty (Tarrow (tarr_of_parr p, newvar (), approx_type env sty, Cok)) | Ptyp_tuple args -> newty (Ttuple (List.map (approx_type env) args)) | Ptyp_constr (lid, ctl) -> @@ -1499,12 +1514,12 @@ let rec approx_type env sty = let rec type_approx env sexp = match sexp.pexp_desc with Pexp_let (_, _, e) -> type_approx env e - | Pexp_fun (p, _, _, e) when is_optional p -> - newty (Tarrow(p, type_option (newvar ()), type_approx env e, Cok)) + | Pexp_fun (Parr_optional s, _, _, e) -> + newty (Tarrow(Tarr_optional s, type_option (newvar ()), type_approx env e, Cok)) | Pexp_fun (p,_,_, e) -> - newty (Tarrow(p, newvar (), type_approx env e, Cok)) + newty (Tarrow(tarr_of_parr p, newvar (), type_approx env e, Cok)) | Pexp_function ({pc_rhs=e}::_) -> - newty (Tarrow(Simple, newvar (), type_approx env e, Cok)) + newty (Tarrow(Tarr_simple, newvar (), type_approx env e, Cok)) | Pexp_match (_, {pc_rhs=e}::_) -> type_approx env e | Pexp_try (e, _) -> type_approx env e | Pexp_tuple l -> newty (Ttuple(List.map (type_approx env) l)) @@ -1851,7 +1866,8 @@ and type_expect_ ?in_function env sexp ty_expected = exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_fun (l, Some default, spat, sexp) -> - assert(is_optional l); (* default allowed only with optional argument *) + (* default allowed only with optional argument *) + assert (match l with Parr_optional _ -> true | _ -> false); let open Ast_helper in let default_loc = default.pexp_loc in let scases = [ @@ -1883,10 +1899,10 @@ and type_expect_ ?in_function env sexp ty_expected = (* TODO: keep attributes, call type_function directly *) | Pexp_fun (l, None, spat, sexp) -> type_function ?in_function loc sexp.pexp_attributes env ty_expected - l [{pc_lhs=spat; pc_guard=None; pc_rhs=sexp}] + (tarr_of_parr l) [{pc_lhs=spat; pc_guard=None; pc_rhs=sexp}] | Pexp_function caselist -> type_function ?in_function - loc sexp.pexp_attributes env ty_expected Simple caselist + loc sexp.pexp_attributes env ty_expected Tarr_simple caselist | Pexp_apply(sfunct, sargs) -> if sargs = [] then Syntaxerr.ill_formed_ast loc "Function application with no argument."; @@ -2355,7 +2371,7 @@ and type_expect_ ?in_function env sexp ty_expected = filter_self_method env met Private meths privty in let method_type = newvar () in - let (obj_ty, res_ty) = filter_arrow env method_type Simple in + let (obj_ty, res_ty) = filter_arrow env method_type Tarr_simple in unify env obj_ty desc.val_type; unify env res_ty (instance env typ); let exp = @@ -2369,7 +2385,7 @@ and type_expect_ ?in_function env sexp ty_expected = exp_type = method_type; exp_attributes = []; (* check *) exp_env = env}, - [Simple, + [Tarr_simple, Some {exp_desc = Texp_ident(path, lid, desc); exp_loc = obj.exp_loc; exp_extra = []; exp_type = desc.val_type; @@ -2686,7 +2702,7 @@ and type_expect_ ?in_function env sexp ty_expected = | Pexp_extension ext -> raise (Error_forward (Typetexp.error_of_extension ext)) -and type_function ?in_function loc attrs env ty_expected l caselist = +and type_function ?in_function loc attrs env ty_expected (l : Types.arrow_flag) caselist = let (loc_fun, ty_fun) = match in_function with Some p -> p | None -> (loc, instance env ty_expected) @@ -2703,15 +2719,16 @@ and type_function ?in_function loc attrs env ty_expected l caselist = raise(Error(loc_fun, env, Too_many_arguments (in_function <> None, ty_fun))) in - let ty_arg = - if is_optional l then - let tv = newvar() in - begin - try unify env ty_arg (type_option tv) - with Unify _ -> assert false - end; - type_option tv - else ty_arg + let ty_arg, is_optional = + match l with + | Tarr_optional _ -> + let tv = newvar() in + begin + try unify env ty_arg (type_option tv) + with Unify _ -> assert false + end; + type_option tv, true + | _ -> ty_arg, false in if separate then begin end_def (); @@ -2725,7 +2742,7 @@ and type_function ?in_function loc attrs env ty_expected l caselist = let ls, tvar = list_labels env ty in ls = [] && not tvar in - if is_optional l && not_function ty_res then + if is_optional && not_function ty_res then Location.prerr_warning (List.hd cases).c_lhs.pat_loc Warnings.Unerasable_optional_argument; re { @@ -3056,7 +3073,7 @@ and type_argument env sarg ty_expected' ty_expected = (* ty_expected' may be generic *) let no_labels ty = let ls, tvar = list_labels env ty in - not tvar && List.for_all is_simple ls + not tvar && List.for_all (function Tarr_simple -> true | _ -> false) ls in let rec is_inferred sexp = match sexp.pexp_desc with @@ -3067,7 +3084,7 @@ and type_argument env sarg ty_expected' ty_expected = | _ -> false in match expand_head env ty_expected' with - {desc = Tarrow(Simple,ty_arg,ty_res,_); level = lv} when is_inferred sarg -> + {desc = Tarrow(Tarr_simple,ty_arg,ty_res,_); level = lv} when is_inferred sarg -> (* apply optional arguments when expected type is "" *) (* we must be very careful about not breaking the semantics *) if !Clflags.principal then begin_def (); @@ -3078,10 +3095,12 @@ and type_argument env sarg ty_expected' ty_expected = end; let rec make_args args ty_fun = match (expand_head env ty_fun).desc with - | Tarrow (l,ty_arg,ty_fun,_) when is_optional l -> + | Tarrow (Tarr_optional _ as l,ty_arg,ty_fun,_) -> let ty = option_none (instance env ty_arg) sarg.pexp_loc in make_args ((l, Some ty, Optional) :: args) ty_fun - | Tarrow (l,_,ty_res',_) when is_simple l || !Clflags.classic -> + | Tarrow (l,_,ty_res',_) + when (match l with Tarr_simple -> true | _ -> false) + || !Clflags.classic -> List.rev args, ty_fun, no_labels ty_res' | Tvar _ -> List.rev args, ty_fun, false | _ -> [], texp.exp_type, false @@ -3117,10 +3136,10 @@ and type_argument env sarg ty_expected' ty_expected = {texp with exp_type = ty_res; exp_desc = Texp_apply (texp, - args @ [Simple, Some eta_var, Required])} + args @ [Tarr_simple, Some eta_var, Required])} in { texp with exp_type = ty_fun; exp_desc = - Texp_function(Simple, [case eta_pat e], Total) } + Texp_function(Tarr_simple, [case eta_pat e], Total) } in Location.prerr_warning texp.exp_loc (Warnings.Eliminated_optional_arguments (List.map (fun (l, _, _) -> l) args)); @@ -3143,6 +3162,7 @@ and type_argument env sarg ty_expected' ty_expected = and type_application env funct sargs = (* funct.exp_type may be generic *) + let sargs = List.map (fun (arr,e) -> tarr_of_parr arr, e) sargs in let result_type omitted ty_fun = List.fold_left (fun ty_fun (l,ty,lv) -> newty2 lv (Tarrow(l,ty,ty_fun,Cok))) @@ -3155,7 +3175,7 @@ and type_application env funct sargs = let ignored = ref [] in let rec type_unknown_args (args : - (Asttypes.arrow_flag * (unit -> Typedtree.expression) option * + (Types.arrow_flag * (unit -> Typedtree.expression) option * Typedtree.optional) list) omitted ty_fun = function [] -> @@ -3180,8 +3200,8 @@ and type_application env funct sargs = Location.prerr_warning sarg1.pexp_loc Warnings.Unused_argument; unify env ty_fun (newty (Tarrow(l1,t1,t2,Clink(ref Cunknown)))); (t1, t2) - | Tarrow (l,t1,t2,_) when l = l1 - || !Clflags.classic && is_simple l1 && not (is_optional l) -> + | Tarrow (l,t1,t2,_) + when arrow_is_applicable ~expected:l ~applied:l1 -> (t1, t2) | td -> let ty_fun = @@ -3198,7 +3218,10 @@ and type_application env funct sargs = raise(Error(funct.exp_loc, env, Apply_non_function (expand_head env funct.exp_type))) in - let optional = if is_optional l1 then Optional else Required in + let optional = match l1 with + | Tarr_optional _ -> Optional + | _ -> Required + in let arg1 () = let arg1 = type_expect env sarg1 ty1 in if optional = Optional then @@ -3212,10 +3235,10 @@ and type_application env funct sargs = begin let ls, tvar = list_labels env funct.exp_type in not tvar && - let labels = List.filter (fun l -> not (is_optional l)) ls in + let labels = List.filter (function Tarr_optional _ -> false | _ -> true) ls in List.length labels = List.length sargs && - List.for_all (fun (l,_) -> is_simple l) sargs && - List.exists (fun l -> not (is_simple l)) labels && + List.for_all (function (l,_) -> l = Tarr_simple) sargs && + List.exists (fun l -> l <> Tarr_simple) labels && (Location.prerr_warning funct.exp_loc Warnings.Labels_omitted; true) end @@ -3234,16 +3257,19 @@ and type_application env funct sargs = end in let name = label_name l - and optional = if is_optional l then Optional else Required in + and optional = match l with + | Tarr_optional _ -> Optional + | _ -> Required + in let sargs, more_sargs, arg = - if ignore_labels && not (is_optional l) then begin + if ignore_labels && not (optional = Optional) then begin (* In classic mode, omitted = [] *) match sargs, more_sargs with (l', sarg0) :: _, _ -> raise(Error(sarg0.pexp_loc, env, Apply_wrong_label(l', ty_old))) | _, (l', sarg0) :: more_sargs -> - if l <> l' && not (is_simple l') then + if l <> l' && not (l' = Tarr_simple) then raise(Error(sarg0.pexp_loc, env, Apply_wrong_label(l', ty_fun'))) else @@ -3283,7 +3309,8 @@ and type_application env funct sargs = with Not_found -> sargs, more_sargs, if optional = Optional && - (List.mem_assoc Simple sargs || List.mem_assoc Simple more_sargs) + ( List.mem_assoc Tarr_simple sargs + || List.mem_assoc Tarr_simple more_sargs) then begin may_warn funct.exp_loc (Warnings.Without_principality "eliminated optional argument"); @@ -3312,8 +3339,8 @@ and type_application env funct sargs = match funct.exp_desc, sargs with (* Special case for ignore: avoid discarding warning *) Texp_ident (_, _, {val_kind=Val_prim{Primitive.prim_name="%ignore"}}), - [Simple, sarg] -> - let ty_arg, ty_res = filter_arrow env (instance env funct.exp_type) Simple in + [Tarr_simple, sarg] -> + let ty_arg, ty_res = filter_arrow env (instance env funct.exp_type) Tarr_simple in let exp = type_expect env sarg ty_arg in begin match (expand_head env exp.exp_type).desc with | Tarrow _ -> @@ -3322,7 +3349,7 @@ and type_application env funct sargs = add_delayed_check (fun () -> check_application_result env false exp) | _ -> () end; - ([Simple, Some exp, Required], ty_res) + ([Tarr_simple, Some exp, Required], ty_res) | _ -> let ty = funct.exp_type in if ignore_labels then @@ -3825,9 +3852,9 @@ let report_error env ppf = function end | Apply_wrong_label (l, ty) -> let print_label ppf = function - | Simple -> fprintf ppf "without label" - | Optional s -> fprintf ppf "with label ?%s" s - | Labelled s -> fprintf ppf "with label ~%s" s in + | Tarr_simple -> fprintf ppf "without label" + | Tarr_optional s -> fprintf ppf "with label ?%s" s + | Tarr_labelled s -> fprintf ppf "with label ~%s" s in reset_and_mark_loops ty; fprintf ppf "@[<v>@[<2>The function applied to this argument has type@ %a@]@.\ @@ -3914,9 +3941,11 @@ let report_error env ppf = function end | Abstract_wrong_label (l, ty) -> let label_mark = function - | Simple -> "but its first argument is not labelled" - | l -> sprintf "but its first argument is labelled %s" - (prefixed_label_name l) in + | Tarr_simple -> "but its first argument is not labelled" + | Tarr_labelled s -> + sprintf "but its first argument is labelled ~%s" s + | Tarr_optional s -> + sprintf "but its first argument is labelled ?%s" s in reset_and_mark_loops ty; fprintf ppf "@[<v>@[<2>This function should have type@ %a@]@,%s@]" type_expr ty (label_mark l) diff --git a/typing/types.ml b/typing/types.ml index 8c1b9d23c8..a1c51c54bc 100644 --- a/typing/types.ml +++ b/typing/types.ml @@ -14,6 +14,11 @@ open Asttypes +type arrow_flag = + | Tarr_simple (* T -> ... *) + | Tarr_labelled of string (* label:T -> ... *) + | Tarr_optional of string (* ?label:T -> ... *) + (* Type expressions for the core language *) type type_expr = diff --git a/typing/types.mli b/typing/types.mli index b577d345fc..a55c9946d2 100644 --- a/typing/types.mli +++ b/typing/types.mli @@ -14,6 +14,11 @@ open Asttypes +type arrow_flag = + | Tarr_simple (* T -> ... *) + | Tarr_labelled of string (* label:T -> ... *) + | Tarr_optional of string (* ?label:T -> ... *) + (* Type expressions for the core language *) type type_expr = diff --git a/typing/typetexp.ml b/typing/typetexp.ml index 605366bc4c..581b6bc448 100644 --- a/typing/typetexp.ml +++ b/typing/typetexp.ml @@ -422,6 +422,11 @@ let rec transl_type env policy styp = | Ptyp_arrow(l, st1, st2) -> let cty1 = transl_type env policy st1 in let cty2 = transl_type env policy st2 in + let l = match l with + | Parr_simple -> Tarr_simple + | Parr_optional s -> Tarr_optional s + | Parr_labelled s -> Tarr_labelled s + in let ty = newty (Tarrow(l, cty1.ctyp_type, cty2.ctyp_type, Cok)) in ctyp (Ttyp_arrow (l, cty1, cty2)) ty | Ptyp_tuple stl -> From 879785b4218ffbef7962a777c67013df66f2f4d1 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Thu, 3 Apr 2014 15:11:49 +0100 Subject: [PATCH 311/494] Remove Typedtree.optional, as its purpose was redundant. --- bytecomp/translcore.ml | 11 +++++----- bytecomp/translcore.mli | 2 +- ocamldoc/odoc_ast.ml | 2 +- tools/tast_iter.ml | 4 ++-- tools/untypeast.ml | 4 ++-- typing/printtyped.ml | 2 +- typing/typeclass.ml | 10 ++++----- typing/typecore.ml | 45 +++++++++++++++-------------------------- typing/typedtree.ml | 5 ++--- typing/typedtree.mli | 5 ++--- typing/typedtreeIter.ml | 4 ++-- typing/typedtreeMap.ml | 9 ++++----- 12 files changed, 43 insertions(+), 60 deletions(-) diff --git a/bytecomp/translcore.ml b/bytecomp/translcore.ml index cda7321f64..660f62b80d 100644 --- a/bytecomp/translcore.ml +++ b/bytecomp/translcore.ml @@ -672,7 +672,7 @@ and transl_exp0 e = | Texp_apply({exp_desc = Texp_ident(path, _, {val_kind = Val_prim p})}, oargs) when List.length oargs >= p.prim_arity - && List.for_all (fun (_, arg,_) -> arg <> None) oargs -> + && List.for_all (fun (_, arg) -> arg <> None) oargs -> let args, args' = cut p.prim_arity oargs in let wrap f = if args' = [] @@ -682,7 +682,7 @@ and transl_exp0 e = let wrap0 f = if args' = [] then f else wrap f in let args = - List.map (function _, Some x, _ -> x | _ -> assert false) args in + List.map (function _, Some x -> x | _ -> assert false) args in let argl = transl_list args in let public_send = p.prim_name = "%send" || not !Clflags.native_code && p.prim_name = "%sendcache"in @@ -966,7 +966,7 @@ and transl_apply lam sargs loc = Lapply(lexp, args, loc) in let rec build_apply lam args = function - (None, optional) :: l -> + | (None, optional) :: l -> let defs = ref [] in let protect name lam = match lam with @@ -977,7 +977,7 @@ and transl_apply lam sargs loc = Lvar id in let args, args' = - if List.for_all (fun (_,opt) -> opt = Optional) args then [], args + if List.for_all snd args then [], args else args, [] in let lam = if args = [] then lam else lapply lam (List.rev_map fst args) in @@ -1001,7 +1001,8 @@ and transl_apply lam sargs loc = | [] -> lapply lam (List.rev_map fst args) in - build_apply lam [] (List.map (fun (l, x,o) -> may_map transl_exp x, o) sargs) + build_apply lam [] + (List.map (fun (l, x) -> may_map transl_exp x, Btype.is_optional l) sargs) and transl_function loc untuplify_fn repr partial cases = match cases with diff --git a/bytecomp/translcore.mli b/bytecomp/translcore.mli index 8d4b119de3..b8df67788a 100644 --- a/bytecomp/translcore.mli +++ b/bytecomp/translcore.mli @@ -18,7 +18,7 @@ open Typedtree open Lambda val transl_exp: expression -> lambda -val transl_apply: lambda -> (Types.arrow_flag * expression option * optional) list +val transl_apply: lambda -> (Types.arrow_flag * expression option) list -> Location.t -> lambda val transl_let: rec_flag -> value_binding list -> lambda -> lambda val transl_primitive: Location.t -> Primitive.description -> lambda diff --git a/ocamldoc/odoc_ast.ml b/ocamldoc/odoc_ast.ml index 2e6d1ded69..a897e3db0c 100644 --- a/ocamldoc/odoc_ast.ml +++ b/ocamldoc/odoc_ast.ml @@ -797,7 +797,7 @@ module Analyser = Odoc_messages.object_end in let param_exps = List.fold_left - (fun acc -> fun (_, exp_opt, _) -> + (fun acc -> fun (_, exp_opt) -> match exp_opt with None -> acc | Some e -> acc @ [e]) diff --git a/tools/tast_iter.ml b/tools/tast_iter.ml index 6afbe8cd00..235c0584ad 100644 --- a/tools/tast_iter.ml +++ b/tools/tast_iter.ml @@ -111,7 +111,7 @@ let expression sub exp = sub # cases cases | Texp_apply (exp, list) -> sub # expression exp; - List.iter (fun (_, expo, _) -> opt (sub # expression) expo) list + List.iter (fun (_, expo) -> opt (sub # expression) expo) list | Texp_match (exp, cases, exn_cases, _) -> sub # expression exp; sub # cases cases; @@ -258,7 +258,7 @@ let class_expr sub cexpr = sub # class_expr cl | Tcl_apply (cl, args) -> sub # class_expr cl; - List.iter (fun (_label, expo, _) -> opt (sub # expression) expo) args + List.iter (fun (_label, expo) -> opt (sub # expression) expo) args | Tcl_let (rec_flat, bindings, ivars, cl) -> sub # bindings (rec_flat, bindings); List.iter (fun (_id, _, exp) -> sub # expression exp) ivars; diff --git a/tools/untypeast.ml b/tools/untypeast.ml index 65fb88ec71..79f9ada987 100644 --- a/tools/untypeast.ml +++ b/tools/untypeast.ml @@ -277,7 +277,7 @@ and untype_expression exp = assert false | Texp_apply (exp, list) -> Pexp_apply (untype_expression exp, - List.fold_right (fun (label, expo, _) list -> + List.fold_right (fun (label, expo) list -> match expo with None -> list | Some exp -> (untype_arrow_flag label, untype_expression exp) :: list @@ -506,7 +506,7 @@ and untype_class_expr cexpr = | Tcl_apply (cl, args) -> Pcl_apply (untype_class_expr cl, - List.fold_right (fun (label, expo, _) list -> + List.fold_right (fun (label, expo) list -> match expo with None -> list | Some exp -> (untype_arrow_flag label, untype_expression exp) :: list diff --git a/typing/printtyped.ml b/typing/printtyped.ml index 55466d063f..f452cf5f3d 100644 --- a/typing/printtyped.ml +++ b/typing/printtyped.ml @@ -821,7 +821,7 @@ and longident_x_expression i ppf (li, _, e) = line i ppf "%a\n" fmt_longident li; expression (i+1) ppf e; -and label_x_expression i ppf (l, e, _) = +and label_x_expression i ppf (l, e) = line i ppf "<label> \"%a\"\n" arrow_flag l; (match e with None -> () | Some e -> expression (i+1) ppf e) diff --git a/typing/typeclass.ml b/typing/typeclass.ml index 0918e4ddca..419839a9af 100644 --- a/typing/typeclass.ml +++ b/typing/typeclass.ml @@ -1002,9 +1002,7 @@ and class_expr cl_num val_env met_env scl = match ty_fun, ty_fun0 with | Cty_arrow (l, ty, ty_fun), Cty_arrow (_, ty0, ty_fun0) when sargs <> [] || more_sargs <> [] -> - let name = Btype.label_name l - and optional = - if Btype.is_optional l then Optional else Required in + let name = Btype.label_name l in let sargs, more_sargs, arg = if ignore_labels && not (Btype.is_optional l) then begin match sargs, more_sargs with @@ -1029,11 +1027,11 @@ and class_expr cl_num val_env met_env scl = Btype.extract_label name more_sargs in (l', sarg0, sargs @ sargs1, sargs2) in - if optional = Required && Btype.is_optional l' then + if not (Btype.is_optional l) && Btype.is_optional l' then Location.prerr_warning sarg0.pexp_loc (Warnings.Nonoptional_label (Btype.label_raw l)); sargs, more_sargs, - if optional = Required || Btype.is_optional l' then + if not (Btype.is_optional l) || Btype.is_optional l' then Some (type_argument val_env sarg0 ty ty0) else let ty' = extract_option_type val_env ty @@ -1049,7 +1047,7 @@ and class_expr cl_num val_env met_env scl = else None in let omitted = if arg = None then (l,ty0) :: omitted else omitted in - type_args ((l,arg,optional)::args) omitted ty_fun ty_fun0 + type_args ((l,arg)::args) omitted ty_fun ty_fun0 sargs more_sargs | _ -> match sargs @ more_sargs with diff --git a/typing/typecore.ml b/typing/typecore.ml index 3645ed36a6..8fcf4a7e74 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1402,7 +1402,7 @@ let rec is_nonexpansive exp = List.for_all (fun vb -> is_nonexpansive vb.vb_expr) pat_exp_list && is_nonexpansive body | Texp_function _ -> true - | Texp_apply(e, (_,None,_)::el) -> + | Texp_apply(e, (_,None)::el) -> is_nonexpansive e && List.for_all is_nonexpansive_opt (List.map snd3 el) | Texp_match(e, cases, [], _) -> is_nonexpansive e && @@ -2390,8 +2390,7 @@ and type_expect_ ?in_function env sexp ty_expected = exp_loc = obj.exp_loc; exp_extra = []; exp_type = desc.val_type; exp_attributes = []; (* check *) - exp_env = env}, - Required]) + exp_env = env}]) in (Tmeth_name met, Some (re {exp_desc = exp; exp_loc = loc; exp_extra = []; @@ -3097,7 +3096,7 @@ and type_argument env sarg ty_expected' ty_expected = match (expand_head env ty_fun).desc with | Tarrow (Tarr_optional _ as l,ty_arg,ty_fun,_) -> let ty = option_none (instance env ty_arg) sarg.pexp_loc in - make_args ((l, Some ty, Optional) :: args) ty_fun + make_args ((l, Some ty) :: args) ty_fun | Tarrow (l,_,ty_res',_) when (match l with Tarr_simple -> true | _ -> false) || !Clflags.classic -> @@ -3134,9 +3133,7 @@ and type_argument env sarg ty_expected' ty_expected = let func texp = let e = {texp with exp_type = ty_res; exp_desc = - Texp_apply - (texp, - args @ [Tarr_simple, Some eta_var, Required])} + Texp_apply (texp, args @ [Tarr_simple, Some eta_var])} in { texp with exp_type = ty_fun; exp_desc = Texp_function(Tarr_simple, [case eta_pat e], Total) } @@ -3174,14 +3171,12 @@ and type_application env funct sargs = in let ignored = ref [] in let rec type_unknown_args - (args : - (Types.arrow_flag * (unit -> Typedtree.expression) option * - Typedtree.optional) list) + (args : (Types.arrow_flag * (unit -> Typedtree.expression) option) list) omitted ty_fun = function [] -> (List.map - (function l, None, x -> l, None, x - | l, Some f, x -> l, Some (f ()), x) + (function l, None -> l, None + | l, Some f -> l, Some (f ())) (List.rev args), instance env (result_type omitted ty_fun)) | (l1, sarg1) :: sargl -> @@ -3218,17 +3213,13 @@ and type_application env funct sargs = raise(Error(funct.exp_loc, env, Apply_non_function (expand_head env funct.exp_type))) in - let optional = match l1 with - | Tarr_optional _ -> Optional - | _ -> Required - in let arg1 () = let arg1 = type_expect env sarg1 ty1 in - if optional = Optional then + if Btype.is_optional l1 then unify_exp env arg1 (type_option(newvar())); arg1 in - type_unknown_args ((l1, Some arg1, optional) :: args) omitted ty2 sargl + type_unknown_args ((l1, Some arg1) :: args) omitted ty2 sargl in let ignore_labels = !Clflags.classic || @@ -3256,13 +3247,9 @@ and type_application env funct sargs = Location.prerr_warning loc w end in - let name = label_name l - and optional = match l with - | Tarr_optional _ -> Optional - | _ -> Required - in + let name = label_name l in let sargs, more_sargs, arg = - if ignore_labels && not (optional = Optional) then begin + if ignore_labels && not (is_optional l) then begin (* In classic mode, omitted = [] *) match sargs, more_sargs with (l', sarg0) :: _, _ -> @@ -3293,11 +3280,11 @@ and type_application env funct sargs = (Warnings.Not_principal "commuting this argument"); (l', sarg0, sargs @ sargs1, sargs2) in - if optional = Required && is_optional l' then + if not (is_optional l) && is_optional l' then Location.prerr_warning sarg0.pexp_loc (Warnings.Nonoptional_label (Btype.label_raw l)); sargs, more_sargs, - if optional = Required || is_optional l' then + if not (is_optional l) || is_optional l' then Some (fun () -> type_argument env sarg0 ty ty0) else begin may_warn sarg0.pexp_loc @@ -3308,7 +3295,7 @@ and type_application env funct sargs = end with Not_found -> sargs, more_sargs, - if optional = Optional && + if is_optional l && ( List.mem_assoc Tarr_simple sargs || List.mem_assoc Tarr_simple more_sargs) then begin @@ -3325,7 +3312,7 @@ and type_application env funct sargs = let omitted = if arg = None then (l,ty,lv) :: omitted else omitted in let ty_old = if sargs = [] then ty_fun else ty_old in - type_args ((l,arg,optional)::args) omitted ty_fun ty_fun0 + type_args ((l,arg)::args) omitted ty_fun ty_fun0 ty_old sargs more_sargs | _ -> match sargs with @@ -3349,7 +3336,7 @@ and type_application env funct sargs = add_delayed_check (fun () -> check_application_result env false exp) | _ -> () end; - ([Tarr_simple, Some exp, Required], ty_res) + ([Tarr_simple, Some exp], ty_res) | _ -> let ty = funct.exp_type in if ignore_labels then diff --git a/typing/typedtree.ml b/typing/typedtree.ml index 3c4b0503da..fc880b074a 100644 --- a/typing/typedtree.ml +++ b/typing/typedtree.ml @@ -19,7 +19,6 @@ open Types (* Value expressions for the core language *) type partial = Partial | Total -type optional = Required | Optional type attribute = Parsetree.attribute type attributes = attribute list @@ -75,7 +74,7 @@ and expression_desc = | Texp_constant of constant | Texp_let of rec_flag * value_binding list * expression | Texp_function of arrow_flag * case list * partial - | Texp_apply of expression * (arrow_flag * expression option * optional) list + | Texp_apply of expression * (arrow_flag * expression option) list | Texp_match of expression * case list * case list * partial | Texp_try of expression * case list | Texp_tuple of expression list @@ -133,7 +132,7 @@ and class_expr_desc = | Tcl_structure of class_structure | Tcl_fun of arrow_flag * pattern * (Ident.t * string loc * expression) list * class_expr * partial - | Tcl_apply of class_expr * (arrow_flag * expression option * optional) list + | Tcl_apply of class_expr * (arrow_flag * expression option) list | Tcl_let of rec_flag * value_binding list * (Ident.t * string loc * expression) list * class_expr | Tcl_constraint of diff --git a/typing/typedtree.mli b/typing/typedtree.mli index 4abd4ccad2..6f2c3f46b9 100644 --- a/typing/typedtree.mli +++ b/typing/typedtree.mli @@ -18,7 +18,6 @@ open Types (* Value expressions for the core language *) type partial = Partial | Total -type optional = Required | Optional type attribute = Parsetree.attribute type attributes = attribute list @@ -74,7 +73,7 @@ and expression_desc = | Texp_constant of constant | Texp_let of rec_flag * value_binding list * expression | Texp_function of arrow_flag * case list * partial - | Texp_apply of expression * (arrow_flag * expression option * optional) list + | Texp_apply of expression * (arrow_flag * expression option) list | Texp_match of expression * case list * case list * partial | Texp_try of expression * case list | Texp_tuple of expression list @@ -132,7 +131,7 @@ and class_expr_desc = | Tcl_structure of class_structure | Tcl_fun of arrow_flag * pattern * (Ident.t * string loc * expression) list * class_expr * partial - | Tcl_apply of class_expr * (arrow_flag * expression option * optional) list + | Tcl_apply of class_expr * (arrow_flag * expression option) list | Tcl_let of rec_flag * value_binding list * (Ident.t * string loc * expression) list * class_expr | Tcl_constraint of diff --git a/typing/typedtreeIter.ml b/typing/typedtreeIter.ml index ff28e1317f..1be6f0e472 100644 --- a/typing/typedtreeIter.ml +++ b/typing/typedtreeIter.ml @@ -276,7 +276,7 @@ module MakeIterator(Iter : IteratorArgument) : sig iter_cases cases | Texp_apply (exp, list) -> iter_expression exp; - List.iter (fun (label, expo, _) -> + List.iter (fun (label, expo) -> match expo with None -> () | Some exp -> iter_expression exp @@ -486,7 +486,7 @@ module MakeIterator(Iter : IteratorArgument) : sig | Tcl_apply (cl, args) -> iter_class_expr cl; - List.iter (fun (label, expo, _) -> + List.iter (fun (label, expo) -> match expo with None -> () | Some exp -> iter_expression exp diff --git a/typing/typedtreeMap.ml b/typing/typedtreeMap.ml index c31da631c2..99cbf18fd8 100644 --- a/typing/typedtreeMap.ml +++ b/typing/typedtreeMap.ml @@ -266,13 +266,13 @@ module MakeMap(Map : MapArgument) = struct Texp_function (label, map_cases cases, partial) | Texp_apply (exp, list) -> Texp_apply (map_expression exp, - List.map (fun (label, expo, optional) -> + List.map (fun (label, expo) -> let expo = match expo with None -> expo | Some exp -> Some (map_expression exp) in - (label, expo, optional) + (label, expo) ) list ) | Texp_match (exp, list1, list2, partial) -> Texp_match ( @@ -526,9 +526,8 @@ module MakeMap(Map : MapArgument) = struct | Tcl_apply (cl, args) -> Tcl_apply (map_class_expr cl, - List.map (fun (label, expo, optional) -> - (label, may_map map_expression expo, - optional) + List.map (fun (label, expo) -> + (label, may_map map_expression expo) ) args) | Tcl_let (rec_flat, bindings, ivars, cl) -> Tcl_let (rec_flat, map_bindings rec_flat bindings, From 9e1d419536c36f937de5d0099cd9802e5083871b Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Thu, 3 Apr 2014 17:45:23 +0100 Subject: [PATCH 312/494] WIP: refining arrow_flag with apply_flag --- bytecomp/translcore.ml | 9 +- bytecomp/translcore.mli | 2 +- ocamldoc/odoc_misc.ml | 2 +- parsing/ast_helper.mli | 4 +- parsing/parser.mly | 48 ++--- parsing/parsetree.mli | 9 +- parsing/pprintast.ml | 6 +- parsing/pprintast.mli | 2 +- parsing/printast.ml | 7 +- tools/untypeast.ml | 9 +- typing/btype.ml | 50 ++++- typing/btype.mli | 15 +- typing/printtyped.ml | 7 +- typing/typeclass.ml | 425 +++++++++++++++++++++------------------- typing/typeclass.mli | 2 +- typing/typecore.ml | 175 +++++++++-------- typing/typecore.mli | 2 +- typing/typedtree.ml | 4 +- typing/typedtree.mli | 4 +- typing/types.ml | 5 + typing/types.mli | 5 + 21 files changed, 444 insertions(+), 348 deletions(-) diff --git a/bytecomp/translcore.ml b/bytecomp/translcore.ml index 660f62b80d..cf3978f499 100644 --- a/bytecomp/translcore.ml +++ b/bytecomp/translcore.ml @@ -1001,8 +1001,13 @@ and transl_apply lam sargs loc = | [] -> lapply lam (List.rev_map fst args) in - build_apply lam [] - (List.map (fun (l, x) -> may_map transl_exp x, Btype.is_optional l) sargs) + let prepare_arg (l,x) = + may_map transl_exp x, + match l with + | Tapp_optional _ -> true + | _ -> false + in + build_apply lam [] (List.map prepare_arg sargs) and transl_function loc untuplify_fn repr partial cases = match cases with diff --git a/bytecomp/translcore.mli b/bytecomp/translcore.mli index b8df67788a..8a37988d66 100644 --- a/bytecomp/translcore.mli +++ b/bytecomp/translcore.mli @@ -18,7 +18,7 @@ open Typedtree open Lambda val transl_exp: expression -> lambda -val transl_apply: lambda -> (Types.arrow_flag * expression option) list +val transl_apply: lambda -> (Types.apply_flag * expression option) list -> Location.t -> lambda val transl_let: rec_flag -> value_binding list -> lambda -> lambda val transl_primitive: Location.t -> Primitive.description -> lambda diff --git a/ocamldoc/odoc_misc.ml b/ocamldoc/odoc_misc.ml index 519c3f7c72..e547b15417 100644 --- a/ocamldoc/odoc_misc.ml +++ b/ocamldoc/odoc_misc.ml @@ -469,7 +469,7 @@ let create_index_lists elements string_of_ele = (*** for labels *) -let is_optional = Btype.is_optional +let is_optional = Btype.arrow_is_optional let label_name = Btype.label_name let label_prefix = function | Types.Tarr_simple -> "" diff --git a/parsing/ast_helper.mli b/parsing/ast_helper.mli index 85a3215b28..5bf9b62a1d 100644 --- a/parsing/ast_helper.mli +++ b/parsing/ast_helper.mli @@ -99,7 +99,7 @@ module Exp: -> pattern -> expression -> expression val function_: ?loc:loc -> ?attrs:attrs -> case list -> expression val apply: ?loc:loc -> ?attrs:attrs -> expression - -> (arrow_flag * expression) list -> expression + -> (apply_flag * expression) list -> expression val match_: ?loc:loc -> ?attrs:attrs -> expression -> case list -> expression val try_: ?loc:loc -> ?attrs:attrs -> expression -> case list -> expression @@ -342,7 +342,7 @@ module Cl: val constr: ?loc:loc -> ?attrs:attrs -> lid -> core_type list -> class_expr val structure: ?loc:loc -> ?attrs:attrs -> class_structure -> class_expr val fun_: ?loc:loc -> ?attrs:attrs -> arrow_flag -> expression option -> pattern -> class_expr -> class_expr - val apply: ?loc:loc -> ?attrs:attrs -> class_expr -> (arrow_flag * expression) list -> class_expr + val apply: ?loc:loc -> ?attrs:attrs -> class_expr -> (apply_flag * expression) list -> class_expr val let_: ?loc:loc -> ?attrs:attrs -> rec_flag -> value_binding list -> class_expr -> class_expr val constraint_: ?loc:loc -> ?attrs:attrs -> class_expr -> class_type -> class_expr val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_expr diff --git a/parsing/parser.mly b/parsing/parser.mly index 8f297baf29..13f513dc4a 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -76,7 +76,7 @@ let ghunit () = ghexp (Pexp_construct (mknoloc (Lident "()"), None)) let mkinfix arg1 name arg2 = - mkexp(Pexp_apply(mkoperator name 2, [Parr_simple, arg1; Parr_simple, arg2])) + mkexp(Pexp_apply(mkoperator name 2, [Papp_simple, arg1; Papp_simple, arg2])) let neg_float_string f = if String.length f > 0 && f.[0] = '-' @@ -96,7 +96,7 @@ let mkuminus name arg = | ("-" | "-."), Pexp_constant(Const_float f) -> mkexp(Pexp_constant(Const_float(neg_float_string f))) | _ -> - mkexp(Pexp_apply(mkoperator ("~" ^ name) 1, [Parr_simple, arg])) + mkexp(Pexp_apply(mkoperator ("~" ^ name) 1, [Papp_simple, arg])) let mkuplus name arg = let desc = arg.pexp_desc in @@ -107,7 +107,7 @@ let mkuplus name arg = | "+", Pexp_constant(Const_nativeint _) | ("+" | "+."), Pexp_constant(Const_float _) -> mkexp desc | _ -> - mkexp(Pexp_apply(mkoperator ("~" ^ name) 1, [Parr_simple, arg])) + mkexp(Pexp_apply(mkoperator ("~" ^ name) 1, [Papp_simple, arg])) let mkexp_cons consloc args loc = Exp.mk ~loc (Pexp_construct(mkloc (Lident "::") consloc, Some args)) @@ -180,34 +180,34 @@ let bigarray_get arr arg = match bigarray_untuplify arg with [c1] -> mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array1" get)), - [Parr_simple, arr; Parr_simple, c1])) + [Papp_simple, arr; Papp_simple, c1])) | [c1;c2] -> mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array2" get)), - [Parr_simple, arr; Parr_simple, c1; Parr_simple, c2])) + [Papp_simple, arr; Papp_simple, c1; Papp_simple, c2])) | [c1;c2;c3] -> mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array3" get)), - [Parr_simple, arr; Parr_simple, c1; Parr_simple, c2; Parr_simple, c3])) + [Papp_simple, arr; Papp_simple, c1; Papp_simple, c2; Papp_simple, c3])) | coords -> mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Genarray" "get")), - [Parr_simple, arr; Parr_simple, ghexp(Pexp_array coords)])) + [Papp_simple, arr; Papp_simple, ghexp(Pexp_array coords)])) let bigarray_set arr arg newval = let set = if !Clflags.fast then "unsafe_set" else "set" in match bigarray_untuplify arg with [c1] -> mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array1" set)), - [Parr_simple, arr; Parr_simple, c1; Parr_simple, newval])) + [Papp_simple, arr; Papp_simple, c1; Papp_simple, newval])) | [c1;c2] -> mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array2" set)), - [Parr_simple, arr; Parr_simple, c1; Parr_simple, c2; Parr_simple, newval])) + [Papp_simple, arr; Papp_simple, c1; Papp_simple, c2; Papp_simple, newval])) | [c1;c2;c3] -> mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array3" set)), - [Parr_simple, arr; Parr_simple, c1; Parr_simple, c2; Parr_simple, c3; Parr_simple, newval])) + [Papp_simple, arr; Papp_simple, c1; Papp_simple, c2; Papp_simple, c3; Papp_simple, newval])) | coords -> mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Genarray" "set")), - [Parr_simple, arr; - Parr_simple, ghexp(Pexp_array coords); - Parr_simple, newval])) + [Papp_simple, arr; + Papp_simple, ghexp(Pexp_array coords); + Papp_simple, newval])) let lapply p1 p2 = if !Clflags.applicative_functors @@ -1324,10 +1324,10 @@ expr: { mkexp(Pexp_setfield($1, mkrhs $3 3, $5)) } | simple_expr DOT LPAREN seq_expr RPAREN LESSMINUS expr { mkexp(Pexp_apply(ghexp(Pexp_ident(array_function "Array" "set")), - [Parr_simple,$1; Parr_simple,$4; Parr_simple,$7])) } + [Papp_simple,$1; Papp_simple,$4; Papp_simple,$7])) } | simple_expr DOT LBRACKET seq_expr RBRACKET LESSMINUS expr { mkexp(Pexp_apply(ghexp(Pexp_ident(array_function "String" "set")), - [Parr_simple,$1; Parr_simple,$4; Parr_simple,$7])) } + [Papp_simple,$1; Papp_simple,$4; Papp_simple,$7])) } | simple_expr DOT LBRACE expr RBRACE LESSMINUS expr { bigarray_set $1 $4 $7 } | label LESSMINUS expr @@ -1373,12 +1373,12 @@ simple_expr: { unclosed "(" 3 ")" 5 } | simple_expr DOT LPAREN seq_expr RPAREN { mkexp(Pexp_apply(ghexp(Pexp_ident(array_function "Array" "get")), - [Parr_simple,$1; Parr_simple,$4])) } + [Papp_simple,$1; Papp_simple,$4])) } | simple_expr DOT LPAREN seq_expr error { unclosed "(" 3 ")" 5 } | simple_expr DOT LBRACKET seq_expr RBRACKET { mkexp(Pexp_apply(ghexp(Pexp_ident(array_function "String" "get")), - [Parr_simple,$1; Parr_simple,$4])) } + [Papp_simple,$1; Papp_simple,$4])) } | simple_expr DOT LBRACKET seq_expr error { unclosed "[" 3 "]" 5 } | simple_expr DOT LBRACE expr RBRACE @@ -1415,9 +1415,9 @@ simple_expr: | mod_longident DOT LBRACKET expr_semi_list opt_semi error { unclosed "[" 3 "]" 6 } | PREFIXOP simple_expr - { mkexp(Pexp_apply(mkoperator $1 1, [Parr_simple,$2])) } + { mkexp(Pexp_apply(mkoperator $1 1, [Papp_simple,$2])) } | BANG simple_expr - { mkexp(Pexp_apply(mkoperator "!" 1, [Parr_simple,$2])) } + { mkexp(Pexp_apply(mkoperator "!" 1, [Papp_simple,$2])) } | NEW ext_attributes class_longident { mkexp_attrs (Pexp_new(mkrhs $3 3)) $2 } | LBRACELESS field_expr_list opt_semi GREATERRBRACE @@ -1458,19 +1458,19 @@ simple_labeled_expr_list: ; labeled_simple_expr: simple_expr %prec below_SHARP - { (Parr_simple, $1) } + { (Papp_simple, $1) } | label_expr { $1 } ; label_expr: LABEL simple_expr %prec below_SHARP - { (Parr_labelled $1, $2) } + { (Papp_labelled $1, $2) } | TILDE label_ident - { (Parr_labelled (fst $2), snd $2) } + { (Papp_labelled (fst $2), snd $2) } | QUESTION label_ident - { (Parr_optional (fst $2), snd $2) } + { (Papp_optional (fst $2), snd $2) } | OPTLABEL simple_expr %prec below_SHARP - { (Parr_optional $1, $2) } + { (Papp_optional $1, $2) } ; label_ident: LIDENT { ($1, mkexp(Pexp_ident(mkrhs (Lident $1) 1))) } diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index 74c61182d9..40a90caace 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -19,6 +19,11 @@ type arrow_flag = | Parr_labelled of string (* label:T -> ... *) | Parr_optional of string (* ?label:T -> ... *) +type apply_flag = + | Papp_simple (* f expr *) + | Papp_labelled of string (* f ~label:expr *) + | Papp_optional of string (* f ?label:expr *) + (** {2 Extension points} *) type attribute = string loc * payload @@ -235,7 +240,7 @@ and expression_desc = - "fun P1 P2 .. Pn -> E1" is represented as nested Pexp_fun. - "let f P = E" is represented using Pexp_fun. *) - | Pexp_apply of expression * (arrow_flag * expression) list + | Pexp_apply of expression * (apply_flag * expression) list (* E0 ~l1:E1 ... ~ln:En li can be empty (non labeled argument) or start with '?' (optional argument). @@ -545,7 +550,7 @@ and class_expr_desc = fun ?l:P -> CE (lab = "?l", None) fun ?l:(P = E0) -> CE (lab = "?l", Some E0) *) - | Pcl_apply of class_expr * (arrow_flag * expression) list + | Pcl_apply of class_expr * (apply_flag * expression) list (* CE ~l1:E1 ... ~ln:En li can be empty (non labeled argument) or start with '?' (optional argument). diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index 742793a71a..86d4b72ac8 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -1361,13 +1361,13 @@ class printer ()= object(self:'self) | _ -> None in match l with - | Parr_simple -> self#expression2 f e ; (* level 2*) - | Parr_optional s -> + | Papp_simple -> self#expression2 f e ; (* level 2*) + | Papp_optional s -> if Some s = simple_name then pp f "?%s" s else pp f "?%s:%a" s self#simple_expr e - | Parr_labelled s -> + | Papp_labelled s -> if Some s = simple_name then pp f "~%s" s else diff --git a/parsing/pprintast.mli b/parsing/pprintast.mli index b67d2dc212..0db5e18e17 100644 --- a/parsing/pprintast.mli +++ b/parsing/pprintast.mli @@ -55,7 +55,7 @@ class printer : Parsetree.arrow_flag * Parsetree.expression option * Parsetree.pattern -> unit method label_x_expression_param : - Format.formatter -> Parsetree.arrow_flag * Parsetree.expression -> unit + Format.formatter -> Parsetree.apply_flag * Parsetree.expression -> unit method list : ?sep:space_formatter -> ?first:space_formatter -> diff --git a/parsing/printast.ml b/parsing/printast.ml index e291df46cd..9d1840a862 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -131,6 +131,11 @@ let arrow_flag f = function | Parr_labelled s -> fprintf f "%s" s ;; +let apply_flag f = function + | Papp_simple -> () + | Papp_optional s -> fprintf f "?%s" s + | Papp_labelled s -> fprintf f "%s" s +;; let longident_loc i ppf li = line i ppf "%a\n" fmt_longident_loc li;; let string i ppf s = line i ppf "\"%s\"\n" s;; let string_loc i ppf s = line i ppf "%a\n" fmt_string_loc s;; @@ -853,7 +858,7 @@ and longident_x_expression i ppf (li, e) = expression (i+1) ppf e; and label_x_expression i ppf (l,e) = - line i ppf "<label> \"%a\"\n" arrow_flag l; + line i ppf "<label> \"%a\"\n" apply_flag l; expression (i+1) ppf e; and label_x_bool_x_core_type_list i ppf x = diff --git a/tools/untypeast.ml b/tools/untypeast.ml index 79f9ada987..5992bc978b 100644 --- a/tools/untypeast.ml +++ b/tools/untypeast.ml @@ -260,6 +260,11 @@ and untype_arrow_flag = function | Types.Tarr_optional s -> Parr_optional s | Types.Tarr_labelled s -> Parr_labelled s +and untype_apply_flag = function + | Types.Tapp_simple -> Papp_simple + | Types.Tapp_optional s -> Papp_optional s + | Types.Tapp_labelled s -> Papp_labelled s + and untype_expression exp = let desc = match exp.exp_desc with @@ -280,7 +285,7 @@ and untype_expression exp = List.fold_right (fun (label, expo) list -> match expo with None -> list - | Some exp -> (untype_arrow_flag label, untype_expression exp) :: list + | Some exp -> (untype_apply_flag label, untype_expression exp) :: list ) list []) | Texp_match (exp, cases, exn_cases, _) -> let merged_cases = untype_cases cases @@ -509,7 +514,7 @@ and untype_class_expr cexpr = List.fold_right (fun (label, expo) list -> match expo with None -> list - | Some exp -> (untype_arrow_flag label, untype_expression exp) :: list + | Some exp -> (untype_apply_flag label, untype_expression exp) :: list ) args []) | Tcl_let (rec_flat, bindings, _ivars, cl) -> diff --git a/typing/btype.ml b/typing/btype.ml index 4510e7bbc1..14e2dd9d81 100644 --- a/typing/btype.ml +++ b/typing/btype.ml @@ -545,11 +545,11 @@ let check_memorized_abbrevs () = (* Utilities for labels *) (**********************************) -let is_simple = function +let arrow_is_simple = function | Tarr_simple -> true | _ -> false -let is_optional = function +let arrow_is_optional = function | Tarr_optional _ -> true | _ -> false @@ -567,16 +567,46 @@ let tarr_of_parr = function | Parsetree.Parr_optional s -> Tarr_optional s | Parsetree.Parr_labelled s -> Tarr_labelled s -let prefixed_label_name = function - | Simple -> assert false - | Optional s -> "?" ^ s - | Labelled s -> "~" ^ s +let tapp_of_papp = function + | Parsetree.Papp_simple -> Tapp_simple + | Parsetree.Papp_optional s -> Tapp_optional s + | Parsetree.Papp_labelled s -> Tapp_labelled s + +let tarr_of_tapp = function + | Tapp_simple -> Tarr_simple + | Tapp_optional s -> Tarr_optional s + | Tapp_labelled s -> Tarr_labelled s + +let tapp_of_tarr = function + | Tarr_simple -> Tapp_simple + | Tarr_optional s -> Tapp_optional s + | Tarr_labelled s -> Tapp_labelled s + +let arrow_is_applicable arr app = + match app, arr with + | Tapp_simple, (Tarr_simple | Tarr_labelled _) + when !Clflags.classic -> true + | Tapp_simple, Tarr_simple -> true + | Tapp_labelled s, Tarr_labelled s' when s = s' -> true + | Tapp_optional s, Tarr_optional s' when s = s' -> true + | _ -> false + +let arrow_is_compatible arr app = + match app, arr with + | Tapp_simple, _ -> true + | Tapp_labelled s, Tarr_labelled s' when s = s' -> true + | Tapp_optional s, Tarr_optional s' when s = s' -> true + | _ -> false let rec extract_label_aux hd l = function - [] -> raise Not_found - | (l',t as p) :: ls -> - if label_name l' = l then (l', t, List.rev hd, ls) - else extract_label_aux (p::hd) l ls + | [] -> raise Not_found + | (Tapp_simple, _ as flag) :: ls when l = "" -> + (flag, List.rev hd, ls) + | ((Tapp_optional l' | Tapp_labelled l'), _ as flag) :: ls + when l = l' -> + (flag, List.rev hd, ls) + | p :: ls -> + extract_label_aux (p::hd) l ls let extract_label l ls = extract_label_aux [] l ls diff --git a/typing/btype.mli b/typing/btype.mli index b1db013205..7a7c0ae140 100644 --- a/typing/btype.mli +++ b/typing/btype.mli @@ -162,8 +162,8 @@ val forget_abbrev: (**** Utilities for labels ****) -val is_simple : arrow_flag -> bool -val is_optional : arrow_flag -> bool +val arrow_is_simple : arrow_flag -> bool +val arrow_is_optional : arrow_flag -> bool val label_name : arrow_flag -> label val label_raw : arrow_flag -> label @@ -172,10 +172,17 @@ val label_raw : arrow_flag -> label val prefixed_label_name : arrow_flag -> label val tarr_of_parr : Parsetree.arrow_flag -> Types.arrow_flag +val tapp_of_papp : Parsetree.apply_flag -> Types.apply_flag + +val tarr_of_tapp : Types.apply_flag -> Types.arrow_flag +val tapp_of_tarr : Types.arrow_flag -> Types.apply_flag + +val arrow_is_applicable : Types.arrow_flag -> Types.apply_flag -> bool +val arrow_is_compatible : Types.arrow_flag -> Types.apply_flag -> bool val extract_label : - label -> (arrow_flag * 'a) list -> - arrow_flag * 'a * (arrow_flag * 'a) list * (arrow_flag * 'a) list + label -> (apply_flag * 'a) list -> + (apply_flag * 'a) * (apply_flag * 'a) list * (apply_flag * 'a) list (* actual label, value, before list, after list *) (**** Utilities for backtracking ****) diff --git a/typing/printtyped.ml b/typing/printtyped.ml index f452cf5f3d..8bb4dad2a1 100644 --- a/typing/printtyped.ml +++ b/typing/printtyped.ml @@ -142,6 +142,11 @@ let arrow_flag f = function | Tarr_optional s -> fprintf f "?%s" s | Tarr_labelled s -> fprintf f "%s" s +let apply_flag f = function + | Tapp_simple -> fprintf f "" + | Tapp_optional s -> fprintf f "?%s" s + | Tapp_labelled s -> fprintf f "%s" s + let attributes i ppf l = let i = i + 1 in List.iter @@ -822,7 +827,7 @@ and longident_x_expression i ppf (li, _, e) = expression (i+1) ppf e; and label_x_expression i ppf (l, e) = - line i ppf "<label> \"%a\"\n" arrow_flag l; + line i ppf "<label> \"%a\"\n" apply_flag l; (match e with None -> () | Some e -> expression (i+1) ppf e) and ident_x_loc_x_expression_def i ppf (l,_, e) = diff --git a/typing/typeclass.ml b/typing/typeclass.ml index 419839a9af..34aaa25394 100644 --- a/typing/typeclass.ml +++ b/typing/typeclass.ml @@ -23,7 +23,7 @@ type error = | Field_type_mismatch of string * string * (type_expr * type_expr) list | Structure_expected of class_type | Cannot_apply of class_type - | Apply_wrong_label of arrow_flag + | Apply_wrong_label of apply_flag | Pattern_type_clash of type_expr | Repeated_parameter | Unbound_class_2 of Longident.t @@ -55,9 +55,9 @@ open Typedtree let ctyp desc typ env loc = { ctyp_desc = desc; ctyp_type = typ; ctyp_loc = loc; ctyp_env = env; ctyp_attributes = [] } - (**********************) - (* Useful constants *) - (**********************) +(**********************) +(* Useful constants *) +(**********************) (* @@ -73,9 +73,9 @@ let dummy_method = Btype.dummy_method let unbound_class = Path.Pident (Ident.create "") - (************************************) - (* Some operations on class types *) - (************************************) +(************************************) +(* Some operations on class types *) +(************************************) (* Fully expand the head of a class type *) @@ -111,7 +111,7 @@ let virtual_methods sign = (fun virt (lab, _, _) -> if lab = dummy_method then virt else if Concr.mem lab sign.csig_concr then virt else - lab::virt) + lab::virt) [] fields (* Return the constructor type associated to a class type *) @@ -138,11 +138,11 @@ let extract_constraints cty = (Vars.fold (fun lab _ vars -> lab :: vars) sign.csig_vars [], begin let (fields, _) = Ctype.flatten_fields (Ctype.object_fields sign.csig_self) - in - List.fold_left - (fun meths (lab, _, _) -> - if lab = dummy_method then meths else lab::meths) - [] fields + in + List.fold_left + (fun meths (lab, _, _) -> + if lab = dummy_method then meths else lab::meths) + [] fields end, sign.csig_concr) @@ -159,18 +159,18 @@ let rec closed_class_type = List.for_all Ctype.closed_schema params | Cty_signature sign -> Ctype.closed_schema sign.csig_self - && + && Vars.fold (fun _ (_, _, ty) cc -> Ctype.closed_schema ty && cc) sign.csig_vars true | Cty_arrow (_, ty, cty) -> Ctype.closed_schema ty - && + && closed_class_type cty let closed_class cty = List.for_all Ctype.closed_schema cty.cty_params - && + && closed_class_type cty.cty_type let rec limited_generalize rv = @@ -195,9 +195,9 @@ let rc node = node - (***********************************) - (* Primitives for typing classes *) - (***********************************) +(***********************************) +(* Primitives for typing classes *) +(***********************************) (* Enter a value in the method environment only *) @@ -234,9 +234,9 @@ let enter_val cl_num vars inh lab mut virt ty val_env met_env par_env loc = in let (id, _, _, _) as result = match id with Some id -> (id, val_env, met_env, par_env) - | None -> - enter_met_env Location.none lab (Val_ivar (mut, cl_num)) - ty val_env met_env par_env + | None -> + enter_met_env Location.none lab (Val_ivar (mut, cl_num)) + ty val_env met_env par_env in vars := Vars.add lab (id, mut, virt, ty) !vars; result @@ -281,7 +281,7 @@ let inheritance self_type env ovf concr_meths warn_vals loc parent = (cname :: Concr.elements over_vals)); | Some Override when Concr.is_empty over_meths && Concr.is_empty over_vals -> - raise (Error(loc, env, No_overriding ("",""))) + raise (Error(loc, env, No_overriding ("",""))) | _ -> () end; @@ -295,14 +295,14 @@ let inheritance self_type env ovf concr_meths warn_vals loc parent = let virtual_method val_env meths self_type lab priv sty loc = let (_, ty') = - Ctype.filter_self_method val_env lab priv meths self_type + Ctype.filter_self_method val_env lab priv meths self_type in let sty = Ast_helper.Typ.force_poly sty in let cty = transl_simple_type val_env false sty in let ty = cty.ctyp_type in begin try Ctype.unify val_env ty ty' with Ctype.Unify trace -> - raise(Error(loc, val_env, Field_type_mismatch ("method", lab, trace))); + raise(Error(loc, val_env, Field_type_mismatch ("method", lab, trace))); end; cty @@ -310,7 +310,7 @@ let delayed_meth_specs = ref [] let declare_method val_env meths self_type lab priv sty loc = let (_, ty') = - Ctype.filter_self_method val_env lab priv meths self_type + Ctype.filter_self_method val_env lab priv meths self_type in let unif ty = try Ctype.unify val_env ty ty' with Ctype.Unify trace -> @@ -319,18 +319,18 @@ let declare_method val_env meths self_type lab priv sty loc = let sty = Ast_helper.Typ.force_poly sty in match sty.ptyp_desc, priv with Ptyp_poly ([],sty'), Public -> -(* TODO: we moved the [transl_simple_type_univars] outside of the lazy, -so that we can get an immediate value. Is that correct ? Ask Jacques. *) + (* TODO: we moved the [transl_simple_type_univars] outside of the lazy, + so that we can get an immediate value. Is that correct ? Ask Jacques. *) let returned_cty = ctyp Ttyp_any (Ctype.newty Tnil) val_env loc in delayed_meth_specs := - lazy ( - let cty = transl_simple_type_univars val_env sty' in - let ty = cty.ctyp_type in - unif ty; - returned_cty.ctyp_desc <- Ttyp_poly ([], cty); - returned_cty.ctyp_type <- ty; + lazy ( + let cty = transl_simple_type_univars val_env sty' in + let ty = cty.ctyp_type in + unif ty; + returned_cty.ctyp_desc <- Ttyp_poly ([], cty); + returned_cty.ctyp_type <- ty; ) :: - !delayed_meth_specs; + !delayed_meth_specs; returned_cty | _ -> let cty = transl_simple_type val_env false sty in @@ -345,7 +345,7 @@ let type_constraint val_env sty sty' loc = let ty' = cty'.ctyp_type in begin try Ctype.unify val_env ty ty' with Ctype.Unify trace -> - raise(Error(loc, val_env, Unconsistent_constraint trace)); + raise(Error(loc, val_env, Unconsistent_constraint trace)); end; (cty, cty') @@ -392,7 +392,7 @@ let rec class_type_field env self_type meths let cty = transl_simple_type env false sty in let ty = cty.ctyp_type in (mkctf (Tctf_val (lab, mut, virt, cty)) :: fields, - add_val env ctf.pctf_loc lab (mut, virt, ty) val_sig, concr_meths, inher) + add_val env ctf.pctf_loc lab (mut, virt, ty) val_sig, concr_meths, inher) | Pctf_method (lab, priv, virt, sty) -> let cty = @@ -403,12 +403,12 @@ let rec class_type_field env self_type meths | Virtual -> concr_meths in (mkctf (Tctf_method (lab, priv, virt, cty)) :: fields, - val_sig, concr_meths, inher) + val_sig, concr_meths, inher) | Pctf_constraint (sty, sty') -> let (cty, cty') = type_constraint env sty sty' ctf.pctf_loc in (mkctf (Tctf_constraint (cty, cty')) :: fields, - val_sig, concr_meths, inher) + val_sig, concr_meths, inher) | Pctf_attribute x -> Typetexp.warning_attribute [x]; @@ -422,7 +422,7 @@ and class_signature env {pcsig_self=sty; pcsig_fields=sign} = let meths = ref Meths.empty in let self_cty = transl_simple_type env false sty in let self_cty = { self_cty with - ctyp_type = Ctype.expand_head env self_cty.ctyp_type } in + ctyp_type = Ctype.expand_head env self_cty.ctyp_type } in let self_type = self_cty.ctyp_type in (* Check that the binder is a correct type, and introduce a dummy @@ -445,9 +445,9 @@ and class_signature env {pcsig_self=sty; pcsig_fields=sign} = in Typetexp.warning_leave_scope (); let cty = {csig_self = self_type; - csig_vars = val_sig; - csig_concr = concr_meths; - csig_inher = inher} + csig_vars = val_sig; + csig_concr = concr_meths; + csig_inher = inher} in { csig_self = self_cty; csig_fields = List.rev rev_fields; @@ -457,11 +457,11 @@ and class_signature env {pcsig_self=sty; pcsig_fields=sign} = and class_type env scty = let cltyp desc typ = { - cltyp_desc = desc; - cltyp_type = typ; - cltyp_loc = scty.pcty_loc; - cltyp_env = env; - cltyp_attributes = scty.pcty_attributes; + cltyp_desc = desc; + cltyp_type = typ; + cltyp_loc = scty.pcty_loc; + cltyp_env = env; + cltyp_attributes = scty.pcty_attributes; } in match scty.pcty_desc with @@ -475,17 +475,17 @@ and class_type env scty = if List.length params <> List.length styl then raise(Error(scty.pcty_loc, env, Parameter_arity_mismatch (lid.txt, List.length params, - List.length styl))); + List.length styl))); let ctys = List.map2 - (fun sty ty -> - let cty' = transl_simple_type env false sty in - let ty' = cty'.ctyp_type in - begin - try Ctype.unify env ty' ty with Ctype.Unify trace -> - raise(Error(sty.ptyp_loc, env, Parameter_mismatch trace)) - end; - cty' - ) styl params + (fun sty ty -> + let cty' = transl_simple_type env false sty in + let ty' = cty'.ctyp_type in + begin + try Ctype.unify env ty' ty with Ctype.Unify trace -> + raise(Error(sty.ptyp_loc, env, Parameter_mismatch trace)) + end; + cty' + ) styl params in let typ = Cty_constr (path, params, clty) in cltyp (Tcty_constr ( path, lid , ctys)) typ @@ -517,7 +517,7 @@ let class_type env scty = let rec class_field self_loc cl_num self_type meths vars (val_env, met_env, par_env, fields, concr_meths, warn_vals, inher, local_meths, local_vals) - cf = + cf = let loc = cf.pcf_loc in let mkcf desc = { cf_desc = desc; cf_loc = loc; cf_attributes = cf.pcf_attributes } in match cf.pcf_desc with @@ -582,8 +582,8 @@ let rec class_field self_loc cl_num self_type meths vars (val_env, met_env', par_env, lazy (mkcf (Tcf_val (lab, mut, id, Tcfk_virtual cty, met_env == met_env'))) - :: fields, - concr_meths, warn_vals, inher, local_meths, local_vals) + :: fields, + concr_meths, warn_vals, inher, local_meths, local_vals) | Pcf_val (lab, mut, Cfk_concrete (ovf, sexp)) -> if Concr.mem lab.txt local_vals then @@ -605,7 +605,7 @@ let rec class_field self_loc cl_num self_type meths vars if !Clflags.principal then begin Ctype.end_def (); Ctype.generalize_structure exp.exp_type - end; + end; let (id, val_env, met_env', par_env) = enter_val cl_num vars false lab.txt mut Concrete exp.exp_type val_env met_env par_env loc @@ -620,9 +620,9 @@ let rec class_field self_loc cl_num self_type meths vars | Pcf_method (lab, priv, Cfk_virtual sty) -> let cty = virtual_method val_env meths self_type lab.txt priv sty loc in (val_env, met_env, par_env, - lazy (mkcf(Tcf_method (lab, priv, Tcfk_virtual cty))) + lazy (mkcf(Tcf_method (lab, priv, Tcfk_virtual cty))) ::fields, - concr_meths, warn_vals, inher, local_meths, local_vals) + concr_meths, warn_vals, inher, local_meths, local_vals) | Pcf_method (lab, priv, Cfk_concrete (ovf, expr)) -> let expr = @@ -643,26 +643,26 @@ let rec class_field self_loc cl_num self_type meths vars Ctype.filter_self_method val_env lab.txt priv meths self_type in begin try match expr.pexp_desc with - Pexp_poly (sbody, sty) -> - begin match sty with None -> () - | Some sty -> - let sty = Ast_helper.Typ.force_poly sty in - let cty' = Typetexp.transl_simple_type val_env false sty in - let ty' = cty'.ctyp_type in - Ctype.unify val_env ty' ty - end; - begin match (Ctype.repr ty).desc with - Tvar _ -> - let ty' = Ctype.newvar () in - Ctype.unify val_env (Ctype.newty (Tpoly (ty', []))) ty; - Ctype.unify val_env (type_approx val_env sbody) ty' - | Tpoly (ty1, tl) -> - let _, ty1' = Ctype.instance_poly false tl ty1 in - let ty2 = type_approx val_env sbody in - Ctype.unify val_env ty2 ty1' - | _ -> assert false - end - | _ -> assert false + Pexp_poly (sbody, sty) -> + begin match sty with None -> () + | Some sty -> + let sty = Ast_helper.Typ.force_poly sty in + let cty' = Typetexp.transl_simple_type val_env false sty in + let ty' = cty'.ctyp_type in + Ctype.unify val_env ty' ty + end; + begin match (Ctype.repr ty).desc with + Tvar _ -> + let ty' = Ctype.newvar () in + Ctype.unify val_env (Ctype.newty (Tpoly (ty', []))) ty; + Ctype.unify val_env (type_approx val_env sbody) ty' + | Tpoly (ty1, tl) -> + let _, ty1' = Ctype.instance_poly false tl ty1 in + let ty2 = type_approx val_env sbody in + Ctype.unify val_env ty2 ty1' + | _ -> assert false + end + | _ -> assert false with Ctype.Unify trace -> raise(Error(loc, val_env, Field_type_mismatch ("method", lab.txt, trace))) @@ -688,8 +688,8 @@ let rec class_field self_loc cl_num self_type meths vars | Pcf_constraint (sty, sty') -> let (cty, cty') = type_constraint val_env sty sty' loc in (val_env, met_env, par_env, - lazy (mkcf (Tcf_constraint (cty, cty'))) :: fields, - concr_meths, warn_vals, inher, local_meths, local_vals) + lazy (mkcf (Tcf_constraint (cty, cty'))) :: fields, + concr_meths, warn_vals, inher, local_meths, local_vals) | Pcf_initializer expr -> let expr = make_method self_loc cl_num expr in @@ -717,7 +717,7 @@ let rec class_field self_loc cl_num self_type meths vars raise (Error_forward (Typetexp.error_of_extension ext)) and class_structure cl_num final val_env met_env loc - { pcstr_self = spat; pcstr_fields = str } = + { pcstr_self = spat; pcstr_fields = str } = (* Environment for substructures *) let par_env = met_env in @@ -754,11 +754,11 @@ and class_structure cl_num final val_env met_env loc (* Copy known information to still empty self_type *) List.iter (fun (lab,kind,ty) -> - let k = - if Btype.field_kind_repr kind = Fpresent then Public else Private in - try Ctype.unify val_env ty - (Ctype.filter_method val_env lab k self_type) - with _ -> assert false) + let k = + if Btype.field_kind_repr kind = Fpresent then Public else Private in + try Ctype.unify val_env ty + (Ctype.filter_method val_env lab k self_type) + with _ -> assert false) (get_methods public_self) end; @@ -776,7 +776,7 @@ and class_structure cl_num final val_env met_env loc {csig_self = public_self; csig_vars = Vars.map (fun (id, mut, vr, ty) -> (mut, vr, ty)) !vars; csig_concr = concr_meths; - csig_inher = inher} in + csig_inher = inher} in let methods = get_methods self_type in let priv_meths = List.filter (fun (_,kind,_) -> Btype.field_kind_repr kind <> Fpresent) @@ -795,13 +795,13 @@ and class_structure cl_num final val_env met_env loc let self_methods = List.fold_right (fun (lab,kind,ty) rem -> - if lab = dummy_method then - (* allow public self and private self to be unified *) - match Btype.field_kind_repr kind with - Fvar r -> Btype.set_kind r Fabsent; rem - | _ -> rem - else - Ctype.newty(Tfield(lab, Btype.copy_kind kind, ty, rem))) + if lab = dummy_method then + (* allow public self and private self to be unified *) + match Btype.field_kind_repr kind with + Fvar r -> Btype.set_kind r Fabsent; rem + | _ -> rem + else + Ctype.newty(Tfield(lab, Btype.copy_kind kind, ty, rem))) methods (Ctype.newty Tnil) in begin try Ctype.unify val_env private_self @@ -854,10 +854,10 @@ and class_expr cl_num val_env met_env scl = if List.length params <> List.length tyl then raise(Error(scl.pcl_loc, val_env, Parameter_arity_mismatch (lid.txt, List.length params, - List.length tyl))); + List.length tyl))); List.iter2 (fun cty' ty -> - let ty' = cty'.ctyp_type in + let ty' = cty'.ctyp_type in try Ctype.unify val_env ty' ty with Ctype.Unify trace -> raise(Error(cty'.ctyp_loc, val_env, Parameter_mismatch trace))) tyl params; @@ -900,7 +900,7 @@ and class_expr cl_num val_env met_env scl = (mknoloc (Longident.(Ldot (Lident "*predef*", "None")))) None) default; - ] + ] in let smatch = Exp.match_ ~loc (Exp.ident ~loc (mknoloc (Longident.Lident "*opt*"))) @@ -933,7 +933,7 @@ and class_expr cl_num val_env met_env scl = let vd = Env.find_value path val_env' in (id, id_loc, {exp_desc = - Texp_ident(path, mknoloc (Longident.Lident (Ident.name id)), vd); + Texp_ident(path, mknoloc (Longident.Lident (Ident.name id)), vd); exp_loc = Location.none; exp_extra = []; exp_type = Ctype.instance val_env' vd.val_type; exp_attributes = []; (* check *) @@ -950,22 +950,22 @@ and class_expr cl_num val_env met_env scl = [{c_lhs=pat; c_guard=None; c_rhs = (* Dummy expression *) - {exp_desc = Texp_constant (Asttypes.Const_int 1); - exp_loc = Location.none; exp_extra = []; - exp_type = Ctype.none; - exp_attributes = []; - exp_env = Env.empty }}] + {exp_desc = Texp_constant (Asttypes.Const_int 1); + exp_loc = Location.none; exp_extra = []; + exp_type = Ctype.none; + exp_attributes = []; + exp_env = Env.empty }}] in Ctype.raise_nongen_level (); let cl = class_expr cl_num val_env' met_env scl' in Ctype.end_def (); - if Btype.is_optional arr && not_function cl.cl_type then + if Btype.arrow_is_optional arr && not_function cl.cl_type then Location.prerr_warning pat.pat_loc Warnings.Unerasable_optional_argument; rc {cl_desc = Tcl_fun (arr, pat, pv, cl, partial); cl_loc = scl.pcl_loc; cl_type = Cty_arrow - (arr, Ctype.instance_def pat.pat_type, cl.cl_type); + (arr, Ctype.instance_def pat.pat_type, cl.cl_type); cl_env = val_env; cl_attributes = scl.pcl_attributes; } @@ -973,7 +973,7 @@ and class_expr cl_num val_env met_env scl = if sargs = [] then Syntaxerr.ill_formed_ast scl.pcl_loc "Function application with no argument."; - let sargs = List.map (fun (arr,e) -> Btype.tarr_of_parr arr,e) sargs in + let sargs = List.map (fun (app,e) -> Btype.tapp_of_papp app,e) sargs in if !Clflags.principal then Ctype.begin_def (); let cl = class_expr cl_num val_env met_env scl' in if !Clflags.principal then begin @@ -982,17 +982,17 @@ and class_expr cl_num val_env met_env scl = end; let rec nonopt_labels ls ty_fun = match ty_fun with - | Cty_arrow (l, _, ty_res) -> - if Btype.is_optional l then nonopt_labels ls ty_res - else nonopt_labels (l::ls) ty_res + | Cty_arrow (arr, _, ty_res) -> + if Btype.arrow_is_optional arr then nonopt_labels ls ty_res + else nonopt_labels (arr::ls) ty_res | _ -> ls in let ignore_labels = !Clflags.classic || let labels = nonopt_labels [] cl.cl_type in List.length labels = List.length sargs && - List.for_all (fun (l,_) -> Btype.is_simple l) sargs && - List.exists (fun l -> not (Btype.is_simple l)) labels && + List.for_all (fun (l,_) -> l = Tapp_simple) sargs && + List.exists (fun l -> l <> Tarr_simple) labels && begin Location.prerr_warning cl.cl_loc Warnings.Labels_omitted; true @@ -1000,54 +1000,65 @@ and class_expr cl_num val_env met_env scl = in let rec type_args args omitted ty_fun ty_fun0 sargs more_sargs = match ty_fun, ty_fun0 with - | Cty_arrow (l, ty, ty_fun), Cty_arrow (_, ty0, ty_fun0) + | Cty_arrow (arr, ty, ty_fun), Cty_arrow (_, ty0, ty_fun0) when sargs <> [] || more_sargs <> [] -> - let name = Btype.label_name l in + let name = Btype.label_name arr in let sargs, more_sargs, arg = - if ignore_labels && not (Btype.is_optional l) then begin + if ignore_labels && not (Btype.arrow_is_optional arr) then begin match sargs, more_sargs with - (l', sarg0)::_, _ -> - raise(Error(sarg0.pexp_loc, val_env, Apply_wrong_label l')) - | _, (l', sarg0)::more_sargs -> - if l <> l' && not (Btype.is_simple l') then + (app, sarg0)::_, _ -> + raise(Error(sarg0.pexp_loc, val_env, Apply_wrong_label app)) + | _, (app, sarg0)::more_sargs -> + if not (Btype.arrow_is_compatible arr app) then raise(Error(sarg0.pexp_loc, val_env, - Apply_wrong_label l')) + Apply_wrong_label app)) else ([], more_sargs, Some (type_argument val_env sarg0 ty ty0)) | _ -> assert false end else try - let (l', sarg0, sargs, more_sargs) = - try - let (l', sarg0, sargs1, sargs2) = - Btype.extract_label name sargs - in (l', sarg0, sargs1 @ sargs2, more_sargs) - with Not_found -> - let (l', sarg0, sargs1, sargs2) = - Btype.extract_label name more_sargs - in (l', sarg0, sargs @ sargs1, sargs2) - in - if not (Btype.is_optional l) && Btype.is_optional l' then - Location.prerr_warning sarg0.pexp_loc - (Warnings.Nonoptional_label (Btype.label_raw l)); - sargs, more_sargs, - if not (Btype.is_optional l) || Btype.is_optional l' then - Some (type_argument val_env sarg0 ty ty0) - else - let ty' = extract_option_type val_env ty - and ty0' = extract_option_type val_env ty0 in - let arg = type_argument val_env sarg0 ty' ty0' in - Some (option_some arg) - with Not_found -> - sargs, more_sargs, - if Btype.is_optional l && - (List.mem_assoc Tarr_simple sargs || List.mem_assoc Tarr_simple more_sargs) - then - Some (option_none ty0 Location.none) - else None + let (app, sarg0, sargs, more_sargs) = + try + let ((app, sarg0), sargs1, sargs2) = + Btype.extract_label name sargs + in (app, sarg0, sargs1 @ sargs2, more_sargs) + with Not_found -> + let ((app, sarg0), sargs1, sargs2) = + Btype.extract_label name more_sargs + in (app, sarg0, sargs @ sargs1, sargs2) + in + (* Optional apply to non optional arrow *) + if (match arr, app with + | Tarr_optional _, _ -> false + | _, Tapp_optional _ -> true + | _ -> false) + then + Location.prerr_warning sarg0.pexp_loc + (Warnings.Nonoptional_label (Btype.label_raw arr)); + sargs, more_sargs, + (* Optional apply or non optional arrow *) + if (match arr, app with + | _, Tapp_optional _ -> true + | Tarr_optional _, _ -> false + | _ -> true) + then + Some (type_argument val_env sarg0 ty ty0) + else + let ty' = extract_option_type val_env ty + and ty0' = extract_option_type val_env ty0 in + let arg = type_argument val_env sarg0 ty' ty0' in + Some (option_some arg) + with Not_found -> + sargs, more_sargs, + if Btype.arrow_is_optional arr && + (List.mem_assoc Tapp_simple sargs || + List.mem_assoc Tapp_simple more_sargs) + then + Some (option_none ty0 Location.none) + else None in - let omitted = if arg = None then (l,ty0) :: omitted else omitted in - type_args ((l,arg)::args) omitted ty_fun ty_fun0 + let omitted = if arg = None then (arr,ty0) :: omitted else omitted in + type_args ((Btype.tapp_of_tarr arr,arg)::args) omitted ty_fun ty_fun0 sargs more_sargs | _ -> match sargs @ more_sargs with @@ -1091,7 +1102,7 @@ and class_expr cl_num val_env met_env scl = Ctype.begin_def (); let expr = {exp_desc = - Texp_ident(path, mknoloc(Longident.Lident (Ident.name id)),vd); + Texp_ident(path, mknoloc(Longident.Lident (Ident.name id)),vd); exp_loc = Location.none; exp_extra = []; exp_type = Ctype.instance val_env vd.val_type; exp_attributes = []; @@ -1132,7 +1143,7 @@ and class_expr cl_num val_env met_env scl = Ctype.end_def (); limited_generalize (Ctype.row_variable (Ctype.self_type cl.cl_type)) - cl.cl_type; + cl.cl_type; limited_generalize (Ctype.row_variable (Ctype.self_type clty.cltyp_type)) clty.cltyp_type; @@ -1164,7 +1175,7 @@ let rec approx_declaration cl = Pcl_fun (arr, _, _, cl) -> let arr = Btype.tarr_of_parr arr in let arg = - if Btype.is_optional arr then Ctype.instance_def var_option + if Btype.arrow_is_optional arr then Ctype.instance_def var_option else Ctype.newvar () in Ctype.newty (Tarrow (arr, arg, approx_declaration cl, Cok)) | Pcl_let (_, _, cl) -> @@ -1178,7 +1189,7 @@ let rec approx_description ct = Pcty_arrow (arr, _, ct) -> let arr = Btype.tarr_of_parr arr in let arg = - if Btype.is_optional arr then Ctype.instance_def var_option + if Btype.arrow_is_optional arr then Ctype.instance_def var_option else Ctype.newvar () in Ctype.newty (Tarrow (arr, arg, approx_description ct, Cok)) | _ -> Ctype.newvar () @@ -1321,15 +1332,15 @@ let class_infos define_class kind List.iter2 (Ctype.unify env) obj_params obj_params' with Ctype.Unify _ -> raise(Error(cl.pci_loc, env, - Bad_parameters (obj_id, constr, - Ctype.newconstr (Path.Pident obj_id) - obj_params'))) + Bad_parameters (obj_id, constr, + Ctype.newconstr (Path.Pident obj_id) + obj_params'))) end; begin try Ctype.unify env ty constr with Ctype.Unify _ -> raise(Error(cl.pci_loc, env, - Abbrev_type_clash (constr, ty, Ctype.expand_head env constr))) + Abbrev_type_clash (constr, ty, Ctype.expand_head env constr))) end end; @@ -1343,11 +1354,11 @@ let class_infos define_class kind List.iter2 (Ctype.unify env) cl_params cl_params' with Ctype.Unify _ -> raise(Error(cl.pci_loc, env, - Bad_parameters (cl_id, - Ctype.newconstr (Path.Pident cl_id) - cl_params, - Ctype.newconstr (Path.Pident cl_id) - cl_params'))) + Bad_parameters (cl_id, + Ctype.newconstr (Path.Pident cl_id) + cl_params, + Ctype.newconstr (Path.Pident cl_id) + cl_params'))) end; begin try Ctype.unify env ty cl_ty @@ -1392,7 +1403,7 @@ let class_infos define_class kind dummy_class.cty_type <- typ; let env = Env.add_cltype ty_id cltydef ( - if define_class then Env.add_class id clty env else env) + if define_class then Env.add_class id clty env else env) in if cl.pci_virt = Concrete then begin @@ -1519,7 +1530,7 @@ let final_decl env define_class ci_decl = clty; ci_type_decl = cltydef; ci_attributes = cl.pci_attributes; - }) + }) (* (cl.pci_variance, cl.pci_loc)) *) let extract_type_decls @@ -1539,37 +1550,37 @@ let final_env define_class env (* Add definitions after cleaning them *) Env.add_type ~check:true obj_id (Subst.type_declaration Subst.identity obj_abbr) ( - Env.add_type ~check:true cl_id - (Subst.type_declaration Subst.identity cl_abbr) ( - Env.add_cltype ty_id (Subst.cltype_declaration Subst.identity cltydef) ( - if define_class then - Env.add_class id (Subst.class_declaration Subst.identity clty) env - else env))) + Env.add_type ~check:true cl_id + (Subst.type_declaration Subst.identity cl_abbr) ( + Env.add_cltype ty_id (Subst.cltype_declaration Subst.identity cltydef) ( + if define_class then + Env.add_class id (Subst.class_declaration Subst.identity clty) env + else env))) (* Check that #c is coercible to c if there is a self-coercion *) let check_coercions env (id, id_loc, clty, ty_id, cltydef, obj_id, obj_abbr, cl_id, cl_abbr, arity, pub_meths, coercion_locs, expr, req) = begin match coercion_locs with [] -> () - | loc :: _ -> - let cl_ty, obj_ty = - match cl_abbr.type_manifest, obj_abbr.type_manifest with - Some cl_ab, Some obj_ab -> - let cl_params, cl_ty = - Ctype.instance_parameterized_type cl_abbr.type_params cl_ab - and obj_params, obj_ty = - Ctype.instance_parameterized_type obj_abbr.type_params obj_ab - in - List.iter2 (Ctype.unify env) cl_params obj_params; - cl_ty, obj_ty - | _ -> assert false - in - begin try Ctype.subtype env cl_ty obj_ty () - with Ctype.Subtype (tr1, tr2) -> - raise(Typecore.Error(loc, env, Typecore.Not_subtype(tr1, tr2))) - end; - if not (Ctype.opened_object cl_ty) then - raise(Error(loc, env, Cannot_coerce_self obj_ty)) + | loc :: _ -> + let cl_ty, obj_ty = + match cl_abbr.type_manifest, obj_abbr.type_manifest with + Some cl_ab, Some obj_ab -> + let cl_params, cl_ty = + Ctype.instance_parameterized_type cl_abbr.type_params cl_ab + and obj_params, obj_ty = + Ctype.instance_parameterized_type obj_abbr.type_params obj_ab + in + List.iter2 (Ctype.unify env) cl_params obj_params; + cl_ty, obj_ty + | _ -> assert false + in + begin try Ctype.subtype env cl_ty obj_ty () + with Ctype.Subtype (tr1, tr2) -> + raise(Typecore.Error(loc, env, Typecore.Not_subtype(tr1, tr2))) + end; + if not (Ctype.opened_object cl_ty) then + raise(Error(loc, env, Cannot_coerce_self obj_ty)) end; (id, id_loc, clty, ty_id, cltydef, obj_id, obj_abbr, cl_id, cl_abbr, arity, pub_meths, req) @@ -1580,9 +1591,9 @@ let type_classes define_class approx kind env cls = let cls = List.map (function cl -> - (cl, - Ident.create cl.pci_name.txt, Ident.create cl.pci_name.txt, - Ident.create cl.pci_name.txt, Ident.create ("#" ^ cl.pci_name.txt))) + (cl, + Ident.create cl.pci_name.txt, Ident.create cl.pci_name.txt, + Ident.create cl.pci_name.txt, Ident.create ("#" ^ cl.pci_name.txt))) cls in Ctype.init_def (Ident.current_time ()); @@ -1624,9 +1635,9 @@ let class_type_declarations env cls = in (List.map (function - (_, id_loc, _, ty_id, cltydef, obj_id, obj_abbr, cl_id, cl_abbr, - _, _, ci) -> - (ty_id, id_loc, cltydef, obj_id, obj_abbr, cl_id, cl_abbr, ci)) + (_, id_loc, _, ty_id, cltydef, obj_id, obj_abbr, cl_id, cl_abbr, + _, _, ci) -> + (ty_id, id_loc, cltydef, obj_id, obj_abbr, cl_id, cl_abbr, ci)) decl, env) @@ -1649,7 +1660,7 @@ let rec unify_parents env ty cl = and unify_parents_struct env ty st = List.iter (function {cf_desc = Tcf_inherit (_, cl, _, _, _)} -> unify_parents env ty cl - | _ -> ()) + | _ -> ()) st.cstr_fields let type_object env loc s = @@ -1695,9 +1706,9 @@ let report_error env ppf = function | Field_type_mismatch (k, m, trace) -> Printtyp.report_unification_error ppf env trace (function ppf -> - fprintf ppf "The %s %s@ has type" k m) + fprintf ppf "The %s %s@ has type" k m) (function ppf -> - fprintf ppf "but is expected to have type") + fprintf ppf "but is expected to have type") | Structure_expected clty -> fprintf ppf "@[This class expression is not a class structure; it has type@ %a@]" @@ -1707,9 +1718,9 @@ let report_error env ppf = function "This class expression is not a class function, it cannot be applied" | Apply_wrong_label l -> let mark_label = function - | Tarr_simple -> "out label" - | Tarr_optional s -> sprintf " label ?%s" s - | Tarr_labelled s -> sprintf " label ~%s" s + | Tapp_simple -> "out label" + | Tapp_optional s -> sprintf " label ?%s" s + | Tapp_labelled s -> sprintf " label ~%s" s in fprintf ppf "This argument cannot be applied with%s" (mark_label l) | Pattern_type_clash ty -> diff --git a/typing/typeclass.mli b/typing/typeclass.mli index 3bd4d95d89..d0d5647c5d 100644 --- a/typing/typeclass.mli +++ b/typing/typeclass.mli @@ -81,7 +81,7 @@ type error = | Field_type_mismatch of string * string * (type_expr * type_expr) list | Structure_expected of class_type | Cannot_apply of class_type - | Apply_wrong_label of arrow_flag + | Apply_wrong_label of apply_flag | Pattern_type_clash of type_expr | Repeated_parameter | Unbound_class_2 of Longident.t diff --git a/typing/typecore.ml b/typing/typecore.ml index 8fcf4a7e74..f6008e9fe5 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -30,7 +30,7 @@ type error = | Orpat_vars of Ident.t | Expr_type_clash of (type_expr * type_expr) list | Apply_non_function of type_expr - | Apply_wrong_label of arrow_flag * type_expr + | Apply_wrong_label of apply_flag * type_expr | Label_multiply_defined of string | Label_missing of Ident.t list | Label_not_mutable of Longident.t @@ -110,24 +110,9 @@ let rp node = node ;; - -let fst3 (x, _, _) = x -let snd3 (_,x,_) = x - let case lhs rhs = {c_lhs = lhs; c_guard = None; c_rhs = rhs} -let arrow_is_applicable ~expected ~applied = - expected = applied || - (!Clflags.classic && - match applied, expected with - | Tarr_simple, (Tarr_simple | Tarr_labelled _) -> true - | _ -> false) - -let is_optional = function - | Tarr_optional _ -> true - | _ -> false - (* Upper approximation of free identifiers on the parse tree *) let iter_expression f e = @@ -2385,7 +2370,7 @@ and type_expect_ ?in_function env sexp ty_expected = exp_type = method_type; exp_attributes = []; (* check *) exp_env = env}, - [Tarr_simple, + [Tapp_simple, Some {exp_desc = Texp_ident(path, lid, desc); exp_loc = obj.exp_loc; exp_extra = []; exp_type = desc.val_type; @@ -3094,9 +3079,9 @@ and type_argument env sarg ty_expected' ty_expected = end; let rec make_args args ty_fun = match (expand_head env ty_fun).desc with - | Tarrow (Tarr_optional _ as l,ty_arg,ty_fun,_) -> + | Tarrow (Tarr_optional s,ty_arg,ty_fun,_) -> let ty = option_none (instance env ty_arg) sarg.pexp_loc in - make_args ((l, Some ty) :: args) ty_fun + make_args ((Tapp_optional s, Some ty) :: args) ty_fun | Tarrow (l,_,ty_res',_) when (match l with Tarr_simple -> true | _ -> false) || !Clflags.classic -> @@ -3133,7 +3118,7 @@ and type_argument env sarg ty_expected' ty_expected = let func texp = let e = {texp with exp_type = ty_res; exp_desc = - Texp_apply (texp, args @ [Tarr_simple, Some eta_var])} + Texp_apply (texp, args @ [Tapp_simple, Some eta_var])} in { texp with exp_type = ty_fun; exp_desc = Texp_function(Tarr_simple, [case eta_pat e], Total) } @@ -3157,9 +3142,9 @@ and type_argument env sarg ty_expected' ty_expected = unify_exp env texp ty_expected; texp -and type_application env funct sargs = +and type_application env funct (sargs : (Parsetree.apply_flag * Parsetree.expression) list) = (* funct.exp_type may be generic *) - let sargs = List.map (fun (arr,e) -> tarr_of_parr arr, e) sargs in + let sargs = List.map (fun (app,e) -> tapp_of_papp app, e) sargs in let result_type omitted ty_fun = List.fold_left (fun ty_fun (l,ty,lv) -> newty2 lv (Tarrow(l,ty,ty_fun,Cok))) @@ -3170,16 +3155,25 @@ and type_application env funct sargs = tvar || List.mem l ls in let ignored = ref [] in + (* The main job of typing arguments is done by [type_args], see below. + + [type_unknown_args] is called after, receiving all arguments that didn't + directly match the type of the function but might still be valid by, e.g., + extending the type of the function. + + typed: list of arguments already typechecked + ty_fun: type of the function applied + *) let rec type_unknown_args - (args : (Types.arrow_flag * (unit -> Typedtree.expression) option) list) + (typed : (Types.apply_flag * (unit -> Typedtree.expression) option) list) omitted ty_fun = function [] -> (List.map (function l, None -> l, None | l, Some f -> l, Some (f ())) - (List.rev args), + (List.rev typed), instance env (result_type omitted ty_fun)) - | (l1, sarg1) :: sargl -> + | (app1, sarg1) :: sargl -> let (ty1, ty2) = let ty_fun = expand_head env ty_fun in match ty_fun.desc with @@ -3187,26 +3181,28 @@ and type_application env funct sargs = let t1 = newvar () and t2 = newvar () in let not_identity = function Texp_ident(_,_,{val_kind=Val_prim - {Primitive.prim_name="%identity"}}) -> + {Primitive.prim_name="%identity"}}) -> false | _ -> true in + let arr1 = tarr_of_tapp app1 in if ty_fun.level >= t1.level && not_identity funct.exp_desc then Location.prerr_warning sarg1.pexp_loc Warnings.Unused_argument; - unify env ty_fun (newty (Tarrow(l1,t1,t2,Clink(ref Cunknown)))); + unify env ty_fun (newty (Tarrow(arr1,t1,t2,Clink(ref Cunknown)))); (t1, t2) - | Tarrow (l,t1,t2,_) - when arrow_is_applicable ~expected:l ~applied:l1 -> + | Tarrow (arr1,t1,t2,_) + when arrow_is_applicable arr1 app1 -> (t1, t2) | td -> let ty_fun = match td with Tarrow _ -> newty td | _ -> ty_fun in let ty_res = result_type (omitted @ !ignored) ty_fun in + let arr1 = tarr_of_tapp app1 in match ty_res.desc with Tarrow _ -> - if (!Clflags.classic || not (has_label l1 ty_fun)) then + if (!Clflags.classic || not (has_label arr1 ty_fun)) then raise (Error(sarg1.pexp_loc, env, - Apply_wrong_label(l1, ty_res))) + Apply_wrong_label(app1, ty_res))) else raise (Error(funct.exp_loc, env, Incoherent_label_order)) | _ -> @@ -3215,29 +3211,30 @@ and type_application env funct sargs = in let arg1 () = let arg1 = type_expect env sarg1 ty1 in - if Btype.is_optional l1 then + if (match app1 with Tapp_optional _ -> true | _ -> false) then unify_exp env arg1 (type_option(newvar())); arg1 in - type_unknown_args ((l1, Some arg1) :: args) omitted ty2 sargl + type_unknown_args ((app1, Some arg1) :: typed) omitted ty2 sargl in let ignore_labels = !Clflags.classic || begin let ls, tvar = list_labels env funct.exp_type in not tvar && - let labels = List.filter (function Tarr_optional _ -> false | _ -> true) ls in + let labels = List.filter (fun x -> not (arrow_is_optional x)) ls in List.length labels = List.length sargs && - List.for_all (function (l,_) -> l = Tarr_simple) sargs && + List.for_all (function (l,_) -> l = Tapp_simple) sargs && List.exists (fun l -> l <> Tarr_simple) labels && (Location.prerr_warning funct.exp_loc Warnings.Labels_omitted; true) end in let warned = ref false in - let rec type_args args omitted ty_fun ty_fun0 ty_old sargs more_sargs = + (* Match arguments (with apply_flag) and arrow types (with arrow_flag) *) + let rec type_args typed omitted ty_fun ty_fun0 ty_old sargs more_sargs = match expand_head env ty_fun, expand_head env ty_fun0 with - {desc=Tarrow (l, ty, ty_fun, com); level=lv} as ty_fun', + {desc=Tarrow (arr, ty, ty_fun, com); level=lv} as ty_fun', {desc=Tarrow (_, ty0, ty_fun0, _)} when (sargs <> [] || more_sargs <> []) && commu_repr com = Cok -> let may_warn loc w = @@ -3247,72 +3244,88 @@ and type_application env funct sargs = Location.prerr_warning loc w end in - let name = label_name l in + let name = label_name arr in let sargs, more_sargs, arg = - if ignore_labels && not (is_optional l) then begin + if ignore_labels && not (arrow_is_optional arr) then begin (* In classic mode, omitted = [] *) match sargs, more_sargs with - (l', sarg0) :: _, _ -> + | (app, sarg0) :: _, _ -> raise(Error(sarg0.pexp_loc, env, - Apply_wrong_label(l', ty_old))) - | _, (l', sarg0) :: more_sargs -> - if l <> l' && not (l' = Tarr_simple) then + Apply_wrong_label(app, ty_old))) + | _, (app, sarg0) :: more_sargs -> + if not (arrow_is_compatible arr app) then raise(Error(sarg0.pexp_loc, env, - Apply_wrong_label(l', ty_fun'))) + Apply_wrong_label(app, ty_fun'))) else ([], more_sargs, Some (fun () -> type_argument env sarg0 ty ty0)) | _ -> assert false end else try - let (l', sarg0, sargs, more_sargs) = + let (app, sarg0, sargs, more_sargs) = try - let (l', sarg0, sargs1, sargs2) = extract_label name sargs in + let ((app, sarg0), sargs1, sargs2) = extract_label name sargs in if sargs1 <> [] then may_warn sarg0.pexp_loc (Warnings.Not_principal "commuting this argument"); - (l', sarg0, sargs1 @ sargs2, more_sargs) + (app, sarg0, sargs1 @ sargs2, more_sargs) with Not_found -> - let (l', sarg0, sargs1, sargs2) = + let ((app, sarg0), sargs1, sargs2) = extract_label name more_sargs in if sargs1 <> [] || sargs <> [] then may_warn sarg0.pexp_loc - (Warnings.Not_principal "commuting this argument"); - (l', sarg0, sargs @ sargs1, sargs2) + (Warnings.Not_principal "commuting this argument"); + (app, sarg0, sargs @ sargs1, sargs2) in - if not (is_optional l) && is_optional l' then + (* Optional apply to non optional arrow *) + if (match arr, app with + | Tarr_optional _, _ -> false + | _, Tapp_optional _ -> true + | _ -> false) + then Location.prerr_warning sarg0.pexp_loc - (Warnings.Nonoptional_label (Btype.label_raw l)); - sargs, more_sargs, - if not (is_optional l) || is_optional l' then - Some (fun () -> type_argument env sarg0 ty ty0) - else begin + (Warnings.Nonoptional_label (label_raw arr)); + (* Optional apply or non optional arrow *) + let f = + if (match arr, app with + | _, Tapp_optional _ -> true + | Tarr_optional _, _ -> false + | _ -> true) + then + (fun () -> type_argument env sarg0 ty ty0) + else begin may_warn sarg0.pexp_loc (Warnings.Not_principal "using an optional argument here"); - Some (fun () -> option_some (type_argument env sarg0 - (extract_option_type env ty) - (extract_option_type env ty0))) + (fun () -> option_some (type_argument env sarg0 + (extract_option_type env ty) + (extract_option_type env ty0))) end + in + sargs, more_sargs, Some f with Not_found -> - sargs, more_sargs, - if is_optional l && - ( List.mem_assoc Tarr_simple sargs - || List.mem_assoc Tarr_simple more_sargs) - then begin - may_warn funct.exp_loc - (Warnings.Without_principality "eliminated optional argument"); - ignored := (l,ty,lv) :: !ignored; - Some (fun () -> option_none (instance env ty) Location.none) - end else begin - may_warn funct.exp_loc - (Warnings.Without_principality "commuted an argument"); - None - end + let f = + if arrow_is_optional arr && + (List.mem_assoc Tapp_simple sargs || + List.mem_assoc Tapp_simple more_sargs) then + begin + may_warn funct.exp_loc + (Warnings.Without_principality "eliminated optional argument"); + ignored := (arr,ty,lv) :: !ignored; + Some (fun () -> option_none (instance env ty) Location.none) + end + else + begin + may_warn funct.exp_loc + (Warnings.Without_principality "commuted an argument"); + None + end + in + sargs, more_sargs, f in let omitted = - if arg = None then (l,ty,lv) :: omitted else omitted in + if arg = None then (arr,ty,lv) :: omitted else omitted in let ty_old = if sargs = [] then ty_fun else ty_old in - type_args ((l,arg)::args) omitted ty_fun ty_fun0 + type_args ((tapp_of_tarr arr,arg)::typed) omitted ty_fun ty_fun0 ty_old sargs more_sargs | _ -> match sargs with @@ -3320,13 +3333,13 @@ and type_application env funct sargs = raise(Error(sarg0.pexp_loc, env, Apply_wrong_label(l, ty_old))) | _ -> - type_unknown_args args omitted ty_fun0 + type_unknown_args typed omitted ty_fun0 (sargs @ more_sargs) in match funct.exp_desc, sargs with (* Special case for ignore: avoid discarding warning *) Texp_ident (_, _, {val_kind=Val_prim{Primitive.prim_name="%ignore"}}), - [Tarr_simple, sarg] -> + [Tapp_simple, sarg] -> let ty_arg, ty_res = filter_arrow env (instance env funct.exp_type) Tarr_simple in let exp = type_expect env sarg ty_arg in begin match (expand_head env exp.exp_type).desc with @@ -3336,7 +3349,7 @@ and type_application env funct sargs = add_delayed_check (fun () -> check_application_result env false exp) | _ -> () end; - ([Tarr_simple, Some exp], ty_res) + ([Tapp_simple, Some exp], ty_res) | _ -> let ty = funct.exp_type in if ignore_labels then @@ -3839,9 +3852,9 @@ let report_error env ppf = function end | Apply_wrong_label (l, ty) -> let print_label ppf = function - | Tarr_simple -> fprintf ppf "without label" - | Tarr_optional s -> fprintf ppf "with label ?%s" s - | Tarr_labelled s -> fprintf ppf "with label ~%s" s in + | Tapp_simple -> fprintf ppf "without label" + | Tapp_optional s -> fprintf ppf "with label ?%s" s + | Tapp_labelled s -> fprintf ppf "with label ~%s" s in reset_and_mark_loops ty; fprintf ppf "@[<v>@[<2>The function applied to this argument has type@ %a@]@.\ diff --git a/typing/typecore.mli b/typing/typecore.mli index f07888d566..51ec30db6b 100644 --- a/typing/typecore.mli +++ b/typing/typecore.mli @@ -75,7 +75,7 @@ type error = | Orpat_vars of Ident.t | Expr_type_clash of (type_expr * type_expr) list | Apply_non_function of type_expr - | Apply_wrong_label of arrow_flag * type_expr + | Apply_wrong_label of apply_flag * type_expr | Label_multiply_defined of string | Label_missing of Ident.t list | Label_not_mutable of Longident.t diff --git a/typing/typedtree.ml b/typing/typedtree.ml index fc880b074a..d316ca0821 100644 --- a/typing/typedtree.ml +++ b/typing/typedtree.ml @@ -74,7 +74,7 @@ and expression_desc = | Texp_constant of constant | Texp_let of rec_flag * value_binding list * expression | Texp_function of arrow_flag * case list * partial - | Texp_apply of expression * (arrow_flag * expression option) list + | Texp_apply of expression * (apply_flag * expression option) list | Texp_match of expression * case list * case list * partial | Texp_try of expression * case list | Texp_tuple of expression list @@ -132,7 +132,7 @@ and class_expr_desc = | Tcl_structure of class_structure | Tcl_fun of arrow_flag * pattern * (Ident.t * string loc * expression) list * class_expr * partial - | Tcl_apply of class_expr * (arrow_flag * expression option) list + | Tcl_apply of class_expr * (apply_flag * expression option) list | Tcl_let of rec_flag * value_binding list * (Ident.t * string loc * expression) list * class_expr | Tcl_constraint of diff --git a/typing/typedtree.mli b/typing/typedtree.mli index 6f2c3f46b9..252d2566e0 100644 --- a/typing/typedtree.mli +++ b/typing/typedtree.mli @@ -73,7 +73,7 @@ and expression_desc = | Texp_constant of constant | Texp_let of rec_flag * value_binding list * expression | Texp_function of arrow_flag * case list * partial - | Texp_apply of expression * (arrow_flag * expression option) list + | Texp_apply of expression * (apply_flag * expression option) list | Texp_match of expression * case list * case list * partial | Texp_try of expression * case list | Texp_tuple of expression list @@ -131,7 +131,7 @@ and class_expr_desc = | Tcl_structure of class_structure | Tcl_fun of arrow_flag * pattern * (Ident.t * string loc * expression) list * class_expr * partial - | Tcl_apply of class_expr * (arrow_flag * expression option) list + | Tcl_apply of class_expr * (apply_flag * expression option) list | Tcl_let of rec_flag * value_binding list * (Ident.t * string loc * expression) list * class_expr | Tcl_constraint of diff --git a/typing/types.ml b/typing/types.ml index a1c51c54bc..4ebcd74101 100644 --- a/typing/types.ml +++ b/typing/types.ml @@ -19,6 +19,11 @@ type arrow_flag = | Tarr_labelled of string (* label:T -> ... *) | Tarr_optional of string (* ?label:T -> ... *) +type apply_flag = + | Tapp_simple (* f expr *) + | Tapp_labelled of string (* f ~label:expr *) + | Tapp_optional of string (* f ?label:expr *) + (* Type expressions for the core language *) type type_expr = diff --git a/typing/types.mli b/typing/types.mli index a55c9946d2..d2060eb0a6 100644 --- a/typing/types.mli +++ b/typing/types.mli @@ -19,6 +19,11 @@ type arrow_flag = | Tarr_labelled of string (* label:T -> ... *) | Tarr_optional of string (* ?label:T -> ... *) +type apply_flag = + | Tapp_simple (* f expr *) + | Tapp_labelled of string (* f ~label:expr *) + | Tapp_optional of string (* f ?label:expr *) + (* Type expressions for the core language *) type type_expr = From 79744e6c6de752a322290ee843d1a35e51abb897 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 28 Mar 2014 14:22:02 +0000 Subject: [PATCH 313/494] Introduce Asttypes.arrow_flag to encode labelled arguments --- parsing/asttypes.mli | 5 +++++ parsing/printast.ml | 1 + toplevel/trace.ml | 1 + typing/btype.ml | 1 + typing/typecore.ml | 19 +++++++++---------- 5 files changed, 17 insertions(+), 10 deletions(-) diff --git a/parsing/asttypes.mli b/parsing/asttypes.mli index f02f403881..41fc9b4d9b 100644 --- a/parsing/asttypes.mli +++ b/parsing/asttypes.mli @@ -46,3 +46,8 @@ type variance = | Covariant | Contravariant | Invariant + +type arrow_flag = + | Simple (* T -> ... *) + | Labelled of string (* label:T -> ... *) + | Optional of string (* ?label:T -> ... *) diff --git a/parsing/printast.ml b/parsing/printast.ml index 9d1840a862..d3ae1b804c 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -136,6 +136,7 @@ let apply_flag f = function | Papp_optional s -> fprintf f "?%s" s | Papp_labelled s -> fprintf f "%s" s ;; + let longident_loc i ppf li = line i ppf "%a\n" fmt_longident_loc li;; let string i ppf s = line i ppf "\"%s\"\n" s;; let string_loc i ppf s = line i ppf "%a\n" fmt_string_loc s;; diff --git a/toplevel/trace.ml b/toplevel/trace.ml index de98494071..7d1c99dd35 100644 --- a/toplevel/trace.ml +++ b/toplevel/trace.ml @@ -12,6 +12,7 @@ (* The "trace" facility *) +open Asttypes open Format open Misc open Longident diff --git a/typing/btype.ml b/typing/btype.ml index 14e2dd9d81..dec0a90931 100644 --- a/typing/btype.ml +++ b/typing/btype.ml @@ -12,6 +12,7 @@ (* Basic operations on core types *) +open Asttypes open Misc open Types diff --git a/typing/typecore.ml b/typing/typecore.ml index f6008e9fe5..bae1390b39 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -3288,19 +3288,18 @@ and type_application env funct (sargs : (Parsetree.apply_flag * Parsetree.expres (* Optional apply or non optional arrow *) let f = if (match arr, app with - | _, Tapp_optional _ -> true - | Tarr_optional _, _ -> false - | _ -> true) + | _, Tapp_optional _ -> true + | Tarr_optional _, _ -> false + | _ -> true) then (fun () -> type_argument env sarg0 ty ty0) else begin - may_warn sarg0.pexp_loc - (Warnings.Not_principal "using an optional argument here"); - (fun () -> option_some (type_argument env sarg0 - (extract_option_type env ty) - (extract_option_type env ty0))) - end - in + may_warn sarg0.pexp_loc + (Warnings.Not_principal "using an optional argument here"); + (fun () -> option_some (type_argument env sarg0 + (extract_option_type env ty) + (extract_option_type env ty0))) + end in sargs, more_sargs, Some f with Not_found -> let f = From 7fcd9ce2267f20a49b3d62020254e8687c0d99ca Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 28 Mar 2014 14:22:02 +0000 Subject: [PATCH 314/494] Introduce Asttypes.arrow_flag to encode labelled arguments --- parsing/asttypes.mli | 5 ----- toplevel/trace.ml | 1 - typing/btype.ml | 1 - typing/typecore.ml | 4 ++-- 4 files changed, 2 insertions(+), 9 deletions(-) diff --git a/parsing/asttypes.mli b/parsing/asttypes.mli index 41fc9b4d9b..f02f403881 100644 --- a/parsing/asttypes.mli +++ b/parsing/asttypes.mli @@ -46,8 +46,3 @@ type variance = | Covariant | Contravariant | Invariant - -type arrow_flag = - | Simple (* T -> ... *) - | Labelled of string (* label:T -> ... *) - | Optional of string (* ?label:T -> ... *) diff --git a/toplevel/trace.ml b/toplevel/trace.ml index 7d1c99dd35..de98494071 100644 --- a/toplevel/trace.ml +++ b/toplevel/trace.ml @@ -12,7 +12,6 @@ (* The "trace" facility *) -open Asttypes open Format open Misc open Longident diff --git a/typing/btype.ml b/typing/btype.ml index dec0a90931..14e2dd9d81 100644 --- a/typing/btype.ml +++ b/typing/btype.ml @@ -12,7 +12,6 @@ (* Basic operations on core types *) -open Asttypes open Misc open Types diff --git a/typing/typecore.ml b/typing/typecore.ml index bae1390b39..535f1868e0 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -3297,8 +3297,8 @@ and type_application env funct (sargs : (Parsetree.apply_flag * Parsetree.expres may_warn sarg0.pexp_loc (Warnings.Not_principal "using an optional argument here"); (fun () -> option_some (type_argument env sarg0 - (extract_option_type env ty) - (extract_option_type env ty0))) + (extract_option_type env ty) + (extract_option_type env ty0))) end in sargs, more_sargs, Some f with Not_found -> From 148d4bc2f4c00857b86ac74cd9d43464939b849c Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Tue, 25 Mar 2014 16:44:07 +0000 Subject: [PATCH 315/494] Introduce "implicit" keyword and constructions in parser --- ocamldoc/odoc_ast.ml | 3 ++- ocamldoc/odoc_sig.ml | 4 +++- parsing/ast_helper.ml | 3 +++ parsing/ast_helper.mli | 3 +++ parsing/ast_mapper.ml | 23 +++++++++++++++++++++++ parsing/ast_mapper.mli | 2 ++ parsing/lexer.mll | 1 + parsing/parser.mly | 15 +++++++++++++++ parsing/parsetree.mli | 6 ++++++ parsing/pprintast.ml | 38 ++++++++++++++++++++++++++++++++++++++ parsing/printast.ml | 12 ++++++++++++ tools/depend.ml | 8 ++++++++ typing/typecore.ml | 12 +++++++++++- typing/typemod.ml | 10 +++++++--- 14 files changed, 134 insertions(+), 6 deletions(-) diff --git a/ocamldoc/odoc_ast.ml b/ocamldoc/odoc_ast.ml index a897e3db0c..b7cad7c451 100644 --- a/ocamldoc/odoc_ast.ml +++ b/ocamldoc/odoc_ast.ml @@ -1420,7 +1420,8 @@ module Analyser = in (0, new_env, [ Element_exception new_ext ]) - | Parsetree.Pstr_module {Parsetree.pmb_name=name; pmb_expr=module_expr} -> + | Parsetree.Pstr_module {Parsetree.pmb_name=name; pmb_expr=module_expr} + | Parsetree.Pstr_implicit {Parsetree.pmb_name=name; pmb_expr=module_expr} -> ( (* of string * module_expr *) try diff --git a/ocamldoc/odoc_sig.ml b/ocamldoc/odoc_sig.ml index f5f19d63c5..9a95a04307 100644 --- a/ocamldoc/odoc_sig.ml +++ b/ocamldoc/odoc_sig.ml @@ -334,6 +334,7 @@ module Analyser = | [] -> acc | types -> take_item (Parsetree.Psig_type types)) | Parsetree.Psig_module {Parsetree.pmd_name=name} + | Parsetree.Psig_implicit {Parsetree.pmd_name=name} | Parsetree.Psig_modtype {Parsetree.pmtd_name=name} as m -> if Name.Set.mem name.txt erased then acc else take_item m | Parsetree.Psig_recmodule mods -> @@ -843,7 +844,8 @@ module Analyser = in (0, env, ele_comments) - | Parsetree.Psig_module {Parsetree.pmd_name=name; pmd_type=module_type} -> + | Parsetree.Psig_module {Parsetree.pmd_name=name; pmd_type=module_type} + | Parsetree.Psig_implicit {Parsetree.pmd_name=name; pmd_type=module_type} -> let complete_name = Name.concat current_module_name name.txt in (* get the the module type in the signature by the module name *) let sig_module_type = diff --git a/parsing/ast_helper.ml b/parsing/ast_helper.ml index c7d86d66c7..0da82cb0f7 100644 --- a/parsing/ast_helper.ml +++ b/parsing/ast_helper.ml @@ -74,6 +74,7 @@ module Pat = struct let lazy_ ?loc ?attrs a = mk ?loc ?attrs (Ppat_lazy a) let unpack ?loc ?attrs a = mk ?loc ?attrs (Ppat_unpack a) let exception_ ?loc ?attrs a = mk ?loc ?attrs (Ppat_exception a) + let implicit_ ?loc ?attrs a = mk ?loc ?attrs (Ppat_implicit a) let extension ?loc ?attrs a = mk ?loc ?attrs (Ppat_extension a) end @@ -162,6 +163,7 @@ module Sig = struct let type_extension ?loc a = mk ?loc (Psig_typext a) let exception_ ?loc a = mk ?loc (Psig_exception a) let module_ ?loc a = mk ?loc (Psig_module a) + let implicit_ ?loc a = mk ?loc (Psig_implicit a) let rec_module ?loc a = mk ?loc (Psig_recmodule a) let modtype ?loc a = mk ?loc (Psig_modtype a) let open_ ?loc a = mk ?loc (Psig_open a) @@ -186,6 +188,7 @@ module Str = struct let type_extension ?loc a = mk ?loc (Pstr_typext a) let exception_ ?loc a = mk ?loc (Pstr_exception a) let module_ ?loc a = mk ?loc (Pstr_module a) + let implicit_ ?loc a = mk ?loc (Pstr_implicit a) let rec_module ?loc a = mk ?loc (Pstr_recmodule a) let modtype ?loc a = mk ?loc (Pstr_modtype a) let open_ ?loc a = mk ?loc (Pstr_open a) diff --git a/parsing/ast_helper.mli b/parsing/ast_helper.mli index 5bf9b62a1d..fee9e97590 100644 --- a/parsing/ast_helper.mli +++ b/parsing/ast_helper.mli @@ -82,6 +82,7 @@ module Pat: val lazy_: ?loc:loc -> ?attrs:attrs -> pattern -> pattern val unpack: ?loc:loc -> ?attrs:attrs -> str -> pattern val exception_: ?loc:loc -> ?attrs:attrs -> pattern -> pattern + val implicit_: ?loc:loc -> ?attrs:attrs -> str -> pattern val extension: ?loc:loc -> ?attrs:attrs -> extension -> pattern end @@ -226,6 +227,7 @@ module Sig: val type_extension: ?loc:loc -> type_extension -> signature_item val exception_: ?loc:loc -> extension_constructor -> signature_item val module_: ?loc:loc -> module_declaration -> signature_item + val implicit_: ?loc:loc -> module_declaration -> signature_item val rec_module: ?loc:loc -> module_declaration list -> signature_item val modtype: ?loc:loc -> module_type_declaration -> signature_item val open_: ?loc:loc -> open_description -> signature_item @@ -249,6 +251,7 @@ module Str: val type_extension: ?loc:loc -> type_extension -> structure_item val exception_: ?loc:loc -> extension_constructor -> structure_item val module_: ?loc:loc -> module_binding -> structure_item + val implicit_: ?loc:loc -> module_binding -> structure_item val rec_module: ?loc:loc -> module_binding list -> structure_item val modtype: ?loc:loc -> module_type_declaration -> structure_item val open_: ?loc:loc -> open_description -> structure_item diff --git a/parsing/ast_mapper.ml b/parsing/ast_mapper.ml index acee1fd111..3bf7d85073 100644 --- a/parsing/ast_mapper.ml +++ b/parsing/ast_mapper.ml @@ -54,6 +54,8 @@ type mapper = { module_type: mapper -> module_type -> module_type; module_type_declaration: mapper -> module_type_declaration -> module_type_declaration; + implicit_binding: mapper -> module_binding -> module_binding; + implicit_declaration: mapper -> module_declaration -> module_declaration; open_description: mapper -> open_description -> open_description; pat: mapper -> pattern -> pattern; payload: mapper -> payload -> payload; @@ -244,6 +246,8 @@ module MT = struct | Psig_module x -> module_ ~loc (sub.module_declaration sub x) | Psig_recmodule l -> rec_module ~loc (List.map (sub.module_declaration sub) l) + | Psig_implicit x -> + implicit_ ~loc (sub.implicit_declaration sub x) | Psig_modtype x -> modtype ~loc (sub.module_type_declaration sub x) | Psig_open x -> open_ ~loc (sub.open_description sub x) | Psig_include x -> include_ ~loc (sub.include_description sub x) @@ -290,6 +294,7 @@ module M = struct | Pstr_typext te -> type_extension ~loc (sub.type_extension sub te) | Pstr_exception ed -> exception_ ~loc (sub.extension_constructor sub ed) | Pstr_module x -> module_ ~loc (sub.module_binding sub x) + | Pstr_implicit x -> implicit_ ~loc (sub.implicit_binding sub x) | Pstr_recmodule l -> rec_module ~loc (List.map (sub.module_binding sub) l) | Pstr_modtype x -> modtype ~loc (sub.module_type_declaration sub x) | Pstr_open x -> open_ ~loc (sub.open_description sub x) @@ -402,6 +407,8 @@ module P = struct | Ppat_lazy p -> lazy_ ~loc ~attrs (sub.pat sub p) | Ppat_unpack s -> unpack ~loc ~attrs (map_loc sub s) | Ppat_exception p -> exception_ ~loc ~attrs (sub.pat sub p) + | Ppat_implicit s -> + implicit_ ~loc ~attrs (map_loc sub s) | Ppat_extension x -> extension ~loc ~attrs (sub.extension sub x) end @@ -537,6 +544,22 @@ let default_mapper = ~loc:(this.location this pmb_loc) ); + implicit_declaration = + (fun this {pmd_name; pmd_type; pmd_attributes; pmd_loc} -> + Md.mk + (map_loc this pmd_name) + (this.module_type this pmd_type) + ~attrs:(this.attributes this pmd_attributes) + ~loc:(this.location this pmd_loc) + ); + + implicit_binding = + (fun this {pmb_name; pmb_expr; pmb_attributes; pmb_loc} -> + Mb.mk (map_loc this pmb_name) (this.module_expr this pmb_expr) + ~attrs:(this.attributes this pmb_attributes) + ~loc:(this.location this pmb_loc) + ); + open_description = (fun this {popen_lid; popen_override; popen_attributes; popen_loc} -> diff --git a/parsing/ast_mapper.mli b/parsing/ast_mapper.mli index d48971d589..84be9c0860 100644 --- a/parsing/ast_mapper.mli +++ b/parsing/ast_mapper.mli @@ -80,6 +80,8 @@ type mapper = { module_type: mapper -> module_type -> module_type; module_type_declaration: mapper -> module_type_declaration -> module_type_declaration; + implicit_binding: mapper -> module_binding -> module_binding; + implicit_declaration: mapper -> module_declaration -> module_declaration; open_description: mapper -> open_description -> open_description; pat: mapper -> pattern -> pattern; payload: mapper -> payload -> payload; diff --git a/parsing/lexer.mll b/parsing/lexer.mll index ad71678128..de5531f554 100644 --- a/parsing/lexer.mll +++ b/parsing/lexer.mll @@ -61,6 +61,7 @@ let keyword_table = "match", MATCH; "method", METHOD; "module", MODULE; + "implicit", IMPLICIT; "mutable", MUTABLE; "new", NEW; "nonrec", NONREC; diff --git a/parsing/parser.mly b/parsing/parser.mly index 13f513dc4a..a8dcc928e3 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -440,6 +440,7 @@ let class_of_let_bindings lbs body = %token GREATERRBRACE %token GREATERRBRACKET %token IF +%token IMPLICIT %token IN %token INCLUDE %token <string> INFIXOP0 @@ -766,6 +767,8 @@ structure_item: | module_type_declaration { mkstr(Pstr_modtype $1) } | open_statement { mkstr(Pstr_open $1) } + | IMPLICIT MODULE module_binding + { mkstr(Pstr_implicit $3) } | class_declarations { mkstr(Pstr_class (List.rev $1)) } | class_type_declarations @@ -859,6 +862,15 @@ signature_item: { mksig(Psig_module $1) } | module_alias { mksig(Psig_module $1) } + | IMPLICIT MODULE UIDENT module_declaration post_item_attributes + { mksig(Psig_module (Md.mk (mkrhs $3 3) + $4 ~attrs:$5 ~loc:(symbol_rloc()))) } + | IMPLICIT MODULE UIDENT EQUAL mod_longident post_item_attributes + { mksig(Psig_module (Md.mk (mkrhs $3 3) + (Mty.alias ~loc:(rhs_loc 5) (mkrhs $5 5)) + ~attrs:$6 + ~loc:(symbol_rloc()) + )) } | rec_module_declarations { mksig(Psig_recmodule (List.rev $1)) } | module_type_declaration @@ -1207,6 +1219,9 @@ labeled_simple_pattern: { (Parr_labelled (fst $2), None, snd $2) } | LABEL simple_pattern { (Parr_labelled $1, None, $2) } + | LPAREN IMPLICIT UIDENT COLON package_type RPAREN + { (Parr_simple, None, mkpat(Ppat_constraint(mkpat(Ppat_unpack (mkrhs $3 3)), + ghtyp(Ptyp_package $5)))) } | simple_pattern { (Parr_simple, None, $1) } ; diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index 40a90caace..aaee891e4c 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -204,6 +204,8 @@ and pattern_desc = *) | Ppat_exception of pattern (* exception P *) + | Ppat_implicit of string loc + (* (implicit P: S) *) | Ppat_extension of extension (* [%id] *) @@ -663,6 +665,8 @@ and signature_item_desc = (* module X : MT *) | Psig_recmodule of module_declaration list (* module rec X1 : MT1 and ... and Xn : MTn *) + | Psig_implicit of module_declaration + (* implicit module X : MT *) | Psig_modtype of module_type_declaration (* module type S = MT module type S *) @@ -790,6 +794,8 @@ and structure_item_desc = (* module X = ME *) | Pstr_recmodule of module_binding list (* module rec X1 = ME1 and ... and Xn = MEn *) + | Pstr_implicit of module_binding + (* implicit module X = ME *) | Pstr_modtype of module_type_declaration (* module type S = MT *) | Pstr_open of open_description diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index 86d4b72ac8..064b9cb2f0 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -126,6 +126,22 @@ let is_simple_construct :construct -> bool = function let pp = fprintf +<<<<<<< HEAD +======= +let rec is_irrefut_patt x = + match x.ppat_desc with + | Ppat_any | Ppat_var _ | Ppat_unpack _ | Ppat_implicit _ -> true + | Ppat_alias (p,_) -> is_irrefut_patt p + | Ppat_tuple (ps) -> List.for_all is_irrefut_patt ps + | Ppat_constraint (p,_) -> is_irrefut_patt p + | Ppat_or (l,r) -> is_irrefut_patt l || is_irrefut_patt r + | Ppat_record (ls,_) -> List.for_all (fun (_,x) -> is_irrefut_patt x) ls + | Ppat_lazy p -> is_irrefut_patt p + | Ppat_extension _ -> assert false + | Ppat_interval _ + | Ppat_constant _ | Ppat_construct _ | Ppat_variant _ | Ppat_array _ + | Ppat_type _-> false (*conservative*) +>>>>>>> Introduce "implicit" keyword and constructions in parser class printer ()= object(self:'self) val pipe = false val semi = false @@ -378,6 +394,8 @@ class printer ()= object(self:'self) pp f "@[<2>[|%a|]@]" (self#list self#pattern1 ~sep:";") l | Ppat_unpack (s) -> pp f "(module@ %s)@ " s.txt + | Ppat_implicit s -> + pp f "(implicit@ %s)@ " s.txt | Ppat_type li -> pp f "#%a" self#longident_loc li | Ppat_record (l, closed) -> @@ -992,6 +1010,7 @@ class printer ()= object(self:'self) | Psig_module pmd -> pp f "@[<hov>module@ %s@ :@ %a@]%a" pmd.pmd_name.txt +<<<<<<< HEAD self#module_type pmd.pmd_type self#item_attributes pmd.pmd_attributes | Psig_open od -> @@ -1005,6 +1024,23 @@ class printer ()= object(self:'self) self#item_attributes incl.pincl_attributes | Psig_modtype {pmtd_name=s; pmtd_type=md; pmtd_attributes=attrs} -> pp f "@[<hov2>module@ type@ %s%a@]%a" +======= + self#module_type pmd.pmd_type + | Psig_implicit {pmd_name; pmd_type={pmty_desc=Pmty_alias alias}} -> + pp f "@[<hov>implicit module@ %s@ =@ %a@]" + pmd_name.txt self#longident_loc alias + | Psig_implicit pmd -> + pp f "@[<hov>implicit module@ %s@ :@ %a@]" + pmd.pmd_name.txt + self#module_type pmd.pmd_type + | Psig_open (ovf, li, _attrs) -> + pp f "@[<hov2>open%s@ %a@]" (override ovf) self#longident_loc li + | Psig_include (mt, _attrs) -> + pp f "@[<hov2>include@ %a@]" + self#module_type mt + | Psig_modtype {pmtd_name=s; pmtd_type=md} -> + pp f "@[<hov2>module@ type@ %s%a@]" +>>>>>>> Introduce "implicit" keyword and constructions in parser s.txt (fun f md -> match md with | None -> () @@ -1134,6 +1170,8 @@ class printer ()= object(self:'self) | Pstr_exception ed -> self#exception_declaration f ed | Pstr_module x -> pp f "@[<hov2>module@ %a@]" self#module_binding x + | Pstr_implicit x -> + pp f "@[<hov2>implicit module@ %a@]" self#module_binding x | Pstr_open (ovf, li, _attrs) -> pp f "@[<2>open%s@;%a@]" (override ovf) self#longident_loc li; | Pstr_modtype {pmtd_name=s; pmtd_type=md} -> diff --git a/parsing/printast.ml b/parsing/printast.ml index d3ae1b804c..22802b88be 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -239,9 +239,14 @@ and pattern i ppf x = longident_loc i ppf li | Ppat_unpack s -> line i ppf "Ppat_unpack %a\n" fmt_string_loc s; +<<<<<<< HEAD | Ppat_exception p -> line i ppf "Ppat_exception\n"; pattern i ppf p +======= + | Ppat_implicit s -> + line i ppf "Ppat_implicit %a\n" fmt_string_loc s; +>>>>>>> Introduce "implicit" keyword and constructions in parser | Ppat_extension (s, arg) -> line i ppf "Ppat_extension \"%s\"\n" s.txt; payload i ppf arg @@ -667,6 +672,10 @@ and signature_item i ppf x = | Psig_recmodule decls -> line i ppf "Psig_recmodule\n"; list i module_declaration ppf decls; + | Psig_implicit pmd -> + line i ppf "Psig_implicit %a\n" fmt_string_loc pmd.pmd_name; + attributes i ppf pmd.pmd_attributes; + module_type i ppf pmd.pmd_type | Psig_modtype x -> line i ppf "Psig_modtype %a\n" fmt_string_loc x.pmtd_name; attributes i ppf x.pmtd_attributes; @@ -774,6 +783,9 @@ and structure_item i ppf x = | Pstr_recmodule bindings -> line i ppf "Pstr_recmodule\n"; list i module_binding ppf bindings; + | Pstr_implicit x -> + line i ppf "Pstr_implicit\n"; + module_binding i ppf x | Pstr_modtype x -> line i ppf "Pstr_modtype %a\n" fmt_string_loc x.pmtd_name; attributes i ppf x.pmtd_attributes; diff --git a/tools/depend.ml b/tools/depend.ml index f9fb9100d6..f3d492ae43 100644 --- a/tools/depend.ml +++ b/tools/depend.ml @@ -136,7 +136,11 @@ let rec add_pattern bv pat = | Ppat_type li -> add bv li | Ppat_lazy p -> add_pattern bv p | Ppat_unpack id -> pattern_bv := StringSet.add id.txt !pattern_bv +<<<<<<< HEAD | Ppat_exception p -> add_pattern bv p +======= + | Ppat_implicit id -> pattern_bv := StringSet.add id.txt !pattern_bv +>>>>>>> Introduce "implicit" keyword and constructions in parser | Ppat_extension _ -> () let add_pattern bv pat = @@ -254,6 +258,8 @@ and add_sig_item bv item = in List.iter (fun pmd -> add_modtype bv' pmd.pmd_type) decls; bv' + | Psig_implicit pmd -> + add_modtype bv pmd.pmd_type; StringSet.add pmd.pmd_name.txt bv | Psig_modtype x -> begin match x.pmtd_type with None -> () @@ -307,6 +313,8 @@ and add_struct_item bv item = add_extension_constructor bv pext; bv | Pstr_module x -> add_module bv x.pmb_expr; StringSet.add x.pmb_name.txt bv + | Pstr_implicit x -> + add_module bv x.pmb_expr; StringSet.add x.pmb_name.txt bv | Pstr_recmodule bindings -> let bv' = List.fold_right StringSet.add diff --git a/typing/typecore.ml b/typing/typecore.ml index 535f1868e0..99d66d1f3b 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -189,6 +189,7 @@ let iter_expression f e = | Pstr_extension _ -> () | Pstr_include {pincl_mod = me} | Pstr_module {pmb_expr = me} -> module_expr me + | Pstr_implicit {pmb_expr = me} -> module_expr me | Pstr_recmodule l -> List.iter (fun x -> module_expr x.pmb_expr) l | Pstr_class cdl -> List.iter (fun c -> class_expr c.pci_expr) cdl @@ -926,6 +927,15 @@ let rec type_pat ~constrs ~labels ~no_existentials ~mode ~env sp expected_ty = pat_type = expected_ty; pat_attributes = []; pat_env = !env } + | Ppat_implicit name -> + let id = enter_variable loc name expected_ty ~is_module:true in + rp { + pat_desc = Tpat_var (id, name); + pat_loc = sp.ppat_loc; + pat_extra=[Tpat_unpack, loc, sp.ppat_attributes]; + pat_type = expected_ty; + pat_attributes = []; + pat_env = !env } | Ppat_constraint({ppat_desc=Ppat_var name; ppat_loc=lloc}, ({ptyp_desc=Ptyp_poly _} as sty)) -> (* explicitly polymorphic type *) @@ -1645,7 +1655,7 @@ let iter_ppat f p = match p.ppat_desc with | Ppat_any | Ppat_var _ | Ppat_constant _ | Ppat_interval _ | Ppat_extension _ - | Ppat_type _ | Ppat_unpack _ -> () + | Ppat_type _ | Ppat_unpack _ | Ppat_implicit _ -> () | Ppat_array pats -> List.iter f pats | Ppat_or (p1,p2) -> f p1; f p2 | Ppat_variant (_, arg) | Ppat_construct (_, arg) -> may f arg diff --git a/typing/typemod.ml b/typing/typemod.ml index bd5ed8138c..2ea6d86348 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -618,8 +618,8 @@ and transl_signature env sg = (if shadowed then rem else Sig_typext(ext.ext_id, ext.ext_type, Text_exception) :: rem), final_env - | Psig_module pmd -> - check_name "module" module_names pmd.pmd_name; + | Psig_module pmd | Psig_implicit pmd -> + check "module" item.psig_loc module_names pmd.pmd_name.txt; let tmty = transl_modtype env pmd.pmd_type in let md = { md_type=tmty.mty_type; @@ -1283,7 +1283,11 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = newenv | Pstr_module {pmb_name = name; pmb_expr = smodl; pmb_attributes = attrs; pmb_loc; - } -> + } + | Pstr_implicit {pmb_name = name; pmb_expr = smodl; pmb_attributes = attrs; + pmb_loc; + } + -> check_name "module" module_names name; let modl = type_module ~alias:true true funct_body From 6cd31d798b0dbb9bb4af54a671a6c237512e62f3 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Thu, 27 Mar 2014 10:19:54 +0000 Subject: [PATCH 316/494] WIP introducing implicit in typing --- parsing/ast_helper.ml | 32 ++++++++++++++++++++++++++++++++ parsing/ast_helper.mli | 21 +++++++++++++++++++-- parsing/ast_mapper.ml | 36 ++++++++++++++++++++++++------------ parsing/ast_mapper.mli | 5 +++-- parsing/parser.mly | 30 ++++++++++++++++++++++++++++-- parsing/parsetree.mli | 30 ++++++++++++++++++++++++++++-- parsing/pprintast.ml | 36 ++++++++++++++++++++++++++++-------- parsing/pprintast.mli | 1 + parsing/printast.ml | 30 +++++++++++++++++++++++------- typing/btype.ml | 16 +++++++++++++++- typing/btype.mli | 2 ++ typing/env.ml | 27 +++++++++++++++++++++++++++ typing/subst.ml | 29 ++++++++++++++++++++++++++++- typing/subst.mli | 1 + typing/types.ml | 9 +++++++++ typing/types.mli | 9 +++++++++ 16 files changed, 277 insertions(+), 37 deletions(-) diff --git a/parsing/ast_helper.ml b/parsing/ast_helper.ml index 0da82cb0f7..95dcabb3be 100644 --- a/parsing/ast_helper.ml +++ b/parsing/ast_helper.ml @@ -357,6 +357,38 @@ module Incl = struct end +module Id = struct + let mk ?(loc = !default_loc) ?(attrs = []) name params typ = + { + pid_name = name; + pid_type = typ; + pid_attributes = attrs; + pid_loc = loc; + pid_parameters = params; + } +end + +module Ib = struct + let mk ?(loc = !default_loc) ?(attrs = []) name params expr = + { + pib_name = name; + pib_expr = expr; + pib_attributes = attrs; + pib_loc = loc; + pib_parameters = params; + } +end + +module Ip = struct + let mk ?(loc = !default_loc) ?(attrs = []) name typ = + { + pip_name = name; + pip_mty = typ; + pip_loc = loc; + pip_attributes = attrs; + } +end + module Vb = struct let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs) ?(text = []) pat expr = diff --git a/parsing/ast_helper.mli b/parsing/ast_helper.mli index fee9e97590..66c17a85f3 100644 --- a/parsing/ast_helper.mli +++ b/parsing/ast_helper.mli @@ -227,7 +227,7 @@ module Sig: val type_extension: ?loc:loc -> type_extension -> signature_item val exception_: ?loc:loc -> extension_constructor -> signature_item val module_: ?loc:loc -> module_declaration -> signature_item - val implicit_: ?loc:loc -> module_declaration -> signature_item + val implicit_: ?loc:loc -> implicit_declaration -> signature_item val rec_module: ?loc:loc -> module_declaration list -> signature_item val modtype: ?loc:loc -> module_type_declaration -> signature_item val open_: ?loc:loc -> open_description -> signature_item @@ -251,7 +251,7 @@ module Str: val type_extension: ?loc:loc -> type_extension -> structure_item val exception_: ?loc:loc -> extension_constructor -> structure_item val module_: ?loc:loc -> module_binding -> structure_item - val implicit_: ?loc:loc -> module_binding -> structure_item + val implicit_: ?loc:loc -> implicit_binding -> structure_item val rec_module: ?loc:loc -> module_binding list -> structure_item val modtype: ?loc:loc -> module_type_declaration -> structure_item val open_: ?loc:loc -> open_description -> structure_item @@ -295,6 +295,23 @@ module Opn: module Incl: sig val mk: ?loc: loc -> ?attrs:attrs -> ?docs:docs -> 'a -> 'a include_infos + +(** Implicit declarations *) +module Id: + sig + val mk: ?loc:loc -> ?attrs:attrs -> str -> implicit_parameter list -> module_type -> implicit_declaration + end + +(** Implicit bindings *) +module Ib: + sig + val mk: ?loc:loc -> ?attrs:attrs -> str -> implicit_parameter list -> module_expr -> implicit_binding + end + +(** Implicit parameters *) +module Ip: + sig + val mk: ?loc:loc -> ?attrs:attrs -> str -> module_type -> implicit_parameter end (** Value bindings *) diff --git a/parsing/ast_mapper.ml b/parsing/ast_mapper.ml index 3bf7d85073..b0a84bdce0 100644 --- a/parsing/ast_mapper.ml +++ b/parsing/ast_mapper.ml @@ -54,8 +54,9 @@ type mapper = { module_type: mapper -> module_type -> module_type; module_type_declaration: mapper -> module_type_declaration -> module_type_declaration; - implicit_binding: mapper -> module_binding -> module_binding; - implicit_declaration: mapper -> module_declaration -> module_declaration; + implicit_binding: mapper -> implicit_binding -> implicit_binding; + implicit_declaration: mapper -> implicit_declaration -> implicit_declaration; + implicit_parameter: mapper -> implicit_parameter -> implicit_parameter; open_description: mapper -> open_description -> open_description; pat: mapper -> pattern -> pattern; payload: mapper -> payload -> payload; @@ -545,19 +546,30 @@ let default_mapper = ); implicit_declaration = - (fun this {pmd_name; pmd_type; pmd_attributes; pmd_loc} -> - Md.mk - (map_loc this pmd_name) - (this.module_type this pmd_type) - ~attrs:(this.attributes this pmd_attributes) - ~loc:(this.location this pmd_loc) + (fun this {pid_name; pid_type; pid_attributes; pid_loc; pid_parameters} -> + Id.mk + (map_loc this pid_name) + (List.map (this.implicit_parameter this) pid_parameters) + (this.module_type this pid_type) + ~attrs:(this.attributes this pid_attributes) + ~loc:(this.location this pid_loc) ); implicit_binding = - (fun this {pmb_name; pmb_expr; pmb_attributes; pmb_loc} -> - Mb.mk (map_loc this pmb_name) (this.module_expr this pmb_expr) - ~attrs:(this.attributes this pmb_attributes) - ~loc:(this.location this pmb_loc) + (fun this {pib_name; pib_expr; pib_attributes; pib_loc; pib_parameters} -> + Ib.mk + (map_loc this pib_name) + (List.map (this.implicit_parameter this) pib_parameters) + (this.module_expr this pib_expr) + ~attrs:(this.attributes this pib_attributes) + ~loc:(this.location this pib_loc) + ); + + implicit_parameter = + (fun this {pip_name; pip_loc; pip_mty; pip_attributes} -> + Ip.mk (map_loc this pip_name) (this.module_type this pip_mty) + ~attrs:(this.attributes this pip_attributes) + ~loc:(this.location this pip_loc) ); diff --git a/parsing/ast_mapper.mli b/parsing/ast_mapper.mli index 84be9c0860..27a145d33d 100644 --- a/parsing/ast_mapper.mli +++ b/parsing/ast_mapper.mli @@ -80,8 +80,9 @@ type mapper = { module_type: mapper -> module_type -> module_type; module_type_declaration: mapper -> module_type_declaration -> module_type_declaration; - implicit_binding: mapper -> module_binding -> module_binding; - implicit_declaration: mapper -> module_declaration -> module_declaration; + implicit_binding: mapper -> implicit_binding -> implicit_binding; + implicit_declaration: mapper -> implicit_declaration -> implicit_declaration; + implicit_parameter: mapper -> implicit_parameter -> implicit_parameter; open_description: mapper -> open_description -> open_description; pat: mapper -> pattern -> pattern; payload: mapper -> payload -> payload; diff --git a/parsing/parser.mly b/parsing/parser.mly index a8dcc928e3..d5897dbbae 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -767,8 +767,8 @@ structure_item: | module_type_declaration { mkstr(Pstr_modtype $1) } | open_statement { mkstr(Pstr_open $1) } - | IMPLICIT MODULE module_binding - { mkstr(Pstr_implicit $3) } + | IMPLICIT module_binding + { mkstr(Pstr_implicit $2) } | class_declarations { mkstr(Pstr_class (List.rev $1)) } | class_type_declarations @@ -814,6 +814,32 @@ and_module_binding: ~text:(symbol_text ()) ~docs:(symbol_docs ()) } ; + +implicit_parameter: + | LPAREN functor_arg_name COLON module_type RPAREN + { Ip.mk (mkrhs $2 2) $4 ~loc:(symbol_rloc ()) } +; +implicit_parameters: + implicit_parameters implicit_parameter + { $2 :: $1 } + | implicit_parameter + { [ $1 ] } +; + +implicit_binding: + MODULE UIDENT implicit_binding_body + { Ib.mk (mkrhs $2 2) [] $3 ~loc:(symbol_rloc ()) } + | FUNCTOR UIDENT implicit_parameters implicit_binding_body + { Ib.mk (mkrhs $2 2) $3 $4 ~loc:(symbol_rloc ()) } +; + +implicit_binding_body: + EQUAL module_expr + { $2 } + | COLON module_type EQUAL module_expr + { mkmod(Pmod_constraint($4, $2)) } +; + /* Module types */ module_type: diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index aaee891e4c..5b66b22919 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -665,7 +665,7 @@ and signature_item_desc = (* module X : MT *) | Psig_recmodule of module_declaration list (* module rec X1 : MT1 and ... and Xn : MTn *) - | Psig_implicit of module_declaration + | Psig_implicit of implicit_declaration (* implicit module X : MT *) | Psig_modtype of module_type_declaration (* module type S = MT @@ -794,7 +794,7 @@ and structure_item_desc = (* module X = ME *) | Pstr_recmodule of module_binding list (* module rec X1 = ME1 and ... and Xn = MEn *) - | Pstr_implicit of module_binding + | Pstr_implicit of implicit_binding (* implicit module X = ME *) | Pstr_modtype of module_type_declaration (* module type S = MT *) @@ -828,6 +828,32 @@ and module_binding = } (* X = ME *) +and implicit_declaration = + { + pid_name: string loc; + pid_type: module_type; + pid_attributes: attributes; (* ... [@@id1] [@@id2] *) + pid_loc: Location.t; + pid_parameters: implicit_parameter list; + } + +and implicit_binding = + { + pib_name: string loc; + pib_expr: module_expr; + pib_attributes : attributes; + pib_loc: Location.t; + pib_parameters: implicit_parameter list; + } + +and implicit_parameter = + { + pip_name: string loc; + pip_mty: module_type; + pip_loc: Location.t; + pip_attributes: attributes; + } + (** {2 Toplevel} *) (* Toplevel phrases *) diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index 064b9cb2f0..b1ec140764 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -1026,13 +1026,15 @@ class printer ()= object(self:'self) pp f "@[<hov2>module@ type@ %s%a@]%a" ======= self#module_type pmd.pmd_type - | Psig_implicit {pmd_name; pmd_type={pmty_desc=Pmty_alias alias}} -> - pp f "@[<hov>implicit module@ %s@ =@ %a@]" - pmd_name.txt self#longident_loc alias - | Psig_implicit pmd -> + | Psig_implicit ({pid_parameters = []; _} as pid) -> pp f "@[<hov>implicit module@ %s@ :@ %a@]" - pmd.pmd_name.txt - self#module_type pmd.pmd_type + pid.pid_name.txt + self#module_type pid.pid_type + | Psig_implicit pid -> + pp f "@[<hov>implicit functor@ %s@ %a@ :@ %a@]" + pid.pid_name.txt + (self#list self#implicit_parameter ~sep:"@ ") pid.pid_parameters + self#module_type pid.pid_type | Psig_open (ovf, li, _attrs) -> pp f "@[<hov2>open%s@ %a@]" (override ovf) self#longident_loc li | Psig_include (mt, _attrs) -> @@ -1100,6 +1102,10 @@ class printer ()= object(self:'self) method structure f x = self#list ~sep:"@\n" self#structure_item f x + method implicit_parameter f x = + pp f "@[<hov2>(%s@ :@ %a)]" x.pip_name.txt + self#module_type x.pip_mty + method payload f = function | PStr [{pstr_desc = Pstr_eval (e, attrs)}] -> pp f "@[<2>%a@]%a" @@ -1170,8 +1176,22 @@ class printer ()= object(self:'self) | Pstr_exception ed -> self#exception_declaration f ed | Pstr_module x -> pp f "@[<hov2>module@ %a@]" self#module_binding x - | Pstr_implicit x -> - pp f "@[<hov2>implicit module@ %a@]" self#module_binding x + | Pstr_implicit pib -> + pp f "@[<hov2>implicit %s@ %s@ %a%a@]" + (match pib.pib_parameters with + | [] -> "module" + | _ -> "functor") + pib.pib_name.txt + (self#list self#implicit_parameter ~sep:"@ ") pib.pib_parameters + (fun f me -> + match me.pmod_desc with + | Pmod_constraint + (me, + ({pmty_desc=(Pmty_ident _ | Pmty_signature _);_} as mt)) -> + pp f " :@;%a@;=@;%a@;" self#module_type mt self#module_expr me + | _ -> + pp f " =@ %a" self#module_expr me + ) pib.pib_expr | Pstr_open (ovf, li, _attrs) -> pp f "@[<2>open%s@;%a@]" (override ovf) self#longident_loc li; | Pstr_modtype {pmtd_name=s; pmtd_type=md} -> diff --git a/parsing/pprintast.mli b/parsing/pprintast.mli index 0db5e18e17..f33cbbd9d6 100644 --- a/parsing/pprintast.mli +++ b/parsing/pprintast.mli @@ -50,6 +50,7 @@ class printer : method expression2 : Format.formatter -> Parsetree.expression -> unit method extension_constructor : Format.formatter -> Parsetree.extension_constructor -> unit + method implicit_parameter : Format.formatter -> Parsetree.implicit_parameter -> unit method label_exp : Format.formatter -> Parsetree.arrow_flag * Parsetree.expression option * Parsetree.pattern -> diff --git a/parsing/printast.ml b/parsing/printast.ml index 22802b88be..1ea4911ab6 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -672,10 +672,10 @@ and signature_item i ppf x = | Psig_recmodule decls -> line i ppf "Psig_recmodule\n"; list i module_declaration ppf decls; - | Psig_implicit pmd -> - line i ppf "Psig_implicit %a\n" fmt_string_loc pmd.pmd_name; - attributes i ppf pmd.pmd_attributes; - module_type i ppf pmd.pmd_type + | Psig_implicit pid -> + line i ppf "Psig_implicit %a\n" fmt_string_loc pid.pid_name; + attributes i ppf pid.pid_attributes; + module_type i ppf pid.pid_type | Psig_modtype x -> line i ppf "Psig_modtype %a\n" fmt_string_loc x.pmtd_name; attributes i ppf x.pmtd_attributes; @@ -783,9 +783,8 @@ and structure_item i ppf x = | Pstr_recmodule bindings -> line i ppf "Pstr_recmodule\n"; list i module_binding ppf bindings; - | Pstr_implicit x -> - line i ppf "Pstr_implicit\n"; - module_binding i ppf x + | Pstr_implicit pib -> + line i ppf "Pstr_implicit\n" | Pstr_modtype x -> line i ppf "Pstr_modtype %a\n" fmt_string_loc x.pmtd_name; attributes i ppf x.pmtd_attributes; @@ -823,6 +822,23 @@ and module_binding i ppf x = attributes i ppf x.pmb_attributes; module_expr (i+1) ppf x.pmb_expr +and implicit_declaration i ppf pid = + string_loc i ppf pid.pid_name; + attributes i ppf pid.pid_attributes; + list i implicit_parameter ppf pid.pid_parameters; + module_type (i+1) ppf pid.pid_type; + +and implicit_binding i ppf pib = + string_loc i ppf pib.pib_name; + attributes i ppf pib.pib_attributes; + list i implicit_parameter ppf pib.pib_parameters; + module_expr (i+1) ppf pib.pib_expr + +and implicit_parameter i ppf pip = + string_loc i ppf pip.pip_name; + attributes i ppf pip.pip_attributes; + module_type (i+1) ppf pip.pip_mty; + and core_type_x_core_type_x_location i ppf (ct1, ct2, l) = line i ppf "<constraint> %a\n" fmt_location l; core_type (i+1) ppf ct1; diff --git a/typing/btype.ml b/typing/btype.ml index 14e2dd9d81..8ac16a597b 100644 --- a/typing/btype.ml +++ b/typing/btype.ml @@ -61,6 +61,14 @@ let default_mty = function Some mty -> mty | None -> Mty_signature [] +let mty_of_implicit_declaration imd = + let functorize (id,mty) final_mty = + Mty_functor (id, Some mty, final_mty) + in + List.fold_right functorize + imd.imd_parameters + imd.imd_type + (**** Representative of a type ****) let rec field_kind_repr = @@ -243,6 +251,7 @@ type type_iterators = it_type_declaration: type_iterators -> type_declaration -> unit; it_extension_constructor: type_iterators -> extension_constructor -> unit; it_module_declaration: type_iterators -> module_declaration -> unit; + it_implicit_declaration: type_iterators -> implicit_declaration -> unit; it_modtype_declaration: type_iterators -> modtype_declaration -> unit; it_class_declaration: type_iterators -> class_declaration -> unit; it_class_type_declaration: type_iterators -> class_type_declaration -> unit; @@ -260,6 +269,7 @@ let type_iterators = Sig_value (_, vd) -> it.it_value_description it vd | Sig_type (_, td, _) -> it.it_type_declaration it td | Sig_typext (_, td, _) -> it.it_extension_constructor it td + | Sig_implicit (_, imd) -> it.it_implicit_declaration it imd | Sig_module (_, md, _) -> it.it_module_declaration it md | Sig_modtype (_, mtd) -> it.it_modtype_declaration it mtd | Sig_class (_, cd, _) -> it.it_class_declaration it cd @@ -275,6 +285,9 @@ let type_iterators = List.iter (it.it_type_expr it) td.ext_type_params; List.iter (it.it_type_expr it) td.ext_args; may (it.it_type_expr it) td.ext_ret_type + and it_implicit_declaration it imd = + List.iter (fun (_,ty) -> it.it_module_type it ty) imd.imd_parameters; + it.it_module_type it imd.imd_type and it_module_declaration it md = it.it_module_type it md.md_type and it_modtype_declaration it mtd = @@ -335,7 +348,8 @@ let type_iterators = it_type_kind; it_class_type; it_module_type; it_signature; it_class_type_declaration; it_class_declaration; it_modtype_declaration; it_module_declaration; it_extension_constructor; - it_type_declaration; it_value_description; it_signature_item; } + it_type_declaration; it_value_description; it_signature_item; + it_implicit_declaration; } let copy_row f fixed row keep more = let fields = List.map diff --git a/typing/btype.mli b/typing/btype.mli index 7a7c0ae140..a26ca02f6b 100644 --- a/typing/btype.mli +++ b/typing/btype.mli @@ -45,6 +45,7 @@ val is_Tvar: type_expr -> bool val is_Tunivar: type_expr -> bool val dummy_method: label val default_mty: module_type option -> module_type +val mty_of_implicit_declaration: implicit_declaration -> module_type val repr: type_expr -> type_expr (* Return the canonical representative of a type. *) @@ -97,6 +98,7 @@ type type_iterators = it_type_declaration: type_iterators -> type_declaration -> unit; it_extension_constructor: type_iterators -> extension_constructor -> unit; it_module_declaration: type_iterators -> module_declaration -> unit; + it_implicit_declaration: type_iterators -> implicit_declaration -> unit; it_modtype_declaration: type_iterators -> modtype_declaration -> unit; it_class_declaration: type_iterators -> class_declaration -> unit; it_class_type_declaration: type_iterators -> class_type_declaration -> unit; diff --git a/typing/env.ml b/typing/env.ml index b11be4d8ba..39c9f3f4d4 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -1158,6 +1158,11 @@ let rec prefix_idents root pos sub = function let (pl, final_sub) = prefix_idents root (pos+1) (Subst.add_module id p sub) rem in (p::pl, final_sub) + | Sig_implicit(id, imd) :: rem -> + let p = Pdot(root, Ident.name id, pos) in + let (pl, final_sub) = + prefix_idents root (pos+1) (Subst.add_module id p sub) rem in + (p::pl, final_sub) | Sig_modtype(id, decl) :: rem -> let p = Pdot(root, Ident.name id, nopos) in let (pl, final_sub) = @@ -1185,6 +1190,8 @@ let subst_signature sub sg = Sig_typext (id, Subst.extension_constructor sub ext, es) | Sig_module(id, mty, x) -> Sig_module(id, Subst.module_declaration sub mty,x) + | Sig_implicit(id, imd) -> + Sig_implicit(id, Subst.implicit_declaration sub imd) | Sig_modtype(id, decl) -> Sig_modtype(id, Subst.modtype_declaration sub decl) | Sig_class(id, decl, x) -> @@ -1285,6 +1292,16 @@ and components_of_module_maker (env, sub, path, mty) = Tbl.add (Ident.name id) (comps, !pos) c.comp_components; env := store_module None id (Pident id) md !env !env; incr pos + | Sig_implicit(id, imd) -> + let mty = mty_of_implicit_declaration imd in + let mty' = EnvLazy.create (sub, mty) in + c.comp_modules <- + Tbl.add (Ident.name id) (mty', !pos) c.comp_modules; + let comps = components_of_module !env sub path mty in + c.comp_components <- + Tbl.add (Ident.name id) (comps, !pos) c.comp_components; + env := store_module None id path mty !env !env; + incr pos | Sig_modtype(id, decl) -> let decl' = Subst.modtype_declaration sub decl in c.comp_modtypes <- @@ -1451,6 +1468,16 @@ and store_module slot id path md env renv = env.components renv.components; summary = Env_module(env.summary, id, md) } +and store_implicit slot id path imd env renv = + { env with + modules = EnvTbl.add "module" slot id (path, md) env.modules renv.modules; + components = + EnvTbl.add "module" slot id + (path, components_of_module env Subst.identity path md.md_type) + env.components renv.components; + summary = Env_module(env.summary, id, md) } + + and store_modtype slot id path info env renv = { env with modtypes = EnvTbl.add "module type" slot id (path, info) env.modtypes diff --git a/typing/subst.ml b/typing/subst.ml index c9b18e267b..ebca93d982 100644 --- a/typing/subst.ml +++ b/typing/subst.ml @@ -24,7 +24,9 @@ type t = for_saving: bool } let identity = - { types = Tbl.empty; modules = Tbl.empty; modtypes = Tbl.empty; + { types = Tbl.empty; + modules = Tbl.empty; + modtypes = Tbl.empty; for_saving = false } let add_type id p s = { s with types = Tbl.add id p s.types } @@ -331,6 +333,10 @@ let rec rename_bound_idents s idents = function | Sig_module(id, mty, _) :: sg -> let id' = Ident.rename id in rename_bound_idents (add_module id (Pident id') s) (id' :: idents) sg + (* Implicits behave like modules at this point? *) + | Sig_implicit(id, imd) :: sg -> + let id' = Ident.rename id in + rename_bound_idents (add_module id (Pident id') s) (id' :: idents) sg | Sig_modtype(id, d) :: sg -> let id' = Ident.rename id in rename_bound_idents (add_modtype id (Mty_ident(Pident id')) s) @@ -377,6 +383,8 @@ and signature_component s comp newid = Sig_typext(newid, extension_constructor s ext, es) | Sig_module(id, d, rs) -> Sig_module(newid, module_declaration s d, rs) + | Sig_implicit (id, imd) -> + Sig_implicit(newid, implicit_declaration s imd) | Sig_modtype(id, d) -> Sig_modtype(newid, modtype_declaration s d) | Sig_class(id, d, rs) -> @@ -391,6 +399,25 @@ and module_declaration s decl = md_loc = loc s decl.md_loc; } +and implicit_declaration s decl = + let rec parameters acc s = function + | [] -> List.rev acc, s + | (id, mty) :: tl -> + let id' = Ident.rename id in + parameters + ((id', modtype s mty) :: acc) + (add_module id (Pident id') s) + tl + in + let params, s = parameters [] s decl.imd_parameters in + let typ = modtype s decl.imd_type in + { + imd_type = typ; + imd_attributes = attrs s decl.imd_attributes; + imd_loc = loc s decl.imd_loc; + imd_parameters = params; + } + and modtype_declaration s decl = { mtd_type = may_map (modtype s) decl.mtd_type; diff --git a/typing/subst.mli b/typing/subst.mli index 7f6870e939..8181fc15a6 100644 --- a/typing/subst.mli +++ b/typing/subst.mli @@ -53,6 +53,7 @@ val modtype_declaration: t -> modtype_declaration -> modtype_declaration val module_declaration: t -> module_declaration -> module_declaration val typexp : t -> Types.type_expr -> Types.type_expr val class_signature: t -> class_signature -> class_signature +val implicit_declaration: t -> implicit_declaration -> implicit_declaration (* Composition of substitutions: apply (compose s1 s2) x = apply s2 (apply s1 x) *) diff --git a/typing/types.ml b/typing/types.ml index 4ebcd74101..a1d839b54e 100644 --- a/typing/types.ml +++ b/typing/types.ml @@ -288,6 +288,7 @@ and signature_item = | Sig_type of Ident.t * type_declaration * rec_status | Sig_typext of Ident.t * extension_constructor * ext_status | Sig_module of Ident.t * module_declaration * rec_status + | Sig_implicit of Ident.t * implicit_declaration | Sig_modtype of Ident.t * modtype_declaration | Sig_class of Ident.t * class_declaration * rec_status | Sig_class_type of Ident.t * class_type_declaration * rec_status @@ -299,6 +300,14 @@ and module_declaration = md_loc: Location.t; } +and implicit_declaration = + { + imd_type: module_type; + imd_attributes: Parsetree.attributes; + imd_loc: Location.t; + imd_parameters: (Ident.t * module_type) list; + } + and modtype_declaration = { mtd_type: module_type option; (* Nonte: abstract *) diff --git a/typing/types.mli b/typing/types.mli index d2060eb0a6..2930406c11 100644 --- a/typing/types.mli +++ b/typing/types.mli @@ -278,6 +278,7 @@ and signature_item = | Sig_type of Ident.t * type_declaration * rec_status | Sig_typext of Ident.t * extension_constructor * ext_status | Sig_module of Ident.t * module_declaration * rec_status + | Sig_implicit of Ident.t * implicit_declaration | Sig_modtype of Ident.t * modtype_declaration | Sig_class of Ident.t * class_declaration * rec_status | Sig_class_type of Ident.t * class_type_declaration * rec_status @@ -296,6 +297,14 @@ and modtype_declaration = mtd_loc: Location.t; } +and implicit_declaration = + { + imd_type: module_type; + imd_attributes: Parsetree.attributes; + imd_loc: Location.t; + imd_parameters: (Ident.t * module_type) list; + } + and rec_status = Trec_not (* first in a nonrecursive group *) | Trec_first (* first in a recursive group *) From 856a2abe82e808fdda80c19be9f7e2599a094d80 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Thu, 27 Mar 2014 11:14:50 +0000 Subject: [PATCH 317/494] Make ocaml compile, add TODOs for implicit in typer --- bytecomp/translmod.ml | 3 +++ tools/depend.ml | 4 ++-- typing/btype.ml | 11 +---------- typing/btype.mli | 1 - typing/env.ml | 27 +++++++++++++++------------ typing/env.mli | 2 ++ typing/envaux.ml | 4 ++++ typing/includemod.ml | 6 ++++++ typing/mtype.ml | 18 ++++++++++++++++++ typing/oprint.ml | 21 +++++++++++++++++++++ typing/outcometree.mli | 2 ++ typing/printtyp.ml | 3 +++ typing/subst.ml | 20 ++++---------------- typing/subst.mli | 1 + typing/typecore.ml | 2 +- typing/typemod.ml | 11 +++++++---- typing/types.ml | 7 +++---- typing/types.mli | 7 +++---- 18 files changed, 96 insertions(+), 54 deletions(-) diff --git a/bytecomp/translmod.ml b/bytecomp/translmod.ml index d3c6ca2b04..c37195467f 100644 --- a/bytecomp/translmod.ml +++ b/bytecomp/translmod.ml @@ -222,6 +222,9 @@ let init_shape modl = | Sig_module(id, md, _) :: rem -> init_shape_mod env md.md_type :: init_shape_struct (Env.add_module_declaration id md env) rem + | Sig_implicit(id, imd) :: rem -> + init_shape_mod env imd.imd_module.md_type :: + init_shape_struct (Env.add_implicit_declaration id imd env) rem | Sig_modtype(id, minfo) :: rem -> init_shape_struct (Env.add_modtype id minfo env) rem | Sig_class(id, cdecl, _) :: rem -> diff --git a/tools/depend.ml b/tools/depend.ml index f3d492ae43..910648d2ea 100644 --- a/tools/depend.ml +++ b/tools/depend.ml @@ -259,7 +259,7 @@ and add_sig_item bv item = List.iter (fun pmd -> add_modtype bv' pmd.pmd_type) decls; bv' | Psig_implicit pmd -> - add_modtype bv pmd.pmd_type; StringSet.add pmd.pmd_name.txt bv + add_modtype bv pmd.pid_type; StringSet.add pmd.pid_name.txt bv | Psig_modtype x -> begin match x.pmtd_type with None -> () @@ -314,7 +314,7 @@ and add_struct_item bv item = | Pstr_module x -> add_module bv x.pmb_expr; StringSet.add x.pmb_name.txt bv | Pstr_implicit x -> - add_module bv x.pmb_expr; StringSet.add x.pmb_name.txt bv + add_module bv x.pib_expr; StringSet.add x.pib_name.txt bv | Pstr_recmodule bindings -> let bv' = List.fold_right StringSet.add diff --git a/typing/btype.ml b/typing/btype.ml index 8ac16a597b..4d508720f1 100644 --- a/typing/btype.ml +++ b/typing/btype.ml @@ -61,14 +61,6 @@ let default_mty = function Some mty -> mty | None -> Mty_signature [] -let mty_of_implicit_declaration imd = - let functorize (id,mty) final_mty = - Mty_functor (id, Some mty, final_mty) - in - List.fold_right functorize - imd.imd_parameters - imd.imd_type - (**** Representative of a type ****) let rec field_kind_repr = @@ -286,8 +278,7 @@ let type_iterators = List.iter (it.it_type_expr it) td.ext_args; may (it.it_type_expr it) td.ext_ret_type and it_implicit_declaration it imd = - List.iter (fun (_,ty) -> it.it_module_type it ty) imd.imd_parameters; - it.it_module_type it imd.imd_type + it.it_module_declaration it imd.imd_module and it_module_declaration it md = it.it_module_type it md.md_type and it_modtype_declaration it mtd = diff --git a/typing/btype.mli b/typing/btype.mli index a26ca02f6b..3b5903c933 100644 --- a/typing/btype.mli +++ b/typing/btype.mli @@ -45,7 +45,6 @@ val is_Tvar: type_expr -> bool val is_Tunivar: type_expr -> bool val dummy_method: label val default_mty: module_type option -> module_type -val mty_of_implicit_declaration: implicit_declaration -> module_type val repr: type_expr -> type_expr (* Return the canonical representative of a type. *) diff --git a/typing/env.ml b/typing/env.ml index 39c9f3f4d4..c759b395b2 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -113,6 +113,7 @@ type summary = | Env_type of summary * Ident.t * type_declaration | Env_extension of summary * Ident.t * extension_constructor | Env_module of summary * Ident.t * module_declaration + | Env_implicit of summary * Ident.t * implicit_declaration | Env_modtype of summary * Ident.t * modtype_declaration | Env_class of summary * Ident.t * class_declaration | Env_cltype of summary * Ident.t * class_type_declaration @@ -1282,7 +1283,7 @@ and components_of_module_maker (env, sub, path, mty) = c.comp_constrs <- add_to_tbl (Ident.name id) (descr, !pos) c.comp_constrs; incr pos - | Sig_module(id, md, _) -> + | Sig_module(id, md, _) | Sig_implicit (id, { imd_module = md; _ }) -> let mty = md.md_type in let mty' = EnvLazy.create (sub, mty) in c.comp_modules <- @@ -1292,16 +1293,6 @@ and components_of_module_maker (env, sub, path, mty) = Tbl.add (Ident.name id) (comps, !pos) c.comp_components; env := store_module None id (Pident id) md !env !env; incr pos - | Sig_implicit(id, imd) -> - let mty = mty_of_implicit_declaration imd in - let mty' = EnvLazy.create (sub, mty) in - c.comp_modules <- - Tbl.add (Ident.name id) (mty', !pos) c.comp_modules; - let comps = components_of_module !env sub path mty in - c.comp_components <- - Tbl.add (Ident.name id) (comps, !pos) c.comp_components; - env := store_module None id path mty !env !env; - incr pos | Sig_modtype(id, decl) -> let decl' = Subst.modtype_declaration sub decl in c.comp_modtypes <- @@ -1469,13 +1460,14 @@ and store_module slot id path md env renv = summary = Env_module(env.summary, id, md) } and store_implicit slot id path imd env renv = + let md = imd.imd_module in { env with modules = EnvTbl.add "module" slot id (path, md) env.modules renv.modules; components = EnvTbl.add "module" slot id (path, components_of_module env Subst.identity path md.md_type) env.components renv.components; - summary = Env_module(env.summary, id, md) } + summary = Env_implicit(env.summary, id, imd) } and store_modtype slot id path info env renv = @@ -1542,6 +1534,14 @@ and add_module_declaration ?arg id md env = let env = store_module None id path md env env in add_functor_arg ?arg id env +and add_implicit_declaration id imd env = + let path = + (*match md.md_type with + Mty_alias path -> normalize_path env path + | _ ->*) Pident id + in + store_implicit None id path imd env env + and add_modtype id info env = store_modtype None id (Pident id) info env env @@ -1592,6 +1592,7 @@ let add_item comp env = | Sig_type(id, decl, _) -> add_type ~check:false id decl env | Sig_typext(id, ext, _) -> add_extension ~check:false id ext env | Sig_module(id, md, _) -> add_module_declaration id md env + | Sig_implicit(id, imd) -> add_implicit_declaration id imd env | Sig_modtype(id, decl) -> add_modtype id decl env | Sig_class(id, decl, _) -> add_class id decl env | Sig_class_type(id, decl, _) -> add_cltype id decl env @@ -1622,6 +1623,8 @@ let open_signature slot root sg env0 = store_extension ~check:false slot (Ident.hide id) p ext env env0 | Sig_module(id, mty, _) -> store_module slot (Ident.hide id) p mty env env0 + | Sig_implicit(id, imd) -> + store_implicit slot (Ident.hide id) p imd env env0 | Sig_modtype(id, decl) -> store_modtype slot (Ident.hide id) p decl env env0 | Sig_class(id, decl, _) -> diff --git a/typing/env.mli b/typing/env.mli index e894557e0b..86dc73ca6e 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -20,6 +20,7 @@ type summary = | Env_type of summary * Ident.t * type_declaration | Env_extension of summary * Ident.t * extension_constructor | Env_module of summary * Ident.t * module_declaration + | Env_implicit of summary * Ident.t * implicit_declaration | Env_modtype of summary * Ident.t * modtype_declaration | Env_class of summary * Ident.t * class_declaration | Env_cltype of summary * Ident.t * class_type_declaration @@ -107,6 +108,7 @@ val add_type: check:bool -> Ident.t -> type_declaration -> t -> t val add_extension: check:bool -> Ident.t -> extension_constructor -> t -> t val add_module: ?arg:bool -> Ident.t -> module_type -> t -> t val add_module_declaration: ?arg:bool -> Ident.t -> module_declaration -> t -> t +val add_implicit_declaration: Ident.t -> implicit_declaration -> t -> t val add_modtype: Ident.t -> modtype_declaration -> t -> t val add_class: Ident.t -> class_declaration -> t -> t val add_cltype: Ident.t -> class_type_declaration -> t -> t diff --git a/typing/envaux.ml b/typing/envaux.ml index 708da443d2..876c1a0f60 100644 --- a/typing/envaux.ml +++ b/typing/envaux.ml @@ -55,6 +55,10 @@ let rec env_from_summary sum subst = Env.add_module_declaration id (Subst.module_declaration subst desc) (env_from_summary s subst) + | Env_implicit(s, id, desc) -> + Env.add_implicit_declaration id + (Subst.implicit_declaration subst desc) + (env_from_summary s subst) | Env_modtype(s, id, desc) -> Env.add_modtype id (Subst.modtype_declaration subst desc) (env_from_summary s subst) diff --git a/typing/includemod.ml b/typing/includemod.ml index 91f37d7ccf..b9124b2d33 100644 --- a/typing/includemod.ml +++ b/typing/includemod.ml @@ -126,6 +126,7 @@ type field_desc = | Field_type of string | Field_typext of string | Field_module of string + | Field_implicit of string | Field_modtype of string | Field_class of string | Field_classtype of string @@ -135,6 +136,7 @@ let kind_of_field_desc = function | Field_type _ -> "type" | Field_typext _ -> "extension constructor" | Field_module _ -> "module" + | Field_implicit _ -> "implicit" | Field_modtype _ -> "module type" | Field_class _ -> "class" | Field_classtype _ -> "class type" @@ -144,6 +146,7 @@ let item_ident_name = function | Sig_type(id, d, _) -> (id, d.type_loc, Field_type(Ident.name id)) | Sig_typext(id, d, _) -> (id, d.ext_loc, Field_typext(Ident.name id)) | Sig_module(id, d, _) -> (id, d.md_loc, Field_module(Ident.name id)) + | Sig_implicit(id, d) -> (id, d.imd_module.md_loc, Field_implicit(Ident.name id)) | Sig_modtype(id, d) -> (id, d.mtd_loc, Field_modtype(Ident.name id)) | Sig_class(id, d, _) -> (id, d.cty_loc, Field_class(Ident.name id)) | Sig_class_type(id, d, _) -> (id, d.clty_loc, Field_classtype(Ident.name id)) @@ -156,6 +159,7 @@ let is_runtime_component = function | Sig_value(_,_) | Sig_typext(_,_,_) | Sig_module(_,_,_) + | Sig_implicit(_,_) | Sig_class(_, _,_) -> true (* Print a coercion *) @@ -343,6 +347,8 @@ and signatures env cxt subst sig1 sig2 = Subst.add_type id2 (Pident id1) subst | Sig_module _ -> Subst.add_module id2 (Pident id1) subst + | Sig_implicit _ -> + Subst.add_implicit id2 (Pident id1) subst | Sig_modtype _ -> Subst.add_modtype id2 (Mty_ident (Pident id1)) subst | Sig_value _ | Sig_typext _ diff --git a/typing/mtype.ml b/typing/mtype.ml index 21d6b871c2..e2baa274fd 100644 --- a/typing/mtype.ml +++ b/typing/mtype.ml @@ -67,6 +67,11 @@ and strengthen_sig env sg p = Sig_module(id, str, rs) :: strengthen_sig (Env.add_module_declaration id md env) rem p (* Need to add the module in case it defines manifest module types *) + | Sig_implicit(id, imd) :: rem -> + let md = imd.imd_module in + let md = strengthen_decl env md (Pdot(p, Ident.name id, nopos)) in + Sig_implicit(id, {imd with imd_module = md}) + :: strengthen_sig (Env.add_implicit_declaration id imd env) rem p | Sig_modtype(id, decl) :: rem -> let newdecl = match decl.mtd_type with @@ -134,6 +139,11 @@ let nondep_supertype env mid mty = | Sig_module(id, md, rs) -> Sig_module(id, {md with md_type=nondep_mty env va md.md_type}, rs) :: rem' + | Sig_implicit(id, imd) -> + let md = imd.imd_module in + let md = {md with md_type=nondep_mty env va md.md_type} in + Sig_implicit(id, {imd with imd_module = md}) + :: rem' | Sig_modtype(id, d) -> begin try Sig_modtype(id, nondep_modtype_decl env d) :: rem' @@ -206,6 +216,9 @@ and type_paths_sig env p pos sg = | Sig_module(id, md, _) :: rem -> type_paths env (Pdot(p, Ident.name id, pos)) md.md_type @ type_paths_sig (Env.add_module_declaration id md env) p (pos+1) rem + | Sig_implicit(id, imd) :: rem -> + type_paths env (Pdot(p, Ident.name id, pos)) imd.imd_module.md_type @ + type_paths_sig (Env.add_implicit_declaration id imd env) p (pos+1) rem | Sig_modtype(id, decl) :: rem -> type_paths_sig (Env.add_modtype id decl env) p pos rem | (Sig_typext _ | Sig_class _) :: rem -> @@ -231,6 +244,9 @@ and no_code_needed_sig env sg = | Sig_module(id, md, _) :: rem -> no_code_needed env md.md_type && no_code_needed_sig (Env.add_module_declaration id md env) rem + | Sig_implicit(id, imd) :: rem -> + no_code_needed env imd.imd_module.md_type && + no_code_needed_sig (Env.add_implicit_declaration id imd env) rem | (Sig_type _ | Sig_modtype _ | Sig_class_type _) :: rem -> no_code_needed_sig env rem | (Sig_typext _ | Sig_class _) :: rem -> @@ -262,6 +278,8 @@ and contains_type_item env = function raise Exit | Sig_module (_, {md_type = mty}, _) -> contains_type env mty + | Sig_implicit (_, imd) -> + contains_type env imd.imd_module.md_type | Sig_value _ | Sig_type _ | Sig_typext _ diff --git a/typing/oprint.ml b/typing/oprint.ml index 4f48232505..cc74846029 100644 --- a/typing/oprint.ml +++ b/typing/oprint.ml @@ -351,6 +351,22 @@ let rec print_out_functor ppf = fprintf ppf "(%s : %a) %a" name print_out_module_type mty_arg print_out_functor mty_res | m -> fprintf ppf "->@ %a" print_out_module_type m +and print_out_implicit_functor n ppf = + function + | Omty_functor (name , Some mty_arg, mty_res) when n > 0 -> + fprintf ppf "(%s : %a) %a" name + print_out_module_type mty_arg + (print_out_implicit_functor (n - 1)) mty_res + (* The implicit declares 'n' parameters, but when printing module_type + we leave the implicit parameters side. If the state is consistent, + n should be 0 now. *) + | Omty_alias id -> + assert (n = 0); + fprintf ppf "=@ %a" print_ident id + | m -> + assert (n = 0); + fprintf ppf ":@ %a" print_out_module_type m + and print_out_module_type ppf = function Omty_abstract -> () @@ -417,6 +433,11 @@ and print_out_sig_item ppf = | Orec_first -> "module rec" | Orec_next -> "and") name !out_module_type mty + | Osig_implicit (name, n, mty) -> + fprintf ppf "@[<2>implicit %s %s %a@]" + (if n = 0 then "module" else "functor") + name + (print_out_implicit_functor n) mty | Osig_type(td, rs) -> print_out_type_decl (match rs with diff --git a/typing/outcometree.mli b/typing/outcometree.mli index 18885e8de6..0406d43dbd 100644 --- a/typing/outcometree.mli +++ b/typing/outcometree.mli @@ -90,6 +90,8 @@ and out_sig_item = | Osig_typext of out_extension_constructor * out_ext_status | Osig_modtype of string * out_module_type | Osig_module of string * out_module_type * out_rec_status + (** name, number of implicit parameters, module type *) + | Osig_implicit of string * int * out_module_type | Osig_type of out_type_decl * out_rec_status | Osig_value of string * out_type * string list and out_type_decl = diff --git a/typing/printtyp.ml b/typing/printtyp.ml index c7fd5139a9..f39666b2ec 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -1224,6 +1224,9 @@ and tree_of_signature_rec env' in_type_group = function | Sig_module(id, md, rs) -> [Osig_module (Ident.name id, tree_of_modtype md.md_type, tree_of_rec rs)] + | Sig_implicit(id, imd) -> + [Osig_implicit (Ident.name id, imd.imd_parameters, + tree_of_modtype imd.imd_module.md_type)] | Sig_modtype(id, decl) -> [tree_of_modtype_declaration id decl] | Sig_class(id, decl, rs) -> diff --git a/typing/subst.ml b/typing/subst.ml index ebca93d982..da02a6b895 100644 --- a/typing/subst.ml +++ b/typing/subst.ml @@ -32,6 +32,7 @@ let identity = let add_type id p s = { s with types = Tbl.add id p s.types } let add_module id p s = { s with modules = Tbl.add id p s.modules } +let add_implicit = add_module let add_modtype id ty s = { s with modtypes = Tbl.add id ty s.modtypes } @@ -336,7 +337,7 @@ let rec rename_bound_idents s idents = function (* Implicits behave like modules at this point? *) | Sig_implicit(id, imd) :: sg -> let id' = Ident.rename id in - rename_bound_idents (add_module id (Pident id') s) (id' :: idents) sg + rename_bound_idents (add_implicit id (Pident id') s) (id' :: idents) sg | Sig_modtype(id, d) :: sg -> let id' = Ident.rename id in rename_bound_idents (add_modtype id (Mty_ident(Pident id')) s) @@ -400,22 +401,9 @@ and module_declaration s decl = } and implicit_declaration s decl = - let rec parameters acc s = function - | [] -> List.rev acc, s - | (id, mty) :: tl -> - let id' = Ident.rename id in - parameters - ((id', modtype s mty) :: acc) - (add_module id (Pident id') s) - tl - in - let params, s = parameters [] s decl.imd_parameters in - let typ = modtype s decl.imd_type in { - imd_type = typ; - imd_attributes = attrs s decl.imd_attributes; - imd_loc = loc s decl.imd_loc; - imd_parameters = params; + imd_module = module_declaration s decl.imd_module; + imd_parameters = decl.imd_parameters; } and modtype_declaration s decl = diff --git a/typing/subst.mli b/typing/subst.mli index 8181fc15a6..8dea6b7567 100644 --- a/typing/subst.mli +++ b/typing/subst.mli @@ -32,6 +32,7 @@ val identity: t val add_type: Ident.t -> Path.t -> t -> t val add_module: Ident.t -> Path.t -> t -> t +val add_implicit: Ident.t -> Path.t -> t -> t val add_modtype: Ident.t -> module_type -> t -> t val for_saving: t -> t val reset_for_saving: unit -> unit diff --git a/typing/typecore.ml b/typing/typecore.ml index 99d66d1f3b..9103bd8484 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -189,7 +189,7 @@ let iter_expression f e = | Pstr_extension _ -> () | Pstr_include {pincl_mod = me} | Pstr_module {pmb_expr = me} -> module_expr me - | Pstr_implicit {pmb_expr = me} -> module_expr me + | Pstr_implicit _ -> failwith "TODO" | Pstr_recmodule l -> List.iter (fun x -> module_expr x.pmb_expr) l | Pstr_class cdl -> List.iter (fun c -> class_expr c.pci_expr) cdl diff --git a/typing/typemod.ml b/typing/typemod.ml index 2ea6d86348..0249ea849a 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -618,7 +618,7 @@ and transl_signature env sg = (if shadowed then rem else Sig_typext(ext.ext_id, ext.ext_type, Text_exception) :: rem), final_env - | Psig_module pmd | Psig_implicit pmd -> + | Psig_module pmd -> check "module" item.psig_loc module_names pmd.pmd_name.txt; let tmty = transl_modtype env pmd.pmd_type in let md = { @@ -636,6 +636,8 @@ and transl_signature env sg = env loc :: trem, Sig_module(id, md, Trec_not) :: rem, final_env + | Psig_implicit _ -> + failwith "TODO" | Psig_recmodule sdecls -> List.iter (fun pmd -> check_name "module" module_names pmd.pmd_name) @@ -1284,9 +1286,6 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = | Pstr_module {pmb_name = name; pmb_expr = smodl; pmb_attributes = attrs; pmb_loc; } - | Pstr_implicit {pmb_name = name; pmb_expr = smodl; pmb_attributes = attrs; - pmb_loc; - } -> check_name "module" module_names name; let modl = @@ -1308,6 +1307,8 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = md_loc = pmb_loc; }, Trec_not)], newenv + | Pstr_implicit _ -> + failwith "TODO" | Pstr_recmodule sbind -> let sbind = List.map @@ -1447,6 +1448,8 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = | Sig_value (_, {val_kind=Val_reg}) | Sig_typext _ | Sig_class _ as it -> incr pos; it + | Sig_implicit (id, imd) -> + failwith "TODO" | Sig_value _ | Sig_type _ | Sig_modtype _ | Sig_class_type _ as it -> it) diff --git a/typing/types.ml b/typing/types.ml index a1d839b54e..b41b481e04 100644 --- a/typing/types.ml +++ b/typing/types.ml @@ -302,10 +302,9 @@ and module_declaration = and implicit_declaration = { - imd_type: module_type; - imd_attributes: Parsetree.attributes; - imd_loc: Location.t; - imd_parameters: (Ident.t * module_type) list; + imd_module: module_declaration; + (* Number of implicit paramaters for functors *) + imd_parameters: int; } and modtype_declaration = diff --git a/typing/types.mli b/typing/types.mli index 2930406c11..e4ed22065c 100644 --- a/typing/types.mli +++ b/typing/types.mli @@ -299,10 +299,9 @@ and modtype_declaration = and implicit_declaration = { - imd_type: module_type; - imd_attributes: Parsetree.attributes; - imd_loc: Location.t; - imd_parameters: (Ident.t * module_type) list; + imd_module: module_declaration; + (* Number of implicit paramaters for functors *) + imd_parameters: int; } and rec_status = From e0b15736f996bffb8fd50ee29f2211aa38e1b1f5 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Thu, 27 Mar 2014 13:52:34 +0000 Subject: [PATCH 318/494] Change representation of implicits in AST --- parsing/ast_helper.ml | 46 ++++++++++++++------------------ parsing/ast_helper.mli | 20 ++++---------- parsing/ast_mapper.ml | 30 ++++++--------------- parsing/ast_mapper.mli | 1 - parsing/parser.mly | 34 ++++++++++++++---------- parsing/parsetree.mli | 26 ++++--------------- parsing/pprintast.ml | 59 +++++++++++++++++++++++------------------- parsing/pprintast.mli | 3 ++- parsing/printast.ml | 25 +++--------------- 9 files changed, 96 insertions(+), 148 deletions(-) diff --git a/parsing/ast_helper.ml b/parsing/ast_helper.ml index 95dcabb3be..73f094ad89 100644 --- a/parsing/ast_helper.ml +++ b/parsing/ast_helper.ml @@ -357,36 +357,28 @@ module Incl = struct end -module Id = struct - let mk ?(loc = !default_loc) ?(attrs = []) name params typ = +module Im = struct + let mk md arity = { - pid_name = name; - pid_type = typ; - pid_attributes = attrs; - pid_loc = loc; - pid_parameters = params; + pim_module = md; + pim_arity = arity; } -end -module Ib = struct - let mk ?(loc = !default_loc) ?(attrs = []) name params expr = - { - pib_name = name; - pib_expr = expr; - pib_attributes = attrs; - pib_loc = loc; - pib_parameters = params; - } -end - -module Ip = struct - let mk ?(loc = !default_loc) ?(attrs = []) name typ = - { - pip_name = name; - pip_mty = typ; - pip_loc = loc; - pip_attributes = attrs; - } + let binding ?loc ?attrs name params me = + let me = List.fold_right + (fun (name,mty) acc -> + Mod.mk ?loc (Pmod_functor(name, Some mty, acc))) + params me + in + mk (Mb.mk ?loc ?attrs name me) (List.length params) + + let declaration ?loc ?attrs name params mty = + let mty = List.fold_right + (fun (name,mty) acc -> + Mty.mk ?loc (Pmty_functor(name, Some mty, acc))) + params mty + in + mk (Md.mk ?loc ?attrs name mty) (List.length params) end module Vb = struct diff --git a/parsing/ast_helper.mli b/parsing/ast_helper.mli index 66c17a85f3..4f9be6c909 100644 --- a/parsing/ast_helper.mli +++ b/parsing/ast_helper.mli @@ -296,22 +296,12 @@ module Incl: sig val mk: ?loc: loc -> ?attrs:attrs -> ?docs:docs -> 'a -> 'a include_infos -(** Implicit declarations *) -module Id: +(** Implicit *) +module Im: sig - val mk: ?loc:loc -> ?attrs:attrs -> str -> implicit_parameter list -> module_type -> implicit_declaration - end - -(** Implicit bindings *) -module Ib: - sig - val mk: ?loc:loc -> ?attrs:attrs -> str -> implicit_parameter list -> module_expr -> implicit_binding - end - -(** Implicit parameters *) -module Ip: - sig - val mk: ?loc:loc -> ?attrs:attrs -> str -> module_type -> implicit_parameter + val mk: 'a -> int -> 'a implicit_infos + val binding: ?loc:loc -> ?attrs:attrs -> str -> (str * module_type) list -> module_expr -> implicit_binding + val declaration: ?loc:loc -> ?attrs:attrs -> str -> (str * module_type) list -> module_type -> implicit_declaration end (** Value bindings *) diff --git a/parsing/ast_mapper.ml b/parsing/ast_mapper.ml index b0a84bdce0..e6a6243b47 100644 --- a/parsing/ast_mapper.ml +++ b/parsing/ast_mapper.ml @@ -56,7 +56,6 @@ type mapper = { -> module_type_declaration; implicit_binding: mapper -> implicit_binding -> implicit_binding; implicit_declaration: mapper -> implicit_declaration -> implicit_declaration; - implicit_parameter: mapper -> implicit_parameter -> implicit_parameter; open_description: mapper -> open_description -> open_description; pat: mapper -> pattern -> pattern; payload: mapper -> payload -> payload; @@ -546,30 +545,17 @@ let default_mapper = ); implicit_declaration = - (fun this {pid_name; pid_type; pid_attributes; pid_loc; pid_parameters} -> - Id.mk - (map_loc this pid_name) - (List.map (this.implicit_parameter this) pid_parameters) - (this.module_type this pid_type) - ~attrs:(this.attributes this pid_attributes) - ~loc:(this.location this pid_loc) + (fun this {pim_module; pim_arity} -> + Im.mk + (this.module_declaration this pim_module) + pim_arity ); implicit_binding = - (fun this {pib_name; pib_expr; pib_attributes; pib_loc; pib_parameters} -> - Ib.mk - (map_loc this pib_name) - (List.map (this.implicit_parameter this) pib_parameters) - (this.module_expr this pib_expr) - ~attrs:(this.attributes this pib_attributes) - ~loc:(this.location this pib_loc) - ); - - implicit_parameter = - (fun this {pip_name; pip_loc; pip_mty; pip_attributes} -> - Ip.mk (map_loc this pip_name) (this.module_type this pip_mty) - ~attrs:(this.attributes this pip_attributes) - ~loc:(this.location this pip_loc) + (fun this {pim_module; pim_arity} -> + Im.mk + (this.module_binding this pim_module) + pim_arity ); diff --git a/parsing/ast_mapper.mli b/parsing/ast_mapper.mli index 27a145d33d..15583e1e58 100644 --- a/parsing/ast_mapper.mli +++ b/parsing/ast_mapper.mli @@ -82,7 +82,6 @@ type mapper = { -> module_type_declaration; implicit_binding: mapper -> implicit_binding -> implicit_binding; implicit_declaration: mapper -> implicit_declaration -> implicit_declaration; - implicit_parameter: mapper -> implicit_parameter -> implicit_parameter; open_description: mapper -> open_description -> open_description; pat: mapper -> pattern -> pattern; payload: mapper -> payload -> payload; diff --git a/parsing/parser.mly b/parsing/parser.mly index d5897dbbae..63e3a998e9 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -817,7 +817,7 @@ and_module_binding: implicit_parameter: | LPAREN functor_arg_name COLON module_type RPAREN - { Ip.mk (mkrhs $2 2) $4 ~loc:(symbol_rloc ()) } + { (mkrhs $2 2, $4) } ; implicit_parameters: implicit_parameters implicit_parameter @@ -827,10 +827,10 @@ implicit_parameters: ; implicit_binding: - MODULE UIDENT implicit_binding_body - { Ib.mk (mkrhs $2 2) [] $3 ~loc:(symbol_rloc ()) } - | FUNCTOR UIDENT implicit_parameters implicit_binding_body - { Ib.mk (mkrhs $2 2) $3 $4 ~loc:(symbol_rloc ()) } + MODULE UIDENT implicit_binding_body post_item_attributes + { Im.binding (mkrhs $2 2) [] $3 ~loc:(symbol_rloc ()) ~attrs:$4 } + | FUNCTOR UIDENT implicit_parameters implicit_binding_body post_item_attributes + { Im.binding (mkrhs $2 2) (List.rev $3) $4 ~loc:(symbol_rloc ()) ~attrs:$5 } ; implicit_binding_body: @@ -840,6 +840,19 @@ implicit_binding_body: { mkmod(Pmod_constraint($4, $2)) } ; +implicit_declaration: + | MODULE UIDENT implicit_declaration_body post_item_attributes + { Im.declaration (mkrhs $2 2) [] $3 ~attrs:$4 ~loc:(symbol_rloc()) } + | FUNCTOR UIDENT implicit_parameters implicit_declaration_body post_item_attributes + { Im.declaration (mkrhs $2 2) (List.rev $3) $4 ~attrs:$5 ~loc:(symbol_rloc()) } +; +implicit_declaration_body: + | COLON module_type + { $2 } + | EQUAL mod_longident + { (Mty.alias ~loc:(rhs_loc 2) (mkrhs $2 2)) } +; + /* Module types */ module_type: @@ -888,15 +901,8 @@ signature_item: { mksig(Psig_module $1) } | module_alias { mksig(Psig_module $1) } - | IMPLICIT MODULE UIDENT module_declaration post_item_attributes - { mksig(Psig_module (Md.mk (mkrhs $3 3) - $4 ~attrs:$5 ~loc:(symbol_rloc()))) } - | IMPLICIT MODULE UIDENT EQUAL mod_longident post_item_attributes - { mksig(Psig_module (Md.mk (mkrhs $3 3) - (Mty.alias ~loc:(rhs_loc 5) (mkrhs $5 5)) - ~attrs:$6 - ~loc:(symbol_rloc()) - )) } + | IMPLICIT implicit_declaration + { mksig(Psig_implicit $2) } | rec_module_declarations { mksig(Psig_recmodule (List.rev $1)) } | module_type_declaration diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index 5b66b22919..ef6212f852 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -828,31 +828,15 @@ and module_binding = } (* X = ME *) -and implicit_declaration = +and 'a implicit_infos = { - pid_name: string loc; - pid_type: module_type; - pid_attributes: attributes; (* ... [@@id1] [@@id2] *) - pid_loc: Location.t; - pid_parameters: implicit_parameter list; + pim_module: 'a; + pim_arity: int; } -and implicit_binding = - { - pib_name: string loc; - pib_expr: module_expr; - pib_attributes : attributes; - pib_loc: Location.t; - pib_parameters: implicit_parameter list; - } +and implicit_binding = module_binding implicit_infos -and implicit_parameter = - { - pip_name: string loc; - pip_mty: module_type; - pip_loc: Location.t; - pip_attributes: attributes; - } +and implicit_declaration = module_declaration implicit_infos (** {2 Toplevel} *) diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index b1ec140764..45c0e4c63a 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -1026,15 +1026,11 @@ class printer ()= object(self:'self) pp f "@[<hov2>module@ type@ %s%a@]%a" ======= self#module_type pmd.pmd_type - | Psig_implicit ({pid_parameters = []; _} as pid) -> - pp f "@[<hov>implicit module@ %s@ :@ %a@]" - pid.pid_name.txt - self#module_type pid.pid_type | Psig_implicit pid -> - pp f "@[<hov>implicit functor@ %s@ %a@ :@ %a@]" - pid.pid_name.txt - (self#list self#implicit_parameter ~sep:"@ ") pid.pid_parameters - self#module_type pid.pid_type + pp f "@[<hov>implicit %s@ %s@ :@ %a@]" + (if pid.pim_arity = 0 then "module" else "functor") + pid.pim_module.pmd_name.txt + (self#implicit_declaration pid.pim_arity) pid.pim_module.pmd_type | Psig_open (ovf, li, _attrs) -> pp f "@[<hov2>open%s@ %a@]" (override ovf) self#longident_loc li | Psig_include (mt, _attrs) -> @@ -1102,9 +1098,31 @@ class printer ()= object(self:'self) method structure f x = self#list ~sep:"@\n" self#structure_item f x - method implicit_parameter f x = - pp f "@[<hov2>(%s@ :@ %a)]" x.pip_name.txt - self#module_type x.pip_mty + method implicit_binding n f me = + match me.pmod_desc with + | Pmod_functor (s, Some mt, me') when n > 0 -> + pp f "(%s@ :@ %a)@;%a" + s.txt + self#module_type mt + (self#implicit_binding (n - 1)) me' + | Pmod_constraint (me, ({pmty_desc = ( Pmty_ident _ + | Pmty_signature _ ); _} as mt)) -> + assert (n = 0); + pp f " :@;%a@;=@;%a@;" self#module_type mt self#module_expr me + | _ -> + assert (n = 0); + pp f " =@;%a@;" self#module_expr me + + method implicit_declaration n f mt = + match mt.pmty_desc with + | Pmty_functor (s, Some mt, mt') when n > 0 -> + pp f "(%s@ :@ %a)@;%a" + s.txt + self#module_type mt + (self#implicit_declaration (n - 1)) mt' + | _ -> + assert (n = 0); + self#module_type f mt method payload f = function | PStr [{pstr_desc = Pstr_eval (e, attrs)}] -> @@ -1177,21 +1195,10 @@ class printer ()= object(self:'self) | Pstr_module x -> pp f "@[<hov2>module@ %a@]" self#module_binding x | Pstr_implicit pib -> - pp f "@[<hov2>implicit %s@ %s@ %a%a@]" - (match pib.pib_parameters with - | [] -> "module" - | _ -> "functor") - pib.pib_name.txt - (self#list self#implicit_parameter ~sep:"@ ") pib.pib_parameters - (fun f me -> - match me.pmod_desc with - | Pmod_constraint - (me, - ({pmty_desc=(Pmty_ident _ | Pmty_signature _);_} as mt)) -> - pp f " :@;%a@;=@;%a@;" self#module_type mt self#module_expr me - | _ -> - pp f " =@ %a" self#module_expr me - ) pib.pib_expr + pp f "@[<hov2>implicit %s@ %s@ %a@]" + (if pib.pim_arity = 0 then "module" else "functor") + pib.pim_module.pmb_name.txt + (self#implicit_binding pib.pim_arity) pib.pim_module.pmb_expr | Pstr_open (ovf, li, _attrs) -> pp f "@[<2>open%s@;%a@]" (override ovf) self#longident_loc li; | Pstr_modtype {pmtd_name=s; pmtd_type=md} -> diff --git a/parsing/pprintast.mli b/parsing/pprintast.mli index f33cbbd9d6..c3f25e93ca 100644 --- a/parsing/pprintast.mli +++ b/parsing/pprintast.mli @@ -50,7 +50,8 @@ class printer : method expression2 : Format.formatter -> Parsetree.expression -> unit method extension_constructor : Format.formatter -> Parsetree.extension_constructor -> unit - method implicit_parameter : Format.formatter -> Parsetree.implicit_parameter -> unit + method implicit_binding : int -> Format.formatter -> Parsetree.module_expr -> unit + method implicit_declaration : int -> Format.formatter -> Parsetree.module_type -> unit method label_exp : Format.formatter -> Parsetree.arrow_flag * Parsetree.expression option * Parsetree.pattern -> diff --git a/parsing/printast.ml b/parsing/printast.ml index 1ea4911ab6..8e96ac9625 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -673,9 +673,8 @@ and signature_item i ppf x = line i ppf "Psig_recmodule\n"; list i module_declaration ppf decls; | Psig_implicit pid -> - line i ppf "Psig_implicit %a\n" fmt_string_loc pid.pid_name; - attributes i ppf pid.pid_attributes; - module_type i ppf pid.pid_type + line i ppf "Psig_implicit %d\n" pid.pim_arity; + module_declaration i ppf pid.pim_module | Psig_modtype x -> line i ppf "Psig_modtype %a\n" fmt_string_loc x.pmtd_name; attributes i ppf x.pmtd_attributes; @@ -784,7 +783,8 @@ and structure_item i ppf x = line i ppf "Pstr_recmodule\n"; list i module_binding ppf bindings; | Pstr_implicit pib -> - line i ppf "Pstr_implicit\n" + line i ppf "Pstr_implicit %d\n" pib.pim_arity; + module_binding i ppf pib.pim_module | Pstr_modtype x -> line i ppf "Pstr_modtype %a\n" fmt_string_loc x.pmtd_name; attributes i ppf x.pmtd_attributes; @@ -822,23 +822,6 @@ and module_binding i ppf x = attributes i ppf x.pmb_attributes; module_expr (i+1) ppf x.pmb_expr -and implicit_declaration i ppf pid = - string_loc i ppf pid.pid_name; - attributes i ppf pid.pid_attributes; - list i implicit_parameter ppf pid.pid_parameters; - module_type (i+1) ppf pid.pid_type; - -and implicit_binding i ppf pib = - string_loc i ppf pib.pib_name; - attributes i ppf pib.pib_attributes; - list i implicit_parameter ppf pib.pib_parameters; - module_expr (i+1) ppf pib.pib_expr - -and implicit_parameter i ppf pip = - string_loc i ppf pip.pip_name; - attributes i ppf pip.pip_attributes; - module_type (i+1) ppf pip.pip_mty; - and core_type_x_core_type_x_location i ppf (ct1, ct2, l) = line i ppf "<constraint> %a\n" fmt_location l; core_type (i+1) ppf ct1; From fa4f3b862d974e4a05b4805725fd73caf531df69 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Thu, 27 Mar 2014 14:15:18 +0000 Subject: [PATCH 319/494] Introduce implicits in Typedtree --- bytecomp/translmod.ml | 71 ++++++++++++++++++++++------------------- typing/printtyped.ml | 6 ++++ typing/typecore.ml | 1 + typing/typedtree.ml | 12 +++++++ typing/typedtree.mli | 12 +++++++ typing/typedtreeIter.ml | 3 ++ typing/typedtreeMap.ml | 6 ++++ typing/typemod.ml | 22 +++++++++++-- 8 files changed, 99 insertions(+), 34 deletions(-) diff --git a/bytecomp/translmod.ml b/bytecomp/translmod.ml index c37195467f..5cff966619 100644 --- a/bytecomp/translmod.ml +++ b/bytecomp/translmod.ml @@ -419,7 +419,7 @@ and transl_structure fields cc rootpath = function let path = field_path rootpath id in Llet(Strict, id, transl_extension_constructor item.str_env path ext, transl_structure (id :: fields) cc rootpath rem) - | Tstr_module mb -> + | Tstr_module mb | Tstr_implicit {im_module = mb; _} -> let id = mb.mb_id in Llet(pure_module mb.mb_expr, id, transl_module Tcoerce_none (field_path rootpath id) mb.mb_expr, @@ -498,7 +498,8 @@ let rec defined_idents = function List.map (fun ext -> ext.ext_id) tyext.tyext_constructors @ defined_idents rem | Tstr_exception ext -> ext.ext_id :: defined_idents rem - | Tstr_module mb -> mb.mb_id :: defined_idents rem + | Tstr_module mb | Tstr_implicit {im_module = mb; _} -> + mb.mb_id :: defined_idents rem | Tstr_recmodule decls -> List.map (fun mb -> mb.mb_id) decls @ defined_idents rem | Tstr_modtype _ -> defined_idents rem @@ -531,6 +532,7 @@ let rec more_idents = function | Tstr_module {mb_expr={mod_desc = Tmod_structure str}} -> all_idents str.str_items @ more_idents rem | Tstr_module _ -> more_idents rem + | Tstr_implicit _ -> more_idents rem | Tstr_attribute _ -> more_idents rem and all_idents = function @@ -553,11 +555,12 @@ and all_idents = function | Tstr_class cl_list -> List.map (fun (ci, _, _) -> ci.ci_id_class) cl_list @ all_idents rem | Tstr_class_type cl_list -> all_idents rem - | Tstr_include incl -> - bound_value_identifiers incl.incl_type @ all_idents rem - | Tstr_module {mb_id;mb_expr={mod_desc = Tmod_structure str}} -> - mb_id :: all_idents str.str_items @ all_idents rem - | Tstr_module mb -> mb.mb_id :: all_idents rem + | Tstr_module mb | Tstr_implicit {im_module = mb; _} -> + begin match mb with + | {mb_id;mb_expr={mod_desc = Tmod_structure str}} -> + mb_id :: all_idents str.str_items @ all_idents rem + | mb -> mb.mb_id :: all_idents rem + end | Tstr_attribute _ -> all_idents rem @@ -614,30 +617,33 @@ let transl_store_structure glob map prims str = let lam = transl_extension_constructor item.str_env path ext in Lsequence(Llet(Strict, id, subst_lambda subst lam, store_ident id), transl_store rootpath (add_ident false id subst) rem) - | Tstr_module{mb_id=id; mb_expr={mod_desc = Tmod_structure str}} -> - let lam = transl_store (field_path rootpath id) subst str.str_items in - (* Careful: see next case *) - let subst = !transl_store_subst in - Lsequence(lam, - Llet(Strict, id, - subst_lambda subst - (Lprim(Pmakeblock(0, Immutable), - List.map (fun id -> Lvar id) - (defined_idents str.str_items))), - Lsequence(store_ident id, - transl_store rootpath (add_ident true id subst) - rem))) - | Tstr_module{mb_id=id; mb_expr=modl} -> - let lam = transl_module Tcoerce_none (field_path rootpath id) modl in - (* Careful: the module value stored in the global may be different - from the local module value, in case a coercion is applied. - If so, keep using the local module value (id) in the remainder of - the compilation unit (add_ident true returns subst unchanged). - If not, we can use the value from the global - (add_ident true adds id -> Pgetglobal... to subst). *) - Llet(Strict, id, subst_lambda subst lam, - Lsequence(store_ident id, - transl_store rootpath (add_ident true id subst) rem)) + | Tstr_module mb | Tstr_implicit {im_module = mb; _} -> + begin match mb with + | {mb_id=id; mb_expr={mod_desc = Tmod_structure str}} -> + let lam = transl_store (field_path rootpath id) subst str.str_items in + (* Careful: see next case *) + let subst = !transl_store_subst in + Lsequence(lam, + Llet(Strict, id, + subst_lambda subst + (Lprim(Pmakeblock(0, Immutable), + List.map (fun id -> Lvar id) + (defined_idents str.str_items))), + Lsequence(store_ident id, + transl_store rootpath (add_ident true id subst) + rem))) + | {mb_id=id; mb_expr=modl} -> + let lam = transl_module Tcoerce_none (field_path rootpath id) modl in + (* Careful: the module value stored in the global may be different + from the local module value, in case a coercion is applied. + If so, keep using the local module value (id) in the remainder of + the compilation unit (add_ident true returns subst unchanged). + If not, we can use the value from the global + (add_ident true adds id -> Pgetglobal... to subst). *) + Llet(Strict, id, subst_lambda subst lam, + Lsequence(store_ident id, + transl_store rootpath (add_ident true id subst) rem)) + end | Tstr_recmodule bindings -> let ids = List.map (fun mb -> mb.mb_id) bindings in compile_recmodule @@ -830,7 +836,8 @@ let transl_toplevel_item item = | Tstr_exception ext -> toploop_setvalue ext.ext_id (transl_extension_constructor item.str_env None ext) - | Tstr_module {mb_id=id; mb_expr=modl} -> + | Tstr_module {mb_id=id; mb_expr=modl} + | Tstr_implicit {im_module = {mb_id=id; mb_expr=modl}; _} -> (* we need to use the unique name for the module because of issues with "open" (PR#1672) *) set_toplevel_unique_name id; diff --git a/typing/printtyped.ml b/typing/printtyped.ml index 8bb4dad2a1..8e409a16bb 100644 --- a/typing/printtyped.ml +++ b/typing/printtyped.ml @@ -636,6 +636,9 @@ and signature_item i ppf x = line i ppf "Psig_module \"%a\"\n" fmt_ident md.md_id; attributes i ppf md.md_attributes; module_type i ppf md.md_type + | Tsig_implicit imd -> + line i ppf "Psig_implicit %d\n" imd.im_arity; + module_declaration i ppf imd.im_module | Tsig_recmodule decls -> line i ppf "Psig_recmodule\n"; list i module_declaration ppf decls; @@ -741,6 +744,9 @@ and structure_item i ppf x = | Tstr_module x -> line i ppf "Pstr_module\n"; module_binding i ppf x + | Tstr_implicit imb -> + line i ppf "Pstr_implicit %d\n" imb.im_arity; + module_binding i ppf imb.im_module | Tstr_recmodule bindings -> line i ppf "Pstr_recmodule\n"; list i module_binding ppf bindings diff --git a/typing/typecore.ml b/typing/typecore.ml index 9103bd8484..2684ae3503 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1461,6 +1461,7 @@ and is_nonexpansive_mod mexp = | Tstr_value (_, pat_exp_list) -> List.for_all (fun vb -> is_nonexpansive vb.vb_expr) pat_exp_list | Tstr_module {mb_expr=m;_} + | Tstr_implicit {im_module = {mb_expr = m; _}; _} | Tstr_include {incl_mod=m;_} -> is_nonexpansive_mod m | Tstr_recmodule id_mod_list -> List.for_all (fun {mb_expr=m;_} -> is_nonexpansive_mod m) diff --git a/typing/typedtree.ml b/typing/typedtree.ml index d316ca0821..a9921909d4 100644 --- a/typing/typedtree.ml +++ b/typing/typedtree.ml @@ -212,6 +212,7 @@ and structure_item_desc = | Tstr_typext of type_extension | Tstr_exception of extension_constructor | Tstr_module of module_binding + | Tstr_implicit of implicit_binding | Tstr_recmodule of module_binding list | Tstr_modtype of module_type_declaration | Tstr_open of open_description @@ -229,6 +230,16 @@ and module_binding = mb_loc: Location.t; } +and 'a implicit_infos = + { + im_arity: int; + im_module: 'a; + } + +and implicit_binding = module_binding implicit_infos + +and implicit_declaration = module_declaration implicit_infos + and value_binding = { vb_pat: pattern; @@ -278,6 +289,7 @@ and signature_item_desc = | Tsig_typext of type_extension | Tsig_exception of extension_constructor | Tsig_module of module_declaration + | Tsig_implicit of implicit_declaration | Tsig_recmodule of module_declaration list | Tsig_modtype of module_type_declaration | Tsig_open of open_description diff --git a/typing/typedtree.mli b/typing/typedtree.mli index 252d2566e0..ac6ec6ee63 100644 --- a/typing/typedtree.mli +++ b/typing/typedtree.mli @@ -211,6 +211,7 @@ and structure_item_desc = | Tstr_typext of type_extension | Tstr_exception of extension_constructor | Tstr_module of module_binding + | Tstr_implicit of implicit_binding | Tstr_recmodule of module_binding list | Tstr_modtype of module_type_declaration | Tstr_open of open_description @@ -228,6 +229,16 @@ and module_binding = mb_loc: Location.t; } +and 'a implicit_infos = + { + im_arity: int; + im_module: 'a; + } + +and implicit_binding = module_binding implicit_infos + +and implicit_declaration = module_declaration implicit_infos + and value_binding = { vb_pat: pattern; @@ -277,6 +288,7 @@ and signature_item_desc = | Tsig_typext of type_extension | Tsig_exception of extension_constructor | Tsig_module of module_declaration + | Tsig_implicit of implicit_declaration | Tsig_recmodule of module_declaration list | Tsig_modtype of module_type_declaration | Tsig_open of open_description diff --git a/typing/typedtreeIter.ml b/typing/typedtreeIter.ml index 1be6f0e472..50d8605484 100644 --- a/typing/typedtreeIter.ml +++ b/typing/typedtreeIter.ml @@ -140,6 +140,7 @@ module MakeIterator(Iter : IteratorArgument) : sig | Tstr_typext tyext -> iter_type_extension tyext | Tstr_exception ext -> iter_extension_constructor ext | Tstr_module x -> iter_module_binding x + | Tstr_implicit x -> iter_module_binding x.im_module | Tstr_recmodule list -> List.iter iter_module_binding list | Tstr_modtype mtd -> iter_module_type_declaration mtd | Tstr_open _ -> () @@ -378,6 +379,8 @@ module MakeIterator(Iter : IteratorArgument) : sig iter_type_extension tyext | Tsig_module md -> iter_module_type md.md_type + | Tsig_implicit imd -> + iter_module_type imd.im_module.md_type | Tsig_recmodule list -> List.iter (fun md -> iter_module_type md.md_type) list | Tsig_modtype mtd -> diff --git a/typing/typedtreeMap.ml b/typing/typedtreeMap.ml index 99cbf18fd8..8f63dca5c1 100644 --- a/typing/typedtreeMap.ml +++ b/typing/typedtreeMap.ml @@ -125,6 +125,8 @@ module MakeMap(Map : MapArgument) = struct Tstr_exception (map_extension_constructor ext) | Tstr_module x -> Tstr_module (map_module_binding x) + | Tstr_implicit x -> + Tstr_implicit {x with im_module = map_module_binding x.im_module} | Tstr_recmodule list -> let list = List.map map_module_binding list in Tstr_recmodule list @@ -411,6 +413,10 @@ module MakeMap(Map : MapArgument) = struct Tsig_exception (map_extension_constructor ext) | Tsig_module md -> Tsig_module {md with md_type = map_module_type md.md_type} + | Tsig_implicit im -> + let md = im.im_module in + let md = {md with md_type = map_module_type md.md_type} in + Tsig_implicit {im with im_module = md} | Tsig_recmodule list -> Tsig_recmodule (List.map diff --git a/typing/typemod.ml b/typing/typemod.ml index 0249ea849a..e682141703 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -636,8 +636,26 @@ and transl_signature env sg = env loc :: trem, Sig_module(id, md, Trec_not) :: rem, final_env - | Psig_implicit _ -> - failwith "TODO" + + | Psig_implicit {pim_module = pmd; pim_arity = _} -> + check "module" item.psig_loc module_names pmd.pmd_name.txt; + let tmty = transl_modtype env pmd.pmd_type in + let md = { + md_type=tmty.mty_type; + md_attributes=pmd.pmd_attributes; + md_loc=pmd.pmd_loc; + } + in + let (id, newenv) = + Env.enter_module_declaration pmd.pmd_name.txt md env in + let (trem, rem, final_env) = transl_sig newenv srem in + mksig (Tsig_module {md_id=id; md_name=pmd.pmd_name; md_type=tmty; + md_loc=pmd.pmd_loc; + md_attributes=pmd.pmd_attributes}) + env loc :: trem, + Sig_module(id, md, Trec_not) :: rem, + final_env + | Psig_recmodule sdecls -> List.iter (fun pmd -> check_name "module" module_names pmd.pmd_name) From 75499fdea85784f27432febb77ec5fa65bd1cab9 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Thu, 27 Mar 2014 15:50:42 +0000 Subject: [PATCH 320/494] WIP: toplevel is working --- toplevel/toploop.ml | 3 ++ typing/env.ml | 6 ++++ typing/env.mli | 1 + typing/includemod.ml | 16 ++++++--- typing/mtype.ml | 28 +++++++++++++-- typing/printtyp.ml | 6 +++- typing/printtyp.mli | 1 + typing/subst.ml | 2 +- typing/typecore.ml | 2 +- typing/typemod.ml | 81 +++++++++++++++++++++++++++++++++++++++----- typing/types.ml | 2 +- typing/types.mli | 2 +- 12 files changed, 129 insertions(+), 21 deletions(-) diff --git a/toplevel/toploop.ml b/toplevel/toploop.ml index a3cb06b043..3ec9d4dab7 100644 --- a/toplevel/toploop.ml +++ b/toplevel/toploop.ml @@ -206,6 +206,9 @@ let rec pr_item env items = | Sig_module(id, md, rs) :: rem -> let tree = Printtyp.tree_of_module id md.md_type rs in Some (tree, None, rem) + | Sig_implicit(id, imd) :: rem -> + let tree = Printtyp.tree_of_implicit id imd in + Some (tree, None, rem) | Sig_modtype(id, decl) :: rem -> let tree = Printtyp.tree_of_modtype_declaration id decl in Some (tree, None, rem) diff --git a/typing/env.ml b/typing/env.ml index c759b395b2..49e913b34f 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -290,6 +290,9 @@ let strengthen = let md md_type = {md_type; md_attributes=[]; md_loc=Location.none} +let imd imd_arity md_type = + {imd_module = md md_type; imd_arity = imd_arity} + (* The name of the compilation unit currently compiled. "" if outside a compilation unit. *) @@ -1554,6 +1557,9 @@ and add_cltype id ty env = let add_module ?arg id mty env = add_module_declaration ?arg id (md mty) env +let add_implicit id ~arity mty env = + add_implicit_declaration id (imd arity mty) env + let add_local_constraint id info elv env = match info with {type_manifest = Some ty; type_newtype_level = Some (lv, _)} -> diff --git a/typing/env.mli b/typing/env.mli index 86dc73ca6e..3a9eadec1d 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -108,6 +108,7 @@ val add_type: check:bool -> Ident.t -> type_declaration -> t -> t val add_extension: check:bool -> Ident.t -> extension_constructor -> t -> t val add_module: ?arg:bool -> Ident.t -> module_type -> t -> t val add_module_declaration: ?arg:bool -> Ident.t -> module_declaration -> t -> t +val add_implicit: Ident.t -> arity:int -> module_type -> t -> t val add_implicit_declaration: Ident.t -> implicit_declaration -> t -> t val add_modtype: Ident.t -> modtype_declaration -> t -> t val add_class: Ident.t -> class_declaration -> t -> t diff --git a/typing/includemod.ml b/typing/includemod.ml index b9124b2d33..7f5357aa83 100644 --- a/typing/includemod.ml +++ b/typing/includemod.ml @@ -288,9 +288,10 @@ and signatures env cxt subst sig1 sig2 = let (id_pos_list,_) = List.fold_left (fun (l,pos) -> function - Sig_module (id, _, _) -> - ((id,pos,Tcoerce_none)::l , pos+1) - | item -> (l, if is_runtime_component item then pos+1 else pos)) + Sig_module (id, _, _) + | Sig_implicit (id, _) -> + ((id,pos,Tcoerce_none)::l , pos+1) + | item -> (l, if is_runtime_component item then pos+1 else pos)) ([], 0) sig1 in (* Build a table of the components of sig1, along with their positions. The table is indexed by kind and name of component *) @@ -391,7 +392,12 @@ and signature_components old_env env cxt subst paired = let cc = modtypes env (Module id1::cxt) subst (Mtype.strengthen env mty1.md_type (Pident id1)) mty2.md_type in - (pos, cc) :: comps_rec rem + (pos, cc) :: signature_components env cxt subst rem + | (Sig_implicit(id1, im1), Sig_implicit(id2, im2), pos) :: rem -> + let cc = + modtypes env (Module id1::cxt) subst + (Mtype.strengthen env im1.imd_module.md_type (Pident id1)) im2.imd_module.md_type in + (pos, cc) :: signature_components env cxt subst rem | (Sig_modtype(id1, info1), Sig_modtype(id2, info2), pos) :: rem -> modtype_infos env cxt subst id1 info1 info2; comps_rec rem @@ -401,7 +407,7 @@ and signature_components old_env env cxt subst paired = | (Sig_class_type(id1, info1, _), Sig_class_type(id2, info2, _), pos) :: rem -> class_type_declarations ~old_env env cxt subst id1 info1 info2; - comps_rec rem + signature_components env cxt subst rem | _ -> assert false diff --git a/typing/mtype.ml b/typing/mtype.ml index e2baa274fd..155c133109 100644 --- a/typing/mtype.ml +++ b/typing/mtype.ml @@ -196,6 +196,11 @@ and enrich_item env p = function md_type = enrich_modtype env (Pdot(p, Ident.name id, nopos)) md.md_type}, rs) + | Sig_implicit(id, im) -> + let md = im.imd_module in + let md = {md with md_type = enrich_modtype env + (Pdot(p, Ident.name id, nopos)) md.md_type} in + Sig_implicit(id, {im with imd_module = md}) | item -> item let rec type_paths env p mty = @@ -346,11 +351,15 @@ let collect_arg_paths mty = and it_signature_item it si = type_iterators.it_signature_item it si; match si with - Sig_module (id, {md_type=Mty_alias p}, _) -> + Sig_module (id, {md_type=Mty_alias p}, _) + | Sig_implicit (id, {imd_module = {md_type=Mty_alias p}}) -> bindings := Ident.add id p !bindings - | Sig_module (id, {md_type=Mty_signature sg}, _) -> + | Sig_module (id, {md_type=Mty_signature sg}, _) + | Sig_implicit (id, {imd_module = {md_type=Mty_signature sg}}) -> List.iter - (function Sig_module (id', _, _) -> + (function + | Sig_module (id', _, _) + | Sig_implicit (id', _) -> subst := PathMap.add (Pdot (Pident id, Ident.name id', -1)) id' !subst | _ -> ()) @@ -387,6 +396,19 @@ and remove_aliases_sig env excl sg = in Sig_module(id, {md with md_type = mty} , rs) :: remove_aliases_sig (Env.add_module id mty env) excl rem + | Sig_implicit (id, imd) :: rem -> + let md = imd.imd_module in + let mty = + match md.md_type with + Mty_alias _ when IdentSet.mem id excl -> + md.md_type + | mty -> + remove_aliases env excl mty + in + Sig_implicit(id, {imd with imd_module = {md with md_type = mty}}) :: + remove_aliases_sig + (Env.add_implicit id ~arity:imd.imd_arity mty env) excl + rem | Sig_modtype(id, mtd) :: rem -> Sig_modtype(id, mtd) :: remove_aliases_sig (Env.add_modtype id mtd env) excl rem diff --git a/typing/printtyp.ml b/typing/printtyp.ml index f39666b2ec..40e60d55f3 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -1225,7 +1225,7 @@ and tree_of_signature_rec env' in_type_group = function [Osig_module (Ident.name id, tree_of_modtype md.md_type, tree_of_rec rs)] | Sig_implicit(id, imd) -> - [Osig_implicit (Ident.name id, imd.imd_parameters, + [Osig_implicit (Ident.name id, imd.imd_arity, tree_of_modtype imd.imd_module.md_type)] | Sig_modtype(id, decl) -> [tree_of_modtype_declaration id decl] @@ -1248,6 +1248,10 @@ and tree_of_modtype_declaration id decl = let tree_of_module id mty rs = Osig_module (Ident.name id, tree_of_modtype mty, tree_of_rec rs) +let tree_of_implicit id imd = + Osig_implicit (Ident.name id, imd.imd_arity, + tree_of_modtype imd.imd_module.md_type) + let modtype ppf mty = !Oprint.out_module_type ppf (tree_of_modtype mty) let modtype_declaration id ppf decl = !Oprint.out_sig_item ppf (tree_of_modtype_declaration id decl) diff --git a/typing/printtyp.mli b/typing/printtyp.mli index b58b854cca..7f40e648cf 100644 --- a/typing/printtyp.mli +++ b/typing/printtyp.mli @@ -50,6 +50,7 @@ val tree_of_extension_constructor: val extension_constructor: Ident.t -> formatter -> extension_constructor -> unit val tree_of_module: Ident.t -> module_type -> rec_status -> out_sig_item +val tree_of_implicit: Ident.t -> implicit_declaration -> out_sig_item val modtype: formatter -> module_type -> unit val signature: formatter -> signature -> unit val tree_of_modtype_declaration: diff --git a/typing/subst.ml b/typing/subst.ml index da02a6b895..5f6bdc0c34 100644 --- a/typing/subst.ml +++ b/typing/subst.ml @@ -403,7 +403,7 @@ and module_declaration s decl = and implicit_declaration s decl = { imd_module = module_declaration s decl.imd_module; - imd_parameters = decl.imd_parameters; + imd_arity = decl.imd_arity; } and modtype_declaration s decl = diff --git a/typing/typecore.ml b/typing/typecore.ml index 2684ae3503..f94bb27903 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -188,8 +188,8 @@ let iter_expression f e = | Pstr_attribute _ | Pstr_extension _ -> () | Pstr_include {pincl_mod = me} + | Pstr_implicit {pim_module = {pmb_expr = me}} | Pstr_module {pmb_expr = me} -> module_expr me - | Pstr_implicit _ -> failwith "TODO" | Pstr_recmodule l -> List.iter (fun x -> module_expr x.pmb_expr) l | Pstr_class cdl -> List.iter (fun c -> class_expr c.pci_expr) cdl diff --git a/typing/typemod.ml b/typing/typemod.ml index e682141703..79c426340f 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -375,6 +375,14 @@ and approx_sig env ssg = Env.enter_module_declaration pmd.pmd_name.txt md env in Sig_module(id, md, Trec_not) :: approx_sig newenv srem + | Psig_implicit pim -> + let pmd = pim.pim_module in + let md = approx_module_declaration env pmd in + let (id, newenv) = + Env.enter_module_declaration pmd.pmd_name.txt md env + in + Sig_implicit(id, {imd_module = md; imd_arity = pim.pim_arity}) :: + approx_sig newenv srem | Psig_recmodule sdecls -> let decls = List.map @@ -457,6 +465,8 @@ let check_sig_item type_names module_names modtype_names loc = function check "type" loc type_names (Ident.name id) | Sig_module(id, _, _) -> check "module" loc module_names (Ident.name id) + | Sig_implicit(id, _) -> + check "module" loc module_names (Ident.name id) | Sig_modtype(id, _) -> check "module type" loc modtype_names (Ident.name id) | _ -> () @@ -637,7 +647,7 @@ and transl_signature env sg = Sig_module(id, md, Trec_not) :: rem, final_env - | Psig_implicit {pim_module = pmd; pim_arity = _} -> + | Psig_implicit {pim_module = pmd; pim_arity = arity} -> check "module" item.psig_loc module_names pmd.pmd_name.txt; let tmty = transl_modtype env pmd.pmd_type in let md = { @@ -649,11 +659,16 @@ and transl_signature env sg = let (id, newenv) = Env.enter_module_declaration pmd.pmd_name.txt md env in let (trem, rem, final_env) = transl_sig newenv srem in - mksig (Tsig_module {md_id=id; md_name=pmd.pmd_name; md_type=tmty; - md_loc=pmd.pmd_loc; - md_attributes=pmd.pmd_attributes}) + (* failwith "TODO" check arity ?! *) + mksig (Tsig_implicit + { im_arity = arity; + im_module = {md_id=id; md_name=pmd.pmd_name; md_type=tmty; + md_loc=pmd.pmd_loc; + md_attributes=pmd.pmd_attributes} + }) env loc :: trem, - Sig_module(id, md, Trec_not) :: rem, + Sig_implicit (id, { imd_arity = arity; + imd_module = md }) :: rem, final_env | Psig_recmodule sdecls -> @@ -904,6 +919,7 @@ let rec closed_modtype = function and closed_signature_item = function Sig_value(id, desc) -> Ctype.closed_schema desc.val_type | Sig_module(id, md, _) -> closed_modtype md.md_type + | Sig_implicit (id, {imd_module = md; _}) -> closed_modtype md.md_type | _ -> true let check_nongen_scheme env str = @@ -1056,6 +1072,19 @@ let rec package_constraints env loc mty constrs = } in Sig_module (id, md, rs) + | Sig_implicit (id, imd) -> + let rec aux = function + | (m :: ((_ :: _) as l), t) :: rest when m = Ident.name id -> + (l, t) :: aux rest + | _ :: rest -> aux rest + | [] -> [] + in + let md = imd.imd_module in + let md = + {md with md_type = + package_constraints env loc md.md_type (aux constrs) } + in + Sig_implicit (id, {imd with imd_module = md}) | item -> item ) sg @@ -1325,8 +1354,36 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = md_loc = pmb_loc; }, Trec_not)], newenv - | Pstr_implicit _ -> - failwith "TODO" + | Pstr_implicit {pim_module = pmb; pim_arity = arity} -> + let {pmb_name = name; pmb_expr = smodl; + pmb_attributes = attrs; pmb_loc } = pmb in + check "module" loc module_names name.txt; + let modl = + type_module ~alias:true true funct_body + (anchor_submodule name.txt anchor) env smodl in + let md = + { md_type = enrich_module_type anchor name.txt modl.mod_type env; + md_attributes = attrs; + md_loc = pmb_loc; + } + in + let (id, newenv) = Env.enter_module_declaration name.txt md env in + (* failwith "TODO" check arity ?! *) + Tstr_implicit + { im_arity = arity; + im_module = {mb_id=id; mb_name=name; mb_expr=modl; + mb_attributes=attrs; mb_loc=pmb_loc; + } + }, + [Sig_implicit(id, + { imd_arity = arity; + imd_module = + {md_type = modl.mod_type; + md_attributes = attrs; + md_loc = pmb_loc; + } + })], + newenv | Pstr_recmodule sbind -> let sbind = List.map @@ -1467,7 +1524,14 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = | Sig_typext _ | Sig_class _ as it -> incr pos; it | Sig_implicit (id, imd) -> - failwith "TODO" + let n = !pos in incr pos; + let md = imd.imd_module in + let md = {md with md_type = + Mty_alias (Pdot(p,Ident.name id,n))} in + Sig_implicit (id, {imd with imd_module = md}) + | Sig_value (_, {val_kind=Val_reg}) | Sig_exception _ + | Sig_class _ as it -> + incr pos; it | Sig_value _ | Sig_type _ | Sig_modtype _ | Sig_class_type _ as it -> it) @@ -1536,6 +1600,7 @@ and normalize_signature env = List.iter (normalize_signature_item env) and normalize_signature_item env = function Sig_value(id, desc) -> Ctype.normalize_type env desc.val_type | Sig_module(id, md, _) -> normalize_modtype env md.md_type + | Sig_implicit(id, imd) -> normalize_modtype env imd.imd_module.md_type | _ -> () (* Extract the module type of a module expression *) diff --git a/typing/types.ml b/typing/types.ml index b41b481e04..5f0f6c3957 100644 --- a/typing/types.ml +++ b/typing/types.ml @@ -304,7 +304,7 @@ and implicit_declaration = { imd_module: module_declaration; (* Number of implicit paramaters for functors *) - imd_parameters: int; + imd_arity: int; } and modtype_declaration = diff --git a/typing/types.mli b/typing/types.mli index e4ed22065c..3e19569dd7 100644 --- a/typing/types.mli +++ b/typing/types.mli @@ -301,7 +301,7 @@ and implicit_declaration = { imd_module: module_declaration; (* Number of implicit paramaters for functors *) - imd_parameters: int; + imd_arity: int; } and rec_status = From dc4a55f1f4c9d0e702fa1607f72613c23a859526 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 28 Mar 2014 15:19:07 +0000 Subject: [PATCH 321/494] Fix tools, leave FIXMEs in ocamldoc --- ocamldoc/odoc_ast.ml | 8 ++++++-- ocamldoc/odoc_env.ml | 1 + ocamldoc/odoc_sig.ml | 9 ++++++--- tools/depend.ml | 10 ++++++---- tools/tast_iter.ml | 3 +++ tools/untypeast.ml | 12 ++++++++++++ 6 files changed, 34 insertions(+), 9 deletions(-) diff --git a/ocamldoc/odoc_ast.ml b/ocamldoc/odoc_ast.ml index b7cad7c451..368d22eecb 100644 --- a/ocamldoc/odoc_ast.ml +++ b/ocamldoc/odoc_ast.ml @@ -116,6 +116,8 @@ module Typedtree_search = | Typedtree.Tstr_include _ -> () | Typedtree.Tstr_eval _ -> () | Typedtree.Tstr_attribute _ -> () + | Typedtree.Tstr_implicit _ -> + failwith "TODO" let tables typedtree = let t = Hashtbl.create 13 in @@ -1420,8 +1422,7 @@ module Analyser = in (0, new_env, [ Element_exception new_ext ]) - | Parsetree.Pstr_module {Parsetree.pmb_name=name; pmb_expr=module_expr} - | Parsetree.Pstr_implicit {Parsetree.pmb_name=name; pmb_expr=module_expr} -> + | Parsetree.Pstr_module {Parsetree.pmb_name=name; pmb_expr=module_expr} -> ( (* of string * module_expr *) try @@ -1463,6 +1464,9 @@ module Analyser = raise (Failure (Odoc_messages.module_not_found_in_typedtree complete_name)) ) + | Parsetree.Pstr_implicit _ -> + failwith "TODO" + | Parsetree.Pstr_recmodule mods -> (* A VOIR ICI pb: pas de lien avec les module type dans les contraintes sur les modules *) diff --git a/ocamldoc/odoc_env.ml b/ocamldoc/odoc_env.ml index 3e05905856..69033574b1 100644 --- a/ocamldoc/odoc_env.ml +++ b/ocamldoc/odoc_env.ml @@ -60,6 +60,7 @@ let rec add_signature env root ?rel signat = | _ -> env in { env2 with env_modules = (rel_name ident, qualify ident) :: env2.env_modules } + | Types.Sig_implicit _ -> failwith "TODO" | Types.Sig_modtype (ident, modtype_decl) -> let env2 = match modtype_decl.Types.mtd_type with diff --git a/ocamldoc/odoc_sig.ml b/ocamldoc/odoc_sig.ml index 9a95a04307..3df172e5c9 100644 --- a/ocamldoc/odoc_sig.ml +++ b/ocamldoc/odoc_sig.ml @@ -58,6 +58,8 @@ module Signature_search = Hashtbl.add table (CT (Name.from_ident ident)) signat | Types.Sig_module (ident, _, _) -> Hashtbl.add table (M (Name.from_ident ident)) signat + | Types.Sig_implicit _ -> + failwith "TODO" | Types.Sig_modtype (ident,_) -> Hashtbl.add table (MT (Name.from_ident ident)) signat @@ -334,9 +336,9 @@ module Analyser = | [] -> acc | types -> take_item (Parsetree.Psig_type types)) | Parsetree.Psig_module {Parsetree.pmd_name=name} - | Parsetree.Psig_implicit {Parsetree.pmd_name=name} | Parsetree.Psig_modtype {Parsetree.pmtd_name=name} as m -> if Name.Set.mem name.txt erased then acc else take_item m + | Parsetree.Psig_implicit _ -> failwith "TODO" | Parsetree.Psig_recmodule mods -> (match List.filter (fun pmd -> not (Name.Set.mem pmd.Parsetree.pmd_name.txt erased)) mods with | [] -> acc @@ -844,8 +846,7 @@ module Analyser = in (0, env, ele_comments) - | Parsetree.Psig_module {Parsetree.pmd_name=name; pmd_type=module_type} - | Parsetree.Psig_implicit {Parsetree.pmd_name=name; pmd_type=module_type} -> + | Parsetree.Psig_module {Parsetree.pmd_name=name; pmd_type=module_type} -> let complete_name = Name.concat current_module_name name.txt in (* get the the module type in the signature by the module name *) let sig_module_type = @@ -892,6 +893,8 @@ module Analyser = in (maybe_more, new_env2, [ Element_module new_module ]) + | Parsetree.Psig_implicit _ -> + failwith "TODO" | Parsetree.Psig_recmodule decls -> (* we start by extending the environment *) let new_env = diff --git a/tools/depend.ml b/tools/depend.ml index 910648d2ea..b3729ca3b0 100644 --- a/tools/depend.ml +++ b/tools/depend.ml @@ -258,8 +258,9 @@ and add_sig_item bv item = in List.iter (fun pmd -> add_modtype bv' pmd.pmd_type) decls; bv' - | Psig_implicit pmd -> - add_modtype bv pmd.pid_type; StringSet.add pmd.pid_name.txt bv + | Psig_implicit pim -> + let pmd = pim.pim_module in + add_modtype bv pmd.pmd_type; StringSet.add pmd.pmd_name.txt bv | Psig_modtype x -> begin match x.pmtd_type with None -> () @@ -313,8 +314,9 @@ and add_struct_item bv item = add_extension_constructor bv pext; bv | Pstr_module x -> add_module bv x.pmb_expr; StringSet.add x.pmb_name.txt bv - | Pstr_implicit x -> - add_module bv x.pib_expr; StringSet.add x.pib_name.txt bv + | Pstr_implicit pim -> + let x = pim.pim_module in + add_module bv x.pmb_expr; StringSet.add x.pmb_name.txt bv | Pstr_recmodule bindings -> let bv' = List.fold_right StringSet.add diff --git a/tools/tast_iter.ml b/tools/tast_iter.ml index 235c0584ad..58110ec940 100644 --- a/tools/tast_iter.ml +++ b/tools/tast_iter.ml @@ -26,6 +26,7 @@ let structure_item sub x = | Tstr_typext te -> sub # type_extension te | Tstr_exception ext -> sub # extension_constructor ext | Tstr_module mb -> sub # module_binding mb + | Tstr_implicit imb -> sub # module_binding imb.im_module | Tstr_recmodule list -> List.iter (sub # module_binding) list | Tstr_modtype mtd -> opt (sub # module_type) mtd.mtd_type | Tstr_open _ -> () @@ -187,6 +188,8 @@ let signature_item sub item = sub # extension_constructor ext | Tsig_module md -> sub # module_type md.md_type + | Tsig_implicit imd -> + sub # module_type imd.im_module.md_type | Tsig_recmodule list -> List.iter (fun md -> sub # module_type md.md_type) list | Tsig_modtype mtd -> diff --git a/tools/untypeast.ml b/tools/untypeast.ml index 5992bc978b..2c9564927c 100644 --- a/tools/untypeast.ml +++ b/tools/untypeast.ml @@ -62,6 +62,10 @@ and untype_structure_item item = Pstr_exception (untype_extension_constructor ext) | Tstr_module mb -> Pstr_module (untype_module_binding mb) + | Tstr_implicit imb -> + let mb = imb.im_module in + let pmb = untype_module_binding mb in + Pstr_implicit { pim_module = pmb; pim_arity = imb.im_arity } | Tstr_recmodule list -> Pstr_recmodule (List.map untype_module_binding list) | Tstr_modtype mtd -> @@ -387,6 +391,14 @@ and untype_signature_item item = pmd_type = untype_module_type md.md_type; pmd_attributes = md.md_attributes; pmd_loc = md.md_loc; } + | Tsig_implicit imd -> + let md = imd.im_module in + let pmd = {pmd_name = md.md_name; + pmd_type = untype_module_type md.md_type; + pmd_attributes = md.md_attributes; pmd_loc = md.md_loc; + } in + Psig_implicit { pim_module = pmd; pim_arity = imd.im_arity } + | Tsig_recmodule list -> Psig_recmodule (List.map (fun md -> {pmd_name = md.md_name; pmd_type = untype_module_type md.md_type; From 4fcbf15e1d5a282cc42716d1106e500a9dc1042b Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 28 Mar 2014 16:03:49 +0000 Subject: [PATCH 322/494] Add Implicit flag to arrow_flag --- parsing/parser.mly | 4 ++-- parsing/parsetree.mli | 1 + parsing/pprintast.ml | 6 ++++++ parsing/printast.ml | 1 + tools/tast_iter.ml | 1 + toplevel/trace.ml | 1 + typing/btype.ml | 4 ++++ typing/parmatch.ml | 2 ++ typing/printtyp.ml | 3 +++ typing/printtyped.ml | 5 +++++ typing/typecore.ml | 6 ++++-- typing/typedtree.ml | 1 + typing/typedtree.mli | 1 + typing/typedtreeIter.ml | 2 +- typing/typedtreeMap.ml | 2 +- typing/types.ml | 13 +++++++------ typing/types.mli | 13 +++++++------ typing/typetexp.ml | 12 ++++-------- 18 files changed, 52 insertions(+), 26 deletions(-) diff --git a/parsing/parser.mly b/parsing/parser.mly index 63e3a998e9..1c3174e5d4 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -1252,8 +1252,8 @@ labeled_simple_pattern: | LABEL simple_pattern { (Parr_labelled $1, None, $2) } | LPAREN IMPLICIT UIDENT COLON package_type RPAREN - { (Parr_simple, None, mkpat(Ppat_constraint(mkpat(Ppat_unpack (mkrhs $3 3)), - ghtyp(Ptyp_package $5)))) } + { (Parr_implicit $3, None, mkpat(Ppat_constraint(mkpat(Ppat_implicit (mkrhs $3 3)), + ghtyp(Ptyp_package $5)))) } | simple_pattern { (Parr_simple, None, $1) } ; diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index ef6212f852..e2cc525f20 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -18,6 +18,7 @@ type arrow_flag = | Parr_simple (* T -> ... *) | Parr_labelled of string (* label:T -> ... *) | Parr_optional of string (* ?label:T -> ... *) + | Parr_implicit of string (* (implicit M : S) -> ... *) type apply_flag = | Papp_simple (* f expr *) diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index 45c0e4c63a..77ab5978ee 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -251,6 +251,9 @@ class printer ()= object(self:'self) end | Parr_labelled s -> pp f "%s:%a" s self#core_type1 c + | Parr_implicit s -> + pp f "(implicit %s : %a)" s self#core_type1 c + method core_type f x = if x.ptyp_attributes <> [] then begin pp f "((%a)%a)" self#core_type {x with ptyp_attributes=[]} @@ -447,6 +450,9 @@ class printer ()= object(self:'self) pp f "~%s@;" s | _ -> pp f "~%s:%a@;" s self#simple_pattern p end + | Parr_implicit s -> + pp f "(implicit %s : %a)@;" s self#simple_pattern p + method sugar_expr f e = if e.pexp_attributes <> [] then false (* should also check attributes underneath *) diff --git a/parsing/printast.ml b/parsing/printast.ml index 8e96ac9625..9828ec042c 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -129,6 +129,7 @@ let arrow_flag f = function | Parr_simple -> () | Parr_optional s -> fprintf f "?%s" s | Parr_labelled s -> fprintf f "%s" s + | Parr_implicit s -> fprintf f "implicit %s" s ;; let apply_flag f = function diff --git a/tools/tast_iter.ml b/tools/tast_iter.ml index 58110ec940..f598b0a6b1 100644 --- a/tools/tast_iter.ml +++ b/tools/tast_iter.ml @@ -75,6 +75,7 @@ let pattern sub pat = let extra = function | Tpat_type _ | Tpat_unpack -> () + | Tpat_implicit -> () | Tpat_constraint ct -> sub # core_type ct in List.iter (fun (c, _, _) -> extra c) pat.pat_extra; diff --git a/toplevel/trace.ml b/toplevel/trace.ml index de98494071..59dfc1f83a 100644 --- a/toplevel/trace.ml +++ b/toplevel/trace.ml @@ -56,6 +56,7 @@ let print_label ppf = function | Tarr_simple -> () | Tarr_optional s -> fprintf ppf "?%s:" s | Tarr_labelled s -> fprintf ppf "%s:" s + | Tarr_implicit id -> fprintf ppf "implicit %s" (Ident.name id) (* If a function returns a functional value, wrap it into a trace code *) diff --git a/typing/btype.ml b/typing/btype.ml index 4d508720f1..2b7851eae3 100644 --- a/typing/btype.ml +++ b/typing/btype.ml @@ -561,16 +561,19 @@ let arrow_is_optional = function let label_name = function | Tarr_simple -> "" | Tarr_optional s | Tarr_labelled s -> s + | Tarr_implicit id -> Ident.name id let label_raw = function | Tarr_simple -> "" | Tarr_optional s -> "?" ^ s | Tarr_labelled s -> s + | Tarr_implicit id -> "implicit " ^ (Ident.name id) let tarr_of_parr = function | Parsetree.Parr_simple -> Tarr_simple | Parsetree.Parr_optional s -> Tarr_optional s | Parsetree.Parr_labelled s -> Tarr_labelled s + | Parsetree.Parr_implicit _ -> assert false let tapp_of_papp = function | Parsetree.Papp_simple -> Tapp_simple @@ -586,6 +589,7 @@ let tapp_of_tarr = function | Tarr_simple -> Tapp_simple | Tarr_optional s -> Tapp_optional s | Tarr_labelled s -> Tapp_labelled s + | Tarr_implicit _ -> failwith "LOL" let arrow_is_applicable arr app = match app, arr with diff --git a/typing/parmatch.ml b/typing/parmatch.ml index c2c7ceba38..f550f3db07 100644 --- a/typing/parmatch.ml +++ b/typing/parmatch.ml @@ -153,6 +153,8 @@ let rec pretty_val ppf v = begin match cstr with | Tpat_unpack -> fprintf ppf "@[(module %a)@]" pretty_val { v with pat_extra = rem } + | Tpat_implicit -> + fprintf ppf "@[(implicit %a)@]" pretty_val { v with pat_extra = rem } | Tpat_constraint ctyp -> fprintf ppf "@[(%a : _)@]" pretty_val { v with pat_extra = rem } | Tpat_type _ -> diff --git a/typing/printtyp.ml b/typing/printtyp.ml index 40e60d55f3..dfdf9ffa98 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -91,6 +91,7 @@ let arrow_flag ppf = function | Tarr_simple -> () | Tarr_optional s -> fprintf ppf "?%s" s | Tarr_labelled s -> fprintf ppf "%s" s + | Tarr_implicit id -> fprintf ppf "implicit %a" ident id (* Print a raw type expression, with sharing *) @@ -546,6 +547,7 @@ let print_label ppf l = | Tarr_simple -> false | Tarr_optional _ -> true | Tarr_labelled _ -> !print_labels + | Tarr_implicit _ -> true then fprintf ppf "%a:" arrow_flag l @@ -553,6 +555,7 @@ let raw_label = function | Tarr_labelled s when !print_labels -> s | Tarr_optional s -> "?" ^ s | Tarr_simple | Tarr_labelled _ -> "" + | Tarr_implicit id -> "implicit " ^ ident_name id let rec tree_of_typexp sch ty = let ty = repr ty in diff --git a/typing/printtyped.ml b/typing/printtyped.ml index 8e409a16bb..9492c21bbc 100644 --- a/typing/printtyped.ml +++ b/typing/printtyped.ml @@ -141,6 +141,7 @@ let arrow_flag f = function | Tarr_simple -> fprintf f "" | Tarr_optional s -> fprintf f "?%s" s | Tarr_labelled s -> fprintf f "%s" s + | Tarr_implicit id -> fprintf f "implicit %a" fmt_ident id let apply_flag f = function | Tapp_simple -> fprintf f "" @@ -214,6 +215,10 @@ and pattern i ppf x = line i ppf "Tpat_unpack\n"; attributes i ppf attrs; pattern i ppf { x with pat_extra = rem } + | (Tpat_implicit, _, attrs) :: rem -> + line i ppf "Tpat_implicit\n"; + attributes i ppf attrs; + pattern i ppf { x with pat_extra = rem } | (Tpat_constraint cty, _, attrs) :: rem -> line i ppf "Tpat_constraint\n"; attributes i ppf attrs; diff --git a/typing/typecore.ml b/typing/typecore.ml index f94bb27903..4e4f1ab7e1 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -932,7 +932,7 @@ let rec type_pat ~constrs ~labels ~no_existentials ~mode ~env sp expected_ty = rp { pat_desc = Tpat_var (id, name); pat_loc = sp.ppat_loc; - pat_extra=[Tpat_unpack, loc, sp.ppat_attributes]; + pat_extra=[Tpat_implicit, loc, sp.ppat_attributes]; pat_type = expected_ty; pat_attributes = []; pat_env = !env } @@ -3955,7 +3955,9 @@ let report_error env ppf = function | Tarr_labelled s -> sprintf "but its first argument is labelled ~%s" s | Tarr_optional s -> - sprintf "but its first argument is labelled ?%s" s in + sprintf "but its first argument is labelled ?%s" s + | Tarr_implicit id -> + sprintf "but its first argument is implicit %s" (Ident.name id) in reset_and_mark_loops ty; fprintf ppf "@[<v>@[<2>This function should have type@ %a@]@,%s@]" type_expr ty (label_mark l) diff --git a/typing/typedtree.ml b/typing/typedtree.ml index a9921909d4..1a1a379bb3 100644 --- a/typing/typedtree.ml +++ b/typing/typedtree.ml @@ -36,6 +36,7 @@ and pat_extra = | Tpat_constraint of core_type | Tpat_type of Path.t * Longident.t loc | Tpat_unpack + | Tpat_implicit and pattern_desc = Tpat_any diff --git a/typing/typedtree.mli b/typing/typedtree.mli index ac6ec6ee63..eff4705827 100644 --- a/typing/typedtree.mli +++ b/typing/typedtree.mli @@ -35,6 +35,7 @@ and pat_extra = | Tpat_constraint of core_type | Tpat_type of Path.t * Longident.t loc | Tpat_unpack + | Tpat_implicit and pattern_desc = Tpat_any diff --git a/typing/typedtreeIter.ml b/typing/typedtreeIter.ml index 50d8605484..e6d0243896 100644 --- a/typing/typedtreeIter.ml +++ b/typing/typedtreeIter.ml @@ -227,7 +227,7 @@ module MakeIterator(Iter : IteratorArgument) : sig Iter.enter_pattern pat; List.iter (fun (cstr, _, _attrs) -> match cstr with | Tpat_type _ -> () - | Tpat_unpack -> () + | Tpat_unpack | Tpat_implicit -> () | Tpat_constraint ct -> iter_core_type ct) pat.pat_extra; begin match pat.pat_desc with diff --git a/typing/typedtreeMap.ml b/typing/typedtreeMap.ml index 8f63dca5c1..6213c26d23 100644 --- a/typing/typedtreeMap.ml +++ b/typing/typedtreeMap.ml @@ -252,7 +252,7 @@ module MakeMap(Map : MapArgument) = struct and map_pat_extra pat_extra = match pat_extra with | Tpat_constraint ct, loc, attrs -> (Tpat_constraint (map_core_type ct), loc, attrs) - | (Tpat_type _ | Tpat_unpack), _, _ -> pat_extra + | (Tpat_type _ | Tpat_unpack | Tpat_implicit), _, _ -> pat_extra and map_expression exp = let exp = Map.enter_expression exp in diff --git a/typing/types.ml b/typing/types.ml index 5f0f6c3957..b2333c63ec 100644 --- a/typing/types.ml +++ b/typing/types.ml @@ -15,14 +15,15 @@ open Asttypes type arrow_flag = - | Tarr_simple (* T -> ... *) - | Tarr_labelled of string (* label:T -> ... *) - | Tarr_optional of string (* ?label:T -> ... *) + | Tarr_simple (* T -> ... *) + | Tarr_labelled of string (* label:T -> ... *) + | Tarr_optional of string (* ?label:T -> ... *) + | Tarr_implicit of Ident.t (* implicit Id : T -> ... *) type apply_flag = - | Tapp_simple (* f expr *) - | Tapp_labelled of string (* f ~label:expr *) - | Tapp_optional of string (* f ?label:expr *) + | Tapp_simple (* f expr *) + | Tapp_labelled of string (* f ~label:expr *) + | Tapp_optional of string (* f ?label:expr *) (* Type expressions for the core language *) diff --git a/typing/types.mli b/typing/types.mli index 3e19569dd7..e7c97e86ac 100644 --- a/typing/types.mli +++ b/typing/types.mli @@ -15,14 +15,15 @@ open Asttypes type arrow_flag = - | Tarr_simple (* T -> ... *) - | Tarr_labelled of string (* label:T -> ... *) - | Tarr_optional of string (* ?label:T -> ... *) + | Tarr_simple (* T -> ... *) + | Tarr_labelled of string (* label:T -> ... *) + | Tarr_optional of string (* ?label:T -> ... *) + | Tarr_implicit of Ident.t (* implicit Id : T -> ... *) type apply_flag = - | Tapp_simple (* f expr *) - | Tapp_labelled of string (* f ~label:expr *) - | Tapp_optional of string (* f ?label:expr *) + | Tapp_simple (* f expr *) + | Tapp_labelled of string (* f ~label:expr *) + | Tapp_optional of string (* f ?label:expr *) (* Type expressions for the core language *) diff --git a/typing/typetexp.ml b/typing/typetexp.ml index 581b6bc448..318e697d27 100644 --- a/typing/typetexp.ml +++ b/typing/typetexp.ml @@ -419,16 +419,12 @@ let rec transl_type env policy styp = end in ctyp (Ttyp_var name) ty - | Ptyp_arrow(l, st1, st2) -> + | Ptyp_arrow(arr, st1, st2) -> let cty1 = transl_type env policy st1 in let cty2 = transl_type env policy st2 in - let l = match l with - | Parr_simple -> Tarr_simple - | Parr_optional s -> Tarr_optional s - | Parr_labelled s -> Tarr_labelled s - in - let ty = newty (Tarrow(l, cty1.ctyp_type, cty2.ctyp_type, Cok)) in - ctyp (Ttyp_arrow (l, cty1, cty2)) ty + let arr = Btype.tarr_of_parr arr in + let ty = newty (Tarrow(arr, cty1.ctyp_type, cty2.ctyp_type, Cok)) in + ctyp (Ttyp_arrow (arr, cty1, cty2)) ty | Ptyp_tuple stl -> if List.length stl < 2 then Syntaxerr.ill_formed_ast loc "Tuples must have at least 2 components."; From a4ad893578f16462fd9fb1a180551ed0094c6368 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 28 Mar 2014 17:12:26 +0000 Subject: [PATCH 323/494] WIP, generalizing arrows --- typing/ctype.ml | 1 + typing/typecore.ml | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/typing/ctype.ml b/typing/ctype.ml index 8267634ec8..cb275f1eb5 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -2023,6 +2023,7 @@ let arrows_are_compatible l1 l2 = match l1, l2 with | (Tarr_simple | Tarr_labelled _), (Tarr_simple | Tarr_labelled _) -> true + (* def: TODO *) | Tarr_optional _, Tarr_optional _ -> true | _ -> false diff --git a/typing/typecore.ml b/typing/typecore.ml index 4e4f1ab7e1..98b947aa91 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1492,6 +1492,7 @@ let rec approx_type env sty = let ty1 = type_option (newvar ()) in newty (Tarrow (Tarr_optional s, ty1, approx_type env sty, Cok)) | Ptyp_arrow (p, _, sty) -> + (* def: TODO*) newty (Tarrow (tarr_of_parr p, newvar (), approx_type env sty, Cok)) | Ptyp_tuple args -> newty (Ttuple (List.map (approx_type env) args)) @@ -1893,6 +1894,10 @@ and type_expect_ ?in_function env sexp ty_expected = in type_expect ?in_function env sfun ty_expected (* TODO: keep attributes, call type_function directly *) + | Pexp_fun (Parr_implicit s, None, spat, sexp) -> + let id = Ident.create s in + type_function ?in_function loc sexp.pexp_attributes env ty_expected + (Tarr_implicit id) [{pc_lhs=spat; pc_guard=None; pc_rhs=sexp}] | Pexp_fun (l, None, spat, sexp) -> type_function ?in_function loc sexp.pexp_attributes env ty_expected (tarr_of_parr l) [{pc_lhs=spat; pc_guard=None; pc_rhs=sexp}] From 07f91614ef48936f48556634301eaf33523a27c5 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Mon, 7 Apr 2014 16:43:15 +0100 Subject: [PATCH 324/494] WIP3 --- parsing/parser.mly | 3 +++ parsing/parsetree.mli | 1 + parsing/pprintast.ml | 2 ++ parsing/printast.ml | 1 + typing/btype.ml | 53 +++++++++++++++++++++++++++---------------- typing/btype.mli | 6 ++--- typing/printtyped.ml | 1 + typing/typeclass.ml | 8 ++++--- typing/typecore.ml | 17 ++++++++++---- typing/types.ml | 1 + typing/types.mli | 1 + 11 files changed, 65 insertions(+), 29 deletions(-) diff --git a/parsing/parser.mly b/parsing/parser.mly index 1c3174e5d4..97403a800e 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -1514,6 +1514,9 @@ label_expr: { (Papp_labelled $1, $2) } | TILDE label_ident { (Papp_labelled (fst $2), snd $2) } + | TILDE LPAREN IMPLICIT mod_longident RPAREN + { let md = mkmod(Pmod_ident (mkrhs $4 4)) in + (Papp_implicit, mkexp (Pexp_pack md)) } | QUESTION label_ident { (Papp_optional (fst $2), snd $2) } | OPTLABEL simple_expr %prec below_SHARP diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index e2cc525f20..5d7018ed1f 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -24,6 +24,7 @@ type apply_flag = | Papp_simple (* f expr *) | Papp_labelled of string (* f ~label:expr *) | Papp_optional of string (* f ?label:expr *) + | Papp_implicit (* f ~implicit:M *) (** {2 Extension points} *) diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index 77ab5978ee..fc08adf5e3 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -1443,6 +1443,8 @@ class printer ()= object(self:'self) pp f "~%s" s else pp f "~%s:%a" s self#simple_expr e + | Papp_implicit -> + pp f "~implicit:%a" self#simple_expr e method directive_argument f x = (match x with diff --git a/parsing/printast.ml b/parsing/printast.ml index 9828ec042c..8a93a21956 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -136,6 +136,7 @@ let apply_flag f = function | Papp_simple -> () | Papp_optional s -> fprintf f "?%s" s | Papp_labelled s -> fprintf f "%s" s + | Papp_implicit -> fprintf f "implicit" ;; let longident_loc i ppf li = line i ppf "%a\n" fmt_longident_loc li;; diff --git a/typing/btype.ml b/typing/btype.ml index 2b7851eae3..4d77c2ab4a 100644 --- a/typing/btype.ml +++ b/typing/btype.ml @@ -579,45 +579,60 @@ let tapp_of_papp = function | Parsetree.Papp_simple -> Tapp_simple | Parsetree.Papp_optional s -> Tapp_optional s | Parsetree.Papp_labelled s -> Tapp_labelled s + | Parsetree.Papp_implicit -> Tapp_implicit let tarr_of_tapp = function | Tapp_simple -> Tarr_simple | Tapp_optional s -> Tarr_optional s | Tapp_labelled s -> Tarr_labelled s + | Tapp_implicit -> assert false let tapp_of_tarr = function | Tarr_simple -> Tapp_simple | Tarr_optional s -> Tapp_optional s | Tarr_labelled s -> Tapp_labelled s - | Tarr_implicit _ -> failwith "LOL" + | Tarr_implicit _ -> Tapp_implicit -let arrow_is_applicable arr app = +let arrow_equal_apply arr app = match app, arr with - | Tapp_simple, (Tarr_simple | Tarr_labelled _) - when !Clflags.classic -> true | Tapp_simple, Tarr_simple -> true - | Tapp_labelled s, Tarr_labelled s' when s = s' -> true - | Tapp_optional s, Tarr_optional s' when s = s' -> true + | Tapp_labelled s, Tarr_labelled s' + | Tapp_optional s, Tarr_optional s' -> s = s' + | Tapp_implicit, Tarr_implicit _ -> true | _ -> false +let arrow_is_applicable arr app = + match app, arr with + | Tapp_simple, Tarr_labelled _ + when !Clflags.classic -> true + | _ -> arrow_equal_apply arr app + let arrow_is_compatible arr app = match app, arr with + | Tapp_simple, Tarr_implicit _ -> false | Tapp_simple, _ -> true - | Tapp_labelled s, Tarr_labelled s' when s = s' -> true - | Tapp_optional s, Tarr_optional s' when s = s' -> true - | _ -> false + | _ -> arrow_equal_apply arr app -let rec extract_label_aux hd l = function +let extraction_match arr app = + match app, arr with + | (Tapp_labelled s | Tapp_optional s), + (Tarr_labelled s' | Tarr_optional s') + (* + The bad case (Tapp_optional s, Tarr_labelled s), applying an optional + argument to a labelled one , will be handled by the caller: a warning is + emitted, and the optional argument will be interpreted as a labelled one. + *) + when s = s' -> true + | _ -> arrow_equal_apply arr app + +let rec extract_application_aux acc arr = function | [] -> raise Not_found - | (Tapp_simple, _ as flag) :: ls when l = "" -> - (flag, List.rev hd, ls) - | ((Tapp_optional l' | Tapp_labelled l'), _ as flag) :: ls - when l = l' -> - (flag, List.rev hd, ls) - | p :: ls -> - extract_label_aux (p::hd) l ls - -let extract_label l ls = extract_label_aux [] l ls + | (app, _ as arg) :: args when extraction_match arr app -> + (arg, List.rev acc, args) + | arg :: args -> + extract_application_aux (arg :: acc) arr args + +let extract_application arr args = extract_application_aux [] arr args (**********************************) diff --git a/typing/btype.mli b/typing/btype.mli index 3b5903c933..91ca7824db 100644 --- a/typing/btype.mli +++ b/typing/btype.mli @@ -181,10 +181,10 @@ val tapp_of_tarr : Types.arrow_flag -> Types.apply_flag val arrow_is_applicable : Types.arrow_flag -> Types.apply_flag -> bool val arrow_is_compatible : Types.arrow_flag -> Types.apply_flag -> bool -val extract_label : - label -> (apply_flag * 'a) list -> +val extract_application : + arrow_flag -> (apply_flag * 'a) list -> (apply_flag * 'a) * (apply_flag * 'a) list * (apply_flag * 'a) list - (* actual label, value, before list, after list *) + (* (actual flag, value), before list, after list *) (**** Utilities for backtracking ****) diff --git a/typing/printtyped.ml b/typing/printtyped.ml index 9492c21bbc..db6a590f51 100644 --- a/typing/printtyped.ml +++ b/typing/printtyped.ml @@ -147,6 +147,7 @@ let apply_flag f = function | Tapp_simple -> fprintf f "" | Tapp_optional s -> fprintf f "?%s" s | Tapp_labelled s -> fprintf f "%s" s + | Tapp_implicit -> fprintf f "implicit" let attributes i ppf l = let i = i + 1 in diff --git a/typing/typeclass.ml b/typing/typeclass.ml index 34aaa25394..23393348b4 100644 --- a/typing/typeclass.ml +++ b/typing/typeclass.ml @@ -1002,7 +1002,6 @@ and class_expr cl_num val_env met_env scl = match ty_fun, ty_fun0 with | Cty_arrow (arr, ty, ty_fun), Cty_arrow (_, ty0, ty_fun0) when sargs <> [] || more_sargs <> [] -> - let name = Btype.label_name arr in let sargs, more_sargs, arg = if ignore_labels && not (Btype.arrow_is_optional arr) then begin match sargs, more_sargs with @@ -1020,11 +1019,11 @@ and class_expr cl_num val_env met_env scl = let (app, sarg0, sargs, more_sargs) = try let ((app, sarg0), sargs1, sargs2) = - Btype.extract_label name sargs + Btype.extract_application arr sargs in (app, sarg0, sargs1 @ sargs2, more_sargs) with Not_found -> let ((app, sarg0), sargs1, sargs2) = - Btype.extract_label name more_sargs + Btype.extract_application arr more_sargs in (app, sarg0, sargs @ sargs1, sargs2) in (* Optional apply to non optional arrow *) @@ -1716,11 +1715,14 @@ let report_error env ppf = function | Cannot_apply clty -> fprintf ppf "This class expression is not a class function, it cannot be applied" + | Apply_wrong_label Tapp_implicit -> + fprintf ppf "This implicit argument cannot be applied" | Apply_wrong_label l -> let mark_label = function | Tapp_simple -> "out label" | Tapp_optional s -> sprintf " label ?%s" s | Tapp_labelled s -> sprintf " label ~%s" s + | Tapp_implicit -> assert false in fprintf ppf "This argument cannot be applied with%s" (mark_label l) | Pattern_type_clash ty -> diff --git a/typing/typecore.ml b/typing/typecore.ml index 98b947aa91..c468d601ae 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -3260,7 +3260,6 @@ and type_application env funct (sargs : (Parsetree.apply_flag * Parsetree.expres Location.prerr_warning loc w end in - let name = label_name arr in let sargs, more_sargs, arg = if ignore_labels && not (arrow_is_optional arr) then begin (* In classic mode, omitted = [] *) @@ -3280,14 +3279,17 @@ and type_application env funct (sargs : (Parsetree.apply_flag * Parsetree.expres end else try let (app, sarg0, sargs, more_sargs) = try - let ((app, sarg0), sargs1, sargs2) = extract_label name sargs in + let ((app, sarg0), sargs1, sargs2) = + extract_application arr sargs + in if sargs1 <> [] then may_warn sarg0.pexp_loc (Warnings.Not_principal "commuting this argument"); (app, sarg0, sargs1 @ sargs2, more_sargs) with Not_found -> let ((app, sarg0), sargs1, sargs2) = - extract_label name more_sargs in + extract_application arr more_sargs + in if sargs1 <> [] || sargs <> [] then may_warn sarg0.pexp_loc (Warnings.Not_principal "commuting this argument"); @@ -3865,11 +3867,18 @@ let report_error env ppf = function type_expr typ "This is not a function; it cannot be applied." end + | Apply_wrong_label (Tapp_implicit, ty) -> + reset_and_mark_loops ty; + fprintf ppf + "@[<v>@[<2>The function applied to this argument has type@ %a@]@.\ + This implicit argument cannot be applied]" + type_expr ty | Apply_wrong_label (l, ty) -> let print_label ppf = function | Tapp_simple -> fprintf ppf "without label" | Tapp_optional s -> fprintf ppf "with label ?%s" s - | Tapp_labelled s -> fprintf ppf "with label ~%s" s in + | Tapp_labelled s -> fprintf ppf "with label ~%s" s + | Tapp_implicit -> assert false in reset_and_mark_loops ty; fprintf ppf "@[<v>@[<2>The function applied to this argument has type@ %a@]@.\ diff --git a/typing/types.ml b/typing/types.ml index b2333c63ec..1e946d75fb 100644 --- a/typing/types.ml +++ b/typing/types.ml @@ -24,6 +24,7 @@ type apply_flag = | Tapp_simple (* f expr *) | Tapp_labelled of string (* f ~label:expr *) | Tapp_optional of string (* f ?label:expr *) + | Tapp_implicit (* f ~implicit:M *) (* Type expressions for the core language *) diff --git a/typing/types.mli b/typing/types.mli index e7c97e86ac..6c7a05438d 100644 --- a/typing/types.mli +++ b/typing/types.mli @@ -24,6 +24,7 @@ type apply_flag = | Tapp_simple (* f expr *) | Tapp_labelled of string (* f ~label:expr *) | Tapp_optional of string (* f ?label:expr *) + | Tapp_implicit (* f ~implicit:M *) (* Type expressions for the core language *) From bd23a8f9ba9c5ba707b98a27099f0bd29cb2d45e Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Thu, 10 Apr 2014 15:03:59 +0100 Subject: [PATCH 325/494] Introduce "let implicit _ in _" expression --- bytecomp/translcore.ml | 3 ++- ocamldoc/odoc_misc.ml | 1 + parsing/ast_helper.ml | 1 + parsing/ast_helper.mli | 6 ++++++ parsing/ast_mapper.ml | 3 +++ parsing/parser.mly | 6 ++++-- parsing/parsetree.mli | 3 +++ parsing/printast.ml | 4 ++++ tools/depend.ml | 3 +++ tools/ocamlprof.ml | 5 +++++ tools/tast_iter.ml | 3 +++ tools/untypeast.ml | 7 +++++++ typing/env.ml | 8 ++++++++ typing/env.mli | 3 +++ typing/printtyped.ml | 4 ++++ typing/typecore.ml | 42 ++++++++++++++++++++++++++++++++++++++++- typing/typecore.mli | 1 + typing/typedtree.ml | 1 + typing/typedtree.mli | 1 + typing/typedtreeIter.ml | 3 +++ typing/typedtreeMap.ml | 5 +++++ typing/typemod.ml | 7 ++++++- 22 files changed, 115 insertions(+), 5 deletions(-) diff --git a/bytecomp/translcore.ml b/bytecomp/translcore.ml index cf3978f499..218602b447 100644 --- a/bytecomp/translcore.ml +++ b/bytecomp/translcore.ml @@ -849,7 +849,8 @@ and transl_exp0 e = Lsequence(transl_setinstvar (Lvar cpy) path expr, rem)) modifs (Lvar cpy)) - | Texp_letmodule({mb_id = id; mb_expr = modl}, body) -> + | Texp_letmodule({mb_id = id; mb_expr = modl}, body) + | Texp_letimplicit({im_module = { mb_id = id; mb_expr = modl }}, body) -> Llet(Strict, id, !transl_module Tcoerce_none None modl, transl_exp body) | Texp_pack modl -> !transl_module Tcoerce_none None modl diff --git a/ocamldoc/odoc_misc.ml b/ocamldoc/odoc_misc.ml index e547b15417..f2420fb8d2 100644 --- a/ocamldoc/odoc_misc.ml +++ b/ocamldoc/odoc_misc.ml @@ -475,6 +475,7 @@ let label_prefix = function | Types.Tarr_simple -> "" | Types.Tarr_optional s -> "?" ^ s ^ ":" | Types.Tarr_labelled s -> s ^ ":" + | Types.Tarr_implicit im -> "implicit " ^ Ident.name im let remove_option typ = let rec iter t = diff --git a/parsing/ast_helper.ml b/parsing/ast_helper.ml index 73f094ad89..814f535be7 100644 --- a/parsing/ast_helper.ml +++ b/parsing/ast_helper.ml @@ -109,6 +109,7 @@ module Exp = struct let setinstvar ?loc ?attrs a b = mk ?loc ?attrs (Pexp_setinstvar (a, b)) let override ?loc ?attrs a = mk ?loc ?attrs (Pexp_override a) let letmodule ?loc ?attrs a b = mk ?loc ?attrs (Pexp_letmodule (a, b)) + let letimplicit ?loc ?attrs ib e = mk ?loc ?attrs (Pexp_letimplicit (ib, e)) let assert_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_assert a) let lazy_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_lazy a) let poly ?loc ?attrs a b = mk ?loc ?attrs (Pexp_poly (a, b)) diff --git a/parsing/ast_helper.mli b/parsing/ast_helper.mli index 4f9be6c909..48054c1b0e 100644 --- a/parsing/ast_helper.mli +++ b/parsing/ast_helper.mli @@ -130,10 +130,16 @@ module Exp: val send: ?loc:loc -> ?attrs:attrs -> expression -> string -> expression val new_: ?loc:loc -> ?attrs:attrs -> lid -> expression val setinstvar: ?loc:loc -> ?attrs:attrs -> str -> expression -> expression +<<<<<<< HEAD val override: ?loc:loc -> ?attrs:attrs -> (str * expression) list -> expression val letmodule: ?loc:loc -> ?attrs:attrs -> module_binding -> expression -> expression +======= + val override: ?loc:loc -> ?attrs:attrs -> (str * expression) list -> expression + val letmodule: ?loc:loc -> ?attrs:attrs -> module_binding -> expression -> expression + val letimplicit: ?loc:loc -> ?attrs:attrs -> implicit_binding -> expression -> expression +>>>>>>> Introduce "let implicit _ in _" expression val assert_: ?loc:loc -> ?attrs:attrs -> expression -> expression val lazy_: ?loc:loc -> ?attrs:attrs -> expression -> expression val poly: ?loc:loc -> ?attrs:attrs -> expression -> core_type option -> expression diff --git a/parsing/ast_mapper.ml b/parsing/ast_mapper.ml index e6a6243b47..25f28a730d 100644 --- a/parsing/ast_mapper.ml +++ b/parsing/ast_mapper.ml @@ -367,6 +367,9 @@ module E = struct (List.map (map_tuple (map_loc sub) (sub.expr sub)) sel) | Pexp_letmodule (mb, e) -> letmodule ~loc ~attrs (sub.module_binding sub mb) (sub.expr sub e) + | Pexp_letimplicit (pib, e) -> + letimplicit ~loc ~attrs (sub.implicit_binding sub pib) + (sub.expr sub e) | Pexp_assert e -> assert_ ~loc ~attrs (sub.expr sub e) | Pexp_lazy e -> lazy_ ~loc ~attrs (sub.expr sub e) | Pexp_poly (e, t) -> diff --git a/parsing/parser.mly b/parsing/parser.mly index 97403a800e..71475e2de7 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -1289,6 +1289,8 @@ expr: { mkexp_attrs (Pexp_let($3, List.rev $4, $6)) $2 } | LET MODULE ext_attributes module_binding IN seq_expr { mkexp_attrs (Pexp_letmodule($4, $6)) $3 } + | LET IMPLICIT ext_attributes implicit_binding IN seq_expr + { mkexp_attrs (Pexp_letimplicit($4, $6)) $3 } | LET OPEN override_flag ext_attributes mod_longident IN seq_expr { mkexp_attrs (Pexp_open($3, mkrhs $5 5, $7)) $4 } | FUNCTION ext_attributes opt_bar match_cases @@ -1514,8 +1516,8 @@ label_expr: { (Papp_labelled $1, $2) } | TILDE label_ident { (Papp_labelled (fst $2), snd $2) } - | TILDE LPAREN IMPLICIT mod_longident RPAREN - { let md = mkmod(Pmod_ident (mkrhs $4 4)) in + | LPAREN IMPLICIT mod_longident RPAREN + { let md = mkmod(Pmod_ident (mkrhs $3 3)) in (Papp_implicit, mkexp (Pexp_pack md)) } | QUESTION label_ident { (Papp_optional (fst $2), snd $2) } diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index 5d7018ed1f..5413ea0588 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -308,6 +308,9 @@ and expression_desc = (* {< x1 = E1; ...; Xn = En >} *) | Pexp_letmodule of module_binding * expression (* let module M = ME in E *) + | Pexp_letimplicit of implicit_binding * expression + (* let implicit module M = ME in E *) + (* let implicit functor F (_) = ME in E *) | Pexp_assert of expression (* assert E Note: "assert false" is treated in a special way by the diff --git a/parsing/printast.ml b/parsing/printast.ml index 8a93a21956..6cf5213a98 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -351,6 +351,10 @@ and expression i ppf x = line i ppf "Pexp_letmodule\n"; module_binding i ppf mb; expression i ppf e; + | Pexp_letimplicit (pib, e) -> + line i ppf "Pexp_letimplicit\n"; + module_binding i ppf pib.pim_module; + expression i ppf e; | Pexp_assert (e) -> line i ppf "Pexp_assert\n"; expression i ppf e; diff --git a/tools/depend.ml b/tools/depend.ml index b3729ca3b0..7b80d04c6e 100644 --- a/tools/depend.ml +++ b/tools/depend.ml @@ -190,6 +190,9 @@ let rec add_expr bv exp = | Pexp_override sel -> List.iter (fun (_s, e) -> add_expr bv e) sel | Pexp_letmodule(x, e) -> add_module bv x.pmb_expr; add_expr (StringSet.add x.pmb_name.txt bv) e + | Pexp_letimplicit(pib, e) -> + let x = pib.pim_module in + add_module bv x.pmb_expr; add_expr (StringSet.add x.pmb_name.txt bv) e | Pexp_assert (e) -> add_expr bv e | Pexp_lazy (e) -> add_expr bv e | Pexp_poly (e, t) -> add_expr bv e; add_opt add_type bv t diff --git a/tools/ocamlprof.ml b/tools/ocamlprof.ml index 44d6c22197..f4f86b895b 100644 --- a/tools/ocamlprof.ml +++ b/tools/ocamlprof.ml @@ -281,6 +281,10 @@ and rw_exp iflag sexp = rewrite_mod iflag smod; rewrite_exp iflag sexp + | Pexp_letimplicit (pib, sexp) -> + rewrite_mod iflag pib.pim_module.pmb_expr; + rewrite_exp iflag sexp + | Pexp_assert (cond) -> rewrite_exp iflag cond | Pexp_lazy (expr) -> rewrite_exp iflag expr @@ -385,6 +389,7 @@ and rewrite_str_item iflag item = | Pstr_value(_, exps) -> List.iter (fun x -> rewrite_exp iflag x.pvb_expr) exps | Pstr_module x -> rewrite_mod iflag x.pmb_expr + | Pstr_implicit x -> rewrite_mod iflag x.pim_module.pmb_expr (* todo: Pstr_recmodule?? *) | Pstr_class classes -> List.iter (rewrite_class_declaration iflag) classes | _ -> () diff --git a/tools/tast_iter.ml b/tools/tast_iter.ml index f598b0a6b1..801cf37953 100644 --- a/tools/tast_iter.ml +++ b/tools/tast_iter.ml @@ -163,6 +163,9 @@ let expression sub exp = | Texp_letmodule (mb, exp) -> sub # module_binding mb; sub # expression exp + | Texp_letimplicit (imb, exp) -> + sub # module_binding imb.im_module; + sub # expression exp | Texp_assert exp -> sub # expression exp | Texp_lazy exp -> sub # expression exp | Texp_object (cl, _) -> diff --git a/tools/untypeast.ml b/tools/untypeast.ml index 2c9564927c..03bef315ad 100644 --- a/tools/untypeast.ml +++ b/tools/untypeast.ml @@ -263,11 +263,13 @@ and untype_arrow_flag = function | Types.Tarr_simple -> Parr_simple | Types.Tarr_optional s -> Parr_optional s | Types.Tarr_labelled s -> Parr_labelled s + | Types.Tarr_implicit id -> Parr_implicit (Ident.name id) and untype_apply_flag = function | Types.Tapp_simple -> Papp_simple | Types.Tapp_optional s -> Papp_optional s | Types.Tapp_labelled s -> Papp_labelled s + | Types.Tapp_implicit -> Papp_implicit and untype_expression exp = let desc = @@ -357,6 +359,11 @@ and untype_expression exp = ) list) | Texp_letmodule (mb, exp) -> Pexp_letmodule (untype_module_binding mb, untype_expression exp) + | Texp_letimplicit (imb, exp) -> + let mb = imb.im_module in + let pmb = untype_module_binding mb in + let pib = { pim_module = pmb; pim_arity = imb.im_arity } in + Pexp_letimplicit (pib, untype_expression exp) | Texp_assert exp -> Pexp_assert (untype_expression exp) | Texp_lazy exp -> Pexp_lazy (untype_expression exp) | Texp_object (cl, _) -> diff --git a/typing/env.ml b/typing/env.ml index 49e913b34f..7b688fd874 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -1583,6 +1583,11 @@ and enter_module_declaration ?arg name md env = (id, add_module_declaration ?arg id md env) (* let (id, env) = enter store_module name md env in (id, add_functor_arg ?arg id env) *) +and enter_implicit_declaration name imd env = + let id = Ident.create name in + (id, add_implicit_declaration id imd env) + (* let (id, env) = enter store_module name md env in + (id, add_functor_arg ?arg id env) *) and enter_modtype = enter store_modtype and enter_class = enter store_class and enter_cltype = enter store_cltype @@ -1590,6 +1595,9 @@ and enter_cltype = enter store_cltype let enter_module ?arg s mty env = enter_module_declaration ?arg s (md mty) env +let enter_implicit s ~arity mty env = + enter_implicit_declaration s (imd arity mty) env + (* Insertion of all components of a signature *) let add_item comp env = diff --git a/typing/env.mli b/typing/env.mli index 3a9eadec1d..f7e753f4ec 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -138,6 +138,9 @@ val enter_extension: string -> extension_constructor -> t -> Ident.t * t val enter_module: ?arg:bool -> string -> module_type -> t -> Ident.t * t val enter_module_declaration: ?arg:bool -> string -> module_declaration -> t -> Ident.t * t +val enter_implicit: string -> arity:int -> module_type -> t -> Ident.t * t +val enter_implicit_declaration: + string -> implicit_declaration -> t -> Ident.t * t val enter_modtype: string -> modtype_declaration -> t -> Ident.t * t val enter_class: string -> class_declaration -> t -> Ident.t * t val enter_cltype: string -> class_type_declaration -> t -> Ident.t * t diff --git a/typing/printtyped.ml b/typing/printtyped.ml index db6a590f51..d42fa1ec80 100644 --- a/typing/printtyped.ml +++ b/typing/printtyped.ml @@ -376,6 +376,10 @@ and expression i ppf x = line i ppf "Pexp_letmodule\n"; module_binding i ppf mb; expression i ppf e; + | Texp_letimplicit (imb,e) -> + line i ppf "Pexp_letimplicit %d\n" imb.im_arity; + module_binding i ppf imb.im_module; + expression i ppf e; | Texp_assert (e) -> line i ppf "Pexp_assert"; expression i ppf e; diff --git a/typing/typecore.ml b/typing/typecore.ml index c468d601ae..70d2831c44 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -53,6 +53,7 @@ type error = | Too_many_arguments of bool * type_expr | Abstract_wrong_label of arrow_flag * type_expr | Scoping_let_module of string * type_expr + | Scoping_let_implicit of string * type_expr | Masked_instance_variable of Longident.t | Not_a_variant_type of Longident.t | Incoherent_label_order @@ -152,7 +153,8 @@ let iter_expression f e = | Pexp_ifthenelse (e1, e2, eo) -> expr e1; expr e2; may expr eo | Pexp_for (_, e1, e2, _, e3) -> expr e1; expr e2; expr e3 | Pexp_override sel -> List.iter (fun (_, e) -> expr e) sel - | Pexp_letmodule ({pmb_expr = me}, e) -> expr e; module_expr me + | Pexp_letmodule (pmb, e) -> expr e; module_expr pmb.pmb_expr + | Pexp_letimplicit (pib, e) -> expr e; module_expr pib.pim_module.pmb_expr | Pexp_object { pcstr_fields = fs } -> List.iter class_field fs | Pexp_pack me -> module_expr me @@ -2525,6 +2527,38 @@ and type_expect_ ?in_function env sexp ty_expected = let body = type_expect new_env sbody ty_expected in (* go back to original level *) end_def (); + (* Unification of body.exp_type with the fresh variable ty + fails if and only if the prefix condition is violated, + i.e. if generative types rooted at id show up in the + type body.exp_type. Thus, this unification enforces the + scoping condition on "let module". *) + begin try + Ctype.unify_var new_env ty body.exp_type + with Unify _ -> + raise(Error(loc, env, Scoping_let_implicit(name.txt, body.exp_type))) + end; + let mb = { mb_id = id; mb_name = name; mb_expr = modl; + mb_attributes = pmb_attributes; mb_loc = pmb_loc } in + re { + exp_desc = Texp_letmodule (mb, body); + exp_loc = loc; exp_extra = []; + exp_type = ty; + exp_attributes = sexp.pexp_attributes; + exp_env = env } + | Pexp_letimplicit ({pim_module = pmb; pim_arity = arity}, sbody) -> + let {pmb_name = name; pmb_expr = smodl; pmb_attributes; pmb_loc} = pmb in + let ty = newvar() in + (* remember original level *) + begin_def (); + Ident.set_current_time ty.level; + let context = Typetexp.narrow () in + let modl = !type_module env smodl in + let (id, new_env) = Env.enter_implicit name.txt ~arity modl.mod_type env in + Ctype.init_def(Ident.current_time()); + Typetexp.widen context; + let body = type_expect new_env sbody ty_expected in + (* go back to original level *) + end_def (); (* Unification of body.exp_type with the fresh variable ty fails if and only if the prefix condition is violated, i.e. if generative types rooted at id show up in the @@ -3981,6 +4015,12 @@ let report_error env ppf = function "This `let module' expression has type@ %a@ " type_expr ty; fprintf ppf "In this type, the locally bound module name %s escapes its scope" id + | Scoping_let_implicit(id, ty) -> + reset_and_mark_loops ty; + fprintf ppf + "This `let implicit' expression has type@ %a@ " type_expr ty; + fprintf ppf + "In this type, the locally bound module name %s escapes its scope" id | Masked_instance_variable lid -> fprintf ppf "The instance variable %a@ \ diff --git a/typing/typecore.mli b/typing/typecore.mli index 51ec30db6b..9071b4e02a 100644 --- a/typing/typecore.mli +++ b/typing/typecore.mli @@ -98,6 +98,7 @@ type error = | Too_many_arguments of bool * type_expr | Abstract_wrong_label of arrow_flag * type_expr | Scoping_let_module of string * type_expr + | Scoping_let_implicit of string * type_expr | Masked_instance_variable of Longident.t | Not_a_variant_type of Longident.t | Incoherent_label_order diff --git a/typing/typedtree.ml b/typing/typedtree.ml index 1a1a379bb3..dfdc619e24 100644 --- a/typing/typedtree.ml +++ b/typing/typedtree.ml @@ -101,6 +101,7 @@ and expression_desc = | Texp_setinstvar of Path.t * Path.t * string loc * expression | Texp_override of Path.t * (Path.t * string loc * expression) list | Texp_letmodule of module_binding * expression + | Texp_letimplicit of implicit_binding * expression | Texp_assert of expression | Texp_lazy of expression | Texp_object of class_structure * string list diff --git a/typing/typedtree.mli b/typing/typedtree.mli index eff4705827..7e8e234ee6 100644 --- a/typing/typedtree.mli +++ b/typing/typedtree.mli @@ -100,6 +100,7 @@ and expression_desc = | Texp_setinstvar of Path.t * Path.t * string loc * expression | Texp_override of Path.t * (Path.t * string loc * expression) list | Texp_letmodule of module_binding * expression + | Texp_letimplicit of implicit_binding * expression | Texp_assert of expression | Texp_lazy of expression | Texp_object of class_structure * string list diff --git a/typing/typedtreeIter.ml b/typing/typedtreeIter.ml index e6d0243896..965e1ade4a 100644 --- a/typing/typedtreeIter.ml +++ b/typing/typedtreeIter.ml @@ -346,6 +346,9 @@ module MakeIterator(Iter : IteratorArgument) : sig | Texp_letmodule (mb, exp) -> iter_module_binding mb; iter_expression exp + | Texp_letimplicit (imb,expr) -> + iter_module_binding imb.im_module; + iter_expression exp | Texp_assert exp -> iter_expression exp | Texp_lazy exp -> iter_expression exp | Texp_object (cl, _) -> diff --git a/typing/typedtreeMap.ml b/typing/typedtreeMap.ml index 6213c26d23..5924c343fe 100644 --- a/typing/typedtreeMap.ml +++ b/typing/typedtreeMap.ml @@ -360,6 +360,11 @@ module MakeMap(Map : MapArgument) = struct ) | Texp_letmodule (mb, exp) -> Texp_letmodule (map_module_binding mb, map_expression exp) + | Texp_letimplicit (x, exp) -> + Texp_letimplicit ( + {x with im_module = map_module_binding x.im_module}, + map_expression exp + ) | Texp_assert exp -> Texp_assert (map_expression exp) | Texp_lazy exp -> Texp_lazy (map_expression exp) | Texp_object (cl, string_list) -> diff --git a/typing/typemod.ml b/typing/typemod.ml index 79c426340f..fe45dc8736 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -1367,7 +1367,12 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = md_loc = pmb_loc; } in - let (id, newenv) = Env.enter_module_declaration name.txt md env in + let imd = + { imd_module = md; + imd_arity = arity; + } + in + let (id, newenv) = Env.enter_implicit_declaration name.txt imd env in (* failwith "TODO" check arity ?! *) Tstr_implicit { im_arity = arity; From be62cf846193c594b3b8ee40329e7fd161d76b44 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Mon, 14 Apr 2014 15:42:27 +0100 Subject: [PATCH 326/494] Get rid of Ppat_implicit --- parsing/ast_helper.ml | 1 - parsing/ast_helper.mli | 9 ++------- parsing/ast_mapper.ml | 2 -- parsing/parser.mly | 9 ++++++--- parsing/parsetree.mli | 2 -- parsing/pprintast.ml | 4 +--- parsing/printast.ml | 5 ----- typing/typecore.ml | 15 +++------------ 8 files changed, 12 insertions(+), 35 deletions(-) diff --git a/parsing/ast_helper.ml b/parsing/ast_helper.ml index 814f535be7..6220913e17 100644 --- a/parsing/ast_helper.ml +++ b/parsing/ast_helper.ml @@ -74,7 +74,6 @@ module Pat = struct let lazy_ ?loc ?attrs a = mk ?loc ?attrs (Ppat_lazy a) let unpack ?loc ?attrs a = mk ?loc ?attrs (Ppat_unpack a) let exception_ ?loc ?attrs a = mk ?loc ?attrs (Ppat_exception a) - let implicit_ ?loc ?attrs a = mk ?loc ?attrs (Ppat_implicit a) let extension ?loc ?attrs a = mk ?loc ?attrs (Ppat_extension a) end diff --git a/parsing/ast_helper.mli b/parsing/ast_helper.mli index 48054c1b0e..6384c6db30 100644 --- a/parsing/ast_helper.mli +++ b/parsing/ast_helper.mli @@ -82,7 +82,6 @@ module Pat: val lazy_: ?loc:loc -> ?attrs:attrs -> pattern -> pattern val unpack: ?loc:loc -> ?attrs:attrs -> str -> pattern val exception_: ?loc:loc -> ?attrs:attrs -> pattern -> pattern - val implicit_: ?loc:loc -> ?attrs:attrs -> str -> pattern val extension: ?loc:loc -> ?attrs:attrs -> extension -> pattern end @@ -130,16 +129,12 @@ module Exp: val send: ?loc:loc -> ?attrs:attrs -> expression -> string -> expression val new_: ?loc:loc -> ?attrs:attrs -> lid -> expression val setinstvar: ?loc:loc -> ?attrs:attrs -> str -> expression -> expression -<<<<<<< HEAD val override: ?loc:loc -> ?attrs:attrs -> (str * expression) list -> expression val letmodule: ?loc:loc -> ?attrs:attrs -> module_binding -> expression -> expression -======= - val override: ?loc:loc -> ?attrs:attrs -> (str * expression) list -> expression - val letmodule: ?loc:loc -> ?attrs:attrs -> module_binding -> expression -> expression - val letimplicit: ?loc:loc -> ?attrs:attrs -> implicit_binding -> expression -> expression ->>>>>>> Introduce "let implicit _ in _" expression + val letimplicit: ?loc:loc -> ?attrs:attrs -> implicit_binding -> expression + -> expression val assert_: ?loc:loc -> ?attrs:attrs -> expression -> expression val lazy_: ?loc:loc -> ?attrs:attrs -> expression -> expression val poly: ?loc:loc -> ?attrs:attrs -> expression -> core_type option -> expression diff --git a/parsing/ast_mapper.ml b/parsing/ast_mapper.ml index 25f28a730d..fa63a443e1 100644 --- a/parsing/ast_mapper.ml +++ b/parsing/ast_mapper.ml @@ -410,8 +410,6 @@ module P = struct | Ppat_lazy p -> lazy_ ~loc ~attrs (sub.pat sub p) | Ppat_unpack s -> unpack ~loc ~attrs (map_loc sub s) | Ppat_exception p -> exception_ ~loc ~attrs (sub.pat sub p) - | Ppat_implicit s -> - implicit_ ~loc ~attrs (map_loc sub s) | Ppat_extension x -> extension ~loc ~attrs (sub.extension sub x) end diff --git a/parsing/parser.mly b/parsing/parser.mly index 71475e2de7..c8cdc992c2 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -1251,12 +1251,15 @@ labeled_simple_pattern: { (Parr_labelled (fst $2), None, snd $2) } | LABEL simple_pattern { (Parr_labelled $1, None, $2) } - | LPAREN IMPLICIT UIDENT COLON package_type RPAREN - { (Parr_implicit $3, None, mkpat(Ppat_constraint(mkpat(Ppat_implicit (mkrhs $3 3)), - ghtyp(Ptyp_package $5)))) } + | LPAREN IMPLICIT UIDENT COLON implicit_module_type RPAREN + { (Parr_implicit $3, None, + mkpat(Ppat_constraint(mkpat(Ppat_var (mkrhs $3 3)), $5))) } | simple_pattern { (Parr_simple, None, $1) } ; +implicit_module_type: + | package_type { mktyp(Ptyp_package $1) } +; pattern_var: LIDENT { mkpat(Ppat_var (mkrhs $1 1)) } | UNDERSCORE { mkpat Ppat_any } diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index 5413ea0588..87f3c5cab4 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -206,8 +206,6 @@ and pattern_desc = *) | Ppat_exception of pattern (* exception P *) - | Ppat_implicit of string loc - (* (implicit P: S) *) | Ppat_extension of extension (* [%id] *) diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index fc08adf5e3..e856e19396 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -130,7 +130,7 @@ let pp = fprintf ======= let rec is_irrefut_patt x = match x.ppat_desc with - | Ppat_any | Ppat_var _ | Ppat_unpack _ | Ppat_implicit _ -> true + | Ppat_any | Ppat_var _ | Ppat_unpack _ -> true | Ppat_alias (p,_) -> is_irrefut_patt p | Ppat_tuple (ps) -> List.for_all is_irrefut_patt ps | Ppat_constraint (p,_) -> is_irrefut_patt p @@ -397,8 +397,6 @@ class printer ()= object(self:'self) pp f "@[<2>[|%a|]@]" (self#list self#pattern1 ~sep:";") l | Ppat_unpack (s) -> pp f "(module@ %s)@ " s.txt - | Ppat_implicit s -> - pp f "(implicit@ %s)@ " s.txt | Ppat_type li -> pp f "#%a" self#longident_loc li | Ppat_record (l, closed) -> diff --git a/parsing/printast.ml b/parsing/printast.ml index 6cf5213a98..c58eb98369 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -241,14 +241,9 @@ and pattern i ppf x = longident_loc i ppf li | Ppat_unpack s -> line i ppf "Ppat_unpack %a\n" fmt_string_loc s; -<<<<<<< HEAD | Ppat_exception p -> line i ppf "Ppat_exception\n"; pattern i ppf p -======= - | Ppat_implicit s -> - line i ppf "Ppat_implicit %a\n" fmt_string_loc s; ->>>>>>> Introduce "implicit" keyword and constructions in parser | Ppat_extension (s, arg) -> line i ppf "Ppat_extension \"%s\"\n" s.txt; payload i ppf arg diff --git a/typing/typecore.ml b/typing/typecore.ml index 70d2831c44..5ddde45268 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -929,15 +929,6 @@ let rec type_pat ~constrs ~labels ~no_existentials ~mode ~env sp expected_ty = pat_type = expected_ty; pat_attributes = []; pat_env = !env } - | Ppat_implicit name -> - let id = enter_variable loc name expected_ty ~is_module:true in - rp { - pat_desc = Tpat_var (id, name); - pat_loc = sp.ppat_loc; - pat_extra=[Tpat_implicit, loc, sp.ppat_attributes]; - pat_type = expected_ty; - pat_attributes = []; - pat_env = !env } | Ppat_constraint({ppat_desc=Ppat_var name; ppat_loc=lloc}, ({ptyp_desc=Ptyp_poly _} as sty)) -> (* explicitly polymorphic type *) @@ -1659,7 +1650,7 @@ let iter_ppat f p = match p.ppat_desc with | Ppat_any | Ppat_var _ | Ppat_constant _ | Ppat_interval _ | Ppat_extension _ - | Ppat_type _ | Ppat_unpack _ | Ppat_implicit _ -> () + | Ppat_type _ | Ppat_unpack _ -> () | Ppat_array pats -> List.iter f pats | Ppat_or (p1,p2) -> f p1; f p2 | Ppat_variant (_, arg) | Ppat_construct (_, arg) -> may f arg @@ -2535,7 +2526,7 @@ and type_expect_ ?in_function env sexp ty_expected = begin try Ctype.unify_var new_env ty body.exp_type with Unify _ -> - raise(Error(loc, env, Scoping_let_implicit(name.txt, body.exp_type))) + raise(Error(loc, env, Scoping_let_module(name.txt, body.exp_type))) end; let mb = { mb_id = id; mb_name = name; mb_expr = modl; mb_attributes = pmb_attributes; mb_loc = pmb_loc } in @@ -2567,7 +2558,7 @@ and type_expect_ ?in_function env sexp ty_expected = begin try Ctype.unify_var new_env ty body.exp_type with Unify _ -> - raise(Error(loc, env, Scoping_let_module(name.txt, body.exp_type))) + raise(Error(loc, env, Scoping_let_implicit(name.txt, body.exp_type))) end; let mb = { mb_id = id; mb_name = name; mb_expr = modl; mb_attributes = pmb_attributes; mb_loc = pmb_loc } in From 95264f0791e2d268616da66dda69a4409ec66246 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Mon, 14 Apr 2014 15:42:41 +0100 Subject: [PATCH 327/494] Implement proper pretty printing for implicit arguments --- typing/oprint.ml | 30 ++++++++++++++++++++++++++++-- typing/outcometree.mli | 1 + typing/printtyp.ml | 6 +++++- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/typing/oprint.ml b/typing/oprint.ml index cc74846029..43dd990c32 100644 --- a/typing/oprint.ml +++ b/typing/oprint.ml @@ -170,7 +170,7 @@ let rec print_out_type ppf = and print_out_type_1 ppf = function - Otyp_arrow (lab, ty1, ty2) -> + | Otyp_arrow (lab, ty1, ty2) -> pp_open_box ppf 0; if lab <> "" then (pp_print_string ppf lab; pp_print_char ppf ':'); print_out_type_2 ppf ty1; @@ -178,6 +178,31 @@ and print_out_type_1 ppf = pp_print_space ppf (); print_out_type_1 ppf ty2; pp_close_box ppf () + | Otyp_implicit_arrow (lab, ty1, ty2) -> + pp_open_box ppf 0; + pp_print_string ppf "(implicit"; + pp_print_space ppf (); + pp_print_string ppf lab; + pp_print_space ppf (); + pp_print_string ppf ":"; + pp_print_space ppf (); + begin match ty1 with + | Otyp_module (p, n, tyl) -> + fprintf ppf "@[<1>%s" p; + let first = ref true in + List.iter2 + (fun s t -> + let sep = if !first then (first := false; "with") else "and" in + fprintf ppf " %s type %s = %a" sep s print_out_type t + ) + n tyl; + fprintf ppf "@]" + | ty1 -> print_out_type_2 ppf ty1; + end; + pp_print_string ppf ") ->"; + pp_print_space ppf (); + print_out_type_1 ppf ty2; + pp_close_box ppf () | ty -> print_out_type_2 ppf ty and print_out_type_2 ppf = function @@ -217,7 +242,8 @@ and print_simple_out_type ppf = else if tags = None then "> " else "? ") print_fields row_fields print_present tags - | Otyp_alias _ | Otyp_poly _ | Otyp_arrow _ | Otyp_tuple _ as ty -> + | Otyp_arrow _ | Otyp_implicit_arrow _ + | Otyp_alias _ | Otyp_poly _ | Otyp_tuple _ as ty -> pp_open_box ppf 1; pp_print_char ppf '('; print_out_type ppf ty; diff --git a/typing/outcometree.mli b/typing/outcometree.mli index 0406d43dbd..7f7e8ab834 100644 --- a/typing/outcometree.mli +++ b/typing/outcometree.mli @@ -47,6 +47,7 @@ type out_type = | Otyp_open | Otyp_alias of out_type * string | Otyp_arrow of string * out_type * out_type + | Otyp_implicit_arrow of string * out_type * out_type | Otyp_class of bool * out_ident * out_type list | Otyp_constr of out_ident * out_type list | Otyp_manifest of out_type * out_type diff --git a/typing/printtyp.ml b/typing/printtyp.ml index dfdf9ffa98..32c2abe0a6 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -555,7 +555,7 @@ let raw_label = function | Tarr_labelled s when !print_labels -> s | Tarr_optional s -> "?" ^ s | Tarr_simple | Tarr_labelled _ -> "" - | Tarr_implicit id -> "implicit " ^ ident_name id + | Tarr_implicit _ -> assert false let rec tree_of_typexp sch ty = let ty = repr ty in @@ -568,6 +568,10 @@ let rec tree_of_typexp sch ty = match ty.desc with | Tvar _ -> Otyp_var (is_non_gen sch ty, name_of_type ty) + | Tarrow(Tarr_implicit id, ty1, ty2, _) -> + Otyp_implicit_arrow (Ident.name id, + tree_of_typexp sch ty1, + tree_of_typexp sch ty2) | Tarrow(l, ty1, ty2, _) -> let pr_arrow l ty1 ty2 = let lab = raw_label l in From aaf22234570badea5536327a1c64608b378ddaa3 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Tue, 15 Apr 2014 13:20:40 +0100 Subject: [PATCH 328/494] WIP, escape caught --- typing/ctype.ml | 6 ++-- typing/env.ml | 26 ++++++++++++--- typing/env.mli | 6 ++-- typing/envaux.ml | 6 ++++ typing/typecore.ml | 79 ++++++++++++++++++++++++++++++++++------------ 5 files changed, 95 insertions(+), 28 deletions(-) diff --git a/typing/ctype.ml b/typing/ctype.ml index cb275f1eb5..28a7dc5c75 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -763,7 +763,9 @@ let rec update_level env level ty = | None -> () end; match ty.desc with - Tconstr(p, tl, abbrev) when level < get_level env p -> + Tconstr(p, tl, abbrev) + when level < get_level env p && + not (Env.is_implicit_arg p env && tl = []) -> (* Try first to replace an abbreviation by its expansion. *) begin try (* if is_newtype env p then raise Cannot_expand; *) @@ -2023,8 +2025,8 @@ let arrows_are_compatible l1 l2 = match l1, l2 with | (Tarr_simple | Tarr_labelled _), (Tarr_simple | Tarr_labelled _) -> true - (* def: TODO *) | Tarr_optional _, Tarr_optional _ -> true + | Tarr_implicit _, Tarr_implicit _ -> true | _ -> false let classic_arrows_are_compatible l1 l2 = diff --git a/typing/env.ml b/typing/env.ml index 7b688fd874..3016e6bcf0 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -119,6 +119,7 @@ type summary = | Env_cltype of summary * Ident.t * class_type_declaration | Env_open of summary * Path.t | Env_functor_arg of summary * Ident.t + | Env_implicit_arg of summary * Ident.t module EnvTbl = struct @@ -184,6 +185,7 @@ type t = { classes: (Path.t * class_declaration) EnvTbl.t; cltypes: (Path.t * class_type_declaration) EnvTbl.t; functor_args: unit Ident.tbl; + implicit_args: unit Ident.tbl; summary: summary; local_constraints: bool; gadt_instances: (int * TypeSet.t ref) list; @@ -232,6 +234,7 @@ let empty = { summary = Env_empty; local_constraints = false; gadt_instances = []; flags = 0; functor_args = Ident.empty; + implicit_args = Ident.empty; } let in_signature env = @@ -639,6 +642,14 @@ let rec is_functor_arg path env = | Pdot (p, s, _) -> is_functor_arg p env | Papply _ -> true +let rec is_implicit_arg path env = + match path with + Pident id -> + begin try Ident.find_same id env.implicit_args; true + with Not_found -> false + end + | Pdot (p, s, _) -> is_implicit_arg p env + | Papply _ -> true (* Lookup by name *) exception Recmodule @@ -1519,6 +1530,12 @@ let add_functor_arg ?(arg=false) id env = functor_args = Ident.add id () env.functor_args; summary = Env_functor_arg (env.summary, id)} +let add_implicit_arg ?(arg=false) id env = + if not arg then env else + {env with + implicit_args = Ident.add id () env.implicit_args; + summary = Env_functor_arg (env.summary, id)} + let add_value ?check id desc env = store_value None ?check id (Pident id) desc env env @@ -1537,13 +1554,14 @@ and add_module_declaration ?arg id md env = let env = store_module None id path md env env in add_functor_arg ?arg id env -and add_implicit_declaration id imd env = +and add_implicit_declaration ?arg id imd env = let path = (*match md.md_type with Mty_alias path -> normalize_path env path | _ ->*) Pident id in - store_implicit None id path imd env env + let env = store_implicit None id path imd env env in + add_implicit_arg ?arg id env and add_modtype id info env = store_modtype None id (Pident id) info env env @@ -1557,8 +1575,8 @@ and add_cltype id ty env = let add_module ?arg id mty env = add_module_declaration ?arg id (md mty) env -let add_implicit id ~arity mty env = - add_implicit_declaration id (imd arity mty) env +let add_implicit ?arg id ~arity mty env = + add_implicit_declaration ?arg id (imd arity mty) env let add_local_constraint id info elv env = match info with diff --git a/typing/env.mli b/typing/env.mli index f7e753f4ec..c4202572f4 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -26,6 +26,7 @@ type summary = | Env_cltype of summary * Ident.t * class_type_declaration | Env_open of summary * Path.t | Env_functor_arg of summary * Ident.t + | Env_implicit_arg of summary * Ident.t type t @@ -65,6 +66,7 @@ val find_type_expansion_opt: of the compiler's type-based optimisations. *) val find_modtype_expansion: Path.t -> t -> module_type val is_functor_arg: Path.t -> t -> bool +val is_implicit_arg: Path.t -> t -> bool val normalize_path: Location.t option -> t -> Path.t -> Path.t (* Normalize the path to a concrete value or module. If the option is None, allow returning dangling paths. @@ -108,8 +110,8 @@ val add_type: check:bool -> Ident.t -> type_declaration -> t -> t val add_extension: check:bool -> Ident.t -> extension_constructor -> t -> t val add_module: ?arg:bool -> Ident.t -> module_type -> t -> t val add_module_declaration: ?arg:bool -> Ident.t -> module_declaration -> t -> t -val add_implicit: Ident.t -> arity:int -> module_type -> t -> t -val add_implicit_declaration: Ident.t -> implicit_declaration -> t -> t +val add_implicit: ?arg:bool ->Ident.t -> arity:int -> module_type -> t -> t +val add_implicit_declaration: ?arg:bool ->Ident.t -> implicit_declaration -> t -> t val add_modtype: Ident.t -> modtype_declaration -> t -> t val add_class: Ident.t -> class_declaration -> t -> t val add_cltype: Ident.t -> class_type_declaration -> t -> t diff --git a/typing/envaux.ml b/typing/envaux.ml index 876c1a0f60..912ea24030 100644 --- a/typing/envaux.ml +++ b/typing/envaux.ml @@ -83,6 +83,12 @@ let rec env_from_summary sum subst = Env.add_module_declaration id (Subst.module_declaration subst desc) ~arg:true (env_from_summary s subst) | Env_functor_arg _ -> assert false + + | Env_implicit_arg(Env_implicit(s, id, desc), id') when Ident.same id id' -> + Env.add_implicit_declaration id ~arg:true + (Subst.implicit_declaration subst desc) + (env_from_summary s subst) + | Env_implicit_arg _ -> assert false in Hashtbl.add env_cache (sum, subst) env; env diff --git a/typing/typecore.ml b/typing/typecore.ml index 5ddde45268..9b26db50d0 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1887,16 +1887,12 @@ and type_expect_ ?in_function env sexp ty_expected = in type_expect ?in_function env sfun ty_expected (* TODO: keep attributes, call type_function directly *) - | Pexp_fun (Parr_implicit s, None, spat, sexp) -> - let id = Ident.create s in - type_function ?in_function loc sexp.pexp_attributes env ty_expected - (Tarr_implicit id) [{pc_lhs=spat; pc_guard=None; pc_rhs=sexp}] - | Pexp_fun (l, None, spat, sexp) -> - type_function ?in_function loc sexp.pexp_attributes env ty_expected - (tarr_of_parr l) [{pc_lhs=spat; pc_guard=None; pc_rhs=sexp}] + | Pexp_fun (arr, None, spat, sexp) -> + type_function ?in_function loc sexp.pexp_attributes env + arr ty_expected [{pc_lhs=spat; pc_guard=None; pc_rhs=sexp}] | Pexp_function caselist -> - type_function ?in_function - loc sexp.pexp_attributes env ty_expected Tarr_simple caselist + type_function ?in_function loc sexp.pexp_attributes env + Parr_simple ty_expected caselist | Pexp_apply(sfunct, sargs) -> if sargs = [] then Syntaxerr.ill_formed_ast loc "Function application with no argument."; @@ -2727,25 +2723,29 @@ and type_expect_ ?in_function env sexp ty_expected = | Pexp_extension ext -> raise (Error_forward (Typetexp.error_of_extension ext)) -and type_function ?in_function loc attrs env ty_expected (l : Types.arrow_flag) caselist = +and type_function ?in_function loc attrs env arr ty_expected caselist = let (loc_fun, ty_fun) = match in_function with Some p -> p | None -> (loc, instance env ty_expected) in let separate = !Clflags.principal || Env.has_local_constraints env in + let arr = match arr with + | Parr_implicit s -> Tarr_implicit (Ident.create s) + | _ -> tarr_of_parr arr + in if separate then begin_def (); let (ty_arg, ty_res) = - try filter_arrow env (instance env ty_expected) l + try filter_arrow env (instance env ty_expected) arr with Unify _ -> match expand_head env ty_expected with {desc = Tarrow _} as ty -> - raise(Error(loc, env, Abstract_wrong_label(l, ty))) + raise(Error(loc, env, Abstract_wrong_label(arr, ty))) | _ -> raise(Error(loc_fun, env, Too_many_arguments (in_function <> None, ty_fun))) in let ty_arg, is_optional = - match l with + match arr with | Tarr_optional _ -> let tv = newvar() in begin @@ -2761,7 +2761,7 @@ and type_function ?in_function loc attrs env ty_expected (l : Types.arrow_flag) generalize_structure ty_res end; let cases, partial = - type_cases ~in_function:(loc_fun,ty_fun) env ty_arg ty_res + type_cases ~in_function:(loc_fun,ty_fun) ~arr env ty_arg ty_res true loc caselist in let not_function ty = let ls, tvar = list_labels env ty in @@ -2771,9 +2771,9 @@ and type_function ?in_function loc attrs env ty_expected (l : Types.arrow_flag) Location.prerr_warning (List.hd cases).c_lhs.pat_loc Warnings.Unerasable_optional_argument; re { - exp_desc = Texp_function(l,cases, partial); + exp_desc = Texp_function(arr,cases, partial); exp_loc = loc; exp_extra = []; - exp_type = instance env (newgenty (Tarrow(l, ty_arg, ty_res, Cok))); + exp_type = instance env (newgenty (Tarrow(arr, ty_arg, ty_res, Cok))); exp_attributes = attrs; exp_env = env } @@ -3484,7 +3484,7 @@ and type_statement env sexp = (* Typing of match cases *) -and type_cases ?in_function env ty_arg ty_res partial_flag loc caselist = +and type_cases ?in_function ?arr env ty_arg ty_res partial_flag loc caselist = (* ty_arg is _fully_ generalized *) let patterns = List.map (fun {pc_lhs=p} -> p) caselist in let erase_either = @@ -3576,8 +3576,8 @@ and type_cases ?in_function env ty_arg ty_res partial_flag loc caselist = end else if contains_gadt env pc_lhs then correct_levels ty_res else ty_res in -(* Format.printf "@[%i %i, ty_res' =@ %a@]@." lev (get_current_level()) - Printtyp.raw_type_expr ty_res'; *) + (* Format.printf "@[%i %i, ty_res' =@ %a@]@." lev (get_current_level()) + Printtyp.raw_type_expr ty_res'; *) let guard = match pc_guard with | None -> None @@ -3586,7 +3586,11 @@ and type_cases ?in_function env ty_arg ty_res partial_flag loc caselist = (type_expect ext_env (wrap_unpacks scond unpacks) Predef.type_bool) in - let exp = type_expect ?in_function ext_env sexp ty_res' in + let exp = match arr with + | Some (Tarr_implicit id) -> + type_implicit_arg id ?in_function ext_env sexp ty_res' + | _ -> type_expect ?in_function ext_env sexp ty_res' + in { c_lhs = pat; c_guard = guard; @@ -3617,6 +3621,41 @@ and type_cases ?in_function env ty_arg ty_res partial_flag loc caselist = end; cases, partial +and type_implicit_arg id ?in_function env sbody ty_res = + let ty = newvar() in + (* remember original level *) + begin_def (); + Ident.set_current_time ty.level; + let context = Typetexp.narrow () in + let name = Ident.name id in + let smodl = + let open Ast_helper in + Mod.unpack (Exp.ident (mknoloc (Longident.Lident name))) + in + let modl = !type_module env smodl in + let new_env = Env.add_implicit ~arg:true id ~arity:0 modl.mod_type env in + Ctype.init_def(Ident.current_time()); + Typetexp.widen context; + let body = type_expect ?in_function new_env sbody ty_res in + (* go back to original level *) + end_def (); + (* Unification of body.exp_type with the fresh variable ty + fails if and only if the prefix condition is violated, + i.e. if generative types rooted at id show up in the + type body.exp_type. Thus, this unification enforces the + scoping condition on "let module". *) + begin try + Ctype.unify_var new_env ty body.exp_type + with Unify _ -> + raise(Error(sbody.pexp_loc, env, Scoping_let_implicit(name, body.exp_type))) + end; + re { + exp_desc = Texp_letmodule(id, mknoloc name, modl, body); + exp_loc = sbody.pexp_loc; exp_extra = []; + exp_type = ty; + exp_attributes = sbody.pexp_attributes; + exp_env = env } + (* Typing of let bindings *) and type_let ?(check = fun s -> Warnings.Unused_var s) From 6ce36da600709753958514ea3716bc76dbfe1d40 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 16 Apr 2014 14:46:07 +0100 Subject: [PATCH 329/494] Turn arguments in application into a type on its own Make expression mutable: implicit will fill the expression during resolution. --- bytecomp/translcore.ml | 15 +++++++---- bytecomp/translcore.mli | 2 +- typing/env.ml | 9 ++++++- typing/env.mli | 2 ++ typing/printtyped.ml | 10 ++++---- typing/typeclass.ml | 5 +++- typing/typecore.ml | 57 ++++++++++++++++++++++++++--------------- typing/typedtree.ml | 11 ++++++-- typing/typedtree.mli | 11 ++++++-- typing/typedtreeIter.ml | 19 ++++++-------- typing/typedtreeMap.ml | 18 +++++-------- 11 files changed, 100 insertions(+), 59 deletions(-) diff --git a/bytecomp/translcore.ml b/bytecomp/translcore.ml index 218602b447..bc9607c57d 100644 --- a/bytecomp/translcore.ml +++ b/bytecomp/translcore.ml @@ -672,7 +672,7 @@ and transl_exp0 e = | Texp_apply({exp_desc = Texp_ident(path, _, {val_kind = Val_prim p})}, oargs) when List.length oargs >= p.prim_arity - && List.for_all (fun (_, arg) -> arg <> None) oargs -> + && List.for_all (fun arg -> arg.arg_expression <> None) oargs -> let args, args' = cut p.prim_arity oargs in let wrap f = if args' = [] @@ -682,7 +682,12 @@ and transl_exp0 e = let wrap0 f = if args' = [] then f else wrap f in let args = - List.map (function _, Some x -> x | _ -> assert false) args in + let prj = function + | {arg_expression = Some x} -> x + | _ -> assert false + in + List.map prj args + in let argl = transl_list args in let public_send = p.prim_name = "%send" || not !Clflags.native_code && p.prim_name = "%sendcache"in @@ -1002,9 +1007,9 @@ and transl_apply lam sargs loc = | [] -> lapply lam (List.rev_map fst args) in - let prepare_arg (l,x) = - may_map transl_exp x, - match l with + let prepare_arg arg = + may_map transl_exp arg.arg_expression, + match arg.arg_flag with | Tapp_optional _ -> true | _ -> false in diff --git a/bytecomp/translcore.mli b/bytecomp/translcore.mli index 8a37988d66..fbb4775648 100644 --- a/bytecomp/translcore.mli +++ b/bytecomp/translcore.mli @@ -18,7 +18,7 @@ open Typedtree open Lambda val transl_exp: expression -> lambda -val transl_apply: lambda -> (Types.apply_flag * expression option) list +val transl_apply: lambda -> argument list -> Location.t -> lambda val transl_let: rec_flag -> value_binding list -> lambda -> lambda val transl_primitive: Location.t -> Primitive.description -> lambda diff --git a/typing/env.ml b/typing/env.ml index 3016e6bcf0..9b73ad5c49 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -186,6 +186,7 @@ type t = { cltypes: (Path.t * class_type_declaration) EnvTbl.t; functor_args: unit Ident.tbl; implicit_args: unit Ident.tbl; + implicit_instances: (Path.t * implicit_declaration) list; summary: summary; local_constraints: bool; gadt_instances: (int * TypeSet.t ref) list; @@ -235,6 +236,7 @@ let empty = { flags = 0; functor_args = Ident.empty; implicit_args = Ident.empty; + implicit_instances = []; } let in_signature env = @@ -650,6 +652,9 @@ let rec is_implicit_arg path env = end | Pdot (p, s, _) -> is_implicit_arg p env | Papply _ -> true + +let implicit_instances env = env.implicit_instances + (* Lookup by name *) exception Recmodule @@ -1481,7 +1486,9 @@ and store_implicit slot id path imd env renv = EnvTbl.add "module" slot id (path, components_of_module env Subst.identity path md.md_type) env.components renv.components; - summary = Env_implicit(env.summary, id, imd) } + summary = Env_implicit(env.summary, id, imd); + implicit_instances = (path, imd) :: env.implicit_instances; + } and store_modtype slot id path info env renv = diff --git a/typing/env.mli b/typing/env.mli index c4202572f4..d197f1d894 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -82,6 +82,8 @@ val gadt_instance_level: t -> type_expr -> int option val add_gadt_instances: t -> int -> type_expr list -> unit val add_gadt_instance_chain: t -> int -> type_expr -> unit +val implicit_instances: t -> (Path.t * implicit_declaration) list + (* Lookup by long identifiers *) val lookup_value: Longident.t -> t -> Path.t * value_description diff --git a/typing/printtyped.ml b/typing/printtyped.ml index d42fa1ec80..e704bed72f 100644 --- a/typing/printtyped.ml +++ b/typing/printtyped.ml @@ -304,7 +304,7 @@ and expression i ppf x = | Texp_apply (e, l) -> line i ppf "Pexp_apply\n"; expression i ppf e; - list i label_x_expression ppf l; + list i argument ppf l; | Texp_match (e, l1, l2, partial) -> line i ppf "Pexp_match\n"; expression i ppf e; @@ -541,7 +541,7 @@ and class_expr i ppf x = | Tcl_apply (ce, l) -> line i ppf "Pcl_apply\n"; class_expr i ppf ce; - list i label_x_expression ppf l; + list i argument ppf l; | Tcl_let (rf, l1, l2, ce) -> line i ppf "Pcl_let %a\n" fmt_rec_flag rf; list i value_binding ppf l1; @@ -842,9 +842,9 @@ and longident_x_expression i ppf (li, _, e) = line i ppf "%a\n" fmt_longident li; expression (i+1) ppf e; -and label_x_expression i ppf (l, e) = - line i ppf "<label> \"%a\"\n" apply_flag l; - (match e with None -> () | Some e -> expression (i+1) ppf e) +and argument i ppf { arg_flag; arg_expression } = + line i ppf "<label> \"%a\"\n" apply_flag arg_flag; + Misc.may (expression (i+1) ppf) arg_expression and ident_x_loc_x_expression_def i ppf (l,_, e) = line i ppf "<def> \"%a\"\n" fmt_ident l; diff --git a/typing/typeclass.ml b/typing/typeclass.ml index 23393348b4..0a503d3ea0 100644 --- a/typing/typeclass.ml +++ b/typing/typeclass.ml @@ -55,6 +55,9 @@ open Typedtree let ctyp desc typ env loc = { ctyp_desc = desc; ctyp_type = typ; ctyp_loc = loc; ctyp_env = env; ctyp_attributes = [] } +let make_argument (f,e) = + {arg_flag = f; arg_expression = e} + (**********************) (* Useful constants *) (**********************) @@ -1079,7 +1082,7 @@ and class_expr cl_num val_env met_env scl = else type_args [] [] cl.cl_type ty_fun0 sargs [] in - rc {cl_desc = Tcl_apply (cl, args); + rc {cl_desc = Tcl_apply (cl, List.map make_argument args); cl_loc = scl.pcl_loc; cl_type = cty; cl_env = val_env; diff --git a/typing/typecore.ml b/typing/typecore.ml index 9b26db50d0..3e3a737a34 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -114,6 +114,9 @@ let rp node = let case lhs rhs = {c_lhs = lhs; c_guard = None; c_rhs = rhs} +let make_argument (f,e) = + {arg_flag = f; arg_expression = e} + (* Upper approximation of free identifiers on the parse tree *) let iter_expression f e = @@ -1390,8 +1393,8 @@ let rec is_nonexpansive exp = List.for_all (fun vb -> is_nonexpansive vb.vb_expr) pat_exp_list && is_nonexpansive body | Texp_function _ -> true - | Texp_apply(e, (_,None)::el) -> - is_nonexpansive e && List.for_all is_nonexpansive_opt (List.map snd3 el) + | Texp_apply(e, {arg_expression = None} :: el) -> + is_nonexpansive e && List.for_all is_nonexpansive_opt (List.map (fun x -> x.arg_expression) el) | Texp_match(e, cases, [], _) -> is_nonexpansive e && List.for_all @@ -2365,22 +2368,26 @@ and type_expect_ ?in_function env sexp ty_expected = unify env obj_ty desc.val_type; unify env res_ty (instance env typ); let exp = - Texp_apply({exp_desc = - Texp_ident(Path.Pident method_id, lid, - {val_type = method_type; - val_kind = Val_reg; - val_attributes = []; - Types.val_loc = Location.none}); - exp_loc = loc; exp_extra = []; - exp_type = method_type; - exp_attributes = []; (* check *) - exp_env = env}, - [Tapp_simple, - Some {exp_desc = Texp_ident(path, lid, desc); + Texp_apply( + {exp_desc = + Texp_ident(Path.Pident method_id, lid, + {val_type = method_type; + val_kind = Val_reg; + val_attributes = []; + Types.val_loc = Location.none}); + exp_loc = loc; exp_extra = []; + exp_type = method_type; + exp_attributes = []; (* check *) + exp_env = env}, + [{ arg_flag = Tapp_simple; + arg_expression = + Some { exp_desc = Texp_ident(path, lid, desc); exp_loc = obj.exp_loc; exp_extra = []; exp_type = desc.val_type; exp_attributes = []; (* check *) - exp_env = env}]) + exp_env = env }; + }] + ) in (Tmeth_name met, Some (re {exp_desc = exp; exp_loc = loc; exp_extra = []; @@ -3158,8 +3165,9 @@ and type_argument env sarg ty_expected' ty_expected = let eta_pat, eta_var = var_pair "eta" ty_arg in let func texp = let e = - {texp with exp_type = ty_res; exp_desc = - Texp_apply (texp, args @ [Tapp_simple, Some eta_var])} + let args = (Tapp_simple, Some eta_var) :: args in + let args = List.map make_argument args in + {texp with exp_type = ty_res; exp_desc = Texp_apply (texp,args)} in { texp with exp_type = ty_fun; exp_desc = Texp_function(Tarr_simple, [case eta_pat e], Total) } @@ -3210,8 +3218,17 @@ and type_application env funct (sargs : (Parsetree.apply_flag * Parsetree.expres omitted ty_fun = function [] -> (List.map - (function l, None -> l, None - | l, Some f -> l, Some (f ())) + (fun (flag,expr) -> + begin match flag, expr with + | Tapp_implicit, None -> + prerr_endline "uninstanciated implicit"; + | _ -> () + end; + let expr = match expr with + | None -> None + | Some f -> Some (f ()) + in + make_argument (flag,expr)) (List.rev typed), instance env (result_type omitted ty_fun)) | (app1, sarg1) :: sargl -> @@ -3391,7 +3408,7 @@ and type_application env funct (sargs : (Parsetree.apply_flag * Parsetree.expres add_delayed_check (fun () -> check_application_result env false exp) | _ -> () end; - ([Tapp_simple, Some exp], ty_res) + ([{arg_flag = Tapp_simple; arg_expression = Some exp}], ty_res) | _ -> let ty = funct.exp_type in if ignore_labels then diff --git a/typing/typedtree.ml b/typing/typedtree.ml index dfdc619e24..45fb6a29a0 100644 --- a/typing/typedtree.ml +++ b/typing/typedtree.ml @@ -75,7 +75,7 @@ and expression_desc = | Texp_constant of constant | Texp_let of rec_flag * value_binding list * expression | Texp_function of arrow_flag * case list * partial - | Texp_apply of expression * (apply_flag * expression option) list + | Texp_apply of expression * argument list | Texp_match of expression * case list * case list * partial | Texp_try of expression * case list | Texp_tuple of expression list @@ -107,6 +107,13 @@ and expression_desc = | Texp_object of class_structure * string list | Texp_pack of module_expr +and argument = + { + arg_flag: apply_flag; + (* Made mutable to defer implicit instance selection *) + mutable arg_expression: expression option; + } + and meth = Tmeth_name of string | Tmeth_val of Ident.t @@ -134,7 +141,7 @@ and class_expr_desc = | Tcl_structure of class_structure | Tcl_fun of arrow_flag * pattern * (Ident.t * string loc * expression) list * class_expr * partial - | Tcl_apply of class_expr * (apply_flag * expression option) list + | Tcl_apply of class_expr * argument list | Tcl_let of rec_flag * value_binding list * (Ident.t * string loc * expression) list * class_expr | Tcl_constraint of diff --git a/typing/typedtree.mli b/typing/typedtree.mli index 7e8e234ee6..67bb54ed3f 100644 --- a/typing/typedtree.mli +++ b/typing/typedtree.mli @@ -74,7 +74,7 @@ and expression_desc = | Texp_constant of constant | Texp_let of rec_flag * value_binding list * expression | Texp_function of arrow_flag * case list * partial - | Texp_apply of expression * (apply_flag * expression option) list + | Texp_apply of expression * argument list | Texp_match of expression * case list * case list * partial | Texp_try of expression * case list | Texp_tuple of expression list @@ -106,6 +106,13 @@ and expression_desc = | Texp_object of class_structure * string list | Texp_pack of module_expr +and argument = + { + arg_flag: apply_flag; + (* Made mutable to defer implicit instance selection *) + mutable arg_expression: expression option; + } + and meth = Tmeth_name of string | Tmeth_val of Ident.t @@ -133,7 +140,7 @@ and class_expr_desc = | Tcl_structure of class_structure | Tcl_fun of arrow_flag * pattern * (Ident.t * string loc * expression) list * class_expr * partial - | Tcl_apply of class_expr * (apply_flag * expression option) list + | Tcl_apply of class_expr * argument list | Tcl_let of rec_flag * value_binding list * (Ident.t * string loc * expression) list * class_expr | Tcl_constraint of diff --git a/typing/typedtreeIter.ml b/typing/typedtreeIter.ml index 965e1ade4a..ae10d49d8a 100644 --- a/typing/typedtreeIter.ml +++ b/typing/typedtreeIter.ml @@ -275,13 +275,9 @@ module MakeIterator(Iter : IteratorArgument) : sig iter_expression exp | Texp_function (label, cases, _) -> iter_cases cases - | Texp_apply (exp, list) -> + | Texp_apply (exp, args) -> iter_expression exp; - List.iter (fun (label, expo) -> - match expo with - None -> () - | Some exp -> iter_expression exp - ) list + List.iter iter_argument args | Texp_match (exp, list1, list2, _) -> iter_expression exp; iter_cases list1; @@ -358,6 +354,11 @@ module MakeIterator(Iter : IteratorArgument) : sig end; Iter.leave_expression exp; + and iter_argument arg = + match arg.arg_expression with + None -> () + | Some exp -> iter_expression exp + and iter_package_type pack = Iter.enter_package_type pack; List.iter (fun (s, ct) -> iter_core_type ct) pack.pack_fields; @@ -492,11 +493,7 @@ module MakeIterator(Iter : IteratorArgument) : sig | Tcl_apply (cl, args) -> iter_class_expr cl; - List.iter (fun (label, expo) -> - match expo with - None -> () - | Some exp -> iter_expression exp - ) args + List.iter iter_argument args | Tcl_let (rec_flat, bindings, ivars, cl) -> iter_bindings rec_flat bindings; diff --git a/typing/typedtreeMap.ml b/typing/typedtreeMap.ml index 5924c343fe..4a33016a6e 100644 --- a/typing/typedtreeMap.ml +++ b/typing/typedtreeMap.ml @@ -268,14 +268,7 @@ module MakeMap(Map : MapArgument) = struct Texp_function (label, map_cases cases, partial) | Texp_apply (exp, list) -> Texp_apply (map_expression exp, - List.map (fun (label, expo) -> - let expo = - match expo with - None -> expo - | Some exp -> Some (map_expression exp) - in - (label, expo) - ) list ) + List.map map_argument list ) | Texp_match (exp, list1, list2, partial) -> Texp_match ( map_expression exp, @@ -378,6 +371,11 @@ module MakeMap(Map : MapArgument) = struct exp_desc = exp_desc; exp_extra = exp_extra; } + and map_argument = function + | {arg_expression = None; _} as arg -> arg + | {arg_flag; arg_expression = Some exp} -> + {arg_flag; arg_expression = Some (map_expression exp)} + and map_exp_extra ((desc, loc, attrs) as exp_extra) = match desc with | Texp_constraint ct -> @@ -537,9 +535,7 @@ module MakeMap(Map : MapArgument) = struct | Tcl_apply (cl, args) -> Tcl_apply (map_class_expr cl, - List.map (fun (label, expo) -> - (label, may_map map_expression expo) - ) args) + List.map map_argument args) | Tcl_let (rec_flat, bindings, ivars, cl) -> Tcl_let (rec_flat, map_bindings rec_flat bindings, List.map (fun (id, name, exp) -> From 0611476a5916de6c08f4821647d63479995daf42 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 18 Apr 2014 14:23:25 +0100 Subject: [PATCH 330/494] Substitute implicit types on application. WIP: should just introduce type variables and gather constraints. --- typing/typecore.ml | 57 ++++++++++++++++++++++++++++++++------------- typing/typecore.mli | 1 + 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/typing/typecore.ml b/typing/typecore.ml index 3e3a737a34..1fc7c8efab 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1920,6 +1920,36 @@ and type_expect_ ?in_function env sexp ty_expected = wrap_trace_gadt_instances env (lower_args []) ty; begin_def (); let (args, ty_res) = type_application env funct sargs in + (* Gather implicit modules *) + let subst = + List.fold_left (fun subst (arr,expo) -> + match arr, expo with + (* Uninstantiated implicit: keep them in a list in order to find + an instance later *) + (*| Tarr_implicit id, None -> (*FIXME*)*) + (* Instantiated ones: substitute the type path with the instance *) + | Tarr_implicit id, Some expr -> + (* An implicit instance always have to be a path to a module in + scope *) + let rec mod_path me = match me.mod_desc with + | Tmod_ident (path,_) -> path + | Tmod_constraint (me,_,_,_) -> + mod_path me + | _ -> assert false + in + let path = match expr.exp_desc with + | Texp_pack me -> mod_path me + | _ -> assert false + in + Subst.add_module id path subst + | _ -> subst + ) Subst.identity args + in + let args = List.map + (fun (arr,expo) -> make_argument (tapp_of_tarr arr, expo)) + args + in + let ty_res = Subst.type_expr subst ty_res in end_def (); unify_var env (newvar()) funct.exp_type; rue { @@ -3214,21 +3244,11 @@ and type_application env funct (sargs : (Parsetree.apply_flag * Parsetree.expres ty_fun: type of the function applied *) let rec type_unknown_args - (typed : (Types.apply_flag * (unit -> Typedtree.expression) option) list) + (typed : (Types.arrow_flag * (unit -> Typedtree.expression) option) list) omitted ty_fun = function [] -> (List.map - (fun (flag,expr) -> - begin match flag, expr with - | Tapp_implicit, None -> - prerr_endline "uninstanciated implicit"; - | _ -> () - end; - let expr = match expr with - | None -> None - | Some f -> Some (f ()) - in - make_argument (flag,expr)) + (fun (flag,expr) -> flag, may_map ((|>) ()) expr) (List.rev typed), instance env (result_type omitted ty_fun)) | (app1, sarg1) :: sargl -> @@ -3267,13 +3287,18 @@ and type_application env funct (sargs : (Parsetree.apply_flag * Parsetree.expres raise(Error(funct.exp_loc, env, Apply_non_function (expand_head env funct.exp_type))) in + let arr1 = tarr_of_tapp app1 in let arg1 () = let arg1 = type_expect env sarg1 ty1 in - if (match app1 with Tapp_optional _ -> true | _ -> false) then + let is_optional = match app1 with + | Tapp_optional _ -> true + | _ -> false + in + if is_optional then unify_exp env arg1 (type_option(newvar())); arg1 in - type_unknown_args ((app1, Some arg1) :: typed) omitted ty2 sargl + type_unknown_args ((arr1, Some arg1) :: typed) omitted ty2 sargl in let ignore_labels = !Clflags.classic || @@ -3384,7 +3409,7 @@ and type_application env funct (sargs : (Parsetree.apply_flag * Parsetree.expres let omitted = if arg = None then (arr,ty,lv) :: omitted else omitted in let ty_old = if sargs = [] then ty_fun else ty_old in - type_args ((tapp_of_tarr arr,arg)::typed) omitted ty_fun ty_fun0 + type_args ((arr,arg)::typed) omitted ty_fun ty_fun0 ty_old sargs more_sargs | _ -> match sargs with @@ -3408,7 +3433,7 @@ and type_application env funct (sargs : (Parsetree.apply_flag * Parsetree.expres add_delayed_check (fun () -> check_application_result env false exp) | _ -> () end; - ([{arg_flag = Tapp_simple; arg_expression = Some exp}], ty_res) + ([Tarr_simple, Some exp], ty_res) | _ -> let ty = funct.exp_type in if ignore_labels then diff --git a/typing/typecore.mli b/typing/typecore.mli index 9071b4e02a..3bc4ff990c 100644 --- a/typing/typecore.mli +++ b/typing/typecore.mli @@ -137,3 +137,4 @@ val type_package: val create_package_type : Location.t -> Env.t -> Longident.t * (Longident.t * Parsetree.core_type) list -> Path.t * (Longident.t * Typedtree.core_type) list * Types.type_expr + From 5082599e5da43ddde46e7c3ff839d7e978be5e61 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 18 Apr 2014 16:39:55 +0100 Subject: [PATCH 331/494] Add function to instantiate implicit --- typing/typecore.ml | 126 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 113 insertions(+), 13 deletions(-) diff --git a/typing/typecore.ml b/typing/typecore.ml index 1fc7c8efab..c1c6dc5b2c 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1539,6 +1539,24 @@ let rec type_approx env sexp = ty2 | _ -> newvar () +(* Produce the result type of an application: not all arguments may have been + applied, so prepend the result type [ty_res] with omitted argument types. + Given: + val f : ~a:int -> int -> ~c:int -> int + Typing: + f ~c:5 + Result in the following application: + Texp_apply (`f`, [("a",None); ("",None); ("c",Some `5`)]) + with the following type: + application_result_type [("",int); ("a",int)] int = + ~a:int -> int -> int +*) + +let application_result_type omitted ty_res = + List.fold_left + (fun ty_fun (arr,ty,lv) -> newty2 lv (Tarrow(arr,ty,ty_fun,Cok))) + ty_res omitted + (* List labels in a function type, and whether return type is a variable *) let rec list_labels_aux env visited ls ty_fun = let ty = expand_head env ty_fun in @@ -1723,6 +1741,86 @@ let duplicate_ident_types loc caselist env = with Not_found -> env) env idents +(* Instantiate implicits in a function type + + Given a type expression, find all path refering to an implicit module. + 1. Find any implicit bindings: if none, return the original type. + 2. Generate fresh idents for all implicit bindings, substitute idents in the + type. + 3. Replace all type constructors referring to an implicit module + by a fresh type variable and remember the (constr, var) constraint + association. + + (*If a typed expression is a function containing implicit arguments, + this produces a new expression corresponding to the function with all + implicits instantiated together with the hole to be filled with actual + instances and a set of constraints to be satisfied.*) +*) + +let instantiate_implicits ty = + let rec has_implicit ty = match ty.desc with + | Tarrow (Tarr_implicit id,_,_,_) -> true + | Tarrow (_,_,rhs,_) -> has_implicit ty + | _ -> false + in + if not (has_implicit ty) then Ident.empty, ty + else + let rec extract_implicits ty = match ty.desc with + | Tarrow (Tarr_implicit id, lhs, rhs, comm) -> + let id' = Ident.rename id in + let idents, subst, rhs' = extract_implicits rhs in + Ident.add id' () idents, + Subst.add_implicit id (Path.Pident id') subst, + {ty with desc = Tarrow (Tarr_implicit id', lhs, rhs', comm)} + | Tarrow (arr, lhs, rhs, comm) -> + let idents, subst, rhs' = extract_implicits rhs in + idents, subst, + {ty with desc = Tarrow (arr, lhs, rhs', comm)} + | _ -> Ident.empty, Subst.identity, ty + in + let idents, subst, ty = extract_implicits ty in + let ty = Subst.type_expr subst ty in + (* Set of constraints : maintain a table mapping implicit binding + identifier to a list of type variable pairs. + An implicit instance is correct only iff, in an environment where the + ident is bound to the instance, all pairs in the list unify. + *) + let constraints = ref Ident.empty in + let add_constraint path ty ty' = + let id = Path.head path in + let l = + try Ident.find_same id !constraints + with Not_found -> [] + in + constraints := Ident.add id ((ty,ty') :: l) !constraints + in + let rec unlink_constructors ty = + (* First recurse in sub expressions *) + iter_type_expr unlink_constructors ty; + (* Then replace current type if it is a constructor referring to an + implicit *) + match ty.desc with + | Tconstr (path,_,_) when + try Ident.find_same (Path.head path) idents; true + with Not_found -> false + -> + (* Fresh variable *) + let ty' = newvar() in + (* Swap the content of ty and ty' … *) + let {desc = desc; level = lv; id = id} = ty in + let {desc = desc'; level = lv'; id = id'} = ty' in + ty.desc <- desc'; + ty.level <- lv'; + ty.id <- id'; + ty'.desc <- desc; + ty'.level <- lv; + ty'.id <- id; + add_constraint path ty ty' + | _ -> () + in + unlink_constructors ty; + !constraints, ty + (* Typing of expressions *) let unify_exp env exp expected_ty = @@ -1919,6 +2017,8 @@ and type_expect_ ?in_function env sexp ty_expected = end_def (); wrap_trace_gadt_instances env (lower_args []) ty; begin_def (); + let constraints, funct_ty = instantiate_implicits funct.exp_type in + let funct = {funct with exp_type = funct_ty} in let (args, ty_res) = type_application env funct sargs in (* Gather implicit modules *) let subst = @@ -3224,11 +3324,6 @@ and type_argument env sarg ty_expected' ty_expected = and type_application env funct (sargs : (Parsetree.apply_flag * Parsetree.expression) list) = (* funct.exp_type may be generic *) let sargs = List.map (fun (app,e) -> tapp_of_papp app, e) sargs in - let result_type omitted ty_fun = - List.fold_left - (fun ty_fun (l,ty,lv) -> newty2 lv (Tarrow(l,ty,ty_fun,Cok))) - ty_fun omitted - in let has_label l ty_fun = let ls, tvar = list_labels env ty_fun in tvar || List.mem l ls @@ -3250,7 +3345,7 @@ and type_application env funct (sargs : (Parsetree.apply_flag * Parsetree.expres (List.map (fun (flag,expr) -> flag, may_map ((|>) ()) expr) (List.rev typed), - instance env (result_type omitted ty_fun)) + instance env (application_result_type omitted ty_fun)) | (app1, sarg1) :: sargl -> let (ty1, ty2) = let ty_fun = expand_head env ty_fun in @@ -3274,7 +3369,7 @@ and type_application env funct (sargs : (Parsetree.apply_flag * Parsetree.expres | td -> let ty_fun = match td with Tarrow _ -> newty td | _ -> ty_fun in - let ty_res = result_type (omitted @ !ignored) ty_fun in + let ty_res = application_result_type (omitted @ !ignored) ty_fun in let arr1 = tarr_of_tapp app1 in match ty_res.desc with Tarrow _ -> @@ -3406,8 +3501,14 @@ and type_application env funct (sargs : (Parsetree.apply_flag * Parsetree.expres in sargs, more_sargs, f in - let omitted = - if arg = None then (arr,ty,lv) :: omitted else omitted in + let omitted = match arr, arg with + (* Applied arguments don't affect omitted list *) + | _, Some _ -> omitted + (* Undefined implicit arguments will be instantiated later *) + | Tarr_implicit _, None -> omitted + (* Other undefined arguments are remembered as omitted *) + | _, None -> (arr,ty,lv) :: omitted + in let ty_old = if sargs = [] then ty_fun else ty_old in type_args ((arr,arg)::typed) omitted ty_fun ty_fun0 ty_old sargs more_sargs @@ -3623,10 +3724,9 @@ and type_cases ?in_function ?arr env ty_arg ty_res partial_flag loc caselist = let guard = match pc_guard with | None -> None - | Some scond -> - Some - (type_expect ext_env (wrap_unpacks scond unpacks) - Predef.type_bool) + | Some scond -> Some (type_expect ext_env + (wrap_unpacks scond unpacks) + Predef.type_bool) in let exp = match arr with | Some (Tarr_implicit id) -> From 42a6e7111579cc1e13bfb6dc6c942e46d4943ec7 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 18 Apr 2014 18:32:28 +0100 Subject: [PATCH 332/494] Fix tools, bootstrap --- ocamldoc/odoc_ast.ml | 4 ++-- tools/depend.ml | 4 ---- tools/tast_iter.ml | 4 ++-- tools/untypeast.ml | 18 ++++++++---------- typing/typecore.ml | 6 ++++-- 5 files changed, 16 insertions(+), 20 deletions(-) diff --git a/ocamldoc/odoc_ast.ml b/ocamldoc/odoc_ast.ml index 368d22eecb..a0d0a52195 100644 --- a/ocamldoc/odoc_ast.ml +++ b/ocamldoc/odoc_ast.ml @@ -799,8 +799,8 @@ module Analyser = Odoc_messages.object_end in let param_exps = List.fold_left - (fun acc -> fun (_, exp_opt) -> - match exp_opt with + (fun acc arg -> + match arg.arg_expression with None -> acc | Some e -> acc @ [e]) [] diff --git a/tools/depend.ml b/tools/depend.ml index 7b80d04c6e..c55c846e1a 100644 --- a/tools/depend.ml +++ b/tools/depend.ml @@ -136,11 +136,7 @@ let rec add_pattern bv pat = | Ppat_type li -> add bv li | Ppat_lazy p -> add_pattern bv p | Ppat_unpack id -> pattern_bv := StringSet.add id.txt !pattern_bv -<<<<<<< HEAD | Ppat_exception p -> add_pattern bv p -======= - | Ppat_implicit id -> pattern_bv := StringSet.add id.txt !pattern_bv ->>>>>>> Introduce "implicit" keyword and constructions in parser | Ppat_extension _ -> () let add_pattern bv pat = diff --git a/tools/tast_iter.ml b/tools/tast_iter.ml index 801cf37953..d92767dfee 100644 --- a/tools/tast_iter.ml +++ b/tools/tast_iter.ml @@ -113,7 +113,7 @@ let expression sub exp = sub # cases cases | Texp_apply (exp, list) -> sub # expression exp; - List.iter (fun (_, expo) -> opt (sub # expression) expo) list + List.iter (fun arg -> opt (sub # expression) arg.arg_expression) list | Texp_match (exp, cases, exn_cases, _) -> sub # expression exp; sub # cases cases; @@ -265,7 +265,7 @@ let class_expr sub cexpr = sub # class_expr cl | Tcl_apply (cl, args) -> sub # class_expr cl; - List.iter (fun (_label, expo) -> opt (sub # expression) expo) args + List.iter (fun arg -> opt (sub # expression) arg.arg_expression) args | Tcl_let (rec_flat, bindings, ivars, cl) -> sub # bindings (rec_flat, bindings); List.iter (fun (_id, _, exp) -> sub # expression exp) ivars; diff --git a/tools/untypeast.ml b/tools/untypeast.ml index 03bef315ad..b8d24c2f9b 100644 --- a/tools/untypeast.ml +++ b/tools/untypeast.ml @@ -288,11 +288,7 @@ and untype_expression exp = assert false | Texp_apply (exp, list) -> Pexp_apply (untype_expression exp, - List.fold_right (fun (label, expo) list -> - match expo with - None -> list - | Some exp -> (untype_apply_flag label, untype_expression exp) :: list - ) list []) + List.fold_right untype_argument list []) | Texp_match (exp, cases, exn_cases, _) -> let merged_cases = untype_cases cases @ List.map @@ -374,6 +370,12 @@ and untype_expression exp = List.fold_right untype_extra exp.exp_extra (Exp.mk ~loc:exp.exp_loc ~attrs:exp.exp_attributes desc) +and untype_argument arg list = + match arg.arg_expression with + None -> list + | Some exp -> (untype_apply_flag arg.arg_flag, + untype_expression exp) :: list + and untype_package_type pack = (pack.pack_txt, List.map (fun (s, ct) -> @@ -530,11 +532,7 @@ and untype_class_expr cexpr = | Tcl_apply (cl, args) -> Pcl_apply (untype_class_expr cl, - List.fold_right (fun (label, expo) list -> - match expo with - None -> list - | Some exp -> (untype_apply_flag label, untype_expression exp) :: list - ) args []) + List.fold_right untype_argument args []) | Tcl_let (rec_flat, bindings, _ivars, cl) -> Pcl_let (rec_flat, diff --git a/typing/typecore.ml b/typing/typecore.ml index c1c6dc5b2c..f3ff4c2031 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1760,7 +1760,7 @@ let duplicate_ident_types loc caselist env = let instantiate_implicits ty = let rec has_implicit ty = match ty.desc with | Tarrow (Tarr_implicit id,_,_,_) -> true - | Tarrow (_,_,rhs,_) -> has_implicit ty + | Tarrow (_,_,rhs,_) -> has_implicit rhs | _ -> false in if not (has_implicit ty) then Ident.empty, ty @@ -3791,8 +3791,10 @@ and type_implicit_arg id ?in_function env sbody ty_res = with Unify _ -> raise(Error(sbody.pexp_loc, env, Scoping_let_implicit(name, body.exp_type))) end; + let mb = { mb_id = id; mb_name = mknoloc name; mb_expr = modl; + mb_attributes = []; mb_loc = sbody.pexp_loc } in re { - exp_desc = Texp_letmodule(id, mknoloc name, modl, body); + exp_desc = Texp_letmodule(mb, body); exp_loc = sbody.pexp_loc; exp_extra = []; exp_type = ty; exp_attributes = sbody.pexp_attributes; From 1c55212ef14a002931ffcb52a39d95b486a582b3 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Tue, 22 Apr 2014 11:20:42 +0100 Subject: [PATCH 333/494] Keep track of pending implicit instances --- typing/typecore.ml | 163 ++++++++++++++++++++++++++++----------------- 1 file changed, 103 insertions(+), 60 deletions(-) diff --git a/typing/typecore.ml b/typing/typecore.ml index f3ff4c2031..fed0a709c1 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1757,7 +1757,20 @@ let duplicate_ident_types loc caselist env = instances and a set of constraints to be satisfied.*) *) -let instantiate_implicits ty = +type pending_implicit = { + implicit_id: Ident.t; + implicit_env: Env.t; + implicit_loc: Location.t; + implicit_type: Path.t * Longident.t list * type_expr list; + mutable implicit_constraints: (type_expr * type_expr) list; + implicit_argument: argument; +} + +let pending_implicits + : pending_implicit list ref + = ref [] + +let instantiate_implicits loc env ty = let rec has_implicit ty = match ty.desc with | Tarrow (Tarr_implicit id,_,_,_) -> true | Tarrow (_,_,rhs,_) -> has_implicit rhs @@ -1765,34 +1778,43 @@ let instantiate_implicits ty = in if not (has_implicit ty) then Ident.empty, ty else - let rec extract_implicits ty = match ty.desc with + let fresh_implicit id ty = + let ty = repr ty in + match ty.desc with + | Tpackage (p,nl,tl) -> { + implicit_id = id; + implicit_env = env; + implicit_loc = loc; + implicit_type = (p,nl,tl); + implicit_constraints = []; + implicit_argument = make_argument (Tapp_implicit, None); + } + | _ -> assert false + in + let rec extract_implicits ty = + let ty = repr ty in + match ty.desc with | Tarrow (Tarr_implicit id, lhs, rhs, comm) -> let id' = Ident.rename id in - let idents, subst, rhs' = extract_implicits rhs in - Ident.add id' () idents, + let instances, subst, rhs' = extract_implicits rhs in + Ident.add id' (fresh_implicit id' lhs) instances, Subst.add_implicit id (Path.Pident id') subst, {ty with desc = Tarrow (Tarr_implicit id', lhs, rhs', comm)} | Tarrow (arr, lhs, rhs, comm) -> - let idents, subst, rhs' = extract_implicits rhs in - idents, subst, + let instances, subst, rhs' = extract_implicits rhs in + instances, subst, {ty with desc = Tarrow (arr, lhs, rhs', comm)} | _ -> Ident.empty, Subst.identity, ty in - let idents, subst, ty = extract_implicits ty in + let instances, subst, ty = extract_implicits ty in let ty = Subst.type_expr subst ty in (* Set of constraints : maintain a table mapping implicit binding identifier to a list of type variable pairs. An implicit instance is correct only iff, in an environment where the ident is bound to the instance, all pairs in the list unify. *) - let constraints = ref Ident.empty in - let add_constraint path ty ty' = - let id = Path.head path in - let l = - try Ident.find_same id !constraints - with Not_found -> [] - in - constraints := Ident.add id ((ty,ty') :: l) !constraints + let add_constraint inst ty ty' = + inst.implicit_constraints <- (ty,ty') :: inst.implicit_constraints in let rec unlink_constructors ty = (* First recurse in sub expressions *) @@ -1800,26 +1822,52 @@ let instantiate_implicits ty = (* Then replace current type if it is a constructor referring to an implicit *) match ty.desc with - | Tconstr (path,_,_) when - try Ident.find_same (Path.head path) idents; true - with Not_found -> false - -> - (* Fresh variable *) - let ty' = newvar() in - (* Swap the content of ty and ty' … *) - let {desc = desc; level = lv; id = id} = ty in - let {desc = desc'; level = lv'; id = id'} = ty' in - ty.desc <- desc'; - ty.level <- lv'; - ty.id <- id'; - ty'.desc <- desc; - ty'.level <- lv; - ty'.id <- id; - add_constraint path ty ty' + | Tconstr (path,_,_) -> + begin try + let inst = Ident.find_same (Path.head path) instances in + (* Fresh variable *) + let ty' = newvar() in + (* Swap the content of ty and ty' … *) + let {desc = desc; level = lv; id = id} = ty in + let {desc = desc'; level = lv'; id = id'} = ty' in + ty.desc <- desc'; + ty.level <- lv'; + ty.id <- id'; + ty'.desc <- desc; + ty'.level <- lv; + ty'.id <- id; + add_constraint inst ty ty' + with Not_found -> () + end | _ -> () in unlink_constructors ty; - !constraints, ty + instances, ty + +let link_implicit inst expr = + (* An implicit instance always have to be a path to a module in scope *) + let rec mod_path me = match me.mod_desc with + | Tmod_ident (path,_) -> path + | Tmod_constraint (me,_,_,_) -> + mod_path me + | _ -> assert false + in + let path = match expr.exp_desc with + | Texp_pack me -> mod_path me + | _ -> assert false + in + (* FIXME Check subtype relation between expr and instance *) + (* FIXME Check that all constraints are satisfied *) + let subst = Subst.add_module inst.implicit_id path Subst.identity in + List.iter (fun (ty,ty') -> + let ty = Subst.type_expr subst ty in + let ty' = Subst.type_expr subst ty' in + unify_exp_types inst.implicit_loc inst.implicit_env ty ty' + ) + inst.implicit_constraints; + (* FIXME Update argument in Typedtree *) + inst.implicit_argument.arg_expression <- Some expr + (* Typing of expressions *) @@ -2017,39 +2065,34 @@ and type_expect_ ?in_function env sexp ty_expected = end_def (); wrap_trace_gadt_instances env (lower_args []) ty; begin_def (); - let constraints, funct_ty = instantiate_implicits funct.exp_type in + let implicits, funct_ty = instantiate_implicits loc env funct.exp_type in let funct = {funct with exp_type = funct_ty} in let (args, ty_res) = type_application env funct sargs in - (* Gather implicit modules *) - let subst = - List.fold_left (fun subst (arr,expo) -> - match arr, expo with - (* Uninstantiated implicit: keep them in a list in order to find - an instance later *) - (*| Tarr_implicit id, None -> (*FIXME*)*) - (* Instantiated ones: substitute the type path with the instance *) - | Tarr_implicit id, Some expr -> - (* An implicit instance always have to be a path to a module in - scope *) - let rec mod_path me = match me.mod_desc with - | Tmod_ident (path,_) -> path - | Tmod_constraint (me,_,_,_) -> - mod_path me - | _ -> assert false - in - let path = match expr.exp_desc with - | Texp_pack me -> mod_path me - | _ -> assert false - in - Subst.add_module id path subst - | _ -> subst - ) Subst.identity args - in let args = List.map - (fun (arr,expo) -> make_argument (tapp_of_tarr arr, expo)) + (fun (arr,expo) -> + match arr with + | Tarr_implicit id' -> + let inst = + try Ident.find_same id' implicits + with Not_found -> + (* All implicits in the current function should be + fresh, and as such bound in "implicits" table *) + assert false + in + let argument = inst.implicit_argument in + argument.arg_expression <- expo; + begin match expo with + | None -> + (* Add implicit to pending list *) + pending_implicits := inst :: !pending_implicits + | Some exp -> + (* Link implicit with actual instance *) + link_implicit inst exp + end; + argument + | _ -> make_argument (tapp_of_tarr arr, expo)) args in - let ty_res = Subst.type_expr subst ty_res in end_def (); unify_var env (newvar()) funct.exp_type; rue { From 3bdf9a7aef52d3d65ddda4d5169a3b0645107668 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Thu, 24 Apr 2014 22:30:10 +0100 Subject: [PATCH 334/494] Prototype --- Makefile | 2 +- typing/ctype.ml | 3 + typing/ctype.mli | 2 + typing/typecore.ml | 132 +------------------------- typing/typeimplicit.ml | 211 +++++++++++++++++++++++++++++++++++++++++ typing/typemod.ml | 40 ++++++++ 6 files changed, 260 insertions(+), 130 deletions(-) create mode 100644 typing/typeimplicit.ml diff --git a/Makefile b/Makefile index ead65207e3..a7a523afb5 100644 --- a/Makefile +++ b/Makefile @@ -55,7 +55,7 @@ TYPING=typing/ident.cmo typing/path.cmo \ typing/subst.cmo typing/predef.cmo \ typing/datarepr.cmo typing/cmi_format.cmo typing/env.cmo \ typing/typedtree.cmo typing/printtyped.cmo typing/ctype.cmo \ - typing/printtyp.cmo typing/includeclass.cmo \ + typing/typeimplicit.cmo typing/printtyp.cmo typing/includeclass.cmo \ typing/mtype.cmo typing/envaux.cmo typing/includecore.cmo \ typing/typedtreeIter.cmo typing/typedtreeMap.cmo typing/cmt_format.cmo \ typing/includemod.cmo typing/typetexp.cmo typing/parmatch.cmo \ diff --git a/typing/ctype.ml b/typing/ctype.ml index 28a7dc5c75..95d67cc4c7 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -17,6 +17,8 @@ open Asttypes open Types open Btype +let generalize_implicits = ref (fun () -> assert false) + (* Type manipulation after type inference ====================================== @@ -666,6 +668,7 @@ let iter_generalize tyl ty = iter_generalize tyl ty let generalize ty = + !generalize_implicits (); iter_generalize (ref []) ty (* Efficient repeated generalisation of the same type *) diff --git a/typing/ctype.mli b/typing/ctype.mli index d130009515..be78b3c30a 100644 --- a/typing/ctype.mli +++ b/typing/ctype.mli @@ -276,3 +276,5 @@ val wrap_trace_gadt_instances: Env.t -> ('a -> 'b) -> 'a -> 'b val package_subtype : (Env.t -> Path.t -> Longident.t list -> type_expr list -> Path.t -> Longident.t list -> type_expr list -> bool) ref + +val generalize_implicits : (unit -> unit) ref diff --git a/typing/typecore.ml b/typing/typecore.ml index fed0a709c1..9a8d2905d3 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -17,6 +17,7 @@ open Asttypes open Parsetree open Types open Typedtree +open Typeimplicit open Btype open Ctype @@ -1741,134 +1742,6 @@ let duplicate_ident_types loc caselist env = with Not_found -> env) env idents -(* Instantiate implicits in a function type - - Given a type expression, find all path refering to an implicit module. - 1. Find any implicit bindings: if none, return the original type. - 2. Generate fresh idents for all implicit bindings, substitute idents in the - type. - 3. Replace all type constructors referring to an implicit module - by a fresh type variable and remember the (constr, var) constraint - association. - - (*If a typed expression is a function containing implicit arguments, - this produces a new expression corresponding to the function with all - implicits instantiated together with the hole to be filled with actual - instances and a set of constraints to be satisfied.*) -*) - -type pending_implicit = { - implicit_id: Ident.t; - implicit_env: Env.t; - implicit_loc: Location.t; - implicit_type: Path.t * Longident.t list * type_expr list; - mutable implicit_constraints: (type_expr * type_expr) list; - implicit_argument: argument; -} - -let pending_implicits - : pending_implicit list ref - = ref [] - -let instantiate_implicits loc env ty = - let rec has_implicit ty = match ty.desc with - | Tarrow (Tarr_implicit id,_,_,_) -> true - | Tarrow (_,_,rhs,_) -> has_implicit rhs - | _ -> false - in - if not (has_implicit ty) then Ident.empty, ty - else - let fresh_implicit id ty = - let ty = repr ty in - match ty.desc with - | Tpackage (p,nl,tl) -> { - implicit_id = id; - implicit_env = env; - implicit_loc = loc; - implicit_type = (p,nl,tl); - implicit_constraints = []; - implicit_argument = make_argument (Tapp_implicit, None); - } - | _ -> assert false - in - let rec extract_implicits ty = - let ty = repr ty in - match ty.desc with - | Tarrow (Tarr_implicit id, lhs, rhs, comm) -> - let id' = Ident.rename id in - let instances, subst, rhs' = extract_implicits rhs in - Ident.add id' (fresh_implicit id' lhs) instances, - Subst.add_implicit id (Path.Pident id') subst, - {ty with desc = Tarrow (Tarr_implicit id', lhs, rhs', comm)} - | Tarrow (arr, lhs, rhs, comm) -> - let instances, subst, rhs' = extract_implicits rhs in - instances, subst, - {ty with desc = Tarrow (arr, lhs, rhs', comm)} - | _ -> Ident.empty, Subst.identity, ty - in - let instances, subst, ty = extract_implicits ty in - let ty = Subst.type_expr subst ty in - (* Set of constraints : maintain a table mapping implicit binding - identifier to a list of type variable pairs. - An implicit instance is correct only iff, in an environment where the - ident is bound to the instance, all pairs in the list unify. - *) - let add_constraint inst ty ty' = - inst.implicit_constraints <- (ty,ty') :: inst.implicit_constraints - in - let rec unlink_constructors ty = - (* First recurse in sub expressions *) - iter_type_expr unlink_constructors ty; - (* Then replace current type if it is a constructor referring to an - implicit *) - match ty.desc with - | Tconstr (path,_,_) -> - begin try - let inst = Ident.find_same (Path.head path) instances in - (* Fresh variable *) - let ty' = newvar() in - (* Swap the content of ty and ty' … *) - let {desc = desc; level = lv; id = id} = ty in - let {desc = desc'; level = lv'; id = id'} = ty' in - ty.desc <- desc'; - ty.level <- lv'; - ty.id <- id'; - ty'.desc <- desc; - ty'.level <- lv; - ty'.id <- id; - add_constraint inst ty ty' - with Not_found -> () - end - | _ -> () - in - unlink_constructors ty; - instances, ty - -let link_implicit inst expr = - (* An implicit instance always have to be a path to a module in scope *) - let rec mod_path me = match me.mod_desc with - | Tmod_ident (path,_) -> path - | Tmod_constraint (me,_,_,_) -> - mod_path me - | _ -> assert false - in - let path = match expr.exp_desc with - | Texp_pack me -> mod_path me - | _ -> assert false - in - (* FIXME Check subtype relation between expr and instance *) - (* FIXME Check that all constraints are satisfied *) - let subst = Subst.add_module inst.implicit_id path Subst.identity in - List.iter (fun (ty,ty') -> - let ty = Subst.type_expr subst ty in - let ty' = Subst.type_expr subst ty' in - unify_exp_types inst.implicit_loc inst.implicit_env ty ty' - ) - inst.implicit_constraints; - (* FIXME Update argument in Typedtree *) - inst.implicit_argument.arg_expression <- Some expr - - (* Typing of expressions *) let unify_exp env exp expected_ty = @@ -2084,10 +1957,11 @@ and type_expect_ ?in_function env sexp ty_expected = begin match expo with | None -> (* Add implicit to pending list *) + prerr_endline "added one"; pending_implicits := inst :: !pending_implicits | Some exp -> (* Link implicit with actual instance *) - link_implicit inst exp + link_implicit_to_expr inst exp end; argument | _ -> make_argument (tapp_of_tarr arr, expo)) diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml new file mode 100644 index 0000000000..27c3635398 --- /dev/null +++ b/typing/typeimplicit.ml @@ -0,0 +1,211 @@ +open Btype +open Ctype +open Types +open Typedtree + +(* Forward declaration, to be filled in by Typemod.type_package *) + +let type_package + : (Env.t -> Parsetree.module_expr -> Path.t -> Longident.t list -> + type_expr list -> Typedtree.module_expr * type_expr list) ref + = ref (fun _ -> assert false) + +(* Instantiate implicits in a function type + + Given a type expression, find all path refering to an implicit module. + 1. Find any implicit bindings: if none, return the original type. + 2. Generate fresh idents for all implicit bindings, substitute idents in the + type. + 3. Replace all type constructors referring to an implicit module + by a fresh type variable and remember the (constr, var) constraint + association. + + (*If a typed expression is a function containing implicit arguments, + this produces a new expression corresponding to the function with all + implicits instantiated together with the hole to be filled with actual + instances and a set of constraints to be satisfied.*) +*) + +type pending_implicit = { + implicit_id: Ident.t; + implicit_env: Env.t; + implicit_loc: Location.t; + implicit_type: Path.t * Longident.t list * type_expr list; + mutable implicit_constraints: (type_expr * type_expr) list; + implicit_argument: argument; +} + +let pending_implicits + : pending_implicit list ref + = ref [] + +let instantiate_implicits loc env ty = + let rec has_implicit ty = match ty.desc with + | Tarrow (Tarr_implicit id,_,_,_) -> true + | Tarrow (_,_,rhs,_) -> has_implicit rhs + | _ -> false + in + if not (has_implicit ty) then Ident.empty, ty + else + let fresh_implicit id ty = + let ty = repr ty in + match ty.desc with + | Tpackage (p,nl,tl) -> { + implicit_id = id; + implicit_env = env; + implicit_loc = loc; + implicit_type = (p,nl,tl); + implicit_constraints = []; + implicit_argument = { + arg_flag = Tapp_implicit; + arg_expression = None + }; + } + | _ -> assert false + in + let rec extract_implicits ty = + let ty = repr ty in + match ty.desc with + | Tarrow (Tarr_implicit id, lhs, rhs, comm) -> + let id' = Ident.rename id in + let instances, subst, rhs' = extract_implicits rhs in + Ident.add id' (fresh_implicit id' lhs) instances, + Subst.add_implicit id (Path.Pident id') subst, + {ty with desc = Tarrow (Tarr_implicit id', lhs, rhs', comm)} + | Tarrow (arr, lhs, rhs, comm) -> + let instances, subst, rhs' = extract_implicits rhs in + instances, subst, + {ty with desc = Tarrow (arr, lhs, rhs', comm)} + | _ -> Ident.empty, Subst.identity, ty + in + let instances, subst, ty = extract_implicits ty in + let ty = Subst.type_expr subst ty in + (* Set of constraints : maintain a table mapping implicit binding + identifier to a list of type variable pairs. + An implicit instance is correct only iff, in an environment where the + ident is bound to the instance, all pairs in the list unify. + *) + let linked = Hashtbl.create 7 in + let add_constraint inst ~constr ~ty ~var = + begin try + let var' = Hashtbl.find linked constr in + link_type var var' + with Not_found -> + Hashtbl.add linked constr var + end; + inst.implicit_constraints <- (ty,var) :: inst.implicit_constraints + in + let rec unlink_constructors ty = + (* First recurse in sub expressions *) + iter_type_expr unlink_constructors ty; + (* Then replace current type if it is a constructor referring to an + implicit *) + match ty.desc with + | Tconstr (path,_,_) as constr -> + begin try + let inst = Ident.find_same (Path.head path) instances in + (* Fresh variable *) + let ty' = newvar() in + (* Swap the content of ty and ty' … *) + let {desc = desc; level = lv; id = id} = ty in + let {desc = desc'; level = lv'; id = id'} = ty' in + ty.desc <- desc'; + ty.level <- lv'; + ty.id <- id'; + ty'.desc <- desc; + ty'.level <- lv; + ty'.id <- id; + add_constraint inst ~constr ~ty:ty' ~var:ty + with Not_found -> () + end + | _ -> () + in + unlink_constructors ty; + instances, ty + +(* Pack module at given path to match a given implicit instance and + update the instance to point to this module. + Return the correct package if any. +*) +let pack_implicit inst path = + let { implicit_type = p,nl,tl; + implicit_env = env; + implicit_loc = loc } = inst in + let md = Env.find_module path env in + let md = {md with md_type = (Mty_alias path)} in + let _, env' = Env.enter_module_declaration "Pkg" md env in + let pmd = Ast_helper.(Mod.ident (Convenience.lid "Pkg")) in + let (modl, tl') = !type_package env' pmd p nl tl in + { + exp_desc = Texp_pack modl; + exp_loc = loc; exp_extra = []; + exp_type = newty (Tpackage (p, nl, tl')); + exp_attributes = []; + exp_env = env; + } + +(* Link a pending implicit to the module at specified path. + May fail with unifications or module subtyping errors. +*) +let link_implicit_to_path inst path = + (* Check that all constraints are satisfied *) + let subst = Subst.add_module inst.implicit_id path Subst.identity in + List.iter (fun (ty,ty') -> + let ty = Subst.type_expr subst ty in + let ty' = Subst.type_expr subst ty' in + unify inst.implicit_env ty ty' + ) + inst.implicit_constraints; + (* Pack the module to appropriate signature *) + let expr = pack_implicit inst path in + (* Update the argument *) + inst.implicit_argument.arg_expression <- Some expr + +let link_implicit_to_expr inst expr = + (* An implicit instance always have to be a path to a module in scope *) + let rec mod_path me = match me.mod_desc with + | Tmod_ident (path,_) -> path + | Tmod_constraint (me,_,_,_) -> + mod_path me + | _ -> assert false + in + let path = match expr.exp_desc with + | Texp_pack me -> mod_path me + | _ -> assert false + in + link_implicit_to_path inst path + +(* Naive resolution procedure *) +let find_instance inst = + let snapshot = Btype.snapshot () in + let modules = Env.implicit_instances inst.implicit_env in + let module_match (path,_) = + try + prerr_endline ("try " ^ Path.last path); + link_implicit_to_path inst path; + true + with _ -> + Btype.backtrack snapshot; + false + in + List.exists module_match modules + +let generalize_implicits () = + prerr_endline "generalize_implicits"; + let current_level = get_current_level () in + let need_generalization inst = + prerr_endline "found one"; + List.exists + (fun (ty,ty') -> + (*assert (ty.level <> generic_level); + assert (ty'.level <> generic_level);*) + ty.level > current_level || ty'.level > current_level || true) + inst.implicit_constraints + in + let to_generalize, rest = + List.partition need_generalization !pending_implicits + in + pending_implicits := rest; + assert (List.for_all find_instance to_generalize) + +let () = Ctype.generalize_implicits := generalize_implicits diff --git a/typing/typemod.ml b/typing/typemod.ml index fe45dc8736..42859c8e1a 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -1676,6 +1676,45 @@ let type_package env m p nl tl = nl tl'; (wrap_constraint env modl mty Tmodtype_implicit, tl') +let type_implicit_instance env m p nl tl = + (* Same as Pexp_letmodule *) + (* remember original level *) + let lv = Ctype.get_current_level () in + Ctype.begin_def (); + Ident.set_current_time lv; + let context = Typetexp.narrow () in + let modl = type_module env m in + Ctype.init_def(Ident.current_time()); + Typetexp.widen context; + let (mp, env) = + match modl.mod_desc with + Tmod_ident (mp,_) -> (mp, env) + | _ -> + let (id, new_env) = Env.enter_module ~arg:true "%M" modl.mod_type env in + (Pident id, new_env) + in + let rec mkpath mp = function + | Lident name -> Pdot(mp, name, nopos) + | Ldot (m, name) -> Pdot(mkpath mp m, name, nopos) + | _ -> assert false + in + let tl' = + List.map + (fun name -> Btype.newgenty (Tconstr (mkpath mp name,[],ref Mnil))) + nl in + (* go back to original level *) + Ctype.end_def (); + if nl = [] then + (wrap_constraint env modl (Mty_ident p) Tmodtype_implicit, []) + else let mty = modtype_of_package env modl.mod_loc p nl tl' in + List.iter2 + (fun n ty -> + try Ctype.unify env ty (Ctype.newvar ()) + with Ctype.Unify _ -> + raise (Error(m.pmod_loc, env, Scoping_pack (n,ty)))) + nl tl'; + (wrap_constraint env modl mty Tmodtype_implicit, tl') + (* Fill in the forward declarations *) let () = Typecore.type_module := type_module; @@ -1683,6 +1722,7 @@ let () = Typetexp.transl_modtype := transl_modtype; Typecore.type_open := type_open_ ?toplevel:None; Typecore.type_package := type_package; + Typeimplicit.type_package := type_package; type_module_type_of_fwd := type_module_type_of From 34d6193c64a0e7f735177e952d2968701dd314bf Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 25 Apr 2014 14:00:57 +0100 Subject: [PATCH 335/494] Add examples with implicit --- examples.numbers | 91 ++++++++++++++++++++++++++++++++++++++++++++++ examples.stringify | 26 +++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 examples.numbers create mode 100644 examples.stringify diff --git a/examples.numbers b/examples.numbers new file mode 100644 index 0000000000..8cdc2db122 --- /dev/null +++ b/examples.numbers @@ -0,0 +1,91 @@ +module type NUM = sig + type t + val ( + ) : t -> t -> t + val ( - ) : t -> t -> t + val ( * ) : t -> t -> t + val ( / ) : t -> t -> t + val (~- ) : t -> t + val zero : t + val one : t + val of_int : int -> t +end;; + +module NUM = struct + let ( + ) (implicit M : NUM) = M.( + ) + let ( - ) (implicit M : NUM) = M.( - ) + let ( * ) (implicit M : NUM) = M.( * ) + let ( / ) (implicit M : NUM) = M.( / ) + let (~- ) (implicit M : NUM) = M.(~- ) + let zero (implicit M : NUM) = M.zero + let one (implicit M : NUM) = M.one + let (~~) (implicit M : NUM) = M.of_int +end;; + +module type ORD = sig + type t + val ( = ) : t -> t -> bool + val ( <> ) : t -> t -> bool + val ( < ) : t -> t -> bool + val ( <= ) : t -> t -> bool + val ( > ) : t -> t -> bool + val ( >= ) : t -> t -> bool +end;; + +module ORD = struct + let ( = ) (implicit M : ORD) = M.( = ) + let ( <> ) (implicit M : ORD) = M.( <> ) + let ( < ) (implicit M : ORD) = M.( < ) + let ( <= ) (implicit M : ORD) = M.( <= ) + let ( > ) (implicit M : ORD) = M.( > ) + let ( >= ) (implicit M : ORD) = M.( >= ) +end;; + +implicit module Int = struct + type t = int + let ( + ),( - ),( * ), ( / ), (~- ) = ( + ),( - ),( * ), ( / ), (~- ) + let zero = 0 + let one = 1 + let of_int x = x + let (( = ), ( <> ), ( < ), ( <= ), ( > ), ( >= )) + : (t -> t -> bool) + * (t -> t -> bool) + * (t -> t -> bool) + * (t -> t -> bool) + * (t -> t -> bool) + * (t -> t -> bool) + = ( = ), ( <> ), ( < ), ( <= ), ( > ), ( >= ) +end;; + +implicit module Float = struct + type t = float + let ( + ),( - ),( * ), ( / ), (~- ) = ( +.),( -.),( *.), ( /.), (~-.) + let zero = 0. + let one = 1. + let of_int = float_of_int + let (( = ), ( <> ), ( < ), ( <= ), ( > ), ( >= )) + : (t -> t -> bool) + * (t -> t -> bool) + * (t -> t -> bool) + * (t -> t -> bool) + * (t -> t -> bool) + * (t -> t -> bool) + = ( = ), ( <> ), ( < ), ( <= ), ( > ), ( >= ) +end;; + +(*implicit module Num_NUM = struct + open Num + type t = num + let ( + ),( - ),( * ), ( / ) = ( +/),( -/),( */), ( //) + let zero = num_of_int 0 + let one = num_of_int 1 + let (~- ) k = zero - k + let of_int = float_of_int + let ( = ), ( <> ), ( < ), ( <= ), ( > ), ( >= ) + = ( =/), ( <>/), ( </), ( <=/), ( >/), ( >=/) +end;;*) + +open NUM;; +open ORD;; +assert ( ~~2 / ~~3 = 0 + && ~~2 / ~~3 = 0.666666666666666666666666666666666666);; +let x = 1 + one + one;; diff --git a/examples.stringify b/examples.stringify new file mode 100644 index 0000000000..f9c27e030c --- /dev/null +++ b/examples.stringify @@ -0,0 +1,26 @@ +module type STRINGIFY = sig type t val to_string : t -> string end;; + +(* Define "overloaded" string function *) +let to_string (implicit M : STRINGIFY) x = M.to_string x;; + +(* Locally bind implicit instance *) +let g (x : int) = + let implicit module Int = struct + type t = int + let to_string = string_of_int + end in + to_string x;; + +(* M is implicitly rebind inside f *) +let f (implicit M : STRINGIFY) (x : M.t) = to_string x;; + +(* Global instance *) +implicit module S = struct type t = string let to_string x = x end;; + +to_string "4";; + +f "4";; + +g 4;; + +let x = assert (to_string "4" = f "4" && to_string "4" = g 4) in x;; From 0e13643d1cd64cb7e5e06fd41de1a455ac5a167c Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 25 Apr 2014 15:49:34 +0100 Subject: [PATCH 336/494] Change implicit instantiation strategy --- .depend | 20 ++++++----- typing/typecore.ml | 68 ++++++++++++++++++------------------- typing/typeimplicit.ml | 77 +++++++++++++++++++++++++++++++++--------- 3 files changed, 106 insertions(+), 59 deletions(-) diff --git a/.depend b/.depend index 86652727b7..7d1946baa6 100644 --- a/.depend +++ b/.depend @@ -139,7 +139,8 @@ typing/typeclass.cmi : typing/types.cmi typing/typedtree.cmi \ typing/ident.cmi typing/env.cmi typing/ctype.cmi parsing/asttypes.cmi typing/typecore.cmi : typing/types.cmi typing/typedtree.cmi typing/path.cmi \ parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ - typing/ident.cmi typing/env.cmi parsing/asttypes.cmi typing/annot.cmi + typing/ident.cmi typing/env.cmi parsing/asttypes.cmi typing/annot.cmi \ + typing/typeimplicit.cmi typing/typedecl.cmi : typing/types.cmi typing/typedtree.cmi typing/path.cmi \ parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ typing/includecore.cmi typing/ident.cmi typing/env.cmi \ @@ -312,14 +313,15 @@ typing/typeclass.cmx : utils/warnings.cmx typing/typetexp.cmx \ typing/btype.cmx parsing/asttypes.cmi parsing/ast_helper.cmx \ typing/typeclass.cmi typing/typecore.cmo : utils/warnings.cmi typing/typetexp.cmi \ - typing/types.cmi typing/typedtree.cmi parsing/syntaxerr.cmi \ - typing/subst.cmi typing/stypes.cmi typing/printtyp.cmi \ - typing/primitive.cmi typing/predef.cmi typing/path.cmi \ - parsing/parsetree.cmi typing/parmatch.cmi typing/oprint.cmi \ - utils/misc.cmi parsing/longident.cmi parsing/location.cmi \ - typing/ident.cmi typing/env.cmi typing/ctype.cmi typing/cmt_format.cmi \ - utils/clflags.cmi typing/btype.cmi parsing/asttypes.cmi \ - parsing/ast_helper.cmi typing/annot.cmi typing/typecore.cmi + typing/types.cmi typing/typedtree.cmi typing/subst.cmi typing/stypes.cmi \ + typing/printtyp.cmi typing/primitive.cmi typing/predef.cmi \ + typing/path.cmi parsing/parsetree.cmi typing/parmatch.cmi \ + typing/oprint.cmi utils/misc.cmi parsing/longident.cmi \ + parsing/location.cmi typing/ident.cmi typing/env.cmi typing/ctype.cmi \ + typing/cmt_format.cmi utils/clflags.cmi typing/btype.cmi \ + parsing/asttypes.cmi parsing/ast_helper.cmi typing/annot.cmi \ + typing/typecore.cmi \ + typing/typeimplicit.cmi typing/typecore.cmx : utils/warnings.cmx typing/typetexp.cmx \ typing/types.cmx typing/typedtree.cmx parsing/syntaxerr.cmx \ typing/subst.cmx typing/stypes.cmx typing/printtyp.cmx \ diff --git a/typing/typecore.ml b/typing/typecore.ml index 9a8d2905d3..5e455e7a9c 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1789,7 +1789,7 @@ and type_expect_ ?in_function env sexp ty_expected = let name = Path.name ~paren:Oprint.parenthesized_ident path in Stypes.record (Stypes.An_ident (loc, name, annot)) end; - rue { + let expr = { exp_desc = begin match desc.val_kind with Val_ivar (_, cl_num) -> @@ -1798,8 +1798,8 @@ and type_expect_ ?in_function env sexp ty_expected = in Texp_instvar(self_path, path, match lid.txt with - Longident.Lident txt -> { txt; loc = lid.loc } - | _ -> assert false) + Longident.Lident txt -> { txt; loc = lid.loc } + | _ -> assert false) | Val_self (_, _, cl_num, _) -> let (path, _) = Env.lookup_value (Longident.Lident ("self-" ^ cl_num)) env @@ -1813,11 +1813,20 @@ and type_expect_ ?in_function env sexp ty_expected = Texp_ident(path, lid, desc)*) | _ -> Texp_ident(path, lid, desc) - end; + end; exp_loc = loc; exp_extra = []; exp_type = instance env desc.val_type; exp_attributes = sexp.pexp_attributes; - exp_env = env } + exp_env = env; + } in + let implicits, expr = instantiate_implicits_expr env expr in + let implicits = + Ident.fold_all (fun _ inst acc -> + prerr_endline "add pending implicit"; + inst :: acc) implicits [] + in + pending_implicits := implicits @ !pending_implicits; + rue expr end | Pexp_constant(Const_string (str, _) as cst) -> ( (* Terrible hack for format strings *) @@ -1938,33 +1947,10 @@ and type_expect_ ?in_function env sexp ty_expected = end_def (); wrap_trace_gadt_instances env (lower_args []) ty; begin_def (); - let implicits, funct_ty = instantiate_implicits loc env funct.exp_type in - let funct = {funct with exp_type = funct_ty} in - let (args, ty_res) = type_application env funct sargs in + let pending = extract_pending_implicits funct in + let (args, ty_res) = type_application env funct pending sargs in let args = List.map - (fun (arr,expo) -> - match arr with - | Tarr_implicit id' -> - let inst = - try Ident.find_same id' implicits - with Not_found -> - (* All implicits in the current function should be - fresh, and as such bound in "implicits" table *) - assert false - in - let argument = inst.implicit_argument in - argument.arg_expression <- expo; - begin match expo with - | None -> - (* Add implicit to pending list *) - prerr_endline "added one"; - pending_implicits := inst :: !pending_implicits - | Some exp -> - (* Link implicit with actual instance *) - link_implicit_to_expr inst exp - end; - argument - | _ -> make_argument (tapp_of_tarr arr, expo)) + (fun (arr,expo) -> make_argument (tapp_of_tarr arr, expo)) args in end_def (); @@ -3238,7 +3224,9 @@ and type_argument env sarg ty_expected' ty_expected = unify_exp env texp ty_expected; texp -and type_application env funct (sargs : (Parsetree.apply_flag * Parsetree.expression) list) = +and type_application env funct + (pending : pending_implicit list) + (sargs : (Parsetree.apply_flag * Parsetree.expression) list) = (* funct.exp_type may be generic *) let sargs = List.map (fun (app,e) -> tapp_of_papp app, e) sargs in let has_label l ty_fun = @@ -3421,8 +3409,6 @@ and type_application env funct (sargs : (Parsetree.apply_flag * Parsetree.expres let omitted = match arr, arg with (* Applied arguments don't affect omitted list *) | _, Some _ -> omitted - (* Undefined implicit arguments will be instantiated later *) - | Tarr_implicit _, None -> omitted (* Other undefined arguments are remembered as omitted *) | _, None -> (arr,ty,lv) :: omitted in @@ -3438,6 +3424,19 @@ and type_application env funct (sargs : (Parsetree.apply_flag * Parsetree.expres type_unknown_args typed omitted ty_fun0 (sargs @ more_sargs) in + let rec type_implicits args' args pending = + match pending, args with + | [], _ + | _, [] -> List.rev_append args' args, pending + | (inst :: pending), ((Tapp_implicit,arg) :: args) -> + prerr_endline "applying implicits"; + let p, nl, tl = inst.implicit_type in + let package_ty = newgenty (Tpackage (p,nl,tl)) in + link_implicit_to_expr inst (type_expect env arg package_ty); + type_implicits args' args pending + | _, (arg :: args) -> + type_implicits (arg :: args') args pending + in match funct.exp_desc, sargs with (* Special case for ignore: avoid discarding warning *) Texp_ident (_, _, {val_kind=Val_prim{Primitive.prim_name="%ignore"}}), @@ -3454,6 +3453,7 @@ and type_application env funct (sargs : (Parsetree.apply_flag * Parsetree.expres ([Tarr_simple, Some exp], ty_res) | _ -> let ty = funct.exp_type in + let sargs, pending = type_implicits [] sargs pending in if ignore_labels then type_args [] [] ty (instance env ty) ty [] sargs else diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index 27c3635398..4660d91ca6 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -39,13 +39,13 @@ let pending_implicits : pending_implicit list ref = ref [] -let instantiate_implicits loc env ty = +let instantiate_implicits_ty loc env ty = let rec has_implicit ty = match ty.desc with | Tarrow (Tarr_implicit id,_,_,_) -> true | Tarrow (_,_,rhs,_) -> has_implicit rhs | _ -> false in - if not (has_implicit ty) then Ident.empty, ty + if not (has_implicit ty) then [], Ident.empty, ty else let fresh_implicit id ty = let ty = repr ty in @@ -67,18 +67,23 @@ let instantiate_implicits loc env ty = let ty = repr ty in match ty.desc with | Tarrow (Tarr_implicit id, lhs, rhs, comm) -> + prerr_endline "found one"; let id' = Ident.rename id in - let instances, subst, rhs' = extract_implicits rhs in - Ident.add id' (fresh_implicit id' lhs) instances, + let inst = fresh_implicit id' lhs in + let arguments, instances, subst, rhs' = extract_implicits rhs in + inst.implicit_argument :: arguments, + Ident.add id' inst instances, Subst.add_implicit id (Path.Pident id') subst, - {ty with desc = Tarrow (Tarr_implicit id', lhs, rhs', comm)} + rhs' + (*{ty with desc = Tarrow (Tarr_implicit id', lhs, rhs', comm)}*) | Tarrow (arr, lhs, rhs, comm) -> - let instances, subst, rhs' = extract_implicits rhs in + let arguments, instances, subst, rhs' = extract_implicits rhs in + {arg_flag = (tapp_of_tarr arr); arg_expression = None} :: arguments, instances, subst, {ty with desc = Tarrow (arr, lhs, rhs', comm)} - | _ -> Ident.empty, Subst.identity, ty + | _ -> [], Ident.empty, Subst.identity, ty in - let instances, subst, ty = extract_implicits ty in + let arguments, instances, subst, ty = extract_implicits ty in let ty = Subst.type_expr subst ty in (* Set of constraints : maintain a table mapping implicit binding identifier to a list of type variable pairs. @@ -121,7 +126,26 @@ let instantiate_implicits loc env ty = | _ -> () in unlink_constructors ty; - instances, ty + arguments, instances, ty + +let instantiate_implicits_expr env expr = + prerr_endline "instantiate_implicits_expr"; + match + instantiate_implicits_ty expr.exp_loc env expr.exp_type + with + | [], implicits, _ -> + prerr_endline "none"; + implicits,expr + | arguments, implicits, ty -> + implicits, + { exp_desc = Texp_apply (expr, arguments); + exp_type = ty; + exp_loc = expr.exp_loc; + exp_extra = []; + exp_env = env; + exp_attributes = [] + } + (* Pack module at given path to match a given implicit instance and update the instance to point to this module. @@ -191,21 +215,42 @@ let find_instance inst = List.exists module_match modules let generalize_implicits () = - prerr_endline "generalize_implicits"; + Printf.eprintf "generalize_implicits %d\n%!" (List.length !pending_implicits); + let current_level = get_current_level () in + let _not_linked = function + | {implicit_argument = {arg_expression = Some _}} -> false + | _ -> true + in + let pending = (*List.filter not_linked*) !pending_implicits in let need_generalization inst = - prerr_endline "found one"; List.exists - (fun (ty,ty') -> - (*assert (ty.level <> generic_level); - assert (ty'.level <> generic_level);*) - ty.level > current_level || ty'.level > current_level || true) + (fun (ty,var) -> + assert (var.level <> generic_level); + var.level >= current_level) inst.implicit_constraints + || inst.implicit_constraints = [] in let to_generalize, rest = - List.partition need_generalization !pending_implicits + List.partition need_generalization pending in pending_implicits := rest; assert (List.for_all find_instance to_generalize) let () = Ctype.generalize_implicits := generalize_implicits + +(* Extraction of pending implicit arguments *) +let extract_pending_implicits expr = + let rec traverse acc = function + | {exp_desc = Texp_apply (exp,args); _} -> + let is_pending = function + | {arg_flag = Tapp_implicit; arg_expression = None} -> true + | _ -> false + in + traverse (List.filter is_pending args @ acc) exp + | _ -> acc + in + List.map (fun argument -> + List.find (fun inst -> inst.implicit_argument == argument) + !pending_implicits) + (traverse [] expr) From d8510d34814827f26d5f9bfa80edeb7de92c7123 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Mon, 28 Apr 2014 15:59:25 +0100 Subject: [PATCH 337/494] Update depend --- parsing/ast_helper.mli | 1 + parsing/pprintast.ml | 38 ++++++-------------------------------- 2 files changed, 7 insertions(+), 32 deletions(-) diff --git a/parsing/ast_helper.mli b/parsing/ast_helper.mli index 6384c6db30..5ac46b8030 100644 --- a/parsing/ast_helper.mli +++ b/parsing/ast_helper.mli @@ -296,6 +296,7 @@ module Opn: module Incl: sig val mk: ?loc: loc -> ?attrs:attrs -> ?docs:docs -> 'a -> 'a include_infos + end (** Implicit *) module Im: diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index e856e19396..623437c262 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -126,22 +126,6 @@ let is_simple_construct :construct -> bool = function let pp = fprintf -<<<<<<< HEAD -======= -let rec is_irrefut_patt x = - match x.ppat_desc with - | Ppat_any | Ppat_var _ | Ppat_unpack _ -> true - | Ppat_alias (p,_) -> is_irrefut_patt p - | Ppat_tuple (ps) -> List.for_all is_irrefut_patt ps - | Ppat_constraint (p,_) -> is_irrefut_patt p - | Ppat_or (l,r) -> is_irrefut_patt l || is_irrefut_patt r - | Ppat_record (ls,_) -> List.for_all (fun (_,x) -> is_irrefut_patt x) ls - | Ppat_lazy p -> is_irrefut_patt p - | Ppat_extension _ -> assert false - | Ppat_interval _ - | Ppat_constant _ | Ppat_construct _ | Ppat_variant _ | Ppat_array _ - | Ppat_type _-> false (*conservative*) ->>>>>>> Introduce "implicit" keyword and constructions in parser class printer ()= object(self:'self) val pipe = false val semi = false @@ -1014,9 +998,14 @@ class printer ()= object(self:'self) | Psig_module pmd -> pp f "@[<hov>module@ %s@ :@ %a@]%a" pmd.pmd_name.txt -<<<<<<< HEAD self#module_type pmd.pmd_type self#item_attributes pmd.pmd_attributes + | Psig_implicit pid -> + pp f "@[<hov>implicit %s@ %s@ :@ %a@]%a" + (if pid.pim_arity = 0 then "module" else "functor") + pid.pim_module.pmd_name.txt + (self#implicit_declaration pid.pim_arity) pid.pim_module.pmd_type + self#item_attributes pid.pim_module.pmd_attributes | Psig_open od -> pp f "@[<hov2>open%s@ %a@]%a" (override od.popen_override) @@ -1028,21 +1017,6 @@ class printer ()= object(self:'self) self#item_attributes incl.pincl_attributes | Psig_modtype {pmtd_name=s; pmtd_type=md; pmtd_attributes=attrs} -> pp f "@[<hov2>module@ type@ %s%a@]%a" -======= - self#module_type pmd.pmd_type - | Psig_implicit pid -> - pp f "@[<hov>implicit %s@ %s@ :@ %a@]" - (if pid.pim_arity = 0 then "module" else "functor") - pid.pim_module.pmd_name.txt - (self#implicit_declaration pid.pim_arity) pid.pim_module.pmd_type - | Psig_open (ovf, li, _attrs) -> - pp f "@[<hov2>open%s@ %a@]" (override ovf) self#longident_loc li - | Psig_include (mt, _attrs) -> - pp f "@[<hov2>include@ %a@]" - self#module_type mt - | Psig_modtype {pmtd_name=s; pmtd_type=md} -> - pp f "@[<hov2>module@ type@ %s%a@]" ->>>>>>> Introduce "implicit" keyword and constructions in parser s.txt (fun f md -> match md with | None -> () From 8bee73c3859b395bfe6fd270f262a7bb3eca3dfa Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 30 Apr 2014 13:52:17 +0100 Subject: [PATCH 338/494] Parser: add parsing of implicit types --- parsing/parser.mly | 2 ++ 1 file changed, 2 insertions(+) diff --git a/parsing/parser.mly b/parsing/parser.mly index c8cdc992c2..54d923f711 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -2053,6 +2053,8 @@ core_type2: { mktyp(Ptyp_arrow(Parr_optional $1 , mkoption $2, $4)) } | LIDENT COLON core_type2 MINUSGREATER core_type2 { mktyp(Ptyp_arrow(Parr_labelled $1, $3, $5)) } + | LPAREN IMPLICIT UIDENT COLON implicit_module_type RPAREN MINUSGREATER core_type2 + { mktyp(Ptyp_arrow(Parr_implicit $3, $5, $8)) } | core_type2 MINUSGREATER core_type2 { mktyp(Ptyp_arrow(Parr_simple, $1, $3)) } ; From f881b7af2684f670575e6244b02c441b95848d4a Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 30 Apr 2014 15:19:22 +0100 Subject: [PATCH 339/494] Typeimplicit: comment printf-debugging --- typing/typeimplicit.ml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index 4660d91ca6..fd45da391c 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -67,7 +67,7 @@ let instantiate_implicits_ty loc env ty = let ty = repr ty in match ty.desc with | Tarrow (Tarr_implicit id, lhs, rhs, comm) -> - prerr_endline "found one"; + (*prerr_endline "found one";*) let id' = Ident.rename id in let inst = fresh_implicit id' lhs in let arguments, instances, subst, rhs' = extract_implicits rhs in @@ -129,12 +129,12 @@ let instantiate_implicits_ty loc env ty = arguments, instances, ty let instantiate_implicits_expr env expr = - prerr_endline "instantiate_implicits_expr"; + (*prerr_endline "instantiate_implicits_expr";*) match instantiate_implicits_ty expr.exp_loc env expr.exp_type with | [], implicits, _ -> - prerr_endline "none"; + (*prerr_endline "none";*) implicits,expr | arguments, implicits, ty -> implicits, @@ -205,7 +205,7 @@ let find_instance inst = let modules = Env.implicit_instances inst.implicit_env in let module_match (path,_) = try - prerr_endline ("try " ^ Path.last path); + (*prerr_endline ("try " ^ Path.last path);*) link_implicit_to_path inst path; true with _ -> @@ -215,7 +215,7 @@ let find_instance inst = List.exists module_match modules let generalize_implicits () = - Printf.eprintf "generalize_implicits %d\n%!" (List.length !pending_implicits); + (*Printf.eprintf "generalize_implicits %d\n%!" (List.length !pending_implicits);*) let current_level = get_current_level () in let _not_linked = function From 0a704238f0a195a64d35342e163af22188bec2f5 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 30 Apr 2014 15:22:56 +0100 Subject: [PATCH 340/494] Type implicit arguments module alpha-equivalence --- typing/ctype.ml | 52 +++++++++++++++++++++++++++++++++++++++++++++- typing/ctype.mli | 3 +++ typing/typecore.ml | 13 +++++++++--- typing/typemod.ml | 1 + typing/typetexp.ml | 11 ++++++++++ 5 files changed, 76 insertions(+), 4 deletions(-) diff --git a/typing/ctype.ml b/typing/ctype.ml index 95d67cc4c7..75623bfccf 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -2035,6 +2035,14 @@ let arrows_are_compatible l1 l2 = let classic_arrows_are_compatible l1 l2 = l1 = l2 || !Clflags.classic && arrows_are_compatible l1 l2 +let modtype_of_package = ref (fun _ _ _ _ _ -> assert false) + +let modtype_of_tpackage env ty = + match (repr ty).desc with + | Tpackage (p1,nl1,tl1) -> + !modtype_of_package env Location.none p1 nl1 tl1 + | _ -> assert false + (* mcomp type_pairs subst env t1 t2 does not raise an exception if it is possible that t1 and t2 are actually equal, assuming the types in type_pairs are equal and @@ -2065,6 +2073,13 @@ let rec mcomp type_pairs env t1 t2 = TypePairs.add type_pairs (t1', t2') (); match (t1'.desc, t2'.desc) with (Tvar _, Tvar _) -> assert false + | (Tarrow (Tarr_implicit id1, t1, u1, c1), + Tarrow (Tarr_implicit id2, t2, u2, c2)) -> + mcomp type_pairs env t1 t2; + let mty = modtype_of_tpackage env t1 in + let env = Env.add_module id1 mty env in + let env = Env.add_module id2 mty env in + mcomp type_pairs env u1 u2; | (Tarrow (l1, t1, u1, _), Tarrow (l2, t2, u2, _)) when arrows_are_compatible l1 l2 -> mcomp type_pairs env t1 t2; @@ -2456,7 +2471,21 @@ and unify3 env t1 t1' t2 t2' = end; try begin match (d1, d2) with - (Tarrow (l1, t1, u1, c1), Tarrow (l2, t2, u2, c2)) + (Tarrow (Tarr_implicit id1, t1, u1, c1), + Tarrow (Tarr_implicit id2, t2, u2, c2)) -> + unify env t1 t2; + let env' = !env in + let mty = modtype_of_tpackage env' t1 in + let env' = Env.add_module id1 mty env' in + let env' = Env.add_module id2 mty env' in + env := env'; + unify env u1 u2; + begin match commu_repr c1, commu_repr c2 with + Clink r, c2 -> set_commu r c2 + | c1, Clink r -> set_commu r c1 + | _ -> () + end + | (Tarrow (l1, t1, u1, c1), Tarrow (l2, t2, u2, c2)) when classic_arrows_are_compatible l1 l2 -> unify env t1 t2; unify env u1 u2; begin match commu_repr c1, commu_repr c2 with @@ -2980,6 +3009,13 @@ let rec moregen inst_nongen type_pairs env t1 t2 = (Tvar _, _) when may_instantiate inst_nongen t1' -> moregen_occur env t1'.level t2; link_type t1' t2 + | (Tarrow (Tarr_implicit id1, t1, u1, c1), + Tarrow (Tarr_implicit id2, t2, u2, c2)) -> + moregen inst_nongen type_pairs env t1 t2; + let mty = modtype_of_tpackage env t1 in + let env = Env.add_module id1 mty env in + let env = Env.add_module id2 mty env in + moregen inst_nongen type_pairs env u1 u2 | (Tarrow (l1, t1, u1, _), Tarrow (l2, t2, u2, _)) when classic_arrows_are_compatible l1 l2 -> moregen inst_nongen type_pairs env t1 t2; @@ -3251,6 +3287,13 @@ let rec eqtype rename type_pairs subst env t1 t2 = then raise (Unify []); subst := (t1', t2') :: !subst end + | (Tarrow (Tarr_implicit id1, t1, u1, c1), + Tarrow (Tarr_implicit id2, t2, u2, c2)) -> + eqtype rename type_pairs subst env t1 t2; + let mty = modtype_of_tpackage env t1 in + let env = Env.add_module id1 mty env in + let env = Env.add_module id2 mty env in + eqtype rename type_pairs subst env u1 u2; | (Tarrow (l1, t1, u1, _), Tarrow (l2, t2, u2, _)) when classic_arrows_are_compatible l1 l2 -> eqtype rename type_pairs subst env t1 t2; @@ -3945,6 +3988,13 @@ let rec subtype_rec env trace t1 t2 cstrs = match (t1.desc, t2.desc) with (Tvar _, _) | (_, Tvar _) -> (trace, t1, t2, !univar_pairs)::cstrs + | (Tarrow (Tarr_implicit id1, t1, u1, c1), + Tarrow (Tarr_implicit id2, t2, u2, c2)) -> + let cstrs = subtype_rec env ((t2, t1)::trace) t2 t1 cstrs in + let mty = modtype_of_tpackage env t1 in + let env = Env.add_module id1 mty env in + let env = Env.add_module id2 mty env in + subtype_rec env ((u1, u2)::trace) u1 u2 cstrs | (Tarrow(l1, t1, u1, _), Tarrow(l2, t2, u2, _)) when classic_arrows_are_compatible l1 l2 -> let cstrs = subtype_rec env ((t2, t1)::trace) t2 t1 cstrs in diff --git a/typing/ctype.mli b/typing/ctype.mli index be78b3c30a..4c24e93936 100644 --- a/typing/ctype.mli +++ b/typing/ctype.mli @@ -277,4 +277,7 @@ val package_subtype : (Env.t -> Path.t -> Longident.t list -> type_expr list -> Path.t -> Longident.t list -> type_expr list -> bool) ref +val modtype_of_package : (Env.t -> Location.t -> Path.t -> Longident.t list -> + type_expr list -> module_type) ref + val generalize_implicits : (unit -> unit) ref diff --git a/typing/typecore.ml b/typing/typecore.ml index 5e455e7a9c..e6f1575798 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1488,8 +1488,10 @@ let rec approx_type env sty = | Ptyp_arrow (Parr_optional s, _, sty) -> let ty1 = type_option (newvar ()) in newty (Tarrow (Tarr_optional s, ty1, approx_type env sty, Cok)) + | Ptyp_arrow (Parr_implicit s, _, sty) -> + let id, env = Env.enter_module s (Mty_signature []) env in + newty (Tarrow (Tarr_implicit id, newvar (), approx_type env sty, Cok)) | Ptyp_arrow (p, _, sty) -> - (* def: TODO*) newty (Tarrow (tarr_of_parr p, newvar (), approx_type env sty, Cok)) | Ptyp_tuple args -> newty (Ttuple (List.map (approx_type env) args)) @@ -1509,8 +1511,13 @@ let rec type_approx env sexp = match sexp.pexp_desc with Pexp_let (_, _, e) -> type_approx env e | Pexp_fun (Parr_optional s, _, _, e) -> - newty (Tarrow(Tarr_optional s, type_option (newvar ()), type_approx env e, Cok)) - | Pexp_fun (p,_,_, e) -> + newty (Tarrow(Tarr_optional s, type_option (newvar ()), + type_approx env e, Cok)) + | Pexp_fun (Parr_implicit s, _, _, e) -> + let id, env = Env.enter_module s (Mty_signature []) env in + newty (Tarrow(Tarr_implicit id, newvar (), + type_approx env e, Cok)) + | Pexp_fun (p, _, _, e) -> newty (Tarrow(tarr_of_parr p, newvar (), type_approx env e, Cok)) | Pexp_function ({pc_rhs=e}::_) -> newty (Tarrow(Tarr_simple, newvar (), type_approx env e, Cok)) diff --git a/typing/typemod.ml b/typing/typemod.ml index 42859c8e1a..3d661f80a7 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -1116,6 +1116,7 @@ let package_subtype env p1 nl1 tl1 p2 nl2 tl2 = with Includemod.Error msg -> false (* raise(Error(Location.none, env, Not_included msg)) *) +let () = Ctype.modtype_of_package := modtype_of_package let () = Ctype.package_subtype := package_subtype let wrap_constraint env arg mty explicit = diff --git a/typing/typetexp.ml b/typing/typetexp.ml index 318e697d27..430f81c486 100644 --- a/typing/typetexp.ml +++ b/typing/typetexp.ml @@ -419,6 +419,17 @@ let rec transl_type env policy styp = end in ctyp (Ttyp_var name) ty + | Ptyp_arrow(Parr_implicit s, st1, st2) -> + let cty1 = transl_type env policy st1 in + let package = match cty1.ctyp_desc with + | Ttyp_package pkg -> pkg + | _ -> assert false + in + let id, env = Env.enter_module s package.pack_type env in + let cty2 = transl_type env policy st2 in + let arr = Tarr_implicit id in + let ty = newty (Tarrow(arr, cty1.ctyp_type, cty2.ctyp_type, Cok)) in + ctyp (Ttyp_arrow (arr, cty1, cty2)) ty | Ptyp_arrow(arr, st1, st2) -> let cty1 = transl_type env policy st1 in let cty2 = transl_type env policy st2 in From 3511b492ea50b7b06ff7b0ca435e37b7effe71bb Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 30 Apr 2014 15:37:09 +0100 Subject: [PATCH 341/494] Separate generalize_implicits from generalize Choose specific implicits generalization points --- typing/ctype.ml | 3 --- typing/ctype.mli | 1 - typing/typecore.ml | 2 ++ typing/typeimplicit.ml | 2 -- 4 files changed, 2 insertions(+), 6 deletions(-) diff --git a/typing/ctype.ml b/typing/ctype.ml index 75623bfccf..7c19e742ae 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -17,8 +17,6 @@ open Asttypes open Types open Btype -let generalize_implicits = ref (fun () -> assert false) - (* Type manipulation after type inference ====================================== @@ -668,7 +666,6 @@ let iter_generalize tyl ty = iter_generalize tyl ty let generalize ty = - !generalize_implicits (); iter_generalize (ref []) ty (* Efficient repeated generalisation of the same type *) diff --git a/typing/ctype.mli b/typing/ctype.mli index 4c24e93936..e00c10a986 100644 --- a/typing/ctype.mli +++ b/typing/ctype.mli @@ -280,4 +280,3 @@ val package_subtype : val modtype_of_package : (Env.t -> Location.t -> Path.t -> Longident.t list -> type_expr list -> module_type) ref -val generalize_implicits : (unit -> unit) ref diff --git a/typing/typecore.ml b/typing/typecore.ml index e6f1575798..067f1a3baa 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -3890,6 +3890,7 @@ and type_let ?(check = fun s -> Warnings.Unused_var s) ignore(check_partial env pat.pat_type pat.pat_loc [case pat exp])) pat_list exp_list; end_def(); + generalize_implicits (); List.iter2 (fun pat exp -> if not (is_nonexpansive exp) then @@ -3933,6 +3934,7 @@ let type_expression env sexp = begin_def(); let exp = type_exp env sexp in end_def(); + generalize_implicits (); if is_nonexpansive exp then generalize exp.exp_type else generalize_expansive env exp.exp_type; match sexp.pexp_desc with diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index fd45da391c..16d3ceed43 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -237,8 +237,6 @@ let generalize_implicits () = pending_implicits := rest; assert (List.for_all find_instance to_generalize) -let () = Ctype.generalize_implicits := generalize_implicits - (* Extraction of pending implicit arguments *) let extract_pending_implicits expr = let rec traverse acc = function From 7992bc9a328485400bb39867124222ae6d15ad15 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 30 Apr 2014 15:39:27 +0100 Subject: [PATCH 342/494] Remove one-more printf debugging --- typing/typecore.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typing/typecore.ml b/typing/typecore.ml index 067f1a3baa..1478cca205 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1829,7 +1829,7 @@ and type_expect_ ?in_function env sexp ty_expected = let implicits, expr = instantiate_implicits_expr env expr in let implicits = Ident.fold_all (fun _ inst acc -> - prerr_endline "add pending implicit"; + (*prerr_endline "add pending implicit";*) inst :: acc) implicits [] in pending_implicits := implicits @ !pending_implicits; From ac475fd216ec65f6ca2be9ac98b1127da05ad5c7 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 30 Apr 2014 15:57:22 +0100 Subject: [PATCH 343/494] Typeimplicit: use path instead of arbitrary type variables as constraints --- typing/typeimplicit.ml | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index 16d3ceed43..17993b29c9 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -31,7 +31,10 @@ type pending_implicit = { implicit_env: Env.t; implicit_loc: Location.t; implicit_type: Path.t * Longident.t list * type_expr list; - mutable implicit_constraints: (type_expr * type_expr) list; + mutable implicit_constraints: (Path.t * type_expr) list; + (* When linking with an implicit module M, a constraint (path, ty) is + satisfied iff path unify with ty when implicit_id is bound to M in + implicit_env *) implicit_argument: argument; } @@ -91,14 +94,14 @@ let instantiate_implicits_ty loc env ty = ident is bound to the instance, all pairs in the list unify. *) let linked = Hashtbl.create 7 in - let add_constraint inst ~constr ~ty ~var = + let add_constraint inst ~path ~var = begin try - let var' = Hashtbl.find linked constr in + let var' = Hashtbl.find linked path in link_type var var' with Not_found -> - Hashtbl.add linked constr var + Hashtbl.add linked path var end; - inst.implicit_constraints <- (ty,var) :: inst.implicit_constraints + inst.implicit_constraints <- (path,var) :: inst.implicit_constraints in let rec unlink_constructors ty = (* First recurse in sub expressions *) @@ -106,23 +109,22 @@ let instantiate_implicits_ty loc env ty = (* Then replace current type if it is a constructor referring to an implicit *) match ty.desc with - | Tconstr (path,_,_) as constr -> + | Tconstr (path,[],_) -> begin try let inst = Ident.find_same (Path.head path) instances in - (* Fresh variable *) - let ty' = newvar() in - (* Swap the content of ty and ty' … *) - let {desc = desc; level = lv; id = id} = ty in - let {desc = desc'; level = lv'; id = id'} = ty' in + (* Replace `ty' by a fresh variable *) + let {desc = desc'; level = lv'; id = id'} = newvar() in ty.desc <- desc'; ty.level <- lv'; ty.id <- id'; - ty'.desc <- desc; - ty'.level <- lv; - ty'.id <- id; - add_constraint inst ~constr ~ty:ty' ~var:ty + add_constraint inst ~path ~var:ty with Not_found -> () end + (* No HKT *) + | Tconstr (path,_,_) + when (try ignore (Ident.find_same (Path.head path) instances); true + with Not_found -> false) -> + assert false | _ -> () in unlink_constructors ty; @@ -174,8 +176,9 @@ let pack_implicit inst path = let link_implicit_to_path inst path = (* Check that all constraints are satisfied *) let subst = Subst.add_module inst.implicit_id path Subst.identity in - List.iter (fun (ty,ty') -> - let ty = Subst.type_expr subst ty in + List.iter (fun (tpath,ty') -> + let tpath = Subst.type_path subst tpath in + let ty = newconstr tpath [] in let ty' = Subst.type_expr subst ty' in unify inst.implicit_env ty ty' ) From b7b0a83acf80e7a3ee246c89f9280008632f5e21 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 30 Apr 2014 16:15:32 +0100 Subject: [PATCH 344/494] Catch uninstantiable implicit and print minimal error message --- typing/typecore.ml | 9 +++++++++ typing/typecore.mli | 1 + typing/typeimplicit.ml | 8 +++++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/typing/typecore.ml b/typing/typecore.ml index 1478cca205..e33ca026f3 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -69,6 +69,7 @@ type error = | Invalid_for_loop_index | No_value_clauses | Exception_pattern_below_toplevel + | Pending_implicit of pending_implicit exception Error of Location.t * Env.t * error exception Error_forward of Location.error @@ -118,6 +119,11 @@ let case lhs rhs = let make_argument (f,e) = {arg_flag = f; arg_expression = e} +let generalize_implicits () = + try generalize_implicits () + with Uninstantiable_implicit inst -> + raise (Error (inst.implicit_loc, inst.implicit_env, Pending_implicit inst)) + (* Upper approximation of free identifiers on the parse tree *) let iter_expression f e = @@ -4174,6 +4180,9 @@ let report_error env ppf = function | Exception_pattern_below_toplevel -> fprintf ppf "@[Exception patterns must be at the top level of a match case.@]" + | Pending_implicit inst -> + fprintf ppf "Cannot find instance for implicit %s." + (Ident.name inst.implicit_id) let report_error env ppf err = wrap_printing_env env (fun () -> report_error env ppf err) diff --git a/typing/typecore.mli b/typing/typecore.mli index 3bc4ff990c..526eb7d5f6 100644 --- a/typing/typecore.mli +++ b/typing/typecore.mli @@ -113,6 +113,7 @@ type error = | Invalid_for_loop_index | No_value_clauses | Exception_pattern_below_toplevel + | Pending_implicit of Typeimplicit.pending_implicit exception Error of Location.t * Env.t * error exception Error_forward of Location.error diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index 17993b29c9..1182226554 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -38,6 +38,8 @@ type pending_implicit = { implicit_argument: argument; } +exception Uninstantiable_implicit of pending_implicit + let pending_implicits : pending_implicit list ref = ref [] @@ -238,7 +240,11 @@ let generalize_implicits () = List.partition need_generalization pending in pending_implicits := rest; - assert (List.for_all find_instance to_generalize) + try + let not_instantiable inst = not (find_instance inst) in + let inst = List.find not_instantiable to_generalize in + raise (Uninstantiable_implicit inst) + with Not_found -> () (* Extraction of pending implicit arguments *) let extract_pending_implicits expr = From a1e47edb72b98891898c41ff7d4217e0d1a97a52 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 30 Apr 2014 17:16:09 +0100 Subject: [PATCH 345/494] Generate fresh identifier for implicit argument, fix moregeneral / inclusion checking --- typing/btype.mli | 2 ++ typing/ctype.ml | 80 ++++++++++++++++++++++++------------------------ typing/subst.ml | 5 +++ 3 files changed, 47 insertions(+), 40 deletions(-) diff --git a/typing/btype.mli b/typing/btype.mli index 91ca7824db..0a02f58095 100644 --- a/typing/btype.mli +++ b/typing/btype.mli @@ -121,6 +121,8 @@ val copy_row: bool -> row_desc -> bool -> type_expr -> row_desc val copy_kind: field_kind -> field_kind +val copy_commu: commutable -> commutable + val save_desc: type_expr -> type_desc -> unit (* Save a type description *) val dup_kind: field_kind option ref -> unit diff --git a/typing/ctype.ml b/typing/ctype.ml index 7c19e742ae..bcb0fcfbe0 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -2978,7 +2978,7 @@ let may_instantiate inst_nongen t1 = if inst_nongen then t1.level <> generic_level - 1 else t1.level = generic_level -let rec moregen inst_nongen type_pairs env t1 t2 = +let rec moregen inst_nongen type_pairs subst env t1 t2 = if t1 == t2 then () else let t1 = repr t1 in let t2 = repr t2 in @@ -3008,39 +3008,39 @@ let rec moregen inst_nongen type_pairs env t1 t2 = link_type t1' t2 | (Tarrow (Tarr_implicit id1, t1, u1, c1), Tarrow (Tarr_implicit id2, t2, u2, c2)) -> - moregen inst_nongen type_pairs env t1 t2; - let mty = modtype_of_tpackage env t1 in - let env = Env.add_module id1 mty env in - let env = Env.add_module id2 mty env in - moregen inst_nongen type_pairs env u1 u2 + moregen inst_nongen type_pairs subst env t1 t2; + let subst = Subst.add_module id2 (Path.Pident id1) subst in + moregen inst_nongen type_pairs subst env u1 u2 | (Tarrow (l1, t1, u1, _), Tarrow (l2, t2, u2, _)) when classic_arrows_are_compatible l1 l2 -> - moregen inst_nongen type_pairs env t1 t2; - moregen inst_nongen type_pairs env u1 u2 + moregen inst_nongen type_pairs subst env t1 t2; + moregen inst_nongen type_pairs subst env u1 u2 | (Ttuple tl1, Ttuple tl2) -> - moregen_list inst_nongen type_pairs env tl1 tl2 + moregen_list inst_nongen type_pairs subst env tl1 tl2 | (Tconstr (p1, tl1, _), Tconstr (p2, tl2, _)) - when Path.same p1 p2 -> - moregen_list inst_nongen type_pairs env tl1 tl2 + when Path.same + (Subst.type_path subst p1) + (Subst.type_path subst p2) -> + moregen_list inst_nongen type_pairs subst env tl1 tl2 | (Tpackage (p1, n1, tl1), Tpackage (p2, n2, tl2)) -> begin try - unify_package env (moregen_list inst_nongen type_pairs env) + unify_package env (moregen_list inst_nongen type_pairs subst env) t1'.level p1 n1 tl1 t2'.level p2 n2 tl2 with Not_found -> raise (Unify []) end | (Tvariant row1, Tvariant row2) -> - moregen_row inst_nongen type_pairs env row1 row2 + moregen_row inst_nongen type_pairs subst env row1 row2 | (Tobject (fi1, nm1), Tobject (fi2, nm2)) -> - moregen_fields inst_nongen type_pairs env fi1 fi2 + moregen_fields inst_nongen type_pairs subst env fi1 fi2 | (Tfield _, Tfield _) -> (* Actually unused *) - moregen_fields inst_nongen type_pairs env t1' t2' + moregen_fields inst_nongen type_pairs subst env t1' t2' | (Tnil, Tnil) -> () | (Tpoly (t1, []), Tpoly (t2, [])) -> - moregen inst_nongen type_pairs env t1 t2 + moregen inst_nongen type_pairs subst env t1 t2 | (Tpoly (t1, tl1), Tpoly (t2, tl2)) -> enter_poly env univar_pairs t1 tl1 t2 tl2 - (moregen inst_nongen type_pairs env) + (moregen inst_nongen type_pairs subst env) | (Tunivar _, Tunivar _) -> unify_univar t1' t2' !univar_pairs | (_, _) -> @@ -3049,22 +3049,22 @@ let rec moregen inst_nongen type_pairs env t1 t2 = with Unify trace -> raise (Unify ((t1, t2)::trace)) -and moregen_list inst_nongen type_pairs env tl1 tl2 = +and moregen_list inst_nongen type_pairs subst env tl1 tl2 = if List.length tl1 <> List.length tl2 then raise (Unify []); - List.iter2 (moregen inst_nongen type_pairs env) tl1 tl2 + List.iter2 (moregen inst_nongen type_pairs subst env) tl1 tl2 -and moregen_fields inst_nongen type_pairs env ty1 ty2 = +and moregen_fields inst_nongen type_pairs subst env ty1 ty2 = let (fields1, rest1) = flatten_fields ty1 and (fields2, rest2) = flatten_fields ty2 in let (pairs, miss1, miss2) = associate_fields fields1 fields2 in if miss1 <> [] then raise (Unify []); - moregen inst_nongen type_pairs env rest1 + moregen inst_nongen type_pairs subst env rest1 (build_fields (repr ty2).level miss2 rest2); List.iter (fun (n, k1, t1, k2, t2) -> moregen_kind k1 k2; - try moregen inst_nongen type_pairs env t1 t2 with Unify trace -> + try moregen inst_nongen type_pairs subst env t1 t2 with Unify trace -> raise (Unify ((newty (Tfield(n, k1, t1, rest2)), newty (Tfield(n, k2, t2, rest2)))::trace))) pairs @@ -3078,7 +3078,7 @@ and moregen_kind k1 k2 = | (Fpresent, Fpresent) -> () | _ -> raise (Unify []) -and moregen_row inst_nongen type_pairs env row1 row2 = +and moregen_row inst_nongen type_pairs subst env row1 row2 = let row1 = row_repr row1 and row2 = row_repr row2 in let rm1 = repr row1.row_more and rm2 = repr row2.row_more in if rm1 == rm2 then () else @@ -3103,7 +3103,7 @@ and moregen_row inst_nongen type_pairs env row1 row2 = moregen_occur env rm1.level ext; link_type rm1 ext | Tconstr _, Tconstr _ -> - moregen inst_nongen type_pairs env rm1 rm2 + moregen inst_nongen type_pairs subst env rm1 rm2 | _ -> raise (Unify []) end; List.iter @@ -3112,20 +3112,20 @@ and moregen_row inst_nongen type_pairs env row1 row2 = if f1 == f2 then () else match f1, f2 with Rpresent(Some t1), Rpresent(Some t2) -> - moregen inst_nongen type_pairs env t1 t2 + moregen inst_nongen type_pairs subst env t1 t2 | Rpresent None, Rpresent None -> () | Reither(false, tl1, _, e1), Rpresent(Some t2) when may_inst -> set_row_field e1 f2; - List.iter (fun t1 -> moregen inst_nongen type_pairs env t1 t2) tl1 + List.iter (fun t1 -> moregen inst_nongen type_pairs subst env t1 t2) tl1 | Reither(c1, tl1, _, e1), Reither(c2, tl2, m2, e2) -> if e1 != e2 then begin if c1 && not c2 then raise(Unify []); set_row_field e1 (Reither (c2, [], m2, e2)); if List.length tl1 = List.length tl2 then - List.iter2 (moregen inst_nongen type_pairs env) tl1 tl2 + List.iter2 (moregen inst_nongen type_pairs subst env) tl1 tl2 else match tl2 with t2 :: _ -> - List.iter (fun t1 -> moregen inst_nongen type_pairs env t1 t2) + List.iter (fun t1 -> moregen inst_nongen type_pairs subst env t1 t2) tl1 | [] -> if tl1 <> [] then raise (Unify []) @@ -3139,9 +3139,9 @@ and moregen_row inst_nongen type_pairs env row1 row2 = pairs (* Must empty univar_pairs first *) -let moregen inst_nongen type_pairs env patt subj = +let moregen inst_nongen type_pairs subst env patt subj = univar_pairs := []; - moregen inst_nongen type_pairs env patt subj + moregen inst_nongen type_pairs subst env patt subj (* Non-generic variable can be instanciated only if [inst_nongen] is @@ -3165,7 +3165,7 @@ let moregeneral env inst_nongen pat_sch subj_sch = (* Duplicate generic variables *) let patt = instance env pat_sch in let res = - try moregen inst_nongen (TypePairs.create 13) env patt subj; true with + try moregen inst_nongen (TypePairs.create 13) Subst.identity env patt subj; true with Unify _ -> false in current_level := old_level; @@ -3438,18 +3438,18 @@ type class_match_failure = exception Failure of class_match_failure list -let rec moregen_clty trace type_pairs env cty1 cty2 = +let rec moregen_clty trace type_pairs subst env cty1 cty2 = try match cty1, cty2 with Cty_constr (_, _, cty1), _ -> - moregen_clty true type_pairs env cty1 cty2 + moregen_clty true type_pairs subst env cty1 cty2 | _, Cty_constr (_, _, cty2) -> - moregen_clty true type_pairs env cty1 cty2 + moregen_clty true type_pairs subst env cty1 cty2 | Cty_arrow (l1, ty1, cty1'), Cty_arrow (l2, ty2, cty2') when l1 = l2 -> - begin try moregen true type_pairs env ty1 ty2 with Unify trace -> + begin try moregen true type_pairs subst env ty1 ty2 with Unify trace -> raise (Failure [CM_Parameter_mismatch (env, expand_trace env trace)]) end; - moregen_clty false type_pairs env cty1' cty2' + moregen_clty false type_pairs subst env cty1' cty2' | Cty_signature sign1, Cty_signature sign2 -> let ty1 = object_fields (repr sign1.csig_self) in let ty2 = object_fields (repr sign2.csig_self) in @@ -3458,7 +3458,7 @@ let rec moregen_clty trace type_pairs env cty1 cty2 = let (pairs, miss1, miss2) = associate_fields fields1 fields2 in List.iter (fun (lab, k1, t1, k2, t2) -> - begin try moregen true type_pairs env t1 t2 with Unify trace -> + begin try moregen true type_pairs subst env t1 t2 with Unify trace -> raise (Failure [CM_Meth_type_mismatch (lab, env, expand_trace env trace)]) end) @@ -3466,7 +3466,7 @@ let rec moregen_clty trace type_pairs env cty1 cty2 = Vars.iter (fun lab (mut, v, ty) -> let (mut', v', ty') = Vars.find lab sign1.csig_vars in - try moregen true type_pairs env ty' ty with Unify trace -> + try moregen true type_pairs subst env ty' ty with Unify trace -> raise (Failure [CM_Val_type_mismatch (lab, env, expand_trace env trace)])) sign2.csig_vars @@ -3519,7 +3519,7 @@ let match_class_types ?(trace=true) env pat_sch subj_sch = (List.map (fun m -> CM_Missing_method m) missing_method) @ error in (* Always succeeds *) - moregen true type_pairs env rest1 rest2; + moregen true type_pairs Subst.identity env rest1 rest2; let error = List.fold_right (fun (lab, k1, t1, k2, t2) err -> @@ -3560,7 +3560,7 @@ let match_class_types ?(trace=true) env pat_sch subj_sch = match error with [] -> begin try - moregen_clty trace type_pairs env patt subj; + moregen_clty trace type_pairs Subst.identity env patt subj; [] with Failure r -> r diff --git a/typing/subst.ml b/typing/subst.ml index 5f6bdc0c34..8c3408cc34 100644 --- a/typing/subst.ml +++ b/typing/subst.ml @@ -185,6 +185,11 @@ let rec typexp s ty = end | Tfield(label, kind, t1, t2) when field_kind_repr kind = Fabsent -> Tlink (typexp s t2) + | Tarrow(Tarr_implicit id, t1, t2, c) -> + let t1' = typexp s t1 in + let id' = Ident.rename id in + let t2' = typexp (add_module id (Pident id') s) t2 in + Tarrow (Tarr_implicit id', t1', t2', copy_commu c) | _ -> copy_type_desc (typexp s) desc end; ty' From f8ed4e9584a81f186f77dfdce9340e59472348c2 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 30 Apr 2014 18:34:03 +0100 Subject: [PATCH 346/494] Fix fake module names --- typing/typeimplicit.ml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index 1182226554..29972d5ca8 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -161,8 +161,8 @@ let pack_implicit inst path = implicit_loc = loc } = inst in let md = Env.find_module path env in let md = {md with md_type = (Mty_alias path)} in - let _, env' = Env.enter_module_declaration "Pkg" md env in - let pmd = Ast_helper.(Mod.ident (Convenience.lid "Pkg")) in + let _, env' = Env.enter_module_declaration "%P" md env in + let pmd = Ast_helper.(Mod.ident (Convenience.lid "%P")) in let (modl, tl') = !type_package env' pmd p nl tl in { exp_desc = Texp_pack modl; From 1e6e8de7431eb5af21270daab5bd4e8f9290e416 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 2 May 2014 11:34:38 +0100 Subject: [PATCH 347/494] Add Typemod.type_implicit_instance Do the same work as type_package but directly packing a Typedtree.module_expr rather than a Parsetree.module_expr. --- typing/path.ml | 5 +++++ typing/path.mli | 2 ++ typing/typeimplicit.ml | 17 +++++++++++------ typing/typemod.ml | 13 ++++--------- 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/typing/path.ml b/typing/path.ml index 260fc0731c..bc486259d1 100644 --- a/typing/path.ml +++ b/typing/path.ml @@ -52,3 +52,8 @@ let rec last = function | Pident id -> Ident.name id | Pdot(_, s, _) -> s | Papply(_, p) -> last p + +let rec to_longident = function + | Pident id -> Longident.Lident (Ident.name id) + | Pdot(p, s, _) -> Longident.Ldot (to_longident p, s) + | Papply (p1, p2) -> Longident.Lapply (to_longident p1, to_longident p2) diff --git a/typing/path.mli b/typing/path.mli index c3f84130db..8f1ef05d2f 100644 --- a/typing/path.mli +++ b/typing/path.mli @@ -28,3 +28,5 @@ val name: ?paren:(string -> bool) -> t -> string val head: t -> Ident.t val last: t -> string + +val to_longident: t -> Longident.t diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index 29972d5ca8..3f350bce8e 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -5,8 +5,8 @@ open Typedtree (* Forward declaration, to be filled in by Typemod.type_package *) -let type_package - : (Env.t -> Parsetree.module_expr -> Path.t -> Longident.t list -> +let type_implicit_instance + : (Env.t -> Typedtree.module_expr -> Path.t -> Longident.t list -> type_expr list -> Typedtree.module_expr * type_expr list) ref = ref (fun _ -> assert false) @@ -160,10 +160,15 @@ let pack_implicit inst path = implicit_env = env; implicit_loc = loc } = inst in let md = Env.find_module path env in - let md = {md with md_type = (Mty_alias path)} in - let _, env' = Env.enter_module_declaration "%P" md env in - let pmd = Ast_helper.(Mod.ident (Convenience.lid "%P")) in - let (modl, tl') = !type_package env' pmd p nl tl in + let lident = Location.mkloc (Path.to_longident path) loc in + let modl = { + mod_desc = Tmod_ident (path, lident); + mod_loc = loc; + mod_type = md.md_type; + mod_env = env; + mod_attributes = []; + } in + let (modl, tl') = !type_implicit_instance env modl p nl tl in { exp_desc = Texp_pack modl; exp_loc = loc; exp_extra = []; diff --git a/typing/typemod.ml b/typing/typemod.ml index 3d661f80a7..2c27183c1f 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -1677,16 +1677,11 @@ let type_package env m p nl tl = nl tl'; (wrap_constraint env modl mty Tmodtype_implicit, tl') -let type_implicit_instance env m p nl tl = - (* Same as Pexp_letmodule *) - (* remember original level *) +let type_implicit_instance env modl p nl tl = + (* Same as type_package *) let lv = Ctype.get_current_level () in Ctype.begin_def (); Ident.set_current_time lv; - let context = Typetexp.narrow () in - let modl = type_module env m in - Ctype.init_def(Ident.current_time()); - Typetexp.widen context; let (mp, env) = match modl.mod_desc with Tmod_ident (mp,_) -> (mp, env) @@ -1712,7 +1707,7 @@ let type_implicit_instance env m p nl tl = (fun n ty -> try Ctype.unify env ty (Ctype.newvar ()) with Ctype.Unify _ -> - raise (Error(m.pmod_loc, env, Scoping_pack (n,ty)))) + raise (Error(modl.mod_loc, env, Scoping_pack (n,ty)))) nl tl'; (wrap_constraint env modl mty Tmodtype_implicit, tl') @@ -1723,7 +1718,7 @@ let () = Typetexp.transl_modtype := transl_modtype; Typecore.type_open := type_open_ ?toplevel:None; Typecore.type_package := type_package; - Typeimplicit.type_package := type_package; + Typeimplicit.type_implicit_instance := type_implicit_instance; type_module_type_of_fwd := type_module_type_of From 6a4eb2466d1ae416cefea4472b74ca0e4952f7e8 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Tue, 6 May 2014 13:36:56 +0100 Subject: [PATCH 348/494] Extract instance search code from Typeimplicit into Implicitsearch --- Makefile | 2 +- typing/implicitsearch.ml | 36 +++++++++++++++ typing/typecore.ml | 32 +++++--------- typing/typeimplicit.ml | 95 +++++++++++++++++++++------------------- 4 files changed, 98 insertions(+), 67 deletions(-) create mode 100644 typing/implicitsearch.ml diff --git a/Makefile b/Makefile index a7a523afb5..229d5ae119 100644 --- a/Makefile +++ b/Makefile @@ -61,7 +61,7 @@ TYPING=typing/ident.cmo typing/path.cmo \ typing/includemod.cmo typing/typetexp.cmo typing/parmatch.cmo \ typing/stypes.cmo typing/typecore.cmo \ typing/typedecl.cmo typing/typeclass.cmo \ - typing/typemod.cmo + typing/typemod.cmo typing/implicitsearch.cmo COMP=bytecomp/lambda.cmo bytecomp/printlambda.cmo \ bytecomp/typeopt.cmo bytecomp/switch.cmo bytecomp/matching.cmo \ diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml new file mode 100644 index 0000000000..828617cbef --- /dev/null +++ b/typing/implicitsearch.ml @@ -0,0 +1,36 @@ +open Btype +open Ctype +open Types +open Typedtree +open Typeimplicit + + +let generalize_implicits () = + let current_level = get_current_level () in + let not_linked = function + | {implicit_argument = {arg_expression = Some _}} -> false + | _ -> true + in + let pending = List.filter not_linked !pending_implicits in + let need_generalization inst = + List.exists + (fun (ty,var) -> + assert (var.level <> generic_level); + var.level >= current_level) + inst.implicit_constraints + || inst.implicit_constraints = [] + in + let to_generalize, rest = + List.partition need_generalization pending + in + pending_implicits := rest; + try + let not_instantiable inst = not (find_instance inst) in + let inst = List.find not_instantiable to_generalize in + let loc = inst.implicit_loc in + let env = inst.implicit_env in + raise Typecore.(Error (loc, env, Pending_implicit inst)) + with Not_found -> () + +let () = + Typeimplicit.generalize_implicits_ref := generalize_implicits diff --git a/typing/typecore.ml b/typing/typecore.ml index e33ca026f3..d892957500 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -17,7 +17,6 @@ open Asttypes open Parsetree open Types open Typedtree -open Typeimplicit open Btype open Ctype @@ -69,7 +68,7 @@ type error = | Invalid_for_loop_index | No_value_clauses | Exception_pattern_below_toplevel - | Pending_implicit of pending_implicit + | Pending_implicit of Typeimplicit.pending_implicit exception Error of Location.t * Env.t * error exception Error_forward of Location.error @@ -119,11 +118,6 @@ let case lhs rhs = let make_argument (f,e) = {arg_flag = f; arg_expression = e} -let generalize_implicits () = - try generalize_implicits () - with Uninstantiable_implicit inst -> - raise (Error (inst.implicit_loc, inst.implicit_env, Pending_implicit inst)) - (* Upper approximation of free identifiers on the parse tree *) let iter_expression f e = @@ -1832,13 +1826,7 @@ and type_expect_ ?in_function env sexp ty_expected = exp_attributes = sexp.pexp_attributes; exp_env = env; } in - let implicits, expr = instantiate_implicits_expr env expr in - let implicits = - Ident.fold_all (fun _ inst acc -> - (*prerr_endline "add pending implicit";*) - inst :: acc) implicits [] - in - pending_implicits := implicits @ !pending_implicits; + let expr = Typeimplicit.instantiate_implicits_expr env expr in rue expr end | Pexp_constant(Const_string (str, _) as cst) -> ( @@ -1960,7 +1948,7 @@ and type_expect_ ?in_function env sexp ty_expected = end_def (); wrap_trace_gadt_instances env (lower_args []) ty; begin_def (); - let pending = extract_pending_implicits funct in + let pending = Typeimplicit.extract_pending_implicits funct in let (args, ty_res) = type_application env funct pending sargs in let args = List.map (fun (arr,expo) -> make_argument (tapp_of_tarr arr, expo)) @@ -3238,7 +3226,7 @@ and type_argument env sarg ty_expected' ty_expected = texp and type_application env funct - (pending : pending_implicit list) + (pending : Typeimplicit.pending_implicit list) (sargs : (Parsetree.apply_flag * Parsetree.expression) list) = (* funct.exp_type may be generic *) let sargs = List.map (fun (app,e) -> tapp_of_papp app, e) sargs in @@ -3442,10 +3430,10 @@ and type_application env funct | [], _ | _, [] -> List.rev_append args' args, pending | (inst :: pending), ((Tapp_implicit,arg) :: args) -> - prerr_endline "applying implicits"; - let p, nl, tl = inst.implicit_type in + let p, nl, tl = inst.Typeimplicit.implicit_type in let package_ty = newgenty (Tpackage (p,nl,tl)) in - link_implicit_to_expr inst (type_expect env arg package_ty); + Typeimplicit.link_implicit_to_expr + inst (type_expect env arg package_ty); type_implicits args' args pending | _, (arg :: args) -> type_implicits (arg :: args') args pending @@ -3896,7 +3884,7 @@ and type_let ?(check = fun s -> Warnings.Unused_var s) ignore(check_partial env pat.pat_type pat.pat_loc [case pat exp])) pat_list exp_list; end_def(); - generalize_implicits (); + Typeimplicit.generalize_implicits (); List.iter2 (fun pat exp -> if not (is_nonexpansive exp) then @@ -3940,7 +3928,7 @@ let type_expression env sexp = begin_def(); let exp = type_exp env sexp in end_def(); - generalize_implicits (); + Typeimplicit.generalize_implicits (); if is_nonexpansive exp then generalize exp.exp_type else generalize_expansive env exp.exp_type; match sexp.pexp_desc with @@ -4182,7 +4170,7 @@ let report_error env ppf = function "@[Exception patterns must be at the top level of a match case.@]" | Pending_implicit inst -> fprintf ppf "Cannot find instance for implicit %s." - (Ident.name inst.implicit_id) + (Ident.name inst.Typeimplicit.implicit_id) let report_error env ppf err = wrap_printing_env env (fun () -> report_error env ppf err) diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index 3f350bce8e..32440186d2 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -38,8 +38,6 @@ type pending_implicit = { implicit_argument: argument; } -exception Uninstantiable_implicit of pending_implicit - let pending_implicits : pending_implicit list ref = ref [] @@ -133,22 +131,24 @@ let instantiate_implicits_ty loc env ty = arguments, instances, ty let instantiate_implicits_expr env expr = - (*prerr_endline "instantiate_implicits_expr";*) - match - instantiate_implicits_ty expr.exp_loc env expr.exp_type - with - | [], implicits, _ -> - (*prerr_endline "none";*) - implicits,expr - | arguments, implicits, ty -> - implicits, - { exp_desc = Texp_apply (expr, arguments); - exp_type = ty; - exp_loc = expr.exp_loc; - exp_extra = []; - exp_env = env; - exp_attributes = [] - } + let implicits, expr = + match instantiate_implicits_ty expr.exp_loc env expr.exp_type with + | [], implicits, _ -> + implicits,expr + | arguments, implicits, ty -> + implicits, + { exp_desc = Texp_apply (expr, arguments); + exp_type = ty; + exp_loc = expr.exp_loc; + exp_extra = []; + exp_env = env; + exp_attributes = [] + } + in + let cons _ inst acc = inst :: acc in + let implicits = Ident.fold_all cons implicits [] in + pending_implicits := implicits @ !pending_implicits; + expr (* Pack module at given path to match a given implicit instance and @@ -209,7 +209,34 @@ let link_implicit_to_expr inst expr = in link_implicit_to_path inst path -(* Naive resolution procedure *) +(**************************) +(** Resolution procedure **) +(**************************) + +(*let implicit_mty inst = + let open Ast_helper in + let (path, nl, tl) = inst.implicit_type in + let mtd = { mtd_type = Some (Mty_ident path); + mtd_attributes = []; + mtd_loc = Location.none; } + in + let _, env = Env.enter_modtype "%M" mtd inst.implicit_env in + let mty = + Typetexp.create_package_mty Location.none env + (Location.mknoloc (Longident.Lident "%M"), nl, tl) + in + let mty = + + + +type sign = { + sign_type : Types.module_type; + (*sign_constraints :*) +}*) + + + + let find_instance inst = let snapshot = Btype.snapshot () in let modules = Env.implicit_instances inst.implicit_env in @@ -224,32 +251,12 @@ let find_instance inst = in List.exists module_match modules -let generalize_implicits () = - (*Printf.eprintf "generalize_implicits %d\n%!" (List.length !pending_implicits);*) +let generalize_implicits_ref + : (unit -> unit) ref + = ref (fun () -> assert false) - let current_level = get_current_level () in - let _not_linked = function - | {implicit_argument = {arg_expression = Some _}} -> false - | _ -> true - in - let pending = (*List.filter not_linked*) !pending_implicits in - let need_generalization inst = - List.exists - (fun (ty,var) -> - assert (var.level <> generic_level); - var.level >= current_level) - inst.implicit_constraints - || inst.implicit_constraints = [] - in - let to_generalize, rest = - List.partition need_generalization pending - in - pending_implicits := rest; - try - let not_instantiable inst = not (find_instance inst) in - let inst = List.find not_instantiable to_generalize in - raise (Uninstantiable_implicit inst) - with Not_found -> () +let generalize_implicits () = + !generalize_implicits_ref () (* Extraction of pending implicit arguments *) let extract_pending_implicits expr = From b13ffe0b54de69861addd216f611921c6136601c Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Tue, 6 May 2014 17:52:09 +0100 Subject: [PATCH 349/494] WIP, added "sign" to typeimplicit --- typing/implicitsearch.ml | 213 +++++++++++++++++++++++++++++++++++++++ typing/path.ml | 11 ++ typing/path.mli | 3 + typing/typeimplicit.ml | 57 ++--------- 4 files changed, 235 insertions(+), 49 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 828617cbef..13b293c8fb 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -4,6 +4,219 @@ open Types open Typedtree open Typeimplicit +(*let alias_id = ref 0 +let alias_ty env ty = + incr alias_id; + let name = "%t" ^ string_of_int !alias_id in + let tyd = { type_params = []; + type_arity = 0; + type_kind = Type_abstract; + type_private = Asttypes.Public; + type_manifest = Some ty; + type_variance = []; + type_newtype_level = None; + type_loc = Location.none; + type_attributes = [] } + in + let _, env = Env.enter_type name tyd env in + env, Ast_helper.Typ.constr (Location.mknoloc (Longident.Lident name)) [] + +let alias_tys (env,tl) ty = + let env, t = alias_ty env ty in + env, t :: tl + +let implicit_mty inst = + let (path, nl, tl) = inst.implicit_type in + let mtd = { mtd_type = Some (Mty_ident path); + mtd_attributes = []; + mtd_loc = Location.none; } + in + (* Generate fresh name for module *) + let _, env = Env.enter_modtype "%M" mtd inst.implicit_env in + + (* Generate fresh names for types *) + let env, tl' = List.fold_left alias_tys (env,[]) tl in + let tl' = List.rev tl' in + + let _, pmty = + Typetexp.create_package_mty Location.none env + (Location.mknoloc (Longident.Lident "%M"), + List.map2 (fun n t -> Location.mknoloc n, t) nl tl') + in + let mty = !Typetexp.transl_modtype env pmty in + + let mty = Mtype.scrape env mty.mty_type in + mty*) + +module Constraints = struct + + let rec list_extract f acc = function + | x :: xs when f x -> x, List.rev_append acc xs + | x :: xs -> list_extract f (x :: acc) xs + | [] -> raise Not_found + let list_extract f xs = list_extract f [] xs + + let name_match prj name (qname,_) = name = prj qname + + let split_constraint (local,subs) = function + | [], _ -> + assert false + | [x], c -> + ((x, c) :: local, subs) + | (x :: xs), c -> + let (x, sub), subs = + try list_extract (name_match (fun x->x) x) subs + with Not_found -> (x, []), subs + in + (local, (x, (xs, c) :: sub) :: subs) + + let split_constraints l = + List.fold_left split_constraint ([],[]) l + + let rec try_mty env prj cstrs mty = + if cstrs = [] then [], mty else + match mty with + | Mty_functor _ | Mty_alias _ -> cstrs, mty + | Mty_ident p -> + begin try + let mty = Env.find_modtype_expansion p env in + try_mty env prj cstrs mty + with Not_found -> + cstrs, mty + end + | Mty_signature sg -> + let failed, sg' = try_sig env prj cstrs sg in + failed, Mty_signature sg' + + and try_sig_item env prj failed (locs, subs as cstrs) field = + match field with + | Sig_value _ | Sig_modtype _ | Sig_class _ + | Sig_class_type _ | Sig_exception _ -> + failed, cstrs, field + | Sig_type (id,decl,recst) -> + let name = Ident.name id in + begin try + let (qname, ty), locs = list_extract (name_match prj name) locs in + match decl.type_manifest with + | None -> + failed, (locs, subs), + Sig_type (id,{decl with type_manifest = Some ty},recst) + | Some _ -> + (([qname], ty) :: failed), (locs, subs), + Sig_type (id,decl,recst) + with Not_found -> + failed, cstrs, field + end + | Sig_module (id,decl,recst) -> + let name = Ident.name id in + begin try + let (qname, sub), subs = list_extract (name_match prj name) subs in + let subfailed, md_type = try_mty env prj sub decl.md_type in + let subfailed = List.rev_map (fun(xs,t)->(qname::xs,t)) subfailed in + (subfailed @ failed), (locs, subs), + Sig_module (id,{decl with md_type},recst) + with Not_found -> + failed, cstrs, field + end + | Sig_implicit (id,decl) -> + let name = Ident.name id in + begin try + let (qname, sub), subs = list_extract (name_match prj name) subs in + let imd = decl.imd_module in + let subfailed, md_type = try_mty env prj sub imd.md_type in + let subfailed = List.rev_map (fun(xs,t)->(qname::xs,t)) subfailed in + (subfailed @ failed), (locs, subs), + Sig_implicit (id,{decl with imd_module = {imd with md_type}}) + with Not_found -> + failed, cstrs, field + end + + and try_sig' env prj fields failed cstrs = function + | [] -> + let (locs, subs) = cstrs in + let locs = List.map (fun (x,t) -> [x],t) locs in + let subs = List.map + (fun (x,xss) -> List.map (fun (xs,c) -> (x::xs),c) xss) + subs + in + let failed = locs @ List.flatten subs @ failed in + failed, List.rev fields + + | item :: items -> + let failed, cstrs, item' = try_sig_item env prj failed cstrs item in + try_sig' env prj (item' :: fields) failed cstrs items + + and try_sig env prj cstrs sg = + if cstrs = [] then + [], sg + else + try_sig' env prj [] [] (split_constraints cstrs) sg + +end + +type sign = { + sign_type : Types.module_type; + sign_id : Ident.t; + sign_constraints : (Path.t * Types.type_expr) list; +} + +let sign_instance inst = + let env = inst.implicit_env in + let path, nl, tl = inst.implicit_type in + let mtd = Env.find_modtype path env in + let mty = match mtd.mtd_type with + | None -> assert false + | Some mty -> mty + in + let with_cstrs = List.map2 (fun n t -> Longident.flatten n, t) nl tl in + let mty = + let failed, mty = Constraints.try_mty env (fun x->x) with_cstrs mty in + (* No constraint should fail to apply, otherwise we are doing something + wrong with package_type. *) + assert (failed = []); + mty + in + let ident = inst.implicit_id in + let flatten_cstr (n,t) = + let id', dots = Path.flatten n in + (* All constraints should apply to fields of the implicit module *) + assert (Ident.same ident id'); + assert (dots <> []); + dots, t + in + let cstrs = inst.implicit_constraints in + let cstrs = List.map flatten_cstr cstrs in + let failed, mty = Constraints.try_mty env fst cstrs mty in + let unflatten_cstr (n,t) = Path.unflatten ident n, t in + let constraints = List.map unflatten_cstr failed in + { sign_type = mty; sign_id = ident; sign_constraints = constraints } + +let sign_match env sign (path,imd) = + let subst = Subst.add_module sign.sign_id path Subst.identity in + List.iter (fun (tpath,ty') -> + let tpath = Subst.type_path subst tpath in + let ty = newconstr tpath [] in + let ty' = Subst.type_expr subst ty' in + unify env ty ty' + ) + sign.sign_constraints + +let find_instance inst = + let snapshot = Btype.snapshot () in + let modules = Env.implicit_instances inst.implicit_env in + let sign = sign_instance inst in + let module_match (path,_ as candidate) = + try + (*prerr_endline ("try " ^ Path.last path);*) + sign_match inst.implicit_env sign candidate; + link_implicit_to_path inst path; + true + with _ -> + Btype.backtrack snapshot; + false + in + List.exists module_match modules + let generalize_implicits () = let current_level = get_current_level () in diff --git a/typing/path.ml b/typing/path.ml index bc486259d1..3bfbaeb1ee 100644 --- a/typing/path.ml +++ b/typing/path.ml @@ -57,3 +57,14 @@ let rec to_longident = function | Pident id -> Longident.Lident (Ident.name id) | Pdot(p, s, _) -> Longident.Ldot (to_longident p, s) | Papply (p1, p2) -> Longident.Lapply (to_longident p1, to_longident p2) + +let rec flatten acc = function + | Pident id -> id, acc + | Pdot (p, s, pos) -> flatten ((s,pos) :: acc) p + | Papply _ -> assert false +let flatten path = flatten [] path + +let rec unflatten p = function + | [] -> p + | (s, spos) :: dots -> unflatten (Pdot (p, s, spos)) dots +let unflatten id dots = unflatten (Pident id) dots diff --git a/typing/path.mli b/typing/path.mli index 8f1ef05d2f..0e90540f1f 100644 --- a/typing/path.mli +++ b/typing/path.mli @@ -30,3 +30,6 @@ val head: t -> Ident.t val last: t -> string val to_longident: t -> Longident.t + +val flatten: t -> Ident.t * (string * int) list +val unflatten: Ident.t -> (string * int) list -> t diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index 32440186d2..faedc0e858 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -209,55 +209,6 @@ let link_implicit_to_expr inst expr = in link_implicit_to_path inst path -(**************************) -(** Resolution procedure **) -(**************************) - -(*let implicit_mty inst = - let open Ast_helper in - let (path, nl, tl) = inst.implicit_type in - let mtd = { mtd_type = Some (Mty_ident path); - mtd_attributes = []; - mtd_loc = Location.none; } - in - let _, env = Env.enter_modtype "%M" mtd inst.implicit_env in - let mty = - Typetexp.create_package_mty Location.none env - (Location.mknoloc (Longident.Lident "%M"), nl, tl) - in - let mty = - - - -type sign = { - sign_type : Types.module_type; - (*sign_constraints :*) -}*) - - - - -let find_instance inst = - let snapshot = Btype.snapshot () in - let modules = Env.implicit_instances inst.implicit_env in - let module_match (path,_) = - try - (*prerr_endline ("try " ^ Path.last path);*) - link_implicit_to_path inst path; - true - with _ -> - Btype.backtrack snapshot; - false - in - List.exists module_match modules - -let generalize_implicits_ref - : (unit -> unit) ref - = ref (fun () -> assert false) - -let generalize_implicits () = - !generalize_implicits_ref () - (* Extraction of pending implicit arguments *) let extract_pending_implicits expr = let rec traverse acc = function @@ -273,3 +224,11 @@ let extract_pending_implicits expr = List.find (fun inst -> inst.implicit_argument == argument) !pending_implicits) (traverse [] expr) + +(* Forward reference to be initialized by Implicitsearch *) +let generalize_implicits_ref + : (unit -> unit) ref + = ref (fun () -> assert false) + +let generalize_implicits () = + !generalize_implicits_ref () From 76b0f272347fba716febd394af24dedebf456fd7 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Tue, 6 May 2014 21:09:41 +0100 Subject: [PATCH 350/494] WIP --- typing/implicitsearch.ml | 34 +++++++++++++--- typing/typeimplicit.ml | 87 ++++++++++++++++++++++++---------------- 2 files changed, 82 insertions(+), 39 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 13b293c8fb..e7b2d162d0 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -160,7 +160,7 @@ type sign = { sign_constraints : (Path.t * Types.type_expr) list; } -let sign_instance inst = +let sign_of_pending inst = let env = inst.implicit_env in let path, nl, tl = inst.implicit_type in let mtd = Env.find_modtype path env in @@ -191,6 +191,20 @@ let sign_instance inst = let constraints = List.map unflatten_cstr failed in { sign_type = mty; sign_id = ident; sign_constraints = constraints } +let sign_of_implicit_declaration imd = + let rec find_mty acc n mty = + assert (n >= 0); + if n = 0 then + List.rev acc, mty + else match mty with + | Mty_functor (arg_id, Some arg_ty, mty) -> + find_mty ((arg_id, arg_ty) :: acc) (n - 1) mty + | _ -> assert false + in + let _mty = find_mty [] imd.imd_arity imd.imd_module.md_type in + failwith "TODO" + + let sign_match env sign (path,imd) = let subst = Subst.add_module sign.sign_id path Subst.identity in List.iter (fun (tpath,ty') -> @@ -201,13 +215,23 @@ let sign_match env sign (path,imd) = ) sign.sign_constraints +let sign_in_stack _sign stack = + List.length stack >= 4 (* TODO *) + +let find_sign env stack sign = + if sign_in_stack sign stack then + raise Not_found + else begin + let _candidates = Env.implicit_instances env in + failwith "TODO" + end + let find_instance inst = let snapshot = Btype.snapshot () in - let modules = Env.implicit_instances inst.implicit_env in - let sign = sign_instance inst in + let candidates = Env.implicit_instances inst.implicit_env in + let sign = sign_of_pending inst in let module_match (path,_ as candidate) = try - (*prerr_endline ("try " ^ Path.last path);*) sign_match inst.implicit_env sign candidate; link_implicit_to_path inst path; true @@ -215,7 +239,7 @@ let find_instance inst = Btype.backtrack snapshot; false in - List.exists module_match modules + List.exists module_match candidates let generalize_implicits () = diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index faedc0e858..2d96273217 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -38,6 +38,46 @@ type pending_implicit = { implicit_argument: argument; } +module Unlink + (P : sig + val register_constraints_for + : Ident.t -> (Path.t -> type_expr -> unit) option + end) = struct + + let path_table = Hashtbl.create 7 + + let add_constraint register ~path ~var = + begin try + let var' = Hashtbl.find path_table path in + link_type var var' + with Not_found -> + Hashtbl.add path_table path var + end; + register path var + + let rec type_expr ty = + (* First recurse in sub expressions *) + iter_type_expr type_expr ty; + (* Then replace current type if it is a constructor referring to an + implicit *) + match ty.desc with + | Tconstr (path,[],_) -> + begin match P.register_constraints_for (Path.head path) with + | None -> () + | Some register_constraint -> + (* Replace `ty' by a fresh variable *) + let {desc = desc'; level = lv'; id = id'} = newvar() in + ty.desc <- desc'; + ty.level <- lv'; + ty.id <- id'; + add_constraint register_constraint ~path ~var:ty + end + (* No HKT *) + | Tconstr (path,_,_) -> + assert (P.register_constraints_for (Path.head path) = None) + | _ -> () +end + let pending_implicits : pending_implicit list ref = ref [] @@ -93,41 +133,20 @@ let instantiate_implicits_ty loc env ty = An implicit instance is correct only iff, in an environment where the ident is bound to the instance, all pairs in the list unify. *) - let linked = Hashtbl.create 7 in - let add_constraint inst ~path ~var = - begin try - let var' = Hashtbl.find linked path in - link_type var var' - with Not_found -> - Hashtbl.add linked path var - end; - inst.implicit_constraints <- (path,var) :: inst.implicit_constraints - in - let rec unlink_constructors ty = - (* First recurse in sub expressions *) - iter_type_expr unlink_constructors ty; - (* Then replace current type if it is a constructor referring to an - implicit *) - match ty.desc with - | Tconstr (path,[],_) -> - begin try - let inst = Ident.find_same (Path.head path) instances in - (* Replace `ty' by a fresh variable *) - let {desc = desc'; level = lv'; id = id'} = newvar() in - ty.desc <- desc'; - ty.level <- lv'; - ty.id <- id'; - add_constraint inst ~path ~var:ty - with Not_found -> () - end - (* No HKT *) - | Tconstr (path,_,_) - when (try ignore (Ident.find_same (Path.head path) instances); true - with Not_found -> false) -> - assert false - | _ -> () + let module Unlink = Unlink (struct + let register_constraints_for ident = + try + let inst = Ident.find_same ident instances in + let add_constraint path var= + inst.implicit_constraints <- + (path,var) :: inst.implicit_constraints + in + Some add_constraint + with Not_found -> + None + end) in - unlink_constructors ty; + Unlink.type_expr ty; arguments, instances, ty let instantiate_implicits_expr env expr = From 49b282b400d436dd19058a48047681c941fc5896 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 7 May 2014 09:24:52 +0100 Subject: [PATCH 351/494] WIP --- typing/implicitsearch.ml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index e7b2d162d0..3159c9ae29 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -97,13 +97,14 @@ module Constraints = struct let name = Ident.name id in begin try let (qname, ty), locs = list_extract (name_match prj name) locs in - match decl.type_manifest with - | None -> - failed, (locs, subs), - Sig_type (id,{decl with type_manifest = Some ty},recst) - | Some _ -> - (([qname], ty) :: failed), (locs, subs), - Sig_type (id,decl,recst) + begin match decl.type_manifest with + | None -> () + | Some ty' -> + let ty' = instance env ty' in + unify env ty ty'; + end; + failed, (locs, subs), + Sig_type (id,{decl with type_manifest = Some ty},recst) with Not_found -> failed, cstrs, field end From f4a255badd9e87abc6160a43ab2f12ee877a76a9 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Thu, 8 May 2014 00:39:55 +0100 Subject: [PATCH 352/494] Simplify representation of implicits --- bytecomp/translcore.ml | 3 +- bytecomp/translmod.ml | 74 +++++++-------- parsing/ast_helper.ml | 50 ++++------ parsing/ast_helper.mli | 18 +--- parsing/ast_mapper.ml | 32 ++----- parsing/ast_mapper.mli | 2 - parsing/asttypes.mli | 2 + parsing/parser.mly | 27 ++++-- parsing/parsetree.mli | 19 +--- parsing/pprintast.ml | 42 +++++---- parsing/printast.ml | 26 +++--- tools/depend.ml | 9 -- tools/ocamlprof.ml | 5 - tools/tast_iter.ml | 6 -- tools/untypeast.ml | 28 ++---- toplevel/toploop.ml | 5 +- typing/btype.ml | 7 +- typing/btype.mli | 4 - typing/env.ml | 95 ++++++------------- typing/env.mli | 13 +-- typing/envaux.ml | 10 -- typing/implicitsearch.ml | 79 ++++++++-------- typing/includemod.ml | 42 ++++++--- typing/includemod.mli | 2 + typing/mtype.ml | 48 +--------- typing/oprint.ml | 11 ++- typing/outcometree.mli | 4 +- typing/printtyp.ml | 13 +-- typing/printtyp.mli | 3 +- typing/printtyped.ml | 31 +++---- typing/subst.ml | 14 +-- typing/subst.mli | 4 - typing/typecore.ml | 75 +++++---------- typing/typecore.mli | 1 - typing/typedtree.ml | 15 +-- typing/typedtree.mli | 15 +-- typing/typedtreeIter.ml | 6 -- typing/typedtreeMap.ml | 11 --- typing/typeimplicit.ml | 2 +- typing/typemod.ml | 191 ++++++++++++--------------------------- typing/types.ml | 11 +-- typing/types.mli | 9 +- typing/typetexp.ml | 5 +- 43 files changed, 361 insertions(+), 708 deletions(-) diff --git a/bytecomp/translcore.ml b/bytecomp/translcore.ml index bc9607c57d..a3e2059da5 100644 --- a/bytecomp/translcore.ml +++ b/bytecomp/translcore.ml @@ -854,8 +854,7 @@ and transl_exp0 e = Lsequence(transl_setinstvar (Lvar cpy) path expr, rem)) modifs (Lvar cpy)) - | Texp_letmodule({mb_id = id; mb_expr = modl}, body) - | Texp_letimplicit({im_module = { mb_id = id; mb_expr = modl }}, body) -> + | Texp_letmodule({mb_id = id; mb_expr = modl}, body) -> Llet(Strict, id, !transl_module Tcoerce_none None modl, transl_exp body) | Texp_pack modl -> !transl_module Tcoerce_none None modl diff --git a/bytecomp/translmod.ml b/bytecomp/translmod.ml index 5cff966619..d3c6ca2b04 100644 --- a/bytecomp/translmod.ml +++ b/bytecomp/translmod.ml @@ -222,9 +222,6 @@ let init_shape modl = | Sig_module(id, md, _) :: rem -> init_shape_mod env md.md_type :: init_shape_struct (Env.add_module_declaration id md env) rem - | Sig_implicit(id, imd) :: rem -> - init_shape_mod env imd.imd_module.md_type :: - init_shape_struct (Env.add_implicit_declaration id imd env) rem | Sig_modtype(id, minfo) :: rem -> init_shape_struct (Env.add_modtype id minfo env) rem | Sig_class(id, cdecl, _) :: rem -> @@ -419,7 +416,7 @@ and transl_structure fields cc rootpath = function let path = field_path rootpath id in Llet(Strict, id, transl_extension_constructor item.str_env path ext, transl_structure (id :: fields) cc rootpath rem) - | Tstr_module mb | Tstr_implicit {im_module = mb; _} -> + | Tstr_module mb -> let id = mb.mb_id in Llet(pure_module mb.mb_expr, id, transl_module Tcoerce_none (field_path rootpath id) mb.mb_expr, @@ -498,8 +495,7 @@ let rec defined_idents = function List.map (fun ext -> ext.ext_id) tyext.tyext_constructors @ defined_idents rem | Tstr_exception ext -> ext.ext_id :: defined_idents rem - | Tstr_module mb | Tstr_implicit {im_module = mb; _} -> - mb.mb_id :: defined_idents rem + | Tstr_module mb -> mb.mb_id :: defined_idents rem | Tstr_recmodule decls -> List.map (fun mb -> mb.mb_id) decls @ defined_idents rem | Tstr_modtype _ -> defined_idents rem @@ -532,7 +528,6 @@ let rec more_idents = function | Tstr_module {mb_expr={mod_desc = Tmod_structure str}} -> all_idents str.str_items @ more_idents rem | Tstr_module _ -> more_idents rem - | Tstr_implicit _ -> more_idents rem | Tstr_attribute _ -> more_idents rem and all_idents = function @@ -555,12 +550,11 @@ and all_idents = function | Tstr_class cl_list -> List.map (fun (ci, _, _) -> ci.ci_id_class) cl_list @ all_idents rem | Tstr_class_type cl_list -> all_idents rem - | Tstr_module mb | Tstr_implicit {im_module = mb; _} -> - begin match mb with - | {mb_id;mb_expr={mod_desc = Tmod_structure str}} -> - mb_id :: all_idents str.str_items @ all_idents rem - | mb -> mb.mb_id :: all_idents rem - end + | Tstr_include incl -> + bound_value_identifiers incl.incl_type @ all_idents rem + | Tstr_module {mb_id;mb_expr={mod_desc = Tmod_structure str}} -> + mb_id :: all_idents str.str_items @ all_idents rem + | Tstr_module mb -> mb.mb_id :: all_idents rem | Tstr_attribute _ -> all_idents rem @@ -617,33 +611,30 @@ let transl_store_structure glob map prims str = let lam = transl_extension_constructor item.str_env path ext in Lsequence(Llet(Strict, id, subst_lambda subst lam, store_ident id), transl_store rootpath (add_ident false id subst) rem) - | Tstr_module mb | Tstr_implicit {im_module = mb; _} -> - begin match mb with - | {mb_id=id; mb_expr={mod_desc = Tmod_structure str}} -> - let lam = transl_store (field_path rootpath id) subst str.str_items in - (* Careful: see next case *) - let subst = !transl_store_subst in - Lsequence(lam, - Llet(Strict, id, - subst_lambda subst - (Lprim(Pmakeblock(0, Immutable), - List.map (fun id -> Lvar id) - (defined_idents str.str_items))), - Lsequence(store_ident id, - transl_store rootpath (add_ident true id subst) - rem))) - | {mb_id=id; mb_expr=modl} -> - let lam = transl_module Tcoerce_none (field_path rootpath id) modl in - (* Careful: the module value stored in the global may be different - from the local module value, in case a coercion is applied. - If so, keep using the local module value (id) in the remainder of - the compilation unit (add_ident true returns subst unchanged). - If not, we can use the value from the global - (add_ident true adds id -> Pgetglobal... to subst). *) - Llet(Strict, id, subst_lambda subst lam, - Lsequence(store_ident id, - transl_store rootpath (add_ident true id subst) rem)) - end + | Tstr_module{mb_id=id; mb_expr={mod_desc = Tmod_structure str}} -> + let lam = transl_store (field_path rootpath id) subst str.str_items in + (* Careful: see next case *) + let subst = !transl_store_subst in + Lsequence(lam, + Llet(Strict, id, + subst_lambda subst + (Lprim(Pmakeblock(0, Immutable), + List.map (fun id -> Lvar id) + (defined_idents str.str_items))), + Lsequence(store_ident id, + transl_store rootpath (add_ident true id subst) + rem))) + | Tstr_module{mb_id=id; mb_expr=modl} -> + let lam = transl_module Tcoerce_none (field_path rootpath id) modl in + (* Careful: the module value stored in the global may be different + from the local module value, in case a coercion is applied. + If so, keep using the local module value (id) in the remainder of + the compilation unit (add_ident true returns subst unchanged). + If not, we can use the value from the global + (add_ident true adds id -> Pgetglobal... to subst). *) + Llet(Strict, id, subst_lambda subst lam, + Lsequence(store_ident id, + transl_store rootpath (add_ident true id subst) rem)) | Tstr_recmodule bindings -> let ids = List.map (fun mb -> mb.mb_id) bindings in compile_recmodule @@ -836,8 +827,7 @@ let transl_toplevel_item item = | Tstr_exception ext -> toploop_setvalue ext.ext_id (transl_extension_constructor item.str_env None ext) - | Tstr_module {mb_id=id; mb_expr=modl} - | Tstr_implicit {im_module = {mb_id=id; mb_expr=modl}; _} -> + | Tstr_module {mb_id=id; mb_expr=modl} -> (* we need to use the unique name for the module because of issues with "open" (PR#1672) *) set_toplevel_unique_name id; diff --git a/parsing/ast_helper.ml b/parsing/ast_helper.ml index 6220913e17..28d9ea4219 100644 --- a/parsing/ast_helper.ml +++ b/parsing/ast_helper.ml @@ -108,7 +108,6 @@ module Exp = struct let setinstvar ?loc ?attrs a b = mk ?loc ?attrs (Pexp_setinstvar (a, b)) let override ?loc ?attrs a = mk ?loc ?attrs (Pexp_override a) let letmodule ?loc ?attrs a b = mk ?loc ?attrs (Pexp_letmodule (a, b)) - let letimplicit ?loc ?attrs ib e = mk ?loc ?attrs (Pexp_letimplicit (ib, e)) let assert_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_assert a) let lazy_ ?loc ?attrs a = mk ?loc ?attrs (Pexp_lazy a) let poly ?loc ?attrs a b = mk ?loc ?attrs (Pexp_poly (a, b)) @@ -163,7 +162,6 @@ module Sig = struct let type_extension ?loc a = mk ?loc (Psig_typext a) let exception_ ?loc a = mk ?loc (Psig_exception a) let module_ ?loc a = mk ?loc (Psig_module a) - let implicit_ ?loc a = mk ?loc (Psig_implicit a) let rec_module ?loc a = mk ?loc (Psig_recmodule a) let modtype ?loc a = mk ?loc (Psig_modtype a) let open_ ?loc a = mk ?loc (Psig_open a) @@ -188,7 +186,6 @@ module Str = struct let type_extension ?loc a = mk ?loc (Pstr_typext a) let exception_ ?loc a = mk ?loc (Pstr_exception a) let module_ ?loc a = mk ?loc (Pstr_module a) - let implicit_ ?loc a = mk ?loc (Pstr_implicit a) let rec_module ?loc a = mk ?loc (Pstr_recmodule a) let modtype ?loc a = mk ?loc (Pstr_modtype a) let open_ ?loc a = mk ?loc (Pstr_open a) @@ -301,7 +298,7 @@ module Val = struct end module Md = struct - let mk ?(loc = !default_loc) ?(attrs = []) + let mk ?(loc = !default_loc) ?(attrs = []) ?(implicit_ = Nonimplicit) ?(docs = empty_docs) ?(text = []) name typ = { pmd_name = name; @@ -309,7 +306,16 @@ module Md = struct pmd_attributes = add_text_attrs text (add_docs_attrs docs attrs); pmd_loc = loc; + pmd_implicit = implicit_; } + + let implicit_ ?loc ?attrs name params mty = + let mty = List.fold_right + (fun (name,mty) acc -> + Mty.mk ?loc (Pmty_functor(name, Some mty, acc))) + params mty + in + mk ?loc ?attrs ~implicit_:(Implicit (List.length params)) name mty end module Mtd = struct @@ -325,7 +331,7 @@ module Mtd = struct end module Mb = struct - let mk ?(loc = !default_loc) ?(attrs = []) + let mk ?(loc = !default_loc) ?(attrs = []) ?(implicit_ = Nonimplicit) ?(docs = empty_docs) ?(text = []) name expr = { pmb_name = name; @@ -333,7 +339,16 @@ module Mb = struct pmb_attributes = add_text_attrs text (add_docs_attrs docs attrs); pmb_loc = loc; + pmb_implicit = implicit_; } + + let implicit_ ?loc ?attrs name params me = + let me = List.fold_right + (fun (name,mty) acc -> + Mod.mk ?loc (Pmod_functor(name, Some mty, acc))) + params me + in + mk ?loc ?attrs ~implicit_:(Implicit (List.length params)) name me end module Opn = struct @@ -357,30 +372,6 @@ module Incl = struct end -module Im = struct - let mk md arity = - { - pim_module = md; - pim_arity = arity; - } - - let binding ?loc ?attrs name params me = - let me = List.fold_right - (fun (name,mty) acc -> - Mod.mk ?loc (Pmod_functor(name, Some mty, acc))) - params me - in - mk (Mb.mk ?loc ?attrs name me) (List.length params) - - let declaration ?loc ?attrs name params mty = - let mty = List.fold_right - (fun (name,mty) acc -> - Mty.mk ?loc (Pmty_functor(name, Some mty, acc))) - params mty - in - mk (Md.mk ?loc ?attrs name mty) (List.length params) -end - module Vb = struct let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs) ?(text = []) pat expr = @@ -507,4 +498,3 @@ module Cstr = struct pcstr_fields = fields; } end - diff --git a/parsing/ast_helper.mli b/parsing/ast_helper.mli index 5ac46b8030..92d30147fc 100644 --- a/parsing/ast_helper.mli +++ b/parsing/ast_helper.mli @@ -133,8 +133,6 @@ module Exp: -> expression val letmodule: ?loc:loc -> ?attrs:attrs -> module_binding -> expression -> expression - val letimplicit: ?loc:loc -> ?attrs:attrs -> implicit_binding -> expression - -> expression val assert_: ?loc:loc -> ?attrs:attrs -> expression -> expression val lazy_: ?loc:loc -> ?attrs:attrs -> expression -> expression val poly: ?loc:loc -> ?attrs:attrs -> expression -> core_type option -> expression @@ -228,7 +226,6 @@ module Sig: val type_extension: ?loc:loc -> type_extension -> signature_item val exception_: ?loc:loc -> extension_constructor -> signature_item val module_: ?loc:loc -> module_declaration -> signature_item - val implicit_: ?loc:loc -> implicit_declaration -> signature_item val rec_module: ?loc:loc -> module_declaration list -> signature_item val modtype: ?loc:loc -> module_type_declaration -> signature_item val open_: ?loc:loc -> open_description -> signature_item @@ -252,7 +249,6 @@ module Str: val type_extension: ?loc:loc -> type_extension -> structure_item val exception_: ?loc:loc -> extension_constructor -> structure_item val module_: ?loc:loc -> module_binding -> structure_item - val implicit_: ?loc:loc -> implicit_binding -> structure_item val rec_module: ?loc:loc -> module_binding list -> structure_item val modtype: ?loc:loc -> module_type_declaration -> structure_item val open_: ?loc:loc -> open_description -> structure_item @@ -267,8 +263,9 @@ module Str: (** Module declarations *) module Md: sig - val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text -> + val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text -> ?implicit_:implicit_flag -> str -> module_type -> module_declaration + val implicit_: ?loc:loc -> ?attrs:attrs -> str -> (str * module_type) list -> module_type -> module_declaration end (** Module type declarations *) @@ -281,8 +278,9 @@ module Mtd: (** Module bindings *) module Mb: sig - val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text -> + val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text -> ?implicit_:implicit_flag -> str -> module_expr -> module_binding + val implicit_: ?loc:loc -> ?attrs:attrs -> str -> (str * module_type) list -> module_expr -> module_binding end (* Opens *) @@ -298,14 +296,6 @@ module Incl: val mk: ?loc: loc -> ?attrs:attrs -> ?docs:docs -> 'a -> 'a include_infos end -(** Implicit *) -module Im: - sig - val mk: 'a -> int -> 'a implicit_infos - val binding: ?loc:loc -> ?attrs:attrs -> str -> (str * module_type) list -> module_expr -> implicit_binding - val declaration: ?loc:loc -> ?attrs:attrs -> str -> (str * module_type) list -> module_type -> implicit_declaration - end - (** Value bindings *) module Vb: diff --git a/parsing/ast_mapper.ml b/parsing/ast_mapper.ml index fa63a443e1..7050f5c7e4 100644 --- a/parsing/ast_mapper.ml +++ b/parsing/ast_mapper.ml @@ -54,8 +54,6 @@ type mapper = { module_type: mapper -> module_type -> module_type; module_type_declaration: mapper -> module_type_declaration -> module_type_declaration; - implicit_binding: mapper -> implicit_binding -> implicit_binding; - implicit_declaration: mapper -> implicit_declaration -> implicit_declaration; open_description: mapper -> open_description -> open_description; pat: mapper -> pattern -> pattern; payload: mapper -> payload -> payload; @@ -246,8 +244,6 @@ module MT = struct | Psig_module x -> module_ ~loc (sub.module_declaration sub x) | Psig_recmodule l -> rec_module ~loc (List.map (sub.module_declaration sub) l) - | Psig_implicit x -> - implicit_ ~loc (sub.implicit_declaration sub x) | Psig_modtype x -> modtype ~loc (sub.module_type_declaration sub x) | Psig_open x -> open_ ~loc (sub.open_description sub x) | Psig_include x -> include_ ~loc (sub.include_description sub x) @@ -294,7 +290,6 @@ module M = struct | Pstr_typext te -> type_extension ~loc (sub.type_extension sub te) | Pstr_exception ed -> exception_ ~loc (sub.extension_constructor sub ed) | Pstr_module x -> module_ ~loc (sub.module_binding sub x) - | Pstr_implicit x -> implicit_ ~loc (sub.implicit_binding sub x) | Pstr_recmodule l -> rec_module ~loc (List.map (sub.module_binding sub) l) | Pstr_modtype x -> modtype ~loc (sub.module_type_declaration sub x) | Pstr_open x -> open_ ~loc (sub.open_description sub x) @@ -367,9 +362,6 @@ module E = struct (List.map (map_tuple (map_loc sub) (sub.expr sub)) sel) | Pexp_letmodule (mb, e) -> letmodule ~loc ~attrs (sub.module_binding sub mb) (sub.expr sub e) - | Pexp_letimplicit (pib, e) -> - letimplicit ~loc ~attrs (sub.implicit_binding sub pib) - (sub.expr sub e) | Pexp_assert e -> assert_ ~loc ~attrs (sub.expr sub e) | Pexp_lazy e -> lazy_ ~loc ~attrs (sub.expr sub e) | Pexp_poly (e, t) -> @@ -521,10 +513,11 @@ let default_mapper = expr = E.map; module_declaration = - (fun this {pmd_name; pmd_type; pmd_attributes; pmd_loc} -> + (fun this {pmd_name; pmd_type; pmd_attributes; pmd_loc; pmd_implicit} -> Md.mk (map_loc this pmd_name) (this.module_type this pmd_type) + ~implicit_:pmd_implicit ~attrs:(this.attributes this pmd_attributes) ~loc:(this.location this pmd_loc) ); @@ -539,26 +532,15 @@ let default_mapper = ); module_binding = - (fun this {pmb_name; pmb_expr; pmb_attributes; pmb_loc} -> - Mb.mk (map_loc this pmb_name) (this.module_expr this pmb_expr) + (fun this {pmb_name; pmb_expr; pmb_attributes; pmb_loc; pmb_implicit} -> + Mb.mk + (map_loc this pmb_name) + (this.module_expr this pmb_expr) + ~implicit_:pmb_implicit ~attrs:(this.attributes this pmb_attributes) ~loc:(this.location this pmb_loc) ); - implicit_declaration = - (fun this {pim_module; pim_arity} -> - Im.mk - (this.module_declaration this pim_module) - pim_arity - ); - - implicit_binding = - (fun this {pim_module; pim_arity} -> - Im.mk - (this.module_binding this pim_module) - pim_arity - ); - open_description = (fun this {popen_lid; popen_override; popen_attributes; popen_loc} -> diff --git a/parsing/ast_mapper.mli b/parsing/ast_mapper.mli index 15583e1e58..d48971d589 100644 --- a/parsing/ast_mapper.mli +++ b/parsing/ast_mapper.mli @@ -80,8 +80,6 @@ type mapper = { module_type: mapper -> module_type -> module_type; module_type_declaration: mapper -> module_type_declaration -> module_type_declaration; - implicit_binding: mapper -> implicit_binding -> implicit_binding; - implicit_declaration: mapper -> implicit_declaration -> implicit_declaration; open_description: mapper -> open_description -> open_description; pat: mapper -> pattern -> pattern; payload: mapper -> payload -> payload; diff --git a/parsing/asttypes.mli b/parsing/asttypes.mli index f02f403881..62b7095f70 100644 --- a/parsing/asttypes.mli +++ b/parsing/asttypes.mli @@ -35,6 +35,8 @@ type override_flag = Override | Fresh type closed_flag = Closed | Open +type implicit_flag = Nonimplicit | Implicit of int (*arity*) + type label = string type 'a loc = 'a Location.loc = { diff --git a/parsing/parser.mly b/parsing/parser.mly index 54d923f711..fe34e226ba 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -767,8 +767,8 @@ structure_item: | module_type_declaration { mkstr(Pstr_modtype $1) } | open_statement { mkstr(Pstr_open $1) } - | IMPLICIT module_binding - { mkstr(Pstr_implicit $2) } + | IMPLICIT implicit_binding + { mkstr(Pstr_module $2) } | class_declarations { mkstr(Pstr_class (List.rev $1)) } | class_type_declarations @@ -828,9 +828,9 @@ implicit_parameters: implicit_binding: MODULE UIDENT implicit_binding_body post_item_attributes - { Im.binding (mkrhs $2 2) [] $3 ~loc:(symbol_rloc ()) ~attrs:$4 } + { Mb.implicit_ (mkrhs $2 2) [] $3 ~loc:(symbol_rloc ()) ~attrs:$4 } | FUNCTOR UIDENT implicit_parameters implicit_binding_body post_item_attributes - { Im.binding (mkrhs $2 2) (List.rev $3) $4 ~loc:(symbol_rloc ()) ~attrs:$5 } + { Mb.implicit_ (mkrhs $2 2) (List.rev $3) $4 ~loc:(symbol_rloc ()) ~attrs:$5 } ; implicit_binding_body: @@ -842,9 +842,9 @@ implicit_binding_body: implicit_declaration: | MODULE UIDENT implicit_declaration_body post_item_attributes - { Im.declaration (mkrhs $2 2) [] $3 ~attrs:$4 ~loc:(symbol_rloc()) } + { Md.implicit_ (mkrhs $2 2) [] $3 ~attrs:$4 ~loc:(symbol_rloc()) } | FUNCTOR UIDENT implicit_parameters implicit_declaration_body post_item_attributes - { Im.declaration (mkrhs $2 2) (List.rev $3) $4 ~attrs:$5 ~loc:(symbol_rloc()) } + { Md.implicit_ (mkrhs $2 2) (List.rev $3) $4 ~attrs:$5 ~loc:(symbol_rloc()) } ; implicit_declaration_body: | COLON module_type @@ -902,11 +902,24 @@ signature_item: | module_alias { mksig(Psig_module $1) } | IMPLICIT implicit_declaration +<<<<<<< HEAD { mksig(Psig_implicit $2) } | rec_module_declarations { mksig(Psig_recmodule (List.rev $1)) } | module_type_declaration { mksig(Psig_modtype $1) } +======= + { mksig(Psig_module $2) } + | MODULE REC module_rec_declarations + { mksig(Psig_recmodule (List.rev $3)) } + | MODULE TYPE ident post_item_attributes + { mksig(Psig_modtype (Mtd.mk (mkrhs $3 3) + ~attrs:$4 ~loc:(symbol_rloc()))) } + | MODULE TYPE ident EQUAL module_type post_item_attributes + { mksig(Psig_modtype (Mtd.mk (mkrhs $3 3) ~typ:$5 + ~loc:(symbol_rloc()) + ~attrs:$6)) } +>>>>>>> Simplify representation of implicits | open_statement { mksig(Psig_open $1) } | sig_include_statement @@ -1293,7 +1306,7 @@ expr: | LET MODULE ext_attributes module_binding IN seq_expr { mkexp_attrs (Pexp_letmodule($4, $6)) $3 } | LET IMPLICIT ext_attributes implicit_binding IN seq_expr - { mkexp_attrs (Pexp_letimplicit($4, $6)) $3 } + { mkexp_attrs (Pexp_letmodule($4, $6)) $3 } | LET OPEN override_flag ext_attributes mod_longident IN seq_expr { mkexp_attrs (Pexp_open($3, mkrhs $5 5, $7)) $4 } | FUNCTION ext_attributes opt_bar match_cases diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index 87f3c5cab4..6393dd73b1 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -306,9 +306,6 @@ and expression_desc = (* {< x1 = E1; ...; Xn = En >} *) | Pexp_letmodule of module_binding * expression (* let module M = ME in E *) - | Pexp_letimplicit of implicit_binding * expression - (* let implicit module M = ME in E *) - (* let implicit functor F (_) = ME in E *) | Pexp_assert of expression (* assert E Note: "assert false" is treated in a special way by the @@ -668,8 +665,6 @@ and signature_item_desc = (* module X : MT *) | Psig_recmodule of module_declaration list (* module rec X1 : MT1 and ... and Xn : MTn *) - | Psig_implicit of implicit_declaration - (* implicit module X : MT *) | Psig_modtype of module_type_declaration (* module type S = MT module type S *) @@ -692,6 +687,7 @@ and module_declaration = pmd_type: module_type; pmd_attributes: attributes; (* ... [@@id1] [@@id2] *) pmd_loc: Location.t; + pmd_implicit: implicit_flag; } (* S : MT *) @@ -797,8 +793,6 @@ and structure_item_desc = (* module X = ME *) | Pstr_recmodule of module_binding list (* module rec X1 = ME1 and ... and Xn = MEn *) - | Pstr_implicit of implicit_binding - (* implicit module X = ME *) | Pstr_modtype of module_type_declaration (* module type S = MT *) | Pstr_open of open_description @@ -828,19 +822,10 @@ and module_binding = pmb_expr: module_expr; pmb_attributes: attributes; pmb_loc: Location.t; + pmb_implicit: implicit_flag; } (* X = ME *) -and 'a implicit_infos = - { - pim_module: 'a; - pim_arity: int; - } - -and implicit_binding = module_binding implicit_infos - -and implicit_declaration = module_declaration implicit_infos - (** {2 Toplevel} *) (* Toplevel phrases *) diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index 623437c262..98c681551d 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -423,8 +423,8 @@ class printer ()= object(self:'self) | _ -> (match opt with | Some o -> - pp f "%s:(%a=@;%a)@;" l self#pattern1 p self#expression o - | None -> pp f "%s:%a@;" l self#simple_pattern p) + pp f "%s:(%a=@;%a)@;" s self#pattern1 p self#expression o + | None -> pp f "%s:%a@;" s self#simple_pattern p) end | Parr_labelled s -> begin match p.ppat_desc with @@ -991,21 +991,22 @@ class printer ()= object(self:'self) (class_description "class") x (self#list ~sep:"@," (class_description "and")) xs end - | Psig_module ({pmd_type={pmty_desc=Pmty_alias alias};_} as pmd) -> - pp f "@[<hov>module@ %s@ =@ %a@]%a" pmd.pmd_name.txt + | Psig_module ({pmd_type={pmty_desc=Pmty_alias alias}; pmd_implicit = Nonimplicit} as pmd) -> + pp f "@[<hov>module@ %s@ =@ %a@]%a" + pmd.pmd_name.txt self#longident_loc alias self#item_attributes pmd.pmd_attributes - | Psig_module pmd -> + | Psig_module ({pmd_implicit = Nonimplicit} as pmd) -> pp f "@[<hov>module@ %s@ :@ %a@]%a" pmd.pmd_name.txt self#module_type pmd.pmd_type self#item_attributes pmd.pmd_attributes - | Psig_implicit pid -> + | Psig_module ({pmd_implicit = Implicit arity} as pmd) -> pp f "@[<hov>implicit %s@ %s@ :@ %a@]%a" - (if pid.pim_arity = 0 then "module" else "functor") - pid.pim_module.pmd_name.txt - (self#implicit_declaration pid.pim_arity) pid.pim_module.pmd_type - self#item_attributes pid.pim_module.pmd_attributes + (if arity = 0 then "module" else "functor") + pmd.pmd_name.txt + (self#implicit_declaration arity) pmd.pmd_type + self#item_attributes pmd.pmd_attributes | Psig_open od -> pp f "@[<hov2>open%s@ %a@]%a" (override od.popen_override) @@ -1170,17 +1171,20 @@ class printer ()= object(self:'self) pp f "@[<2>%a@]" self#bindings (rf,l) | Pstr_typext te -> self#type_extension f te | Pstr_exception ed -> self#exception_declaration f ed - | Pstr_module x -> + | Pstr_module ({pmb_implicit = Nonimplicit} as x) -> pp f "@[<hov2>module@ %a@]" self#module_binding x - | Pstr_implicit pib -> + | Pstr_module {pmb_implicit = Implicit arity; pmb_name; pmb_expr} -> pp f "@[<hov2>implicit %s@ %s@ %a@]" - (if pib.pim_arity = 0 then "module" else "functor") - pib.pim_module.pmb_name.txt - (self#implicit_binding pib.pim_arity) pib.pim_module.pmb_expr - | Pstr_open (ovf, li, _attrs) -> - pp f "@[<2>open%s@;%a@]" (override ovf) self#longident_loc li; - | Pstr_modtype {pmtd_name=s; pmtd_type=md} -> - pp f "@[<hov2>module@ type@ %s%a@]" + (if arity = 0 then "module" else "functor") + pmb_name.txt + (self#implicit_binding arity) pmb_expr + | Pstr_open od -> + pp f "@[<2>open%s@;%a@]%a" + (override od.popen_override) + self#longident_loc od.popen_lid + self#item_attributes od.popen_attributes + | Pstr_modtype {pmtd_name=s; pmtd_type=md; pmtd_attributes=attrs} -> + pp f "@[<hov2>module@ type@ %s%a@]%a" s.txt (fun f md -> match md with | None -> () diff --git a/parsing/printast.ml b/parsing/printast.ml index c58eb98369..4b4a0272c4 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -103,6 +103,12 @@ let fmt_private_flag f x = | Private -> fprintf f "Private"; ;; +let fmt_implicit_flag f x = + match x with + | Nonimplicit -> fprintf f "Nonimplicit"; + | Implicit n -> fprintf f "Implicit %d" n; +;; + let line i f s (*...*) = fprintf f "%s" (String.make ((2*i) mod 72) ' '); fprintf f s (*...*) @@ -346,10 +352,6 @@ and expression i ppf x = line i ppf "Pexp_letmodule\n"; module_binding i ppf mb; expression i ppf e; - | Pexp_letimplicit (pib, e) -> - line i ppf "Pexp_letimplicit\n"; - module_binding i ppf pib.pim_module; - expression i ppf e; | Pexp_assert (e) -> line i ppf "Pexp_assert\n"; expression i ppf e; @@ -673,9 +675,6 @@ and signature_item i ppf x = | Psig_recmodule decls -> line i ppf "Psig_recmodule\n"; list i module_declaration ppf decls; - | Psig_implicit pid -> - line i ppf "Psig_implicit %d\n" pid.pim_arity; - module_declaration i ppf pid.pim_module | Psig_modtype x -> line i ppf "Psig_modtype %a\n" fmt_string_loc x.pmtd_name; attributes i ppf x.pmtd_attributes; @@ -783,9 +782,6 @@ and structure_item i ppf x = | Pstr_recmodule bindings -> line i ppf "Pstr_recmodule\n"; list i module_binding ppf bindings; - | Pstr_implicit pib -> - line i ppf "Pstr_implicit %d\n" pib.pim_arity; - module_binding i ppf pib.pim_module | Pstr_modtype x -> line i ppf "Pstr_modtype %a\n" fmt_string_loc x.pmtd_name; attributes i ppf x.pmtd_attributes; @@ -815,13 +811,15 @@ and structure_item i ppf x = and module_declaration i ppf pmd = string_loc i ppf pmd.pmd_name; + line i ppf "%a\n" fmt_implicit_flag pmd.pmd_implicit; attributes i ppf pmd.pmd_attributes; module_type (i+1) ppf pmd.pmd_type; -and module_binding i ppf x = - string_loc i ppf x.pmb_name; - attributes i ppf x.pmb_attributes; - module_expr (i+1) ppf x.pmb_expr +and module_binding i ppf pmb = + string_loc i ppf pmb.pmb_name; + line i ppf "%a\n" fmt_implicit_flag pmb.pmb_implicit; + attributes i ppf pmb.pmb_attributes; + module_expr (i+1) ppf pmb.pmb_expr and core_type_x_core_type_x_location i ppf (ct1, ct2, l) = line i ppf "<constraint> %a\n" fmt_location l; diff --git a/tools/depend.ml b/tools/depend.ml index c55c846e1a..f9fb9100d6 100644 --- a/tools/depend.ml +++ b/tools/depend.ml @@ -186,9 +186,6 @@ let rec add_expr bv exp = | Pexp_override sel -> List.iter (fun (_s, e) -> add_expr bv e) sel | Pexp_letmodule(x, e) -> add_module bv x.pmb_expr; add_expr (StringSet.add x.pmb_name.txt bv) e - | Pexp_letimplicit(pib, e) -> - let x = pib.pim_module in - add_module bv x.pmb_expr; add_expr (StringSet.add x.pmb_name.txt bv) e | Pexp_assert (e) -> add_expr bv e | Pexp_lazy (e) -> add_expr bv e | Pexp_poly (e, t) -> add_expr bv e; add_opt add_type bv t @@ -257,9 +254,6 @@ and add_sig_item bv item = in List.iter (fun pmd -> add_modtype bv' pmd.pmd_type) decls; bv' - | Psig_implicit pim -> - let pmd = pim.pim_module in - add_modtype bv pmd.pmd_type; StringSet.add pmd.pmd_name.txt bv | Psig_modtype x -> begin match x.pmtd_type with None -> () @@ -313,9 +307,6 @@ and add_struct_item bv item = add_extension_constructor bv pext; bv | Pstr_module x -> add_module bv x.pmb_expr; StringSet.add x.pmb_name.txt bv - | Pstr_implicit pim -> - let x = pim.pim_module in - add_module bv x.pmb_expr; StringSet.add x.pmb_name.txt bv | Pstr_recmodule bindings -> let bv' = List.fold_right StringSet.add diff --git a/tools/ocamlprof.ml b/tools/ocamlprof.ml index f4f86b895b..44d6c22197 100644 --- a/tools/ocamlprof.ml +++ b/tools/ocamlprof.ml @@ -281,10 +281,6 @@ and rw_exp iflag sexp = rewrite_mod iflag smod; rewrite_exp iflag sexp - | Pexp_letimplicit (pib, sexp) -> - rewrite_mod iflag pib.pim_module.pmb_expr; - rewrite_exp iflag sexp - | Pexp_assert (cond) -> rewrite_exp iflag cond | Pexp_lazy (expr) -> rewrite_exp iflag expr @@ -389,7 +385,6 @@ and rewrite_str_item iflag item = | Pstr_value(_, exps) -> List.iter (fun x -> rewrite_exp iflag x.pvb_expr) exps | Pstr_module x -> rewrite_mod iflag x.pmb_expr - | Pstr_implicit x -> rewrite_mod iflag x.pim_module.pmb_expr (* todo: Pstr_recmodule?? *) | Pstr_class classes -> List.iter (rewrite_class_declaration iflag) classes | _ -> () diff --git a/tools/tast_iter.ml b/tools/tast_iter.ml index d92767dfee..72eb1eb9f2 100644 --- a/tools/tast_iter.ml +++ b/tools/tast_iter.ml @@ -26,7 +26,6 @@ let structure_item sub x = | Tstr_typext te -> sub # type_extension te | Tstr_exception ext -> sub # extension_constructor ext | Tstr_module mb -> sub # module_binding mb - | Tstr_implicit imb -> sub # module_binding imb.im_module | Tstr_recmodule list -> List.iter (sub # module_binding) list | Tstr_modtype mtd -> opt (sub # module_type) mtd.mtd_type | Tstr_open _ -> () @@ -163,9 +162,6 @@ let expression sub exp = | Texp_letmodule (mb, exp) -> sub # module_binding mb; sub # expression exp - | Texp_letimplicit (imb, exp) -> - sub # module_binding imb.im_module; - sub # expression exp | Texp_assert exp -> sub # expression exp | Texp_lazy exp -> sub # expression exp | Texp_object (cl, _) -> @@ -192,8 +188,6 @@ let signature_item sub item = sub # extension_constructor ext | Tsig_module md -> sub # module_type md.md_type - | Tsig_implicit imd -> - sub # module_type imd.im_module.md_type | Tsig_recmodule list -> List.iter (fun md -> sub # module_type md.md_type) list | Tsig_modtype mtd -> diff --git a/tools/untypeast.ml b/tools/untypeast.ml index b8d24c2f9b..1898dcd038 100644 --- a/tools/untypeast.ml +++ b/tools/untypeast.ml @@ -62,10 +62,6 @@ and untype_structure_item item = Pstr_exception (untype_extension_constructor ext) | Tstr_module mb -> Pstr_module (untype_module_binding mb) - | Tstr_implicit imb -> - let mb = imb.im_module in - let pmb = untype_module_binding mb in - Pstr_implicit { pim_module = pmb; pim_arity = imb.im_arity } | Tstr_recmodule list -> Pstr_recmodule (List.map untype_module_binding list) | Tstr_modtype mtd -> @@ -112,6 +108,7 @@ and untype_module_binding mb = pmb_expr = untype_module_expr mb.mb_expr; pmb_attributes = mb.mb_attributes; pmb_loc = mb.mb_loc; + pmb_implicit = mb.mb_implicit; } and untype_type_declaration decl = @@ -355,11 +352,6 @@ and untype_expression exp = ) list) | Texp_letmodule (mb, exp) -> Pexp_letmodule (untype_module_binding mb, untype_expression exp) - | Texp_letimplicit (imb, exp) -> - let mb = imb.im_module in - let pmb = untype_module_binding mb in - let pib = { pim_module = pmb; pim_arity = imb.im_arity } in - Pexp_letimplicit (pib, untype_expression exp) | Texp_assert exp -> Pexp_assert (untype_expression exp) | Texp_lazy exp -> Pexp_lazy (untype_expression exp) | Texp_object (cl, _) -> @@ -399,19 +391,13 @@ and untype_signature_item item = Psig_module {pmd_name = md.md_name; pmd_type = untype_module_type md.md_type; pmd_attributes = md.md_attributes; pmd_loc = md.md_loc; + pmd_implicit = md.md_implicit; } - | Tsig_implicit imd -> - let md = imd.im_module in - let pmd = {pmd_name = md.md_name; - pmd_type = untype_module_type md.md_type; - pmd_attributes = md.md_attributes; pmd_loc = md.md_loc; - } in - Psig_implicit { pim_module = pmd; pim_arity = imd.im_arity } - | Tsig_recmodule list -> Psig_recmodule (List.map (fun md -> {pmd_name = md.md_name; pmd_type = untype_module_type md.md_type; - pmd_attributes = md.md_attributes; pmd_loc = md.md_loc}) list) + pmd_attributes = md.md_attributes; pmd_loc = md.md_loc; + pmd_implicit = md.md_implicit}) list) | Tsig_modtype mtd -> Psig_modtype {pmtd_name=mtd.mtd_name; pmtd_type=option untype_module_type mtd.mtd_type; @@ -645,14 +631,16 @@ and untype_class_field cf = Pcf_method (lab, priv, Cfk_virtual (untype_core_type cty)) | Tcf_method (lab, priv, Tcfk_concrete (o, exp)) -> let remove_fun_self = function - | { exp_desc = Texp_function("", [case], _) } when is_self_pat case.c_lhs && case.c_guard = None -> case.c_rhs + | { exp_desc = Texp_function(Types.Tarr_simple, [case], _) } + when is_self_pat case.c_lhs && case.c_guard = None -> case.c_rhs | e -> e in let exp = remove_fun_self exp in Pcf_method (lab, priv, Cfk_concrete (o, untype_expression exp)) | Tcf_initializer exp -> let remove_fun_self = function - | { exp_desc = Texp_function("", [case], _) } when is_self_pat case.c_lhs && case.c_guard = None -> case.c_rhs + | { exp_desc = Texp_function(Types.Tarr_simple, [case], _) } + when is_self_pat case.c_lhs && case.c_guard = None -> case.c_rhs | e -> e in let exp = remove_fun_self exp in diff --git a/toplevel/toploop.ml b/toplevel/toploop.ml index 3ec9d4dab7..60a00a5059 100644 --- a/toplevel/toploop.ml +++ b/toplevel/toploop.ml @@ -204,10 +204,7 @@ let rec pr_item env items = let tree = Printtyp.tree_of_extension_constructor id ext es in Some (tree, None, rem) | Sig_module(id, md, rs) :: rem -> - let tree = Printtyp.tree_of_module id md.md_type rs in - Some (tree, None, rem) - | Sig_implicit(id, imd) :: rem -> - let tree = Printtyp.tree_of_implicit id imd in + let tree = Printtyp.tree_of_module id ~implicit_:md.md_implicit md.md_type rs in Some (tree, None, rem) | Sig_modtype(id, decl) :: rem -> let tree = Printtyp.tree_of_modtype_declaration id decl in diff --git a/typing/btype.ml b/typing/btype.ml index 4d77c2ab4a..16fa60b268 100644 --- a/typing/btype.ml +++ b/typing/btype.ml @@ -243,7 +243,6 @@ type type_iterators = it_type_declaration: type_iterators -> type_declaration -> unit; it_extension_constructor: type_iterators -> extension_constructor -> unit; it_module_declaration: type_iterators -> module_declaration -> unit; - it_implicit_declaration: type_iterators -> implicit_declaration -> unit; it_modtype_declaration: type_iterators -> modtype_declaration -> unit; it_class_declaration: type_iterators -> class_declaration -> unit; it_class_type_declaration: type_iterators -> class_type_declaration -> unit; @@ -261,7 +260,6 @@ let type_iterators = Sig_value (_, vd) -> it.it_value_description it vd | Sig_type (_, td, _) -> it.it_type_declaration it td | Sig_typext (_, td, _) -> it.it_extension_constructor it td - | Sig_implicit (_, imd) -> it.it_implicit_declaration it imd | Sig_module (_, md, _) -> it.it_module_declaration it md | Sig_modtype (_, mtd) -> it.it_modtype_declaration it mtd | Sig_class (_, cd, _) -> it.it_class_declaration it cd @@ -277,8 +275,6 @@ let type_iterators = List.iter (it.it_type_expr it) td.ext_type_params; List.iter (it.it_type_expr it) td.ext_args; may (it.it_type_expr it) td.ext_ret_type - and it_implicit_declaration it imd = - it.it_module_declaration it imd.imd_module and it_module_declaration it md = it.it_module_type it md.md_type and it_modtype_declaration it mtd = @@ -339,8 +335,7 @@ let type_iterators = it_type_kind; it_class_type; it_module_type; it_signature; it_class_type_declaration; it_class_declaration; it_modtype_declaration; it_module_declaration; it_extension_constructor; - it_type_declaration; it_value_description; it_signature_item; - it_implicit_declaration; } + it_type_declaration; it_value_description; it_signature_item; } let copy_row f fixed row keep more = let fields = List.map diff --git a/typing/btype.mli b/typing/btype.mli index 0a02f58095..d80ed232c0 100644 --- a/typing/btype.mli +++ b/typing/btype.mli @@ -97,7 +97,6 @@ type type_iterators = it_type_declaration: type_iterators -> type_declaration -> unit; it_extension_constructor: type_iterators -> extension_constructor -> unit; it_module_declaration: type_iterators -> module_declaration -> unit; - it_implicit_declaration: type_iterators -> implicit_declaration -> unit; it_modtype_declaration: type_iterators -> modtype_declaration -> unit; it_class_declaration: type_iterators -> class_declaration -> unit; it_class_type_declaration: type_iterators -> class_type_declaration -> unit; @@ -171,9 +170,6 @@ val arrow_is_optional : arrow_flag -> bool val label_name : arrow_flag -> label val label_raw : arrow_flag -> label -(* Returns the label name with first character '?' or '~' as appropriate. *) -val prefixed_label_name : arrow_flag -> label - val tarr_of_parr : Parsetree.arrow_flag -> Types.arrow_flag val tapp_of_papp : Parsetree.apply_flag -> Types.apply_flag diff --git a/typing/env.ml b/typing/env.ml index 9b73ad5c49..f119f422ea 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -113,13 +113,11 @@ type summary = | Env_type of summary * Ident.t * type_declaration | Env_extension of summary * Ident.t * extension_constructor | Env_module of summary * Ident.t * module_declaration - | Env_implicit of summary * Ident.t * implicit_declaration | Env_modtype of summary * Ident.t * modtype_declaration | Env_class of summary * Ident.t * class_declaration | Env_cltype of summary * Ident.t * class_type_declaration | Env_open of summary * Path.t | Env_functor_arg of summary * Ident.t - | Env_implicit_arg of summary * Ident.t module EnvTbl = struct @@ -186,7 +184,7 @@ type t = { cltypes: (Path.t * class_type_declaration) EnvTbl.t; functor_args: unit Ident.tbl; implicit_args: unit Ident.tbl; - implicit_instances: (Path.t * implicit_declaration) list; + implicit_instances: (Path.t * module_declaration) list; summary: summary; local_constraints: bool; gadt_instances: (int * TypeSet.t ref) list; @@ -292,11 +290,8 @@ let strengthen = ref ((fun env mty path -> assert false) : t -> module_type -> Path.t -> module_type) -let md md_type = - {md_type; md_attributes=[]; md_loc=Location.none} - -let imd imd_arity md_type = - {imd_module = md md_type; imd_arity = imd_arity} +let md ?(implicit_ = Asttypes.Nonimplicit) md_type = + {md_type; md_attributes=[]; md_loc=Location.none; md_implicit = implicit_} (* The name of the compilation unit currently compiled. "" if outside a compilation unit. *) @@ -1178,11 +1173,6 @@ let rec prefix_idents root pos sub = function let (pl, final_sub) = prefix_idents root (pos+1) (Subst.add_module id p sub) rem in (p::pl, final_sub) - | Sig_implicit(id, imd) :: rem -> - let p = Pdot(root, Ident.name id, pos) in - let (pl, final_sub) = - prefix_idents root (pos+1) (Subst.add_module id p sub) rem in - (p::pl, final_sub) | Sig_modtype(id, decl) :: rem -> let p = Pdot(root, Ident.name id, nopos) in let (pl, final_sub) = @@ -1210,8 +1200,6 @@ let subst_signature sub sg = Sig_typext (id, Subst.extension_constructor sub ext, es) | Sig_module(id, mty, x) -> Sig_module(id, Subst.module_declaration sub mty,x) - | Sig_implicit(id, imd) -> - Sig_implicit(id, Subst.implicit_declaration sub imd) | Sig_modtype(id, decl) -> Sig_modtype(id, Subst.modtype_declaration sub decl) | Sig_class(id, decl, x) -> @@ -1302,7 +1290,7 @@ and components_of_module_maker (env, sub, path, mty) = c.comp_constrs <- add_to_tbl (Ident.name id) (descr, !pos) c.comp_constrs; incr pos - | Sig_module(id, md, _) | Sig_implicit (id, { imd_module = md; _ }) -> + | Sig_module(id, md, _) -> let mty = md.md_type in let mty' = EnvLazy.create (sub, mty) in c.comp_modules <- @@ -1476,21 +1464,13 @@ and store_module slot id path md env renv = EnvTbl.add "module" slot id (path, components_of_module env Subst.identity path md.md_type) env.components renv.components; - summary = Env_module(env.summary, id, md) } - -and store_implicit slot id path imd env renv = - let md = imd.imd_module in - { env with - modules = EnvTbl.add "module" slot id (path, md) env.modules renv.modules; - components = - EnvTbl.add "module" slot id - (path, components_of_module env Subst.identity path md.md_type) - env.components renv.components; - summary = Env_implicit(env.summary, id, imd); - implicit_instances = (path, imd) :: env.implicit_instances; + summary = Env_module(env.summary, id, md); + implicit_instances = + match md.md_implicit with + | Asttypes.Nonimplicit -> env.implicit_instances + | Asttypes.Implicit _ -> (path, md) :: env.implicit_instances; } - and store_modtype slot id path info env renv = { env with modtypes = EnvTbl.add "module type" slot id (path, info) env.modtypes @@ -1531,17 +1511,19 @@ let _ = (* Insertion of bindings by identifier *) -let add_functor_arg ?(arg=false) id env = - if not arg then env else - {env with - functor_args = Ident.add id () env.functor_args; - summary = Env_functor_arg (env.summary, id)} - -let add_implicit_arg ?(arg=false) id env = - if not arg then env else - {env with - implicit_args = Ident.add id () env.implicit_args; - summary = Env_functor_arg (env.summary, id)} +let add_functor_arg ?(arg = false) ~implicit_ id env = + match arg, implicit_ with + | false, _ -> env + | true, Nonimplicit -> + (* Nonimplicit are normal functor argument *) + {env with + functor_args = Ident.add id () env.functor_args; + summary = Env_functor_arg (env.summary, id)} + | true, Implicit _ -> + (* Implicit args are bound in a function, and are not functors! *) + {env with + implicit_args = Ident.add id () env.implicit_args; + summary = Env_functor_arg (env.summary, id)} let add_value ?check id desc env = store_value None ?check id (Pident id) desc env env @@ -1559,16 +1541,7 @@ and add_module_declaration ?arg id md env = | _ ->*) Pident id in let env = store_module None id path md env env in - add_functor_arg ?arg id env - -and add_implicit_declaration ?arg id imd env = - let path = - (*match md.md_type with - Mty_alias path -> normalize_path env path - | _ ->*) Pident id - in - let env = store_implicit None id path imd env env in - add_implicit_arg ?arg id env + add_functor_arg ?arg ~implicit_:md.md_implicit id env and add_modtype id info env = store_modtype None id (Pident id) info env env @@ -1579,11 +1552,8 @@ and add_class id ty env = and add_cltype id ty env = store_cltype None id (Pident id) ty env env -let add_module ?arg id mty env = - add_module_declaration ?arg id (md mty) env - -let add_implicit ?arg id ~arity mty env = - add_implicit_declaration ?arg id (imd arity mty) env +let add_module ?arg ?implicit_ id mty env = + add_module_declaration ?arg id (md ?implicit_ mty) env let add_local_constraint id info elv env = match info with @@ -1608,20 +1578,12 @@ and enter_module_declaration ?arg name md env = (id, add_module_declaration ?arg id md env) (* let (id, env) = enter store_module name md env in (id, add_functor_arg ?arg id env) *) -and enter_implicit_declaration name imd env = - let id = Ident.create name in - (id, add_implicit_declaration id imd env) - (* let (id, env) = enter store_module name md env in - (id, add_functor_arg ?arg id env) *) and enter_modtype = enter store_modtype and enter_class = enter store_class and enter_cltype = enter store_cltype -let enter_module ?arg s mty env = - enter_module_declaration ?arg s (md mty) env - -let enter_implicit s ~arity mty env = - enter_implicit_declaration s (imd arity mty) env +let enter_module ?arg ~implicit_ s mty env = + enter_module_declaration ?arg s (md ~implicit_ mty) env (* Insertion of all components of a signature *) @@ -1631,7 +1593,6 @@ let add_item comp env = | Sig_type(id, decl, _) -> add_type ~check:false id decl env | Sig_typext(id, ext, _) -> add_extension ~check:false id ext env | Sig_module(id, md, _) -> add_module_declaration id md env - | Sig_implicit(id, imd) -> add_implicit_declaration id imd env | Sig_modtype(id, decl) -> add_modtype id decl env | Sig_class(id, decl, _) -> add_class id decl env | Sig_class_type(id, decl, _) -> add_cltype id decl env @@ -1662,8 +1623,6 @@ let open_signature slot root sg env0 = store_extension ~check:false slot (Ident.hide id) p ext env env0 | Sig_module(id, mty, _) -> store_module slot (Ident.hide id) p mty env env0 - | Sig_implicit(id, imd) -> - store_implicit slot (Ident.hide id) p imd env env0 | Sig_modtype(id, decl) -> store_modtype slot (Ident.hide id) p decl env env0 | Sig_class(id, decl, _) -> diff --git a/typing/env.mli b/typing/env.mli index d197f1d894..baa65842fb 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -20,13 +20,11 @@ type summary = | Env_type of summary * Ident.t * type_declaration | Env_extension of summary * Ident.t * extension_constructor | Env_module of summary * Ident.t * module_declaration - | Env_implicit of summary * Ident.t * implicit_declaration | Env_modtype of summary * Ident.t * modtype_declaration | Env_class of summary * Ident.t * class_declaration | Env_cltype of summary * Ident.t * class_type_declaration | Env_open of summary * Path.t | Env_functor_arg of summary * Ident.t - | Env_implicit_arg of summary * Ident.t type t @@ -82,7 +80,7 @@ val gadt_instance_level: t -> type_expr -> int option val add_gadt_instances: t -> int -> type_expr list -> unit val add_gadt_instance_chain: t -> int -> type_expr -> unit -val implicit_instances: t -> (Path.t * implicit_declaration) list +val implicit_instances: t -> (Path.t * module_declaration) list (* Lookup by long identifiers *) @@ -110,10 +108,8 @@ val add_value: ?check:(string -> Warnings.t) -> Ident.t -> value_description -> t -> t val add_type: check:bool -> Ident.t -> type_declaration -> t -> t val add_extension: check:bool -> Ident.t -> extension_constructor -> t -> t -val add_module: ?arg:bool -> Ident.t -> module_type -> t -> t +val add_module: ?arg:bool -> ?implicit_:Asttypes.implicit_flag -> Ident.t -> module_type -> t -> t val add_module_declaration: ?arg:bool -> Ident.t -> module_declaration -> t -> t -val add_implicit: ?arg:bool ->Ident.t -> arity:int -> module_type -> t -> t -val add_implicit_declaration: ?arg:bool ->Ident.t -> implicit_declaration -> t -> t val add_modtype: Ident.t -> modtype_declaration -> t -> t val add_class: Ident.t -> class_declaration -> t -> t val add_cltype: Ident.t -> class_type_declaration -> t -> t @@ -139,12 +135,9 @@ val enter_value: string -> value_description -> t -> Ident.t * t val enter_type: string -> type_declaration -> t -> Ident.t * t val enter_extension: string -> extension_constructor -> t -> Ident.t * t -val enter_module: ?arg:bool -> string -> module_type -> t -> Ident.t * t +val enter_module: ?arg:bool -> implicit_:Asttypes.implicit_flag -> string -> module_type -> t -> Ident.t * t val enter_module_declaration: ?arg:bool -> string -> module_declaration -> t -> Ident.t * t -val enter_implicit: string -> arity:int -> module_type -> t -> Ident.t * t -val enter_implicit_declaration: - string -> implicit_declaration -> t -> Ident.t * t val enter_modtype: string -> modtype_declaration -> t -> Ident.t * t val enter_class: string -> class_declaration -> t -> Ident.t * t val enter_cltype: string -> class_type_declaration -> t -> Ident.t * t diff --git a/typing/envaux.ml b/typing/envaux.ml index 912ea24030..708da443d2 100644 --- a/typing/envaux.ml +++ b/typing/envaux.ml @@ -55,10 +55,6 @@ let rec env_from_summary sum subst = Env.add_module_declaration id (Subst.module_declaration subst desc) (env_from_summary s subst) - | Env_implicit(s, id, desc) -> - Env.add_implicit_declaration id - (Subst.implicit_declaration subst desc) - (env_from_summary s subst) | Env_modtype(s, id, desc) -> Env.add_modtype id (Subst.modtype_declaration subst desc) (env_from_summary s subst) @@ -83,12 +79,6 @@ let rec env_from_summary sum subst = Env.add_module_declaration id (Subst.module_declaration subst desc) ~arg:true (env_from_summary s subst) | Env_functor_arg _ -> assert false - - | Env_implicit_arg(Env_implicit(s, id, desc), id') when Ident.same id id' -> - Env.add_implicit_declaration id ~arg:true - (Subst.implicit_declaration subst desc) - (env_from_summary s subst) - | Env_implicit_arg _ -> assert false in Hashtbl.add env_cache (sum, subst) env; env diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 3159c9ae29..6162612c74 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -91,46 +91,42 @@ module Constraints = struct and try_sig_item env prj failed (locs, subs as cstrs) field = match field with | Sig_value _ | Sig_modtype _ | Sig_class _ - | Sig_class_type _ | Sig_exception _ -> - failed, cstrs, field + | Sig_class_type _ | Sig_typext _ -> + failed, cstrs, env, field | Sig_type (id,decl,recst) -> + (*FIXME: handling of recursive types*) let name = Ident.name id in - begin try - let (qname, ty), locs = list_extract (name_match prj name) locs in - begin match decl.type_manifest with - | None -> () - | Some ty' -> - let ty' = instance env ty' in - unify env ty ty'; - end; - failed, (locs, subs), - Sig_type (id,{decl with type_manifest = Some ty},recst) - with Not_found -> - failed, cstrs, field - end + let failed, cstrs, decl = + try + let (qname, ty), locs = list_extract (name_match prj name) locs in + begin match decl.type_manifest with + | None -> () + | Some ty' -> + let ty' = instance env ty' in + unify env ty ty'; + end; + failed, (locs, subs), + {decl with type_manifest = Some ty} + with Not_found -> + failed, cstrs, decl + in + let env = Env.add_type ~check:false id decl env in + failed, cstrs, env, + Sig_type (id,decl,recst) | Sig_module (id,decl,recst) -> let name = Ident.name id in - begin try - let (qname, sub), subs = list_extract (name_match prj name) subs in - let subfailed, md_type = try_mty env prj sub decl.md_type in - let subfailed = List.rev_map (fun(xs,t)->(qname::xs,t)) subfailed in - (subfailed @ failed), (locs, subs), - Sig_module (id,{decl with md_type},recst) - with Not_found -> - failed, cstrs, field - end - | Sig_implicit (id,decl) -> - let name = Ident.name id in - begin try - let (qname, sub), subs = list_extract (name_match prj name) subs in - let imd = decl.imd_module in - let subfailed, md_type = try_mty env prj sub imd.md_type in - let subfailed = List.rev_map (fun(xs,t)->(qname::xs,t)) subfailed in - (subfailed @ failed), (locs, subs), - Sig_implicit (id,{decl with imd_module = {imd with md_type}}) - with Not_found -> - failed, cstrs, field - end + let failed, cstrs, decl = + try + let (qname, sub), subs = list_extract (name_match prj name) subs in + let subfailed, md_type = try_mty env prj sub decl.md_type in + let subfailed = List.rev_map (fun(xs,t)->(qname::xs,t)) subfailed in + (subfailed @ failed), (locs, subs), {decl with md_type} + with Not_found -> + failed, cstrs, decl + in + let env = Env.add_module_declaration id decl env in + failed, cstrs, env, + Sig_module (id,decl,recst) and try_sig' env prj fields failed cstrs = function | [] -> @@ -144,7 +140,8 @@ module Constraints = struct failed, List.rev fields | item :: items -> - let failed, cstrs, item' = try_sig_item env prj failed cstrs item in + let failed, cstrs, env, item' = + try_sig_item env prj failed cstrs item in try_sig' env prj (item' :: fields) failed cstrs items and try_sig env prj cstrs sg = @@ -192,7 +189,11 @@ let sign_of_pending inst = let constraints = List.map unflatten_cstr failed in { sign_type = mty; sign_id = ident; sign_constraints = constraints } -let sign_of_implicit_declaration imd = +let sign_of_implicit_declaration md = + let arity = match md.Types.md_implicit with + | Asttypes.Nonimplicit -> assert false + | Asttypes.Implicit n -> n + in let rec find_mty acc n mty = assert (n >= 0); if n = 0 then @@ -202,7 +203,7 @@ let sign_of_implicit_declaration imd = find_mty ((arg_id, arg_ty) :: acc) (n - 1) mty | _ -> assert false in - let _mty = find_mty [] imd.imd_arity imd.imd_module.md_type in + let _mty = find_mty [] arity md.Types.md_type in failwith "TODO" diff --git a/typing/includemod.ml b/typing/includemod.ml index 7f5357aa83..8c7816d0f3 100644 --- a/typing/includemod.ml +++ b/typing/includemod.ml @@ -19,6 +19,8 @@ open Types type symptom = Missing_field of Ident.t * Location.t * string (* kind *) + | Implicit_flags of Ident.t * Asttypes.implicit_flag * Location.t * + Asttypes.implicit_flag * Location.t | Value_descriptions of Ident.t * value_description * value_description | Type_declarations of Ident.t * type_declaration * type_declaration * Includecore.type_mismatch list @@ -48,6 +50,15 @@ exception Error of error list i.e. that x1 is the type of an implementation that fulfills the specification x2. If not, Error is raised with a backtrace of the error. *) +(* Inclusion between implicit flags *) + +let implicit_flags env cxt id f1 l1 f2 l2 = + match f1, f2 with + | Asttypes.Implicit x , Asttypes.Implicit x' when x = x' -> () + | Asttypes.Implicit _ , Asttypes.Nonimplicit -> () + | Asttypes.Nonimplicit, Asttypes.Nonimplicit -> () + | _ -> raise(Error[cxt, env, Implicit_flags(id, f1, l1, f2, l2)]) + (* Inclusion between value descriptions *) let value_descriptions env cxt subst id vd1 vd2 = @@ -126,7 +137,6 @@ type field_desc = | Field_type of string | Field_typext of string | Field_module of string - | Field_implicit of string | Field_modtype of string | Field_class of string | Field_classtype of string @@ -136,7 +146,6 @@ let kind_of_field_desc = function | Field_type _ -> "type" | Field_typext _ -> "extension constructor" | Field_module _ -> "module" - | Field_implicit _ -> "implicit" | Field_modtype _ -> "module type" | Field_class _ -> "class" | Field_classtype _ -> "class type" @@ -146,7 +155,6 @@ let item_ident_name = function | Sig_type(id, d, _) -> (id, d.type_loc, Field_type(Ident.name id)) | Sig_typext(id, d, _) -> (id, d.ext_loc, Field_typext(Ident.name id)) | Sig_module(id, d, _) -> (id, d.md_loc, Field_module(Ident.name id)) - | Sig_implicit(id, d) -> (id, d.imd_module.md_loc, Field_implicit(Ident.name id)) | Sig_modtype(id, d) -> (id, d.mtd_loc, Field_modtype(Ident.name id)) | Sig_class(id, d, _) -> (id, d.cty_loc, Field_class(Ident.name id)) | Sig_class_type(id, d, _) -> (id, d.clty_loc, Field_classtype(Ident.name id)) @@ -159,7 +167,6 @@ let is_runtime_component = function | Sig_value(_,_) | Sig_typext(_,_,_) | Sig_module(_,_,_) - | Sig_implicit(_,_) | Sig_class(_, _,_) -> true (* Print a coercion *) @@ -288,8 +295,7 @@ and signatures env cxt subst sig1 sig2 = let (id_pos_list,_) = List.fold_left (fun (l,pos) -> function - Sig_module (id, _, _) - | Sig_implicit (id, _) -> + Sig_module (id, _, _) -> ((id,pos,Tcoerce_none)::l , pos+1) | item -> (l, if is_runtime_component item then pos+1 else pos)) ([], 0) sig1 in @@ -348,8 +354,6 @@ and signatures env cxt subst sig1 sig2 = Subst.add_type id2 (Pident id1) subst | Sig_module _ -> Subst.add_module id2 (Pident id1) subst - | Sig_implicit _ -> - Subst.add_implicit id2 (Pident id1) subst | Sig_modtype _ -> Subst.add_modtype id2 (Mty_ident (Pident id1)) subst | Sig_value _ | Sig_typext _ @@ -392,11 +396,9 @@ and signature_components old_env env cxt subst paired = let cc = modtypes env (Module id1::cxt) subst (Mtype.strengthen env mty1.md_type (Pident id1)) mty2.md_type in - (pos, cc) :: signature_components env cxt subst rem - | (Sig_implicit(id1, im1), Sig_implicit(id2, im2), pos) :: rem -> - let cc = - modtypes env (Module id1::cxt) subst - (Mtype.strengthen env im1.imd_module.md_type (Pident id1)) im2.imd_module.md_type in + implicit_flags env cxt id1 + mty1.md_implicit mty1.md_loc + mty2.md_implicit mty2.md_loc; (pos, cc) :: signature_components env cxt subst rem | (Sig_modtype(id1, info1), Sig_modtype(id2, info2), pos) :: rem -> modtype_infos env cxt subst id1 info1 info2; @@ -490,6 +492,20 @@ let include_err ppf = function | Missing_field (id, loc, kind) -> fprintf ppf "The %s `%a' is required but not provided" kind ident id; show_loc "Expected declaration" ppf loc + | Implicit_flags (id, f1, l1, f2, l2) -> + let lhs ppf = function + | Asttypes.Nonimplicit -> fprintf ppf "it is non implicit" + | Asttypes.Implicit 0 -> fprintf ppf "it is implicit" + | Asttypes.Implicit n -> fprintf ppf "it has arity %d" n + in + let rhs ppf = function + | Asttypes.Nonimplicit -> fprintf ppf "be non implicit" + | Asttypes.Implicit 0 -> fprintf ppf "be directly implicit" + | Asttypes.Implicit n -> fprintf ppf "have arity %d" n + in + fprintf ppf "Implicit annotation of `%a' is not compatible: %a while it was expected to %a" + ident id lhs f1 rhs f2; + show_locs ppf (l1, l2) | Value_descriptions(id, d1, d2) -> fprintf ppf "@[<hv 2>Values do not match:@ %a@;<1 -2>is not included in@ %a@]" diff --git a/typing/includemod.mli b/typing/includemod.mli index 5bc3c336bb..78c45925ac 100644 --- a/typing/includemod.mli +++ b/typing/includemod.mli @@ -26,6 +26,8 @@ val print_coercion: formatter -> module_coercion -> unit type symptom = Missing_field of Ident.t * Location.t * string (* kind *) + | Implicit_flags of Ident.t * Asttypes.implicit_flag * Location.t * + Asttypes.implicit_flag * Location.t | Value_descriptions of Ident.t * value_description * value_description | Type_declarations of Ident.t * type_declaration * type_declaration * Includecore.type_mismatch list diff --git a/typing/mtype.ml b/typing/mtype.ml index 155c133109..3db1015b6e 100644 --- a/typing/mtype.ml +++ b/typing/mtype.ml @@ -67,11 +67,6 @@ and strengthen_sig env sg p = Sig_module(id, str, rs) :: strengthen_sig (Env.add_module_declaration id md env) rem p (* Need to add the module in case it defines manifest module types *) - | Sig_implicit(id, imd) :: rem -> - let md = imd.imd_module in - let md = strengthen_decl env md (Pdot(p, Ident.name id, nopos)) in - Sig_implicit(id, {imd with imd_module = md}) - :: strengthen_sig (Env.add_implicit_declaration id imd env) rem p | Sig_modtype(id, decl) :: rem -> let newdecl = match decl.mtd_type with @@ -139,11 +134,6 @@ let nondep_supertype env mid mty = | Sig_module(id, md, rs) -> Sig_module(id, {md with md_type=nondep_mty env va md.md_type}, rs) :: rem' - | Sig_implicit(id, imd) -> - let md = imd.imd_module in - let md = {md with md_type=nondep_mty env va md.md_type} in - Sig_implicit(id, {imd with imd_module = md}) - :: rem' | Sig_modtype(id, d) -> begin try Sig_modtype(id, nondep_modtype_decl env d) :: rem' @@ -196,11 +186,6 @@ and enrich_item env p = function md_type = enrich_modtype env (Pdot(p, Ident.name id, nopos)) md.md_type}, rs) - | Sig_implicit(id, im) -> - let md = im.imd_module in - let md = {md with md_type = enrich_modtype env - (Pdot(p, Ident.name id, nopos)) md.md_type} in - Sig_implicit(id, {im with imd_module = md}) | item -> item let rec type_paths env p mty = @@ -221,9 +206,6 @@ and type_paths_sig env p pos sg = | Sig_module(id, md, _) :: rem -> type_paths env (Pdot(p, Ident.name id, pos)) md.md_type @ type_paths_sig (Env.add_module_declaration id md env) p (pos+1) rem - | Sig_implicit(id, imd) :: rem -> - type_paths env (Pdot(p, Ident.name id, pos)) imd.imd_module.md_type @ - type_paths_sig (Env.add_implicit_declaration id imd env) p (pos+1) rem | Sig_modtype(id, decl) :: rem -> type_paths_sig (Env.add_modtype id decl env) p pos rem | (Sig_typext _ | Sig_class _) :: rem -> @@ -249,9 +231,6 @@ and no_code_needed_sig env sg = | Sig_module(id, md, _) :: rem -> no_code_needed env md.md_type && no_code_needed_sig (Env.add_module_declaration id md env) rem - | Sig_implicit(id, imd) :: rem -> - no_code_needed env imd.imd_module.md_type && - no_code_needed_sig (Env.add_implicit_declaration id imd env) rem | (Sig_type _ | Sig_modtype _ | Sig_class_type _) :: rem -> no_code_needed_sig env rem | (Sig_typext _ | Sig_class _) :: rem -> @@ -283,8 +262,6 @@ and contains_type_item env = function raise Exit | Sig_module (_, {md_type = mty}, _) -> contains_type env mty - | Sig_implicit (_, imd) -> - contains_type env imd.imd_module.md_type | Sig_value _ | Sig_type _ | Sig_typext _ @@ -351,15 +328,12 @@ let collect_arg_paths mty = and it_signature_item it si = type_iterators.it_signature_item it si; match si with - Sig_module (id, {md_type=Mty_alias p}, _) - | Sig_implicit (id, {imd_module = {md_type=Mty_alias p}}) -> + Sig_module (id, {md_type=Mty_alias p}, _) -> bindings := Ident.add id p !bindings - | Sig_module (id, {md_type=Mty_signature sg}, _) - | Sig_implicit (id, {imd_module = {md_type=Mty_signature sg}}) -> + | Sig_module (id, {md_type=Mty_signature sg}, _) -> List.iter (function - | Sig_module (id', _, _) - | Sig_implicit (id', _) -> + | Sig_module (id', _, _) -> subst := PathMap.add (Pdot (Pident id, Ident.name id', -1)) id' !subst | _ -> ()) @@ -394,21 +368,9 @@ and remove_aliases_sig env excl sg = | mty -> remove_aliases env excl mty in + let implicit_ = md.md_implicit in Sig_module(id, {md with md_type = mty} , rs) :: - remove_aliases_sig (Env.add_module id mty env) excl rem - | Sig_implicit (id, imd) :: rem -> - let md = imd.imd_module in - let mty = - match md.md_type with - Mty_alias _ when IdentSet.mem id excl -> - md.md_type - | mty -> - remove_aliases env excl mty - in - Sig_implicit(id, {imd with imd_module = {md with md_type = mty}}) :: - remove_aliases_sig - (Env.add_implicit id ~arity:imd.imd_arity mty env) excl - rem + remove_aliases_sig (Env.add_module ~implicit_ id mty env) excl rem | Sig_modtype(id, mtd) :: rem -> Sig_modtype(id, mtd) :: remove_aliases_sig (Env.add_modtype id mtd env) excl rem diff --git a/typing/oprint.ml b/typing/oprint.ml index 43dd990c32..b3305224ec 100644 --- a/typing/oprint.ml +++ b/typing/oprint.ml @@ -451,16 +451,19 @@ and print_out_sig_item ppf = fprintf ppf "@[<2>module type %s@]" name | Osig_modtype (name, mty) -> fprintf ppf "@[<2>module type %s =@ %a@]" name !out_module_type mty - | Osig_module (name, Omty_alias id, _) -> + | Osig_module (name, Omty_alias id, _, _) -> fprintf ppf "@[<2>module %s =@ %a@]" name print_ident id - | Osig_module (name, mty, rs) -> + | Osig_module (name, mty, rs, Asttypes.Nonimplicit) -> fprintf ppf "@[<2>%s %s :@ %a@]" (match rs with Orec_not -> "module" | Orec_first -> "module rec" | Orec_next -> "and") name !out_module_type mty - | Osig_implicit (name, n, mty) -> - fprintf ppf "@[<2>implicit %s %s %a@]" + | Osig_module (name, mty, rs, Asttypes.Implicit n) -> + fprintf ppf "@[<2>%s %s %s %a@]" + (match rs with Orec_not -> "implicit" + | Orec_first -> "implicit rec" + | Orec_next -> "and") (if n = 0 then "module" else "functor") name (print_out_implicit_functor n) mty diff --git a/typing/outcometree.mli b/typing/outcometree.mli index 7f7e8ab834..fc991bcad0 100644 --- a/typing/outcometree.mli +++ b/typing/outcometree.mli @@ -90,9 +90,7 @@ and out_sig_item = out_rec_status | Osig_typext of out_extension_constructor * out_ext_status | Osig_modtype of string * out_module_type - | Osig_module of string * out_module_type * out_rec_status - (** name, number of implicit parameters, module type *) - | Osig_implicit of string * int * out_module_type + | Osig_module of string * out_module_type * out_rec_status * Asttypes.implicit_flag | Osig_type of out_type_decl * out_rec_status | Osig_value of string * out_type * string list and out_type_decl = diff --git a/typing/printtyp.ml b/typing/printtyp.ml index 32c2abe0a6..a3841e158e 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -1230,10 +1230,7 @@ and tree_of_signature_rec env' in_type_group = function [tree_of_extension_constructor id ext es] | Sig_module(id, md, rs) -> [Osig_module (Ident.name id, tree_of_modtype md.md_type, - tree_of_rec rs)] - | Sig_implicit(id, imd) -> - [Osig_implicit (Ident.name id, imd.imd_arity, - tree_of_modtype imd.imd_module.md_type)] + tree_of_rec rs, md.md_implicit)] | Sig_modtype(id, decl) -> [tree_of_modtype_declaration id decl] | Sig_class(id, decl, rs) -> @@ -1252,12 +1249,8 @@ and tree_of_modtype_declaration id decl = in Osig_modtype (Ident.name id, mty) -let tree_of_module id mty rs = - Osig_module (Ident.name id, tree_of_modtype mty, tree_of_rec rs) - -let tree_of_implicit id imd = - Osig_implicit (Ident.name id, imd.imd_arity, - tree_of_modtype imd.imd_module.md_type) +let tree_of_module id ?(implicit_ = Nonimplicit) mty rs = + Osig_module (Ident.name id, tree_of_modtype mty, tree_of_rec rs, implicit_) let modtype ppf mty = !Oprint.out_module_type ppf (tree_of_modtype mty) let modtype_declaration id ppf decl = diff --git a/typing/printtyp.mli b/typing/printtyp.mli index 7f40e648cf..b4c6ad60fe 100644 --- a/typing/printtyp.mli +++ b/typing/printtyp.mli @@ -49,8 +49,7 @@ val tree_of_extension_constructor: Ident.t -> extension_constructor -> ext_status -> out_sig_item val extension_constructor: Ident.t -> formatter -> extension_constructor -> unit -val tree_of_module: Ident.t -> module_type -> rec_status -> out_sig_item -val tree_of_implicit: Ident.t -> implicit_declaration -> out_sig_item +val tree_of_module: Ident.t -> ?implicit_:Asttypes.implicit_flag -> module_type -> rec_status -> out_sig_item val modtype: formatter -> module_type -> unit val signature: formatter -> signature -> unit val tree_of_modtype_declaration: diff --git a/typing/printtyped.ml b/typing/printtyped.ml index e704bed72f..42d97f63c8 100644 --- a/typing/printtyped.ml +++ b/typing/printtyped.ml @@ -107,6 +107,12 @@ let fmt_private_flag f x = | Private -> fprintf f "Private"; ;; +let fmt_implicit_flag f x = + match x with + | Nonimplicit -> fprintf f "Nonimplicit"; + | Implicit n -> fprintf f "Implicit %d" n; +;; + let line i f s (*...*) = fprintf f "%s" (String.make (2*i) ' '); fprintf f s (*...*) @@ -376,10 +382,6 @@ and expression i ppf x = line i ppf "Pexp_letmodule\n"; module_binding i ppf mb; expression i ppf e; - | Texp_letimplicit (imb,e) -> - line i ppf "Pexp_letimplicit %d\n" imb.im_arity; - module_binding i ppf imb.im_module; - expression i ppf e; | Texp_assert (e) -> line i ppf "Pexp_assert"; expression i ppf e; @@ -533,9 +535,8 @@ and class_expr i ppf x = | Tcl_structure (cs) -> line i ppf "Pcl_structure\n"; class_structure i ppf cs; - | Tcl_fun (l, p, _, ce, _) -> - line i ppf "Pcl_fun\n"; - label i ppf l; + | Tcl_fun (arr, p, _, ce, _) -> + line i ppf "Pcl_fun %a\n" arrow_flag arr; pattern i ppf p; class_expr i ppf ce | Tcl_apply (ce, l) -> @@ -646,9 +647,6 @@ and signature_item i ppf x = line i ppf "Psig_module \"%a\"\n" fmt_ident md.md_id; attributes i ppf md.md_attributes; module_type i ppf md.md_type - | Tsig_implicit imd -> - line i ppf "Psig_implicit %d\n" imd.im_arity; - module_declaration i ppf imd.im_module | Tsig_recmodule decls -> line i ppf "Psig_recmodule\n"; list i module_declaration ppf decls; @@ -677,13 +675,15 @@ and signature_item i ppf x = and module_declaration i ppf md = line i ppf "%a" fmt_ident md.md_id; + line i ppf "%a\n" fmt_implicit_flag md.md_implicit; attributes i ppf md.md_attributes; module_type (i+1) ppf md.md_type; -and module_binding i ppf x = - line i ppf "%a\n" fmt_ident x.mb_id; - attributes i ppf x.mb_attributes; - module_expr (i+1) ppf x.mb_expr +and module_binding i ppf mb = + line i ppf "%a\n" fmt_ident mb.mb_id; + line i ppf "%a\n" fmt_implicit_flag mb.mb_implicit; + attributes i ppf mb.mb_attributes; + module_expr (i+1) ppf mb.mb_expr and modtype_declaration i ppf = function | None -> line i ppf "#abstract" @@ -754,9 +754,6 @@ and structure_item i ppf x = | Tstr_module x -> line i ppf "Pstr_module\n"; module_binding i ppf x - | Tstr_implicit imb -> - line i ppf "Pstr_implicit %d\n" imb.im_arity; - module_binding i ppf imb.im_module | Tstr_recmodule bindings -> line i ppf "Pstr_recmodule\n"; list i module_binding ppf bindings diff --git a/typing/subst.ml b/typing/subst.ml index 8c3408cc34..4d1f923d69 100644 --- a/typing/subst.ml +++ b/typing/subst.ml @@ -32,7 +32,6 @@ let identity = let add_type id p s = { s with types = Tbl.add id p s.types } let add_module id p s = { s with modules = Tbl.add id p s.modules } -let add_implicit = add_module let add_modtype id ty s = { s with modtypes = Tbl.add id ty s.modtypes } @@ -339,10 +338,6 @@ let rec rename_bound_idents s idents = function | Sig_module(id, mty, _) :: sg -> let id' = Ident.rename id in rename_bound_idents (add_module id (Pident id') s) (id' :: idents) sg - (* Implicits behave like modules at this point? *) - | Sig_implicit(id, imd) :: sg -> - let id' = Ident.rename id in - rename_bound_idents (add_implicit id (Pident id') s) (id' :: idents) sg | Sig_modtype(id, d) :: sg -> let id' = Ident.rename id in rename_bound_idents (add_modtype id (Mty_ident(Pident id')) s) @@ -389,8 +384,6 @@ and signature_component s comp newid = Sig_typext(newid, extension_constructor s ext, es) | Sig_module(id, d, rs) -> Sig_module(newid, module_declaration s d, rs) - | Sig_implicit (id, imd) -> - Sig_implicit(newid, implicit_declaration s imd) | Sig_modtype(id, d) -> Sig_modtype(newid, modtype_declaration s d) | Sig_class(id, d, rs) -> @@ -403,12 +396,7 @@ and module_declaration s decl = md_type = modtype s decl.md_type; md_attributes = attrs s decl.md_attributes; md_loc = loc s decl.md_loc; - } - -and implicit_declaration s decl = - { - imd_module = module_declaration s decl.imd_module; - imd_arity = decl.imd_arity; + md_implicit = decl.md_implicit; } and modtype_declaration s decl = diff --git a/typing/subst.mli b/typing/subst.mli index 8dea6b7567..a197f82f48 100644 --- a/typing/subst.mli +++ b/typing/subst.mli @@ -32,7 +32,6 @@ val identity: t val add_type: Ident.t -> Path.t -> t -> t val add_module: Ident.t -> Path.t -> t -> t -val add_implicit: Ident.t -> Path.t -> t -> t val add_modtype: Ident.t -> module_type -> t -> t val for_saving: t -> t val reset_for_saving: unit -> unit @@ -52,9 +51,6 @@ val modtype: t -> module_type -> module_type val signature: t -> signature -> signature val modtype_declaration: t -> modtype_declaration -> modtype_declaration val module_declaration: t -> module_declaration -> module_declaration -val typexp : t -> Types.type_expr -> Types.type_expr -val class_signature: t -> class_signature -> class_signature -val implicit_declaration: t -> implicit_declaration -> implicit_declaration (* Composition of substitutions: apply (compose s1 s2) x = apply s2 (apply s1 x) *) diff --git a/typing/typecore.ml b/typing/typecore.ml index d892957500..b9d24e3cb1 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -53,7 +53,6 @@ type error = | Too_many_arguments of bool * type_expr | Abstract_wrong_label of arrow_flag * type_expr | Scoping_let_module of string * type_expr - | Scoping_let_implicit of string * type_expr | Masked_instance_variable of Longident.t | Not_a_variant_type of Longident.t | Incoherent_label_order @@ -158,7 +157,6 @@ let iter_expression f e = | Pexp_for (_, e1, e2, _, e3) -> expr e1; expr e2; expr e3 | Pexp_override sel -> List.iter (fun (_, e) -> expr e) sel | Pexp_letmodule (pmb, e) -> expr e; module_expr pmb.pmb_expr - | Pexp_letimplicit (pib, e) -> expr e; module_expr pib.pim_module.pmb_expr | Pexp_object { pcstr_fields = fs } -> List.iter class_field fs | Pexp_pack me -> module_expr me @@ -194,7 +192,6 @@ let iter_expression f e = | Pstr_attribute _ | Pstr_extension _ -> () | Pstr_include {pincl_mod = me} - | Pstr_implicit {pim_module = {pmb_expr = me}} | Pstr_module {pmb_expr = me} -> module_expr me | Pstr_recmodule l -> List.iter (fun x -> module_expr x.pmb_expr) l | Pstr_class cdl -> List.iter (fun c -> class_expr c.pci_expr) cdl @@ -1458,7 +1455,6 @@ and is_nonexpansive_mod mexp = | Tstr_value (_, pat_exp_list) -> List.for_all (fun vb -> is_nonexpansive vb.vb_expr) pat_exp_list | Tstr_module {mb_expr=m;_} - | Tstr_implicit {im_module = {mb_expr = m; _}; _} | Tstr_include {incl_mod=m;_} -> is_nonexpansive_mod m | Tstr_recmodule id_mod_list -> List.for_all (fun {mb_expr=m;_} -> is_nonexpansive_mod m) @@ -1489,7 +1485,10 @@ let rec approx_type env sty = let ty1 = type_option (newvar ()) in newty (Tarrow (Tarr_optional s, ty1, approx_type env sty, Cok)) | Ptyp_arrow (Parr_implicit s, _, sty) -> - let id, env = Env.enter_module s (Mty_signature []) env in + let id, env = + Env.enter_module ~arg:true ~implicit_:(Implicit 0) + s (Mty_signature []) env + in newty (Tarrow (Tarr_implicit id, newvar (), approx_type env sty, Cok)) | Ptyp_arrow (p, _, sty) -> newty (Tarrow (tarr_of_parr p, newvar (), approx_type env sty, Cok)) @@ -1514,7 +1513,10 @@ let rec type_approx env sexp = newty (Tarrow(Tarr_optional s, type_option (newvar ()), type_approx env e, Cok)) | Pexp_fun (Parr_implicit s, _, _, e) -> - let id, env = Env.enter_module s (Mty_signature []) env in + let id, env = + Env.enter_module ~arg:true ~implicit_:(Implicit 0) + s (Mty_signature []) env + in newty (Tarrow(Tarr_implicit id, newvar (), type_approx env e, Cok)) | Pexp_fun (p, _, _, e) -> @@ -2541,7 +2543,7 @@ and type_expect_ ?in_function env sexp ty_expected = | _ -> assert false end - | Pexp_letmodule({pmb_name = name; pmb_expr = smodl; + | Pexp_letmodule({pmb_name = name; pmb_expr = smodl; pmb_implicit; pmb_attributes; pmb_loc}, sbody) -> let ty = newvar() in (* remember original level *) @@ -2549,7 +2551,9 @@ and type_expect_ ?in_function env sexp ty_expected = Ident.set_current_time ty.level; let context = Typetexp.narrow () in let modl = !type_module env smodl in - let (id, new_env) = Env.enter_module name.txt modl.mod_type env in + let (id, new_env) = + Env.enter_module ~implicit_:pmb_implicit name.txt modl.mod_type env + in Ctype.init_def(Ident.current_time()); Typetexp.widen context; let body = type_expect new_env sbody ty_expected in @@ -2565,40 +2569,9 @@ and type_expect_ ?in_function env sexp ty_expected = with Unify _ -> raise(Error(loc, env, Scoping_let_module(name.txt, body.exp_type))) end; - let mb = { mb_id = id; mb_name = name; mb_expr = modl; - mb_attributes = pmb_attributes; mb_loc = pmb_loc } in - re { - exp_desc = Texp_letmodule (mb, body); - exp_loc = loc; exp_extra = []; - exp_type = ty; - exp_attributes = sexp.pexp_attributes; - exp_env = env } - | Pexp_letimplicit ({pim_module = pmb; pim_arity = arity}, sbody) -> - let {pmb_name = name; pmb_expr = smodl; pmb_attributes; pmb_loc} = pmb in - let ty = newvar() in - (* remember original level *) - begin_def (); - Ident.set_current_time ty.level; - let context = Typetexp.narrow () in - let modl = !type_module env smodl in - let (id, new_env) = Env.enter_implicit name.txt ~arity modl.mod_type env in - Ctype.init_def(Ident.current_time()); - Typetexp.widen context; - let body = type_expect new_env sbody ty_expected in - (* go back to original level *) - end_def (); - (* Unification of body.exp_type with the fresh variable ty - fails if and only if the prefix condition is violated, - i.e. if generative types rooted at id show up in the - type body.exp_type. Thus, this unification enforces the - scoping condition on "let module". *) - begin try - Ctype.unify_var new_env ty body.exp_type - with Unify _ -> - raise(Error(loc, env, Scoping_let_implicit(name.txt, body.exp_type))) - end; - let mb = { mb_id = id; mb_name = name; mb_expr = modl; - mb_attributes = pmb_attributes; mb_loc = pmb_loc } in + let mb = { mb_id = id; mb_name = name; mb_expr = modl; mb_loc = pmb_loc; + mb_implicit = pmb_implicit; mb_attributes = pmb_attributes } + in re { exp_desc = Texp_letmodule (mb, body); exp_loc = loc; exp_extra = []; @@ -3207,7 +3180,9 @@ and type_argument env sarg ty_expected' ty_expected = Texp_function(Tarr_simple, [case eta_pat e], Total) } in Location.prerr_warning texp.exp_loc - (Warnings.Eliminated_optional_arguments (List.map (fun (l, _, _) -> l) args)); + (Warnings.Eliminated_optional_arguments (List.map + (fun (l, _) -> match l with Tapp_optional s -> s + | _ -> assert false) args)); if warn then Location.prerr_warning texp.exp_loc (Warnings.Without_principality "eliminated optional argument"); if is_nonexpansive texp then func texp else @@ -3693,7 +3668,7 @@ and type_implicit_arg id ?in_function env sbody ty_res = Mod.unpack (Exp.ident (mknoloc (Longident.Lident name))) in let modl = !type_module env smodl in - let new_env = Env.add_implicit ~arg:true id ~arity:0 modl.mod_type env in + let new_env = Env.add_module ~arg:true ~implicit_:(Implicit 0) id modl.mod_type env in Ctype.init_def(Ident.current_time()); Typetexp.widen context; let body = type_expect ?in_function new_env sbody ty_res in @@ -3707,10 +3682,12 @@ and type_implicit_arg id ?in_function env sbody ty_res = begin try Ctype.unify_var new_env ty body.exp_type with Unify _ -> - raise(Error(sbody.pexp_loc, env, Scoping_let_implicit(name, body.exp_type))) + raise(Error(sbody.pexp_loc, env, Scoping_let_module(name, body.exp_type))) end; let mb = { mb_id = id; mb_name = mknoloc name; mb_expr = modl; - mb_attributes = []; mb_loc = sbody.pexp_loc } in + mb_implicit = Implicit 0; + mb_attributes = []; mb_loc = sbody.pexp_loc } + in re { exp_desc = Texp_letmodule(mb, body); exp_loc = sbody.pexp_loc; exp_extra = []; @@ -4109,12 +4086,6 @@ let report_error env ppf = function "This `let module' expression has type@ %a@ " type_expr ty; fprintf ppf "In this type, the locally bound module name %s escapes its scope" id - | Scoping_let_implicit(id, ty) -> - reset_and_mark_loops ty; - fprintf ppf - "This `let implicit' expression has type@ %a@ " type_expr ty; - fprintf ppf - "In this type, the locally bound module name %s escapes its scope" id | Masked_instance_variable lid -> fprintf ppf "The instance variable %a@ \ diff --git a/typing/typecore.mli b/typing/typecore.mli index 526eb7d5f6..b4ea67563e 100644 --- a/typing/typecore.mli +++ b/typing/typecore.mli @@ -98,7 +98,6 @@ type error = | Too_many_arguments of bool * type_expr | Abstract_wrong_label of arrow_flag * type_expr | Scoping_let_module of string * type_expr - | Scoping_let_implicit of string * type_expr | Masked_instance_variable of Longident.t | Not_a_variant_type of Longident.t | Incoherent_label_order diff --git a/typing/typedtree.ml b/typing/typedtree.ml index 45fb6a29a0..c98242f606 100644 --- a/typing/typedtree.ml +++ b/typing/typedtree.ml @@ -101,7 +101,6 @@ and expression_desc = | Texp_setinstvar of Path.t * Path.t * string loc * expression | Texp_override of Path.t * (Path.t * string loc * expression) list | Texp_letmodule of module_binding * expression - | Texp_letimplicit of implicit_binding * expression | Texp_assert of expression | Texp_lazy of expression | Texp_object of class_structure * string list @@ -221,7 +220,6 @@ and structure_item_desc = | Tstr_typext of type_extension | Tstr_exception of extension_constructor | Tstr_module of module_binding - | Tstr_implicit of implicit_binding | Tstr_recmodule of module_binding list | Tstr_modtype of module_type_declaration | Tstr_open of open_description @@ -237,18 +235,9 @@ and module_binding = mb_expr: module_expr; mb_attributes: attribute list; mb_loc: Location.t; + mb_implicit: implicit_flag; } -and 'a implicit_infos = - { - im_arity: int; - im_module: 'a; - } - -and implicit_binding = module_binding implicit_infos - -and implicit_declaration = module_declaration implicit_infos - and value_binding = { vb_pat: pattern; @@ -298,7 +287,6 @@ and signature_item_desc = | Tsig_typext of type_extension | Tsig_exception of extension_constructor | Tsig_module of module_declaration - | Tsig_implicit of implicit_declaration | Tsig_recmodule of module_declaration list | Tsig_modtype of module_type_declaration | Tsig_open of open_description @@ -314,6 +302,7 @@ and module_declaration = md_type: module_type; md_attributes: attribute list; md_loc: Location.t; + md_implicit: implicit_flag; } and module_type_declaration = diff --git a/typing/typedtree.mli b/typing/typedtree.mli index 67bb54ed3f..b1eeb5b12a 100644 --- a/typing/typedtree.mli +++ b/typing/typedtree.mli @@ -100,7 +100,6 @@ and expression_desc = | Texp_setinstvar of Path.t * Path.t * string loc * expression | Texp_override of Path.t * (Path.t * string loc * expression) list | Texp_letmodule of module_binding * expression - | Texp_letimplicit of implicit_binding * expression | Texp_assert of expression | Texp_lazy of expression | Texp_object of class_structure * string list @@ -220,7 +219,6 @@ and structure_item_desc = | Tstr_typext of type_extension | Tstr_exception of extension_constructor | Tstr_module of module_binding - | Tstr_implicit of implicit_binding | Tstr_recmodule of module_binding list | Tstr_modtype of module_type_declaration | Tstr_open of open_description @@ -236,18 +234,9 @@ and module_binding = mb_expr: module_expr; mb_attributes: attributes; mb_loc: Location.t; + mb_implicit: implicit_flag; } -and 'a implicit_infos = - { - im_arity: int; - im_module: 'a; - } - -and implicit_binding = module_binding implicit_infos - -and implicit_declaration = module_declaration implicit_infos - and value_binding = { vb_pat: pattern; @@ -297,7 +286,6 @@ and signature_item_desc = | Tsig_typext of type_extension | Tsig_exception of extension_constructor | Tsig_module of module_declaration - | Tsig_implicit of implicit_declaration | Tsig_recmodule of module_declaration list | Tsig_modtype of module_type_declaration | Tsig_open of open_description @@ -313,6 +301,7 @@ and module_declaration = md_type: module_type; md_attributes: attributes; md_loc: Location.t; + md_implicit: implicit_flag; } and module_type_declaration = diff --git a/typing/typedtreeIter.ml b/typing/typedtreeIter.ml index ae10d49d8a..cc5246d8ad 100644 --- a/typing/typedtreeIter.ml +++ b/typing/typedtreeIter.ml @@ -140,7 +140,6 @@ module MakeIterator(Iter : IteratorArgument) : sig | Tstr_typext tyext -> iter_type_extension tyext | Tstr_exception ext -> iter_extension_constructor ext | Tstr_module x -> iter_module_binding x - | Tstr_implicit x -> iter_module_binding x.im_module | Tstr_recmodule list -> List.iter iter_module_binding list | Tstr_modtype mtd -> iter_module_type_declaration mtd | Tstr_open _ -> () @@ -342,9 +341,6 @@ module MakeIterator(Iter : IteratorArgument) : sig | Texp_letmodule (mb, exp) -> iter_module_binding mb; iter_expression exp - | Texp_letimplicit (imb,expr) -> - iter_module_binding imb.im_module; - iter_expression exp | Texp_assert exp -> iter_expression exp | Texp_lazy exp -> iter_expression exp | Texp_object (cl, _) -> @@ -383,8 +379,6 @@ module MakeIterator(Iter : IteratorArgument) : sig iter_type_extension tyext | Tsig_module md -> iter_module_type md.md_type - | Tsig_implicit imd -> - iter_module_type imd.im_module.md_type | Tsig_recmodule list -> List.iter (fun md -> iter_module_type md.md_type) list | Tsig_modtype mtd -> diff --git a/typing/typedtreeMap.ml b/typing/typedtreeMap.ml index 4a33016a6e..59cab908ab 100644 --- a/typing/typedtreeMap.ml +++ b/typing/typedtreeMap.ml @@ -125,8 +125,6 @@ module MakeMap(Map : MapArgument) = struct Tstr_exception (map_extension_constructor ext) | Tstr_module x -> Tstr_module (map_module_binding x) - | Tstr_implicit x -> - Tstr_implicit {x with im_module = map_module_binding x.im_module} | Tstr_recmodule list -> let list = List.map map_module_binding list in Tstr_recmodule list @@ -353,11 +351,6 @@ module MakeMap(Map : MapArgument) = struct ) | Texp_letmodule (mb, exp) -> Texp_letmodule (map_module_binding mb, map_expression exp) - | Texp_letimplicit (x, exp) -> - Texp_letimplicit ( - {x with im_module = map_module_binding x.im_module}, - map_expression exp - ) | Texp_assert exp -> Texp_assert (map_expression exp) | Texp_lazy exp -> Texp_lazy (map_expression exp) | Texp_object (cl, string_list) -> @@ -416,10 +409,6 @@ module MakeMap(Map : MapArgument) = struct Tsig_exception (map_extension_constructor ext) | Tsig_module md -> Tsig_module {md with md_type = map_module_type md.md_type} - | Tsig_implicit im -> - let md = im.im_module in - let md = {md with md_type = map_module_type md.md_type} in - Tsig_implicit {im with im_module = md} | Tsig_recmodule list -> Tsig_recmodule (List.map diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index 2d96273217..df0c1b556d 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -116,7 +116,7 @@ let instantiate_implicits_ty loc env ty = let arguments, instances, subst, rhs' = extract_implicits rhs in inst.implicit_argument :: arguments, Ident.add id' inst instances, - Subst.add_implicit id (Path.Pident id') subst, + Subst.add_module id (Path.Pident id') subst, rhs' (*{ty with desc = Tarrow (Tarr_implicit id', lhs, rhs', comm)}*) | Tarrow (arr, lhs, rhs, comm) -> diff --git a/typing/typemod.ml b/typing/typemod.ml index 2c27183c1f..48c9f2bd7f 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -340,7 +340,9 @@ let rec approx_modtype env smty = | Pmty_functor(param, sarg, sres) -> let arg = may_map (approx_modtype env) sarg in let (id, newenv) = - Env.enter_module ~arg:true param.txt (Btype.default_mty arg) env in + Env.enter_module ~arg:true ~implicit_:Nonimplicit + param.txt (Btype.default_mty arg) env + in let res = approx_modtype newenv sres in Mty_functor(id, arg, res) | Pmty_with(sbody, constraints) -> @@ -355,7 +357,7 @@ and approx_module_declaration env pmd = { Types.md_type = approx_modtype env pmd.pmd_type; md_attributes = pmd.pmd_attributes; - md_loc = pmd.pmd_loc; + md_loc = pmd.pmd_loc; md_implicit = pmd.pmd_implicit; } and approx_sig env ssg = @@ -375,14 +377,6 @@ and approx_sig env ssg = Env.enter_module_declaration pmd.pmd_name.txt md env in Sig_module(id, md, Trec_not) :: approx_sig newenv srem - | Psig_implicit pim -> - let pmd = pim.pim_module in - let md = approx_module_declaration env pmd in - let (id, newenv) = - Env.enter_module_declaration pmd.pmd_name.txt md env - in - Sig_implicit(id, {imd_module = md; imd_arity = pim.pim_arity}) :: - approx_sig newenv srem | Psig_recmodule sdecls -> let decls = List.map @@ -465,8 +459,6 @@ let check_sig_item type_names module_names modtype_names loc = function check "type" loc type_names (Ident.name id) | Sig_module(id, _, _) -> check "module" loc module_names (Ident.name id) - | Sig_implicit(id, _) -> - check "module" loc module_names (Ident.name id) | Sig_modtype(id, _) -> check "module type" loc modtype_names (Ident.name id) | _ -> () @@ -542,7 +534,8 @@ let rec transl_modtype env smty = let arg = Misc.may_map (transl_modtype env) sarg in let ty_arg = Misc.may_map (fun m -> m.mty_type) arg in let (id, newenv) = - Env.enter_module ~arg:true param.txt (Btype.default_mty ty_arg) env in + Env.enter_module ~arg:true ~implicit_:Nonimplicit param.txt + (Btype.default_mty ty_arg) env in Ctype.init_def(Ident.current_time()); (* PR#6513 *) let res = transl_modtype newenv sres in mkmty (Tmty_functor (id, param, arg, res)) @@ -629,48 +622,25 @@ and transl_signature env sg = Sig_typext(ext.ext_id, ext.ext_type, Text_exception) :: rem), final_env | Psig_module pmd -> - check "module" item.psig_loc module_names pmd.pmd_name.txt; + check_name "module" module_names pmd.pmd_name; let tmty = transl_modtype env pmd.pmd_type in let md = { - md_type=tmty.mty_type; - md_attributes=pmd.pmd_attributes; - md_loc=pmd.pmd_loc; + md_type = tmty.mty_type; + md_attributes = pmd.pmd_attributes; + md_loc = pmd.pmd_loc; + md_implicit = pmd.pmd_implicit; } in let (id, newenv) = Env.enter_module_declaration pmd.pmd_name.txt md env in let (trem, rem, final_env) = transl_sig newenv srem in - mksig (Tsig_module {md_id=id; md_name=pmd.pmd_name; md_type=tmty; - md_loc=pmd.pmd_loc; - md_attributes=pmd.pmd_attributes}) + mksig (Tsig_module {md_id = id; md_name = pmd.pmd_name; + md_type = tmty; md_loc = pmd.pmd_loc; + md_implicit = pmd.pmd_implicit; + md_attributes = pmd.pmd_attributes}) env loc :: trem, Sig_module(id, md, Trec_not) :: rem, final_env - - | Psig_implicit {pim_module = pmd; pim_arity = arity} -> - check "module" item.psig_loc module_names pmd.pmd_name.txt; - let tmty = transl_modtype env pmd.pmd_type in - let md = { - md_type=tmty.mty_type; - md_attributes=pmd.pmd_attributes; - md_loc=pmd.pmd_loc; - } - in - let (id, newenv) = - Env.enter_module_declaration pmd.pmd_name.txt md env in - let (trem, rem, final_env) = transl_sig newenv srem in - (* failwith "TODO" check arity ?! *) - mksig (Tsig_implicit - { im_arity = arity; - im_module = {md_id=id; md_name=pmd.pmd_name; md_type=tmty; - md_loc=pmd.pmd_loc; - md_attributes=pmd.pmd_attributes} - }) - env loc :: trem, - Sig_implicit (id, { imd_arity = arity; - imd_module = md }) :: rem, - final_env - | Psig_recmodule sdecls -> List.iter (fun pmd -> check_name "module" module_names pmd.pmd_name) @@ -683,6 +653,7 @@ and transl_signature env sg = let d = {Types.md_type = md.md_type.mty_type; md_attributes = md.md_attributes; md_loc = md.md_loc; + md_implicit = md.md_implicit; } in Sig_module(md.md_id, d, rs)) decls rem, @@ -853,9 +824,9 @@ and transl_recmodule_modtypes loc env sdecls = let dcl2 = List.map2 (fun pmd (id, id_loc, mty) -> - {md_id=id; md_name=id_loc; md_type=mty; - md_loc=pmd.pmd_loc; - md_attributes=pmd.pmd_attributes}) + {md_id = id; md_name = id_loc; md_type = mty; + md_loc = pmd.pmd_loc; md_implicit = pmd.pmd_implicit; + md_attributes = pmd.pmd_attributes}) sdecls dcl2 in (dcl2, env2) @@ -919,7 +890,6 @@ let rec closed_modtype = function and closed_signature_item = function Sig_value(id, desc) -> Ctype.closed_schema desc.val_type | Sig_module(id, md, _) -> closed_modtype md.md_type - | Sig_implicit (id, {imd_module = md; _}) -> closed_modtype md.md_type | _ -> true let check_nongen_scheme env str = @@ -994,7 +964,7 @@ let check_recmodule_inclusion env bindings = (* Generate fresh names Y_i for the rec. bound module idents X_i *) let bindings1 = List.map - (fun (id, _, mty_decl, modl, mty_actual, _attrs, _loc) -> + (fun (id, _, _, _, mty_decl, modl, mty_actual, _attrs, _loc) -> (id, Ident.rename id, mty_actual)) bindings in (* Enter the Y_i in the environment with their actual types substituted @@ -1019,7 +989,7 @@ let check_recmodule_inclusion env bindings = end else begin (* Base case: check inclusion of s(mty_actual) in s(mty_decl) and insert coercion if needed *) - let check_inclusion (id, id_loc, mty_decl, modl, mty_actual, attrs, loc) = + let check_inclusion (id, id_loc, imp_decl, imp_actual, mty_decl, modl, mty_actual, attrs, loc) = let mty_decl' = Subst.modtype s mty_decl.mty_type and mty_actual' = subst_and_strengthen env s id mty_actual in let coercion = @@ -1041,6 +1011,7 @@ let check_recmodule_inclusion env bindings = mb_expr = modl'; mb_attributes = attrs; mb_loc = loc; + mb_implicit = imp_decl; } in List.map check_inclusion bindings @@ -1072,19 +1043,6 @@ let rec package_constraints env loc mty constrs = } in Sig_module (id, md, rs) - | Sig_implicit (id, imd) -> - let rec aux = function - | (m :: ((_ :: _) as l), t) :: rest when m = Ident.name id -> - (l, t) :: aux rest - | _ :: rest -> aux rest - | [] -> [] - in - let md = imd.imd_module in - let md = - {md with md_type = - package_constraints env loc md.md_type (aux constrs) } - in - Sig_implicit (id, {imd with imd_module = md}) | item -> item ) sg @@ -1177,8 +1135,12 @@ let rec type_module ?(alias=false) sttn funct_body anchor env smod = let mty = may_map (transl_modtype env) smty in let ty_arg = may_map (fun m -> m.mty_type) mty in let (id, newenv), funct_body = - match ty_arg with None -> (Ident.create "*", env), false - | Some mty -> Env.enter_module ~arg:true name.txt mty env, true in + match ty_arg with + | None -> (Ident.create "*", env), false + | Some mty -> + Env.enter_module ~arg:true ~implicit_:Nonimplicit name.txt mty env, + true + in let body = type_module sttn funct_body None newenv sbody in rm { mod_desc = Tmod_functor(id, name, mty, body); mod_type = Mty_functor(id, ty_arg, body.mod_type); @@ -1332,7 +1294,7 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = [Sig_typext(ext.ext_id, ext.ext_type, Text_exception)], newenv | Pstr_module {pmb_name = name; pmb_expr = smodl; pmb_attributes = attrs; - pmb_loc; + pmb_loc; pmb_implicit } -> check_name "module" module_names name; @@ -1342,54 +1304,20 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = let md = { md_type = enrich_module_type anchor name.txt modl.mod_type env; md_attributes = attrs; - md_loc = pmb_loc; + md_loc = pmb_loc; md_implicit = pmb_implicit; } in let (id, newenv) = Env.enter_module_declaration name.txt md env in - Tstr_module {mb_id=id; mb_name=name; mb_expr=modl; - mb_attributes=attrs; mb_loc=pmb_loc; + Tstr_module {mb_id = id; mb_name = name; mb_expr = modl; + mb_attributes = attrs; mb_loc = pmb_loc; + mb_implicit = pmb_implicit; }, [Sig_module(id, {md_type = modl.mod_type; md_attributes = attrs; - md_loc = pmb_loc; + md_loc = pmb_loc; md_implicit = pmb_implicit; }, Trec_not)], newenv - | Pstr_implicit {pim_module = pmb; pim_arity = arity} -> - let {pmb_name = name; pmb_expr = smodl; - pmb_attributes = attrs; pmb_loc } = pmb in - check "module" loc module_names name.txt; - let modl = - type_module ~alias:true true funct_body - (anchor_submodule name.txt anchor) env smodl in - let md = - { md_type = enrich_module_type anchor name.txt modl.mod_type env; - md_attributes = attrs; - md_loc = pmb_loc; - } - in - let imd = - { imd_module = md; - imd_arity = arity; - } - in - let (id, newenv) = Env.enter_implicit_declaration name.txt imd env in - (* failwith "TODO" check arity ?! *) - Tstr_implicit - { im_arity = arity; - im_module = {mb_id=id; mb_name=name; mb_expr=modl; - mb_attributes=attrs; mb_loc=pmb_loc; - } - }, - [Sig_implicit(id, - { imd_arity = arity; - imd_module = - {md_type = modl.mod_type; - md_attributes = attrs; - md_loc = pmb_loc; - } - })], - newenv | Pstr_recmodule sbind -> let sbind = List.map @@ -1397,9 +1325,9 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = | {pmb_name = name; pmb_expr = {pmod_desc=Pmod_constraint(expr, typ)}; pmb_attributes = attrs; - pmb_loc = loc; + pmb_loc = loc; pmb_implicit = imp; } -> - name, typ, expr, attrs, loc + name, imp, typ, expr, attrs, loc | mb -> raise (Error (mb.pmb_expr.pmod_loc, env, Recursive_module_require_explicit_type)) @@ -1407,33 +1335,36 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = sbind in List.iter - (fun (name, _, _, _, _) -> check_name "module" module_names name) + (fun (name, _, _, _, _, _) -> check_name "module" module_names name) sbind; let (decls, newenv) = transl_recmodule_modtypes loc env - (List.map (fun (name, smty, smodl, attrs, loc) -> - {pmd_name=name; pmd_type=smty; + (List.map (fun (name, imp, smty, smodl, attrs, loc) -> + {pmd_name=name; pmd_type=smty; pmd_implicit = imp; pmd_attributes=attrs; pmd_loc=loc}) sbind ) in let bindings1 = List.map2 - (fun {md_id=id; md_type=mty} (name, _, smodl, attrs, loc) -> + (fun {md_id=id; md_type=mty; md_implicit = imp} + (name, imp', _, smodl, attrs, loc) -> let modl = type_module true funct_body (anchor_recmodule id anchor) newenv smodl in let mty' = enrich_module_type anchor (Ident.name id) modl.mod_type newenv in - (id, name, mty, modl, mty', attrs, loc)) + (id, name, imp, imp', mty, modl, mty', attrs, loc)) decls sbind in let newenv = (* allow aliasing recursive modules from outside *) List.fold_left (fun env md -> let mdecl = { + Types. md_type = md.md_type.mty_type; md_attributes = md.md_attributes; md_loc = md.md_loc; + md_implicit = md.md_implicit; } in Env.add_module_declaration md.md_id mdecl env @@ -1445,9 +1376,10 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = Tstr_recmodule bindings2, map_rec (fun rs mb -> Sig_module(mb.mb_id, { - md_type=mb.mb_expr.mod_type; - md_attributes=mb.mb_attributes; - md_loc=mb.mb_loc; + md_type = mb.mb_expr.mod_type; + md_attributes = mb.mb_attributes; + md_loc = mb.mb_loc; + md_implicit = mb.mb_implicit; }, rs)) bindings2 [], newenv @@ -1529,15 +1461,6 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = | Sig_value (_, {val_kind=Val_reg}) | Sig_typext _ | Sig_class _ as it -> incr pos; it - | Sig_implicit (id, imd) -> - let n = !pos in incr pos; - let md = imd.imd_module in - let md = {md with md_type = - Mty_alias (Pdot(p,Ident.name id,n))} in - Sig_implicit (id, {imd with imd_module = md}) - | Sig_value (_, {val_kind=Val_reg}) | Sig_exception _ - | Sig_class _ as it -> - incr pos; it | Sig_value _ | Sig_type _ | Sig_modtype _ | Sig_class_type _ as it -> it) @@ -1606,7 +1529,6 @@ and normalize_signature env = List.iter (normalize_signature_item env) and normalize_signature_item env = function Sig_value(id, desc) -> Ctype.normalize_type env desc.val_type | Sig_module(id, md, _) -> normalize_modtype env md.md_type - | Sig_implicit(id, imd) -> normalize_modtype env imd.imd_module.md_type | _ -> () (* Extract the module type of a module expression *) @@ -1652,7 +1574,10 @@ let type_package env m p nl tl = match modl.mod_desc with Tmod_ident (mp,_) -> (mp, env) | _ -> - let (id, new_env) = Env.enter_module ~arg:true "%M" modl.mod_type env in + let (id, new_env) = + Env.enter_module ~arg:true ~implicit_:Nonimplicit + "%M" modl.mod_type env + in (Pident id, new_env) in let rec mkpath mp = function @@ -1686,7 +1611,10 @@ let type_implicit_instance env modl p nl tl = match modl.mod_desc with Tmod_ident (mp,_) -> (mp, env) | _ -> - let (id, new_env) = Env.enter_module ~arg:true "%M" modl.mod_type env in + let (id, new_env) = + Env.enter_module ~arg:true ~implicit_:Nonimplicit + "%M" modl.mod_type env + in (Pident id, new_env) in let rec mkpath mp = function @@ -1810,9 +1738,10 @@ let rec package_signatures subst = function let sg' = Subst.signature subst sg in let oldid = Ident.create_persistent name and newid = Ident.create name in - Sig_module(newid, {md_type=Mty_signature sg'; - md_attributes=[]; - md_loc=Location.none; + Sig_module(newid, {md_type = Mty_signature sg'; + md_attributes = []; + md_loc = Location.none; + md_implicit = Nonimplicit; }, Trec_not) :: package_signatures (Subst.add_module oldid (Pident newid) subst) rem diff --git a/typing/types.ml b/typing/types.ml index 1e946d75fb..66c921878f 100644 --- a/typing/types.ml +++ b/typing/types.ml @@ -290,7 +290,6 @@ and signature_item = | Sig_type of Ident.t * type_declaration * rec_status | Sig_typext of Ident.t * extension_constructor * ext_status | Sig_module of Ident.t * module_declaration * rec_status - | Sig_implicit of Ident.t * implicit_declaration | Sig_modtype of Ident.t * modtype_declaration | Sig_class of Ident.t * class_declaration * rec_status | Sig_class_type of Ident.t * class_type_declaration * rec_status @@ -300,18 +299,12 @@ and module_declaration = md_type: module_type; md_attributes: Parsetree.attributes; md_loc: Location.t; - } - -and implicit_declaration = - { - imd_module: module_declaration; - (* Number of implicit paramaters for functors *) - imd_arity: int; + md_implicit: implicit_flag; } and modtype_declaration = { - mtd_type: module_type option; (* Nonte: abstract *) + mtd_type: module_type option; (* None: abstract *) mtd_attributes: Parsetree.attributes; mtd_loc: Location.t; } diff --git a/typing/types.mli b/typing/types.mli index 6c7a05438d..cf1a05f7df 100644 --- a/typing/types.mli +++ b/typing/types.mli @@ -280,7 +280,6 @@ and signature_item = | Sig_type of Ident.t * type_declaration * rec_status | Sig_typext of Ident.t * extension_constructor * ext_status | Sig_module of Ident.t * module_declaration * rec_status - | Sig_implicit of Ident.t * implicit_declaration | Sig_modtype of Ident.t * modtype_declaration | Sig_class of Ident.t * class_declaration * rec_status | Sig_class_type of Ident.t * class_type_declaration * rec_status @@ -290,6 +289,7 @@ and module_declaration = md_type: module_type; md_attributes: Parsetree.attributes; md_loc: Location.t; + md_implicit: implicit_flag; } and modtype_declaration = @@ -299,13 +299,6 @@ and modtype_declaration = mtd_loc: Location.t; } -and implicit_declaration = - { - imd_module: module_declaration; - (* Number of implicit paramaters for functors *) - imd_arity: int; - } - and rec_status = Trec_not (* first in a nonrecursive group *) | Trec_first (* first in a recursive group *) diff --git a/typing/typetexp.ml b/typing/typetexp.ml index 430f81c486..f5d0e6cda9 100644 --- a/typing/typetexp.ml +++ b/typing/typetexp.ml @@ -425,7 +425,10 @@ let rec transl_type env policy styp = | Ttyp_package pkg -> pkg | _ -> assert false in - let id, env = Env.enter_module s package.pack_type env in + let id, env = + Env.enter_module ~arg:true ~implicit_:(Implicit 0) + s package.pack_type env + in let cty2 = transl_type env policy st2 in let arr = Tarr_implicit id in let ty = newty (Tarrow(arr, cty1.ctyp_type, cty2.ctyp_type, Cok)) in From d05436deab02d6f360155ef630d5c9fe4659abe9 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Thu, 8 May 2014 12:21:14 +0100 Subject: [PATCH 353/494] Update tools/ to new representation --- ocamldoc/odoc_ast.ml | 5 ----- ocamldoc/odoc_env.ml | 1 - ocamldoc/odoc_sig.ml | 5 ----- tools/untypeast.ml | 36 +++++++++++++++++++++--------------- 4 files changed, 21 insertions(+), 26 deletions(-) diff --git a/ocamldoc/odoc_ast.ml b/ocamldoc/odoc_ast.ml index a0d0a52195..d8e0952dcb 100644 --- a/ocamldoc/odoc_ast.ml +++ b/ocamldoc/odoc_ast.ml @@ -116,8 +116,6 @@ module Typedtree_search = | Typedtree.Tstr_include _ -> () | Typedtree.Tstr_eval _ -> () | Typedtree.Tstr_attribute _ -> () - | Typedtree.Tstr_implicit _ -> - failwith "TODO" let tables typedtree = let t = Hashtbl.create 13 in @@ -1464,9 +1462,6 @@ module Analyser = raise (Failure (Odoc_messages.module_not_found_in_typedtree complete_name)) ) - | Parsetree.Pstr_implicit _ -> - failwith "TODO" - | Parsetree.Pstr_recmodule mods -> (* A VOIR ICI pb: pas de lien avec les module type dans les contraintes sur les modules *) diff --git a/ocamldoc/odoc_env.ml b/ocamldoc/odoc_env.ml index 69033574b1..3e05905856 100644 --- a/ocamldoc/odoc_env.ml +++ b/ocamldoc/odoc_env.ml @@ -60,7 +60,6 @@ let rec add_signature env root ?rel signat = | _ -> env in { env2 with env_modules = (rel_name ident, qualify ident) :: env2.env_modules } - | Types.Sig_implicit _ -> failwith "TODO" | Types.Sig_modtype (ident, modtype_decl) -> let env2 = match modtype_decl.Types.mtd_type with diff --git a/ocamldoc/odoc_sig.ml b/ocamldoc/odoc_sig.ml index 3df172e5c9..f5f19d63c5 100644 --- a/ocamldoc/odoc_sig.ml +++ b/ocamldoc/odoc_sig.ml @@ -58,8 +58,6 @@ module Signature_search = Hashtbl.add table (CT (Name.from_ident ident)) signat | Types.Sig_module (ident, _, _) -> Hashtbl.add table (M (Name.from_ident ident)) signat - | Types.Sig_implicit _ -> - failwith "TODO" | Types.Sig_modtype (ident,_) -> Hashtbl.add table (MT (Name.from_ident ident)) signat @@ -338,7 +336,6 @@ module Analyser = | Parsetree.Psig_module {Parsetree.pmd_name=name} | Parsetree.Psig_modtype {Parsetree.pmtd_name=name} as m -> if Name.Set.mem name.txt erased then acc else take_item m - | Parsetree.Psig_implicit _ -> failwith "TODO" | Parsetree.Psig_recmodule mods -> (match List.filter (fun pmd -> not (Name.Set.mem pmd.Parsetree.pmd_name.txt erased)) mods with | [] -> acc @@ -893,8 +890,6 @@ module Analyser = in (maybe_more, new_env2, [ Element_module new_module ]) - | Parsetree.Psig_implicit _ -> - failwith "TODO" | Parsetree.Psig_recmodule decls -> (* we start by extending the environment *) let new_env = diff --git a/tools/untypeast.ml b/tools/untypeast.ml index 1898dcd038..c12f5866ad 100644 --- a/tools/untypeast.ml +++ b/tools/untypeast.ml @@ -65,9 +65,7 @@ and untype_structure_item item = | Tstr_recmodule list -> Pstr_recmodule (List.map untype_module_binding list) | Tstr_modtype mtd -> - Pstr_modtype {pmtd_name=mtd.mtd_name; - pmtd_type=option untype_module_type mtd.mtd_type; - pmtd_loc=mtd.mtd_loc;pmtd_attributes=mtd.mtd_attributes;} + Pstr_modtype (untype_module_type_declaration mtd) | Tstr_open od -> Pstr_open {popen_lid = od.open_txt; popen_override = od.open_override; popen_attributes = od.open_attributes; @@ -111,6 +109,23 @@ and untype_module_binding mb = pmb_implicit = mb.mb_implicit; } +and untype_module_declaration md = + { + pmd_name = md.md_name; + pmd_type = untype_module_type md.md_type; + pmd_attributes = md.md_attributes; + pmd_loc = md.md_loc; + pmd_implicit = md.md_implicit; + } + +and untype_module_type_declaration mtd = + { + pmtd_name = mtd.mtd_name; + pmtd_type = option untype_module_type mtd.mtd_type; + pmtd_attributes = mtd.mtd_attributes; + pmtd_loc = mtd.mtd_loc; + } + and untype_type_declaration decl = { ptype_name = decl.typ_name; @@ -388,20 +403,11 @@ and untype_signature_item item = | Tsig_exception ext -> Psig_exception (untype_extension_constructor ext) | Tsig_module md -> - Psig_module {pmd_name = md.md_name; - pmd_type = untype_module_type md.md_type; - pmd_attributes = md.md_attributes; pmd_loc = md.md_loc; - pmd_implicit = md.md_implicit; - } + Psig_module (untype_module_declaration md) | Tsig_recmodule list -> - Psig_recmodule (List.map (fun md -> - {pmd_name = md.md_name; pmd_type = untype_module_type md.md_type; - pmd_attributes = md.md_attributes; pmd_loc = md.md_loc; - pmd_implicit = md.md_implicit}) list) + Psig_recmodule (List.map untype_module_declaration list) | Tsig_modtype mtd -> - Psig_modtype {pmtd_name=mtd.mtd_name; - pmtd_type=option untype_module_type mtd.mtd_type; - pmtd_attributes=mtd.mtd_attributes; pmtd_loc=mtd.mtd_loc} + Psig_modtype (untype_module_type_declaration mtd) | Tsig_open od -> Psig_open {popen_lid = od.open_txt; popen_override = od.open_override; From 26d949a4ef055ed714361ca39725440683df9fae Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Thu, 8 May 2014 13:35:39 +0100 Subject: [PATCH 354/494] Remove pat_implicit --- tools/tast_iter.ml | 1 - typing/parmatch.ml | 2 -- typing/printtyped.ml | 4 ---- typing/typedtree.ml | 1 - typing/typedtree.mli | 1 - typing/typedtreeIter.ml | 2 +- typing/typedtreeMap.ml | 2 +- 7 files changed, 2 insertions(+), 11 deletions(-) diff --git a/tools/tast_iter.ml b/tools/tast_iter.ml index 72eb1eb9f2..1b62436771 100644 --- a/tools/tast_iter.ml +++ b/tools/tast_iter.ml @@ -74,7 +74,6 @@ let pattern sub pat = let extra = function | Tpat_type _ | Tpat_unpack -> () - | Tpat_implicit -> () | Tpat_constraint ct -> sub # core_type ct in List.iter (fun (c, _, _) -> extra c) pat.pat_extra; diff --git a/typing/parmatch.ml b/typing/parmatch.ml index f550f3db07..c2c7ceba38 100644 --- a/typing/parmatch.ml +++ b/typing/parmatch.ml @@ -153,8 +153,6 @@ let rec pretty_val ppf v = begin match cstr with | Tpat_unpack -> fprintf ppf "@[(module %a)@]" pretty_val { v with pat_extra = rem } - | Tpat_implicit -> - fprintf ppf "@[(implicit %a)@]" pretty_val { v with pat_extra = rem } | Tpat_constraint ctyp -> fprintf ppf "@[(%a : _)@]" pretty_val { v with pat_extra = rem } | Tpat_type _ -> diff --git a/typing/printtyped.ml b/typing/printtyped.ml index 42d97f63c8..1899c945af 100644 --- a/typing/printtyped.ml +++ b/typing/printtyped.ml @@ -222,10 +222,6 @@ and pattern i ppf x = line i ppf "Tpat_unpack\n"; attributes i ppf attrs; pattern i ppf { x with pat_extra = rem } - | (Tpat_implicit, _, attrs) :: rem -> - line i ppf "Tpat_implicit\n"; - attributes i ppf attrs; - pattern i ppf { x with pat_extra = rem } | (Tpat_constraint cty, _, attrs) :: rem -> line i ppf "Tpat_constraint\n"; attributes i ppf attrs; diff --git a/typing/typedtree.ml b/typing/typedtree.ml index c98242f606..58f43636bb 100644 --- a/typing/typedtree.ml +++ b/typing/typedtree.ml @@ -36,7 +36,6 @@ and pat_extra = | Tpat_constraint of core_type | Tpat_type of Path.t * Longident.t loc | Tpat_unpack - | Tpat_implicit and pattern_desc = Tpat_any diff --git a/typing/typedtree.mli b/typing/typedtree.mli index b1eeb5b12a..6820e2e55c 100644 --- a/typing/typedtree.mli +++ b/typing/typedtree.mli @@ -35,7 +35,6 @@ and pat_extra = | Tpat_constraint of core_type | Tpat_type of Path.t * Longident.t loc | Tpat_unpack - | Tpat_implicit and pattern_desc = Tpat_any diff --git a/typing/typedtreeIter.ml b/typing/typedtreeIter.ml index cc5246d8ad..1f488972f3 100644 --- a/typing/typedtreeIter.ml +++ b/typing/typedtreeIter.ml @@ -226,7 +226,7 @@ module MakeIterator(Iter : IteratorArgument) : sig Iter.enter_pattern pat; List.iter (fun (cstr, _, _attrs) -> match cstr with | Tpat_type _ -> () - | Tpat_unpack | Tpat_implicit -> () + | Tpat_unpack -> () | Tpat_constraint ct -> iter_core_type ct) pat.pat_extra; begin match pat.pat_desc with diff --git a/typing/typedtreeMap.ml b/typing/typedtreeMap.ml index 59cab908ab..44abc5b834 100644 --- a/typing/typedtreeMap.ml +++ b/typing/typedtreeMap.ml @@ -250,7 +250,7 @@ module MakeMap(Map : MapArgument) = struct and map_pat_extra pat_extra = match pat_extra with | Tpat_constraint ct, loc, attrs -> (Tpat_constraint (map_core_type ct), loc, attrs) - | (Tpat_type _ | Tpat_unpack | Tpat_implicit), _, _ -> pat_extra + | (Tpat_type _ | Tpat_unpack), _, _ -> pat_extra and map_expression exp = let exp = Map.enter_expression exp in From b768c4fd8bb3c25736fbd3d91b156107b6ad7bf6 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Thu, 8 May 2014 22:46:32 +0100 Subject: [PATCH 355/494] PoC: testable recursive resolution I'm lying, code generation is broken, but resolution works :) --- typing/implicitsearch.ml | 467 ++++++++++++++++++++++++--------------- typing/includecore.ml | 1 + typing/typecore.ml | 2 +- typing/typeimplicit.ml | 77 ++++--- 4 files changed, 333 insertions(+), 214 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 6162612c74..484a53cb51 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -4,51 +4,26 @@ open Types open Typedtree open Typeimplicit -(*let alias_id = ref 0 -let alias_ty env ty = - incr alias_id; - let name = "%t" ^ string_of_int !alias_id in - let tyd = { type_params = []; - type_arity = 0; - type_kind = Type_abstract; - type_private = Asttypes.Public; - type_manifest = Some ty; - type_variance = []; - type_newtype_level = None; - type_loc = Location.none; - type_attributes = [] } - in - let _, env = Env.enter_type name tyd env in - env, Ast_helper.Typ.constr (Location.mknoloc (Longident.Lident name)) [] - -let alias_tys (env,tl) ty = - let env, t = alias_ty env ty in - env, t :: tl - -let implicit_mty inst = - let (path, nl, tl) = inst.implicit_type in - let mtd = { mtd_type = Some (Mty_ident path); - mtd_attributes = []; - mtd_loc = Location.none; } - in - (* Generate fresh name for module *) - let _, env = Env.enter_modtype "%M" mtd inst.implicit_env in +module Constraints = struct - (* Generate fresh names for types *) - let env, tl' = List.fold_left alias_tys (env,[]) tl in - let tl' = List.rev tl' in + (* Apply constraints to a module type. - let _, pmty = - Typetexp.create_package_mty Location.none env - (Location.mknoloc (Longident.Lident "%M"), - List.map2 (fun n t -> Location.mknoloc n, t) nl tl') - in - let mty = !Typetexp.transl_modtype env pmty in + 1. Traverse the module type to substitute type declarations with + constraints and accumulate types to unify. - let mty = Mtype.scrape env mty.mty_type in - mty*) + When constraining a type declaration, add the constraint as manifest. + If the type declaration already had a manifest, keep the original + manifest in a separate list to unify it in a later pass. -module Constraints = struct + During traversal, register module and submodule types in + environment because find_modtype_expansion might need them. + + 2. Do a second pass, rebuilding the environment and unifying constraints. + + Envirnoment is rebuilt with the types obtained after substitution. + For each type in the unify list, instantiate it in its local + environment and unify it with the constrained type. + *) let rec list_extract f acc = function | x :: xs when f x -> x, List.rev_append acc xs @@ -56,193 +31,325 @@ module Constraints = struct | [] -> raise Not_found let list_extract f xs = list_extract f [] xs - let name_match prj name (qname,_) = name = prj qname + let name_match name (qname,_) = name = qname - let split_constraint (local,subs) = function + type ('n,'cstr) t = + | Local of 'cstr + | Sub of ('n * ('n,'cstr) t) list + + let local_constraint = function + | Local cstr -> cstr + | Sub _ -> assert false + + let sub_constraints = function + | Local _ -> assert false + | Sub cstrs -> cstrs + + let rec add_constraint env acc = function | [], _ -> assert false | [x], c -> - ((x, c) :: local, subs) + begin match (try Some (list_extract (name_match x) acc) + with Not_found -> None) + with + | None -> (x, Local c) :: acc + | Some ((_x, c'), _) -> + unify env (local_constraint c') c; + acc + end | (x :: xs), c -> - let (x, sub), subs = - try list_extract (name_match (fun x->x) x) subs - with Not_found -> (x, []), subs + let (x, cstr), acc = + try list_extract (name_match x) acc + with Not_found -> (x, Sub []), acc in - (local, (x, (xs, c) :: sub) :: subs) + let cstr = sub_constraints cstr in + (x, Sub (add_constraint env cstr (xs, c))) :: acc - let split_constraints l = - List.fold_left split_constraint ([],[]) l + let split_constraints env l = + List.fold_left (add_constraint env) [] l - let rec try_mty env prj cstrs mty = + let register_items env = function + | Sig_type (id, ty, (Trec_not | Trec_first)) :: items -> + let rec aux env id ty items = + let env = Env.add_type ~check:false id ty env in + match items with + | Sig_type (id, ty, Trec_next) :: items -> + aux env id ty items + | _ -> env + in + aux env id ty items + | Sig_module (id, decl, (Trec_not | Trec_first)) :: items -> + let rec aux env id decl items = + let env = Env.add_module_declaration id decl env in + match items with + | Sig_module (id, decl, Trec_next) :: items -> + aux env id decl items + | _ -> env + in + aux env id decl items + | Sig_modtype (id,mtd) :: _ -> + Env.add_modtype id mtd env + | _ -> env + + let rec prepare_mty env cstrs mty = if cstrs = [] then [], mty else match mty with - | Mty_functor _ | Mty_alias _ -> cstrs, mty + | Mty_functor _ | Mty_alias _ -> assert false | Mty_ident p -> begin try let mty = Env.find_modtype_expansion p env in - try_mty env prj cstrs mty + prepare_mty env cstrs mty with Not_found -> - cstrs, mty + assert false end | Mty_signature sg -> - let failed, sg' = try_sig env prj cstrs sg in - failed, Mty_signature sg' + let to_unify, sg' = prepare_sig env cstrs sg in + to_unify, Mty_signature sg' - and try_sig_item env prj failed (locs, subs as cstrs) field = + and prepare_sig_item env cstrs field = match field with - | Sig_value _ | Sig_modtype _ | Sig_class _ + | Sig_value _ | Sig_class _ | Sig_modtype _ | Sig_class_type _ | Sig_typext _ -> - failed, cstrs, env, field + [], cstrs, field | Sig_type (id,decl,recst) -> - (*FIXME: handling of recursive types*) let name = Ident.name id in - let failed, cstrs, decl = - try - let (qname, ty), locs = list_extract (name_match prj name) locs in - begin match decl.type_manifest with - | None -> () - | Some ty' -> - let ty' = instance env ty' in - unify env ty ty'; - end; - failed, (locs, subs), - {decl with type_manifest = Some ty} - with Not_found -> - failed, cstrs, decl - in - let env = Env.add_type ~check:false id decl env in - failed, cstrs, env, - Sig_type (id,decl,recst) + begin try + let (_, cstr), cstrs = list_extract (name_match name) cstrs in + let ty = local_constraint cstr in + let to_unify = + match decl.type_manifest with + | None -> [] + | Some ty' -> [(id, Local ty')] + in + to_unify, cstrs, + Sig_type (id,{decl with type_manifest = Some ty}, recst) + with Not_found -> + [], cstrs, field + end | Sig_module (id,decl,recst) -> let name = Ident.name id in - let failed, cstrs, decl = - try - let (qname, sub), subs = list_extract (name_match prj name) subs in - let subfailed, md_type = try_mty env prj sub decl.md_type in - let subfailed = List.rev_map (fun(xs,t)->(qname::xs,t)) subfailed in - (subfailed @ failed), (locs, subs), {decl with md_type} - with Not_found -> - failed, cstrs, decl - in - let env = Env.add_module_declaration id decl env in - failed, cstrs, env, - Sig_module (id,decl,recst) - - and try_sig' env prj fields failed cstrs = function - | [] -> - let (locs, subs) = cstrs in - let locs = List.map (fun (x,t) -> [x],t) locs in - let subs = List.map - (fun (x,xss) -> List.map (fun (xs,c) -> (x::xs),c) xss) - subs - in - let failed = locs @ List.flatten subs @ failed in - failed, List.rev fields + begin try + let (_, subs), cstrs = list_extract (name_match name) cstrs in + let subs = sub_constraints subs in + let subs, mty = prepare_mty env subs decl.md_type in + let to_unify = match subs with + | [] -> [] + | subs -> [(id, Sub subs)] + in + to_unify, cstrs, + Sig_module (id,{decl with md_type = mty}, recst) + with Not_found -> + [], cstrs, field + end - | item :: items -> - let failed, cstrs, env, item' = - try_sig_item env prj failed cstrs item in - try_sig' env prj (item' :: fields) failed cstrs items + and prepare_sig' env to_unify fields cstrs items = + let env = register_items env items in + match items, cstrs with + | items, [] -> + List.rev to_unify, + List.rev_append fields items + | [], cstrs -> + let txt = String.concat ", " (List.map fst cstrs) in + failwith ("constraints " ^ txt ^ " failed to apply") + | item :: items, cstrs -> + let to_unify', cstrs, item' = prepare_sig_item env cstrs item in + prepare_sig' env (to_unify' @ to_unify) (item' :: fields) cstrs items - and try_sig env prj cstrs sg = + and prepare_sig env cstrs sg = if cstrs = [] then [], sg else - try_sig' env prj [] [] (split_constraints cstrs) sg + prepare_sig' env [] [] cstrs sg + + let rec constraint_mty env to_unify mty = + if to_unify <> [] then + match mty with + | Mty_functor _ | Mty_alias _ | Mty_ident _ -> assert false + | Mty_signature sg -> + constraint_sig env to_unify sg + + and constraint_sig_item env cstrs field = + match field, cstrs with + | Sig_type (id,decl,recst), + ((id', Local ty') :: cstrs) when Ident.same id id' -> + let ty = match decl.type_manifest with + | None -> assert false (* filled in previous pass *) + | Some ty -> ty + in + let ty' = instance env ty' in + unify env ty ty'; + cstrs + + | Sig_module (id,decl,recst), + ((id', Sub subs) :: cstrs) when Ident.same id id' -> + constraint_mty env subs decl.md_type; + cstrs + + | _ -> cstrs + + and constraint_sig env cstrs items = + let env = register_items env items in + match items, cstrs with + | _, [] -> () + (* generated constraints should all have been satisfied *) + | [], _ -> assert false + | item :: items, cstrs -> + let cstrs = constraint_sig_item env cstrs item in + constraint_sig env cstrs items + + let apply env mty cstrs = + let cstrs = split_constraints env cstrs in + let to_unify, mty = prepare_mty env cstrs mty in + constraint_mty env to_unify mty; + mty + + let flatten ~root cstrs = + let flatten_cstr (n,t) = + let id', dots = Path.flatten n in + assert (Ident.same root id'); + assert (dots <> []); + List.map fst dots, t + in + List.map flatten_cstr cstrs end -type sign = { - sign_type : Types.module_type; - sign_id : Ident.t; - sign_constraints : (Path.t * Types.type_expr) list; +type target = { + target_type : Types.module_type; + target_id : Ident.t; } -let sign_of_pending inst = +let target_of_pending inst = let env = inst.implicit_env in + let ident = inst.implicit_id in let path, nl, tl = inst.implicit_type in + (* Extract base module type *) let mtd = Env.find_modtype path env in let mty = match mtd.mtd_type with - | None -> assert false - | Some mty -> mty + | None -> assert false + | Some mty -> mty in - let with_cstrs = List.map2 (fun n t -> Longident.flatten n, t) nl tl in - let mty = - let failed, mty = Constraints.try_mty env (fun x->x) with_cstrs mty in - (* No constraint should fail to apply, otherwise we are doing something - wrong with package_type. *) - assert (failed = []); - mty + let cstrs = + (* Constraints from package type *) + (List.map2 (fun n t -> Longident.flatten n, t) nl tl) + (* Constraints from implicit instance *) @ + (Constraints.flatten ~root:ident inst.implicit_constraints) in - let ident = inst.implicit_id in - let flatten_cstr (n,t) = - let id', dots = Path.flatten n in - (* All constraints should apply to fields of the implicit module *) - assert (Ident.same ident id'); - assert (dots <> []); - dots, t - in - let cstrs = inst.implicit_constraints in - let cstrs = List.map flatten_cstr cstrs in - let failed, mty = Constraints.try_mty env fst cstrs mty in - let unflatten_cstr (n,t) = Path.unflatten ident n, t in - let constraints = List.map unflatten_cstr failed in - { sign_type = mty; sign_id = ident; sign_constraints = constraints } - -let sign_of_implicit_declaration md = - let arity = match md.Types.md_implicit with - | Asttypes.Nonimplicit -> assert false - | Asttypes.Implicit n -> n - in - let rec find_mty acc n mty = + let mty = Constraints.apply env mty cstrs in + { target_type = mty; target_id = inst.implicit_id } + +let candidate_of_implicit_declaration env {Types. md_type; md_implicit} = + let rec find_mty targets n mty = assert (n >= 0); if n = 0 then - List.rev acc, mty + List.rev targets, mty else match mty with - | Mty_functor (arg_id, Some arg_ty, mty) -> - find_mty ((arg_id, arg_ty) :: acc) (n - 1) mty + | Mty_functor (target_id, Some target_type, mty) -> + find_mty ({target_id; target_type} :: targets) (n - 1) mty | _ -> assert false in - let _mty = find_mty [] arity md.Types.md_type in - failwith "TODO" - + let arity = match md_implicit with + | Asttypes.Nonimplicit -> assert false + | Asttypes.Implicit n -> n + in + (* Take a fresh copy of the module type, as unlinking is a destructive + operation *) + let md_type = Subst.modtype Subst.identity md_type in -let sign_match env sign (path,imd) = - let subst = Subst.add_module sign.sign_id path Subst.identity in - List.iter (fun (tpath,ty') -> - let tpath = Subst.type_path subst tpath in - let ty = newconstr tpath [] in - let ty' = Subst.type_expr subst ty' in - unify env ty ty' - ) - sign.sign_constraints + let targets, md_type = find_mty [] arity md_type in + let targets_constraints = List.fold_left + (fun tbl target -> Ident.add target.target_id (ref []) tbl) + Ident.empty targets + in + (* Unlink types, generate constraints *) + begin match targets with + | [] -> () + | _ :: targets' -> + let module Unlink = Unlink (struct + let register_constraints_for ident = + try + let lst = Ident.find_same ident targets_constraints in + let add_constraint path var = lst := (path,var) :: !lst in + Some add_constraint + with Not_found -> + None + end) + in + List.iter Unlink.module_type + (md_type :: List.map (fun t -> t.target_type) targets') + end; + (* Apply constraints to module types *) + let targets = + List.map (fun target -> + let cstrs = Constraints.flatten + ~root:target.target_id + !(Ident.find_same target.target_id targets_constraints) + in + let target_type = Constraints.apply env target.target_type cstrs in + {target with target_type}) + targets + in + targets, + md_type -let sign_in_stack _sign stack = +let target_in_stack stack _ = List.length stack >= 4 (* TODO *) -let find_sign env stack sign = - if sign_in_stack sign stack then - raise Not_found - else begin - let _candidates = Env.implicit_instances env in - failwith "TODO" - end - -let find_instance inst = - let snapshot = Btype.snapshot () in - let candidates = Env.implicit_instances inst.implicit_env in - let sign = sign_of_pending inst in - let module_match (path,_ as candidate) = - try - sign_match inst.implicit_env sign candidate; - link_implicit_to_path inst path; - true - with _ -> - Btype.backtrack snapshot; - false - in - List.exists module_match candidates +let rec list_findmap f = function + | [] -> raise Not_found + | x :: xs -> + match f x with + | None -> list_findmap f xs + | Some x' -> x' + +let string_of_path path = + Path.to_longident path |> Longident.flatten |> String.concat "." +let report_error exn = + try + Location.report_exception Format.err_formatter exn + with exn -> + prerr_endline (Printexc.to_string exn) + +let rec find_target env stack target = + prerr_endline "enter find_target\n"; + Misc.try_finally + (fun () -> + let snapshot = Btype.snapshot () in + let stack = target :: stack in + let papply path arg = Path.Papply (path, arg) in + let build_path (path, md) = + prerr_endline ("trying candidate " ^ (string_of_path path)); + let targets, candidate = candidate_of_implicit_declaration env md in + try + if List.exists (target_in_stack stack) targets then + failwith "loop"; + ignore (Includemod.modtypes env candidate target.target_type + : module_coercion); + let args = List.map (find_target env stack) targets in + Some (List.fold_left papply path args) + with exn -> + Btype.backtrack snapshot; + report_error exn; + None + in + list_findmap build_path (Env.implicit_instances env) + ) + (fun () -> prerr_endline "exit find_target\n") + +let find_pending_instance inst = + let print_inst (path,_) = + prerr_endline (string_of_path path) + in + prerr_endline "entering search\ncandidates:"; + List.iter print_inst (Env.implicit_instances inst.implicit_env); + let target = target_of_pending inst in + try + let path = find_target inst.implicit_env [] target in + Link.to_path inst path; + true + with _ -> + false let generalize_implicits () = let current_level = get_current_level () in @@ -264,7 +371,7 @@ let generalize_implicits () = in pending_implicits := rest; try - let not_instantiable inst = not (find_instance inst) in + let not_instantiable inst = not (find_pending_instance inst) in let inst = List.find not_instantiable to_generalize in let loc = inst.implicit_loc in let env = inst.implicit_env in diff --git a/typing/includecore.ml b/typing/includecore.ml index 88fad1e5bc..039c35ea74 100644 --- a/typing/includecore.ml +++ b/typing/includecore.ml @@ -229,6 +229,7 @@ let type_declarations ?(equality = false) env name decl1 id decl2 = if Ctype.equal env true decl1.type_params decl2.type_params then [] else [Constraint] | (Some ty1, Some ty2) -> + Ctype.unify env ty1 ty2; if type_manifest env ty1 decl1.type_params ty2 decl2.type_params decl2.type_private then [] else [Manifest] diff --git a/typing/typecore.ml b/typing/typecore.ml index b9d24e3cb1..174f62312b 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -3407,7 +3407,7 @@ and type_application env funct | (inst :: pending), ((Tapp_implicit,arg) :: args) -> let p, nl, tl = inst.Typeimplicit.implicit_type in let package_ty = newgenty (Tpackage (p,nl,tl)) in - Typeimplicit.link_implicit_to_expr + Typeimplicit.Link.to_expr inst (type_expect env arg package_ty); type_implicits args' args pending | _, (arg :: args) -> diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index df0c1b556d..68f198868a 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -55,9 +55,9 @@ module Unlink end; register path var - let rec type_expr ty = + let it_type_expr it ty = (* First recurse in sub expressions *) - iter_type_expr type_expr ty; + type_iterators.it_type_expr it ty; (* Then replace current type if it is a constructor referring to an implicit *) match ty.desc with @@ -76,6 +76,15 @@ module Unlink | Tconstr (path,_,_) -> assert (P.register_constraints_for (Path.head path) = None) | _ -> () + + let type_iterators = {type_iterators with it_type_expr} + + let type_expr ty = + type_iterators.it_type_expr type_iterators ty + + let module_type mty = + type_iterators.it_module_type type_iterators mty + end let pending_implicits @@ -196,37 +205,39 @@ let pack_implicit inst path = exp_env = env; } -(* Link a pending implicit to the module at specified path. - May fail with unifications or module subtyping errors. -*) -let link_implicit_to_path inst path = - (* Check that all constraints are satisfied *) - let subst = Subst.add_module inst.implicit_id path Subst.identity in - List.iter (fun (tpath,ty') -> - let tpath = Subst.type_path subst tpath in - let ty = newconstr tpath [] in - let ty' = Subst.type_expr subst ty' in - unify inst.implicit_env ty ty' - ) - inst.implicit_constraints; - (* Pack the module to appropriate signature *) - let expr = pack_implicit inst path in - (* Update the argument *) - inst.implicit_argument.arg_expression <- Some expr - -let link_implicit_to_expr inst expr = - (* An implicit instance always have to be a path to a module in scope *) - let rec mod_path me = match me.mod_desc with - | Tmod_ident (path,_) -> path - | Tmod_constraint (me,_,_,_) -> - mod_path me - | _ -> assert false - in - let path = match expr.exp_desc with - | Texp_pack me -> mod_path me - | _ -> assert false - in - link_implicit_to_path inst path +module Link = struct + (* Link a pending implicit to the module at specified path. + May fail with unifications or module subtyping errors. + *) + let to_path inst path = + (* Check that all constraints are satisfied *) + let subst = Subst.add_module inst.implicit_id path Subst.identity in + List.iter (fun (tpath,ty') -> + let tpath = Subst.type_path subst tpath in + let ty = newconstr tpath [] in + let ty' = Subst.type_expr subst ty' in + unify inst.implicit_env ty ty' + ) + inst.implicit_constraints; + (* Pack the module to appropriate signature *) + let expr = pack_implicit inst path in + (* Update the argument *) + inst.implicit_argument.arg_expression <- Some expr + + let to_expr inst expr = + (* An implicit instance always have to be a path to a module in scope *) + let rec mod_path me = match me.mod_desc with + | Tmod_ident (path,_) -> path + | Tmod_constraint (me,_,_,_) -> + mod_path me + | _ -> assert false + in + let path = match expr.exp_desc with + | Texp_pack me -> mod_path me + | _ -> assert false + in + to_path inst path +end (* Extraction of pending implicit arguments *) let extract_pending_implicits expr = From 52a7cd7427094cf521d750279cbc58a5268fbd68 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 9 May 2014 00:20:15 +0100 Subject: [PATCH 356/494] Generate proper module applications --- typing/implicitsearch.ml | 48 ++++++++++++++++++++++++++++++++++++++++ typing/typeimplicit.ml | 29 +++++------------------- 2 files changed, 53 insertions(+), 24 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 484a53cb51..beb8f3eb1c 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -351,6 +351,54 @@ let find_pending_instance inst = with _ -> false +(* Pack module at given path to match a given implicit instance and + update the instance to point to this module. + Return the correct package if any. +*) +let pack_implicit inst path = + let { implicit_type = p,nl,tl; + implicit_env = env; + implicit_loc = loc } = inst in + let rec translpath = function + | Path.Pident _ | Path.Pdot _ as path -> + let md = Env.find_module path env in + let lident = Location.mkloc (Path.to_longident path) loc in + { + mod_desc = Tmod_ident (path, lident); + mod_loc = loc; + mod_type = md.md_type; + mod_env = env; + mod_attributes = []; + } + | Path.Papply (p1,p2) -> + let mfun = translpath p1 and marg = translpath p2 in + match mfun.mod_type with + | Mty_functor (param, Some mty_param, mty_res) -> + let coercion = Includemod.modtypes env marg.mod_type mty_param in + let mty_appl = Subst.modtype + (Subst.add_module param path Subst.identity) mty_res + in + { mod_desc = Tmod_apply(mfun, marg, coercion); + mod_type = mty_appl; + mod_env = env; + mod_attributes = []; + mod_loc = loc; + } + | _ -> assert false + in + let modl = translpath path in + let (modl, tl') = !type_implicit_instance env modl p nl tl in + { + exp_desc = Texp_pack modl; + exp_loc = loc; exp_extra = []; + exp_type = newty (Tpackage (p, nl, tl')); + exp_attributes = []; + exp_env = env; + } + +let () = + Typeimplicit.pack_implicit_ref := pack_implicit + let generalize_implicits () = let current_level = get_current_level () in let not_linked = function diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index 68f198868a..bd12b26470 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -179,31 +179,12 @@ let instantiate_implicits_expr env expr = expr -(* Pack module at given path to match a given implicit instance and - update the instance to point to this module. - Return the correct package if any. -*) +let pack_implicit_ref + : (pending_implicit -> Path.t -> Typedtree.expression) ref + = ref (fun _ _ -> assert false) + let pack_implicit inst path = - let { implicit_type = p,nl,tl; - implicit_env = env; - implicit_loc = loc } = inst in - let md = Env.find_module path env in - let lident = Location.mkloc (Path.to_longident path) loc in - let modl = { - mod_desc = Tmod_ident (path, lident); - mod_loc = loc; - mod_type = md.md_type; - mod_env = env; - mod_attributes = []; - } in - let (modl, tl') = !type_implicit_instance env modl p nl tl in - { - exp_desc = Texp_pack modl; - exp_loc = loc; exp_extra = []; - exp_type = newty (Tpackage (p, nl, tl')); - exp_attributes = []; - exp_env = env; - } + !pack_implicit_ref inst path module Link = struct (* Link a pending implicit to the module at specified path. From ca9446866183971da7385ba8f3fa094cf15d180d Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 9 May 2014 00:22:19 +0100 Subject: [PATCH 357/494] Add examples. Time to play \o/ --- examples.numbers2 | 103 ++++++++++++++++++++++++++++++++++++++++++++ examples.stringify2 | 28 ++++++++++++ 2 files changed, 131 insertions(+) create mode 100644 examples.numbers2 create mode 100644 examples.stringify2 diff --git a/examples.numbers2 b/examples.numbers2 new file mode 100644 index 0000000000..7db596faba --- /dev/null +++ b/examples.numbers2 @@ -0,0 +1,103 @@ +module type NUM = sig + type t + val ( + ) : t -> t -> t + val ( - ) : t -> t -> t + val ( * ) : t -> t -> t + val ( / ) : t -> t -> t + val (~- ) : t -> t + val zero : t + val one : t + val of_int : int -> t +end;; + +module NUM = struct + let ( + ) (implicit M : NUM) = M.( + ) + let ( - ) (implicit M : NUM) = M.( - ) + let ( * ) (implicit M : NUM) = M.( * ) + let ( / ) (implicit M : NUM) = M.( / ) + let (~- ) (implicit M : NUM) = M.(~- ) + let zero (implicit M : NUM) = M.zero + let one (implicit M : NUM) = M.one + let (~~) (implicit M : NUM) = M.of_int +end;; + +module type ORD = sig + type t + val ( = ) : t -> t -> bool + val ( <> ) : t -> t -> bool + val ( < ) : t -> t -> bool + val ( <= ) : t -> t -> bool + val ( > ) : t -> t -> bool + val ( >= ) : t -> t -> bool +end;; + +module ORD = struct + let ( = ) (implicit M : ORD) = M.( = ) + let ( <> ) (implicit M : ORD) = M.( <> ) + let ( < ) (implicit M : ORD) = M.( < ) + let ( <= ) (implicit M : ORD) = M.( <= ) + let ( > ) (implicit M : ORD) = M.( > ) + let ( >= ) (implicit M : ORD) = M.( >= ) +end;; + +implicit module Int = struct + type t = int + let ( + ),( - ),( * ), ( / ), (~- ) = ( + ),( - ),( * ), ( / ), (~- ) + let zero = 0 + let one = 1 + let of_int x = x + let (( = ), ( <> ), ( < ), ( <= ), ( > ), ( >= )) + : (t -> t -> bool) + * (t -> t -> bool) + * (t -> t -> bool) + * (t -> t -> bool) + * (t -> t -> bool) + * (t -> t -> bool) + = ( = ), ( <> ), ( < ), ( <= ), ( > ), ( >= ) +end;; + +implicit module Float = struct + type t = float + let ( + ),( - ),( * ), ( / ), (~- ) = ( +.),( -.),( *.), ( /.), (~-.) + let zero = 0. + let one = 1. + let of_int = float_of_int + let (( = ), ( <> ), ( < ), ( <= ), ( > ), ( >= )) + : (t -> t -> bool) + * (t -> t -> bool) + * (t -> t -> bool) + * (t -> t -> bool) + * (t -> t -> bool) + * (t -> t -> bool) + = ( = ), ( <> ), ( < ), ( <= ), ( > ), ( >= ) +end;; + +implicit functor PairNUM (A : NUM) (B : NUM) = struct + type t = A.t * B.t + let ( + ) (a1,b1) (a2,b2) = (A.( + ) a1 a2, B.( + ) b1 b2) + let ( - ) (a1,b1) (a2,b2) = (A.( - ) a1 a2, B.( - ) b1 b2) + let ( * ) (a1,b1) (a2,b2) = (A.( * ) a1 a2, B.( * ) b1 b2) + let ( / ) (a1,b1) (a2,b2) = (A.( / ) a1 a2, B.( / ) b1 b2) + let (~- ) (a1,b1) = (A.(~- ) a1, B.(~- ) b1) + let zero = A.zero, B.zero + let one = A.one, B.zero + let of_int i = A.of_int i, B.zero +end;; + +implicit functor PairORD (A : ORD) (B : ORD) = struct + type t = A.t * B.t + let ( = ) (a1,b1) (a2,b2) = A.(=) a1 a2 && B.(=) b1 b2 + let ( <> ) (a1,b1) (a2,b2) = A.(<>) a1 a2 || B.(<>) b1 b2 + let ( < ) (a1,b1) (a2,b2) = A.(<) a1 a2 || (A.(=) a1 a2 && B.(<) b1 b2 ) + let ( <= ) (a1,b1) (a2,b2) = A.(<=) a1 a2 || (A.(=) a1 a2 && B.(<=) b1 b2 ) + let ( > ) (a1,b1) (a2,b2) = A.(>) a1 a2 || (A.(=) a1 a2 && B.(>) b1 b2 ) + let ( >= ) (a1,b1) (a2,b2) = A.(>=) a1 a2 || (A.(=) a1 a2 && B.(>=) b1 b2 ) +end;; + +open NUM;; +open ORD;; + +assert ( ~~2 / ~~3 = 0 + && ~~2 / ~~3 = 0.666666666666666666666666666666666666);; + +(1, -1.) + (2, -2.);; diff --git a/examples.stringify2 b/examples.stringify2 new file mode 100644 index 0000000000..85b1925790 --- /dev/null +++ b/examples.stringify2 @@ -0,0 +1,28 @@ +module type STRINGIFY = sig type t val to_string : t -> string end +let to_string (implicit M : STRINGIFY) (xs : M.t) = M.to_string xs;; + +implicit module StringifyString = struct + type t = string + let to_string x = "\"" ^ String.escaped x ^ "\"" +end + +implicit functor StringifyList (X : STRINGIFY) = struct + type t = X.t list + let to_string xs = "[" ^ String.concat "; " (List.map X.to_string xs) ^ "]" +end + +implicit module StringifyInt = struct + type t = int + let to_string = string_of_int +end + +implicit functor StringifyPair (A : STRINGIFY) (B : STRINGIFY) = struct + type t = A.t * B.t + let to_string (a,b) = "(" ^ A.to_string a ^ "," ^ B.to_string b ^ ")" +end;; + +to_string "a";; +to_string ["a";"b";"c"];; +to_string [1;2;3];; +to_string (1,"lol");; +to_string [1, "a";2, "b";3, "c"];; From 0a2677c368eac448e1e6fdd666fc474b2ca22d6e Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 9 May 2014 11:10:05 +0100 Subject: [PATCH 358/494] Revert unify hack :), FIXME --- typing/includecore.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typing/includecore.ml b/typing/includecore.ml index 039c35ea74..9546f22c4d 100644 --- a/typing/includecore.ml +++ b/typing/includecore.ml @@ -229,7 +229,7 @@ let type_declarations ?(equality = false) env name decl1 id decl2 = if Ctype.equal env true decl1.type_params decl2.type_params then [] else [Constraint] | (Some ty1, Some ty2) -> - Ctype.unify env ty1 ty2; + (*Ctype.unify env ty1 ty2;*) if type_manifest env ty1 decl1.type_params ty2 decl2.type_params decl2.type_private then [] else [Manifest] From 769b5486bb174d2a630faf5117d2ece82a02a143 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Tue, 27 May 2014 11:54:05 +0100 Subject: [PATCH 359/494] Ctype: allow equation generation while computing type equality --- typing/ctype.ml | 32 ++++++++++++++++++++++++++++++++ typing/ctype.mli | 3 +++ 2 files changed, 35 insertions(+) diff --git a/typing/ctype.ml b/typing/ctype.ml index bcb0fcfbe0..8a497f18f0 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -3229,6 +3229,16 @@ let matches env ty ty' = (* Equivalence between parameterized types *) (*********************************************) +let equality_equations + : (Path.t * type_expr) list ref Ident.tbl ref + = ref Ident.empty + +let with_equality_equations tbl f = + let equality_equations' = !equality_equations in + equality_equations := tbl; + try_finally f + (fun () -> equality_equations := equality_equations') + let rec get_object_row ty = match repr ty with | {desc=Tfield (_, _, _, tl)} -> get_object_row tl @@ -3321,6 +3331,28 @@ let rec eqtype rename type_pairs subst env t1 t2 = (eqtype rename type_pairs subst env) | (Tunivar _, Tunivar _) -> unify_univar t1' t2' !univar_pairs + + | Tconstr (p, [], _), ty + | ty, Tconstr (p, [], _) -> + begin try + let equations = Ident.find_same (Path.head p) !equality_equations in + try + (* Equations allowed on this identifier *) + try + let ty' = List.assoc p !equations in + (* An equation already apply to this path *) + if t1'.desc == ty then + eqtype rename type_pairs subst env t1 ty + else + eqtype rename type_pairs subst env ty t2 + with Not_found -> + (* Not yet any equation on this path *) + equations := (p, ty) :: !equations + (* No equations allowed on this identifier *) + with Not_found -> + raise (Unify []) + end + | (_, _) -> raise (Unify []) end diff --git a/typing/ctype.mli b/typing/ctype.mli index e00c10a986..e881265bbf 100644 --- a/typing/ctype.mli +++ b/typing/ctype.mli @@ -204,6 +204,9 @@ type class_match_failure = val match_class_types: ?trace:bool -> Env.t -> class_type -> class_type -> class_match_failure list (* Check if the first class type is more general than the second. *) + +val with_equality_equations: (Path.t * type_expr) list ref Ident.tbl -> (unit -> 'a) -> 'a + val equal: Env.t -> bool -> type_expr list -> type_expr list -> bool (* [equal env [x1...xn] tau [y1...yn] sigma] checks whether the parameterized types From 1da8561766ec65d8bfac29337c209a60048bbe40 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Tue, 27 May 2014 17:18:42 +0100 Subject: [PATCH 360/494] Fix equality equations --- typing/ctype.ml | 40 +++++++++++++++++++++------------------- typing/ctype.mli | 1 + typing/ident.ml | 4 ++++ typing/ident.mli | 2 +- 4 files changed, 27 insertions(+), 20 deletions(-) diff --git a/typing/ctype.ml b/typing/ctype.ml index 8a497f18f0..28b46b24bf 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -3233,7 +3233,7 @@ let equality_equations : (Path.t * type_expr) list ref Ident.tbl ref = ref Ident.empty -let with_equality_equations tbl f = +let with_equality_equations tbl f = let equality_equations' = !equality_equations in equality_equations := tbl; try_finally f @@ -3332,26 +3332,28 @@ let rec eqtype rename type_pairs subst env t1 t2 = | (Tunivar _, Tunivar _) -> unify_univar t1' t2' !univar_pairs - | Tconstr (p, [], _), ty - | ty, Tconstr (p, [], _) -> - begin try - let equations = Ident.find_same (Path.head p) !equality_equations in - try - (* Equations allowed on this identifier *) - try - let ty' = List.assoc p !equations in - (* An equation already apply to this path *) + | Tconstr (p1, [], _), ty + ty, Tconstr (p1, [], _) + (* FIXME: handle the case Tconstr (p1, _), Tconstr (p2, _) *) + when Ident.mem (Path.head p1) !equality_equations -> + let equations = Ident.find_same (Path.head p1) !equality_equations in + begin try + let ty' = List.assoc p !equations in + (* An equation already apply to this path *) + if t1'.desc == ty then + eqtype rename type_pairs subst env t1' ty' + else + eqtype rename type_pairs subst env ty' t2' + with Not_found -> + (* Not yet any equation on this path *) + let ty' = if t1'.desc == ty then - eqtype rename type_pairs subst env t1 ty + t1' else - eqtype rename type_pairs subst env ty t2 - with Not_found -> - (* Not yet any equation on this path *) - equations := (p, ty) :: !equations - (* No equations allowed on this identifier *) - with Not_found -> - raise (Unify []) - end + t2' + in + equations := (p, ty') :: !equations + end | (_, _) -> raise (Unify []) diff --git a/typing/ctype.mli b/typing/ctype.mli index e881265bbf..31f5f07111 100644 --- a/typing/ctype.mli +++ b/typing/ctype.mli @@ -283,3 +283,4 @@ val package_subtype : val modtype_of_package : (Env.t -> Location.t -> Path.t -> Longident.t list -> type_expr list -> module_type) ref +val new_declaration : (int * int) option -> type_expr option -> type_declaration diff --git a/typing/ident.ml b/typing/ident.ml index db4ea69912..5302a61284 100644 --- a/typing/ident.ml +++ b/typing/ident.ml @@ -210,6 +210,10 @@ let rec iter f = function | Node(l, k, r, _) -> iter f l; f k.ident k.data; iter f r +let mem id (tbl : 'a tbl) = + try ignore (find_same id tbl : 'a); true + with Not_found -> false + (* Idents for sharing keys *) (* They should be 'totally fresh' -> neg numbers *) diff --git a/typing/ident.mli b/typing/ident.mli index be226c2ddc..601898b47b 100644 --- a/typing/ident.mli +++ b/typing/ident.mli @@ -58,7 +58,7 @@ val find_all: string -> 'a tbl -> 'a list val fold_name: (t -> 'a -> 'b -> 'b) -> 'a tbl -> 'b -> 'b val fold_all: (t -> 'a -> 'b -> 'b) -> 'a tbl -> 'b -> 'b val iter: (t -> 'a -> unit) -> 'a tbl -> unit - +val mem: t -> 'a tbl -> bool (* Idents for sharing keys *) From ee0d45523f4d7eaae4a5deda9515dace0448a383 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Tue, 27 May 2014 17:19:13 +0100 Subject: [PATCH 361/494] Env: strengthen implicit modules on registration --- typing/env.ml | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/typing/env.ml b/typing/env.ml index f119f422ea..1aca534a2a 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -1458,18 +1458,21 @@ and store_extension ~check slot id path ext env renv = summary = Env_extension(env.summary, id, ext) } and store_module slot id path md env renv = - { env with - modules = EnvTbl.add "module" slot id (path, md) env.modules renv.modules; - components = - EnvTbl.add "module" slot id - (path, components_of_module env Subst.identity path md.md_type) - env.components renv.components; - summary = Env_module(env.summary, id, md); - implicit_instances = - match md.md_implicit with - | Asttypes.Nonimplicit -> env.implicit_instances - | Asttypes.Implicit _ -> (path, md) :: env.implicit_instances; - } + let env = + { env with + modules = EnvTbl.add "module" slot id (path, md) env.modules renv.modules; + components = + EnvTbl.add "module" slot id + (path, components_of_module env Subst.identity path md.md_type) + env.components renv.components; + summary = Env_module(env.summary, id, md); + } + in + match md.md_implicit with + | Asttypes.Nonimplicit -> env + | Asttypes.Implicit _ -> + let md = {md with md_type = !strengthen env md.md_type path} in + {env with implicit_instances = (path, md) :: env.implicit_instances} and store_modtype slot id path info env renv = { env with From 7c8b6d6d4762f2bea2289893c9d1b6b83e06f5a2 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Tue, 27 May 2014 17:21:03 +0100 Subject: [PATCH 362/494] Implicitsearch: equation based resolution procedure --- typing/implicitsearch.ml | 283 ++++++++++++++++++++++++--------------- 1 file changed, 178 insertions(+), 105 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index beb8f3eb1c..19102af4e8 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -4,6 +4,28 @@ open Types open Typedtree open Typeimplicit +let rec list_extract f acc = function + | x :: xs when f x -> x, List.rev_append acc xs + | x :: xs -> list_extract f (x :: acc) xs + | [] -> raise Not_found + +let list_extract f xs = list_extract f [] xs + +let rec list_findmap f = function + | [] -> raise Not_found + | x :: xs -> + match f x with + | None -> list_findmap f xs + | Some x' -> x' + +let string_of_path path = + Path.to_longident path |> Longident.flatten |> String.concat "." + +let print_inst (path,_) = + Printf.eprintf "%s\n%!" (string_of_path path) + +let papply path arg = Path.Papply (path, arg) + module Constraints = struct (* Apply constraints to a module type. @@ -20,17 +42,11 @@ module Constraints = struct 2. Do a second pass, rebuilding the environment and unifying constraints. - Envirnoment is rebuilt with the types obtained after substitution. + Environment is rebuilt with the types obtained after substitution. For each type in the unify list, instantiate it in its local environment and unify it with the constrained type. *) - let rec list_extract f acc = function - | x :: xs when f x -> x, List.rev_append acc xs - | x :: xs -> list_extract f (x :: acc) xs - | [] -> raise Not_found - let list_extract f xs = list_extract f [] xs - let name_match name (qname,_) = name = qname type ('n,'cstr) t = @@ -203,6 +219,12 @@ module Constraints = struct constraint_mty env to_unify mty; mty + let apply_abstract env mty cstrs = + let cstrs = split_constraints env cstrs in + let to_unify, mty = prepare_mty env cstrs mty in + assert (to_unify = []); + mty + let flatten ~root cstrs = let flatten_cstr (n,t) = let id', dots = Path.flatten n in @@ -216,9 +238,30 @@ end type target = { target_type : Types.module_type; - target_id : Ident.t; + target_id : Ident.t; + target_uid : Ident.t; } +let remove_type_variables mty = + let variables = ref [] in + let it_type_expr it ty = + let ty = repr ty in + match ty.desc with + | Tvar name -> + let name = match name with + | None -> "ex" + | Some name -> name + in + let ident = Ident.create name in + variables := ident :: !variables; + let ty' = newgenty (Tconstr (Path.Pident ident, [], ref Mnil)) in + link_type ty ty' + | _ -> type_iterators.it_type_expr it ty; + in + let it = {type_iterators with it_type_expr} in + it.it_module_type it mty; + !variables + let target_of_pending inst = let env = inst.implicit_env in let ident = inst.implicit_id in @@ -236,116 +279,146 @@ let target_of_pending inst = (Constraints.flatten ~root:ident inst.implicit_constraints) in let mty = Constraints.apply env mty cstrs in - { target_type = mty; target_id = inst.implicit_id } - -let candidate_of_implicit_declaration env {Types. md_type; md_implicit} = - let rec find_mty targets n mty = - assert (n >= 0); - if n = 0 then - List.rev targets, mty - else match mty with - | Mty_functor (target_id, Some target_type, mty) -> - find_mty ({target_id; target_type} :: targets) (n - 1) mty - | _ -> assert false - in - let arity = match md_implicit with - | Asttypes.Nonimplicit -> assert false - | Asttypes.Implicit n -> n + let variables = remove_type_variables mty in + let id = inst.implicit_id in + variables, {target_type = mty; target_id = id; target_uid = id} + +let rec extract_implicit_parameters targets n omty nmty = + assert (n >= 0); + if n = 0 then + List.rev targets, nmty + else match omty, nmty with + | Mty_functor (target_uid, Some _, omty'), + Mty_functor (target_id, Some target_type, nmty') -> + extract_implicit_parameters + ({target_uid; target_id; target_type} :: targets) (n - 1) omty' nmty' + | _ -> assert false + +let find_implicit_parameters {Types. md_type = omty; md_implicit} = + match md_implicit with + | Asttypes.Nonimplicit -> assert false + | Asttypes.Implicit 0 -> + (* No copy, so we don't lose equality *) + [], omty + + | Asttypes.Implicit arity -> + let nmty = Subst.modtype Subst.identity omty in + extract_implicit_parameters [] arity omty nmty + +(* Validate targets *) +let check_targets stack targets = + List.length stack <= 4 + +let report_error exn = + try + Location.report_exception Format.err_formatter exn + with exn -> + Printf.eprintf "%s\n%!" (Printexc.to_string exn) + +let constraint_targets env targets constraints = + (* [env] is needed only to expand module type names *) + let register_constraint table (path, ty) = + let id, path = Path.flatten path in + let path = List.map fst path in + let cstrs = + try Ident.find_same id table + with Not_found -> [] + in + Ident.add id ((path, ty) :: cstrs) table in - (* Take a fresh copy of the module type, as unlinking is a destructive - operation *) - let md_type = Subst.modtype Subst.identity md_type in - - let targets, md_type = find_mty [] arity md_type in - let targets_constraints = List.fold_left - (fun tbl target -> Ident.add target.target_id (ref []) tbl) - Ident.empty targets + let constraint_table = + List.fold_left register_constraint Ident.empty constraints in + let constraint_target (targets,env) target = + let target = + try + let cstrs = Ident.find_same target.target_id constraint_table in + let mty = Constraints.apply_abstract env target.target_type cstrs in + {target with target_type = mty} + with Not_found -> + target + in + let env = Env.add_module target.target_id target.target_type env in + (target :: targets, env) in - (* Unlink types, generate constraints *) - begin match targets with - | [] -> () - | _ :: targets' -> - let module Unlink = Unlink (struct - let register_constraints_for ident = - try - let lst = Ident.find_same ident targets_constraints in - let add_constraint path var = lst := (path,var) :: !lst in - Some add_constraint - with Not_found -> - None - end) - in - List.iter Unlink.module_type - (md_type :: List.map (fun t -> t.target_type) targets') - end; - (* Apply constraints to module types *) - let targets = - List.map (fun target -> - let cstrs = Constraints.flatten - ~root:target.target_id - !(Ident.find_same target.target_id targets_constraints) + let rtargets, _env = List.fold_left constraint_target ([],env) targets in + List.rev rtargets + +let rec find_target_ env variables eq_table stack target = + let stack = target :: stack in + let build_path (path, md) = + Printf.eprintf "trying candidate %s\n%!" (string_of_path path); + + let sub_targets, candidate = find_implicit_parameters md in + let variables' = !variables in + + try + let new_equations = ref [] in + + let _ : module_coercion = + let eq_table, env = List.fold_left + (fun (eq_table, env) {target_id} -> + Ident.add target_id new_equations eq_table, + Env.add_module target.target_id target.target_type env) + (eq_table, env) sub_targets in - let target_type = Constraints.apply env target.target_type cstrs in - {target with target_type}) - targets - in - targets, - md_type + (*Ctype.with_equality_equations eq_table*) + (fun () -> Includemod.modtypes env candidate target.target_type) + () + in -let target_in_stack stack _ = - List.length stack >= 4 (* TODO *) + let sub_targets = constraint_targets env sub_targets !new_equations in -let rec list_findmap f = function - | [] -> raise Not_found - | x :: xs -> - match f x with - | None -> list_findmap f xs - | Some x' -> x' + assert (check_targets sub_targets stack); -let string_of_path path = - Path.to_longident path |> Longident.flatten |> String.concat "." + let find_parameter (path, env) target = + let arg_path = find_target env variables eq_table stack target in + let md = Env.find_module path env in + let env = Env.add_module_declaration target.target_id md env in + papply path arg_path, env + in -let report_error exn = - try - Location.report_exception Format.err_formatter exn - with exn -> - prerr_endline (Printexc.to_string exn) + let path, _env = List.fold_left find_parameter (path, env) sub_targets in + + Some path + + with exn -> + variables := variables'; + report_error exn; + None + + in + list_findmap build_path (Env.implicit_instances env) -let rec find_target env stack target = - prerr_endline "enter find_target\n"; +and find_target env variables eq_table stack target = + Printf.eprintf "enter find_target\n%!"; Misc.try_finally - (fun () -> - let snapshot = Btype.snapshot () in - let stack = target :: stack in - let papply path arg = Path.Papply (path, arg) in - let build_path (path, md) = - prerr_endline ("trying candidate " ^ (string_of_path path)); - let targets, candidate = candidate_of_implicit_declaration env md in - try - if List.exists (target_in_stack stack) targets then - failwith "loop"; - ignore (Includemod.modtypes env candidate target.target_type - : module_coercion); - let args = List.map (find_target env stack) targets in - Some (List.fold_left papply path args) - with exn -> - Btype.backtrack snapshot; - report_error exn; - None - in - list_findmap build_path (Env.implicit_instances env) - ) - (fun () -> prerr_endline "exit find_target\n") + (fun () -> find_target_ env variables eq_table stack target) + (fun () -> Printf.eprintf "exit find_target\n%!") let find_pending_instance inst = - let print_inst (path,_) = - prerr_endline (string_of_path path) + let env = inst.implicit_env in + + Printf.eprintf "entering search\ncandidates:\n%!"; + List.iter print_inst (Env.implicit_instances env); + let variables, target = target_of_pending inst in + + let level = get_current_level () in + + Printf.eprintf "%d variables\n%!" (List.length variables); + + let env = List.fold_left (fun env variable -> + Env.add_type ~check:false variable + (new_declaration (Some (level, level)) None) env) + env variables + in + + let variables_equation = ref [] in + let eq_table = List.fold_left + (fun tbl id -> Ident.add id variables_equation tbl) + Ident.empty variables in - prerr_endline "entering search\ncandidates:"; - List.iter print_inst (Env.implicit_instances inst.implicit_env); - let target = target_of_pending inst in try - let path = find_target inst.implicit_env [] target in + let path = find_target env variables_equation eq_table [] target in Link.to_path inst path; true with _ -> From 74d0d96f6aca8bb8d3876fed59995b2f874f24e2 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Tue, 27 May 2014 17:34:40 +0100 Subject: [PATCH 363/494] Ctype: fix typo --- typing/ctype.ml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/typing/ctype.ml b/typing/ctype.ml index 28b46b24bf..f46b725a4d 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -3332,11 +3332,11 @@ let rec eqtype rename type_pairs subst env t1 t2 = | (Tunivar _, Tunivar _) -> unify_univar t1' t2' !univar_pairs - | Tconstr (p1, [], _), ty - ty, Tconstr (p1, [], _) + | Tconstr (p, [], _), ty + | ty, Tconstr (p, [], _) (* FIXME: handle the case Tconstr (p1, _), Tconstr (p2, _) *) - when Ident.mem (Path.head p1) !equality_equations -> - let equations = Ident.find_same (Path.head p1) !equality_equations in + when Ident.mem (Path.head p) !equality_equations -> + let equations = Ident.find_same (Path.head p) !equality_equations in begin try let ty' = List.assoc p !equations in (* An equation already apply to this path *) From cacb86c3910882b57d9ffade59a0a77451e64312 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Tue, 27 May 2014 17:34:47 +0100 Subject: [PATCH 364/494] Typemod: check that implicit modules are closed --- typing/typemod.ml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/typing/typemod.ml b/typing/typemod.ml index 48c9f2bd7f..bf1aa4a4da 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -1308,6 +1308,13 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = } in let (id, newenv) = Env.enter_module_declaration name.txt md env in + begin match pmb_implicit with + | Nonimplicit -> () + | Implicit _ -> + if not (closed_modtype modl.mod_type) then + raise(Error(modl.mod_loc, env, + Non_generalizable_module modl.mod_type)) + end; Tstr_module {mb_id = id; mb_name = name; mb_expr = modl; mb_attributes = attrs; mb_loc = pmb_loc; mb_implicit = pmb_implicit; From 68bfa01604cbfd7bf0365a36adda0c4f6195bced Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 28 May 2014 14:47:33 +0100 Subject: [PATCH 365/494] Termination checking --- typing/implicitsearch.ml | 98 +++++++++++++++++++++++++++++++++++----- 1 file changed, 87 insertions(+), 11 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 19102af4e8..25e38fe1a9 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -306,8 +306,82 @@ let find_implicit_parameters {Types. md_type = omty; md_implicit} = extract_implicit_parameters [] arity omty nmty (* Validate targets *) -let check_targets stack targets = - List.length stack <= 4 +module Termination = struct + + let normalize_equations targets equations + : (Ident.t * (string list * type_expr) list) list = + (* Map target_id to target_uid *) + let table = List.fold_left + (fun table {target_id; target_uid} -> + Ident.add target_id (target_uid,ref []) table) + Ident.empty targets + in + (* Add equations to target_id *) + List.iter + (fun (path, eq) -> + try + let id, path = Path.flatten path in + let path = List.map fst path in + let _uid, eqns = Ident.find_same id table in + eqns := (path, eq) :: !eqns + with Not_found -> assert false) + equations; + List.map + (fun {target_id} -> + try + let uid, eqns = Ident.find_same target_id table in + uid, List.sort (fun (a,_) (b,_) -> compare a b) !eqns + with Not_found -> assert false) + targets + + exception Type_is_smaller + let smaller env t1 t2 = + let rec check_ty t = + if equal env true [t1] [t] then + raise Type_is_smaller; + iter_type_expr check_ty t + in + try if equal env true [t1] [t2] + then `Equal + else (iter_type_expr check_ty t2; `Different) + with Type_is_smaller -> + `Smaller + + let rec stronger_equations env acc neqns oeqns = + match neqns, oeqns with + (* Equation on same path, check inclusion of type *) + | (n, nt) :: neqns, (o, ot) :: oeqns when n = o -> + begin match smaller env nt ot with + | `Equal -> stronger_equations env acc neqns oeqns + | `Smaller -> stronger_equations env true neqns oeqns + | `Different -> false + end + + (* Same number of equations, at least one must have been stronger *) + | [], [] -> acc + + (* More equations, always stronger *) + | _, [] -> true + | (n, _) :: neqns, (o, _) :: _ when n < o -> + stronger_equations env true neqns oeqns + + (* Less equations, always weaker *) + | [], _ -> false + | (n, _) :: neqns, (o, _) :: _ -> + assert (n > o); + false + + exception Terminate + let try_add_equations env (uid, eqns) stack = + let eqns' = + try Ident.find_same uid stack + with Not_found -> [] + in + if not (stronger_equations env false eqns eqns') then + (prerr_endline "Termination-checker pruned branch"; raise Terminate); + Ident.add uid eqns stack + +end let report_error exn = try @@ -344,7 +418,6 @@ let constraint_targets env targets constraints = List.rev rtargets let rec find_target_ env variables eq_table stack target = - let stack = target :: stack in let build_path (path, md) = Printf.eprintf "trying candidate %s\n%!" (string_of_path path); @@ -361,23 +434,26 @@ let rec find_target_ env variables eq_table stack target = Env.add_module target.target_id target.target_type env) (eq_table, env) sub_targets in - (*Ctype.with_equality_equations eq_table*) + Ctype.with_equality_equations eq_table (fun () -> Includemod.modtypes env candidate target.target_type) - () in let sub_targets = constraint_targets env sub_targets !new_equations in + let equations = Termination.normalize_equations sub_targets !new_equations in + let sub_targets = List.combine equations sub_targets in - assert (check_targets sub_targets stack); - - let find_parameter (path, env) target = + let find_parameter (path, env, stack) (equations, target) = + let stack = Termination.try_add_equations env equations stack in let arg_path = find_target env variables eq_table stack target in let md = Env.find_module path env in let env = Env.add_module_declaration target.target_id md env in - papply path arg_path, env + papply path arg_path, env, stack in - let path, _env = List.fold_left find_parameter (path, env) sub_targets in + let path, _env, _stack = List.fold_left + find_parameter + (path, env, stack) sub_targets + in Some path @@ -418,7 +494,7 @@ let find_pending_instance inst = Ident.empty variables in try - let path = find_target env variables_equation eq_table [] target in + let path = find_target env variables_equation eq_table Ident.empty target in Link.to_path inst path; true with _ -> From e46d811e0c4a29120b7f94082790fac2f4194516 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 28 May 2014 15:54:43 +0100 Subject: [PATCH 366/494] Implicitsearch: don't share stack between different arguments of the same level --- typing/implicitsearch.ml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 25e38fe1a9..016d954f53 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -442,18 +442,15 @@ let rec find_target_ env variables eq_table stack target = let equations = Termination.normalize_equations sub_targets !new_equations in let sub_targets = List.combine equations sub_targets in - let find_parameter (path, env, stack) (equations, target) = + let find_parameter (path, env) (equations, target) = let stack = Termination.try_add_equations env equations stack in let arg_path = find_target env variables eq_table stack target in let md = Env.find_module path env in let env = Env.add_module_declaration target.target_id md env in - papply path arg_path, env, stack + papply path arg_path, env in - let path, _env, _stack = List.fold_left - find_parameter - (path, env, stack) sub_targets - in + let path, _env = List.fold_left find_parameter (path, env) sub_targets in Some path From 6f16b2649701b8d36a474cba46e9f261ab9035b2 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 28 May 2014 15:55:12 +0100 Subject: [PATCH 367/494] Implicitsearch: prevent binding parameters as implicit --- typing/implicitsearch.ml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 016d954f53..ab222975cf 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -446,6 +446,9 @@ let rec find_target_ env variables eq_table stack target = let stack = Termination.try_add_equations env equations stack in let arg_path = find_target env variables eq_table stack target in let md = Env.find_module path env in + (* The original module declaration might be implicit, we want to avoid + rebinding implicit *) + let md = {md with md_implicit = Asttypes.Nonimplicit} in let env = Env.add_module_declaration target.target_id md env in papply path arg_path, env in From 2d691a2da1de61d074e0e9a09dd5574dc8e8d370 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 28 May 2014 17:35:56 +0100 Subject: [PATCH 368/494] Implicitsearch: cleanup code --- typing/implicitsearch.ml | 365 ++++++++++++++++++++++++--------------- 1 file changed, 227 insertions(+), 138 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index ab222975cf..ab7314052b 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -4,6 +4,8 @@ open Types open Typedtree open Typeimplicit +(** Misc functions *) + let rec list_extract f acc = function | x :: xs when f x -> x, List.rev_append acc xs | x :: xs -> list_extract f (x :: acc) xs @@ -26,6 +28,40 @@ let print_inst (path,_) = let papply path arg = Path.Papply (path, arg) +(** [target] is the point from which a search starts *) +type target = { + (* The module type we try to find an instance for *) + target_type : Types.module_type; + (* The identifier to which bound the result of the search to. + E.g we are trying to fill the hole in + module %target_id : %target_type = _ + *) + target_id : Ident.t; + + (* A unique identifier that will be used for termination checking. + When the target is the argument to a functor instantiation, if this functor is instantiated multiple times + we enforce that the constraints on the argument are stronger. + + Pair (Arg_1) (Pair (Arg_1') (Arg_2)) + + Arg_1 and Arg_1' targets will have a different target_id but the same + target_uid. We check that constraints on Arg_1' are stronger than those on + Arg_1'. + + Note: This is also true of (Pair (Arg_1') (Arg_2)) and Arg_2, used as second + arguments to Pair. + *) + target_uid : Ident.t; +} + +(** Constraints are a list of equations of the form [path] = [type_expr]. + The [Constraints] module apply those equations to a module type by + setting [type_expr] as a manifest for type at [path]. + + [Constraints.apply_abstract] expects all pointed types to be abstract (no + manifest), and fail if this is not the case. + [Constraints.apply] will try to unify those types. +*) module Constraints = struct (* Apply constraints to a module type. @@ -37,8 +73,8 @@ module Constraints = struct If the type declaration already had a manifest, keep the original manifest in a separate list to unify it in a later pass. - During traversal, register module and submodule types in - environment because find_modtype_expansion might need them. + During traversal, we register module and submodule types in environment + because find_modtype_expansion might need them. 2. Do a second pass, rebuilding the environment and unifying constraints. @@ -46,12 +82,14 @@ module Constraints = struct For each type in the unify list, instantiate it in its local environment and unify it with the constrained type. *) - let name_match name (qname,_) = name = qname + (* A tree of constraints, sub levels correspond to constraints applied to sub + modules *) type ('n,'cstr) t = | Local of 'cstr - | Sub of ('n * ('n,'cstr) t) list + | Sub of ('n,'cstr) ts + and ('n,'cstr) ts = ('n * ('n,'cstr) t) list let local_constraint = function | Local cstr -> cstr @@ -84,7 +122,12 @@ module Constraints = struct let split_constraints env l = List.fold_left (add_constraint env) [] l - let register_items env = function + (* Register possibly recursive definitions in environment + (again, we need a populated environment because find_modtype_expansion + might need to lookup local definitions ) *) + let register_items env + : Types.signature_item list -> Env.t + = function | Sig_type (id, ty, (Trec_not | Trec_first)) :: items -> let rec aux env id ty items = let env = Env.add_type ~check:false id ty env in @@ -107,7 +150,10 @@ module Constraints = struct Env.add_modtype id mtd env | _ -> env - let rec prepare_mty env cstrs mty = + let rec prepare_mty + : Env.t -> (string, type_expr) ts -> Types.module_type -> + (Ident.t, type_expr) ts * Types.module_type + = fun env cstrs mty -> if cstrs = [] then [], mty else match mty with | Mty_functor _ | Mty_alias _ -> assert false @@ -171,7 +217,10 @@ module Constraints = struct let to_unify', cstrs, item' = prepare_sig_item env cstrs item in prepare_sig' env (to_unify' @ to_unify) (item' :: fields) cstrs items - and prepare_sig env cstrs sg = + and prepare_sig + : Env.t -> (string, type_expr) ts -> Types.signature -> + (Ident.t, type_expr) ts * Types.signature + = fun env cstrs sg -> if cstrs = [] then [], sg else @@ -234,13 +283,165 @@ module Constraints = struct in List.map flatten_cstr cstrs + (* Apply a list of equations to a list of targets. + Types referred to by paths *must* be abstract. *) + let targets + : Env.t -> target list -> (Path.t * type_expr) list -> target list + = fun env targets constraints -> + (* [env] is needed only to expand module type names *) + let register_constraint table (path, ty) = + let id, path = Path.flatten path in + let path = List.map fst path in + let cstrs = + try Ident.find_same id table + with Not_found -> [] + in + Ident.add id ((path, ty) :: cstrs) table + in + let constraint_table = + List.fold_left register_constraint Ident.empty constraints in + let constraint_target (targets,env) target = + let target = + try + let cstrs = Ident.find_same target.target_id constraint_table in + let mty = apply_abstract env target.target_type cstrs in + {target with target_type = mty} + with Not_found -> + target + in + let env = Env.add_module target.target_id target.target_type env in + (target :: targets, env) + in + let rtargets, _env = List.fold_left constraint_target ([],env) targets in + List.rev rtargets + end -type target = { - target_type : Types.module_type; - target_id : Ident.t; - target_uid : Ident.t; -} +(** Termination checking **) +module Termination : sig + (* A termination criterion is a set of constraints applying on a target_uid. + It's satisfied in a given state iff its constraints are stronger than + those found the state. *) + type t + type state + val initial : state + + (* From a list of target and constraints applying on those targets, + returns a termination criterion for each target *) + val normalize_equations + : target list -> (Path.t * type_expr) list -> (target * t) list + + (* [check env t state] ensures that termination criterion for [t] is + satisfied in [state] and returns the stronger state. + Otherwise, [Terminate] is raised *) + exception Terminate + val check : Env.t -> t -> state -> state + +end = struct + + (* Set of equations used for computing termination criterion. + The list of equations is sorted by path, and each path is unique. *) + type eqns = (string list * type_expr) list + + let rec wellformed_eqns = function + | (path1, _) :: ((path2, _) :: _ as tail) -> + (path1 < path2) && wellformed_eqns tail + | _ -> true + + (* Checking that an individial type is smaller than another one. + The exception never escapes. *) + exception Type_is_smaller + let smaller env t1 t2 : [`Smaller | `Equal | `Different] = + let rec check_ty t = + if equal env true [t1] [t] then + raise Type_is_smaller; + iter_type_expr check_ty t + in + try if equal env true [t1] [t2] + then `Equal + else (iter_type_expr check_ty t2; `Different) + with Type_is_smaller -> + `Smaller + + (* Check that a set of equations is stronger than another one. + [stronger env neqns oeqns] returns true iff + - all equations from oeqns must be smaller or equal in neqns, AND + - one equation must be strictly smaller or neqns must contain more + equations. *) + let rec stronger env acc (neqns : eqns) (oeqns : eqns) = + match neqns, oeqns with + (* Equation on same path, check inclusion of type *) + | (n, nt) :: neqns, (o, ot) :: oeqns when n = o -> + begin match smaller env nt ot with + | `Equal -> stronger env acc neqns oeqns + | `Smaller -> stronger env true neqns oeqns + | `Different -> false + end + (* Same number of equations, at least one must have been stronger *) + | [], [] -> acc + (* More equations, always stronger *) + | _, [] -> true + | (n, _) :: neqns, (o, _) :: _ when n < o -> + stronger env true neqns oeqns + (* Less equations, always weaker *) + | [], _ -> false + | (n, _) :: neqns, (o, _) :: _ -> + assert (n > o); + false + + let stronger env neqns oeqns = stronger env false neqns oeqns + + (* Checking for termination starts from a target uid and a list of equations. + A state is table mapping uids to the strongest set of equations seen so + far. *) + type t = Ident.t * eqns + type state = eqns Ident.tbl + let initial = Ident.empty + + let normalize_equations + (* List of targets *) + (targets : target list) + (* All path must refer to some target_id *) + (equations : (Path.t * type_expr) list) + (* List of equations applying to each target *) + : (target * t) list = + (* Map target_id to target_uid *) + let table = List.fold_left + (fun table {target_id; target_uid} -> + Ident.add target_id (target_uid,ref []) table) + Ident.empty targets + in + (* Add equations to target_id *) + List.iter + (fun (path, eq) -> + try + let id, path = Path.flatten path in + let path = List.map fst path in + let _uid, eqns = Ident.find_same id table in + eqns := (path, eq) :: !eqns + with Not_found -> assert false) + equations; + List.map + (fun target -> + try + let uid, eqns = Ident.find_same target.target_id table in + let eqns = List.sort (fun (a,_) (b,_) -> compare a b) !eqns in + assert (wellformed_eqns eqns); + target, (uid, eqns) + with Not_found -> assert false) + targets + + exception Terminate + let check env (uid, eqns) stack = + let eqns' = + try Ident.find_same uid stack + with Not_found -> [] + in + if not (stronger env eqns eqns') then + (prerr_endline "Termination-checker pruned branch"; raise Terminate); + Ident.add uid eqns stack + +end let remove_type_variables mty = let variables = ref [] in @@ -305,119 +506,14 @@ let find_implicit_parameters {Types. md_type = omty; md_implicit} = let nmty = Subst.modtype Subst.identity omty in extract_implicit_parameters [] arity omty nmty -(* Validate targets *) -module Termination = struct - - let normalize_equations targets equations - : (Ident.t * (string list * type_expr) list) list = - (* Map target_id to target_uid *) - let table = List.fold_left - (fun table {target_id; target_uid} -> - Ident.add target_id (target_uid,ref []) table) - Ident.empty targets - in - (* Add equations to target_id *) - List.iter - (fun (path, eq) -> - try - let id, path = Path.flatten path in - let path = List.map fst path in - let _uid, eqns = Ident.find_same id table in - eqns := (path, eq) :: !eqns - with Not_found -> assert false) - equations; - List.map - (fun {target_id} -> - try - let uid, eqns = Ident.find_same target_id table in - uid, List.sort (fun (a,_) (b,_) -> compare a b) !eqns - with Not_found -> assert false) - targets - - exception Type_is_smaller - let smaller env t1 t2 = - let rec check_ty t = - if equal env true [t1] [t] then - raise Type_is_smaller; - iter_type_expr check_ty t - in - try if equal env true [t1] [t2] - then `Equal - else (iter_type_expr check_ty t2; `Different) - with Type_is_smaller -> - `Smaller - - let rec stronger_equations env acc neqns oeqns = - match neqns, oeqns with - (* Equation on same path, check inclusion of type *) - | (n, nt) :: neqns, (o, ot) :: oeqns when n = o -> - begin match smaller env nt ot with - | `Equal -> stronger_equations env acc neqns oeqns - | `Smaller -> stronger_equations env true neqns oeqns - | `Different -> false - end - - (* Same number of equations, at least one must have been stronger *) - | [], [] -> acc - - (* More equations, always stronger *) - | _, [] -> true - | (n, _) :: neqns, (o, _) :: _ when n < o -> - stronger_equations env true neqns oeqns - - (* Less equations, always weaker *) - | [], _ -> false - | (n, _) :: neqns, (o, _) :: _ -> - assert (n > o); - false - - exception Terminate - let try_add_equations env (uid, eqns) stack = - let eqns' = - try Ident.find_same uid stack - with Not_found -> [] - in - if not (stronger_equations env false eqns eqns') then - (prerr_endline "Termination-checker pruned branch"; raise Terminate); - Ident.add uid eqns stack - -end - let report_error exn = try Location.report_exception Format.err_formatter exn with exn -> Printf.eprintf "%s\n%!" (Printexc.to_string exn) -let constraint_targets env targets constraints = - (* [env] is needed only to expand module type names *) - let register_constraint table (path, ty) = - let id, path = Path.flatten path in - let path = List.map fst path in - let cstrs = - try Ident.find_same id table - with Not_found -> [] - in - Ident.add id ((path, ty) :: cstrs) table - in - let constraint_table = - List.fold_left register_constraint Ident.empty constraints in - let constraint_target (targets,env) target = - let target = - try - let cstrs = Ident.find_same target.target_id constraint_table in - let mty = Constraints.apply_abstract env target.target_type cstrs in - {target with target_type = mty} - with Not_found -> - target - in - let env = Env.add_module target.target_id target.target_type env in - (target :: targets, env) - in - let rtargets, _env = List.fold_left constraint_target ([],env) targets in - List.rev rtargets - -let rec find_target_ env variables eq_table stack target = +let rec find_target env variables eq_table stack target = + let term_state = stack in let build_path (path, md) = Printf.eprintf "trying candidate %s\n%!" (string_of_path path); @@ -438,13 +534,16 @@ let rec find_target_ env variables eq_table stack target = (fun () -> Includemod.modtypes env candidate target.target_type) in - let sub_targets = constraint_targets env sub_targets !new_equations in - let equations = Termination.normalize_equations sub_targets !new_equations in - let sub_targets = List.combine equations sub_targets in + let eqns = !new_equations in + + (* Constraints target types *) + let sub_targets = Constraints.targets env sub_targets eqns in + (* Add termination criteria *) + let sub_targets = Termination.normalize_equations sub_targets eqns in - let find_parameter (path, env) (equations, target) = - let stack = Termination.try_add_equations env equations stack in - let arg_path = find_target env variables eq_table stack target in + let find_parameter (path, env) (target, term_criterion) = + let term_state = Termination.check env term_criterion term_state in + let arg_path = find_target env variables eq_table term_state target in let md = Env.find_module path env in (* The original module declaration might be implicit, we want to avoid rebinding implicit *) @@ -465,23 +564,11 @@ let rec find_target_ env variables eq_table stack target = in list_findmap build_path (Env.implicit_instances env) -and find_target env variables eq_table stack target = - Printf.eprintf "enter find_target\n%!"; - Misc.try_finally - (fun () -> find_target_ env variables eq_table stack target) - (fun () -> Printf.eprintf "exit find_target\n%!") - let find_pending_instance inst = let env = inst.implicit_env in - - Printf.eprintf "entering search\ncandidates:\n%!"; - List.iter print_inst (Env.implicit_instances env); let variables, target = target_of_pending inst in - let level = get_current_level () in - Printf.eprintf "%d variables\n%!" (List.length variables); - let env = List.fold_left (fun env variable -> Env.add_type ~check:false variable (new_declaration (Some (level, level)) None) env) @@ -494,7 +581,9 @@ let find_pending_instance inst = Ident.empty variables in try - let path = find_target env variables_equation eq_table Ident.empty target in + let path = + find_target env variables_equation eq_table Termination.initial target + in Link.to_path inst path; true with _ -> From 1b897f1a974686528bcb6841ea1d194917da5861 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 30 May 2014 12:06:24 +0100 Subject: [PATCH 369/494] Add "open implicit" syntax --- parsing/ast_helper.ml | 4 +- parsing/ast_helper.mli | 2 +- parsing/asttypes.mli | 2 + parsing/parser.mly | 37 +++++++---------- parsing/parsetree.mli | 5 ++- parsing/pprintast.ml | 10 +++-- parsing/printast.ml | 12 ++++-- typing/env.ml | 94 +++++++++++++++++++++++++----------------- typing/env.mli | 2 + typing/printtyped.ml | 13 ++++-- typing/typecore.mli | 2 +- typing/typedtree.ml | 4 +- typing/typedtree.mli | 4 +- typing/typemod.ml | 5 ++- 14 files changed, 115 insertions(+), 81 deletions(-) diff --git a/parsing/ast_helper.ml b/parsing/ast_helper.ml index 28d9ea4219..b304d70f0d 100644 --- a/parsing/ast_helper.ml +++ b/parsing/ast_helper.ml @@ -353,10 +353,10 @@ end module Opn = struct let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs) - ?(override = Fresh) lid = + ?(override = Fresh) ?(flag = Open_all Fresh) lid = { popen_lid = lid; - popen_override = override; + popen_flag = flag; popen_loc = loc; popen_attributes = add_docs_attrs docs attrs; } diff --git a/parsing/ast_helper.mli b/parsing/ast_helper.mli index 92d30147fc..d47cd6039c 100644 --- a/parsing/ast_helper.mli +++ b/parsing/ast_helper.mli @@ -139,7 +139,7 @@ module Exp: val object_: ?loc:loc -> ?attrs:attrs -> class_structure -> expression val newtype: ?loc:loc -> ?attrs:attrs -> string -> expression -> expression val pack: ?loc:loc -> ?attrs:attrs -> module_expr -> expression - val open_: ?loc:loc -> ?attrs:attrs -> override_flag -> lid -> expression -> expression + val open_: ?loc:loc -> ?attrs:attrs -> open_flag -> lid -> expression -> expression val extension: ?loc:loc -> ?attrs:attrs -> extension -> expression val case: pattern -> ?guard:expression -> expression -> case diff --git a/parsing/asttypes.mli b/parsing/asttypes.mli index 62b7095f70..1518183d55 100644 --- a/parsing/asttypes.mli +++ b/parsing/asttypes.mli @@ -33,6 +33,8 @@ type virtual_flag = Virtual | Concrete type override_flag = Override | Fresh +type open_flag = Open_all of override_flag | Open_implicit + type closed_flag = Closed | Open type implicit_flag = Nonimplicit | Implicit of int (*arity*) diff --git a/parsing/parser.mly b/parsing/parser.mly index fe34e226ba..5ba62b2cd1 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -902,24 +902,11 @@ signature_item: | module_alias { mksig(Psig_module $1) } | IMPLICIT implicit_declaration -<<<<<<< HEAD - { mksig(Psig_implicit $2) } + { mksig(Psig_module $2) } | rec_module_declarations { mksig(Psig_recmodule (List.rev $1)) } | module_type_declaration { mksig(Psig_modtype $1) } -======= - { mksig(Psig_module $2) } - | MODULE REC module_rec_declarations - { mksig(Psig_recmodule (List.rev $3)) } - | MODULE TYPE ident post_item_attributes - { mksig(Psig_modtype (Mtd.mk (mkrhs $3 3) - ~attrs:$4 ~loc:(symbol_rloc()))) } - | MODULE TYPE ident EQUAL module_type post_item_attributes - { mksig(Psig_modtype (Mtd.mk (mkrhs $3 3) ~typ:$5 - ~loc:(symbol_rloc()) - ~attrs:$6)) } ->>>>>>> Simplify representation of implicits | open_statement { mksig(Psig_open $1) } | sig_include_statement @@ -935,9 +922,9 @@ signature_item: mksig(Psig_attribute $1) } ; open_statement: - | OPEN override_flag mod_longident post_item_attributes + | OPEN open_flag mod_longident post_item_attributes { Opn.mk (mkrhs $3 3) ~override:$2 ~attrs:$4 - ~loc:(symbol_rloc()) ~docs:(symbol_docs ()) } + ~loc:(symbol_rloc()) ~docs:(symbol_docs ()) } ; sig_include_statement: INCLUDE module_type post_item_attributes %prec below_WITH @@ -1307,7 +1294,7 @@ expr: { mkexp_attrs (Pexp_letmodule($4, $6)) $3 } | LET IMPLICIT ext_attributes implicit_binding IN seq_expr { mkexp_attrs (Pexp_letmodule($4, $6)) $3 } - | LET OPEN override_flag ext_attributes mod_longident IN seq_expr + | LET OPEN open_flag ext_attributes mod_longident IN seq_expr { mkexp_attrs (Pexp_open($3, mkrhs $5 5, $7)) $4 } | FUNCTION ext_attributes opt_bar match_cases { mkexp_attrs (Pexp_function(List.rev $4)) $2 } @@ -1433,7 +1420,7 @@ simple_expr: | simple_expr DOT label_longident { mkexp(Pexp_field($1, mkrhs $3 3)) } | mod_longident DOT LPAREN seq_expr RPAREN - { mkexp(Pexp_open(Fresh, mkrhs $1 1, $4)) } + { mkexp(Pexp_open(Open_all Fresh, mkrhs $1 1, $4)) } | mod_longident DOT LPAREN seq_expr error { unclosed "(" 3 ")" 5 } | simple_expr DOT LPAREN seq_expr RPAREN @@ -1457,7 +1444,7 @@ simple_expr: | mod_longident DOT LBRACE record_expr RBRACE { let (exten, fields) = $4 in let rec_exp = mkexp(Pexp_record(fields, exten)) in - mkexp(Pexp_open(Fresh, mkrhs $1 1, rec_exp)) } + mkexp(Pexp_open(Open_all Fresh, mkrhs $1 1, rec_exp)) } | mod_longident DOT LBRACE record_expr error { unclosed "{" 3 "}" 5 } | LBRACKETBAR expr_semi_list opt_semi BARRBRACKET @@ -1467,7 +1454,7 @@ simple_expr: | LBRACKETBAR BARRBRACKET { mkexp (Pexp_array []) } | mod_longident DOT LBRACKETBAR expr_semi_list opt_semi BARRBRACKET - { mkexp(Pexp_open(Fresh, mkrhs $1 1, mkexp(Pexp_array(List.rev $4)))) } + { mkexp(Pexp_open(Open_all Fresh, mkrhs $1 1, mkexp(Pexp_array(List.rev $4)))) } | mod_longident DOT LBRACKETBAR expr_semi_list opt_semi error { unclosed "[|" 3 "|]" 6 } | LBRACKET expr_semi_list opt_semi RBRACKET @@ -1476,7 +1463,7 @@ simple_expr: { unclosed "[" 1 "]" 4 } | mod_longident DOT LBRACKET expr_semi_list opt_semi RBRACKET { let list_exp = reloc_exp (mktailexp (rhs_loc 6) (List.rev $4)) in - mkexp(Pexp_open(Fresh, mkrhs $1 1, list_exp)) } + mkexp(Pexp_open(Open_all Fresh, mkrhs $1 1, list_exp)) } | mod_longident DOT LBRACKET expr_semi_list opt_semi error { unclosed "[" 3 "]" 6 } | PREFIXOP simple_expr @@ -1492,7 +1479,7 @@ simple_expr: | LBRACELESS GREATERRBRACE { mkexp (Pexp_override [])} | mod_longident DOT LBRACELESS field_expr_list opt_semi GREATERRBRACE - { mkexp(Pexp_open(Fresh, mkrhs $1 1, mkexp (Pexp_override(List.rev $4))))} + { mkexp(Pexp_open(Open_all Fresh, mkrhs $1 1, mkexp (Pexp_override(List.rev $4))))} | mod_longident DOT LBRACELESS field_expr_list opt_semi error { unclosed "{<" 3 ">}" 6 } | simple_expr SHARP label @@ -1507,7 +1494,7 @@ simple_expr: | LPAREN MODULE module_expr COLON error { unclosed "(" 1 ")" 5 } | mod_longident DOT LPAREN MODULE module_expr COLON package_type RPAREN - { mkexp(Pexp_open(Fresh, mkrhs $1 1, + { mkexp(Pexp_open(Open_all Fresh, mkrhs $1 1, mkexp (Pexp_constraint (ghexp (Pexp_pack $5), ghtyp (Ptyp_package $7))))) } | mod_longident DOT LPAREN MODULE module_expr COLON error @@ -2364,6 +2351,10 @@ private_virtual_flags: | PRIVATE VIRTUAL { Private, Virtual } | VIRTUAL PRIVATE { Private, Virtual } ; +open_flag: + | IMPLICIT { Open_implicit } + | override_flag { Open_all $1 } +; override_flag: /* empty */ { Fresh } | BANG { Override } diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index 6393dd73b1..755e893808 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -326,9 +326,10 @@ and expression_desc = (module ME : S) is represented as Pexp_constraint(Pexp_pack, Ptyp_package S) *) - | Pexp_open of override_flag * Longident.t loc * expression + | Pexp_open of open_flag * Longident.t loc * expression (* let open M in E let! open M in E + let open implicit M in E *) | Pexp_extension of extension (* [%id] *) @@ -705,7 +706,7 @@ and module_type_declaration = and open_description = { popen_lid: Longident.t loc; - popen_override: override_flag; + popen_flag: open_flag; popen_loc: Location.t; popen_attributes: attributes; } diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index 98c681551d..d0e32fdc95 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -86,6 +86,10 @@ let override = function | Override -> "!" | Fresh -> "" +let open_flag = function + | Open_all x -> override x + | Open_implicit -> " implicit" + (* variance encoding: need to sync up with the [parser.mly] *) let type_variance = function | Invariant -> "" @@ -627,7 +631,7 @@ class printer ()= object(self:'self) | Pexp_poly (e, Some ct) -> pp f "@[<hov2>(!poly!@ %a@ : %a)@]" self#simple_expr e self#core_type ct | Pexp_open (ovf, lid, e) -> - pp f "@[<2>let open%s %a in@;%a@]" (override ovf) self#longident_loc lid + pp f "@[<2>let open%s %a in@;%a@]" (open_flag ovf) self#longident_loc lid self#expression e | Pexp_variant (l,Some eo) -> pp f "@[<2>`%s@;%a@]" l self#simple_expr eo @@ -1009,7 +1013,7 @@ class printer ()= object(self:'self) self#item_attributes pmd.pmd_attributes | Psig_open od -> pp f "@[<hov2>open%s@ %a@]%a" - (override od.popen_override) + (open_flag od.popen_flag) self#longident_loc od.popen_lid self#item_attributes od.popen_attributes | Psig_include incl -> @@ -1180,7 +1184,7 @@ class printer ()= object(self:'self) (self#implicit_binding arity) pmb_expr | Pstr_open od -> pp f "@[<2>open%s@;%a@]%a" - (override od.popen_override) + (open_flag od.popen_flag) self#longident_loc od.popen_lid self#item_attributes od.popen_attributes | Pstr_modtype {pmtd_name=s; pmtd_type=md; pmtd_attributes=attrs} -> diff --git a/parsing/printast.ml b/parsing/printast.ml index 4b4a0272c4..130b89642c 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -80,6 +80,12 @@ let fmt_override_flag f x = | Fresh -> fprintf f "Fresh"; ;; +let fmt_open_flag f x = + match x with + | Open_all x -> fprintf f "Open_all %a" fmt_override_flag x; + | Open_implicit -> fprintf f "Open_implicit"; +;; + let fmt_closed_flag f x = match x with | Closed -> fprintf f "Closed" @@ -372,7 +378,7 @@ and expression i ppf x = line i ppf "Pexp_pack\n"; module_expr i ppf me | Pexp_open (ovf, m, e) -> - line i ppf "Pexp_open %a \"%a\"\n" fmt_override_flag ovf + line i ppf "Pexp_open %a \"%a\"\n" fmt_open_flag ovf fmt_longident_loc m; expression i ppf e | Pexp_extension (s, arg) -> @@ -681,7 +687,7 @@ and signature_item i ppf x = modtype_declaration i ppf x.pmtd_type | Psig_open od -> line i ppf "Psig_open %a %a\n" - fmt_override_flag od.popen_override + fmt_open_flag od.popen_flag fmt_longident_loc od.popen_lid; attributes i ppf od.popen_attributes | Psig_include incl -> @@ -788,7 +794,7 @@ and structure_item i ppf x = modtype_declaration i ppf x.pmtd_type | Pstr_open od -> line i ppf "Pstr_open %a %a\n" - fmt_override_flag od.popen_override + fmt_open_flag od.popen_flag fmt_longident_loc od.popen_lid; attributes i ppf od.popen_attributes | Pstr_class (l) -> diff --git a/typing/env.ml b/typing/env.ml index 1aca534a2a..72b15a3383 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -293,6 +293,13 @@ let strengthen = let md ?(implicit_ = Asttypes.Nonimplicit) md_type = {md_type; md_attributes=[]; md_loc=Location.none; md_implicit = implicit_} +let register_if_implicit path md env = + match md.md_implicit with + | Asttypes.Nonimplicit -> env + | Asttypes.Implicit _ -> + let md = {md with md_type = !strengthen env md.md_type path} in + {env with implicit_instances = (path, md) :: env.implicit_instances} + (* The name of the compilation unit currently compiled. "" if outside a compilation unit. *) @@ -1149,44 +1156,45 @@ let labels_of_type ty_path decl = labels rep decl.type_private | Type_variant _ | Type_abstract | Type_open -> [] +(* [signature_item_size item] computes the number of fields required by a + signature_item at runtime. *) + +let signature_item_size = function + | Sig_value (_, {val_kind = Val_prim _}) -> 0 + | Sig_value (_, _) -> 1 + | Sig_typext _ -> 1 + | Sig_module _ -> 1 + | Sig_class _ -> 1 + | Sig_type _ -> 0 + | Sig_modtype _ -> 0 + | Sig_class_type _ -> 0 + +let signature_item_subst item p sub = match item with + | Sig_type (id, _, _) -> Subst.add_type id p sub + | Sig_module (id, _, _) -> Subst.add_module id p sub + | Sig_modtype (id, _) -> Subst.add_modtype id (Mty_ident p) sub + | Sig_value _ | Sig_typext _ | Sig_class _ | Sig_class_type _ -> sub + +let signature_item_ident = function + | Sig_value (id, _) | Sig_exception (id, _) | Sig_type (id, _, _) + | Sig_module (id, _, _) | Sig_modtype (id, _) + | Sig_class (id, _, _) | Sig_class_type (id, _, _) -> + id + (* Given a signature and a root path, prefix all idents in the signature by the root path and build the corresponding substitution. *) let rec prefix_idents root pos sub = function [] -> ([], sub) - | Sig_value(id, decl) :: rem -> - let p = Pdot(root, Ident.name id, pos) in - let nextpos = match decl.val_kind with Val_prim _ -> pos | _ -> pos+1 in - let (pl, final_sub) = prefix_idents root nextpos sub rem in - (p::pl, final_sub) - | Sig_type(id, decl, _) :: rem -> - let p = Pdot(root, Ident.name id, nopos) in - let (pl, final_sub) = - prefix_idents root pos (Subst.add_type id p sub) rem in - (p::pl, final_sub) - | Sig_typext(id, ext, _) :: rem -> - let p = Pdot(root, Ident.name id, pos) in - let (pl, final_sub) = prefix_idents root (pos+1) sub rem in - (p::pl, final_sub) - | Sig_module(id, mty, _) :: rem -> - let p = Pdot(root, Ident.name id, pos) in - let (pl, final_sub) = - prefix_idents root (pos+1) (Subst.add_module id p sub) rem in - (p::pl, final_sub) - | Sig_modtype(id, decl) :: rem -> - let p = Pdot(root, Ident.name id, nopos) in - let (pl, final_sub) = - prefix_idents root pos - (Subst.add_modtype id (Mty_ident p) sub) rem in - (p::pl, final_sub) - | Sig_class(id, decl, _) :: rem -> - let p = Pdot(root, Ident.name id, pos) in - let (pl, final_sub) = prefix_idents root (pos + 1) sub rem in - (p::pl, final_sub) - | Sig_class_type(id, decl, _) :: rem -> - let p = Pdot(root, Ident.name id, nopos) in - let (pl, final_sub) = prefix_idents root pos sub rem in - (p::pl, final_sub) + | item :: rem -> + let id = signature_item_ident item in + let size = signature_item_size item in + let next = pos + size in + let pos = if size > 0 then pos else nopos in + let path = Pdot(root, Ident.name id, pos) in + let sub = signature_item_subst item path sub in + let (pl, final_sub) = prefix_idents root next sub rem in + (path :: pl, final_sub) let subst_signature sub sg = List.map @@ -1468,11 +1476,7 @@ and store_module slot id path md env renv = summary = Env_module(env.summary, id, md); } in - match md.md_implicit with - | Asttypes.Nonimplicit -> env - | Asttypes.Implicit _ -> - let md = {md with md_type = !strengthen env md.md_type path} in - {env with implicit_instances = (path, md) :: env.implicit_instances} + register_if_implicit path md env and store_modtype slot id path info env renv = { env with @@ -1672,6 +1676,20 @@ let open_signature ?(loc = Location.none) ?(toplevel = false) ovf root sg env = end else open_signature None root sg env +let open_implicit root sg env = + let env, _pos = List.fold_left + (fun (env,pos) item -> + let env = match item with + | Sig_module(id, md, _) -> + register_if_implicit (Pdot (root, Ident.name id, pos)) md env + | _ -> env + in + let next = pos + signature_item_size item in + env, next) + (env,0) sg + in + env + (* Read a signature from a file *) let read_signature modname filename = diff --git a/typing/env.mli b/typing/env.mli index baa65842fb..0d8438835e 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -128,6 +128,8 @@ val open_signature: signature -> t -> t val open_pers_signature: string -> t -> t +val open_implicit: Path.t -> signature -> t -> t + (* Insertion by name *) val enter_value: diff --git a/typing/printtyped.ml b/typing/printtyped.ml index 1899c945af..8d4977399d 100644 --- a/typing/printtyped.ml +++ b/typing/printtyped.ml @@ -84,6 +84,13 @@ let fmt_override_flag f x = | Fresh -> fprintf f "Fresh"; ;; +let fmt_open_flag f x = + match x with + | Open_all x -> fprintf f "Open_all %a" fmt_override_flag x; + | Open_implicit -> fprintf f "Open_implicit"; +;; + + let fmt_closed_flag f x = match x with | Closed -> fprintf f "Closed" @@ -274,7 +281,7 @@ and expression_extra i ppf x attrs = option i core_type ppf cto1; core_type i ppf cto2; | Texp_open (ovf, m, _, _) -> - line i ppf "Pexp_open %a \"%a\"\n" fmt_override_flag ovf fmt_path m; + line i ppf "Pexp_open %a \"%a\"\n" fmt_open_flag ovf fmt_path m; attributes i ppf attrs; | Texp_poly cto -> line i ppf "Pexp_poly\n"; @@ -652,7 +659,7 @@ and signature_item i ppf x = modtype_declaration i ppf x.mtd_type | Tsig_open od -> line i ppf "Psig_open %a %a\n" - fmt_override_flag od.open_override + fmt_open_flag od.open_flag fmt_path od.open_path; attributes i ppf od.open_attributes | Tsig_include incl -> @@ -759,7 +766,7 @@ and structure_item i ppf x = modtype_declaration i ppf x.mtd_type | Tstr_open od -> line i ppf "Pstr_open %a %a\n" - fmt_override_flag od.open_override + fmt_open_flag od.open_flag fmt_path od.open_path; attributes i ppf od.open_attributes | Tstr_class (l) -> diff --git a/typing/typecore.mli b/typing/typecore.mli index b4ea67563e..f797863c51 100644 --- a/typing/typecore.mli +++ b/typing/typecore.mli @@ -124,7 +124,7 @@ val report_error: Env.t -> formatter -> error -> unit val type_module: (Env.t -> Parsetree.module_expr -> Typedtree.module_expr) ref (* Forward declaration, to be filled in by Typemod.type_open *) val type_open: - (override_flag -> Env.t -> Location.t -> Longident.t loc -> Path.t * Env.t) + (open_flag -> Env.t -> Location.t -> Longident.t loc -> Path.t * Env.t) ref (* Forward declaration, to be filled in by Typeclass.class_structure *) val type_object: diff --git a/typing/typedtree.ml b/typing/typedtree.ml index 58f43636bb..02642850ba 100644 --- a/typing/typedtree.ml +++ b/typing/typedtree.ml @@ -65,7 +65,7 @@ and expression = and exp_extra = | Texp_constraint of core_type | Texp_coerce of core_type option * core_type - | Texp_open of override_flag * Path.t * Longident.t loc * Env.t + | Texp_open of open_flag * Path.t * Longident.t loc * Env.t | Texp_poly of core_type option | Texp_newtype of string @@ -317,7 +317,7 @@ and open_description = { open_path: Path.t; open_txt: Longident.t loc; - open_override: override_flag; + open_flag: open_flag; open_loc: Location.t; open_attributes: attribute list; } diff --git a/typing/typedtree.mli b/typing/typedtree.mli index 6820e2e55c..aafa2f778e 100644 --- a/typing/typedtree.mli +++ b/typing/typedtree.mli @@ -64,7 +64,7 @@ and expression = and exp_extra = | Texp_constraint of core_type | Texp_coerce of core_type option * core_type - | Texp_open of override_flag * Path.t * Longident.t loc * Env.t + | Texp_open of open_flag * Path.t * Longident.t loc * Env.t | Texp_poly of core_type option | Texp_newtype of string @@ -316,7 +316,7 @@ and open_description = { open_path: Path.t; open_txt: Longident.t loc; - open_override: override_flag; + open_flag: open_flag; open_loc: Location.t; open_attributes: attribute list; } diff --git a/typing/typemod.ml b/typing/typemod.ml index bf1aa4a4da..7c1171abc2 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -70,7 +70,10 @@ let extract_sig_open env loc mty = let type_open_ ?toplevel ovf env loc lid = let path, md = Typetexp.find_module env lid.loc lid.txt in let sg = extract_sig_open env lid.loc md.md_type in - path, Env.open_signature ~loc ?toplevel ovf path sg env + let env = match opf with + | Open_all ovf -> Env.open_signature ~loc ?toplevel ovf path sg env + | Open_implicit -> Env.open_implicit path sg env in + path, env let type_open ?toplevel env sod = let (path, newenv) = From 2b05ff8c7c1c7a561b127411e9468ad5f625603c Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 30 May 2014 13:52:53 +0100 Subject: [PATCH 370/494] Fix handling of implicit arguments modulo alpha-renaming --- typing/ctype.ml | 23 ++++++++++++++++------- typing/env.ml | 3 +++ typing/env.mli | 2 ++ 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/typing/ctype.ml b/typing/ctype.ml index f46b725a4d..7caed82ddd 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -799,6 +799,12 @@ let rec update_level env level ty = | Tfield(lab, _, ty1, _) when lab = dummy_method && (repr ty1).level > level -> raise (Unify [(ty1, newvar2 level)]) + + | Tarrow (Tarr_implicit id, _, _, _) -> + set_level ty level; + (* XXX what about abbreviations in Tconstr ? *) + iter_type_expr (update_level (Env.mark_implicit_arg id env) level) ty + | _ -> set_level ty level; (* XXX what about abbreviations in Tconstr ? *) @@ -2075,7 +2081,7 @@ let rec mcomp type_pairs env t1 t2 = mcomp type_pairs env t1 t2; let mty = modtype_of_tpackage env t1 in let env = Env.add_module id1 mty env in - let env = Env.add_module id2 mty env in + let env = Env.add_module id2 (Mty_alias (Path.Pident id1)) env in mcomp type_pairs env u1 u2; | (Tarrow (l1, t1, u1, _), Tarrow (l2, t2, u2, _)) when arrows_are_compatible l1 l2 -> @@ -2474,7 +2480,7 @@ and unify3 env t1 t1' t2 t2' = let env' = !env in let mty = modtype_of_tpackage env' t1 in let env' = Env.add_module id1 mty env' in - let env' = Env.add_module id2 mty env' in + let env' = Env.add_module id2 (Mty_alias (Path.Pident id1)) env' in env := env'; unify env u1 u2; begin match commu_repr c1, commu_repr c2 with @@ -2874,18 +2880,21 @@ let expand_head_trace env t = let filter_arrow env t l = let t = expand_head_trace env t in - match t.desc with - Tvar _ -> + match t.desc, l with + Tvar _, _ -> let lv = t.level in let t1 = newvar2 lv and t2 = newvar2 lv in let t' = newty2 lv (Tarrow (l, t1, t2, Cok)) in link_type t t'; (t1, t2) - | Tarrow(l', t1, t2, _) + | Tarrow(l', t1, t2, _), _ when l = l' || !Clflags.classic && l = Tarr_simple && arrows_are_compatible l l' -> (t1, t2) + | Tarrow(Tarr_implicit id1, t1, t2, _), Tarr_implicit id2 -> + let subst = Subst.add_module id1 (Path.Pident id2) Subst.identity in + (t1, Subst.type_expr subst t2) | _ -> raise (Unify []) @@ -3299,7 +3308,7 @@ let rec eqtype rename type_pairs subst env t1 t2 = eqtype rename type_pairs subst env t1 t2; let mty = modtype_of_tpackage env t1 in let env = Env.add_module id1 mty env in - let env = Env.add_module id2 mty env in + let env = Env.add_module id2 (Mty_alias (Path.Pident id1)) env in eqtype rename type_pairs subst env u1 u2; | (Tarrow (l1, t1, u1, _), Tarrow (l2, t2, u2, _)) when classic_arrows_are_compatible l1 l2 -> @@ -4024,7 +4033,7 @@ let rec subtype_rec env trace t1 t2 cstrs = let cstrs = subtype_rec env ((t2, t1)::trace) t2 t1 cstrs in let mty = modtype_of_tpackage env t1 in let env = Env.add_module id1 mty env in - let env = Env.add_module id2 mty env in + let env = Env.add_module id2 (Mty_alias (Path.Pident id1)) env in subtype_rec env ((u1, u2)::trace) u1 u2 cstrs | (Tarrow(l1, t1, u1, _), Tarrow(l2, t2, u2, _)) when classic_arrows_are_compatible l1 l2 -> diff --git a/typing/env.ml b/typing/env.ml index 72b15a3383..e39109f930 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -1518,6 +1518,9 @@ let _ = (* Insertion of bindings by identifier *) +let mark_implicit_arg id env = + {env with implicit_args = Ident.add id () env.implicit_args} + let add_functor_arg ?(arg = false) ~implicit_ id env = match arg, implicit_ with | false, _ -> env diff --git a/typing/env.mli b/typing/env.mli index 0d8438835e..f216d96704 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -65,6 +65,8 @@ val find_type_expansion_opt: val find_modtype_expansion: Path.t -> t -> module_type val is_functor_arg: Path.t -> t -> bool val is_implicit_arg: Path.t -> t -> bool +val mark_implicit_arg: Ident.t -> t -> t + val normalize_path: Location.t option -> t -> Path.t -> Path.t (* Normalize the path to a concrete value or module. If the option is None, allow returning dangling paths. From 63f7333e5dab01e8805a0b393d49563a83f31ff8 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 30 May 2014 14:07:35 +0100 Subject: [PATCH 371/494] Implicitsearch: cleanup code, document --- typing/implicitsearch.ml | 136 +++++++++++++++++++++------------------ 1 file changed, 72 insertions(+), 64 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index ab7314052b..9ceafaa73d 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -317,8 +317,75 @@ module Constraints = struct end +(* Various functions to preprocess pending implicit and implicit declarations + when searching *) + +let remove_type_variables mty = + let variables = ref [] in + let it_type_expr it ty = + let ty = repr ty in + match ty.desc with + | Tvar name -> + let name = match name with + | None -> "ex" + | Some name -> name + in + let ident = Ident.create name in + variables := ident :: !variables; + let ty' = newgenty (Tconstr (Path.Pident ident, [], ref Mnil)) in + link_type ty ty' + | _ -> type_iterators.it_type_expr it ty; + in + let it = {type_iterators with it_type_expr} in + it.it_module_type it mty; + !variables + +let target_of_pending inst = + let env = inst.implicit_env in + let ident = inst.implicit_id in + let path, nl, tl = inst.implicit_type in + (* Extract base module type *) + let mtd = Env.find_modtype path env in + let mty = match mtd.mtd_type with + | None -> assert false + | Some mty -> mty + in + let cstrs = + (* Constraints from package type *) + (List.map2 (fun n t -> Longident.flatten n, t) nl tl) + (* Constraints from implicit instance *) @ + (Constraints.flatten ~root:ident inst.implicit_constraints) + in + let mty = Constraints.apply env mty cstrs in + let variables = remove_type_variables mty in + let id = inst.implicit_id in + variables, {target_type = mty; target_id = id; target_uid = id} + +let rec extract_implicit_parameters targets n omty nmty = + assert (n >= 0); + if n = 0 then + List.rev targets, nmty + else match omty, nmty with + | Mty_functor (target_uid, Some _, omty'), + Mty_functor (target_id, Some target_type, nmty') -> + extract_implicit_parameters + ({target_uid; target_id; target_type} :: targets) (n - 1) omty' nmty' + | _ -> assert false + +let find_implicit_parameters {Types. md_type = omty; md_implicit} = + match md_implicit with + | Asttypes.Nonimplicit -> assert false + | Asttypes.Implicit 0 -> + (* No copy, so we don't lose equality *) + [], omty + + | Asttypes.Implicit arity -> + let nmty = Subst.modtype Subst.identity omty in + extract_implicit_parameters [] arity omty nmty + (** Termination checking **) module Termination : sig + (* A termination criterion is a set of constraints applying on a target_uid. It's satisfied in a given state iff its constraints are stronger than those found the state. *) @@ -437,74 +504,15 @@ end = struct try Ident.find_same uid stack with Not_found -> [] in - if not (stronger env eqns eqns') then - (prerr_endline "Termination-checker pruned branch"; raise Terminate); + if not (stronger env eqns eqns') then raise Terminate; Ident.add uid eqns stack end -let remove_type_variables mty = - let variables = ref [] in - let it_type_expr it ty = - let ty = repr ty in - match ty.desc with - | Tvar name -> - let name = match name with - | None -> "ex" - | Some name -> name - in - let ident = Ident.create name in - variables := ident :: !variables; - let ty' = newgenty (Tconstr (Path.Pident ident, [], ref Mnil)) in - link_type ty ty' - | _ -> type_iterators.it_type_expr it ty; - in - let it = {type_iterators with it_type_expr} in - it.it_module_type it mty; - !variables - -let target_of_pending inst = - let env = inst.implicit_env in - let ident = inst.implicit_id in - let path, nl, tl = inst.implicit_type in - (* Extract base module type *) - let mtd = Env.find_modtype path env in - let mty = match mtd.mtd_type with - | None -> assert false - | Some mty -> mty - in - let cstrs = - (* Constraints from package type *) - (List.map2 (fun n t -> Longident.flatten n, t) nl tl) - (* Constraints from implicit instance *) @ - (Constraints.flatten ~root:ident inst.implicit_constraints) - in - let mty = Constraints.apply env mty cstrs in - let variables = remove_type_variables mty in - let id = inst.implicit_id in - variables, {target_type = mty; target_id = id; target_uid = id} - -let rec extract_implicit_parameters targets n omty nmty = - assert (n >= 0); - if n = 0 then - List.rev targets, nmty - else match omty, nmty with - | Mty_functor (target_uid, Some _, omty'), - Mty_functor (target_id, Some target_type, nmty') -> - extract_implicit_parameters - ({target_uid; target_id; target_type} :: targets) (n - 1) omty' nmty' - | _ -> assert false - -let find_implicit_parameters {Types. md_type = omty; md_implicit} = - match md_implicit with - | Asttypes.Nonimplicit -> assert false - | Asttypes.Implicit 0 -> - (* No copy, so we don't lose equality *) - [], omty - - | Asttypes.Implicit arity -> - let nmty = Subst.modtype Subst.identity omty in - extract_implicit_parameters [] arity omty nmty +(* Make the search stack explicit. + This helps resuming search (e.g to search for ambiguity), explaining search + state or errors, etc. *) +(** TODO **) let report_error exn = try From 74c88baeddb0f661ad88a8b58544f29bfe4c9988 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 30 May 2014 19:26:16 +0100 Subject: [PATCH 372/494] Implicitsearch: Refactor search procedure --- typing/implicitsearch.ml | 209 +++++++++++++++++++++++++++------------ 1 file changed, 145 insertions(+), 64 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 9ceafaa73d..46d8d75e67 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -510,91 +510,172 @@ end = struct end (* Make the search stack explicit. +end + This helps resuming search (e.g to search for ambiguity), explaining search state or errors, etc. *) (** TODO **) -let report_error exn = - try - Location.report_exception Format.err_formatter exn - with exn -> - Printf.eprintf "%s\n%!" (Printexc.to_string exn) +(* Search step: + candidates -> success * sub_targets * next_candidates +*) -let rec find_target env variables eq_table stack target = - let term_state = stack in - let build_path (path, md) = - Printf.eprintf "trying candidate %s\n%!" (string_of_path path); +module Search : sig - let sub_targets, candidate = find_implicit_parameters md in - let variables' = !variables in + type t + type candidates = (Path.t * Types.module_declaration) list - try - let new_equations = ref [] in + val start : Env.t -> Ident.t list -> target -> t - let _ : module_coercion = - let eq_table, env = List.fold_left - (fun (eq_table, env) {target_id} -> - Ident.add target_id new_equations eq_table, - Env.add_module target.target_id target.target_type env) - (eq_table, env) sub_targets - in - Ctype.with_equality_equations eq_table - (fun () -> Includemod.modtypes env candidate target.target_type) - in + type partial + type result = + | Module of Path.t * t + | Functor of partial * t - let eqns = !new_equations in + val all_candidates : t -> candidates + val step: t -> candidates -> (result * candidates) option - (* Constraints target types *) - let sub_targets = Constraints.targets env sub_targets eqns in - (* Add termination criteria *) - let sub_targets = Termination.normalize_equations sub_targets eqns in + val apply : partial -> Path.t -> t -> result - let find_parameter (path, env) (target, term_criterion) = - let term_state = Termination.check env term_criterion term_state in - let arg_path = find_target env variables eq_table term_state target in - let md = Env.find_module path env in - (* The original module declaration might be implicit, we want to avoid - rebinding implicit *) - let md = {md with md_implicit = Asttypes.Nonimplicit} in - let env = Env.add_module_declaration target.target_id md env in - papply path arg_path, env +end = struct + type t = + { + termination: Termination.state; + target: target; + env: Env.t; + + (* Equality snapshots. + + When resuming a search from this state, + [eq_var] should be set to [eq_initial]. + + [eq_var] is referenced in [eq_table], so new equations valid in this + branch of the search will be added to [eq_var]. *) + + eq_initial: (Path.t * type_expr) list; + eq_var: (Path.t * type_expr) list ref; + eq_table: (Path.t * type_expr) list ref Ident.tbl; + } + type candidates = (Path.t * Types.module_declaration) list + + let start env variables target = + let level = get_current_level () in + let env = List.fold_left (fun env variable -> + Env.add_type ~check:false variable + (new_declaration (Some (level, level)) None) env) + env variables + in + let eq_var = ref [] in + let eq_table = List.fold_left + (fun tbl id -> Ident.add id eq_var tbl) + Ident.empty variables + in + { + termination = Termination.initial; + target = target; + env = env; + + eq_initial = []; + eq_var = eq_var; + eq_table = eq_table; + } + + let all_candidates t = + Env.implicit_instances t.env + + (* [step state candidates] + Starting from search [state], find a matching candidate in + [candidates] list or raise [Not_found]. + + If successful, returns [result, candidates] *) + + type partial = + { + parent: t; + path: Path.t; + sub_targets: (target * Termination.t) list; + } + + type result = + | Module of Path.t * t + | Functor of partial * t + + let step0 state (path, md) = + state.eq_var := state.eq_initial; + let target = state.target in + let sub_targets, candidate = find_implicit_parameters md in + let new_eqns = ref [] in + (* Generate coercion. if this succeeds this produce equations in new_eqns and eq_var *) + let _ : module_coercion = + let eq_table, env = List.fold_left + (fun (eq_table, env) {target_id} -> + Ident.add target_id new_eqns eq_table, + Env.add_module target.target_id target.target_type env) + (state.eq_table, state.env) sub_targets in + Ctype.with_equality_equations eq_table + (fun () -> Includemod.modtypes env candidate target.target_type) + in + let eqns = !new_eqns in + (* Constraints target types *) + let sub_targets = Constraints.targets state.env sub_targets eqns in + (* Add termination criteria *) + let sub_targets = Termination.normalize_equations sub_targets eqns in + let state = {state with eq_initial = !(state.eq_var)} in + match sub_targets with + | [] -> + (* No parameters: we keep new equations potentially added to top + variables *) + Module (path, state) + | (sub_target, crit) :: sub_targets -> + let partial = {parent = state; path; sub_targets} in + let state = {state with termination = Termination.check state.env crit state.termination} in + Functor (partial, state) + + let rec step state = function + | [] -> None + | candidate :: candidates -> + try Some (step0 state candidate, candidates) + with _exn -> + step state candidates + + let apply partial path state = + let path = papply partial.path path in + match partial.sub_targets with + | [] -> + Module (path, {partial.parent with eq_initial = state.eq_initial}) + | (target, crit) :: sub_targets -> + let partial = {partial with path; sub_targets} in + let md = Env.find_module path state.env in + (* The original module declaration might be implicit, we want to avoid + rebinding implicit *) + let md = {md with md_implicit = Asttypes.Nonimplicit} in + let state = { + state with + target; + termination = Termination.check state.env crit partial.parent.termination; + env = Env.add_module_declaration target.target_id md state.env + } in + Functor (partial, state) +end - let path, _env = List.fold_left find_parameter (path, env) sub_targets in - - Some path - - with exn -> - variables := variables'; - report_error exn; - None - - in - list_findmap build_path (Env.implicit_instances env) +let report_error exn = + try + Location.report_exception Format.err_formatter exn + with exn -> + Printf.eprintf "%s\n%!" (Printexc.to_string exn) let find_pending_instance inst = - let env = inst.implicit_env in let variables, target = target_of_pending inst in - let level = get_current_level () in - - let env = List.fold_left (fun env variable -> - Env.add_type ~check:false variable - (new_declaration (Some (level, level)) None) env) - env variables - in - - let variables_equation = ref [] in - let eq_table = List.fold_left - (fun tbl id -> Ident.add id variables_equation tbl) - Ident.empty variables - in - try + let env = inst.implicit_env in + let _state = Search.start env variables target in + (*try let path = find_target env variables_equation eq_table Termination.initial target in Link.to_path inst path; true - with _ -> + with _ ->*) false (* Pack module at given path to match a given implicit instance and From 7dec0b3d62be73d195f5141c9ef2b5435bf3faf7 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 30 May 2014 19:34:07 +0100 Subject: [PATCH 373/494] Implicitsearch: PoC using new implementation --- typing/implicitsearch.ml | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 46d8d75e67..da915a746f 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -533,7 +533,7 @@ module Search : sig | Functor of partial * t val all_candidates : t -> candidates - val step: t -> candidates -> (result * candidates) option + val step: t -> candidates -> (result * candidates) val apply : partial -> Path.t -> t -> result @@ -627,15 +627,15 @@ end = struct (* No parameters: we keep new equations potentially added to top variables *) Module (path, state) - | (sub_target, crit) :: sub_targets -> + | (target, crit) :: sub_targets -> let partial = {parent = state; path; sub_targets} in - let state = {state with termination = Termination.check state.env crit state.termination} in + let state = {state with target; termination = Termination.check state.env crit state.termination} in Functor (partial, state) let rec step state = function - | [] -> None + | [] -> raise Not_found | candidate :: candidates -> - try Some (step0 state candidate, candidates) + try (step0 state candidate, candidates) with _exn -> step state candidates @@ -665,17 +665,25 @@ let report_error exn = with exn -> Printf.eprintf "%s\n%!" (Printexc.to_string exn) +let rec search_one state = + let candidates = Search.all_candidates state in + search_arguments (fst (Search.step state candidates)) + +and search_arguments = function + | Search.Module (path,state') -> path, state' + | Search.Functor (partial,state') -> + let path, state' = search_one state' in + search_arguments (Search.apply partial path state') + let find_pending_instance inst = let variables, target = target_of_pending inst in let env = inst.implicit_env in - let _state = Search.start env variables target in - (*try - let path = - find_target env variables_equation eq_table Termination.initial target - in + let state = Search.start env variables target in + try + let path, _ = search_one state in Link.to_path inst path; true - with _ ->*) + with _ -> false (* Pack module at given path to match a given implicit instance and From c285f4cb1760673d1e8e74268f25b9e724497d1c Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Sun, 1 Jun 2014 11:08:24 +0200 Subject: [PATCH 374/494] Implicitsearch: PoC ambiguity detection --- typing/implicitsearch.ml | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index da915a746f..71d8f7a7ea 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -665,7 +665,7 @@ let report_error exn = with exn -> Printf.eprintf "%s\n%!" (Printexc.to_string exn) -let rec search_one state = +(*let rec search_one state = let candidates = Search.all_candidates state in search_arguments (fst (Search.step state candidates)) @@ -683,6 +683,39 @@ let find_pending_instance inst = let path, _ = search_one state in Link.to_path inst path; true + with _ -> + false*) + +type 'a k = K of ('a * (unit -> 'a k)) + +let rec search_one state candidates = + let result, candidates = Search.step state candidates in + search_arguments result + ~k:(fun () -> search_one state candidates) + +and search_arguments ~k = function + | Search.Module (path,state') -> K ((path, state'), k) + | Search.Functor (partial,state') -> + let rec pack (K ((path, state'), k')) = + search_arguments (Search.apply partial path state') + ~k:(fun () -> try pack (k' ()) with _ -> k ()) + in + pack (search_one state' (Search.all_candidates state')) + +let find_pending_instance inst = + let variables, target = target_of_pending inst in + let env = inst.implicit_env in + let state = Search.start env variables target in + try + let K ((path, _), k) = search_one state (Search.all_candidates state) in + begin + assert ( + try let K ((_, _), _) = k () in + false + with _ -> true) + end; + Link.to_path inst path; + true with _ -> false From 3541ea1629f18cad6b32a40edf51e61ab2fb4531 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Tue, 3 Jun 2014 23:05:13 +0200 Subject: [PATCH 375/494] Typecore.type_application: handle empty argument list List of argument can be empty if all arguments were explicitly selected implicit instance. Drop the apply node in this case. --- typing/typecore.ml | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/typing/typecore.ml b/typing/typecore.ml index 174f62312b..4357600071 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1958,12 +1958,18 @@ and type_expect_ ?in_function env sexp ty_expected = in end_def (); unify_var env (newvar()) funct.exp_type; - rue { - exp_desc = Texp_apply(funct, args); - exp_loc = loc; exp_extra = []; - exp_type = ty_res; - exp_attributes = sexp.pexp_attributes; - exp_env = env } + (* args can be empty if all arguments specified were of the form + (implicit M) *) + begin match args with + | [] -> funct + | args -> + rue { + exp_desc = Texp_apply(funct, args); + exp_loc = loc; exp_extra = []; + exp_type = ty_res; + exp_attributes = sexp.pexp_attributes; + exp_env = env } + end | Pexp_match(sarg, caselist) -> begin_def (); let arg = type_exp env sarg in From 56f816536681a30f755f2e6ba29f33a2a80f93b9 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 4 Jun 2014 10:38:11 +0100 Subject: [PATCH 376/494] Typeimplicit: fix generation of fresh identifiers for implicit arguments This is completely handled during Subst --- typing/typeimplicit.ml | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index bd12b26470..d60e2347f9 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -56,6 +56,7 @@ module Unlink register path var let it_type_expr it ty = + let ty = repr ty in (* First recurse in sub expressions *) type_iterators.it_type_expr it ty; (* Then replace current type if it is a constructor referring to an @@ -120,23 +121,21 @@ let instantiate_implicits_ty loc env ty = match ty.desc with | Tarrow (Tarr_implicit id, lhs, rhs, comm) -> (*prerr_endline "found one";*) - let id' = Ident.rename id in - let inst = fresh_implicit id' lhs in - let arguments, instances, subst, rhs' = extract_implicits rhs in + let inst = fresh_implicit id lhs in + let arguments, instances, rhs' = extract_implicits rhs in inst.implicit_argument :: arguments, - Ident.add id' inst instances, - Subst.add_module id (Path.Pident id') subst, + Ident.add id inst instances, rhs' (*{ty with desc = Tarrow (Tarr_implicit id', lhs, rhs', comm)}*) | Tarrow (arr, lhs, rhs, comm) -> - let arguments, instances, subst, rhs' = extract_implicits rhs in + let arguments, instances, rhs' = extract_implicits rhs in {arg_flag = (tapp_of_tarr arr); arg_expression = None} :: arguments, - instances, subst, + instances, {ty with desc = Tarrow (arr, lhs, rhs', comm)} - | _ -> [], Ident.empty, Subst.identity, ty + | _ -> [], Ident.empty, ty in - let arguments, instances, subst, ty = extract_implicits ty in - let ty = Subst.type_expr subst ty in + let ty = Subst.type_expr Subst.identity ty in + let arguments, instances, ty = extract_implicits ty in (* Set of constraints : maintain a table mapping implicit binding identifier to a list of type variable pairs. An implicit instance is correct only iff, in an environment where the From effc1237da0f1bc86048258a48e7d8edf3c2dc9f Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Mon, 9 Jun 2014 10:56:00 +0100 Subject: [PATCH 377/494] Typeimplicit: also unlink with constraints --- typing/typeimplicit.ml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index d60e2347f9..32a4dc5142 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -154,7 +154,13 @@ let instantiate_implicits_ty loc env ty = None end) in + (* Unlink main types *) Unlink.type_expr ty; + (* Unlink with types appearing in with constraints *) + Ident.iter (fun _id inst -> + let _p,_nl,tl = inst.implicit_type in + List.iter Unlink.type_expr tl + ) instances; arguments, instances, ty let instantiate_implicits_expr env expr = From 648453ac150d38b7c410fb21dae51536527314d2 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Mon, 9 Jun 2014 14:35:04 +0100 Subject: [PATCH 378/494] Typecore: check presence of implicit when typing top-level identifier --- typing/typecore.ml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/typing/typecore.ml b/typing/typecore.ml index 4357600071..6fc1198448 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -3914,9 +3914,11 @@ let type_expression env sexp = Typeimplicit.generalize_implicits (); if is_nonexpansive exp then generalize exp.exp_type else generalize_expansive env exp.exp_type; - match sexp.pexp_desc with - Pexp_ident lid -> - (* Special case for keeping type variables when looking-up a variable *) + match sexp.pexp_desc, exp.exp_desc with + Pexp_ident lid, Texp_ident _ -> + (* Special case for keeping type variables when looking-up a variable. + Also check the typed expression: if [lid] has implicit arguments, + those will have been instanciated resulting in a different type. *) let (path, desc) = Env.lookup_value lid.txt env in {exp with exp_type = desc.val_type} | _ -> exp From b762eba0bff463304eb82af026f36a48cb450fec Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Mon, 9 Jun 2014 14:35:58 +0100 Subject: [PATCH 379/494] Ctype: fix equation generation when computing type equality Matching wasn't commutative --- typing/ctype.ml | 55 ++++++++++++++++++++++++++---------------- typing/typeimplicit.ml | 10 ++++---- 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/typing/ctype.ml b/typing/ctype.ml index 7caed82ddd..73d5313eb9 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -3341,28 +3341,21 @@ let rec eqtype rename type_pairs subst env t1 t2 = | (Tunivar _, Tunivar _) -> unify_univar t1' t2' !univar_pairs - | Tconstr (p, [], _), ty - | ty, Tconstr (p, [], _) - (* FIXME: handle the case Tconstr (p1, _), Tconstr (p2, _) *) + | (Tconstr (p1, [], _) as te1), (Tconstr (p2, [], _) as te2) + when Ident.mem (Path.head p1) !equality_equations + && Ident.mem (Path.head p2) !equality_equations -> + if p1 < p2 then + eqtype_modulo_equation rename type_pairs subst env p1 te2 t1' t2' + else + eqtype_modulo_equation rename type_pairs subst env p2 te1 t1' t2' + + | Tconstr (p, [], _), te when Ident.mem (Path.head p) !equality_equations -> - let equations = Ident.find_same (Path.head p) !equality_equations in - begin try - let ty' = List.assoc p !equations in - (* An equation already apply to this path *) - if t1'.desc == ty then - eqtype rename type_pairs subst env t1' ty' - else - eqtype rename type_pairs subst env ty' t2' - with Not_found -> - (* Not yet any equation on this path *) - let ty' = - if t1'.desc == ty then - t1' - else - t2' - in - equations := (p, ty') :: !equations - end + eqtype_modulo_equation rename type_pairs subst env p te t1' t2' + + | te, Tconstr (p, [], _) + when Ident.mem (Path.head p) !equality_equations -> + eqtype_modulo_equation rename type_pairs subst env p te t1' t2' | (_, _) -> raise (Unify []) @@ -3370,6 +3363,26 @@ let rec eqtype rename type_pairs subst env t1 t2 = with Unify trace -> raise (Unify ((t1, t2)::trace)) +and eqtype_modulo_equation rename type_pairs subst env path te t1 t2 = + let equations = Ident.find_same (Path.head path) !equality_equations in + begin try + let ty = List.assoc path !equations in + (* An equation already apply to this path *) + if t1.desc == te then + eqtype rename type_pairs subst env t1 ty + else + eqtype rename type_pairs subst env ty t2 + with Not_found -> + (* Not yet any equation on this path *) + let ty = + if t1.desc == te then + t1 + else + t2 + in + equations := (path, ty) :: !equations + end + and eqtype_list rename type_pairs subst env tl1 tl2 = if List.length tl1 <> List.length tl2 then raise (Unify []); diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index 32a4dc5142..6c31c50cd5 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -92,12 +92,12 @@ let pending_implicits : pending_implicit list ref = ref [] +let rec has_implicit ty = match ty.desc with + | Tarrow (Tarr_implicit id,_,_,_) -> true + | Tarrow (_,_,rhs,_) -> has_implicit rhs + | _ -> false + let instantiate_implicits_ty loc env ty = - let rec has_implicit ty = match ty.desc with - | Tarrow (Tarr_implicit id,_,_,_) -> true - | Tarrow (_,_,rhs,_) -> has_implicit rhs - | _ -> false - in if not (has_implicit ty) then [], Ident.empty, ty else let fresh_implicit id ty = From db8a3c85696c64deb8126f4325bd14baca3532fe Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Mon, 9 Jun 2014 14:38:59 +0100 Subject: [PATCH 380/494] Typeimplicit: refactor & unify free variables after successful search. When entering search, free variables in the module are converted to newtypes. After search, free variables are restored and unified with generated equations. --- typing/implicitsearch.ml | 186 +++++++++++++++++++++++++-------------- 1 file changed, 118 insertions(+), 68 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 71d8f7a7ea..7681796c01 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -331,7 +331,7 @@ let remove_type_variables mty = | Some name -> name in let ident = Ident.create name in - variables := ident :: !variables; + variables := (ty, ident) :: !variables; let ty' = newgenty (Tconstr (Path.Pident ident, [], ref Mnil)) in link_type ty ty' | _ -> type_iterators.it_type_expr it ty; @@ -340,6 +340,15 @@ let remove_type_variables mty = it.it_module_type it mty; !variables +let unify_equations env variables equations = + List.iter (fun (ty, id) -> + List.iter (function + | Path.Pident id', ty' when Ident.same id id' -> + unify env ty ty' + | _ -> ()) + equations + ) variables + let target_of_pending inst = let env = inst.implicit_env in let ident = inst.implicit_id in @@ -509,6 +518,12 @@ end = struct end +let report_error exn = + try + Location.report_exception Format.err_formatter exn + with exn -> + Printf.eprintf "%s\n%!" (Printexc.to_string exn) + (* Make the search stack explicit. end @@ -516,30 +531,36 @@ end state or errors, etc. *) (** TODO **) -(* Search step: - candidates -> success * sub_targets * next_candidates -*) - module Search : sig + type candidate = Path.t * Types.module_declaration + type t - type candidates = (Path.t * Types.module_declaration) list + type partial + type result - val start : Env.t -> Ident.t list -> target -> t + val get : result -> Path.t + val equations : result -> (Path.t * type_expr) list - type partial - type result = - | Module of Path.t * t - | Functor of partial * t + val all_candidates : t -> candidate list - val all_candidates : t -> candidates - val step: t -> candidates -> (result * candidates) + val start : Env.t -> Ident.t list -> target -> t + + type outcome = [ + | `Done of result + | `Functor of partial * t + ] - val apply : partial -> Path.t -> t -> result + val step : t -> candidate list -> outcome * candidate list + val apply : partial -> result -> outcome end = struct - type t = + + type candidate = Path.t * Types.module_declaration + + type 'a state = { + payload: 'a; termination: Termination.state; target: target; env: Env.t; @@ -551,12 +572,32 @@ end = struct [eq_var] is referenced in [eq_table], so new equations valid in this branch of the search will be added to [eq_var]. *) - eq_initial: (Path.t * type_expr) list; eq_var: (Path.t * type_expr) list ref; eq_table: (Path.t * type_expr) list ref Ident.tbl; } - type candidates = (Path.t * Types.module_declaration) list + + type t = + (* Start point for a search, a state without other information attached *) + unit state + + type partial = + (* Intermediate result: a path has been found, but some arguments are + missing and need to be applied *) + (Path.t * (target * Termination.t) list) state + + type result = + (* Final result: the path points to a module with the desired type *) + Path.t state + + let get t = t.payload + + let equations t = t.eq_initial + + type outcome = [ + | `Done of result + | `Functor of partial * t + ] let start env variables target = let level = get_current_level () in @@ -571,6 +612,7 @@ end = struct Ident.empty variables in { + payload = (); termination = Termination.initial; target = target; env = env; @@ -583,23 +625,6 @@ end = struct let all_candidates t = Env.implicit_instances t.env - (* [step state candidates] - Starting from search [state], find a matching candidate in - [candidates] list or raise [Not_found]. - - If successful, returns [result, candidates] *) - - type partial = - { - parent: t; - path: Path.t; - sub_targets: (target * Termination.t) list; - } - - type result = - | Module of Path.t * t - | Functor of partial * t - let step0 state (path, md) = state.eq_var := state.eq_initial; let target = state.target in @@ -626,44 +651,63 @@ end = struct | [] -> (* No parameters: we keep new equations potentially added to top variables *) - Module (path, state) + `Done {state with payload = path} | (target, crit) :: sub_targets -> - let partial = {parent = state; path; sub_targets} in - let state = {state with target; termination = Termination.check state.env crit state.termination} in - Functor (partial, state) + let partial = {state with payload = (path, sub_targets)} in + let termination = Termination.check state.env crit state.termination in + let state = {state with target; termination} in + `Functor (partial, state) let rec step state = function | [] -> raise Not_found | candidate :: candidates -> - try (step0 state candidate, candidates) - with _exn -> + try + step0 state candidate, candidates + with exn -> + report_error exn; step state candidates - let apply partial path state = - let path = papply partial.path path in - match partial.sub_targets with + let apply partial arg = + let partial_path, sub_targets = partial.payload in + let arg_path = arg.payload in + let path = papply partial_path arg_path in + match sub_targets with | [] -> - Module (path, {partial.parent with eq_initial = state.eq_initial}) + let state = {partial with + payload = path; + (* We get the equations from the argument but keep + termination state from the parent *) + eq_initial = arg.eq_initial} in + `Done state | (target, crit) :: sub_targets -> - let partial = {partial with path; sub_targets} in - let md = Env.find_module path state.env in + let partial = {partial with payload = (path, sub_targets)} in + let md = Env.find_module path arg.env in (* The original module declaration might be implicit, we want to avoid rebinding implicit *) let md = {md with md_implicit = Asttypes.Nonimplicit} in - let state = { - state with - target; - termination = Termination.check state.env crit partial.parent.termination; - env = Env.add_module_declaration target.target_id md state.env - } in - Functor (partial, state) + let termination = Termination.check arg.env crit partial.termination in + let env = Env.add_module_declaration target.target_id md arg.env in + let arg = {arg with payload = (); target; termination; env} in + `Functor (partial, arg) end -let report_error exn = - try - Location.report_exception Format.err_formatter exn - with exn -> - Printf.eprintf "%s\n%!" (Printexc.to_string exn) +(*module Stack = struct + type 'a cell = { + (* The query *) + initial: Search.t * Search.candidate list; + (* If we want to resume search, start from these candidates *) + next: Search.candidate list; + + (* Intermediate steps, if any, with their result *) + steps : (Search.partial * Search.result cell) list; + + (* Result *) + result: 'a; + } + + type t = Search.partial cell list + +end*) (*let rec search_one state = let candidates = Search.all_candidates state in @@ -694,29 +738,35 @@ let rec search_one state candidates = ~k:(fun () -> search_one state candidates) and search_arguments ~k = function - | Search.Module (path,state') -> K ((path, state'), k) - | Search.Functor (partial,state') -> - let rec pack (K ((path, state'), k')) = - search_arguments (Search.apply partial path state') + | `Done result -> K (result, k) + | `Functor (partial,t) -> + let rec pack (K (result, k')) = + search_arguments (Search.apply partial result) ~k:(fun () -> try pack (k' ()) with _ -> k ()) in - pack (search_one state' (Search.all_candidates state')) + pack (search_one t (Search.all_candidates t)) let find_pending_instance inst = + let snapshot = Btype.snapshot () in let variables, target = target_of_pending inst in let env = inst.implicit_env in - let state = Search.start env variables target in + let t = Search.start env (List.map snd variables) target in try - let K ((path, _), k) = search_one state (Search.all_candidates state) in + let K (result, k) = search_one t (Search.all_candidates t) in + Btype.backtrack snapshot; begin assert ( - try let K ((_, _), _) = k () in + try let K (_, _) = k () in false with _ -> true) end; - Link.to_path inst path; + Btype.backtrack snapshot; + unify_equations env variables (Search.equations result); + Link.to_path inst (Search.get result); true - with _ -> + with exn -> + Btype.backtrack snapshot; + report_error exn; false (* Pack module at given path to match a given implicit instance and From 071b520e60c3e918b980b2fcf1e71baa41399da0 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Mon, 9 Jun 2014 15:33:46 +0100 Subject: [PATCH 381/494] Implicitsearch: WIP, stack reification --- typing/implicitsearch.ml | 73 +++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 31 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 7681796c01..00b40b10ef 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -548,7 +548,7 @@ module Search : sig type outcome = [ | `Done of result - | `Functor of partial * t + | `Step of partial * t ] val step : t -> candidate list -> outcome * candidate list @@ -596,7 +596,7 @@ end = struct type outcome = [ | `Done of result - | `Functor of partial * t + | `Step of partial * t ] let start env variables target = @@ -656,7 +656,7 @@ end = struct let partial = {state with payload = (path, sub_targets)} in let termination = Termination.check state.env crit state.termination in let state = {state with target; termination} in - `Functor (partial, state) + `Step (partial, state) let rec step state = function | [] -> raise Not_found @@ -688,47 +688,58 @@ end = struct let termination = Termination.check arg.env crit partial.termination in let env = Env.add_module_declaration target.target_id md arg.env in let arg = {arg with payload = (); target; termination; env} in - `Functor (partial, arg) + `Step (partial, arg) end (*module Stack = struct + type 'a cell = { (* The query *) - initial: Search.t * Search.candidate list; + query: Search.t * Search.candidate list; (* If we want to resume search, start from these candidates *) next: Search.candidate list; (* Intermediate steps, if any, with their result *) - steps : (Search.partial * Search.result cell) list; + steps: (Search.partial * Search.result cell) list; - (* Result *) - result: 'a; + value: 'a; } - type t = Search.partial cell list - -end*) - -(*let rec search_one state = - let candidates = Search.all_candidates state in - search_arguments (fst (Search.step state candidates)) + (* The stack is made of all partial applications waiting for an argument *) + type t = Search.partial cell list * Search.t * Search.candidate cell + + let rec cell_search stack search = + let candidates = Search.all_candidates search in + match Search.step search candidates with + | `Done result, next -> + let cell = { + query = (search, candidates); + next; steps = []; value = result + } in + begin match stack with + | [] -> `Done cell + | head :: stack -> cell_apply stack head cell + end + | `Step (partial, search), next -> + begin match start_search search with + | `Step (stack, cell) -> + | `Done cell -> + end + + and cell_apply stack head arg = + let head = {head with steps = (head.value, arg) :: head.steps} in + match Search.apply head.value arg.value with + | `Step (partial, search) -> + cell_search ({head with value = partial} :: stack) search + | `Done result -> + begin match stack with + | [] -> `Done {head with value = result} + | head' :: stack -> `Done { + end -and search_arguments = function - | Search.Module (path,state') -> path, state' - | Search.Functor (partial,state') -> - let path, state' = search_one state' in - search_arguments (Search.apply partial path state') + let start env variables target = -let find_pending_instance inst = - let variables, target = target_of_pending inst in - let env = inst.implicit_env in - let state = Search.start env variables target in - try - let path, _ = search_one state in - Link.to_path inst path; - true - with _ -> - false*) +end*) type 'a k = K of ('a * (unit -> 'a k)) @@ -739,7 +750,7 @@ let rec search_one state candidates = and search_arguments ~k = function | `Done result -> K (result, k) - | `Functor (partial,t) -> + | `Step (partial,t) -> let rec pack (K (result, k')) = search_arguments (Search.apply partial result) ~k:(fun () -> try pack (k' ()) with _ -> k ()) From 0eaa480a36b62ec61e0501d4594de2a7bbd699e7 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Mon, 16 Jun 2014 17:22:11 +0100 Subject: [PATCH 382/494] Proper representation for implicit search solution --- typing/implicitsearch.ml | 113 ++++++++++++++++----------------------- 1 file changed, 47 insertions(+), 66 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 00b40b10ef..97fb89246a 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -535,23 +535,23 @@ module Search : sig type candidate = Path.t * Types.module_declaration - type t + type query type partial type result val get : result -> Path.t val equations : result -> (Path.t * type_expr) list - val all_candidates : t -> candidate list + val all_candidates : query -> candidate list - val start : Env.t -> Ident.t list -> target -> t + val start : Env.t -> Ident.t list -> target -> query type outcome = [ | `Done of result - | `Step of partial * t + | `Step of partial * query ] - val step : t -> candidate list -> outcome * candidate list + val step : query -> candidate list -> outcome * candidate list val apply : partial -> result -> outcome end = struct @@ -577,7 +577,7 @@ end = struct eq_table: (Path.t * type_expr) list ref Ident.tbl; } - type t = + type query = (* Start point for a search, a state without other information attached *) unit state @@ -596,7 +596,7 @@ end = struct type outcome = [ | `Done of result - | `Step of partial * t + | `Step of partial * query ] let start env variables target = @@ -691,86 +691,67 @@ end = struct `Step (partial, arg) end -(*module Stack = struct +module Solution = struct + + type t = { + (* The original query *) + query: Search.query; - type 'a cell = { - (* The query *) - query: Search.t * Search.candidate list; (* If we want to resume search, start from these candidates *) next: Search.candidate list; - (* Intermediate steps, if any, with their result *) - steps: (Search.partial * Search.result cell) list; + (* Intermediate steps with solutions to subquerys *) + steps: (Search.partial * t) list; - value: 'a; + result: Search.result; } - (* The stack is made of all partial applications waiting for an argument *) - type t = Search.partial cell list * Search.t * Search.candidate cell - - let rec cell_search stack search = - let candidates = Search.all_candidates search in - match Search.step search candidates with - | `Done result, next -> - let cell = { - query = (search, candidates); - next; steps = []; value = result - } in - begin match stack with - | [] -> `Done cell - | head :: stack -> cell_apply stack head cell - end - | `Step (partial, search), next -> - begin match start_search search with - | `Step (stack, cell) -> - | `Done cell -> - end - - and cell_apply stack head arg = - let head = {head with steps = (head.value, arg) :: head.steps} in - match Search.apply head.value arg.value with - | `Step (partial, search) -> - cell_search ({head with value = partial} :: stack) search - | `Done result -> - begin match stack with - | [] -> `Done {head with value = result} - | head' :: stack -> `Done { - end - - let start env variables target = + let rec search query = + search_candidates query (Search.all_candidates query) -end*) + and search_candidates query candidates = + let step, next = Search.step query candidates in + search_arguments query next [] step -type 'a k = K of ('a * (unit -> 'a k)) - -let rec search_one state candidates = - let result, candidates = Search.step state candidates in - search_arguments result - ~k:(fun () -> search_one state candidates) + and search_arguments query next steps = function + | `Done result -> + {query; next; steps; result} + | `Step (partial,subquery) -> + apply_argument query next steps partial (search subquery) + + and apply_argument query next steps partial solution = + search_arguments query next + ((partial, solution) :: steps) + (Search.apply partial solution.result) + + let rec search_next_steps solution = function + | ((partial, step) :: steps) -> + begin try + let {query; next; _} = solution in + apply_argument query next steps partial (search_next step) + with Not_found -> + search_next_steps solution steps + end + | [] -> + search_candidates solution.query solution.next -and search_arguments ~k = function - | `Done result -> K (result, k) - | `Step (partial,t) -> - let rec pack (K (result, k')) = - search_arguments (Search.apply partial result) - ~k:(fun () -> try pack (k' ()) with _ -> k ()) - in - pack (search_one t (Search.all_candidates t)) + and search_next solution = search_next_steps solution solution.steps +end let find_pending_instance inst = let snapshot = Btype.snapshot () in let variables, target = target_of_pending inst in let env = inst.implicit_env in - let t = Search.start env (List.map snd variables) target in + let query = Search.start env (List.map snd variables) target in try - let K (result, k) = search_one t (Search.all_candidates t) in + let solution = Solution.search query in Btype.backtrack snapshot; begin assert ( - try let K (_, _) = k () in - false + try ignore (Solution.search_next solution : Solution.t); false with _ -> true) end; + let result = solution.Solution.result in Btype.backtrack snapshot; unify_equations env variables (Search.equations result); Link.to_path inst (Search.get result); From 044ac11298a9828946f26d157ce074f7204d7a30 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 18 Jun 2014 18:00:59 +0100 Subject: [PATCH 383/494] WIP HKT --- typing/ctype.ml | 13 ++- typing/ctype.mli | 8 ++ typing/implicitsearch.ml | 189 +++++++++++++++++++++++++++++---------- typing/printtyp.ml | 2 + typing/typeimplicit.ml | 100 ++++++++++----------- 5 files changed, 210 insertions(+), 102 deletions(-) diff --git a/typing/ctype.ml b/typing/ctype.ml index 73d5313eb9..55540b0a25 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -724,6 +724,9 @@ let rec generalize_spine ty = let forward_try_expand_once = (* Forward declaration *) ref (fun env ty -> raise Cannot_expand) +let printtyp_expr + : (Format.formatter -> type_expr -> unit) ref + = ref (fun _ -> assert false) (* Lower the levels of a type (assume [level] is not [generic_level]). @@ -764,8 +767,7 @@ let rec update_level env level ty = end; match ty.desc with Tconstr(p, tl, abbrev) - when level < get_level env p && - not (Env.is_implicit_arg p env && tl = []) -> + when level < get_level env p -> (* Try first to replace an abbreviation by its expansion. *) begin try (* if is_newtype env p then raise Cannot_expand; *) @@ -774,7 +776,8 @@ let rec update_level env level ty = with Cannot_expand -> (* +++ Levels should be restored... *) (* Format.printf "update_level: %i < %i@." level (get_level env p); *) - if level < get_level env p then raise (Unify [(ty, newvar2 level)]); + if (level < get_level env p) && not (Env.is_implicit_arg p env) then + raise (Unify [(ty, newvar2 level)]); iter_type_expr (update_level env level) ty end | Tpackage (p, nl, tl) when level < get_level env p -> @@ -3463,6 +3466,10 @@ let equal env rename tyl1 tyl2 = with Unify _ -> false +let equal' env rename tyl1 tyl2 = + univar_pairs := []; + eqtype_list rename (TypePairs.create 11) (ref []) env tyl1 tyl2 + (* Must empty univar_pairs first *) let eqtype rename type_pairs subst env t1 t2 = univar_pairs := []; diff --git a/typing/ctype.mli b/typing/ctype.mli index 31f5f07111..8c5d8432ae 100644 --- a/typing/ctype.mli +++ b/typing/ctype.mli @@ -211,6 +211,11 @@ val equal: Env.t -> bool -> type_expr list -> type_expr list -> bool (* [equal env [x1...xn] tau [y1...yn] sigma] checks whether the parameterized types [/\x1.../\xn.tau] and [/\y1.../\yn.sigma] are equivalent. *) +val equal': Env.t -> bool -> type_expr list -> type_expr list -> unit + (* [equal env [x1...xn] tau [y1...yn] sigma] + checks whether the parameterized types + [/\x1.../\xn.tau] and [/\y1.../\yn.sigma] are equivalent. *) + val match_class_declarations: Env.t -> type_expr list -> class_type -> type_expr list -> class_type -> class_match_failure list @@ -284,3 +289,6 @@ val modtype_of_package : (Env.t -> Location.t -> Path.t -> Longident.t list -> type_expr list -> module_type) ref val new_declaration : (int * int) option -> type_expr option -> type_declaration + + +val printtyp_expr : (Format.formatter -> type_expr -> unit) ref diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 97fb89246a..c60501885d 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -33,25 +33,26 @@ type target = { (* The module type we try to find an instance for *) target_type : Types.module_type; (* The identifier to which bound the result of the search to. - E.g we are trying to fill the hole in - module %target_id : %target_type = _ - *) + E.g we are trying to fill the hole in: + module %target_id : %target_type = _ *) target_id : Ident.t; - (* A unique identifier that will be used for termination checking. - When the target is the argument to a functor instantiation, if this functor is instantiated multiple times - we enforce that the constraints on the argument are stronger. + (* A unique identifier that will be used for termination checking. When the + target is the argument to a functor instantiation, if this functor is + instantiated multiple times we enforce that the constraints on the + argument are stronger. Pair (Arg_1) (Pair (Arg_1') (Arg_2)) Arg_1 and Arg_1' targets will have a different target_id but the same - target_uid. We check that constraints on Arg_1' are stronger than those on - Arg_1'. + target_uid. We check that constraints on Arg_1' are stronger than those + on Arg_1'. - Note: This is also true of (Pair (Arg_1') (Arg_2)) and Arg_2, used as second - arguments to Pair. - *) + Note: This is also true of (Pair (Arg_1') (Arg_2)) and Arg_2, used as + second arguments to Pair. *) target_uid : Ident.t; + + target_hkt : (type_expr list * Path.t * type_expr) list; } (** Constraints are a list of equations of the form [path] = [type_expr]. @@ -320,12 +321,12 @@ end (* Various functions to preprocess pending implicit and implicit declarations when searching *) -let remove_type_variables mty = +let remove_type_variables () = let variables = ref [] in let it_type_expr it ty = let ty = repr ty in match ty.desc with - | Tvar name -> + | Tvar name when ty.level < generic_level -> let name = match name with | None -> "ex" | Some name -> name @@ -337,17 +338,21 @@ let remove_type_variables mty = | _ -> type_iterators.it_type_expr it ty; in let it = {type_iterators with it_type_expr} in - it.it_module_type it mty; - !variables + variables, it -let unify_equations env variables equations = +(*let unify_equations env variables equations = List.iter (fun (ty, id) -> - List.iter (function - | Path.Pident id', ty' when Ident.same id id' -> + List.iter + (function + | Path.Pident id' as path, ty' when Ident.same id id' -> + Format.fprintf Format.err_formatter "unifying %a with %a (= %a)\n%!" + Printtyp.type_expr ty + Printtyp.type_expr ty' + Printtyp.path path; unify env ty ty' | _ -> ()) equations - ) variables + ) variables*) let target_of_pending inst = let env = inst.implicit_env in @@ -359,16 +364,22 @@ let target_of_pending inst = | None -> assert false | Some mty -> mty in + let without_args (args,_,_) = args = [] in + let fkt, hkt = List.partition without_args inst.implicit_constraints in + let fkt = List.map (fun (_,path,ty) -> (path,ty)) fkt in let cstrs = (* Constraints from package type *) (List.map2 (fun n t -> Longident.flatten n, t) nl tl) (* Constraints from implicit instance *) @ - (Constraints.flatten ~root:ident inst.implicit_constraints) + (Constraints.flatten ~root:ident fkt) in let mty = Constraints.apply env mty cstrs in - let variables = remove_type_variables mty in + let variables, it = remove_type_variables () in + it.it_module_type it mty; + List.iter (fun (args,_,_) -> List.iter (it.it_type_expr it) args) hkt; let id = inst.implicit_id in - variables, {target_type = mty; target_id = id; target_uid = id} + !variables, + {target_type = mty; target_id = id; target_uid = id; target_hkt = hkt} let rec extract_implicit_parameters targets n omty nmty = assert (n >= 0); @@ -378,7 +389,7 @@ let rec extract_implicit_parameters targets n omty nmty = | Mty_functor (target_uid, Some _, omty'), Mty_functor (target_id, Some target_type, nmty') -> extract_implicit_parameters - ({target_uid; target_id; target_type} :: targets) (n - 1) omty' nmty' + ({target_uid; target_id; target_type; target_hkt = []} :: targets) (n - 1) omty' nmty' | _ -> assert false let find_implicit_parameters {Types. md_type = omty; md_implicit} = @@ -599,17 +610,17 @@ end = struct | `Step of partial * query ] - let start env variables target = + let start env vars target = let level = get_current_level () in let env = List.fold_left (fun env variable -> Env.add_type ~check:false variable (new_declaration (Some (level, level)) None) env) - env variables + env vars in let eq_var = ref [] in let eq_table = List.fold_left (fun tbl id -> Ident.add id eq_var tbl) - Ident.empty variables + Ident.empty vars in { payload = (); @@ -631,26 +642,85 @@ end = struct let sub_targets, candidate = find_implicit_parameters md in let new_eqns = ref [] in (* Generate coercion. if this succeeds this produce equations in new_eqns and eq_var *) - let _ : module_coercion = - let eq_table, env = List.fold_left - (fun (eq_table, env) {target_id} -> - Ident.add target_id new_eqns eq_table, - Env.add_module target.target_id target.target_type env) - (state.eq_table, state.env) sub_targets - in - Ctype.with_equality_equations eq_table - (fun () -> Includemod.modtypes env candidate target.target_type) + let eq_table, env = List.fold_left + (fun (eq_table, env) {target_id} -> + Ident.add target_id new_eqns eq_table, + Env.add_module target.target_id target.target_type env) + (state.eq_table, state.env) sub_targets + in + let accepting_eq = Ident.fold_all + (fun ident _ acc -> Ident.name ident :: acc) + eq_table [] in + Format.fprintf Format.std_formatter "Starting from equations on %s:\n%!" + (String.concat ", " accepting_eq); + List.iter (fun (path,ty) -> + Format.fprintf Format.std_formatter "\t%a = %a\n%!" + Printtyp.path path + Printtyp.type_expr ty) + !(state.eq_var); + Ctype.with_equality_equations eq_table + (fun () -> + let subst = Subst.add_module target.target_id path Subst.identity in + let fresh_inst (args,path,ty) = + (newconstr (Subst.type_path subst path) args, ty) + in + let tls = List.map fresh_inst target.target_hkt in + let tl1, tl2 = List.split tls in + begin try Ctype.equal' env false tl1 tl2 + with Ctype.Unify tls -> + Format.fprintf Format.std_formatter "Failed to instantiate:\n"; + List.iter2 (fun t1 t2 -> + Format.fprintf Format.std_formatter "\t%a = %a\n%!" + Printtyp.type_expr t1 + Printtyp.type_expr t2) + tl1 tl2; + Format.fprintf Format.std_formatter "With equations on %s:\n%!" + (String.concat ", " accepting_eq); + List.iter (fun (path,ty) -> + Format.fprintf Format.std_formatter "\t%a = %a\n%!" + Printtyp.path path + Printtyp.type_expr ty) + !(state.eq_var); + Format.fprintf Format.std_formatter "Because:\n%!"; + List.iter (fun (ty1,ty2) -> + let rec find_aliases acc ty = match (repr ty).desc with + | Tconstr (path,args,_) -> + let acc = try + let _args,ty',_ = Env.find_type_expansion path env in + (ty,ty') :: acc + with Not_found -> (ty,ty) :: acc + in + List.fold_left find_aliases acc args + | _ -> acc + in + let aliases = find_aliases [] ty1 in + let aliases = find_aliases aliases ty2 in + List.iter (fun (ty1,ty2) -> + Format.fprintf Format.std_formatter " %a ~ %a;" + Printtyp.type_expr ty1 + Printtyp.type_expr ty2) + aliases; + Format.fprintf Format.std_formatter "\n\t%a != %a \n%!" + Printtyp.type_expr ty1 + Printtyp.type_expr ty2) + tls; + raise Not_found + end; + let _ : module_coercion = + Includemod.modtypes env candidate target.target_type + in + ()); let eqns = !new_eqns in (* Constraints target types *) let sub_targets = Constraints.targets state.env sub_targets eqns in (* Add termination criteria *) let sub_targets = Termination.normalize_equations sub_targets eqns in + + (* Keep new equations potentially added to top variables *) let state = {state with eq_initial = !(state.eq_var)} in match sub_targets with | [] -> - (* No parameters: we keep new equations potentially added to top - variables *) `Done {state with payload = path} | (target, crit) :: sub_targets -> let partial = {state with payload = (path, sub_targets)} in @@ -663,7 +733,9 @@ end = struct | candidate :: candidates -> try step0 state candidate, candidates - with exn -> + with + | Termination.Terminate as exn -> raise exn + | exn -> report_error exn; step state candidates @@ -740,20 +812,38 @@ end let find_pending_instance inst = let snapshot = Btype.snapshot () in - let variables, target = target_of_pending inst in + let vars, target = target_of_pending inst in let env = inst.implicit_env in - let query = Search.start env (List.map snd variables) target in + let env = List.fold_left (fun env (_ty,ident) -> + (* Create a fake abstract type declaration for name. *) + let level = get_current_level () in + let decl = { + type_params = []; + type_arity = 0; + type_kind = Type_abstract; + type_private = Asttypes.Public; + type_manifest = None; + type_variance = []; + type_newtype_level = Some (level, level); + type_loc = Location.none; + type_attributes = []; + } + in + Env.add_type ~check:false ident decl env) + env vars + in + let query = Search.start env (List.map snd vars) target in try let solution = Solution.search query in - Btype.backtrack snapshot; - begin + (*begin assert ( try ignore (Solution.search_next solution : Solution.t); false with _ -> true) - end; + end;*) let result = solution.Solution.result in Btype.backtrack snapshot; - unify_equations env variables (Search.equations result); + (* Not needed, since Link.to_path should do the proper checks: + unify_equations env fvars (Search.equations result);*) Link.to_path inst (Search.get result); true with exn -> @@ -818,9 +908,11 @@ let generalize_implicits () = let pending = List.filter not_linked !pending_implicits in let need_generalization inst = List.exists - (fun (ty,var) -> - assert (var.level <> generic_level); - var.level >= current_level) + (fun (vars,ty,var) -> + List.exists (fun var -> + assert (var.level <> generic_level); + var.level >= current_level) + (var :: vars)) inst.implicit_constraints || inst.implicit_constraints = [] in @@ -828,6 +920,9 @@ let generalize_implicits () = List.partition need_generalization pending in pending_implicits := rest; + (* The reversal is important to ensure we search from the outer most + to the inner most implicits *) + let to_generalize = List.rev to_generalize in try let not_instantiable inst = not (find_pending_instance inst) in let inst = List.find not_instantiable to_generalize in diff --git a/typing/printtyp.ml b/typing/printtyp.ml index a3841e158e..db589f9b97 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -1537,3 +1537,5 @@ let report_ambiguous_type_error ppf env (tp0, tp0') tpl txt1 txt2 txt3 = @]" txt2 type_path_list tpl txt3 (type_path_expansion tp0) tp0') + +let () = Ctype.printtyp_expr := type_expr diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index 6c31c50cd5..86414a10ba 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -31,29 +31,35 @@ type pending_implicit = { implicit_env: Env.t; implicit_loc: Location.t; implicit_type: Path.t * Longident.t list * type_expr list; - mutable implicit_constraints: (Path.t * type_expr) list; + mutable implicit_constraints: (type_expr list * Path.t * type_expr) list; (* When linking with an implicit module M, a constraint (path, ty) is satisfied iff path unify with ty when implicit_id is bound to M in implicit_env *) implicit_argument: argument; } -module Unlink - (P : sig - val register_constraints_for - : Ident.t -> (Path.t -> type_expr -> unit) option - end) = struct +(*val env : Env.t + val unlink_on + : Ident.t -> (type_expr list -> Path.t -> type_expr -> unit) option*) +let unlink env unlink_on = + let path_table = Hashtbl.create 7 in - let path_table = Hashtbl.create 7 - - let add_constraint register ~path ~var = + let add_constraint register args path var = + let instance_list = + try Hashtbl.find path_table path + with Not_found -> [] + in begin try - let var' = Hashtbl.find path_table path in + let eq_args (args',_var) = + (args = args') || Ctype.equal env false args args' + in + let _args, var' = List.find eq_args instance_list in link_type var var' with Not_found -> - Hashtbl.add path_table path var + Hashtbl.replace path_table path ((args, var) :: instance_list) end; - register path var + register args path var + in let it_type_expr it ty = let ty = repr ty in @@ -62,37 +68,27 @@ module Unlink (* Then replace current type if it is a constructor referring to an implicit *) match ty.desc with - | Tconstr (path,[],_) -> - begin match P.register_constraints_for (Path.head path) with - | None -> () - | Some register_constraint -> - (* Replace `ty' by a fresh variable *) - let {desc = desc'; level = lv'; id = id'} = newvar() in - ty.desc <- desc'; - ty.level <- lv'; - ty.id <- id'; - add_constraint register_constraint ~path ~var:ty - end - (* No HKT *) - | Tconstr (path,_,_) -> - assert (P.register_constraints_for (Path.head path) = None) + | Tconstr (path,args,_) -> + begin match unlink_on (Path.head path) with + | None -> () + | Some register -> + (* Replace `ty' by a fresh variable *) + let {desc = desc'; level = lv'; id = id'} = newvar() in + ty.desc <- desc'; + ty.level <- lv'; + ty.id <- id'; + add_constraint register args path ty + end | _ -> () + in - let type_iterators = {type_iterators with it_type_expr} - - let type_expr ty = - type_iterators.it_type_expr type_iterators ty - - let module_type mty = - type_iterators.it_module_type type_iterators mty - -end + {type_iterators with it_type_expr = it_type_expr} let pending_implicits : pending_implicit list ref = ref [] -let rec has_implicit ty = match ty.desc with +let rec has_implicit ty = match (repr ty).desc with | Tarrow (Tarr_implicit id,_,_,_) -> true | Tarrow (_,_,rhs,_) -> has_implicit rhs | _ -> false @@ -141,25 +137,25 @@ let instantiate_implicits_ty loc env ty = An implicit instance is correct only iff, in an environment where the ident is bound to the instance, all pairs in the list unify. *) - let module Unlink = Unlink (struct - let register_constraints_for ident = - try - let inst = Ident.find_same ident instances in - let add_constraint path var= - inst.implicit_constraints <- - (path,var) :: inst.implicit_constraints - in - Some add_constraint - with Not_found -> - None - end) + let unlink_ident ident = + try + let inst = Ident.find_same ident instances in + let add_constraint args path var= + inst.implicit_constraints <- + (args,path,var) :: inst.implicit_constraints + in + Some add_constraint + with Not_found -> + None in (* Unlink main types *) - Unlink.type_expr ty; + let unlink_it = unlink env unlink_ident in + let unlink_it = unlink_it.it_type_expr unlink_it in + unlink_it ty; (* Unlink with types appearing in with constraints *) Ident.iter (fun _id inst -> let _p,_nl,tl = inst.implicit_type in - List.iter Unlink.type_expr tl + List.iter unlink_it tl ) instances; arguments, instances, ty @@ -198,9 +194,9 @@ module Link = struct let to_path inst path = (* Check that all constraints are satisfied *) let subst = Subst.add_module inst.implicit_id path Subst.identity in - List.iter (fun (tpath,ty') -> + List.iter (fun (targs,tpath,ty') -> let tpath = Subst.type_path subst tpath in - let ty = newconstr tpath [] in + let ty = newconstr tpath targs in let ty' = Subst.type_expr subst ty' in unify inst.implicit_env ty ty' ) From 63d0fdc8ff6afc4fe63eb17334e63cc3b47f01f5 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 18 Jun 2014 18:25:08 +0100 Subject: [PATCH 384/494] Fix handling of type levels during Linking --- typing/implicitsearch.ml | 61 ++++++++++++++++++++++------------------ typing/typeimplicit.ml | 42 ++++++++++++++------------- 2 files changed, 56 insertions(+), 47 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index c60501885d..76ba6ae806 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -52,7 +52,7 @@ type target = { second arguments to Pair. *) target_uid : Ident.t; - target_hkt : (type_expr list * Path.t * type_expr) list; + target_hkt : (type_expr * type_expr) list; } (** Constraints are a list of equations of the form [path] = [type_expr]. @@ -364,19 +364,30 @@ let target_of_pending inst = | None -> assert false | Some mty -> mty in - let without_args (args,_,_) = args = [] in - let fkt, hkt = List.partition without_args inst.implicit_constraints in - let fkt = List.map (fun (_,path,ty) -> (path,ty)) fkt in + let basekinded (ty,_tyvar) = match (repr ty).desc with + | Tconstr (_, [], _) -> true + | Tconstr (_, (_ :: _), _) -> false + | _ -> assert false + in + let basepath (ty,tyvar) = match (repr ty).desc with + | Tconstr (path, [], _) -> path, tyvar + | _ -> assert false + in + let bkt, hkt = List.partition basekinded inst.implicit_constraints in + let bkt = List.map basepath bkt in let cstrs = (* Constraints from package type *) (List.map2 (fun n t -> Longident.flatten n, t) nl tl) (* Constraints from implicit instance *) @ - (Constraints.flatten ~root:ident fkt) + (Constraints.flatten ~root:ident bkt) in let mty = Constraints.apply env mty cstrs in let variables, it = remove_type_variables () in it.it_module_type it mty; - List.iter (fun (args,_,_) -> List.iter (it.it_type_expr it) args) hkt; + List.iter (fun (ty,tyvar) -> + it.it_type_expr it ty; + it.it_type_expr it tyvar) + hkt; let id = inst.implicit_id in !variables, {target_type = mty; target_id = id; target_uid = id; target_hkt = hkt} @@ -652,37 +663,35 @@ end = struct (fun ident _ acc -> Ident.name ident :: acc) eq_table [] in - Format.fprintf Format.std_formatter "Starting from equations on %s:\n%!" + Format.fprintf Format.err_formatter "Starting from equations on %s:\n%!" (String.concat ", " accepting_eq); List.iter (fun (path,ty) -> - Format.fprintf Format.std_formatter "\t%a = %a\n%!" + Format.fprintf Format.err_formatter "\t%a = %a\n%!" Printtyp.path path Printtyp.type_expr ty) !(state.eq_var); Ctype.with_equality_equations eq_table (fun () -> let subst = Subst.add_module target.target_id path Subst.identity in - let fresh_inst (args,path,ty) = - (newconstr (Subst.type_path subst path) args, ty) - in - let tls = List.map fresh_inst target.target_hkt in - let tl1, tl2 = List.split tls in - begin try Ctype.equal' env false tl1 tl2 + let tyl, tvl = List.split target.target_hkt in + let tyl = List.map (Subst.type_expr subst) tyl in + let tvl = List.map (Subst.type_expr subst) tvl in + begin try Ctype.equal' env false tyl tvl with Ctype.Unify tls -> - Format.fprintf Format.std_formatter "Failed to instantiate:\n"; + Format.fprintf Format.err_formatter "Failed to instantiate:\n"; List.iter2 (fun t1 t2 -> - Format.fprintf Format.std_formatter "\t%a = %a\n%!" + Format.fprintf Format.err_formatter "\t%a = %a\n%!" Printtyp.type_expr t1 Printtyp.type_expr t2) - tl1 tl2; - Format.fprintf Format.std_formatter "With equations on %s:\n%!" + tyl tvl; + Format.fprintf Format.err_formatter "With equations on %s:\n%!" (String.concat ", " accepting_eq); List.iter (fun (path,ty) -> - Format.fprintf Format.std_formatter "\t%a = %a\n%!" + Format.fprintf Format.err_formatter "\t%a = %a\n%!" Printtyp.path path Printtyp.type_expr ty) !(state.eq_var); - Format.fprintf Format.std_formatter "Because:\n%!"; + Format.fprintf Format.err_formatter "Because:\n%!"; List.iter (fun (ty1,ty2) -> let rec find_aliases acc ty = match (repr ty).desc with | Tconstr (path,args,_) -> @@ -697,11 +706,11 @@ end = struct let aliases = find_aliases [] ty1 in let aliases = find_aliases aliases ty2 in List.iter (fun (ty1,ty2) -> - Format.fprintf Format.std_formatter " %a ~ %a;" + Format.fprintf Format.err_formatter " %a ~ %a;" Printtyp.type_expr ty1 Printtyp.type_expr ty2) aliases; - Format.fprintf Format.std_formatter "\n\t%a != %a \n%!" + Format.fprintf Format.err_formatter "\n\t%a != %a \n%!" Printtyp.type_expr ty1 Printtyp.type_expr ty2) tls; @@ -908,11 +917,9 @@ let generalize_implicits () = let pending = List.filter not_linked !pending_implicits in let need_generalization inst = List.exists - (fun (vars,ty,var) -> - List.exists (fun var -> - assert (var.level <> generic_level); - var.level >= current_level) - (var :: vars)) + (fun (ty,var) -> + assert (var.level <> generic_level); + max ty.level var.level >= current_level) inst.implicit_constraints || inst.implicit_constraints = [] in diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index 86414a10ba..901596189b 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -31,7 +31,7 @@ type pending_implicit = { implicit_env: Env.t; implicit_loc: Location.t; implicit_type: Path.t * Longident.t list * type_expr list; - mutable implicit_constraints: (type_expr list * Path.t * type_expr) list; + mutable implicit_constraints: (type_expr * type_expr) list; (* When linking with an implicit module M, a constraint (path, ty) is satisfied iff path unify with ty when implicit_id is bound to M in implicit_env *) @@ -40,25 +40,25 @@ type pending_implicit = { (*val env : Env.t val unlink_on - : Ident.t -> (type_expr list -> Path.t -> type_expr -> unit) option*) + : Ident.t -> (type_expr -> type_expr -> unit) option*) let unlink env unlink_on = let path_table = Hashtbl.create 7 in - let add_constraint register args path var = + let add_constraint register path ty tyvar = let instance_list = try Hashtbl.find path_table path with Not_found -> [] in begin try - let eq_args (args',_var) = - (args = args') || Ctype.equal env false args args' + let eq_args (ty',_tyvar') = + TypeOps.equal ty ty' || Ctype.equal env false [ty] [ty'] in - let _args, var' = List.find eq_args instance_list in - link_type var var' + let _ty', tyvar' = List.find eq_args instance_list in + link_type tyvar tyvar' with Not_found -> - Hashtbl.replace path_table path ((args, var) :: instance_list) + Hashtbl.replace path_table path ((ty, tyvar) :: instance_list) end; - register args path var + register ty tyvar in let it_type_expr it ty = @@ -72,12 +72,15 @@ let unlink env unlink_on = begin match unlink_on (Path.head path) with | None -> () | Some register -> - (* Replace `ty' by a fresh variable *) - let {desc = desc'; level = lv'; id = id'} = newvar() in + let ty' = newvar () in + (* Swap `ty' with a fresh variable *) + let {desc = desc; level = lv} = ty in + let {desc = desc'; level = lv'} = ty' in ty.desc <- desc'; ty.level <- lv'; - ty.id <- id'; - add_constraint register args path ty + ty'.desc <- desc; + ty'.level <- lv; + add_constraint register path ty' ty end | _ -> () in @@ -140,9 +143,9 @@ let instantiate_implicits_ty loc env ty = let unlink_ident ident = try let inst = Ident.find_same ident instances in - let add_constraint args path var= + let add_constraint ty tyvar = inst.implicit_constraints <- - (args,path,var) :: inst.implicit_constraints + (ty, tyvar) :: inst.implicit_constraints in Some add_constraint with Not_found -> @@ -194,11 +197,10 @@ module Link = struct let to_path inst path = (* Check that all constraints are satisfied *) let subst = Subst.add_module inst.implicit_id path Subst.identity in - List.iter (fun (targs,tpath,ty') -> - let tpath = Subst.type_path subst tpath in - let ty = newconstr tpath targs in - let ty' = Subst.type_expr subst ty' in - unify inst.implicit_env ty ty' + List.iter (fun (ty,tyvar) -> + let ty = Subst.type_expr subst ty in + let tyvar = Subst.type_expr subst tyvar in + unify inst.implicit_env ty tyvar ) inst.implicit_constraints; (* Pack the module to appropriate signature *) From 3c75c9addd16cec01950485fc171bf0cfd725ede Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Thu, 19 Jun 2014 12:13:57 +0100 Subject: [PATCH 385/494] Typeimplicit: ensure implicit arguments are generated in the source order --- typing/typeimplicit.ml | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index 901596189b..bef8e50722 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -97,7 +97,7 @@ let rec has_implicit ty = match (repr ty).desc with | _ -> false let instantiate_implicits_ty loc env ty = - if not (has_implicit ty) then [], Ident.empty, ty + if not (has_implicit ty) then [], [], ty else let fresh_implicit id ty = let ty = repr ty in @@ -123,7 +123,7 @@ let instantiate_implicits_ty loc env ty = let inst = fresh_implicit id lhs in let arguments, instances, rhs' = extract_implicits rhs in inst.implicit_argument :: arguments, - Ident.add id inst instances, + inst :: instances, rhs' (*{ty with desc = Tarrow (Tarr_implicit id', lhs, rhs', comm)}*) | Tarrow (arr, lhs, rhs, comm) -> @@ -131,7 +131,7 @@ let instantiate_implicits_ty loc env ty = {arg_flag = (tapp_of_tarr arr); arg_expression = None} :: arguments, instances, {ty with desc = Tarrow (arr, lhs, rhs', comm)} - | _ -> [], Ident.empty, ty + | _ -> [], [], ty in let ty = Subst.type_expr Subst.identity ty in let arguments, instances, ty = extract_implicits ty in @@ -142,7 +142,7 @@ let instantiate_implicits_ty loc env ty = *) let unlink_ident ident = try - let inst = Ident.find_same ident instances in + let inst = List.find (fun inst -> inst.implicit_id = ident) instances in let add_constraint ty tyvar = inst.implicit_constraints <- (ty, tyvar) :: inst.implicit_constraints @@ -156,17 +156,17 @@ let instantiate_implicits_ty loc env ty = let unlink_it = unlink_it.it_type_expr unlink_it in unlink_it ty; (* Unlink with types appearing in with constraints *) - Ident.iter (fun _id inst -> - let _p,_nl,tl = inst.implicit_type in - List.iter unlink_it tl - ) instances; + List.iter (fun inst -> + let _p,_nl,tl = inst.implicit_type in + List.iter unlink_it tl + ) instances; arguments, instances, ty let instantiate_implicits_expr env expr = let implicits, expr = match instantiate_implicits_ty expr.exp_loc env expr.exp_type with | [], implicits, _ -> - implicits,expr + implicits, expr | arguments, implicits, ty -> implicits, { exp_desc = Texp_apply (expr, arguments); @@ -177,9 +177,7 @@ let instantiate_implicits_expr env expr = exp_attributes = [] } in - let cons _ inst acc = inst :: acc in - let implicits = Ident.fold_all cons implicits [] in - pending_implicits := implicits @ !pending_implicits; + pending_implicits := List.rev_append implicits !pending_implicits; expr From f5e405b2b509a61d4eec5b5da7b5f52779bdacde Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Thu, 19 Jun 2014 13:15:41 +0100 Subject: [PATCH 386/494] Improve error messages --- typing/implicitsearch.ml | 42 +++++++++++++++++++++++----------------- typing/typecore.ml | 16 ++++++++++++--- typing/typecore.mli | 5 ++++- 3 files changed, 41 insertions(+), 22 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 76ba6ae806..433774cbd1 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -817,6 +817,8 @@ module Solution = struct search_candidates solution.query solution.next and search_next solution = search_next_steps solution solution.steps + + let get {result} = Search.get result end let find_pending_instance inst = @@ -838,27 +840,31 @@ let find_pending_instance inst = type_attributes = []; } in - Env.add_type ~check:false ident decl env) - env vars + Env.add_type ~check:false ident decl env + ) env vars in + let loc = inst.implicit_loc in let query = Search.start env (List.map snd vars) target in try let solution = Solution.search query in - (*begin - assert ( - try ignore (Solution.search_next solution : Solution.t); false - with _ -> true) - end;*) - let result = solution.Solution.result in - Btype.backtrack snapshot; - (* Not needed, since Link.to_path should do the proper checks: - unify_equations env fvars (Search.equations result);*) - Link.to_path inst (Search.get result); - true - with exn -> - Btype.backtrack snapshot; - report_error exn; - false + let alternative = + try Some (Solution.search_next solution) + with _ -> None + in + match alternative with + | None -> + Btype.backtrack snapshot; + (* Not needed, since Link.to_path should do the proper checks: + unify_equations env fvars (Search.equations result);*) + Link.to_path inst (Solution.get solution); + true + | Some alternative -> + let p1 = Solution.get solution in + let p2 = Solution.get alternative in + raise Typecore.(Error (loc, env, Ambiguous_implicit (inst,p1,p2))) + with + | Termination.Terminate -> + raise Typecore.(Error (loc, env, Termination_fail inst)) (* Pack module at given path to match a given implicit instance and update the instance to point to this module. @@ -935,7 +941,7 @@ let generalize_implicits () = let inst = List.find not_instantiable to_generalize in let loc = inst.implicit_loc in let env = inst.implicit_env in - raise Typecore.(Error (loc, env, Pending_implicit inst)) + raise Typecore.(Error (loc, env, No_instance_found inst)) with Not_found -> () let () = diff --git a/typing/typecore.ml b/typing/typecore.ml index 6fc1198448..9c481728db 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -67,7 +67,10 @@ type error = | Invalid_for_loop_index | No_value_clauses | Exception_pattern_below_toplevel - | Pending_implicit of Typeimplicit.pending_implicit + + | No_instance_found of Typeimplicit.pending_implicit + | Ambiguous_implicit of Typeimplicit.pending_implicit * Path.t * Path.t + | Termination_fail of Typeimplicit.pending_implicit exception Error of Location.t * Env.t * error exception Error_forward of Location.error @@ -4147,8 +4150,15 @@ let report_error env ppf = function | Exception_pattern_below_toplevel -> fprintf ppf "@[Exception patterns must be at the top level of a match case.@]" - | Pending_implicit inst -> - fprintf ppf "Cannot find instance for implicit %s." + | No_instance_found inst -> + fprintf ppf "No instance found for implicit %s." + (Ident.name inst.Typeimplicit.implicit_id) + | Ambiguous_implicit (inst, p1, p2) -> + fprintf ppf "Ambiguous implicit %s:@ %a@ and %a@ are both correct solutions." + (Ident.name inst.Typeimplicit.implicit_id) + path p1 path p2 + | Termination_fail inst -> + fprintf ppf "Termination check failed when searching for implicit %s." (Ident.name inst.Typeimplicit.implicit_id) let report_error env ppf err = diff --git a/typing/typecore.mli b/typing/typecore.mli index f797863c51..436bf84bef 100644 --- a/typing/typecore.mli +++ b/typing/typecore.mli @@ -112,7 +112,10 @@ type error = | Invalid_for_loop_index | No_value_clauses | Exception_pattern_below_toplevel - | Pending_implicit of Typeimplicit.pending_implicit + + | No_instance_found of Typeimplicit.pending_implicit + | Ambiguous_implicit of Typeimplicit.pending_implicit * Path.t * Path.t + | Termination_fail of Typeimplicit.pending_implicit exception Error of Location.t * Env.t * error exception Error_forward of Location.error From cd7cc8e33aadc8091f1c26ef563694fe92f05553 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Thu, 19 Jun 2014 13:17:06 +0100 Subject: [PATCH 387/494] Comment some printf debugging --- typing/implicitsearch.ml | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 433774cbd1..cf74183b81 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -23,9 +23,6 @@ let rec list_findmap f = function let string_of_path path = Path.to_longident path |> Longident.flatten |> String.concat "." -let print_inst (path,_) = - Printf.eprintf "%s\n%!" (string_of_path path) - let papply path arg = Path.Papply (path, arg) (** [target] is the point from which a search starts *) @@ -540,11 +537,11 @@ end = struct end -let report_error exn = - try +let report_error _exn = () + (*try Location.report_exception Format.err_formatter exn with exn -> - Printf.eprintf "%s\n%!" (Printexc.to_string exn) + Printf.eprintf "%s\n%!" (Printexc.to_string exn)*) (* Make the search stack explicit. end @@ -659,7 +656,7 @@ end = struct Env.add_module target.target_id target.target_type env) (state.eq_table, state.env) sub_targets in - let accepting_eq = Ident.fold_all + (*let accepting_eq = Ident.fold_all (fun ident _ acc -> Ident.name ident :: acc) eq_table [] in @@ -669,7 +666,7 @@ end = struct Format.fprintf Format.err_formatter "\t%a = %a\n%!" Printtyp.path path Printtyp.type_expr ty) - !(state.eq_var); + !(state.eq_var);*) Ctype.with_equality_equations eq_table (fun () -> let subst = Subst.add_module target.target_id path Subst.identity in @@ -678,7 +675,7 @@ end = struct let tvl = List.map (Subst.type_expr subst) tvl in begin try Ctype.equal' env false tyl tvl with Ctype.Unify tls -> - Format.fprintf Format.err_formatter "Failed to instantiate:\n"; + (*Format.fprintf Format.err_formatter "Failed to instantiate:\n"; List.iter2 (fun t1 t2 -> Format.fprintf Format.err_formatter "\t%a = %a\n%!" Printtyp.type_expr t1 @@ -713,7 +710,7 @@ end = struct Format.fprintf Format.err_formatter "\n\t%a != %a \n%!" Printtyp.type_expr ty1 Printtyp.type_expr ty2) - tls; + tls;*) raise Not_found end; let _ : module_coercion = From 251e71ea380078107e590da9c32e523fb5883034 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Mon, 23 Jun 2014 19:06:47 +0100 Subject: [PATCH 388/494] WIP making HKT works with functor arguments --- typing/ctype.ml | 4 ++ typing/implicitsearch.ml | 88 +++++++++++++++++++++++----------------- typing/printtyp.ml | 5 +++ typing/typeimplicit.ml | 7 ++-- 4 files changed, 62 insertions(+), 42 deletions(-) diff --git a/typing/ctype.ml b/typing/ctype.ml index 55540b0a25..7cd510e7d8 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -3289,6 +3289,10 @@ let rec eqtype rename type_pairs subst env t1 t2 = | _ -> let t1' = expand_head_rigid env t1 in let t2' = expand_head_rigid env t2 in + (*Format.fprintf Format.err_formatter + "Equality test, expanding:\n\t%a -> %a\n\t%a -> %a\n" + !printtyp_expr t1 !printtyp_expr t1' + !printtyp_expr t2 !printtyp_expr t2';*) (* Expansion may have changed the representative of the types... *) let t1' = repr t1' and t2' = repr t2' in if t1' == t2' then () else diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index cf74183b81..f2e80e93f4 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -319,13 +319,14 @@ end when searching *) let remove_type_variables () = + let k = ref 0 in let variables = ref [] in let it_type_expr it ty = let ty = repr ty in match ty.desc with | Tvar name when ty.level < generic_level -> let name = match name with - | None -> "ex" + | None -> "ex" ^ string_of_int (incr k; !k) | Some name -> name in let ident = Ident.create name in @@ -537,18 +538,17 @@ end = struct end -let report_error _exn = () - (*try +let report_error exn = + try Location.report_exception Format.err_formatter exn with exn -> - Printf.eprintf "%s\n%!" (Printexc.to_string exn)*) + Format.fprintf Format.err_formatter + "%s\n%!" (Printexc.to_string exn) (* Make the search stack explicit. -end This helps resuming search (e.g to search for ambiguity), explaining search state or errors, etc. *) -(** TODO **) module Search : sig @@ -647,41 +647,42 @@ end = struct let step0 state (path, md) = state.eq_var := state.eq_initial; let target = state.target in - let sub_targets, candidate = find_implicit_parameters md in + let sub_targets, candidate_mty = find_implicit_parameters md in let new_eqns = ref [] in (* Generate coercion. if this succeeds this produce equations in new_eqns and eq_var *) let eq_table, env = List.fold_left - (fun (eq_table, env) {target_id} -> - Ident.add target_id new_eqns eq_table, - Env.add_module target.target_id target.target_type env) + (fun (eq_table, env) sub_target -> + Format.fprintf Format.err_formatter + "Binding %a with type %a\n%!" + Printtyp.ident sub_target.target_id + Printtyp.modtype sub_target.target_type; + Ident.add sub_target.target_id new_eqns eq_table, + Env.add_module sub_target.target_id sub_target.target_type env) (state.eq_table, state.env) sub_targets in - (*let accepting_eq = Ident.fold_all - (fun ident _ acc -> Ident.name ident :: acc) - eq_table [] - in - Format.fprintf Format.err_formatter "Starting from equations on %s:\n%!" - (String.concat ", " accepting_eq); - List.iter (fun (path,ty) -> - Format.fprintf Format.err_formatter "\t%a = %a\n%!" - Printtyp.path path - Printtyp.type_expr ty) - !(state.eq_var);*) Ctype.with_equality_equations eq_table (fun () -> - let subst = Subst.add_module target.target_id path Subst.identity in + (*let app_target path target = papply path (Path.Pident target.target_id) in + let app_path = List.fold_left app_target path sub_targets in*) + let env' = Env.add_module target.target_id candidate_mty env in + (*let env = Subst.add_module target.target_id app_path Subst.identity in*) let tyl, tvl = List.split target.target_hkt in - let tyl = List.map (Subst.type_expr subst) tyl in - let tvl = List.map (Subst.type_expr subst) tvl in - begin try Ctype.equal' env false tyl tvl + (*let tyl = List.map (Subst.type_expr subst) tyl in + let tvl = List.map (Subst.type_expr subst) tvl in*) + begin try Ctype.equal' env' true tyl tvl with Ctype.Unify tls -> - (*Format.fprintf Format.err_formatter "Failed to instantiate:\n"; + Format.fprintf Format.err_formatter "Failed to instantiate %s with constraints:\n" + (string_of_path path); List.iter2 (fun t1 t2 -> Format.fprintf Format.err_formatter "\t%a = %a\n%!" Printtyp.type_expr t1 Printtyp.type_expr t2) tyl tvl; - Format.fprintf Format.err_formatter "With equations on %s:\n%!" + let accepting_eq = Ident.fold_all + (fun ident _ acc -> Ident.name ident :: acc) + eq_table [] + in + Format.fprintf Format.err_formatter "Assuming the following equalities on %s:\n" (String.concat ", " accepting_eq); List.iter (fun (path,ty) -> Format.fprintf Format.err_formatter "\t%a = %a\n%!" @@ -690,31 +691,42 @@ end = struct !(state.eq_var); Format.fprintf Format.err_formatter "Because:\n%!"; List.iter (fun (ty1,ty2) -> + Format.fprintf Format.err_formatter "\t%a != %a\n%!" + Printtyp.type_expr ty1 + Printtyp.type_expr ty2; let rec find_aliases acc ty = match (repr ty).desc with | Tconstr (path,args,_) -> let acc = try - let _args,ty',_ = Env.find_type_expansion path env in + let _args,ty',_ = Env.find_type_expansion path env' in (ty,ty') :: acc - with Not_found -> (ty,ty) :: acc + with Not_found -> + try + let _ = Env.find_type path env' in + (ty,ty) :: acc + with Not_found -> + Format.fprintf Format.err_formatter + "Fatal error: %a not found.\n%!" + Printtyp.path path; + acc in List.fold_left find_aliases acc args | _ -> acc in let aliases = find_aliases [] ty1 in let aliases = find_aliases aliases ty2 in + ignore aliases; + (*Format.fprintf Format.err_formatter "Alias found: "; List.iter (fun (ty1,ty2) -> Format.fprintf Format.err_formatter " %a ~ %a;" Printtyp.type_expr ty1 Printtyp.type_expr ty2) - aliases; - Format.fprintf Format.err_formatter "\n\t%a != %a \n%!" - Printtyp.type_expr ty1 - Printtyp.type_expr ty2) - tls;*) + aliases;*) + Format.fprintf Format.err_formatter "\n%!" + ) tls; raise Not_found end; let _ : module_coercion = - Includemod.modtypes env candidate target.target_type + Includemod.modtypes env candidate_mty target.target_type in ()); let eqns = !new_eqns in @@ -851,8 +863,6 @@ let find_pending_instance inst = match alternative with | None -> Btype.backtrack snapshot; - (* Not needed, since Link.to_path should do the proper checks: - unify_equations env fvars (Search.equations result);*) Link.to_path inst (Solution.get solution); true | Some alternative -> @@ -861,7 +871,9 @@ let find_pending_instance inst = raise Typecore.(Error (loc, env, Ambiguous_implicit (inst,p1,p2))) with | Termination.Terminate -> - raise Typecore.(Error (loc, env, Termination_fail inst)) + raise Typecore.(Error (loc, env, Termination_fail inst)) + | Not_found -> + false (* Pack module at given path to match a given implicit instance and update the instance to point to this module. diff --git a/typing/printtyp.ml b/typing/printtyp.ml index db589f9b97..599c56e670 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -33,6 +33,11 @@ let rec longident ppf = function let unique_names = ref Ident.empty +module Ident = struct + include Ident + let name id = name id ^ "/" ^ string_of_int id.stamp +end + let ident_name id = try Ident.find_same id !unique_names with Not_found -> Ident.name id diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index bef8e50722..e94ac77e1a 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -49,16 +49,15 @@ let unlink env unlink_on = try Hashtbl.find path_table path with Not_found -> [] in - begin try + try let eq_args (ty',_tyvar') = TypeOps.equal ty ty' || Ctype.equal env false [ty] [ty'] in let _ty', tyvar' = List.find eq_args instance_list in link_type tyvar tyvar' with Not_found -> - Hashtbl.replace path_table path ((ty, tyvar) :: instance_list) - end; - register ty tyvar + Hashtbl.replace path_table path ((ty, tyvar) :: instance_list); + register ty tyvar in let it_type_expr it ty = From eb9e581f62e51a98ea0169c1b12323671c817ecd Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Tue, 24 Jun 2014 17:27:01 +0100 Subject: [PATCH 389/494] Parser: allow applicative module path in implicit argument [some_function (implicit Pair(Int)(Int))] is now allowed --- parsing/parser.mly | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parsing/parser.mly b/parsing/parser.mly index 5ba62b2cd1..d34f63df63 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -1519,7 +1519,7 @@ label_expr: { (Papp_labelled $1, $2) } | TILDE label_ident { (Papp_labelled (fst $2), snd $2) } - | LPAREN IMPLICIT mod_longident RPAREN + | LPAREN IMPLICIT mod_ext_longident RPAREN { let md = mkmod(Pmod_ident (mkrhs $3 3)) in (Papp_implicit, mkexp (Pexp_pack md)) } | QUESTION label_ident From 037a62de48082dd9aab75f184cd48da04e9119a7 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Tue, 24 Jun 2014 17:27:52 +0100 Subject: [PATCH 390/494] Ctype: allow parameters in equality equations --- typing/ctype.ml | 80 ++++++++++++++++++++++++++++++++---------------- typing/ctype.mli | 9 +++++- 2 files changed, 62 insertions(+), 27 deletions(-) diff --git a/typing/ctype.ml b/typing/ctype.ml index 7cd510e7d8..58c867a630 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -3241,8 +3241,15 @@ let matches env ty ty' = (* Equivalence between parameterized types *) (*********************************************) +type equality_equation = { + eq_lhs : type_expr; + eq_lhs_params : type_expr list; + eq_lhs_path : Path.t; + eq_rhs : type_expr; +} + let equality_equations - : (Path.t * type_expr) list ref Ident.tbl ref + : equality_equation list ref Ident.tbl ref = ref Ident.empty let with_equality_equations tbl f = @@ -3348,21 +3355,21 @@ let rec eqtype rename type_pairs subst env t1 t2 = | (Tunivar _, Tunivar _) -> unify_univar t1' t2' !univar_pairs - | (Tconstr (p1, [], _) as te1), (Tconstr (p2, [], _) as te2) + | Tconstr (p1, _, _), Tconstr (p2, _, _) when Ident.mem (Path.head p1) !equality_equations && Ident.mem (Path.head p2) !equality_equations -> if p1 < p2 then - eqtype_modulo_equation rename type_pairs subst env p1 te2 t1' t2' + eqtype_modulo_equation rename type_pairs subst env t1' t2' else - eqtype_modulo_equation rename type_pairs subst env p2 te1 t1' t2' + eqtype_modulo_equation rename type_pairs subst env t1' t2' - | Tconstr (p, [], _), te + | Tconstr (p, _, _), te when Ident.mem (Path.head p) !equality_equations -> - eqtype_modulo_equation rename type_pairs subst env p te t1' t2' + eqtype_modulo_equation rename type_pairs subst env t1' t2' - | te, Tconstr (p, [], _) + | te, Tconstr (p, _, _) when Ident.mem (Path.head p) !equality_equations -> - eqtype_modulo_equation rename type_pairs subst env p te t1' t2' + eqtype_modulo_equation rename type_pairs subst env t2' t1' | (_, _) -> raise (Unify []) @@ -3370,25 +3377,46 @@ let rec eqtype rename type_pairs subst env t1 t2 = with Unify trace -> raise (Unify ((t1, t2)::trace)) -and eqtype_modulo_equation rename type_pairs subst env path te t1 t2 = - let equations = Ident.find_same (Path.head path) !equality_equations in - begin try - let ty = List.assoc path !equations in - (* An equation already apply to this path *) - if t1.desc == te then - eqtype rename type_pairs subst env t1 ty - else - eqtype rename type_pairs subst env ty t2 - with Not_found -> - (* Not yet any equation on this path *) - let ty = - if t1.desc == te then - t1 - else - t2 +and eqtype_modulo_equation rename type_pairs subst env lhs rhs = + match lhs.desc with + (* Ground types *) + | Tconstr (path, [], _) -> + let equations = + try Ident.find_same (Path.head path) !equality_equations + with Not_found -> assert false in - equations := (path, ty) :: !equations - end + begin try + let same { eq_lhs_path ; eq_lhs_params } = + assert (eq_lhs_params = []); + eq_lhs_path = path + in + let ty = List.find same !equations in + (* An equation already apply to this path *) + eqtype rename type_pairs subst env ty.eq_rhs rhs + with Not_found -> + (* Not yet any equation on this path *) + let equation = { + eq_lhs = lhs; + eq_lhs_params = []; + eq_lhs_path = path; + eq_rhs = rhs; + } in + equations := equation :: !equations + end + (* Parametric types *) + | Tconstr (path, params, _) -> + let equations = + try Ident.find_same (Path.head path) !equality_equations + with Not_found -> assert false + in + let equation = { + eq_lhs = lhs; + eq_lhs_params = params; + eq_lhs_path = path; + eq_rhs = rhs; + } in + equations := equation :: !equations + | _ -> assert false and eqtype_list rename type_pairs subst env tl1 tl2 = if List.length tl1 <> List.length tl2 then diff --git a/typing/ctype.mli b/typing/ctype.mli index 8c5d8432ae..8d9be571c9 100644 --- a/typing/ctype.mli +++ b/typing/ctype.mli @@ -205,7 +205,14 @@ val match_class_types: ?trace:bool -> Env.t -> class_type -> class_type -> class_match_failure list (* Check if the first class type is more general than the second. *) -val with_equality_equations: (Path.t * type_expr) list ref Ident.tbl -> (unit -> 'a) -> 'a +type equality_equation = { + eq_lhs : type_expr; + eq_lhs_params : type_expr list; + eq_lhs_path : Path.t; + eq_rhs : type_expr; +} + +val with_equality_equations: equality_equation list ref Ident.tbl -> (unit -> 'a) -> 'a val equal: Env.t -> bool -> type_expr list -> type_expr list -> bool (* [equal env [x1...xn] tau [y1...yn] sigma] From cda95a73f6656e9f5de9aa105e54f124358c603a Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Tue, 24 Jun 2014 17:40:15 +0100 Subject: [PATCH 391/494] Implicitsearch: support HKT during search of functor arguments And fix bugs, introduce more printf-debugging... Termination checking doesn't make use of HKT at the moment. --- typing/implicitsearch.ml | 145 +++++++++++++++++++++------------------ 1 file changed, 79 insertions(+), 66 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index f2e80e93f4..a2f7967159 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -284,26 +284,33 @@ module Constraints = struct (* Apply a list of equations to a list of targets. Types referred to by paths *must* be abstract. *) let targets - : Env.t -> target list -> (Path.t * type_expr) list -> target list - = fun env targets constraints -> + : Env.t -> target list -> equality_equation list -> target list + = fun env targets eqns -> (* [env] is needed only to expand module type names *) - let register_constraint table (path, ty) = - let id, path = Path.flatten path in + let register_constraint table eqn = + let id, path = Path.flatten eqn.eq_lhs_path in let path = List.map fst path in - let cstrs = + let cstrs, hkt = try Ident.find_same id table - with Not_found -> [] + with Not_found -> [], [] in - Ident.add id ((path, ty) :: cstrs) table + let cstrs' = + if eqn.eq_lhs_params = [] then + ((path, eqn.eq_rhs) :: cstrs), hkt + else + cstrs, ((eqn.eq_lhs, eqn.eq_rhs) :: hkt) + in + Ident.add id cstrs' table in let constraint_table = - List.fold_left register_constraint Ident.empty constraints in + List.fold_left register_constraint Ident.empty eqns in let constraint_target (targets,env) target = let target = try - let cstrs = Ident.find_same target.target_id constraint_table in + let cstrs, hkt = Ident.find_same target.target_id constraint_table in let mty = apply_abstract env target.target_type cstrs in - {target with target_type = mty} + {target with target_type = mty; + target_hkt = hkt @ target.target_hkt} with Not_found -> target in @@ -425,7 +432,7 @@ module Termination : sig (* From a list of target and constraints applying on those targets, returns a termination criterion for each target *) val normalize_equations - : target list -> (Path.t * type_expr) list -> (target * t) list + : target list -> equality_equation list -> t list (* [check env t state] ensures that termination criterion for [t] is satisfied in [state] and returns the stronger state. @@ -498,9 +505,9 @@ end = struct (* List of targets *) (targets : target list) (* All path must refer to some target_id *) - (equations : (Path.t * type_expr) list) + (eqns : equality_equation list) (* List of equations applying to each target *) - : (target * t) list = + : t list = (* Map target_id to target_uid *) let table = List.fold_left (fun table {target_id; target_uid} -> @@ -509,31 +516,35 @@ end = struct in (* Add equations to target_id *) List.iter - (fun (path, eq) -> + (fun eqn -> try - let id, path = Path.flatten path in - let path = List.map fst path in + let id, path = Path.flatten eqn.eq_lhs_path in let _uid, eqns = Ident.find_same id table in - eqns := (path, eq) :: !eqns + if eqn.eq_lhs_params = [] then + let path = List.map fst path in + eqns := (path, eqn.eq_rhs) :: !eqns + else + (*TODO, handle higher-kinded equations in termination*) + () with Not_found -> assert false) - equations; + eqns; List.map (fun target -> try let uid, eqns = Ident.find_same target.target_id table in let eqns = List.sort (fun (a,_) (b,_) -> compare a b) !eqns in assert (wellformed_eqns eqns); - target, (uid, eqns) + (uid, eqns) with Not_found -> assert false) targets exception Terminate let check env (uid, eqns) stack = - let eqns' = - try Ident.find_same uid stack - with Not_found -> [] - in - if not (stronger env eqns eqns') then raise Terminate; + begin try + let eqns' = Ident.find_same uid stack in + if not (stronger env eqns eqns') then raise Terminate; + with Not_found -> () + end; Ident.add uid eqns stack end @@ -559,7 +570,7 @@ module Search : sig type result val get : result -> Path.t - val equations : result -> (Path.t * type_expr) list + val equations : result -> equality_equation list val all_candidates : query -> candidate list @@ -584,6 +595,8 @@ end = struct target: target; env: Env.t; + debug_path: Path.t option; + (* Equality snapshots. When resuming a search from this state, @@ -591,9 +604,9 @@ end = struct [eq_var] is referenced in [eq_table], so new equations valid in this branch of the search will be added to [eq_var]. *) - eq_initial: (Path.t * type_expr) list; - eq_var: (Path.t * type_expr) list ref; - eq_table: (Path.t * type_expr) list ref Ident.tbl; + eq_initial: equality_equation list; + eq_var: equality_equation list ref; + eq_table: equality_equation list ref Ident.tbl; } type query = @@ -636,6 +649,8 @@ end = struct target = target; env = env; + debug_path = None; + eq_initial = []; eq_var = eq_var; eq_table = eq_table; @@ -646,6 +661,14 @@ end = struct let step0 state (path, md) = state.eq_var := state.eq_initial; + begin match state.debug_path with + | Some path' -> + Format.fprintf Format.err_formatter + "%a (_) <- %a\n" Printtyp.path path' Printtyp.path path + | None -> + Format.fprintf Format.err_formatter + "_ <- %a\n" Printtyp.path path + end; let target = state.target in let sub_targets, candidate_mty = find_implicit_parameters md in let new_eqns = ref [] in @@ -660,16 +683,11 @@ end = struct Env.add_module sub_target.target_id sub_target.target_type env) (state.eq_table, state.env) sub_targets in + let env = Env.add_module target.target_id candidate_mty env in Ctype.with_equality_equations eq_table (fun () -> - (*let app_target path target = papply path (Path.Pident target.target_id) in - let app_path = List.fold_left app_target path sub_targets in*) - let env' = Env.add_module target.target_id candidate_mty env in - (*let env = Subst.add_module target.target_id app_path Subst.identity in*) let tyl, tvl = List.split target.target_hkt in - (*let tyl = List.map (Subst.type_expr subst) tyl in - let tvl = List.map (Subst.type_expr subst) tvl in*) - begin try Ctype.equal' env' true tyl tvl + begin try Ctype.equal' env true tyl tvl with Ctype.Unify tls -> Format.fprintf Format.err_formatter "Failed to instantiate %s with constraints:\n" (string_of_path path); @@ -684,43 +702,31 @@ end = struct in Format.fprintf Format.err_formatter "Assuming the following equalities on %s:\n" (String.concat ", " accepting_eq); - List.iter (fun (path,ty) -> + List.iter (fun {eq_lhs; eq_rhs} -> Format.fprintf Format.err_formatter "\t%a = %a\n%!" - Printtyp.path path - Printtyp.type_expr ty) + Printtyp.type_expr eq_lhs Printtyp.type_expr eq_rhs) !(state.eq_var); Format.fprintf Format.err_formatter "Because:\n%!"; List.iter (fun (ty1,ty2) -> Format.fprintf Format.err_formatter "\t%a != %a\n%!" Printtyp.type_expr ty1 Printtyp.type_expr ty2; - let rec find_aliases acc ty = match (repr ty).desc with + let rec check_expansion ty = match (repr ty).desc with | Tconstr (path,args,_) -> - let acc = try - let _args,ty',_ = Env.find_type_expansion path env' in - (ty,ty') :: acc - with Not_found -> - try - let _ = Env.find_type path env' in - (ty,ty) :: acc - with Not_found -> - Format.fprintf Format.err_formatter - "Fatal error: %a not found.\n%!" - Printtyp.path path; - acc - in - List.fold_left find_aliases acc args - | _ -> acc + begin try + ignore (Env.find_type_expansion path env : _ * _ *_) + with Not_found -> try + ignore (Env.find_type path env : _) + with Not_found -> + Format.fprintf Format.err_formatter + "Fatal error: %a not found.\n%!" + Printtyp.path path + end; + List.iter check_expansion args + | _ -> () in - let aliases = find_aliases [] ty1 in - let aliases = find_aliases aliases ty2 in - ignore aliases; - (*Format.fprintf Format.err_formatter "Alias found: "; - List.iter (fun (ty1,ty2) -> - Format.fprintf Format.err_formatter " %a ~ %a;" - Printtyp.type_expr ty1 - Printtyp.type_expr ty2) - aliases;*) + check_expansion ty1; + check_expansion ty2; Format.fprintf Format.err_formatter "\n%!" ) tls; raise Not_found @@ -729,14 +735,17 @@ end = struct Includemod.modtypes env candidate_mty target.target_type in ()); + let eqns = !new_eqns in (* Constraints target types *) let sub_targets = Constraints.targets state.env sub_targets eqns in (* Add termination criteria *) - let sub_targets = Termination.normalize_equations sub_targets eqns in + let sub_criteria = Termination.normalize_equations sub_targets eqns in + + let sub_targets = List.combine sub_targets sub_criteria in (* Keep new equations potentially added to top variables *) - let state = {state with eq_initial = !(state.eq_var)} in + let state = {state with eq_initial = !(state.eq_var); debug_path = Some path} in match sub_targets with | [] -> `Done {state with payload = path} @@ -765,12 +774,16 @@ end = struct | [] -> let state = {partial with payload = path; + debug_path = Some path; (* We get the equations from the argument but keep termination state from the parent *) eq_initial = arg.eq_initial} in `Done state | (target, crit) :: sub_targets -> - let partial = {partial with payload = (path, sub_targets)} in + let partial = + {partial with payload = (path, sub_targets); + debug_path = Some path } + in let md = Env.find_module path arg.env in (* The original module declaration might be implicit, we want to avoid rebinding implicit *) From 4a4f8d06a3acf32191dfbc820f2dd5ba0ae0bb74 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 4 Jul 2014 17:25:01 +0100 Subject: [PATCH 392/494] WIP fixing type escapes --- examples.numbers | 1 + examples.stringify | 6 ++-- examples.stringify2 | 10 +++--- implicit.fail | 20 ++++++++++++ typing/ctype.ml | 74 ++++++++++++++++++++++++++++++++++----------- typing/env.ml | 33 +++++++++----------- typing/env.mli | 4 +-- typing/typecore.ml | 19 +++++++----- 8 files changed, 113 insertions(+), 54 deletions(-) create mode 100644 implicit.fail diff --git a/examples.numbers b/examples.numbers index 8cdc2db122..be0bcc9123 100644 --- a/examples.numbers +++ b/examples.numbers @@ -89,3 +89,4 @@ open ORD;; assert ( ~~2 / ~~3 = 0 && ~~2 / ~~3 = 0.666666666666666666666666666666666666);; let x = 1 + one + one;; +let () = print_int x;; diff --git a/examples.stringify b/examples.stringify index f9c27e030c..56a6f80321 100644 --- a/examples.stringify +++ b/examples.stringify @@ -17,10 +17,10 @@ let f (implicit M : STRINGIFY) (x : M.t) = to_string x;; (* Global instance *) implicit module S = struct type t = string let to_string x = x end;; -to_string "4";; +print_endline (to_string "4");; -f "4";; +print_endline (f "4");; -g 4;; +print_endline (g 4);; let x = assert (to_string "4" = f "4" && to_string "4" = g 4) in x;; diff --git a/examples.stringify2 b/examples.stringify2 index 85b1925790..2896f22633 100644 --- a/examples.stringify2 +++ b/examples.stringify2 @@ -21,8 +21,8 @@ implicit functor StringifyPair (A : STRINGIFY) (B : STRINGIFY) = struct let to_string (a,b) = "(" ^ A.to_string a ^ "," ^ B.to_string b ^ ")" end;; -to_string "a";; -to_string ["a";"b";"c"];; -to_string [1;2;3];; -to_string (1,"lol");; -to_string [1, "a";2, "b";3, "c"];; +print_endline (to_string "a");; +print_endline (to_string ["a";"b";"c"]);; +print_endline (to_string [1;2;3]);; +print_endline (to_string (1,"lol"));; +print_endline (to_string [1, "a";2, "b";3, "c"]);; diff --git a/implicit.fail b/implicit.fail new file mode 100644 index 0000000000..926d2918c6 --- /dev/null +++ b/implicit.fail @@ -0,0 +1,20 @@ + +module type T = sig type t val x : t end;; + +(* BAD *) +let f () = let x = ref [] in let g (implicit M : T) () = x := [M.x] in ();; + +(* BAD *) +let f (x : 'a) (implicit M : T) = (x : M.t); ();; + +(* OK *) +let f (implicit M : T) (x : M.t) y = (y : M.t); ();; + +(* BAD *) +let rec f (implicit M : T) (x : M.t) y = (y : M.t); ();; + +(* OK *) +let f (g : (implicit M : T) -> M.t -> unit) () = ();; + +(* OK *) +let f (implicit M : T) (implicit N : T) = N.x;; diff --git a/typing/ctype.ml b/typing/ctype.ml index 58c867a630..e8d7341417 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -740,14 +740,19 @@ let printtyp_expr (without this constraint, the type system would actually be unsound.) *) let get_level env p = - try - match (Env.find_type p env).type_newtype_level with - | None -> Path.binding_time p - | Some (x, _) -> x - with - | Not_found -> - (* no newtypes in predef *) - Path.binding_time p + let level = Env.implicit_level p env in + assert (level <> -1); + if level <> generic_level then + level + else + try + match (Env.find_type p env).type_newtype_level with + | None -> Path.binding_time p + | Some (x, _) -> x + with + | Not_found -> + (* no newtypes in predef *) + Path.binding_time p let rec normalize_package_path env p = let t = @@ -776,8 +781,7 @@ let rec update_level env level ty = with Cannot_expand -> (* +++ Levels should be restored... *) (* Format.printf "update_level: %i < %i@." level (get_level env p); *) - if (level < get_level env p) && not (Env.is_implicit_arg p env) then - raise (Unify [(ty, newvar2 level)]); + if (level < get_level env p) then raise (Unify [(ty, newvar2 level)]); iter_type_expr (update_level env level) ty end | Tpackage (p, nl, tl) when level < get_level env p -> @@ -806,7 +810,7 @@ let rec update_level env level ty = | Tarrow (Tarr_implicit id, _, _, _) -> set_level ty level; (* XXX what about abbreviations in Tconstr ? *) - iter_type_expr (update_level (Env.mark_implicit_arg id env) level) ty + iter_type_expr (update_level (Env.set_implicit_level id level env) level) ty | _ -> set_level ty level; @@ -1812,6 +1816,33 @@ let occur_univar env ty = with exn -> unmark_type ty; raise exn +let occur_implicit env ty = + let visited = ref TypeMap.empty in + let rec occur_rec bound ty = + let ty = repr ty in + if ty.level >= lowest_level && + if TypeSet.is_empty bound then + (ty.level <- pivot_level - ty.level; true) + else try + let bound' = TypeMap.find ty !visited in + if TypeSet.exists (fun x -> not (TypeSet.mem x bound)) bound' then + (visited := TypeMap.add ty (TypeSet.inter bound bound') !visited; + true) + else false + with Not_found -> + visited := TypeMap.add ty bound !visited; + true + then + match ty.desc with + | Tconstr (p, _, _) when Env.implicit_level p env = -1 -> + raise (Unify [ty, newgenvar ()]) + | _ -> iter_type_expr (occur_rec bound) ty + in + try + occur_rec TypeSet.empty ty; unmark_type ty + with exn -> + unmark_type ty; raise exn + (* Grouping univars by families according to their binders *) let add_univars = List.fold_left (fun s (t,_) -> TypeSet.add (repr t) s) @@ -2460,10 +2491,12 @@ and unify3 env t1 t1' t2 t2' = | (Tvar _, _) -> occur !env t1' t2; occur_univar !env t2; + occur_implicit !env t2; link_type t1' t2; | (_, Tvar _) -> occur !env t2' t1; occur_univar !env t1; + occur_implicit !env t2; link_type t2' t1; | (Tfield _, Tfield _) -> (* special case for GADTs *) unify_fields env t1' t2' @@ -2480,12 +2513,15 @@ and unify3 env t1 t1' t2 t2' = (Tarrow (Tarr_implicit id1, t1, u1, c1), Tarrow (Tarr_implicit id2, t2, u2, c2)) -> unify env t1 t2; - let env' = !env in - let mty = modtype_of_tpackage env' t1 in - let env' = Env.add_module id1 mty env' in - let env' = Env.add_module id2 (Mty_alias (Path.Pident id1)) env' in - env := env'; + let mty = modtype_of_tpackage !env t1 in + env := + Env.set_implicit_level id1 (-1) + (Env.set_implicit_level id2 (-1) + (Env.add_module id1 mty !env)); + let subst = Subst.add_module id2 (Path.Pident id1) Subst.identity in + let u2 = Subst.type_expr subst u2 in unify env u1 u2; + t2'.desc <- Tarrow (Tarr_implicit id1, t2, u2, c2); begin match commu_repr c1, commu_repr c2 with Clink r, c2 -> set_commu r c2 | c1, Clink r -> set_commu r c1 @@ -3322,7 +3358,8 @@ let rec eqtype rename type_pairs subst env t1 t2 = eqtype rename type_pairs subst env t1 t2; let mty = modtype_of_tpackage env t1 in let env = Env.add_module id1 mty env in - let env = Env.add_module id2 (Mty_alias (Path.Pident id1)) env in + let s = Subst.add_module id2 (Path.Pident id1) Subst.identity in + let u2 = Subst.type_expr s u2 in eqtype rename type_pairs subst env u1 u2; | (Tarrow (l1, t1, u1, _), Tarrow (l2, t2, u2, _)) when classic_arrows_are_compatible l1 l2 -> @@ -4085,7 +4122,8 @@ let rec subtype_rec env trace t1 t2 cstrs = let cstrs = subtype_rec env ((t2, t1)::trace) t2 t1 cstrs in let mty = modtype_of_tpackage env t1 in let env = Env.add_module id1 mty env in - let env = Env.add_module id2 (Mty_alias (Path.Pident id1)) env in + let subst = Subst.add_module id2 (Path.Pident id1) Subst.identity in + let u2 = Subst.type_expr subst u2 in subtype_rec env ((u1, u2)::trace) u1 u2 cstrs | (Tarrow(l1, t1, u1, _), Tarrow(l2, t2, u2, _)) when classic_arrows_are_compatible l1 l2 -> diff --git a/typing/env.ml b/typing/env.ml index e39109f930..7ef93ed02f 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -183,7 +183,7 @@ type t = { classes: (Path.t * class_declaration) EnvTbl.t; cltypes: (Path.t * class_type_declaration) EnvTbl.t; functor_args: unit Ident.tbl; - implicit_args: unit Ident.tbl; + implicit_levels: int Ident.tbl; implicit_instances: (Path.t * module_declaration) list; summary: summary; local_constraints: bool; @@ -233,7 +233,7 @@ let empty = { summary = Env_empty; local_constraints = false; gadt_instances = []; flags = 0; functor_args = Ident.empty; - implicit_args = Ident.empty; + implicit_levels = Ident.empty; implicit_instances = []; } @@ -646,14 +646,14 @@ let rec is_functor_arg path env = | Pdot (p, s, _) -> is_functor_arg p env | Papply _ -> true -let rec is_implicit_arg path env = +let rec implicit_level path env = match path with Pident id -> - begin try Ident.find_same id env.implicit_args; true - with Not_found -> false + begin try Ident.find_same id env.implicit_levels + with Not_found -> generic_level end - | Pdot (p, s, _) -> is_implicit_arg p env - | Papply _ -> true + | Pdot (p, s, _) -> implicit_level p env + | Papply _ -> generic_level let implicit_instances env = env.implicit_instances @@ -1518,22 +1518,17 @@ let _ = (* Insertion of bindings by identifier *) -let mark_implicit_arg id env = - {env with implicit_args = Ident.add id () env.implicit_args} +let set_implicit_level id level env = + {env with implicit_levels = Ident.add id level env.implicit_levels} -let add_functor_arg ?(arg = false) ~implicit_ id env = - match arg, implicit_ with - | false, _ -> env - | true, Nonimplicit -> +let add_functor_arg ?(arg = false) id env = + match arg with + | false -> env + | true -> (* Nonimplicit are normal functor argument *) {env with functor_args = Ident.add id () env.functor_args; summary = Env_functor_arg (env.summary, id)} - | true, Implicit _ -> - (* Implicit args are bound in a function, and are not functors! *) - {env with - implicit_args = Ident.add id () env.implicit_args; - summary = Env_functor_arg (env.summary, id)} let add_value ?check id desc env = store_value None ?check id (Pident id) desc env env @@ -1551,7 +1546,7 @@ and add_module_declaration ?arg id md env = | _ ->*) Pident id in let env = store_module None id path md env env in - add_functor_arg ?arg ~implicit_:md.md_implicit id env + add_functor_arg ?arg id env and add_modtype id info env = store_modtype None id (Pident id) info env env diff --git a/typing/env.mli b/typing/env.mli index f216d96704..61feb629ec 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -64,8 +64,8 @@ val find_type_expansion_opt: of the compiler's type-based optimisations. *) val find_modtype_expansion: Path.t -> t -> module_type val is_functor_arg: Path.t -> t -> bool -val is_implicit_arg: Path.t -> t -> bool -val mark_implicit_arg: Ident.t -> t -> t +val implicit_level: Path.t -> t -> int +val set_implicit_level: Ident.t -> int -> t -> t val normalize_path: Location.t option -> t -> Path.t -> Path.t (* Normalize the path to a concrete value or module. diff --git a/typing/typecore.ml b/typing/typecore.ml index 9c481728db..bce930eb98 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -2767,7 +2767,7 @@ and type_function ?in_function loc attrs env arr ty_expected caselist = raise(Error(loc_fun, env, Too_many_arguments (in_function <> None, ty_fun))) in - let ty_arg, is_optional = + let ty_arg, is_optional, is_implicit = match arr with | Tarr_optional _ -> let tv = newvar() in @@ -2775,17 +2775,21 @@ and type_function ?in_function loc attrs env arr ty_expected caselist = try unify env ty_arg (type_option tv) with Unify _ -> assert false end; - type_option tv, true - | _ -> ty_arg, false + type_option tv, true, false + | Tarr_implicit _ -> ty_arg, false, true + | _ -> ty_arg, false, false in if separate then begin end_def (); generalize_structure ty_arg; generalize_structure ty_res end; + let level = get_current_level () in + if is_implicit then begin_def (); let cases, partial = - type_cases ~in_function:(loc_fun,ty_fun) ~arr env ty_arg ty_res + type_cases ~in_function:(loc_fun,ty_fun) ~arr:(arr,level) env ty_arg ty_res true loc caselist in + if is_implicit then end_def (); let not_function ty = let ls, tvar = list_labels env ty in ls = [] && not tvar @@ -3631,8 +3635,8 @@ and type_cases ?in_function ?arr env ty_arg ty_res partial_flag loc caselist = Predef.type_bool) in let exp = match arr with - | Some (Tarr_implicit id) -> - type_implicit_arg id ?in_function ext_env sexp ty_res' + | Some (Tarr_implicit id, level) -> + type_implicit_arg id level ?in_function ext_env sexp ty_res' | _ -> type_expect ?in_function ext_env sexp ty_res' in { @@ -3665,7 +3669,7 @@ and type_cases ?in_function ?arr env ty_arg ty_res partial_flag loc caselist = end; cases, partial -and type_implicit_arg id ?in_function env sbody ty_res = +and type_implicit_arg id level ?in_function env sbody ty_res = let ty = newvar() in (* remember original level *) begin_def (); @@ -3678,6 +3682,7 @@ and type_implicit_arg id ?in_function env sbody ty_res = in let modl = !type_module env smodl in let new_env = Env.add_module ~arg:true ~implicit_:(Implicit 0) id modl.mod_type env in + let new_env = Env.set_implicit_level id level new_env in Ctype.init_def(Ident.current_time()); Typetexp.widen context; let body = type_expect ?in_function new_env sbody ty_res in From 7937eb135f77324de4e1e67b85f24b587c2ba986 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Thu, 10 Jul 2014 18:23:33 +0100 Subject: [PATCH 393/494] WIP --- typing/ctype.ml | 109 ++-- typing/env.ml | 46 +- typing/env.mli | 3 + typing/typecore.ml | 1364 ++++++++++++++++++++++++-------------------- 4 files changed, 826 insertions(+), 696 deletions(-) diff --git a/typing/ctype.ml b/typing/ctype.ml index e8d7341417..a19f58ef09 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -740,19 +740,15 @@ let printtyp_expr (without this constraint, the type system would actually be unsound.) *) let get_level env p = - let level = Env.implicit_level p env in - assert (level <> -1); - if level <> generic_level then - level - else - try - match (Env.find_type p env).type_newtype_level with - | None -> Path.binding_time p - | Some (x, _) -> x - with - | Not_found -> - (* no newtypes in predef *) - Path.binding_time p + try Env.implicit_level p env + with Not_found -> + try + match (Env.find_type p env).type_newtype_level with + | None -> Path.binding_time p + | Some (x, _) -> x + with Not_found -> + (* no newtypes in predef *) + Path.binding_time p let rec normalize_package_path env p = let t = @@ -781,7 +777,8 @@ let rec update_level env level ty = with Cannot_expand -> (* +++ Levels should be restored... *) (* Format.printf "update_level: %i < %i@." level (get_level env p); *) - if (level < get_level env p) then raise (Unify [(ty, newvar2 level)]); + if level < get_level env p then + raise (Unify [(ty, newvar2 level)]); iter_type_expr (update_level env level) ty end | Tpackage (p, nl, tl) when level < get_level env p -> @@ -1774,7 +1771,7 @@ let rec unify_univar t1 t2 = function (* Test the occurence of free univars in a type *) (* that's way too expansive. Must do some kind of cacheing *) -let occur_univar env ty = +let occur_univar_and_implicit env ty = let visited = ref TypeMap.empty in let rec occur_rec bound ty = let ty = repr ty in @@ -1797,6 +1794,8 @@ let occur_univar env ty = | Tpoly (ty, tyl) -> let bound = List.fold_right TypeSet.add (List.map repr tyl) bound in occur_rec bound ty + | Tconstr (p, _, _) when Env.implicit_cannot_occur p env -> + raise (Unify []) | Tconstr (_, [], _) -> () | Tconstr (p, tl, _) -> begin try @@ -1816,33 +1815,6 @@ let occur_univar env ty = with exn -> unmark_type ty; raise exn -let occur_implicit env ty = - let visited = ref TypeMap.empty in - let rec occur_rec bound ty = - let ty = repr ty in - if ty.level >= lowest_level && - if TypeSet.is_empty bound then - (ty.level <- pivot_level - ty.level; true) - else try - let bound' = TypeMap.find ty !visited in - if TypeSet.exists (fun x -> not (TypeSet.mem x bound)) bound' then - (visited := TypeMap.add ty (TypeSet.inter bound bound') !visited; - true) - else false - with Not_found -> - visited := TypeMap.add ty bound !visited; - true - then - match ty.desc with - | Tconstr (p, _, _) when Env.implicit_level p env = -1 -> - raise (Unify [ty, newgenvar ()]) - | _ -> iter_type_expr (occur_rec bound) ty - in - try - occur_rec TypeSet.empty ty; unmark_type ty - with exn -> - unmark_type ty; raise exn - (* Grouping univars by families according to their binders *) let add_univars = List.fold_left (fun s (t,_) -> TypeSet.add (repr t) s) @@ -2115,8 +2087,8 @@ let rec mcomp type_pairs env t1 t2 = mcomp type_pairs env t1 t2; let mty = modtype_of_tpackage env t1 in let env = Env.add_module id1 mty env in - let env = Env.add_module id2 (Mty_alias (Path.Pident id1)) env in - mcomp type_pairs env u1 u2; + let subst = Subst.add_module id2 (Path.Pident id1) Subst.identity in + mcomp type_pairs env u1 (Subst.type_expr subst u2); | (Tarrow (l1, t1, u1, _), Tarrow (l2, t2, u2, _)) when arrows_are_compatible l1 l2 -> mcomp type_pairs env t1 t2; @@ -2382,6 +2354,9 @@ let unify_eq env t1 t2 = with Not_found -> false let rec unify (env:Env.t ref) t1 t2 = + Format.fprintf Format.err_formatter + "unify %a and %a\n\n%!" + !printtyp_expr t1 !printtyp_expr t2; (* First step: special cases (optimizations) *) if t1 == t2 then () else let t1 = repr t1 in @@ -2398,12 +2373,12 @@ let rec unify (env:Env.t ref) t1 t2 = unify2 env t1 t2 | (Tvar _, _) -> occur !env t1 t2; - occur_univar !env t2; + occur_univar_and_implicit !env t2; link_type t1 t2; update_level !env t1.level t2 | (_, Tvar _) -> occur !env t2 t1; - occur_univar !env t1; + occur_univar_and_implicit !env t1; link_type t2 t1; update_level !env t2.level t1 | (Tunivar _, Tunivar _) -> @@ -2490,13 +2465,11 @@ and unify3 env t1 t1' t2 t2' = link_type t1' t2' | (Tvar _, _) -> occur !env t1' t2; - occur_univar !env t2; - occur_implicit !env t2; + occur_univar_and_implicit !env t2; link_type t1' t2; | (_, Tvar _) -> occur !env t2' t1; - occur_univar !env t1; - occur_implicit !env t2; + occur_univar_and_implicit !env t1; link_type t2' t1; | (Tfield _, Tfield _) -> (* special case for GADTs *) unify_fields env t1' t2' @@ -2514,10 +2487,10 @@ and unify3 env t1 t1' t2 t2' = Tarrow (Tarr_implicit id2, t2, u2, c2)) -> unify env t1 t2; let mty = modtype_of_tpackage !env t1 in - env := - Env.set_implicit_level id1 (-1) - (Env.set_implicit_level id2 (-1) - (Env.add_module id1 mty !env)); + let env' = Env.add_module id1 mty !env in + let env' = Env.forbid_implicit_occur id1 env' in + let env' = Env.forbid_implicit_occur id2 env' in + env := env'; let subst = Subst.add_module id2 (Path.Pident id1) Subst.identity in let u2 = Subst.type_expr subst u2 in unify env u1 u2; @@ -2931,9 +2904,23 @@ let filter_arrow env t l = && l = Tarr_simple && arrows_are_compatible l l' -> (t1, t2) - | Tarrow(Tarr_implicit id1, t1, t2, _), Tarr_implicit id2 -> - let subst = Subst.add_module id1 (Path.Pident id2) Subst.identity in - (t1, Subst.type_expr subst t2) + | _ -> + raise (Unify []) + +let filter_arrow env t l = + let t = expand_head_trace env t in + match t.desc, l with + Tvar _, _ -> + let lv = t.level in + let t1 = newvar2 lv and t2 = newvar2 lv in + let t' = newty2 lv (Tarrow (l, t1, t2, Cok)) in + link_type t t'; + (t1, t2) + | Tarrow(l', t1, t2, _), _ + when l = l' || !Clflags.classic + && l = Tarr_simple + && arrows_are_compatible l l' -> + (t1, t2) | _ -> raise (Unify []) @@ -3019,7 +3006,7 @@ let moregen_occur env level ty = unmark_type ty; raise (Unify []) end; (* also check for free univars *) - occur_univar env ty; + occur_univar_and_implicit env ty; update_level env level ty let may_instantiate inst_nongen t1 = @@ -3027,6 +3014,9 @@ let may_instantiate inst_nongen t1 = else t1.level = generic_level let rec moregen inst_nongen type_pairs subst env t1 t2 = + Format.fprintf Format.err_formatter + "moregen %a and %a\n\n%!" + !printtyp_expr t1 !printtyp_expr t2; if t1 == t2 then () else let t1 = repr t1 in let t2 = repr t2 in @@ -3312,6 +3302,9 @@ let normalize_subst subst = then subst := List.map (fun (t1,t2) -> repr t1, repr t2) !subst let rec eqtype rename type_pairs subst env t1 t2 = + Format.fprintf Format.err_formatter + "eqtype %a and %a\n\n%!" + !printtyp_expr t1 !printtyp_expr t2; if t1 == t2 then () else let t1 = repr t1 in let t2 = repr t2 in diff --git a/typing/env.ml b/typing/env.ml index 7ef93ed02f..92636f2545 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -169,6 +169,11 @@ module EnvTbl = type type_descriptions = constructor_description list * label_description list +type implicit_flag = { + implicit_level: int option; + implicit_cannot_occur: bool; +} + let in_signature_flag = 0x01 let implicit_coercion_flag = 0x02 @@ -183,12 +188,12 @@ type t = { classes: (Path.t * class_declaration) EnvTbl.t; cltypes: (Path.t * class_type_declaration) EnvTbl.t; functor_args: unit Ident.tbl; - implicit_levels: int Ident.tbl; implicit_instances: (Path.t * module_declaration) list; summary: summary; local_constraints: bool; gadt_instances: (int * TypeSet.t ref) list; flags: int; + implicit_flags: implicit_flag Ident.tbl; } and module_components = @@ -233,7 +238,7 @@ let empty = { summary = Env_empty; local_constraints = false; gadt_instances = []; flags = 0; functor_args = Ident.empty; - implicit_levels = Ident.empty; + implicit_flags = Ident.empty; implicit_instances = []; } @@ -649,11 +654,25 @@ let rec is_functor_arg path env = let rec implicit_level path env = match path with Pident id -> - begin try Ident.find_same id env.implicit_levels - with Not_found -> generic_level - end + begin match Ident.find_same id env.implicit_flags with + | { implicit_level = Some level } -> + Format.eprintf "found level %d for %s\n\n%!" level (Ident.name id); + level + | _ -> raise Not_found + end | Pdot (p, s, _) -> implicit_level p env - | Papply _ -> generic_level + | Papply _ -> raise Not_found + +let rec implicit_cannot_occur path env = + match path with + Pident id -> + begin try + let flag = Ident.find_same id env.implicit_flags in + flag.implicit_cannot_occur + with Not_found -> false + end + | Pdot (p, s, _) -> implicit_cannot_occur p env + | Papply _ -> raise Not_found let implicit_instances env = env.implicit_instances @@ -1519,7 +1538,20 @@ let _ = (* Insertion of bindings by identifier *) let set_implicit_level id level env = - {env with implicit_levels = Ident.add id level env.implicit_levels} + let implicit_level = Some level in + let implicit_flag = + try {(Ident.find_same id env.implicit_flags) with implicit_level} + with Not_found -> {implicit_cannot_occur = false; implicit_level} + in + {env with implicit_flags = Ident.add id implicit_flag env.implicit_flags} + +let forbid_implicit_occur id env = + let implicit_cannot_occur = true in + let implicit_flag = + try {(Ident.find_same id env.implicit_flags) with implicit_cannot_occur} + with Not_found -> {implicit_level = None; implicit_cannot_occur} + in + {env with implicit_flags = Ident.add id implicit_flag env.implicit_flags} let add_functor_arg ?(arg = false) id env = match arg with diff --git a/typing/env.mli b/typing/env.mli index 61feb629ec..8960c91938 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -64,8 +64,11 @@ val find_type_expansion_opt: of the compiler's type-based optimisations. *) val find_modtype_expansion: Path.t -> t -> module_type val is_functor_arg: Path.t -> t -> bool + val implicit_level: Path.t -> t -> int val set_implicit_level: Ident.t -> int -> t -> t +val implicit_cannot_occur: Path.t -> t -> bool +val forbid_implicit_occur: Ident.t -> t -> t val normalize_path: Location.t option -> t -> Path.t -> Path.t (* Normalize the path to a concrete value or module. diff --git a/typing/typecore.ml b/typing/typecore.ml index bce930eb98..fb950e2fe2 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1515,13 +1515,17 @@ let rec type_approx env sexp = | Pexp_fun (Parr_optional s, _, _, e) -> newty (Tarrow(Tarr_optional s, type_option (newvar ()), type_approx env e, Cok)) - | Pexp_fun (Parr_implicit s, _, _, e) -> - let id, env = + (* Traversing implicit in type_approx might be a bad idea: the type variable + created here has a level lower than the one in which the implicit will be + bound, and might cause type escape errors. + FIXME *) + | Pexp_fun (Parr_implicit s, _, _, e) -> newvar () + (*let id, env = Env.enter_module ~arg:true ~implicit_:(Implicit 0) s (Mty_signature []) env in newty (Tarrow(Tarr_implicit id, newvar (), - type_approx env e, Cok)) + type_approx env e, Cok))*) | Pexp_fun (p, _, _, e) -> newty (Tarrow(tarr_of_parr p, newvar (), type_approx env e, Cok)) | Pexp_function ({pc_rhs=e}::_) -> @@ -1923,56 +1927,58 @@ and type_expect_ ?in_function env sexp ty_expected = [Vb.mk spat smatch] sexp) in type_expect ?in_function env sfun ty_expected + | Pexp_fun (Parr_implicit id, None, spat, sexp) -> + failwith "TODO" (* TODO: keep attributes, call type_function directly *) | Pexp_fun (arr, None, spat, sexp) -> type_function ?in_function loc sexp.pexp_attributes env - arr ty_expected [{pc_lhs=spat; pc_guard=None; pc_rhs=sexp}] + ty_expected arr [{pc_lhs=spat; pc_guard=None; pc_rhs=sexp}] | Pexp_function caselist -> - type_function ?in_function loc sexp.pexp_attributes env - Parr_simple ty_expected caselist + type_function ?in_function loc sexp.pexp_attributes env + ty_expected Parr_simple caselist | Pexp_apply(sfunct, sargs) -> - if sargs = [] then - Syntaxerr.ill_formed_ast loc "Function application with no argument."; - begin_def (); (* one more level for non-returning functions *) - if !Clflags.principal then begin_def (); - let funct = type_exp env sfunct in - if !Clflags.principal then begin - end_def (); - generalize_structure funct.exp_type - end; - let rec lower_args seen ty_fun = - let ty = expand_head env ty_fun in - if List.memq ty seen then () else + if sargs = [] then + Syntaxerr.ill_formed_ast loc "Function application with no argument."; + begin_def (); (* one more level for non-returning functions *) + if !Clflags.principal then begin_def (); + let funct = type_exp env sfunct in + if !Clflags.principal then begin + end_def (); + generalize_structure funct.exp_type + end; + let rec lower_args seen ty_fun = + let ty = expand_head env ty_fun in + if List.memq ty seen then () else match ty.desc with Tarrow (l, ty_arg, ty_fun, com) -> - (try unify_var env (newvar()) ty_arg with Unify _ -> assert false); - lower_args (ty::seen) ty_fun + (try unify_var env (newvar()) ty_arg with Unify _ -> assert false); + lower_args (ty::seen) ty_fun | _ -> () - in - let ty = instance env funct.exp_type in - end_def (); - wrap_trace_gadt_instances env (lower_args []) ty; - begin_def (); - let pending = Typeimplicit.extract_pending_implicits funct in - let (args, ty_res) = type_application env funct pending sargs in - let args = List.map - (fun (arr,expo) -> make_argument (tapp_of_tarr arr, expo)) - args - in - end_def (); - unify_var env (newvar()) funct.exp_type; - (* args can be empty if all arguments specified were of the form - (implicit M) *) - begin match args with - | [] -> funct - | args -> - rue { - exp_desc = Texp_apply(funct, args); - exp_loc = loc; exp_extra = []; - exp_type = ty_res; - exp_attributes = sexp.pexp_attributes; - exp_env = env } - end + in + let ty = instance env funct.exp_type in + end_def (); + wrap_trace_gadt_instances env (lower_args []) ty; + begin_def (); + let pending = Typeimplicit.extract_pending_implicits funct in + let (args, ty_res) = type_application env funct pending sargs in + let args = List.map + (fun (arr,expo) -> make_argument (tapp_of_tarr arr, expo)) + args + in + end_def (); + unify_var env (newvar()) funct.exp_type; + (* args can be empty if all arguments specified were of the form + (implicit M) *) + begin match args with + | [] -> funct + | args -> + rue { + exp_desc = Texp_apply(funct, args); + exp_loc = loc; exp_extra = []; + exp_type = ty_res; + exp_attributes = sexp.pexp_attributes; + exp_env = env } + end | Pexp_match(sarg, caselist) -> begin_def (); let arg = type_exp env sarg in @@ -2003,15 +2009,15 @@ and type_expect_ ?in_function env sexp ty_expected = exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_try(sbody, caselist) -> - let body = type_expect env sbody ty_expected in - let cases, _ = - type_cases env Predef.type_exn ty_expected false loc caselist in - re { - exp_desc = Texp_try(body, cases); - exp_loc = loc; exp_extra = []; - exp_type = body.exp_type; - exp_attributes = sexp.pexp_attributes; - exp_env = env } + let body = type_expect env sbody ty_expected in + let cases, _ = + type_cases env Predef.type_exn ty_expected false loc caselist in + re { + exp_desc = Texp_try(body, cases); + exp_loc = loc; exp_extra = []; + exp_type = body.exp_type; + exp_attributes = sexp.pexp_attributes; + exp_env = env } | Pexp_tuple sexpl -> if List.length sexpl < 2 then Syntaxerr.ill_formed_ast loc "Tuples must have at least 2 components."; @@ -2029,40 +2035,24 @@ and type_expect_ ?in_function env sexp ty_expected = exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_construct(lid, sarg) -> - type_construct env loc lid sarg ty_expected sexp.pexp_attributes + type_construct env loc lid sarg ty_expected sexp.pexp_attributes | Pexp_variant(l, sarg) -> - (* Keep sharing *) - let ty_expected0 = instance env ty_expected in - begin try match - sarg, expand_head env ty_expected, expand_head env ty_expected0 with - | Some sarg, {desc = Tvariant row}, {desc = Tvariant row0} -> - let row = row_repr row in - begin match row_field_repr (List.assoc l row.row_fields), - row_field_repr (List.assoc l row0.row_fields) with - Rpresent (Some ty), Rpresent (Some ty0) -> - let arg = type_argument env sarg ty ty0 in - re { exp_desc = Texp_variant(l, Some arg); - exp_loc = loc; exp_extra = []; - exp_type = ty_expected0; - exp_attributes = sexp.pexp_attributes; - exp_env = env } - | _ -> raise Not_found - end + (* Keep sharing *) + let ty_expected0 = instance env ty_expected in + begin try match + sarg, expand_head env ty_expected, expand_head env ty_expected0 with + | Some sarg, {desc = Tvariant row}, {desc = Tvariant row0} -> + let row = row_repr row in + begin match row_field_repr (List.assoc l row.row_fields), + row_field_repr (List.assoc l row0.row_fields) with + Rpresent (Some ty), Rpresent (Some ty0) -> + let arg = type_argument env sarg ty ty0 in + re { exp_desc = Texp_variant(l, Some arg); + exp_loc = loc; exp_extra = []; + exp_type = ty_expected0; + exp_attributes = sexp.pexp_attributes; + exp_env = env } | _ -> raise Not_found - with Not_found -> - let arg = may_map (type_exp env) sarg in - let arg_type = may_map (fun arg -> arg.exp_type) arg in - rue { - exp_desc = Texp_variant(l, arg); - exp_loc = loc; exp_extra = []; - exp_type= newty (Tvariant{row_fields = [l, Rpresent arg_type]; - row_more = newvar (); - row_bound = (); - row_closed = false; - row_fixed = false; - row_name = None}); - exp_attributes = sexp.pexp_attributes; - exp_env = env } end | Pexp_record(lid_sexp_list, opt_sexp) -> if lid_sexp_list = [] then @@ -2176,565 +2166,686 @@ and type_expect_ ?in_function env sexp ty_expected = let (_, ty_arg, ty_res) = instance_label false label in unify_exp env record ty_res; rue { - exp_desc = Texp_field(record, lid, label); + exp_desc = Texp_variant(l, arg); exp_loc = loc; exp_extra = []; - exp_type = ty_arg; + exp_type= newty (Tvariant{row_fields = [l, Rpresent arg_type]; + row_more = newvar (); + row_bound = (); + row_closed = false; + row_fixed = false; + row_name = None}); exp_attributes = sexp.pexp_attributes; exp_env = env } + end + | Pexp_record(lid_sexp_list, opt_sexp) -> + let opt_exp = + match opt_sexp with + None -> None + | Some sexp -> + if !Clflags.principal then begin_def (); + let exp = type_exp env sexp in + if !Clflags.principal then begin + end_def (); + generalize_structure exp.exp_type + end; + Some exp + in + let ty_record, opath = + let get_path ty = + try + let (p0, p,_) = extract_concrete_record env ty in + (* XXX level may be wrong *) + Some (p0, p, ty.level = generic_level || not !Clflags.principal) + with Not_found -> None + in + match get_path ty_expected with + None -> + begin match opt_exp with + None -> newvar (), None + | Some exp -> + match get_path exp.exp_type with + None -> newvar (), None + | Some (_, p', _) as op -> + let decl = Env.find_type p' env in + begin_def (); + let ty = + newconstr p' (instance_list env decl.type_params) in + end_def (); + generalize_structure ty; + ty, op + end + | op -> ty_expected, op + in + let closed = (opt_sexp = None) in + let lbl_exp_list = + wrap_disambiguate "This record expression is expected to have" ty_record + (type_label_a_list loc closed env + (type_label_exp true env loc ty_record) + opath) + lid_sexp_list + in + unify_exp_types loc env ty_record (instance env ty_expected); + + (* type_label_a_list returns a list of labels sorted by lbl_pos *) + (* note: check_duplicates would better be implemented in + type_label_a_list directly *) + let rec check_duplicates = function + | (_, lbl1, _) :: (_, lbl2, _) :: _ when lbl1.lbl_pos = lbl2.lbl_pos -> + raise(Error(loc, env, Label_multiply_defined lbl1.lbl_name)) + | _ :: rem -> + check_duplicates rem + | [] -> () + in + check_duplicates lbl_exp_list; + let opt_exp = + match opt_exp, lbl_exp_list with + None, _ -> None + | Some exp, (lid, lbl, lbl_exp) :: _ -> + let ty_exp = instance env exp.exp_type in + let unify_kept lbl = + (* do not connect overridden labels *) + if List.for_all + (fun (_, lbl',_) -> lbl'.lbl_pos <> lbl.lbl_pos) + lbl_exp_list + then begin + let _, ty_arg1, ty_res1 = instance_label false lbl + and _, ty_arg2, ty_res2 = instance_label false lbl in + unify env ty_arg1 ty_arg2; + unify env (instance env ty_expected) ty_res2; + unify_exp_types exp.exp_loc env ty_exp ty_res1; + end in + Array.iter unify_kept lbl.lbl_all; + Some {exp with exp_type = ty_exp} + | _ -> assert false + in + let num_fields = + match lbl_exp_list with [] -> assert false + | (_, lbl,_)::_ -> Array.length lbl.lbl_all in + if opt_sexp = None && List.length lid_sexp_list <> num_fields then begin + let present_indices = + List.map (fun (_, lbl, _) -> lbl.lbl_pos) lbl_exp_list in + let label_names = extract_label_names sexp env ty_expected in + let rec missing_labels n = function + [] -> [] + | lbl :: rem -> + if List.mem n present_indices then missing_labels (n + 1) rem + else lbl :: missing_labels (n + 1) rem + in + let missing = missing_labels 0 label_names in + raise(Error(loc, env, Label_missing missing)) + end + else if opt_sexp <> None && List.length lid_sexp_list = num_fields then + Location.prerr_warning loc Warnings.Useless_record_with; + re { + exp_desc = Texp_record(lbl_exp_list, opt_exp); + exp_loc = loc; exp_extra = []; + exp_type = instance env ty_expected; + exp_attributes = sexp.pexp_attributes; + exp_env = env } + | Pexp_field(srecord, lid) -> + let (record, label, _) = type_label_access env loc srecord lid in + let (_, ty_arg, ty_res) = instance_label false label in + unify_exp env record ty_res; + rue { + exp_desc = Texp_field(record, lid, label); + exp_loc = loc; exp_extra = []; + exp_type = ty_arg; + exp_attributes = sexp.pexp_attributes; + exp_env = env } | Pexp_setfield(srecord, lid, snewval) -> - let (record, label, opath) = type_label_access env loc srecord lid in - let ty_record = if opath = None then newvar () else record.exp_type in - let (label_loc, label, newval) = - type_label_exp false env loc ty_record (lid, label, snewval) in - unify_exp env record ty_record; - if label.lbl_mut = Immutable then - raise(Error(loc, env, Label_not_mutable lid.txt)); + let (record, label, opath) = type_label_access env loc srecord lid in + let ty_record = if opath = None then newvar () else record.exp_type in + let (label_loc, label, newval) = + type_label_exp false env loc ty_record (lid, label, snewval) in + unify_exp env record ty_record; + if label.lbl_mut = Immutable then + raise(Error(loc, env, Label_not_mutable lid.txt)); + rue { + exp_desc = Texp_setfield(record, label_loc, label, newval); + exp_loc = loc; exp_extra = []; + exp_type = instance_def Predef.type_unit; + exp_attributes = sexp.pexp_attributes; + exp_env = env } + | Pexp_array(sargl) -> + let ty = newgenvar() in + let to_unify = Predef.type_array ty in + unify_exp_types loc env to_unify ty_expected; + let argl = List.map (fun sarg -> type_expect env sarg ty) sargl in + re { + exp_desc = Texp_array argl; + exp_loc = loc; exp_extra = []; + exp_type = instance env ty_expected; + exp_attributes = sexp.pexp_attributes; + exp_env = env } + | Pexp_ifthenelse(scond, sifso, sifnot) -> + let cond = type_expect env scond Predef.type_bool in + begin match sifnot with + None -> + let ifso = type_expect env sifso Predef.type_unit in rue { - exp_desc = Texp_setfield(record, label_loc, label, newval); + exp_desc = Texp_ifthenelse(cond, ifso, None); exp_loc = loc; exp_extra = []; - exp_type = instance_def Predef.type_unit; + exp_type = ifso.exp_type; exp_attributes = sexp.pexp_attributes; exp_env = env } - | Pexp_array(sargl) -> - let ty = newgenvar() in - let to_unify = Predef.type_array ty in - unify_exp_types loc env to_unify ty_expected; - let argl = List.map (fun sarg -> type_expect env sarg ty) sargl in + | Some sifnot -> + let ifso = type_expect env sifso ty_expected in + let ifnot = type_expect env sifnot ty_expected in + (* Keep sharing *) + unify_exp env ifnot ifso.exp_type; re { - exp_desc = Texp_array argl; + exp_desc = Texp_ifthenelse(cond, ifso, Some ifnot); exp_loc = loc; exp_extra = []; - exp_type = instance env ty_expected; + exp_type = ifso.exp_type; exp_attributes = sexp.pexp_attributes; exp_env = env } - | Pexp_ifthenelse(scond, sifso, sifnot) -> - let cond = type_expect env scond Predef.type_bool in - begin match sifnot with - None -> - let ifso = type_expect env sifso Predef.type_unit in - rue { - exp_desc = Texp_ifthenelse(cond, ifso, None); - exp_loc = loc; exp_extra = []; - exp_type = ifso.exp_type; - exp_attributes = sexp.pexp_attributes; - exp_env = env } - | Some sifnot -> - let ifso = type_expect env sifso ty_expected in - let ifnot = type_expect env sifnot ty_expected in - (* Keep sharing *) - unify_exp env ifnot ifso.exp_type; - re { - exp_desc = Texp_ifthenelse(cond, ifso, Some ifnot); - exp_loc = loc; exp_extra = []; - exp_type = ifso.exp_type; - exp_attributes = sexp.pexp_attributes; - exp_env = env } - end + end | Pexp_sequence(sexp1, sexp2) -> - let exp1 = type_statement env sexp1 in - let exp2 = type_expect env sexp2 ty_expected in - re { - exp_desc = Texp_sequence(exp1, exp2); - exp_loc = loc; exp_extra = []; - exp_type = exp2.exp_type; - exp_attributes = sexp.pexp_attributes; - exp_env = env } + let exp1 = type_statement env sexp1 in + let exp2 = type_expect env sexp2 ty_expected in + re { + exp_desc = Texp_sequence(exp1, exp2); + exp_loc = loc; exp_extra = []; + exp_type = exp2.exp_type; + exp_attributes = sexp.pexp_attributes; + exp_env = env } | Pexp_while(scond, sbody) -> - let cond = type_expect env scond Predef.type_bool in - let body = type_statement env sbody in - rue { - exp_desc = Texp_while(cond, body); - exp_loc = loc; exp_extra = []; - exp_type = instance_def Predef.type_unit; - exp_attributes = sexp.pexp_attributes; - exp_env = env } + let cond = type_expect env scond Predef.type_bool in + let body = type_statement env sbody in + rue { + exp_desc = Texp_while(cond, body); + exp_loc = loc; exp_extra = []; + exp_type = instance_def Predef.type_unit; + exp_attributes = sexp.pexp_attributes; + exp_env = env } | Pexp_for(param, slow, shigh, dir, sbody) -> - let low = type_expect env slow Predef.type_int in - let high = type_expect env shigh Predef.type_int in - let id, new_env = - match param.ppat_desc with - | Ppat_any -> Ident.create "_for", env - | Ppat_var {txt} -> - Env.enter_value txt {val_type = instance_def Predef.type_int; - val_attributes = []; - val_kind = Val_reg; Types.val_loc = loc; } env - ~check:(fun s -> Warnings.Unused_for_index s) - | _ -> - raise (Error (param.ppat_loc, env, Invalid_for_loop_index)) - in - let body = type_statement new_env sbody in - rue { - exp_desc = Texp_for(id, param, low, high, dir, body); - exp_loc = loc; exp_extra = []; - exp_type = instance_def Predef.type_unit; - exp_attributes = sexp.pexp_attributes; - exp_env = env } + let low = type_expect env slow Predef.type_int in + let high = type_expect env shigh Predef.type_int in + let id, new_env = + match param.ppat_desc with + | Ppat_any -> Ident.create "_for", env + | Ppat_var {txt} -> + Env.enter_value txt {val_type = instance_def Predef.type_int; + val_attributes = []; + val_kind = Val_reg; Types.val_loc = loc; } env + ~check:(fun s -> Warnings.Unused_for_index s) + | _ -> + raise (Error (param.ppat_loc, env, Invalid_for_loop_index)) + in + let body = type_statement new_env sbody in + rue { + exp_desc = Texp_for(id, param, low, high, dir, body); + exp_loc = loc; exp_extra = []; + exp_type = instance_def Predef.type_unit; + exp_attributes = sexp.pexp_attributes; + exp_env = env } | Pexp_constraint (sarg, sty) -> - let separate = true in (* always separate, 1% slowdown for lablgtk *) - if separate then begin_def (); - let cty = Typetexp.transl_simple_type env false sty in - let ty = cty.ctyp_type in - let (arg, ty') = + let separate = true in (* always separate, 1% slowdown for lablgtk *) + if separate then begin_def (); + let cty = Typetexp.transl_simple_type env false sty in + let ty = cty.ctyp_type in + let (arg, ty') = + if separate then begin + end_def (); + generalize_structure ty; + (type_argument env sarg ty (instance env ty), instance env ty) + end else + (type_argument env sarg ty ty, ty) + in + rue { + exp_desc = arg.exp_desc; + exp_loc = arg.exp_loc; + exp_type = ty'; + exp_attributes = arg.exp_attributes; + exp_env = env; + exp_extra = + (Texp_constraint cty, loc, sexp.pexp_attributes) :: arg.exp_extra; + } + | Pexp_coerce(sarg, sty, sty') -> + let separate = true (* always separate, 1% slowdown for lablgtk *) + (* !Clflags.principal || Env.has_local_constraints env *) in + let (arg, ty',cty,cty') = + match sty with + | None -> + let (cty', force) = + Typetexp.transl_simple_type_delayed env sty' + in + let ty' = cty'.ctyp_type in + if separate then begin_def (); + let arg = type_exp env sarg in + let gen = + if separate then begin + end_def (); + let tv = newvar () in + let gen = generalizable tv.level arg.exp_type in + unify_var env tv arg.exp_type; + gen + end else true + in + begin match arg.exp_desc, !self_coercion, (repr ty').desc with + Texp_ident(_, _, {val_kind=Val_self _}), (path,r) :: _, + Tconstr(path',_,_) when Path.same path path' -> + (* prerr_endline "self coercion"; *) + r := loc :: !r; + force () + | _ when free_variables ~env arg.exp_type = [] + && free_variables ~env ty' = [] -> + if not gen && (* first try a single coercion *) + let snap = snapshot () in + let ty, b = enlarge_type env ty' in + try + force (); Ctype.unify env arg.exp_type ty; true + with Unify _ -> + backtrack snap; false + then () + else begin try + let force' = subtype env arg.exp_type ty' in + force (); force' (); + if not gen then + Location.prerr_warning loc + (Warnings.Not_principal "this ground coercion"); + with Subtype (tr1, tr2) -> + (* prerr_endline "coercion failed"; *) + raise(Error(loc, env, Not_subtype(tr1, tr2))) + end; + | _ -> + let ty, b = enlarge_type env ty' in + force (); + begin try Ctype.unify env arg.exp_type ty with Unify trace -> + raise(Error(sarg.pexp_loc, env, + Coercion_failure(ty', full_expand env ty', trace, b))) + end + end; + (arg, ty', None, cty') + | Some sty -> + if separate then begin_def (); + let (cty, force) = + Typetexp.transl_simple_type_delayed env sty + and (cty', force') = + Typetexp.transl_simple_type_delayed env sty' + in + let ty = cty.ctyp_type in + let ty' = cty'.ctyp_type in + begin try + let force'' = subtype env ty ty' in + force (); force' (); force'' () + with Subtype (tr1, tr2) -> + raise(Error(loc, env, Not_subtype(tr1, tr2))) + end; if separate then begin end_def (); generalize_structure ty; - (type_argument env sarg ty (instance env ty), instance env ty) + generalize_structure ty'; + (type_argument env sarg ty (instance env ty), + instance env ty', Some cty, cty') end else - (type_argument env sarg ty ty, ty) - in - rue { - exp_desc = arg.exp_desc; - exp_loc = arg.exp_loc; - exp_type = ty'; - exp_attributes = arg.exp_attributes; - exp_env = env; - exp_extra = - (Texp_constraint cty, loc, sexp.pexp_attributes) :: arg.exp_extra; - } - | Pexp_coerce(sarg, sty, sty') -> - let separate = true (* always separate, 1% slowdown for lablgtk *) - (* !Clflags.principal || Env.has_local_constraints env *) in - let (arg, ty',cty,cty') = - match sty with - | None -> - let (cty', force) = - Typetexp.transl_simple_type_delayed env sty' + (type_argument env sarg ty ty, ty', Some cty, cty') + in + rue { + exp_desc = arg.exp_desc; + exp_loc = arg.exp_loc; + exp_type = ty'; + exp_attributes = arg.exp_attributes; + exp_env = env; + exp_extra = (Texp_coerce (cty, cty'), loc, sexp.pexp_attributes) :: + arg.exp_extra; + } + | Pexp_send (e, met) -> + if !Clflags.principal then begin_def (); + let obj = type_exp env e in + begin try + let (meth, exp, typ) = + match obj.exp_desc with + Texp_ident(path, _, {val_kind = Val_self (meths, _, _, privty)}) -> + let (id, typ) = + filter_self_method env met Private meths privty + in + if is_Tvar (repr typ) then + Location.prerr_warning loc + (Warnings.Undeclared_virtual_method met); + (Tmeth_val id, None, typ) + | Texp_ident(path, lid, {val_kind = Val_anc (methods, cl_num)}) -> + let method_id = + begin try List.assoc met methods with Not_found -> + raise(Error(e.pexp_loc, env, Undefined_inherited_method met)) + end + in + begin match + Env.lookup_value (Longident.Lident ("selfpat-" ^ cl_num)) env, + Env.lookup_value (Longident.Lident ("self-" ^cl_num)) env + with + (_, ({val_kind = Val_self (meths, _, _, privty)} as desc)), + (path, _) -> + let (_, typ) = + filter_self_method env met Private meths privty in - let ty' = cty'.ctyp_type in - if separate then begin_def (); - let arg = type_exp env sarg in - let gen = - if separate then begin - end_def (); - let tv = newvar () in - let gen = generalizable tv.level arg.exp_type in - unify_var env tv arg.exp_type; - gen - end else true + let method_type = newvar () in + let (obj_ty, res_ty) = filter_arrow env method_type Tarr_simple in + unify env obj_ty desc.val_type; + unify env res_ty (instance env typ); + let exp = + Texp_apply( + {exp_desc = + Texp_ident(Path.Pident method_id, lid, + {val_type = method_type; + val_kind = Val_reg; + val_attributes = []; + Types.val_loc = Location.none}); + exp_loc = loc; exp_extra = []; + exp_type = method_type; + exp_attributes = []; (* check *) + exp_env = env}, + [{ arg_flag = Tapp_simple; + arg_expression = + Some { exp_desc = Texp_ident(path, lid, desc); + exp_loc = obj.exp_loc; exp_extra = []; + exp_type = desc.val_type; + exp_attributes = []; (* check *) + exp_env = env }; + }] + ) in - begin match arg.exp_desc, !self_coercion, (repr ty').desc with - Texp_ident(_, _, {val_kind=Val_self _}), (path,r) :: _, - Tconstr(path',_,_) when Path.same path path' -> - (* prerr_endline "self coercion"; *) - r := loc :: !r; - force () - | _ when free_variables ~env arg.exp_type = [] - && free_variables ~env ty' = [] -> - if not gen && (* first try a single coercion *) - let snap = snapshot () in - let ty, b = enlarge_type env ty' in - try - force (); Ctype.unify env arg.exp_type ty; true - with Unify _ -> - backtrack snap; false - then () - else begin try - let force' = subtype env arg.exp_type ty' in - force (); force' (); - if not gen then - Location.prerr_warning loc - (Warnings.Not_principal "this ground coercion"); - with Subtype (tr1, tr2) -> - (* prerr_endline "coercion failed"; *) - raise(Error(loc, env, Not_subtype(tr1, tr2))) - end; - | _ -> - let ty, b = enlarge_type env ty' in - force (); - begin try Ctype.unify env arg.exp_type ty with Unify trace -> - raise(Error(sarg.pexp_loc, env, - Coercion_failure(ty', full_expand env ty', trace, b))) - end - end; - (arg, ty', None, cty') - | Some sty -> - if separate then begin_def (); - let (cty, force) = - Typetexp.transl_simple_type_delayed env sty - and (cty', force') = - Typetexp.transl_simple_type_delayed env sty' - in - let ty = cty.ctyp_type in - let ty' = cty'.ctyp_type in - begin try - let force'' = subtype env ty ty' in - force (); force' (); force'' () - with Subtype (tr1, tr2) -> - raise(Error(loc, env, Not_subtype(tr1, tr2))) - end; - if separate then begin - end_def (); - generalize_structure ty; - generalize_structure ty'; - (type_argument env sarg ty (instance env ty), - instance env ty', Some cty, cty') - end else - (type_argument env sarg ty ty, ty', Some cty, cty') + (Tmeth_name met, Some (re {exp_desc = exp; + exp_loc = loc; exp_extra = []; + exp_type = typ; + exp_attributes = []; (* check *) + exp_env = env}), typ) + | _ -> + assert false + end + | _ -> + (Tmeth_name met, None, + filter_method env met Public obj.exp_type) + in + if !Clflags.principal then begin + end_def (); + generalize_structure typ; + end; + let typ = + match repr typ with + {desc = Tpoly (ty, [])} -> + instance env ty + | {desc = Tpoly (ty, tl); level = l} -> + if !Clflags.principal && l <> generic_level then + Location.prerr_warning loc + (Warnings.Not_principal "this use of a polymorphic method"); + snd (instance_poly false tl ty) + | {desc = Tvar _} as ty -> + let ty' = newvar () in + unify env (instance_def ty) (newty(Tpoly(ty',[]))); + (* if not !Clflags.nolabels then + Location.prerr_warning loc (Warnings.Unknown_method met); *) + ty' + | _ -> + assert false in rue { - exp_desc = arg.exp_desc; - exp_loc = arg.exp_loc; - exp_type = ty'; - exp_attributes = arg.exp_attributes; - exp_env = env; - exp_extra = (Texp_coerce (cty, cty'), loc, sexp.pexp_attributes) :: - arg.exp_extra; - } - | Pexp_send (e, met) -> - if !Clflags.principal then begin_def (); - let obj = type_exp env e in - begin try - let (meth, exp, typ) = - match obj.exp_desc with - Texp_ident(path, _, {val_kind = Val_self (meths, _, _, privty)}) -> - let (id, typ) = - filter_self_method env met Private meths privty - in - if is_Tvar (repr typ) then - Location.prerr_warning loc - (Warnings.Undeclared_virtual_method met); - (Tmeth_val id, None, typ) - | Texp_ident(path, lid, {val_kind = Val_anc (methods, cl_num)}) -> - let method_id = - begin try List.assoc met methods with Not_found -> - raise(Error(e.pexp_loc, env, Undefined_inherited_method met)) - end - in - begin match - Env.lookup_value (Longident.Lident ("selfpat-" ^ cl_num)) env, - Env.lookup_value (Longident.Lident ("self-" ^cl_num)) env - with - (_, ({val_kind = Val_self (meths, _, _, privty)} as desc)), - (path, _) -> - let (_, typ) = - filter_self_method env met Private meths privty - in - let method_type = newvar () in - let (obj_ty, res_ty) = filter_arrow env method_type Tarr_simple in - unify env obj_ty desc.val_type; - unify env res_ty (instance env typ); - let exp = - Texp_apply( - {exp_desc = - Texp_ident(Path.Pident method_id, lid, - {val_type = method_type; - val_kind = Val_reg; - val_attributes = []; - Types.val_loc = Location.none}); - exp_loc = loc; exp_extra = []; - exp_type = method_type; - exp_attributes = []; (* check *) - exp_env = env}, - [{ arg_flag = Tapp_simple; - arg_expression = - Some { exp_desc = Texp_ident(path, lid, desc); - exp_loc = obj.exp_loc; exp_extra = []; - exp_type = desc.val_type; - exp_attributes = []; (* check *) - exp_env = env }; - }] - ) - in - (Tmeth_name met, Some (re {exp_desc = exp; - exp_loc = loc; exp_extra = []; - exp_type = typ; - exp_attributes = []; (* check *) - exp_env = env}), typ) - | _ -> - assert false - end - | _ -> - (Tmeth_name met, None, - filter_method env met Public obj.exp_type) - in - if !Clflags.principal then begin - end_def (); - generalize_structure typ; - end; - let typ = - match repr typ with - {desc = Tpoly (ty, [])} -> - instance env ty - | {desc = Tpoly (ty, tl); level = l} -> - if !Clflags.principal && l <> generic_level then - Location.prerr_warning loc - (Warnings.Not_principal "this use of a polymorphic method"); - snd (instance_poly false tl ty) - | {desc = Tvar _} as ty -> - let ty' = newvar () in - unify env (instance_def ty) (newty(Tpoly(ty',[]))); - (* if not !Clflags.nolabels then - Location.prerr_warning loc (Warnings.Unknown_method met); *) - ty' - | _ -> - assert false + exp_desc = Texp_send(obj, meth, exp); + exp_loc = loc; exp_extra = []; + exp_type = typ; + exp_attributes = sexp.pexp_attributes; + exp_env = env } + with Unify _ -> + raise(Error(e.pexp_loc, env, Undefined_method (obj.exp_type, met))) + end + | Pexp_new cl -> + let (cl_path, cl_decl) = Typetexp.find_class env loc cl.txt in + begin match cl_decl.cty_new with + None -> + raise(Error(loc, env, Virtual_class cl.txt)) + | Some ty -> + rue { + exp_desc = Texp_new (cl_path, cl, cl_decl); + exp_loc = loc; exp_extra = []; + exp_type = instance_def ty; + exp_attributes = sexp.pexp_attributes; + exp_env = env } + end + | Pexp_setinstvar (lab, snewval) -> + begin try + let (path, desc) = Env.lookup_value (Longident.Lident lab.txt) env in + match desc.val_kind with + Val_ivar (Mutable, cl_num) -> + let newval = + type_expect env snewval (instance env desc.val_type) in + let (path_self, _) = + Env.lookup_value (Longident.Lident ("self-" ^ cl_num)) env in rue { - exp_desc = Texp_send(obj, meth, exp); + exp_desc = Texp_setinstvar(path_self, path, lab, newval); exp_loc = loc; exp_extra = []; - exp_type = typ; + exp_type = instance_def Predef.type_unit; exp_attributes = sexp.pexp_attributes; exp_env = env } - with Unify _ -> - raise(Error(e.pexp_loc, env, Undefined_method (obj.exp_type, met))) - end - | Pexp_new cl -> - let (cl_path, cl_decl) = Typetexp.find_class env loc cl.txt in - begin match cl_decl.cty_new with - None -> - raise(Error(loc, env, Virtual_class cl.txt)) - | Some ty -> - rue { - exp_desc = Texp_new (cl_path, cl, cl_decl); - exp_loc = loc; exp_extra = []; - exp_type = instance_def ty; - exp_attributes = sexp.pexp_attributes; - exp_env = env } - end - | Pexp_setinstvar (lab, snewval) -> - begin try - let (path, desc) = Env.lookup_value (Longident.Lident lab.txt) env in - match desc.val_kind with - Val_ivar (Mutable, cl_num) -> - let newval = - type_expect env snewval (instance env desc.val_type) in - let (path_self, _) = - Env.lookup_value (Longident.Lident ("self-" ^ cl_num)) env - in - rue { - exp_desc = Texp_setinstvar(path_self, path, lab, newval); - exp_loc = loc; exp_extra = []; - exp_type = instance_def Predef.type_unit; - exp_attributes = sexp.pexp_attributes; - exp_env = env } - | Val_ivar _ -> - raise(Error(loc, env, Instance_variable_not_mutable(true,lab.txt))) - | _ -> - raise(Error(loc, env, Instance_variable_not_mutable(false,lab.txt))) - with - Not_found -> - raise(Error(loc, env, Unbound_instance_variable lab.txt)) - end + | Val_ivar _ -> + raise(Error(loc, env, Instance_variable_not_mutable(true,lab.txt))) + | _ -> + raise(Error(loc, env, Instance_variable_not_mutable(false,lab.txt))) + with + Not_found -> + raise(Error(loc, env, Unbound_instance_variable lab.txt)) + end | Pexp_override lst -> - let _ = - List.fold_right + let _ = + List.fold_right (fun (lab, _) l -> - if List.exists (fun l -> l.txt = lab.txt) l then - raise(Error(loc, env, - Value_multiply_overridden lab.txt)); - lab::l) + if List.exists (fun l -> l.txt = lab.txt) l then + raise(Error(loc, env, + Value_multiply_overridden lab.txt)); + lab::l) lst [] in - begin match - try - Env.lookup_value (Longident.Lident "selfpat-*") env, - Env.lookup_value (Longident.Lident "self-*") env - with Not_found -> - raise(Error(loc, env, Outside_class)) - with - (_, {val_type = self_ty; val_kind = Val_self (_, vars, _, _)}), - (path_self, _) -> - let type_override (lab, snewval) = - begin try - let (id, _, _, ty) = Vars.find lab.txt !vars in - (Path.Pident id, lab, type_expect env snewval (instance env ty)) - with - Not_found -> - raise(Error(loc, env, Unbound_instance_variable lab.txt)) - end - in - let modifs = List.map type_override lst in - rue { - exp_desc = Texp_override(path_self, modifs); - exp_loc = loc; exp_extra = []; - exp_type = self_ty; - exp_attributes = sexp.pexp_attributes; - exp_env = env } - | _ -> - assert false - end - | Pexp_letmodule({pmb_name = name; pmb_expr = smodl; pmb_implicit; - pmb_attributes; pmb_loc}, sbody) -> - let ty = newvar() in - (* remember original level *) - begin_def (); - Ident.set_current_time ty.level; - let context = Typetexp.narrow () in - let modl = !type_module env smodl in - let (id, new_env) = - Env.enter_module ~implicit_:pmb_implicit name.txt modl.mod_type env - in - Ctype.init_def(Ident.current_time()); - Typetexp.widen context; - let body = type_expect new_env sbody ty_expected in - (* go back to original level *) - end_def (); - (* Unification of body.exp_type with the fresh variable ty - fails if and only if the prefix condition is violated, - i.e. if generative types rooted at id show up in the - type body.exp_type. Thus, this unification enforces the - scoping condition on "let module". *) - begin try - Ctype.unify_var new_env ty body.exp_type - with Unify _ -> - raise(Error(loc, env, Scoping_let_module(name.txt, body.exp_type))) - end; - let mb = { mb_id = id; mb_name = name; mb_expr = modl; mb_loc = pmb_loc; - mb_implicit = pmb_implicit; mb_attributes = pmb_attributes } + begin match + try + Env.lookup_value (Longident.Lident "selfpat-*") env, + Env.lookup_value (Longident.Lident "self-*") env + with Not_found -> + raise(Error(loc, env, Outside_class)) + with + (_, {val_type = self_ty; val_kind = Val_self (_, vars, _, _)}), + (path_self, _) -> + let type_override (lab, snewval) = + begin try + let (id, _, _, ty) = Vars.find lab.txt !vars in + (Path.Pident id, lab, type_expect env snewval (instance env ty)) + with + Not_found -> + raise(Error(loc, env, Unbound_instance_variable lab.txt)) + end in - re { - exp_desc = Texp_letmodule (mb, body); + let modifs = List.map type_override lst in + rue { + exp_desc = Texp_override(path_self, modifs); exp_loc = loc; exp_extra = []; - exp_type = ty; + exp_type = self_ty; exp_attributes = sexp.pexp_attributes; exp_env = env } + | _ -> + assert false + end + | Pexp_letmodule({pmb_name = name; pmb_expr = smodl; pmb_implicit; + pmb_attributes; pmb_loc}, sbody) -> + let ty = newvar() in + (* remember original level *) + begin_def (); + Ident.set_current_time ty.level; + let context = Typetexp.narrow () in + let modl = !type_module env smodl in + let (id, new_env) = + Env.enter_module ~implicit_:pmb_implicit name.txt modl.mod_type env + in + Ctype.init_def(Ident.current_time()); + Typetexp.widen context; + let body = type_expect new_env sbody ty_expected in + (* go back to original level *) + end_def (); + (* Unification of body.exp_type with the fresh variable ty + fails if and only if the prefix condition is violated, + i.e. if generative types rooted at id show up in the + type body.exp_type. Thus, this unification enforces the + scoping condition on "let module". *) + begin try + Ctype.unify_var new_env ty body.exp_type + with Unify _ -> + raise(Error(loc, env, Scoping_let_module(name.txt, body.exp_type))) + end; + let mb = { mb_id = id; mb_name = name; mb_expr = modl; mb_loc = pmb_loc; + mb_implicit = pmb_implicit; mb_attributes = pmb_attributes } + in + re { + exp_desc = Texp_letmodule (mb, body); + exp_loc = loc; exp_extra = []; + exp_type = ty; + exp_attributes = sexp.pexp_attributes; + exp_env = env } | Pexp_assert (e) -> - let cond = type_expect env e Predef.type_bool in - let exp_type = - match cond.exp_desc with - | Texp_construct(_, {cstr_name="false"}, _) -> - instance env ty_expected - | _ -> - instance_def Predef.type_unit - in - rue { - exp_desc = Texp_assert cond; - exp_loc = loc; exp_extra = []; - exp_type; - exp_attributes = sexp.pexp_attributes; - exp_env = env; - } + let cond = type_expect env e Predef.type_bool in + let exp_type = + match cond.exp_desc with + | Texp_construct(_, {cstr_name="false"}, _) -> + instance env ty_expected + | _ -> + instance_def Predef.type_unit + in + rue { + exp_desc = Texp_assert cond; + exp_loc = loc; exp_extra = []; + exp_type; + exp_attributes = sexp.pexp_attributes; + exp_env = env; + } | Pexp_lazy e -> - let ty = newgenvar () in - let to_unify = Predef.type_lazy_t ty in - unify_exp_types loc env to_unify ty_expected; - let arg = type_expect env e ty in - re { - exp_desc = Texp_lazy arg; - exp_loc = loc; exp_extra = []; - exp_type = instance env ty_expected; - exp_attributes = sexp.pexp_attributes; - exp_env = env; - } + let ty = newgenvar () in + let to_unify = Predef.type_lazy_t ty in + unify_exp_types loc env to_unify ty_expected; + let arg = type_expect env e ty in + re { + exp_desc = Texp_lazy arg; + exp_loc = loc; exp_extra = []; + exp_type = instance env ty_expected; + exp_attributes = sexp.pexp_attributes; + exp_env = env; + } | Pexp_object s -> - let desc, sign, meths = !type_object env loc s in - rue { - exp_desc = Texp_object (desc, (*sign,*) meths); - exp_loc = loc; exp_extra = []; - exp_type = sign.csig_self; - exp_attributes = sexp.pexp_attributes; - exp_env = env; - } + let desc, sign, meths = !type_object env loc s in + rue { + exp_desc = Texp_object (desc, (*sign,*) meths); + exp_loc = loc; exp_extra = []; + exp_type = sign.csig_self; + exp_attributes = sexp.pexp_attributes; + exp_env = env; + } | Pexp_poly(sbody, sty) -> - if !Clflags.principal then begin_def (); - let ty, cty = - match sty with None -> repr ty_expected, None - | Some sty -> - let sty = Ast_helper.Typ.force_poly sty in - let cty = Typetexp.transl_simple_type env false sty in - repr cty.ctyp_type, Some cty - in - if !Clflags.principal then begin + if !Clflags.principal then begin_def (); + let ty, cty = + match sty with None -> repr ty_expected, None + | Some sty -> + let sty = Ast_helper.Typ.force_poly sty in + let cty = Typetexp.transl_simple_type env false sty in + repr cty.ctyp_type, Some cty + in + if !Clflags.principal then begin + end_def (); + generalize_structure ty + end; + if sty <> None then + unify_exp_types loc env (instance env ty) (instance env ty_expected); + let exp = + match (expand_head env ty).desc with + Tpoly (ty', []) -> + let exp = type_expect env sbody ty' in + { exp with exp_type = instance env ty } + | Tpoly (ty', tl) -> + (* One more level to generalize locally *) + begin_def (); + if !Clflags.principal then begin_def (); + let vars, ty'' = instance_poly true tl ty' in + if !Clflags.principal then begin + end_def (); + generalize_structure ty'' + end; + let exp = type_expect env sbody ty'' in end_def (); - generalize_structure ty - end; - if sty <> None then - unify_exp_types loc env (instance env ty) (instance env ty_expected); - let exp = - match (expand_head env ty).desc with - Tpoly (ty', []) -> - let exp = type_expect env sbody ty' in - { exp with exp_type = instance env ty } - | Tpoly (ty', tl) -> - (* One more level to generalize locally *) - begin_def (); - if !Clflags.principal then begin_def (); - let vars, ty'' = instance_poly true tl ty' in - if !Clflags.principal then begin - end_def (); - generalize_structure ty'' - end; - let exp = type_expect env sbody ty'' in - end_def (); - check_univars env false "method" exp ty_expected vars; - { exp with exp_type = instance env ty } - | Tvar _ -> - let exp = type_exp env sbody in - let exp = {exp with exp_type = newty (Tpoly (exp.exp_type, []))} in - unify_exp env exp ty; - exp - | _ -> assert false - in - re { exp with exp_extra = - (Texp_poly cty, loc, sexp.pexp_attributes) :: exp.exp_extra } + check_univars env false "method" exp ty_expected vars; + { exp with exp_type = instance env ty } + | Tvar _ -> + let exp = type_exp env sbody in + let exp = {exp with exp_type = newty (Tpoly (exp.exp_type, []))} in + unify_exp env exp ty; + exp + | _ -> assert false + in + re { exp with exp_extra = + (Texp_poly cty, loc, sexp.pexp_attributes) :: exp.exp_extra } | Pexp_newtype(name, sbody) -> - let ty = newvar () in - (* remember original level *) - begin_def (); - (* Create a fake abstract type declaration for name. *) - let level = get_current_level () in - let decl = { - type_params = []; - type_arity = 0; - type_kind = Type_abstract; - type_private = Public; - type_manifest = None; - type_variance = []; - type_newtype_level = Some (level, level); - type_loc = loc; - type_attributes = []; - } - in - Ident.set_current_time ty.level; - let (id, new_env) = Env.enter_type name decl env in - Ctype.init_def(Ident.current_time()); - - let body = type_exp new_env sbody in - (* Replace every instance of this type constructor in the resulting - type. *) - let seen = Hashtbl.create 8 in - let rec replace t = - if Hashtbl.mem seen t.id then () - else begin - Hashtbl.add seen t.id (); - match t.desc with - | Tconstr (Path.Pident id', _, _) when id == id' -> link_type t ty - | _ -> Btype.iter_type_expr replace t - end - in - let ety = Subst.type_expr Subst.identity body.exp_type in - replace ety; - (* back to original level *) - end_def (); - (* lower the levels of the result type *) - (* unify_var env ty ety; *) + let ty = newvar () in + (* remember original level *) + begin_def (); + (* Create a fake abstract type declaration for name. *) + let level = get_current_level () in + let decl = { + type_params = []; + type_arity = 0; + type_kind = Type_abstract; + type_private = Public; + type_manifest = None; + type_variance = []; + type_newtype_level = Some (level, level); + type_loc = loc; + type_attributes = []; + } + in + Ident.set_current_time ty.level; + let (id, new_env) = Env.enter_type name decl env in + Ctype.init_def(Ident.current_time()); + + let body = type_exp new_env sbody in + (* Replace every instance of this type constructor in the resulting + type. *) + let seen = Hashtbl.create 8 in + let rec replace t = + if Hashtbl.mem seen t.id then () + else begin + Hashtbl.add seen t.id (); + match t.desc with + | Tconstr (Path.Pident id', _, _) when id == id' -> link_type t ty + | _ -> Btype.iter_type_expr replace t + end + in + let ety = Subst.type_expr Subst.identity body.exp_type in + replace ety; + (* back to original level *) + end_def (); + (* lower the levels of the result type *) + (* unify_var env ty ety; *) - (* non-expansive if the body is non-expansive, so we don't introduce - any new extra node in the typed AST. *) - rue { body with exp_loc = loc; exp_type = ety; - exp_extra = + (* non-expansive if the body is non-expansive, so we don't introduce + any new extra node in the typed AST. *) + rue { body with exp_loc = loc; exp_type = ety; + exp_extra = (Texp_newtype name, loc, sexp.pexp_attributes) :: body.exp_extra } | Pexp_pack m -> - let (p, nl, tl) = - match Ctype.expand_head env (instance env ty_expected) with - {desc = Tpackage (p, nl, tl)} -> - if !Clflags.principal && - (Ctype.expand_head env ty_expected).level < Btype.generic_level - then - Location.prerr_warning loc - (Warnings.Not_principal "this module packing"); - (p, nl, tl) - | {desc = Tvar _} -> - raise (Error (loc, env, Cannot_infer_signature)) - | _ -> - raise (Error (loc, env, Not_a_packed_module ty_expected)) - in - let (modl, tl') = !type_package env m p nl tl in - rue { - exp_desc = Texp_pack modl; - exp_loc = loc; exp_extra = []; - exp_type = newty (Tpackage (p, nl, tl')); - exp_attributes = sexp.pexp_attributes; - exp_env = env } + let (p, nl, tl) = + match Ctype.expand_head env (instance env ty_expected) with + {desc = Tpackage (p, nl, tl)} -> + if !Clflags.principal && + (Ctype.expand_head env ty_expected).level < Btype.generic_level + then + Location.prerr_warning loc + (Warnings.Not_principal "this module packing"); + (p, nl, tl) + | {desc = Tvar _} -> + raise (Error (loc, env, Cannot_infer_signature)) + | _ -> + raise (Error (loc, env, Not_a_packed_module ty_expected)) + in + let (modl, tl') = !type_package env m p nl tl in + rue { + exp_desc = Texp_pack modl; + exp_loc = loc; exp_extra = []; + exp_type = newty (Tpackage (p, nl, tl')); + exp_attributes = sexp.pexp_attributes; + exp_env = env } | Pexp_open (ovf, lid, e) -> let (path, newenv) = !type_open ovf env sexp.pexp_loc lid in let exp = type_expect newenv e ty_expected in @@ -2746,16 +2857,13 @@ and type_expect_ ?in_function env sexp ty_expected = | Pexp_extension ext -> raise (Error_forward (Typetexp.error_of_extension ext)) -and type_function ?in_function loc attrs env arr ty_expected caselist = +and type_function ?in_function loc attrs env ty_expected arr caselist = let (loc_fun, ty_fun) = match in_function with Some p -> p | None -> (loc, instance env ty_expected) in let separate = !Clflags.principal || Env.has_local_constraints env in - let arr = match arr with - | Parr_implicit s -> Tarr_implicit (Ident.create s) - | _ -> tarr_of_parr arr - in + let arr = tarr_of_parr arr in if separate then begin_def (); let (ty_arg, ty_res) = try filter_arrow env (instance env ty_expected) arr @@ -2767,29 +2875,24 @@ and type_function ?in_function loc attrs env arr ty_expected caselist = raise(Error(loc_fun, env, Too_many_arguments (in_function <> None, ty_fun))) in - let ty_arg, is_optional, is_implicit = - match arr with + let ty_arg, is_optional = match arr with | Tarr_optional _ -> - let tv = newvar() in - begin - try unify env ty_arg (type_option tv) - with Unify _ -> assert false - end; - type_option tv, true, false - | Tarr_implicit _ -> ty_arg, false, true - | _ -> ty_arg, false, false + let tv = newvar() in + begin + try unify env ty_arg (type_option tv) + with Unify _ -> assert false + end; + type_option tv, true + | _ -> ty_arg, false in if separate then begin end_def (); generalize_structure ty_arg; generalize_structure ty_res end; - let level = get_current_level () in - if is_implicit then begin_def (); let cases, partial = - type_cases ~in_function:(loc_fun,ty_fun) ~arr:(arr,level) env ty_arg ty_res + type_cases ~in_function:(loc_fun,ty_fun) env ty_arg ty_res true loc caselist in - if is_implicit then end_def (); let not_function ty = let ls, tvar = list_labels env ty in ls = [] && not tvar @@ -2798,12 +2901,14 @@ and type_function ?in_function loc attrs env arr ty_expected caselist = Location.prerr_warning (List.hd cases).c_lhs.pat_loc Warnings.Unerasable_optional_argument; re { - exp_desc = Texp_function(arr,cases, partial); + exp_desc = Texp_function(arr, cases, partial); exp_loc = loc; exp_extra = []; - exp_type = instance env (newgenty (Tarrow(arr, ty_arg, ty_res, Cok))); + exp_type = instance env (newgenty (Tarrow (arr, ty_arg, ty_res, Cok))); exp_attributes = attrs; exp_env = env } +and type_implicit_function ?in_function env ty_expected id pattern body = + and type_label_access env loc srecord lid = if !Clflags.principal then begin_def (); @@ -3533,7 +3638,7 @@ and type_statement env sexp = (* Typing of match cases *) -and type_cases ?in_function ?arr env ty_arg ty_res partial_flag loc caselist = +and type_cases ?in_function env ty_arg ty_res partial_flag loc caselist = (* ty_arg is _fully_ generalized *) let patterns = List.map (fun {pc_lhs=p} -> p) caselist in let erase_either = @@ -3625,20 +3730,17 @@ and type_cases ?in_function ?arr env ty_arg ty_res partial_flag loc caselist = end else if contains_gadt env pc_lhs then correct_levels ty_res else ty_res in - (* Format.printf "@[%i %i, ty_res' =@ %a@]@." lev (get_current_level()) - Printtyp.raw_type_expr ty_res'; *) +(* Format.printf "@[%i %i, ty_res' =@ %a@]@." lev (get_current_level()) + Printtyp.raw_type_expr ty_res'; *) let guard = match pc_guard with | None -> None - | Some scond -> Some (type_expect ext_env - (wrap_unpacks scond unpacks) - Predef.type_bool) - in - let exp = match arr with - | Some (Tarr_implicit id, level) -> - type_implicit_arg id level ?in_function ext_env sexp ty_res' - | _ -> type_expect ?in_function ext_env sexp ty_res' + | Some scond -> + Some + (type_expect ext_env (wrap_unpacks scond unpacks) + Predef.type_bool) in + let exp = type_expect ?in_function ext_env sexp ty_res' in { c_lhs = pat; c_guard = guard; From d59400e882453869e767892e28ddc467a39e65dc Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 11 Jul 2014 14:14:57 +0100 Subject: [PATCH 394/494] Factor out typing rules for implicit functions --- typing/typecore.ml | 58 +++++++++++++++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 19 deletions(-) diff --git a/typing/typecore.ml b/typing/typecore.ml index fb950e2fe2..84689c2bec 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1519,15 +1519,15 @@ let rec type_approx env sexp = created here has a level lower than the one in which the implicit will be bound, and might cause type escape errors. FIXME *) - | Pexp_fun (Parr_implicit s, _, _, e) -> newvar () - (*let id, env = + | Pexp_fun (Parr_implicit s, _, _, e) + let id, env = Env.enter_module ~arg:true ~implicit_:(Implicit 0) s (Mty_signature []) env in - newty (Tarrow(Tarr_implicit id, newvar (), - type_approx env e, Cok))*) + newty (Tarrow(Tarr_implicit id, , + type_approx env e, Cok)) | Pexp_fun (p, _, _, e) -> - newty (Tarrow(tarr_of_parr p, newvar (), type_approx env e, Cok)) + newty (Tarrow(tarr_of_parr p, _, type_approx env e, Cok)) | Pexp_function ({pc_rhs=e}::_) -> newty (Tarrow(Tarr_simple, newvar (), type_approx env e, Cok)) | Pexp_match (_, {pc_rhs=e}::_) -> type_approx env e @@ -1927,9 +1927,37 @@ and type_expect_ ?in_function env sexp ty_expected = [Vb.mk spat smatch] sexp) in type_expect ?in_function env sfun ty_expected - | Pexp_fun (Parr_implicit id, None, spat, sexp) -> - failwith "TODO" - (* TODO: keep attributes, call type_function directly *) + | Pexp_fun (Parr_implicit name, None, spat, sbody) -> + let ty = newvar () in + (* remember original level *) + begin_def (); + Ident.set_current_time ty.level; + let lev = get_current_level () in + let id = Ident.create name in + let ty_arg = newvar () in + (* type argument *) + begin_def (); + let (c_lhs, new_env, pattern_force, unpacks) = + let scope = Some (Annot.Idef sbody.pexp_loc) in + type_pattern ~lev env spat scope ty_arg in + end_def(); + assert (unpacks = []); + (* `Contaminating' unifications start here *) + List.iter (fun f -> f()) pattern_force; + begin_def (); + let body = type_implicit_arg id lev new_env sbody in + let case = {c_lhs; c_guard = None; c_rhs = body} in + let arr = Tarr_implicit id in + end_def (); (* exit rhs *) + end_def (); (* exit implicit binding *) + rue { + exp_desc = Texp_function (arr, [case], Total); + exp_loc = loc; exp_extra = []; + exp_type = instance env (newgenty (Tarrow (arr, ty_arg, body.exp_type, Cok))); + exp_attributes = []; + exp_env = env; + } + (* TODO: keep attributes, call type_function directly *) | Pexp_fun (arr, None, spat, sexp) -> type_function ?in_function loc sexp.pexp_attributes env ty_expected arr [{pc_lhs=spat; pc_guard=None; pc_rhs=sexp}] @@ -2907,9 +2935,6 @@ and type_function ?in_function loc attrs env ty_expected arr caselist = exp_attributes = attrs; exp_env = env } -and type_implicit_function ?in_function env ty_expected id pattern body = - - and type_label_access env loc srecord lid = if !Clflags.principal then begin_def (); let record = type_exp env srecord in @@ -3771,7 +3796,7 @@ and type_cases ?in_function env ty_arg ty_res partial_flag loc caselist = end; cases, partial -and type_implicit_arg id level ?in_function env sbody ty_res = +and type_implicit_arg id level env sbody = let ty = newvar() in (* remember original level *) begin_def (); @@ -3787,7 +3812,7 @@ and type_implicit_arg id level ?in_function env sbody ty_res = let new_env = Env.set_implicit_level id level new_env in Ctype.init_def(Ident.current_time()); Typetexp.widen context; - let body = type_expect ?in_function new_env sbody ty_res in + let body = type_exp new_env sbody in (* go back to original level *) end_def (); (* Unification of body.exp_type with the fresh variable ty @@ -3795,11 +3820,6 @@ and type_implicit_arg id level ?in_function env sbody ty_res = i.e. if generative types rooted at id show up in the type body.exp_type. Thus, this unification enforces the scoping condition on "let module". *) - begin try - Ctype.unify_var new_env ty body.exp_type - with Unify _ -> - raise(Error(sbody.pexp_loc, env, Scoping_let_module(name, body.exp_type))) - end; let mb = { mb_id = id; mb_name = mknoloc name; mb_expr = modl; mb_implicit = Implicit 0; mb_attributes = []; mb_loc = sbody.pexp_loc } @@ -3807,7 +3827,7 @@ and type_implicit_arg id level ?in_function env sbody ty_res = re { exp_desc = Texp_letmodule(mb, body); exp_loc = sbody.pexp_loc; exp_extra = []; - exp_type = ty; + exp_type = body.exp_type; exp_attributes = sbody.pexp_attributes; exp_env = env } From 8a63153f8b9a5239fe16747bca98641df3c273a2 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 11 Jul 2014 16:17:46 +0100 Subject: [PATCH 395/494] Enable approximation of implicit module types --- implicit.fail | 3 +++ typing/typecore.ml | 64 ++++++++++++++++++++++------------------------ 2 files changed, 33 insertions(+), 34 deletions(-) diff --git a/implicit.fail b/implicit.fail index 926d2918c6..0ca5021188 100644 --- a/implicit.fail +++ b/implicit.fail @@ -10,6 +10,9 @@ let f (x : 'a) (implicit M : T) = (x : M.t); ();; (* OK *) let f (implicit M : T) (x : M.t) y = (y : M.t); ();; +(* OK if type approx is improved *) +let rec f (implicit M : T) (x : M.t) = ();; + (* BAD *) let rec f (implicit M : T) (x : M.t) y = (y : M.t); ();; diff --git a/typing/typecore.ml b/typing/typecore.ml index 84689c2bec..97c555ddd9 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1499,35 +1499,55 @@ let rec approx_type env sty = newty (Ttuple (List.map (approx_type env) args)) | Ptyp_constr (lid, ctl) -> begin try + Format.eprintf "looking_up @[%a@]\n%!" Printtyp.longident lid.txt; let (path, decl) = Env.lookup_type lid.txt env in if List.length ctl <> decl.type_arity then raise Not_found; let tyl = List.map (approx_type env) ctl in newconstr path tyl - with Not_found -> newvar () + with Not_found -> + Format.eprintf "@[%a@] not found\n%!" Printtyp.longident lid.txt; + newvar () end | Ptyp_poly (_, sty) -> approx_type env sty | _ -> newvar () +let pat_approx env spat = + match spat.ppat_desc with + | Ppat_constraint (_, sty) -> + let ty = approx_type env sty in + Format.eprintf "approx_constraint @[%a@]\n%!" + Printtyp.type_expr ty; + ty + | _ -> newvar () + let rec type_approx env sexp = match sexp.pexp_desc with Pexp_let (_, _, e) -> type_approx env e - | Pexp_fun (Parr_optional s, _, _, e) -> - newty (Tarrow(Tarr_optional s, type_option (newvar ()), + | Pexp_fun (Parr_optional s, _, lhs, e) -> + newty (Tarrow(Tarr_optional s, type_option (pat_approx env lhs), type_approx env e, Cok)) (* Traversing implicit in type_approx might be a bad idea: the type variable created here has a level lower than the one in which the implicit will be bound, and might cause type escape errors. FIXME *) - | Pexp_fun (Parr_implicit s, _, _, e) - let id, env = - Env.enter_module ~arg:true ~implicit_:(Implicit 0) - s (Mty_signature []) env + | Pexp_fun (Parr_implicit s, _, lhs, e) -> + let loc, (ppath, pcstrs) = match lhs.ppat_desc with + | Ppat_constraint (_, {ptyp_desc = Ptyp_package pkg; ptyp_loc}) -> + ptyp_loc, pkg + | _ -> assert false in - newty (Tarrow(Tarr_implicit id, , + let pcstrs = List.map (fun (lid,cty) -> lid.txt, cty) pcstrs in + let p, cstrs, pkg_ty = create_package_type loc env (ppath.txt, pcstrs) in + let nl, tl = List.split cstrs in + let tl = List.map (fun cty -> cty.ctyp_type) tl in + let mty = !Ctype.modtype_of_package env loc p nl tl in + let id, env = + Env.enter_module ~arg:true ~implicit_:(Implicit 0) s mty env in + newty (Tarrow(Tarr_implicit id, pkg_ty, type_approx env e, Cok)) - | Pexp_fun (p, _, _, e) -> - newty (Tarrow(tarr_of_parr p, _, type_approx env e, Cok)) + | Pexp_fun (p, _, lhs, e) -> + newty (Tarrow(tarr_of_parr p, (pat_approx env lhs), type_approx env e, Cok)) | Pexp_function ({pc_rhs=e}::_) -> newty (Tarrow(Tarr_simple, newvar (), type_approx env e, Cok)) | Pexp_match (_, {pc_rhs=e}::_) -> type_approx env e @@ -1637,30 +1657,6 @@ let generalizable level ty = (* Hack to allow coercion of self. Will clean-up later. *) let self_coercion = ref ([] : (Path.t * Location.t list ref) list) -(* Helpers for packaged modules. *) -let create_package_type loc env (p, l) = - let s = !Typetexp.transl_modtype_longident loc env p in - let fields = List.map (fun (name, ct) -> - name, Typetexp.transl_simple_type env false ct) l in - let ty = newty (Tpackage (s, - List.map fst l, - List.map (fun (_, cty) -> cty.ctyp_type) fields)) - in - (s, fields, ty) - - let wrap_unpacks sexp unpacks = - let open Ast_helper in - List.fold_left - (fun sexp (name, loc) -> - Exp.letmodule ~loc:sexp.pexp_loc - (Mb.mk ~loc name - (Mod.unpack ~loc - (Exp.ident ~loc:name.loc - (mkloc (Longident.Lident name.txt) name.loc)))) - sexp - ) - sexp unpacks - (* Helpers for type_cases *) let contains_variant_either ty = From a564d5d6b9a27f36bfea70cc3633634010e12614 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 11 Jul 2014 20:06:05 +0100 Subject: [PATCH 396/494] New instantiation strategy --- examples.numbers | 6 +- typing/ctype.ml | 17 ------ typing/typecore.ml | 129 ++++++++++++++++++++--------------------- typing/typeimplicit.ml | 47 ++++++++++----- 4 files changed, 96 insertions(+), 103 deletions(-) diff --git a/examples.numbers b/examples.numbers index be0bcc9123..11b517ad2d 100644 --- a/examples.numbers +++ b/examples.numbers @@ -16,8 +16,8 @@ module NUM = struct let ( * ) (implicit M : NUM) = M.( * ) let ( / ) (implicit M : NUM) = M.( / ) let (~- ) (implicit M : NUM) = M.(~- ) - let zero (implicit M : NUM) = M.zero - let one (implicit M : NUM) = M.one + let zero (implicit M : NUM) () = M.zero + let one (implicit M : NUM) () = M.one let (~~) (implicit M : NUM) = M.of_int end;; @@ -88,5 +88,5 @@ open NUM;; open ORD;; assert ( ~~2 / ~~3 = 0 && ~~2 / ~~3 = 0.666666666666666666666666666666666666);; -let x = 1 + one + one;; +let x = 1 + one() + one();; let () = print_int x;; diff --git a/typing/ctype.ml b/typing/ctype.ml index a19f58ef09..cd6ad1a510 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -2890,23 +2890,6 @@ let expand_head_trace env t = (2) the original label is not optional *) -let filter_arrow env t l = - let t = expand_head_trace env t in - match t.desc, l with - Tvar _, _ -> - let lv = t.level in - let t1 = newvar2 lv and t2 = newvar2 lv in - let t' = newty2 lv (Tarrow (l, t1, t2, Cok)) in - link_type t t'; - (t1, t2) - | Tarrow(l', t1, t2, _), _ - when l = l' || !Clflags.classic - && l = Tarr_simple - && arrows_are_compatible l l' -> - (t1, t2) - | _ -> - raise (Unify []) - let filter_arrow env t l = let t = expand_head_trace env t in match t.desc, l with diff --git a/typing/typecore.ml b/typing/typecore.ml index 97c555ddd9..03616df025 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1801,7 +1801,7 @@ and type_expect_ ?in_function env sexp ty_expected = let name = Path.name ~paren:Oprint.parenthesized_ident path in Stypes.record (Stypes.An_ident (loc, name, annot)) end; - let expr = { + rue { exp_desc = begin match desc.val_kind with Val_ivar (_, cl_num) -> @@ -1810,8 +1810,8 @@ and type_expect_ ?in_function env sexp ty_expected = in Texp_instvar(self_path, path, match lid.txt with - Longident.Lident txt -> { txt; loc = lid.loc } - | _ -> assert false) + Longident.Lident txt -> { txt; loc = lid.loc } + | _ -> assert false) | Val_self (_, _, cl_num, _) -> let (path, _) = Env.lookup_value (Longident.Lident ("self-" ^ cl_num)) env @@ -1825,14 +1825,11 @@ and type_expect_ ?in_function env sexp ty_expected = Texp_ident(path, lid, desc)*) | _ -> Texp_ident(path, lid, desc) - end; + end; exp_loc = loc; exp_extra = []; exp_type = instance env desc.val_type; exp_attributes = sexp.pexp_attributes; - exp_env = env; - } in - let expr = Typeimplicit.instantiate_implicits_expr env expr in - rue expr + exp_env = env } end | Pexp_constant(Const_string (str, _) as cst) -> ( (* Terrible hack for format strings *) @@ -1983,26 +1980,22 @@ and type_expect_ ?in_function env sexp ty_expected = end_def (); wrap_trace_gadt_instances env (lower_args []) ty; begin_def (); - let pending = Typeimplicit.extract_pending_implicits funct in - let (args, ty_res) = type_application env funct pending sargs in + let (args, ty_res) = type_application env funct sargs in let args = List.map - (fun (arr,expo) -> make_argument (tapp_of_tarr arr, expo)) + (fun (arr,argo) -> match argo with + | None -> make_argument (tapp_of_tarr arr, None) + | Some arg -> arg) args in end_def (); unify_var env (newvar()) funct.exp_type; - (* args can be empty if all arguments specified were of the form - (implicit M) *) - begin match args with - | [] -> funct - | args -> - rue { - exp_desc = Texp_apply(funct, args); - exp_loc = loc; exp_extra = []; - exp_type = ty_res; - exp_attributes = sexp.pexp_attributes; - exp_env = env } - end + rue { + exp_desc = Texp_apply(funct, args); + exp_loc = loc; exp_extra = []; + exp_type = ty_res; + exp_attributes = sexp.pexp_attributes; + exp_env = env; + } | Pexp_match(sarg, caselist) -> begin_def (); let arg = type_exp env sarg in @@ -3340,8 +3333,9 @@ and type_argument env sarg ty_expected' ty_expected = texp and type_application env funct - (pending : Typeimplicit.pending_implicit list) - (sargs : (Parsetree.apply_flag * Parsetree.expression) list) = + (sargs : (Parsetree.apply_flag * Parsetree.expression) list) + : (arrow_flag * argument option) list * type_expr + = (* funct.exp_type may be generic *) let sargs = List.map (fun (app,e) -> tapp_of_papp app, e) sargs in let has_label l ty_fun = @@ -3359,7 +3353,7 @@ and type_application env funct ty_fun: type of the function applied *) let rec type_unknown_args - (typed : (Types.arrow_flag * (unit -> Typedtree.expression) option) list) + (typed : (Types.arrow_flag * (unit -> Typedtree.argument) option) list) omitted ty_fun = function [] -> (List.map @@ -3383,9 +3377,7 @@ and type_application env funct Location.prerr_warning sarg1.pexp_loc Warnings.Unused_argument; unify env ty_fun (newty (Tarrow(arr1,t1,t2,Clink(ref Cunknown)))); (t1, t2) - | Tarrow (arr1,t1,t2,_) - when arrow_is_applicable arr1 app1 -> - (t1, t2) + | Tarrow (arr1,t1,t2,_) when arrow_is_applicable arr1 app1 -> (t1, t2) | td -> let ty_fun = match td with Tarrow _ -> newty td | _ -> ty_fun in @@ -3410,9 +3402,10 @@ and type_application env funct | _ -> false in if is_optional then - unify_exp env arg1 (type_option(newvar())); + unify_exp env arg1 (type_option (newvar ())); arg1 in + let arg1 () = make_argument (tapp_of_tarr arr1, Some (arg1 ())) in type_unknown_args ((arr1, Some arg1) :: typed) omitted ty2 sargl in let ignore_labels = @@ -3442,7 +3435,7 @@ and type_application env funct Location.prerr_warning loc w end in - let sargs, more_sargs, arg = + let sargs, more_sargs, loc, arg = if ignore_labels && not (arrow_is_optional arr) then begin (* In classic mode, omitted = [] *) match sargs, more_sargs with @@ -3454,7 +3447,7 @@ and type_application env funct raise(Error(sarg0.pexp_loc, env, Apply_wrong_label(app, ty_fun'))) else - ([], more_sargs, + ([], more_sargs, sarg0.pexp_loc, Some (fun () -> type_argument env sarg0 ty ty0)) | _ -> assert false @@ -3462,16 +3455,14 @@ and type_application env funct let (app, sarg0, sargs, more_sargs) = try let ((app, sarg0), sargs1, sargs2) = - extract_application arr sargs - in + extract_application arr sargs in if sargs1 <> [] then may_warn sarg0.pexp_loc (Warnings.Not_principal "commuting this argument"); (app, sarg0, sargs1 @ sargs2, more_sargs) with Not_found -> let ((app, sarg0), sargs1, sargs2) = - extract_application arr more_sargs - in + extract_application arr more_sargs in if sargs1 <> [] || sargs <> [] then may_warn sarg0.pexp_loc (Warnings.Not_principal "commuting this argument"); @@ -3500,30 +3491,48 @@ and type_application env funct (extract_option_type env ty) (extract_option_type env ty0))) end in - sargs, more_sargs, Some f + sargs, more_sargs, sarg0.pexp_loc, Some f with Not_found -> let f = if arrow_is_optional arr && (List.mem_assoc Tapp_simple sargs || - List.mem_assoc Tapp_simple more_sargs) then - begin - may_warn funct.exp_loc - (Warnings.Without_principality "eliminated optional argument"); - ignored := (arr,ty,lv) :: !ignored; - Some (fun () -> option_none (instance env ty) Location.none) - end - else - begin - may_warn funct.exp_loc - (Warnings.Without_principality "commuted an argument"); - None - end + List.mem_assoc Tapp_simple more_sargs) + then begin + may_warn funct.exp_loc + (Warnings.Without_principality "eliminated optional argument"); + ignored := (arr,ty,lv) :: !ignored; + Some (fun () -> option_none (instance env ty) Location.none) + end + else begin + may_warn funct.exp_loc + (Warnings.Without_principality "commuted an argument"); + None + end in - sargs, more_sargs, f + sargs, more_sargs, funct.exp_loc, f + in + let arg = match arr with + | Tarr_implicit id -> + let inst = + Typeimplicit.instantiate_one_implicit loc env id ty ty_fun in + let argument = inst.Typeimplicit.implicit_argument in + begin match arg with + | None -> Some (fun () -> argument) + | Some f -> + Some (fun () -> + argument.arg_expression <- Some (f ()); + argument) + end + | _ -> match arg with + | None -> None + | Some f -> + Some (fun () -> make_argument (tapp_of_tarr arr, Some (f ()))) in let omitted = match arr, arg with (* Applied arguments don't affect omitted list *) | _, Some _ -> omitted + (* Implicit arguments have been wrapper before *) + | Tarr_implicit _, None -> assert false (* Other undefined arguments are remembered as omitted *) | _, None -> (arr,ty,lv) :: omitted in @@ -3539,22 +3548,9 @@ and type_application env funct type_unknown_args typed omitted ty_fun0 (sargs @ more_sargs) in - let rec type_implicits args' args pending = - match pending, args with - | [], _ - | _, [] -> List.rev_append args' args, pending - | (inst :: pending), ((Tapp_implicit,arg) :: args) -> - let p, nl, tl = inst.Typeimplicit.implicit_type in - let package_ty = newgenty (Tpackage (p,nl,tl)) in - Typeimplicit.Link.to_expr - inst (type_expect env arg package_ty); - type_implicits args' args pending - | _, (arg :: args) -> - type_implicits (arg :: args') args pending - in match funct.exp_desc, sargs with (* Special case for ignore: avoid discarding warning *) - Texp_ident (_, _, {val_kind=Val_prim{Primitive.prim_name="%ignore"}}), + | Texp_ident (_, _, {val_kind=Val_prim{Primitive.prim_name="%ignore"}}), [Tapp_simple, sarg] -> let ty_arg, ty_res = filter_arrow env (instance env funct.exp_type) Tarr_simple in let exp = type_expect env sarg ty_arg in @@ -3565,10 +3561,9 @@ and type_application env funct add_delayed_check (fun () -> check_application_result env false exp) | _ -> () end; - ([Tarr_simple, Some exp], ty_res) + ([Tarr_simple, Some (make_argument (Tapp_simple, Some exp))], ty_res) | _ -> let ty = funct.exp_type in - let sargs, pending = type_implicits [] sargs pending in if ignore_labels then type_args [] [] ty (instance env ty) ty [] sargs else diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index e94ac77e1a..b59b24a408 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -95,6 +95,37 @@ let rec has_implicit ty = match (repr ty).desc with | Tarrow (_,_,rhs,_) -> has_implicit rhs | _ -> false +let instantiate_one_implicit loc env id ty_arg ty_res = + let inst = match (repr ty_arg).desc with + | Tpackage (p,nl,tl) -> { + implicit_id = id; + implicit_env = env; + implicit_loc = loc; + implicit_type = (p,nl,tl); + implicit_constraints = []; + implicit_argument = { + arg_flag = Tapp_implicit; + arg_expression = None + }; + } + | _ -> assert false + in + let add_constraint ty tyvar = + inst.implicit_constraints <- + (ty, tyvar) :: inst.implicit_constraints + in + let unlink_ident ident = + if Ident.same inst.implicit_id ident then + Some add_constraint + else + None + in + (* Unlink main types *) + let unlink_it = unlink env unlink_ident in + unlink_it.it_type_expr unlink_it ty_res; + pending_implicits := inst :: !pending_implicits; + inst + let instantiate_implicits_ty loc env ty = if not (has_implicit ty) then [], [], ty else @@ -220,22 +251,6 @@ module Link = struct to_path inst path end -(* Extraction of pending implicit arguments *) -let extract_pending_implicits expr = - let rec traverse acc = function - | {exp_desc = Texp_apply (exp,args); _} -> - let is_pending = function - | {arg_flag = Tapp_implicit; arg_expression = None} -> true - | _ -> false - in - traverse (List.filter is_pending args @ acc) exp - | _ -> acc - in - List.map (fun argument -> - List.find (fun inst -> inst.implicit_argument == argument) - !pending_implicits) - (traverse [] expr) - (* Forward reference to be initialized by Implicitsearch *) let generalize_implicits_ref : (unit -> unit) ref From 91c4bb2f7a5c51b7d39279a26508e216a67f5d27 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 23 Jul 2014 13:54:34 +0100 Subject: [PATCH 397/494] Fix handling of implicit binders in Subst & Typeimplicit.unlink --- typing/subst.ml | 7 ++----- typing/typecore.ml | 7 ++++++- typing/typeimplicit.ml | 27 +++++++++++++++++++-------- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/typing/subst.ml b/typing/subst.ml index 4d1f923d69..9eacbfc7fe 100644 --- a/typing/subst.ml +++ b/typing/subst.ml @@ -184,11 +184,8 @@ let rec typexp s ty = end | Tfield(label, kind, t1, t2) when field_kind_repr kind = Fabsent -> Tlink (typexp s t2) - | Tarrow(Tarr_implicit id, t1, t2, c) -> - let t1' = typexp s t1 in - let id' = Ident.rename id in - let t2' = typexp (add_module id (Pident id') s) t2 in - Tarrow (Tarr_implicit id', t1', t2', copy_commu c) + | Tarrow(Tarr_implicit id, _, _, _) when Tbl.mem id s.modules -> + assert false | _ -> copy_type_desc (typexp s) desc end; ty' diff --git a/typing/typecore.ml b/typing/typecore.ml index 03616df025..c94df66ceb 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1963,6 +1963,11 @@ and type_expect_ ?in_function env sexp ty_expected = begin_def (); (* one more level for non-returning functions *) if !Clflags.principal then begin_def (); let funct = type_exp env sfunct in + let funct = + if Typeimplicit.has_implicit funct.exp_type then + {funct with exp_type = Subst.type_expr Subst.identity funct.exp_type} + else + funct in if !Clflags.principal then begin end_def (); generalize_structure funct.exp_type @@ -3514,7 +3519,7 @@ and type_application env funct let arg = match arr with | Tarr_implicit id -> let inst = - Typeimplicit.instantiate_one_implicit loc env id ty ty_fun in + Typeimplicit.instantiate_one_implicit loc env id ty [ty_fun;ty_fun0] in let argument = inst.Typeimplicit.implicit_argument in begin match arg with | None -> Some (fun () -> argument) diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index b59b24a408..7a7f491a82 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -60,16 +60,22 @@ let unlink env unlink_on = register ty tyvar in - let it_type_expr it ty = + (* When crossing an implicit binder, prevent unlinking it in the rhs by + registering it in shadow_tbl *) + let rec it_type_expr shadow_tbl it ty = let ty = repr ty in - (* First recurse in sub expressions *) - type_iterators.it_type_expr it ty; (* Then replace current type if it is a constructor referring to an implicit *) match ty.desc with | Tconstr (path,args,_) -> - begin match unlink_on (Path.head path) with + (* First recurse in sub expressions *) + type_iterators.it_type_expr it ty; + let ident = Path.head path in + begin match unlink_on ident with | None -> () + (* Identifier is shadowed, skip unlinking *) + | Some register when Ident.mem ident shadow_tbl -> + (*assert false*) () | Some register -> let ty' = newvar () in (* Swap `ty' with a fresh variable *) @@ -81,10 +87,15 @@ let unlink env unlink_on = ty'.level <- lv; add_constraint register path ty' ty end - | _ -> () + | Tarrow (Tarr_implicit id, lhs, rhs, _) -> + it_type_expr shadow_tbl it lhs; + let shadow_tbl = Ident.add id () shadow_tbl in + let it = {it with it_type_expr = it_type_expr shadow_tbl} in + it_type_expr shadow_tbl it rhs + | _ -> type_iterators.it_type_expr it ty in - {type_iterators with it_type_expr = it_type_expr} + {type_iterators with it_type_expr = it_type_expr Ident.empty} let pending_implicits : pending_implicit list ref @@ -115,14 +126,14 @@ let instantiate_one_implicit loc env id ty_arg ty_res = (ty, tyvar) :: inst.implicit_constraints in let unlink_ident ident = - if Ident.same inst.implicit_id ident then + if Ident.same id ident then Some add_constraint else None in (* Unlink main types *) let unlink_it = unlink env unlink_ident in - unlink_it.it_type_expr unlink_it ty_res; + List.iter (unlink_it.it_type_expr unlink_it) ty_res; pending_implicits := inst :: !pending_implicits; inst From 73a94fa5d64ea0a9bcab3d43d4037fc27222b82e Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 23 Jul 2014 13:57:56 +0100 Subject: [PATCH 398/494] Typecore: disable approximation of implicit arguments --- typing/typecore.ml | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/typing/typecore.ml b/typing/typecore.ml index c94df66ceb..9e43f7088f 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1512,25 +1512,15 @@ let rec approx_type env sty = approx_type env sty | _ -> newvar () -let pat_approx env spat = - match spat.ppat_desc with - | Ppat_constraint (_, sty) -> - let ty = approx_type env sty in - Format.eprintf "approx_constraint @[%a@]\n%!" - Printtyp.type_expr ty; - ty - | _ -> newvar () - let rec type_approx env sexp = match sexp.pexp_desc with Pexp_let (_, _, e) -> type_approx env e | Pexp_fun (Parr_optional s, _, lhs, e) -> - newty (Tarrow(Tarr_optional s, type_option (pat_approx env lhs), + newty (Tarrow(Tarr_optional s, type_option (newvar ()), type_approx env e, Cok)) (* Traversing implicit in type_approx might be a bad idea: the type variable created here has a level lower than the one in which the implicit will be bound, and might cause type escape errors. - FIXME *) | Pexp_fun (Parr_implicit s, _, lhs, e) -> let loc, (ppath, pcstrs) = match lhs.ppat_desc with | Ppat_constraint (_, {ptyp_desc = Ptyp_package pkg; ptyp_loc}) -> @@ -1546,10 +1536,13 @@ let rec type_approx env sexp = Env.enter_module ~arg:true ~implicit_:(Implicit 0) s mty env in newty (Tarrow(Tarr_implicit id, pkg_ty, type_approx env e, Cok)) + FIXME *) + | Pexp_fun (Parr_implicit _, _, _, _) -> + newvar () | Pexp_fun (p, _, lhs, e) -> - newty (Tarrow(tarr_of_parr p, (pat_approx env lhs), type_approx env e, Cok)) + newty (Tarrow(tarr_of_parr p, newvar (), type_approx env e, Cok)) | Pexp_function ({pc_rhs=e}::_) -> - newty (Tarrow(Tarr_simple, newvar (), type_approx env e, Cok)) + newty (Tarrow(Tarr_simple, newvar (), type_approx env e, Cok)) | Pexp_match (_, {pc_rhs=e}::_) -> type_approx env e | Pexp_try (e, _) -> type_approx env e | Pexp_tuple l -> newty (Ttuple(List.map (type_approx env) l)) From 15ae925c3df2ed54da77e133f00d7f836ff2f642 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 23 Jul 2014 14:01:07 +0100 Subject: [PATCH 399/494] TEMPORARY: Make debug printing of identifier optional --- typing/printtyp.ml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/typing/printtyp.ml b/typing/printtyp.ml index 599c56e670..a15d4e1ec6 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -35,7 +35,11 @@ let unique_names = ref Ident.empty module Ident = struct include Ident - let name id = name id ^ "/" ^ string_of_int id.stamp + let name = + if (try Sys.getenv "DEBUG" = "1" with Not_found -> false) then + (fun id -> name id ^ "/" ^ string_of_int id.stamp) + else + name end let ident_name id = From 01c6ae650a221b75878d9fdf8475055df774d60b Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 23 Jul 2014 14:18:18 +0100 Subject: [PATCH 400/494] Comment some printf-debugging --- Makefile | 4 ++-- typing/ctype.ml | 12 ++++++------ typing/env.ml | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 229d5ae119..5dd7bf36bc 100644 --- a/Makefile +++ b/Makefile @@ -19,9 +19,9 @@ include stdlib/StdlibModules CAMLC=$(CAMLRUN) boot/ocamlc -nostdlib -I boot CAMLOPT=$(CAMLRUN) ./ocamlopt -nostdlib -I stdlib -I otherlibs/dynlink -COMPFLAGS=-strict-sequence -w +33..39+48+50 -warn-error A -bin-annot \ +COMPFLAGS=-strict-sequence -w +33..39+48 -warn-error A -bin-annot \ -safe-string $(INCLUDES) -LINKFLAGS= +LINKFLAGS=-g YACCFLAGS=-v CAMLLEX=$(CAMLRUN) boot/ocamllex diff --git a/typing/ctype.ml b/typing/ctype.ml index cd6ad1a510..98baa2d8ef 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -2354,9 +2354,9 @@ let unify_eq env t1 t2 = with Not_found -> false let rec unify (env:Env.t ref) t1 t2 = - Format.fprintf Format.err_formatter + (*Format.fprintf Format.err_formatter "unify %a and %a\n\n%!" - !printtyp_expr t1 !printtyp_expr t2; + !printtyp_expr t1 !printtyp_expr t2;*) (* First step: special cases (optimizations) *) if t1 == t2 then () else let t1 = repr t1 in @@ -2997,9 +2997,9 @@ let may_instantiate inst_nongen t1 = else t1.level = generic_level let rec moregen inst_nongen type_pairs subst env t1 t2 = - Format.fprintf Format.err_formatter + (*Format.fprintf Format.err_formatter "moregen %a and %a\n\n%!" - !printtyp_expr t1 !printtyp_expr t2; + !printtyp_expr t1 !printtyp_expr t2;*) if t1 == t2 then () else let t1 = repr t1 in let t2 = repr t2 in @@ -3285,9 +3285,9 @@ let normalize_subst subst = then subst := List.map (fun (t1,t2) -> repr t1, repr t2) !subst let rec eqtype rename type_pairs subst env t1 t2 = - Format.fprintf Format.err_formatter + (*Format.fprintf Format.err_formatter "eqtype %a and %a\n\n%!" - !printtyp_expr t1 !printtyp_expr t2; + !printtyp_expr t1 !printtyp_expr t2;*) if t1 == t2 then () else let t1 = repr t1 in let t2 = repr t2 in diff --git a/typing/env.ml b/typing/env.ml index 92636f2545..040ed7f525 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -656,7 +656,7 @@ let rec implicit_level path env = Pident id -> begin match Ident.find_same id env.implicit_flags with | { implicit_level = Some level } -> - Format.eprintf "found level %d for %s\n\n%!" level (Ident.name id); + (*Format.eprintf "found level %d for %s\n\n%!" level (Ident.name id);*) level | _ -> raise Not_found end From b213387b733920440b882a46c92e140a51ba9055 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bour?= <frederic.bour@lakaban.net> Date: Thu, 24 Jul 2014 08:37:52 +0100 Subject: [PATCH 401/494] Fix typechecking of some implicit constructs Typecore: - unknown implicit arguments raises an error during application - approx_type has to do proper typing of implicit arguments and go through lhs (FIXME: will fail in some cases...) Env: - set level of implicit when crossing binder (FIXME: cleanup) --- typing/ctype.ml | 2 ++ typing/typecore.ml | 49 ++++++++++++++++++++++++++++++++++++--------- typing/typecore.mli | 1 + 3 files changed, 42 insertions(+), 10 deletions(-) diff --git a/typing/ctype.ml b/typing/ctype.ml index 98baa2d8ef..b2606d3d91 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -2490,6 +2490,8 @@ and unify3 env t1 t1' t2 t2' = let env' = Env.add_module id1 mty !env in let env' = Env.forbid_implicit_occur id1 env' in let env' = Env.forbid_implicit_occur id2 env' in + let env' = Env.set_implicit_level id1 (get_current_level ()) env' in + let env' = Env.set_implicit_level id2 (get_current_level ()) env' in env := env'; let subst = Subst.add_module id2 (Path.Pident id1) Subst.identity in let u2 = Subst.type_expr subst u2 in diff --git a/typing/typecore.ml b/typing/typecore.ml index 9e43f7088f..4819a8fa69 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -30,6 +30,7 @@ type error = | Orpat_vars of Ident.t | Expr_type_clash of (type_expr * type_expr) list | Apply_non_function of type_expr + | Apply_unexpected_implicit of type_expr | Apply_wrong_label of apply_flag * type_expr | Label_multiply_defined of string | Label_missing of Ident.t list @@ -1484,17 +1485,26 @@ and is_nonexpansive_opt = function let rec approx_type env sty = match sty.ptyp_desc with - | Ptyp_arrow (Parr_optional s, _, sty) -> - let ty1 = type_option (newvar ()) in + | Ptyp_arrow (Parr_optional s, lhs, sty) -> + let ty1 = type_option (approx_type env lhs) in newty (Tarrow (Tarr_optional s, ty1, approx_type env sty, Cok)) - | Ptyp_arrow (Parr_implicit s, _, sty) -> - let id, env = - Env.enter_module ~arg:true ~implicit_:(Implicit 0) - s (Mty_signature []) env + | Ptyp_arrow (Parr_implicit s, lhs, sty) -> + let loc, (ppath, pcstrs) = match lhs with + | {ptyp_desc = Ptyp_package pkg; ptyp_loc} -> + ptyp_loc, pkg + | _ -> assert false in - newty (Tarrow (Tarr_implicit id, newvar (), approx_type env sty, Cok)) - | Ptyp_arrow (p, _, sty) -> - newty (Tarrow (tarr_of_parr p, newvar (), approx_type env sty, Cok)) + let pcstrs = List.map (fun (lid,cty) -> lid.txt, cty) pcstrs in + let p, cstrs, pkg_ty = create_package_type loc env (ppath.txt, pcstrs) in + let nl, tl = List.split cstrs in + let tl = List.map (fun cty -> cty.ctyp_type) tl in + let mty = !Ctype.modtype_of_package env loc p nl tl in + let id, env = + Env.enter_module ~arg:true ~implicit_:(Implicit 0) s mty env in + newty (Tarrow(Tarr_implicit id, pkg_ty, + approx_type env sty, Cok)) + | Ptyp_arrow (p, lhs, sty) -> + newty (Tarrow (tarr_of_parr p, approx_type env lhs, approx_type env sty, Cok)) | Ptyp_tuple args -> newty (Ttuple (List.map (approx_type env) args)) | Ptyp_constr (lid, ctl) -> @@ -3370,6 +3380,10 @@ and type_application env funct false | _ -> true in + if app1 = Tapp_implicit then + raise (Error (sarg1.pexp_loc, env, + Apply_unexpected_implicit + (expand_head env funct.exp_type))); let arr1 = tarr_of_tapp app1 in if ty_fun.level >= t1.level && not_identity funct.exp_desc then Location.prerr_warning sarg1.pexp_loc Warnings.Unused_argument; @@ -3380,6 +3394,9 @@ and type_application env funct let ty_fun = match td with Tarrow _ -> newty td | _ -> ty_fun in let ty_res = application_result_type (omitted @ !ignored) ty_fun in + if app1 = Tapp_implicit then + raise (Error(sarg1.pexp_loc, env, + Apply_wrong_label (Tapp_implicit, ty_res))); let arr1 = tarr_of_tapp app1 in match ty_res.desc with Tarrow _ -> @@ -4099,11 +4116,23 @@ let report_error env ppf = function type_expr typ "This is not a function; it cannot be applied." end + | Apply_unexpected_implicit typ -> + reset_and_mark_loops typ; + begin match (repr typ).desc with + Tarrow _ -> + fprintf ppf "@[<v>@[<2>This function has type@ %a@]" + type_expr typ; + fprintf ppf "@ It can't be applied to an implicit argument.@]" + | _ -> + fprintf ppf "@[<v>@[<2>This expression has type@ %a@]@ %s@]" + type_expr typ + "This is not a function; it cannot be applied an implicit argument." + end | Apply_wrong_label (Tapp_implicit, ty) -> reset_and_mark_loops ty; fprintf ppf "@[<v>@[<2>The function applied to this argument has type@ %a@]@.\ - This implicit argument cannot be applied]" + This implicit argument cannot be applied@]" type_expr ty | Apply_wrong_label (l, ty) -> let print_label ppf = function diff --git a/typing/typecore.mli b/typing/typecore.mli index 436bf84bef..9348e7da1d 100644 --- a/typing/typecore.mli +++ b/typing/typecore.mli @@ -75,6 +75,7 @@ type error = | Orpat_vars of Ident.t | Expr_type_clash of (type_expr * type_expr) list | Apply_non_function of type_expr + | Apply_unexpected_implicit of type_expr | Apply_wrong_label of apply_flag * type_expr | Label_multiply_defined of string | Label_missing of Ident.t list From 267cdbf7f62efa00ef8feafad91a200af14b8efe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bour?= <frederic.bour@lakaban.net> Date: Thu, 24 Jul 2014 08:47:20 +0100 Subject: [PATCH 402/494] Imp_control/Imp_data: basic implicit libraries --- imp_control.ml | 138 ++++++++++++++++++ imp_data.ml | 372 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 510 insertions(+) create mode 100644 imp_control.ml create mode 100644 imp_data.ml diff --git a/imp_control.ml b/imp_control.ml new file mode 100644 index 0000000000..48339d56d3 --- /dev/null +++ b/imp_control.ml @@ -0,0 +1,138 @@ +module type Functor = sig + type 'a t + val fmap : ('a -> 'b) -> 'a t -> 'b t +end + +module Functor = struct + let fmap (implicit M : Functor) = M.fmap +end + +module type Applicative = sig + include Functor + val pure : 'a -> 'a t + val apply : ('a -> 'b) t -> 'a t -> 'b t +end + +module Applicative = struct + let pure (implicit M : Applicative) = M.pure + let apply (implicit M : Applicative) = M.apply +end + +module type Monad = sig + include Functor + val return : 'a -> 'a t + val bind : 'a t -> ('a -> 'b t) -> 'b t +end + +module Monad = struct + let return (implicit M : Monad) = M.return + let bind (implicit M : Monad) = M.bind +end + +module type Monad_plus = sig + include Monad + val mzero : unit -> 'a t + val mplus : 'a t -> 'a t -> 'a t +end + +module Monad_plus = struct + let mzero (implicit M : Monad_plus) = M.mzero + let mplus (implicit M : Monad_plus) = M.mplus + + let mguard (implicit M : Monad_plus) b = + if b then + M.return () + else + M.mzero () +end + +module type Foldable = sig + type 'a t + val fold : ('a -> 'b -> 'b) -> 'a t -> 'b -> 'b +end + +module Foldable = struct + let fold (implicit F : Foldable) = F.fold +end + +module type Traversable = sig + include Functor + val traverse : (implicit F : Applicative) -> + ('a -> 'b F.t) -> 'a t -> 'b t F.t +end + +module Traversable = struct + let traverse (implicit T : Traversable) = T.traverse +end + +implicit module Option = struct + type 'a t = 'a option + + (* Functor *) + let fmap f = function + | None -> None + | Some a -> Some (f a) + + (* Applicative *) + let pure x = Some x + let apply f x = match f, x with + | Some f, Some x -> Some (f x) + | _, _ -> None + + (* Monad *) + let return x = Some x + let bind x f = match x with + | None -> None + | Some x -> f x + + (* Monad_plus *) + let mzero = None + let mplus a b = match a with + | None -> b + | Some _ -> a + + (* Foldable *) + let fold f t acc = match t with + | None -> acc + | Some x -> f x acc + + (* Traversable *) + let traverse (implicit F : Applicative) f = function + | None -> F.pure None + | Some x -> F.apply (F.pure (fun x -> Some x)) (f x) +end + +implicit module List = struct + type 'a t = 'a list + + (* Functor *) + let fmap = List.map + + (* Monad *) + let return x = [x] + let bind x f = + let rec aux acc = function + | x :: xs -> aux (x @ acc) xs + | [] -> acc in + aux [] (List.rev_map f x) + + (* Applicative *) + let pure x = [x] + let apply fs xs = bind fs (bind xs) + + (* Monad_plus *) + let mzero = [] + let mplus = (@) + + (* Foldable *) + let rec fold f t acc = match t with + | [] -> acc + | x :: xs -> fold f xs (f x acc) + + (* Traversable *) + let traverse (implicit F : Applicative) f t = + let cons = F.pure (fun x xs -> x :: xs) in + let cons x xs = F.apply (F.apply cons (F.pure (f x))) xs in + fold cons t (F.pure []) +end + diff --git a/imp_data.ml b/imp_data.ml new file mode 100644 index 0000000000..c2656fc945 --- /dev/null +++ b/imp_data.ml @@ -0,0 +1,372 @@ +module type Any = sig + type t +end + +module type Show = sig + type t + val to_string: t -> string + val buffer_add : Buffer.t -> t -> unit + val pp_print : Format.formatter -> t -> unit +end + +module Show = struct + let to_string (implicit M : Show) = M.to_string + let buffer_add (implicit M : Show) = M.buffer_add + let pp_print (implicit M : Show) = M.pp_print +end + +module type Eq = sig + type t + val ( = ) : t -> t -> bool +end + +module Eq = struct + let ( = ) (implicit M : Eq) = M.(=) +end + +module type Ord = sig + type t + val compare : t -> t -> int +end + +module Ord = struct + let ( = ) (implicit M : Ord) a b = M.compare a b = 0 + let ( <> ) (implicit M : Ord) a b = M.compare a b <> 0 + let ( < ) (implicit M : Ord) a b = M.compare a b < 0 + let ( <= ) (implicit M : Ord) a b = M.compare a b <= 0 + let ( > ) (implicit M : Ord) a b = M.compare a b > 0 + let ( >= ) (implicit M : Ord) a b = M.compare a b >= 0 + let compare (implicit M : Ord) = M.compare +end + +module type Num = sig + type t + val zero : t + val one : t + val of_int : int -> t + val ( + ) : t -> t -> t + val ( - ) : t -> t -> t + val ( * ) : t -> t -> t + val ( / ) : t -> t -> t + val (~- ) : t -> t +end + +module Num = struct + let zero (implicit M : Num) () = M.zero + let one (implicit M : Num) () = M.one + let of_int (implicit M : Num) = M.of_int + let ( + ) (implicit M : Num) = M.( + ) + let ( - ) (implicit M : Num) = M.( - ) + let ( * ) (implicit M : Num) = M.( * ) + let ( / ) (implicit M : Num) = M.( / ) + let (~- ) (implicit M : Num) = M.(~- ) +end + +module type Bounded = sig + type t + val bounds : t * t +end + +module Bounded = struct + let bounds (implicit M : Bounded) () = M.bounds +end + +module type Enum = sig + type t + val ( < ) : t -> t -> bool + val succ : t -> t + val pred : t -> t +end + +module Enum = struct + let succ (implicit M : Enum) x = M.succ + let pred (implicit M : Enum) x = M.pred + + let rec fold_enum_to + : (implicit M : Enum) -> M.t -> M.t -> (M.t -> 'a -> 'a) -> 'a -> 'a + = fun (implicit M : Enum) a b f acc -> + if M.(<) a b then + fold_enum_to (M.pred a) b f (f a acc) + else + acc + + let rec fold_enum_downto + : (implicit M : Enum) -> M.t -> M.t -> (M.t -> 'a -> 'a) -> 'a -> 'a + = fun (implicit M : Enum) a b f acc -> + if M.(<) b a then + fold_enum_downto (implicit M) (M.pred a) b f (f a acc) + else + acc + + let list_enum_to (implicit M : Enum) a b = + fold_enum_downto b a (fun x acc -> x :: acc) [] + + let list_enum_downto (implicit M : Enum) a b = + fold_enum_to b a (fun x acc -> x :: acc) [] +end + +module type Monoid = sig + type t + val empty : t + val append : t -> t -> t +end + +module Monoid = struct + let empty (implicit M : Monoid) () = M.empty + let append (implicit M : Monoid) = M.append +end + +(* Instances *) + +implicit module Int = struct + type t = int + + (* Show *) + let to_string = string_of_int + let buffer_add b i = Buffer.add_string b (to_string i) + let pp_print = Format.pp_print_int + + (* Eq *) + let ( = ) (a : int) b = a = b + + (* Ord *) + let compare (a : int) b = compare a b + + (* Num *) + let zero = 0 + let one = 1 + let of_int x = x + let ( + ) = ( + ) + let ( - ) = ( - ) + let ( * ) = ( * ) + let ( / ) = ( / ) + let (~- ) = (~- ) + + (* Bounded *) + let bounds = (min_int, max_int) + + (* Enum *) + let succ = succ + let pred = pred + + (* Monoid, addition *) + let empty = 0 + let append = (+) +end + +implicit module Float = struct + type t = float + + (* Show *) + let to_string = string_of_float + let buffer_add b i = Buffer.add_string b (to_string i) + let pp_print = Format.pp_print_float + + (* Eq *) + let ( = ) (a : float) b = a = b + + (* Ord *) + let compare (a : float) b = compare a b + + (* Num *) + let zero = 0. + let one = 1. + let of_int = float_of_int + let ( + ) = ( +.) + let ( - ) = ( -.) + let ( * ) = ( *.) + let ( / ) = ( /.) + let (~- ) = (~-.) + + (* Bounded *) + let bounds = (neg_infinity, infinity) + + (* Monoid, addition *) + let empty = 0. + let append = (+.) +end + +implicit module Bool = struct + type t = bool + + (* Show *) + let to_string = string_of_bool + let buffer_add b i = Buffer.add_string b (to_string i) + let pp_print = Format.pp_print_bool + + (* Eq *) + let ( = ) (a : bool) b = a = b + + (* Ord *) + let compare (a : bool) b = compare a b + + (* Bounded *) + let bounds = (neg_infinity, infinity) + + (* Enum *) + let succ = function + | false -> true + | true -> invalid_arg "Bool.succ" + + let pred = function + | true -> false + | false -> invalid_arg "Bool.pred" + + (* Monoid, addition *) + let empty = false + let append = (||) +end + +implicit module Char = struct + type t = char + + (* Show *) + let to_string c = String.escaped (String.make 1 c) + let buffer_add b c = Buffer.add_string b (to_string c) + let pp_print ppf c = Format.pp_print_string ppf c + + (* Eq *) + let ( = ) (a : char) b = a = b + + (* Ord *) + let compare (a : char) b = compare a b + + (* Bounded *) + let bounds = ('\000', '\255') + + (* Enum *) + let succ = function + | '\255' -> invalid_arg "Char.succ" + | n -> Char.chr (succ (Char.code n)) + + let pred = function + | '\000' -> invalid_arg "Char.succ" + | n -> Char.chr (pred (Char.code n)) +end + +implicit module String = struct + type t = string + + (* Show *) + let to_string = String.escaped + let buffer_add b s = Buffer.add_string b (to_string s) + let pp_print ppf s = Format.pp_print_string ppf (to_string s) + + (* Eq *) + let ( = ) (a : string) b = a = b + + (* Ord *) + let compare (a : string) b = compare a b + + (* Monoid *) + let empty = "" + let append = (^) +end + +implicit module Int32 = struct + type t = int32 + + (* Show *) + let to_string = Int32.to_string + let buffer_add b i = Buffer.add_string b (to_string i) + let pp_print ppf s = Format.pp_print_string ppf (to_string s) + + (* Eq *) + let ( = ) (a : int32) b = a = b + + (* Ord *) + let compare = Int32.compare + + (* Num *) + let zero = 0l + let one = 1l + let of_int = Int32.of_int + let ( + ) = Int32.add + let ( - ) = Int32.sub + let ( * ) = Int32.mul + let ( / ) = Int32.div + let (~- ) = Int32.neg + + (* Bounded *) + let bounds = (Int32.min_int, Int32.max_int) + + (* Enum *) + let succ = Int32.succ + let pred = Int32.pred + + (* Monoid, addition *) + let empty = 0l + let append = Int32.add +end + +implicit module Int64 = struct + type t = int64 + + (* Show *) + let to_string = Int64.to_string + let buffer_add b i = Buffer.add_string b (to_string i) + let pp_print ppf i = Format.pp_print_string ppf (to_string i) + + (* Eq *) + let ( = ) (a : int64) b = a = b + + (* Ord *) + let compare = Int64.compare + + (* Num *) + let zero = 0L + let one = 1L + let of_int = Int64.of_int + let ( + ) = Int64.add + let ( - ) = Int64.sub + let ( * ) = Int64.mul + let ( / ) = Int64.div + let (~- ) = Int64.neg + + (* Bounded *) + let bounds = (Int64.min_int, Int64.max_int) + + (* Enum *) + let succ = Int64.succ + let pred = Int64.pred + + (* Monoid, addition *) + let empty = 0L + let append = Int64.add +end + +implicit module Nativeint = struct + type t = nativeint + + (* Show *) + let to_string = Nativeint.to_string + let buffer_add b i = Buffer.add_string b (to_string i) + let pp_print ppf i = Format.pp_print_string ppf (to_string i) + + (* Eq *) + let ( = ) (a : nativeint) b = a = b + + (* Ord *) + let compare = Nativeint.compare + + (* Num *) + let zero = 0L + let one = 1L + let of_int = Nativeint.of_int + let ( + ) = Nativeint.add + let ( - ) = Nativeint.sub + let ( * ) = Nativeint.mul + let ( / ) = Nativeint.div + let (~- ) = Nativeint.neg + + (* Bounded *) + let bounds = (Nativeint.min_int, Nativeint.max_int) + + (* Enum *) + let succ = Nativeint.succ + let pred = Nativeint.pred + + (* Monoid, addition *) + let empty = 0L + let append = Nativeint.add +end From 9355e67e0ff5b3098470ada17b5a950427927a99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bour?= <frederic.bour@lakaban.net> Date: Thu, 24 Jul 2014 11:59:29 +0100 Subject: [PATCH 403/494] Sample scope management implicit module --- imp_scope.ml | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 imp_scope.ml diff --git a/imp_scope.ml b/imp_scope.ml new file mode 100644 index 0000000000..bb606631dc --- /dev/null +++ b/imp_scope.ml @@ -0,0 +1,34 @@ +module type Manageable = sig + type 'a t + type 'a value + type 'a lock + + val acquire : 'a t -> 'a lock * 'a value + val release : 'a lock -> unit +end + +let with_resource (implicit M : Manageable) r f = + let lock, value = M.acquire r in + try + let result = f value in + M.release lock; + result + with exn -> + M.release lock; + raise exn + +implicit module In_channel = struct + type 'a t = in_channel + type 'a value = in_channel + type 'a lock = in_channel + let acquire c = c, c + let release c = close_in_noerr c +end + +implicit module Out_channel = struct + type 'a t = out_channel + type 'a value = out_channel + type 'a lock = out_channel + let acquire c = c, c + let release c = close_out_noerr c +end From af19153852c19449dc33546d6f22445741fe19cc Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Tue, 29 Jul 2014 17:56:22 +0100 Subject: [PATCH 404/494] Implicitsearch: switch off printf-debugging --- typing/implicitsearch.ml | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index a2f7967159..55f4700265 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -25,6 +25,11 @@ let string_of_path path = let papply path arg = Path.Papply (path, arg) +let printf_output = + (*Format.std_formatter*) + Format.make_formatter (fun _ _ _ -> ()) (fun () -> ()) +let printf x = Format.fprintf printf_output x + (** [target] is the point from which a search starts *) type target = { (* The module type we try to find an instance for *) @@ -350,7 +355,7 @@ let remove_type_variables () = List.iter (function | Path.Pident id' as path, ty' when Ident.same id id' -> - Format.fprintf Format.err_formatter "unifying %a with %a (= %a)\n%!" + printf "unifying %a with %a (= %a)\n%!" Printtyp.type_expr ty Printtyp.type_expr ty' Printtyp.path path; @@ -551,10 +556,9 @@ end let report_error exn = try - Location.report_exception Format.err_formatter exn + Location.report_exception printf_output exn with exn -> - Format.fprintf Format.err_formatter - "%s\n%!" (Printexc.to_string exn) + printf "%s\n%!" (Printexc.to_string exn) (* Make the search stack explicit. @@ -663,11 +667,9 @@ end = struct state.eq_var := state.eq_initial; begin match state.debug_path with | Some path' -> - Format.fprintf Format.err_formatter - "%a (_) <- %a\n" Printtyp.path path' Printtyp.path path + printf "%a (_) <- %a\n" Printtyp.path path' Printtyp.path path | None -> - Format.fprintf Format.err_formatter - "_ <- %a\n" Printtyp.path path + printf "_ <- %a\n" Printtyp.path path end; let target = state.target in let sub_targets, candidate_mty = find_implicit_parameters md in @@ -675,8 +677,7 @@ end = struct (* Generate coercion. if this succeeds this produce equations in new_eqns and eq_var *) let eq_table, env = List.fold_left (fun (eq_table, env) sub_target -> - Format.fprintf Format.err_formatter - "Binding %a with type %a\n%!" + printf "Binding %a with type %a\n%!" Printtyp.ident sub_target.target_id Printtyp.modtype sub_target.target_type; Ident.add sub_target.target_id new_eqns eq_table, @@ -689,10 +690,10 @@ end = struct let tyl, tvl = List.split target.target_hkt in begin try Ctype.equal' env true tyl tvl with Ctype.Unify tls -> - Format.fprintf Format.err_formatter "Failed to instantiate %s with constraints:\n" + printf "Failed to instantiate %s with constraints:\n" (string_of_path path); List.iter2 (fun t1 t2 -> - Format.fprintf Format.err_formatter "\t%a = %a\n%!" + printf "\t%a = %a\n%!" Printtyp.type_expr t1 Printtyp.type_expr t2) tyl tvl; @@ -700,15 +701,15 @@ end = struct (fun ident _ acc -> Ident.name ident :: acc) eq_table [] in - Format.fprintf Format.err_formatter "Assuming the following equalities on %s:\n" + printf "Assuming the following equalities on %s:\n" (String.concat ", " accepting_eq); List.iter (fun {eq_lhs; eq_rhs} -> - Format.fprintf Format.err_formatter "\t%a = %a\n%!" + printf "\t%a = %a\n%!" Printtyp.type_expr eq_lhs Printtyp.type_expr eq_rhs) !(state.eq_var); - Format.fprintf Format.err_formatter "Because:\n%!"; + printf "Because:\n%!"; List.iter (fun (ty1,ty2) -> - Format.fprintf Format.err_formatter "\t%a != %a\n%!" + printf "\t%a != %a\n%!" Printtyp.type_expr ty1 Printtyp.type_expr ty2; let rec check_expansion ty = match (repr ty).desc with @@ -718,8 +719,7 @@ end = struct with Not_found -> try ignore (Env.find_type path env : _) with Not_found -> - Format.fprintf Format.err_formatter - "Fatal error: %a not found.\n%!" + printf "Fatal error: %a not found.\n%!" Printtyp.path path end; List.iter check_expansion args @@ -727,7 +727,7 @@ end = struct in check_expansion ty1; check_expansion ty2; - Format.fprintf Format.err_formatter "\n%!" + printf "\n%!" ) tls; raise Not_found end; From ab503bdadfb175113fb3af092ef543f227d86cf2 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Tue, 29 Jul 2014 17:56:37 +0100 Subject: [PATCH 405/494] Typecore: fix typing of application --- typing/typecore.ml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/typing/typecore.ml b/typing/typecore.ml index 4819a8fa69..f631607f61 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1488,8 +1488,9 @@ let rec approx_type env sty = | Ptyp_arrow (Parr_optional s, lhs, sty) -> let ty1 = type_option (approx_type env lhs) in newty (Tarrow (Tarr_optional s, ty1, approx_type env sty, Cok)) - | Ptyp_arrow (Parr_implicit s, lhs, sty) -> - let loc, (ppath, pcstrs) = match lhs with + | Ptyp_arrow (Parr_implicit _s, _lhs, _sty) -> + newvar () + (*let loc, (ppath, pcstrs) = match lhs with | {ptyp_desc = Ptyp_package pkg; ptyp_loc} -> ptyp_loc, pkg | _ -> assert false @@ -1502,7 +1503,7 @@ let rec approx_type env sty = let id, env = Env.enter_module ~arg:true ~implicit_:(Implicit 0) s mty env in newty (Tarrow(Tarr_implicit id, pkg_ty, - approx_type env sty, Cok)) + approx_type env sty, Cok))*) | Ptyp_arrow (p, lhs, sty) -> newty (Tarrow (tarr_of_parr p, approx_type env lhs, approx_type env sty, Cok)) | Ptyp_tuple args -> @@ -3451,7 +3452,10 @@ and type_application env funct end in let sargs, more_sargs, loc, arg = - if ignore_labels && not (arrow_is_optional arr) then begin + if (match arr with + | Tarr_optional _ | Tarr_implicit _ -> false + | _ -> ignore_labels) + then begin (* In classic mode, omitted = [] *) match sargs, more_sargs with | (app, sarg0) :: _, _ -> @@ -3546,7 +3550,7 @@ and type_application env funct let omitted = match arr, arg with (* Applied arguments don't affect omitted list *) | _, Some _ -> omitted - (* Implicit arguments have been wrapper before *) + (* Implicit arguments have been wrapped before *) | Tarr_implicit _, None -> assert false (* Other undefined arguments are remembered as omitted *) | _, None -> (arr,ty,lv) :: omitted From 035ca9dd02d3035b6bf0e70c3e2350ec1c33534c Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Tue, 29 Jul 2014 17:57:05 +0100 Subject: [PATCH 406/494] Add solution to g()"al" problem --- imp_goal.ml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 imp_goal.ml diff --git a/imp_goal.ml b/imp_goal.ml new file mode 100644 index 0000000000..bb01a89e8c --- /dev/null +++ b/imp_goal.ml @@ -0,0 +1,21 @@ +module type Goalish = sig + type t + val x : int -> t +end +implicit module Goal_string = struct + type t = string -> string + let x n s = "g" ^ String.make n 'o' ^ s +end +implicit functor Goal_unit (G : Goalish) = struct + type t = unit -> G.t + let x n () = G.x (n + 1) +end +let g (implicit G : Goalish) = G.x 0;; + +let () = + print_endline (g "al"); + print_endline (g () "al"); + print_endline (g () () "al"); + print_endline (g () () () "al"); + print_endline (g () () () () "al"); + print_endline (g () () () () () "al"); From 5d9e89eef6c485a3e70cca44f1c474f453ffae7f Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 30 Jul 2014 17:37:16 +0100 Subject: [PATCH 407/494] Fix typechecking of implicit application - Prevent warning 20 by giving specific name to implicit introduced type variables. - Add a "reunify_constraints" step when priting errors to try to get as close as possible to original signature. - Use DEBUG env var to control printf debugging in implicit code. - Reset pending implicits in toplevel before a new phrase. - Fix typechecking of explicit implicit arguments. - Don't cross implicit in [Typecore.approx_type], but instead always constrain patterns in Typecore.type_let when an expression constraint is provided --- parsing/pprintast.ml | 2 +- parsing/printast.ml | 4 +- toplevel/toploop.ml | 1 + typing/implicitsearch.ml | 33 ++++++----- typing/printtyp.ml | 11 +++- typing/printtyp.mli | 1 + typing/typecore.ml | 61 ++++++++++++++------ typing/typeimplicit.ml | 117 ++++++++++----------------------------- 8 files changed, 106 insertions(+), 124 deletions(-) diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index d0e32fdc95..99320d6ac9 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -1424,7 +1424,7 @@ class printer ()= object(self:'self) else pp f "~%s:%a" s self#simple_expr e | Papp_implicit -> - pp f "~implicit:%a" self#simple_expr e + pp f "(implicit %a)" self#simple_expr e method directive_argument f x = (match x with diff --git a/parsing/printast.ml b/parsing/printast.ml index 130b89642c..f06e5e26de 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -141,14 +141,14 @@ let arrow_flag f = function | Parr_simple -> () | Parr_optional s -> fprintf f "?%s" s | Parr_labelled s -> fprintf f "%s" s - | Parr_implicit s -> fprintf f "implicit %s" s + | Parr_implicit s -> fprintf f "(implicit %s)" s ;; let apply_flag f = function | Papp_simple -> () | Papp_optional s -> fprintf f "?%s" s | Papp_labelled s -> fprintf f "%s" s - | Papp_implicit -> fprintf f "implicit" + | Papp_implicit -> fprintf f "(implicit)" ;; let longident_loc i ppf li = line i ppf "%a\n" fmt_longident_loc li;; diff --git a/toplevel/toploop.ml b/toplevel/toploop.ml index 60a00a5059..55ad3f54ad 100644 --- a/toplevel/toploop.ml +++ b/toplevel/toploop.ml @@ -250,6 +250,7 @@ let execute_phrase print_outcome ppf phr = | Ptop_def sstr -> let oldenv = !toplevel_env in Typecore.reset_delayed_checks (); + Typeimplicit.reset_pending_implicits (); let (str, sg, newenv) = Typemod.type_toplevel_phrase oldenv sstr in if !Clflags.dump_typedtree then Printtyped.implementation ppf str; let sg' = Typemod.simplify_signature sg in diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 55f4700265..d673f21ab5 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -20,16 +20,18 @@ let rec list_findmap f = function | None -> list_findmap f xs | Some x' -> x' +let rec list_filtermap f = function + | [] -> [] + | x :: xs -> + match f x with + | None -> list_filtermap f xs + | Some x' -> x' :: list_filtermap f xs + let string_of_path path = Path.to_longident path |> Longident.flatten |> String.concat "." let papply path arg = Path.Papply (path, arg) -let printf_output = - (*Format.std_formatter*) - Format.make_formatter (fun _ _ _ -> ()) (fun () -> ()) -let printf x = Format.fprintf printf_output x - (** [target] is the point from which a search starts *) type target = { (* The module type we try to find an instance for *) @@ -939,25 +941,28 @@ let () = let generalize_implicits () = let current_level = get_current_level () in let not_linked = function - | {implicit_argument = {arg_expression = Some _}} -> false - | _ -> true - in - let pending = List.filter not_linked !pending_implicits in + | {implicit_argument = {arg_expression = Some _}} -> None + | inst -> Some inst in + let not_linkeds l = + match list_filtermap not_linked l with + | [] -> None + | xs -> Some xs in + let pending = list_filtermap not_linkeds !pending_implicits in let need_generalization inst = List.exists (fun (ty,var) -> assert (var.level <> generic_level); max ty.level var.level >= current_level) inst.implicit_constraints - || inst.implicit_constraints = [] - in + || inst.implicit_constraints = [] in + let need_generalization insts = + List.exists need_generalization insts in let to_generalize, rest = - List.partition need_generalization pending - in + List.partition need_generalization pending in pending_implicits := rest; (* The reversal is important to ensure we search from the outer most to the inner most implicits *) - let to_generalize = List.rev to_generalize in + let to_generalize = List.flatten (List.rev to_generalize) in try let not_instantiable inst = not (find_pending_instance inst) in let inst = List.find not_instantiable to_generalize in diff --git a/typing/printtyp.ml b/typing/printtyp.ml index a15d4e1ec6..57f4889364 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -66,17 +66,22 @@ let rec tree_of_path = function | Papply(p1, p2) -> Oide_apply (tree_of_path p1, tree_of_path p2) -let rec path ppf = function +let rec path ident ppf = function | Pident id -> ident ppf id | Pdot(Pident id, s, pos) when Ident.same id ident_pervasive -> pp_print_string ppf s | Pdot(p, s, pos) -> - path ppf p; + path ident ppf p; pp_print_char ppf '.'; pp_print_string ppf s | Papply(p1, p2) -> - fprintf ppf "%a(%a)" path p1 path p2 + fprintf ppf "%a(%a)" (path ident) p1 (path ident) p2 + +let stamped_path ppf = + path (fun ppf id -> fprintf ppf "%a/%d" ident id id.Ident.stamp) ppf + +let path ppf = path ident ppf let rec string_of_out_ident = function | Oide_ident s -> s diff --git a/typing/printtyp.mli b/typing/printtyp.mli index b4c6ad60fe..a25bf241e8 100644 --- a/typing/printtyp.mli +++ b/typing/printtyp.mli @@ -20,6 +20,7 @@ val longident: formatter -> Longident.t -> unit val ident: formatter -> Ident.t -> unit val tree_of_path: Path.t -> out_ident val path: formatter -> Path.t -> unit +val stamped_path: formatter -> Path.t -> unit val string_of_path: Path.t -> string val raw_type_expr: formatter -> type_expr -> unit diff --git a/typing/typecore.ml b/typing/typecore.ml index f631607f61..0c0e1e4482 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -3352,6 +3352,7 @@ and type_application env funct tvar || List.mem l ls in let ignored = ref [] in + let pending_implicits = ref [] in (* The main job of typing arguments is done by [type_args], see below. [type_unknown_args] is called after, receiving all arguments that didn't @@ -3365,6 +3366,10 @@ and type_application env funct (typed : (Types.arrow_flag * (unit -> Typedtree.argument) option) list) omitted ty_fun = function [] -> + (* Add pending implicits now, so that if an error is generated + while typechecking the arguments all constraints can be reunified + properly (see [Typeimplicit.reunify_constraints]) *) + Typeimplicit.add_pending_implicits !pending_implicits; (List.map (fun (flag,expr) -> flag, may_map ((|>) ()) expr) (List.rev typed), @@ -3373,8 +3378,11 @@ and type_application env funct let (ty1, ty2) = let ty_fun = expand_head env ty_fun in match ty_fun.desc with - Tvar _ -> - let t1 = newvar () and t2 = newvar () in + Tvar name -> + let name = match name with + | Some "imp#" -> name + | _ -> None in + let t1 = newvar ?name () and t2 = newvar ?name () in let not_identity = function Texp_ident(_,_,{val_kind=Val_prim {Primitive.prim_name="%identity"}}) -> @@ -3386,7 +3394,9 @@ and type_application env funct Apply_unexpected_implicit (expand_head env funct.exp_type))); let arr1 = tarr_of_tapp app1 in - if ty_fun.level >= t1.level && not_identity funct.exp_desc then + if ty_fun.level >= t1.level && + not_identity funct.exp_desc && + name <> Some "imp#" then Location.prerr_warning sarg1.pexp_loc Warnings.Unused_argument; unify env ty_fun (newty (Tarrow(arr1,t1,t2,Clink(ref Cunknown)))); (t1, t2) @@ -3532,16 +3542,29 @@ and type_application env funct in let arg = match arr with | Tarr_implicit id -> - let inst = - Typeimplicit.instantiate_one_implicit loc env id ty [ty_fun;ty_fun0] in - let argument = inst.Typeimplicit.implicit_argument in - begin match arg with - | None -> Some (fun () -> argument) - | Some f -> - Some (fun () -> - argument.arg_expression <- Some (f ()); - argument) - end + let inst = Typeimplicit.instantiate_one_implicit + loc env id ty [ty_fun;ty_fun0] in + (* Add instance to pending implicits, even if an argument has + been given explicitly. + - implicits whose argument is already set will be ignored + during search + - if a type error was to occur, we need to know all implicits + instances in scope (for [Typeimplicit.reunify_constraints]) + *) + pending_implicits := inst :: !pending_implicits; + begin match arg with + | None -> Some (fun () -> inst.Typeimplicit.implicit_argument) + | Some f -> + let link_implicit () = + let arg = f () in + try + Typeimplicit.Link.to_expr inst arg; + inst.Typeimplicit.implicit_argument + with Unify trace -> + raise(Error(loc, env, Expr_type_clash(trace))) + in + Some link_implicit + end | _ -> match arg with | None -> None | Some f -> @@ -3866,7 +3889,7 @@ and type_let ?(check = fun s -> Warnings.Unused_var s) match spat.ppat_desc, sexp.pexp_desc with (Ppat_any | Ppat_constraint _), _ -> spat | _, Pexp_coerce (_, _, sty) - | _, Pexp_constraint (_, sty) when !Clflags.principal -> + | _, Pexp_constraint (_, sty) -> (* propagate type annotation to pattern, to allow it to be generalized in -principal mode *) Pat.constraint_ @@ -4303,7 +4326,11 @@ let report_error env ppf = function fprintf ppf "No instance found for implicit %s." (Ident.name inst.Typeimplicit.implicit_id) | Ambiguous_implicit (inst, p1, p2) -> - fprintf ppf "Ambiguous implicit %s:@ %a@ and %a@ are both correct solutions." + let path = + if Path.to_longident p1 = Path.to_longident p2 + then stamped_path + else path in + fprintf ppf "Ambiguous implicit %s:@ %a@ and %a@ are both solutions." (Ident.name inst.Typeimplicit.implicit_id) path p1 path p2 | Termination_fail inst -> @@ -4311,7 +4338,9 @@ let report_error env ppf = function (Ident.name inst.Typeimplicit.implicit_id) let report_error env ppf err = - wrap_printing_env env (fun () -> report_error env ppf err) + wrap_printing_env env (fun () -> + Typeimplicit.reunify_constraints (); + report_error env ppf err) let () = Location.register_error_of_exn diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index 7a7f491a82..c983ff8aee 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -3,6 +3,14 @@ open Ctype open Types open Typedtree +let printf_output = + if (try Sys.getenv "DEBUG" = "1" with Not_found -> false) then + Format.std_formatter + else + Format.make_formatter (fun _ _ _ -> ()) (fun () -> ()) + +let printf x = Format.fprintf printf_output x + (* Forward declaration, to be filled in by Typemod.type_package *) let type_implicit_instance @@ -77,7 +85,7 @@ let unlink env unlink_on = | Some register when Ident.mem ident shadow_tbl -> (*assert false*) () | Some register -> - let ty' = newvar () in + let ty' = newvar ~name:"imp#" () in (* Swap `ty' with a fresh variable *) let {desc = desc; level = lv} = ty in let {desc = desc'; level = lv'} = ty' in @@ -98,7 +106,7 @@ let unlink env unlink_on = {type_iterators with it_type_expr = it_type_expr Ident.empty} let pending_implicits - : pending_implicit list ref + : pending_implicit list list ref = ref [] let rec has_implicit ty = match (repr ty).desc with @@ -134,94 +142,8 @@ let instantiate_one_implicit loc env id ty_arg ty_res = (* Unlink main types *) let unlink_it = unlink env unlink_ident in List.iter (unlink_it.it_type_expr unlink_it) ty_res; - pending_implicits := inst :: !pending_implicits; inst -let instantiate_implicits_ty loc env ty = - if not (has_implicit ty) then [], [], ty - else - let fresh_implicit id ty = - let ty = repr ty in - match ty.desc with - | Tpackage (p,nl,tl) -> { - implicit_id = id; - implicit_env = env; - implicit_loc = loc; - implicit_type = (p,nl,tl); - implicit_constraints = []; - implicit_argument = { - arg_flag = Tapp_implicit; - arg_expression = None - }; - } - | _ -> assert false - in - let rec extract_implicits ty = - let ty = repr ty in - match ty.desc with - | Tarrow (Tarr_implicit id, lhs, rhs, comm) -> - (*prerr_endline "found one";*) - let inst = fresh_implicit id lhs in - let arguments, instances, rhs' = extract_implicits rhs in - inst.implicit_argument :: arguments, - inst :: instances, - rhs' - (*{ty with desc = Tarrow (Tarr_implicit id', lhs, rhs', comm)}*) - | Tarrow (arr, lhs, rhs, comm) -> - let arguments, instances, rhs' = extract_implicits rhs in - {arg_flag = (tapp_of_tarr arr); arg_expression = None} :: arguments, - instances, - {ty with desc = Tarrow (arr, lhs, rhs', comm)} - | _ -> [], [], ty - in - let ty = Subst.type_expr Subst.identity ty in - let arguments, instances, ty = extract_implicits ty in - (* Set of constraints : maintain a table mapping implicit binding - identifier to a list of type variable pairs. - An implicit instance is correct only iff, in an environment where the - ident is bound to the instance, all pairs in the list unify. - *) - let unlink_ident ident = - try - let inst = List.find (fun inst -> inst.implicit_id = ident) instances in - let add_constraint ty tyvar = - inst.implicit_constraints <- - (ty, tyvar) :: inst.implicit_constraints - in - Some add_constraint - with Not_found -> - None - in - (* Unlink main types *) - let unlink_it = unlink env unlink_ident in - let unlink_it = unlink_it.it_type_expr unlink_it in - unlink_it ty; - (* Unlink with types appearing in with constraints *) - List.iter (fun inst -> - let _p,_nl,tl = inst.implicit_type in - List.iter unlink_it tl - ) instances; - arguments, instances, ty - -let instantiate_implicits_expr env expr = - let implicits, expr = - match instantiate_implicits_ty expr.exp_loc env expr.exp_type with - | [], implicits, _ -> - implicits, expr - | arguments, implicits, ty -> - implicits, - { exp_desc = Texp_apply (expr, arguments); - exp_type = ty; - exp_loc = expr.exp_loc; - exp_extra = []; - exp_env = env; - exp_attributes = [] - } - in - pending_implicits := List.rev_append implicits !pending_implicits; - expr - - let pack_implicit_ref : (pending_implicit -> Path.t -> Typedtree.expression) ref = ref (fun _ _ -> assert false) @@ -262,6 +184,25 @@ module Link = struct to_path inst path end +(* Reunify constraints as much as possible. + This is used after a failure to prevent type variables introduced during + unlinking to leak into error messages *) +let reunify_constraint inst = + prerr_endline "reunify_constraint\n\n\n\n\n"; + let reunify (ty,tyvar) = + try unify inst.implicit_env ty tyvar + with _ -> () in + List.iter reunify inst.implicit_constraints + +let reunify_constraints () = + List.iter (List.iter reunify_constraint) !pending_implicits + +let add_pending_implicits insts = + pending_implicits := insts :: !pending_implicits + +let reset_pending_implicits () = + pending_implicits := [] + (* Forward reference to be initialized by Implicitsearch *) let generalize_implicits_ref : (unit -> unit) ref From b83ad09b6970496cb5bca8f4a25f80022e7dcd3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bour?= <frederic.bour@lakaban.net> Date: Fri, 1 Aug 2014 11:00:25 +0100 Subject: [PATCH 408/494] Fix Imp_data example --- imp_data.ml | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/imp_data.ml b/imp_data.ml index c2656fc945..7d7340dfc4 100644 --- a/imp_data.ml +++ b/imp_data.ml @@ -72,8 +72,7 @@ module Bounded = struct end module type Enum = sig - type t - val ( < ) : t -> t -> bool + include Ord val succ : t -> t val pred : t -> t end @@ -85,24 +84,24 @@ module Enum = struct let rec fold_enum_to : (implicit M : Enum) -> M.t -> M.t -> (M.t -> 'a -> 'a) -> 'a -> 'a = fun (implicit M : Enum) a b f acc -> - if M.(<) a b then - fold_enum_to (M.pred a) b f (f a acc) + if M.compare a b < 0 then + fold_enum_to (M.succ a) b f (f a acc) else acc let rec fold_enum_downto : (implicit M : Enum) -> M.t -> M.t -> (M.t -> 'a -> 'a) -> 'a -> 'a = fun (implicit M : Enum) a b f acc -> - if M.(<) b a then - fold_enum_downto (implicit M) (M.pred a) b f (f a acc) + if M.compare b a < 0 then + fold_enum_downto (M.pred a) b f (f a acc) else acc - let list_enum_to (implicit M : Enum) a b = - fold_enum_downto b a (fun x acc -> x :: acc) [] + let list_enum_to (implicit M : Enum) (a : M.t) b = + List.rev (fold_enum_to a b (fun x acc -> x :: acc) []) - let list_enum_downto (implicit M : Enum) a b = - fold_enum_to b a (fun x acc -> x :: acc) [] + let list_enum_downto (implicit M : Enum) (a : M.t) b = + List.rev (fold_enum_downto a b (fun x acc -> x :: acc) []) end module type Monoid = sig From 8caa59171e6f21d0dad9653869c0c99ccfae8794 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 6 Aug 2014 17:59:37 +0100 Subject: [PATCH 409/494] Fix typos --- parsing/parsetree.mli | 2 +- typing/ctype.ml | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index 755e893808..7062af1c30 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -24,7 +24,7 @@ type apply_flag = | Papp_simple (* f expr *) | Papp_labelled of string (* f ~label:expr *) | Papp_optional of string (* f ?label:expr *) - | Papp_implicit (* f ~implicit:M *) + | Papp_implicit (* f (implicit M) *) (** {2 Extension points} *) diff --git a/typing/ctype.ml b/typing/ctype.ml index b2606d3d91..69de0f0285 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -760,6 +760,8 @@ let rec normalize_package_path env p = | Some (Mty_signature _ | Mty_functor _ | Mty_alias _) | None -> p let rec update_level env level ty = + (*Format.fprintf Format.err_formatter + "update_level of %a from %d to %d\n%!" !printtyp_expr ty ty.level level;*) let ty = repr ty in if ty.level > level then begin begin match Env.gadt_instance_level env ty with From d3e168d4e1307206b82ba2320de5a41693ca869c Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 6 Aug 2014 17:59:59 +0100 Subject: [PATCH 410/494] Typetexp: manage levels when crossing implicit binder --- typing/typetexp.ml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/typing/typetexp.ml b/typing/typetexp.ml index f5d0e6cda9..2253d8157e 100644 --- a/typing/typetexp.ml +++ b/typing/typetexp.ml @@ -425,13 +425,21 @@ let rec transl_type env policy styp = | Ttyp_package pkg -> pkg | _ -> assert false in + let ty0 = newvar () in + (* remember original level *) + Ctype.begin_def (); + Ident.set_current_time ty0.level; let id, env = Env.enter_module ~arg:true ~implicit_:(Implicit 0) s package.pack_type env in + Ctype.begin_def (); let cty2 = transl_type env policy st2 in + Ctype.end_def (); let arr = Tarr_implicit id in let ty = newty (Tarrow(arr, cty1.ctyp_type, cty2.ctyp_type, Cok)) in + unify env ty ty0; + Ctype.end_def (); ctyp (Ttyp_arrow (arr, cty1, cty2)) ty | Ptyp_arrow(arr, st1, st2) -> let cty1 = transl_type env policy st1 in From aeebc52d190027b1d8e78cf87d563c301548173a Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 6 Aug 2014 18:00:47 +0100 Subject: [PATCH 411/494] Ctype: fix equality modulo equations in presence of hkt --- typing/ctype.ml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/typing/ctype.ml b/typing/ctype.ml index 69de0f0285..f51be35c77 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -3404,8 +3404,9 @@ and eqtype_modulo_equation rename type_pairs subst env lhs rhs = in begin try let same { eq_lhs_path ; eq_lhs_params } = - assert (eq_lhs_params = []); - eq_lhs_path = path + let result = eq_lhs_path = path in + if result then assert (eq_lhs_params = []); + result in let ty = List.find same !equations in (* An equation already apply to this path *) From b56e6686fab047b0c676a2f01f7152a6a3cad69b Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 6 Aug 2014 18:01:28 +0100 Subject: [PATCH 412/494] Implicitsearch: make use of higher-kinded constraints in termination checking --- typing/implicitsearch.ml | 135 ++++++++++++++++++++++++++++++++------- typing/typeimplicit.ml | 1 - 2 files changed, 113 insertions(+), 23 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index d673f21ab5..fe096a1b12 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -444,18 +444,38 @@ module Termination : sig (* [check env t state] ensures that termination criterion for [t] is satisfied in [state] and returns the stronger state. Otherwise, [Terminate] is raised *) - exception Terminate - val check : Env.t -> t -> state -> state + type eqns = (string list * (type_expr list * type_expr) list) list + exception Terminate of (eqns * eqns) + val explain : bool -> Format.formatter -> eqns * eqns -> unit + val check : Env.t -> t -> state -> state end = struct (* Set of equations used for computing termination criterion. The list of equations is sorted by path, and each path is unique. *) - type eqns = (string list * type_expr) list + type eqns = (string list * (type_expr list * type_expr) list) list + + let rec merge_eqns = function + | (path1, args) :: (path2, args') :: tail when path1 = path2 -> + merge_eqns ((path1, args' @ args) :: tail) + | head :: tail -> + head :: merge_eqns tail + | [] -> [] let rec wellformed_eqns = function - | (path1, _) :: ((path2, _) :: _ as tail) -> - (path1 < path2) && wellformed_eqns tail + | (path1, args) :: ((path2, _) :: _ as tail) -> + (path1 < path2) && + (match args with + (* One base-kinded *) + | [[], _] -> true + (* Or one-or-more higher-kinded, same arity *) + | (((_ :: _), _ as first) :: rest) -> + let arity (params,_path) = List.length params in + let a0 = arity first in + assert (List.for_all (fun t -> arity t = a0) rest); + true + | _ -> false) && + wellformed_eqns tail | _ -> true (* Checking that an individial type is smaller than another one. @@ -473,25 +493,53 @@ end = struct with Type_is_smaller -> `Smaller + let smallers env t1s t2s : [`Smaller | `Equal | `Different] = + try + let rec aux t2s acc = function + | [] -> acc + | (params, t1) :: t1s -> + let (params', t2), t2s = list_extract + (fun (params', t2) -> equal env true params params') + t2s in + match smaller env t1 t2 with + | `Different -> raise Not_found + | `Equal -> aux t2s acc t1s + | `Smaller -> aux t2s `Smaller t1s + in + aux t2s `Equal t1s + with Not_found -> + `Different + (* Check that a set of equations is stronger than another one. [stronger env neqns oeqns] returns true iff - all equations from oeqns must be smaller or equal in neqns, AND - one equation must be strictly smaller or neqns must contain more equations. *) let rec stronger env acc (neqns : eqns) (oeqns : eqns) = + let is_base_kinded = function + | _, [[], _] -> true + | _, _ -> false in match neqns, oeqns with (* Equation on same path, check inclusion of type *) - | (n, nt) :: neqns, (o, ot) :: oeqns when n = o -> + (* Base-kinded *) + | (n, [[], nt]) :: neqns, (o, [[], ot]) :: oeqns when n = o -> begin match smaller env nt ot with | `Equal -> stronger env acc neqns oeqns | `Smaller -> stronger env true neqns oeqns | `Different -> false end + (* Higher-kinded *) + | (n, nt) :: neqns, (o, ot) :: oeqns when n = o -> + begin match smallers env nt ot with + | `Equal -> stronger env acc neqns oeqns + | `Smaller -> stronger env true neqns oeqns + | `Different -> false + end (* Same number of equations, at least one must have been stronger *) | [], [] -> acc - (* More equations, always stronger *) - | _, [] -> true - | (n, _) :: neqns, (o, _) :: _ when n < o -> + (* More equations, stronger if base-kinded *) + | _, [] -> List.exists is_base_kinded neqns + | (n, _ as neqn) :: neqns, (o, _) :: _ when n < o && is_base_kinded neqn -> stronger env true neqns oeqns (* Less equations, always weaker *) | [], _ -> false @@ -527,12 +575,8 @@ end = struct try let id, path = Path.flatten eqn.eq_lhs_path in let _uid, eqns = Ident.find_same id table in - if eqn.eq_lhs_params = [] then - let path = List.map fst path in - eqns := (path, eqn.eq_rhs) :: !eqns - else - (*TODO, handle higher-kinded equations in termination*) - () + let path = List.map fst path in + eqns := (path, [eqn.eq_lhs_params, eqn.eq_rhs]) :: !eqns with Not_found -> assert false) eqns; List.map @@ -540,17 +584,43 @@ end = struct try let uid, eqns = Ident.find_same target.target_id table in let eqns = List.sort (fun (a,_) (b,_) -> compare a b) !eqns in + let eqns = merge_eqns eqns in assert (wellformed_eqns eqns); (uid, eqns) with Not_found -> assert false) targets - exception Terminate + let explain success ppf (eqns,eqns') = + let print_ppath ppf (path,params) = match params with + | [] -> Format.pp_print_string ppf path + | [p] -> Format.fprintf ppf "%a %s" Printtyp.type_expr p path + | (p::ps) -> Format.fprintf ppf "(%a%a) %s" + Printtyp.type_expr p + (fun ppf -> List.iter (fun ty -> + Format.fprintf ppf ", %a" Printtyp.type_expr ty)) + ps + path in + let print_eqn ppf path (params,ty) = + Format.fprintf ppf "\t%a = %a\n" + print_ppath (path,params) + Printtyp.type_expr ty in + let print_eqns_at_path ppf (path,eqns) = + let path = String.concat "." path in + List.iter (print_eqn ppf path) eqns in + let print_eqns ppf peqns = List.iter (print_eqns_at_path ppf) peqns in + Format.fprintf ppf "Equation set [\n%a] is %sstronger than [\n%a]\n%!" + print_eqns eqns + (if success then "" else "not ") + print_eqns eqns' + + exception Terminate of (eqns * eqns) let check env (uid, eqns) stack = begin try let eqns' = Ident.find_same uid stack in - if not (stronger env eqns eqns') then raise Terminate; - with Not_found -> () + if not (stronger env eqns eqns') then raise (Terminate (eqns, eqns')); + explain true printf_output (eqns,eqns') + with Not_found -> + explain true printf_output (eqns,[]) end; Ident.add uid eqns stack @@ -739,15 +809,33 @@ end = struct ()); let eqns = !new_eqns in + printf "new equations\n"; + List.iter (fun {eq_lhs; eq_rhs} -> + printf "\t%a = %a\n%!" + Printtyp.type_expr eq_lhs + Printtyp.type_expr eq_rhs) + eqns; + (* Pass the env will all arguments bound to next state: constraints + might be referring to other modules in any order, e.g in + functor F (X : T) (Y : S) = ... + + we might have type t = Y.t X.t as a constraint on X *) + let state_env = env in + let state_eq_table = eq_table in (* Constraints target types *) - let sub_targets = Constraints.targets state.env sub_targets eqns in + let sub_targets = Constraints.targets state_env sub_targets eqns in (* Add termination criteria *) let sub_criteria = Termination.normalize_equations sub_targets eqns in let sub_targets = List.combine sub_targets sub_criteria in (* Keep new equations potentially added to top variables *) - let state = {state with eq_initial = !(state.eq_var); debug_path = Some path} in + let debug_path = match state.debug_path with + | None -> Some path + | Some path' -> Some (papply path' path) + in + let state = {state with eq_initial = !(state.eq_var); debug_path; + env = state_env; eq_table = state_eq_table} in match sub_targets with | [] -> `Done {state with payload = path} @@ -763,7 +851,9 @@ end = struct try step0 state candidate, candidates with - | Termination.Terminate as exn -> raise exn + | Termination.Terminate eqns as exn -> + printf "%a\n%!" (Termination.explain false) eqns; + raise exn | exn -> report_error exn; step state candidates @@ -885,7 +975,8 @@ let find_pending_instance inst = let p2 = Solution.get alternative in raise Typecore.(Error (loc, env, Ambiguous_implicit (inst,p1,p2))) with - | Termination.Terminate -> + | Termination.Terminate eqns -> + printf "%a\n%!" (Termination.explain false) eqns; raise Typecore.(Error (loc, env, Termination_fail inst)) | Not_found -> false diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index c983ff8aee..bfab558693 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -188,7 +188,6 @@ end This is used after a failure to prevent type variables introduced during unlinking to leak into error messages *) let reunify_constraint inst = - prerr_endline "reunify_constraint\n\n\n\n\n"; let reunify (ty,tyvar) = try unify inst.implicit_env ty tyvar with _ -> () in From f08cb0d704f5884faaecb731e0191e02e3e03f91 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Thu, 7 Aug 2014 17:37:42 +0100 Subject: [PATCH 413/494] Implicitsearch: rework equality generation and sharing in recursive instantiation --- typing/ctype.ml | 16 +-- typing/ctype.mli | 2 +- typing/env.ml | 2 +- typing/implicitsearch.ml | 235 ++++++++++++++++++++++++++------------- 4 files changed, 170 insertions(+), 85 deletions(-) diff --git a/typing/ctype.ml b/typing/ctype.ml index f51be35c77..129f0801fd 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -3262,8 +3262,8 @@ type equality_equation = { } let equality_equations - : equality_equation list ref Ident.tbl ref - = ref Ident.empty + : (Ident.t, equality_equation list ref) Tbl.t ref + = ref Tbl.empty let with_equality_equations tbl f = let equality_equations' = !equality_equations in @@ -3373,19 +3373,19 @@ let rec eqtype rename type_pairs subst env t1 t2 = unify_univar t1' t2' !univar_pairs | Tconstr (p1, _, _), Tconstr (p2, _, _) - when Ident.mem (Path.head p1) !equality_equations - && Ident.mem (Path.head p2) !equality_equations -> + when Tbl.mem (Path.head p1) !equality_equations + && Tbl.mem (Path.head p2) !equality_equations -> if p1 < p2 then eqtype_modulo_equation rename type_pairs subst env t1' t2' else eqtype_modulo_equation rename type_pairs subst env t1' t2' | Tconstr (p, _, _), te - when Ident.mem (Path.head p) !equality_equations -> + when Tbl.mem (Path.head p) !equality_equations -> eqtype_modulo_equation rename type_pairs subst env t1' t2' | te, Tconstr (p, _, _) - when Ident.mem (Path.head p) !equality_equations -> + when Tbl.mem (Path.head p) !equality_equations -> eqtype_modulo_equation rename type_pairs subst env t2' t1' | (_, _) -> @@ -3399,7 +3399,7 @@ and eqtype_modulo_equation rename type_pairs subst env lhs rhs = (* Ground types *) | Tconstr (path, [], _) -> let equations = - try Ident.find_same (Path.head path) !equality_equations + try Tbl.find (Path.head path) !equality_equations with Not_found -> assert false in begin try @@ -3424,7 +3424,7 @@ and eqtype_modulo_equation rename type_pairs subst env lhs rhs = (* Parametric types *) | Tconstr (path, params, _) -> let equations = - try Ident.find_same (Path.head path) !equality_equations + try Tbl.find (Path.head path) !equality_equations with Not_found -> assert false in let equation = { diff --git a/typing/ctype.mli b/typing/ctype.mli index 8d9be571c9..637cbb765b 100644 --- a/typing/ctype.mli +++ b/typing/ctype.mli @@ -212,7 +212,7 @@ type equality_equation = { eq_rhs : type_expr; } -val with_equality_equations: equality_equation list ref Ident.tbl -> (unit -> 'a) -> 'a +val with_equality_equations: (Ident.t, equality_equation list ref) Tbl.t -> (unit -> 'a) -> 'a val equal: Env.t -> bool -> type_expr list -> type_expr list -> bool (* [equal env [x1...xn] tau [y1...yn] sigma] diff --git a/typing/env.ml b/typing/env.ml index 040ed7f525..b57ae0862d 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -672,7 +672,7 @@ let rec implicit_cannot_occur path env = with Not_found -> false end | Pdot (p, s, _) -> implicit_cannot_occur p env - | Papply _ -> raise Not_found + | Papply _ -> false (*raise Not_found*) let implicit_instances env = env.implicit_instances diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index fe096a1b12..654c79646a 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -52,7 +52,7 @@ type target = { target_uid. We check that constraints on Arg_1' are stronger than those on Arg_1'. - Note: This is also true of (Pair (Arg_1') (Arg_2)) and Arg_2, used as + Note: This is also true of (Pair (Arg_1') (Arg_2)) and Arg_2, used as second arguments to Pair. *) target_uid : Ident.t; @@ -288,8 +288,32 @@ module Constraints = struct in List.map flatten_cstr cstrs + (* Apply a list of equations to a target. + Types referred to by paths *must* be abstract. *) + let target + : Env.t -> target -> equality_equation list -> target + = fun env target eqns -> + (* [env] is needed only to expand module type names *) + let extract_constraint acc eqn = + let id, path = Path.flatten eqn.eq_lhs_path in + if not (Ident.same id target.target_id) then + acc + else + let path = List.map fst path in + let cstrs, hkt = acc in + if eqn.eq_lhs_params = [] then + ((path, eqn.eq_rhs) :: cstrs), hkt + else + cstrs, ((eqn.eq_lhs, eqn.eq_rhs) :: hkt) in + let cstrs, hkt = List.fold_left extract_constraint ([],[]) eqns in + let mty = apply_abstract env target.target_type cstrs in + let target = {target with target_type = mty; + target_hkt = hkt @ target.target_hkt} in + target + (* Apply a list of equations to a list of targets. Types referred to by paths *must* be abstract. *) + (* DEPRECATED *) let targets : Env.t -> target list -> equality_equation list -> target list = fun env targets eqns -> @@ -439,16 +463,20 @@ module Termination : sig (* From a list of target and constraints applying on those targets, returns a termination criterion for each target *) val normalize_equations + : target -> equality_equation list -> t + val normalize_equations' : target list -> equality_equation list -> t list (* [check env t state] ensures that termination criterion for [t] is satisfied in [state] and returns the stronger state. Otherwise, [Terminate] is raised *) type eqns = (string list * (type_expr list * type_expr) list) list - exception Terminate of (eqns * eqns) - val explain : bool -> Format.formatter -> eqns * eqns -> unit + exception Terminate of (Ident.t * eqns * eqns) + val explain : bool -> Format.formatter -> Ident.t * eqns * eqns -> unit val check : Env.t -> t -> state -> state + + val check_target : Env.t -> target -> equality_equation list -> state -> state end = struct (* Set of equations used for computing termination criterion. @@ -493,6 +521,14 @@ end = struct with Type_is_smaller -> `Smaller + let smaller env t1 t2 : [`Smaller | `Equal | `Different] = + match smaller env t1 t2 with + | (`Equal | `Different) as r -> r + | `Smaller -> + match smaller env t2 t1 with + | `Smaller -> `Different (* t1 < t2 && t2 < t1 *) + | _ -> `Smaller + let smallers env t1s t2s : [`Smaller | `Equal | `Different] = try let rec aux t2s acc = function @@ -557,6 +593,29 @@ end = struct let initial = Ident.empty let normalize_equations + (* Target *) + (target : target) + (* All path must refer to some target_id *) + (eqns : equality_equation list) + (* List of equations applying to target *) + : t = + (* Add equations to target_id *) + let eqns = list_filtermap + (fun eqn -> + let id, path = Path.flatten eqn.eq_lhs_path in + if not (Ident.same target.target_id id) then + None + else + let path = List.map fst path in + Some (path, [eqn.eq_lhs_params, eqn.eq_rhs])) + eqns in + let eqns = List.sort (fun (a,_) (b,_) -> compare a b) eqns in + let eqns = merge_eqns eqns in + assert (wellformed_eqns eqns); + (target.target_uid, eqns) + + (* DEPRECATED *) + let normalize_equations' (* List of targets *) (targets : target list) (* All path must refer to some target_id *) @@ -590,7 +649,7 @@ end = struct with Not_found -> assert false) targets - let explain success ppf (eqns,eqns') = + let explain success ppf (id,eqns,eqns') = let print_ppath ppf (path,params) = match params with | [] -> Format.pp_print_string ppf path | [p] -> Format.fprintf ppf "%a %s" Printtyp.type_expr p path @@ -608,29 +667,40 @@ end = struct let path = String.concat "." path in List.iter (print_eqn ppf path) eqns in let print_eqns ppf peqns = List.iter (print_eqns_at_path ppf) peqns in - Format.fprintf ppf "Equation set [\n%a] is %sstronger than [\n%a]\n%!" - print_eqns eqns - (if success then "" else "not ") - print_eqns eqns' - - exception Terminate of (eqns * eqns) + if eqns' = [] && success then + Format.fprintf ppf + "Termination of %a: introducing equation set [\n%a]\n%!" + Printtyp.ident id + print_eqns eqns + else + Format.fprintf ppf + "Termination of %a: equation set [\n%a] is %sstronger than [\n%a]\n%!" + Printtyp.ident id + print_eqns eqns + (if success then "" else "not ") + print_eqns eqns' + + exception Terminate of (Ident.t * eqns * eqns) let check env (uid, eqns) stack = begin try let eqns' = Ident.find_same uid stack in - if not (stronger env eqns eqns') then raise (Terminate (eqns, eqns')); - explain true printf_output (eqns,eqns') + if not (stronger env eqns eqns') then raise (Terminate (uid, eqns, eqns')); + explain true printf_output (uid,eqns,eqns') with Not_found -> - explain true printf_output (eqns,[]) + explain true printf_output (uid,eqns,[]) end; Ident.add uid eqns stack + let check_target env target eqns stack = + let t = normalize_equations target eqns in + check env t stack end -let report_error exn = +let report_error msg exn = try Location.report_exception printf_output exn with exn -> - printf "%s\n%!" (Printexc.to_string exn) + printf "%s%s\n%!" msg (Printexc.to_string exn) (* Make the search stack explicit. @@ -671,7 +741,8 @@ end = struct target: target; env: Env.t; - debug_path: Path.t option; + (* List of partials paths being constructed, only for debug purpose *) + debug_path: Path.t list; (* Equality snapshots. @@ -682,7 +753,7 @@ end = struct branch of the search will be added to [eq_var]. *) eq_initial: equality_equation list; eq_var: equality_equation list ref; - eq_table: equality_equation list ref Ident.tbl; + eq_table: (Ident.t, equality_equation list ref) Tbl.t; } type query = @@ -692,7 +763,7 @@ end = struct type partial = (* Intermediate result: a path has been found, but some arguments are missing and need to be applied *) - (Path.t * (target * Termination.t) list) state + (Path.t * target list) state type result = (* Final result: the path points to a module with the desired type *) @@ -716,8 +787,8 @@ end = struct in let eq_var = ref [] in let eq_table = List.fold_left - (fun tbl id -> Ident.add id eq_var tbl) - Ident.empty vars + (fun tbl id -> Tbl.add id eq_var tbl) + Tbl.empty vars in { payload = (); @@ -725,7 +796,7 @@ end = struct target = target; env = env; - debug_path = None; + debug_path = []; eq_initial = []; eq_var = eq_var; @@ -735,24 +806,33 @@ end = struct let all_candidates t = Env.implicit_instances t.env + let cleanup_equations ident eq_table = + try + let eqns = Tbl.find ident eq_table in + let not_in_ident {eq_lhs_path} = Path.head eq_lhs_path <> ident in + eqns := List.filter not_in_ident !eqns; + Tbl.remove ident eq_table + with Not_found -> eq_table + + exception Invalid_candidate + let step0 state (path, md) = state.eq_var := state.eq_initial; - begin match state.debug_path with - | Some path' -> - printf "%a (_) <- %a\n" Printtyp.path path' Printtyp.path path - | None -> - printf "_ <- %a\n" Printtyp.path path - end; + let rec print_paths ppf = function + | [] -> Format.pp_print_string ppf "_"; + | p :: ps -> Format.fprintf ppf "%a (%a)" Printtyp.path p print_paths ps + in + let print_paths ppf ps = print_paths ppf (List.rev ps) in + printf "%a <- %a\n" print_paths state.debug_path Printtyp.path path; let target = state.target in let sub_targets, candidate_mty = find_implicit_parameters md in - let new_eqns = ref [] in - (* Generate coercion. if this succeeds this produce equations in new_eqns and eq_var *) + (* Generate coercion. if this succeeds this produce equations in eq_var *) let eq_table, env = List.fold_left (fun (eq_table, env) sub_target -> printf "Binding %a with type %a\n%!" Printtyp.ident sub_target.target_id Printtyp.modtype sub_target.target_type; - Ident.add sub_target.target_id new_eqns eq_table, + Tbl.add sub_target.target_id state.eq_var eq_table, Env.add_module sub_target.target_id sub_target.target_type env) (state.eq_table, state.env) sub_targets in @@ -760,16 +840,19 @@ end = struct Ctype.with_equality_equations eq_table (fun () -> let tyl, tvl = List.split target.target_hkt in - begin try Ctype.equal' env true tyl tvl + begin try + if tyl <> [] then + printf "Checkinq equalities between hkt constraints:\n%!"; + List.iter2 (fun t1 t2 -> + printf "\t%a = %a\n%!" + Printtyp.type_expr t1 + Printtyp.type_expr t2) + tyl tvl; + Ctype.equal' env true tyl tvl with Ctype.Unify tls -> printf "Failed to instantiate %s with constraints:\n" (string_of_path path); - List.iter2 (fun t1 t2 -> - printf "\t%a = %a\n%!" - Printtyp.type_expr t1 - Printtyp.type_expr t2) - tyl tvl; - let accepting_eq = Ident.fold_all + let accepting_eq = Tbl.fold (fun ident _ acc -> Ident.name ident :: acc) eq_table [] in @@ -801,48 +884,49 @@ end = struct check_expansion ty2; printf "\n%!" ) tls; - raise Not_found + raise Invalid_candidate end; let _ : module_coercion = Includemod.modtypes env candidate_mty target.target_type in ()); - - let eqns = !new_eqns in - printf "new equations\n"; - List.iter (fun {eq_lhs; eq_rhs} -> + let rec neweqns = function + | l when l == state.eq_initial -> [] + | [] -> [] + | x :: xs -> x :: neweqns xs + in + let eq_final = !(state.eq_var) in + let neweqns = neweqns eq_final in + let print_eqn {eq_lhs; eq_rhs} = printf "\t%a = %a\n%!" Printtyp.type_expr eq_lhs - Printtyp.type_expr eq_rhs) - eqns; + Printtyp.type_expr eq_rhs + in + if eq_final != state.eq_initial then + (printf "Equations produced:\n"; + List.iter print_eqn neweqns) + else + printf "No equations produced.\n"; + + (* Pass the env will all arguments bound to next state: constraints might be referring to other modules in any order, e.g in functor F (X : T) (Y : S) = ... we might have type t = Y.t X.t as a constraint on X *) - let state_env = env in - let state_eq_table = eq_table in - (* Constraints target types *) - let sub_targets = Constraints.targets state_env sub_targets eqns in - (* Add termination criteria *) - let sub_criteria = Termination.normalize_equations sub_targets eqns in - - let sub_targets = List.combine sub_targets sub_criteria in + let eq_table = cleanup_equations target.target_id eq_table in (* Keep new equations potentially added to top variables *) - let debug_path = match state.debug_path with - | None -> Some path - | Some path' -> Some (papply path' path) - in - let state = {state with eq_initial = !(state.eq_var); debug_path; - env = state_env; eq_table = state_eq_table} in + let state = {state with eq_initial = eq_final; env; eq_table = eq_table} in match sub_targets with | [] -> `Done {state with payload = path} - | (target, crit) :: sub_targets -> + | target :: sub_targets -> + let debug_path = state.debug_path in let partial = {state with payload = (path, sub_targets)} in - let termination = Termination.check state.env crit state.termination in - let state = {state with target; termination} in + let target = Constraints.target state.env target eq_final in + let termination = Termination.check_target state.env target eq_final state.termination in + let state = {state with target; termination; debug_path = path :: debug_path} in `Step (partial, state) let rec step state = function @@ -854,35 +938,34 @@ end = struct | Termination.Terminate eqns as exn -> printf "%a\n%!" (Termination.explain false) eqns; raise exn + | Invalid_candidate -> step state candidates | exn -> - report_error exn; + report_error "Exception while testing candidate: " exn; step state candidates let apply partial arg = let partial_path, sub_targets = partial.payload in let arg_path = arg.payload in + let eq_initial = arg.eq_initial in let path = papply partial_path arg_path in match sub_targets with | [] -> let state = {partial with - payload = path; - debug_path = Some path; - (* We get the equations from the argument but keep + (* We get the equations from the argument but keep termination state from the parent *) - eq_initial = arg.eq_initial} in + payload = path; eq_initial} in `Done state - | (target, crit) :: sub_targets -> - let partial = - {partial with payload = (path, sub_targets); - debug_path = Some path } - in + | target :: sub_targets -> + let partial = {partial with payload = (path, sub_targets) } in let md = Env.find_module path arg.env in (* The original module declaration might be implicit, we want to avoid rebinding implicit *) let md = {md with md_implicit = Asttypes.Nonimplicit} in - let termination = Termination.check arg.env crit partial.termination in + let target = Constraints.target arg.env target eq_initial in + let termination = Termination.check_target arg.env target eq_initial partial.termination in let env = Env.add_module_declaration target.target_id md arg.env in - let arg = {arg with payload = (); target; termination; env} in + let debug_path = path :: partial.debug_path in + let arg = {arg with payload = (); target; debug_path; termination; env} in `Step (partial, arg) end @@ -895,7 +978,7 @@ module Solution = struct (* If we want to resume search, start from these candidates *) next: Search.candidate list; - (* Intermediate steps with solutions to subquerys *) + (* Intermediate steps with solutions to subqueries *) steps: (Search.partial * t) list; result: Search.result; @@ -906,7 +989,9 @@ module Solution = struct and search_candidates query candidates = let step, next = Search.step query candidates in - search_arguments query next [] step + try search_arguments query next [] step + with Not_found -> + search_candidates query next and search_arguments query next steps = function | `Done result -> From ee972f3db4bf2293fa39f1c24505b1f49de2e940 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Thu, 7 Aug 2014 17:44:02 +0100 Subject: [PATCH 414/494] Remove some printf debugging --- typing/typecore.ml | 1 - 1 file changed, 1 deletion(-) diff --git a/typing/typecore.ml b/typing/typecore.ml index 0c0e1e4482..6c28648890 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1510,7 +1510,6 @@ let rec approx_type env sty = newty (Ttuple (List.map (approx_type env) args)) | Ptyp_constr (lid, ctl) -> begin try - Format.eprintf "looking_up @[%a@]\n%!" Printtyp.longident lid.txt; let (path, decl) = Env.lookup_type lid.txt env in if List.length ctl <> decl.type_arity then raise Not_found; let tyl = List.map (approx_type env) ctl in From 42606bb159c658b2b886cb444170dce2244f0ed1 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 8 Aug 2014 16:45:02 +0100 Subject: [PATCH 415/494] Implicit levels during unification is 0 As we might be trying to unify with an arbitrary level, it is incorrect to use get_current_level (). --- examples.numbers => examples_numbers.ml | 0 examples.numbers2 => examples_numbers2.ml | 0 examples.stringify => examples_stringify.ml | 0 examples.stringify2 => examples_stringify2.ml | 0 typing/ctype.ml | 4 ++-- 5 files changed, 2 insertions(+), 2 deletions(-) rename examples.numbers => examples_numbers.ml (100%) rename examples.numbers2 => examples_numbers2.ml (100%) rename examples.stringify => examples_stringify.ml (100%) rename examples.stringify2 => examples_stringify2.ml (100%) diff --git a/examples.numbers b/examples_numbers.ml similarity index 100% rename from examples.numbers rename to examples_numbers.ml diff --git a/examples.numbers2 b/examples_numbers2.ml similarity index 100% rename from examples.numbers2 rename to examples_numbers2.ml diff --git a/examples.stringify b/examples_stringify.ml similarity index 100% rename from examples.stringify rename to examples_stringify.ml diff --git a/examples.stringify2 b/examples_stringify2.ml similarity index 100% rename from examples.stringify2 rename to examples_stringify2.ml diff --git a/typing/ctype.ml b/typing/ctype.ml index 129f0801fd..ac018a49a1 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -2492,8 +2492,8 @@ and unify3 env t1 t1' t2 t2' = let env' = Env.add_module id1 mty !env in let env' = Env.forbid_implicit_occur id1 env' in let env' = Env.forbid_implicit_occur id2 env' in - let env' = Env.set_implicit_level id1 (get_current_level ()) env' in - let env' = Env.set_implicit_level id2 (get_current_level ()) env' in + let env' = Env.set_implicit_level id1 0 env' in + let env' = Env.set_implicit_level id2 0 env' in env := env'; let subst = Subst.add_module id2 (Path.Pident id1) Subst.identity in let u2 = Subst.type_expr subst u2 in From 65bfd3d583c80f429e614319cdacb0a7b444ab0d Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 8 Aug 2014 16:46:37 +0100 Subject: [PATCH 416/494] type_application.lower_args: thread and update environment in presence of implicits --- typing/typecore.ml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/typing/typecore.ml b/typing/typecore.ml index 6c28648890..ae9bade98c 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1975,18 +1975,22 @@ and type_expect_ ?in_function env sexp ty_expected = end_def (); generalize_structure funct.exp_type end; - let rec lower_args seen ty_fun = + let rec lower_args env seen ty_fun = let ty = expand_head env ty_fun in if List.memq ty seen then () else + let env = match ty.desc with + | Tarrow (Tarr_implicit id, _, _, _) -> + Env.set_implicit_level id 0 env + | _ -> env in match ty.desc with - Tarrow (l, ty_arg, ty_fun, com) -> + | Tarrow (l, ty_arg, ty_fun, com) -> (try unify_var env (newvar()) ty_arg with Unify _ -> assert false); - lower_args (ty::seen) ty_fun + lower_args env (ty::seen) ty_fun | _ -> () in let ty = instance env funct.exp_type in end_def (); - wrap_trace_gadt_instances env (lower_args []) ty; + wrap_trace_gadt_instances env (lower_args env []) ty; begin_def (); let (args, ty_res) = type_application env funct sargs in let args = List.map From 81ce128f96794dfe0d3f1a562d1a255d3e727b6d Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Mon, 25 Aug 2014 10:38:23 +0200 Subject: [PATCH 417/494] Fix code after rebase --- driver/compmisc.ml | 2 +- parsing/ast_mapper.ml | 4 +- parsing/parser.mly | 3 +- tools/untypeast.ml | 4 +- typing/env.ml | 2 +- typing/typecore.ml | 1239 +++++++++++++++++++---------------------- typing/typemod.ml | 6 +- typing/typemod.mli | 2 +- 8 files changed, 588 insertions(+), 674 deletions(-) diff --git a/driver/compmisc.ml b/driver/compmisc.ml index a2bc4b83a5..5baf45fd18 100644 --- a/driver/compmisc.ml +++ b/driver/compmisc.ml @@ -43,7 +43,7 @@ let open_implicit_module m env = let open Asttypes in let lid = {loc = Location.in_file "command line"; txt = Longident.Lident m } in - snd (Typemod.type_open_ Override env lid.loc lid) + snd (Typemod.type_open_ (Open_all Override) env lid.loc lid) let initial_env () = Ident.reinit(); diff --git a/parsing/ast_mapper.ml b/parsing/ast_mapper.ml index 7050f5c7e4..353609b488 100644 --- a/parsing/ast_mapper.ml +++ b/parsing/ast_mapper.ml @@ -543,9 +543,9 @@ let default_mapper = open_description = - (fun this {popen_lid; popen_override; popen_attributes; popen_loc} -> + (fun this {popen_lid; popen_flag; popen_attributes; popen_loc} -> Opn.mk (map_loc this popen_lid) - ~override:popen_override + ~flag:popen_flag ~loc:(this.location this popen_loc) ~attrs:(this.attributes this popen_attributes) ); diff --git a/parsing/parser.mly b/parsing/parser.mly index d34f63df63..85cbd12217 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -923,8 +923,7 @@ signature_item: ; open_statement: | OPEN open_flag mod_longident post_item_attributes - { Opn.mk (mkrhs $3 3) ~override:$2 ~attrs:$4 - ~loc:(symbol_rloc()) ~docs:(symbol_docs ()) } + { Opn.mk (mkrhs $3 3) ~flag:$2 ~attrs:$4 ~loc:(symbol_rloc()) ~docs:(symbol_docs ()) } ; sig_include_statement: INCLUDE module_type post_item_attributes %prec below_WITH diff --git a/tools/untypeast.ml b/tools/untypeast.ml index c12f5866ad..16433ca7ab 100644 --- a/tools/untypeast.ml +++ b/tools/untypeast.ml @@ -67,7 +67,7 @@ and untype_structure_item item = | Tstr_modtype mtd -> Pstr_modtype (untype_module_type_declaration mtd) | Tstr_open od -> - Pstr_open {popen_lid = od.open_txt; popen_override = od.open_override; + Pstr_open {popen_lid = od.open_txt; popen_flag = od.open_flag; popen_attributes = od.open_attributes; popen_loc = od.open_loc; } @@ -410,7 +410,7 @@ and untype_signature_item item = Psig_modtype (untype_module_type_declaration mtd) | Tsig_open od -> Psig_open {popen_lid = od.open_txt; - popen_override = od.open_override; + popen_flag = od.open_flag; popen_attributes = od.open_attributes; popen_loc = od.open_loc; } diff --git a/typing/env.ml b/typing/env.ml index b57ae0862d..9757fa3306 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -1195,7 +1195,7 @@ let signature_item_subst item p sub = match item with | Sig_value _ | Sig_typext _ | Sig_class _ | Sig_class_type _ -> sub let signature_item_ident = function - | Sig_value (id, _) | Sig_exception (id, _) | Sig_type (id, _, _) + | Sig_value (id, _) | Sig_typext (id, _, _) | Sig_type (id, _, _) | Sig_module (id, _, _) | Sig_modtype (id, _) | Sig_class (id, _, _) | Sig_class_type (id, _, _) -> id diff --git a/typing/typecore.ml b/typing/typecore.ml index ae9bade98c..9c24857720 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1481,6 +1481,30 @@ and is_nonexpansive_opt = function None -> true | Some e -> is_nonexpansive e +(* Helpers for packaged modules. *) +let create_package_type loc env (p, l) = + let s = !Typetexp.transl_modtype_longident loc env p in + let fields = List.map (fun (name, ct) -> + name, Typetexp.transl_simple_type env false ct) l in + let ty = newty (Tpackage (s, + List.map fst l, + List.map (fun (_, cty) -> cty.ctyp_type) fields)) + in + (s, fields, ty) + +let wrap_unpacks sexp unpacks = + let open Ast_helper in + List.fold_left + (fun sexp (name, loc) -> + Exp.letmodule ~loc:sexp.pexp_loc + (Mb.mk ~loc name + (Mod.unpack ~loc + (Exp.ident ~loc:name.loc + (mkloc (Longident.Lident name.txt) name.loc)))) + sexp + ) + sexp unpacks + (* Approximate the type of an expression, for better recursion *) let rec approx_type env sty = @@ -2038,15 +2062,15 @@ and type_expect_ ?in_function env sexp ty_expected = exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_try(sbody, caselist) -> - let body = type_expect env sbody ty_expected in - let cases, _ = - type_cases env Predef.type_exn ty_expected false loc caselist in - re { - exp_desc = Texp_try(body, cases); - exp_loc = loc; exp_extra = []; - exp_type = body.exp_type; - exp_attributes = sexp.pexp_attributes; - exp_env = env } + let body = type_expect env sbody ty_expected in + let cases, _ = + type_cases env Predef.type_exn ty_expected false loc caselist in + re { + exp_desc = Texp_try(body, cases); + exp_loc = loc; exp_extra = []; + exp_type = body.exp_type; + exp_attributes = sexp.pexp_attributes; + exp_env = env } | Pexp_tuple sexpl -> if List.length sexpl < 2 then Syntaxerr.ill_formed_ast loc "Tuples must have at least 2 components."; @@ -2064,24 +2088,40 @@ and type_expect_ ?in_function env sexp ty_expected = exp_attributes = sexp.pexp_attributes; exp_env = env } | Pexp_construct(lid, sarg) -> - type_construct env loc lid sarg ty_expected sexp.pexp_attributes + type_construct env loc lid sarg ty_expected sexp.pexp_attributes | Pexp_variant(l, sarg) -> - (* Keep sharing *) - let ty_expected0 = instance env ty_expected in - begin try match - sarg, expand_head env ty_expected, expand_head env ty_expected0 with - | Some sarg, {desc = Tvariant row}, {desc = Tvariant row0} -> - let row = row_repr row in - begin match row_field_repr (List.assoc l row.row_fields), - row_field_repr (List.assoc l row0.row_fields) with - Rpresent (Some ty), Rpresent (Some ty0) -> - let arg = type_argument env sarg ty ty0 in - re { exp_desc = Texp_variant(l, Some arg); - exp_loc = loc; exp_extra = []; - exp_type = ty_expected0; - exp_attributes = sexp.pexp_attributes; - exp_env = env } + (* Keep sharing *) + let ty_expected0 = instance env ty_expected in + begin try match + sarg, expand_head env ty_expected, expand_head env ty_expected0 with + | Some sarg, {desc = Tvariant row}, {desc = Tvariant row0} -> + let row = row_repr row in + begin match row_field_repr (List.assoc l row.row_fields), + row_field_repr (List.assoc l row0.row_fields) with + Rpresent (Some ty), Rpresent (Some ty0) -> + let arg = type_argument env sarg ty ty0 in + re { exp_desc = Texp_variant(l, Some arg); + exp_loc = loc; exp_extra = []; + exp_type = ty_expected0; + exp_attributes = sexp.pexp_attributes; + exp_env = env } + | _ -> raise Not_found + end | _ -> raise Not_found + with Not_found -> + let arg = may_map (type_exp env) sarg in + let arg_type = may_map (fun arg -> arg.exp_type) arg in + rue { + exp_desc = Texp_variant(l, arg); + exp_loc = loc; exp_extra = []; + exp_type= newty (Tvariant{row_fields = [l, Rpresent arg_type]; + row_more = newvar (); + row_bound = (); + row_closed = false; + row_fixed = false; + row_name = None}); + exp_attributes = sexp.pexp_attributes; + exp_env = env } end | Pexp_record(lid_sexp_list, opt_sexp) -> if lid_sexp_list = [] then @@ -2195,686 +2235,560 @@ and type_expect_ ?in_function env sexp ty_expected = let (_, ty_arg, ty_res) = instance_label false label in unify_exp env record ty_res; rue { - exp_desc = Texp_variant(l, arg); + exp_desc = Texp_field(record, lid, label); exp_loc = loc; exp_extra = []; - exp_type= newty (Tvariant{row_fields = [l, Rpresent arg_type]; - row_more = newvar (); - row_bound = (); - row_closed = false; - row_fixed = false; - row_name = None}); + exp_type = ty_arg; exp_attributes = sexp.pexp_attributes; exp_env = env } - end - | Pexp_record(lid_sexp_list, opt_sexp) -> - let opt_exp = - match opt_sexp with - None -> None - | Some sexp -> - if !Clflags.principal then begin_def (); - let exp = type_exp env sexp in - if !Clflags.principal then begin - end_def (); - generalize_structure exp.exp_type - end; - Some exp - in - let ty_record, opath = - let get_path ty = - try - let (p0, p,_) = extract_concrete_record env ty in - (* XXX level may be wrong *) - Some (p0, p, ty.level = generic_level || not !Clflags.principal) - with Not_found -> None - in - match get_path ty_expected with - None -> - begin match opt_exp with - None -> newvar (), None - | Some exp -> - match get_path exp.exp_type with - None -> newvar (), None - | Some (_, p', _) as op -> - let decl = Env.find_type p' env in - begin_def (); - let ty = - newconstr p' (instance_list env decl.type_params) in - end_def (); - generalize_structure ty; - ty, op - end - | op -> ty_expected, op - in - let closed = (opt_sexp = None) in - let lbl_exp_list = - wrap_disambiguate "This record expression is expected to have" ty_record - (type_label_a_list loc closed env - (type_label_exp true env loc ty_record) - opath) - lid_sexp_list - in - unify_exp_types loc env ty_record (instance env ty_expected); - - (* type_label_a_list returns a list of labels sorted by lbl_pos *) - (* note: check_duplicates would better be implemented in - type_label_a_list directly *) - let rec check_duplicates = function - | (_, lbl1, _) :: (_, lbl2, _) :: _ when lbl1.lbl_pos = lbl2.lbl_pos -> - raise(Error(loc, env, Label_multiply_defined lbl1.lbl_name)) - | _ :: rem -> - check_duplicates rem - | [] -> () - in - check_duplicates lbl_exp_list; - let opt_exp = - match opt_exp, lbl_exp_list with - None, _ -> None - | Some exp, (lid, lbl, lbl_exp) :: _ -> - let ty_exp = instance env exp.exp_type in - let unify_kept lbl = - (* do not connect overridden labels *) - if List.for_all - (fun (_, lbl',_) -> lbl'.lbl_pos <> lbl.lbl_pos) - lbl_exp_list - then begin - let _, ty_arg1, ty_res1 = instance_label false lbl - and _, ty_arg2, ty_res2 = instance_label false lbl in - unify env ty_arg1 ty_arg2; - unify env (instance env ty_expected) ty_res2; - unify_exp_types exp.exp_loc env ty_exp ty_res1; - end in - Array.iter unify_kept lbl.lbl_all; - Some {exp with exp_type = ty_exp} - | _ -> assert false - in - let num_fields = - match lbl_exp_list with [] -> assert false - | (_, lbl,_)::_ -> Array.length lbl.lbl_all in - if opt_sexp = None && List.length lid_sexp_list <> num_fields then begin - let present_indices = - List.map (fun (_, lbl, _) -> lbl.lbl_pos) lbl_exp_list in - let label_names = extract_label_names sexp env ty_expected in - let rec missing_labels n = function - [] -> [] - | lbl :: rem -> - if List.mem n present_indices then missing_labels (n + 1) rem - else lbl :: missing_labels (n + 1) rem - in - let missing = missing_labels 0 label_names in - raise(Error(loc, env, Label_missing missing)) - end - else if opt_sexp <> None && List.length lid_sexp_list = num_fields then - Location.prerr_warning loc Warnings.Useless_record_with; - re { - exp_desc = Texp_record(lbl_exp_list, opt_exp); - exp_loc = loc; exp_extra = []; - exp_type = instance env ty_expected; - exp_attributes = sexp.pexp_attributes; - exp_env = env } - | Pexp_field(srecord, lid) -> - let (record, label, _) = type_label_access env loc srecord lid in - let (_, ty_arg, ty_res) = instance_label false label in - unify_exp env record ty_res; - rue { - exp_desc = Texp_field(record, lid, label); - exp_loc = loc; exp_extra = []; - exp_type = ty_arg; - exp_attributes = sexp.pexp_attributes; - exp_env = env } | Pexp_setfield(srecord, lid, snewval) -> - let (record, label, opath) = type_label_access env loc srecord lid in - let ty_record = if opath = None then newvar () else record.exp_type in - let (label_loc, label, newval) = - type_label_exp false env loc ty_record (lid, label, snewval) in - unify_exp env record ty_record; - if label.lbl_mut = Immutable then - raise(Error(loc, env, Label_not_mutable lid.txt)); - rue { - exp_desc = Texp_setfield(record, label_loc, label, newval); - exp_loc = loc; exp_extra = []; - exp_type = instance_def Predef.type_unit; - exp_attributes = sexp.pexp_attributes; - exp_env = env } - | Pexp_array(sargl) -> - let ty = newgenvar() in - let to_unify = Predef.type_array ty in - unify_exp_types loc env to_unify ty_expected; - let argl = List.map (fun sarg -> type_expect env sarg ty) sargl in - re { - exp_desc = Texp_array argl; - exp_loc = loc; exp_extra = []; - exp_type = instance env ty_expected; - exp_attributes = sexp.pexp_attributes; - exp_env = env } - | Pexp_ifthenelse(scond, sifso, sifnot) -> - let cond = type_expect env scond Predef.type_bool in - begin match sifnot with - None -> - let ifso = type_expect env sifso Predef.type_unit in + let (record, label, opath) = type_label_access env loc srecord lid in + let ty_record = if opath = None then newvar () else record.exp_type in + let (label_loc, label, newval) = + type_label_exp false env loc ty_record (lid, label, snewval) in + unify_exp env record ty_record; + if label.lbl_mut = Immutable then + raise(Error(loc, env, Label_not_mutable lid.txt)); rue { - exp_desc = Texp_ifthenelse(cond, ifso, None); + exp_desc = Texp_setfield(record, label_loc, label, newval); exp_loc = loc; exp_extra = []; - exp_type = ifso.exp_type; + exp_type = instance_def Predef.type_unit; exp_attributes = sexp.pexp_attributes; exp_env = env } - | Some sifnot -> - let ifso = type_expect env sifso ty_expected in - let ifnot = type_expect env sifnot ty_expected in - (* Keep sharing *) - unify_exp env ifnot ifso.exp_type; + | Pexp_array(sargl) -> + let ty = newgenvar() in + let to_unify = Predef.type_array ty in + unify_exp_types loc env to_unify ty_expected; + let argl = List.map (fun sarg -> type_expect env sarg ty) sargl in re { - exp_desc = Texp_ifthenelse(cond, ifso, Some ifnot); + exp_desc = Texp_array argl; exp_loc = loc; exp_extra = []; - exp_type = ifso.exp_type; + exp_type = instance env ty_expected; exp_attributes = sexp.pexp_attributes; exp_env = env } - end + | Pexp_ifthenelse(scond, sifso, sifnot) -> + let cond = type_expect env scond Predef.type_bool in + begin match sifnot with + None -> + let ifso = type_expect env sifso Predef.type_unit in + rue { + exp_desc = Texp_ifthenelse(cond, ifso, None); + exp_loc = loc; exp_extra = []; + exp_type = ifso.exp_type; + exp_attributes = sexp.pexp_attributes; + exp_env = env } + | Some sifnot -> + let ifso = type_expect env sifso ty_expected in + let ifnot = type_expect env sifnot ty_expected in + (* Keep sharing *) + unify_exp env ifnot ifso.exp_type; + re { + exp_desc = Texp_ifthenelse(cond, ifso, Some ifnot); + exp_loc = loc; exp_extra = []; + exp_type = ifso.exp_type; + exp_attributes = sexp.pexp_attributes; + exp_env = env } + end | Pexp_sequence(sexp1, sexp2) -> - let exp1 = type_statement env sexp1 in - let exp2 = type_expect env sexp2 ty_expected in - re { - exp_desc = Texp_sequence(exp1, exp2); - exp_loc = loc; exp_extra = []; - exp_type = exp2.exp_type; - exp_attributes = sexp.pexp_attributes; - exp_env = env } + let exp1 = type_statement env sexp1 in + let exp2 = type_expect env sexp2 ty_expected in + re { + exp_desc = Texp_sequence(exp1, exp2); + exp_loc = loc; exp_extra = []; + exp_type = exp2.exp_type; + exp_attributes = sexp.pexp_attributes; + exp_env = env } | Pexp_while(scond, sbody) -> - let cond = type_expect env scond Predef.type_bool in - let body = type_statement env sbody in - rue { - exp_desc = Texp_while(cond, body); - exp_loc = loc; exp_extra = []; - exp_type = instance_def Predef.type_unit; - exp_attributes = sexp.pexp_attributes; - exp_env = env } + let cond = type_expect env scond Predef.type_bool in + let body = type_statement env sbody in + rue { + exp_desc = Texp_while(cond, body); + exp_loc = loc; exp_extra = []; + exp_type = instance_def Predef.type_unit; + exp_attributes = sexp.pexp_attributes; + exp_env = env } | Pexp_for(param, slow, shigh, dir, sbody) -> - let low = type_expect env slow Predef.type_int in - let high = type_expect env shigh Predef.type_int in - let id, new_env = - match param.ppat_desc with - | Ppat_any -> Ident.create "_for", env - | Ppat_var {txt} -> - Env.enter_value txt {val_type = instance_def Predef.type_int; - val_attributes = []; - val_kind = Val_reg; Types.val_loc = loc; } env - ~check:(fun s -> Warnings.Unused_for_index s) - | _ -> - raise (Error (param.ppat_loc, env, Invalid_for_loop_index)) - in - let body = type_statement new_env sbody in - rue { - exp_desc = Texp_for(id, param, low, high, dir, body); - exp_loc = loc; exp_extra = []; - exp_type = instance_def Predef.type_unit; - exp_attributes = sexp.pexp_attributes; - exp_env = env } - | Pexp_constraint (sarg, sty) -> - let separate = true in (* always separate, 1% slowdown for lablgtk *) - if separate then begin_def (); - let cty = Typetexp.transl_simple_type env false sty in - let ty = cty.ctyp_type in - let (arg, ty') = - if separate then begin - end_def (); - generalize_structure ty; - (type_argument env sarg ty (instance env ty), instance env ty) - end else - (type_argument env sarg ty ty, ty) - in - rue { - exp_desc = arg.exp_desc; - exp_loc = arg.exp_loc; - exp_type = ty'; - exp_attributes = arg.exp_attributes; - exp_env = env; - exp_extra = - (Texp_constraint cty, loc, sexp.pexp_attributes) :: arg.exp_extra; - } - | Pexp_coerce(sarg, sty, sty') -> - let separate = true (* always separate, 1% slowdown for lablgtk *) - (* !Clflags.principal || Env.has_local_constraints env *) in - let (arg, ty',cty,cty') = - match sty with - | None -> - let (cty', force) = - Typetexp.transl_simple_type_delayed env sty' - in - let ty' = cty'.ctyp_type in - if separate then begin_def (); - let arg = type_exp env sarg in - let gen = - if separate then begin - end_def (); - let tv = newvar () in - let gen = generalizable tv.level arg.exp_type in - unify_var env tv arg.exp_type; - gen - end else true - in - begin match arg.exp_desc, !self_coercion, (repr ty').desc with - Texp_ident(_, _, {val_kind=Val_self _}), (path,r) :: _, - Tconstr(path',_,_) when Path.same path path' -> - (* prerr_endline "self coercion"; *) - r := loc :: !r; - force () - | _ when free_variables ~env arg.exp_type = [] - && free_variables ~env ty' = [] -> - if not gen && (* first try a single coercion *) - let snap = snapshot () in - let ty, b = enlarge_type env ty' in - try - force (); Ctype.unify env arg.exp_type ty; true - with Unify _ -> - backtrack snap; false - then () - else begin try - let force' = subtype env arg.exp_type ty' in - force (); force' (); - if not gen then - Location.prerr_warning loc - (Warnings.Not_principal "this ground coercion"); - with Subtype (tr1, tr2) -> - (* prerr_endline "coercion failed"; *) - raise(Error(loc, env, Not_subtype(tr1, tr2))) - end; + let low = type_expect env slow Predef.type_int in + let high = type_expect env shigh Predef.type_int in + let id, new_env = + match param.ppat_desc with + | Ppat_any -> Ident.create "_for", env + | Ppat_var {txt} -> + Env.enter_value txt {val_type = instance_def Predef.type_int; + val_attributes = []; + val_kind = Val_reg; Types.val_loc = loc; } env + ~check:(fun s -> Warnings.Unused_for_index s) | _ -> - let ty, b = enlarge_type env ty' in - force (); - begin try Ctype.unify env arg.exp_type ty with Unify trace -> - raise(Error(sarg.pexp_loc, env, - Coercion_failure(ty', full_expand env ty', trace, b))) - end - end; - (arg, ty', None, cty') - | Some sty -> - if separate then begin_def (); - let (cty, force) = - Typetexp.transl_simple_type_delayed env sty - and (cty', force') = - Typetexp.transl_simple_type_delayed env sty' - in - let ty = cty.ctyp_type in - let ty' = cty'.ctyp_type in - begin try - let force'' = subtype env ty ty' in - force (); force' (); force'' () - with Subtype (tr1, tr2) -> - raise(Error(loc, env, Not_subtype(tr1, tr2))) - end; + raise (Error (param.ppat_loc, env, Invalid_for_loop_index)) + in + let body = type_statement new_env sbody in + rue { + exp_desc = Texp_for(id, param, low, high, dir, body); + exp_loc = loc; exp_extra = []; + exp_type = instance_def Predef.type_unit; + exp_attributes = sexp.pexp_attributes; + exp_env = env } + | Pexp_constraint (sarg, sty) -> + let separate = true in (* always separate, 1% slowdown for lablgtk *) + if separate then begin_def (); + let cty = Typetexp.transl_simple_type env false sty in + let ty = cty.ctyp_type in + let (arg, ty') = if separate then begin end_def (); generalize_structure ty; - generalize_structure ty'; - (type_argument env sarg ty (instance env ty), - instance env ty', Some cty, cty') + (type_argument env sarg ty (instance env ty), instance env ty) end else - (type_argument env sarg ty ty, ty', Some cty, cty') - in - rue { - exp_desc = arg.exp_desc; - exp_loc = arg.exp_loc; - exp_type = ty'; - exp_attributes = arg.exp_attributes; - exp_env = env; - exp_extra = (Texp_coerce (cty, cty'), loc, sexp.pexp_attributes) :: - arg.exp_extra; - } - | Pexp_send (e, met) -> - if !Clflags.principal then begin_def (); - let obj = type_exp env e in - begin try - let (meth, exp, typ) = - match obj.exp_desc with - Texp_ident(path, _, {val_kind = Val_self (meths, _, _, privty)}) -> - let (id, typ) = - filter_self_method env met Private meths privty - in - if is_Tvar (repr typ) then - Location.prerr_warning loc - (Warnings.Undeclared_virtual_method met); - (Tmeth_val id, None, typ) - | Texp_ident(path, lid, {val_kind = Val_anc (methods, cl_num)}) -> - let method_id = - begin try List.assoc met methods with Not_found -> - raise(Error(e.pexp_loc, env, Undefined_inherited_method met)) - end - in - begin match - Env.lookup_value (Longident.Lident ("selfpat-" ^ cl_num)) env, - Env.lookup_value (Longident.Lident ("self-" ^cl_num)) env - with - (_, ({val_kind = Val_self (meths, _, _, privty)} as desc)), - (path, _) -> - let (_, typ) = - filter_self_method env met Private meths privty + (type_argument env sarg ty ty, ty) + in + rue { + exp_desc = arg.exp_desc; + exp_loc = arg.exp_loc; + exp_type = ty'; + exp_attributes = arg.exp_attributes; + exp_env = env; + exp_extra = + (Texp_constraint cty, loc, sexp.pexp_attributes) :: arg.exp_extra; + } + | Pexp_coerce(sarg, sty, sty') -> + let separate = true (* always separate, 1% slowdown for lablgtk *) + (* !Clflags.principal || Env.has_local_constraints env *) in + let (arg, ty',cty,cty') = + match sty with + | None -> + let (cty', force) = + Typetexp.transl_simple_type_delayed env sty' in - let method_type = newvar () in - let (obj_ty, res_ty) = filter_arrow env method_type Tarr_simple in - unify env obj_ty desc.val_type; - unify env res_ty (instance env typ); - let exp = - Texp_apply( - {exp_desc = - Texp_ident(Path.Pident method_id, lid, - {val_type = method_type; - val_kind = Val_reg; - val_attributes = []; - Types.val_loc = Location.none}); - exp_loc = loc; exp_extra = []; - exp_type = method_type; - exp_attributes = []; (* check *) - exp_env = env}, - [{ arg_flag = Tapp_simple; - arg_expression = - Some { exp_desc = Texp_ident(path, lid, desc); - exp_loc = obj.exp_loc; exp_extra = []; - exp_type = desc.val_type; - exp_attributes = []; (* check *) - exp_env = env }; - }] - ) + let ty' = cty'.ctyp_type in + if separate then begin_def (); + let arg = type_exp env sarg in + let gen = + if separate then begin + end_def (); + let tv = newvar () in + let gen = generalizable tv.level arg.exp_type in + unify_var env tv arg.exp_type; + gen + end else true in - (Tmeth_name met, Some (re {exp_desc = exp; - exp_loc = loc; exp_extra = []; - exp_type = typ; - exp_attributes = []; (* check *) - exp_env = env}), typ) - | _ -> - assert false - end - | _ -> - (Tmeth_name met, None, - filter_method env met Public obj.exp_type) - in - if !Clflags.principal then begin - end_def (); - generalize_structure typ; - end; - let typ = - match repr typ with - {desc = Tpoly (ty, [])} -> - instance env ty - | {desc = Tpoly (ty, tl); level = l} -> - if !Clflags.principal && l <> generic_level then - Location.prerr_warning loc - (Warnings.Not_principal "this use of a polymorphic method"); - snd (instance_poly false tl ty) - | {desc = Tvar _} as ty -> - let ty' = newvar () in - unify env (instance_def ty) (newty(Tpoly(ty',[]))); - (* if not !Clflags.nolabels then - Location.prerr_warning loc (Warnings.Unknown_method met); *) - ty' - | _ -> - assert false + begin match arg.exp_desc, !self_coercion, (repr ty').desc with + Texp_ident(_, _, {val_kind=Val_self _}), (path,r) :: _, + Tconstr(path',_,_) when Path.same path path' -> + (* prerr_endline "self coercion"; *) + r := loc :: !r; + force () + | _ when free_variables ~env arg.exp_type = [] + && free_variables ~env ty' = [] -> + if not gen && (* first try a single coercion *) + let snap = snapshot () in + let ty, b = enlarge_type env ty' in + try + force (); Ctype.unify env arg.exp_type ty; true + with Unify _ -> + backtrack snap; false + then () + else begin try + let force' = subtype env arg.exp_type ty' in + force (); force' (); + if not gen then + Location.prerr_warning loc + (Warnings.Not_principal "this ground coercion"); + with Subtype (tr1, tr2) -> + (* prerr_endline "coercion failed"; *) + raise(Error(loc, env, Not_subtype(tr1, tr2))) + end; + | _ -> + let ty, b = enlarge_type env ty' in + force (); + begin try Ctype.unify env arg.exp_type ty with Unify trace -> + raise(Error(sarg.pexp_loc, env, + Coercion_failure(ty', full_expand env ty', trace, b))) + end + end; + (arg, ty', None, cty') + | Some sty -> + if separate then begin_def (); + let (cty, force) = + Typetexp.transl_simple_type_delayed env sty + and (cty', force') = + Typetexp.transl_simple_type_delayed env sty' + in + let ty = cty.ctyp_type in + let ty' = cty'.ctyp_type in + begin try + let force'' = subtype env ty ty' in + force (); force' (); force'' () + with Subtype (tr1, tr2) -> + raise(Error(loc, env, Not_subtype(tr1, tr2))) + end; + if separate then begin + end_def (); + generalize_structure ty; + generalize_structure ty'; + (type_argument env sarg ty (instance env ty), + instance env ty', Some cty, cty') + end else + (type_argument env sarg ty ty, ty', Some cty, cty') in rue { - exp_desc = Texp_send(obj, meth, exp); - exp_loc = loc; exp_extra = []; - exp_type = typ; - exp_attributes = sexp.pexp_attributes; - exp_env = env } - with Unify _ -> - raise(Error(e.pexp_loc, env, Undefined_method (obj.exp_type, met))) - end - | Pexp_new cl -> - let (cl_path, cl_decl) = Typetexp.find_class env loc cl.txt in - begin match cl_decl.cty_new with - None -> - raise(Error(loc, env, Virtual_class cl.txt)) - | Some ty -> - rue { - exp_desc = Texp_new (cl_path, cl, cl_decl); - exp_loc = loc; exp_extra = []; - exp_type = instance_def ty; - exp_attributes = sexp.pexp_attributes; - exp_env = env } - end - | Pexp_setinstvar (lab, snewval) -> - begin try - let (path, desc) = Env.lookup_value (Longident.Lident lab.txt) env in - match desc.val_kind with - Val_ivar (Mutable, cl_num) -> - let newval = - type_expect env snewval (instance env desc.val_type) in - let (path_self, _) = - Env.lookup_value (Longident.Lident ("self-" ^ cl_num)) env + exp_desc = arg.exp_desc; + exp_loc = arg.exp_loc; + exp_type = ty'; + exp_attributes = arg.exp_attributes; + exp_env = env; + exp_extra = (Texp_coerce (cty, cty'), loc, sexp.pexp_attributes) :: + arg.exp_extra; + } + | Pexp_send (e, met) -> + if !Clflags.principal then begin_def (); + let obj = type_exp env e in + begin try + let (meth, exp, typ) = + match obj.exp_desc with + Texp_ident(path, _, {val_kind = Val_self (meths, _, _, privty)}) -> + let (id, typ) = + filter_self_method env met Private meths privty + in + if is_Tvar (repr typ) then + Location.prerr_warning loc + (Warnings.Undeclared_virtual_method met); + (Tmeth_val id, None, typ) + | Texp_ident(path, lid, {val_kind = Val_anc (methods, cl_num)}) -> + let method_id = + begin try List.assoc met methods with Not_found -> + raise(Error(e.pexp_loc, env, Undefined_inherited_method met)) + end + in + begin match + Env.lookup_value (Longident.Lident ("selfpat-" ^ cl_num)) env, + Env.lookup_value (Longident.Lident ("self-" ^cl_num)) env + with + (_, ({val_kind = Val_self (meths, _, _, privty)} as desc)), + (path, _) -> + let (_, typ) = + filter_self_method env met Private meths privty + in + let method_type = newvar () in + let (obj_ty, res_ty) = filter_arrow env method_type Tarr_simple in + unify env obj_ty desc.val_type; + unify env res_ty (instance env typ); + let exp = + Texp_apply({exp_desc = + Texp_ident(Path.Pident method_id, lid, + {val_type = method_type; + val_kind = Val_reg; + val_attributes = []; + Types.val_loc = Location.none}); + exp_loc = loc; exp_extra = []; + exp_type = method_type; + exp_attributes = []; (* check *) + exp_env = env}, + [{ arg_flag = Tapp_simple; + arg_expression = + Some {exp_desc = Texp_ident(path, lid, desc); + exp_loc = obj.exp_loc; exp_extra = []; + exp_type = desc.val_type; + exp_attributes = []; (* check *) + exp_env = env} }]) + in + (Tmeth_name met, Some (re {exp_desc = exp; + exp_loc = loc; exp_extra = []; + exp_type = typ; + exp_attributes = []; (* check *) + exp_env = env}), typ) + | _ -> + assert false + end + | _ -> + (Tmeth_name met, None, + filter_method env met Public obj.exp_type) + in + if !Clflags.principal then begin + end_def (); + generalize_structure typ; + end; + let typ = + match repr typ with + {desc = Tpoly (ty, [])} -> + instance env ty + | {desc = Tpoly (ty, tl); level = l} -> + if !Clflags.principal && l <> generic_level then + Location.prerr_warning loc + (Warnings.Not_principal "this use of a polymorphic method"); + snd (instance_poly false tl ty) + | {desc = Tvar _} as ty -> + let ty' = newvar () in + unify env (instance_def ty) (newty(Tpoly(ty',[]))); + (* if not !Clflags.nolabels then + Location.prerr_warning loc (Warnings.Unknown_method met); *) + ty' + | _ -> + assert false in rue { - exp_desc = Texp_setinstvar(path_self, path, lab, newval); + exp_desc = Texp_send(obj, meth, exp); exp_loc = loc; exp_extra = []; - exp_type = instance_def Predef.type_unit; + exp_type = typ; exp_attributes = sexp.pexp_attributes; exp_env = env } - | Val_ivar _ -> - raise(Error(loc, env, Instance_variable_not_mutable(true,lab.txt))) - | _ -> - raise(Error(loc, env, Instance_variable_not_mutable(false,lab.txt))) - with - Not_found -> - raise(Error(loc, env, Unbound_instance_variable lab.txt)) - end + with Unify _ -> + raise(Error(e.pexp_loc, env, Undefined_method (obj.exp_type, met))) + end + | Pexp_new cl -> + let (cl_path, cl_decl) = Typetexp.find_class env loc cl.txt in + begin match cl_decl.cty_new with + None -> + raise(Error(loc, env, Virtual_class cl.txt)) + | Some ty -> + rue { + exp_desc = Texp_new (cl_path, cl, cl_decl); + exp_loc = loc; exp_extra = []; + exp_type = instance_def ty; + exp_attributes = sexp.pexp_attributes; + exp_env = env } + end + | Pexp_setinstvar (lab, snewval) -> + begin try + let (path, desc) = Env.lookup_value (Longident.Lident lab.txt) env in + match desc.val_kind with + Val_ivar (Mutable, cl_num) -> + let newval = + type_expect env snewval (instance env desc.val_type) in + let (path_self, _) = + Env.lookup_value (Longident.Lident ("self-" ^ cl_num)) env + in + rue { + exp_desc = Texp_setinstvar(path_self, path, lab, newval); + exp_loc = loc; exp_extra = []; + exp_type = instance_def Predef.type_unit; + exp_attributes = sexp.pexp_attributes; + exp_env = env } + | Val_ivar _ -> + raise(Error(loc, env, Instance_variable_not_mutable(true,lab.txt))) + | _ -> + raise(Error(loc, env, Instance_variable_not_mutable(false,lab.txt))) + with + Not_found -> + raise(Error(loc, env, Unbound_instance_variable lab.txt)) + end | Pexp_override lst -> - let _ = - List.fold_right + let _ = + List.fold_right (fun (lab, _) l -> - if List.exists (fun l -> l.txt = lab.txt) l then - raise(Error(loc, env, - Value_multiply_overridden lab.txt)); - lab::l) + if List.exists (fun l -> l.txt = lab.txt) l then + raise(Error(loc, env, + Value_multiply_overridden lab.txt)); + lab::l) lst [] in - begin match - try - Env.lookup_value (Longident.Lident "selfpat-*") env, - Env.lookup_value (Longident.Lident "self-*") env - with Not_found -> - raise(Error(loc, env, Outside_class)) - with - (_, {val_type = self_ty; val_kind = Val_self (_, vars, _, _)}), - (path_self, _) -> - let type_override (lab, snewval) = - begin try - let (id, _, _, ty) = Vars.find lab.txt !vars in - (Path.Pident id, lab, type_expect env snewval (instance env ty)) - with - Not_found -> - raise(Error(loc, env, Unbound_instance_variable lab.txt)) - end - in - let modifs = List.map type_override lst in - rue { - exp_desc = Texp_override(path_self, modifs); + begin match + try + Env.lookup_value (Longident.Lident "selfpat-*") env, + Env.lookup_value (Longident.Lident "self-*") env + with Not_found -> + raise(Error(loc, env, Outside_class)) + with + (_, {val_type = self_ty; val_kind = Val_self (_, vars, _, _)}), + (path_self, _) -> + let type_override (lab, snewval) = + begin try + let (id, _, _, ty) = Vars.find lab.txt !vars in + (Path.Pident id, lab, type_expect env snewval (instance env ty)) + with + Not_found -> + raise(Error(loc, env, Unbound_instance_variable lab.txt)) + end + in + let modifs = List.map type_override lst in + rue { + exp_desc = Texp_override(path_self, modifs); + exp_loc = loc; exp_extra = []; + exp_type = self_ty; + exp_attributes = sexp.pexp_attributes; + exp_env = env } + | _ -> + assert false + end + | Pexp_letmodule({pmb_name = name; pmb_expr = smodl; pmb_implicit; + pmb_attributes; pmb_loc}, sbody) -> + let ty = newvar() in + (* remember original level *) + begin_def (); + Ident.set_current_time ty.level; + let context = Typetexp.narrow () in + let modl = !type_module env smodl in + let (id, new_env) = + Env.enter_module ~implicit_:pmb_implicit name.txt modl.mod_type env in + Ctype.init_def(Ident.current_time()); + Typetexp.widen context; + let body = type_expect new_env sbody ty_expected in + (* go back to original level *) + end_def (); + (* Unification of body.exp_type with the fresh variable ty + fails if and only if the prefix condition is violated, + i.e. if generative types rooted at id show up in the + type body.exp_type. Thus, this unification enforces the + scoping condition on "let module". *) + begin try + Ctype.unify_var new_env ty body.exp_type + with Unify _ -> + raise(Error(loc, env, Scoping_let_module(name.txt, body.exp_type))) + end; + let mb = {mb_id = id; mb_name = name; mb_expr = modl; mb_loc = pmb_loc; + mb_implicit = pmb_implicit; mb_attributes = pmb_attributes} in + re { + exp_desc = Texp_letmodule(mb, body); exp_loc = loc; exp_extra = []; - exp_type = self_ty; + exp_type = ty; exp_attributes = sexp.pexp_attributes; exp_env = env } - | _ -> - assert false - end - | Pexp_letmodule({pmb_name = name; pmb_expr = smodl; pmb_implicit; - pmb_attributes; pmb_loc}, sbody) -> - let ty = newvar() in - (* remember original level *) - begin_def (); - Ident.set_current_time ty.level; - let context = Typetexp.narrow () in - let modl = !type_module env smodl in - let (id, new_env) = - Env.enter_module ~implicit_:pmb_implicit name.txt modl.mod_type env - in - Ctype.init_def(Ident.current_time()); - Typetexp.widen context; - let body = type_expect new_env sbody ty_expected in - (* go back to original level *) - end_def (); - (* Unification of body.exp_type with the fresh variable ty - fails if and only if the prefix condition is violated, - i.e. if generative types rooted at id show up in the - type body.exp_type. Thus, this unification enforces the - scoping condition on "let module". *) - begin try - Ctype.unify_var new_env ty body.exp_type - with Unify _ -> - raise(Error(loc, env, Scoping_let_module(name.txt, body.exp_type))) - end; - let mb = { mb_id = id; mb_name = name; mb_expr = modl; mb_loc = pmb_loc; - mb_implicit = pmb_implicit; mb_attributes = pmb_attributes } - in - re { - exp_desc = Texp_letmodule (mb, body); - exp_loc = loc; exp_extra = []; - exp_type = ty; - exp_attributes = sexp.pexp_attributes; - exp_env = env } | Pexp_assert (e) -> - let cond = type_expect env e Predef.type_bool in - let exp_type = - match cond.exp_desc with - | Texp_construct(_, {cstr_name="false"}, _) -> - instance env ty_expected - | _ -> - instance_def Predef.type_unit - in - rue { - exp_desc = Texp_assert cond; - exp_loc = loc; exp_extra = []; - exp_type; - exp_attributes = sexp.pexp_attributes; - exp_env = env; - } + let cond = type_expect env e Predef.type_bool in + let exp_type = + match cond.exp_desc with + | Texp_construct(_, {cstr_name="false"}, _) -> + instance env ty_expected + | _ -> + instance_def Predef.type_unit + in + rue { + exp_desc = Texp_assert cond; + exp_loc = loc; exp_extra = []; + exp_type; + exp_attributes = sexp.pexp_attributes; + exp_env = env; + } | Pexp_lazy e -> - let ty = newgenvar () in - let to_unify = Predef.type_lazy_t ty in - unify_exp_types loc env to_unify ty_expected; - let arg = type_expect env e ty in - re { - exp_desc = Texp_lazy arg; - exp_loc = loc; exp_extra = []; - exp_type = instance env ty_expected; - exp_attributes = sexp.pexp_attributes; - exp_env = env; - } + let ty = newgenvar () in + let to_unify = Predef.type_lazy_t ty in + unify_exp_types loc env to_unify ty_expected; + let arg = type_expect env e ty in + re { + exp_desc = Texp_lazy arg; + exp_loc = loc; exp_extra = []; + exp_type = instance env ty_expected; + exp_attributes = sexp.pexp_attributes; + exp_env = env; + } | Pexp_object s -> - let desc, sign, meths = !type_object env loc s in - rue { - exp_desc = Texp_object (desc, (*sign,*) meths); - exp_loc = loc; exp_extra = []; - exp_type = sign.csig_self; - exp_attributes = sexp.pexp_attributes; - exp_env = env; - } + let desc, sign, meths = !type_object env loc s in + rue { + exp_desc = Texp_object (desc, (*sign,*) meths); + exp_loc = loc; exp_extra = []; + exp_type = sign.csig_self; + exp_attributes = sexp.pexp_attributes; + exp_env = env; + } | Pexp_poly(sbody, sty) -> - if !Clflags.principal then begin_def (); - let ty, cty = - match sty with None -> repr ty_expected, None - | Some sty -> - let sty = Ast_helper.Typ.force_poly sty in - let cty = Typetexp.transl_simple_type env false sty in - repr cty.ctyp_type, Some cty - in - if !Clflags.principal then begin - end_def (); - generalize_structure ty - end; - if sty <> None then - unify_exp_types loc env (instance env ty) (instance env ty_expected); - let exp = - match (expand_head env ty).desc with - Tpoly (ty', []) -> - let exp = type_expect env sbody ty' in - { exp with exp_type = instance env ty } - | Tpoly (ty', tl) -> - (* One more level to generalize locally *) - begin_def (); - if !Clflags.principal then begin_def (); - let vars, ty'' = instance_poly true tl ty' in - if !Clflags.principal then begin - end_def (); - generalize_structure ty'' - end; - let exp = type_expect env sbody ty'' in + if !Clflags.principal then begin_def (); + let ty, cty = + match sty with None -> repr ty_expected, None + | Some sty -> + let sty = Ast_helper.Typ.force_poly sty in + let cty = Typetexp.transl_simple_type env false sty in + repr cty.ctyp_type, Some cty + in + if !Clflags.principal then begin end_def (); - check_univars env false "method" exp ty_expected vars; - { exp with exp_type = instance env ty } - | Tvar _ -> - let exp = type_exp env sbody in - let exp = {exp with exp_type = newty (Tpoly (exp.exp_type, []))} in - unify_exp env exp ty; - exp - | _ -> assert false - in - re { exp with exp_extra = - (Texp_poly cty, loc, sexp.pexp_attributes) :: exp.exp_extra } + generalize_structure ty + end; + if sty <> None then + unify_exp_types loc env (instance env ty) (instance env ty_expected); + let exp = + match (expand_head env ty).desc with + Tpoly (ty', []) -> + let exp = type_expect env sbody ty' in + { exp with exp_type = instance env ty } + | Tpoly (ty', tl) -> + (* One more level to generalize locally *) + begin_def (); + if !Clflags.principal then begin_def (); + let vars, ty'' = instance_poly true tl ty' in + if !Clflags.principal then begin + end_def (); + generalize_structure ty'' + end; + let exp = type_expect env sbody ty'' in + end_def (); + check_univars env false "method" exp ty_expected vars; + { exp with exp_type = instance env ty } + | Tvar _ -> + let exp = type_exp env sbody in + let exp = {exp with exp_type = newty (Tpoly (exp.exp_type, []))} in + unify_exp env exp ty; + exp + | _ -> assert false + in + re { exp with exp_extra = + (Texp_poly cty, loc, sexp.pexp_attributes) :: exp.exp_extra } | Pexp_newtype(name, sbody) -> - let ty = newvar () in - (* remember original level *) - begin_def (); - (* Create a fake abstract type declaration for name. *) - let level = get_current_level () in - let decl = { - type_params = []; - type_arity = 0; - type_kind = Type_abstract; - type_private = Public; - type_manifest = None; - type_variance = []; - type_newtype_level = Some (level, level); - type_loc = loc; - type_attributes = []; - } - in - Ident.set_current_time ty.level; - let (id, new_env) = Env.enter_type name decl env in - Ctype.init_def(Ident.current_time()); - - let body = type_exp new_env sbody in - (* Replace every instance of this type constructor in the resulting - type. *) - let seen = Hashtbl.create 8 in - let rec replace t = - if Hashtbl.mem seen t.id then () - else begin - Hashtbl.add seen t.id (); - match t.desc with - | Tconstr (Path.Pident id', _, _) when id == id' -> link_type t ty - | _ -> Btype.iter_type_expr replace t - end - in - let ety = Subst.type_expr Subst.identity body.exp_type in - replace ety; - (* back to original level *) - end_def (); - (* lower the levels of the result type *) - (* unify_var env ty ety; *) + let ty = newvar () in + (* remember original level *) + begin_def (); + (* Create a fake abstract type declaration for name. *) + let level = get_current_level () in + let decl = { + type_params = []; + type_arity = 0; + type_kind = Type_abstract; + type_private = Public; + type_manifest = None; + type_variance = []; + type_newtype_level = Some (level, level); + type_loc = loc; + type_attributes = []; + } + in + Ident.set_current_time ty.level; + let (id, new_env) = Env.enter_type name decl env in + Ctype.init_def(Ident.current_time()); + + let body = type_exp new_env sbody in + (* Replace every instance of this type constructor in the resulting + type. *) + let seen = Hashtbl.create 8 in + let rec replace t = + if Hashtbl.mem seen t.id then () + else begin + Hashtbl.add seen t.id (); + match t.desc with + | Tconstr (Path.Pident id', _, _) when id == id' -> link_type t ty + | _ -> Btype.iter_type_expr replace t + end + in + let ety = Subst.type_expr Subst.identity body.exp_type in + replace ety; + (* back to original level *) + end_def (); + (* lower the levels of the result type *) + (* unify_var env ty ety; *) - (* non-expansive if the body is non-expansive, so we don't introduce - any new extra node in the typed AST. *) - rue { body with exp_loc = loc; exp_type = ety; - exp_extra = + (* non-expansive if the body is non-expansive, so we don't introduce + any new extra node in the typed AST. *) + rue { body with exp_loc = loc; exp_type = ety; + exp_extra = (Texp_newtype name, loc, sexp.pexp_attributes) :: body.exp_extra } | Pexp_pack m -> - let (p, nl, tl) = - match Ctype.expand_head env (instance env ty_expected) with - {desc = Tpackage (p, nl, tl)} -> - if !Clflags.principal && - (Ctype.expand_head env ty_expected).level < Btype.generic_level - then - Location.prerr_warning loc - (Warnings.Not_principal "this module packing"); - (p, nl, tl) - | {desc = Tvar _} -> - raise (Error (loc, env, Cannot_infer_signature)) - | _ -> - raise (Error (loc, env, Not_a_packed_module ty_expected)) - in - let (modl, tl') = !type_package env m p nl tl in - rue { - exp_desc = Texp_pack modl; - exp_loc = loc; exp_extra = []; - exp_type = newty (Tpackage (p, nl, tl')); - exp_attributes = sexp.pexp_attributes; - exp_env = env } + let (p, nl, tl) = + match Ctype.expand_head env (instance env ty_expected) with + {desc = Tpackage (p, nl, tl)} -> + if !Clflags.principal && + (Ctype.expand_head env ty_expected).level < Btype.generic_level + then + Location.prerr_warning loc + (Warnings.Not_principal "this module packing"); + (p, nl, tl) + | {desc = Tvar _} -> + raise (Error (loc, env, Cannot_infer_signature)) + | _ -> + raise (Error (loc, env, Not_a_packed_module ty_expected)) + in + let (modl, tl') = !type_package env m p nl tl in + rue { + exp_desc = Texp_pack modl; + exp_loc = loc; exp_extra = []; + exp_type = newty (Tpackage (p, nl, tl')); + exp_attributes = sexp.pexp_attributes; + exp_env = env } | Pexp_open (ovf, lid, e) -> let (path, newenv) = !type_open ovf env sexp.pexp_loc lid in let exp = type_expect newenv e ty_expected in @@ -2936,6 +2850,7 @@ and type_function ?in_function loc attrs env ty_expected arr caselist = exp_attributes = attrs; exp_env = env } + and type_label_access env loc srecord lid = if !Clflags.principal then begin_def (); let record = type_exp env srecord in @@ -3388,7 +3303,7 @@ and type_application env funct let t1 = newvar ?name () and t2 = newvar ?name () in let not_identity = function Texp_ident(_,_,{val_kind=Val_prim - {Primitive.prim_name="%identity"}}) -> + {Primitive.prim_name="%identity"}}) -> false | _ -> true in @@ -3595,7 +3510,7 @@ and type_application env funct in match funct.exp_desc, sargs with (* Special case for ignore: avoid discarding warning *) - | Texp_ident (_, _, {val_kind=Val_prim{Primitive.prim_name="%ignore"}}), + Texp_ident (_, _, {val_kind=Val_prim{Primitive.prim_name="%ignore"}}), [Tapp_simple, sarg] -> let ty_arg, ty_res = filter_arrow env (instance env funct.exp_type) Tarr_simple in let exp = type_expect env sarg ty_arg in diff --git a/typing/typemod.ml b/typing/typemod.ml index 7c1171abc2..5e2840c6ea 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -67,7 +67,7 @@ let extract_sig_open env loc mty = (* Compute the environment after opening a module *) -let type_open_ ?toplevel ovf env loc lid = +let type_open_ ?toplevel opf env loc lid = let path, md = Typetexp.find_module env lid.loc lid.txt in let sg = extract_sig_open env lid.loc md.md_type in let env = match opf with @@ -77,11 +77,11 @@ let type_open_ ?toplevel ovf env loc lid = let type_open ?toplevel env sod = let (path, newenv) = - type_open_ ?toplevel sod.popen_override env sod.popen_loc sod.popen_lid + type_open_ ?toplevel sod.popen_flag env sod.popen_loc sod.popen_lid in let od = { - open_override = sod.popen_override; + open_flag = sod.popen_flag; open_path = path; open_txt = sod.popen_lid; open_attributes = sod.popen_attributes; diff --git a/typing/typemod.mli b/typing/typemod.mli index 9f8e617086..a17bcf63c0 100644 --- a/typing/typemod.mli +++ b/typing/typemod.mli @@ -33,7 +33,7 @@ val transl_signature: val check_nongen_schemes: Env.t -> Typedtree.structure_item list -> unit val type_open_: - ?toplevel:bool -> Asttypes.override_flag -> + ?toplevel:bool -> Asttypes.open_flag -> Env.t -> Location.t -> Longident.t Asttypes.loc -> Path.t * Env.t val modtype_of_package: Env.t -> Location.t -> From 1804a1defc4a5739b9498c2c1a9a9bbc34ee8339 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Tue, 26 Aug 2014 14:48:59 +0200 Subject: [PATCH 418/494] unmark types where appropriate --- typing/implicitsearch.ml | 5 +++++ typing/typeimplicit.ml | 2 ++ 2 files changed, 7 insertions(+) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 654c79646a..0836a3f04b 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -424,6 +424,11 @@ let target_of_pending inst = it.it_type_expr it ty; it.it_type_expr it tyvar) hkt; + unmark_iterators.it_module_type unmark_iterators mty; + List.iter (fun (ty,tyvar) -> + unmark_type ty; + unmark_type tyvar) + hkt; let id = inst.implicit_id in !variables, {target_type = mty; target_id = id; target_uid = id; target_hkt = hkt} diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index bfab558693..17e1e2e5b9 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -142,6 +142,8 @@ let instantiate_one_implicit loc env id ty_arg ty_res = (* Unlink main types *) let unlink_it = unlink env unlink_ident in List.iter (unlink_it.it_type_expr unlink_it) ty_res; + List.iter unmark_type ty_res; + inst let pack_implicit_ref From c981cf54f4e678c2c579f8abced0b67dd60ee01f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bour?= <frederic.bour@lakaban.net> Date: Wed, 27 Aug 2014 11:28:02 +0200 Subject: [PATCH 419/494] Simplify diff to ease review --- bytecomp/translcore.ml | 4 +- typing/btype.mli | 2 - typing/typecore.ml | 184 ++++++++++++++++++++--------------------- typing/typecore.mli | 2 +- typing/typemod.ml | 22 ++--- 5 files changed, 105 insertions(+), 109 deletions(-) diff --git a/bytecomp/translcore.ml b/bytecomp/translcore.ml index a3e2059da5..f19d8322f5 100644 --- a/bytecomp/translcore.ml +++ b/bytecomp/translcore.ml @@ -672,7 +672,7 @@ and transl_exp0 e = | Texp_apply({exp_desc = Texp_ident(path, _, {val_kind = Val_prim p})}, oargs) when List.length oargs >= p.prim_arity - && List.for_all (fun arg -> arg.arg_expression <> None) oargs -> + && List.for_all (fun arg -> arg.arg_expression <> None) oargs -> let args, args' = cut p.prim_arity oargs in let wrap f = if args' = [] @@ -971,7 +971,7 @@ and transl_apply lam sargs loc = Lapply(lexp, args, loc) in let rec build_apply lam args = function - | (None, optional) :: l -> + (None, optional) :: l -> let defs = ref [] in let protect name lam = match lam with diff --git a/typing/btype.mli b/typing/btype.mli index d80ed232c0..cd8acc4538 100644 --- a/typing/btype.mli +++ b/typing/btype.mli @@ -120,8 +120,6 @@ val copy_row: bool -> row_desc -> bool -> type_expr -> row_desc val copy_kind: field_kind -> field_kind -val copy_commu: commutable -> commutable - val save_desc: type_expr -> type_desc -> unit (* Save a type description *) val dup_kind: field_kind option ref -> unit diff --git a/typing/typecore.ml b/typing/typecore.ml index 9c24857720..6eec6ccd7c 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -30,7 +30,6 @@ type error = | Orpat_vars of Ident.t | Expr_type_clash of (type_expr * type_expr) list | Apply_non_function of type_expr - | Apply_unexpected_implicit of type_expr | Apply_wrong_label of apply_flag * type_expr | Label_multiply_defined of string | Label_missing of Ident.t list @@ -69,6 +68,7 @@ type error = | No_value_clauses | Exception_pattern_below_toplevel + | Apply_unexpected_implicit of type_expr | No_instance_found of Typeimplicit.pending_implicit | Ambiguous_implicit of Typeimplicit.pending_implicit * Path.t * Path.t | Termination_fail of Typeimplicit.pending_implicit @@ -1509,10 +1509,10 @@ let wrap_unpacks sexp unpacks = let rec approx_type env sty = match sty.ptyp_desc with - | Ptyp_arrow (Parr_optional s, lhs, sty) -> - let ty1 = type_option (approx_type env lhs) in + | Ptyp_arrow (Parr_optional s, _, sty) -> + let ty1 = type_option (newvar ()) in newty (Tarrow (Tarr_optional s, ty1, approx_type env sty, Cok)) - | Ptyp_arrow (Parr_implicit _s, _lhs, _sty) -> + | Ptyp_arrow (Parr_implicit _s, _, _sty) -> newvar () (*let loc, (ppath, pcstrs) = match lhs with | {ptyp_desc = Ptyp_package pkg; ptyp_loc} -> @@ -1528,8 +1528,8 @@ let rec approx_type env sty = Env.enter_module ~arg:true ~implicit_:(Implicit 0) s mty env in newty (Tarrow(Tarr_implicit id, pkg_ty, approx_type env sty, Cok))*) - | Ptyp_arrow (p, lhs, sty) -> - newty (Tarrow (tarr_of_parr p, approx_type env lhs, approx_type env sty, Cok)) + | Ptyp_arrow (p, _, sty) -> + newty (Tarrow (tarr_of_parr p, newvar (), approx_type env sty, Cok)) | Ptyp_tuple args -> newty (Ttuple (List.map (approx_type env) args)) | Ptyp_constr (lid, ctl) -> @@ -1539,7 +1539,7 @@ let rec approx_type env sty = let tyl = List.map (approx_type env) ctl in newconstr path tyl with Not_found -> - Format.eprintf "@[%a@] not found\n%!" Printtyp.longident lid.txt; + (*Format.eprintf "@[%a@] not found\n%!" Printtyp.longident lid.txt;*) newvar () end | Ptyp_poly (_, sty) -> @@ -1549,7 +1549,7 @@ let rec approx_type env sty = let rec type_approx env sexp = match sexp.pexp_desc with Pexp_let (_, _, e) -> type_approx env e - | Pexp_fun (Parr_optional s, _, lhs, e) -> + | Pexp_fun (Parr_optional s, _, _, e) -> newty (Tarrow(Tarr_optional s, type_option (newvar ()), type_approx env e, Cok)) (* Traversing implicit in type_approx might be a bad idea: the type variable @@ -1573,7 +1573,7 @@ let rec type_approx env sexp = FIXME *) | Pexp_fun (Parr_implicit _, _, _, _) -> newvar () - | Pexp_fun (p, _, lhs, e) -> + | Pexp_fun (p, _, _, e) -> newty (Tarrow(tarr_of_parr p, newvar (), type_approx env e, Cok)) | Pexp_function ({pc_rhs=e}::_) -> newty (Tarrow(Tarr_simple, newvar (), type_approx env e, Cok)) @@ -1948,90 +1948,90 @@ and type_expect_ ?in_function env sexp ty_expected = in type_expect ?in_function env sfun ty_expected | Pexp_fun (Parr_implicit name, None, spat, sbody) -> - let ty = newvar () in - (* remember original level *) - begin_def (); - Ident.set_current_time ty.level; - let lev = get_current_level () in - let id = Ident.create name in - let ty_arg = newvar () in - (* type argument *) - begin_def (); - let (c_lhs, new_env, pattern_force, unpacks) = - let scope = Some (Annot.Idef sbody.pexp_loc) in - type_pattern ~lev env spat scope ty_arg in - end_def(); - assert (unpacks = []); - (* `Contaminating' unifications start here *) - List.iter (fun f -> f()) pattern_force; - begin_def (); - let body = type_implicit_arg id lev new_env sbody in - let case = {c_lhs; c_guard = None; c_rhs = body} in - let arr = Tarr_implicit id in - end_def (); (* exit rhs *) - end_def (); (* exit implicit binding *) - rue { - exp_desc = Texp_function (arr, [case], Total); - exp_loc = loc; exp_extra = []; - exp_type = instance env (newgenty (Tarrow (arr, ty_arg, body.exp_type, Cok))); - exp_attributes = []; - exp_env = env; - } - (* TODO: keep attributes, call type_function directly *) + let ty = newvar () in + (* remember original level *) + begin_def (); + Ident.set_current_time ty.level; + let lev = get_current_level () in + let id = Ident.create name in + let ty_arg = newvar () in + (* type argument *) + begin_def (); + let (c_lhs, new_env, pattern_force, unpacks) = + let scope = Some (Annot.Idef sbody.pexp_loc) in + type_pattern ~lev env spat scope ty_arg in + end_def(); + assert (unpacks = []); + (* `Contaminating' unifications start here *) + List.iter (fun f -> f()) pattern_force; + begin_def (); + let body = type_implicit_arg id lev new_env sbody in + let case = {c_lhs; c_guard = None; c_rhs = body} in + let arr = Tarr_implicit id in + end_def (); (* exit rhs *) + end_def (); (* exit implicit binding *) + let typ = Tarrow (arr, ty_arg, body.exp_type, Cok) in + rue { + exp_desc = Texp_function (arr, [case], Total); + exp_loc = loc; exp_extra = []; + exp_type = instance env (newgenty typ); + exp_attributes = []; + exp_env = env; + } + (* TODO: keep attributes, call type_function directly *) | Pexp_fun (arr, None, spat, sexp) -> - type_function ?in_function loc sexp.pexp_attributes env - ty_expected arr [{pc_lhs=spat; pc_guard=None; pc_rhs=sexp}] + type_function ?in_function loc sexp.pexp_attributes env ty_expected + arr [{pc_lhs=spat; pc_guard=None; pc_rhs=sexp}] | Pexp_function caselist -> - type_function ?in_function loc sexp.pexp_attributes env - ty_expected Parr_simple caselist + type_function ?in_function + loc sexp.pexp_attributes env ty_expected Parr_simple caselist | Pexp_apply(sfunct, sargs) -> - if sargs = [] then - Syntaxerr.ill_formed_ast loc "Function application with no argument."; - begin_def (); (* one more level for non-returning functions *) - if !Clflags.principal then begin_def (); - let funct = type_exp env sfunct in - let funct = - if Typeimplicit.has_implicit funct.exp_type then - {funct with exp_type = Subst.type_expr Subst.identity funct.exp_type} - else - funct in - if !Clflags.principal then begin + if sargs = [] then + Syntaxerr.ill_formed_ast loc "Function application with no argument."; + begin_def (); (* one more level for non-returning functions *) + if !Clflags.principal then begin_def (); + let funct = type_exp env sfunct in + let funct = + if Typeimplicit.has_implicit funct.exp_type then + {funct with exp_type = Subst.type_expr Subst.identity funct.exp_type} + else + funct in + if !Clflags.principal then begin + end_def (); + generalize_structure funct.exp_type + end; + let rec lower_args env seen ty_fun = + let ty = expand_head env ty_fun in + if List.memq ty seen then () else + let env = match ty.desc with + | Tarrow (Tarr_implicit id, _, _, _) -> + Env.set_implicit_level id 0 env + | _ -> env in + match ty.desc with + | Tarrow (l, ty_arg, ty_fun, com) -> + (try unify_var env (newvar()) ty_arg with Unify _ -> assert false); + lower_args env (ty::seen) ty_fun + | _ -> () + in + let ty = instance env funct.exp_type in end_def (); - generalize_structure funct.exp_type - end; - let rec lower_args env seen ty_fun = - let ty = expand_head env ty_fun in - if List.memq ty seen then () else - let env = match ty.desc with - | Tarrow (Tarr_implicit id, _, _, _) -> - Env.set_implicit_level id 0 env - | _ -> env in - match ty.desc with - | Tarrow (l, ty_arg, ty_fun, com) -> - (try unify_var env (newvar()) ty_arg with Unify _ -> assert false); - lower_args env (ty::seen) ty_fun - | _ -> () - in - let ty = instance env funct.exp_type in - end_def (); - wrap_trace_gadt_instances env (lower_args env []) ty; - begin_def (); - let (args, ty_res) = type_application env funct sargs in - let args = List.map - (fun (arr,argo) -> match argo with - | None -> make_argument (tapp_of_tarr arr, None) - | Some arg -> arg) - args - in - end_def (); - unify_var env (newvar()) funct.exp_type; - rue { - exp_desc = Texp_apply(funct, args); - exp_loc = loc; exp_extra = []; - exp_type = ty_res; - exp_attributes = sexp.pexp_attributes; - exp_env = env; - } + wrap_trace_gadt_instances env (lower_args env []) ty; + begin_def (); + let (args, ty_res) = type_application env funct sargs in + let args = List.map + (fun (arr,argo) -> match argo with + | None -> make_argument (tapp_of_tarr arr, None) + | Some arg -> arg) + args + in + end_def (); + unify_var env (newvar()) funct.exp_type; + rue { + exp_desc = Texp_apply(funct, args); + exp_loc = loc; exp_extra = []; + exp_type = ty_res; + exp_attributes = sexp.pexp_attributes; + exp_env = env } | Pexp_match(sarg, caselist) -> begin_def (); let arg = type_exp env sarg in @@ -3171,7 +3171,7 @@ and type_argument env sarg ty_expected' ty_expected = (* ty_expected' may be generic *) let no_labels ty = let ls, tvar = list_labels env ty in - not tvar && List.for_all (function Tarr_simple -> true | _ -> false) ls + not tvar && List.for_all Btype.arrow_is_simple ls in let rec is_inferred sexp = match sexp.pexp_desc with @@ -3196,9 +3196,7 @@ and type_argument env sarg ty_expected' ty_expected = | Tarrow (Tarr_optional s,ty_arg,ty_fun,_) -> let ty = option_none (instance env ty_arg) sarg.pexp_loc in make_args ((Tapp_optional s, Some ty) :: args) ty_fun - | Tarrow (l,_,ty_res',_) - when (match l with Tarr_simple -> true | _ -> false) - || !Clflags.classic -> + | Tarrow (l,_,ty_res',_) when Btype.arrow_is_simple l || !Clflags.classic -> List.rev args, ty_fun, no_labels ty_res' | Tvar _ -> List.rev args, ty_fun, false | _ -> [], texp.exp_type, false diff --git a/typing/typecore.mli b/typing/typecore.mli index 9348e7da1d..b867cc5bbf 100644 --- a/typing/typecore.mli +++ b/typing/typecore.mli @@ -75,7 +75,6 @@ type error = | Orpat_vars of Ident.t | Expr_type_clash of (type_expr * type_expr) list | Apply_non_function of type_expr - | Apply_unexpected_implicit of type_expr | Apply_wrong_label of apply_flag * type_expr | Label_multiply_defined of string | Label_missing of Ident.t list @@ -114,6 +113,7 @@ type error = | No_value_clauses | Exception_pattern_below_toplevel + | Apply_unexpected_implicit of type_expr | No_instance_found of Typeimplicit.pending_implicit | Ambiguous_implicit of Typeimplicit.pending_implicit * Path.t * Path.t | Termination_fail of Typeimplicit.pending_implicit diff --git a/typing/typemod.ml b/typing/typemod.ml index 5e2840c6ea..df475db3f8 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -360,7 +360,8 @@ and approx_module_declaration env pmd = { Types.md_type = approx_modtype env pmd.pmd_type; md_attributes = pmd.pmd_attributes; - md_loc = pmd.pmd_loc; md_implicit = pmd.pmd_implicit; + md_loc = pmd.pmd_loc; + md_implicit = pmd.pmd_implicit; } and approx_sig env ssg = @@ -1298,8 +1299,7 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = newenv | Pstr_module {pmb_name = name; pmb_expr = smodl; pmb_attributes = attrs; pmb_loc; pmb_implicit - } - -> + } -> check_name "module" module_names name; let modl = type_module ~alias:true true funct_body @@ -1307,7 +1307,8 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = let md = { md_type = enrich_module_type anchor name.txt modl.mod_type env; md_attributes = attrs; - md_loc = pmb_loc; md_implicit = pmb_implicit; + md_loc = pmb_loc; + md_implicit = pmb_implicit; } in let (id, newenv) = Env.enter_module_declaration name.txt md env in @@ -1325,7 +1326,8 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = [Sig_module(id, {md_type = modl.mod_type; md_attributes = attrs; - md_loc = pmb_loc; md_implicit = pmb_implicit; + md_loc = pmb_loc; + md_implicit = pmb_implicit; }, Trec_not)], newenv | Pstr_recmodule sbind -> @@ -1350,7 +1352,8 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = let (decls, newenv) = transl_recmodule_modtypes loc env (List.map (fun (name, imp, smty, smodl, attrs, loc) -> - {pmd_name=name; pmd_type=smty; pmd_implicit = imp; + {pmd_name=name; pmd_type=smty; + pmd_implicit = imp; pmd_attributes=attrs; pmd_loc=loc}) sbind ) in let bindings1 = @@ -1370,7 +1373,6 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = (fun env md -> let mdecl = { - Types. md_type = md.md_type.mty_type; md_attributes = md.md_attributes; md_loc = md.md_loc; @@ -1584,10 +1586,8 @@ let type_package env m p nl tl = match modl.mod_desc with Tmod_ident (mp,_) -> (mp, env) | _ -> - let (id, new_env) = - Env.enter_module ~arg:true ~implicit_:Nonimplicit - "%M" modl.mod_type env - in + let (id, new_env) = Env.enter_module ~arg:true + ~implicit_:Nonimplicit "%M" modl.mod_type env in (Pident id, new_env) in let rec mkpath mp = function From 06aeb22de494493918c6441d0d6ebd0fa4134516 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bour?= <frederic.bour@lakaban.net> Date: Wed, 27 Aug 2014 13:28:48 +0200 Subject: [PATCH 420/494] Typecore.type_argument: apply omitted optional argument was done in wrong order --- typing/typecore.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typing/typecore.ml b/typing/typecore.ml index 6eec6ccd7c..272f2c1aa2 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -3229,7 +3229,7 @@ and type_argument env sarg ty_expected' ty_expected = let eta_pat, eta_var = var_pair "eta" ty_arg in let func texp = let e = - let args = (Tapp_simple, Some eta_var) :: args in + let args = args @ [Tapp_simple, Some eta_var] in let args = List.map make_argument args in {texp with exp_type = ty_res; exp_desc = Texp_apply (texp,args)} in From 19d75a2056fc93d7e704c576a11267cfcc0ee21a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bour?= <frederic.bour@lakaban.net> Date: Thu, 28 Aug 2014 11:10:57 +0200 Subject: [PATCH 421/494] Ctype.eq_type: fix case with two paths accepting equalities 1. Base-kinded constructors have priority. 2. If constructors can't be distinguished by case, use order on Path --- typing/ctype.ml | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/typing/ctype.ml b/typing/ctype.ml index ac018a49a1..abf9420e1e 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -3372,13 +3372,20 @@ let rec eqtype rename type_pairs subst env t1 t2 = | (Tunivar _, Tunivar _) -> unify_univar t1' t2' !univar_pairs - | Tconstr (p1, _, _), Tconstr (p2, _, _) + | Tconstr (p1, tl1, _), Tconstr (p2, tl2, _) when Tbl.mem (Path.head p1) !equality_equations && Tbl.mem (Path.head p2) !equality_equations -> - if p1 < p2 then - eqtype_modulo_equation rename type_pairs subst env t1' t2' - else - eqtype_modulo_equation rename type_pairs subst env t1' t2' + let (tl, tr) = + (* Base-kinded have priorioties *) + if (tl1 = [] && tl2 <> []) then + (t1', t2') + else if (tl2 = [] && tl1 <> []) then + (t2', t1') + else if p1 < p2 then + (t1', t2') + else + (t2', t1') in + eqtype_modulo_equation rename type_pairs subst env tl tr | Tconstr (p, _, _), te when Tbl.mem (Path.head p) !equality_equations -> From 57a1543616cec6e511088298d8229debe8fe0551 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bour?= <frederic.bour@lakaban.net> Date: Sat, 30 Aug 2014 12:35:12 +0200 Subject: [PATCH 422/494] Implicitsearch: find ambiguities up-to module aliases --- typing/implicitsearch.ml | 54 +++++++++++++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 12 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 0836a3f04b..ccde8a2068 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -1025,6 +1025,30 @@ module Solution = struct let get {result} = Search.get result end +let rec canonical_path env path = + try + let md = Env.find_module path env in + match md.Types.md_type with + | Mty_alias path -> canonical_path env path + | _ -> match path with + | Path.Pident _ -> path + | Path.Pdot (p1,s,i) -> + let p1' = canonical_path env p1 in + if p1 == p1' then + path + else + Path.Pdot (p1', s, i) + | Path.Papply (p1, p2) -> + let p1' = canonical_path env p1 + and p2' = canonical_path env p2 in + if p1' == p1 && p2 == p2' then + path + else + Path.Papply (p1', p2') + with Not_found -> + (*?!*) + path + let find_pending_instance inst = let snapshot = Btype.snapshot () in let vars, target = target_of_pending inst in @@ -1051,19 +1075,25 @@ let find_pending_instance inst = let query = Search.start env (List.map snd vars) target in try let solution = Solution.search query in - let alternative = - try Some (Solution.search_next solution) - with _ -> None + let path = Solution.get solution in + let reference = canonical_path env path in + let rec check_alternatives solution = + match (try Some (Solution.search_next solution) + with _ -> None) + with + | Some alternative -> + let path' = Solution.get alternative in + let reference' = canonical_path env (Solution.get alternative) in + if reference = reference' then + check_alternatives alternative + else + raise Typecore.(Error (loc, env, Ambiguous_implicit (inst,path,path'))) + | None -> () in - match alternative with - | None -> - Btype.backtrack snapshot; - Link.to_path inst (Solution.get solution); - true - | Some alternative -> - let p1 = Solution.get solution in - let p2 = Solution.get alternative in - raise Typecore.(Error (loc, env, Ambiguous_implicit (inst,p1,p2))) + check_alternatives solution; + Btype.backtrack snapshot; + Link.to_path inst path; + true with | Termination.Terminate eqns -> printf "%a\n%!" (Termination.explain false) eqns; From d64fda611c0ffa8feaf1fd7221328e5433f3cbc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bour?= <frederic.bour@lakaban.net> Date: Sat, 30 Aug 2014 22:09:11 +0200 Subject: [PATCH 423/494] Updated .depend --- .depend | 169 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 102 insertions(+), 67 deletions(-) diff --git a/.depend b/.depend index 7d1946baa6..34dbe49304 100644 --- a/.depend +++ b/.depend @@ -98,12 +98,14 @@ parsing/printast.cmx : parsing/parsetree.cmi utils/misc.cmx \ parsing/syntaxerr.cmo : parsing/location.cmi parsing/syntaxerr.cmi parsing/syntaxerr.cmx : parsing/location.cmx parsing/syntaxerr.cmi typing/annot.cmi : parsing/location.cmi -typing/btype.cmi : typing/types.cmi typing/path.cmi parsing/asttypes.cmi +typing/btype.cmi : typing/types.cmi typing/path.cmi parsing/parsetree.cmi \ + parsing/asttypes.cmi typing/cmi_format.cmi : typing/types.cmi typing/cmt_format.cmi : typing/types.cmi typing/typedtree.cmi \ parsing/location.cmi typing/env.cmi typing/cmi_format.cmi -typing/ctype.cmi : typing/types.cmi typing/path.cmi parsing/longident.cmi \ - typing/ident.cmi typing/env.cmi parsing/asttypes.cmi +typing/ctype.cmi : typing/types.cmi utils/tbl.cmi typing/path.cmi \ + parsing/longident.cmi parsing/location.cmi typing/ident.cmi \ + typing/env.cmi parsing/asttypes.cmi typing/datarepr.cmi : typing/types.cmi typing/path.cmi typing/ident.cmi \ parsing/asttypes.cmi typing/env.cmi : utils/warnings.cmi typing/types.cmi typing/subst.cmi \ @@ -116,7 +118,7 @@ typing/includecore.cmi : typing/types.cmi typing/typedtree.cmi \ typing/ident.cmi typing/env.cmi typing/includemod.cmi : typing/types.cmi typing/typedtree.cmi \ typing/path.cmi parsing/location.cmi typing/includecore.cmi \ - typing/ident.cmi typing/env.cmi typing/ctype.cmi + typing/ident.cmi typing/env.cmi typing/ctype.cmi parsing/asttypes.cmi typing/mtype.cmi : typing/types.cmi typing/path.cmi typing/ident.cmi \ typing/env.cmi typing/oprint.cmi : typing/outcometree.cmi @@ -124,12 +126,12 @@ typing/outcometree.cmi : parsing/asttypes.cmi typing/parmatch.cmi : typing/types.cmi typing/typedtree.cmi \ parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ typing/env.cmi parsing/asttypes.cmi -typing/path.cmi : typing/ident.cmi +typing/path.cmi : parsing/longident.cmi typing/ident.cmi typing/predef.cmi : typing/types.cmi typing/path.cmi typing/ident.cmi typing/primitive.cmi : typing/printtyp.cmi : typing/types.cmi typing/path.cmi \ typing/outcometree.cmi parsing/longident.cmi typing/ident.cmi \ - typing/env.cmi + typing/env.cmi parsing/asttypes.cmi typing/printtyped.cmi : typing/typedtree.cmi typing/stypes.cmi : typing/typedtree.cmi parsing/location.cmi \ typing/annot.cmi @@ -137,14 +139,16 @@ typing/subst.cmi : typing/types.cmi typing/path.cmi typing/ident.cmi typing/typeclass.cmi : typing/types.cmi typing/typedtree.cmi \ parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ typing/ident.cmi typing/env.cmi typing/ctype.cmi parsing/asttypes.cmi -typing/typecore.cmi : typing/types.cmi typing/typedtree.cmi typing/path.cmi \ - parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ - typing/ident.cmi typing/env.cmi parsing/asttypes.cmi typing/annot.cmi \ - typing/typeimplicit.cmi +typing/typecore.cmi : typing/types.cmi typing/typeimplicit.cmo \ + typing/typedtree.cmi typing/path.cmi parsing/parsetree.cmi \ + parsing/longident.cmi parsing/location.cmi typing/ident.cmi \ + typing/env.cmi parsing/asttypes.cmi typing/annot.cmi typing/typedecl.cmi : typing/types.cmi typing/typedtree.cmi typing/path.cmi \ parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ typing/includecore.cmi typing/ident.cmi typing/env.cmi \ parsing/asttypes.cmi +typing/typedtreeIter.cmi : typing/typedtree.cmi parsing/asttypes.cmi +typing/typedtreeMap.cmi : typing/typedtree.cmi typing/typedtree.cmi : typing/types.cmi typing/primitive.cmi typing/path.cmi \ parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ typing/ident.cmi typing/env.cmi parsing/asttypes.cmi @@ -160,10 +164,10 @@ typing/types.cmi : typing/primitive.cmi typing/path.cmi \ typing/typetexp.cmi : typing/types.cmi typing/typedtree.cmi typing/path.cmi \ parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ typing/env.cmi parsing/asttypes.cmi parsing/ast_mapper.cmi -typing/btype.cmo : typing/types.cmi typing/path.cmi utils/misc.cmi \ - typing/ident.cmi typing/btype.cmi -typing/btype.cmx : typing/types.cmx typing/path.cmx utils/misc.cmx \ - typing/ident.cmx typing/btype.cmi +typing/btype.cmo : typing/types.cmi typing/path.cmi parsing/parsetree.cmi \ + utils/misc.cmi typing/ident.cmi utils/clflags.cmi typing/btype.cmi +typing/btype.cmx : typing/types.cmx typing/path.cmx parsing/parsetree.cmi \ + utils/misc.cmx typing/ident.cmx utils/clflags.cmx typing/btype.cmi typing/cmi_format.cmo : typing/types.cmi parsing/location.cmi \ utils/config.cmi typing/cmi_format.cmi typing/cmi_format.cmx : typing/types.cmx parsing/location.cmx \ @@ -176,12 +180,12 @@ typing/cmt_format.cmx : typing/types.cmx typing/typedtreeMap.cmx \ typing/typedtree.cmx utils/misc.cmx parsing/location.cmx \ parsing/lexer.cmx typing/env.cmx utils/config.cmx typing/cmi_format.cmx \ utils/clflags.cmx typing/cmt_format.cmi -typing/ctype.cmo : typing/types.cmi typing/subst.cmi typing/path.cmi \ - utils/misc.cmi parsing/longident.cmi parsing/location.cmi \ +typing/ctype.cmo : typing/types.cmi utils/tbl.cmi typing/subst.cmi \ + typing/path.cmi utils/misc.cmi parsing/longident.cmi parsing/location.cmi \ typing/ident.cmi typing/env.cmi utils/clflags.cmi typing/btype.cmi \ parsing/asttypes.cmi typing/ctype.cmi -typing/ctype.cmx : typing/types.cmx typing/subst.cmx typing/path.cmx \ - utils/misc.cmx parsing/longident.cmx parsing/location.cmx \ +typing/ctype.cmx : typing/types.cmx utils/tbl.cmx typing/subst.cmx \ + typing/path.cmx utils/misc.cmx parsing/longident.cmx parsing/location.cmx \ typing/ident.cmx typing/env.cmx utils/clflags.cmx typing/btype.cmx \ parsing/asttypes.cmi typing/ctype.cmi typing/datarepr.cmo : typing/types.cmi typing/path.cmi parsing/location.cmi \ @@ -210,6 +214,16 @@ typing/envaux.cmx : typing/types.cmx typing/subst.cmx typing/printtyp.cmx \ parsing/asttypes.cmi typing/envaux.cmi typing/ident.cmo : typing/ident.cmi typing/ident.cmx : typing/ident.cmi +typing/implicitsearch.cmo : typing/types.cmi typing/typeimplicit.cmo \ + typing/typedtree.cmi typing/typecore.cmi utils/tbl.cmi typing/subst.cmi \ + typing/printtyp.cmi typing/path.cmi parsing/longident.cmi \ + parsing/location.cmi typing/includemod.cmi typing/ident.cmi \ + typing/env.cmi typing/ctype.cmi typing/btype.cmi parsing/asttypes.cmi +typing/implicitsearch.cmx : typing/types.cmx typing/typeimplicit.cmx \ + typing/typedtree.cmx typing/typecore.cmx utils/tbl.cmx typing/subst.cmx \ + typing/printtyp.cmx typing/path.cmx parsing/longident.cmx \ + parsing/location.cmx typing/includemod.cmx typing/ident.cmx \ + typing/env.cmx typing/ctype.cmx typing/btype.cmx parsing/asttypes.cmi typing/includeclass.cmo : typing/types.cmi typing/printtyp.cmi \ typing/ctype.cmi typing/includeclass.cmi typing/includeclass.cmx : typing/types.cmx typing/printtyp.cmx \ @@ -227,13 +241,13 @@ typing/includemod.cmo : typing/types.cmi typing/typedtree.cmi utils/tbl.cmi \ typing/mtype.cmi utils/misc.cmi parsing/location.cmi \ typing/includecore.cmi typing/includeclass.cmi typing/ident.cmi \ typing/env.cmi typing/ctype.cmi typing/cmt_format.cmi utils/clflags.cmi \ - typing/includemod.cmi + parsing/asttypes.cmi typing/includemod.cmi typing/includemod.cmx : typing/types.cmx typing/typedtree.cmx utils/tbl.cmx \ typing/subst.cmx typing/printtyp.cmx typing/primitive.cmx typing/path.cmx \ typing/mtype.cmx utils/misc.cmx parsing/location.cmx \ typing/includecore.cmx typing/includeclass.cmx typing/ident.cmx \ typing/env.cmx typing/ctype.cmx typing/cmt_format.cmx utils/clflags.cmx \ - typing/includemod.cmi + parsing/asttypes.cmi typing/includemod.cmi typing/mtype.cmo : typing/types.cmi typing/subst.cmi typing/path.cmi \ utils/misc.cmi parsing/location.cmi typing/ident.cmi typing/env.cmi \ typing/ctype.cmi utils/clflags.cmi typing/btype.cmi parsing/asttypes.cmi \ @@ -258,14 +272,22 @@ typing/parmatch.cmx : utils/warnings.cmx typing/types.cmx \ parsing/location.cmx typing/ident.cmx typing/env.cmx typing/ctype.cmx \ typing/btype.cmx parsing/asttypes.cmi parsing/ast_helper.cmx \ typing/parmatch.cmi -typing/path.cmo : typing/ident.cmi typing/path.cmi -typing/path.cmx : typing/ident.cmx typing/path.cmi +typing/path.cmo : parsing/longident.cmi typing/ident.cmi typing/path.cmi +typing/path.cmx : parsing/longident.cmx typing/ident.cmx typing/path.cmi typing/predef.cmo : typing/types.cmi typing/path.cmi parsing/location.cmi \ typing/ident.cmi typing/btype.cmi parsing/asttypes.cmi typing/predef.cmi typing/predef.cmx : typing/types.cmx typing/path.cmx parsing/location.cmx \ typing/ident.cmx typing/btype.cmx parsing/asttypes.cmi typing/predef.cmi typing/primitive.cmo : utils/misc.cmi typing/primitive.cmi typing/primitive.cmx : utils/misc.cmx typing/primitive.cmi +typing/printtyped.cmo : typing/types.cmi typing/typedtree.cmi \ + parsing/printast.cmi typing/path.cmi utils/misc.cmi parsing/longident.cmi \ + parsing/location.cmi typing/ident.cmi parsing/asttypes.cmi \ + typing/printtyped.cmi +typing/printtyped.cmx : typing/types.cmx typing/typedtree.cmx \ + parsing/printast.cmx typing/path.cmx utils/misc.cmx parsing/longident.cmx \ + parsing/location.cmx typing/ident.cmx parsing/asttypes.cmi \ + typing/printtyped.cmi typing/printtyp.cmo : typing/types.cmi typing/primitive.cmi \ typing/predef.cmi typing/path.cmi typing/outcometree.cmi \ typing/oprint.cmi utils/misc.cmi parsing/longident.cmi \ @@ -313,24 +335,25 @@ typing/typeclass.cmx : utils/warnings.cmx typing/typetexp.cmx \ typing/btype.cmx parsing/asttypes.cmi parsing/ast_helper.cmx \ typing/typeclass.cmi typing/typecore.cmo : utils/warnings.cmi typing/typetexp.cmi \ - typing/types.cmi typing/typedtree.cmi typing/subst.cmi typing/stypes.cmi \ + typing/types.cmi typing/typeimplicit.cmo typing/typedtree.cmi \ + parsing/syntaxerr.cmi typing/subst.cmi typing/stypes.cmi \ typing/printtyp.cmi typing/primitive.cmi typing/predef.cmi \ typing/path.cmi parsing/parsetree.cmi typing/parmatch.cmi \ typing/oprint.cmi utils/misc.cmi parsing/longident.cmi \ parsing/location.cmi typing/ident.cmi typing/env.cmi typing/ctype.cmi \ typing/cmt_format.cmi utils/clflags.cmi typing/btype.cmi \ parsing/asttypes.cmi parsing/ast_helper.cmi typing/annot.cmi \ - typing/typecore.cmi \ - typing/typeimplicit.cmi + typing/typecore.cmi typing/typecore.cmx : utils/warnings.cmx typing/typetexp.cmx \ - typing/types.cmx typing/typedtree.cmx parsing/syntaxerr.cmx \ - typing/subst.cmx typing/stypes.cmx typing/printtyp.cmx \ - typing/primitive.cmx typing/predef.cmx typing/path.cmx \ - parsing/parsetree.cmi typing/parmatch.cmx typing/oprint.cmx \ - utils/misc.cmx parsing/longident.cmx parsing/location.cmx \ - typing/ident.cmx typing/env.cmx typing/ctype.cmx typing/cmt_format.cmx \ - utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi \ - parsing/ast_helper.cmx typing/annot.cmi typing/typecore.cmi + typing/types.cmx typing/typeimplicit.cmx typing/typedtree.cmx \ + parsing/syntaxerr.cmx typing/subst.cmx typing/stypes.cmx \ + typing/printtyp.cmx typing/primitive.cmx typing/predef.cmx \ + typing/path.cmx parsing/parsetree.cmi typing/parmatch.cmx \ + typing/oprint.cmx utils/misc.cmx parsing/longident.cmx \ + parsing/location.cmx typing/ident.cmx typing/env.cmx typing/ctype.cmx \ + typing/cmt_format.cmx utils/clflags.cmx typing/btype.cmx \ + parsing/asttypes.cmi parsing/ast_helper.cmx typing/annot.cmi \ + typing/typecore.cmi typing/typedecl.cmo : utils/warnings.cmi typing/typetexp.cmi \ typing/types.cmi typing/typedtree.cmi parsing/syntaxerr.cmi \ typing/subst.cmi typing/printtyp.cmi typing/primitive.cmi \ @@ -363,24 +386,34 @@ typing/typedtreeMap.cmo : typing/typedtree.cmi utils/misc.cmi \ typing/typedtreeMap.cmi typing/typedtreeMap.cmx : typing/typedtree.cmx utils/misc.cmx \ typing/typedtreeMap.cmi +typing/typeimplicit.cmo : typing/types.cmi typing/typedtree.cmi \ + typing/subst.cmi typing/path.cmi parsing/longident.cmi \ + parsing/location.cmi typing/ident.cmi typing/env.cmi typing/ctype.cmi \ + typing/btype.cmi +typing/typeimplicit.cmx : typing/types.cmx typing/typedtree.cmx \ + typing/subst.cmx typing/path.cmx parsing/longident.cmx \ + parsing/location.cmx typing/ident.cmx typing/env.cmx typing/ctype.cmx \ + typing/btype.cmx typing/typemod.cmo : utils/warnings.cmi typing/typetexp.cmi typing/types.cmi \ - typing/typedtree.cmi typing/typedecl.cmi typing/typecore.cmi \ - typing/typeclass.cmi typing/subst.cmi typing/stypes.cmi \ - typing/printtyp.cmi typing/path.cmi parsing/parsetree.cmi \ - typing/mtype.cmi utils/misc.cmi parsing/longident.cmi \ - parsing/location.cmi typing/includemod.cmi typing/ident.cmi \ - typing/env.cmi typing/ctype.cmi utils/config.cmi typing/cmt_format.cmi \ - utils/clflags.cmi typing/btype.cmi parsing/asttypes.cmi \ - parsing/ast_mapper.cmi typing/annot.cmi typing/typemod.cmi + typing/typeimplicit.cmo typing/typedtree.cmi typing/typedecl.cmi \ + typing/typecore.cmi typing/typeclass.cmi typing/subst.cmi \ + typing/stypes.cmi typing/printtyp.cmi typing/path.cmi \ + parsing/parsetree.cmi typing/mtype.cmi utils/misc.cmi \ + parsing/longident.cmi parsing/location.cmi typing/includemod.cmi \ + typing/ident.cmi typing/env.cmi typing/ctype.cmi utils/config.cmi \ + typing/cmt_format.cmi utils/clflags.cmi typing/btype.cmi \ + parsing/asttypes.cmi parsing/ast_mapper.cmi typing/annot.cmi \ + typing/typemod.cmi typing/typemod.cmx : utils/warnings.cmx typing/typetexp.cmx typing/types.cmx \ - typing/typedtree.cmx typing/typedecl.cmx typing/typecore.cmx \ - typing/typeclass.cmx typing/subst.cmx typing/stypes.cmx \ - typing/printtyp.cmx typing/path.cmx parsing/parsetree.cmi \ - typing/mtype.cmx utils/misc.cmx parsing/longident.cmx \ - parsing/location.cmx typing/includemod.cmx typing/ident.cmx \ - typing/env.cmx typing/ctype.cmx utils/config.cmx typing/cmt_format.cmx \ - utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi \ - parsing/ast_mapper.cmx typing/annot.cmi typing/typemod.cmi + typing/typeimplicit.cmx typing/typedtree.cmx typing/typedecl.cmx \ + typing/typecore.cmx typing/typeclass.cmx typing/subst.cmx \ + typing/stypes.cmx typing/printtyp.cmx typing/path.cmx \ + parsing/parsetree.cmi typing/mtype.cmx utils/misc.cmx \ + parsing/longident.cmx parsing/location.cmx typing/includemod.cmx \ + typing/ident.cmx typing/env.cmx typing/ctype.cmx utils/config.cmx \ + typing/cmt_format.cmx utils/clflags.cmx typing/btype.cmx \ + parsing/asttypes.cmi parsing/ast_mapper.cmx typing/annot.cmi \ + typing/typemod.cmi typing/types.cmo : typing/primitive.cmi typing/path.cmi \ parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ typing/ident.cmi parsing/asttypes.cmi typing/types.cmi @@ -390,15 +423,17 @@ typing/types.cmx : typing/primitive.cmx typing/path.cmx \ typing/typetexp.cmo : utils/warnings.cmi typing/types.cmi \ typing/typedtree.cmi utils/tbl.cmi parsing/syntaxerr.cmi \ typing/printtyp.cmi typing/path.cmi parsing/parsetree.cmi utils/misc.cmi \ - parsing/longident.cmi parsing/location.cmi typing/env.cmi \ - typing/ctype.cmi utils/clflags.cmi typing/btype.cmi parsing/asttypes.cmi \ - parsing/ast_mapper.cmi parsing/ast_helper.cmi typing/typetexp.cmi + parsing/longident.cmi parsing/location.cmi typing/ident.cmi \ + typing/env.cmi typing/ctype.cmi utils/clflags.cmi typing/btype.cmi \ + parsing/asttypes.cmi parsing/ast_mapper.cmi parsing/ast_helper.cmi \ + typing/typetexp.cmi typing/typetexp.cmx : utils/warnings.cmx typing/types.cmx \ typing/typedtree.cmx utils/tbl.cmx parsing/syntaxerr.cmx \ typing/printtyp.cmx typing/path.cmx parsing/parsetree.cmi utils/misc.cmx \ - parsing/longident.cmx parsing/location.cmx typing/env.cmx \ - typing/ctype.cmx utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi \ - parsing/ast_mapper.cmx parsing/ast_helper.cmx typing/typetexp.cmi + parsing/longident.cmx parsing/location.cmx typing/ident.cmx \ + typing/env.cmx typing/ctype.cmx utils/clflags.cmx typing/btype.cmx \ + parsing/asttypes.cmi parsing/ast_mapper.cmx parsing/ast_helper.cmx \ + typing/typetexp.cmi bytecomp/bytegen.cmi : bytecomp/lambda.cmi bytecomp/instruct.cmi bytecomp/bytelibrarian.cmi : bytecomp/bytelink.cmi : bytecomp/symtable.cmi bytecomp/cmo_format.cmi @@ -1049,11 +1084,11 @@ toplevel/topdirs.cmx : utils/warnings.cmx typing/typetexp.cmx \ utils/config.cmx bytecomp/cmo_format.cmi utils/clflags.cmx \ typing/btype.cmx parsing/asttypes.cmi toplevel/topdirs.cmi toplevel/toploop.cmo : utils/warnings.cmi typing/types.cmi \ - typing/typemod.cmi typing/typedtree.cmi typing/typecore.cmi \ - bytecomp/translmod.cmi bytecomp/symtable.cmi bytecomp/simplif.cmi \ - typing/printtyped.cmi typing/printtyp.cmi bytecomp/printlambda.cmi \ - bytecomp/printinstr.cmi parsing/printast.cmi typing/predef.cmi \ - parsing/pprintast.cmi driver/pparse.cmi typing/path.cmi \ + typing/typemod.cmi typing/typeimplicit.cmo typing/typedtree.cmi \ + typing/typecore.cmi bytecomp/translmod.cmi bytecomp/symtable.cmi \ + bytecomp/simplif.cmi typing/printtyped.cmi typing/printtyp.cmi \ + bytecomp/printlambda.cmi bytecomp/printinstr.cmi parsing/printast.cmi \ + typing/predef.cmi parsing/pprintast.cmi driver/pparse.cmi typing/path.cmi \ parsing/parsetree.cmi parsing/parse.cmi typing/outcometree.cmi \ typing/oprint.cmi utils/misc.cmi bytecomp/meta.cmi parsing/longident.cmi \ parsing/location.cmi parsing/lexer.cmi typing/includemod.cmi \ @@ -1063,11 +1098,11 @@ toplevel/toploop.cmo : utils/warnings.cmi typing/types.cmi \ bytecomp/bytegen.cmi typing/btype.cmi parsing/ast_helper.cmi \ toplevel/toploop.cmi toplevel/toploop.cmx : utils/warnings.cmx typing/types.cmx \ - typing/typemod.cmx typing/typedtree.cmx typing/typecore.cmx \ - bytecomp/translmod.cmx bytecomp/symtable.cmx bytecomp/simplif.cmx \ - typing/printtyped.cmx typing/printtyp.cmx bytecomp/printlambda.cmx \ - bytecomp/printinstr.cmx parsing/printast.cmx typing/predef.cmx \ - parsing/pprintast.cmx driver/pparse.cmx typing/path.cmx \ + typing/typemod.cmx typing/typeimplicit.cmx typing/typedtree.cmx \ + typing/typecore.cmx bytecomp/translmod.cmx bytecomp/symtable.cmx \ + bytecomp/simplif.cmx typing/printtyped.cmx typing/printtyp.cmx \ + bytecomp/printlambda.cmx bytecomp/printinstr.cmx parsing/printast.cmx \ + typing/predef.cmx parsing/pprintast.cmx driver/pparse.cmx typing/path.cmx \ parsing/parsetree.cmi parsing/parse.cmx typing/outcometree.cmi \ typing/oprint.cmx utils/misc.cmx bytecomp/meta.cmx parsing/longident.cmx \ parsing/location.cmx parsing/lexer.cmx typing/includemod.cmx \ @@ -1088,9 +1123,9 @@ toplevel/topstart.cmo : toplevel/topmain.cmi toplevel/topstart.cmx : toplevel/topmain.cmx toplevel/trace.cmo : typing/types.cmi toplevel/toploop.cmi \ typing/printtyp.cmi typing/predef.cmi typing/path.cmi utils/misc.cmi \ - bytecomp/meta.cmi parsing/longident.cmi typing/ctype.cmi \ + bytecomp/meta.cmi parsing/longident.cmi typing/ident.cmi typing/ctype.cmi \ toplevel/trace.cmi toplevel/trace.cmx : typing/types.cmx toplevel/toploop.cmx \ typing/printtyp.cmx typing/predef.cmx typing/path.cmx utils/misc.cmx \ - bytecomp/meta.cmx parsing/longident.cmx typing/ctype.cmx \ + bytecomp/meta.cmx parsing/longident.cmx typing/ident.cmx typing/ctype.cmx \ toplevel/trace.cmi From 2b820f6cc07655337e8e6a4b570d38457cd4f878 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bour?= <frederic.bour@lakaban.net> Date: Sat, 30 Aug 2014 22:27:45 +0200 Subject: [PATCH 424/494] Bootstrap --- typing/includemod.ml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/typing/includemod.ml b/typing/includemod.ml index 8c7816d0f3..246475a2ad 100644 --- a/typing/includemod.ml +++ b/typing/includemod.ml @@ -399,7 +399,7 @@ and signature_components old_env env cxt subst paired = implicit_flags env cxt id1 mty1.md_implicit mty1.md_loc mty2.md_implicit mty2.md_loc; - (pos, cc) :: signature_components env cxt subst rem + (pos, cc) :: comps_rec rem | (Sig_modtype(id1, info1), Sig_modtype(id2, info2), pos) :: rem -> modtype_infos env cxt subst id1 info1 info2; comps_rec rem @@ -409,7 +409,7 @@ and signature_components old_env env cxt subst paired = | (Sig_class_type(id1, info1, _), Sig_class_type(id2, info2, _), pos) :: rem -> class_type_declarations ~old_env env cxt subst id1 info1 info2; - signature_components env cxt subst rem + comps_rec rem | _ -> assert false From 2d1d889bae079fe0485c41488644e9bb841e725b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bour?= <frederic.bour@lakaban.net> Date: Sun, 31 Aug 2014 19:56:27 +0200 Subject: [PATCH 425/494] Typeimplicit: copy level before recursing into subtypes --- typing/typeimplicit.ml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index 17e1e2e5b9..fe3304cb74 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -76,9 +76,8 @@ let unlink env unlink_on = implicit *) match ty.desc with | Tconstr (path,args,_) -> - (* First recurse in sub expressions *) - type_iterators.it_type_expr it ty; let ident = Path.head path in + (* First eventually copy type and levels *) begin match unlink_on ident with | None -> () (* Identifier is shadowed, skip unlinking *) @@ -94,12 +93,15 @@ let unlink env unlink_on = ty'.desc <- desc; ty'.level <- lv; add_constraint register path ty' ty - end + end; + (* Then recurse in sub types, as level are affected by marking *) + type_iterators.it_type_expr it ty | Tarrow (Tarr_implicit id, lhs, rhs, _) -> - it_type_expr shadow_tbl it lhs; + mark_type_node ty; + it.it_type_expr it lhs; let shadow_tbl = Ident.add id () shadow_tbl in let it = {it with it_type_expr = it_type_expr shadow_tbl} in - it_type_expr shadow_tbl it rhs + it.it_type_expr it rhs | _ -> type_iterators.it_type_expr it ty in From 95fefc2165f921097989d78a123f31317a1072ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bour?= <frederic.bour@lakaban.net> Date: Thu, 4 Sep 2014 10:49:53 +0400 Subject: [PATCH 426/494] Fix #3: bind implicit args while processing type declarations --- typing/ctype.ml | 5 +++++ typing/ctype.mli | 3 +++ typing/typedecl.ml | 20 ++++++++++++++------ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/typing/ctype.ml b/typing/ctype.ml index abf9420e1e..3e1a8c5614 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -2054,6 +2054,11 @@ let modtype_of_tpackage env ty = !modtype_of_package env Location.none p1 nl1 tl1 | _ -> assert false +let bind_implicit_arg id ty env = + let mty = modtype_of_tpackage env ty in + let env = Env.add_module id mty env in + Env.set_implicit_level id 0 env + (* mcomp type_pairs subst env t1 t2 does not raise an exception if it is possible that t1 and t2 are actually equal, assuming the types in type_pairs are equal and diff --git a/typing/ctype.mli b/typing/ctype.mli index 637cbb765b..555d7e1da8 100644 --- a/typing/ctype.mli +++ b/typing/ctype.mli @@ -295,6 +295,9 @@ val package_subtype : val modtype_of_package : (Env.t -> Location.t -> Path.t -> Longident.t list -> type_expr list -> module_type) ref +val modtype_of_tpackage : Env.t -> type_expr -> module_type +val bind_implicit_arg : Ident.t -> type_expr -> Env.t -> Env.t + val new_declaration : (int * int) option -> type_expr option -> type_declaration diff --git a/typing/typedecl.ml b/typing/typedecl.ml index 2fdda9dc28..06e95960a9 100644 --- a/typing/typedecl.ml +++ b/typing/typedecl.ml @@ -366,6 +366,10 @@ let rec check_constraints_rec env loc visited ty = | Tpoly (ty, tl) -> let _, ty = Ctype.instance_poly false tl ty in check_constraints_rec env loc visited ty + | Tarrow (Tarr_implicit id, lhs, rhs, _) -> + check_constraints_rec env loc visited lhs; + check_constraints_rec (Ctype.bind_implicit_arg id lhs env) + loc visited rhs | _ -> Btype.iter_type_expr (check_constraints_rec env loc visited) ty end @@ -536,7 +540,7 @@ let check_recursion env loc path decl to_check = let visited = ref [] in - let rec check_regular cpath args prev_exp ty = + let rec check_regular env cpath args prev_exp ty = let ty = Ctype.repr ty in if not (List.memq ty !visited) then begin visited := ty :: !visited; @@ -565,15 +569,19 @@ let check_recursion env loc path decl to_check = raise (Error(loc, Constraint_failed (ty, Ctype.newconstr path' params0))); end; - check_regular path' args (path' :: prev_exp) body + check_regular env path' args (path' :: prev_exp) body with Not_found -> () end; - List.iter (check_regular cpath args prev_exp) args' + List.iter (check_regular env cpath args prev_exp) args' | Tpoly (ty, tl) -> let (_, ty) = Ctype.instance_poly ~keep_names:true false tl ty in - check_regular cpath args prev_exp ty + check_regular env cpath args prev_exp ty + | Tarrow (Tarr_implicit id, lhs, rhs, _) -> + check_regular env cpath args prev_exp lhs; + check_regular (Ctype.bind_implicit_arg id lhs env) + cpath args prev_exp rhs | _ -> - Btype.iter_type_expr (check_regular cpath args prev_exp) ty + Btype.iter_type_expr (check_regular env cpath args prev_exp) ty end in Misc.may @@ -581,7 +589,7 @@ let check_recursion env loc path decl to_check = let (args, body) = Ctype.instance_parameterized_type ~keep_names:true decl.type_params body in - check_regular path args [] body) + check_regular env path args [] body) decl.type_manifest let check_abbrev_recursion env id_loc_list to_check tdecl = From b2dab63d44f555e1b945c6a20b87712dea04608e Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Thu, 18 Sep 2014 05:39:50 +0200 Subject: [PATCH 427/494] Fix -dsource output (#7) --- parsing/pprintast.ml | 27 +++++++++++++++++++-------- parsing/pprintast.mli | 2 ++ 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index 99320d6ac9..8a2d489c39 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -134,13 +134,16 @@ class printer ()= object(self:'self) val pipe = false val semi = false val ifthenelse = false + val in_implicit = false method under_pipe = {<pipe=true>} method under_semi = {<semi=true>} method under_ifthenelse = {<ifthenelse=true>} + method under_implicit = {<in_implicit=true>} method reset_semi = {<semi=false>} method reset_ifthenelse = {<ifthenelse=false>} method reset_pipe = {<pipe=false>} - method reset = {<pipe=false;semi=false;ifthenelse=false>} + method reset_implicit = {<in_implicit=false>} + method reset = {<pipe=false;semi=false;ifthenelse=false;in_implicit=false>} method list : 'a . ?sep:space_formatter -> ?first:space_formatter -> ?last:space_formatter -> (Format.formatter -> 'a -> unit) -> Format.formatter -> 'a list -> unit @@ -240,7 +243,7 @@ class printer ()= object(self:'self) | Parr_labelled s -> pp f "%s:%a" s self#core_type1 c | Parr_implicit s -> - pp f "(implicit %s : %a)" s self#core_type1 c + pp f "(implicit %s : %a)" s self#under_implicit#core_type1 c method core_type f x = if x.ptyp_attributes <> [] then begin @@ -329,10 +332,14 @@ class printer ()= object(self:'self) let aux f (s, ct) = pp f "type %a@ =@ %a" self#longident_loc s self#core_type ct in (match cstrs with - |[] -> pp f "@[<hov2>(module@ %a)@]" self#longident_loc lid - |_ -> - pp f "@[<hov2>(module@ %a@ with@ %a)@]" self#longident_loc lid - (self#list aux ~sep:"@ and@ ") cstrs) + | [] when in_implicit -> pp f "@[<hov2>%a@]" self#longident_loc lid + | [] -> pp f "@[<hov2>(module@ %a)@]" self#longident_loc lid + | _ when in_implicit -> + pp f "@[<hov2>%a@ with@ %a@]" self#longident_loc lid + (self#list aux ~sep:"@ and@ ") cstrs + | _ -> + pp f "@[<hov2>(module@ %a@ with@ %a)@]" self#longident_loc lid + (self#list aux ~sep:"@ and@ ") cstrs) | Ptyp_extension e -> self#extension f e | _ -> self#paren true self#core_type f x (********************pattern********************) @@ -383,6 +390,8 @@ class printer ()= object(self:'self) | Ppat_var ({txt = txt;_}) -> protect_ident f txt | Ppat_array l -> pp f "@[<2>[|%a|]@]" (self#list self#pattern1 ~sep:";") l + | Ppat_unpack (s) when in_implicit -> + pp f "%s" s.txt | Ppat_unpack (s) -> pp f "(module@ %s)@ " s.txt | Ppat_type li -> @@ -437,7 +446,7 @@ class printer ()= object(self:'self) | _ -> pp f "~%s:%a@;" s self#simple_pattern p end | Parr_implicit s -> - pp f "(implicit %s : %a)@;" s self#simple_pattern p + pp f "(implicit %s : %a)@;" s self#under_implicit#simple_pattern p method sugar_expr f e = if e.pexp_attributes <> [] then false @@ -666,6 +675,8 @@ class printer ()= object(self:'self) (* |`Normal -> self#longident_loc f li *) (* | `Prefix _ | `Infix _ -> pp f "( %a )" self#longident_loc li) *) | Pexp_constant c -> self#constant f c; + | Pexp_pack me when in_implicit -> + self#reset_implicit#module_expr f me | Pexp_pack me -> pp f "(module@;%a)" self#module_expr me | Pexp_newtype (lid, e) -> @@ -1424,7 +1435,7 @@ class printer ()= object(self:'self) else pp f "~%s:%a" s self#simple_expr e | Papp_implicit -> - pp f "(implicit %a)" self#simple_expr e + pp f "(implicit %a)" self#under_implicit#simple_expr e method directive_argument f x = (match x with diff --git a/parsing/pprintast.mli b/parsing/pprintast.mli index c3f25e93ca..e886e1c3a5 100644 --- a/parsing/pprintast.mli +++ b/parsing/pprintast.mli @@ -88,6 +88,7 @@ class printer : method reset : 'b method reset_semi : 'b method reset_ifthenelse : 'b + method reset_implicit : 'b method reset_pipe : 'b method signature : @@ -120,6 +121,7 @@ class printer : method under_pipe : 'b method under_semi : 'b method under_ifthenelse : 'b + method under_implicit : 'b method value_description : Format.formatter -> Parsetree.value_description -> unit method virtual_flag : Format.formatter -> Asttypes.virtual_flag -> unit From de150b25877724e83df1a488739eadc9156175fe Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Thu, 18 Sep 2014 06:31:04 +0200 Subject: [PATCH 428/494] Check path arities in Ctype.subtype, may solve #10 --- typing/ctype.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typing/ctype.ml b/typing/ctype.ml index 3e1a8c5614..c174db32ac 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -4132,7 +4132,7 @@ let rec subtype_rec env trace t1 t2 cstrs = | (_, Tconstr(p2, tl2, abbrev2)) when generic_abbrev env p2 && safe_abbrev env t2 -> subtype_rec env trace t1 (expand_abbrev env t2) cstrs - | (Tconstr(p1, tl1, _), Tconstr(p2, tl2, _)) when Path.same p1 p2 -> + | (Tconstr(p1, tl1, _), Tconstr(p2, tl2, _)) when Path.same p1 p2 && List.length tl1 = List.length tl2 -> begin try let decl = Env.find_type p1 env in List.fold_left2 From 3617b5442dc390d8825c6680e38491905cde75c3 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Thu, 18 Sep 2014 06:41:45 +0200 Subject: [PATCH 429/494] Typetexp: fix processing of implicit binders (#1) --- typing/typetexp.ml | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/typing/typetexp.ml b/typing/typetexp.ml index 2253d8157e..8d628099a6 100644 --- a/typing/typetexp.ml +++ b/typing/typetexp.ml @@ -421,25 +421,18 @@ let rec transl_type env policy styp = ctyp (Ttyp_var name) ty | Ptyp_arrow(Parr_implicit s, st1, st2) -> let cty1 = transl_type env policy st1 in - let package = match cty1.ctyp_desc with - | Ttyp_package pkg -> pkg - | _ -> assert false - in - let ty0 = newvar () in - (* remember original level *) Ctype.begin_def (); + let ty0 = newvar () in Ident.set_current_time ty0.level; - let id, env = - Env.enter_module ~arg:true ~implicit_:(Implicit 0) - s package.pack_type env - in + let id = Ident.create s in + let env' = Ctype.bind_implicit_arg id cty1.ctyp_type env in Ctype.begin_def (); - let cty2 = transl_type env policy st2 in + let cty2 = transl_type env' policy st2 in Ctype.end_def (); let arr = Tarr_implicit id in let ty = newty (Tarrow(arr, cty1.ctyp_type, cty2.ctyp_type, Cok)) in - unify env ty ty0; Ctype.end_def (); + unify env ty ty0; ctyp (Ttyp_arrow (arr, cty1, cty2)) ty | Ptyp_arrow(arr, st1, st2) -> let cty1 = transl_type env policy st1 in From 5dde92278bbb23f1651a13812c2486b0d7353333 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Thu, 18 Sep 2014 14:59:29 +0200 Subject: [PATCH 430/494] Add some test cases --- testsuite/tests/typing-modular_implicits/Makefile | 15 +++++++++++++++ .../coercion_arity_mismatch.ml | 4 ++++ .../coercion_arity_mismatch.ml.reference | 8 ++++++++ .../coercion_arity_mismatch.ml.result | 8 ++++++++ .../multiple_implicits.ml | 7 +++++++ .../multiple_implicits.ml.reference | 4 ++++ .../multiple_implicits.ml.result | 4 ++++ 7 files changed, 50 insertions(+) create mode 100644 testsuite/tests/typing-modular_implicits/Makefile create mode 100644 testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml create mode 100644 testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml.reference create mode 100644 testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml.result create mode 100644 testsuite/tests/typing-modular_implicits/multiple_implicits.ml create mode 100644 testsuite/tests/typing-modular_implicits/multiple_implicits.ml.reference create mode 100644 testsuite/tests/typing-modular_implicits/multiple_implicits.ml.result diff --git a/testsuite/tests/typing-modular_implicits/Makefile b/testsuite/tests/typing-modular_implicits/Makefile new file mode 100644 index 0000000000..c9433b2ecb --- /dev/null +++ b/testsuite/tests/typing-modular_implicits/Makefile @@ -0,0 +1,15 @@ +######################################################################### +# # +# OCaml # +# # +# Xavier Clerc, SED, INRIA Rocquencourt # +# # +# Copyright 2010 Institut National de Recherche en Informatique et # +# en Automatique. All rights reserved. This file is distributed # +# under the terms of the Q Public License version 1.0. # +# # +######################################################################### + +BASEDIR=../.. +include $(BASEDIR)/makefiles/Makefile.toplevel +include $(BASEDIR)/makefiles/Makefile.common diff --git a/testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml b/testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml new file mode 100644 index 0000000000..116c6c40bf --- /dev/null +++ b/testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml @@ -0,0 +1,4 @@ +(* Issue #10 *) +module type S = sig type t end;; +module type T = sig type _ t end;; +let f (x : (implicit X:S) -> X.t) () = (x :> (implicit X:T) -> unit X.t);; diff --git a/testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml.reference b/testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml.reference new file mode 100644 index 0000000000..ce013b13d3 --- /dev/null +++ b/testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml.reference @@ -0,0 +1,8 @@ + +# module type S = sig type t end +# module type T = sig type _ t end +# M# let f (x : (implicit X:S) -> X.t) () = (x :> (implicit X:T) -> unit X.t);; +Error: Type (implicit X : S) -> X.t is not a subtype of + (implicit X : T) -> unit X.t + Type (module T) is not a subtype of (module S) +# diff --git a/testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml.result b/testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml.result new file mode 100644 index 0000000000..ce013b13d3 --- /dev/null +++ b/testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml.result @@ -0,0 +1,8 @@ + +# module type S = sig type t end +# module type T = sig type _ t end +# M# let f (x : (implicit X:S) -> X.t) () = (x :> (implicit X:T) -> unit X.t);; +Error: Type (implicit X : S) -> X.t is not a subtype of + (implicit X : T) -> unit X.t + Type (module T) is not a subtype of (module S) +# diff --git a/testsuite/tests/typing-modular_implicits/multiple_implicits.ml b/testsuite/tests/typing-modular_implicits/multiple_implicits.ml new file mode 100644 index 0000000000..e890377aa4 --- /dev/null +++ b/testsuite/tests/typing-modular_implicits/multiple_implicits.ml @@ -0,0 +1,7 @@ +(* Issue #1 *) +module type T = sig type a end +;; + +let f : (implicit A: T) -> (implicit B: T) -> A.a * B.a -> unit = + fun (implicit A : T) (implicit B : T) (x : A.a * B.a) -> () +;; diff --git a/testsuite/tests/typing-modular_implicits/multiple_implicits.ml.reference b/testsuite/tests/typing-modular_implicits/multiple_implicits.ml.reference new file mode 100644 index 0000000000..76dc0dff1c --- /dev/null +++ b/testsuite/tests/typing-modular_implicits/multiple_implicits.ml.reference @@ -0,0 +1,4 @@ + +# module type T = sig type a end +# val f : (implicit A : T) -> (implicit B : T) -> A.a * B.a -> unit = <fun> +# diff --git a/testsuite/tests/typing-modular_implicits/multiple_implicits.ml.result b/testsuite/tests/typing-modular_implicits/multiple_implicits.ml.result new file mode 100644 index 0000000000..76dc0dff1c --- /dev/null +++ b/testsuite/tests/typing-modular_implicits/multiple_implicits.ml.result @@ -0,0 +1,4 @@ + +# module type T = sig type a end +# val f : (implicit A : T) -> (implicit B : T) -> A.a * B.a -> unit = <fun> +# From 87f17fc3418892035d875d6c0db9b925be167357 Mon Sep 17 00:00:00 2001 From: Jeremy Yallop <yallop@gmail.com> Date: Fri, 19 Sep 2014 16:14:19 +0100 Subject: [PATCH 431/494] Add a README with build status. --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000000..f671e7a2bc --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +## OCaml + modular implicits + +[![Build Status](https://travis-ci.org/ocamllabs/ocaml-modular-implicits.svg)](https://travis-ci.org/ocamllabs/ocaml-modular-implicits) + +A fork of [OCaml][ocaml] extended with [modular implicits][modimpl]. + +[ocaml]: https://github.com/ocaml/ocaml +[modimpl]: http://www.lpw25.net/ml2014.pdf From f1b4fd5ce1bed19ef471976816fe352c10a976a3 Mon Sep 17 00:00:00 2001 From: Jeremy Yallop <yallop@gmail.com> Date: Thu, 25 Sep 2014 14:25:01 +0100 Subject: [PATCH 432/494] Add implicit functor args to the implicit environment. --- typing/typecore.ml | 11 ++++++++--- typing/typecore.mli | 4 +++- typing/typemod.ml | 19 +++++++++++++------ typing/typemod.mli | 3 ++- 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/typing/typecore.ml b/typing/typecore.ml index 272f2c1aa2..ce9d7e1ca7 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -79,8 +79,9 @@ exception Error_forward of Location.error (* Forward declaration, to be filled in by Typemod.type_module *) let type_module = - ref ((fun env md -> assert false) : - Env.t -> Parsetree.module_expr -> Typedtree.module_expr) + ref ((fun ?implicit_arity env md -> assert false) : + ?implicit_arity:int -> Env.t -> Parsetree.module_expr -> + Typedtree.module_expr) (* Forward declaration, to be filled in by Typemod.type_open *) @@ -2615,7 +2616,11 @@ and type_expect_ ?in_function env sexp ty_expected = begin_def (); Ident.set_current_time ty.level; let context = Typetexp.narrow () in - let modl = !type_module env smodl in + let implicit_arity = match pmb_implicit with + | Nonimplicit -> 0 + | Implicit ar -> ar + in + let modl = !type_module ~implicit_arity env smodl in let (id, new_env) = Env.enter_module ~implicit_:pmb_implicit name.txt modl.mod_type env in Ctype.init_def(Ident.current_time()); diff --git a/typing/typecore.mli b/typing/typecore.mli index b867cc5bbf..8c3970eb29 100644 --- a/typing/typecore.mli +++ b/typing/typecore.mli @@ -125,7 +125,9 @@ val report_error: Env.t -> formatter -> error -> unit (* Deprecated. Use Location.{error_of_exn, report_error}. *) (* Forward declaration, to be filled in by Typemod.type_module *) -val type_module: (Env.t -> Parsetree.module_expr -> Typedtree.module_expr) ref +val type_module: + (?implicit_arity:int -> Env.t -> Parsetree.module_expr -> + Typedtree.module_expr) ref (* Forward declaration, to be filled in by Typemod.type_open *) val type_open: (open_flag -> Env.t -> Location.t -> Longident.t loc -> Path.t * Env.t) diff --git a/typing/typemod.ml b/typing/typemod.ml index df475db3f8..a1625f3e3a 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -1095,7 +1095,7 @@ let wrap_constraint env arg mty explicit = (* Type a module value expression *) -let rec type_module ?(alias=false) sttn funct_body anchor env smod = +let rec type_module ?(implicit_arity=0) ?(alias=false) sttn funct_body anchor env smod = match smod.pmod_desc with Pmod_ident lid -> let path = @@ -1142,10 +1142,13 @@ let rec type_module ?(alias=false) sttn funct_body anchor env smod = match ty_arg with | None -> (Ident.create "*", env), false | Some mty -> - Env.enter_module ~arg:true ~implicit_:Nonimplicit name.txt mty env, - true + let implicit_ = + if implicit_arity >= 0 then Implicit 0 else Nonimplicit + in Env.enter_module ~arg:true ~implicit_ name.txt mty env, + true in - let body = type_module sttn funct_body None newenv sbody in + let implicit_arity = pred implicit_arity in + let body = type_module ~implicit_arity sttn true None newenv sbody in rm { mod_desc = Tmod_functor(id, name, mty, body); mod_type = Mty_functor(id, ty_arg, body.mod_type); mod_env = env; @@ -1301,8 +1304,12 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = pmb_loc; pmb_implicit } -> check_name "module" module_names name; + let implicit_arity = match pmb_implicit with + | Nonimplicit -> 0 + | Implicit ar -> ar + in let modl = - type_module ~alias:true true funct_body + type_module ~implicit_arity ~alias:true true funct_body (anchor_submodule name.txt anchor) env smodl in let md = { md_type = enrich_module_type anchor name.txt modl.mod_type env; @@ -1525,7 +1532,7 @@ let type_toplevel_phrase env s = Env.reset_required_globals (); type_structure ~toplevel:true false None env s Location.none (*let type_module_alias = type_module ~alias:true true false None*) -let type_module = type_module true false None +let type_module ?implicit_arity = type_module ?implicit_arity true false None let type_structure = type_structure false None (* Normalize types in a signature *) diff --git a/typing/typemod.mli b/typing/typemod.mli index a17bcf63c0..662251cd5d 100644 --- a/typing/typemod.mli +++ b/typing/typemod.mli @@ -16,7 +16,8 @@ open Types open Format val type_module: - Env.t -> Parsetree.module_expr -> Typedtree.module_expr + ?implicit_arity:int -> Env.t -> Parsetree.module_expr -> + Typedtree.module_expr val type_structure: Env.t -> Parsetree.structure -> Location.t -> Typedtree.structure * Types.signature * Env.t From d1043ff736ea3058fbb56f99e1066b1f780b5088 Mon Sep 17 00:00:00 2001 From: Leo White <lpw25@cl.cam.ac.uk> Date: Fri, 19 Sep 2014 00:00:23 +0100 Subject: [PATCH 433/494] Fix bug in type marking when replacing variables with abstract types --- typing/implicitsearch.ml | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index ccde8a2068..64be2630fc 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -361,17 +361,22 @@ let remove_type_variables () = let variables = ref [] in let it_type_expr it ty = let ty = repr ty in - match ty.desc with - | Tvar name when ty.level < generic_level -> - let name = match name with - | None -> "ex" ^ string_of_int (incr k; !k) - | Some name -> name - in - let ident = Ident.create name in - variables := (ty, ident) :: !variables; - let ty' = newgenty (Tconstr (Path.Pident ident, [], ref Mnil)) in - link_type ty ty' - | _ -> type_iterators.it_type_expr it ty; + if ty.level >= lowest_level then begin + match ty.desc with + | Tvar name when ty.level < generic_level -> + let name = match name with + | None -> "ex" ^ string_of_int (incr k; !k) + | Some name -> name + in + let ident = Ident.create name in + variables := (ty, ident) :: !variables; + let ty' = newgenty (Tconstr (Path.Pident ident, [], ref Mnil)) in + link_type ty ty'; + mark_type_node ty + | _ -> + mark_type_node ty; + type_iterators.it_do_type_expr it ty; + end in let it = {type_iterators with it_type_expr} in variables, it From 3417e26549dfacbf7157fdcaf87beff49b17aca1 Mon Sep 17 00:00:00 2001 From: Leo White <lpw25@cl.cam.ac.uk> Date: Fri, 19 Sep 2014 00:01:16 +0100 Subject: [PATCH 434/494] Always generalize implicits before running regular generalization --- typing/typecore.ml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/typing/typecore.ml b/typing/typecore.ml index ce9d7e1ca7..bb24458dca 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1638,6 +1638,7 @@ let list_labels env ty = (* Check that all univars are safe in a type *) let check_univars env expans kind exp ty_expected vars = + Typeimplicit.generalize_implicits (); if expans && not (is_nonexpansive exp) then generalize_expansive env exp.exp_type; (* need to expand twice? cf. Ctype.unify2 *) @@ -2037,6 +2038,7 @@ and type_expect_ ?in_function env sexp ty_expected = begin_def (); let arg = type_exp env sarg in end_def (); + Typeimplicit.generalize_implicits (); if is_nonexpansive arg then generalize arg.exp_type else generalize_expansive env arg.exp_type; let rec split_cases vc ec = function @@ -3163,6 +3165,7 @@ and type_label_exp create env loc ty_expected begin_def (); let arg = type_exp env sarg in end_def (); + Typeimplicit.generalize_implicits (); generalize_expansive env arg.exp_type; unify_exp env arg ty_arg; check_univars env false "field value" arg label.lbl_arg vars; From bf55beed7a16056dd9c44f3ca1ecc7282bde7c58 Mon Sep 17 00:00:00 2001 From: Leo White <lpw25@cl.cam.ac.uk> Date: Tue, 30 Sep 2014 13:38:14 +0100 Subject: [PATCH 435/494] Generalize implicits when we leave an implicit function declaration --- typing/typecore.ml | 1 + 1 file changed, 1 insertion(+) diff --git a/typing/typecore.ml b/typing/typecore.ml index bb24458dca..a076c1fd00 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1971,6 +1971,7 @@ and type_expect_ ?in_function env sexp ty_expected = let case = {c_lhs; c_guard = None; c_rhs = body} in let arr = Tarr_implicit id in end_def (); (* exit rhs *) + Typeimplicit.generalize_implicits (); (* generalize any implicits *) end_def (); (* exit implicit binding *) let typ = Tarrow (arr, ty_arg, body.exp_type, Cok) in rue { From 7db69b52679267d1e0e2d3394e0930afddac4a38 Mon Sep 17 00:00:00 2001 From: Leo White <lpw25@cl.cam.ac.uk> Date: Tue, 30 Sep 2014 16:59:02 +0100 Subject: [PATCH 436/494] Add forwards propagation over implicit function defintions --- typing/ctype.ml | 7 ++ typing/ctype.mli | 1 + typing/typecore.ml | 161 ++++++++++++++++++++++++++------------------ typing/typecore.mli | 2 +- 4 files changed, 106 insertions(+), 65 deletions(-) diff --git a/typing/ctype.ml b/typing/ctype.ml index c174db32ac..59d9975e89 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -2971,6 +2971,13 @@ let filter_self_method env lab priv meths ty = pair +let filter_implicit env t = + let t = expand_head_trace env t in + match t.desc with + Tvar _ -> None + | Tarrow(Tarr_implicit id, t1, t2, _) -> Some (id, t1, t2) + | _ -> raise (Unify []) + (***********************************) (* Matching between type schemes *) (***********************************) diff --git a/typing/ctype.mli b/typing/ctype.mli index 555d7e1da8..eaf7e1445c 100644 --- a/typing/ctype.mli +++ b/typing/ctype.mli @@ -173,6 +173,7 @@ val deep_occur: type_expr -> type_expr -> bool val filter_self_method: Env.t -> string -> private_flag -> (Ident.t * type_expr) Meths.t ref -> type_expr -> Ident.t * type_expr +val filter_implicit: Env.t -> type_expr -> (Ident.t * type_expr * type_expr) option val moregeneral: Env.t -> bool -> type_expr -> type_expr -> bool (* Check if the first type scheme is more general than the second. *) diff --git a/typing/typecore.ml b/typing/typecore.ml index a076c1fd00..a5f2a2d379 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -51,7 +51,7 @@ type error = | Coercion_failure of type_expr * type_expr * (type_expr * type_expr) list * bool | Too_many_arguments of bool * type_expr - | Abstract_wrong_label of arrow_flag * type_expr + | Abstract_wrong_label of Parsetree.arrow_flag * type_expr | Scoping_let_module of string * type_expr | Masked_instance_variable of Longident.t | Not_a_variant_type of Longident.t @@ -67,7 +67,6 @@ type error = | Invalid_for_loop_index | No_value_clauses | Exception_pattern_below_toplevel - | Apply_unexpected_implicit of type_expr | No_instance_found of Typeimplicit.pending_implicit | Ambiguous_implicit of Typeimplicit.pending_implicit * Path.t * Path.t @@ -1950,38 +1949,7 @@ and type_expect_ ?in_function env sexp ty_expected = in type_expect ?in_function env sfun ty_expected | Pexp_fun (Parr_implicit name, None, spat, sbody) -> - let ty = newvar () in - (* remember original level *) - begin_def (); - Ident.set_current_time ty.level; - let lev = get_current_level () in - let id = Ident.create name in - let ty_arg = newvar () in - (* type argument *) - begin_def (); - let (c_lhs, new_env, pattern_force, unpacks) = - let scope = Some (Annot.Idef sbody.pexp_loc) in - type_pattern ~lev env spat scope ty_arg in - end_def(); - assert (unpacks = []); - (* `Contaminating' unifications start here *) - List.iter (fun f -> f()) pattern_force; - begin_def (); - let body = type_implicit_arg id lev new_env sbody in - let case = {c_lhs; c_guard = None; c_rhs = body} in - let arr = Tarr_implicit id in - end_def (); (* exit rhs *) - Typeimplicit.generalize_implicits (); (* generalize any implicits *) - end_def (); (* exit implicit binding *) - let typ = Tarrow (arr, ty_arg, body.exp_type, Cok) in - rue { - exp_desc = Texp_function (arr, [case], Total); - exp_loc = loc; exp_extra = []; - exp_type = instance env (newgenty typ); - exp_attributes = []; - exp_env = env; - } - (* TODO: keep attributes, call type_function directly *) + type_implicit_function ?in_function loc env ty_expected name spat sbody | Pexp_fun (arr, None, spat, sexp) -> type_function ?in_function loc sexp.pexp_attributes env ty_expected arr [{pc_lhs=spat; pc_guard=None; pc_rhs=sexp}] @@ -2808,20 +2776,20 @@ and type_expect_ ?in_function env sexp ty_expected = | Pexp_extension ext -> raise (Error_forward (Typetexp.error_of_extension ext)) -and type_function ?in_function loc attrs env ty_expected arr caselist = +and type_function ?in_function loc attrs env ty_expected parr caselist = let (loc_fun, ty_fun) = match in_function with Some p -> p | None -> (loc, instance env ty_expected) in let separate = !Clflags.principal || Env.has_local_constraints env in - let arr = tarr_of_parr arr in + let arr = tarr_of_parr parr in if separate then begin_def (); let (ty_arg, ty_res) = try filter_arrow env (instance env ty_expected) arr with Unify _ -> match expand_head env ty_expected with {desc = Tarrow _} as ty -> - raise(Error(loc, env, Abstract_wrong_label(arr, ty))) + raise(Error(loc, env, Abstract_wrong_label(parr, ty))) | _ -> raise(Error(loc_fun, env, Too_many_arguments (in_function <> None, ty_fun))) @@ -3754,40 +3722,104 @@ and type_cases ?in_function env ty_arg ty_res partial_flag loc caselist = end; cases, partial -and type_implicit_arg id level env sbody = - let ty = newvar() in - (* remember original level *) +and type_implicit_function ?in_function loc env ty_expected name spat sbody = + let (loc_fun, ty_fun) = + match in_function with Some p -> p + | None -> (loc, instance env ty_expected) + in + (* Propogate expected types *) + let separate = !Clflags.principal || Env.has_local_constraints env in + if separate then begin_def (); + let expect = + try filter_implicit env (instance env ty_expected) + with Unify _ -> + match expand_head env ty_expected with + {desc = Tarrow _} as ty -> + raise(Error(loc, env, + Abstract_wrong_label (Parr_implicit name, ty))) + | _ -> + raise(Error(loc_fun, env, + Too_many_arguments (in_function <> None, ty_fun))) + in + let ty_arg = + match expect with + | Some(_, ty_arg, _) -> ty_arg + | None -> newgenvar () + in + if separate then begin + end_def (); + match expect with + | Some(_, ty_arg, ty_res) -> + generalize_structure ty_arg; + generalize_structure ty_res + | None -> () + end; + (* Type argument *) + begin_def (); + let (c_lhs, pat_env, pattern_force, unpacks) = + let scope = Some (Annot.Idef sbody.pexp_loc) in + type_pattern ~lev:(get_current_level ()) env spat scope ty_arg + in + end_def(); + assert (unpacks = []); + (* `Contaminating' unifications start here *) + List.iter (fun f -> f()) pattern_force; + (* Type body *) begin_def (); - Ident.set_current_time ty.level; + let level = get_current_level () in + begin_def (); + Ident.set_current_time level; let context = Typetexp.narrow () in - let name = Ident.name id in let smodl = let open Ast_helper in Mod.unpack (Exp.ident (mknoloc (Longident.Lident name))) in - let modl = !type_module env smodl in - let new_env = Env.add_module ~arg:true ~implicit_:(Implicit 0) id modl.mod_type env in - let new_env = Env.set_implicit_level id level new_env in + let modl = !type_module pat_env smodl in + let (id, body_env) = + Env.enter_module ~arg:true ~implicit_:(Implicit 0) + name modl.mod_type pat_env + in + let body_env = Env.set_implicit_level id level body_env in Ctype.init_def(Ident.current_time()); Typetexp.widen context; - let body = type_exp new_env sbody in - (* go back to original level *) - end_def (); - (* Unification of body.exp_type with the fresh variable ty - fails if and only if the prefix condition is violated, - i.e. if generative types rooted at id show up in the - type body.exp_type. Thus, this unification enforces the - scoping condition on "let module". *) + let body = + match expect with + | Some(id', _, ty_res) -> + let subst = Subst.add_module id' (Path.Pident id) Subst.identity in + let ty_res' = Subst.type_expr subst ty_res in + let in_function = Some(loc_fun, ty_fun) in + type_expect ?in_function body_env sbody ty_res' + | None -> type_exp body_env sbody + in let mb = { mb_id = id; mb_name = mknoloc name; mb_expr = modl; mb_implicit = Implicit 0; mb_attributes = []; mb_loc = sbody.pexp_loc } in - re { - exp_desc = Texp_letmodule(mb, body); - exp_loc = sbody.pexp_loc; exp_extra = []; - exp_type = body.exp_type; - exp_attributes = sbody.pexp_attributes; - exp_env = env } + let body' = + re { + exp_desc = Texp_letmodule(mb, body); + exp_loc = sbody.pexp_loc; exp_extra = []; + exp_type = body.exp_type; + exp_attributes = sbody.pexp_attributes; + exp_env = pat_env } + in + end_def (); + let case = {c_lhs; c_guard = None; c_rhs = body'} in + let arr = Tarr_implicit id in + let typ = Tarrow (arr, ty_arg, body.exp_type, Cok) in + let exp = + re { + exp_desc = Texp_function (arr, [case], Total); + exp_loc = loc; exp_extra = []; + exp_type = instance env (newgenty typ); + exp_attributes = []; + exp_env = env; + } + in + end_def (); + Typeimplicit.generalize_implicits (); (* generalize any implicits *) + unify_exp env exp (instance env ty_expected); + exp (* Typing of let bindings *) @@ -4178,13 +4210,14 @@ let report_error env ppf = function end | Abstract_wrong_label (l, ty) -> let label_mark = function - | Tarr_simple -> "but its first argument is not labelled" - | Tarr_labelled s -> + | Parsetree.Parr_simple -> "but its first argument is not labelled" + | Parsetree.Parr_labelled s -> sprintf "but its first argument is labelled ~%s" s - | Tarr_optional s -> + | Parsetree.Parr_optional s -> sprintf "but its first argument is labelled ?%s" s - | Tarr_implicit id -> - sprintf "but its first argument is implicit %s" (Ident.name id) in + | Parsetree.Parr_implicit s -> + sprintf "but its first argument is implicit %s" s + in reset_and_mark_loops ty; fprintf ppf "@[<v>@[<2>This function should have type@ %a@]@,%s@]" type_expr ty (label_mark l) diff --git a/typing/typecore.mli b/typing/typecore.mli index 8c3970eb29..9e8b251208 100644 --- a/typing/typecore.mli +++ b/typing/typecore.mli @@ -96,7 +96,7 @@ type error = | Coercion_failure of type_expr * type_expr * (type_expr * type_expr) list * bool | Too_many_arguments of bool * type_expr - | Abstract_wrong_label of arrow_flag * type_expr + | Abstract_wrong_label of Parsetree.arrow_flag * type_expr | Scoping_let_module of string * type_expr | Masked_instance_variable of Longident.t | Not_a_variant_type of Longident.t From a0359c7aa66e426888763309412b5752589e45c5 Mon Sep 17 00:00:00 2001 From: Leo White <lpw25@cl.cam.ac.uk> Date: Tue, 30 Sep 2014 19:59:48 +0100 Subject: [PATCH 437/494] Move examples to the test suite --- examples_numbers.ml | 92 ----- examples_numbers2.ml | 103 ----- examples_stringify.ml | 26 -- examples_stringify2.ml | 28 -- imp_control.ml | 138 ------- imp_data.ml | 371 ------------------ imp_goal.ml | 21 - imp_scope.ml | 34 -- .../typing-modular_implicits/implicits.ml | 8 +- .../tests/typing-modular_implicits/monad.ml | 111 ++++++ .../tests/typing-modular_implicits/number.ml | 37 ++ .../tests/typing-modular_implicits/show.ml | 45 +++ testsuite/typing | 1 + 13 files changed, 200 insertions(+), 815 deletions(-) delete mode 100644 examples_numbers.ml delete mode 100644 examples_numbers2.ml delete mode 100644 examples_stringify.ml delete mode 100644 examples_stringify2.ml delete mode 100644 imp_control.ml delete mode 100644 imp_data.ml delete mode 100644 imp_goal.ml delete mode 100644 imp_scope.ml rename implicit.fail => testsuite/tests/typing-modular_implicits/implicits.ml (82%) create mode 100644 testsuite/tests/typing-modular_implicits/monad.ml create mode 100644 testsuite/tests/typing-modular_implicits/number.ml create mode 100644 testsuite/tests/typing-modular_implicits/show.ml diff --git a/examples_numbers.ml b/examples_numbers.ml deleted file mode 100644 index 11b517ad2d..0000000000 --- a/examples_numbers.ml +++ /dev/null @@ -1,92 +0,0 @@ -module type NUM = sig - type t - val ( + ) : t -> t -> t - val ( - ) : t -> t -> t - val ( * ) : t -> t -> t - val ( / ) : t -> t -> t - val (~- ) : t -> t - val zero : t - val one : t - val of_int : int -> t -end;; - -module NUM = struct - let ( + ) (implicit M : NUM) = M.( + ) - let ( - ) (implicit M : NUM) = M.( - ) - let ( * ) (implicit M : NUM) = M.( * ) - let ( / ) (implicit M : NUM) = M.( / ) - let (~- ) (implicit M : NUM) = M.(~- ) - let zero (implicit M : NUM) () = M.zero - let one (implicit M : NUM) () = M.one - let (~~) (implicit M : NUM) = M.of_int -end;; - -module type ORD = sig - type t - val ( = ) : t -> t -> bool - val ( <> ) : t -> t -> bool - val ( < ) : t -> t -> bool - val ( <= ) : t -> t -> bool - val ( > ) : t -> t -> bool - val ( >= ) : t -> t -> bool -end;; - -module ORD = struct - let ( = ) (implicit M : ORD) = M.( = ) - let ( <> ) (implicit M : ORD) = M.( <> ) - let ( < ) (implicit M : ORD) = M.( < ) - let ( <= ) (implicit M : ORD) = M.( <= ) - let ( > ) (implicit M : ORD) = M.( > ) - let ( >= ) (implicit M : ORD) = M.( >= ) -end;; - -implicit module Int = struct - type t = int - let ( + ),( - ),( * ), ( / ), (~- ) = ( + ),( - ),( * ), ( / ), (~- ) - let zero = 0 - let one = 1 - let of_int x = x - let (( = ), ( <> ), ( < ), ( <= ), ( > ), ( >= )) - : (t -> t -> bool) - * (t -> t -> bool) - * (t -> t -> bool) - * (t -> t -> bool) - * (t -> t -> bool) - * (t -> t -> bool) - = ( = ), ( <> ), ( < ), ( <= ), ( > ), ( >= ) -end;; - -implicit module Float = struct - type t = float - let ( + ),( - ),( * ), ( / ), (~- ) = ( +.),( -.),( *.), ( /.), (~-.) - let zero = 0. - let one = 1. - let of_int = float_of_int - let (( = ), ( <> ), ( < ), ( <= ), ( > ), ( >= )) - : (t -> t -> bool) - * (t -> t -> bool) - * (t -> t -> bool) - * (t -> t -> bool) - * (t -> t -> bool) - * (t -> t -> bool) - = ( = ), ( <> ), ( < ), ( <= ), ( > ), ( >= ) -end;; - -(*implicit module Num_NUM = struct - open Num - type t = num - let ( + ),( - ),( * ), ( / ) = ( +/),( -/),( */), ( //) - let zero = num_of_int 0 - let one = num_of_int 1 - let (~- ) k = zero - k - let of_int = float_of_int - let ( = ), ( <> ), ( < ), ( <= ), ( > ), ( >= ) - = ( =/), ( <>/), ( </), ( <=/), ( >/), ( >=/) -end;;*) - -open NUM;; -open ORD;; -assert ( ~~2 / ~~3 = 0 - && ~~2 / ~~3 = 0.666666666666666666666666666666666666);; -let x = 1 + one() + one();; -let () = print_int x;; diff --git a/examples_numbers2.ml b/examples_numbers2.ml deleted file mode 100644 index 7db596faba..0000000000 --- a/examples_numbers2.ml +++ /dev/null @@ -1,103 +0,0 @@ -module type NUM = sig - type t - val ( + ) : t -> t -> t - val ( - ) : t -> t -> t - val ( * ) : t -> t -> t - val ( / ) : t -> t -> t - val (~- ) : t -> t - val zero : t - val one : t - val of_int : int -> t -end;; - -module NUM = struct - let ( + ) (implicit M : NUM) = M.( + ) - let ( - ) (implicit M : NUM) = M.( - ) - let ( * ) (implicit M : NUM) = M.( * ) - let ( / ) (implicit M : NUM) = M.( / ) - let (~- ) (implicit M : NUM) = M.(~- ) - let zero (implicit M : NUM) = M.zero - let one (implicit M : NUM) = M.one - let (~~) (implicit M : NUM) = M.of_int -end;; - -module type ORD = sig - type t - val ( = ) : t -> t -> bool - val ( <> ) : t -> t -> bool - val ( < ) : t -> t -> bool - val ( <= ) : t -> t -> bool - val ( > ) : t -> t -> bool - val ( >= ) : t -> t -> bool -end;; - -module ORD = struct - let ( = ) (implicit M : ORD) = M.( = ) - let ( <> ) (implicit M : ORD) = M.( <> ) - let ( < ) (implicit M : ORD) = M.( < ) - let ( <= ) (implicit M : ORD) = M.( <= ) - let ( > ) (implicit M : ORD) = M.( > ) - let ( >= ) (implicit M : ORD) = M.( >= ) -end;; - -implicit module Int = struct - type t = int - let ( + ),( - ),( * ), ( / ), (~- ) = ( + ),( - ),( * ), ( / ), (~- ) - let zero = 0 - let one = 1 - let of_int x = x - let (( = ), ( <> ), ( < ), ( <= ), ( > ), ( >= )) - : (t -> t -> bool) - * (t -> t -> bool) - * (t -> t -> bool) - * (t -> t -> bool) - * (t -> t -> bool) - * (t -> t -> bool) - = ( = ), ( <> ), ( < ), ( <= ), ( > ), ( >= ) -end;; - -implicit module Float = struct - type t = float - let ( + ),( - ),( * ), ( / ), (~- ) = ( +.),( -.),( *.), ( /.), (~-.) - let zero = 0. - let one = 1. - let of_int = float_of_int - let (( = ), ( <> ), ( < ), ( <= ), ( > ), ( >= )) - : (t -> t -> bool) - * (t -> t -> bool) - * (t -> t -> bool) - * (t -> t -> bool) - * (t -> t -> bool) - * (t -> t -> bool) - = ( = ), ( <> ), ( < ), ( <= ), ( > ), ( >= ) -end;; - -implicit functor PairNUM (A : NUM) (B : NUM) = struct - type t = A.t * B.t - let ( + ) (a1,b1) (a2,b2) = (A.( + ) a1 a2, B.( + ) b1 b2) - let ( - ) (a1,b1) (a2,b2) = (A.( - ) a1 a2, B.( - ) b1 b2) - let ( * ) (a1,b1) (a2,b2) = (A.( * ) a1 a2, B.( * ) b1 b2) - let ( / ) (a1,b1) (a2,b2) = (A.( / ) a1 a2, B.( / ) b1 b2) - let (~- ) (a1,b1) = (A.(~- ) a1, B.(~- ) b1) - let zero = A.zero, B.zero - let one = A.one, B.zero - let of_int i = A.of_int i, B.zero -end;; - -implicit functor PairORD (A : ORD) (B : ORD) = struct - type t = A.t * B.t - let ( = ) (a1,b1) (a2,b2) = A.(=) a1 a2 && B.(=) b1 b2 - let ( <> ) (a1,b1) (a2,b2) = A.(<>) a1 a2 || B.(<>) b1 b2 - let ( < ) (a1,b1) (a2,b2) = A.(<) a1 a2 || (A.(=) a1 a2 && B.(<) b1 b2 ) - let ( <= ) (a1,b1) (a2,b2) = A.(<=) a1 a2 || (A.(=) a1 a2 && B.(<=) b1 b2 ) - let ( > ) (a1,b1) (a2,b2) = A.(>) a1 a2 || (A.(=) a1 a2 && B.(>) b1 b2 ) - let ( >= ) (a1,b1) (a2,b2) = A.(>=) a1 a2 || (A.(=) a1 a2 && B.(>=) b1 b2 ) -end;; - -open NUM;; -open ORD;; - -assert ( ~~2 / ~~3 = 0 - && ~~2 / ~~3 = 0.666666666666666666666666666666666666);; - -(1, -1.) + (2, -2.);; diff --git a/examples_stringify.ml b/examples_stringify.ml deleted file mode 100644 index 56a6f80321..0000000000 --- a/examples_stringify.ml +++ /dev/null @@ -1,26 +0,0 @@ -module type STRINGIFY = sig type t val to_string : t -> string end;; - -(* Define "overloaded" string function *) -let to_string (implicit M : STRINGIFY) x = M.to_string x;; - -(* Locally bind implicit instance *) -let g (x : int) = - let implicit module Int = struct - type t = int - let to_string = string_of_int - end in - to_string x;; - -(* M is implicitly rebind inside f *) -let f (implicit M : STRINGIFY) (x : M.t) = to_string x;; - -(* Global instance *) -implicit module S = struct type t = string let to_string x = x end;; - -print_endline (to_string "4");; - -print_endline (f "4");; - -print_endline (g 4);; - -let x = assert (to_string "4" = f "4" && to_string "4" = g 4) in x;; diff --git a/examples_stringify2.ml b/examples_stringify2.ml deleted file mode 100644 index 2896f22633..0000000000 --- a/examples_stringify2.ml +++ /dev/null @@ -1,28 +0,0 @@ -module type STRINGIFY = sig type t val to_string : t -> string end -let to_string (implicit M : STRINGIFY) (xs : M.t) = M.to_string xs;; - -implicit module StringifyString = struct - type t = string - let to_string x = "\"" ^ String.escaped x ^ "\"" -end - -implicit functor StringifyList (X : STRINGIFY) = struct - type t = X.t list - let to_string xs = "[" ^ String.concat "; " (List.map X.to_string xs) ^ "]" -end - -implicit module StringifyInt = struct - type t = int - let to_string = string_of_int -end - -implicit functor StringifyPair (A : STRINGIFY) (B : STRINGIFY) = struct - type t = A.t * B.t - let to_string (a,b) = "(" ^ A.to_string a ^ "," ^ B.to_string b ^ ")" -end;; - -print_endline (to_string "a");; -print_endline (to_string ["a";"b";"c"]);; -print_endline (to_string [1;2;3]);; -print_endline (to_string (1,"lol"));; -print_endline (to_string [1, "a";2, "b";3, "c"]);; diff --git a/imp_control.ml b/imp_control.ml deleted file mode 100644 index 48339d56d3..0000000000 --- a/imp_control.ml +++ /dev/null @@ -1,138 +0,0 @@ -module type Functor = sig - type 'a t - val fmap : ('a -> 'b) -> 'a t -> 'b t -end - -module Functor = struct - let fmap (implicit M : Functor) = M.fmap -end - -module type Applicative = sig - include Functor - val pure : 'a -> 'a t - val apply : ('a -> 'b) t -> 'a t -> 'b t -end - -module Applicative = struct - let pure (implicit M : Applicative) = M.pure - let apply (implicit M : Applicative) = M.apply -end - -module type Monad = sig - include Functor - val return : 'a -> 'a t - val bind : 'a t -> ('a -> 'b t) -> 'b t -end - -module Monad = struct - let return (implicit M : Monad) = M.return - let bind (implicit M : Monad) = M.bind -end - -module type Monad_plus = sig - include Monad - val mzero : unit -> 'a t - val mplus : 'a t -> 'a t -> 'a t -end - -module Monad_plus = struct - let mzero (implicit M : Monad_plus) = M.mzero - let mplus (implicit M : Monad_plus) = M.mplus - - let mguard (implicit M : Monad_plus) b = - if b then - M.return () - else - M.mzero () -end - -module type Foldable = sig - type 'a t - val fold : ('a -> 'b -> 'b) -> 'a t -> 'b -> 'b -end - -module Foldable = struct - let fold (implicit F : Foldable) = F.fold -end - -module type Traversable = sig - include Functor - val traverse : (implicit F : Applicative) -> - ('a -> 'b F.t) -> 'a t -> 'b t F.t -end - -module Traversable = struct - let traverse (implicit T : Traversable) = T.traverse -end - -implicit module Option = struct - type 'a t = 'a option - - (* Functor *) - let fmap f = function - | None -> None - | Some a -> Some (f a) - - (* Applicative *) - let pure x = Some x - let apply f x = match f, x with - | Some f, Some x -> Some (f x) - | _, _ -> None - - (* Monad *) - let return x = Some x - let bind x f = match x with - | None -> None - | Some x -> f x - - (* Monad_plus *) - let mzero = None - let mplus a b = match a with - | None -> b - | Some _ -> a - - (* Foldable *) - let fold f t acc = match t with - | None -> acc - | Some x -> f x acc - - (* Traversable *) - let traverse (implicit F : Applicative) f = function - | None -> F.pure None - | Some x -> F.apply (F.pure (fun x -> Some x)) (f x) -end - -implicit module List = struct - type 'a t = 'a list - - (* Functor *) - let fmap = List.map - - (* Monad *) - let return x = [x] - let bind x f = - let rec aux acc = function - | x :: xs -> aux (x @ acc) xs - | [] -> acc in - aux [] (List.rev_map f x) - - (* Applicative *) - let pure x = [x] - let apply fs xs = bind fs (bind xs) - - (* Monad_plus *) - let mzero = [] - let mplus = (@) - - (* Foldable *) - let rec fold f t acc = match t with - | [] -> acc - | x :: xs -> fold f xs (f x acc) - - (* Traversable *) - let traverse (implicit F : Applicative) f t = - let cons = F.pure (fun x xs -> x :: xs) in - let cons x xs = F.apply (F.apply cons (F.pure (f x))) xs in - fold cons t (F.pure []) -end - diff --git a/imp_data.ml b/imp_data.ml deleted file mode 100644 index 7d7340dfc4..0000000000 --- a/imp_data.ml +++ /dev/null @@ -1,371 +0,0 @@ -module type Any = sig - type t -end - -module type Show = sig - type t - val to_string: t -> string - val buffer_add : Buffer.t -> t -> unit - val pp_print : Format.formatter -> t -> unit -end - -module Show = struct - let to_string (implicit M : Show) = M.to_string - let buffer_add (implicit M : Show) = M.buffer_add - let pp_print (implicit M : Show) = M.pp_print -end - -module type Eq = sig - type t - val ( = ) : t -> t -> bool -end - -module Eq = struct - let ( = ) (implicit M : Eq) = M.(=) -end - -module type Ord = sig - type t - val compare : t -> t -> int -end - -module Ord = struct - let ( = ) (implicit M : Ord) a b = M.compare a b = 0 - let ( <> ) (implicit M : Ord) a b = M.compare a b <> 0 - let ( < ) (implicit M : Ord) a b = M.compare a b < 0 - let ( <= ) (implicit M : Ord) a b = M.compare a b <= 0 - let ( > ) (implicit M : Ord) a b = M.compare a b > 0 - let ( >= ) (implicit M : Ord) a b = M.compare a b >= 0 - let compare (implicit M : Ord) = M.compare -end - -module type Num = sig - type t - val zero : t - val one : t - val of_int : int -> t - val ( + ) : t -> t -> t - val ( - ) : t -> t -> t - val ( * ) : t -> t -> t - val ( / ) : t -> t -> t - val (~- ) : t -> t -end - -module Num = struct - let zero (implicit M : Num) () = M.zero - let one (implicit M : Num) () = M.one - let of_int (implicit M : Num) = M.of_int - let ( + ) (implicit M : Num) = M.( + ) - let ( - ) (implicit M : Num) = M.( - ) - let ( * ) (implicit M : Num) = M.( * ) - let ( / ) (implicit M : Num) = M.( / ) - let (~- ) (implicit M : Num) = M.(~- ) -end - -module type Bounded = sig - type t - val bounds : t * t -end - -module Bounded = struct - let bounds (implicit M : Bounded) () = M.bounds -end - -module type Enum = sig - include Ord - val succ : t -> t - val pred : t -> t -end - -module Enum = struct - let succ (implicit M : Enum) x = M.succ - let pred (implicit M : Enum) x = M.pred - - let rec fold_enum_to - : (implicit M : Enum) -> M.t -> M.t -> (M.t -> 'a -> 'a) -> 'a -> 'a - = fun (implicit M : Enum) a b f acc -> - if M.compare a b < 0 then - fold_enum_to (M.succ a) b f (f a acc) - else - acc - - let rec fold_enum_downto - : (implicit M : Enum) -> M.t -> M.t -> (M.t -> 'a -> 'a) -> 'a -> 'a - = fun (implicit M : Enum) a b f acc -> - if M.compare b a < 0 then - fold_enum_downto (M.pred a) b f (f a acc) - else - acc - - let list_enum_to (implicit M : Enum) (a : M.t) b = - List.rev (fold_enum_to a b (fun x acc -> x :: acc) []) - - let list_enum_downto (implicit M : Enum) (a : M.t) b = - List.rev (fold_enum_downto a b (fun x acc -> x :: acc) []) -end - -module type Monoid = sig - type t - val empty : t - val append : t -> t -> t -end - -module Monoid = struct - let empty (implicit M : Monoid) () = M.empty - let append (implicit M : Monoid) = M.append -end - -(* Instances *) - -implicit module Int = struct - type t = int - - (* Show *) - let to_string = string_of_int - let buffer_add b i = Buffer.add_string b (to_string i) - let pp_print = Format.pp_print_int - - (* Eq *) - let ( = ) (a : int) b = a = b - - (* Ord *) - let compare (a : int) b = compare a b - - (* Num *) - let zero = 0 - let one = 1 - let of_int x = x - let ( + ) = ( + ) - let ( - ) = ( - ) - let ( * ) = ( * ) - let ( / ) = ( / ) - let (~- ) = (~- ) - - (* Bounded *) - let bounds = (min_int, max_int) - - (* Enum *) - let succ = succ - let pred = pred - - (* Monoid, addition *) - let empty = 0 - let append = (+) -end - -implicit module Float = struct - type t = float - - (* Show *) - let to_string = string_of_float - let buffer_add b i = Buffer.add_string b (to_string i) - let pp_print = Format.pp_print_float - - (* Eq *) - let ( = ) (a : float) b = a = b - - (* Ord *) - let compare (a : float) b = compare a b - - (* Num *) - let zero = 0. - let one = 1. - let of_int = float_of_int - let ( + ) = ( +.) - let ( - ) = ( -.) - let ( * ) = ( *.) - let ( / ) = ( /.) - let (~- ) = (~-.) - - (* Bounded *) - let bounds = (neg_infinity, infinity) - - (* Monoid, addition *) - let empty = 0. - let append = (+.) -end - -implicit module Bool = struct - type t = bool - - (* Show *) - let to_string = string_of_bool - let buffer_add b i = Buffer.add_string b (to_string i) - let pp_print = Format.pp_print_bool - - (* Eq *) - let ( = ) (a : bool) b = a = b - - (* Ord *) - let compare (a : bool) b = compare a b - - (* Bounded *) - let bounds = (neg_infinity, infinity) - - (* Enum *) - let succ = function - | false -> true - | true -> invalid_arg "Bool.succ" - - let pred = function - | true -> false - | false -> invalid_arg "Bool.pred" - - (* Monoid, addition *) - let empty = false - let append = (||) -end - -implicit module Char = struct - type t = char - - (* Show *) - let to_string c = String.escaped (String.make 1 c) - let buffer_add b c = Buffer.add_string b (to_string c) - let pp_print ppf c = Format.pp_print_string ppf c - - (* Eq *) - let ( = ) (a : char) b = a = b - - (* Ord *) - let compare (a : char) b = compare a b - - (* Bounded *) - let bounds = ('\000', '\255') - - (* Enum *) - let succ = function - | '\255' -> invalid_arg "Char.succ" - | n -> Char.chr (succ (Char.code n)) - - let pred = function - | '\000' -> invalid_arg "Char.succ" - | n -> Char.chr (pred (Char.code n)) -end - -implicit module String = struct - type t = string - - (* Show *) - let to_string = String.escaped - let buffer_add b s = Buffer.add_string b (to_string s) - let pp_print ppf s = Format.pp_print_string ppf (to_string s) - - (* Eq *) - let ( = ) (a : string) b = a = b - - (* Ord *) - let compare (a : string) b = compare a b - - (* Monoid *) - let empty = "" - let append = (^) -end - -implicit module Int32 = struct - type t = int32 - - (* Show *) - let to_string = Int32.to_string - let buffer_add b i = Buffer.add_string b (to_string i) - let pp_print ppf s = Format.pp_print_string ppf (to_string s) - - (* Eq *) - let ( = ) (a : int32) b = a = b - - (* Ord *) - let compare = Int32.compare - - (* Num *) - let zero = 0l - let one = 1l - let of_int = Int32.of_int - let ( + ) = Int32.add - let ( - ) = Int32.sub - let ( * ) = Int32.mul - let ( / ) = Int32.div - let (~- ) = Int32.neg - - (* Bounded *) - let bounds = (Int32.min_int, Int32.max_int) - - (* Enum *) - let succ = Int32.succ - let pred = Int32.pred - - (* Monoid, addition *) - let empty = 0l - let append = Int32.add -end - -implicit module Int64 = struct - type t = int64 - - (* Show *) - let to_string = Int64.to_string - let buffer_add b i = Buffer.add_string b (to_string i) - let pp_print ppf i = Format.pp_print_string ppf (to_string i) - - (* Eq *) - let ( = ) (a : int64) b = a = b - - (* Ord *) - let compare = Int64.compare - - (* Num *) - let zero = 0L - let one = 1L - let of_int = Int64.of_int - let ( + ) = Int64.add - let ( - ) = Int64.sub - let ( * ) = Int64.mul - let ( / ) = Int64.div - let (~- ) = Int64.neg - - (* Bounded *) - let bounds = (Int64.min_int, Int64.max_int) - - (* Enum *) - let succ = Int64.succ - let pred = Int64.pred - - (* Monoid, addition *) - let empty = 0L - let append = Int64.add -end - -implicit module Nativeint = struct - type t = nativeint - - (* Show *) - let to_string = Nativeint.to_string - let buffer_add b i = Buffer.add_string b (to_string i) - let pp_print ppf i = Format.pp_print_string ppf (to_string i) - - (* Eq *) - let ( = ) (a : nativeint) b = a = b - - (* Ord *) - let compare = Nativeint.compare - - (* Num *) - let zero = 0L - let one = 1L - let of_int = Nativeint.of_int - let ( + ) = Nativeint.add - let ( - ) = Nativeint.sub - let ( * ) = Nativeint.mul - let ( / ) = Nativeint.div - let (~- ) = Nativeint.neg - - (* Bounded *) - let bounds = (Nativeint.min_int, Nativeint.max_int) - - (* Enum *) - let succ = Nativeint.succ - let pred = Nativeint.pred - - (* Monoid, addition *) - let empty = 0L - let append = Nativeint.add -end diff --git a/imp_goal.ml b/imp_goal.ml deleted file mode 100644 index bb01a89e8c..0000000000 --- a/imp_goal.ml +++ /dev/null @@ -1,21 +0,0 @@ -module type Goalish = sig - type t - val x : int -> t -end -implicit module Goal_string = struct - type t = string -> string - let x n s = "g" ^ String.make n 'o' ^ s -end -implicit functor Goal_unit (G : Goalish) = struct - type t = unit -> G.t - let x n () = G.x (n + 1) -end -let g (implicit G : Goalish) = G.x 0;; - -let () = - print_endline (g "al"); - print_endline (g () "al"); - print_endline (g () () "al"); - print_endline (g () () () "al"); - print_endline (g () () () () "al"); - print_endline (g () () () () () "al"); diff --git a/imp_scope.ml b/imp_scope.ml deleted file mode 100644 index bb606631dc..0000000000 --- a/imp_scope.ml +++ /dev/null @@ -1,34 +0,0 @@ -module type Manageable = sig - type 'a t - type 'a value - type 'a lock - - val acquire : 'a t -> 'a lock * 'a value - val release : 'a lock -> unit -end - -let with_resource (implicit M : Manageable) r f = - let lock, value = M.acquire r in - try - let result = f value in - M.release lock; - result - with exn -> - M.release lock; - raise exn - -implicit module In_channel = struct - type 'a t = in_channel - type 'a value = in_channel - type 'a lock = in_channel - let acquire c = c, c - let release c = close_in_noerr c -end - -implicit module Out_channel = struct - type 'a t = out_channel - type 'a value = out_channel - type 'a lock = out_channel - let acquire c = c, c - let release c = close_out_noerr c -end diff --git a/implicit.fail b/testsuite/tests/typing-modular_implicits/implicits.ml similarity index 82% rename from implicit.fail rename to testsuite/tests/typing-modular_implicits/implicits.ml index 0ca5021188..aea3cdb2c5 100644 --- a/implicit.fail +++ b/testsuite/tests/typing-modular_implicits/implicits.ml @@ -10,12 +10,16 @@ let f (x : 'a) (implicit M : T) = (x : M.t); ();; (* OK *) let f (implicit M : T) (x : M.t) y = (y : M.t); ();; -(* OK if type approx is improved *) +(* OK *) let rec f (implicit M : T) (x : M.t) = ();; -(* BAD *) +(* OK *) let rec f (implicit M : T) (x : M.t) y = (y : M.t); ();; +(* BAD *) +let f : (implicit M : T) -> 'a -> unit = + fun (implicit M : T) (x : M.t) -> ();; + (* OK *) let f (g : (implicit M : T) -> M.t -> unit) () = ();; diff --git a/testsuite/tests/typing-modular_implicits/monad.ml b/testsuite/tests/typing-modular_implicits/monad.ml new file mode 100644 index 0000000000..a87419b38e --- /dev/null +++ b/testsuite/tests/typing-modular_implicits/monad.ml @@ -0,0 +1,111 @@ +module type Monad = sig + type 'a t + val return : 'a -> 'a t + val bind : 'a t -> ('a -> 'b t) -> 'b t +end;; + +let return (implicit M : Monad) x = M.return x;; + +let (>>=) (implicit M : Monad) m k = M.bind m k;; + +implicit module ListMonad = struct + type 'a t = 'a list + let return x = [x] + let bind x f = + let rec aux acc = function + | x :: xs -> aux (x @ acc) xs + | [] -> acc in + aux [] (List.rev_map f x) +end;; + +implicit module OptionMonad = struct + type 'a t = 'a option + let return x = Some x + let bind x f = match x with + | None -> None + | Some x -> f x +end;; + +(* Ambiguous *) +let a = (return 5) >>= fun x -> return x;; + +let l : 'a list = (return 5) >>= fun x -> return x;; + +let o : 'a option = (return 5) >>= fun x -> return x;; + +let m = [1; 2; 3] >>= fun x -> return x;; + +let n = return 5 >>= fun x -> [x; 2; 3];; + +(* Various implementations of sequence to test the handling of recursion *) +let rec sequence : (implicit M : Monad) -> 'a M.t list -> 'a list M.t = + fun (implicit M : Monad) (x : 'a M.t list) -> + match x with + | [] -> (return [] : 'a list M.t) + | x :: xs -> + x >>= fun y -> + sequence xs >>= fun ys -> + return (y :: ys);; + +let rec sequence : type a. (implicit M : Monad) -> a M.t list -> a list M.t = + fun (implicit M : Monad) (x : a M.t list) -> + match x with + | [] -> (return [] : a list M.t) + | x :: xs -> + x >>= fun y -> + sequence xs >>= fun ys -> + return (y :: ys);; + +let rec sequence : (implicit M : Monad) -> 'a M.t list -> 'a list M.t = + fun (implicit M : Monad) x -> + match x with + | [] -> return [] + | x :: xs -> + x >>= fun y -> + sequence xs >>= fun ys -> + return (y :: ys);; + +let rec sequence : 'a. (implicit M : Monad) -> 'a M.t list -> 'a list M.t = + fun (implicit M : Monad) x -> + match x with + | [] -> return [] + | x :: xs -> + x >>= fun y -> + sequence xs >>= fun ys -> + return (y :: ys);; + +let rec sequence : type a. (implicit M : Monad) -> a M.t list -> a list M.t = + fun (implicit M : Monad) x -> + match x with + | [] -> return [] + | x :: xs -> + x >>= fun y -> + sequence xs >>= fun ys -> + return (y :: ys);; + +let rec sequence : (implicit M : Monad) -> 'a M.t list -> 'a list M.t = + fun (implicit M : Monad) x -> + match x with + | [] -> M.return [] + | x :: xs -> + M.bind x (fun y -> + M.bind (sequence xs) (fun ys -> + M.return (y :: ys)));; + +let rec sequence : 'a. (implicit M : Monad) -> 'a M.t list -> 'a list M.t = + fun (implicit M : Monad) x -> + match x with + | [] -> M.return [] + | x :: xs -> + M.bind x (fun y -> + M.bind (sequence xs) (fun ys -> + M.return (y :: ys)));; + +let rec sequence : type a. (implicit M : Monad) -> a M.t list -> a list M.t = + fun (implicit M : Monad) x -> + match x with + | [] -> M.return [] + | x :: xs -> + M.bind x (fun y -> + M.bind (sequence xs) (fun ys -> + M.return (y :: ys)));; diff --git a/testsuite/tests/typing-modular_implicits/number.ml b/testsuite/tests/typing-modular_implicits/number.ml new file mode 100644 index 0000000000..c384ee9fe9 --- /dev/null +++ b/testsuite/tests/typing-modular_implicits/number.ml @@ -0,0 +1,37 @@ +module type Num = sig + type t + val ( + ) : t -> t -> t + val ( - ) : t -> t -> t + val ( * ) : t -> t -> t + val ( / ) : t -> t -> t + val (~- ) : t -> t +end;; + +let ( + ) (implicit N : Num) = N.( + );; +let ( - ) (implicit N : Num) = N.( - );; +let ( * ) (implicit N : Num) = N.( * );; +let ( / ) (implicit N : Num) = N.( / );; +let (~- ) (implicit N : Num) = N.(~- );; + +implicit module Int = struct + type t = int + open Pervasives + let ( + ), ( - ), ( * ), ( / ), (~- ) = + ( + ), ( - ), ( * ), ( / ), (~- ) +end;; + +implicit module Float = struct + type t = float + let ( + ), ( - ), ( * ), ( / ), (~- ) = + ( +. ), ( -. ), ( *. ), ( /. ), (~-. ) +end;; + +let x = 1 + 4 + 5 / 5;; + +let y = 1.2 + 4.4 + 5.9 / 6.2;; + +let sq (implicit N : Num) (x : N.t) = x * x;; + +let a = sq 4.9;; + +let b = sq 6;; diff --git a/testsuite/tests/typing-modular_implicits/show.ml b/testsuite/tests/typing-modular_implicits/show.ml new file mode 100644 index 0000000000..18eea101a4 --- /dev/null +++ b/testsuite/tests/typing-modular_implicits/show.ml @@ -0,0 +1,45 @@ +module type Show = sig + type t + val show : t -> string +end;; + +let show (implicit S : Show) x = S.show x;; + +let print (implicit S : Show) (x : S.t) = + print_endline (show x);; + +implicit module ShowString = struct + type t = string + let show x = "\"" ^ x ^ "\"" +end;; + +implicit module ShowInt = struct + type t = int + let show x = string_of_int x +end;; + +print_endline (show "4");; + +print 5;; + + +implicit functor StringifyPair (A : Show) (B : Show) = struct + type t = A.t * B.t + let show (a,b) = "(" ^ A.show a ^ "," ^ B.show b ^ ")" +end;; + +implicit functor StringifyList (X : Show) = struct + type t = X.t list + let show xs = "[" ^ String.concat "; " (List.map X.show xs) ^ "]" +end + +let () = print [("hello", 1); ("world", 2)];; + +let g (x : float) = + let implicit module Float = struct + type t = float + let show = string_of_float + end in + show x;; + +let () = print_endline (g 5.5) diff --git a/testsuite/typing b/testsuite/typing index cb953d6ac0..74ceabba10 100644 --- a/testsuite/typing +++ b/testsuite/typing @@ -2,6 +2,7 @@ tests/typing-extensions tests/typing-fstclassmod tests/typing-gadts tests/typing-implicit_unpack +tests/typing-modular_implicits tests/typing-labels tests/typing-misc tests/typing-misc-bugs From 7012436e9200cf87f818cebffd91e108a602024f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Le=CC=81o=20Testard?= <leo.testard@gmail.com> Date: Wed, 29 Oct 2014 19:57:45 +0100 Subject: [PATCH 438/494] Fix handling of applicative paths in equality checking for type constructors. --- .../tests/typing-modular_implicits/functor_apply.ml | 9 +++++++++ .../typing-modular_implicits/functor_apply.ml.reference | 5 +++++ typing/ctype.ml | 9 ++++++--- typing/path.ml | 5 +++++ typing/path.mli | 3 +++ 5 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 testsuite/tests/typing-modular_implicits/functor_apply.ml create mode 100644 testsuite/tests/typing-modular_implicits/functor_apply.ml.reference diff --git a/testsuite/tests/typing-modular_implicits/functor_apply.ml b/testsuite/tests/typing-modular_implicits/functor_apply.ml new file mode 100644 index 0000000000..19a6326975 --- /dev/null +++ b/testsuite/tests/typing-modular_implicits/functor_apply.ml @@ -0,0 +1,9 @@ +module Foo(P: sig end) = struct + type t = A +end + +module Bar = struct end + +module X: sig type t = private Foo(Bar).t end = struct + type t = Foo(Bar).t +end ;; diff --git a/testsuite/tests/typing-modular_implicits/functor_apply.ml.reference b/testsuite/tests/typing-modular_implicits/functor_apply.ml.reference new file mode 100644 index 0000000000..e660eafabd --- /dev/null +++ b/testsuite/tests/typing-modular_implicits/functor_apply.ml.reference @@ -0,0 +1,5 @@ + +# module Foo : functor (P : sig end) -> sig type t = A end +module Bar : sig end +module X : sig type t = private Foo(Bar).t end +# diff --git a/typing/ctype.ml b/typing/ctype.ml index 59d9975e89..dead0152b6 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -3385,7 +3385,8 @@ let rec eqtype rename type_pairs subst env t1 t2 = unify_univar t1' t2' !univar_pairs | Tconstr (p1, tl1, _), Tconstr (p2, tl2, _) - when Tbl.mem (Path.head p1) !equality_equations + when (not (Path.is_application p1) && not (Path.is_application p2)) + && Tbl.mem (Path.head p1) !equality_equations && Tbl.mem (Path.head p2) !equality_equations -> let (tl, tr) = (* Base-kinded have priorioties *) @@ -3400,11 +3401,13 @@ let rec eqtype rename type_pairs subst env t1 t2 = eqtype_modulo_equation rename type_pairs subst env tl tr | Tconstr (p, _, _), te - when Tbl.mem (Path.head p) !equality_equations -> + when not (Path.is_application p) + && Tbl.mem (Path.head p) !equality_equations -> eqtype_modulo_equation rename type_pairs subst env t1' t2' | te, Tconstr (p, _, _) - when Tbl.mem (Path.head p) !equality_equations -> + when not (Path.is_application p) + && Tbl.mem (Path.head p) !equality_equations -> eqtype_modulo_equation rename type_pairs subst env t2' t1' | (_, _) -> diff --git a/typing/path.ml b/typing/path.ml index 3bfbaeb1ee..90ae0ba61c 100644 --- a/typing/path.ml +++ b/typing/path.ml @@ -43,6 +43,11 @@ let rec name ?(paren=kfalse) = function name ~paren p ^ if paren s then ".( " ^ s ^ " )" else "." ^ s | Papply(p1, p2) -> name ~paren p1 ^ "(" ^ name ~paren p2 ^ ")" +let rec is_application = function + | Pdot (p, _, _) -> is_application p + | Papply _ -> true + | Pident _ -> false + let rec head = function Pident id -> id | Pdot(p, s, pos) -> head p diff --git a/typing/path.mli b/typing/path.mli index 0e90540f1f..b27dd4cbb3 100644 --- a/typing/path.mli +++ b/typing/path.mli @@ -25,6 +25,9 @@ val nopos: int val name: ?paren:(string -> bool) -> t -> string (* [paren] tells whether a path suffix needs parentheses *) + +val is_application: t -> bool + val head: t -> Ident.t val last: t -> string From f41ba46de6edaded6de6105a32b34adfb51f3e7d Mon Sep 17 00:00:00 2001 From: Jeremy Yallop <yallop@gmail.com> Date: Mon, 5 Jan 2015 14:32:27 +0000 Subject: [PATCH 439/494] Fix off-by-one error in 65019d6e --- typing/typemod.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typing/typemod.ml b/typing/typemod.ml index a1625f3e3a..0cb41bcc65 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -1143,7 +1143,7 @@ let rec type_module ?(implicit_arity=0) ?(alias=false) sttn funct_body anchor en | None -> (Ident.create "*", env), false | Some mty -> let implicit_ = - if implicit_arity >= 0 then Implicit 0 else Nonimplicit + if implicit_arity > 0 then Implicit 0 else Nonimplicit in Env.enter_module ~arg:true ~implicit_ name.txt mty env, true in From c34ad7e70daa5d63fa17a786f476c9a56e7b78e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bour?= <frederic.bour@lakaban.net> Date: Sun, 7 Jun 2015 17:59:52 -0400 Subject: [PATCH 440/494] Implicitsearch: fix translation of implicit path to implicit instances --- typing/implicitsearch.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 64be2630fc..8120c35632 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -1131,7 +1131,7 @@ let pack_implicit inst path = | Mty_functor (param, Some mty_param, mty_res) -> let coercion = Includemod.modtypes env marg.mod_type mty_param in let mty_appl = Subst.modtype - (Subst.add_module param path Subst.identity) mty_res + (Subst.add_module param p2 Subst.identity) mty_res in { mod_desc = Tmod_apply(mfun, marg, coercion); mod_type = mty_appl; From 020516506a75926f8859f70a19d9601beb67bf2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bour?= <frederic.bour@lakaban.net> Date: Sun, 7 Jun 2015 18:46:44 -0400 Subject: [PATCH 441/494] Ctype: handle Tarr_implicit in generalize --- typing/ctype.ml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/typing/ctype.ml b/typing/ctype.ml index dead0152b6..9ea8bc31a5 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -841,7 +841,11 @@ let rec generalize_expansive env var_level ty = variance tyl | Tpackage (_, _, tyl) -> List.iter (generalize_contravariant env var_level) tyl - | Tarrow (_, t1, t2, _) -> + | Tarrow (kind, t1, t2, _) -> + let env = match kind with + | Tarr_implicit id -> Env.set_implicit_level id var_level env + | _ -> env + in generalize_contravariant env var_level t1; generalize_expansive env var_level t2 | _ -> From a16c9033dc8622a831331e924ec955a545ad60b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bour?= <frederic.bour@lakaban.net> Date: Tue, 9 Jun 2015 21:47:23 -0400 Subject: [PATCH 442/494] Import Env.register_as_implicit from modular-implicits-statement branch --- typing/env.ml | 6 ++++++ typing/env.mli | 3 +++ 2 files changed, 9 insertions(+) diff --git a/typing/env.ml b/typing/env.ml index 9757fa3306..d317dc569f 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -676,6 +676,12 @@ let rec implicit_cannot_occur path env = let implicit_instances env = env.implicit_instances +let register_as_implicit path arity env = + let md = find_module path env in + let md = {md with md_implicit = Implicit arity} in + (* FIXME: Check arity *) + register_if_implicit path md env + (* Lookup by name *) exception Recmodule diff --git a/typing/env.mli b/typing/env.mli index 8960c91938..6432c74e95 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -135,6 +135,9 @@ val open_pers_signature: string -> t -> t val open_implicit: Path.t -> signature -> t -> t +(* Mark one path as implicit *) +val register_as_implicit: Path.t -> int -> t -> t + (* Insertion by name *) val enter_value: From b98ac3d3c0149ef9626c281bde0fcd98ba42e402 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bour?= <frederic.bour@lakaban.net> Date: Tue, 9 Jun 2015 21:48:27 -0400 Subject: [PATCH 443/494] Don't make implicit functor arguments implicit modules, just register them in implicit scope --- typing/typemod.ml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/typing/typemod.ml b/typing/typemod.ml index 0cb41bcc65..838b7cf0ed 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -1138,14 +1138,18 @@ let rec type_module ?(implicit_arity=0) ?(alias=false) sttn funct_body anchor en | Pmod_functor(name, smty, sbody) -> let mty = may_map (transl_modtype env) smty in let ty_arg = may_map (fun m -> m.mty_type) mty in - let (id, newenv), funct_body = + let id, newenv, funct_body = match ty_arg with - | None -> (Ident.create "*", env), false + | None -> Ident.create "*", env, false | Some mty -> - let implicit_ = - if implicit_arity > 0 then Implicit 0 else Nonimplicit - in Env.enter_module ~arg:true ~implicit_ name.txt mty env, - true + let id, env = + Env.enter_module ~arg:true ~implicit_:Nonimplicit name.txt mty env + in + let env = if implicit_arity > 0 + then Env.register_as_implicit (Pident id) 0 env + else env + in + id, env, true in let implicit_arity = pred implicit_arity in let body = type_module ~implicit_arity sttn true None newenv sbody in From 2b5aaa91318bd07c7322496bae140aa3eb8bce74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Bour?= <frederic.bour@lakaban.net> Date: Tue, 9 Jun 2015 22:20:19 -0400 Subject: [PATCH 444/494] Adding arithmetic test to the testsuite --- .../typing-modular_implicits/arithmetic.ml | 41 +++++++ .../arithmetic.ml.result | 103 ++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 testsuite/tests/typing-modular_implicits/arithmetic.ml create mode 100644 testsuite/tests/typing-modular_implicits/arithmetic.ml.result diff --git a/testsuite/tests/typing-modular_implicits/arithmetic.ml b/testsuite/tests/typing-modular_implicits/arithmetic.ml new file mode 100644 index 0000000000..cdf24f4e26 --- /dev/null +++ b/testsuite/tests/typing-modular_implicits/arithmetic.ml @@ -0,0 +1,41 @@ +type z = Z +type 'n s = S of 'n + +module type N = sig type n val n : n end +implicit module Z : N with type n = z = struct type n = z let n = Z end +implicit functor S(N:N) : N with type n = N.n s = struct type n = N.n +s let n = S N.n end + +module type ADD = +sig + type a and b and c + val a : a + val b : b + val c : c +end + +let add (implicit Add: ADD) (a: Add.a) (b : Add.b) : Add.c = Add.c + +implicit functor AddZ (B: N) : ADD with type a = z + and type b = B.n + and type c = B.n = +struct + type a = z and b = B.n and c = B.n + let a = Z and b = B.n and c = B.n +end + +implicit functor AddS (A: N) (B: N) (Add : ADD with type a = A.n and +type b = B.n) + : ADD with type a = A.n s + and type b = B.n + and type c = Add.c s = +struct + type a = A.n s and b = B.n and c = Add.c s + let a = S A.n and b = B.n and c = S Add.c +end +;; + +(* Stress Implicitsearch.translpath + Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) +add (S Z) Z +;; diff --git a/testsuite/tests/typing-modular_implicits/arithmetic.ml.result b/testsuite/tests/typing-modular_implicits/arithmetic.ml.result new file mode 100644 index 0000000000..f19a5dcc38 --- /dev/null +++ b/testsuite/tests/typing-modular_implicits/arithmetic.ml.result @@ -0,0 +1,103 @@ + +# type z = Z +type 'n s = S of 'n +module type N = sig type n val n : n end +implicit module Z : sig type n = z val n : n end +implicit functor S (N : N) : sig type n = N.n s val n : n end +module type ADD = sig type a and b and c val a : a val b : b val c : c end +val add : (implicit Add : ADD) -> Add.a -> Add.b -> Add.c = <fun> +implicit functor AddZ (B : N) : + sig type a = z and b = B.n and c = B.n val a : a val b : b val c : c end +implicit functor AddS (A : N) (B : N) (Add : sig + type a = A.n + and b = B.n + and c + val a : a + val b : b + val c : c + end) : + sig + type a = A.n s + and b = B.n + and c = Add.c s + val a : a + val b : b + val c : c + end +# * MMMMM# + (* Stress Implicitsearch.translpath + Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) + add (S Z) Z + ;; +MMMMM# + (* Stress Implicitsearch.translpath + Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) + add (S Z) Z + ;; +MMMMM# + (* Stress Implicitsearch.translpath + Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) + add (S Z) Z + ;; +MMMMM# + (* Stress Implicitsearch.translpath + Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) + add (S Z) Z + ;; +MMMMM# + (* Stress Implicitsearch.translpath + Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) + add (S Z) Z + ;; +MMMMM# + (* Stress Implicitsearch.translpath + Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) + add (S Z) Z + ;; +MMMMM# + (* Stress Implicitsearch.translpath + Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) + add (S Z) Z + ;; +MMMMM# + (* Stress Implicitsearch.translpath + Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) + add (S Z) Z + ;; +MMMMM# + (* Stress Implicitsearch.translpath + Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) + add (S Z) Z + ;; +MMMMM# + (* Stress Implicitsearch.translpath + Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) + add (S Z) Z + ;; +MMMMM# + (* Stress Implicitsearch.translpath + Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) + add (S Z) Z + ;; +MMMMM# + (* Stress Implicitsearch.translpath + Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) + add (S Z) Z + ;; +MMMMM# + (* Stress Implicitsearch.translpath + Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) + add (S Z) Z + ;; +MMMMM# + (* Stress Implicitsearch.translpath + Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) + add (S Z) Z + ;; +MMMMM# + (* Stress Implicitsearch.translpath + Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) + add (S Z) Z + ;; +- : AddS(Z)(Z)(AddZ(Z)).c = S Z +# From f33f0481f44fc51c5943decbf3b7db3f98da6737 Mon Sep 17 00:00:00 2001 From: Leo White <lpw25@cl.cam.ac.uk> Date: Sun, 26 Jul 2015 12:47:29 +0100 Subject: [PATCH 445/494] Fix generative functors --- typing/typemod.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typing/typemod.ml b/typing/typemod.ml index 838b7cf0ed..553d06c190 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -1152,7 +1152,7 @@ let rec type_module ?(implicit_arity=0) ?(alias=false) sttn funct_body anchor en id, env, true in let implicit_arity = pred implicit_arity in - let body = type_module ~implicit_arity sttn true None newenv sbody in + let body = type_module ~implicit_arity sttn funct_body None newenv sbody in rm { mod_desc = Tmod_functor(id, name, mty, body); mod_type = Mty_functor(id, ty_arg, body.mod_type); mod_env = env; From 04e8573dd4f8347010be71044d11a98227401140 Mon Sep 17 00:00:00 2001 From: Leo White <lpw25@cl.cam.ac.uk> Date: Sun, 26 Jul 2015 12:48:30 +0100 Subject: [PATCH 446/494] Change the syntax of implicit parameters --- parsing/parser.mly | 55 +++++----- .../typing-modular_implicits/arithmetic.ml | 29 +++-- .../arithmetic.ml.result | 101 +++--------------- .../coercion_arity_mismatch.ml | 2 +- .../coercion_arity_mismatch.ml.reference | 7 +- .../coercion_arity_mismatch.ml.result | 7 +- .../typing-modular_implicits/implicits.ml | 27 +++-- .../tests/typing-modular_implicits/monad.ml | 36 +++---- .../multiple_implicits.ml | 4 +- .../multiple_implicits.ml.reference | 2 +- .../multiple_implicits.ml.result | 2 +- .../tests/typing-modular_implicits/number.ml | 2 +- .../tests/typing-modular_implicits/show.ml | 8 +- typing/oprint.ml | 10 +- 14 files changed, 119 insertions(+), 173 deletions(-) diff --git a/parsing/parser.mly b/parsing/parser.mly index 85cbd12217..f7990ecd14 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -214,6 +214,10 @@ let lapply p1 p2 = then Lapply(p1, p2) else raise (Syntaxerr.Error(Syntaxerr.Applicative_path (symbol_rloc()))) +let rec mod_ext_apply p1 = function + | [] -> p1 + | p2 :: rest -> Lapply(mod_ext_apply p1 rest, p2) + let exp_of_label lbl pos = mkexp (Pexp_ident(mkrhs (Lident(Longident.last lbl)) pos)) @@ -815,35 +819,24 @@ and_module_binding: ; -implicit_parameter: - | LPAREN functor_arg_name COLON module_type RPAREN - { (mkrhs $2 2, $4) } -; implicit_parameters: - implicit_parameters implicit_parameter - { $2 :: $1 } - | implicit_parameter - { [ $1 ] } + /* empty */ + { [] } + | implicit_parameters LBRACE functor_arg_name COLON module_type RBRACE + { (mkrhs $3 3, $5) :: $1 } ; - implicit_binding: - MODULE UIDENT implicit_binding_body post_item_attributes - { Mb.implicit_ (mkrhs $2 2) [] $3 ~loc:(symbol_rloc ()) ~attrs:$4 } - | FUNCTOR UIDENT implicit_parameters implicit_binding_body post_item_attributes + MODULE UIDENT implicit_parameters implicit_binding_body post_item_attributes { Mb.implicit_ (mkrhs $2 2) (List.rev $3) $4 ~loc:(symbol_rloc ()) ~attrs:$5 } ; - implicit_binding_body: EQUAL module_expr { $2 } | COLON module_type EQUAL module_expr { mkmod(Pmod_constraint($4, $2)) } ; - implicit_declaration: - | MODULE UIDENT implicit_declaration_body post_item_attributes - { Md.implicit_ (mkrhs $2 2) [] $3 ~attrs:$4 ~loc:(symbol_rloc()) } - | FUNCTOR UIDENT implicit_parameters implicit_declaration_body post_item_attributes + MODULE UIDENT implicit_parameters implicit_declaration_body post_item_attributes { Md.implicit_ (mkrhs $2 2) (List.rev $3) $4 ~attrs:$5 ~loc:(symbol_rloc()) } ; implicit_declaration_body: @@ -1250,9 +1243,9 @@ labeled_simple_pattern: { (Parr_labelled (fst $2), None, snd $2) } | LABEL simple_pattern { (Parr_labelled $1, None, $2) } - | LPAREN IMPLICIT UIDENT COLON implicit_module_type RPAREN - { (Parr_implicit $3, None, - mkpat(Ppat_constraint(mkpat(Ppat_var (mkrhs $3 3)), $5))) } + | LBRACE UIDENT COLON implicit_module_type RBRACE + { (Parr_implicit $2, None, + mkpat(Ppat_constraint(mkpat(Ppat_var (mkrhs $2 2)), $4))) } | simple_pattern { (Parr_simple, None, $1) } ; @@ -1518,8 +1511,12 @@ label_expr: { (Papp_labelled $1, $2) } | TILDE label_ident { (Papp_labelled (fst $2), snd $2) } - | LPAREN IMPLICIT mod_ext_longident RPAREN - { let md = mkmod(Pmod_ident (mkrhs $3 3)) in + | LBRACE mod_longident RBRACE + { let md = mkmod(Pmod_ident (mkrhs $2 2)) in + (Papp_implicit, mkexp (Pexp_pack md)) } + | LBRACE mod_longident mod_ext_parameters RBRACE + { (* FIXME: Identifier location should include parameters *) + let md = mkmod(Pmod_ident (mkrhs (mod_ext_apply $2 $3) 2)) in (Papp_implicit, mkexp (Pexp_pack md)) } | QUESTION label_ident { (Papp_optional (fst $2), snd $2) } @@ -1803,9 +1800,11 @@ type_kind: { (Ptype_variant(List.rev $3), Private, None) } | EQUAL DOTDOT { (Ptype_open, Public, None) } - | EQUAL private_flag LBRACE label_declarations RBRACE + | EQUAL LBRACE label_declarations RBRACE + { (Ptype_record $3, Public, None) } + | EQUAL PRIVATE LBRACE label_declarations RBRACE { (Ptype_record $4, $2, None) } - | EQUAL core_type EQUAL private_flag constructor_declarations + | EQUAL core_type EQUAL PRIVATE constructor_declarations { (Ptype_variant(List.rev $5), $4, Some $2) } | EQUAL core_type EQUAL DOTDOT { (Ptype_open, Public, Some $2) } @@ -2052,8 +2051,8 @@ core_type2: { mktyp(Ptyp_arrow(Parr_optional $1 , mkoption $2, $4)) } | LIDENT COLON core_type2 MINUSGREATER core_type2 { mktyp(Ptyp_arrow(Parr_labelled $1, $3, $5)) } - | LPAREN IMPLICIT UIDENT COLON implicit_module_type RPAREN MINUSGREATER core_type2 - { mktyp(Ptyp_arrow(Parr_implicit $3, $5, $8)) } + | LBRACE UIDENT COLON implicit_module_type RBRACE MINUSGREATER core_type2 + { mktyp(Ptyp_arrow(Parr_implicit $2, $4, $7)) } | core_type2 MINUSGREATER core_type2 { mktyp(Ptyp_arrow(Parr_simple, $1, $3)) } ; @@ -2289,6 +2288,10 @@ mod_ext_longident: | mod_ext_longident DOT UIDENT { Ldot($1, $3) } | mod_ext_longident LPAREN mod_ext_longident RPAREN { lapply $1 $3 } ; +mod_ext_parameters: + | LPAREN mod_ext_longident RPAREN { [$2] } + | mod_ext_parameters LPAREN mod_ext_longident RPAREN { $3 :: $1 } +; mty_longident: ident { Lident $1 } | mod_ext_longident DOT ident { Ldot($1, $3) } diff --git a/testsuite/tests/typing-modular_implicits/arithmetic.ml b/testsuite/tests/typing-modular_implicits/arithmetic.ml index cdf24f4e26..4bbbb45c2c 100644 --- a/testsuite/tests/typing-modular_implicits/arithmetic.ml +++ b/testsuite/tests/typing-modular_implicits/arithmetic.ml @@ -1,22 +1,31 @@ type z = Z type 'n s = S of 'n -module type N = sig type n val n : n end -implicit module Z : N with type n = z = struct type n = z let n = Z end -implicit functor S(N:N) : N with type n = N.n s = struct type n = N.n -s let n = S N.n end +module type N = sig + type n + val n : n +end + +implicit module Z : N with type n = z = struct + type n = z + let n = Z +end + +implicit module S {N : N} : N with type n = N.n s = struct + type n = N.n s + let n = S N.n +end -module type ADD = -sig +module type ADD = sig type a and b and c val a : a val b : b val c : c end -let add (implicit Add: ADD) (a: Add.a) (b : Add.b) : Add.c = Add.c +let add {Add : ADD} (a: Add.a) (b : Add.b) : Add.c = Add.c -implicit functor AddZ (B: N) : ADD with type a = z +implicit module AddZ {B : N} : ADD with type a = z and type b = B.n and type c = B.n = struct @@ -24,8 +33,8 @@ struct let a = Z and b = B.n and c = B.n end -implicit functor AddS (A: N) (B: N) (Add : ADD with type a = A.n and -type b = B.n) +implicit module AddS {A: N} {B: N} {Add : ADD with type a = A.n and +type b = B.n} : ADD with type a = A.n s and type b = B.n and type c = Add.c s = diff --git a/testsuite/tests/typing-modular_implicits/arithmetic.ml.result b/testsuite/tests/typing-modular_implicits/arithmetic.ml.result index f19a5dcc38..e880efafa9 100644 --- a/testsuite/tests/typing-modular_implicits/arithmetic.ml.result +++ b/testsuite/tests/typing-modular_implicits/arithmetic.ml.result @@ -1,21 +1,21 @@ -# type z = Z +# type z = Z type 'n s = S of 'n module type N = sig type n val n : n end implicit module Z : sig type n = z val n : n end -implicit functor S (N : N) : sig type n = N.n s val n : n end +implicit module S {N : N} : sig type n = N.n s val n : n end module type ADD = sig type a and b and c val a : a val b : b val c : c end -val add : (implicit Add : ADD) -> Add.a -> Add.b -> Add.c = <fun> -implicit functor AddZ (B : N) : +val add : {Add : ADD} -> Add.a -> Add.b -> Add.c = <fun> +implicit module AddZ {B : N} : sig type a = z and b = B.n and c = B.n val a : a val b : b val c : c end -implicit functor AddS (A : N) (B : N) (Add : sig - type a = A.n - and b = B.n - and c - val a : a - val b : b - val c : c - end) : +implicit module AddS {A : N} {B : N} {Add : sig + type a = A.n + and b = B.n + and c + val a : a + val b : b + val c : c + end} : sig type a = A.n s and b = B.n @@ -24,80 +24,5 @@ implicit functor AddS (A : N) (B : N) (Add : sig val b : b val c : c end -# * MMMMM# - (* Stress Implicitsearch.translpath - Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) - add (S Z) Z - ;; -MMMMM# - (* Stress Implicitsearch.translpath - Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) - add (S Z) Z - ;; -MMMMM# - (* Stress Implicitsearch.translpath - Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) - add (S Z) Z - ;; -MMMMM# - (* Stress Implicitsearch.translpath - Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) - add (S Z) Z - ;; -MMMMM# - (* Stress Implicitsearch.translpath - Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) - add (S Z) Z - ;; -MMMMM# - (* Stress Implicitsearch.translpath - Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) - add (S Z) Z - ;; -MMMMM# - (* Stress Implicitsearch.translpath - Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) - add (S Z) Z - ;; -MMMMM# - (* Stress Implicitsearch.translpath - Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) - add (S Z) Z - ;; -MMMMM# - (* Stress Implicitsearch.translpath - Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) - add (S Z) Z - ;; -MMMMM# - (* Stress Implicitsearch.translpath - Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) - add (S Z) Z - ;; -MMMMM# - (* Stress Implicitsearch.translpath - Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) - add (S Z) Z - ;; -MMMMM# - (* Stress Implicitsearch.translpath - Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) - add (S Z) Z - ;; -MMMMM# - (* Stress Implicitsearch.translpath - Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) - add (S Z) Z - ;; -MMMMM# - (* Stress Implicitsearch.translpath - Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) - add (S Z) Z - ;; -MMMMM# - (* Stress Implicitsearch.translpath - Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) - add (S Z) Z - ;; -- : AddS(Z)(Z)(AddZ(Z)).c = S Z +# * - : AddS(Z)(Z)(AddZ(Z)).c = S Z # diff --git a/testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml b/testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml index 116c6c40bf..3c4a9f8783 100644 --- a/testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml +++ b/testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml @@ -1,4 +1,4 @@ (* Issue #10 *) module type S = sig type t end;; module type T = sig type _ t end;; -let f (x : (implicit X:S) -> X.t) () = (x :> (implicit X:T) -> unit X.t);; +let f (x : {X : S} -> X.t) () = (x :> {X : T} -> unit X.t);; diff --git a/testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml.reference b/testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml.reference index ce013b13d3..f0cd1203ea 100644 --- a/testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml.reference +++ b/testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml.reference @@ -1,8 +1,9 @@ # module type S = sig type t end # module type T = sig type _ t end -# M# let f (x : (implicit X:S) -> X.t) () = (x :> (implicit X:T) -> unit X.t);; -Error: Type (implicit X : S) -> X.t is not a subtype of - (implicit X : T) -> unit X.t +# Characters 32-58: + let f (x : {X : S} -> X.t) () = (x :> {X : T} -> unit X.t);; + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Type {X : S} -> X.t is not a subtype of {X : T} -> unit X.t Type (module T) is not a subtype of (module S) # diff --git a/testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml.result b/testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml.result index ce013b13d3..f0cd1203ea 100644 --- a/testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml.result +++ b/testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml.result @@ -1,8 +1,9 @@ # module type S = sig type t end # module type T = sig type _ t end -# M# let f (x : (implicit X:S) -> X.t) () = (x :> (implicit X:T) -> unit X.t);; -Error: Type (implicit X : S) -> X.t is not a subtype of - (implicit X : T) -> unit X.t +# Characters 32-58: + let f (x : {X : S} -> X.t) () = (x :> {X : T} -> unit X.t);; + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Type {X : S} -> X.t is not a subtype of {X : T} -> unit X.t Type (module T) is not a subtype of (module S) # diff --git a/testsuite/tests/typing-modular_implicits/implicits.ml b/testsuite/tests/typing-modular_implicits/implicits.ml index aea3cdb2c5..c0644a8262 100644 --- a/testsuite/tests/typing-modular_implicits/implicits.ml +++ b/testsuite/tests/typing-modular_implicits/implicits.ml @@ -2,26 +2,35 @@ module type T = sig type t val x : t end;; (* BAD *) -let f () = let x = ref [] in let g (implicit M : T) () = x := [M.x] in ();; +let f () = + let x = ref [] in + let g {M : T} () = x := [M.x] in + ();; (* BAD *) -let f (x : 'a) (implicit M : T) = (x : M.t); ();; +let f (x : 'a) {M : T} = + (x : M.t); + ();; (* OK *) -let f (implicit M : T) (x : M.t) y = (y : M.t); ();; +let f {M : T} (x : M.t) y = + (y : M.t); + ();; (* OK *) -let rec f (implicit M : T) (x : M.t) = ();; +let rec f {M : T} (x : M.t) = ();; (* OK *) -let rec f (implicit M : T) (x : M.t) y = (y : M.t); ();; +let rec f {M : T} (x : M.t) y = + (y : M.t); + ();; (* BAD *) -let f : (implicit M : T) -> 'a -> unit = - fun (implicit M : T) (x : M.t) -> ();; +let f : {M : T} -> 'a -> unit = + fun {M : T} (x : M.t) -> ();; (* OK *) -let f (g : (implicit M : T) -> M.t -> unit) () = ();; +let f (g : {M : T} -> M.t -> unit) () = ();; (* OK *) -let f (implicit M : T) (implicit N : T) = N.x;; +let f {M : T} {N : T} = N.x;; diff --git a/testsuite/tests/typing-modular_implicits/monad.ml b/testsuite/tests/typing-modular_implicits/monad.ml index a87419b38e..d76931f56e 100644 --- a/testsuite/tests/typing-modular_implicits/monad.ml +++ b/testsuite/tests/typing-modular_implicits/monad.ml @@ -4,9 +4,9 @@ module type Monad = sig val bind : 'a t -> ('a -> 'b t) -> 'b t end;; -let return (implicit M : Monad) x = M.return x;; +let return {M : Monad} x = M.return x;; -let (>>=) (implicit M : Monad) m k = M.bind m k;; +let (>>=) {M : Monad} m k = M.bind m k;; implicit module ListMonad = struct type 'a t = 'a list @@ -38,8 +38,8 @@ let m = [1; 2; 3] >>= fun x -> return x;; let n = return 5 >>= fun x -> [x; 2; 3];; (* Various implementations of sequence to test the handling of recursion *) -let rec sequence : (implicit M : Monad) -> 'a M.t list -> 'a list M.t = - fun (implicit M : Monad) (x : 'a M.t list) -> +let rec sequence : {M : Monad} -> 'a M.t list -> 'a list M.t = + fun {M : Monad} (x : 'a M.t list) -> match x with | [] -> (return [] : 'a list M.t) | x :: xs -> @@ -47,8 +47,8 @@ let rec sequence : (implicit M : Monad) -> 'a M.t list -> 'a list M.t = sequence xs >>= fun ys -> return (y :: ys);; -let rec sequence : type a. (implicit M : Monad) -> a M.t list -> a list M.t = - fun (implicit M : Monad) (x : a M.t list) -> +let rec sequence : type a. {M : Monad} -> a M.t list -> a list M.t = + fun {M : Monad} (x : a M.t list) -> match x with | [] -> (return [] : a list M.t) | x :: xs -> @@ -56,8 +56,8 @@ let rec sequence : type a. (implicit M : Monad) -> a M.t list -> a list M.t = sequence xs >>= fun ys -> return (y :: ys);; -let rec sequence : (implicit M : Monad) -> 'a M.t list -> 'a list M.t = - fun (implicit M : Monad) x -> +let rec sequence : {M : Monad} -> 'a M.t list -> 'a list M.t = + fun {M : Monad} x -> match x with | [] -> return [] | x :: xs -> @@ -65,8 +65,8 @@ let rec sequence : (implicit M : Monad) -> 'a M.t list -> 'a list M.t = sequence xs >>= fun ys -> return (y :: ys);; -let rec sequence : 'a. (implicit M : Monad) -> 'a M.t list -> 'a list M.t = - fun (implicit M : Monad) x -> +let rec sequence : 'a. {M : Monad} -> 'a M.t list -> 'a list M.t = + fun {M : Monad} x -> match x with | [] -> return [] | x :: xs -> @@ -74,8 +74,8 @@ let rec sequence : 'a. (implicit M : Monad) -> 'a M.t list -> 'a list M.t = sequence xs >>= fun ys -> return (y :: ys);; -let rec sequence : type a. (implicit M : Monad) -> a M.t list -> a list M.t = - fun (implicit M : Monad) x -> +let rec sequence : type a. {M : Monad} -> a M.t list -> a list M.t = + fun {M : Monad} x -> match x with | [] -> return [] | x :: xs -> @@ -83,8 +83,8 @@ let rec sequence : type a. (implicit M : Monad) -> a M.t list -> a list M.t = sequence xs >>= fun ys -> return (y :: ys);; -let rec sequence : (implicit M : Monad) -> 'a M.t list -> 'a list M.t = - fun (implicit M : Monad) x -> +let rec sequence : {M : Monad} -> 'a M.t list -> 'a list M.t = + fun {M : Monad} x -> match x with | [] -> M.return [] | x :: xs -> @@ -92,8 +92,8 @@ let rec sequence : (implicit M : Monad) -> 'a M.t list -> 'a list M.t = M.bind (sequence xs) (fun ys -> M.return (y :: ys)));; -let rec sequence : 'a. (implicit M : Monad) -> 'a M.t list -> 'a list M.t = - fun (implicit M : Monad) x -> +let rec sequence : 'a. {M : Monad} -> 'a M.t list -> 'a list M.t = + fun {M : Monad} x -> match x with | [] -> M.return [] | x :: xs -> @@ -101,8 +101,8 @@ let rec sequence : 'a. (implicit M : Monad) -> 'a M.t list -> 'a list M.t = M.bind (sequence xs) (fun ys -> M.return (y :: ys)));; -let rec sequence : type a. (implicit M : Monad) -> a M.t list -> a list M.t = - fun (implicit M : Monad) x -> +let rec sequence : type a. {M : Monad} -> a M.t list -> a list M.t = + fun {M : Monad} x -> match x with | [] -> M.return [] | x :: xs -> diff --git a/testsuite/tests/typing-modular_implicits/multiple_implicits.ml b/testsuite/tests/typing-modular_implicits/multiple_implicits.ml index e890377aa4..61e43882c2 100644 --- a/testsuite/tests/typing-modular_implicits/multiple_implicits.ml +++ b/testsuite/tests/typing-modular_implicits/multiple_implicits.ml @@ -2,6 +2,6 @@ module type T = sig type a end ;; -let f : (implicit A: T) -> (implicit B: T) -> A.a * B.a -> unit = - fun (implicit A : T) (implicit B : T) (x : A.a * B.a) -> () +let f : {A: T} -> {B: T} -> A.a * B.a -> unit = + fun {A : T} {B : T} (x : A.a * B.a) -> () ;; diff --git a/testsuite/tests/typing-modular_implicits/multiple_implicits.ml.reference b/testsuite/tests/typing-modular_implicits/multiple_implicits.ml.reference index 76dc0dff1c..7aa827b791 100644 --- a/testsuite/tests/typing-modular_implicits/multiple_implicits.ml.reference +++ b/testsuite/tests/typing-modular_implicits/multiple_implicits.ml.reference @@ -1,4 +1,4 @@ # module type T = sig type a end -# val f : (implicit A : T) -> (implicit B : T) -> A.a * B.a -> unit = <fun> +# val f : {A : T} -> {B : T} -> A.a * B.a -> unit = <fun> # diff --git a/testsuite/tests/typing-modular_implicits/multiple_implicits.ml.result b/testsuite/tests/typing-modular_implicits/multiple_implicits.ml.result index 76dc0dff1c..7aa827b791 100644 --- a/testsuite/tests/typing-modular_implicits/multiple_implicits.ml.result +++ b/testsuite/tests/typing-modular_implicits/multiple_implicits.ml.result @@ -1,4 +1,4 @@ # module type T = sig type a end -# val f : (implicit A : T) -> (implicit B : T) -> A.a * B.a -> unit = <fun> +# val f : {A : T} -> {B : T} -> A.a * B.a -> unit = <fun> # diff --git a/testsuite/tests/typing-modular_implicits/number.ml b/testsuite/tests/typing-modular_implicits/number.ml index c384ee9fe9..5df5ce510e 100644 --- a/testsuite/tests/typing-modular_implicits/number.ml +++ b/testsuite/tests/typing-modular_implicits/number.ml @@ -30,7 +30,7 @@ let x = 1 + 4 + 5 / 5;; let y = 1.2 + 4.4 + 5.9 / 6.2;; -let sq (implicit N : Num) (x : N.t) = x * x;; +let sq {N : Num} (x : N.t) = x * x;; let a = sq 4.9;; diff --git a/testsuite/tests/typing-modular_implicits/show.ml b/testsuite/tests/typing-modular_implicits/show.ml index 18eea101a4..6049323513 100644 --- a/testsuite/tests/typing-modular_implicits/show.ml +++ b/testsuite/tests/typing-modular_implicits/show.ml @@ -3,9 +3,9 @@ module type Show = sig val show : t -> string end;; -let show (implicit S : Show) x = S.show x;; +let show {S : Show} x = S.show x;; -let print (implicit S : Show) (x : S.t) = +let print {S : Show} (x : S.t) = print_endline (show x);; implicit module ShowString = struct @@ -23,12 +23,12 @@ print_endline (show "4");; print 5;; -implicit functor StringifyPair (A : Show) (B : Show) = struct +implicit module StringifyPair {A : Show} {B : Show} = struct type t = A.t * B.t let show (a,b) = "(" ^ A.show a ^ "," ^ B.show b ^ ")" end;; -implicit functor StringifyList (X : Show) = struct +implicit module StringifyList {X : Show} = struct type t = X.t list let show xs = "[" ^ String.concat "; " (List.map X.show xs) ^ "]" end diff --git a/typing/oprint.ml b/typing/oprint.ml index b3305224ec..1d298980d2 100644 --- a/typing/oprint.ml +++ b/typing/oprint.ml @@ -180,8 +180,7 @@ and print_out_type_1 ppf = pp_close_box ppf () | Otyp_implicit_arrow (lab, ty1, ty2) -> pp_open_box ppf 0; - pp_print_string ppf "(implicit"; - pp_print_space ppf (); + pp_print_string ppf "{"; pp_print_string ppf lab; pp_print_space ppf (); pp_print_string ppf ":"; @@ -199,7 +198,7 @@ and print_out_type_1 ppf = fprintf ppf "@]" | ty1 -> print_out_type_2 ppf ty1; end; - pp_print_string ppf ") ->"; + pp_print_string ppf "} ->"; pp_print_space ppf (); print_out_type_1 ppf ty2; pp_close_box ppf () @@ -380,7 +379,7 @@ let rec print_out_functor ppf = and print_out_implicit_functor n ppf = function | Omty_functor (name , Some mty_arg, mty_res) when n > 0 -> - fprintf ppf "(%s : %a) %a" name + fprintf ppf "{%s : %a} %a" name print_out_module_type mty_arg (print_out_implicit_functor (n - 1)) mty_res (* The implicit declares 'n' parameters, but when printing module_type @@ -460,11 +459,10 @@ and print_out_sig_item ppf = | Orec_next -> "and") name !out_module_type mty | Osig_module (name, mty, rs, Asttypes.Implicit n) -> - fprintf ppf "@[<2>%s %s %s %a@]" + fprintf ppf "@[<2>%s module %s %a@]" (match rs with Orec_not -> "implicit" | Orec_first -> "implicit rec" | Orec_next -> "and") - (if n = 0 then "module" else "functor") name (print_out_implicit_functor n) mty | Osig_type(td, rs) -> From 3cd757bfa4806c0f18c4fe460f895fcbf497120e Mon Sep 17 00:00:00 2001 From: Jeremy Yallop <yallop@gmail.com> Date: Tue, 18 Aug 2015 09:25:14 +0100 Subject: [PATCH 447/494] Travis tests: use Camlp4 branch with modular implicits support. --- .travis-ci.sh | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/.travis-ci.sh b/.travis-ci.sh index e34353afb5..e3f592650a 100644 --- a/.travis-ci.sh +++ b/.travis-ci.sh @@ -3,11 +3,23 @@ i386) ./configure make world.opt sudo make install - (cd testsuite && make all) - git clone git://github.com/ocaml/camlp4 -b 4.02 - (cd camlp4 && ./configure && make && sudo make install) + + cd testsuite && make all + + git clone git://github.com/ocamllabs/camlp4 + (cd camlp4 \ + && git checkout modular-implicits-4.02 \ + && ./configure \ + && make \ + && sudo make install) + git clone git://github.com/ocaml/opam - (cd opam && ./configure && make lib-ext && make && sudo make install) + (cd opam \ + && ./configure \ + && make lib-ext \ + && make \ + && sudo make install) + opam init -y -a git://github.com/ocaml/opam-repository opam install -y utop ;; From 122bb4785617a8d6c276afd151408255a7c1c689 Mon Sep 17 00:00:00 2001 From: Jeremy Yallop <yallop@gmail.com> Date: Thu, 20 Aug 2015 11:11:56 +0100 Subject: [PATCH 448/494] Travis tests: don't attempt to build OPAM. --- .travis-ci.sh | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/.travis-ci.sh b/.travis-ci.sh index e3f592650a..fed67f74a5 100644 --- a/.travis-ci.sh +++ b/.travis-ci.sh @@ -10,18 +10,7 @@ i386) (cd camlp4 \ && git checkout modular-implicits-4.02 \ && ./configure \ - && make \ - && sudo make install) - - git clone git://github.com/ocaml/opam - (cd opam \ - && ./configure \ - && make lib-ext \ - && make \ - && sudo make install) - - opam init -y -a git://github.com/ocaml/opam-repository - opam install -y utop + && make) ;; *) echo unknown arch From 06746a84d8a0f61465b80c5ec6d38808b90458c9 Mon Sep 17 00:00:00 2001 From: Jeremy Yallop <yallop@gmail.com> Date: Tue, 15 Sep 2015 12:09:20 +0100 Subject: [PATCH 449/494] Switch Pprintast over to the new syntax. --- parsing/pprintast.ml | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index 8a2d489c39..ffaf30ccfd 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -243,7 +243,7 @@ class printer ()= object(self:'self) | Parr_labelled s -> pp f "%s:%a" s self#core_type1 c | Parr_implicit s -> - pp f "(implicit %s : %a)" s self#under_implicit#core_type1 c + pp f "{%s : %a}" s self#under_implicit#core_type1 c method core_type f x = if x.ptyp_attributes <> [] then begin @@ -446,7 +446,7 @@ class printer ()= object(self:'self) | _ -> pp f "~%s:%a@;" s self#simple_pattern p end | Parr_implicit s -> - pp f "(implicit %s : %a)@;" s self#under_implicit#simple_pattern p + pp f "{%s : %a}@;" s self#under_implicit#simple_pattern p method sugar_expr f e = if e.pexp_attributes <> [] then false @@ -1017,8 +1017,7 @@ class printer ()= object(self:'self) self#module_type pmd.pmd_type self#item_attributes pmd.pmd_attributes | Psig_module ({pmd_implicit = Implicit arity} as pmd) -> - pp f "@[<hov>implicit %s@ %s@ :@ %a@]%a" - (if arity = 0 then "module" else "functor") + pp f "@[<hov>implicit module@ %s@ %a@]%a" pmd.pmd_name.txt (self#implicit_declaration arity) pmd.pmd_type self#item_attributes pmd.pmd_attributes @@ -1095,7 +1094,7 @@ class printer ()= object(self:'self) method implicit_binding n f me = match me.pmod_desc with | Pmod_functor (s, Some mt, me') when n > 0 -> - pp f "(%s@ :@ %a)@;%a" + pp f "{%s@ :@ %a}@;%a" s.txt self#module_type mt (self#implicit_binding (n - 1)) me' @@ -1110,13 +1109,14 @@ class printer ()= object(self:'self) method implicit_declaration n f mt = match mt.pmty_desc with | Pmty_functor (s, Some mt, mt') when n > 0 -> - pp f "(%s@ :@ %a)@;%a" + pp f "{%s@ :@ %a}@;%a" s.txt self#module_type mt (self#implicit_declaration (n - 1)) mt' | _ -> assert (n = 0); - self#module_type f mt + pp f ":@;%a" + self#module_type mt method payload f = function | PStr [{pstr_desc = Pstr_eval (e, attrs)}] -> @@ -1189,8 +1189,7 @@ class printer ()= object(self:'self) | Pstr_module ({pmb_implicit = Nonimplicit} as x) -> pp f "@[<hov2>module@ %a@]" self#module_binding x | Pstr_module {pmb_implicit = Implicit arity; pmb_name; pmb_expr} -> - pp f "@[<hov2>implicit %s@ %s@ %a@]" - (if arity = 0 then "module" else "functor") + pp f "@[<hov2>implicit module@ %s@ %a@]" pmb_name.txt (self#implicit_binding arity) pmb_expr | Pstr_open od -> @@ -1435,7 +1434,7 @@ class printer ()= object(self:'self) else pp f "~%s:%a" s self#simple_expr e | Papp_implicit -> - pp f "(implicit %a)" self#under_implicit#simple_expr e + pp f "{%a}" self#under_implicit#simple_expr e method directive_argument f x = (match x with From 882f9da7063cd62aa1d07054ce72ea68ca894821 Mon Sep 17 00:00:00 2001 From: Jeremy Yallop <yallop@gmail.com> Date: Mon, 22 Sep 2014 23:58:03 +0100 Subject: [PATCH 450/494] Modular implicits test: an implementation of Leibniz equality. --- .../leibniz_equality.ml | 27 +++++++++++++++++++ .../leibniz_equality.ml.reference | 12 +++++++++ 2 files changed, 39 insertions(+) create mode 100644 testsuite/tests/typing-modular_implicits/leibniz_equality.ml create mode 100644 testsuite/tests/typing-modular_implicits/leibniz_equality.ml.reference diff --git a/testsuite/tests/typing-modular_implicits/leibniz_equality.ml b/testsuite/tests/typing-modular_implicits/leibniz_equality.ml new file mode 100644 index 0000000000..10e6aa0c0e --- /dev/null +++ b/testsuite/tests/typing-modular_implicits/leibniz_equality.ml @@ -0,0 +1,27 @@ +module type T1 = sig type _ t end + +module Eq : +sig + type (_, _) eq + + val refl : ('a, 'a) eq + val cast : ('a, 'b) eq -> 'a -> 'b + val lift : ('a, 'b) eq -> {T : T1} -> ('a T.t, 'b T.t) eq + val symm : ('a, 'b) eq -> ('b, 'a) eq + val trans : ('a, 'b) eq -> ('b, 'c) eq -> ('a, 'c) eq +end = +struct + implicit module Id = struct type 'a t = 'a end + + type ('a, 'b) eq = {T: T1} -> 'a T.t -> 'b T.t + + let refl {T: T1} (x : _ T.t) = x + let cast (eq : (_, _) eq) = eq {Id} + let lift (eq : (_, _) eq) {T : T1} {U : T1} = + let module TU = struct type 'a t = 'a T.t U.t end in eq {TU} + let symm (type a) (type b) (eq : (a, b) eq) = + let module R = struct type 'a t = ('a, a) eq end in + lift eq {R} {Id} refl + let trans ab bc {T : T1} x = + lift bc {T} {Id} (lift ab {T} {Id} x) +end;; diff --git a/testsuite/tests/typing-modular_implicits/leibniz_equality.ml.reference b/testsuite/tests/typing-modular_implicits/leibniz_equality.ml.reference new file mode 100644 index 0000000000..c4060db363 --- /dev/null +++ b/testsuite/tests/typing-modular_implicits/leibniz_equality.ml.reference @@ -0,0 +1,12 @@ + +# module type T1 = sig type _ t end +module Eq : + sig + type (_, _) eq + val refl : ('a, 'a) eq + val cast : ('a, 'b) eq -> 'a -> 'b + val lift : ('a, 'b) eq -> {T : T1} -> ('a T.t, 'b T.t) eq + val symm : ('a, 'b) eq -> ('b, 'a) eq + val trans : ('a, 'b) eq -> ('b, 'c) eq -> ('a, 'c) eq + end +# From 7f7f88f3506e7167089b3d4bff2c93db80bd3524 Mon Sep 17 00:00:00 2001 From: Leo White <lpw25@cl.cam.ac.uk> Date: Thu, 29 Oct 2015 22:23:48 +0000 Subject: [PATCH 451/494] Make implicit functors ordinary module types Allow definitions like: implicit module Foo {X : S} = struct ... end to be separated into module Foo {X : S} = struct ... end implicit F = Foo by treating `functor {X : S} -> T` as a proper module type distinguished from `functor (X : S) -> T`. --- .depend | 5 +- bytecomp/lambda.ml | 2 +- bytecomp/translmod.ml | 38 ++- debugger/eval.ml | 2 +- debugger/loadprinter.ml | 2 +- debugger/printval.ml | 2 +- ocamldoc/odoc_analyse.ml | 18 +- ocamldoc/odoc_ast.ml | 139 +++++++--- ocamldoc/odoc_cross.ml | 24 +- ocamldoc/odoc_env.ml | 9 +- ocamldoc/odoc_html.ml | 53 +++- ocamldoc/odoc_info.mli | 14 +- ocamldoc/odoc_latex.ml | 47 +++- ocamldoc/odoc_man.ml | 11 +- ocamldoc/odoc_misc.ml | 4 +- ocamldoc/odoc_module.ml | 14 +- ocamldoc/odoc_print.ml | 9 +- ocamldoc/odoc_sig.ml | 126 +++++---- ocamldoc/odoc_to_text.ml | 26 +- parsing/ast_helper.ml | 33 +-- parsing/ast_helper.mli | 11 +- parsing/ast_mapper.ml | 34 ++- parsing/asttypes.mli | 2 +- parsing/longident.ml | 6 +- parsing/longident.mli | 2 +- parsing/parser.mly | 114 ++++---- parsing/parsetree.mli | 25 +- parsing/pprintast.ml | 99 +++---- parsing/pprintast.mli | 6 +- parsing/printast.ml | 48 +++- .../arithmetic.ml.result | 28 -- .../coercion_arity_mismatch.ml.result | 9 - .../multiple_implicits.ml.result | 4 - tools/depend.ml | 32 ++- tools/eqparsetree.ml | 30 +- tools/ocamlprof.ml | 12 +- tools/tast_iter.ml | 27 +- tools/untypeast.ml | 33 ++- toplevel/genprintval.ml | 2 +- toplevel/opttoploop.ml | 2 +- toplevel/topdirs.ml | 8 +- toplevel/toploop.ml | 2 +- toplevel/trace.ml | 2 +- typing/btype.ml | 17 +- typing/btype.mli | 3 +- typing/ctype.ml | 6 +- typing/env.ml | 125 +++++---- typing/env.mli | 6 +- typing/implicitsearch.ml | 124 +++++---- typing/includemod.ml | 132 ++++++--- typing/includemod.mli | 15 +- typing/mtype.ml | 47 +++- typing/oprint.ml | 47 ++-- typing/outcometree.mli | 8 +- typing/path.ml | 20 +- typing/path.mli | 2 +- typing/printtyp.ml | 48 +++- typing/printtyped.ml | 53 +++- typing/subst.ml | 27 +- typing/typecore.ml | 27 +- typing/typecore.mli | 2 +- typing/typedtree.ml | 16 +- typing/typedtree.mli | 16 +- typing/typedtreeIter.ml | 26 +- typing/typedtreeMap.ml | 30 +- typing/typemod.ml | 256 ++++++++++++------ typing/typemod.mli | 7 +- typing/types.ml | 11 +- typing/types.mli | 7 +- typing/typetexp.ml | 4 +- 70 files changed, 1384 insertions(+), 814 deletions(-) delete mode 100644 testsuite/tests/typing-modular_implicits/arithmetic.ml.result delete mode 100644 testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml.result delete mode 100644 testsuite/tests/typing-modular_implicits/multiple_implicits.ml.result diff --git a/.depend b/.depend index 34dbe49304..38ffae7992 100644 --- a/.depend +++ b/.depend @@ -31,7 +31,7 @@ parsing/asttypes.cmi : parsing/location.cmi parsing/docstrings.cmi : parsing/parsetree.cmi parsing/location.cmi parsing/lexer.cmi : parsing/parser.cmi parsing/location.cmi parsing/location.cmi : utils/warnings.cmi -parsing/longident.cmi : +parsing/longident.cmi : parsing/asttypes.cmi parsing/parse.cmi : parsing/parsetree.cmi parsing/parser.cmi : parsing/parsetree.cmi parsing/location.cmi \ parsing/docstrings.cmi @@ -67,7 +67,8 @@ parsing/location.cmo : utils/warnings.cmi utils/terminfo.cmi \ parsing/location.cmi parsing/location.cmx : utils/warnings.cmx utils/terminfo.cmx \ parsing/location.cmi -parsing/longident.cmo : utils/misc.cmi parsing/longident.cmi +parsing/longident.cmo : utils/misc.cmi parsing/asttypes.cmi \ + parsing/longident.cmi parsing/longident.cmx : utils/misc.cmx parsing/longident.cmi parsing/parse.cmo : parsing/syntaxerr.cmi parsing/parser.cmi \ parsing/location.cmi parsing/lexer.cmi parsing/docstrings.cmi \ diff --git a/bytecomp/lambda.ml b/bytecomp/lambda.ml index d32ac4fbf0..237d41f8ac 100644 --- a/bytecomp/lambda.ml +++ b/bytecomp/lambda.ml @@ -440,7 +440,7 @@ let rec transl_normal_path = function if Ident.global id then Lprim(Pgetglobal id, []) else Lvar id | Pdot(p, s, pos) -> Lprim(Pfield pos, [transl_normal_path p]) - | Papply(p1, p2) -> + | Papply(p1, p2, i) -> fatal_error "Lambda.transl_path" (* Translation of value identifiers *) diff --git a/bytecomp/translmod.ml b/bytecomp/translmod.ml index d3c6ca2b04..9d0ed1dda4 100644 --- a/bytecomp/translmod.ml +++ b/bytecomp/translmod.ml @@ -34,10 +34,16 @@ exception Error of Location.t * error currently compiled module expression). Useful for naming extensions. *) let global_path glob = Some(Pident glob) + let functor_path path param = - match path with - None -> None - | Some p -> Some(Papply(p, Pident param)) + match path, param with + | None, _ -> None + | Some p, Tmpar_generative -> Some p + | Some p, Tmpar_applicative(id, _, _) -> + Some(Papply(p, Pident id, Nonimplicit)) + | Some p, Tmpar_implicit(id, _, _) -> + Some(Papply(p, Pident id, Implicit)) + let field_path path field = match path with None -> None @@ -201,7 +207,7 @@ let init_shape modl = Const_block (1, [Const_pointer 0]) | Mty_signature sg -> Const_block(0, [Const_block(0, init_shape_struct env sg)]) - | Mty_functor(id, arg, res) -> + | Mty_functor _ -> raise Not_found (* can we do better? *) and init_shape_struct env sg = match sg with @@ -335,8 +341,14 @@ let rec transl_module cc rootpath mexp = (transl_path ~loc:mexp.mod_loc mexp.mod_env path) | Tmod_structure str -> transl_struct [] cc rootpath str - | Tmod_functor( param, _, mty, body) -> + | Tmod_functor(param, body) -> let bodypath = functor_path rootpath param in + let param = + match param with + | Tmpar_generative -> Ident.create "()" + | Tmpar_applicative(id, _, _) -> id + | Tmpar_implicit(id, _, _) -> id + in oo_wrap mexp.mod_env true (function | Tcoerce_none -> @@ -351,11 +363,17 @@ let rec transl_module cc rootpath mexp = | _ -> fatal_error "Translmod.transl_module") cc - | Tmod_apply(funct, arg, ccarg) -> - oo_wrap mexp.mod_env true - (apply_coercion Strict cc) - (Lapply(transl_module Tcoerce_none None funct, - [transl_module ccarg None arg], mexp.mod_loc)) + | Tmod_apply(funct, arg) -> + let arg = + match arg with + | Tmarg_generative -> lambda_unit + | Tmarg_applicative(arg, ccarg) | Tmarg_implicit(arg, ccarg) -> + transl_module ccarg None arg + in + oo_wrap mexp.mod_env true + (apply_coercion Strict cc) + (Lapply(transl_module Tcoerce_none None funct, + [arg], mexp.mod_loc)) | Tmod_constraint(arg, mty, _, ccarg) -> transl_module (compose_coercions cc ccarg) rootpath arg | Tmod_unpack(arg, _) -> diff --git a/debugger/eval.ml b/debugger/eval.ml index 1d1ab38865..98b8e26271 100644 --- a/debugger/eval.ml +++ b/debugger/eval.ml @@ -63,7 +63,7 @@ let rec path event = function if not (Debugcom.Remote_value.is_block v) then raise(Error(Not_initialized_yet root)); Debugcom.Remote_value.field v pos - | Papply(p1, p2) -> + | Papply(p1, p2, i) -> fatal_error "Eval.path: Papply" let rec expression event env = function diff --git a/debugger/loadprinter.ml b/debugger/loadprinter.ml index 98e79d7963..0e3eda7a5e 100644 --- a/debugger/loadprinter.ml +++ b/debugger/loadprinter.ml @@ -89,7 +89,7 @@ let loadfile ppf name = let rec eval_path = function Pident id -> Symtable.get_global_value id | Pdot(p, s, pos) -> Obj.field (eval_path p) pos - | Papply(p1, p2) -> fatal_error "Loadprinter.eval_path" + | Papply(p1, p2, i) -> fatal_error "Loadprinter.eval_path" (* Install, remove a printer (as in toplevel/topdirs) *) diff --git a/debugger/printval.ml b/debugger/printval.ml index 5170ef3b24..277a966d17 100644 --- a/debugger/printval.ml +++ b/debugger/printval.ml @@ -59,7 +59,7 @@ module EvalPath = if not (Debugcom.Remote_value.is_block v) then raise Error else Debugcom.Remote_value.field v pos - | Papply(p1, p2) -> + | Papply(p1, p2, i) -> raise Error let same_value = Debugcom.Remote_value.same end diff --git a/ocamldoc/odoc_analyse.ml b/ocamldoc/odoc_analyse.ml index fd69b0a74d..87948e5453 100644 --- a/ocamldoc/odoc_analyse.ml +++ b/ocamldoc/odoc_analyse.ml @@ -346,9 +346,10 @@ and remove_module_elements_between_stop_in_module_kind k = | Odoc_module.Module_alias _ -> k | Odoc_module.Module_functor (params, k2) -> Odoc_module.Module_functor (params, remove_module_elements_between_stop_in_module_kind k2) - | Odoc_module.Module_apply (k1, k2) -> - Odoc_module.Module_apply (remove_module_elements_between_stop_in_module_kind k1, - remove_module_elements_between_stop_in_module_kind k2) + | Odoc_module.Module_apply (k, a) -> + Odoc_module.Module_apply + (remove_module_elements_between_stop_in_module_kind k, + remove_module_elements_between_stop_in_module_argument a) | Odoc_module.Module_with (mtkind, s) -> Odoc_module.Module_with (remove_module_elements_between_stop_in_module_type_kind mtkind, s) | Odoc_module.Module_constraint (k2, mtkind) -> @@ -357,6 +358,17 @@ and remove_module_elements_between_stop_in_module_kind k = | Odoc_module.Module_typeof _ -> k | Odoc_module.Module_unpack _ -> k +(** Remove the module elements between the stop special comment, in the given module argument. *) +and remove_module_elements_between_stop_in_module_argument a = + match a with + | Odoc_module.Ma_generative -> a + | Odoc_module.Ma_applicative k -> + Odoc_module.Ma_applicative + (remove_module_elements_between_stop_in_module_kind k) + | Odoc_module.Ma_implicit k -> + Odoc_module.Ma_implicit + (remove_module_elements_between_stop_in_module_kind k) + (** Remove the module elements between the stop special comment, in the given module type kind. *) and remove_module_elements_between_stop_in_module_type_kind tk = match tk with diff --git a/ocamldoc/odoc_ast.ml b/ocamldoc/odoc_ast.ml index d8e0952dcb..21ee215410 100644 --- a/ocamldoc/odoc_ast.ml +++ b/ocamldoc/odoc_ast.ml @@ -1734,69 +1734,76 @@ module Analyser = let elements2 = replace_dummy_included_modules elements included_modules_from_tt in { m_base with m_kind = Module_struct elements2 } - | (Parsetree.Pmod_functor (_, pmodule_type, p_module_expr2), - Typedtree.Tmod_functor (ident, _, mtyp, tt_module_expr2)) -> - let loc = match pmodule_type with None -> Location.none - | Some pmty -> pmty.Parsetree.pmty_loc in - let loc_start = loc.Location.loc_start.Lexing.pos_cnum in - let loc_end = loc.Location.loc_end.Lexing.pos_cnum in - let mp_type_code = get_string_of_file loc_start loc_end in - print_DEBUG (Printf.sprintf "mp_type_code=%s" mp_type_code); - let mp_name = Name.from_ident ident in - let mp_kind = - match pmodule_type, mtyp with - Some pmty, Some mty -> - Sig.analyse_module_type_kind env current_module_name pmty - mty.mty_type - | _ -> Module_type_struct [] - in + | (Parsetree.Pmod_functor (p_module_param, p_module_expr), + Typedtree.Tmod_functor (tt_module_param, tt_module_expr)) -> let param = - { - mp_name = mp_name ; - mp_type = Misc.may_map - (fun m -> Odoc_env.subst_module_type env m.mty_type) mtyp ; - mp_type_code = mp_type_code ; - mp_kind = mp_kind ; - } + analyse_module_param + env + current_module_name + p_module_param + tt_module_param in let dummy_complete_name = (*Name.concat "__"*) param.mp_name in (* TODO: A VOIR CE __ *) let new_env = Odoc_env.add_module env dummy_complete_name in - let m_base2 = analyse_module + let m_base = analyse_module new_env current_module_name module_name None - p_module_expr2 - tt_module_expr2 + p_module_expr + tt_module_expr in - let kind = m_base2.m_kind in + let kind = m_base.m_kind in { m_base with m_kind = Module_functor (param, kind) } - | (Parsetree.Pmod_apply (p_module_expr1, p_module_expr2), - Typedtree.Tmod_apply (tt_module_expr1, tt_module_expr2, _)) - | (Parsetree.Pmod_apply (p_module_expr1, p_module_expr2), + | (Parsetree.Pmod_apply (p_module_expr, p_module_arg), + Typedtree.Tmod_apply (tt_module_expr, tt_module_arg)) + | (Parsetree.Pmod_apply (p_module_expr, p_module_arg), Typedtree.Tmod_constraint - ({ Typedtree.mod_desc = Typedtree.Tmod_apply (tt_module_expr1, tt_module_expr2, _)}, _, + ({ Typedtree.mod_desc = Typedtree.Tmod_apply (tt_module_expr, tt_module_arg)}, _, _, _) ) -> - let m1 = analyse_module + let m = analyse_module env current_module_name module_name None - p_module_expr1 - tt_module_expr1 + p_module_expr + tt_module_expr in - let m2 = analyse_module - env - current_module_name - module_name - None - p_module_expr2 - tt_module_expr2 + let ma = + match p_module_arg, tt_module_arg with + | Parsetree.Pmarg_generative, Tmarg_generative -> + Ma_generative + | Parsetree.Pmarg_applicative p_module_expr, + Tmarg_applicative(tt_module_expr, _) -> + let m = + analyse_module + env + current_module_name + module_name + None + p_module_expr + tt_module_expr + in + Ma_applicative m.m_kind + | Parsetree.Pmarg_implicit p_module_expr, + Tmarg_implicit(tt_module_expr, _) -> + let m = + analyse_module + env + current_module_name + module_name + None + p_module_expr + tt_module_expr + in + Ma_implicit m.m_kind + | _, _ -> + raise (Failure "analyse_module: Parsetree and typedtree don't match.") in - { m_base with m_kind = Module_apply (m1.m_kind, m2.m_kind) } + { m_base with m_kind = Module_apply (m.m_kind, ma) } | (Parsetree.Pmod_constraint (p_module_expr2, p_modtype), Typedtree.Tmod_constraint (tt_module_expr2, tt_modtype, _, _)) -> @@ -1888,6 +1895,54 @@ module Analyser = raise (Failure "analyse_module: parsetree and typedtree don't match.") + (** Analyse a Parsetree.module_parameter and a Types.module_parameter to + return a module_parameter. *) + and analyse_module_param env current_module_name p_module_param tt_module_param = + let loc = + match p_module_param with + | Parsetree.Pmpar_generative -> Location.none + | Parsetree.Pmpar_applicative(_, pmty) + | Parsetree.Pmpar_implicit(_, pmty) -> + pmty.Parsetree.pmty_loc + in + let loc_start = loc.Location.loc_start.Lexing.pos_cnum in + let loc_end = loc.Location.loc_end.Lexing.pos_cnum in + let mp_type_code = get_string_of_file loc_start loc_end in + print_DEBUG (Printf.sprintf "mp_type_code=%s" mp_type_code); + let mp_name = + match tt_module_param with + | Typedtree.Tmpar_generative -> "()" + | Typedtree.Tmpar_applicative(ident,_, _) + | Typedtree.Tmpar_implicit(ident, _, _) -> + Name.from_ident ident + in + let mp_kind = + match p_module_param, tt_module_param with + | Parsetree.Pmpar_generative, Tmpar_generative -> + Module_type_struct [] + | Parsetree.Pmpar_applicative(_, pmty), Tmpar_applicative(_, _, mty) + | Parsetree.Pmpar_implicit(_, pmty), Tmpar_implicit(_, _, mty) -> + Sig.analyse_module_type_kind env current_module_name + pmty mty.mty_type + | _, _ -> + raise (Failure "analyse_module_param: parsetree and typedtree don't match.") + in + let mp_type = + match tt_module_param with + | Tmpar_generative -> Mp_generative + | Tmpar_applicative(_, _, mty) -> + Mp_applicative (Odoc_env.subst_module_type env mty.mty_type) + | Tmpar_implicit(_, _, mty) -> + Mp_implicit (Odoc_env.subst_module_type env mty.mty_type) + in + { + mp_name = mp_name ; + mp_type = mp_type ; + mp_type_code = mp_type_code ; + mp_kind = mp_kind ; + } + + let analyse_typed_tree source_file input_file (parsetree : Parsetree.structure) (typedtree : typedtree) = let (tree_structure, _) = typedtree in diff --git a/ocamldoc/odoc_cross.ml b/ocamldoc/odoc_cross.ml index 28e6ae5bf2..981fc37034 100644 --- a/ocamldoc/odoc_cross.ml +++ b/ocamldoc/odoc_cross.ml @@ -375,9 +375,13 @@ let rec associate_in_module module_list (acc_b_modif, acc_incomplete_top_module_ mt_is_interface = false ; mt_file = ""; mt_kind = Some tk ; mt_loc = Odoc_types.dummy_loc } - | Module_apply (k1, k2) -> - let (acc_b2, acc_inc2, acc_names2) = iter_kind (acc_b, acc_inc, acc_names) k1 in - iter_kind (acc_b2, acc_inc2, acc_names2) k2 + | Module_apply (k, a) -> begin + let (acc_b2, acc_inc2, acc_names2) = iter_kind (acc_b, acc_inc, acc_names) k in + match a with + | Ma_generative -> (acc_b2, acc_inc2, acc_names2) + | Ma_applicative k | Ma_implicit k -> + iter_kind (acc_b2, acc_inc2, acc_names2) k + end | Module_constraint (k, tk) -> let (acc_b2, acc_inc2, acc_names2) = iter_kind (acc_b, acc_inc, acc_names) k in @@ -898,9 +902,9 @@ and assoc_comments_module_kind parent_name module_list mk = | Module_alias _ | Module_functor _ -> mk - | Module_apply (mk1, mk2) -> - Module_apply (assoc_comments_module_kind parent_name module_list mk1, - assoc_comments_module_kind parent_name module_list mk2) + | Module_apply (mk, ma) -> + Module_apply (assoc_comments_module_kind parent_name module_list mk, + assoc_comments_module_argument parent_name module_list ma) | Module_with (mtk, s) -> Module_with (assoc_comments_module_type_kind parent_name module_list mtk, s) | Module_constraint (mk1, mtk) -> @@ -910,6 +914,14 @@ and assoc_comments_module_kind parent_name module_list mk = | Module_typeof _ -> mk | Module_unpack _ -> mk +and assoc_comments_module_argument parent_name module_list ma = + match ma with + | Ma_generative -> ma + | Ma_applicative mk -> + Ma_applicative (assoc_comments_module_kind parent_name module_list mk) + | Ma_implicit mk -> + Ma_implicit (assoc_comments_module_kind parent_name module_list mk) + and assoc_comments_module_type_kind parent_name module_list mtk = match mtk with | Module_type_struct eles -> diff --git a/ocamldoc/odoc_env.ml b/ocamldoc/odoc_env.ml index 3e05905856..83f59677f3 100644 --- a/ocamldoc/odoc_env.ml +++ b/ocamldoc/odoc_env.ml @@ -223,8 +223,13 @@ let subst_module_type env t = | Types.Mty_alias _ | Types.Mty_signature _ -> t - | Types.Mty_functor (id, mt1, mt2) -> - Types.Mty_functor (id, Misc.may_map iter mt1, iter mt2) + | Types.Mty_functor (mp, mt) -> + Types.Mty_functor (iter_param mp, iter mt) + and iter_param p = + match p with + | Types.Mpar_generative -> Types.Mpar_generative + | Types.Mpar_applicative(id, mt) -> Types.Mpar_applicative(id, iter mt) + | Types.Mpar_implicit(id, mt) -> Types.Mpar_implicit(id, iter mt) in iter t diff --git a/ocamldoc/odoc_html.ml b/ocamldoc/odoc_html.ml index 9ed06c0f09..ddbbfbcf44 100644 --- a/ocamldoc/odoc_html.ml +++ b/ocamldoc/odoc_html.ml @@ -1296,13 +1296,20 @@ class html = self#html_of_module_kind b father ?modu k; if not !html_short_functors then bs b "</div>" - | Module_apply (k1, k2) -> + | Module_apply (k, a) -> (* TODO: l'application n'est pas correcte dans un .mli. Que faire ? -> afficher le module_type du typedtree *) - self#html_of_module_kind b father k1; - self#html_of_text b [Code "("]; - self#html_of_module_kind b father k2; - self#html_of_text b [Code ")"] + self#html_of_module_kind b father k; + (match a with + | Ma_generative -> self#html_of_text b [Code "()"] + | Ma_applicative k -> + self#html_of_text b [Code "("]; + self#html_of_module_kind b father k; + self#html_of_text b [Code ")"] + | Ma_implicit k -> + self#html_of_text b [Code "{"]; + self#html_of_module_kind b father k; + self#html_of_text b [Code "}"]) | Module_with (k, s) -> (* TODO: modify when Module_with will be more detailed *) self#html_of_module_type_kind b father ?modu k; @@ -1336,14 +1343,28 @@ class html = else "functor ", "-> " in - self#html_of_text b - [ - Code (s_functor^"("); - Code p.mp_name ; - Code " : "; - ] ; - self#html_of_module_type_kind b father p.mp_kind; - self#html_of_text b [ Code (") "^s_arrow)] + self#html_of_text b [Code s_functor]; + (match p.mp_type with + | Mp_generative -> self#html_of_text b [Code "()"] + | Mp_applicative _ -> + self#html_of_text b + [ + Code "("; + Code p.mp_name ; + Code " : "; + ] ; + self#html_of_module_type_kind b father p.mp_kind; + self#html_of_text b [ Code (") ")] + | Mp_implicit _ -> + self#html_of_text b + [ + Code "{"; + Code p.mp_name ; + Code " : "; + ] ; + self#html_of_module_type_kind b father p.mp_kind; + self#html_of_text b [ Code ("} ")]); + self#html_of_text b [Code s_arrow]; method html_of_module_element b m_name ele = match ele with @@ -1410,8 +1431,10 @@ class html = (** Print html code to display the type of a module parameter.. *) method html_of_module_parameter_type b m_name p = - match p.mp_type with None -> bs b "<code>()</code>" - | Some mty -> self#html_of_module_type b m_name ~code: p.mp_type_code mty + match p.mp_type with + | Mp_generative -> bs b "<code>()</code>" + | Mp_applicative mty | Mp_implicit mty -> + self#html_of_module_type b m_name ~code: p.mp_type_code mty (** Generate a file containing the module type in the given file name. *) method output_module_type in_title file mtyp = diff --git a/ocamldoc/odoc_info.mli b/ocamldoc/odoc_info.mli index 9af83c194b..e37981d850 100644 --- a/ocamldoc/odoc_info.mli +++ b/ocamldoc/odoc_info.mli @@ -489,18 +489,28 @@ module Module : and module_parameter = Odoc_module.module_parameter = { mp_name : string ; (** the name *) - mp_type : Types.module_type option ; (** the type *) + mp_type : module_parameter_type ; (** the type *) mp_type_code : string ; (** the original code *) mp_kind : module_type_kind ; (** the way the parameter was built *) } + and module_parameter_type = Odoc_module.module_parameter_type = + | Mp_generative + | Mp_applicative of Types.module_type + | Mp_implicit of Types.module_type + + and module_argument = Odoc_module.module_argument = + | Ma_generative + | Ma_applicative of module_kind + | Ma_implicit of module_kind + (** Different kinds of a module. *) and module_kind = Odoc_module.module_kind = | Module_struct of module_element list (** A complete module structure. *) | Module_alias of module_alias (** Complete name and corresponding module if we found it *) | Module_functor of module_parameter * module_kind (** A functor, with its parameter and the rest of its definition *) - | Module_apply of module_kind * module_kind + | Module_apply of module_kind * module_argument (** A module defined by application of a functor. *) | Module_with of module_type_kind * string (** A module whose type is a with ... constraint. diff --git a/ocamldoc/odoc_latex.ml b/ocamldoc/odoc_latex.ml index d0ef4310bb..90b6c2e04d 100644 --- a/ocamldoc/odoc_latex.ml +++ b/ocamldoc/odoc_latex.ml @@ -751,14 +751,28 @@ class latex = (to_text#text_of_exception e)) method latex_of_module_parameter fmt m_name p = - self#latex_of_text fmt - [ - Code "functor ("; - Code p.mp_name ; - Code " : "; - ] ; - self#latex_of_module_type_kind fmt m_name p.mp_kind; - self#latex_of_text fmt [ Code ") -> "] + self#latex_of_text fmt [Code "functor "]; + (match p.mp_type with + | Mp_generative -> self#latex_of_text fmt [Code "()"] + | Mp_applicative _ -> + self#latex_of_text fmt + [ + Code "functor ("; + Code p.mp_name ; + Code " : "; + ] ; + self#latex_of_module_type_kind fmt m_name p.mp_kind; + self#latex_of_text fmt [Code ")"] + | Mp_implicit _ -> + self#latex_of_text fmt + [ + Code "functor {"; + Code p.mp_name ; + Code " : "; + ] ; + self#latex_of_module_type_kind fmt m_name p.mp_kind; + self#latex_of_text fmt [Code "}"]); + self#latex_of_text fmt [ Code " -> "] method latex_of_module_type_kind fmt father kind = @@ -797,13 +811,20 @@ class latex = | Module_functor (p, k) -> self#latex_of_module_parameter fmt father p; self#latex_of_module_kind fmt father k - | Module_apply (k1, k2) -> + | Module_apply (k, a) -> (* TODO: l'application n'est pas correcte dans un .mli. Que faire ? -> afficher le module_type du typedtree *) - self#latex_of_module_kind fmt father k1; - self#latex_of_text fmt [Code "("]; - self#latex_of_module_kind fmt father k2; - self#latex_of_text fmt [Code ")"] + self#latex_of_module_kind fmt father k; + (match a with + | Ma_generative -> self#latex_of_text fmt [Code "()"] + | Ma_applicative k -> + self#latex_of_text fmt [Code "("]; + self#latex_of_module_kind fmt father k; + self#latex_of_text fmt [Code ")"] + | Ma_implicit k -> + self#latex_of_text fmt [Code "{"]; + self#latex_of_module_kind fmt father k; + self#latex_of_text fmt [Code "}"]) | Module_with (k, s) -> (* TODO: a modifier quand Module_with sera plus detaille *) self#latex_of_module_type_kind fmt father k; diff --git a/ocamldoc/odoc_man.ml b/ocamldoc/odoc_man.ml index e97db4bc5b..97b7735cc9 100644 --- a/ocamldoc/odoc_man.ml +++ b/ocamldoc/odoc_man.ml @@ -721,8 +721,15 @@ class man = List.iter (fun (p, desc_opt) -> bs b ".sp\n"; - bs b ("\""^p.mp_name^"\"\n"); - Misc.may (self#man_of_module_type b m_name) p.mp_type; + (match p.mp_type with + | Mp_generative -> + bs b ("\"()\"\n"); + | Mp_applicative mty -> + bs b ("\""^p.mp_name^"\"\n"); + self#man_of_module_type b m_name mty + | Mp_implicit mty -> + bs b ("\""^p.mp_name^"\"\n"); + self#man_of_module_type b m_name mty); bs b "\n"; ( match desc_opt with diff --git a/ocamldoc/odoc_misc.ml b/ocamldoc/odoc_misc.ml index f2420fb8d2..9137ebfafe 100644 --- a/ocamldoc/odoc_misc.ml +++ b/ocamldoc/odoc_misc.ml @@ -73,8 +73,10 @@ let rec string_of_longident li = match li with | Longident.Lident s -> s | Longident.Ldot(li, s) -> string_of_longident li ^ "." ^ s - | Longident.Lapply(l1, l2) -> + | Longident.Lapply(l1, l2, Asttypes.Nonimplicit) -> string_of_longident l1 ^ "(" ^ string_of_longident l2 ^ ")" + | Longident.Lapply(l1, l2, Asttypes.Implicit) -> + string_of_longident l1 ^ "{" ^ string_of_longident l2 ^ "}" let get_fields type_expr = let (fields, _) = Ctype.flatten_fields (Ctype.object_fields type_expr) in diff --git a/ocamldoc/odoc_module.ml b/ocamldoc/odoc_module.ml index 9ed2b17717..37d42e30e4 100644 --- a/ocamldoc/odoc_module.ml +++ b/ocamldoc/odoc_module.ml @@ -47,17 +47,27 @@ and module_alias = { and module_parameter = { mp_name : string ; (** the name *) - mp_type : Types.module_type option ; (** the type *) + mp_type : module_parameter_type ; (** the type *) mp_type_code : string ; (** the original code *) mp_kind : module_type_kind ; (** the way the parameter was built *) } +and module_parameter_type = + | Mp_generative + | Mp_applicative of Types.module_type + | Mp_implicit of Types.module_type + +and module_argument = + | Ma_generative + | Ma_applicative of module_kind + | Ma_implicit of module_kind + (** Different kinds of module. *) and module_kind = | Module_struct of module_element list | Module_alias of module_alias (** complete name and corresponding module if we found it *) | Module_functor of module_parameter * module_kind - | Module_apply of module_kind * module_kind + | Module_apply of module_kind * module_argument | Module_with of module_type_kind * string | Module_constraint of module_kind * module_type_kind | Module_typeof of string (** by now only the code of the module expression *) diff --git a/ocamldoc/odoc_print.ml b/ocamldoc/odoc_print.ml index 56a85e5fda..b3f172ed2e 100644 --- a/ocamldoc/odoc_print.ml +++ b/ocamldoc/odoc_print.ml @@ -58,8 +58,13 @@ let simpl_module_type ?code t = None -> Types.Mty_signature [] | Some s -> raise (Use_code s) ) - | Types.Mty_functor (id, mt1, mt2) -> - Types.Mty_functor (id, Misc.may_map iter mt1, iter mt2) + | Types.Mty_functor (mp, mt) -> + Types.Mty_functor (iter_param mp, iter mt) + and iter_param p = + match p with + | Types.Mpar_generative -> Types.Mpar_generative + | Types.Mpar_applicative(id, mt) -> Types.Mpar_applicative(id, iter mt) + | Types.Mpar_implicit(id, mt) -> Types.Mpar_implicit(id, iter mt) in iter t diff --git a/ocamldoc/odoc_sig.ml b/ocamldoc/odoc_sig.ml index f5f19d63c5..32462b95f1 100644 --- a/ocamldoc/odoc_sig.ml +++ b/ocamldoc/odoc_sig.ml @@ -1245,39 +1245,23 @@ module Analyser = raise (Failure "Parsetree.Pmty_signature signature but not Types.Mty_signature signat") ) - | Parsetree.Pmty_functor (_, pmodule_type2, module_type2) -> + | Parsetree.Pmty_functor (pmodule_param, pmodule_type) -> ( - let loc = match pmodule_type2 with None -> Location.none - | Some pmty -> pmty.Parsetree.pmty_loc in - let loc_start = loc.Location.loc_start.Lexing.pos_cnum in - let loc_end = loc.Location.loc_end.Lexing.pos_cnum in - let mp_type_code = get_string_of_file loc_start loc_end in - print_DEBUG (Printf.sprintf "mp_type_code=%s" mp_type_code); - match sig_module_type with - Types.Mty_functor (ident, param_module_type, body_module_type) -> - let mp_kind = - match pmodule_type2, param_module_type with - Some pmty, Some mty -> - analyse_module_type_kind env current_module_name pmty mty - | _ -> Module_type_struct [] - in - let param = - { - mp_name = Name.from_ident ident ; - mp_type = - Misc.may_map (Odoc_env.subst_module_type env) - param_module_type; - mp_type_code = mp_type_code ; - mp_kind = mp_kind ; - } - in - let k = analyse_module_type_kind ~erased env - current_module_name - module_type2 - body_module_type - in - Module_type_functor (param, k) - + match sig_module_type with + | Types.Mty_functor (module_param, module_type) -> + let param = + analyse_module_param env + current_module_name + pmodule_param + module_param + in + let k = + analyse_module_type_kind ~erased env + current_module_name + pmodule_type + module_type + in + Module_type_functor (param, k) | _ -> (* if we're here something's wrong *) raise (Failure "Parsetree.Pmty_functor _ but not Types.Mty_functor _") @@ -1338,35 +1322,20 @@ module Analyser = (* if we're here something's wrong *) raise (Failure "Parsetree.Pmty_signature signature but not Types.Mty_signature signat") ) - | Parsetree.Pmty_functor (_, pmodule_type2,module_type2) (* of string * module_type * module_type *) -> + | Parsetree.Pmty_functor (pmodule_param, pmodule_type) (* of string * module_type * module_type *) -> ( match sig_module_type with - Types.Mty_functor (ident, param_module_type, body_module_type) -> - let loc = match pmodule_type2 with None -> Location.none - | Some pmty -> pmty.Parsetree.pmty_loc in - let loc_start = loc.Location.loc_start.Lexing.pos_cnum in - let loc_end = loc.Location.loc_end.Lexing.pos_cnum in - let mp_type_code = get_string_of_file loc_start loc_end in - print_DEBUG (Printf.sprintf "mp_type_code=%s" mp_type_code); - let mp_kind = - match pmodule_type2, param_module_type with - Some pmty, Some mty -> - analyse_module_type_kind env current_module_name pmty mty - | _ -> Module_type_struct [] - in + Types.Mty_functor (module_param, module_type) -> let param = - { - mp_name = Name.from_ident ident ; - mp_type = Misc.may_map - (Odoc_env.subst_module_type env) param_module_type ; - mp_type_code = mp_type_code ; - mp_kind = mp_kind ; - } + analyse_module_param env + current_module_name + pmodule_param + module_param in let k = analyse_module_kind ~erased env current_module_name - module_type2 - body_module_type + pmodule_type + module_type in Module_functor (param, k) @@ -1392,6 +1361,53 @@ module Analyser = | Parsetree.Pmty_extension _ -> assert false + (** Analyse a Parsetree.module_parameter and a Types.module_parameter to + return a module_parameter. *) + and analyse_module_param env current_module_name parse_module_param sig_module_param = + let loc = + match parse_module_param with + | Parsetree.Pmpar_generative -> Location.none + | Parsetree.Pmpar_applicative(_, pmty) + | Parsetree.Pmpar_implicit(_, pmty) -> + pmty.Parsetree.pmty_loc + in + let loc_start = loc.Location.loc_start.Lexing.pos_cnum in + let loc_end = loc.Location.loc_end.Lexing.pos_cnum in + let mp_type_code = get_string_of_file loc_start loc_end in + print_DEBUG (Printf.sprintf "mp_type_code=%s" mp_type_code); + let mp_name = + match sig_module_param with + | Mpar_generative -> "()" + | Mpar_applicative(ident, _) | Mpar_implicit(ident, _) -> + Name.from_ident ident + in + let mp_kind = + match parse_module_param, sig_module_param with + | Parsetree.Pmpar_generative, Mpar_generative -> + Module_type_struct [] + | Parsetree.Pmpar_applicative(_, pmty), Mpar_applicative(_, mty) + | Parsetree.Pmpar_implicit(_, pmty), Mpar_implicit(_, mty) -> + analyse_module_type_kind env current_module_name + pmty mty + | _, _ -> + (* if we're here something's wrong *) + raise (Failure "analyse_module_param mismatch") + + in + let mp_type = + match sig_module_param with + | Mpar_generative -> Mp_generative + | Mpar_applicative(_, mty) -> + Mp_applicative (Odoc_env.subst_module_type env mty) + | Mpar_implicit(_, mty) -> + Mp_implicit (Odoc_env.subst_module_type env mty) + in + { + mp_name = mp_name ; + mp_type = mp_type ; + mp_type_code = mp_type_code ; + mp_kind = mp_kind ; + } (** Analyse of a Parsetree.class_type and a Types.class_type to return a couple (class parameters, class_kind).*) diff --git a/ocamldoc/odoc_to_text.ml b/ocamldoc/odoc_to_text.ml index 1c7f6ba7fb..bb72238d76 100644 --- a/ocamldoc/odoc_to_text.ml +++ b/ocamldoc/odoc_to_text.ml @@ -435,8 +435,12 @@ class virtual to_text = List (List.map (fun (p, desc_opt) -> - begin match p.mp_type with None -> [Raw ""] - | Some mty -> + begin match p.mp_type with + | Mp_generative -> [Raw ""] + | Mp_applicative mty -> + [Code (p.mp_name^" : ")] @ + (self#text_of_module_type mty) + | Mp_implicit mty -> [Code (p.mp_name^" : ")] @ (self#text_of_module_type mty) end @ @@ -534,13 +538,19 @@ class virtual to_text = | Some (Modtype mt) -> [Code ((if with_def_syntax then " = " else "")^mt.mt_name)] ) - | Module_apply (k1, k2) -> + | Module_apply (k, a) -> (if with_def_syntax then [Code " = "] else []) @ - (self#text_of_module_kind ~with_def_syntax: false k1) @ - [Code " ( "] @ - (self#text_of_module_kind ~with_def_syntax: false k2) @ - [Code " ) "] - + (self#text_of_module_kind ~with_def_syntax: false k) @ + (match a with + | Ma_generative -> [Code " () "] + | Ma_applicative k -> + [Code " ( "] @ + (self#text_of_module_kind ~with_def_syntax: false k) @ + [Code " ) "] + | Ma_implicit k -> + [Code " { "] @ + (self#text_of_module_kind ~with_def_syntax: false k) @ + [Code " } "]) | Module_with (tk, code) -> (if with_def_syntax then [Code " : "] else []) @ (self#text_of_module_type_kind ~with_def_syntax: false tk) @ diff --git a/parsing/ast_helper.ml b/parsing/ast_helper.ml index b304d70f0d..30c87223a2 100644 --- a/parsing/ast_helper.ml +++ b/parsing/ast_helper.ml @@ -133,7 +133,7 @@ module Mty = struct let ident ?loc ?attrs a = mk ?loc ?attrs (Pmty_ident a) let alias ?loc ?attrs a = mk ?loc ?attrs (Pmty_alias a) let signature ?loc ?attrs a = mk ?loc ?attrs (Pmty_signature a) - let functor_ ?loc ?attrs a b c = mk ?loc ?attrs (Pmty_functor (a, b, c)) + let functor_ ?loc ?attrs a b = mk ?loc ?attrs (Pmty_functor (a, b)) let with_ ?loc ?attrs a b = mk ?loc ?attrs (Pmty_with (a, b)) let typeof_ ?loc ?attrs a = mk ?loc ?attrs (Pmty_typeof a) let extension ?loc ?attrs a = mk ?loc ?attrs (Pmty_extension a) @@ -146,12 +146,13 @@ let mk ?(loc = !default_loc) ?(attrs = []) d = let ident ?loc ?attrs x = mk ?loc ?attrs (Pmod_ident x) let structure ?loc ?attrs x = mk ?loc ?attrs (Pmod_structure x) - let functor_ ?loc ?attrs arg arg_ty body = - mk ?loc ?attrs (Pmod_functor (arg, arg_ty, body)) - let apply ?loc ?attrs m1 m2 = mk ?loc ?attrs (Pmod_apply (m1, m2)) + let functor_ ?loc ?attrs param body = + mk ?loc ?attrs (Pmod_functor (param, body)) + let apply ?loc ?attrs m marg = mk ?loc ?attrs (Pmod_apply (m, marg)) let constraint_ ?loc ?attrs m mty = mk ?loc ?attrs (Pmod_constraint (m, mty)) let unpack ?loc ?attrs e = mk ?loc ?attrs (Pmod_unpack e) let extension ?loc ?attrs a = mk ?loc ?attrs (Pmod_extension a) + end module Sig = struct @@ -298,8 +299,8 @@ module Val = struct end module Md = struct - let mk ?(loc = !default_loc) ?(attrs = []) ?(implicit_ = Nonimplicit) - ?(docs = empty_docs) ?(text = []) name typ = + let mk ?(loc = !default_loc) ?(attrs = []) + ?(docs = empty_docs) ?(text = []) ?(implicit_ = Nonimplicit) name typ = { pmd_name = name; pmd_type = typ; @@ -309,13 +310,6 @@ module Md = struct pmd_implicit = implicit_; } - let implicit_ ?loc ?attrs name params mty = - let mty = List.fold_right - (fun (name,mty) acc -> - Mty.mk ?loc (Pmty_functor(name, Some mty, acc))) - params mty - in - mk ?loc ?attrs ~implicit_:(Implicit (List.length params)) name mty end module Mtd = struct @@ -331,8 +325,8 @@ module Mtd = struct end module Mb = struct - let mk ?(loc = !default_loc) ?(attrs = []) ?(implicit_ = Nonimplicit) - ?(docs = empty_docs) ?(text = []) name expr = + let mk ?(loc = !default_loc) ?(attrs = []) + ?(docs = empty_docs) ?(text = []) ?(implicit_ = Nonimplicit) name expr = { pmb_name = name; pmb_expr = expr; @@ -342,18 +336,11 @@ module Mb = struct pmb_implicit = implicit_; } - let implicit_ ?loc ?attrs name params me = - let me = List.fold_right - (fun (name,mty) acc -> - Mod.mk ?loc (Pmod_functor(name, Some mty, acc))) - params me - in - mk ?loc ?attrs ~implicit_:(Implicit (List.length params)) name me end module Opn = struct let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs) - ?(override = Fresh) ?(flag = Open_all Fresh) lid = + ?(flag = Open_all Fresh) lid = { popen_lid = lid; popen_flag = flag; diff --git a/parsing/ast_helper.mli b/parsing/ast_helper.mli index d47cd6039c..47f6be7d32 100644 --- a/parsing/ast_helper.mli +++ b/parsing/ast_helper.mli @@ -194,7 +194,7 @@ module Mty: val alias: ?loc:loc -> ?attrs:attrs -> lid -> module_type val signature: ?loc:loc -> ?attrs:attrs -> signature -> module_type val functor_: ?loc:loc -> ?attrs:attrs -> - str -> module_type option -> module_type -> module_type + module_parameter -> module_type -> module_type val with_: ?loc:loc -> ?attrs:attrs -> module_type -> with_constraint list -> module_type val typeof_: ?loc:loc -> ?attrs:attrs -> module_expr -> module_type val extension: ?loc:loc -> ?attrs:attrs -> extension -> module_type @@ -209,8 +209,9 @@ module Mod: val ident: ?loc:loc -> ?attrs:attrs -> lid -> module_expr val structure: ?loc:loc -> ?attrs:attrs -> structure -> module_expr val functor_: ?loc:loc -> ?attrs:attrs -> - str -> module_type option -> module_expr -> module_expr - val apply: ?loc:loc -> ?attrs:attrs -> module_expr -> module_expr -> module_expr + module_parameter -> module_expr -> module_expr + val apply: ?loc:loc -> ?attrs:attrs -> module_expr -> + module_argument -> module_expr val constraint_: ?loc:loc -> ?attrs:attrs -> module_expr -> module_type -> module_expr val unpack: ?loc:loc -> ?attrs:attrs -> expression -> module_expr val extension: ?loc:loc -> ?attrs:attrs -> extension -> module_expr @@ -265,7 +266,6 @@ module Md: sig val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text -> ?implicit_:implicit_flag -> str -> module_type -> module_declaration - val implicit_: ?loc:loc -> ?attrs:attrs -> str -> (str * module_type) list -> module_type -> module_declaration end (** Module type declarations *) @@ -280,14 +280,13 @@ module Mb: sig val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text -> ?implicit_:implicit_flag -> str -> module_expr -> module_binding - val implicit_: ?loc:loc -> ?attrs:attrs -> str -> (str * module_type) list -> module_expr -> module_binding end (* Opens *) module Opn: sig val mk: ?loc: loc -> ?attrs:attrs -> ?docs:docs -> - ?override:override_flag -> lid -> open_description + ?flag:open_flag -> lid -> open_description end (* Includes *) diff --git a/parsing/ast_mapper.ml b/parsing/ast_mapper.ml index 353609b488..eca4d0e1b8 100644 --- a/parsing/ast_mapper.ml +++ b/parsing/ast_mapper.ml @@ -206,6 +206,13 @@ end module MT = struct (* Type expressions for the module language *) + let parameter sub = function + | Pmpar_generative -> Pmpar_generative + | Pmpar_applicative(s, mty) -> + Pmpar_applicative(map_loc sub s, sub.module_type sub mty) + | Pmpar_implicit(s, mty) -> + Pmpar_implicit(map_loc sub s, sub.module_type sub mty) + let map sub {pmty_desc = desc; pmty_loc = loc; pmty_attributes = attrs} = let open Mty in let loc = sub.location sub loc in @@ -214,10 +221,10 @@ module MT = struct | Pmty_ident s -> ident ~loc ~attrs (map_loc sub s) | Pmty_alias s -> alias ~loc ~attrs (map_loc sub s) | Pmty_signature sg -> signature ~loc ~attrs (sub.signature sub sg) - | Pmty_functor (s, mt1, mt2) -> - functor_ ~loc ~attrs (map_loc sub s) - (Misc.may_map (sub.module_type sub) mt1) - (sub.module_type sub mt2) + | Pmty_functor (mp, mt) -> + functor_ ~loc ~attrs + (parameter sub mp) + (sub.module_type sub mt) | Pmty_with (mt, l) -> with_ ~loc ~attrs (sub.module_type sub mt) (List.map (sub.with_constraint sub) l) @@ -259,6 +266,13 @@ end module M = struct (* Value expressions for the module language *) + let parameter = MT.parameter + + let argument sub = function + | Pmarg_generative -> Pmarg_generative + | Pmarg_applicative me -> Pmarg_applicative (sub.module_expr sub me) + | Pmarg_implicit me -> Pmarg_implicit (sub.module_expr sub me) + let map sub {pmod_loc = loc; pmod_desc = desc; pmod_attributes = attrs} = let open Mod in let loc = sub.location sub loc in @@ -266,12 +280,14 @@ module M = struct match desc with | Pmod_ident x -> ident ~loc ~attrs (map_loc sub x) | Pmod_structure str -> structure ~loc ~attrs (sub.structure sub str) - | Pmod_functor (arg, arg_ty, body) -> - functor_ ~loc ~attrs (map_loc sub arg) - (Misc.may_map (sub.module_type sub) arg_ty) + | Pmod_functor (param, body) -> + functor_ ~loc ~attrs + (parameter sub param) (sub.module_expr sub body) - | Pmod_apply (m1, m2) -> - apply ~loc ~attrs (sub.module_expr sub m1) (sub.module_expr sub m2) + | Pmod_apply (m, a) -> + apply ~loc ~attrs + (sub.module_expr sub m) + (argument sub a) | Pmod_constraint (m, mty) -> constraint_ ~loc ~attrs (sub.module_expr sub m) (sub.module_type sub mty) diff --git a/parsing/asttypes.mli b/parsing/asttypes.mli index 1518183d55..787095bcc7 100644 --- a/parsing/asttypes.mli +++ b/parsing/asttypes.mli @@ -37,7 +37,7 @@ type open_flag = Open_all of override_flag | Open_implicit type closed_flag = Closed | Open -type implicit_flag = Nonimplicit | Implicit of int (*arity*) +type implicit_flag = Nonimplicit | Implicit type label = string diff --git a/parsing/longident.ml b/parsing/longident.ml index 706881af3a..4e755e9bc9 100644 --- a/parsing/longident.ml +++ b/parsing/longident.ml @@ -13,19 +13,19 @@ type t = Lident of string | Ldot of t * string - | Lapply of t * t + | Lapply of t * t * Asttypes.implicit_flag let rec flat accu = function Lident s -> s :: accu | Ldot(lid, s) -> flat (s :: accu) lid - | Lapply(_, _) -> Misc.fatal_error "Longident.flat" + | Lapply(_, _, _) -> Misc.fatal_error "Longident.flat" let flatten lid = flat [] lid let last = function Lident s -> s | Ldot(_, s) -> s - | Lapply(_, _) -> Misc.fatal_error "Longident.last" + | Lapply(_, _, _) -> Misc.fatal_error "Longident.last" let rec split_at_dots s pos = try diff --git a/parsing/longident.mli b/parsing/longident.mli index 9e7958550c..50fd5bacc0 100644 --- a/parsing/longident.mli +++ b/parsing/longident.mli @@ -15,7 +15,7 @@ type t = Lident of string | Ldot of t * string - | Lapply of t * t + | Lapply of t * t * Asttypes.implicit_flag val flatten: t -> string list val last: t -> string diff --git a/parsing/parser.mly b/parsing/parser.mly index f7990ecd14..1efee42e1d 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -211,12 +211,12 @@ let bigarray_set arr arg newval = let lapply p1 p2 = if !Clflags.applicative_functors - then Lapply(p1, p2) + then Lapply(p1, p2, Nonimplicit) else raise (Syntaxerr.Error(Syntaxerr.Applicative_path (symbol_rloc()))) let rec mod_ext_apply p1 = function | [] -> p1 - | p2 :: rest -> Lapply(mod_ext_apply p1 rest, p2) + | (p2, i) :: rest -> Lapply(mod_ext_apply p1 rest, p2, i) let exp_of_label lbl pos = mkexp (Pexp_ident(mkrhs (Lident(Longident.last lbl)) pos)) @@ -675,22 +675,24 @@ parse_pattern: /* Module expressions */ -functor_arg: +functor_param: LPAREN RPAREN - { mkrhs "*" 2, None } - | LPAREN functor_arg_name COLON module_type RPAREN - { mkrhs $2 2, Some $4 } + { Pmpar_generative } + | LPAREN functor_param_name COLON module_type RPAREN + { Pmpar_applicative(mkrhs $2 2, $4) } + | LBRACE functor_param_name COLON module_type RBRACE + { Pmpar_implicit(mkrhs $2 2, $4) } ; -functor_arg_name: +functor_param_name: UIDENT { $1 } | UNDERSCORE { "_" } ; -functor_args: - functor_args functor_arg +functor_params: + functor_params functor_param { $2 :: $1 } - | functor_arg + | functor_param { [ $1 ] } ; @@ -701,15 +703,19 @@ module_expr: { mkmod(Pmod_structure(extra_str 2 $2)) } | STRUCT structure error { unclosed "struct" 1 "end" 3 } - | FUNCTOR functor_args MINUSGREATER module_expr - { List.fold_left (fun acc (n, t) -> mkmod(Pmod_functor(n, t, acc))) + | FUNCTOR functor_params MINUSGREATER module_expr + { List.fold_left (fun acc p -> mkmod(Pmod_functor(p, acc))) $4 $2 } | module_expr LPAREN module_expr RPAREN - { mkmod(Pmod_apply($1, $3)) } + { mkmod(Pmod_apply($1, Pmarg_applicative $3)) } | module_expr LPAREN RPAREN - { mkmod(Pmod_apply($1, mkmod (Pmod_structure []))) } + { mkmod(Pmod_apply($1, Pmarg_generative)) } | module_expr LPAREN module_expr error { unclosed "(" 2 ")" 4 } + | module_expr LBRACE module_expr RBRACE + { mkmod(Pmod_apply($1, Pmarg_implicit $3)) } + | module_expr LBRACE module_expr error + { unclosed "{" 2 "}" 4 } | LPAREN module_expr COLON module_type RPAREN { mkmod(Pmod_constraint($2, $4)) } | LPAREN module_expr COLON module_type error @@ -771,8 +777,6 @@ structure_item: | module_type_declaration { mkstr(Pstr_modtype $1) } | open_statement { mkstr(Pstr_open $1) } - | IMPLICIT implicit_binding - { mkstr(Pstr_module $2) } | class_declarations { mkstr(Pstr_class (List.rev $1)) } | class_type_declarations @@ -795,14 +799,17 @@ module_binding_body: { $2 } | COLON module_type EQUAL module_expr { mkmod(Pmod_constraint($4, $2)) } - | functor_arg module_binding_body - { mkmod(Pmod_functor(fst $1, snd $1, $2)) } + | functor_param module_binding_body + { mkmod(Pmod_functor($1, $2)) } ; module_binding: MODULE UIDENT module_binding_body post_item_attributes - { Mb.mk (mkrhs $2 2) $3 ~attrs:$4 - ~loc:(symbol_rloc ()) ~docs:(symbol_docs ()) } + { Mb.mk (mkrhs $2 2) $3 ~attrs:$4 ~loc:(symbol_rloc ()) } + | IMPLICIT MODULE UIDENT module_binding_body post_item_attributes + { Mb.mk (mkrhs $3 3) $4 ~implicit_:Implicit + ~attrs:$5 ~loc:(symbol_rloc ()) } ; + rec_module_bindings: rec_module_binding { [$1] } | rec_module_bindings and_module_binding { $2 :: $1 } @@ -818,34 +825,6 @@ and_module_binding: ~text:(symbol_text ()) ~docs:(symbol_docs ()) } ; - -implicit_parameters: - /* empty */ - { [] } - | implicit_parameters LBRACE functor_arg_name COLON module_type RBRACE - { (mkrhs $3 3, $5) :: $1 } -; -implicit_binding: - MODULE UIDENT implicit_parameters implicit_binding_body post_item_attributes - { Mb.implicit_ (mkrhs $2 2) (List.rev $3) $4 ~loc:(symbol_rloc ()) ~attrs:$5 } -; -implicit_binding_body: - EQUAL module_expr - { $2 } - | COLON module_type EQUAL module_expr - { mkmod(Pmod_constraint($4, $2)) } -; -implicit_declaration: - MODULE UIDENT implicit_parameters implicit_declaration_body post_item_attributes - { Md.implicit_ (mkrhs $2 2) (List.rev $3) $4 ~attrs:$5 ~loc:(symbol_rloc()) } -; -implicit_declaration_body: - | COLON module_type - { $2 } - | EQUAL mod_longident - { (Mty.alias ~loc:(rhs_loc 2) (mkrhs $2 2)) } -; - /* Module types */ module_type: @@ -855,9 +834,9 @@ module_type: { mkmty(Pmty_signature (extra_sig 2 $2)) } | SIG signature error { unclosed "sig" 1 "end" 3 } - | FUNCTOR functor_args MINUSGREATER module_type + | FUNCTOR functor_params MINUSGREATER module_type %prec below_WITH - { List.fold_left (fun acc (n, t) -> mkmty(Pmty_functor(n, t, acc))) + { List.fold_left (fun acc p -> mkmty(Pmty_functor(p, acc))) $4 $2 } | module_type WITH with_constraints { mkmty(Pmty_with($1, List.rev $3)) } @@ -894,8 +873,6 @@ signature_item: { mksig(Psig_module $1) } | module_alias { mksig(Psig_module $1) } - | IMPLICIT implicit_declaration - { mksig(Psig_module $2) } | rec_module_declarations { mksig(Psig_recmodule (List.rev $1)) } | module_type_declaration @@ -926,10 +903,9 @@ sig_include_statement: module_declaration_body: COLON module_type { $2 } - | LPAREN UIDENT COLON module_type RPAREN module_declaration_body - { mkmty(Pmty_functor(mkrhs $2 2, Some $4, $6)) } - | LPAREN RPAREN module_declaration_body - { mkmty(Pmty_functor(mkrhs "*" 1, None, $3)) } + | functor_params COLON module_type + { List.fold_left (fun acc p -> mkmty(Pmty_functor(p, acc))) $3 $1 } + ; module_declaration: MODULE UIDENT module_declaration_body post_item_attributes @@ -1280,12 +1256,10 @@ expr: { $1 } | simple_expr simple_labeled_expr_list { mkexp(Pexp_apply($1, List.rev $2)) } - | LET ext_attributes rec_flag let_bindings_no_attrs IN seq_expr - { mkexp_attrs (Pexp_let($3, List.rev $4, $6)) $2 } - | LET MODULE ext_attributes module_binding IN seq_expr - { mkexp_attrs (Pexp_letmodule($4, $6)) $3 } - | LET IMPLICIT ext_attributes implicit_binding IN seq_expr - { mkexp_attrs (Pexp_letmodule($4, $6)) $3 } + | let_bindings IN seq_expr + { expr_of_let_bindings $1 $3 } + | LET module_binding IN seq_expr + { mkexp (Pexp_letmodule($2, $4)) (* FIXME: no attributes *) } | LET OPEN open_flag ext_attributes mod_longident IN seq_expr { mkexp_attrs (Pexp_open($3, mkrhs $5 5, $7)) $4 } | FUNCTION ext_attributes opt_bar match_cases @@ -1803,8 +1777,8 @@ type_kind: | EQUAL LBRACE label_declarations RBRACE { (Ptype_record $3, Public, None) } | EQUAL PRIVATE LBRACE label_declarations RBRACE - { (Ptype_record $4, $2, None) } - | EQUAL core_type EQUAL PRIVATE constructor_declarations + { (Ptype_record $4, Private, None) } + | EQUAL core_type EQUAL private_flag constructor_declarations { (Ptype_variant(List.rev $5), $4, Some $2) } | EQUAL core_type EQUAL DOTDOT { (Ptype_open, Public, Some $2) } @@ -2287,10 +2261,18 @@ mod_ext_longident: UIDENT { Lident $1 } | mod_ext_longident DOT UIDENT { Ldot($1, $3) } | mod_ext_longident LPAREN mod_ext_longident RPAREN { lapply $1 $3 } + | mod_ext_longident LBRACE mod_ext_longident RBRACE + { Lapply($1, $3, Implicit) } ; mod_ext_parameters: - | LPAREN mod_ext_longident RPAREN { [$2] } - | mod_ext_parameters LPAREN mod_ext_longident RPAREN { $3 :: $1 } + | LPAREN mod_ext_longident RPAREN + { [$2, Nonimplicit] } + | LBRACE mod_ext_longident RBRACE + { [$2, Implicit] } + | mod_ext_parameters LPAREN mod_ext_longident RPAREN + { ($3, Nonimplicit) :: $1 } + | mod_ext_parameters LBRACE mod_ext_longident RBRACE + { ($3, Implicit) :: $1 } ; mty_longident: ident { Lident $1 } diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index 7062af1c30..d759b4e2c5 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -631,8 +631,8 @@ and module_type_desc = (* S *) | Pmty_signature of signature (* sig ... end *) - | Pmty_functor of string loc * module_type option * module_type - (* functor(X : MT1) -> MT2 *) + | Pmty_functor of module_parameter * module_type + (* functor MP -> MT *) | Pmty_with of module_type * with_constraint list (* MT with ... *) | Pmty_typeof of module_expr @@ -755,10 +755,10 @@ and module_expr_desc = (* X *) | Pmod_structure of structure (* struct ... end *) - | Pmod_functor of string loc * module_type option * module_expr - (* functor(X : MT1) -> ME *) - | Pmod_apply of module_expr * module_expr - (* ME1(ME2) *) + | Pmod_functor of module_parameter * module_expr + (* functor MP -> ME *) + | Pmod_apply of module_expr * module_argument + (* ME(MA) *) | Pmod_constraint of module_expr * module_type (* (ME : MT) *) | Pmod_unpack of expression @@ -766,6 +766,19 @@ and module_expr_desc = | Pmod_extension of extension (* [%id] *) +and module_parameter = + | Pmpar_generative + (* () *) + | Pmpar_applicative of string loc * module_type + (* (X : MT) *) + | Pmpar_implicit of string loc * module_type + (* {X : MT} *) + +and module_argument = + | Pmarg_generative + | Pmarg_applicative of module_expr + | Pmarg_implicit of module_expr + and structure = structure_item list and structure_item = diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index ffaf30ccfd..72065b88fb 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -90,6 +90,10 @@ let open_flag = function | Open_all x -> override x | Open_implicit -> " implicit" +let implicit_flag = function + | Nonimplicit -> "" + | Implicit -> " implicit" + (* variance encoding: need to sync up with the [parser.mly] *) let type_variance = function | Invariant -> "" @@ -180,8 +184,10 @@ class printer ()= object(self:'self) method longident f = function | Lident s -> protect_ident f s | Ldot(y,s) -> protect_longident f self#longident y s - | Lapply (y,s) -> + | Lapply (y, s, Nonimplicit) -> pp f "%a(%a)" self#longident y self#longident s + | Lapply (y, s, Implicit) -> + pp f "%a{%a}" self#longident y self#longident s method longident_loc f x = pp f "%a" self#longident x.txt method constant f = function | Const_char i -> pp f "%C" i @@ -911,11 +917,11 @@ class printer ()= object(self:'self) method module_binding f x = let rec module_helper me = match me.pmod_desc with - | Pmod_functor(s,mt,me) -> - if mt = None then pp f "()" - else Misc.may (pp f "(%s:%a)" s.txt self#module_type) mt; + | Pmod_functor(mp,me) -> + self#module_parameter f mp; module_helper me - | _ -> me in + | _ -> me + in pp f "%s%a" x.pmb_name.txt (fun f me -> @@ -930,6 +936,20 @@ class printer ()= object(self:'self) pp f " =@ %a" self#module_expr me )) x.pmb_expr + method module_parameter f x = + match x with + | Pmpar_generative -> pp f "()" + | Pmpar_applicative(s, mty) -> + pp f "(%s:%a)" s.txt self#module_type mty + | Pmpar_implicit(s, mty) -> + pp f "{%s:%a}" s.txt self#module_type mty + + method module_argument f x = + match x with + | Pmarg_generative -> pp f "()" + | Pmarg_applicative me -> pp f "(%a)" self#module_expr me + | Pmarg_implicit me -> pp f "{%a}" self#module_expr me + method module_type f x = if x.pmty_attributes <> [] then begin pp f "((%a)%a)" self#module_type {x with pmty_attributes=[]} @@ -943,11 +963,10 @@ class printer ()= object(self:'self) | Pmty_signature (s) -> pp f "@[<hv0>@[<hv2>sig@ %a@]@ end@]" (* "@[<hov>sig@ %a@ end@]" *) (self#list self#signature_item ) s (* FIXME wrong indentation*) - | Pmty_functor (_, None, mt2) -> - pp f "@[<hov2>functor () ->@ %a@]" self#module_type mt2 - | Pmty_functor (s, Some mt1, mt2) -> - pp f "@[<hov2>functor@ (%s@ :@ %a)@ ->@ %a@]" s.txt - self#module_type mt1 self#module_type mt2 + | Pmty_functor (mp, mt) -> + pp f "@[<hov2>functor %a@ ->@ %a@]" + self#module_parameter mp + self#module_type mt | Pmty_with (mt, l) -> let with_constraint f = function | Pwith_type (li, ({ptype_params= ls ;_} as td)) -> @@ -1006,21 +1025,18 @@ class printer ()= object(self:'self) (class_description "class") x (self#list ~sep:"@," (class_description "and")) xs end - | Psig_module ({pmd_type={pmty_desc=Pmty_alias alias}; pmd_implicit = Nonimplicit} as pmd) -> - pp f "@[<hov>module@ %s@ =@ %a@]%a" + | Psig_module ({pmd_type={pmty_desc=Pmty_alias alias}} as pmd) -> + pp f "@[<hov>%smodule@ %s@ =@ %a@]%a" + (implicit_flag pmd.pmd_implicit) pmd.pmd_name.txt self#longident_loc alias self#item_attributes pmd.pmd_attributes - | Psig_module ({pmd_implicit = Nonimplicit} as pmd) -> - pp f "@[<hov>module@ %s@ :@ %a@]%a" + | Psig_module pmd -> + pp f "@[<hov>%smodule@ %s@ :@ %a@]%a" + (implicit_flag pmd.pmd_implicit) pmd.pmd_name.txt self#module_type pmd.pmd_type self#item_attributes pmd.pmd_attributes - | Psig_module ({pmd_implicit = Implicit arity} as pmd) -> - pp f "@[<hov>implicit module@ %s@ %a@]%a" - pmd.pmd_name.txt - (self#implicit_declaration arity) pmd.pmd_type - self#item_attributes pmd.pmd_attributes | Psig_open od -> pp f "@[<hov2>open%s@ %a@]%a" (open_flag od.popen_flag) @@ -1078,46 +1094,17 @@ class printer ()= object(self:'self) self#module_type mt | Pmod_ident (li) -> pp f "%a" self#longident_loc li; - | Pmod_functor (_, None, me) -> - pp f "functor ()@;->@;%a" self#module_expr me - | Pmod_functor (s, Some mt, me) -> - pp f "functor@ (%s@ :@ %a)@;->@;%a" - s.txt self#module_type mt self#module_expr me - | Pmod_apply (me1, me2) -> - pp f "%a(%a)" self#module_expr me1 self#module_expr me2 + | Pmod_functor (mp, me) -> + pp f "functor@ %a@;->@;%a" + self#module_parameter mp self#module_expr me + | Pmod_apply (me, ma) -> + pp f "%a%a" self#module_expr me self#module_argument ma | Pmod_unpack e -> pp f "(val@ %a)" self#expression e | Pmod_extension e -> self#extension f e method structure f x = self#list ~sep:"@\n" self#structure_item f x - method implicit_binding n f me = - match me.pmod_desc with - | Pmod_functor (s, Some mt, me') when n > 0 -> - pp f "{%s@ :@ %a}@;%a" - s.txt - self#module_type mt - (self#implicit_binding (n - 1)) me' - | Pmod_constraint (me, ({pmty_desc = ( Pmty_ident _ - | Pmty_signature _ ); _} as mt)) -> - assert (n = 0); - pp f " :@;%a@;=@;%a@;" self#module_type mt self#module_expr me - | _ -> - assert (n = 0); - pp f " =@;%a@;" self#module_expr me - - method implicit_declaration n f mt = - match mt.pmty_desc with - | Pmty_functor (s, Some mt, mt') when n > 0 -> - pp f "{%s@ :@ %a}@;%a" - s.txt - self#module_type mt - (self#implicit_declaration (n - 1)) mt' - | _ -> - assert (n = 0); - pp f ":@;%a" - self#module_type mt - method payload f = function | PStr [{pstr_desc = Pstr_eval (e, attrs)}] -> pp f "@[<2>%a@]%a" @@ -1188,10 +1175,8 @@ class printer ()= object(self:'self) | Pstr_exception ed -> self#exception_declaration f ed | Pstr_module ({pmb_implicit = Nonimplicit} as x) -> pp f "@[<hov2>module@ %a@]" self#module_binding x - | Pstr_module {pmb_implicit = Implicit arity; pmb_name; pmb_expr} -> - pp f "@[<hov2>implicit module@ %s@ %a@]" - pmb_name.txt - (self#implicit_binding arity) pmb_expr + | Pstr_module ({pmb_implicit = Implicit} as x) -> + pp f "@[<hov2>implicit module@ %a@]" self#module_binding x | Pstr_open od -> pp f "@[<2>open%s@;%a@]%a" (open_flag od.popen_flag) diff --git a/parsing/pprintast.mli b/parsing/pprintast.mli index e886e1c3a5..ead57fca36 100644 --- a/parsing/pprintast.mli +++ b/parsing/pprintast.mli @@ -50,8 +50,6 @@ class printer : method expression2 : Format.formatter -> Parsetree.expression -> unit method extension_constructor : Format.formatter -> Parsetree.extension_constructor -> unit - method implicit_binding : int -> Format.formatter -> Parsetree.module_expr -> unit - method implicit_declaration : int -> Format.formatter -> Parsetree.module_type -> unit method label_exp : Format.formatter -> Parsetree.arrow_flag * Parsetree.expression option * Parsetree.pattern -> @@ -66,9 +64,13 @@ class printer : method longident : Format.formatter -> Longident.t -> unit method longident_loc : Format.formatter -> Longident.t Asttypes.loc -> unit + method module_argument : + Format.formatter -> Parsetree.module_argument -> unit method module_binding : Format.formatter -> Parsetree.module_binding -> unit method module_expr : Format.formatter -> Parsetree.module_expr -> unit method module_type : Format.formatter -> Parsetree.module_type -> unit + method module_parameter : + Format.formatter -> Parsetree.module_parameter -> unit method mutable_flag : Format.formatter -> Asttypes.mutable_flag -> unit method option : ?first:space_formatter -> diff --git a/parsing/printast.ml b/parsing/printast.ml index f06e5e26de..c43eff8a5b 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -35,8 +35,10 @@ let rec fmt_longident_aux f x = match x with | Longident.Lident (s) -> fprintf f "%s" s; | Longident.Ldot (y, s) -> fprintf f "%a.%s" fmt_longident_aux y s; - | Longident.Lapply (y, z) -> + | Longident.Lapply (y, z, Nonimplicit) -> fprintf f "%a(%a)" fmt_longident_aux y fmt_longident_aux z; + | Longident.Lapply (y, z, Implicit) -> + fprintf f "%a{%a}" fmt_longident_aux y fmt_longident_aux z; ;; let fmt_longident f x = fprintf f "\"%a\"" fmt_longident_aux x;; @@ -112,7 +114,7 @@ let fmt_private_flag f x = let fmt_implicit_flag f x = match x with | Nonimplicit -> fprintf f "Nonimplicit"; - | Implicit n -> fprintf f "Implicit %d" n; + | Implicit -> fprintf f "Implicit"; ;; let line i f s (*...*) = @@ -641,10 +643,10 @@ and module_type i ppf x = | Pmty_signature (s) -> line i ppf "Pmty_signature\n"; signature i ppf s; - | Pmty_functor (s, mt1, mt2) -> - line i ppf "Pmty_functor %a\n" fmt_string_loc s; - Misc.may (module_type i ppf) mt1; - module_type i ppf mt2; + | Pmty_functor (mp, mt) -> + line i ppf "Pmty_functor\n"; + module_parameter i ppf mp; + module_type i ppf mt; | Pmty_with (mt, l) -> line i ppf "Pmty_with\n"; module_type i ppf mt; @@ -738,14 +740,14 @@ and module_expr i ppf x = | Pmod_structure (s) -> line i ppf "Pmod_structure\n"; structure i ppf s; - | Pmod_functor (s, mt, me) -> - line i ppf "Pmod_functor %a\n" fmt_string_loc s; - Misc.may (module_type i ppf) mt; + | Pmod_functor (mp, me) -> + line i ppf "Pmod_functor\n"; + module_parameter i ppf mp; module_expr i ppf me; - | Pmod_apply (me1, me2) -> + | Pmod_apply (me, ma) -> line i ppf "Pmod_apply\n"; - module_expr i ppf me1; - module_expr i ppf me2; + module_expr i ppf me; + module_argument i ppf ma; | Pmod_constraint (me, mt) -> line i ppf "Pmod_constraint\n"; module_expr i ppf me; @@ -757,6 +759,28 @@ and module_expr i ppf x = line i ppf "Pmod_extension \"%s\"\n" s.txt; payload i ppf arg +and module_parameter i ppf x = + match x with + | Pmpar_generative -> + line i ppf "Pmod_generative\n" + | Pmpar_applicative(s, mty) -> + line i ppf "Pmarg_applicative %a\n" fmt_string_loc s; + module_type i ppf mty + | Pmpar_implicit(s, mty) -> + line i ppf "Pmarg_implicit %a\n" fmt_string_loc s; + module_type i ppf mty + +and module_argument i ppf x = + match x with + | Pmarg_generative -> + line i ppf "Pmarg_generative\n" + | Pmarg_applicative me -> + line i ppf "Pmarg_applicative\n"; + module_expr i ppf me + | Pmarg_implicit me -> + line i ppf "Pmarg_implicit\n"; + module_expr i ppf me + and structure i ppf x = list i structure_item ppf x and structure_item i ppf x = diff --git a/testsuite/tests/typing-modular_implicits/arithmetic.ml.result b/testsuite/tests/typing-modular_implicits/arithmetic.ml.result deleted file mode 100644 index e880efafa9..0000000000 --- a/testsuite/tests/typing-modular_implicits/arithmetic.ml.result +++ /dev/null @@ -1,28 +0,0 @@ - -# type z = Z -type 'n s = S of 'n -module type N = sig type n val n : n end -implicit module Z : sig type n = z val n : n end -implicit module S {N : N} : sig type n = N.n s val n : n end -module type ADD = sig type a and b and c val a : a val b : b val c : c end -val add : {Add : ADD} -> Add.a -> Add.b -> Add.c = <fun> -implicit module AddZ {B : N} : - sig type a = z and b = B.n and c = B.n val a : a val b : b val c : c end -implicit module AddS {A : N} {B : N} {Add : sig - type a = A.n - and b = B.n - and c - val a : a - val b : b - val c : c - end} : - sig - type a = A.n s - and b = B.n - and c = Add.c s - val a : a - val b : b - val c : c - end -# * - : AddS(Z)(Z)(AddZ(Z)).c = S Z -# diff --git a/testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml.result b/testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml.result deleted file mode 100644 index f0cd1203ea..0000000000 --- a/testsuite/tests/typing-modular_implicits/coercion_arity_mismatch.ml.result +++ /dev/null @@ -1,9 +0,0 @@ - -# module type S = sig type t end -# module type T = sig type _ t end -# Characters 32-58: - let f (x : {X : S} -> X.t) () = (x :> {X : T} -> unit X.t);; - ^^^^^^^^^^^^^^^^^^^^^^^^^^ -Error: Type {X : S} -> X.t is not a subtype of {X : T} -> unit X.t - Type (module T) is not a subtype of (module S) -# diff --git a/testsuite/tests/typing-modular_implicits/multiple_implicits.ml.result b/testsuite/tests/typing-modular_implicits/multiple_implicits.ml.result deleted file mode 100644 index 7aa827b791..0000000000 --- a/testsuite/tests/typing-modular_implicits/multiple_implicits.ml.result +++ /dev/null @@ -1,4 +0,0 @@ - -# module type T = sig type a end -# val f : {A : T} -> {B : T} -> A.a * B.a -> unit = <fun> -# diff --git a/tools/depend.ml b/tools/depend.ml index f9fb9100d6..81e67b2eea 100644 --- a/tools/depend.ml +++ b/tools/depend.ml @@ -26,7 +26,7 @@ let rec add_path bv = function if not (StringSet.mem s bv) then free_structure_names := StringSet.add s !free_structure_names | Ldot(l, _s) -> add_path bv l - | Lapply(l1, l2) -> add_path bv l1; add_path bv l2 + | Lapply(l1, l2, _) -> add_path bv l1; add_path bv l2 let open_module bv lid = add_path bv lid @@ -215,9 +215,9 @@ and add_modtype bv mty = Pmty_ident l -> add bv l | Pmty_alias l -> addmodule bv l | Pmty_signature s -> add_signature bv s - | Pmty_functor(id, mty1, mty2) -> - Misc.may (add_modtype bv) mty1; - add_modtype (StringSet.add id.txt bv) mty2 + | Pmty_functor(mparam, mty) -> + let bv = add_module_parameter bv mparam in + add_modtype bv mty | Pmty_with(mty, cstrl) -> add_modtype bv mty; List.iter @@ -275,11 +275,11 @@ and add_module bv modl = match modl.pmod_desc with Pmod_ident l -> addmodule bv l | Pmod_structure s -> ignore (add_structure bv s) - | Pmod_functor(id, mty, modl) -> - Misc.may (add_modtype bv) mty; - add_module (StringSet.add id.txt bv) modl - | Pmod_apply(mod1, mod2) -> - add_module bv mod1; add_module bv mod2 + | Pmod_functor(mparam, modl) -> + let bv = add_module_parameter bv mparam in + add_module bv modl + | Pmod_apply(modl, marg) -> + add_module bv modl; add_module_argument bv marg | Pmod_constraint(modl, mty) -> add_module bv modl; add_modtype bv mty | Pmod_unpack(e) -> @@ -287,6 +287,20 @@ and add_module bv modl = | Pmod_extension _ -> () +and add_module_parameter bv = function + | Pmpar_generative -> bv + | Pmpar_applicative(id, mty) -> + add_modtype bv mty; + StringSet.add id.txt bv + | Pmpar_implicit(id, mty) -> + add_modtype bv mty; + StringSet.add id.txt bv + +and add_module_argument bv = function + | Pmarg_generative -> () + | Pmarg_applicative modl -> add_module bv modl + | Pmarg_implicit modl -> add_module bv modl + and add_structure bv item_list = List.fold_left add_struct_item bv item_list diff --git a/tools/eqparsetree.ml b/tools/eqparsetree.ml index 4c699e9988..597e5bcb5c 100644 --- a/tools/eqparsetree.ml +++ b/tools/eqparsetree.ml @@ -321,16 +321,29 @@ and eq_module_expr_desc : | (Pmod_ident a0, Pmod_ident b0) -> Asttypes.eq_loc Longident.eq_t (a0, b0) | (Pmod_structure a0, Pmod_structure b0) -> eq_structure (a0, b0) - | (Pmod_functor (a0, a1, a2), Pmod_functor (b0, b1, b2)) -> - ((Asttypes.eq_loc eq_string (a0, b0)) && - (eq_module_type (a1, b1))) - && (eq_module_expr (a2, b2)) + | (Pmod_functor (a0, a1), Pmod_functor (b0, b1)) -> + ((eq_module_parameter (a0, b0))) + && (eq_module_expr (a1, b1)) | (Pmod_apply (a0, a1), Pmod_apply (b0, b1)) -> - (eq_module_expr (a0, b0)) && (eq_module_expr (a1, b1)) + (eq_module_expr (a0, b0)) && (eq_module_argument (a1, b1)) | (Pmod_constraint (a0, a1), Pmod_constraint (b0, b1)) -> (eq_module_expr (a0, b0)) && (eq_module_type (a1, b1)) | (Pmod_unpack a0, Pmod_unpack b0) -> eq_expression (a0, b0) | (_, _) -> false +and eq_module_parameter : (module_parameter * module_parameter) -> 'result = + function + | (Pmpar_generative, Pmpar_generative) -> true + | (Pmpar_applicative(a0, a1), Pmpar_applicative(b0, b1)) -> + (Asttypes.eq_loc eq_string (a0, b0)) + && (eq_module_expr (a1, b1)) + | (Pmpar_implicit(a0, a1), Pmpar_implicit(b0, b1)) -> + (Asttypes.eq_loc eq_string (a0, b0)) + && (eq_module_expr (a1, b1)) +and eq_module_argument : (module_argument * module_argument) -> 'result = + function + | (Pmarg_generative, Pmarg_generative) -> true + | (Pmarg_applicative a0, Pmarg_applicative b0) -> eq_module_type (a0, b0) + | (Pmarg_implicit a0, Pmarg_implicit b0) -> eq_module_type (a0, b0) and eq_module_expr : (module_expr * module_expr) -> 'result = fun ({ pmod_desc = a0; pmod_loc = a1 }, @@ -404,10 +417,9 @@ and eq_module_type_desc : | (Pmty_ident a0, Pmty_ident b0) -> Asttypes.eq_loc Longident.eq_t (a0, b0) | (Pmty_signature a0, Pmty_signature b0) -> eq_signature (a0, b0) - | (Pmty_functor (a0, a1, a2), Pmty_functor (b0, b1, b2)) -> - ((Asttypes.eq_loc eq_string (a0, b0)) && - (eq_module_type (a1, b1))) - && (eq_module_type (a2, b2)) + | (Pmty_functor (a0, a2), Pmty_functor (b0, b2)) -> + (eq_module_parameter (a0, a1)) + && (eq_module_type (a1, b1)) | (Pmty_with (a0, a1), Pmty_with (b0, b1)) -> (eq_module_type (a0, b0)) && (eq_list diff --git a/tools/ocamlprof.ml b/tools/ocamlprof.ml index 44d6c22197..ea44e3dbbe 100644 --- a/tools/ocamlprof.ml +++ b/tools/ocamlprof.ml @@ -373,12 +373,20 @@ and rewrite_mod iflag smod = match smod.pmod_desc with Pmod_ident _ -> () | Pmod_structure sstr -> List.iter (rewrite_str_item iflag) sstr - | Pmod_functor(_param, _smty, sbody) -> rewrite_mod iflag sbody - | Pmod_apply(smod1, smod2) -> rewrite_mod iflag smod1; rewrite_mod iflag smod2 + | Pmod_functor(_sparam, sbody) -> rewrite_mod iflag sbody + | Pmod_apply(smod, sarg) -> + rewrite_mod iflag smod; + rewrite_mod_arg iflag sarg | Pmod_constraint(smod, _smty) -> rewrite_mod iflag smod | Pmod_unpack(sexp) -> rewrite_exp iflag sexp | Pmod_extension _ -> () +and rewrite_mod_arg iflag sarg = + match sarg with + | Pmarg_generative -> () + | Pmarg_applicative smod | Pmarg_implicit smod -> + rewrite_mod iflag smod + and rewrite_str_item iflag item = match item.pstr_desc with Pstr_eval (exp, _attrs) -> rewrite_exp iflag exp diff --git a/tools/tast_iter.ml b/tools/tast_iter.ml index 1b62436771..217af6f93e 100644 --- a/tools/tast_iter.ml +++ b/tools/tast_iter.ml @@ -205,13 +205,20 @@ let class_description sub cd = let class_type_declaration sub cd = sub # class_type cd.ci_expr +let module_parameter sub mparam = + match mparam with + | Tmpar_generative -> () + | Tmpar_applicative(_, _, mtype) -> sub # module_type mtype + | Tmpar_implicit(_, _, mtype) -> sub # module_type mtype + let module_type sub mty = match mty.mty_desc with | Tmty_ident (_path, _) -> () | Tmty_alias (_path, _) -> () | Tmty_signature sg -> sub # signature sg - | Tmty_functor (_id, _, mtype1, mtype2) -> - Misc.may (sub # module_type) mtype1; sub # module_type mtype2 + | Tmty_functor (mparam, mtype) -> + module_parameter sub mparam; + sub # module_type mtype | Tmty_with (mtype, list) -> sub # module_type mtype; List.iter (fun (_, _, withc) -> sub # with_constraint withc) list @@ -225,16 +232,22 @@ let with_constraint sub cstr = | Twith_typesubst decl -> sub # type_declaration decl | Twith_modsubst _ -> () +let module_argument sub marg = + match marg with + | Tmarg_generative -> () + | Tmarg_applicative(mexp, _) -> sub # module_expr mexp + | Tmarg_implicit(mexp, _) -> sub # module_expr mexp + let module_expr sub mexpr = match mexpr.mod_desc with | Tmod_ident (_p, _) -> () | Tmod_structure st -> sub # structure st - | Tmod_functor (_id, _, mtype, mexpr) -> - Misc.may (sub # module_type) mtype; + | Tmod_functor (mparam, mexpr) -> + module_parameter sub mparam; sub # module_expr mexpr - | Tmod_apply (mexp1, mexp2, _) -> - sub # module_expr mexp1; - sub # module_expr mexp2 + | Tmod_apply (mexp, marg) -> + sub # module_expr mexp; + module_argument sub marg | Tmod_constraint (mexpr, _, Tmodtype_implicit, _ ) -> sub # module_expr mexpr | Tmod_constraint (mexpr, _, Tmodtype_explicit mtype, _) -> diff --git a/tools/untypeast.ml b/tools/untypeast.ml index 16433ca7ab..e4f0761e5d 100644 --- a/tools/untypeast.ml +++ b/tools/untypeast.ml @@ -40,8 +40,8 @@ let rec lident_of_path path = match path with Path.Pident id -> Longident.Lident (Ident.name id) | Path.Pdot (p, s, _) -> Longident.Ldot (lident_of_path p, s) - | Path.Papply (p1, p2) -> - Longident.Lapply (lident_of_path p1, lident_of_path p2) + | Path.Papply (p1, p2, i) -> + Longident.Lapply (lident_of_path p1, lident_of_path p2, i) let rec untype_structure str = List.map untype_structure_item str.str_items @@ -465,9 +465,9 @@ and untype_module_type mty = Tmty_ident (_path, lid) -> Pmty_ident (lid) | Tmty_alias (_path, lid) -> Pmty_alias (lid) | Tmty_signature sg -> Pmty_signature (untype_signature sg) - | Tmty_functor (_id, name, mtype1, mtype2) -> - Pmty_functor (name, Misc.may_map untype_module_type mtype1, - untype_module_type mtype2) + | Tmty_functor (mparam, mtype) -> + Pmty_functor (untype_module_parameter mparam, + untype_module_type mtype) | Tmty_with (mtype, list) -> Pmty_with (untype_module_type mtype, List.map (fun (_path, lid, withc) -> @@ -494,11 +494,12 @@ and untype_module_expr mexpr = let desc = match mexpr.mod_desc with Tmod_ident (_p, lid) -> Pmod_ident (lid) | Tmod_structure st -> Pmod_structure (untype_structure st) - | Tmod_functor (_id, name, mtype, mexpr) -> - Pmod_functor (name, Misc.may_map untype_module_type mtype, + | Tmod_functor (mparam, mexpr) -> + Pmod_functor (untype_module_parameter mparam, untype_module_expr mexpr) - | Tmod_apply (mexp1, mexp2, _) -> - Pmod_apply (untype_module_expr mexp1, untype_module_expr mexp2) + | Tmod_apply (mexp, marg) -> + Pmod_apply (untype_module_expr mexp, + untype_module_argument marg) | Tmod_constraint (mexpr, _, Tmodtype_explicit mtype, _) -> Pmod_constraint (untype_module_expr mexpr, untype_module_type mtype) @@ -511,6 +512,20 @@ and untype_module_expr mexpr = in Mod.mk ~loc:mexpr.mod_loc desc +and untype_module_parameter = function + | Tmpar_generative -> Pmpar_generative + | Tmpar_applicative(_id, name, mty) -> + Pmpar_applicative(name, untype_module_type mty) + | Tmpar_implicit(_id, name, mty) -> + Pmpar_implicit(name, untype_module_type mty) + +and untype_module_argument = function + | Tmarg_generative -> Pmarg_generative + | Tmarg_applicative(mexpr, _) -> + Pmarg_applicative(untype_module_expr mexpr) + | Tmarg_implicit(mexpr, _) -> + Pmarg_implicit(untype_module_expr mexpr) + and untype_class_expr cexpr = let desc = match cexpr.cl_desc with | Tcl_constraint ( { cl_desc = Tcl_ident (_path, lid, tyl); _ }, diff --git a/toplevel/genprintval.ml b/toplevel/genprintval.ml index 3144594f09..d0a31b2c04 100644 --- a/toplevel/genprintval.ml +++ b/toplevel/genprintval.ml @@ -203,7 +203,7 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct with Not_found -> false then Oide_ident name else Oide_dot (Printtyp.tree_of_path p, name) - | Papply(p1, p2) -> + | Papply(p1, p2, i) -> Printtyp.tree_of_path ty_path let tree_of_constr = diff --git a/toplevel/opttoploop.ml b/toplevel/opttoploop.ml index d21860a871..e4d690d423 100644 --- a/toplevel/opttoploop.ml +++ b/toplevel/opttoploop.ml @@ -71,7 +71,7 @@ let rec eval_path = function else toplevel_value id | Pdot(p, s, pos) -> Obj.field (eval_path p) pos - | Papply(p1, p2) -> + | Papply(p1, p2, i) -> fatal_error "Toploop.eval_path" (* To print values *) diff --git a/toplevel/topdirs.ml b/toplevel/topdirs.ml index 7ba572b2b0..4c05a24ed3 100644 --- a/toplevel/topdirs.ml +++ b/toplevel/topdirs.ml @@ -188,7 +188,7 @@ let _ = Hashtbl.add directive_table "mod_use" let filter_arrow ty = let ty = Ctype.expand_head !toplevel_env ty in match ty.desc with - | Tarrow (lbl, l, r, _) when not (Btype.is_optional lbl) -> Some (l, r) + | Tarrow (flg, l, r, _) when not (Btype.arrow_is_optional flg) -> Some (l, r) | _ -> None let rec extract_last_arrow desc = @@ -236,7 +236,7 @@ let match_generic_printer_type ppf desc path args printer_type = List.map (fun ty_var -> Ctype.newconstr printer_type [ty_var]) args in let ty_expected = List.fold_right - (fun ty_arg ty -> Ctype.newty (Tarrow ("", ty_arg, ty, Cunknown))) + (fun ty_arg ty -> Ctype.newty (Tarrow (Tarr_simple, ty_arg, ty, Cunknown))) ty_args (Ctype.newconstr printer_type [ty_target]) in Ctype.unify !toplevel_env ty_expected @@ -399,8 +399,8 @@ let parse_warnings ppf iserr s = let rec trim_modtype = function Mty_signature _ -> Mty_signature [] - | Mty_functor (id, mty, mty') -> - Mty_functor (id, mty, trim_modtype mty') + | Mty_functor (mp, mty) -> + Mty_functor (mp, trim_modtype mty) | Mty_ident _ | Mty_alias _ as mty -> mty let trim_signature = function diff --git a/toplevel/toploop.ml b/toplevel/toploop.ml index 55ad3f54ad..046d5e563e 100644 --- a/toplevel/toploop.ml +++ b/toplevel/toploop.ml @@ -59,7 +59,7 @@ let rec eval_path = function end | Pdot(p, s, pos) -> Obj.field (eval_path p) pos - | Papply(p1, p2) -> + | Papply(p1, p2, i) -> fatal_error "Toploop.eval_path" let eval_path env path = diff --git a/toplevel/trace.ml b/toplevel/trace.ml index 59dfc1f83a..5970f7b9aa 100644 --- a/toplevel/trace.ml +++ b/toplevel/trace.ml @@ -67,7 +67,7 @@ let rec instrument_result env name ppf clos_typ = match name with | Lident s -> Lident(s ^ "*") | Ldot(lid, s) -> Ldot(lid, s ^ "*") - | Lapply(l1, l2) -> fatal_error "Trace.instrument_result" in + | Lapply(l1, l2, _) -> fatal_error "Trace.instrument_result" in let trace_res = instrument_result env starred_name ppf t2 in (fun clos_val -> Obj.repr (fun arg -> diff --git a/typing/btype.ml b/typing/btype.ml index 16fa60b268..52b445d971 100644 --- a/typing/btype.ml +++ b/typing/btype.ml @@ -57,9 +57,6 @@ let is_Tvar = function {desc=Tvar _} -> true | _ -> false let is_Tunivar = function {desc=Tunivar _} -> true | _ -> false let dummy_method = "*dummy method*" -let default_mty = function - Some mty -> mty - | None -> Mty_signature [] (**** Representative of a type ****) @@ -247,6 +244,7 @@ type type_iterators = it_class_declaration: type_iterators -> class_declaration -> unit; it_class_type_declaration: type_iterators -> class_type_declaration -> unit; it_module_type: type_iterators -> module_type -> unit; + it_module_parameter: type_iterators -> module_parameter -> unit; it_class_type: type_iterators -> class_type -> unit; it_type_kind: type_iterators -> type_kind -> unit; it_do_type_expr: type_iterators -> type_expr -> unit; @@ -292,9 +290,13 @@ let type_iterators = Mty_ident p | Mty_alias p -> it.it_path p | Mty_signature sg -> it.it_signature it sg - | Mty_functor (_, mto, mt) -> - may (it.it_module_type it) mto; + | Mty_functor (mp, mt) -> + it.it_module_parameter it mp; it.it_module_type it mt + and it_module_parameter it = function + | Mpar_generative -> () + | Mpar_applicative(_, mt) -> it.it_module_type it mt + | Mpar_implicit(_, mt) -> it.it_module_type it mt and it_class_type it = function Cty_constr (p, tyl, cty) -> it.it_path p; @@ -332,7 +334,7 @@ let type_iterators = and it_path p = () in { it_path; it_type_expr = it_do_type_expr; it_do_type_expr; - it_type_kind; it_class_type; it_module_type; + it_type_kind; it_class_type; it_module_type; it_module_parameter; it_signature; it_class_type_declaration; it_class_declaration; it_modtype_declaration; it_module_declaration; it_extension_constructor; it_type_declaration; it_value_description; it_signature_item; } @@ -553,6 +555,9 @@ let arrow_is_optional = function | Tarr_optional _ -> true | _ -> false +let is_optional l = + String.length l > 0 && l.[0] = '?' + let label_name = function | Tarr_simple -> "" | Tarr_optional s | Tarr_labelled s -> s diff --git a/typing/btype.mli b/typing/btype.mli index cd8acc4538..cdb57e94e7 100644 --- a/typing/btype.mli +++ b/typing/btype.mli @@ -44,7 +44,6 @@ val newmarkedgenvar: unit -> type_expr val is_Tvar: type_expr -> bool val is_Tunivar: type_expr -> bool val dummy_method: label -val default_mty: module_type option -> module_type val repr: type_expr -> type_expr (* Return the canonical representative of a type. *) @@ -101,6 +100,7 @@ type type_iterators = it_class_declaration: type_iterators -> class_declaration -> unit; it_class_type_declaration: type_iterators -> class_type_declaration -> unit; it_module_type: type_iterators -> module_type -> unit; + it_module_parameter : type_iterators -> Types.module_parameter -> unit; it_class_type: type_iterators -> class_type -> unit; it_type_kind: type_iterators -> type_kind -> unit; it_do_type_expr: type_iterators -> type_expr -> unit; @@ -165,6 +165,7 @@ val forget_abbrev: val arrow_is_simple : arrow_flag -> bool val arrow_is_optional : arrow_flag -> bool +val is_optional: label -> bool val label_name : arrow_flag -> label val label_raw : arrow_flag -> label diff --git a/typing/ctype.ml b/typing/ctype.ml index 9ea8bc31a5..0f701421ee 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -2306,7 +2306,7 @@ let rec concat_longident lid1 = function Lident s -> Ldot (lid1, s) | Ldot (lid2, s) -> Ldot (concat_longident lid1 lid2, s) - | Lapply (lid2, lid) -> Lapply (concat_longident lid1 lid2, lid) + | Lapply (lid2, lid, i) -> Lapply (concat_longident lid1 lid2, lid, i) let nondep_instance env level id ty = let ty = !nondep_type' env id ty in @@ -3890,8 +3890,8 @@ let rec lid_of_path ?(sharp="") = function Longident.Lident (sharp ^ Ident.name id) | Path.Pdot (p1, s, _) -> Longident.Ldot (lid_of_path p1, sharp ^ s) - | Path.Papply (p1, p2) -> - Longident.Lapply (lid_of_path ~sharp p1, lid_of_path p2) + | Path.Papply (p1, p2, i) -> + Longident.Lapply (lid_of_path ~sharp p1, lid_of_path p2, i) let find_cltype_for_path env p = let path, cl_abbr = Env.lookup_type (lid_of_path ~sharp:"#" p) env in diff --git a/typing/env.ml b/typing/env.ml index d317dc569f..2d92beb536 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -188,7 +188,8 @@ type t = { classes: (Path.t * class_declaration) EnvTbl.t; cltypes: (Path.t * class_type_declaration) EnvTbl.t; functor_args: unit Ident.tbl; - implicit_instances: (Path.t * module_declaration) list; + implicit_instances: + (Path.t * (Ident.t * module_type) list * module_type) list; summary: summary; local_constraints: bool; gadt_instances: (int * TypeSet.t ref) list; @@ -218,9 +219,8 @@ and structure_components = { } and functor_components = { - fcomp_param: Ident.t; (* Formal parameter *) - fcomp_arg: module_type option; (* Argument signature *) - fcomp_res: module_type; (* Result signature *) + fcomp_param: module_parameter; (* Formal parameter *) + fcomp_res: module_type; (* Result signature *) fcomp_env: t; (* Environment in which the result signature makes sense *) fcomp_subst: Subst.t; (* Prefixing substitution for the result signature *) fcomp_cache: (Path.t, module_components) Hashtbl.t; (* For memoization *) @@ -284,8 +284,9 @@ let components_of_module_maker' = ref ((fun (env, sub, path, mty) -> assert false) : t * Subst.t * Path.t * module_type -> module_components_repr) let components_of_functor_appl' = - ref ((fun f p1 p2 -> assert false) : - functor_components -> Path.t -> Path.t -> module_components) + ref ((fun f p1 p2 i -> assert false) : + functor_components -> Path.t -> Path.t -> + Asttypes.implicit_flag -> module_components) let check_modtype_inclusion = (* to be filled with Includemod.check_modtype_inclusion *) ref ((fun env mty1 path1 mty2 -> assert false) : @@ -298,13 +299,6 @@ let strengthen = let md ?(implicit_ = Asttypes.Nonimplicit) md_type = {md_type; md_attributes=[]; md_loc=Location.none; md_implicit = implicit_} -let register_if_implicit path md env = - match md.md_implicit with - | Asttypes.Nonimplicit -> env - | Asttypes.Implicit _ -> - let md = {md with md_type = !strengthen env md.md_type path} in - {env with implicit_instances = (path, md) :: env.implicit_instances} - (* The name of the compilation unit currently compiled. "" if outside a compilation unit. *) @@ -471,12 +465,12 @@ let rec find_module_descr path env = | Functor_comps f -> raise Not_found end - | Papply(p1, p2) -> + | Papply(p1, p2, i) -> begin match EnvLazy.force !components_of_module_maker' (find_module_descr p1 env) with Functor_comps f -> - !components_of_functor_appl' f p1 p2 + !components_of_functor_appl' f p1 p2 i | Structure_comps c -> raise Not_found end @@ -495,7 +489,7 @@ let find proj1 proj2 path env = | Functor_comps f -> raise Not_found end - | Papply(p1, p2) -> + | Papply(p1, p2, i) -> raise Not_found let find_value = @@ -536,7 +530,7 @@ let find_module ~alias path env = | Functor_comps f -> raise Not_found end - | Papply(p1, p2) -> + | Papply(p1, p2, i) -> let desc1 = find_module_descr p1 env in begin match EnvLazy.force !components_of_module_maker' desc1 with Functor_comps f -> @@ -548,9 +542,14 @@ let find_module ~alias path env = try Hashtbl.find f.fcomp_subst_cache p2 with Not_found -> + let param_id = + match f.fcomp_param with + | Mpar_generative -> assert false + | Mpar_applicative(id, _) | Mpar_implicit(id, _) -> id + in let mty = Subst.modtype - (Subst.add_module f.fcomp_param p2 f.fcomp_subst) + (Subst.add_module param_id p2 f.fcomp_subst) f.fcomp_res in Hashtbl.add f.fcomp_subst_cache p2 mty; mty @@ -572,8 +571,8 @@ let rec normalize_path lax env path = match path with Pdot(p, s, pos) -> Pdot(normalize_path lax env p, s, pos) - | Papply(p1, p2) -> - Papply(normalize_path lax env p1, normalize_path true env p2) + | Papply(p1, p2, i) -> + Papply(normalize_path lax env p1, normalize_path true env p2, i) | _ -> path in try match find_module ~alias:true path env with @@ -676,12 +675,6 @@ let rec implicit_cannot_occur path env = let implicit_instances env = env.implicit_instances -let register_as_implicit path arity env = - let md = find_module path env in - let md = {md with md_implicit = Implicit arity} in - (* FIXME: Check arity *) - register_if_implicit path md env - (* Lookup by name *) exception Recmodule @@ -705,14 +698,20 @@ let rec lookup_module_descr lid env = | Functor_comps f -> raise Not_found end - | Lapply(l1, l2) -> + | Lapply(l1, l2, i) -> let (p1, desc1) = lookup_module_descr l1 env in let p2 = lookup_module true l2 env in let {md_type=mty2} = find_module p2 env in begin match EnvLazy.force !components_of_module_maker' desc1 with - Functor_comps f -> - Misc.may (!check_modtype_inclusion env mty2 p2) f.fcomp_arg; - (Papply(p1, p2), !components_of_functor_appl' f p1 p2) + | Functor_comps f -> begin + match f.fcomp_param, i with + | Mpar_generative, _ -> raise Not_found + | Mpar_applicative _, Implicit -> raise Not_found + | Mpar_implicit _, Nonimplicit -> raise Not_found + | (Mpar_applicative(_, param) | Mpar_implicit(_, param)), _ -> + !check_modtype_inclusion env mty2 p2 param; + (Papply(p1, p2, i), !components_of_functor_appl' f p1 p2 i) + end | Structure_comps c -> raise Not_found end @@ -747,15 +746,21 @@ and lookup_module ~load lid env : Path.t = | Functor_comps f -> raise Not_found end - | Lapply(l1, l2) -> + | Lapply(l1, l2, i) -> let (p1, desc1) = lookup_module_descr l1 env in let p2 = lookup_module true l2 env in let {md_type=mty2} = find_module p2 env in - let p = Papply(p1, p2) in + let p = Papply(p1, p2, i) in begin match EnvLazy.force !components_of_module_maker' desc1 with - Functor_comps f -> - Misc.may (!check_modtype_inclusion env mty2 p2) f.fcomp_arg; - p + | Functor_comps f -> begin + match f.fcomp_param, i with + | Mpar_generative, _ -> raise Not_found + | Mpar_applicative _, Implicit -> raise Not_found + | Mpar_implicit _, Nonimplicit -> raise Not_found + | (Mpar_applicative(_, param) | Mpar_implicit(_, param)), _ -> + !check_modtype_inclusion env mty2 p2 param; + p + end | Structure_comps c -> raise Not_found end @@ -773,7 +778,7 @@ let lookup proj1 proj2 lid env = | Functor_comps f -> raise Not_found end - | Lapply(l1, l2) -> + | Lapply(l1, l2, i) -> raise Not_found let lookup_simple proj1 proj2 lid env = @@ -789,7 +794,7 @@ let lookup_simple proj1 proj2 lid env = | Functor_comps f -> raise Not_found end - | Lapply(l1, l2) -> + | Lapply(l1, l2, i) -> raise Not_found let lookup_all_simple proj1 proj2 shadow lid env = @@ -817,7 +822,7 @@ let lookup_all_simple proj1 proj2 shadow lid env = | Functor_comps f -> raise Not_found end - | Lapply(l1, l2) -> + | Lapply(l1, l2, i) -> raise Not_found let has_local_constraints env = env.local_constraints @@ -904,7 +909,7 @@ let path_subst_last path id = match path with Pident _ -> Pident id | Pdot (p, name, pos) -> Pdot(p, Ident.name id, pos) - | Papply (p1, p2) -> assert false + | Papply (p1, p2, i) -> assert false let mark_type_path env path = try @@ -1266,6 +1271,22 @@ let prefix_idents_and_subst root sub sg = else prefix_idents_and_subst root sub sg +let register_if_implicit path md env = + match md.md_implicit with + | Asttypes.Nonimplicit -> env + | Asttypes.Implicit -> + let mty = !strengthen env md.md_type path in + let rec add acc params mty = + let acc = ((path, List.rev params, mty) :: acc) in + match scrape_alias env mty with + | Mty_functor (Mpar_implicit(id, param), res) -> + let params = (id, param) :: params in + add acc params res + | _ -> acc + in + let implicit_instances = add env.implicit_instances [] mty in + {env with implicit_instances} + (* Compute structure descriptions *) let add_to_tbl id decl tbl = @@ -1349,12 +1370,19 @@ and components_of_module_maker (env, sub, path, mty) = Tbl.add (Ident.name id) (decl', !pos) c.comp_cltypes) sg pl; Structure_comps c - | Mty_functor(param, ty_arg, ty_res) -> + | Mty_functor(param, ty_res) -> + (* fcomp_arg must be prefixed eagerly, because it is interpreted + in the outer environment, not in env *) + let param = + match param with + | Mpar_generative -> Mpar_generative + | Mpar_applicative(id, mty) -> + Mpar_applicative(id, Subst.modtype sub mty) + | Mpar_implicit(id, mty) -> + Mpar_implicit(id, Subst.modtype sub mty) + in Functor_comps { fcomp_param = param; - (* fcomp_arg must be prefixed eagerly, because it is interpreted - in the outer environment, not in env *) - fcomp_arg = may_map (Subst.modtype sub) ty_arg; (* fcomp_res is prefixed lazily, because it is interpreted in env *) fcomp_res = ty_res; fcomp_env = env; @@ -1522,13 +1550,18 @@ and store_cltype slot id path desc env renv = (* Compute the components of a functor application in a path. *) -let components_of_functor_appl f p1 p2 = +let components_of_functor_appl f p1 p2 i = try Hashtbl.find f.fcomp_cache p2 with Not_found -> - let p = Papply(p1, p2) in + let p = Papply(p1, p2, i) in + let param_id = + match f.fcomp_param with + | Mpar_generative -> assert false + | Mpar_applicative(id, _) | Mpar_implicit(id, _) -> id + in let mty = - Subst.modtype (Subst.add_module f.fcomp_param p2 Subst.identity) + Subst.modtype (Subst.add_module param_id p2 Subst.identity) f.fcomp_res in let comps = components_of_module f.fcomp_env f.fcomp_subst p mty in Hashtbl.add f.fcomp_cache p2 comps; diff --git a/typing/env.mli b/typing/env.mli index 6432c74e95..d970c29e7e 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -85,7 +85,8 @@ val gadt_instance_level: t -> type_expr -> int option val add_gadt_instances: t -> int -> type_expr list -> unit val add_gadt_instance_chain: t -> int -> type_expr -> unit -val implicit_instances: t -> (Path.t * module_declaration) list +val implicit_instances: + t -> (Path.t * (Ident.t * Types.module_type) list * Types.module_type) list (* Lookup by long identifiers *) @@ -135,9 +136,6 @@ val open_pers_signature: string -> t -> t val open_implicit: Path.t -> signature -> t -> t -(* Mark one path as implicit *) -val register_as_implicit: Path.t -> int -> t -> t - (* Insertion by name *) val enter_value: diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 8120c35632..f794afc33c 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -30,7 +30,7 @@ let rec list_filtermap f = function let string_of_path path = Path.to_longident path |> Longident.flatten |> String.concat "." -let papply path arg = Path.Papply (path, arg) +let papply path arg = Path.Papply (path, arg, Asttypes.Implicit) (** [target] is the point from which a search starts *) type target = { @@ -438,28 +438,6 @@ let target_of_pending inst = !variables, {target_type = mty; target_id = id; target_uid = id; target_hkt = hkt} -let rec extract_implicit_parameters targets n omty nmty = - assert (n >= 0); - if n = 0 then - List.rev targets, nmty - else match omty, nmty with - | Mty_functor (target_uid, Some _, omty'), - Mty_functor (target_id, Some target_type, nmty') -> - extract_implicit_parameters - ({target_uid; target_id; target_type; target_hkt = []} :: targets) (n - 1) omty' nmty' - | _ -> assert false - -let find_implicit_parameters {Types. md_type = omty; md_implicit} = - match md_implicit with - | Asttypes.Nonimplicit -> assert false - | Asttypes.Implicit 0 -> - (* No copy, so we don't lose equality *) - [], omty - - | Asttypes.Implicit arity -> - let nmty = Subst.modtype Subst.identity omty in - extract_implicit_parameters [] arity omty nmty - (** Termination checking **) module Termination : sig @@ -719,7 +697,7 @@ let report_error msg exn = module Search : sig - type candidate = Path.t * Types.module_declaration + type candidate = Path.t * target list * Types.module_type type query type partial @@ -742,7 +720,7 @@ module Search : sig end = struct - type candidate = Path.t * Types.module_declaration + type candidate = Path.t * target list * Types.module_type type 'a state = { @@ -813,8 +791,31 @@ end = struct eq_table = eq_table; } + let make_candidate path params mty = + let rec loop path res s acc = function + | [] -> path, List.rev acc, Subst.modtype s res + | (id, param) :: rest -> + let param' = Subst.modtype s param in + let id' = Ident.rename id in + let s' = Subst.add_module id (Path.Pident id') s in + let target = + { target_uid = id; + target_id = id'; + target_type = param'; + target_hkt = []; } + in + let acc' = target :: acc in + loop path res s' acc' rest + in + loop path mty Subst.identity [] params + + let make_candidate (path, params, mty) = + match params with + | [] -> (path, [], mty) + | params -> make_candidate path params mty + let all_candidates t = - Env.implicit_instances t.env + List.map make_candidate (Env.implicit_instances t.env) let cleanup_equations ident eq_table = try @@ -826,7 +827,7 @@ end = struct exception Invalid_candidate - let step0 state (path, md) = + let step0 state (path, sub_targets, candidate_mty) = state.eq_var := state.eq_initial; let rec print_paths ppf = function | [] -> Format.pp_print_string ppf "_"; @@ -835,7 +836,6 @@ end = struct let print_paths ppf ps = print_paths ppf (List.rev ps) in printf "%a <- %a\n" print_paths state.debug_path Printtyp.path path; let target = state.target in - let sub_targets, candidate_mty = find_implicit_parameters md in (* Generate coercion. if this succeeds this produce equations in eq_var *) let eq_table, env = List.fold_left (fun (eq_table, env) sub_target -> @@ -1037,19 +1037,19 @@ let rec canonical_path env path = | Mty_alias path -> canonical_path env path | _ -> match path with | Path.Pident _ -> path - | Path.Pdot (p1,s,i) -> + | Path.Pdot (p1,s,pos) -> let p1' = canonical_path env p1 in if p1 == p1' then path else - Path.Pdot (p1', s, i) - | Path.Papply (p1, p2) -> + Path.Pdot (p1', s, pos) + | Path.Papply (p1, p2, i) -> let p1' = canonical_path env p1 and p2' = canonical_path env p2 in if p1' == p1 && p2 == p2' then path else - Path.Papply (p1', p2') + Path.Papply (p1', p2', i) with Not_found -> (*?!*) path @@ -1125,21 +1125,53 @@ let pack_implicit inst path = mod_env = env; mod_attributes = []; } - | Path.Papply (p1,p2) -> + | Path.Papply (p1, p2, i) -> let mfun = translpath p1 and marg = translpath p2 in - match mfun.mod_type with - | Mty_functor (param, Some mty_param, mty_res) -> - let coercion = Includemod.modtypes env marg.mod_type mty_param in - let mty_appl = Subst.modtype - (Subst.add_module param p2 Subst.identity) mty_res - in - { mod_desc = Tmod_apply(mfun, marg, coercion); - mod_type = mty_appl; - mod_env = env; - mod_attributes = []; - mod_loc = loc; - } - | _ -> assert false + let rec loop acc mty = + match mty with + | Mty_functor (param, mty_res) -> + let param, mty_param = + match param with + | Mpar_generative -> assert false + | Mpar_applicative(param, mty_param) + | Mpar_implicit(param, mty_param) -> + param, mty_param + in + let coercion = Includemod.modtypes env marg.mod_type mty_param in + let mty_appl = + Subst.modtype + (Subst.add_module param p2 Subst.identity) mty_res + in + let marg = + match i with + | Asttypes.Nonimplicit -> Tmarg_applicative(marg, coercion) + | Asttypes.Implicit -> Tmarg_implicit(marg, coercion) + in + { mod_desc = Tmod_apply(acc, marg); + mod_type = mty_appl; + mod_env = env; + mod_attributes = []; + mod_loc = loc; + } + | Mty_ident path -> + let mty = Includemod.expand_module_path env [] path in + loop acc mty + | Mty_alias path -> + let path = Env.normalize_path (Some loc) env path in + let mty = Includemod.expand_module_alias env [] path in + let acc = + { mod_desc = Tmod_constraint (acc, mty, Tmodtype_implicit, + Tcoerce_alias (path, Tcoerce_none)); + mod_type = mty; + mod_env = env; + mod_attributes = []; + mod_loc = loc; + } + in + loop acc mty + | _ -> assert false + in + loop mfun mfun.mod_type in let modl = translpath path in let (modl, tl') = !type_implicit_instance env modl p nl tl in diff --git a/typing/includemod.ml b/typing/includemod.ml index 246475a2ad..20957f6450 100644 --- a/typing/includemod.ml +++ b/typing/includemod.ml @@ -19,8 +19,7 @@ open Types type symptom = Missing_field of Ident.t * Location.t * string (* kind *) - | Implicit_flags of Ident.t * Asttypes.implicit_flag * Location.t * - Asttypes.implicit_flag * Location.t + | Implicit_flags of Ident.t * Location.t * Location.t | Value_descriptions of Ident.t * value_description * value_description | Type_declarations of Ident.t * type_declaration * type_declaration * Includecore.type_mismatch list @@ -41,7 +40,16 @@ type symptom = | Invalid_module_alias of Path.t type pos = - Module of Ident.t | Modtype of Ident.t | Arg of Ident.t | Body of Ident.t + | Module of Ident.t + | Modtype of Ident.t + | Param of pos_param + | Body of pos_param + +and pos_param = + | Generative + | Applicative of Ident.t + | Implicit of Ident.t + type error = pos list * Env.t * symptom exception Error of error list @@ -54,10 +62,10 @@ exception Error of error list let implicit_flags env cxt id f1 l1 f2 l2 = match f1, f2 with - | Asttypes.Implicit x , Asttypes.Implicit x' when x = x' -> () - | Asttypes.Implicit _ , Asttypes.Nonimplicit -> () + | Asttypes.Implicit, Asttypes.Implicit -> () + | Asttypes.Implicit, Asttypes.Nonimplicit -> () | Asttypes.Nonimplicit, Asttypes.Nonimplicit -> () - | _ -> raise(Error[cxt, env, Implicit_flags(id, f1, l1, f2, l2)]) + | _ -> raise(Error[cxt, env, Implicit_flags(id, l1, l2)]) (* Inclusion between value descriptions *) @@ -256,22 +264,41 @@ and try_modtypes env cxt subst mty1 mty2 = try_modtypes2 env cxt mty1 (Subst.modtype subst mty2) | (Mty_signature sig1, Mty_signature sig2) -> signatures env cxt subst sig1 sig2 - | (Mty_functor(param1, None, res1), Mty_functor(param2, None, res2)) -> - begin match modtypes env (Body param1::cxt) subst res1 res2 with - Tcoerce_none -> Tcoerce_none - | cc -> Tcoerce_functor (Tcoerce_none, cc) - end - | (Mty_functor(param1, Some arg1, res1), - Mty_functor(param2, Some arg2, res2)) -> - let arg2' = Subst.modtype subst arg2 in - let cc_arg = modtypes env (Arg param1::cxt) Subst.identity arg2' arg1 in - let cc_res = - modtypes (Env.add_module param1 arg2' env) (Body param1::cxt) - (Subst.add_module param2 (Pident param1) subst) res1 res2 in - begin match (cc_arg, cc_res) with - (Tcoerce_none, Tcoerce_none) -> Tcoerce_none - | _ -> Tcoerce_functor(cc_arg, cc_res) - end + | (Mty_functor(param1, res1), Mty_functor(param2, res2)) -> begin + match param1, param2 with + | Mpar_generative, Mpar_generative -> begin + match modtypes env (Body Generative::cxt) subst res1 res2 with + | Tcoerce_none -> Tcoerce_none + | cc -> Tcoerce_functor (Tcoerce_none, cc) + end + | Mpar_applicative(id1, arg1), Mpar_applicative(id2, arg2) -> begin + let arg2' = Subst.modtype subst arg2 in + let cc_arg = + modtypes env (Param (Applicative id1)::cxt) Subst.identity arg2' arg1 + in + let cc_res = + modtypes (Env.add_module id1 arg2' env) (Body (Applicative id1)::cxt) + (Subst.add_module id2 (Pident id1) subst) res1 res2 + in + match (cc_arg, cc_res) with + (Tcoerce_none, Tcoerce_none) -> Tcoerce_none + | _ -> Tcoerce_functor(cc_arg, cc_res) + end + | Mpar_implicit(id1, arg1), Mpar_implicit(id2, arg2) -> begin + let arg2' = Subst.modtype subst arg2 in + let cc_arg = + modtypes env (Param (Implicit id1)::cxt) Subst.identity arg2' arg1 + in + let cc_res = + modtypes (Env.add_module id1 arg2' env) (Body (Implicit id1)::cxt) + (Subst.add_module id2 (Pident id1) subst) res1 res2 + in + match (cc_arg, cc_res) with + (Tcoerce_none, Tcoerce_none) -> Tcoerce_none + | _ -> Tcoerce_functor(cc_arg, cc_res) + end + | (_, _) -> raise Dont_match + end | (_, _) -> raise Dont_match @@ -492,19 +519,8 @@ let include_err ppf = function | Missing_field (id, loc, kind) -> fprintf ppf "The %s `%a' is required but not provided" kind ident id; show_loc "Expected declaration" ppf loc - | Implicit_flags (id, f1, l1, f2, l2) -> - let lhs ppf = function - | Asttypes.Nonimplicit -> fprintf ppf "it is non implicit" - | Asttypes.Implicit 0 -> fprintf ppf "it is implicit" - | Asttypes.Implicit n -> fprintf ppf "it has arity %d" n - in - let rhs ppf = function - | Asttypes.Nonimplicit -> fprintf ppf "be non implicit" - | Asttypes.Implicit 0 -> fprintf ppf "be directly implicit" - | Asttypes.Implicit n -> fprintf ppf "have arity %d" n - in - fprintf ppf "Implicit annotation of `%a' is not compatible: %a while it was expected to %a" - ident id lhs f1 rhs f2; + | Implicit_flags (id, l1, l2) -> + fprintf ppf "Implicit annotations of %a do not match" ident id; show_locs ppf (l1, l2) | Value_descriptions(id, d1, d2) -> fprintf ppf @@ -567,24 +583,50 @@ let include_err ppf = function let rec context ppf = function Module id :: rem -> - fprintf ppf "@[<2>module %a%a@]" ident id args rem + fprintf ppf "@[<2>module %a%a@]" ident id params rem | Modtype id :: rem -> fprintf ppf "@[<2>module type %a =@ %a@]" ident id context_mty rem - | Body x :: rem -> - fprintf ppf "functor (%s) ->@ %a" (argname x) context_mty rem - | Arg x :: rem -> - fprintf ppf "functor (%a : %a) -> ..." ident x context_mty rem + | Body p :: rem -> begin + match p with + | Generative -> + fprintf ppf "functor () ->@ %a" context_mty rem + | Applicative x -> + fprintf ppf "functor (%a) ->@ %a" ident x context_mty rem + | Implicit x -> + fprintf ppf "functor {%a} ->@ %a" ident x context_mty rem + end + | Param p :: rem -> begin + match p with + | Generative -> assert false + | Applicative x -> + fprintf ppf "functor (%a : %a) -> ..." ident x context_mty rem + | Implicit x -> + fprintf ppf "functor {%a : %a} -> ..." ident x context_mty rem + end | [] -> fprintf ppf "<here>" and context_mty ppf = function (Module _ | Modtype _) :: _ as rem -> fprintf ppf "@[<2>sig@ %a@;<1 -2>end@]" context rem | cxt -> context ppf cxt -and args ppf = function - Body x :: rem -> - fprintf ppf "(%s)%a" (argname x) args rem - | Arg x :: rem -> - fprintf ppf "(%a :@ %a) : ..." ident x context_mty rem +and params ppf = function + Body p :: rem -> begin + match p with + | Generative -> + fprintf ppf "()%a" params rem + | Applicative x -> + fprintf ppf "(%a)%a" ident x params rem + | Implicit x -> + fprintf ppf "{%a}%a" ident x params rem + end + | Param p :: rem -> begin + match p with + | Generative -> assert false + | Applicative x -> + fprintf ppf "(%a :@ %a) : ..." ident x context_mty rem + | Implicit x -> + fprintf ppf "{%a :@ %a} : ..." ident x context_mty rem + end | cxt -> fprintf ppf " :@ %a" context_mty cxt and argname x = diff --git a/typing/includemod.mli b/typing/includemod.mli index 78c45925ac..61e599b1d5 100644 --- a/typing/includemod.mli +++ b/typing/includemod.mli @@ -26,8 +26,7 @@ val print_coercion: formatter -> module_coercion -> unit type symptom = Missing_field of Ident.t * Location.t * string (* kind *) - | Implicit_flags of Ident.t * Asttypes.implicit_flag * Location.t * - Asttypes.implicit_flag * Location.t + | Implicit_flags of Ident.t * Location.t * Location.t | Value_descriptions of Ident.t * value_description * value_description | Type_declarations of Ident.t * type_declaration * type_declaration * Includecore.type_mismatch list @@ -48,10 +47,20 @@ type symptom = | Invalid_module_alias of Path.t type pos = - Module of Ident.t | Modtype of Ident.t | Arg of Ident.t | Body of Ident.t + | Module of Ident.t + | Modtype of Ident.t + | Param of pos_param + | Body of pos_param + +and pos_param = + | Generative + | Applicative of Ident.t + | Implicit of Ident.t + type error = pos list * Env.t * symptom exception Error of error list val report_error: formatter -> error list -> unit +val expand_module_path: Env.t -> pos list -> Path.t -> Types.module_type val expand_module_alias: Env.t -> pos list -> Path.t -> Types.module_type diff --git a/typing/mtype.ml b/typing/mtype.ml index 3db1015b6e..47338787a2 100644 --- a/typing/mtype.ml +++ b/typing/mtype.ml @@ -34,9 +34,14 @@ let rec strengthen env mty p = match scrape env mty with Mty_signature sg -> Mty_signature(strengthen_sig env sg p) - | Mty_functor(param, arg, res) - when !Clflags.applicative_functors && Ident.name param <> "*" -> - Mty_functor(param, arg, strengthen env res (Papply(p, Pident param))) + | Mty_functor(Mpar_applicative(id, _) as param, res) + when !Clflags.applicative_functors -> + let res' = strengthen env res (Papply(p, Pident id, Nonimplicit)) in + Mty_functor(param, res') + | Mty_functor(Mpar_implicit(id, _) as param, res) + when !Clflags.applicative_functors -> + let res' = strengthen env res (Papply(p, Pident id, Implicit)) in + Mty_functor(param, res') | mty -> mty @@ -108,13 +113,27 @@ let nondep_supertype env mid mty = else mty | Mty_signature sg -> Mty_signature(nondep_sig env va sg) - | Mty_functor(param, arg, res) -> + | Mty_functor(param, res) -> begin let var_inv = - match va with Co -> Contra | Contra -> Co | Strict -> Strict in - Mty_functor(param, Misc.may_map (nondep_mty env var_inv) arg, - nondep_mty - (Env.add_module ~arg:true param - (Btype.default_mty arg) env) va res) + match va with + | Co -> Contra + | Contra -> Co + | Strict -> Strict + in + match param with + | Mpar_generative -> + Mty_functor(Mpar_generative, nondep_mty env va res) + | Mpar_applicative(id, arg) -> + Mty_functor(Mpar_applicative(id, nondep_mty env var_inv arg), + nondep_mty + (Env.add_module ~arg:true id arg env) + va res) + | Mpar_implicit(id, arg) -> + Mty_functor(Mpar_implicit(id, nondep_mty env var_inv arg), + nondep_mty + (Env.add_module ~arg:true id arg env) + va res) + end and nondep_sig env va = function [] -> [] @@ -193,7 +212,7 @@ let rec type_paths env p mty = Mty_ident p -> [] | Mty_alias p -> [] | Mty_signature sg -> type_paths_sig env p 0 sg - | Mty_functor(param, arg, res) -> [] + | Mty_functor(param, res) -> [] and type_paths_sig env p pos sg = match sg with @@ -217,7 +236,7 @@ let rec no_code_needed env mty = match scrape env mty with Mty_ident p -> false | Mty_signature sg -> no_code_needed_sig env sg - | Mty_functor(_, _, _) -> false + | Mty_functor(_, _) -> false | Mty_alias p -> true and no_code_needed_sig env sg = @@ -248,7 +267,7 @@ let rec contains_type env = function end | Mty_signature sg -> contains_type_sig env sg - | Mty_functor (_, _, body) -> + | Mty_functor (_, body) -> contains_type env body | Mty_alias _ -> () @@ -287,12 +306,12 @@ module IdentSet = Set.Make (struct type t = Ident.t let compare = compare end) let rec get_prefixes = function Pident _ -> PathSet.empty | Pdot (p, _, _) - | Papply (p, _) -> PathSet.add p (get_prefixes p) + | Papply (p, _, _) -> PathSet.add p (get_prefixes p) let rec get_arg_paths = function Pident _ -> PathSet.empty | Pdot (p, _, _) -> get_arg_paths p - | Papply (p1, p2) -> + | Papply (p1, p2, _) -> PathSet.add p2 (PathSet.union (get_prefixes p2) (PathSet.union (get_arg_paths p1) (get_arg_paths p2))) diff --git a/typing/oprint.ml b/typing/oprint.ml index 1d298980d2..9f933fb649 100644 --- a/typing/oprint.ml +++ b/typing/oprint.ml @@ -24,8 +24,10 @@ let rec print_ident ppf = Oide_ident s -> pp_print_string ppf s | Oide_dot (id, s) -> print_ident ppf id; pp_print_char ppf '.'; pp_print_string ppf s - | Oide_apply (id1, id2) -> + | Oide_apply (id1, id2, Asttypes.Nonimplicit) -> fprintf ppf "%a(%a)" print_ident id1 print_ident id2 + | Oide_apply (id1, id2, Asttypes.Implicit) -> + fprintf ppf "%a{%a}" print_ident id1 print_ident id2 let parenthesized_ident name = (List.mem name ["or"; "mod"; "land"; "lor"; "lxor"; "lsl"; "lsr"; "asr"]) @@ -370,27 +372,19 @@ let out_type_extension = ref (fun _ -> failwith "Oprint.out_type_extension") let rec print_out_functor ppf = function - Omty_functor (_, None, mty_res) -> - fprintf ppf "() %a" print_out_functor mty_res - | Omty_functor (name , Some mty_arg, mty_res) -> - fprintf ppf "(%s : %a) %a" name - print_out_module_type mty_arg print_out_functor mty_res + | Omty_functor (mparam, mty_res) -> + fprintf ppf "%a %a" + print_out_module_parameter mparam + print_out_functor mty_res | m -> fprintf ppf "->@ %a" print_out_module_type m -and print_out_implicit_functor n ppf = +and print_out_module_parameter ppf = function - | Omty_functor (name , Some mty_arg, mty_res) when n > 0 -> - fprintf ppf "{%s : %a} %a" name - print_out_module_type mty_arg - (print_out_implicit_functor (n - 1)) mty_res - (* The implicit declares 'n' parameters, but when printing module_type - we leave the implicit parameters side. If the state is consistent, - n should be 0 now. *) - | Omty_alias id -> - assert (n = 0); - fprintf ppf "=@ %a" print_ident id - | m -> - assert (n = 0); - fprintf ppf ":@ %a" print_out_module_type m + | Ompar_generative -> + fprintf ppf "()" + | Ompar_applicative(name, mty) -> + fprintf ppf "(%s : %a)" name print_out_module_type mty + | Ompar_implicit(name, mty) -> + fprintf ppf "{%s : %a}" name print_out_module_type mty and print_out_module_type ppf = function @@ -452,19 +446,14 @@ and print_out_sig_item ppf = fprintf ppf "@[<2>module type %s =@ %a@]" name !out_module_type mty | Osig_module (name, Omty_alias id, _, _) -> fprintf ppf "@[<2>module %s =@ %a@]" name print_ident id - | Osig_module (name, mty, rs, Asttypes.Nonimplicit) -> - fprintf ppf "@[<2>%s %s :@ %a@]" + | Osig_module (name, mty, rs, i) -> + fprintf ppf "@[<2>%s%s %s :@ %a@]" + (match i with Asttypes.Nonimplicit -> "" + | Asttypes.Implicit -> "implicit ") (match rs with Orec_not -> "module" | Orec_first -> "module rec" | Orec_next -> "and") name !out_module_type mty - | Osig_module (name, mty, rs, Asttypes.Implicit n) -> - fprintf ppf "@[<2>%s module %s %a@]" - (match rs with Orec_not -> "implicit" - | Orec_first -> "implicit rec" - | Orec_next -> "and") - name - (print_out_implicit_functor n) mty | Osig_type(td, rs) -> print_out_type_decl (match rs with diff --git a/typing/outcometree.mli b/typing/outcometree.mli index fc991bcad0..77d6128444 100644 --- a/typing/outcometree.mli +++ b/typing/outcometree.mli @@ -20,7 +20,7 @@ [Toploop.print_out_phrase] *) type out_ident = - | Oide_apply of out_ident * out_ident + | Oide_apply of out_ident * out_ident * Asttypes.implicit_flag | Oide_dot of out_ident * string | Oide_ident of string @@ -77,10 +77,14 @@ and out_class_sig_item = type out_module_type = | Omty_abstract - | Omty_functor of string * out_module_type option * out_module_type + | Omty_functor of out_module_parameter * out_module_type | Omty_ident of out_ident | Omty_signature of out_sig_item list | Omty_alias of out_ident +and out_module_parameter = + | Ompar_generative + | Ompar_applicative of string * out_module_type + | Ompar_implicit of string * out_module_type and out_sig_item = | Osig_class of bool * string * (string * (bool * bool)) list * out_class_type * diff --git a/typing/path.ml b/typing/path.ml index 90ae0ba61c..7946ad36e6 100644 --- a/typing/path.ml +++ b/typing/path.ml @@ -13,7 +13,7 @@ type t = Pident of Ident.t | Pdot of t * string * int - | Papply of t * t + | Papply of t * t * Asttypes.implicit_flag let nopos = -1 @@ -21,19 +21,19 @@ let rec same p1 p2 = match (p1, p2) with (Pident id1, Pident id2) -> Ident.same id1 id2 | (Pdot(p1, s1, pos1), Pdot(p2, s2, pos2)) -> s1 = s2 && same p1 p2 - | (Papply(fun1, arg1), Papply(fun2, arg2)) -> + | (Papply(fun1, arg1, i1), Papply(fun2, arg2, i2)) -> same fun1 fun2 && same arg1 arg2 | (_, _) -> false let rec isfree id = function Pident id' -> Ident.same id id' | Pdot(p, s, pos) -> isfree id p - | Papply(p1, p2) -> isfree id p1 || isfree id p2 + | Papply(p1, p2, i) -> isfree id p1 || isfree id p2 let rec binding_time = function Pident id -> Ident.binding_time id | Pdot(p, s, pos) -> binding_time p - | Papply(p1, p2) -> max (binding_time p1) (binding_time p2) + | Papply(p1, p2, i) -> max (binding_time p1) (binding_time p2) let kfalse x = false @@ -41,7 +41,10 @@ let rec name ?(paren=kfalse) = function Pident id -> Ident.name id | Pdot(p, s, pos) -> name ~paren p ^ if paren s then ".( " ^ s ^ " )" else "." ^ s - | Papply(p1, p2) -> name ~paren p1 ^ "(" ^ name ~paren p2 ^ ")" + | Papply(p1, p2, Asttypes.Nonimplicit) -> + name ~paren p1 ^ "(" ^ name ~paren p2 ^ ")" + | Papply(p1, p2, Asttypes.Implicit) -> + name ~paren p1 ^ "{" ^ name ~paren p2 ^ "}" let rec is_application = function | Pdot (p, _, _) -> is_application p @@ -51,17 +54,18 @@ let rec is_application = function let rec head = function Pident id -> id | Pdot(p, s, pos) -> head p - | Papply(p1, p2) -> assert false + | Papply(p1, p2, i) -> assert false let rec last = function | Pident id -> Ident.name id | Pdot(_, s, _) -> s - | Papply(_, p) -> last p + | Papply(_, p, _) -> last p let rec to_longident = function | Pident id -> Longident.Lident (Ident.name id) | Pdot(p, s, _) -> Longident.Ldot (to_longident p, s) - | Papply (p1, p2) -> Longident.Lapply (to_longident p1, to_longident p2) + | Papply (p1, p2, i) -> + Longident.Lapply (to_longident p1, to_longident p2, i) let rec flatten acc = function | Pident id -> id, acc diff --git a/typing/path.mli b/typing/path.mli index b27dd4cbb3..a0afe386a4 100644 --- a/typing/path.mli +++ b/typing/path.mli @@ -15,7 +15,7 @@ type t = Pident of Ident.t | Pdot of t * string * int - | Papply of t * t + | Papply of t * t * Asttypes.implicit_flag val same: t -> t -> bool val isfree: Ident.t -> t -> bool diff --git a/typing/printtyp.ml b/typing/printtyp.ml index 57f4889364..5d9020e03f 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -27,7 +27,10 @@ open Outcometree let rec longident ppf = function | Lident s -> pp_print_string ppf s | Ldot(p, s) -> fprintf ppf "%a.%s" longident p s - | Lapply(p1, p2) -> fprintf ppf "%a(%a)" longident p1 longident p2 + | Lapply(p1, p2, Nonimplicit) -> + fprintf ppf "%a(%a)" longident p1 longident p2 + | Lapply(p1, p2, Implicit) -> + fprintf ppf "%a{%a}" longident p1 longident p2 (* Print an identifier *) @@ -63,8 +66,8 @@ let rec tree_of_path = function Oide_ident s | Pdot(p, s, pos) -> Oide_dot (tree_of_path p, s) - | Papply(p1, p2) -> - Oide_apply (tree_of_path p1, tree_of_path p2) + | Papply(p1, p2, i) -> + Oide_apply (tree_of_path p1, tree_of_path p2, i) let rec path ident ppf = function | Pident id -> @@ -75,8 +78,10 @@ let rec path ident ppf = function path ident ppf p; pp_print_char ppf '.'; pp_print_string ppf s - | Papply(p1, p2) -> + | Papply(p1, p2, Nonimplicit) -> fprintf ppf "%a(%a)" (path ident) p1 (path ident) p2 + | Papply(p1, p2, Implicit) -> + fprintf ppf "%a{%a}" (path ident) p1 (path ident) p2 let stamped_path ppf = path (fun ppf id -> fprintf ppf "%a/%d" ident id id.Ident.stamp) ppf @@ -86,9 +91,12 @@ let path ppf = path ident ppf let rec string_of_out_ident = function | Oide_ident s -> s | Oide_dot (id, s) -> String.concat "." [string_of_out_ident id; s] - | Oide_apply (id1, id2) -> + | Oide_apply (id1, id2, Nonimplicit) -> String.concat "" [string_of_out_ident id1; "("; string_of_out_ident id2; ")"] + | Oide_apply (id1, id2, Implicit) -> + String.concat "" + [string_of_out_ident id1; "{"; string_of_out_ident id2; "}"] let string_of_path p = string_of_out_ident (tree_of_path p) @@ -254,7 +262,7 @@ module Path2 = struct (Pdot(p1, s1, pos1), Pdot(p2, s2, pos2)) -> let c = compare p1 p2 in if c <> 0 then c else String.compare s1 s2 - | (Papply(fun1, arg1), Papply(fun2, arg2)) -> + | (Papply(fun1, arg1, i1), Papply(fun2, arg2, i2)) -> let c = compare fun1 fun2 in if c <> 0 then c else compare arg1 arg2 | _ -> Pervasives.compare p1 p2 @@ -300,7 +308,7 @@ let rec path_size = function -Ident.binding_time id | Pdot (p, _, _) -> let (l, b) = path_size p in (1+l, b) - | Papply (p1, p2) -> + | Papply (p1, p2, _) -> let (l, b) = path_size p1 in (l + fst (path_size p2), b) @@ -1208,13 +1216,23 @@ let rec tree_of_modtype = function Omty_ident (tree_of_path p) | Mty_signature sg -> Omty_signature (tree_of_signature sg) - | Mty_functor(param, ty_arg, ty_res) -> - let res = - match ty_arg with None -> tree_of_modtype ty_res - | Some mty -> - wrap_env (Env.add_module ~arg:true param mty) tree_of_modtype ty_res - in - Omty_functor (Ident.name param, may_map tree_of_modtype ty_arg, res) + | Mty_functor(mparam, ty_res) -> begin + match mparam with + | Mpar_generative -> + Omty_functor(Ompar_generative, tree_of_modtype ty_res) + | Mpar_applicative(id, mty) -> + let res = + wrap_env (Env.add_module ~arg:true id mty) tree_of_modtype ty_res + in + Omty_functor + (Ompar_applicative(Ident.name id, tree_of_modtype mty), res) + | Mpar_implicit(id, mty) -> + let res = + wrap_env (Env.add_module ~arg:true id mty) tree_of_modtype ty_res + in + Omty_functor + (Ompar_implicit(Ident.name id, tree_of_modtype mty), res) + end | Mty_alias p -> Omty_alias (tree_of_path p) @@ -1455,7 +1473,7 @@ let rec path_same_name p1 p2 = match p1, p2 with Pident id1, Pident id2 -> ident_same_name id1 id2 | Pdot (p1, s1, _), Pdot (p2, s2, _) when s1 = s2 -> path_same_name p1 p2 - | Papply (p1, p1'), Papply (p2, p2') -> + | Papply (p1, p1', _), Papply (p2, p2', _) -> path_same_name p1 p2; path_same_name p1' p2' | _ -> () diff --git a/typing/printtyped.ml b/typing/printtyped.ml index 8d4977399d..6d7506f735 100644 --- a/typing/printtyped.ml +++ b/typing/printtyped.ml @@ -33,8 +33,11 @@ let rec fmt_longident_aux f x = match x with | Longident.Lident (s) -> fprintf f "%s" s; | Longident.Ldot (y, s) -> fprintf f "%a.%s" fmt_longident_aux y s; - | Longident.Lapply (y, z) -> + | Longident.Lapply (y, z, Nonimplicit) -> fprintf f "%a(%a)" fmt_longident_aux y fmt_longident_aux z; + | Longident.Lapply (y, z, Implicit) -> + fprintf f "%a{%a}" fmt_longident_aux y fmt_longident_aux z; + ;; let fmt_longident_noloc f x = fprintf f "\"%a\"" fmt_longident_aux x;; @@ -46,8 +49,10 @@ let rec fmt_path_aux f x = match x with | Path.Pident (s) -> fprintf f "%a" fmt_ident s; | Path.Pdot (y, s, _pos) -> fprintf f "%a.%s" fmt_path_aux y s; - | Path.Papply (y, z) -> + | Path.Papply (y, z, Nonimplicit) -> fprintf f "%a(%a)" fmt_path_aux y fmt_path_aux z; + | Path.Papply (y, z, Implicit) -> + fprintf f "%a{%a}" fmt_path_aux y fmt_path_aux z; ;; let fmt_path f x = fprintf f "\"%a\"" fmt_path_aux x;; @@ -117,7 +122,7 @@ let fmt_private_flag f x = let fmt_implicit_flag f x = match x with | Nonimplicit -> fprintf f "Nonimplicit"; - | Implicit n -> fprintf f "Implicit %d" n; + | Implicit -> fprintf f "Implicit"; ;; let line i f s (*...*) = @@ -616,10 +621,10 @@ and module_type i ppf x = | Tmty_signature (s) -> line i ppf "Pmty_signature\n"; signature i ppf s; - | Tmty_functor (s, _, mt1, mt2) -> - line i ppf "Pmty_functor \"%a\"\n" fmt_ident s; - Misc.may (module_type i ppf) mt1; - module_type i ppf mt2; + | Tmty_functor (mp, mt) -> + line i ppf "Pmty_functor\n"; + module_parameter i ppf mp; + module_type i ppf mt; | Tmty_with (mt, l) -> line i ppf "Pmty_with\n"; module_type i ppf mt; @@ -712,14 +717,14 @@ and module_expr i ppf x = | Tmod_structure (s) -> line i ppf "Pmod_structure\n"; structure i ppf s; - | Tmod_functor (s, _, mt, me) -> - line i ppf "Pmod_functor \"%a\"\n" fmt_ident s; - Misc.may (module_type i ppf) mt; + | Tmod_functor (mp, me) -> + line i ppf "Pmod_functor\n"; + module_parameter i ppf mp; module_expr i ppf me; - | Tmod_apply (me1, me2, _) -> + | Tmod_apply (me, ma) -> line i ppf "Pmod_apply\n"; - module_expr i ppf me1; - module_expr i ppf me2; + module_expr i ppf me; + module_argument i ppf ma; | Tmod_constraint (me, _, Tmodtype_explicit mt, _) -> line i ppf "Pmod_constraint\n"; module_expr i ppf me; @@ -729,6 +734,28 @@ and module_expr i ppf x = line i ppf "Pmod_unpack\n"; expression i ppf e; +and module_parameter i ppf x = + match x with + | Tmpar_generative -> + line i ppf "Pmpar_generative\n" + | Tmpar_applicative(s, _, mty) -> + line i ppf "Pmarg_applicative \"%a\"\n" fmt_ident s; + module_type i ppf mty + | Tmpar_implicit(s, _, mty) -> + line i ppf "Pmarg_implicit \"%a\"\n" fmt_ident s; + module_type i ppf mty + +and module_argument i ppf x = + match x with + | Tmarg_generative -> + line i ppf "Pmarg_generative\n" + | Tmarg_applicative(me, _) -> + line i ppf "Pmarg_applicative\n"; + module_expr i ppf me + | Tmarg_implicit(me, _) -> + line i ppf "Pmarg_implicit\n"; + module_expr i ppf me + and structure i ppf x = list i structure_item ppf x.str_items and structure_item i ppf x = diff --git a/typing/subst.ml b/typing/subst.ml index 9eacbfc7fe..831cacb4c7 100644 --- a/typing/subst.ml +++ b/typing/subst.ml @@ -66,8 +66,8 @@ let rec module_path s = function begin try Tbl.find id s.modules with Not_found -> p end | Pdot(p, n, pos) -> Pdot(module_path s p, n, pos) - | Papply(p1, p2) -> - Papply(module_path s p1, module_path s p2) + | Papply(p1, p2, i) -> + Papply(module_path s p1, module_path s p2, i) let modtype_path s = function Pident id as p -> @@ -78,7 +78,7 @@ let modtype_path s = function with Not_found -> p end | Pdot(p, n, pos) -> Pdot(module_path s p, n, pos) - | Papply(p1, p2) -> + | Papply(p1, p2, i) -> fatal_error "Subst.modtype_path" let type_path s = function @@ -86,7 +86,7 @@ let type_path s = function begin try Tbl.find id s.types with Not_found -> p end | Pdot(p, n, pos) -> Pdot(module_path s p, n, pos) - | Papply(p1, p2) -> + | Papply(p1, p2, i) -> fatal_error "Subst.type_path" (* Special type ids for saved signatures *) @@ -351,15 +351,24 @@ let rec modtype s = function begin try Tbl.find id s.modtypes with Not_found -> mty end | Pdot(p, n, pos) -> Mty_ident(Pdot(module_path s p, n, pos)) - | Papply(p1, p2) -> + | Papply(p1, p2, i) -> fatal_error "Subst.modtype" end | Mty_signature sg -> Mty_signature(signature s sg) - | Mty_functor(id, arg, res) -> - let id' = Ident.rename id in - Mty_functor(id', may_map (modtype s) arg, - modtype (add_module id (Pident id') s) res) + | Mty_functor(param, res) -> begin + match param with + | Mpar_generative -> + Mty_functor(Mpar_generative, modtype s res) + | Mpar_applicative(id, mty) -> + let id' = Ident.rename id in + Mty_functor(Mpar_applicative(id', modtype s mty), + modtype (add_module id (Pident id') s) res) + | Mpar_implicit(id, mty) -> + let id' = Ident.rename id in + Mty_functor(Mpar_implicit(id', modtype s mty), + modtype (add_module id (Pident id') s) res) + end | Mty_alias p -> Mty_alias(module_path s p) diff --git a/typing/typecore.ml b/typing/typecore.ml index a5f2a2d379..33c33f7715 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -78,9 +78,8 @@ exception Error_forward of Location.error (* Forward declaration, to be filled in by Typemod.type_module *) let type_module = - ref ((fun ?implicit_arity env md -> assert false) : - ?implicit_arity:int -> Env.t -> Parsetree.module_expr -> - Typedtree.module_expr) + ref ((fun env md -> assert false) : + Env.t -> Parsetree.module_expr -> Typedtree.module_expr) (* Forward declaration, to be filled in by Typemod.type_open *) @@ -177,10 +176,14 @@ let iter_expression f e = | Pmod_ident _ -> () | Pmod_structure str -> List.iter structure_item str | Pmod_constraint (me, _) - | Pmod_functor (_, _, me) -> module_expr me - | Pmod_apply (me1, me2) -> module_expr me1; module_expr me2 + | Pmod_functor (_, me) -> module_expr me + | Pmod_apply (me, ma) -> module_expr me; module_argument ma | Pmod_unpack e -> expr e + and module_argument = function + | Pmarg_generative -> () + | Pmarg_applicative me -> module_expr me + | Pmarg_implicit me -> module_expr me and structure_item str = match str.pstr_desc with @@ -1525,7 +1528,7 @@ let rec approx_type env sty = let tl = List.map (fun cty -> cty.ctyp_type) tl in let mty = !Ctype.modtype_of_package env loc p nl tl in let id, env = - Env.enter_module ~arg:true ~implicit_:(Implicit 0) s mty env in + Env.enter_module ~arg:true ~implicit_:(Implicit) s mty env in newty (Tarrow(Tarr_implicit id, pkg_ty, approx_type env sty, Cok))*) | Ptyp_arrow (p, _, sty) -> @@ -1567,7 +1570,7 @@ let rec type_approx env sexp = let tl = List.map (fun cty -> cty.ctyp_type) tl in let mty = !Ctype.modtype_of_package env loc p nl tl in let id, env = - Env.enter_module ~arg:true ~implicit_:(Implicit 0) s mty env in + Env.enter_module ~arg:true ~implicit_:(Implicit) s mty env in newty (Tarrow(Tarr_implicit id, pkg_ty, type_approx env e, Cok)) FIXME *) @@ -2587,11 +2590,7 @@ and type_expect_ ?in_function env sexp ty_expected = begin_def (); Ident.set_current_time ty.level; let context = Typetexp.narrow () in - let implicit_arity = match pmb_implicit with - | Nonimplicit -> 0 - | Implicit ar -> ar - in - let modl = !type_module ~implicit_arity env smodl in + let modl = !type_module env smodl in let (id, new_env) = Env.enter_module ~implicit_:pmb_implicit name.txt modl.mod_type env in Ctype.init_def(Ident.current_time()); @@ -3776,7 +3775,7 @@ and type_implicit_function ?in_function loc env ty_expected name spat sbody = in let modl = !type_module pat_env smodl in let (id, body_env) = - Env.enter_module ~arg:true ~implicit_:(Implicit 0) + Env.enter_module ~arg:true ~implicit_:Implicit name modl.mod_type pat_env in let body_env = Env.set_implicit_level id level body_env in @@ -3792,7 +3791,7 @@ and type_implicit_function ?in_function loc env ty_expected name spat sbody = | None -> type_exp body_env sbody in let mb = { mb_id = id; mb_name = mknoloc name; mb_expr = modl; - mb_implicit = Implicit 0; + mb_implicit = Implicit; mb_attributes = []; mb_loc = sbody.pexp_loc } in let body' = diff --git a/typing/typecore.mli b/typing/typecore.mli index 9e8b251208..5740acbe81 100644 --- a/typing/typecore.mli +++ b/typing/typecore.mli @@ -126,7 +126,7 @@ val report_error: Env.t -> formatter -> error -> unit (* Forward declaration, to be filled in by Typemod.type_module *) val type_module: - (?implicit_arity:int -> Env.t -> Parsetree.module_expr -> + (Env.t -> Parsetree.module_expr -> Typedtree.module_expr) ref (* Forward declaration, to be filled in by Typemod.type_open *) val type_open: diff --git a/typing/typedtree.ml b/typing/typedtree.ml index 02642850ba..3402adfd71 100644 --- a/typing/typedtree.ml +++ b/typing/typedtree.ml @@ -193,12 +193,22 @@ and module_type_constraint = and module_expr_desc = Tmod_ident of Path.t * Longident.t loc | Tmod_structure of structure - | Tmod_functor of Ident.t * string loc * module_type option * module_expr - | Tmod_apply of module_expr * module_expr * module_coercion + | Tmod_functor of module_parameter * module_expr + | Tmod_apply of module_expr * module_argument | Tmod_constraint of module_expr * Types.module_type * module_type_constraint * module_coercion | Tmod_unpack of expression * Types.module_type +and module_parameter = + | Tmpar_generative + | Tmpar_applicative of Ident.t * string loc * module_type + | Tmpar_implicit of Ident.t * string loc * module_type + +and module_argument = + | Tmarg_generative + | Tmarg_applicative of module_expr * module_coercion + | Tmarg_implicit of module_expr * module_coercion + and structure = { str_items : structure_item list; str_type : Types.signature; @@ -264,7 +274,7 @@ and module_type = and module_type_desc = Tmty_ident of Path.t * Longident.t loc | Tmty_signature of signature - | Tmty_functor of Ident.t * string loc * module_type option * module_type + | Tmty_functor of module_parameter * module_type | Tmty_with of module_type * (Path.t * Longident.t loc * with_constraint) list | Tmty_typeof of module_expr | Tmty_alias of Path.t * Longident.t loc diff --git a/typing/typedtree.mli b/typing/typedtree.mli index aafa2f778e..b1f95adf52 100644 --- a/typing/typedtree.mli +++ b/typing/typedtree.mli @@ -192,12 +192,22 @@ and module_type_constraint = and module_expr_desc = Tmod_ident of Path.t * Longident.t loc | Tmod_structure of structure - | Tmod_functor of Ident.t * string loc * module_type option * module_expr - | Tmod_apply of module_expr * module_expr * module_coercion + | Tmod_functor of module_parameter * module_expr + | Tmod_apply of module_expr * module_argument | Tmod_constraint of module_expr * Types.module_type * module_type_constraint * module_coercion | Tmod_unpack of expression * Types.module_type +and module_parameter = + | Tmpar_generative + | Tmpar_applicative of Ident.t * string loc * module_type + | Tmpar_implicit of Ident.t * string loc * module_type + +and module_argument = + | Tmarg_generative + | Tmarg_applicative of module_expr * module_coercion + | Tmarg_implicit of module_expr * module_coercion + and structure = { str_items : structure_item list; str_type : Types.signature; @@ -263,7 +273,7 @@ and module_type = and module_type_desc = Tmty_ident of Path.t * Longident.t loc | Tmty_signature of signature - | Tmty_functor of Ident.t * string loc * module_type option * module_type + | Tmty_functor of module_parameter * module_type | Tmty_with of module_type * (Path.t * Longident.t loc * with_constraint) list | Tmty_typeof of module_expr | Tmty_alias of Path.t * Longident.t loc diff --git a/typing/typedtreeIter.ml b/typing/typedtreeIter.ml index 1f488972f3..655d651f87 100644 --- a/typing/typedtreeIter.ml +++ b/typing/typedtreeIter.ml @@ -427,8 +427,8 @@ module MakeIterator(Iter : IteratorArgument) : sig Tmty_ident (path, _) -> () | Tmty_alias (path, _) -> () | Tmty_signature sg -> iter_signature sg - | Tmty_functor (id, _, mtype1, mtype2) -> - Misc.may iter_module_type mtype1; iter_module_type mtype2 + | Tmty_functor (mparam, mtype) -> + iter_module_parameter mparam; iter_module_type mtype | Tmty_with (mtype, list) -> iter_module_type mtype; List.iter (fun (path, _, withc) -> @@ -456,12 +456,12 @@ module MakeIterator(Iter : IteratorArgument) : sig match mexpr.mod_desc with Tmod_ident (p, _) -> () | Tmod_structure st -> iter_structure st - | Tmod_functor (id, _, mtype, mexpr) -> - Misc.may iter_module_type mtype; + | Tmod_functor (mparam, mexpr) -> + iter_module_parameter mparam; iter_module_expr mexpr - | Tmod_apply (mexp1, mexp2, _) -> - iter_module_expr mexp1; - iter_module_expr mexp2 + | Tmod_apply (mexp, marg) -> + iter_module_expr mexp; + iter_module_argument marg | Tmod_constraint (mexpr, _, Tmodtype_implicit, _ ) -> iter_module_expr mexpr | Tmod_constraint (mexpr, _, Tmodtype_explicit mtype, _) -> @@ -473,6 +473,18 @@ module MakeIterator(Iter : IteratorArgument) : sig end; Iter.leave_module_expr mexpr; + and iter_module_parameter mparam = + match mparam with + | Tmpar_generative -> () + | Tmpar_applicative(_, _, mtype) -> iter_module_type mtype + | Tmpar_implicit(_, _, mtype) -> iter_module_type mtype + + and iter_module_argument marg = + match marg with + | Tmarg_generative -> () + | Tmarg_applicative(mexp, _) -> iter_module_expr mexp + | Tmarg_implicit(mexp, _) -> iter_module_expr mexp + and iter_class_expr cexpr = Iter.enter_class_expr cexpr; begin diff --git a/typing/typedtreeMap.ml b/typing/typedtreeMap.ml index 44abc5b834..5cd6471f71 100644 --- a/typing/typedtreeMap.ml +++ b/typing/typedtreeMap.ml @@ -460,9 +460,8 @@ module MakeMap(Map : MapArgument) = struct Tmty_ident _ -> mty.mty_desc | Tmty_alias _ -> mty.mty_desc | Tmty_signature sg -> Tmty_signature (map_signature sg) - | Tmty_functor (id, name, mtype1, mtype2) -> - Tmty_functor (id, name, Misc.may_map map_module_type mtype1, - map_module_type mtype2) + | Tmty_functor (mparam, mtype) -> + Tmty_functor (map_module_parameter mparam, map_module_type mtype) | Tmty_with (mtype, list) -> Tmty_with (map_module_type mtype, List.map (fun (path, lid, withc) -> @@ -490,11 +489,10 @@ module MakeMap(Map : MapArgument) = struct match mexpr.mod_desc with Tmod_ident (p, lid) -> mexpr.mod_desc | Tmod_structure st -> Tmod_structure (map_structure st) - | Tmod_functor (id, name, mtype, mexpr) -> - Tmod_functor (id, name, Misc.may_map map_module_type mtype, - map_module_expr mexpr) - | Tmod_apply (mexp1, mexp2, coercion) -> - Tmod_apply (map_module_expr mexp1, map_module_expr mexp2, coercion) + | Tmod_functor (mparam, mexpr) -> + Tmod_functor (map_module_parameter mparam, map_module_expr mexpr) + | Tmod_apply (mexp, marg) -> + Tmod_apply (map_module_expr mexp, map_module_argument marg) | Tmod_constraint (mexpr, mod_type, Tmodtype_implicit, coercion ) -> Tmod_constraint (map_module_expr mexpr, mod_type, Tmodtype_implicit, coercion) @@ -508,6 +506,22 @@ module MakeMap(Map : MapArgument) = struct in Map.leave_module_expr { mexpr with mod_desc = mod_desc } + and map_module_parameter mparam = + match mparam with + | Tmpar_generative -> Tmpar_generative + | Tmpar_applicative(id, name, mtype) -> + Tmpar_applicative(id, name, map_module_type mtype) + | Tmpar_implicit(id, name, mtype) -> + Tmpar_implicit(id, name, map_module_type mtype) + + and map_module_argument marg = + match marg with + | Tmarg_generative -> Tmarg_generative + | Tmarg_applicative(mexp, coercion) -> + Tmarg_applicative(map_module_expr mexp, coercion) + | Tmarg_implicit(mexp, coercion) -> + Tmarg_implicit(map_module_expr mexp, coercion) + and map_class_expr cexpr = let cexpr = Map.enter_class_expr cexpr in let cl_desc = diff --git a/typing/typemod.ml b/typing/typemod.ml index 553d06c190..b631ec575a 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -38,7 +38,7 @@ type error = | Incomplete_packed_module of type_expr | Scoping_pack of Longident.t * type_expr | Recursive_module_require_explicit_type - | Apply_generative + | Argument_mismatch of module_parameter * module_argument exception Error of Location.t * Env.t * error exception Error_forward of Location.error @@ -340,14 +340,27 @@ let rec approx_modtype env smty = Mty_alias path | Pmty_signature ssg -> Mty_signature(approx_sig env ssg) - | Pmty_functor(param, sarg, sres) -> - let arg = may_map (approx_modtype env) sarg in - let (id, newenv) = - Env.enter_module ~arg:true ~implicit_:Nonimplicit - param.txt (Btype.default_mty arg) env + | Pmty_functor(sparam, sres) -> + let param, newenv = + match sparam with + | Pmpar_generative -> Mpar_generative, env + | Pmpar_applicative(name, sarg) -> + let arg = approx_modtype env sarg in + let (id, newenv) = + Env.enter_module ~arg:true ~implicit_:Nonimplicit + name.txt arg env + in + Mpar_applicative(id, arg), newenv + | Pmpar_implicit(name, sarg) -> + let arg = approx_modtype env sarg in + let (id, newenv) = + Env.enter_module ~arg:true ~implicit_:Implicit + name.txt arg env + in + Mpar_implicit(id, arg), newenv in let res = approx_modtype newenv sres in - Mty_functor(id, arg, res) + Mty_functor(param, res) | Pmty_with(sbody, constraints) -> approx_modtype env sbody | Pmty_typeof smod -> @@ -534,16 +547,35 @@ let rec transl_modtype env smty = let sg = transl_signature env ssg in mkmty (Tmty_signature sg) (Mty_signature sg.sig_type) env loc smty.pmty_attributes - | Pmty_functor(param, sarg, sres) -> - let arg = Misc.may_map (transl_modtype env) sarg in - let ty_arg = Misc.may_map (fun m -> m.mty_type) arg in - let (id, newenv) = - Env.enter_module ~arg:true ~implicit_:Nonimplicit param.txt - (Btype.default_mty ty_arg) env in + | Pmty_functor(sparam, sres) -> + let tparam, param, newenv = + match sparam with + | Pmpar_generative -> Tmpar_generative, Mpar_generative, env + | Pmpar_applicative(name, sarg) -> + let arg = transl_modtype env sarg in + let ty_arg = arg.mty_type in + let (id, newenv) = + Env.enter_module ~arg:true ~implicit_:Nonimplicit name.txt + ty_arg env + in + let tparam = Tmpar_applicative(id, name, arg) in + let param = Mpar_applicative(id, ty_arg) in + tparam, param, newenv + | Pmpar_implicit(name, sarg) -> + let arg = transl_modtype env sarg in + let ty_arg = arg.mty_type in + let (id, newenv) = + Env.enter_module ~arg:true ~implicit_:Implicit name.txt + ty_arg env + in + let tparam = Tmpar_implicit(id, name, arg) in + let param = Mpar_implicit(id, ty_arg) in + tparam, param, newenv + in Ctype.init_def(Ident.current_time()); (* PR#6513 *) let res = transl_modtype newenv sres in - mkmty (Tmty_functor (id, param, arg, res)) - (Mty_functor(id, ty_arg, res.mty_type)) env loc + mkmty (Tmty_functor (tparam, res)) + (Mty_functor(param, res.mty_type)) env loc smty.pmty_attributes | Pmty_with(sbody, constraints) -> let body = transl_modtype env sbody in @@ -869,19 +901,33 @@ let simplify_signature sg = (* Try to convert a module expression to a module path. *) -exception Not_a_path +let rec is_pathable smexp = + match smexp.pmod_desc with + | Pmod_ident _ -> true + | Pmod_apply(sfunct, sarg) when !Clflags.applicative_functors -> begin + match sarg with + | Pmarg_generative -> false + | Pmarg_applicative sarg | Pmarg_implicit sarg -> + is_pathable sarg && is_pathable sfunct + end + | Pmod_constraint (mexp, _) -> + is_pathable mexp + | _ -> false let rec path_of_module mexp = match mexp.mod_desc with Tmod_ident (p,_) -> p - | Tmod_apply(funct, arg, coercion) when !Clflags.applicative_functors -> - Papply(path_of_module funct, path_of_module arg) + | Tmod_apply(funct, arg) when !Clflags.applicative_functors -> begin + match arg with + | Tmarg_generative -> assert false + | Tmarg_applicative(arg, _) -> + Papply(path_of_module funct, path_of_module arg, Nonimplicit) + | Tmarg_implicit(arg, _) -> + Papply(path_of_module funct, path_of_module arg, Implicit) + end | Tmod_constraint (mexp, _, _, _) -> path_of_module mexp - | _ -> raise Not_a_path - -let path_of_module mexp = - try Some (path_of_module mexp) with Not_a_path -> None + | _ -> assert false (* Check that all core type schemes in a structure are closed *) @@ -889,7 +935,7 @@ let rec closed_modtype = function Mty_ident p -> true | Mty_alias p -> true | Mty_signature sg -> List.for_all closed_signature_item sg - | Mty_functor(id, param, body) -> closed_modtype body + | Mty_functor(param, body) -> closed_modtype body and closed_signature_item = function Sig_value(id, desc) -> Ctype.closed_schema desc.val_type @@ -1095,7 +1141,7 @@ let wrap_constraint env arg mty explicit = (* Type a module value expression *) -let rec type_module ?(implicit_arity=0) ?(alias=false) sttn funct_body anchor env smod = +let rec type_module ?(alias=false) sttn funct_body anchor env smod = match smod.pmod_desc with Pmod_ident lid -> let path = @@ -1135,65 +1181,101 @@ let rec type_module ?(implicit_arity=0) ?(alias=false) sttn funct_body anchor en if List.length sg' = List.length sg then md else wrap_constraint (Env.implicit_coercion env) md (Mty_signature sg') Tmodtype_implicit - | Pmod_functor(name, smty, sbody) -> - let mty = may_map (transl_modtype env) smty in - let ty_arg = may_map (fun m -> m.mty_type) mty in - let id, newenv, funct_body = - match ty_arg with - | None -> Ident.create "*", env, false - | Some mty -> - let id, env = - Env.enter_module ~arg:true ~implicit_:Nonimplicit name.txt mty env + | Pmod_functor(sparam, sbody) -> + let tparam, param, newenv, funct_body = + match sparam with + | Pmpar_generative -> + Tmpar_generative, Mpar_generative, env, false + | Pmpar_applicative(name, smty) -> + let mty = transl_modtype env smty in + let ty_arg = mty.mty_type in + let id, newenv = + Env.enter_module ~arg:true ~implicit_:Nonimplicit + name.txt ty_arg env in - let env = if implicit_arity > 0 - then Env.register_as_implicit (Pident id) 0 env - else env + let tparam = Tmpar_applicative(id, name, mty) in + let param = Mpar_applicative(id, ty_arg) in + tparam, param, newenv, true + | Pmpar_implicit(name, smty) -> + let mty = transl_modtype env smty in + let ty_arg = mty.mty_type in + let id, newenv = + Env.enter_module ~arg:true ~implicit_:Implicit + name.txt ty_arg env in - id, env, true + let tparam = Tmpar_implicit(id, name, mty) in + let param = Mpar_implicit(id, ty_arg) in + tparam, param, newenv, true in - let implicit_arity = pred implicit_arity in - let body = type_module ~implicit_arity sttn funct_body None newenv sbody in - rm { mod_desc = Tmod_functor(id, name, mty, body); - mod_type = Mty_functor(id, ty_arg, body.mod_type); + let body = type_module sttn funct_body None newenv sbody in + rm { mod_desc = Tmod_functor(tparam, body); + mod_type = Mty_functor(param, body.mod_type); mod_env = env; mod_attributes = smod.pmod_attributes; mod_loc = smod.pmod_loc } | Pmod_apply(sfunct, sarg) -> - let arg = type_module true funct_body None env sarg in - let path = path_of_module arg in + let pathable = + match sarg with + | Pmarg_generative -> false + | Pmarg_applicative sarg -> is_pathable sarg + | Pmarg_implicit sarg -> is_pathable sarg + in let funct = - type_module (sttn && path <> None) funct_body None env sfunct in + type_module (sttn && pathable) funct_body None env sfunct + in begin match Env.scrape_alias env funct.mod_type with - Mty_functor(param, mty_param, mty_res) as mty_functor -> - let generative, mty_param = - (mty_param = None, Btype.default_mty mty_param) in - if generative then begin - if sarg.pmod_desc <> Pmod_structure [] then - raise (Error (sfunct.pmod_loc, env, Apply_generative)); - if funct_body && Mtype.contains_type env funct.mod_type then - raise (Error (smod.pmod_loc, env, Not_allowed_in_functor_body)); - end; - let coercion = - try - Includemod.modtypes env arg.mod_type mty_param - with Includemod.Error msg -> - raise(Error(sarg.pmod_loc, env, Not_included msg)) in + | Mty_functor(mty_param, mty_res) as mty_functor -> + let arg = + match mty_param, sarg with + | Mpar_generative, Pmarg_generative -> + if funct_body && Mtype.contains_type env funct.mod_type then + raise (Error(smod.pmod_loc, env, + Not_allowed_in_functor_body)); + Tmarg_generative + | Mpar_applicative(param, mty_param), Pmarg_applicative sarg -> + let arg = type_module true funct_body None env sarg in + let coercion = + try + Includemod.modtypes env arg.mod_type mty_param + with Includemod.Error msg -> + raise(Error(sarg.pmod_loc, env, Not_included msg)) + in + Tmarg_applicative(arg, coercion) + | Mpar_implicit(param, mty_param), Pmarg_implicit sarg -> + let arg = type_module true funct_body None env sarg in + let coercion = + try + Includemod.modtypes env arg.mod_type mty_param + with Includemod.Error msg -> + raise(Error(sarg.pmod_loc, env, Not_included msg)) + in + Tmarg_implicit(arg, coercion) + | _, _ -> + raise (Error (sfunct.pmod_loc, env, + Argument_mismatch(mty_param, sarg))) + in let mty_appl = - match path with - Some path -> - Subst.modtype (Subst.add_module param path Subst.identity) - mty_res - | None -> - if generative then mty_res else - try - Mtype.nondep_supertype - (Env.add_module ~arg:true param arg.mod_type env) - param mty_res - with Not_found -> - raise(Error(smod.pmod_loc, env, - Cannot_eliminate_dependency mty_functor)) + match arg, mty_param with + | Tmarg_generative, _ -> mty_res + | (Tmarg_applicative(arg, _) | Tmarg_implicit(arg, _)), + (Mpar_applicative(param, _) | Mpar_implicit(param, _)) -> + if pathable then + Subst.modtype + (Subst.add_module param + (path_of_module arg) Subst.identity) + mty_res + else begin + try + Mtype.nondep_supertype + (Env.add_module ~arg:true param arg.mod_type env) + param mty_res + with Not_found -> + raise(Error(smod.pmod_loc, env, + Cannot_eliminate_dependency mty_functor)) + end + | _, _ -> assert false in - rm { mod_desc = Tmod_apply(funct, arg, coercion); + rm { mod_desc = Tmod_apply(funct, arg); mod_type = mty_appl; mod_env = env; mod_attributes = smod.pmod_attributes; @@ -1308,12 +1390,8 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = pmb_loc; pmb_implicit } -> check_name "module" module_names name; - let implicit_arity = match pmb_implicit with - | Nonimplicit -> 0 - | Implicit ar -> ar - in let modl = - type_module ~implicit_arity ~alias:true true funct_body + type_module ~alias:true true funct_body (anchor_submodule name.txt anchor) env smodl in let md = { md_type = enrich_module_type anchor name.txt modl.mod_type env; @@ -1325,7 +1403,7 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = let (id, newenv) = Env.enter_module_declaration name.txt md env in begin match pmb_implicit with | Nonimplicit -> () - | Implicit _ -> + | Implicit -> if not (closed_modtype modl.mod_type) then raise(Error(modl.mod_loc, env, Non_generalizable_module modl.mod_type)) @@ -1536,7 +1614,7 @@ let type_toplevel_phrase env s = Env.reset_required_globals (); type_structure ~toplevel:true false None env s Location.none (*let type_module_alias = type_module ~alias:true true false None*) -let type_module ?implicit_arity = type_module ?implicit_arity true false None +let type_module = type_module true false None let type_structure = type_structure false None (* Normalize types in a signature *) @@ -1545,7 +1623,7 @@ let rec normalize_modtype env = function Mty_ident p -> () | Mty_alias p -> () | Mty_signature sg -> normalize_signature env sg - | Mty_functor(id, param, body) -> normalize_modtype env body + | Mty_functor(param, body) -> normalize_modtype env body and normalize_signature env = List.iter (normalize_signature_item env) @@ -1894,8 +1972,22 @@ let report_error ppf = function "Its type contains local dependencies:@ %a" type_expr ty | Recursive_module_require_explicit_type -> fprintf ppf "Recursive modules require an explicit module type." - | Apply_generative -> - fprintf ppf "This is a generative functor. It can only be applied to ()" + | Argument_mismatch(param, arg) -> begin + match param, arg with + | Mpar_generative, (Pmarg_applicative _ | Pmarg_implicit _) -> + fprintf ppf + "This is a generative functor. It can only be applied to ()" + | Mpar_implicit _, (Pmarg_generative | Pmarg_applicative _) -> + fprintf ppf "This is an implicit functor." + | Mpar_applicative _, Pmarg_generative -> + fprintf ppf "This is not a generative functor." + | Mpar_applicative _, Pmarg_implicit _ -> + fprintf ppf "This is not an implicit functor." + | Mpar_generative, Pmarg_generative -> assert false + | Mpar_applicative _, Pmarg_applicative _ -> assert false + | Mpar_implicit _, Pmarg_implicit _ -> assert false + end + let report_error env ppf err = Printtyp.wrap_printing_env env (fun () -> report_error ppf err) diff --git a/typing/typemod.mli b/typing/typemod.mli index 662251cd5d..87974558d2 100644 --- a/typing/typemod.mli +++ b/typing/typemod.mli @@ -16,8 +16,7 @@ open Types open Format val type_module: - ?implicit_arity:int -> Env.t -> Parsetree.module_expr -> - Typedtree.module_expr + Env.t -> Parsetree.module_expr -> Typedtree.module_expr val type_structure: Env.t -> Parsetree.structure -> Location.t -> Typedtree.structure * Types.signature * Env.t @@ -41,8 +40,6 @@ val modtype_of_package: Path.t -> Longident.t list -> type_expr list -> module_type val simplify_signature: signature -> signature -val path_of_module : Typedtree.module_expr -> Path.t option - val save_signature: string -> Typedtree.signature -> string -> string -> Env.t -> Types.signature_item list -> unit @@ -70,7 +67,7 @@ type error = | Incomplete_packed_module of type_expr | Scoping_pack of Longident.t * type_expr | Recursive_module_require_explicit_type - | Apply_generative + | Argument_mismatch of Types.module_parameter * Parsetree.module_argument exception Error of Location.t * Env.t * error exception Error_forward of Location.error diff --git a/typing/types.ml b/typing/types.ml index 66c921878f..4975382ceb 100644 --- a/typing/types.ml +++ b/typing/types.ml @@ -18,13 +18,13 @@ type arrow_flag = | Tarr_simple (* T -> ... *) | Tarr_labelled of string (* label:T -> ... *) | Tarr_optional of string (* ?label:T -> ... *) - | Tarr_implicit of Ident.t (* implicit Id : T -> ... *) + | Tarr_implicit of Ident.t (* {Id : T} -> ... *) type apply_flag = | Tapp_simple (* f expr *) | Tapp_labelled of string (* f ~label:expr *) | Tapp_optional of string (* f ?label:expr *) - | Tapp_implicit (* f ~implicit:M *) + | Tapp_implicit (* f {X : M} *) (* Type expressions for the core language *) @@ -280,9 +280,14 @@ type class_type_declaration = type module_type = Mty_ident of Path.t | Mty_signature of signature - | Mty_functor of Ident.t * module_type option * module_type + | Mty_functor of module_parameter * module_type | Mty_alias of Path.t +and module_parameter = + | Mpar_generative + | Mpar_applicative of Ident.t * module_type + | Mpar_implicit of Ident.t * module_type + and signature = signature_item list and signature_item = diff --git a/typing/types.mli b/typing/types.mli index cf1a05f7df..de57aa5175 100644 --- a/typing/types.mli +++ b/typing/types.mli @@ -270,9 +270,14 @@ type class_type_declaration = type module_type = Mty_ident of Path.t | Mty_signature of signature - | Mty_functor of Ident.t * module_type option * module_type + | Mty_functor of module_parameter * module_type | Mty_alias of Path.t +and module_parameter = + | Mpar_generative + | Mpar_applicative of Ident.t * module_type + | Mpar_implicit of Ident.t * module_type + and signature = signature_item list and signature_item = diff --git a/typing/typetexp.ml b/typing/typetexp.ml index 8d628099a6..3d2df8225a 100644 --- a/typing/typetexp.ml +++ b/typing/typetexp.ml @@ -196,7 +196,7 @@ let rec narrow_unbound_lid_error : 'a. _ -> _ -> _ -> _ -> 'a = raise (Error (loc, env, Access_functor_as_structure mlid)) | _ -> () end - | Longident.Lapply (flid, mlid) -> + | Longident.Lapply (flid, mlid, _) -> check_module flid; check_module mlid; raise (Error (loc, env, Ill_typed_functor_application lid)) @@ -508,7 +508,7 @@ let rec transl_type env policy styp = match lid.txt with Longident.Lident s -> Longident.Lident ("#" ^ s) | Longident.Ldot(r, s) -> Longident.Ldot (r, "#" ^ s) - | Longident.Lapply(_, _) -> fatal_error "Typetexp.transl_type" + | Longident.Lapply(_, _, _) -> fatal_error "Typetexp.transl_type" in let (path, decl) = Env.lookup_type lid2 env in (path, decl, false) From a8cc0f74f6a944710684006d74399bb785055c90 Mon Sep 17 00:00:00 2001 From: Leo White <lpw25@cl.cam.ac.uk> Date: Sat, 7 Nov 2015 11:44:42 +0000 Subject: [PATCH 452/494] Update generative functor test --- testsuite/tests/typing-modules/generative.ml | 2 +- testsuite/tests/typing-modules/generative.ml.reference | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/testsuite/tests/typing-modules/generative.ml b/testsuite/tests/typing-modules/generative.ml index dc5bf52898..f8ab35683d 100644 --- a/testsuite/tests/typing-modules/generative.ml +++ b/testsuite/tests/typing-modules/generative.ml @@ -16,7 +16,7 @@ module H() = F();; (* ok *) (* Alias *) module U = struct end;; -module M = F(struct end);; (* ok *) +module M = F(struct end);; (* fail *) module M = F(U);; (* fail *) (* Cannot coerce between applicative and generative *) diff --git a/testsuite/tests/typing-modules/generative.ml.reference b/testsuite/tests/typing-modules/generative.ml.reference index a6aa100266..056fff5531 100644 --- a/testsuite/tests/typing-modules/generative.ml.reference +++ b/testsuite/tests/typing-modules/generative.ml.reference @@ -14,7 +14,10 @@ Error: This expression creates fresh types. It is not allowed inside applicative functors. # module H : functor () -> S # module U : sig end -# module M : S +# Characters 11-12: + module M = F(struct end);; (* fail *) + ^ +Error: This is a generative functor. It can only be applied to () # Characters 11-12: module M = F(U);; (* fail *) ^ From 1c22c685d626a2398faa46a40df460e957240e41 Mon Sep 17 00:00:00 2001 From: kakadu <kakadu.hafanana@gmail.com> Date: Mon, 18 Jan 2016 00:09:24 +0300 Subject: [PATCH 453/494] bootstrap --- boot/ocamlc | Bin 1746238 -> 3343469 bytes boot/ocamldep | Bin 557017 -> 561000 bytes boot/ocamllex | Bin 256452 -> 256403 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/boot/ocamlc b/boot/ocamlc index 41eb9b40de1e2a8edfe7e6177b2704c8bea529d8..ad16cb55e1cf1eb2929d5a5238622981357e70ad 100755 GIT binary patch literal 3343469 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 I_))oQV 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�#yC-`XPJd6(2c2rxU8|w${FHwerZd=7P>kLEiC< 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℞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%0D~tq5%;+ctQAOC}#yWbrp-}ZPKB& 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%0ARV>0aRH`{&3V5 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 tO6O6G@ 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 tEI=?-Y4kHf0Nhc~^Hb)#P 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≻d=4y9n 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�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 Z^Rcg<bO2QAkHTdP8#881ap<sN{{^fm+Oq%v delta 315687 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%0DW;%(h01nUL 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 RtF8dV2<Y2YUr0gYm(w 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ν%Y^zSY3wl*HBc#=pd!+9jp_Yv`r^^;dAg{k^}( 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 A5dZ)H diff --git a/boot/ocamldep b/boot/ocamldep index 383b3d187bb69087432e03b65ebed037b6265b07..aba6c080138c04dde2f3d93c9068ab742a5aa5ef 100755 GIT binary patch delta 119532 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 Hbj<$%=m<N7 delta 117899 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 diff --git a/boot/ocamllex b/boot/ocamllex index 8a2e0d8ba6b0d91680064ec7cb14b9ed3bc1c893..42548167657f265c047c0d9975baed9ded4602b0 100755 GIT binary patch delta 8714 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 delta 9321 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�fSB&At<w)ARp<5r)m5X~WG;<U1_w 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 Saz~E6tn|VAYR+XP_<sO=&Yw2` From 754618955cf3930d4ce128b824878668401f5a3a Mon Sep 17 00:00:00 2001 From: kakadu <kakadu.hafanana@gmail.com> Date: Mon, 18 Jan 2016 16:33:21 +0400 Subject: [PATCH 454/494] add 'modular-implicits' to version --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index dbd6b8fc29..1625ff501e 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.02.3 +4.02.3+modular-implicits # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli From 7d139a0323f22cc4d907f41be4fc0db3750ba0c4 Mon Sep 17 00:00:00 2001 From: kakadu <kakadu.hafanana@gmail.com> Date: Mon, 18 Jan 2016 18:00:43 +0400 Subject: [PATCH 455/494] update version: now without plus sign --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 1625ff501e..8d23364682 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.02.3+modular-implicits +4.02.3-modular-implicits # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli From e673db638f429d5ef14d81ae702c8dd57535bd49 Mon Sep 17 00:00:00 2001 From: kakadu <kakadu.hafanana@gmail.com> Date: Sun, 31 Jan 2016 23:45:57 +0300 Subject: [PATCH 456/494] Helper function to convert string new invented type. --- parsing/ast_helper.ml | 5 +++++ parsing/ast_helper.mli | 2 ++ 2 files changed, 7 insertions(+) diff --git a/parsing/ast_helper.ml b/parsing/ast_helper.ml index 30c87223a2..2ef19390d7 100644 --- a/parsing/ast_helper.ml +++ b/parsing/ast_helper.ml @@ -23,6 +23,11 @@ type attrs = attribute list let default_loc = ref Location.none +let arr_flag_of_string = function + | "" -> Parr_simple + | s when s.[0]='?' -> Parr_optional (String.sub s 1 (String.length s - 1)) + | s -> Parr_labelled s + let with_default_loc l f = let old = !default_loc in default_loc := l; diff --git a/parsing/ast_helper.mli b/parsing/ast_helper.mli index 47f6be7d32..75e786a0fc 100644 --- a/parsing/ast_helper.mli +++ b/parsing/ast_helper.mli @@ -30,6 +30,8 @@ val with_default_loc: loc -> (unit -> 'a) -> 'a (** Set the [default_loc] within the scope of the execution of the provided function. *) +val arr_flag_of_string: string -> arrow_flag + (** {2 Core language} *) (** Type expressions *) From 37267ea8ceb5bf2be28ca5de4f30accbe9853e13 Mon Sep 17 00:00:00 2001 From: kakadu <kakadu.hafanana@gmail.com> Date: Mon, 1 Feb 2016 01:37:02 +0300 Subject: [PATCH 457/494] one more helper function --- parsing/ast_helper.ml | 5 +++++ parsing/ast_helper.mli | 1 + 2 files changed, 6 insertions(+) diff --git a/parsing/ast_helper.ml b/parsing/ast_helper.ml index 2ef19390d7..c5d7d13e39 100644 --- a/parsing/ast_helper.ml +++ b/parsing/ast_helper.ml @@ -28,6 +28,11 @@ let arr_flag_of_string = function | s when s.[0]='?' -> Parr_optional (String.sub s 1 (String.length s - 1)) | s -> Parr_labelled s +let app_flag_of_string = function + | "" -> Papp_simple + | s when s.[0]='?' -> Papp_optional (String.sub s 1 (String.length s - 1)) + | s -> Papp_labelled s + let with_default_loc l f = let old = !default_loc in default_loc := l; diff --git a/parsing/ast_helper.mli b/parsing/ast_helper.mli index 75e786a0fc..a5542112e4 100644 --- a/parsing/ast_helper.mli +++ b/parsing/ast_helper.mli @@ -31,6 +31,7 @@ val with_default_loc: loc -> (unit -> 'a) -> 'a of the provided function. *) val arr_flag_of_string: string -> arrow_flag +val app_flag_of_string: string -> apply_flag (** {2 Core language} *) From 7e367ae1522f74aa9bb7751788fc1ecab1c01450 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 20 Jan 2016 08:37:48 +0900 Subject: [PATCH 458/494] Rename "target" to "goal" --- typing/ctype.ml | 2 +- typing/implicitsearch.ml | 248 ++++++++++++++------------------------- typing/typeimplicit.ml | 7 +- 3 files changed, 95 insertions(+), 162 deletions(-) diff --git a/typing/ctype.ml b/typing/ctype.ml index 0f701421ee..509ccf5f2c 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -3393,7 +3393,7 @@ let rec eqtype rename type_pairs subst env t1 t2 = && Tbl.mem (Path.head p1) !equality_equations && Tbl.mem (Path.head p2) !equality_equations -> let (tl, tr) = - (* Base-kinded have priorioties *) + (* Base-kinded have priorities *) if (tl1 = [] && tl2 <> []) then (t1', t2') else if (tl2 = [] && tl1 <> []) then diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index f794afc33c..3de371395c 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -32,31 +32,34 @@ let string_of_path path = let papply path arg = Path.Papply (path, arg, Asttypes.Implicit) -(** [target] is the point from which a search starts *) -type target = { +(** [goal] is the point from which a search starts *) +type goal = { (* The module type we try to find an instance for *) - target_type : Types.module_type; - (* The identifier to which bound the result of the search to. + goal_type : Types.module_type; + (* The identifier to which the result of the search will be bound. E.g we are trying to fill the hole in: - module %target_id : %target_type = _ *) - target_id : Ident.t; + module %goal_id : %goal_type = _ *) + goal_var : Ident.t; + + (* Constraints that should be satisfied by a solution. That is when a + concrete module is bound to goal_var, equalities in goal_constraints + should be true. *) + goal_constraints : (type_expr * type_expr) list; (* A unique identifier that will be used for termination checking. When the - target is the argument to a functor instantiation, if this functor is + goal is the argument to a functor instantiation, if this functor is instantiated multiple times we enforce that the constraints on the argument are stronger. Pair (Arg_1) (Pair (Arg_1') (Arg_2)) - Arg_1 and Arg_1' targets will have a different target_id but the same - target_uid. We check that constraints on Arg_1' are stronger than those + Arg_1 and Arg_1' targets will have a different goal_var but the same + goal_uid. We check that constraints on Arg_1' are stronger than those on Arg_1'. Note: This is also true of (Pair (Arg_1') (Arg_2)) and Arg_2, used as second arguments to Pair. *) - target_uid : Ident.t; - - target_hkt : (type_expr * type_expr) list; + goal_termination_id : Ident.t; } (** Constraints are a list of equations of the form [path] = [type_expr]. @@ -288,15 +291,15 @@ module Constraints = struct in List.map flatten_cstr cstrs - (* Apply a list of equations to a target. + (* Apply a list of equations to a goal. Types referred to by paths *must* be abstract. *) - let target - : Env.t -> target -> equality_equation list -> target - = fun env target eqns -> + let goal + : Env.t -> goal -> equality_equation list -> goal + = fun env goal eqns -> (* [env] is needed only to expand module type names *) let extract_constraint acc eqn = let id, path = Path.flatten eqn.eq_lhs_path in - if not (Ident.same id target.target_id) then + if not (Ident.same id goal.goal_var) then acc else let path = List.map fst path in @@ -306,50 +309,10 @@ module Constraints = struct else cstrs, ((eqn.eq_lhs, eqn.eq_rhs) :: hkt) in let cstrs, hkt = List.fold_left extract_constraint ([],[]) eqns in - let mty = apply_abstract env target.target_type cstrs in - let target = {target with target_type = mty; - target_hkt = hkt @ target.target_hkt} in - target - - (* Apply a list of equations to a list of targets. - Types referred to by paths *must* be abstract. *) - (* DEPRECATED *) - let targets - : Env.t -> target list -> equality_equation list -> target list - = fun env targets eqns -> - (* [env] is needed only to expand module type names *) - let register_constraint table eqn = - let id, path = Path.flatten eqn.eq_lhs_path in - let path = List.map fst path in - let cstrs, hkt = - try Ident.find_same id table - with Not_found -> [], [] - in - let cstrs' = - if eqn.eq_lhs_params = [] then - ((path, eqn.eq_rhs) :: cstrs), hkt - else - cstrs, ((eqn.eq_lhs, eqn.eq_rhs) :: hkt) - in - Ident.add id cstrs' table - in - let constraint_table = - List.fold_left register_constraint Ident.empty eqns in - let constraint_target (targets,env) target = - let target = - try - let cstrs, hkt = Ident.find_same target.target_id constraint_table in - let mty = apply_abstract env target.target_type cstrs in - {target with target_type = mty; - target_hkt = hkt @ target.target_hkt} - with Not_found -> - target - in - let env = Env.add_module target.target_id target.target_type env in - (target :: targets, env) - in - let rtargets, _env = List.fold_left constraint_target ([],env) targets in - List.rev rtargets + let mty = apply_abstract env goal.goal_type cstrs in + let goal = {goal with goal_type = mty; + goal_constraints = hkt @ goal.goal_constraints} in + goal end @@ -395,7 +358,7 @@ let remove_type_variables () = equations ) variables*) -let target_of_pending inst = +let goal_of_pending inst = let env = inst.implicit_env in let ident = inst.implicit_id in let path, nl, tl = inst.implicit_type in @@ -436,24 +399,26 @@ let target_of_pending inst = hkt; let id = inst.implicit_id in !variables, - {target_type = mty; target_id = id; target_uid = id; target_hkt = hkt} + {goal_type = mty; + goal_var = id; + goal_termination_id = id; + goal_constraints = hkt} (** Termination checking **) module Termination : sig - (* A termination criterion is a set of constraints applying on a target_uid. - It's satisfied in a given state iff its constraints are stronger than - those found the state. *) + (* A termination criterion is a set of constraints applying on a + goal_termination_id. + It's satisfied in a search state iff its constraints are stronger than + those found the search state. *) type t type state val initial : state - (* From a list of target and constraints applying on those targets, - returns a termination criterion for each target *) + (* From a goal and an initial list of constraints, + build a termination criterion *) val normalize_equations - : target -> equality_equation list -> t - val normalize_equations' - : target list -> equality_equation list -> t list + : goal -> equality_equation list -> t (* [check env t state] ensures that termination criterion for [t] is satisfied in [state] and returns the stronger state. @@ -464,7 +429,7 @@ module Termination : sig val check : Env.t -> t -> state -> state - val check_target : Env.t -> target -> equality_equation list -> state -> state + val check_goal : Env.t -> goal -> equality_equation list -> state -> state end = struct (* Set of equations used for computing termination criterion. @@ -581,17 +546,17 @@ end = struct let initial = Ident.empty let normalize_equations - (* Target *) - (target : target) - (* All path must refer to some target_id *) + (* Goal *) + (goal : goal) + (* All path must refer to some goal_var *) (eqns : equality_equation list) - (* List of equations applying to target *) + (* List of equations applying to goal *) : t = - (* Add equations to target_id *) + (* Add equations to goal_var *) let eqns = list_filtermap (fun eqn -> let id, path = Path.flatten eqn.eq_lhs_path in - if not (Ident.same target.target_id id) then + if not (Ident.same goal.goal_var id) then None else let path = List.map fst path in @@ -600,42 +565,7 @@ end = struct let eqns = List.sort (fun (a,_) (b,_) -> compare a b) eqns in let eqns = merge_eqns eqns in assert (wellformed_eqns eqns); - (target.target_uid, eqns) - - (* DEPRECATED *) - let normalize_equations' - (* List of targets *) - (targets : target list) - (* All path must refer to some target_id *) - (eqns : equality_equation list) - (* List of equations applying to each target *) - : t list = - (* Map target_id to target_uid *) - let table = List.fold_left - (fun table {target_id; target_uid} -> - Ident.add target_id (target_uid,ref []) table) - Ident.empty targets - in - (* Add equations to target_id *) - List.iter - (fun eqn -> - try - let id, path = Path.flatten eqn.eq_lhs_path in - let _uid, eqns = Ident.find_same id table in - let path = List.map fst path in - eqns := (path, [eqn.eq_lhs_params, eqn.eq_rhs]) :: !eqns - with Not_found -> assert false) - eqns; - List.map - (fun target -> - try - let uid, eqns = Ident.find_same target.target_id table in - let eqns = List.sort (fun (a,_) (b,_) -> compare a b) !eqns in - let eqns = merge_eqns eqns in - assert (wellformed_eqns eqns); - (uid, eqns) - with Not_found -> assert false) - targets + (goal.goal_termination_id, eqns) let explain success ppf (id,eqns,eqns') = let print_ppath ppf (path,params) = match params with @@ -679,8 +609,8 @@ end = struct end; Ident.add uid eqns stack - let check_target env target eqns stack = - let t = normalize_equations target eqns in + let check_goal env goal eqns stack = + let t = normalize_equations goal eqns in check env t stack end @@ -697,7 +627,7 @@ let report_error msg exn = module Search : sig - type candidate = Path.t * target list * Types.module_type + type candidate = Path.t * goal list * Types.module_type type query type partial @@ -708,7 +638,7 @@ module Search : sig val all_candidates : query -> candidate list - val start : Env.t -> Ident.t list -> target -> query + val start : Env.t -> Ident.t list -> goal -> query type outcome = [ | `Done of result @@ -720,13 +650,13 @@ module Search : sig end = struct - type candidate = Path.t * target list * Types.module_type + type candidate = Path.t * goal list * Types.module_type type 'a state = { payload: 'a; termination: Termination.state; - target: target; + goal: goal; env: Env.t; (* List of partials paths being constructed, only for debug purpose *) @@ -751,7 +681,7 @@ end = struct type partial = (* Intermediate result: a path has been found, but some arguments are missing and need to be applied *) - (Path.t * target list) state + (Path.t * goal list) state type result = (* Final result: the path points to a module with the desired type *) @@ -766,7 +696,7 @@ end = struct | `Step of partial * query ] - let start env vars target = + let start env vars goal = let level = get_current_level () in let env = List.fold_left (fun env variable -> Env.add_type ~check:false variable @@ -781,7 +711,7 @@ end = struct { payload = (); termination = Termination.initial; - target = target; + goal = goal; env = env; debug_path = []; @@ -798,13 +728,13 @@ end = struct let param' = Subst.modtype s param in let id' = Ident.rename id in let s' = Subst.add_module id (Path.Pident id') s in - let target = - { target_uid = id; - target_id = id'; - target_type = param'; - target_hkt = []; } - in - let acc' = target :: acc in + let goal = { + goal_var = id'; + goal_type = param'; + goal_constraints = []; + goal_termination_id = id; + } in + let acc' = goal :: acc in loop path res s' acc' rest in loop path mty Subst.identity [] params @@ -827,7 +757,7 @@ end = struct exception Invalid_candidate - let step0 state (path, sub_targets, candidate_mty) = + let step0 state (path, sub_goals, candidate_mty) = state.eq_var := state.eq_initial; let rec print_paths ppf = function | [] -> Format.pp_print_string ppf "_"; @@ -835,21 +765,21 @@ end = struct in let print_paths ppf ps = print_paths ppf (List.rev ps) in printf "%a <- %a\n" print_paths state.debug_path Printtyp.path path; - let target = state.target in + let goal = state.goal in (* Generate coercion. if this succeeds this produce equations in eq_var *) let eq_table, env = List.fold_left - (fun (eq_table, env) sub_target -> + (fun (eq_table, env) sub_goal -> printf "Binding %a with type %a\n%!" - Printtyp.ident sub_target.target_id - Printtyp.modtype sub_target.target_type; - Tbl.add sub_target.target_id state.eq_var eq_table, - Env.add_module sub_target.target_id sub_target.target_type env) - (state.eq_table, state.env) sub_targets + Printtyp.ident sub_goal.goal_var + Printtyp.modtype sub_goal.goal_type; + Tbl.add sub_goal.goal_var state.eq_var eq_table, + Env.add_module sub_goal.goal_var sub_goal.goal_type env) + (state.eq_table, state.env) sub_goals in - let env = Env.add_module target.target_id candidate_mty env in + let env = Env.add_module goal.goal_var candidate_mty env in Ctype.with_equality_equations eq_table (fun () -> - let tyl, tvl = List.split target.target_hkt in + let tyl, tvl = List.split goal.goal_constraints in begin try if tyl <> [] then printf "Checkinq equalities between hkt constraints:\n%!"; @@ -897,7 +827,7 @@ end = struct raise Invalid_candidate end; let _ : module_coercion = - Includemod.modtypes env candidate_mty target.target_type + Includemod.modtypes env candidate_mty goal.goal_type in ()); let rec neweqns = function @@ -924,19 +854,20 @@ end = struct functor F (X : T) (Y : S) = ... we might have type t = Y.t X.t as a constraint on X *) - let eq_table = cleanup_equations target.target_id eq_table in + let eq_table = cleanup_equations goal.goal_var eq_table in (* Keep new equations potentially added to top variables *) let state = {state with eq_initial = eq_final; env; eq_table = eq_table} in - match sub_targets with + match sub_goals with | [] -> `Done {state with payload = path} - | target :: sub_targets -> + | goal :: sub_goals -> let debug_path = state.debug_path in - let partial = {state with payload = (path, sub_targets)} in - let target = Constraints.target state.env target eq_final in - let termination = Termination.check_target state.env target eq_final state.termination in - let state = {state with target; termination; debug_path = path :: debug_path} in + let partial = {state with payload = (path, sub_goals)} in + let goal = Constraints.goal state.env goal eq_final in + let termination = + Termination.check_goal state.env goal eq_final state.termination in + let state = {state with goal; termination; debug_path = path :: debug_path} in `Step (partial, state) let rec step state = function @@ -954,28 +885,29 @@ end = struct step state candidates let apply partial arg = - let partial_path, sub_targets = partial.payload in + let partial_path, sub_goals = partial.payload in let arg_path = arg.payload in let eq_initial = arg.eq_initial in let path = papply partial_path arg_path in - match sub_targets with + match sub_goals with | [] -> let state = {partial with (* We get the equations from the argument but keep termination state from the parent *) payload = path; eq_initial} in `Done state - | target :: sub_targets -> - let partial = {partial with payload = (path, sub_targets) } in + | goal :: sub_goals -> + let partial = {partial with payload = (path, sub_goals) } in let md = Env.find_module path arg.env in (* The original module declaration might be implicit, we want to avoid rebinding implicit *) let md = {md with md_implicit = Asttypes.Nonimplicit} in - let target = Constraints.target arg.env target eq_initial in - let termination = Termination.check_target arg.env target eq_initial partial.termination in - let env = Env.add_module_declaration target.target_id md arg.env in + let goal = Constraints.goal arg.env goal eq_initial in + let termination = + Termination.check_goal arg.env goal eq_initial partial.termination in + let env = Env.add_module_declaration goal.goal_var md arg.env in let debug_path = path :: partial.debug_path in - let arg = {arg with payload = (); target; debug_path; termination; env} in + let arg = {arg with payload = (); goal; debug_path; termination; env} in `Step (partial, arg) end @@ -1056,7 +988,7 @@ let rec canonical_path env path = let find_pending_instance inst = let snapshot = Btype.snapshot () in - let vars, target = target_of_pending inst in + let vars, goal = goal_of_pending inst in let env = inst.implicit_env in let env = List.fold_left (fun env (_ty,ident) -> (* Create a fake abstract type declaration for name. *) @@ -1077,7 +1009,7 @@ let find_pending_instance inst = ) env vars in let loc = inst.implicit_loc in - let query = Search.start env (List.map snd vars) target in + let query = Search.start env (List.map snd vars) goal in try let solution = Solution.search query in let path = Solution.get solution in diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index fe3304cb74..0a42e73454 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -46,9 +46,10 @@ type pending_implicit = { implicit_argument: argument; } -(*val env : Env.t - val unlink_on - : Ident.t -> (type_expr -> type_expr -> unit) option*) +(* + val env : Env.t + val unlink_on : Ident.t -> (type_expr -> type_expr -> unit) option +*) let unlink env unlink_on = let path_table = Hashtbl.create 7 in From 7d33629e99cdb1df8a755430d36ad107363d3c22 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 20 Jan 2016 08:59:40 +0900 Subject: [PATCH 459/494] Implicitsearch.Constraints.goal: check equations on abstract row types like ones on parametric types --- typing/implicitsearch.ml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 3de371395c..75e2504232 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -30,6 +30,17 @@ let rec list_filtermap f = function let string_of_path path = Path.to_longident path |> Longident.flatten |> String.concat "." +let has_suffix ~suffix str = + let l = String.length str and n = String.length suffix in + l >= n && + try + for i = 0 to n - 1 do + if str.[l - n + i] <> suffix.[i] then + raise Exit + done; + true + with Exit -> false + let papply path arg = Path.Papply (path, arg, Asttypes.Implicit) (** [goal] is the point from which a search starts *) @@ -303,8 +314,13 @@ module Constraints = struct acc else let path = List.map fst path in + let rec is_row = function + | [t] -> has_suffix ~suffix:"#row" t + | _ :: xs -> is_row xs + | [] -> assert false + in let cstrs, hkt = acc in - if eqn.eq_lhs_params = [] then + if eqn.eq_lhs_params = [] && not (is_row path) then ((path, eqn.eq_rhs) :: cstrs), hkt else cstrs, ((eqn.eq_lhs, eqn.eq_rhs) :: hkt) in From 2583ab8827208d1a1d725637e747849a8836d8fb Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Mon, 25 Jan 2016 14:34:27 +0900 Subject: [PATCH 460/494] Introduce "virtual" implicit parameters --- bytecomp/translmod.ml | 4 ++-- ocamldoc/odoc_ast.ml | 12 ++++++------ ocamldoc/odoc_env.ml | 2 +- ocamldoc/odoc_html.ml | 2 +- ocamldoc/odoc_info.mli | 2 +- ocamldoc/odoc_man.ml | 5 +++-- ocamldoc/odoc_module.ml | 2 +- ocamldoc/odoc_print.ml | 2 +- ocamldoc/odoc_sig.ml | 10 +++++----- ocamldoc/odoc_to_text.ml | 35 +++++++++++++++++------------------ parsing/ast_mapper.ml | 4 ++-- parsing/parser.mly | 4 +++- parsing/parsetree.mli | 3 ++- parsing/pprintast.ml | 4 ++-- parsing/printast.ml | 5 +++-- tools/depend.ml | 2 +- tools/tast_iter.ml | 2 +- tools/untypeast.ml | 4 ++-- typing/btype.ml | 2 +- typing/env.ml | 14 +++++++------- typing/implicitsearch.ml | 2 +- typing/includemod.ml | 21 +++++++++++---------- typing/mtype.ml | 6 +++--- typing/oprint.ml | 10 ++++++++-- typing/outcometree.mli | 14 ++++++++------ typing/printtyp.ml | 4 ++-- typing/printtyped.ml | 5 +++-- typing/subst.ml | 4 ++-- typing/typedtree.ml | 6 +++--- typing/typedtree.mli | 2 +- typing/typedtreeIter.ml | 2 +- typing/typedtreeMap.ml | 4 ++-- typing/typemod.ml | 24 ++++++++++++++---------- typing/types.ml | 9 ++++----- typing/types.mli | 2 +- 35 files changed, 126 insertions(+), 109 deletions(-) diff --git a/bytecomp/translmod.ml b/bytecomp/translmod.ml index 9d0ed1dda4..855264b280 100644 --- a/bytecomp/translmod.ml +++ b/bytecomp/translmod.ml @@ -41,7 +41,7 @@ let functor_path path param = | Some p, Tmpar_generative -> Some p | Some p, Tmpar_applicative(id, _, _) -> Some(Papply(p, Pident id, Nonimplicit)) - | Some p, Tmpar_implicit(id, _, _) -> + | Some p, Tmpar_implicit(_, id, _, _) -> Some(Papply(p, Pident id, Implicit)) let field_path path field = @@ -347,7 +347,7 @@ let rec transl_module cc rootpath mexp = match param with | Tmpar_generative -> Ident.create "()" | Tmpar_applicative(id, _, _) -> id - | Tmpar_implicit(id, _, _) -> id + | Tmpar_implicit(_, id, _, _) -> id in oo_wrap mexp.mod_env true (function diff --git a/ocamldoc/odoc_ast.ml b/ocamldoc/odoc_ast.ml index 21ee215410..c32f82391b 100644 --- a/ocamldoc/odoc_ast.ml +++ b/ocamldoc/odoc_ast.ml @@ -1902,7 +1902,7 @@ module Analyser = match p_module_param with | Parsetree.Pmpar_generative -> Location.none | Parsetree.Pmpar_applicative(_, pmty) - | Parsetree.Pmpar_implicit(_, pmty) -> + | Parsetree.Pmpar_implicit(_, _, pmty) -> pmty.Parsetree.pmty_loc in let loc_start = loc.Location.loc_start.Lexing.pos_cnum in @@ -1912,8 +1912,8 @@ module Analyser = let mp_name = match tt_module_param with | Typedtree.Tmpar_generative -> "()" - | Typedtree.Tmpar_applicative(ident,_, _) - | Typedtree.Tmpar_implicit(ident, _, _) -> + | Typedtree.Tmpar_applicative(ident, _, _) + | Typedtree.Tmpar_implicit(_, ident, _, _) -> Name.from_ident ident in let mp_kind = @@ -1921,7 +1921,7 @@ module Analyser = | Parsetree.Pmpar_generative, Tmpar_generative -> Module_type_struct [] | Parsetree.Pmpar_applicative(_, pmty), Tmpar_applicative(_, _, mty) - | Parsetree.Pmpar_implicit(_, pmty), Tmpar_implicit(_, _, mty) -> + | Parsetree.Pmpar_implicit(_, _, pmty), Tmpar_implicit(_, _, _, mty) -> Sig.analyse_module_type_kind env current_module_name pmty mty.mty_type | _, _ -> @@ -1932,8 +1932,8 @@ module Analyser = | Tmpar_generative -> Mp_generative | Tmpar_applicative(_, _, mty) -> Mp_applicative (Odoc_env.subst_module_type env mty.mty_type) - | Tmpar_implicit(_, _, mty) -> - Mp_implicit (Odoc_env.subst_module_type env mty.mty_type) + | Tmpar_implicit(virt, _, _, mty) -> + Mp_implicit (virt, Odoc_env.subst_module_type env mty.mty_type) in { mp_name = mp_name ; diff --git a/ocamldoc/odoc_env.ml b/ocamldoc/odoc_env.ml index 83f59677f3..f8a8b49e89 100644 --- a/ocamldoc/odoc_env.ml +++ b/ocamldoc/odoc_env.ml @@ -229,7 +229,7 @@ let subst_module_type env t = match p with | Types.Mpar_generative -> Types.Mpar_generative | Types.Mpar_applicative(id, mt) -> Types.Mpar_applicative(id, iter mt) - | Types.Mpar_implicit(id, mt) -> Types.Mpar_implicit(id, iter mt) + | Types.Mpar_implicit(v, id, mt) -> Types.Mpar_implicit(v, id, iter mt) in iter t diff --git a/ocamldoc/odoc_html.ml b/ocamldoc/odoc_html.ml index ddbbfbcf44..8e385707d1 100644 --- a/ocamldoc/odoc_html.ml +++ b/ocamldoc/odoc_html.ml @@ -1433,7 +1433,7 @@ class html = method html_of_module_parameter_type b m_name p = match p.mp_type with | Mp_generative -> bs b "<code>()</code>" - | Mp_applicative mty | Mp_implicit mty -> + | Mp_applicative mty | Mp_implicit (_,mty) -> self#html_of_module_type b m_name ~code: p.mp_type_code mty (** Generate a file containing the module type in the given file name. *) diff --git a/ocamldoc/odoc_info.mli b/ocamldoc/odoc_info.mli index e37981d850..bec45d732c 100644 --- a/ocamldoc/odoc_info.mli +++ b/ocamldoc/odoc_info.mli @@ -497,7 +497,7 @@ module Module : and module_parameter_type = Odoc_module.module_parameter_type = | Mp_generative | Mp_applicative of Types.module_type - | Mp_implicit of Types.module_type + | Mp_implicit of Asttypes.virtual_flag * Types.module_type and module_argument = Odoc_module.module_argument = | Ma_generative diff --git a/ocamldoc/odoc_man.ml b/ocamldoc/odoc_man.ml index 97b7735cc9..f350b580b3 100644 --- a/ocamldoc/odoc_man.ml +++ b/ocamldoc/odoc_man.ml @@ -727,8 +727,9 @@ class man = | Mp_applicative mty -> bs b ("\""^p.mp_name^"\"\n"); self#man_of_module_type b m_name mty - | Mp_implicit mty -> - bs b ("\""^p.mp_name^"\"\n"); + | Mp_implicit (v, mty) -> + let v = if v = Asttypes.Virtual then "virtual " else "" in + bs b ("\""^v^p.mp_name^"\"\n"); self#man_of_module_type b m_name mty); bs b "\n"; ( diff --git a/ocamldoc/odoc_module.ml b/ocamldoc/odoc_module.ml index 37d42e30e4..7fd59c7bd5 100644 --- a/ocamldoc/odoc_module.ml +++ b/ocamldoc/odoc_module.ml @@ -55,7 +55,7 @@ and module_parameter = { and module_parameter_type = | Mp_generative | Mp_applicative of Types.module_type - | Mp_implicit of Types.module_type + | Mp_implicit of Asttypes.virtual_flag * Types.module_type and module_argument = | Ma_generative diff --git a/ocamldoc/odoc_print.ml b/ocamldoc/odoc_print.ml index b3f172ed2e..03e2a6ca50 100644 --- a/ocamldoc/odoc_print.ml +++ b/ocamldoc/odoc_print.ml @@ -64,7 +64,7 @@ let simpl_module_type ?code t = match p with | Types.Mpar_generative -> Types.Mpar_generative | Types.Mpar_applicative(id, mt) -> Types.Mpar_applicative(id, iter mt) - | Types.Mpar_implicit(id, mt) -> Types.Mpar_implicit(id, iter mt) + | Types.Mpar_implicit(v, id, mt) -> Types.Mpar_implicit(v, id, iter mt) in iter t diff --git a/ocamldoc/odoc_sig.ml b/ocamldoc/odoc_sig.ml index 32462b95f1..89f7043c82 100644 --- a/ocamldoc/odoc_sig.ml +++ b/ocamldoc/odoc_sig.ml @@ -1368,7 +1368,7 @@ module Analyser = match parse_module_param with | Parsetree.Pmpar_generative -> Location.none | Parsetree.Pmpar_applicative(_, pmty) - | Parsetree.Pmpar_implicit(_, pmty) -> + | Parsetree.Pmpar_implicit(_, _, pmty) -> pmty.Parsetree.pmty_loc in let loc_start = loc.Location.loc_start.Lexing.pos_cnum in @@ -1378,7 +1378,7 @@ module Analyser = let mp_name = match sig_module_param with | Mpar_generative -> "()" - | Mpar_applicative(ident, _) | Mpar_implicit(ident, _) -> + | Mpar_applicative(ident, _) | Mpar_implicit(_, ident, _) -> Name.from_ident ident in let mp_kind = @@ -1386,7 +1386,7 @@ module Analyser = | Parsetree.Pmpar_generative, Mpar_generative -> Module_type_struct [] | Parsetree.Pmpar_applicative(_, pmty), Mpar_applicative(_, mty) - | Parsetree.Pmpar_implicit(_, pmty), Mpar_implicit(_, mty) -> + | Parsetree.Pmpar_implicit(_, _, pmty), Mpar_implicit(_, _, mty) -> analyse_module_type_kind env current_module_name pmty mty | _, _ -> @@ -1399,8 +1399,8 @@ module Analyser = | Mpar_generative -> Mp_generative | Mpar_applicative(_, mty) -> Mp_applicative (Odoc_env.subst_module_type env mty) - | Mpar_implicit(_, mty) -> - Mp_implicit (Odoc_env.subst_module_type env mty) + | Mpar_implicit(virt, _, mty) -> + Mp_implicit (virt, Odoc_env.subst_module_type env mty) in { mp_name = mp_name ; diff --git a/ocamldoc/odoc_to_text.ml b/ocamldoc/odoc_to_text.ml index bb72238d76..4286bba946 100644 --- a/ocamldoc/odoc_to_text.ml +++ b/ocamldoc/odoc_to_text.ml @@ -432,24 +432,23 @@ class virtual to_text = [ Newline ; Bold [Raw Odoc_messages.parameters] ; Raw ":" ; - List - (List.map - (fun (p, desc_opt) -> - begin match p.mp_type with - | Mp_generative -> [Raw ""] - | Mp_applicative mty -> - [Code (p.mp_name^" : ")] @ - (self#text_of_module_type mty) - | Mp_implicit mty -> - [Code (p.mp_name^" : ")] @ - (self#text_of_module_type mty) - end @ - (match desc_opt with - None -> [] - | Some t -> (Raw " ") :: t) - ) - l - ) + let text_of_module_parameter (p, desc_opt) = + begin match p.mp_type with + | Mp_generative -> [Raw ""] + | Mp_applicative mty -> + [Code (p.mp_name^" : ")] @ + (self#text_of_module_type mty) + | Mp_implicit (v, mty) -> + let v = if v = Asttypes.Virtual then "virtual " else "" in + [Code (v ^ p.mp_name ^ " : ")] @ + (self#text_of_module_type mty) + end @ + begin match desc_opt with + None -> [] + | Some t -> (Raw " ") :: t + end + in + List (List.map text_of_module_parameter l) ] (**/**) diff --git a/parsing/ast_mapper.ml b/parsing/ast_mapper.ml index eca4d0e1b8..6a4c9f4972 100644 --- a/parsing/ast_mapper.ml +++ b/parsing/ast_mapper.ml @@ -210,8 +210,8 @@ module MT = struct | Pmpar_generative -> Pmpar_generative | Pmpar_applicative(s, mty) -> Pmpar_applicative(map_loc sub s, sub.module_type sub mty) - | Pmpar_implicit(s, mty) -> - Pmpar_implicit(map_loc sub s, sub.module_type sub mty) + | Pmpar_implicit(flag, s, mty) -> + Pmpar_implicit(flag, map_loc sub s, sub.module_type sub mty) let map sub {pmty_desc = desc; pmty_loc = loc; pmty_attributes = attrs} = let open Mty in diff --git a/parsing/parser.mly b/parsing/parser.mly index 1efee42e1d..d9b5783501 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -681,7 +681,9 @@ functor_param: | LPAREN functor_param_name COLON module_type RPAREN { Pmpar_applicative(mkrhs $2 2, $4) } | LBRACE functor_param_name COLON module_type RBRACE - { Pmpar_implicit(mkrhs $2 2, $4) } + { Pmpar_implicit(Concrete, mkrhs $2 2, $4) } + | LBRACE VIRTUAL functor_param_name COLON module_type RBRACE + { Pmpar_implicit(Virtual, mkrhs $3 3, $5) } ; functor_param_name: diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index d759b4e2c5..23ebec2279 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -771,8 +771,9 @@ and module_parameter = (* () *) | Pmpar_applicative of string loc * module_type (* (X : MT) *) - | Pmpar_implicit of string loc * module_type + | Pmpar_implicit of virtual_flag * string loc * module_type (* {X : MT} *) + (* {virtual X : MT} *) and module_argument = | Pmarg_generative diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index 72065b88fb..cf5aa0786d 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -941,8 +941,8 @@ class printer ()= object(self:'self) | Pmpar_generative -> pp f "()" | Pmpar_applicative(s, mty) -> pp f "(%s:%a)" s.txt self#module_type mty - | Pmpar_implicit(s, mty) -> - pp f "{%s:%a}" s.txt self#module_type mty + | Pmpar_implicit(v, s, mty) -> + pp f "{%a%s:%a}" self#virtual_flag v s.txt self#module_type mty method module_argument f x = match x with diff --git a/parsing/printast.ml b/parsing/printast.ml index c43eff8a5b..6184967d02 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -766,8 +766,9 @@ and module_parameter i ppf x = | Pmpar_applicative(s, mty) -> line i ppf "Pmarg_applicative %a\n" fmt_string_loc s; module_type i ppf mty - | Pmpar_implicit(s, mty) -> - line i ppf "Pmarg_implicit %a\n" fmt_string_loc s; + | Pmpar_implicit(v, s, mty) -> + line i ppf "Pmarg_implicit (%a %a)\n" + fmt_virtual_flag v fmt_string_loc s; module_type i ppf mty and module_argument i ppf x = diff --git a/tools/depend.ml b/tools/depend.ml index 81e67b2eea..93e685a303 100644 --- a/tools/depend.ml +++ b/tools/depend.ml @@ -292,7 +292,7 @@ and add_module_parameter bv = function | Pmpar_applicative(id, mty) -> add_modtype bv mty; StringSet.add id.txt bv - | Pmpar_implicit(id, mty) -> + | Pmpar_implicit(_, id, mty) -> add_modtype bv mty; StringSet.add id.txt bv diff --git a/tools/tast_iter.ml b/tools/tast_iter.ml index 217af6f93e..f06f2ecbe2 100644 --- a/tools/tast_iter.ml +++ b/tools/tast_iter.ml @@ -209,7 +209,7 @@ let module_parameter sub mparam = match mparam with | Tmpar_generative -> () | Tmpar_applicative(_, _, mtype) -> sub # module_type mtype - | Tmpar_implicit(_, _, mtype) -> sub # module_type mtype + | Tmpar_implicit(_, _, _, mtype) -> sub # module_type mtype let module_type sub mty = match mty.mty_desc with diff --git a/tools/untypeast.ml b/tools/untypeast.ml index e4f0761e5d..7a6ac6ffdc 100644 --- a/tools/untypeast.ml +++ b/tools/untypeast.ml @@ -516,8 +516,8 @@ and untype_module_parameter = function | Tmpar_generative -> Pmpar_generative | Tmpar_applicative(_id, name, mty) -> Pmpar_applicative(name, untype_module_type mty) - | Tmpar_implicit(_id, name, mty) -> - Pmpar_implicit(name, untype_module_type mty) + | Tmpar_implicit(virt, _id, name, mty) -> + Pmpar_implicit(virt, name, untype_module_type mty) and untype_module_argument = function | Tmarg_generative -> Pmarg_generative diff --git a/typing/btype.ml b/typing/btype.ml index 52b445d971..344d1c433c 100644 --- a/typing/btype.ml +++ b/typing/btype.ml @@ -296,7 +296,7 @@ let type_iterators = and it_module_parameter it = function | Mpar_generative -> () | Mpar_applicative(_, mt) -> it.it_module_type it mt - | Mpar_implicit(_, mt) -> it.it_module_type it mt + | Mpar_implicit(_, _, mt) -> it.it_module_type it mt and it_class_type it = function Cty_constr (p, tyl, cty) -> it.it_path p; diff --git a/typing/env.ml b/typing/env.ml index 2d92beb536..070d25a19f 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -545,7 +545,7 @@ let find_module ~alias path env = let param_id = match f.fcomp_param with | Mpar_generative -> assert false - | Mpar_applicative(id, _) | Mpar_implicit(id, _) -> id + | Mpar_applicative(id, _) | Mpar_implicit(_, id, _) -> id in let mty = Subst.modtype @@ -708,7 +708,7 @@ let rec lookup_module_descr lid env = | Mpar_generative, _ -> raise Not_found | Mpar_applicative _, Implicit -> raise Not_found | Mpar_implicit _, Nonimplicit -> raise Not_found - | (Mpar_applicative(_, param) | Mpar_implicit(_, param)), _ -> + | (Mpar_applicative(_, param) | Mpar_implicit(_, _, param)), _ -> !check_modtype_inclusion env mty2 p2 param; (Papply(p1, p2, i), !components_of_functor_appl' f p1 p2 i) end @@ -757,7 +757,7 @@ and lookup_module ~load lid env : Path.t = | Mpar_generative, _ -> raise Not_found | Mpar_applicative _, Implicit -> raise Not_found | Mpar_implicit _, Nonimplicit -> raise Not_found - | (Mpar_applicative(_, param) | Mpar_implicit(_, param)), _ -> + | (Mpar_applicative(_, param) | Mpar_implicit(_, _, param)), _ -> !check_modtype_inclusion env mty2 p2 param; p end @@ -1279,7 +1279,7 @@ let register_if_implicit path md env = let rec add acc params mty = let acc = ((path, List.rev params, mty) :: acc) in match scrape_alias env mty with - | Mty_functor (Mpar_implicit(id, param), res) -> + | Mty_functor (Mpar_implicit(_, id, param), res) -> let params = (id, param) :: params in add acc params res | _ -> acc @@ -1378,8 +1378,8 @@ and components_of_module_maker (env, sub, path, mty) = | Mpar_generative -> Mpar_generative | Mpar_applicative(id, mty) -> Mpar_applicative(id, Subst.modtype sub mty) - | Mpar_implicit(id, mty) -> - Mpar_implicit(id, Subst.modtype sub mty) + | Mpar_implicit(virt, id, mty) -> + Mpar_implicit(virt, id, Subst.modtype sub mty) in Functor_comps { fcomp_param = param; @@ -1558,7 +1558,7 @@ let components_of_functor_appl f p1 p2 i = let param_id = match f.fcomp_param with | Mpar_generative -> assert false - | Mpar_applicative(id, _) | Mpar_implicit(id, _) -> id + | Mpar_applicative(id, _) | Mpar_implicit(_, id, _) -> id in let mty = Subst.modtype (Subst.add_module param_id p2 Subst.identity) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 75e2504232..6d26501914 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -1082,7 +1082,7 @@ let pack_implicit inst path = match param with | Mpar_generative -> assert false | Mpar_applicative(param, mty_param) - | Mpar_implicit(param, mty_param) -> + | Mpar_implicit(_, param, mty_param) -> param, mty_param in let coercion = Includemod.modtypes env marg.mod_type mty_param in diff --git a/typing/includemod.ml b/typing/includemod.ml index 20957f6450..c34a5f37c2 100644 --- a/typing/includemod.ml +++ b/typing/includemod.ml @@ -284,19 +284,20 @@ and try_modtypes env cxt subst mty1 mty2 = (Tcoerce_none, Tcoerce_none) -> Tcoerce_none | _ -> Tcoerce_functor(cc_arg, cc_res) end - | Mpar_implicit(id1, arg1), Mpar_implicit(id2, arg2) -> begin - let arg2' = Subst.modtype subst arg2 in - let cc_arg = - modtypes env (Param (Implicit id1)::cxt) Subst.identity arg2' arg1 - in - let cc_res = - modtypes (Env.add_module id1 arg2' env) (Body (Implicit id1)::cxt) - (Subst.add_module id2 (Pident id1) subst) res1 res2 - in + | Mpar_implicit(v1, id1, arg1), Mpar_implicit(v2, id2, arg2) when v1 = v2 -> + begin + let arg2' = Subst.modtype subst arg2 in + let cc_arg = + modtypes env (Param (Implicit id1)::cxt) Subst.identity arg2' arg1 + in + let cc_res = + modtypes (Env.add_module id1 arg2' env) (Body (Implicit id1)::cxt) + (Subst.add_module id2 (Pident id1) subst) res1 res2 + in match (cc_arg, cc_res) with (Tcoerce_none, Tcoerce_none) -> Tcoerce_none | _ -> Tcoerce_functor(cc_arg, cc_res) - end + end | (_, _) -> raise Dont_match end | (_, _) -> diff --git a/typing/mtype.ml b/typing/mtype.ml index 47338787a2..1fd5af27c3 100644 --- a/typing/mtype.ml +++ b/typing/mtype.ml @@ -38,7 +38,7 @@ let rec strengthen env mty p = when !Clflags.applicative_functors -> let res' = strengthen env res (Papply(p, Pident id, Nonimplicit)) in Mty_functor(param, res') - | Mty_functor(Mpar_implicit(id, _) as param, res) + | Mty_functor(Mpar_implicit(_, id, _) as param, res) when !Clflags.applicative_functors -> let res' = strengthen env res (Papply(p, Pident id, Implicit)) in Mty_functor(param, res') @@ -128,8 +128,8 @@ let nondep_supertype env mid mty = nondep_mty (Env.add_module ~arg:true id arg env) va res) - | Mpar_implicit(id, arg) -> - Mty_functor(Mpar_implicit(id, nondep_mty env var_inv arg), + | Mpar_implicit(virt, id, arg) -> + Mty_functor(Mpar_implicit(virt, id, nondep_mty env var_inv arg), nondep_mty (Env.add_module ~arg:true id arg env) va res) diff --git a/typing/oprint.ml b/typing/oprint.ml index 9f933fb649..0076497ae5 100644 --- a/typing/oprint.ml +++ b/typing/oprint.ml @@ -10,6 +10,7 @@ (* *) (***********************************************************************) +open Asttypes open Format open Outcometree @@ -43,6 +44,10 @@ let value_ident ppf name = else pp_print_string ppf name +let virtual_flag ppf = function + | Virtual -> fprintf ppf "virtual@;" + | Concrete -> () + (* Values *) let valid_float_lexeme s = @@ -383,8 +388,9 @@ and print_out_module_parameter ppf = fprintf ppf "()" | Ompar_applicative(name, mty) -> fprintf ppf "(%s : %a)" name print_out_module_type mty - | Ompar_implicit(name, mty) -> - fprintf ppf "{%s : %a}" name print_out_module_type mty + | Ompar_implicit(virt, name, mty) -> + fprintf ppf "{%a%s : %a}" + virtual_flag virt name print_out_module_type mty and print_out_module_type ppf = function diff --git a/typing/outcometree.mli b/typing/outcometree.mli index 77d6128444..99cf6c8c28 100644 --- a/typing/outcometree.mli +++ b/typing/outcometree.mli @@ -12,6 +12,8 @@ (* Module [Outcometree]: results displayed by the toplevel *) +open Asttypes + (* These types represent messages that the toplevel displays as normal results or errors. The real displaying is customisable using the hooks: [Toploop.print_out_value] @@ -20,7 +22,7 @@ [Toploop.print_out_phrase] *) type out_ident = - | Oide_apply of out_ident * out_ident * Asttypes.implicit_flag + | Oide_apply of out_ident * out_ident * implicit_flag | Oide_dot of out_ident * string | Oide_ident of string @@ -84,7 +86,7 @@ type out_module_type = and out_module_parameter = | Ompar_generative | Ompar_applicative of string * out_module_type - | Ompar_implicit of string * out_module_type + | Ompar_implicit of virtual_flag * string * out_module_type and out_sig_item = | Osig_class of bool * string * (string * (bool * bool)) list * out_class_type * @@ -94,14 +96,14 @@ and out_sig_item = out_rec_status | Osig_typext of out_extension_constructor * out_ext_status | Osig_modtype of string * out_module_type - | Osig_module of string * out_module_type * out_rec_status * Asttypes.implicit_flag + | Osig_module of string * out_module_type * out_rec_status * implicit_flag | Osig_type of out_type_decl * out_rec_status | Osig_value of string * out_type * string list and out_type_decl = { otype_name: string; otype_params: (string * (bool * bool)) list; otype_type: out_type; - otype_private: Asttypes.private_flag; + otype_private: private_flag; otype_cstrs: (out_type * out_type) list } and out_extension_constructor = { oext_name: string; @@ -109,12 +111,12 @@ and out_extension_constructor = oext_type_params: string list; oext_args: out_type list; oext_ret_type: out_type option; - oext_private: Asttypes.private_flag } + oext_private: private_flag } and out_type_extension = { otyext_name: string; otyext_params: string list; otyext_constructors: (string * out_type list * out_type option) list; - otyext_private: Asttypes.private_flag } + otyext_private: private_flag } and out_rec_status = | Orec_not | Orec_first diff --git a/typing/printtyp.ml b/typing/printtyp.ml index 5d9020e03f..06a5552163 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -1226,12 +1226,12 @@ let rec tree_of_modtype = function in Omty_functor (Ompar_applicative(Ident.name id, tree_of_modtype mty), res) - | Mpar_implicit(id, mty) -> + | Mpar_implicit(virt, id, mty) -> let res = wrap_env (Env.add_module ~arg:true id mty) tree_of_modtype ty_res in Omty_functor - (Ompar_implicit(Ident.name id, tree_of_modtype mty), res) + (Ompar_implicit(virt, Ident.name id, tree_of_modtype mty), res) end | Mty_alias p -> Omty_alias (tree_of_path p) diff --git a/typing/printtyped.ml b/typing/printtyped.ml index 6d7506f735..e8275b6e8c 100644 --- a/typing/printtyped.ml +++ b/typing/printtyped.ml @@ -741,8 +741,9 @@ and module_parameter i ppf x = | Tmpar_applicative(s, _, mty) -> line i ppf "Pmarg_applicative \"%a\"\n" fmt_ident s; module_type i ppf mty - | Tmpar_implicit(s, _, mty) -> - line i ppf "Pmarg_implicit \"%a\"\n" fmt_ident s; + | Tmpar_implicit(v, s, _, mty) -> + line i ppf "Pmarg_implicit (%a, \"%a\")\n" + fmt_virtual_flag v fmt_ident s; module_type i ppf mty and module_argument i ppf x = diff --git a/typing/subst.ml b/typing/subst.ml index 831cacb4c7..3e7b161d5c 100644 --- a/typing/subst.ml +++ b/typing/subst.ml @@ -364,9 +364,9 @@ let rec modtype s = function let id' = Ident.rename id in Mty_functor(Mpar_applicative(id', modtype s mty), modtype (add_module id (Pident id') s) res) - | Mpar_implicit(id, mty) -> + | Mpar_implicit(virt, id, mty) -> let id' = Ident.rename id in - Mty_functor(Mpar_implicit(id', modtype s mty), + Mty_functor(Mpar_implicit(virt, id', modtype s mty), modtype (add_module id (Pident id') s) res) end | Mty_alias p -> diff --git a/typing/typedtree.ml b/typing/typedtree.ml index 3402adfd71..69e97dc034 100644 --- a/typing/typedtree.ml +++ b/typing/typedtree.ml @@ -187,8 +187,8 @@ and module_expr = } and module_type_constraint = - Tmodtype_implicit -| Tmodtype_explicit of module_type + Tmodtype_implicit + | Tmodtype_explicit of module_type and module_expr_desc = Tmod_ident of Path.t * Longident.t loc @@ -202,7 +202,7 @@ and module_expr_desc = and module_parameter = | Tmpar_generative | Tmpar_applicative of Ident.t * string loc * module_type - | Tmpar_implicit of Ident.t * string loc * module_type + | Tmpar_implicit of virtual_flag * Ident.t * string loc * module_type and module_argument = | Tmarg_generative diff --git a/typing/typedtree.mli b/typing/typedtree.mli index b1f95adf52..1dde033207 100644 --- a/typing/typedtree.mli +++ b/typing/typedtree.mli @@ -201,7 +201,7 @@ and module_expr_desc = and module_parameter = | Tmpar_generative | Tmpar_applicative of Ident.t * string loc * module_type - | Tmpar_implicit of Ident.t * string loc * module_type + | Tmpar_implicit of virtual_flag * Ident.t * string loc * module_type and module_argument = | Tmarg_generative diff --git a/typing/typedtreeIter.ml b/typing/typedtreeIter.ml index 655d651f87..cadd7f768a 100644 --- a/typing/typedtreeIter.ml +++ b/typing/typedtreeIter.ml @@ -477,7 +477,7 @@ module MakeIterator(Iter : IteratorArgument) : sig match mparam with | Tmpar_generative -> () | Tmpar_applicative(_, _, mtype) -> iter_module_type mtype - | Tmpar_implicit(_, _, mtype) -> iter_module_type mtype + | Tmpar_implicit(_, _, _, mtype) -> iter_module_type mtype and iter_module_argument marg = match marg with diff --git a/typing/typedtreeMap.ml b/typing/typedtreeMap.ml index 5cd6471f71..0b1316e50b 100644 --- a/typing/typedtreeMap.ml +++ b/typing/typedtreeMap.ml @@ -511,8 +511,8 @@ module MakeMap(Map : MapArgument) = struct | Tmpar_generative -> Tmpar_generative | Tmpar_applicative(id, name, mtype) -> Tmpar_applicative(id, name, map_module_type mtype) - | Tmpar_implicit(id, name, mtype) -> - Tmpar_implicit(id, name, map_module_type mtype) + | Tmpar_implicit(virt, id, name, mtype) -> + Tmpar_implicit(virt, id, name, map_module_type mtype) and map_module_argument marg = match marg with diff --git a/typing/typemod.ml b/typing/typemod.ml index b631ec575a..b892816fb0 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -351,13 +351,13 @@ let rec approx_modtype env smty = name.txt arg env in Mpar_applicative(id, arg), newenv - | Pmpar_implicit(name, sarg) -> + | Pmpar_implicit(virt, name, sarg) -> let arg = approx_modtype env sarg in let (id, newenv) = Env.enter_module ~arg:true ~implicit_:Implicit name.txt arg env in - Mpar_implicit(id, arg), newenv + Mpar_implicit(virt, id, arg), newenv in let res = approx_modtype newenv sres in Mty_functor(param, res) @@ -561,15 +561,15 @@ let rec transl_modtype env smty = let tparam = Tmpar_applicative(id, name, arg) in let param = Mpar_applicative(id, ty_arg) in tparam, param, newenv - | Pmpar_implicit(name, sarg) -> + | Pmpar_implicit(virt, name, sarg) -> let arg = transl_modtype env sarg in let ty_arg = arg.mty_type in let (id, newenv) = Env.enter_module ~arg:true ~implicit_:Implicit name.txt ty_arg env in - let tparam = Tmpar_implicit(id, name, arg) in - let param = Mpar_implicit(id, ty_arg) in + let tparam = Tmpar_implicit(virt, id, name, arg) in + let param = Mpar_implicit(virt, id, ty_arg) in tparam, param, newenv in Ctype.init_def(Ident.current_time()); (* PR#6513 *) @@ -1196,15 +1196,15 @@ let rec type_module ?(alias=false) sttn funct_body anchor env smod = let tparam = Tmpar_applicative(id, name, mty) in let param = Mpar_applicative(id, ty_arg) in tparam, param, newenv, true - | Pmpar_implicit(name, smty) -> + | Pmpar_implicit(virt, name, smty) -> let mty = transl_modtype env smty in let ty_arg = mty.mty_type in let id, newenv = Env.enter_module ~arg:true ~implicit_:Implicit name.txt ty_arg env in - let tparam = Tmpar_implicit(id, name, mty) in - let param = Mpar_implicit(id, ty_arg) in + let tparam = Tmpar_implicit(virt, id, name, mty) in + let param = Mpar_implicit(virt, id, ty_arg) in tparam, param, newenv, true in let body = type_module sttn funct_body None newenv sbody in @@ -1241,7 +1241,7 @@ let rec type_module ?(alias=false) sttn funct_body anchor env smod = raise(Error(sarg.pmod_loc, env, Not_included msg)) in Tmarg_applicative(arg, coercion) - | Mpar_implicit(param, mty_param), Pmarg_implicit sarg -> + | Mpar_implicit(_, param, mty_param), Pmarg_implicit sarg -> let arg = type_module true funct_body None env sarg in let coercion = try @@ -1254,11 +1254,15 @@ let rec type_module ?(alias=false) sttn funct_body anchor env smod = raise (Error (sfunct.pmod_loc, env, Argument_mismatch(mty_param, sarg))) in + let pathable = match mty_param with + | Mpar_implicit (Virtual, _, _) -> false + | _ -> pathable + in let mty_appl = match arg, mty_param with | Tmarg_generative, _ -> mty_res | (Tmarg_applicative(arg, _) | Tmarg_implicit(arg, _)), - (Mpar_applicative(param, _) | Mpar_implicit(param, _)) -> + (Mpar_applicative(param, _) | Mpar_implicit(_, param, _)) -> if pathable then Subst.modtype (Subst.add_module param diff --git a/typing/types.ml b/typing/types.ml index 4975382ceb..c1449ad1d8 100644 --- a/typing/types.ml +++ b/typing/types.ml @@ -107,8 +107,8 @@ and value_kind = | Val_prim of Primitive.description (* Primitive *) | Val_ivar of mutable_flag * string (* Instance variable (mutable ?) *) | Val_self of (Ident.t * type_expr) Meths.t ref * - (Ident.t * Asttypes.mutable_flag * - Asttypes.virtual_flag * type_expr) Vars.t ref * + (Ident.t * mutable_flag * + virtual_flag * type_expr) Vars.t ref * string * type_expr (* Self *) | Val_anc of (string * Ident.t) list * string @@ -251,8 +251,7 @@ type class_type = and class_signature = { csig_self: type_expr; - csig_vars: - (Asttypes.mutable_flag * Asttypes.virtual_flag * type_expr) Vars.t; + csig_vars: (mutable_flag * virtual_flag * type_expr) Vars.t; csig_concr: Concr.t; csig_inher: (Path.t * type_expr list) list } @@ -286,7 +285,7 @@ type module_type = and module_parameter = | Mpar_generative | Mpar_applicative of Ident.t * module_type - | Mpar_implicit of Ident.t * module_type + | Mpar_implicit of virtual_flag * Ident.t * module_type and signature = signature_item list diff --git a/typing/types.mli b/typing/types.mli index de57aa5175..edbb343d42 100644 --- a/typing/types.mli +++ b/typing/types.mli @@ -276,7 +276,7 @@ type module_type = and module_parameter = | Mpar_generative | Mpar_applicative of Ident.t * module_type - | Mpar_implicit of Ident.t * module_type + | Mpar_implicit of virtual_flag * Ident.t * module_type and signature = signature_item list From 31e2f006561376ed7c04056a551e8796a15faa6e Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 10 Feb 2016 14:17:13 +0900 Subject: [PATCH 461/494] Rework equalities in Ctype and Env --- typing/ctype.ml | 159 ++++++++++++++++++++--------------------------- typing/ctype.mli | 20 +++--- typing/env.ml | 22 +++++-- typing/env.mli | 3 + 4 files changed, 102 insertions(+), 102 deletions(-) diff --git a/typing/ctype.ml b/typing/ctype.ml index 509ccf5f2c..ccfd52c3dc 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -3270,22 +3270,69 @@ let matches env ty ty' = (* Equivalence between parameterized types *) (*********************************************) -type equality_equation = { - eq_lhs : type_expr; - eq_lhs_params : type_expr list; - eq_lhs_path : Path.t; - eq_rhs : type_expr; +type equalities = { + subst: (type_expr * type_expr) list; + (** Assuming these substitutions ... *) + equalities: (type_expr * type_expr) list; + (** these equalities should hold. *) } -let equality_equations - : (Ident.t, equality_equation list ref) Tbl.t ref +let equalities_flexible_idents + : (Ident.t, unit) Tbl.t ref = ref Tbl.empty -let with_equality_equations tbl f = - let equality_equations' = !equality_equations in - equality_equations := tbl; - try_finally f - (fun () -> equality_equations := equality_equations') +let equalities_collected + (* List of equalities with the subst under which they should be interpreted *) + : ((type_expr * type_expr) * (type_expr * type_expr) list ref) list ref + = ref [] + +let equalities_collect subst t1 t2 = + (* At least one of t1 or t2 is abstract type constructor which path contains + one identifier appearing in equalities_flexible_idents *) + equalities_collected := ((t1, t2), subst) :: !equalities_collected + +let normalize_subst subst = + if List.exists + (function {desc=Tlink _}, _ | _, {desc=Tlink _} -> true | _ -> false) + !subst + then subst := List.map (fun (t1,t2) -> repr t1, repr t2) !subst + +let equalities_normalize () = + let make subst equalities = + normalize_subst subst; + { subst = !subst; equalities } + in + let rec aux subst acc = function + | (eqn, subst') :: xs -> + if subst == subst' then + aux subst (eqn :: acc) xs + else + let eq = make subst acc in + eq :: aux subst' [eqn] xs + | [] -> [make subst acc] + in + match !equalities_collected with + | (eqn, subst) :: xs -> aux subst [eqn] xs + | [] -> [] + +let collect_equalities ~on f = + let flexible_idents' = !equalities_flexible_idents in + let collected' = !equalities_collected in + equalities_flexible_idents := on; + equalities_collected := []; + try_finally + (fun () -> + let r = f () in + r, equalities_normalize ()) + (fun () -> + equalities_flexible_idents := flexible_idents'; + equalities_collected := collected') + +let rec is_flexible = function + | Path.Pident id -> Tbl.mem id !equalities_flexible_idents + | Path.Pdot (p1, _, _) -> is_flexible p1 + | Path.Papply (p1, p2, _) -> is_flexible p1 || is_flexible p2 + let rec get_object_row ty = match repr ty with @@ -3298,12 +3345,6 @@ let expand_head_rigid env ty = let ty' = expand_head env ty in rigid_variants := old; ty' -let normalize_subst subst = - if List.exists - (function {desc=Tlink _}, _ | _, {desc=Tlink _} -> true | _ -> false) - !subst - then subst := List.map (fun (t1,t2) -> repr t1, repr t2) !subst - let rec eqtype rename type_pairs subst env t1 t2 = (*Format.fprintf Format.err_formatter "eqtype %a and %a\n\n%!" @@ -3364,7 +3405,7 @@ let rec eqtype rename type_pairs subst env t1 t2 = | (Ttuple tl1, Ttuple tl2) -> eqtype_list rename type_pairs subst env tl1 tl2 | (Tconstr (p1, tl1, _), Tconstr (p2, tl2, _)) - when Path.same p1 p2 -> + when Path.same p1 p2 && not (is_flexible p1) -> eqtype_list rename type_pairs subst env tl1 tl2 | (Tpackage (p1, n1, tl1), Tpackage (p2, n2, tl2)) -> begin try @@ -3388,31 +3429,11 @@ let rec eqtype rename type_pairs subst env t1 t2 = | (Tunivar _, Tunivar _) -> unify_univar t1' t2' !univar_pairs - | Tconstr (p1, tl1, _), Tconstr (p2, tl2, _) - when (not (Path.is_application p1) && not (Path.is_application p2)) - && Tbl.mem (Path.head p1) !equality_equations - && Tbl.mem (Path.head p2) !equality_equations -> - let (tl, tr) = - (* Base-kinded have priorities *) - if (tl1 = [] && tl2 <> []) then - (t1', t2') - else if (tl2 = [] && tl1 <> []) then - (t2', t1') - else if p1 < p2 then - (t1', t2') - else - (t2', t1') in - eqtype_modulo_equation rename type_pairs subst env tl tr - - | Tconstr (p, _, _), te - when not (Path.is_application p) - && Tbl.mem (Path.head p) !equality_equations -> - eqtype_modulo_equation rename type_pairs subst env t1' t2' - - | te, Tconstr (p, _, _) - when not (Path.is_application p) - && Tbl.mem (Path.head p) !equality_equations -> - eqtype_modulo_equation rename type_pairs subst env t2' t1' + | Tconstr (p, _, _), t when is_flexible p -> + equalities_collect subst t1' t2' + + | t, Tconstr (p, _, _) when is_flexible p -> + equalities_collect subst t1' t2' | (_, _) -> raise (Unify []) @@ -3420,48 +3441,6 @@ let rec eqtype rename type_pairs subst env t1 t2 = with Unify trace -> raise (Unify ((t1, t2)::trace)) -and eqtype_modulo_equation rename type_pairs subst env lhs rhs = - match lhs.desc with - (* Ground types *) - | Tconstr (path, [], _) -> - let equations = - try Tbl.find (Path.head path) !equality_equations - with Not_found -> assert false - in - begin try - let same { eq_lhs_path ; eq_lhs_params } = - let result = eq_lhs_path = path in - if result then assert (eq_lhs_params = []); - result - in - let ty = List.find same !equations in - (* An equation already apply to this path *) - eqtype rename type_pairs subst env ty.eq_rhs rhs - with Not_found -> - (* Not yet any equation on this path *) - let equation = { - eq_lhs = lhs; - eq_lhs_params = []; - eq_lhs_path = path; - eq_rhs = rhs; - } in - equations := equation :: !equations - end - (* Parametric types *) - | Tconstr (path, params, _) -> - let equations = - try Tbl.find (Path.head path) !equality_equations - with Not_found -> assert false - in - let equation = { - eq_lhs = lhs; - eq_lhs_params = params; - eq_lhs_path = path; - eq_rhs = rhs; - } in - equations := equation :: !equations - | _ -> assert false - and eqtype_list rename type_pairs subst env tl1 tl2 = if List.length tl1 <> List.length tl2 then raise (Unify []); @@ -3535,16 +3514,16 @@ and eqtype_row rename type_pairs subst env row1 row2 = pairs (* Two modes: with or without renaming of variables *) -let equal env rename tyl1 tyl2 = +let equal env ?(subst=[]) rename tyl1 tyl2 = try univar_pairs := []; - eqtype_list rename (TypePairs.create 11) (ref []) env tyl1 tyl2; true + eqtype_list rename (TypePairs.create 11) (ref subst) env tyl1 tyl2; true with Unify _ -> false -let equal' env rename tyl1 tyl2 = +let equal' env ?(subst=[]) rename tyl1 tyl2 = univar_pairs := []; - eqtype_list rename (TypePairs.create 11) (ref []) env tyl1 tyl2 + eqtype_list rename (TypePairs.create 11) (ref subst) env tyl1 tyl2 (* Must empty univar_pairs first *) let eqtype rename type_pairs subst env t1 t2 = diff --git a/typing/ctype.mli b/typing/ctype.mli index eaf7e1445c..e77e9cb030 100644 --- a/typing/ctype.mli +++ b/typing/ctype.mli @@ -206,20 +206,24 @@ val match_class_types: ?trace:bool -> Env.t -> class_type -> class_type -> class_match_failure list (* Check if the first class type is more general than the second. *) -type equality_equation = { - eq_lhs : type_expr; - eq_lhs_params : type_expr list; - eq_lhs_path : Path.t; - eq_rhs : type_expr; +type equalities = { + subst: (type_expr * type_expr) list; + (** Assuming these substitutions ... *) + equalities: (type_expr * type_expr) list; + (** these equalities should hold. *) } -val with_equality_equations: (Ident.t, equality_equation list ref) Tbl.t -> (unit -> 'a) -> 'a +val collect_equalities: + on:(Ident.t, unit) Tbl.t -> + (unit -> 'a) -> 'a * equalities list -val equal: Env.t -> bool -> type_expr list -> type_expr list -> bool +val equal: Env.t -> ?subst:(type_expr * type_expr) list -> + bool -> type_expr list -> type_expr list -> bool (* [equal env [x1...xn] tau [y1...yn] sigma] checks whether the parameterized types [/\x1.../\xn.tau] and [/\y1.../\yn.sigma] are equivalent. *) -val equal': Env.t -> bool -> type_expr list -> type_expr list -> unit +val equal': Env.t -> ?subst:(type_expr * type_expr) list -> + bool -> type_expr list -> type_expr list -> unit (* [equal env [x1...xn] tau [y1...yn] sigma] checks whether the parameterized types [/\x1.../\xn.tau] and [/\y1.../\yn.sigma] are equivalent. *) diff --git a/typing/env.ml b/typing/env.ml index 070d25a19f..b7baefd97a 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -193,6 +193,7 @@ type t = { summary: summary; local_constraints: bool; gadt_instances: (int * TypeSet.t ref) list; + local_expansions: (Path.t, type_expr list * type_expr * int option) Tbl.t; flags: int; implicit_flags: implicit_flag Ident.tbl; } @@ -240,6 +241,7 @@ let empty = { functor_args = Ident.empty; implicit_flags = Ident.empty; implicit_instances = []; + local_expansions = Tbl.empty; } let in_signature env = @@ -614,10 +616,22 @@ let find_type_expansion path env = | _ -> (* another way to expand is to normalize the path itself *) let path' = normalize_path None env path in - if Path.same path path' then raise Not_found else - (decl.type_params, - newgenty (Tconstr (path', decl.type_params, ref Mnil)), - may_map snd decl.type_newtype_level) + if not (Path.same path path') then + (decl.type_params, + newgenty (Tconstr (path', decl.type_params, ref Mnil)), + may_map snd decl.type_newtype_level) + (* a last way to expand is to find a local expansion *) + else + Tbl.find path' env.local_expansions + (* this let a Not_found exception escape if no expansion exists *) + +let add_local_expansion path expansion env = + (* Well-formedness check: no expansion should already exist *) + match find_type_expansion path env with + | _ -> assert false + | exception Not_found -> + {env with local_expansions = Tbl.add path expansion env.local_expansions} + (* Find the manifest type information associated to a type, i.e. the necessary information for the compiler's type-based optimisations. diff --git a/typing/env.mli b/typing/env.mli index d970c29e7e..56cb774cf4 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -63,6 +63,9 @@ val find_type_expansion_opt: (* Find the manifest type information associated to a type for the sake of the compiler's type-based optimisations. *) val find_modtype_expansion: Path.t -> t -> module_type +val add_local_expansion: + Path.t -> type_expr list * type_expr * int option -> t -> t + val is_functor_arg: Path.t -> t -> bool val implicit_level: Path.t -> t -> int From 35c15756f965f06b16518c0119adf58c1bc564da Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 10 Feb 2016 15:02:51 +0900 Subject: [PATCH 462/494] Reject equalities containing univars --- typing/ctype.ml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/typing/ctype.ml b/typing/ctype.ml index ccfd52c3dc..b00a3f3fa4 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -1889,6 +1889,13 @@ let enter_poly env univar_pairs t1 tl1 t2 tl2 f = let univar_pairs = ref [] +let univar_free t = + !univar_pairs = [] || ( + (* Univars are not allowed when collecting equalities. + The list of free univars is not cached, but this should be computed + only once per node, hence not a problem. *) + TypeSet.is_empty (compute_univars t t) + ) (*****************) (* Unification *) @@ -3429,10 +3436,12 @@ let rec eqtype rename type_pairs subst env t1 t2 = | (Tunivar _, Tunivar _) -> unify_univar t1' t2' !univar_pairs - | Tconstr (p, _, _), t when is_flexible p -> + | Tconstr (p, _, _), t when is_flexible p + && univar_free t1' && univar_free t2' -> equalities_collect subst t1' t2' - | t, Tconstr (p, _, _) when is_flexible p -> + | t, Tconstr (p, _, _) when is_flexible p + && univar_free t1' && univar_free t2' -> equalities_collect subst t1' t2' | (_, _) -> From be6f7ace1e5ba3fc29a82b88bf526fe1269f3601 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 10 Feb 2016 18:00:15 +0900 Subject: [PATCH 463/494] Ctype.equal: label rename parameter --- typing/ctype.ml | 4 ++-- typing/ctype.mli | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/typing/ctype.ml b/typing/ctype.ml index b00a3f3fa4..64947eb9b5 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -3523,14 +3523,14 @@ and eqtype_row rename type_pairs subst env row1 row2 = pairs (* Two modes: with or without renaming of variables *) -let equal env ?(subst=[]) rename tyl1 tyl2 = +let equal env ?(subst=[]) ~rename tyl1 tyl2 = try univar_pairs := []; eqtype_list rename (TypePairs.create 11) (ref subst) env tyl1 tyl2; true with Unify _ -> false -let equal' env ?(subst=[]) rename tyl1 tyl2 = +let equal' env ?(subst=[]) ~rename tyl1 tyl2 = univar_pairs := []; eqtype_list rename (TypePairs.create 11) (ref subst) env tyl1 tyl2 diff --git a/typing/ctype.mli b/typing/ctype.mli index e77e9cb030..ac083e1248 100644 --- a/typing/ctype.mli +++ b/typing/ctype.mli @@ -218,12 +218,12 @@ val collect_equalities: (unit -> 'a) -> 'a * equalities list val equal: Env.t -> ?subst:(type_expr * type_expr) list -> - bool -> type_expr list -> type_expr list -> bool + rename:bool -> type_expr list -> type_expr list -> bool (* [equal env [x1...xn] tau [y1...yn] sigma] checks whether the parameterized types [/\x1.../\xn.tau] and [/\y1.../\yn.sigma] are equivalent. *) val equal': Env.t -> ?subst:(type_expr * type_expr) list -> - bool -> type_expr list -> type_expr list -> unit + rename:bool -> type_expr list -> type_expr list -> unit (* [equal env [x1...xn] tau [y1...yn] sigma] checks whether the parameterized types [/\x1.../\xn.tau] and [/\y1.../\yn.sigma] are equivalent. *) From de6481432570d179999cd144cea927c50792df49 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 10 Feb 2016 18:00:37 +0900 Subject: [PATCH 464/494] Implicitsearch: WIP rework constraints --- typing/implicitsearch.ml | 442 +++++++++++++-------------------------- 1 file changed, 145 insertions(+), 297 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 6d26501914..802b0cfcea 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -34,15 +34,154 @@ let has_suffix ~suffix str = let l = String.length str and n = String.length suffix in l >= n && try - for i = 0 to n - 1 do - if str.[l - n + i] <> suffix.[i] then + for i = 0 to n - 1 do if str.[l - n + i] <> suffix.[i] then raise Exit done; true with Exit -> false +let push l t = l := t :: !l + let papply path arg = Path.Papply (path, arg, Asttypes.Implicit) +module Equalities = struct + type t = Ctype.equalities list + + let classify_constraint flexible subst (t1,t2) = + let directly_flexible p = + not (Path.is_application p) && + Tbl.mem (Path.head p) flexible + in + let assocl x = + let rec aux = function + | (x', y) :: _ when x == x' -> y + | _ :: l -> aux l + | [] -> raise Not_found + in + aux subst + and assocr y = + let rec aux = function + | (x, y') :: _ when y == y' -> x + | _ :: l -> aux l + | [] -> raise Not_found + in + aux subst + in + let defining assoc lhs rhs = + match lhs.desc with + | Tconstr (p, tl, _) when directly_flexible p -> + let tl = + try List.map assoc tl + with Not_found -> + (* All type variables should have been substituted by the time + we reach constraints refinement *) + assert false + in + (* Check uniqueness *) + let rec uniq = function + | [] -> true + | x :: xs -> not (List.memq x xs) && uniq xs + in + (* FIXME: No type variable should occur in rhs but not in tl *) + if uniq tl then `Expansion (p, (tl, rhs, None)) else `None + | _ -> `None + in + let t1 = Ctype.repr t1 and t2 = Ctype.repr t2 in + let lhs = defining assocl t1 t2 and rhs = defining assocr t2 t1 in + match lhs, rhs with + | `Expansion e, `None | `None, `Expansion e -> + `Definition e + | `Expansion e1, `Expansion e2 -> + (* Check for trivial equalities *) + let (p, (tl, rhs, _)) = e1 in + begin match rhs.desc with + | Tconstr (p', tl', _) -> + if Path.same p p' && List.for_all2 (==) tl tl' then + (* This can happen because Ctype.eqtype don't check equality + on parameters of a flexible path, equation is just collected + immediately. *) + `Trivial + else + `Equivalence (e1, e2) + | _ -> + (* cannot happen, equivalence are always between constr + representant *) + assert false + end + | _ -> `Equality + + let classify_constraints flexible eqs = + let classify_collected (def,equiv,equal) {Ctype.subst ; equalities} = + let rec aux def equiv equalities = function + | [] -> (def, equiv, equalities) + | tt :: tts -> + match classify_constraint flexible subst tt with + | `Definition d -> aux (d :: def) equiv equalities tts + | `Equivalence eq -> aux def (eq :: equiv) equalities tts + | `Equality -> aux def equiv (tt :: equalities) tts + | `Trivial -> aux def equiv equalities tts + in + let def, equiv, equalities = aux def equiv [] equalities in + if equalities = [] then (def, equiv, equal) + else (def, equiv, {Ctype. subst; equalities} :: equal) + in + List.fold_left classify_collected ([], [], []) eqs + + let refine flexible env eqs = + (* Refine equalities, reinforce environnement, produce termination + equations *) + let (), eqs = + Ctype.collect_equalities ~on:flexible @@ fun () -> + let refine_equalities {Ctype. subst; equalities} = + let xs, ys = List.split equalities in + Ctype.equal' env ~subst ~rename:true xs ys + in + List.iter refine_equalities eqs + in + let definitions, equivalences, equalities = + classify_constraints flexible eqs in + let termination = ref [] in + let add_definition env (p, (tl, t, _ as def)) = + match Env.find_type_expansion p env with + | (tl', t', _) -> + Ctype.equal' env ~rename:true (t :: tl) (t' :: tl'); + push termination (p, tl', t'); + env + | exception Not_found -> + push termination (p, tl, t); + Env.add_local_expansion p def env + + and add_equivalence env ((p1,def1), (p2,def2)) = + let (tl1, t1, _) = def1 and (tl2, t2, _) = def2 in + match Env.find_type_expansion p1 env with + | exception Not_found -> + begin match Env.find_type_expansion p2 env with + | exception Not_found -> + if Ident.binding_time (Path.head p1) <= + Ident.binding_time (Path.head p2) + then Env.add_local_expansion p1 def1 env + else Env.add_local_expansion p2 def2 env + | (tl2', t2', _) -> + Ctype.equal' env ~rename:true (t2 :: tl2) (t2' :: tl2'); + push termination (p1, tl1, t1); + Env.add_local_expansion p1 def1 env + end + | (tl1', t1', _) -> + Ctype.equal' env ~rename:true (t1 :: tl1) (t1' :: tl1'); + begin match Env.find_type_expansion p2 env with + | exception Not_found -> + push termination (p2, tl2, t2); + Env.add_local_expansion p2 def2 env + | (tl2', t2', _) -> + Ctype.equal' env ~rename:true (t2 :: tl2) (t2' :: tl2'); + env + end + in + let env = List.fold_left add_definition env definitions in + let env = List.fold_left add_equivalence env equivalences in + !termination, equalities, env +end + (** [goal] is the point from which a search starts *) type goal = { (* The module type we try to find an instance for *) @@ -73,265 +212,6 @@ type goal = { goal_termination_id : Ident.t; } -(** Constraints are a list of equations of the form [path] = [type_expr]. - The [Constraints] module apply those equations to a module type by - setting [type_expr] as a manifest for type at [path]. - - [Constraints.apply_abstract] expects all pointed types to be abstract (no - manifest), and fail if this is not the case. - [Constraints.apply] will try to unify those types. -*) -module Constraints = struct - - (* Apply constraints to a module type. - - 1. Traverse the module type to substitute type declarations with - constraints and accumulate types to unify. - - When constraining a type declaration, add the constraint as manifest. - If the type declaration already had a manifest, keep the original - manifest in a separate list to unify it in a later pass. - - During traversal, we register module and submodule types in environment - because find_modtype_expansion might need them. - - 2. Do a second pass, rebuilding the environment and unifying constraints. - - Environment is rebuilt with the types obtained after substitution. - For each type in the unify list, instantiate it in its local - environment and unify it with the constrained type. - *) - let name_match name (qname,_) = name = qname - - (* A tree of constraints, sub levels correspond to constraints applied to sub - modules *) - type ('n,'cstr) t = - | Local of 'cstr - | Sub of ('n,'cstr) ts - and ('n,'cstr) ts = ('n * ('n,'cstr) t) list - - let local_constraint = function - | Local cstr -> cstr - | Sub _ -> assert false - - let sub_constraints = function - | Local _ -> assert false - | Sub cstrs -> cstrs - - let rec add_constraint env acc = function - | [], _ -> - assert false - | [x], c -> - begin match (try Some (list_extract (name_match x) acc) - with Not_found -> None) - with - | None -> (x, Local c) :: acc - | Some ((_x, c'), _) -> - unify env (local_constraint c') c; - acc - end - | (x :: xs), c -> - let (x, cstr), acc = - try list_extract (name_match x) acc - with Not_found -> (x, Sub []), acc - in - let cstr = sub_constraints cstr in - (x, Sub (add_constraint env cstr (xs, c))) :: acc - - let split_constraints env l = - List.fold_left (add_constraint env) [] l - - (* Register possibly recursive definitions in environment - (again, we need a populated environment because find_modtype_expansion - might need to lookup local definitions ) *) - let register_items env - : Types.signature_item list -> Env.t - = function - | Sig_type (id, ty, (Trec_not | Trec_first)) :: items -> - let rec aux env id ty items = - let env = Env.add_type ~check:false id ty env in - match items with - | Sig_type (id, ty, Trec_next) :: items -> - aux env id ty items - | _ -> env - in - aux env id ty items - | Sig_module (id, decl, (Trec_not | Trec_first)) :: items -> - let rec aux env id decl items = - let env = Env.add_module_declaration id decl env in - match items with - | Sig_module (id, decl, Trec_next) :: items -> - aux env id decl items - | _ -> env - in - aux env id decl items - | Sig_modtype (id,mtd) :: _ -> - Env.add_modtype id mtd env - | _ -> env - - let rec prepare_mty - : Env.t -> (string, type_expr) ts -> Types.module_type -> - (Ident.t, type_expr) ts * Types.module_type - = fun env cstrs mty -> - if cstrs = [] then [], mty else - match mty with - | Mty_functor _ | Mty_alias _ -> assert false - | Mty_ident p -> - begin try - let mty = Env.find_modtype_expansion p env in - prepare_mty env cstrs mty - with Not_found -> - assert false - end - | Mty_signature sg -> - let to_unify, sg' = prepare_sig env cstrs sg in - to_unify, Mty_signature sg' - - and prepare_sig_item env cstrs field = - match field with - | Sig_value _ | Sig_class _ | Sig_modtype _ - | Sig_class_type _ | Sig_typext _ -> - [], cstrs, field - | Sig_type (id,decl,recst) -> - let name = Ident.name id in - begin try - let (_, cstr), cstrs = list_extract (name_match name) cstrs in - let ty = local_constraint cstr in - let to_unify = - match decl.type_manifest with - | None -> [] - | Some ty' -> [(id, Local ty')] - in - to_unify, cstrs, - Sig_type (id,{decl with type_manifest = Some ty}, recst) - with Not_found -> - [], cstrs, field - end - | Sig_module (id,decl,recst) -> - let name = Ident.name id in - begin try - let (_, subs), cstrs = list_extract (name_match name) cstrs in - let subs = sub_constraints subs in - let subs, mty = prepare_mty env subs decl.md_type in - let to_unify = match subs with - | [] -> [] - | subs -> [(id, Sub subs)] - in - to_unify, cstrs, - Sig_module (id,{decl with md_type = mty}, recst) - with Not_found -> - [], cstrs, field - end - - and prepare_sig' env to_unify fields cstrs items = - let env = register_items env items in - match items, cstrs with - | items, [] -> - List.rev to_unify, - List.rev_append fields items - | [], cstrs -> - let txt = String.concat ", " (List.map fst cstrs) in - failwith ("constraints " ^ txt ^ " failed to apply") - | item :: items, cstrs -> - let to_unify', cstrs, item' = prepare_sig_item env cstrs item in - prepare_sig' env (to_unify' @ to_unify) (item' :: fields) cstrs items - - and prepare_sig - : Env.t -> (string, type_expr) ts -> Types.signature -> - (Ident.t, type_expr) ts * Types.signature - = fun env cstrs sg -> - if cstrs = [] then - [], sg - else - prepare_sig' env [] [] cstrs sg - - let rec constraint_mty env to_unify mty = - if to_unify <> [] then - match mty with - | Mty_functor _ | Mty_alias _ | Mty_ident _ -> assert false - | Mty_signature sg -> - constraint_sig env to_unify sg - - and constraint_sig_item env cstrs field = - match field, cstrs with - | Sig_type (id,decl,recst), - ((id', Local ty') :: cstrs) when Ident.same id id' -> - let ty = match decl.type_manifest with - | None -> assert false (* filled in previous pass *) - | Some ty -> ty - in - let ty' = instance env ty' in - unify env ty ty'; - cstrs - - | Sig_module (id,decl,recst), - ((id', Sub subs) :: cstrs) when Ident.same id id' -> - constraint_mty env subs decl.md_type; - cstrs - - | _ -> cstrs - - and constraint_sig env cstrs items = - let env = register_items env items in - match items, cstrs with - | _, [] -> () - (* generated constraints should all have been satisfied *) - | [], _ -> assert false - | item :: items, cstrs -> - let cstrs = constraint_sig_item env cstrs item in - constraint_sig env cstrs items - - let apply env mty cstrs = - let cstrs = split_constraints env cstrs in - let to_unify, mty = prepare_mty env cstrs mty in - constraint_mty env to_unify mty; - mty - - let apply_abstract env mty cstrs = - let cstrs = split_constraints env cstrs in - let to_unify, mty = prepare_mty env cstrs mty in - assert (to_unify = []); - mty - - let flatten ~root cstrs = - let flatten_cstr (n,t) = - let id', dots = Path.flatten n in - assert (Ident.same root id'); - assert (dots <> []); - List.map fst dots, t - in - List.map flatten_cstr cstrs - - (* Apply a list of equations to a goal. - Types referred to by paths *must* be abstract. *) - let goal - : Env.t -> goal -> equality_equation list -> goal - = fun env goal eqns -> - (* [env] is needed only to expand module type names *) - let extract_constraint acc eqn = - let id, path = Path.flatten eqn.eq_lhs_path in - if not (Ident.same id goal.goal_var) then - acc - else - let path = List.map fst path in - let rec is_row = function - | [t] -> has_suffix ~suffix:"#row" t - | _ :: xs -> is_row xs - | [] -> assert false - in - let cstrs, hkt = acc in - if eqn.eq_lhs_params = [] && not (is_row path) then - ((path, eqn.eq_rhs) :: cstrs), hkt - else - cstrs, ((eqn.eq_lhs, eqn.eq_rhs) :: hkt) in - let cstrs, hkt = List.fold_left extract_constraint ([],[]) eqns in - let mty = apply_abstract env goal.goal_type cstrs in - let goal = {goal with goal_type = mty; - goal_constraints = hkt @ goal.goal_constraints} in - goal - -end - (* Various functions to preprocess pending implicit and implicit declarations when searching *) @@ -360,20 +240,6 @@ let remove_type_variables () = let it = {type_iterators with it_type_expr} in variables, it -(*let unify_equations env variables equations = - List.iter (fun (ty, id) -> - List.iter - (function - | Path.Pident id' as path, ty' when Ident.same id id' -> - printf "unifying %a with %a (= %a)\n%!" - Printtyp.type_expr ty - Printtyp.type_expr ty' - Printtyp.path path; - unify env ty ty' - | _ -> ()) - equations - ) variables*) - let goal_of_pending inst = let env = inst.implicit_env in let ident = inst.implicit_id in @@ -384,41 +250,23 @@ let goal_of_pending inst = | None -> assert false | Some mty -> mty in - let basekinded (ty,_tyvar) = match (repr ty).desc with - | Tconstr (_, [], _) -> true - | Tconstr (_, (_ :: _), _) -> false - | _ -> assert false - in - let basepath (ty,tyvar) = match (repr ty).desc with - | Tconstr (path, [], _) -> path, tyvar - | _ -> assert false - in - let bkt, hkt = List.partition basekinded inst.implicit_constraints in - let bkt = List.map basepath bkt in - let cstrs = - (* Constraints from package type *) - (List.map2 (fun n t -> Longident.flatten n, t) nl tl) - (* Constraints from implicit instance *) @ - (Constraints.flatten ~root:ident bkt) - in - let mty = Constraints.apply env mty cstrs in let variables, it = remove_type_variables () in it.it_module_type it mty; List.iter (fun (ty,tyvar) -> it.it_type_expr it ty; it.it_type_expr it tyvar) - hkt; + inst.implicit_constraints; unmark_iterators.it_module_type unmark_iterators mty; List.iter (fun (ty,tyvar) -> unmark_type ty; unmark_type tyvar) - hkt; + inst.implicit_constraints; let id = inst.implicit_id in !variables, {goal_type = mty; goal_var = id; goal_termination_id = id; - goal_constraints = hkt} + goal_constraints = inst.implicit_constraints} (** Termination checking **) module Termination : sig @@ -439,7 +287,7 @@ module Termination : sig (* [check env t state] ensures that termination criterion for [t] is satisfied in [state] and returns the stronger state. Otherwise, [Terminate] is raised *) - type eqns = (string list * (type_expr list * type_expr) list) list + type eqns = (string list * (type_expr list * type_expr)) list exception Terminate of (Ident.t * eqns * eqns) val explain : bool -> Format.formatter -> Ident.t * eqns * eqns -> unit From 2ebeeb34e613bc250a08a67abd8280ba73a4b155 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 17 Feb 2016 14:28:00 +0900 Subject: [PATCH 465/494] Broken implementation of termination --- typing/ctype.ml | 11 +- typing/implicitsearch.ml | 432 ++++++++++++++++++--------------------- 2 files changed, 200 insertions(+), 243 deletions(-) diff --git a/typing/ctype.ml b/typing/ctype.ml index 64947eb9b5..beda662684 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -3523,17 +3523,16 @@ and eqtype_row rename type_pairs subst env row1 row2 = pairs (* Two modes: with or without renaming of variables *) +let equal' env ?(subst=[]) ~rename tyl1 tyl2 = + univar_pairs := []; + eqtype_list rename (TypePairs.create 11) (ref subst) env tyl1 tyl2 + let equal env ?(subst=[]) ~rename tyl1 tyl2 = try - univar_pairs := []; - eqtype_list rename (TypePairs.create 11) (ref subst) env tyl1 tyl2; true + equal' env ?subst ~rename tyl1 tyl2; true with Unify _ -> false -let equal' env ?(subst=[]) ~rename tyl1 tyl2 = - univar_pairs := []; - eqtype_list rename (TypePairs.create 11) (ref subst) env tyl1 tyl2 - (* Must empty univar_pairs first *) let eqtype rename type_pairs subst env t1 t2 = univar_pairs := []; diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 802b0cfcea..2977f1e7ee 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -127,9 +127,8 @@ module Equalities = struct in List.fold_left classify_collected ([], [], []) eqs - let refine flexible env eqs = - (* Refine equalities, reinforce environnement, produce termination - equations *) + let rec refine flexible env acc eqs = + (* Refine equalities, reinforce environnement *) let (), eqs = Ctype.collect_equalities ~on:flexible @@ fun () -> let refine_equalities {Ctype. subst; equalities} = @@ -140,15 +139,12 @@ module Equalities = struct in let definitions, equivalences, equalities = classify_constraints flexible eqs in - let termination = ref [] in let add_definition env (p, (tl, t, _ as def)) = match Env.find_type_expansion p env with | (tl', t', _) -> Ctype.equal' env ~rename:true (t :: tl) (t' :: tl'); - push termination (p, tl', t'); env | exception Not_found -> - push termination (p, tl, t); Env.add_local_expansion p def env and add_equivalence env ((p1,def1), (p2,def2)) = @@ -163,23 +159,32 @@ module Equalities = struct else Env.add_local_expansion p2 def2 env | (tl2', t2', _) -> Ctype.equal' env ~rename:true (t2 :: tl2) (t2' :: tl2'); - push termination (p1, tl1, t1); Env.add_local_expansion p1 def1 env end | (tl1', t1', _) -> Ctype.equal' env ~rename:true (t1 :: tl1) (t1' :: tl1'); begin match Env.find_type_expansion p2 env with | exception Not_found -> - push termination (p2, tl2, t2); Env.add_local_expansion p2 def2 env | (tl2', t2', _) -> Ctype.equal' env ~rename:true (t2 :: tl2) (t2' :: tl2'); env end in - let env = List.fold_left add_definition env definitions in - let env = List.fold_left add_equivalence env equivalences in - !termination, equalities, env + let acc = equalities @ acc in + (* Equal definitions will introduce new equalities. + Repeat to mimic unification. *) + match + Ctype.collect_equalities ~on:flexible + (fun () -> + let env = List.fold_left add_definition env definitions in + let env = List.fold_left add_equivalence env equivalences in + env) + with + | env, [] -> acc, env + | env, eqs' -> refine flexible env acc eqs' + + let refine flexible env eqs = refine flexible env [] eqs end (** [goal] is the point from which a search starts *) @@ -212,6 +217,171 @@ type goal = { goal_termination_id : Ident.t; } +module Termination : sig + (** The termination checker tracks all arguments to implicit functors. + For an environment env and a flexible argument M, it will decides + whether enough is known about M to allow searching for an instance. *) + type t + + val empty : t + + val add_goal : env -> goal -> t -> t + + val can_enter : env -> goal -> t -> bool + + val explain : env -> goal -> t -> string + +end = struct + + type element = { + goal: goal; + decreasing: Path.t list; + } + + type chain = element list + + type t = (Ident.t, chain) Tbl.t + + (* Checking that an individial type is smaller than another one. + The exception never escapes. *) + exception Type_is_smaller + let smaller ?subst env t1 t2 : [`Smaller | `Equal | `Different] = + let rec check_ty t = + if equal ?subst env true [t1] [t] then + raise Type_is_smaller; + iter_type_expr check_ty t + in + try if equal ?subst env true [t1] [t2] + then `Equal + else (iter_type_expr check_ty t2; `Different) + with Type_is_smaller -> + `Smaller + + let smaller env p1 p2 : [`Smaller | `Equal | `Different] = + match Env.find_type_expansion p2 env with + | exception Not_found -> + begin match Env.find_type_expansion p1 env with + | exception Not_found -> `Equal + | _ -> `Different + end + | (tyl2, ty2, _) -> + match Env.find_type_expansion p1 env with + | exception Not_found -> `Smaller + | (tyl1, ty1, _) -> + let subst = List.combine tyl1 tyl2 in + match smaller ?subst env t1 t2 with + | (`Equal | `Different) as r -> r + | `Smaller -> + match smaller ?subst env t2 t1 with + | `Smaller -> `Different (* t1 < t2 && t2 < t1 *) + | _ -> `Smaller + + let initial env goal = + let rec collect_mty acc path = function + | Mty_signature sg -> collect_sig acc path sg + | Mty_functor _ -> () + | Mty_alias p -> + collect_mty acc path (Env.find_module p env).md_type + | Mty_ident p -> + begin match (Env.find_modtype p env).mtd_type with + | None -> () + | Some mty -> collect_mty acc path mty + end + + and collect_sig acc path = function + | [] -> acc + | x :: xs -> + let acc = match x with + | Sig_type (id, {type_kind = Type_abstract; type_manifest = None}, _) -> + Path.Pdot (path, Ident.name id, 0) :: acc + | Sig_module (id, md, _) -> + collect_mty acc (Path.Pdot (path, Ident.name id, 0)) md.md_type + | _ -> acc + in + collect_sig acc path xs + in + let types = collect_mty [] (Path.Pident goal.goal_var) goal.goal_type in + { goal; decreasing = types } + + let rec rewrite_path id = function + | Pident _ -> Pident id + | Papply _ -> assert false + | Pdot (p, s, x) -> Pdot (rewrite_path id p, s, x) + + let refine env element goal = + let decreased p1 = + let p2 = rewrite_path goal.goal_var p1 in + match smaller env p1 p2 with + | `Smaller -> Some p2 + | _ -> None + in + {goal; decreasing = list_filtermap decreased element.decreasing} + + let add_goal env goal t = + let chain = + match Tbl.find goal.goal_termination_id t with + | exception Not_found -> [initial env goal] + | x :: xs -> refine env x goal :: xs + in + Tbl.add goal.goal_termination_id chain t + + let rec retry_chain env = function + | [] -> assert false + | [x] -> x + | x :: xs -> + let x' = retry_chain env xs in + refine env x' x.goal + + let can_enter env goal t = + match Tbl.find goal.goal_termination_id t with + | (x :: _) as xs when (x.goal == goal) -> + x.decreasing = [] || (retry_chain env xs).decreasing = [] + | exception Not_found -> assert false + | _ -> assert false + + let explain env goal t = + let xs = + try Tbl.find goal.goal_termination_id t + with Not_found -> assert false + in + let rec drop = function + | x :: xs when x.goal != goal -> drop xs + | xs -> xs + in + match drop xs with + | [x] -> "Termination succeeds: no nested call" + | (x :: x' :: _) as xs -> + let decreasing = + if x.decreasing = [] then + (retry_chain env xs).decreasing + else + x.decreasing + in + let print x = Format.fprintf Format.str_formatter x in + begin match decreasing with + | [] -> + print + "Cannot ensure termination: %a is not structurally decreasing, " + Printtyp.path (List.hd x'.decreasing); + begin match Env.find_type_expansion path env with + | exception Not_found -> + print "nested occurrence is not constrained." + | (_, ty2, _) -> + let _, ty1, _ = Env.find_type_expansion path env in + print "%a is not smaller than %a." + Printtyp.type_expr ty2 + Printtyp.type_expr ty1 + end + | x :: xs -> + print + "Termination succeeds: %a is structurally decreasing" + Printtyp.path x + end; + Format.flush_str_formatter () + | _ -> assert false + +end + (* Various functions to preprocess pending implicit and implicit declarations when searching *) @@ -268,216 +438,6 @@ let goal_of_pending inst = goal_termination_id = id; goal_constraints = inst.implicit_constraints} -(** Termination checking **) -module Termination : sig - - (* A termination criterion is a set of constraints applying on a - goal_termination_id. - It's satisfied in a search state iff its constraints are stronger than - those found the search state. *) - type t - type state - val initial : state - - (* From a goal and an initial list of constraints, - build a termination criterion *) - val normalize_equations - : goal -> equality_equation list -> t - - (* [check env t state] ensures that termination criterion for [t] is - satisfied in [state] and returns the stronger state. - Otherwise, [Terminate] is raised *) - type eqns = (string list * (type_expr list * type_expr)) list - exception Terminate of (Ident.t * eqns * eqns) - val explain : bool -> Format.formatter -> Ident.t * eqns * eqns -> unit - - val check : Env.t -> t -> state -> state - - val check_goal : Env.t -> goal -> equality_equation list -> state -> state -end = struct - - (* Set of equations used for computing termination criterion. - The list of equations is sorted by path, and each path is unique. *) - type eqns = (string list * (type_expr list * type_expr) list) list - - let rec merge_eqns = function - | (path1, args) :: (path2, args') :: tail when path1 = path2 -> - merge_eqns ((path1, args' @ args) :: tail) - | head :: tail -> - head :: merge_eqns tail - | [] -> [] - - let rec wellformed_eqns = function - | (path1, args) :: ((path2, _) :: _ as tail) -> - (path1 < path2) && - (match args with - (* One base-kinded *) - | [[], _] -> true - (* Or one-or-more higher-kinded, same arity *) - | (((_ :: _), _ as first) :: rest) -> - let arity (params,_path) = List.length params in - let a0 = arity first in - assert (List.for_all (fun t -> arity t = a0) rest); - true - | _ -> false) && - wellformed_eqns tail - | _ -> true - - (* Checking that an individial type is smaller than another one. - The exception never escapes. *) - exception Type_is_smaller - let smaller env t1 t2 : [`Smaller | `Equal | `Different] = - let rec check_ty t = - if equal env true [t1] [t] then - raise Type_is_smaller; - iter_type_expr check_ty t - in - try if equal env true [t1] [t2] - then `Equal - else (iter_type_expr check_ty t2; `Different) - with Type_is_smaller -> - `Smaller - - let smaller env t1 t2 : [`Smaller | `Equal | `Different] = - match smaller env t1 t2 with - | (`Equal | `Different) as r -> r - | `Smaller -> - match smaller env t2 t1 with - | `Smaller -> `Different (* t1 < t2 && t2 < t1 *) - | _ -> `Smaller - - let smallers env t1s t2s : [`Smaller | `Equal | `Different] = - try - let rec aux t2s acc = function - | [] -> acc - | (params, t1) :: t1s -> - let (params', t2), t2s = list_extract - (fun (params', t2) -> equal env true params params') - t2s in - match smaller env t1 t2 with - | `Different -> raise Not_found - | `Equal -> aux t2s acc t1s - | `Smaller -> aux t2s `Smaller t1s - in - aux t2s `Equal t1s - with Not_found -> - `Different - - (* Check that a set of equations is stronger than another one. - [stronger env neqns oeqns] returns true iff - - all equations from oeqns must be smaller or equal in neqns, AND - - one equation must be strictly smaller or neqns must contain more - equations. *) - let rec stronger env acc (neqns : eqns) (oeqns : eqns) = - let is_base_kinded = function - | _, [[], _] -> true - | _, _ -> false in - match neqns, oeqns with - (* Equation on same path, check inclusion of type *) - (* Base-kinded *) - | (n, [[], nt]) :: neqns, (o, [[], ot]) :: oeqns when n = o -> - begin match smaller env nt ot with - | `Equal -> stronger env acc neqns oeqns - | `Smaller -> stronger env true neqns oeqns - | `Different -> false - end - (* Higher-kinded *) - | (n, nt) :: neqns, (o, ot) :: oeqns when n = o -> - begin match smallers env nt ot with - | `Equal -> stronger env acc neqns oeqns - | `Smaller -> stronger env true neqns oeqns - | `Different -> false - end - (* Same number of equations, at least one must have been stronger *) - | [], [] -> acc - (* More equations, stronger if base-kinded *) - | _, [] -> List.exists is_base_kinded neqns - | (n, _ as neqn) :: neqns, (o, _) :: _ when n < o && is_base_kinded neqn -> - stronger env true neqns oeqns - (* Less equations, always weaker *) - | [], _ -> false - | (n, _) :: neqns, (o, _) :: _ -> - assert (n > o); - false - - let stronger env neqns oeqns = stronger env false neqns oeqns - - (* Checking for termination starts from a target uid and a list of equations. - A state is table mapping uids to the strongest set of equations seen so - far. *) - type t = Ident.t * eqns - type state = eqns Ident.tbl - let initial = Ident.empty - - let normalize_equations - (* Goal *) - (goal : goal) - (* All path must refer to some goal_var *) - (eqns : equality_equation list) - (* List of equations applying to goal *) - : t = - (* Add equations to goal_var *) - let eqns = list_filtermap - (fun eqn -> - let id, path = Path.flatten eqn.eq_lhs_path in - if not (Ident.same goal.goal_var id) then - None - else - let path = List.map fst path in - Some (path, [eqn.eq_lhs_params, eqn.eq_rhs])) - eqns in - let eqns = List.sort (fun (a,_) (b,_) -> compare a b) eqns in - let eqns = merge_eqns eqns in - assert (wellformed_eqns eqns); - (goal.goal_termination_id, eqns) - - let explain success ppf (id,eqns,eqns') = - let print_ppath ppf (path,params) = match params with - | [] -> Format.pp_print_string ppf path - | [p] -> Format.fprintf ppf "%a %s" Printtyp.type_expr p path - | (p::ps) -> Format.fprintf ppf "(%a%a) %s" - Printtyp.type_expr p - (fun ppf -> List.iter (fun ty -> - Format.fprintf ppf ", %a" Printtyp.type_expr ty)) - ps - path in - let print_eqn ppf path (params,ty) = - Format.fprintf ppf "\t%a = %a\n" - print_ppath (path,params) - Printtyp.type_expr ty in - let print_eqns_at_path ppf (path,eqns) = - let path = String.concat "." path in - List.iter (print_eqn ppf path) eqns in - let print_eqns ppf peqns = List.iter (print_eqns_at_path ppf) peqns in - if eqns' = [] && success then - Format.fprintf ppf - "Termination of %a: introducing equation set [\n%a]\n%!" - Printtyp.ident id - print_eqns eqns - else - Format.fprintf ppf - "Termination of %a: equation set [\n%a] is %sstronger than [\n%a]\n%!" - Printtyp.ident id - print_eqns eqns - (if success then "" else "not ") - print_eqns eqns' - - exception Terminate of (Ident.t * eqns * eqns) - let check env (uid, eqns) stack = - begin try - let eqns' = Ident.find_same uid stack in - if not (stronger env eqns eqns') then raise (Terminate (uid, eqns, eqns')); - explain true printf_output (uid,eqns,eqns') - with Not_found -> - explain true printf_output (uid,eqns,[]) - end; - Ident.add uid eqns stack - - let check_goal env goal eqns stack = - let t = normalize_equations goal eqns in - check env t stack -end - let report_error msg exn = try Location.report_exception printf_output exn @@ -498,7 +458,7 @@ module Search : sig type result val get : result -> Path.t - val equations : result -> equality_equation list + val equations : result -> Ctype.equalities list val all_candidates : query -> candidate list @@ -519,7 +479,6 @@ end = struct type 'a state = { payload: 'a; - termination: Termination.state; goal: goal; env: Env.t; @@ -533,9 +492,9 @@ end = struct [eq_var] is referenced in [eq_table], so new equations valid in this branch of the search will be added to [eq_var]. *) - eq_initial: equality_equation list; - eq_var: equality_equation list ref; - eq_table: (Ident.t, equality_equation list ref) Tbl.t; + eq_initial: Ctype.equalities list; + eq_var: Ctype.equalities list ref; + eq_table: (Ident.t, Ctype.equalities list ref) Tbl.t; } type query = @@ -574,7 +533,6 @@ end = struct in { payload = (); - termination = Termination.initial; goal = goal; env = env; @@ -729,9 +687,9 @@ end = struct let debug_path = state.debug_path in let partial = {state with payload = (path, sub_goals)} in let goal = Constraints.goal state.env goal eq_final in - let termination = - Termination.check_goal state.env goal eq_final state.termination in - let state = {state with goal; termination; debug_path = path :: debug_path} in + (*let termination = + Termination.check_goal state.env goal eq_final state.termination in*) + let state = {state with goal; (*termination;*) debug_path = path :: debug_path} in `Step (partial, state) let rec step state = function @@ -740,9 +698,9 @@ end = struct try step0 state candidate, candidates with - | Termination.Terminate eqns as exn -> + (*| Termination.Terminate eqns as exn -> printf "%a\n%!" (Termination.explain false) eqns; - raise exn + raise exn*) | Invalid_candidate -> step state candidates | exn -> report_error "Exception while testing candidate: " exn; @@ -767,11 +725,11 @@ end = struct rebinding implicit *) let md = {md with md_implicit = Asttypes.Nonimplicit} in let goal = Constraints.goal arg.env goal eq_initial in - let termination = - Termination.check_goal arg.env goal eq_initial partial.termination in + (*let termination = + Termination.check_goal arg.env goal eq_initial partial.termination in*) let env = Env.add_module_declaration goal.goal_var md arg.env in let debug_path = path :: partial.debug_path in - let arg = {arg with payload = (); goal; debug_path; termination; env} in + let arg = {arg with payload = (); goal; debug_path; (*termination;*) env} in `Step (partial, arg) end @@ -896,9 +854,9 @@ let find_pending_instance inst = Link.to_path inst path; true with - | Termination.Terminate eqns -> + (*| Termination.Terminate eqns -> printf "%a\n%!" (Termination.explain false) eqns; - raise Typecore.(Error (loc, env, Termination_fail inst)) + raise Typecore.(Error (loc, env, Termination_fail inst))*) | Not_found -> false From e20701b2bfcc5681f5cfdd9fe13e2cbd8dc26d7e Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 17 Feb 2016 14:41:16 +0900 Subject: [PATCH 466/494] defining constraints: expand_head in parameters, e.g 'a id t = ... where 'a id = 'a is discovered --- typing/implicitsearch.ml | 53 +++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 31 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 2977f1e7ee..1c782b134c 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -47,7 +47,7 @@ let papply path arg = Path.Papply (path, arg, Asttypes.Implicit) module Equalities = struct type t = Ctype.equalities list - let classify_constraint flexible subst (t1,t2) = + let classify_constraint flexible env subst (t1,t2) = let directly_flexible p = not (Path.is_application p) && Tbl.mem (Path.head p) flexible @@ -70,20 +70,17 @@ module Equalities = struct let defining assoc lhs rhs = match lhs.desc with | Tconstr (p, tl, _) when directly_flexible p -> - let tl = - try List.map assoc tl - with Not_found -> - (* All type variables should have been substituted by the time - we reach constraints refinement *) - assert false - in - (* Check uniqueness *) - let rec uniq = function - | [] -> true - | x :: xs -> not (List.memq x xs) && uniq xs - in - (* FIXME: No type variable should occur in rhs but not in tl *) - if uniq tl then `Expansion (p, (tl, rhs, None)) else `None + let tl = List.map (Ctype.expand_head env) tl in + begin match List.map assoc tl with + | exception Not_found -> `None (* Not a type variable *) + | tl' -> + (* Check uniqueness *) + let rec uniq = function + | [] -> true + | x :: xs -> not (List.memq x xs) && uniq xs + in + (* FIXME: No type variable should occur in rhs but not in tl *) + if uniq tl' then `Expansion (p, (tl', tl, rhs, None)) else `None | _ -> `None in let t1 = Ctype.repr t1 and t2 = Ctype.repr t2 in @@ -93,29 +90,23 @@ module Equalities = struct `Definition e | `Expansion e1, `Expansion e2 -> (* Check for trivial equalities *) - let (p, (tl, rhs, _)) = e1 in - begin match rhs.desc with - | Tconstr (p', tl', _) -> - if Path.same p p' && List.for_all2 (==) tl tl' then - (* This can happen because Ctype.eqtype don't check equality + let (p, (tl1, _, rhs, _)) = e1 in + let (_, (_, tl2, _, _)) = e2 in + if Path.same p p' && List.for_all2 (==) tl1 tl2 then + (* This can happen because Ctype.eqtype don't check equality on parameters of a flexible path, equation is just collected immediately. *) - `Trivial - else - `Equivalence (e1, e2) - | _ -> - (* cannot happen, equivalence are always between constr - representant *) - assert false - end + `Trivial + else + `Equivalence (e1, e2) | _ -> `Equality - let classify_constraints flexible eqs = + let classify_constraints flexible env eqs = let classify_collected (def,equiv,equal) {Ctype.subst ; equalities} = let rec aux def equiv equalities = function | [] -> (def, equiv, equalities) | tt :: tts -> - match classify_constraint flexible subst tt with + match classify_constraint flexible env subst tt with | `Definition d -> aux (d :: def) equiv equalities tts | `Equivalence eq -> aux def (eq :: equiv) equalities tts | `Equality -> aux def equiv (tt :: equalities) tts @@ -138,7 +129,7 @@ module Equalities = struct List.iter refine_equalities eqs in let definitions, equivalences, equalities = - classify_constraints flexible eqs in + classify_constraints flexible env eqs in let add_definition env (p, (tl, t, _ as def)) = match Env.find_type_expansion p env with | (tl', t', _) -> From 788d749935ced5c0f7829e59af6b47f3268ce0ce Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 17 Feb 2016 15:51:59 +0900 Subject: [PATCH 467/494] Broken but it builds --- typing/ctype.ml | 2 +- typing/implicitsearch.ml | 194 +++++++++++---------------------------- 2 files changed, 55 insertions(+), 141 deletions(-) diff --git a/typing/ctype.ml b/typing/ctype.ml index beda662684..fbf0ee542c 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -3527,7 +3527,7 @@ let equal' env ?(subst=[]) ~rename tyl1 tyl2 = univar_pairs := []; eqtype_list rename (TypePairs.create 11) (ref subst) env tyl1 tyl2 -let equal env ?(subst=[]) ~rename tyl1 tyl2 = +let equal env ?subst ~rename tyl1 tyl2 = try equal' env ?subst ~rename tyl1 tyl2; true with diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 1c782b134c..105fbefdb0 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -80,7 +80,8 @@ module Equalities = struct | x :: xs -> not (List.memq x xs) && uniq xs in (* FIXME: No type variable should occur in rhs but not in tl *) - if uniq tl' then `Expansion (p, (tl', tl, rhs, None)) else `None + if uniq tl' then `Expansion (p, (tl', rhs, None), tl) else `None + end | _ -> `None in let t1 = Ctype.repr t1 and t2 = Ctype.repr t2 in @@ -90,9 +91,9 @@ module Equalities = struct `Definition e | `Expansion e1, `Expansion e2 -> (* Check for trivial equalities *) - let (p, (tl1, _, rhs, _)) = e1 in - let (_, (_, tl2, _, _)) = e2 in - if Path.same p p' && List.for_all2 (==) tl1 tl2 then + let (p1, (tl1, rhs, _), _) = e1 in + let (p2, (_, _, _), tl2) = e2 in + if Path.same p1 p2 && List.for_all2 (==) tl1 tl2 then (* This can happen because Ctype.eqtype don't check equality on parameters of a flexible path, equation is just collected immediately. *) @@ -130,7 +131,7 @@ module Equalities = struct in let definitions, equivalences, equalities = classify_constraints flexible env eqs in - let add_definition env (p, (tl, t, _ as def)) = + let add_definition env (p, (tl, t, _ as def), _) = match Env.find_type_expansion p env with | (tl', t', _) -> Ctype.equal' env ~rename:true (t :: tl) (t' :: tl'); @@ -138,7 +139,7 @@ module Equalities = struct | exception Not_found -> Env.add_local_expansion p def env - and add_equivalence env ((p1,def1), (p2,def2)) = + and add_equivalence env ((p1,def1,_), (p2,def2,_)) = let (tl1, t1, _) = def1 and (tl2, t2, _) = def2 in match Env.find_type_expansion p1 env with | exception Not_found -> @@ -190,7 +191,7 @@ type goal = { (* Constraints that should be satisfied by a solution. That is when a concrete module is bound to goal_var, equalities in goal_constraints should be true. *) - goal_constraints : (type_expr * type_expr) list; + goal_constraints : Equalities.t; (* A unique identifier that will be used for termination checking. When the goal is the argument to a functor instantiation, if this functor is @@ -216,11 +217,11 @@ module Termination : sig val empty : t - val add_goal : env -> goal -> t -> t + val add_goal : Env.t -> goal -> t -> t - val can_enter : env -> goal -> t -> bool + val can_enter : Env.t -> goal -> t -> bool - val explain : env -> goal -> t -> string + val explain : Env.t -> goal -> t -> string end = struct @@ -233,16 +234,18 @@ end = struct type t = (Ident.t, chain) Tbl.t + let empty = Tbl.empty + (* Checking that an individial type is smaller than another one. The exception never escapes. *) exception Type_is_smaller let smaller ?subst env t1 t2 : [`Smaller | `Equal | `Different] = let rec check_ty t = - if equal ?subst env true [t1] [t] then + if equal ?subst ~rename:true env [t1] [t] then raise Type_is_smaller; iter_type_expr check_ty t in - try if equal ?subst env true [t1] [t2] + try if equal ?subst ~rename:true env [t1] [t2] then `Equal else (iter_type_expr check_ty t2; `Different) with Type_is_smaller -> @@ -260,22 +263,22 @@ end = struct | exception Not_found -> `Smaller | (tyl1, ty1, _) -> let subst = List.combine tyl1 tyl2 in - match smaller ?subst env t1 t2 with + match smaller ~subst env ty1 ty2 with | (`Equal | `Different) as r -> r | `Smaller -> - match smaller ?subst env t2 t1 with + match smaller ~subst env ty2 ty1 with | `Smaller -> `Different (* t1 < t2 && t2 < t1 *) | _ -> `Smaller let initial env goal = let rec collect_mty acc path = function | Mty_signature sg -> collect_sig acc path sg - | Mty_functor _ -> () + | Mty_functor _ -> acc | Mty_alias p -> collect_mty acc path (Env.find_module p env).md_type | Mty_ident p -> begin match (Env.find_modtype p env).mtd_type with - | None -> () + | None -> acc | Some mty -> collect_mty acc path mty end @@ -295,9 +298,9 @@ end = struct { goal; decreasing = types } let rec rewrite_path id = function - | Pident _ -> Pident id - | Papply _ -> assert false - | Pdot (p, s, x) -> Pdot (rewrite_path id p, s, x) + | Path.Pident _ -> Path.Pident id + | Path.Papply _ -> assert false + | Path.Pdot (p, s, x) -> Path.Pdot (rewrite_path id p, s, x) let refine env element goal = let decreased p1 = @@ -313,6 +316,7 @@ end = struct match Tbl.find goal.goal_termination_id t with | exception Not_found -> [initial env goal] | x :: xs -> refine env x goal :: xs + | [] -> assert false in Tbl.add goal.goal_termination_id chain t @@ -351,9 +355,10 @@ end = struct let print x = Format.fprintf Format.str_formatter x in begin match decreasing with | [] -> + let path = rewrite_path x.goal.goal_var (List.hd x'.decreasing) in print "Cannot ensure termination: %a is not structurally decreasing, " - Printtyp.path (List.hd x'.decreasing); + Printtyp.path path; begin match Env.find_type_expansion path env with | exception Not_found -> print "nested occurrence is not constrained." @@ -422,12 +427,16 @@ let goal_of_pending inst = unmark_type ty; unmark_type tyvar) inst.implicit_constraints; - let id = inst.implicit_id in !variables, {goal_type = mty; - goal_var = id; - goal_termination_id = id; - goal_constraints = inst.implicit_constraints} + goal_var = ident; + goal_termination_id = ident; + goal_constraints = + [{Ctype. + subst = []; + equalities = inst.implicit_constraints + }]; + } let report_error msg exn = try @@ -449,7 +458,6 @@ module Search : sig type result val get : result -> Path.t - val equations : result -> Ctype.equalities list val all_candidates : query -> candidate list @@ -476,16 +484,8 @@ end = struct (* List of partials paths being constructed, only for debug purpose *) debug_path: Path.t list; - (* Equality snapshots. - - When resuming a search from this state, - [eq_var] should be set to [eq_initial]. - - [eq_var] is referenced in [eq_table], so new equations valid in this - branch of the search will be added to [eq_var]. *) - eq_initial: Ctype.equalities list; - eq_var: Ctype.equalities list ref; - eq_table: (Ident.t, Ctype.equalities list ref) Tbl.t; + flexible: (Ident.t, unit) Tbl.t; + equalities: Equalities.t; } type query = @@ -503,8 +503,6 @@ end = struct let get t = t.payload - let equations t = t.eq_initial - type outcome = [ | `Done of result | `Step of partial * query @@ -517,9 +515,8 @@ end = struct (new_declaration (Some (level, level)) None) env) env vars in - let eq_var = ref [] in - let eq_table = List.fold_left - (fun tbl id -> Tbl.add id eq_var tbl) + let flexible = List.fold_left + (fun tbl id -> Tbl.add id () tbl) Tbl.empty vars in { @@ -529,9 +526,7 @@ end = struct debug_path = []; - eq_initial = []; - eq_var = eq_var; - eq_table = eq_table; + flexible; equalities = []; } let make_candidate path params mty = @@ -560,18 +555,9 @@ end = struct let all_candidates t = List.map make_candidate (Env.implicit_instances t.env) - let cleanup_equations ident eq_table = - try - let eqns = Tbl.find ident eq_table in - let not_in_ident {eq_lhs_path} = Path.head eq_lhs_path <> ident in - eqns := List.filter not_in_ident !eqns; - Tbl.remove ident eq_table - with Not_found -> eq_table - - exception Invalid_candidate + (*exception Invalid_candidate*) let step0 state (path, sub_goals, candidate_mty) = - state.eq_var := state.eq_initial; let rec print_paths ppf = function | [] -> Format.pp_print_string ppf "_"; | p :: ps -> Format.fprintf ppf "%a (%a)" Printtyp.path p print_paths ps @@ -580,104 +566,32 @@ end = struct printf "%a <- %a\n" print_paths state.debug_path Printtyp.path path; let goal = state.goal in (* Generate coercion. if this succeeds this produce equations in eq_var *) - let eq_table, env = List.fold_left - (fun (eq_table, env) sub_goal -> + let flexible, env = List.fold_left + (fun (flexible, env) sub_goal -> printf "Binding %a with type %a\n%!" Printtyp.ident sub_goal.goal_var Printtyp.modtype sub_goal.goal_type; - Tbl.add sub_goal.goal_var state.eq_var eq_table, + Tbl.add sub_goal.goal_var () flexible, Env.add_module sub_goal.goal_var sub_goal.goal_type env) - (state.eq_table, state.env) sub_goals + (state.flexible, state.env) sub_goals in + let flexible = Tbl.remove goal.goal_var flexible in let env = Env.add_module goal.goal_var candidate_mty env in - Ctype.with_equality_equations eq_table - (fun () -> - let tyl, tvl = List.split goal.goal_constraints in - begin try - if tyl <> [] then - printf "Checkinq equalities between hkt constraints:\n%!"; - List.iter2 (fun t1 t2 -> - printf "\t%a = %a\n%!" - Printtyp.type_expr t1 - Printtyp.type_expr t2) - tyl tvl; - Ctype.equal' env true tyl tvl - with Ctype.Unify tls -> - printf "Failed to instantiate %s with constraints:\n" - (string_of_path path); - let accepting_eq = Tbl.fold - (fun ident _ acc -> Ident.name ident :: acc) - eq_table [] - in - printf "Assuming the following equalities on %s:\n" - (String.concat ", " accepting_eq); - List.iter (fun {eq_lhs; eq_rhs} -> - printf "\t%a = %a\n%!" - Printtyp.type_expr eq_lhs Printtyp.type_expr eq_rhs) - !(state.eq_var); - printf "Because:\n%!"; - List.iter (fun (ty1,ty2) -> - printf "\t%a != %a\n%!" - Printtyp.type_expr ty1 - Printtyp.type_expr ty2; - let rec check_expansion ty = match (repr ty).desc with - | Tconstr (path,args,_) -> - begin try - ignore (Env.find_type_expansion path env : _ * _ *_) - with Not_found -> try - ignore (Env.find_type path env : _) - with Not_found -> - printf "Fatal error: %a not found.\n%!" - Printtyp.path path - end; - List.iter check_expansion args - | _ -> () - in - check_expansion ty1; - check_expansion ty2; - printf "\n%!" - ) tls; - raise Invalid_candidate - end; - let _ : module_coercion = - Includemod.modtypes env candidate_mty goal.goal_type - in - ()); - let rec neweqns = function - | l when l == state.eq_initial -> [] - | [] -> [] - | x :: xs -> x :: neweqns xs - in - let eq_final = !(state.eq_var) in - let neweqns = neweqns eq_final in - let print_eqn {eq_lhs; eq_rhs} = - printf "\t%a = %a\n%!" - Printtyp.type_expr eq_lhs - Printtyp.type_expr eq_rhs + let (_ : module_coercion), eqs = + Ctype.collect_equalities ~on:flexible + (fun () -> Includemod.modtypes env candidate_mty goal.goal_type) in - if eq_final != state.eq_initial then - (printf "Equations produced:\n"; - List.iter print_eqn neweqns) - else - printf "No equations produced.\n"; - - - (* Pass the env will all arguments bound to next state: constraints - might be referring to other modules in any order, e.g in - functor F (X : T) (Y : S) = ... - - we might have type t = Y.t X.t as a constraint on X *) - let eq_table = cleanup_equations goal.goal_var eq_table in + let equalities, env = + Equalities.refine flexible env (eqs @ state.equalities) in (* Keep new equations potentially added to top variables *) - let state = {state with eq_initial = eq_final; env; eq_table = eq_table} in + let state = {state with equalities; flexible; env} in match sub_goals with | [] -> `Done {state with payload = path} | goal :: sub_goals -> let debug_path = state.debug_path in let partial = {state with payload = (path, sub_goals)} in - let goal = Constraints.goal state.env goal eq_final in (*let termination = Termination.check_goal state.env goal eq_final state.termination in*) let state = {state with goal; (*termination;*) debug_path = path :: debug_path} in @@ -692,7 +606,7 @@ end = struct (*| Termination.Terminate eqns as exn -> printf "%a\n%!" (Termination.explain false) eqns; raise exn*) - | Invalid_candidate -> step state candidates + (*| Invalid_candidate -> step state candidates*) | exn -> report_error "Exception while testing candidate: " exn; step state candidates @@ -700,14 +614,15 @@ end = struct let apply partial arg = let partial_path, sub_goals = partial.payload in let arg_path = arg.payload in - let eq_initial = arg.eq_initial in + let flexible = arg.flexible in + let equalities = arg.equalities in let path = papply partial_path arg_path in match sub_goals with | [] -> let state = {partial with (* We get the equations from the argument but keep termination state from the parent *) - payload = path; eq_initial} in + payload = path; flexible; equalities} in `Done state | goal :: sub_goals -> let partial = {partial with payload = (path, sub_goals) } in @@ -715,7 +630,6 @@ end = struct (* The original module declaration might be implicit, we want to avoid rebinding implicit *) let md = {md with md_implicit = Asttypes.Nonimplicit} in - let goal = Constraints.goal arg.env goal eq_initial in (*let termination = Termination.check_goal arg.env goal eq_initial partial.termination in*) let env = Env.add_module_declaration goal.goal_var md arg.env in From 7b95bae69bdc85e16b2fcb254f86aaf771c5d6fe Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 17 Feb 2016 16:35:48 +0900 Subject: [PATCH 468/494] Introduce new (broken) termination check --- typing/implicitsearch.ml | 46 +++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 105fbefdb0..0898d6bf25 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -449,6 +449,8 @@ let report_error msg exn = This helps resuming search (e.g to search for ambiguity), explaining search state or errors, etc. *) +exception Terminate of string + module Search : sig type candidate = Path.t * goal list * Types.module_type @@ -486,6 +488,7 @@ end = struct flexible: (Ident.t, unit) Tbl.t; equalities: Equalities.t; + termination: Termination.t; } type query = @@ -527,6 +530,7 @@ end = struct debug_path = []; flexible; equalities = []; + termination = Termination.empty; } let make_candidate path params mty = @@ -555,7 +559,7 @@ end = struct let all_candidates t = List.map make_candidate (Env.implicit_instances t.env) - (*exception Invalid_candidate*) + exception Invalid_candidate let step0 state (path, sub_goals, candidate_mty) = let rec print_paths ppf = function @@ -578,11 +582,14 @@ end = struct let flexible = Tbl.remove goal.goal_var flexible in let env = Env.add_module goal.goal_var candidate_mty env in let (_ : module_coercion), eqs = - Ctype.collect_equalities ~on:flexible - (fun () -> Includemod.modtypes env candidate_mty goal.goal_type) + try Ctype.collect_equalities ~on:flexible + (fun () -> Includemod.modtypes env candidate_mty goal.goal_type) + with _ -> raise Invalid_candidate in let equalities, env = - Equalities.refine flexible env (eqs @ state.equalities) in + try Equalities.refine flexible env (eqs @ state.equalities) + with _ -> raise Invalid_candidate + in (* Keep new equations potentially added to top variables *) let state = {state with equalities; flexible; env} in @@ -592,9 +599,10 @@ end = struct | goal :: sub_goals -> let debug_path = state.debug_path in let partial = {state with payload = (path, sub_goals)} in - (*let termination = - Termination.check_goal state.env goal eq_final state.termination in*) - let state = {state with goal; (*termination;*) debug_path = path :: debug_path} in + let termination = Termination.add_goal state.env goal state.termination in + if not (Termination.can_enter state.env goal termination) then + raise (Terminate (Termination.explain state.env goal termination)); + let state = {state with goal; termination; debug_path = path :: debug_path} in `Step (partial, state) let rec step state = function @@ -603,10 +611,10 @@ end = struct try step0 state candidate, candidates with - (*| Termination.Terminate eqns as exn -> - printf "%a\n%!" (Termination.explain false) eqns; - raise exn*) - (*| Invalid_candidate -> step state candidates*) + | Terminate msg as exn -> + printf "%s\n%!" msg; + raise exn + | Invalid_candidate -> step state candidates | exn -> report_error "Exception while testing candidate: " exn; step state candidates @@ -622,19 +630,13 @@ end = struct let state = {partial with (* We get the equations from the argument but keep termination state from the parent *) + env = arg.env; payload = path; flexible; equalities} in `Done state | goal :: sub_goals -> let partial = {partial with payload = (path, sub_goals) } in - let md = Env.find_module path arg.env in - (* The original module declaration might be implicit, we want to avoid - rebinding implicit *) - let md = {md with md_implicit = Asttypes.Nonimplicit} in - (*let termination = - Termination.check_goal arg.env goal eq_initial partial.termination in*) - let env = Env.add_module_declaration goal.goal_var md arg.env in let debug_path = path :: partial.debug_path in - let arg = {arg with payload = (); goal; debug_path; (*termination;*) env} in + let arg = {arg with payload = (); goal; debug_path} in `Step (partial, arg) end @@ -759,9 +761,9 @@ let find_pending_instance inst = Link.to_path inst path; true with - (*| Termination.Terminate eqns -> - printf "%a\n%!" (Termination.explain false) eqns; - raise Typecore.(Error (loc, env, Termination_fail inst))*) + | Terminate msg -> + printf "%s\n%!" msg; + raise Typecore.(Error (loc, env, Termination_fail inst)) | Not_found -> false From 43566a7bd5927daa3dd2464e0aa202207e3fd34f Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 17 Feb 2016 20:51:11 +0900 Subject: [PATCH 469/494] FIX Constraint refinement & termination condition --- typing/implicitsearch.ml | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 0898d6bf25..ef83457c03 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -329,8 +329,9 @@ end = struct let can_enter env goal t = match Tbl.find goal.goal_termination_id t with + | [_] -> true | (x :: _) as xs when (x.goal == goal) -> - x.decreasing = [] || (retry_chain env xs).decreasing = [] + x.decreasing <> [] || (retry_chain env xs).decreasing <> [] | exception Not_found -> assert false | _ -> assert false @@ -586,8 +587,29 @@ end = struct (fun () -> Includemod.modtypes env candidate_mty goal.goal_type) with _ -> raise Invalid_candidate in + printf "Flexible =%a\n%!" + (fun _ -> Tbl.iter (fun i () -> printf " %a" Printtyp.ident i)) + flexible; + printf "New equations =\n%a%!" + (fun _ -> List.iter (fun eq -> + List.iter (fun (t1,t2) -> + printf "\t%a = %a\n%!" + Printtyp.type_expr t1 + Printtyp.type_expr t2; + ) eq.Ctype.equalities; + )) + eqs; + printf "Inherited equations =\n%a%!" + (fun _ -> List.iter (fun eq -> + List.iter (fun (t1,t2) -> + printf "\t%a = %a\n%!" + Printtyp.type_expr t1 + Printtyp.type_expr t2; + ) eq.Ctype.equalities; + )) + (goal.goal_constraints @ state.equalities); let equalities, env = - try Equalities.refine flexible env (eqs @ state.equalities) + try Equalities.refine flexible env (eqs @ goal.goal_constraints @ state.equalities) with _ -> raise Invalid_candidate in From 5c3aa23e96da9ce9c5eb3e913a69377ffbad4293 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Thu, 18 Feb 2016 16:37:07 +0900 Subject: [PATCH 470/494] is_pure_module test --- typing/typecore.ml | 15 +++++++++++++-- typing/typecore.mli | 2 ++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/typing/typecore.ml b/typing/typecore.ml index 33c33f7715..47da13e8ee 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -1390,6 +1390,8 @@ let rec final_subexpression sexp = (* Generalization criterion for expressions *) +let allow_eval = ref true + let rec is_nonexpansive exp = match exp.exp_desc with Texp_ident(_,_,_) -> true @@ -1457,14 +1459,15 @@ and is_nonexpansive_mod mexp = | Tmod_structure str -> List.for_all (fun item -> match item.str_desc with - | Tstr_eval _ | Tstr_primitive _ | Tstr_type _ + | Tstr_eval _ -> !allow_eval (*|| is_nonexpansive exp *) + | Tstr_primitive _ | Tstr_type _ | Tstr_modtype _ | Tstr_open _ | Tstr_class_type _ -> true | Tstr_value (_, pat_exp_list) -> List.for_all (fun vb -> is_nonexpansive vb.vb_expr) pat_exp_list | Tstr_module {mb_expr=m;_} | Tstr_include {incl_mod=m;_} -> is_nonexpansive_mod m | Tstr_recmodule id_mod_list -> - List.for_all (fun {mb_expr=m;_} -> is_nonexpansive_mod m) + List.for_all (fun m -> is_nonexpansive_mod m.mb_expr) id_mod_list | Tstr_exception {ext_kind = Text_decl _} -> false (* true would be unsound *) @@ -1478,12 +1481,20 @@ and is_nonexpansive_mod mexp = | Tstr_attribute _ -> true ) str.str_items + | Tmod_apply (ma, Tmarg_implicit (mb,_)) -> + is_nonexpansive_mod ma && is_nonexpansive_mod mb | Tmod_apply _ -> false and is_nonexpansive_opt = function None -> true | Some e -> is_nonexpansive e +let is_pure_module md = + allow_eval := false; + try_finally + (fun () -> is_nonexpansive_mod md) + (fun () -> allow_eval := true) + (* Helpers for packaged modules. *) let create_package_type loc env (p, l) = let s = !Typetexp.transl_modtype_longident loc env p in diff --git a/typing/typecore.mli b/typing/typecore.mli index 5740acbe81..dff8b56eb3 100644 --- a/typing/typecore.mli +++ b/typing/typecore.mli @@ -18,6 +18,8 @@ open Format val is_nonexpansive: Typedtree.expression -> bool +val is_pure_module: Typedtree.module_expr -> bool + val type_binding: Env.t -> rec_flag -> Parsetree.value_binding list -> From 6e4b78ee47d9acb6659ea818d12a654e626c6035 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 19 Feb 2016 10:56:03 +0900 Subject: [PATCH 471/494] Check wellformedness of implicit parameters --- typing/typemod.ml | 63 +++++++++++++++++++++++++++++++++++++++++++--- typing/typemod.mli | 3 +++ 2 files changed, 63 insertions(+), 3 deletions(-) diff --git a/typing/typemod.ml b/typing/typemod.ml index b892816fb0..a52c750909 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -39,6 +39,9 @@ type error = | Scoping_pack of Longident.t * type_expr | Recursive_module_require_explicit_type | Argument_mismatch of module_parameter * module_argument + | Implicit_body_is_not_pure + | Implicit_name_escaping + | Illformed_virtual_parameter exception Error of Location.t * Env.t * error exception Error_forward of Location.error @@ -280,6 +283,47 @@ let merge_constraint initial_env loc sg constr = with Includemod.Error explanation -> raise(Error(loc, initial_env, With_mismatch(lid.txt, explanation))) +let wellformed_virtual env loc = + let rec module_type = function + | Mty_ident p -> + begin match Env.find_modtype_expansion p env with + | exception Not_found -> + raise (Error (loc, env, Illformed_virtual_parameter)) + | mty -> module_type mty + end + | Mty_signature sg -> List.iter signature_item sg + | Mty_functor _ -> raise (Error (loc, env, Illformed_virtual_parameter)) + | Mty_alias _ -> () (* Singleton... Should be ok? *) + + and signature_item = function + | Sig_type _ -> () + | Sig_module (_, md, _) -> module_type md.md_type + | Sig_typext _ | Sig_value _ | Sig_modtype _ | Sig_class _ + | Sig_class_type _ -> raise (Error (loc, env, Illformed_virtual_parameter)) + in + module_type + +let no_implicit_escape env loc id sg = + let rec it_path = function + | Pident id' -> + if Ident.same id id' then + raise (Error (loc, env, Implicit_name_escaping)) + | Pdot (p, _, _) -> it_path p + | Papply (p1, p2, _) -> it_path p2; it_path p1 + in + let it_type_declaration _ _ = () in + let it = {Btype.type_iterators with Btype.it_path; it_type_declaration} in + it.Btype.it_module_type it sg + +let wellformed_functor env loc param res = + begin match param with + | Mpar_implicit(virt, id, mty) -> + if virt = Virtual then wellformed_virtual env loc mty; + no_implicit_escape env loc id res + | _ -> () + end; + Mty_functor(param, res) + (* Add recursion flags on declarations arising from a mutually recursive block. *) @@ -360,7 +404,7 @@ let rec approx_modtype env smty = Mpar_implicit(virt, id, arg), newenv in let res = approx_modtype newenv sres in - Mty_functor(param, res) + wellformed_functor env smty.pmty_loc param res | Pmty_with(sbody, constraints) -> approx_modtype env sbody | Pmty_typeof smod -> @@ -575,7 +619,7 @@ let rec transl_modtype env smty = Ctype.init_def(Ident.current_time()); (* PR#6513 *) let res = transl_modtype newenv sres in mkmty (Tmty_functor (tparam, res)) - (Mty_functor(param, res.mty_type)) env loc + (wellformed_functor env loc param res.mty_type) env loc smty.pmty_attributes | Pmty_with(sbody, constraints) -> let body = transl_modtype env sbody in @@ -1208,8 +1252,15 @@ let rec type_module ?(alias=false) sttn funct_body anchor env smod = tparam, param, newenv, true in let body = type_module sttn funct_body None newenv sbody in + begin match sparam with + | Pmpar_implicit _ -> + (* FIXME: Body has to be pure *) + if not (Typecore.is_pure_module body) then + raise (Error(smod.pmod_loc, env, Implicit_body_is_not_pure)) + | _ -> () + end; rm { mod_desc = Tmod_functor(tparam, body); - mod_type = Mty_functor(param, body.mod_type); + mod_type = wellformed_functor env smod.pmod_loc param body.mod_type; mod_env = env; mod_attributes = smod.pmod_attributes; mod_loc = smod.pmod_loc } @@ -1991,6 +2042,12 @@ let report_error ppf = function | Mpar_applicative _, Pmarg_applicative _ -> assert false | Mpar_implicit _, Pmarg_implicit _ -> assert false end + | Implicit_body_is_not_pure -> + fprintf ppf "Body of a implicit functor should be pure." + | Implicit_name_escaping -> + fprintf ppf "Types of values cannot depend on an implicit parameter." + | Illformed_virtual_parameter -> + fprintf ppf "Virtual parameters can only contain types." let report_error env ppf err = diff --git a/typing/typemod.mli b/typing/typemod.mli index 87974558d2..33e96bbfb4 100644 --- a/typing/typemod.mli +++ b/typing/typemod.mli @@ -68,6 +68,9 @@ type error = | Scoping_pack of Longident.t * type_expr | Recursive_module_require_explicit_type | Argument_mismatch of Types.module_parameter * Parsetree.module_argument + | Implicit_body_is_not_pure + | Implicit_name_escaping + | Illformed_virtual_parameter exception Error of Location.t * Env.t * error exception Error_forward of Location.error From 0fae70e4d6836e804bd791b7a6501f195d590583 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 19 Feb 2016 11:45:16 +0900 Subject: [PATCH 472/494] Add tests for wellformedness of parameters --- .../parameters_wellformedness.ml | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 testsuite/tests/typing-modular_implicits/parameters_wellformedness.ml diff --git a/testsuite/tests/typing-modular_implicits/parameters_wellformedness.ml b/testsuite/tests/typing-modular_implicits/parameters_wellformedness.ml new file mode 100644 index 0000000000..9ed20ac007 --- /dev/null +++ b/testsuite/tests/typing-modular_implicits/parameters_wellformedness.ml @@ -0,0 +1,70 @@ +(* Purity *) +module Pure1_ok {X : Map.OrderedType} = struct + let test = "test" +end;; + +module Pure1_ko {X : Map.OrderedType} = struct + let test = ref "test" +end;; + +module Pure2_ok {X : Map.OrderedType} = struct + module M () = Map.Make(X) +end;; + +module Pure2_ko {X : Map.OrderedType} = struct + module M = Map.Make(X) +end;; + +module Pure3_ok {X : Map.OrderedType} = struct + module P = Pure2_ok{X} + module M = P.M +end;; + +module Pure3_ko {X : Map.OrderedType} = struct + module P = Pure2_ok{X} + module M = P.M() +end;; + +(* Implicit parameters type escape *) +module Escape1_ok {X : sig type t val x : t end} = struct + type t = X.t + let x : t = X.x +end;; + +module Escape1_ko {X : sig type t val x : t end} = struct + let x = X.x +end;; + +(* Virtual parameters *) + +module Virtual0_ok {virtual X : sig end} = struct end;; + +module Virtual1_ok {virtual X : sig type t end} = struct end;; + +module Virtual1_ko {virtual X : sig val x : int end} = struct end;; + +module Virtual2_ok {virtual X : sig module X : sig end end} = struct end;; + +module Virtual3_ok {virtual X : sig module X : sig type t end end} = struct end;; + +module Virtual3_ko {virtual X : sig module X : sig val x : int end end} = struct end;; + +(* Same on module types *) + +module type Escape1_ok = + functor {X : sig type t val x : t end} -> sig type t = X.t val x : t end + +module type Escape1_ko = + functor {X : sig type t val x : t end} -> sig val x : X.t end + +module type Virtual0_ok = functor {virtual X : sig end} -> sig end;; + +module type Virtual1_ok = functor {virtual X : sig type t end} -> sig end;; + +module type Virtual1_ko = functor {virtual X : sig val x : int end} -> sig end;; + +module type Virtual2_ok = functor {virtual X : sig module X : sig end end} -> sig end;; + +module type Virtual3_ok = functor {virtual X : sig module X : sig type t end end} -> sig end;; + +module type Virtual3_ko = functor {virtual X : sig module X : sig val x : int end end} -> sig end;; From 86123bdf4d206a50ea09bd56897a62ecb8e8b4ed Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Tue, 23 Feb 2016 12:15:51 +0900 Subject: [PATCH 473/494] WIP... Search strategy is broken --- .../tests/typing-modular_implicits/show.ml | 4 +- typing/implicitsearch.ml | 163 +++++++++++------- 2 files changed, 104 insertions(+), 63 deletions(-) diff --git a/testsuite/tests/typing-modular_implicits/show.ml b/testsuite/tests/typing-modular_implicits/show.ml index 6049323513..a7c741682d 100644 --- a/testsuite/tests/typing-modular_implicits/show.ml +++ b/testsuite/tests/typing-modular_implicits/show.ml @@ -25,12 +25,12 @@ print 5;; implicit module StringifyPair {A : Show} {B : Show} = struct type t = A.t * B.t - let show (a,b) = "(" ^ A.show a ^ "," ^ B.show b ^ ")" + let show (a,b : t) = "(" ^ A.show a ^ "," ^ B.show b ^ ")" end;; implicit module StringifyList {X : Show} = struct type t = X.t list - let show xs = "[" ^ String.concat "; " (List.map X.show xs) ^ "]" + let show (xs : t) = "[" ^ String.concat "; " (List.map X.show xs) ^ "]" end let () = print [("hello", 1); ("world", 2)];; diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index ef83457c03..e59b8dce0a 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -137,6 +137,8 @@ module Equalities = struct Ctype.equal' env ~rename:true (t :: tl) (t' :: tl'); env | exception Not_found -> + printf "defining %a = %a\n" + Printtyp.path p Printtyp.type_expr t; Env.add_local_expansion p def env and add_equivalence env ((p1,def1,_), (p2,def2,_)) = @@ -145,11 +147,15 @@ module Equalities = struct | exception Not_found -> begin match Env.find_type_expansion p2 env with | exception Not_found -> + printf "equivalent %a = %a\n" + Printtyp.path p1 Printtyp.path p2; if Ident.binding_time (Path.head p1) <= Ident.binding_time (Path.head p2) then Env.add_local_expansion p1 def1 env else Env.add_local_expansion p2 def2 env | (tl2', t2', _) -> + printf "arbitrary equality %a = %a\n" + Printtyp.type_expr t1 Printtyp.type_expr t2; Ctype.equal' env ~rename:true (t2 :: tl2) (t2' :: tl2'); Env.add_local_expansion p1 def1 env end @@ -157,6 +163,8 @@ module Equalities = struct Ctype.equal' env ~rename:true (t1 :: tl1) (t1' :: tl1'); begin match Env.find_type_expansion p2 env with | exception Not_found -> + printf "defining %a = %a\n" + Printtyp.path p2 Printtyp.type_expr t1; Env.add_local_expansion p2 def2 env | (tl2', t2', _) -> Ctype.equal' env ~rename:true (t2 :: tl2) (t2' :: tl2'); @@ -219,9 +227,9 @@ module Termination : sig val add_goal : Env.t -> goal -> t -> t - val can_enter : Env.t -> goal -> t -> bool + val can_enter : Env.t -> (Ident.t, unit) Tbl.t -> goal -> t -> bool - val explain : Env.t -> goal -> t -> string + val explain : Env.t -> (Ident.t, unit) Tbl.t -> goal -> t -> string end = struct @@ -315,7 +323,7 @@ end = struct let chain = match Tbl.find goal.goal_termination_id t with | exception Not_found -> [initial env goal] - | x :: xs -> refine env x goal :: xs + | (x :: _) as xs -> refine env x goal :: xs | [] -> assert false in Tbl.add goal.goal_termination_id chain t @@ -327,55 +335,80 @@ end = struct let x' = retry_chain env xs in refine env x' x.goal - let can_enter env goal t = - match Tbl.find goal.goal_termination_id t with - | [_] -> true - | (x :: _) as xs when (x.goal == goal) -> - x.decreasing <> [] || (retry_chain env xs).decreasing <> [] - | exception Not_found -> assert false - | _ -> assert false - - let explain env goal t = - let xs = - try Tbl.find goal.goal_termination_id t - with Not_found -> assert false + (* Raise Exit if a flexible type is found *) + let non_flexible env flexible = + let rec aux = function + | Path.Pident id -> + if Tbl.mem id flexible then raise Exit + | Path.Papply (p1, p2, _) -> + aux p1; aux p2 + | Path.Pdot (p, _, _) -> + aux p in - let rec drop = function - | x :: xs when x.goal != goal -> drop xs - | xs -> xs + let it_path = function + | Path.Pident _ -> () + | p -> aux p in - match drop xs with - | [x] -> "Termination succeeds: no nested call" - | (x :: x' :: _) as xs -> - let decreasing = - if x.decreasing = [] then - (retry_chain env xs).decreasing - else - x.decreasing + let it = {Btype.type_iterators with Btype.it_path} in + fun path -> + match Env.find_type_expansion path env with + | exception Not_found -> assert false + | (_, ty, _) -> + try + it.Btype.it_type_expr it ty; + Btype.unmark_type ty; + true + with Exit -> + Btype.unmark_type ty; + false + + let find_decreasing env flexible goal t = + match Tbl.find goal.goal_termination_id t with + | [] -> assert false + | exception Not_found -> assert false + | [_] -> None + | (x :: _) as xs -> + assert (x.goal == goal); + let non_flexible = non_flexible env flexible in + let path = + try List.find non_flexible x.decreasing + with Not_found -> + List.find non_flexible (retry_chain env xs).decreasing + in + Some path + + let can_enter env flexible goal t = + match find_decreasing env flexible goal t with + | exception Not_found -> false + | _ -> true + + let explain env flexible goal t = + let print x = Format.fprintf Format.str_formatter x in + begin match find_decreasing env flexible goal t with + | None -> print "Termination succeeds: no nested call" + | Some x -> + print "Termination succeeds: %a is structurally decreasing" + Printtyp.path x + | exception Not_found -> + let x, x' = + match Tbl.find goal.goal_termination_id t with + | x :: x' :: _ -> x, x' + | [] | [_] -> assert false in - let print x = Format.fprintf Format.str_formatter x in - begin match decreasing with - | [] -> - let path = rewrite_path x.goal.goal_var (List.hd x'.decreasing) in - print - "Cannot ensure termination: %a is not structurally decreasing, " - Printtyp.path path; - begin match Env.find_type_expansion path env with - | exception Not_found -> - print "nested occurrence is not constrained." - | (_, ty2, _) -> - let _, ty1, _ = Env.find_type_expansion path env in - print "%a is not smaller than %a." - Printtyp.type_expr ty2 - Printtyp.type_expr ty1 - end - | x :: xs -> - print - "Termination succeeds: %a is structurally decreasing" - Printtyp.path x - end; - Format.flush_str_formatter () - | _ -> assert false + let path = rewrite_path x.goal.goal_var (List.hd x'.decreasing) in + print "Cannot ensure termination: %a is not structurally decreasing, " + Printtyp.path path; + begin match Env.find_type_expansion path env with + | exception Not_found -> + print "nested occurrence is not constrained." + | (_, ty2, _) -> + let _, ty1, _ = Env.find_type_expansion path env in + print "%a is not smaller than %a." + Printtyp.type_expr ty2 + Printtyp.type_expr ty1 + end + end; + Format.flush_str_formatter () end @@ -570,7 +603,6 @@ end = struct let print_paths ppf ps = print_paths ppf (List.rev ps) in printf "%a <- %a\n" print_paths state.debug_path Printtyp.path path; let goal = state.goal in - (* Generate coercion. if this succeeds this produce equations in eq_var *) let flexible, env = List.fold_left (fun (flexible, env) sub_goal -> printf "Binding %a with type %a\n%!" @@ -581,16 +613,20 @@ end = struct (state.flexible, state.env) sub_goals in let flexible = Tbl.remove goal.goal_var flexible in - let env = Env.add_module goal.goal_var candidate_mty env in + printf "Flexible {%a}\n%!" + (fun _ -> Tbl.iter (fun i () -> printf " %a" Printtyp.ident i)) + flexible; + let goal_type = Mtype.strengthen env goal.goal_type (Path.Pident goal.goal_var) in + printf "Inclusion:\n%a <: %a\n" + Printtyp.modtype candidate_mty Printtyp.modtype goal_type; let (_ : module_coercion), eqs = try Ctype.collect_equalities ~on:flexible - (fun () -> Includemod.modtypes env candidate_mty goal.goal_type) - with _ -> raise Invalid_candidate + (fun () -> Includemod.modtypes env candidate_mty goal_type) + with _ -> + printf "Inclusion failed\n"; + raise Invalid_candidate in - printf "Flexible =%a\n%!" - (fun _ -> Tbl.iter (fun i () -> printf " %a" Printtyp.ident i)) - flexible; - printf "New equations =\n%a%!" + printf "New equations {\n%a}\n%!" (fun _ -> List.iter (fun eq -> List.iter (fun (t1,t2) -> printf "\t%a = %a\n%!" @@ -599,7 +635,7 @@ end = struct ) eq.Ctype.equalities; )) eqs; - printf "Inherited equations =\n%a%!" + printf "Inherited equations {\n%a}\n%!" (fun _ -> List.iter (fun eq -> List.iter (fun (t1,t2) -> printf "\t%a = %a\n%!" @@ -608,6 +644,7 @@ end = struct ) eq.Ctype.equalities; )) (goal.goal_constraints @ state.equalities); + let env = Env.add_module goal.goal_var candidate_mty env in let equalities, env = try Equalities.refine flexible env (eqs @ goal.goal_constraints @ state.equalities) with _ -> raise Invalid_candidate @@ -622,8 +659,10 @@ end = struct let debug_path = state.debug_path in let partial = {state with payload = (path, sub_goals)} in let termination = Termination.add_goal state.env goal state.termination in - if not (Termination.can_enter state.env goal termination) then - raise (Terminate (Termination.explain state.env goal termination)); + printf "Termination: %s\n%!" + (Termination.explain state.env flexible goal termination); + if not (Termination.can_enter state.env flexible goal termination) then + raise (Terminate (Termination.explain state.env flexible goal termination)); let state = {state with goal; termination; debug_path = path :: debug_path} in `Step (partial, state) @@ -636,7 +675,9 @@ end = struct | Terminate msg as exn -> printf "%s\n%!" msg; raise exn - | Invalid_candidate -> step state candidates + | Invalid_candidate -> + printf "Skipping candidate\n%!"; + step state candidates | exn -> report_error "Exception while testing candidate: " exn; step state candidates From d5be375f6fd48133a3cc9bf7a662fc375cb95e40 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Tue, 23 Feb 2016 17:08:26 +0900 Subject: [PATCH 474/494] New search strategy... Simple backtracking, no termination checking --- typing/implicitsearch.ml | 667 +++++++++++++++++---------------------- 1 file changed, 288 insertions(+), 379 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index e59b8dce0a..b61a99bbfe 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -4,7 +4,7 @@ open Types open Typedtree open Typeimplicit -(** Misc functions *) +(** Misc definitions *) let rec list_extract f acc = function | x :: xs when f x -> x, List.rev_append acc xs @@ -40,10 +40,18 @@ let has_suffix ~suffix str = true with Exit -> false -let push l t = l := t :: !l - let papply path arg = Path.Papply (path, arg, Asttypes.Implicit) +let safe_report_exn ppf exn = + match Location.error_of_exn exn with + | None -> Format.fprintf ppf "%s" (Printexc.to_string exn) + | Some error -> Location.report_error ppf error + +type identset = (Ident.t, unit) Tbl.t + +let add_ident set id = Tbl.add id () set + + module Equalities = struct type t = Ctype.equalities list @@ -412,423 +420,324 @@ end = struct end -(* Various functions to preprocess pending implicit and implicit declarations - when searching *) - -let remove_type_variables () = - let k = ref 0 in - let variables = ref [] in - let it_type_expr it ty = - let ty = repr ty in - if ty.level >= lowest_level then begin - match ty.desc with - | Tvar name when ty.level < generic_level -> - let name = match name with - | None -> "ex" ^ string_of_int (incr k; !k) - | Some name -> name - in - let ident = Ident.create name in - variables := (ty, ident) :: !variables; - let ty' = newgenty (Tconstr (Path.Pident ident, [], ref Mnil)) in - link_type ty ty'; - mark_type_node ty - | _ -> - mark_type_node ty; - type_iterators.it_do_type_expr it ty; - end - in - let it = {type_iterators with it_type_expr} in - variables, it - -let goal_of_pending inst = - let env = inst.implicit_env in - let ident = inst.implicit_id in - let path, nl, tl = inst.implicit_type in - (* Extract base module type *) - let mtd = Env.find_modtype path env in - let mty = match mtd.mtd_type with - | None -> assert false - | Some mty -> mty - in - let variables, it = remove_type_variables () in - it.it_module_type it mty; - List.iter (fun (ty,tyvar) -> - it.it_type_expr it ty; - it.it_type_expr it tyvar) - inst.implicit_constraints; - unmark_iterators.it_module_type unmark_iterators mty; - List.iter (fun (ty,tyvar) -> - unmark_type ty; - unmark_type tyvar) - inst.implicit_constraints; - !variables, - {goal_type = mty; - goal_var = ident; - goal_termination_id = ident; - goal_constraints = - [{Ctype. - subst = []; - equalities = inst.implicit_constraints - }]; - } - -let report_error msg exn = - try - Location.report_exception printf_output exn - with exn -> - printf "%s%s\n%!" msg (Printexc.to_string exn) - -(* Make the search stack explicit. - - This helps resuming search (e.g to search for ambiguity), explaining search - state or errors, etc. *) - -exception Terminate of string +module Pending = struct + (* Various functions to preprocess pending implicit and implicit declarations + when searching *) + + let variables_reifier () = + let k = ref 0 in + let variables = ref [] in + let it_type_expr it ty = + let ty = repr ty in + if ty.level >= lowest_level then begin + match ty.desc with + | Tvar name when ty.level < generic_level -> + let name = match name with + | None -> "ex" ^ string_of_int (incr k; !k) + | Some name -> name + in + let ident = Ident.create name in + variables := (ty, ident) :: !variables; + let ty' = newgenty (Tconstr (Path.Pident ident, [], ref Mnil)) in + link_type ty ty'; + mark_type_node ty + | _ -> + mark_type_node ty; + type_iterators.it_do_type_expr it ty; + end + in + let it = {type_iterators with it_type_expr} in + variables, it + + let reify_variables mty tl constraints = + let variables, it = variables_reifier () in + it.it_module_type it mty; + List.iter (it.it_type_expr it) tl; + List.iter (fun (ty,tyvar) -> + it.it_type_expr it ty; + it.it_type_expr it tyvar) + constraints; + unmark_iterators.it_module_type unmark_iterators mty; + List.iter unmark_type tl; + List.iter (fun (ty,tyvar) -> + unmark_type ty; + unmark_type tyvar) + constraints; + !variables + + let add_variable env (_, ident) = + (* Create a fake abstract type declaration for name. *) + let level = get_current_level () in + let decl = { + type_params = []; + type_arity = 0; + type_kind = Type_abstract; + type_private = Asttypes.Public; + type_manifest = None; + type_variance = []; + type_newtype_level = Some (level, level); + type_loc = Location.none; + type_attributes = []; + } + in + Env.add_type ~check:false ident decl env -module Search : sig + let prepare inst = + let env = inst.implicit_env in + let var = inst.implicit_id in + let path, nl, tl = inst.implicit_type in + let constraints = inst.implicit_constraints in + (* Extract base module type *) + let mty = + let mtd = Env.find_modtype path env in + match mtd.mtd_type with + | None -> assert false + | Some mty -> mty + in + (* Turn with constraints into equality constraints *) + let with_cstrs = List.map2 (fun li ty -> + let rec path = function + | Longident.Lident s -> Path.Pdot (Path.Pident var, s, 0) + | Longident.Ldot (l, s) -> Path.Pdot (path l, s, 0) + | Longident.Lapply _ -> assert false + in + Ctype.newconstr (path li) [], ty + ) nl tl + in + (* Reify variables *) + let variables = reify_variables mty tl constraints in + let env = List.fold_left add_variable env variables in + let flexible = + List.fold_left (fun set (_,id) -> add_ident set id) Tbl.empty variables + in + env, flexible, var, mty, (with_cstrs @ constraints) - type candidate = Path.t * goal list * Types.module_type +end - type query - type partial - type result +type candidate = + (Path.t * (Ident.t * Types.module_type) list * Types.module_type) - val get : result -> Path.t +module Search = struct - val all_candidates : query -> candidate list + type t = { + (** {2 Variables} *) - val start : Env.t -> Ident.t list -> goal -> query + (*vars : Ident.t list;*) + (* Flexible modules for which we want to find a concrete instance. + At the beginning of the search, these are bound to abstract modules in + [env]. In a successful search, they get bound to concrete modules. *) - type outcome = [ - | `Done of result - | `Step of partial * query - ] + blocked: Ident.t list; - val step : query -> candidate list -> outcome * candidate list - val apply : partial -> result -> outcome + flexible : identset; + (* All paths on which new constraints can be introduced. *) -end = struct + (* Invariant: flexible is a superset of vars & blocked *) - type candidate = Path.t * goal list * Types.module_type + (** {2 Context & constraints} *) - type 'a state = - { - payload: 'a; - goal: goal; - env: Env.t; + env : Env.t; + (* Environment in which they should be satisfied. + All [vars] are bound to abstract modules at this stage *) - (* List of partials paths being constructed, only for debug purpose *) - debug_path: Path.t list; + constraints : Equalities.t; + (* Constraints that should be satisfied by a solution. That is when all + vars are bound to concrete modules, equalities in constraints + should hold. *) - flexible: (Ident.t, unit) Tbl.t; - equalities: Equalities.t; - termination: Termination.t; - } + (* Invariant: [constraints] and [env] must be refined (Equalities.refine). *) - type query = - (* Start point for a search, a state without other information attached *) - unit state + (** {2 Result} *) - type partial = - (* Intermediate result: a path has been found, but some arguments are - missing and need to be applied *) - (Path.t * goal list) state + bound : (Ident.t, Path.t) Tbl.t; + (* Progression of the search is expressed as a mapping from variables + variables to the path they were bound to. + When all flexibles variables are bound, the paths are closed. *) - type result = - (* Final result: the path points to a module with the desired type *) - Path.t state + roots : Ident.t list; + (* Variables the search started from, used to display results and construct + final paths. *) + } - let get t = t.payload + let introduce_var env (var, mty) = + Env.add_module var mty env - type outcome = [ - | `Done of result - | `Step of partial * query - ] + let make env flexible vars equalities = + let env = List.fold_left introduce_var env vars in + let roots = List.map fst vars in + (*let vars = List.fold_left add_ident Tbl.empty roots in*) + let flexible = List.fold_left add_ident flexible roots in + let constraints, env = + Equalities.refine flexible env [{Ctype. subst = []; equalities}] in + { (*vars;*) env; constraints; roots; flexible; + bound = Tbl.empty; blocked = []; } - let start env vars goal = - let level = get_current_level () in - let env = List.fold_left (fun env variable -> - Env.add_type ~check:false variable - (new_declaration (Some (level, level)) None) env) - env vars - in - let flexible = List.fold_left - (fun tbl id -> Tbl.add id () tbl) - Tbl.empty vars + let instantiate_parameters (path, params, mty) = + match params with + | [] -> path, [], Mty_alias path + | params -> + let rec loop res ~subst ~path ~params = function + | [] -> path, List.rev params, Subst.modtype subst res + | (id, param) :: rest -> + let param' = Subst.modtype subst param in + let id' = Ident.rename id in + let path' = Path.Pident id' in + loop res + ~subst:(Subst.add_module id path' subst) + ~path:(papply path path') + ~params:((id', param') :: params) + rest + in + loop mty ~subst:Subst.identity ~path ~params:[] params + + (* Reference implementation: + - bind one variable to a candidate. + - if succeeds, update the goal. + - raises an exception if candidate is not compatible + *) + let bind_candidate goal var candidate = + (* Instantiate implicit parameters *) + let path, params, mty = instantiate_parameters candidate in + let newvars = List.map fst params in + (* Update environment *) + let env = List.fold_left introduce_var goal.env params in + (* Update set of flexible variables *) + assert (Tbl.mem var goal.flexible); + let flexible = Tbl.remove var goal.flexible in + let flexible = List.fold_left add_ident flexible newvars in + (* Check inclusion relation, collect constraints on parameters *) + let (_ : module_coercion), equalities = + let mty1 = Env.scrape_alias env mty in + let mty2 = Env.scrape_alias env (Mty_alias (Path.Pident var)) in + Ctype.collect_equalities ~on:flexible + (fun () -> Includemod.modtypes env mty1 mty2) in + (* Bind concrete module *) + let env = Env.add_module var mty env in + (* Propagate constraints *) + let constraints, env = + Equalities.refine flexible env (equalities @ goal.constraints) in + newvars, { - payload = (); - goal = goal; - env = env; + (* Variables *) + flexible; blocked = goal.blocked; - debug_path = []; + (* Constraints *) + env; constraints; - flexible; equalities = []; - termination = Termination.empty; + (* Result *) + bound = Tbl.add var path goal.bound; + roots = goal.roots; } - let make_candidate path params mty = - let rec loop path res s acc = function - | [] -> path, List.rev acc, Subst.modtype s res - | (id, param) :: rest -> - let param' = Subst.modtype s param in - let id' = Ident.rename id in - let s' = Subst.add_module id (Path.Pident id') s in - let goal = { - goal_var = id'; - goal_type = param'; - goal_constraints = []; - goal_termination_id = id; - } in - let acc' = goal :: acc in - loop path res s' acc' rest + let construct_paths goal = + let rec mk_spine = function + | Path.Pident v -> Path.Pident v + | Path.Pdot (p', s, x) -> Path.Pdot (mk_spine p', s, x) + | Path.Papply (p1, Path.Pident var, Asttypes.Implicit) -> + Path.Papply (mk_spine p1, mk_var var, Asttypes.Implicit) + | Path.Papply (_, _, _) -> assert false + and mk_var var = + match Tbl.find var goal.bound with + | exception Not_found -> Path.Pident var + | path -> mk_spine path in - loop path mty Subst.identity [] params - - let make_candidate (path, params, mty) = - match params with - | [] -> (path, [], mty) - | params -> make_candidate path params mty - - let all_candidates t = - List.map make_candidate (Env.implicit_instances t.env) - - exception Invalid_candidate - - let step0 state (path, sub_goals, candidate_mty) = - let rec print_paths ppf = function - | [] -> Format.pp_print_string ppf "_"; - | p :: ps -> Format.fprintf ppf "%a (%a)" Printtyp.path p print_paths ps - in - let print_paths ppf ps = print_paths ppf (List.rev ps) in - printf "%a <- %a\n" print_paths state.debug_path Printtyp.path path; - let goal = state.goal in - let flexible, env = List.fold_left - (fun (flexible, env) sub_goal -> - printf "Binding %a with type %a\n%!" - Printtyp.ident sub_goal.goal_var - Printtyp.modtype sub_goal.goal_type; - Tbl.add sub_goal.goal_var () flexible, - Env.add_module sub_goal.goal_var sub_goal.goal_type env) - (state.flexible, state.env) sub_goals - in - let flexible = Tbl.remove goal.goal_var flexible in - printf "Flexible {%a}\n%!" - (fun _ -> Tbl.iter (fun i () -> printf " %a" Printtyp.ident i)) - flexible; - let goal_type = Mtype.strengthen env goal.goal_type (Path.Pident goal.goal_var) in - printf "Inclusion:\n%a <: %a\n" - Printtyp.modtype candidate_mty Printtyp.modtype goal_type; - let (_ : module_coercion), eqs = - try Ctype.collect_equalities ~on:flexible - (fun () -> Includemod.modtypes env candidate_mty goal_type) - with _ -> - printf "Inclusion failed\n"; - raise Invalid_candidate - in - printf "New equations {\n%a}\n%!" - (fun _ -> List.iter (fun eq -> - List.iter (fun (t1,t2) -> - printf "\t%a = %a\n%!" - Printtyp.type_expr t1 - Printtyp.type_expr t2; - ) eq.Ctype.equalities; - )) - eqs; - printf "Inherited equations {\n%a}\n%!" - (fun _ -> List.iter (fun eq -> - List.iter (fun (t1,t2) -> - printf "\t%a = %a\n%!" - Printtyp.type_expr t1 - Printtyp.type_expr t2; - ) eq.Ctype.equalities; - )) - (goal.goal_constraints @ state.equalities); - let env = Env.add_module goal.goal_var candidate_mty env in - let equalities, env = - try Equalities.refine flexible env (eqs @ goal.goal_constraints @ state.equalities) - with _ -> raise Invalid_candidate + List.map (fun root -> root, mk_var root) goal.roots + + let print_roots ppf goal = + let open Format in + let rec print_spine ppf = function + | Path.Pident var -> Printtyp.ident ppf var + | Path.Pdot (p', s, _) -> fprintf ppf "%a.%s" print_spine p' s + | Path.Papply (p1, Path.Pident var, Asttypes.Implicit) -> + fprintf ppf "%a{%a}" print_spine p1 print_var var + | Path.Papply (p1, _, _) -> assert false + and print_var ppf var = + match Tbl.find var goal.bound with + | exception Not_found -> fprintf ppf "?%a" Printtyp.ident var + | path -> print_spine ppf path in + let print_binding root = + fprintf ppf "@[%a = %a@]\n" Printtyp.ident root print_var root in + List.iter print_binding goal.roots - (* Keep new equations potentially added to top variables *) - let state = {state with equalities; flexible; env} in - match sub_goals with - | [] -> - `Done {state with payload = path} - | goal :: sub_goals -> - let debug_path = state.debug_path in - let partial = {state with payload = (path, sub_goals)} in - let termination = Termination.add_goal state.env goal state.termination in - printf "Termination: %s\n%!" - (Termination.explain state.env flexible goal termination); - if not (Termination.can_enter state.env flexible goal termination) then - raise (Terminate (Termination.explain state.env flexible goal termination)); - let state = {state with goal; termination; debug_path = path :: debug_path} in - `Step (partial, state) - - let rec step state = function - | [] -> raise Not_found + let print_candidate ppf (path, params, _) = + Printtyp.path ppf path; + List.iter (fun _param -> Format.fprintf ppf "{_}") params + + let rec bind_candidates acc goal var = function + | [] -> List.rev acc | candidate :: candidates -> - try - step0 state candidate, candidates - with - | Terminate msg as exn -> - printf "%s\n%!" msg; - raise exn - | Invalid_candidate -> - printf "Skipping candidate\n%!"; - step state candidates - | exn -> - report_error "Exception while testing candidate: " exn; - step state candidates - - let apply partial arg = - let partial_path, sub_goals = partial.payload in - let arg_path = arg.payload in - let flexible = arg.flexible in - let equalities = arg.equalities in - let path = papply partial_path arg_path in - match sub_goals with - | [] -> - let state = {partial with - (* We get the equations from the argument but keep - termination state from the parent *) - env = arg.env; - payload = path; flexible; equalities} in - `Done state - | goal :: sub_goals -> - let partial = {partial with payload = (path, sub_goals) } in - let debug_path = path :: partial.debug_path in - let arg = {arg with payload = (); goal; debug_path} in - `Step (partial, arg) + let acc = match bind_candidate goal var candidate with + | goal' -> goal' :: acc + | exception exn -> + printf "Cannot bind @[%a <- %a@]: %a\n" + Printtyp.ident var + print_candidate candidate + safe_report_exn exn; + acc + in + bind_candidates acc goal var candidates end -module Solution = struct +module Backtrack = struct - type t = { - (* The original query *) - query: Search.query; + let search candidates goal vars fold acc = + let rec conjunction acc goal = function + | [] -> fold goal acc + | var :: vars -> + disjunction vars acc + (Search.bind_candidates [] goal var candidates) - (* If we want to resume search, start from these candidates *) - next: Search.candidate list; - - (* Intermediate steps with solutions to subqueries *) - steps: (Search.partial * t) list; - - result: Search.result; - } - - let rec search query = - search_candidates query (Search.all_candidates query) - - and search_candidates query candidates = - let step, next = Search.step query candidates in - try search_arguments query next [] step - with Not_found -> - search_candidates query next - - and search_arguments query next steps = function - | `Done result -> - {query; next; steps; result} - | `Step (partial,subquery) -> - apply_argument query next steps partial (search subquery) - - and apply_argument query next steps partial solution = - search_arguments query next - ((partial, solution) :: steps) - (Search.apply partial solution.result) - - let rec search_next_steps solution = function - | ((partial, step) :: steps) -> - begin try - let {query; next; _} = solution in - apply_argument query next steps partial (search_next step) - with Not_found -> - search_next_steps solution steps - end - | [] -> - search_candidates solution.query solution.next + and disjunction vars acc = function + | [] -> acc + | (newvars, goal) :: alternatives -> + disjunction vars + (conjunction acc goal (newvars @ vars)) + alternatives - and search_next solution = search_next_steps solution solution.steps + in + conjunction acc goal vars - let get {result} = Search.get result end -let rec canonical_path env path = - try - let md = Env.find_module path env in - match md.Types.md_type with - | Mty_alias path -> canonical_path env path - | _ -> match path with - | Path.Pident _ -> path - | Path.Pdot (p1,s,pos) -> - let p1' = canonical_path env p1 in - if p1 == p1' then - path - else - Path.Pdot (p1', s, pos) - | Path.Papply (p1, p2, i) -> - let p1' = canonical_path env p1 - and p2' = canonical_path env p2 in - if p1' == p1 && p2 == p2' then - path - else - Path.Papply (p1', p2', i) - with Not_found -> - (*?!*) - path +let canonical_candidates env = + let seen = Hashtbl.create 7 in + let rec aux acc = function + | [] -> acc + | (path, params, mty) :: xs -> + let path = Env.normalize_path None env path in + let acc = + if Hashtbl.mem seen path then acc else ( + Hashtbl.add seen path (); + (path, params, mty) :: acc + ) + in + aux acc xs + in + aux [] (Env.implicit_instances env) let find_pending_instance inst = let snapshot = Btype.snapshot () in - let vars, goal = goal_of_pending inst in - let env = inst.implicit_env in - let env = List.fold_left (fun env (_ty,ident) -> - (* Create a fake abstract type declaration for name. *) - let level = get_current_level () in - let decl = { - type_params = []; - type_arity = 0; - type_kind = Type_abstract; - type_private = Asttypes.Public; - type_manifest = None; - type_variance = []; - type_newtype_level = Some (level, level); - type_loc = Location.none; - type_attributes = []; - } - in - Env.add_type ~check:false ident decl env - ) env vars + let env, flexible, var, mty, cstrs = Pending.prepare inst in + (*let loc = inst.implicit_loc in*) + let goal = Search.make env flexible [var, mty] cstrs in + let candidates = canonical_candidates env in + let solution = Backtrack.search candidates goal [var] + (fun solution solutions -> + match solutions with + | solution' :: _ -> failwith "Ambiguous_implicit" + | [] -> [solution]) + [] in - let loc = inst.implicit_loc in - let query = Search.start env (List.map snd vars) goal in - try - let solution = Solution.search query in - let path = Solution.get solution in - let reference = canonical_path env path in - let rec check_alternatives solution = - match (try Some (Solution.search_next solution) - with _ -> None) - with - | Some alternative -> - let path' = Solution.get alternative in - let reference' = canonical_path env (Solution.get alternative) in - if reference = reference' then - check_alternatives alternative - else - raise Typecore.(Error (loc, env, Ambiguous_implicit (inst,path,path'))) - | None -> () - in - check_alternatives solution; - Btype.backtrack snapshot; - Link.to_path inst path; - true - with - | Terminate msg -> - printf "%s\n%!" msg; - raise Typecore.(Error (loc, env, Termination_fail inst)) - | Not_found -> - false + Btype.backtrack snapshot; + match solution with + | [] -> false + | [solution] -> + let path = List.assoc var (Search.construct_paths solution) in + Link.to_path inst path; + true + | _ -> assert false (* Pack module at given path to match a given implicit instance and update the instance to point to this module. From 888dcc12c15db7862d390207500d964c8d27be7d Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Tue, 23 Feb 2016 17:34:39 +0900 Subject: [PATCH 475/494] Move implicit packing to Typeimplicit --- .depend | 30 ++++++++++----- Makefile | 6 +-- typing/implicitsearch.ml | 80 ---------------------------------------- typing/typeimplicit.ml | 80 +++++++++++++++++++++++++++++++++++++--- 4 files changed, 99 insertions(+), 97 deletions(-) diff --git a/.depend b/.depend index 38ffae7992..7989cd481d 100644 --- a/.depend +++ b/.depend @@ -69,7 +69,8 @@ parsing/location.cmx : utils/warnings.cmx utils/terminfo.cmx \ parsing/location.cmi parsing/longident.cmo : utils/misc.cmi parsing/asttypes.cmi \ parsing/longident.cmi -parsing/longident.cmx : utils/misc.cmx parsing/longident.cmi +parsing/longident.cmx : utils/misc.cmx parsing/asttypes.cmi \ + parsing/longident.cmi parsing/parse.cmo : parsing/syntaxerr.cmi parsing/parser.cmi \ parsing/location.cmi parsing/lexer.cmi parsing/docstrings.cmi \ parsing/parse.cmi @@ -119,7 +120,7 @@ typing/includecore.cmi : typing/types.cmi typing/typedtree.cmi \ typing/ident.cmi typing/env.cmi typing/includemod.cmi : typing/types.cmi typing/typedtree.cmi \ typing/path.cmi parsing/location.cmi typing/includecore.cmi \ - typing/ident.cmi typing/env.cmi typing/ctype.cmi parsing/asttypes.cmi + typing/ident.cmi typing/env.cmi typing/ctype.cmi typing/mtype.cmi : typing/types.cmi typing/path.cmi typing/ident.cmi \ typing/env.cmi typing/oprint.cmi : typing/outcometree.cmi @@ -127,7 +128,8 @@ typing/outcometree.cmi : parsing/asttypes.cmi typing/parmatch.cmi : typing/types.cmi typing/typedtree.cmi \ parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ typing/env.cmi parsing/asttypes.cmi -typing/path.cmi : parsing/longident.cmi typing/ident.cmi +typing/path.cmi : parsing/longident.cmi typing/ident.cmi \ + parsing/asttypes.cmi typing/predef.cmi : typing/types.cmi typing/path.cmi typing/ident.cmi typing/primitive.cmi : typing/printtyp.cmi : typing/types.cmi typing/path.cmi \ @@ -273,8 +275,10 @@ typing/parmatch.cmx : utils/warnings.cmx typing/types.cmx \ parsing/location.cmx typing/ident.cmx typing/env.cmx typing/ctype.cmx \ typing/btype.cmx parsing/asttypes.cmi parsing/ast_helper.cmx \ typing/parmatch.cmi -typing/path.cmo : parsing/longident.cmi typing/ident.cmi typing/path.cmi -typing/path.cmx : parsing/longident.cmx typing/ident.cmx typing/path.cmi +typing/path.cmo : parsing/longident.cmi typing/ident.cmi \ + parsing/asttypes.cmi typing/path.cmi +typing/path.cmx : parsing/longident.cmx typing/ident.cmx \ + parsing/asttypes.cmi typing/path.cmi typing/predef.cmo : typing/types.cmi typing/path.cmi parsing/location.cmi \ typing/ident.cmi typing/btype.cmi parsing/asttypes.cmi typing/predef.cmi typing/predef.cmx : typing/types.cmx typing/path.cmx parsing/location.cmx \ @@ -371,6 +375,14 @@ typing/typedecl.cmx : utils/warnings.cmx typing/typetexp.cmx \ typing/ident.cmx typing/env.cmx typing/ctype.cmx utils/config.cmx \ utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi \ parsing/ast_helper.cmx typing/typedecl.cmi +typing/typedtreeIter.cmo : typing/typedtree.cmi parsing/asttypes.cmi \ + typing/typedtreeIter.cmi +typing/typedtreeIter.cmx : typing/typedtree.cmx parsing/asttypes.cmi \ + typing/typedtreeIter.cmi +typing/typedtreeMap.cmo : typing/typedtree.cmi utils/misc.cmi \ + typing/typedtreeMap.cmi +typing/typedtreeMap.cmx : typing/typedtree.cmx utils/misc.cmx \ + typing/typedtreeMap.cmi typing/typedtree.cmo : typing/types.cmi typing/primitive.cmi typing/path.cmi \ parsing/parsetree.cmi utils/misc.cmi parsing/longident.cmi \ parsing/location.cmi typing/ident.cmi typing/env.cmi parsing/asttypes.cmi \ @@ -389,12 +401,12 @@ typing/typedtreeMap.cmx : typing/typedtree.cmx utils/misc.cmx \ typing/typedtreeMap.cmi typing/typeimplicit.cmo : typing/types.cmi typing/typedtree.cmi \ typing/subst.cmi typing/path.cmi parsing/longident.cmi \ - parsing/location.cmi typing/ident.cmi typing/env.cmi typing/ctype.cmi \ - typing/btype.cmi + parsing/location.cmi typing/includemod.cmi typing/ident.cmi \ + typing/env.cmi typing/ctype.cmi typing/btype.cmi parsing/asttypes.cmi typing/typeimplicit.cmx : typing/types.cmx typing/typedtree.cmx \ typing/subst.cmx typing/path.cmx parsing/longident.cmx \ - parsing/location.cmx typing/ident.cmx typing/env.cmx typing/ctype.cmx \ - typing/btype.cmx + parsing/location.cmx typing/includemod.cmx typing/ident.cmx \ + typing/env.cmx typing/ctype.cmx typing/btype.cmx parsing/asttypes.cmi typing/typemod.cmo : utils/warnings.cmi typing/typetexp.cmi typing/types.cmi \ typing/typeimplicit.cmo typing/typedtree.cmi typing/typedecl.cmi \ typing/typecore.cmi typing/typeclass.cmi typing/subst.cmi \ diff --git a/Makefile b/Makefile index 5dd7bf36bc..a5995ce05b 100644 --- a/Makefile +++ b/Makefile @@ -55,11 +55,11 @@ TYPING=typing/ident.cmo typing/path.cmo \ typing/subst.cmo typing/predef.cmo \ typing/datarepr.cmo typing/cmi_format.cmo typing/env.cmo \ typing/typedtree.cmo typing/printtyped.cmo typing/ctype.cmo \ - typing/typeimplicit.cmo typing/printtyp.cmo typing/includeclass.cmo \ + typing/printtyp.cmo typing/includeclass.cmo \ typing/mtype.cmo typing/envaux.cmo typing/includecore.cmo \ typing/typedtreeIter.cmo typing/typedtreeMap.cmo typing/cmt_format.cmo \ - typing/includemod.cmo typing/typetexp.cmo typing/parmatch.cmo \ - typing/stypes.cmo typing/typecore.cmo \ + typing/includemod.cmo typing/typeimplicit.cmo typing/typetexp.cmo \ + typing/parmatch.cmo typing/stypes.cmo typing/typecore.cmo \ typing/typedecl.cmo typing/typeclass.cmo \ typing/typemod.cmo typing/implicitsearch.cmo diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index b61a99bbfe..f047337826 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -739,86 +739,6 @@ let find_pending_instance inst = true | _ -> assert false -(* Pack module at given path to match a given implicit instance and - update the instance to point to this module. - Return the correct package if any. -*) -let pack_implicit inst path = - let { implicit_type = p,nl,tl; - implicit_env = env; - implicit_loc = loc } = inst in - let rec translpath = function - | Path.Pident _ | Path.Pdot _ as path -> - let md = Env.find_module path env in - let lident = Location.mkloc (Path.to_longident path) loc in - { - mod_desc = Tmod_ident (path, lident); - mod_loc = loc; - mod_type = md.md_type; - mod_env = env; - mod_attributes = []; - } - | Path.Papply (p1, p2, i) -> - let mfun = translpath p1 and marg = translpath p2 in - let rec loop acc mty = - match mty with - | Mty_functor (param, mty_res) -> - let param, mty_param = - match param with - | Mpar_generative -> assert false - | Mpar_applicative(param, mty_param) - | Mpar_implicit(_, param, mty_param) -> - param, mty_param - in - let coercion = Includemod.modtypes env marg.mod_type mty_param in - let mty_appl = - Subst.modtype - (Subst.add_module param p2 Subst.identity) mty_res - in - let marg = - match i with - | Asttypes.Nonimplicit -> Tmarg_applicative(marg, coercion) - | Asttypes.Implicit -> Tmarg_implicit(marg, coercion) - in - { mod_desc = Tmod_apply(acc, marg); - mod_type = mty_appl; - mod_env = env; - mod_attributes = []; - mod_loc = loc; - } - | Mty_ident path -> - let mty = Includemod.expand_module_path env [] path in - loop acc mty - | Mty_alias path -> - let path = Env.normalize_path (Some loc) env path in - let mty = Includemod.expand_module_alias env [] path in - let acc = - { mod_desc = Tmod_constraint (acc, mty, Tmodtype_implicit, - Tcoerce_alias (path, Tcoerce_none)); - mod_type = mty; - mod_env = env; - mod_attributes = []; - mod_loc = loc; - } - in - loop acc mty - | _ -> assert false - in - loop mfun mfun.mod_type - in - let modl = translpath path in - let (modl, tl') = !type_implicit_instance env modl p nl tl in - { - exp_desc = Texp_pack modl; - exp_loc = loc; exp_extra = []; - exp_type = newty (Tpackage (p, nl, tl')); - exp_attributes = []; - exp_env = env; - } - -let () = - Typeimplicit.pack_implicit_ref := pack_implicit - let generalize_implicits () = let current_level = get_current_level () in let not_linked = function diff --git a/typing/typeimplicit.ml b/typing/typeimplicit.ml index 0a42e73454..06349b4074 100644 --- a/typing/typeimplicit.ml +++ b/typing/typeimplicit.ml @@ -149,12 +149,82 @@ let instantiate_one_implicit loc env id ty_arg ty_res = inst -let pack_implicit_ref - : (pending_implicit -> Path.t -> Typedtree.expression) ref - = ref (fun _ _ -> assert false) - +(* Pack module at given path to match a given implicit instance and + update the instance to point to this module. + Return the correct package if any. +*) let pack_implicit inst path = - !pack_implicit_ref inst path + let { implicit_type = p,nl,tl; + implicit_env = env; + implicit_loc = loc } = inst in + let rec translpath = function + | Path.Pident _ | Path.Pdot _ as path -> + let md = Env.find_module path env in + let lident = Location.mkloc (Path.to_longident path) loc in + { + mod_desc = Tmod_ident (path, lident); + mod_loc = loc; + mod_type = md.md_type; + mod_env = env; + mod_attributes = []; + } + | Path.Papply (p1, p2, i) -> + let mfun = translpath p1 and marg = translpath p2 in + let rec loop acc mty = + match mty with + | Mty_functor (param, mty_res) -> + let param, mty_param = + match param with + | Mpar_generative -> assert false + | Mpar_applicative(param, mty_param) + | Mpar_implicit(_, param, mty_param) -> + param, mty_param + in + let coercion = Includemod.modtypes env marg.mod_type mty_param in + let mty_appl = + Subst.modtype + (Subst.add_module param p2 Subst.identity) mty_res + in + let marg = + match i with + | Asttypes.Nonimplicit -> Tmarg_applicative(marg, coercion) + | Asttypes.Implicit -> Tmarg_implicit(marg, coercion) + in + { mod_desc = Tmod_apply(acc, marg); + mod_type = mty_appl; + mod_env = env; + mod_attributes = []; + mod_loc = loc; + } + | Mty_ident path -> + let mty = Includemod.expand_module_path env [] path in + loop acc mty + | Mty_alias path -> + let path = Env.normalize_path (Some loc) env path in + let mty = Includemod.expand_module_alias env [] path in + let acc = + { mod_desc = Tmod_constraint (acc, mty, Tmodtype_implicit, + Tcoerce_alias (path, Tcoerce_none)); + mod_type = mty; + mod_env = env; + mod_attributes = []; + mod_loc = loc; + } + in + loop acc mty + | _ -> assert false + in + loop mfun mfun.mod_type + in + let modl = translpath path in + let (modl, tl') = !type_implicit_instance env modl p nl tl in + { + exp_desc = Texp_pack modl; + exp_loc = loc; exp_extra = []; + exp_type = newty (Tpackage (p, nl, tl')); + exp_attributes = []; + exp_env = env; + } module Link = struct (* Link a pending implicit to the module at specified path. From b5105039dbf4fc6bd38b6108483364a925a19d29 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Tue, 23 Feb 2016 17:35:29 +0900 Subject: [PATCH 476/494] Implicit constraints can be discovered during inclusion test --- typing/implicitsearch.ml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index f047337826..fb9b7a6df5 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -602,8 +602,8 @@ module Search = struct (* Update environment *) let env = List.fold_left introduce_var goal.env params in (* Update set of flexible variables *) - assert (Tbl.mem var goal.flexible); - let flexible = Tbl.remove var goal.flexible in + let flexible = goal.flexible in + assert (Tbl.mem var flexible); let flexible = List.fold_left add_ident flexible newvars in (* Check inclusion relation, collect constraints on parameters *) let (_ : module_coercion), equalities = @@ -612,6 +612,10 @@ module Search = struct Ctype.collect_equalities ~on:flexible (fun () -> Includemod.modtypes env mty1 mty2) in + (* Rigidify module after inclusion check: inclusion can introduce new + constraints on the module itself, e.g. when discovering associated + types. *) + let flexible = Tbl.remove var flexible in (* Bind concrete module *) let env = Env.add_module var mty env in (* Propagate constraints *) From 31ff04df52a1c8d438318a380914aad2d60cacc6 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Tue, 23 Feb 2016 17:45:04 +0900 Subject: [PATCH 477/494] Raise Ambiguous_implicit error --- typing/implicitsearch.ml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index fb9b7a6df5..2db08b40b5 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -724,13 +724,21 @@ let canonical_candidates env = let find_pending_instance inst = let snapshot = Btype.snapshot () in let env, flexible, var, mty, cstrs = Pending.prepare inst in - (*let loc = inst.implicit_loc in*) + let loc = inst.implicit_loc in let goal = Search.make env flexible [var, mty] cstrs in + let goal_path solution = + List.assoc var (Search.construct_paths solution) + in let candidates = canonical_candidates env in let solution = Backtrack.search candidates goal [var] (fun solution solutions -> match solutions with - | solution' :: _ -> failwith "Ambiguous_implicit" + | solution' :: _ -> + let open Typecore in + raise (Error (loc, inst.implicit_env, + Ambiguous_implicit (inst, + goal_path solution, + goal_path solution'))) | [] -> [solution]) [] in From 78cf7e81a55acdcebf88fd0363c5714fcfeb5736 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Tue, 23 Feb 2016 17:45:15 +0900 Subject: [PATCH 478/494] Update testsuite --- .../arithmetic.ml.reference | 31 ++++ .../implicits.ml.reference | 34 +++++ .../monad.ml.reference | 39 +++++ .../tests/typing-modular_implicits/number.ml | 10 +- .../number.ml.reference | 39 +++++ .../parameters_wellformedness.ml.reference | 134 ++++++++++++++++++ .../tests/typing-modular_implicits/show.ml | 1 + .../show.ml.reference | 20 +++ 8 files changed, 303 insertions(+), 5 deletions(-) create mode 100644 testsuite/tests/typing-modular_implicits/arithmetic.ml.reference create mode 100644 testsuite/tests/typing-modular_implicits/implicits.ml.reference create mode 100644 testsuite/tests/typing-modular_implicits/monad.ml.reference create mode 100644 testsuite/tests/typing-modular_implicits/number.ml.reference create mode 100644 testsuite/tests/typing-modular_implicits/parameters_wellformedness.ml.reference create mode 100644 testsuite/tests/typing-modular_implicits/show.ml.reference diff --git a/testsuite/tests/typing-modular_implicits/arithmetic.ml.reference b/testsuite/tests/typing-modular_implicits/arithmetic.ml.reference new file mode 100644 index 0000000000..357a697a48 --- /dev/null +++ b/testsuite/tests/typing-modular_implicits/arithmetic.ml.reference @@ -0,0 +1,31 @@ + +# type z = Z +type 'n s = S of 'n +module type N = sig type n val n : n end +implicit module Z : sig type n = z val n : n end +implicit module S : functor {N : N} -> sig type n = N.n s val n : n end +module type ADD = sig type a and b and c val a : a val b : b val c : c end +val add : {Add : ADD} -> Add.a -> Add.b -> Add.c = <fun> +implicit module AddZ : + functor {B : N} -> + sig type a = z and b = B.n and c = B.n val a : a val b : b val c : c end +implicit module AddS : + functor + {A : N} {B : N} {Add : sig + type a = A.n + and b = B.n + and c + val a : a + val b : b + val c : c + end} -> + sig + type a = A.n s + and b = B.n + and c = Add.c s + val a : a + val b : b + val c : c + end +# * - : AddS{Z}{Z}{AddZ{Z}}.c = S Z +# diff --git a/testsuite/tests/typing-modular_implicits/implicits.ml.reference b/testsuite/tests/typing-modular_implicits/implicits.ml.reference new file mode 100644 index 0000000000..0d37b8b15c --- /dev/null +++ b/testsuite/tests/typing-modular_implicits/implicits.ml.reference @@ -0,0 +1,34 @@ + +# module type T = sig type t val x : t end +# Characters 69-72: + let g {M : T} () = x := [M.x] in + ^^^ +Error: This expression has type M.t but an expression was expected of type + M.t + The type constructor M.t would escape its scope +# Characters 39-40: + (x : M.t); + ^ +Error: This expression has type M.t but an expression was expected of type + M.t + The type constructor M.t would escape its scope +# Characters 40-49: + (y : M.t); + ^^^^^^^^^ +Warning 10: this expression should have type unit. +val f : {M : T} -> M.t -> M.t -> unit = <fun> +# val f : {M : T} -> M.t -> unit = <fun> +# Characters 44-53: + (y : M.t); + ^^^^^^^^^ +Warning 10: this expression should have type unit. +val f : {M : T} -> M.t -> M.t -> unit = <fun> +# Characters 57-66: + fun {M : T} (x : M.t) -> ();; + ^^^^^^^^^ +Error: This pattern matches values of type M.t + but a pattern was expected which matches values of type M.t + The type constructor M.t would escape its scope +# val f : ({M : T} -> M.t -> unit) -> unit -> unit = <fun> +# val f : {M : T} -> {N : T} -> N.t = <fun> +# diff --git a/testsuite/tests/typing-modular_implicits/monad.ml.reference b/testsuite/tests/typing-modular_implicits/monad.ml.reference new file mode 100644 index 0000000000..8c42d9b880 --- /dev/null +++ b/testsuite/tests/typing-modular_implicits/monad.ml.reference @@ -0,0 +1,39 @@ + +# module type Monad = + sig + type 'a t + val return : 'a -> 'a t + val bind : 'a t -> ('a -> 'b t) -> 'b t + end +# val return : {M : Monad} -> 'a -> 'a M.t = <fun> +# val ( >>= ) : {M : Monad} -> 'a M.t -> ('a -> 'b M.t) -> 'b M.t = <fun> +# implicit module ListMonad : + sig + type 'a t = 'a list + val return : 'a -> 'a list + val bind : 'a list -> ('a -> 'b list) -> 'b list + end +# implicit module OptionMonad : + sig + type 'a t = 'a option + val return : 'a -> 'a option + val bind : 'a option -> ('a -> 'b option) -> 'b option + end +# Characters 36-39: + let a = (return 5) >>= fun x -> return x;; + ^^^ +Error: Ambiguous implicit M: OptionMonad and ListMonad +are both solutions. +# val l : int list = [5] +# val o : int option = Some 5 +# val m : int ListMonad.t = [1; 2; 3] +# val n : int list = [5; 2; 3] +# val sequence : {M : Monad} -> 'a M.t list -> 'a list M.t = <fun> +# val sequence : {M : Monad} -> 'a M.t list -> 'a list M.t = <fun> +# val sequence : {M : Monad} -> 'a M.t list -> 'a list M.t = <fun> +# val sequence : {M : Monad} -> 'a M.t list -> 'a list M.t = <fun> +# val sequence : {M : Monad} -> 'a M.t list -> 'a list M.t = <fun> +# val sequence : {M : Monad} -> 'a M.t list -> 'a list M.t = <fun> +# val sequence : {M : Monad} -> 'a M.t list -> 'a list M.t = <fun> +# val sequence : {M : Monad} -> 'a M.t list -> 'a list M.t = <fun> +# diff --git a/testsuite/tests/typing-modular_implicits/number.ml b/testsuite/tests/typing-modular_implicits/number.ml index 5df5ce510e..e46e2cafea 100644 --- a/testsuite/tests/typing-modular_implicits/number.ml +++ b/testsuite/tests/typing-modular_implicits/number.ml @@ -7,11 +7,11 @@ module type Num = sig val (~- ) : t -> t end;; -let ( + ) (implicit N : Num) = N.( + );; -let ( - ) (implicit N : Num) = N.( - );; -let ( * ) (implicit N : Num) = N.( * );; -let ( / ) (implicit N : Num) = N.( / );; -let (~- ) (implicit N : Num) = N.(~- );; +let ( + ) {N : Num} = N.( + );; +let ( - ) {N : Num} = N.( - );; +let ( * ) {N : Num} = N.( * );; +let ( / ) {N : Num} = N.( / );; +let (~- ) {N : Num} = N.(~- );; implicit module Int = struct type t = int diff --git a/testsuite/tests/typing-modular_implicits/number.ml.reference b/testsuite/tests/typing-modular_implicits/number.ml.reference new file mode 100644 index 0000000000..4d7cc90602 --- /dev/null +++ b/testsuite/tests/typing-modular_implicits/number.ml.reference @@ -0,0 +1,39 @@ + +# module type Num = + sig + type t + val ( + ) : t -> t -> t + val ( - ) : t -> t -> t + val ( * ) : t -> t -> t + val ( / ) : t -> t -> t + val ( ~- ) : t -> t + end +# val ( + ) : {N : Num} -> N.t -> N.t -> N.t = <fun> +# val ( - ) : {N : Num} -> N.t -> N.t -> N.t = <fun> +# val ( * ) : {N : Num} -> N.t -> N.t -> N.t = <fun> +# val ( / ) : {N : Num} -> N.t -> N.t -> N.t = <fun> +# val ( ~- ) : {N : Num} -> N.t -> N.t = <fun> +# implicit module Int : + sig + type t = int + val ( + ) : int -> int -> int + val ( - ) : int -> int -> int + val ( * ) : int -> int -> int + val ( / ) : int -> int -> int + val ( ~- ) : int -> int + end +# implicit module Float : + sig + type t = float + val ( + ) : float -> float -> float + val ( - ) : float -> float -> float + val ( * ) : float -> float -> float + val ( / ) : float -> float -> float + val ( ~- ) : float -> float + end +# val x : int = 6 +# val y : float = 6.55161290322580747 +# val sq : {N : Num} -> N.t -> N.t = <fun> +# val a : float = 24.0100000000000051 +# val b : int = 36 +# diff --git a/testsuite/tests/typing-modular_implicits/parameters_wellformedness.ml.reference b/testsuite/tests/typing-modular_implicits/parameters_wellformedness.ml.reference new file mode 100644 index 0000000000..b301ee7edd --- /dev/null +++ b/testsuite/tests/typing-modular_implicits/parameters_wellformedness.ml.reference @@ -0,0 +1,134 @@ + +# module Pure1_ok : functor {X : Map.OrderedType} -> sig val test : string end +# Characters 17-75: + ................{X : Map.OrderedType} = struct + let test = ref "test" + end.. +Error: Body of a implicit functor should be pure. +# module Pure2_ok : + functor {X : Map.OrderedType} -> + sig + module M : + functor () -> + sig + type key = X.t + type 'a t = 'a Map.Make(X).t + val empty : '_a t + val is_empty : '_a t -> bool + val mem : key -> '_a t -> bool + val add : key -> '_a -> '_a t -> '_a t + val singleton : key -> '_a -> '_a t + val remove : key -> '_a t -> '_a t + val merge : + (key -> '_a option -> '_b option -> '_c option) -> + '_a t -> '_b t -> '_c t + val compare : ('_a -> '_a -> int) -> '_a t -> '_a t -> int + val equal : ('_a -> '_a -> bool) -> '_a t -> '_a t -> bool + val iter : (key -> '_a -> unit) -> '_a t -> unit + val fold : (key -> '_a -> '_b -> '_b) -> '_a t -> '_b -> '_b + val for_all : (key -> '_a -> bool) -> '_a t -> bool + val exists : (key -> '_a -> bool) -> '_a t -> bool + val filter : (key -> '_a -> bool) -> '_a t -> '_a t + val partition : (key -> '_a -> bool) -> '_a t -> '_a t * '_a t + val cardinal : '_a t -> int + val bindings : '_a t -> (key * '_a) list + val min_binding : '_a t -> key * '_a + val max_binding : '_a t -> key * '_a + val choose : '_a t -> key * '_a + val split : key -> '_a t -> '_a t * '_a option * '_a t + val find : key -> '_a t -> '_a + val map : ('_a -> '_b) -> '_a t -> '_b t + val mapi : (key -> '_a -> '_b) -> '_a t -> '_b t + end + end +# Characters 17-76: + ................{X : Map.OrderedType} = struct + module M = Map.Make(X) + end.. +Error: Body of a implicit functor should be pure. +# module Pure3_ok : + functor {X : Map.OrderedType} -> + sig + module P : + sig + module M : + functor () -> + sig + type key = X.t + type 'a t = 'a Map.Make(X).t + val empty : '_a t + val is_empty : '_a t -> bool + val mem : key -> '_a t -> bool + val add : key -> '_a -> '_a t -> '_a t + val singleton : key -> '_a -> '_a t + val remove : key -> '_a t -> '_a t + val merge : + (key -> '_a option -> '_b option -> '_c option) -> + '_a t -> '_b t -> '_c t + val compare : ('_a -> '_a -> int) -> '_a t -> '_a t -> int + val equal : ('_a -> '_a -> bool) -> '_a t -> '_a t -> bool + val iter : (key -> '_a -> unit) -> '_a t -> unit + val fold : (key -> '_a -> '_b -> '_b) -> '_a t -> '_b -> '_b + val for_all : (key -> '_a -> bool) -> '_a t -> bool + val exists : (key -> '_a -> bool) -> '_a t -> bool + val filter : (key -> '_a -> bool) -> '_a t -> '_a t + val partition : + (key -> '_a -> bool) -> '_a t -> '_a t * '_a t + val cardinal : '_a t -> int + val bindings : '_a t -> (key * '_a) list + val min_binding : '_a t -> key * '_a + val max_binding : '_a t -> key * '_a + val choose : '_a t -> key * '_a + val split : key -> '_a t -> '_a t * '_a option * '_a t + val find : key -> '_a t -> '_a + val map : ('_a -> '_b) -> '_a t -> '_b t + val mapi : (key -> '_a -> '_b) -> '_a t -> '_b t + end + end + module M = P.M + end +# Characters 17-95: + ................{X : Map.OrderedType} = struct + module P = Pure2_ok{X} + module M = P.M() + end.. +Error: Body of a implicit functor should be pure. +# module Escape1_ok : + functor {X : sig type t val x : t end} -> sig type t = X.t val x : t end +# Characters 19-76: + ..................{X : sig type t val x : t end} = struct + let x = X.x + end.. +Error: Types of values cannot depend on an implicit parameter. +# module Virtual0_ok : functor {virtual X : sig end} -> sig end +# module Virtual1_ok : functor {virtual X : sig type t end} -> sig end +# Characters 20-66: + module Virtual1_ko {virtual X : sig val x : int end} = struct end;; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Virtual parameters can only contain types. +# module Virtual2_ok : + functor {virtual X : sig module X : sig end end} -> sig end +# module Virtual3_ok : + functor {virtual X : sig module X : sig type t end end} -> sig end +# Characters 20-85: + module Virtual3_ko {virtual X : sig module X : sig val x : int end end} = struct end;; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Virtual parameters can only contain types. +# Characters 157-218: + functor {X : sig type t val x : t end} -> sig val x : X.t end + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Types of values cannot depend on an implicit parameter. +# module type Virtual1_ok = functor {virtual X : sig type t end} -> sig end +# Characters 27-79: + module type Virtual1_ko = functor {virtual X : sig val x : int end} -> sig end;; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Virtual parameters can only contain types. +# module type Virtual2_ok = + functor {virtual X : sig module X : sig end end} -> sig end +# module type Virtual3_ok = + functor {virtual X : sig module X : sig type t end end} -> sig end +# Characters 27-98: + module type Virtual3_ko = functor {virtual X : sig module X : sig val x : int end end} -> sig end;; + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Error: Virtual parameters can only contain types. +# diff --git a/testsuite/tests/typing-modular_implicits/show.ml b/testsuite/tests/typing-modular_implicits/show.ml index a7c741682d..993cc4ba57 100644 --- a/testsuite/tests/typing-modular_implicits/show.ml +++ b/testsuite/tests/typing-modular_implicits/show.ml @@ -43,3 +43,4 @@ let g (x : float) = show x;; let () = print_endline (g 5.5) +;; diff --git a/testsuite/tests/typing-modular_implicits/show.ml.reference b/testsuite/tests/typing-modular_implicits/show.ml.reference new file mode 100644 index 0000000000..61c4cae9e0 --- /dev/null +++ b/testsuite/tests/typing-modular_implicits/show.ml.reference @@ -0,0 +1,20 @@ + +# module type Show = sig type t val show : t -> string end +# val show : {S : Show} -> S.t -> string = <fun> +# val print : {S : Show} -> S.t -> unit = <fun> +# implicit module ShowString : + sig type t = string val show : string -> string end +# implicit module ShowInt : sig type t = int val show : int -> string end +# "4" +- : unit = () +# 5 +- : unit = () +# implicit module StringifyPair : + functor {A : Show} {B : Show} -> + sig type t = A.t * B.t val show : t -> string end +# [("hello",1); ("world",2)] +implicit module StringifyList : + functor {X : Show} -> sig type t = X.t list val show : t -> string end +# val g : float -> string = <fun> +# 5.5 +# From a8fe57511bf10902ae7bcbfe4c2f4b9bf3886ae1 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 24 Feb 2016 17:43:19 +0900 Subject: [PATCH 479/494] Termination check --- typing/implicitsearch.ml | 303 ++++++++++++++++++++++----------------- 1 file changed, 174 insertions(+), 129 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 2db08b40b5..1237bd2d7f 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -49,6 +49,9 @@ let safe_report_exn ppf exn = type identset = (Ident.t, unit) Tbl.t +type candidate = + (Path.t * (Ident.t * Types.module_type) list * Types.module_type) + let add_ident set id = Tbl.add id () set @@ -87,7 +90,9 @@ module Equalities = struct | [] -> true | x :: xs -> not (List.memq x xs) && uniq xs in - (* FIXME: No type variable should occur in rhs but not in tl *) + (* FIXME: No type variable should occur in rhs but not in tl. + Check Ctype.freevars inclusion + *) if uniq tl' then `Expansion (p, (tl', rhs, None), tl) else `None end | _ -> `None @@ -195,65 +200,27 @@ module Equalities = struct let refine flexible env eqs = refine flexible env [] eqs end -(** [goal] is the point from which a search starts *) -type goal = { - (* The module type we try to find an instance for *) - goal_type : Types.module_type; - (* The identifier to which the result of the search will be bound. - E.g we are trying to fill the hole in: - module %goal_id : %goal_type = _ *) - goal_var : Ident.t; - - (* Constraints that should be satisfied by a solution. That is when a - concrete module is bound to goal_var, equalities in goal_constraints - should be true. *) - goal_constraints : Equalities.t; - - (* A unique identifier that will be used for termination checking. When the - goal is the argument to a functor instantiation, if this functor is - instantiated multiple times we enforce that the constraints on the - argument are stronger. - - Pair (Arg_1) (Pair (Arg_1') (Arg_2)) - - Arg_1 and Arg_1' targets will have a different goal_var but the same - goal_uid. We check that constraints on Arg_1' are stronger than those - on Arg_1'. - - Note: This is also true of (Pair (Arg_1') (Arg_2)) and Arg_2, used as - second arguments to Pair. *) - goal_termination_id : Ident.t; -} - module Termination : sig (** The termination checker tracks all arguments to implicit functors. For an environment env and a flexible argument M, it will decides whether enough is known about M to allow searching for an instance. *) - type t - val empty : t - - val add_goal : Env.t -> goal -> t -> t + type symbol + val index : Env.t -> candidate -> symbol - val can_enter : Env.t -> (Ident.t, unit) Tbl.t -> goal -> t -> bool + type t + val empty : t - val explain : Env.t -> (Ident.t, unit) Tbl.t -> goal -> t -> string + val enter : Env.t -> symbol -> Ident.t list -> t -> t + val blocked : Env.t -> flexible:identset -> symbol -> t -> bool + val explain : Env.t -> flexible:identset -> symbol -> t -> string end = struct - type element = { - goal: goal; - decreasing: Path.t list; - } - - type chain = element list + (* Helpers *) - type t = (Ident.t, chain) Tbl.t + (* Structural ordering of types. *) - let empty = Tbl.empty - - (* Checking that an individial type is smaller than another one. - The exception never escapes. *) exception Type_is_smaller let smaller ?subst env t1 t2 : [`Smaller | `Equal | `Different] = let rec check_ty t = @@ -286,7 +253,9 @@ end = struct | `Smaller -> `Different (* t1 < t2 && t2 < t1 *) | _ -> `Smaller - let initial env goal = + (* Collection of paths in a module type *) + + let collect_type_paths env id mty = let rec collect_mty acc path = function | Mty_signature sg -> collect_sig acc path sg | Mty_functor _ -> acc @@ -297,7 +266,6 @@ end = struct | None -> acc | Some mty -> collect_mty acc path mty end - and collect_sig acc path = function | [] -> acc | x :: xs -> @@ -310,40 +278,74 @@ end = struct in collect_sig acc path xs in - let types = collect_mty [] (Path.Pident goal.goal_var) goal.goal_type in - { goal; decreasing = types } + collect_mty [] (Path.Pident id) mty let rec rewrite_path id = function | Path.Pident _ -> Path.Pident id | Path.Papply _ -> assert false | Path.Pdot (p, s, x) -> Path.Pdot (rewrite_path id p, s, x) - let refine env element goal = + (** Termination checker *) + + type symbol = { + (* UID *) + path: Path.t; + parameters: (Ident.t * Path.t list) list; + } + + let index env (path, params, _) = + let parameter (id, mty) = (id, collect_type_paths env id mty) in + { path; parameters = List.map parameter params } + + type instance = { + arguments: Ident.t list; + decreasing: (Path.t list) list; + } + + type chain = instance list + + let initial env symbol arguments = + let rewrite_paths argument (_id,paths) = + List.map (rewrite_path argument) paths + in + let decreasing = List.map2 rewrite_paths arguments symbol.parameters in + { arguments; decreasing } + + let refine_parameter env decreasing argument = let decreased p1 = - let p2 = rewrite_path goal.goal_var p1 in + let p2 = rewrite_path argument p1 in match smaller env p1 p2 with | `Smaller -> Some p2 | _ -> None in - {goal; decreasing = list_filtermap decreased element.decreasing} - - let add_goal env goal t = - let chain = - match Tbl.find goal.goal_termination_id t with - | exception Not_found -> [initial env goal] - | (x :: _) as xs -> refine env x goal :: xs - | [] -> assert false - in - Tbl.add goal.goal_termination_id chain t + list_filtermap decreased decreasing + + let refine_parameters env inst arguments = + let decreasing = + List.map2 (refine_parameter env) inst.decreasing arguments in + { arguments; decreasing } + + type t = (Path.t, chain) Tbl.t + + let empty = Tbl.empty + + let enter env symbol arguments t = + if symbol.parameters = [] then t else + let chain = + match Tbl.find symbol.path t with + | exception Not_found -> [initial env symbol arguments] + | (x :: _) as xs -> refine_parameters env x arguments :: xs + | [] -> assert false + in + Tbl.add symbol.path chain t let rec retry_chain env = function | [] -> assert false | [x] -> x | x :: xs -> let x' = retry_chain env xs in - refine env x' x.goal + refine_parameters env x' x.arguments - (* Raise Exit if a flexible type is found *) let non_flexible env flexible = let rec aux = function | Path.Pident id -> @@ -359,62 +361,82 @@ end = struct in let it = {Btype.type_iterators with Btype.it_path} in fun path -> - match Env.find_type_expansion path env with - | exception Not_found -> assert false - | (_, ty, _) -> - try - it.Btype.it_type_expr it ty; - Btype.unmark_type ty; - true - with Exit -> - Btype.unmark_type ty; - false - - let find_decreasing env flexible goal t = - match Tbl.find goal.goal_termination_id t with + match Env.find_type_expansion path env with + | exception Not_found -> assert false + | (_, ty, _) -> + try + it.Btype.it_type_expr it ty; + Btype.unmark_type ty; + true + with Exit -> + Btype.unmark_type ty; + false + + exception Decreasing of Path.t + + let find_decreasing env flexible symbol t = + match Tbl.find symbol.path t with | [] -> assert false | exception Not_found -> assert false - | [_] -> None + | [_] -> `Root | (x :: _) as xs -> - assert (x.goal == goal); let non_flexible = non_flexible env flexible in - let path = - try List.find non_flexible x.decreasing - with Not_found -> - List.find non_flexible (retry_chain env xs).decreasing + let try_instance inst = + try + List.iter + (List.iter (fun path -> + if non_flexible path then + raise (Decreasing path) + )) + inst.decreasing; + `None + with Decreasing p -> + `Decreasing p in - Some path + match try_instance x with + | `None -> try_instance (retry_chain env xs) + | x -> x - let can_enter env flexible goal t = - match find_decreasing env flexible goal t with - | exception Not_found -> false - | _ -> true + let blocked env ~flexible symbol t = + if symbol.parameters = [] then false else + match find_decreasing env flexible symbol t with + | `None -> true + | _ -> false - let explain env flexible goal t = + let explain env ~flexible symbol t = let print x = Format.fprintf Format.str_formatter x in - begin match find_decreasing env flexible goal t with - | None -> print "Termination succeeds: no nested call" - | Some x -> - print "Termination succeeds: %a is structurally decreasing" - Printtyp.path x - | exception Not_found -> - let x, x' = - match Tbl.find goal.goal_termination_id t with - | x :: x' :: _ -> x, x' - | [] | [_] -> assert false - in - let path = rewrite_path x.goal.goal_var (List.hd x'.decreasing) in - print "Cannot ensure termination: %a is not structurally decreasing, " - Printtyp.path path; - begin match Env.find_type_expansion path env with - | exception Not_found -> - print "nested occurrence is not constrained." - | (_, ty2, _) -> - let _, ty1, _ = Env.find_type_expansion path env in - print "%a is not smaller than %a." - Printtyp.type_expr ty2 - Printtyp.type_expr ty1 - end + if symbol.parameters = [] then + print "Termination succeeds: this is a ground module" + else begin + match find_decreasing env flexible symbol t with + | `Root -> print "Termination succeeds: no nested call" + | `Decreasing x -> + print "Termination succeeds: %a is structurally decreasing" + Printtyp.path x + | `None -> + let x, x' = + match Tbl.find symbol.path t with + | x :: x' :: _ -> x, x' + | [] | [_] -> assert false + in + let rec path arguments decreasing = + match arguments, decreasing with + | (id :: _), ((p :: _) :: _) -> rewrite_path id p + | (_ :: arguments), (_ :: decreasing) -> path arguments decreasing + | _ -> assert false + in + let path = path x.arguments x'.decreasing in + print "Cannot ensure termination: %a is not structurally decreasing, " + Printtyp.path path; + begin match Env.find_type_expansion path env with + | exception Not_found -> + print "nested occurrence is not constrained." + | (_, ty2, _) -> + let _, ty1, _ = Env.find_type_expansion path env in + print "%a is not smaller than %a." + Printtyp.type_expr ty2 + Printtyp.type_expr ty1 + end end; Format.flush_str_formatter () @@ -514,9 +536,6 @@ module Pending = struct end -type candidate = - (Path.t * (Ident.t * Types.module_type) list * Types.module_type) - module Search = struct type t = { @@ -527,7 +546,7 @@ module Search = struct At the beginning of the search, these are bound to abstract modules in [env]. In a successful search, they get bound to concrete modules. *) - blocked: Ident.t list; + blocked: (Termination.t * Termination.symbol * Ident.t list) list; flexible : identset; (* All paths on which new constraints can be introduced. *) @@ -565,11 +584,10 @@ module Search = struct let make env flexible vars equalities = let env = List.fold_left introduce_var env vars in let roots = List.map fst vars in - (*let vars = List.fold_left add_ident Tbl.empty roots in*) let flexible = List.fold_left add_ident flexible roots in let constraints, env = Equalities.refine flexible env [{Ctype. subst = []; equalities}] in - { (*vars;*) env; constraints; roots; flexible; + { env; constraints; roots; flexible; bound = Tbl.empty; blocked = []; } let instantiate_parameters (path, params, mty) = @@ -595,7 +613,7 @@ module Search = struct - if succeeds, update the goal. - raises an exception if candidate is not compatible *) - let bind_candidate goal var candidate = + let bind_candidate goal (term, var) (symbol, candidate) = (* Instantiate implicit parameters *) let path, params, mty = instantiate_parameters candidate in let newvars = List.map fst params in @@ -621,10 +639,17 @@ module Search = struct (* Propagate constraints *) let constraints, env = Equalities.refine flexible env (equalities @ goal.constraints) in + let term = Termination.enter env symbol newvars term in + let newvars, blocked = + if Termination.blocked env ~flexible symbol term then + [], ((term, symbol, newvars) :: goal.blocked) + else + List.map (fun var -> (term, var)) newvars, goal.blocked + in newvars, { (* Variables *) - flexible; blocked = goal.blocked; + flexible; blocked; (* Constraints *) env; constraints; @@ -634,6 +659,18 @@ module Search = struct roots = goal.roots; } + let unblock t = + let is_blocked (term, sym, _) = + Termination.blocked t.env ~flexible:t.flexible sym term in + let blocked, unblocked = List.partition is_blocked t.blocked in + {t with blocked}, + let unblocked = List.map + (fun (term, _sym, vars) -> + List.map (fun var -> (term, var)) vars) + unblocked + in + List.flatten unblocked + let construct_paths goal = let rec mk_spine = function | Path.Pident v -> Path.Pident v @@ -665,18 +702,18 @@ module Search = struct fprintf ppf "@[%a = %a@]\n" Printtyp.ident root print_var root in List.iter print_binding goal.roots - let print_candidate ppf (path, params, _) = + let print_candidate ppf (_, (path, params, _)) = Printtyp.path ppf path; List.iter (fun _param -> Format.fprintf ppf "{_}") params - let rec bind_candidates acc goal var = function + let rec bind_candidates acc goal (_, id as var) = function | [] -> List.rev acc | candidate :: candidates -> let acc = match bind_candidate goal var candidate with | goal' -> goal' :: acc | exception exn -> printf "Cannot bind @[%a <- %a@]: %a\n" - Printtyp.ident var + Printtyp.ident id print_candidate candidate safe_report_exn exn; acc @@ -688,7 +725,10 @@ module Backtrack = struct let search candidates goal vars fold acc = let rec conjunction acc goal = function - | [] -> fold goal acc + | [] -> + let goal, newvars = Search.unblock goal in + if newvars = [] then fold goal acc + else conjunction acc goal newvars | var :: vars -> disjunction vars acc (Search.bind_candidates [] goal var candidates) @@ -714,7 +754,9 @@ let canonical_candidates env = let acc = if Hashtbl.mem seen path then acc else ( Hashtbl.add seen path (); - (path, params, mty) :: acc + let candidate = (path, params, mty) in + let symbol = Termination.index env candidate in + (symbol, candidate) :: acc ) in aux acc xs @@ -730,11 +772,14 @@ let find_pending_instance inst = List.assoc var (Search.construct_paths solution) in let candidates = canonical_candidates env in - let solution = Backtrack.search candidates goal [var] + let solution = Backtrack.search candidates goal [Termination.empty, var] (fun solution solutions -> + let open Typecore in + if solution.Search.blocked <> [] then + raise (Error (loc, inst.implicit_env, + Termination_fail inst)); match solutions with | solution' :: _ -> - let open Typecore in raise (Error (loc, inst.implicit_env, Ambiguous_implicit (inst, goal_path solution, From 6b6858e0a779a3afaa685ec73d7f16debc1900f6 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 24 Feb 2016 22:58:45 +0900 Subject: [PATCH 480/494] Disable moregeneral during implicit inclusion checking --- typing/ctype.ml | 34 +++++++++++++++++++++------------- typing/ctype.mli | 2 ++ typing/implicitsearch.ml | 5 +++-- 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/typing/ctype.ml b/typing/ctype.ml index fbf0ee542c..551944129f 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -3191,6 +3191,13 @@ let moregen inst_nongen type_pairs subst env patt subj = univar_pairs := []; moregen inst_nongen type_pairs subst env patt subj +let disabled_moregeneral = ref false + +let without_moregeneral f = + let disabled_moregeneral' = !disabled_moregeneral in + disabled_moregeneral := true; + try_finally f + (fun () -> disabled_moregeneral := disabled_moregeneral') (* Non-generic variable can be instanciated only if [inst_nongen] is true. So, [inst_nongen] should be set to false if the subject might @@ -3200,25 +3207,26 @@ let moregen inst_nongen type_pairs subst env patt subj = is unimportant. So, no need to propagate abbreviations. *) let moregeneral env inst_nongen pat_sch subj_sch = - let old_level = !current_level in - current_level := generic_level - 1; + if !disabled_moregeneral then true else begin + let old_level = !current_level in + current_level := generic_level - 1; (* Generic variables are first duplicated with [instance]. So, their levels are lowered to [generic_level - 1]. The subject is then copied with [duplicate_type]. That way, its levels won't be changed. *) - let subj = duplicate_type (instance env subj_sch) in - current_level := generic_level; - (* Duplicate generic variables *) - let patt = instance env pat_sch in - let res = - try moregen inst_nongen (TypePairs.create 13) Subst.identity env patt subj; true with - Unify _ -> false - in - current_level := old_level; - res - + let subj = duplicate_type (instance env subj_sch) in + current_level := generic_level; + (* Duplicate generic variables *) + let patt = instance env pat_sch in + let res = + try moregen inst_nongen (TypePairs.create 13) Subst.identity env patt subj; true with + Unify _ -> false + in + current_level := old_level; + res + end (* Alternative approach: "rigidify" a type scheme, and check validity after unification *) diff --git a/typing/ctype.mli b/typing/ctype.mli index ac083e1248..3ead6b43dd 100644 --- a/typing/ctype.mli +++ b/typing/ctype.mli @@ -177,6 +177,8 @@ val filter_implicit: Env.t -> type_expr -> (Ident.t * type_expr * type_expr) opt val moregeneral: Env.t -> bool -> type_expr -> type_expr -> bool (* Check if the first type scheme is more general than the second. *) +val without_moregeneral: (unit -> 'a) -> 'a + val rigidify: type_expr -> type_expr list (* "Rigidify" a type and return its type variable *) val all_distinct_vars: Env.t -> type_expr list -> bool diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 1237bd2d7f..c3eedc1687 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -627,8 +627,9 @@ module Search = struct let (_ : module_coercion), equalities = let mty1 = Env.scrape_alias env mty in let mty2 = Env.scrape_alias env (Mty_alias (Path.Pident var)) in - Ctype.collect_equalities ~on:flexible - (fun () -> Includemod.modtypes env mty1 mty2) + Ctype.collect_equalities ~on:flexible @@ fun () -> + Ctype.without_moregeneral @@ fun () -> + Includemod.modtypes env mty1 mty2 in (* Rigidify module after inclusion check: inclusion can introduce new constraints on the module itself, e.g. when discovering associated From 84ce4c29b0fca0c0d6bcff64acc69a0f7cf30478 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 24 Feb 2016 23:00:07 +0900 Subject: [PATCH 481/494] Check occurrences of free variables in definitional constraints --- typing/implicitsearch.ml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index c3eedc1687..a77a43f578 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -90,10 +90,12 @@ module Equalities = struct | [] -> true | x :: xs -> not (List.memq x xs) && uniq xs in - (* FIXME: No type variable should occur in rhs but not in tl. - Check Ctype.freevars inclusion - *) - if uniq tl' then `Expansion (p, (tl', rhs, None), tl) else `None + let freevars = Ctype.free_variables ~env rhs in + if uniq tl' && + List.for_all (fun var -> List.memq (Ctype.repr var) tl') + freevars + then `Expansion (p, (tl', rhs, None), tl) + else `None end | _ -> `None in From ba1901c084ae38722205c65d7286d0542e4a8248 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Mon, 29 Feb 2016 16:13:51 +0900 Subject: [PATCH 482/494] Add -backtrack flag to the compiler --- driver/compenv.ml | 1 + driver/main.ml | 1 + driver/main_args.ml | 11 +++++++++++ driver/main_args.mli | 2 ++ driver/optmain.ml | 1 + ocamldoc/odoc_args.ml | 1 + tools/ocamlcp.ml | 1 + tools/ocamloptp.ml | 1 + toplevel/topmain.ml | 1 + utils/clflags.ml | 1 + utils/clflags.mli | 1 + 11 files changed, 22 insertions(+) diff --git a/driver/compenv.ml b/driver/compenv.ml index e7b4987ccc..69f8752dd5 100644 --- a/driver/compenv.ml +++ b/driver/compenv.ml @@ -169,6 +169,7 @@ let read_OCAMLPARAM ppf position = | "nolabels" -> set "nolabels" [ classic ] v | "principal" -> set "principal" [ principal ] v | "rectypes" -> set "rectypes" [ recursive_types ] v + | "backtrack" -> set "backtrack" [ backtracking_implicits ] v | "safe-string" -> clear "safe-string" [ unsafe_string ] v | "strict-sequence" -> set "strict-sequence" [ strict_sequence ] v | "strict-formats" -> set "strict-formats" [ strict_formats ] v diff --git a/driver/main.ml b/driver/main.ml index e3c59c9e7f..bfb5064d54 100644 --- a/driver/main.ml +++ b/driver/main.ml @@ -115,6 +115,7 @@ module Options = Main_args.Make_bytecomp_options (struct let _ppx s = first_ppx := s :: !first_ppx let _principal = set principal let _rectypes = set recursive_types + let _backtrack = set backtracking_implicits let _runtime_variant s = runtime_variant := s let _safe_string = unset unsafe_string let _short_paths = unset real_paths diff --git a/driver/main_args.ml b/driver/main_args.ml index f5d7e3164d..d8e3f59318 100644 --- a/driver/main_args.ml +++ b/driver/main_args.ml @@ -261,6 +261,11 @@ let mk_rectypes f = "-rectypes", Arg.Unit f, " Allow arbitrary recursive types" ;; +let mk_backtrack f = + "-backtrack", Arg.Unit f, + " Allow backtracking during resolution of " +;; + let mk_runtime_variant f = "-runtime-variant", Arg.String f, "<str> Use the <str> variant of the run-time system" @@ -493,6 +498,7 @@ module type Common_options = sig val _ppx : string -> unit val _principal : unit -> unit val _rectypes : unit -> unit + val _backtrack : unit -> unit val _safe_string : unit -> unit val _short_paths : unit -> unit val _strict_sequence : unit -> unit @@ -540,6 +546,7 @@ module type Compiler_options = sig val _pp : string -> unit val _principal : unit -> unit val _rectypes : unit -> unit + val _backtrack : unit -> unit val _runtime_variant : string -> unit val _safe_string : unit -> unit val _short_paths : unit -> unit @@ -693,6 +700,7 @@ struct mk_ppx F._ppx; mk_principal F._principal; mk_rectypes F._rectypes; + mk_backtrack F._backtrack; mk_runtime_variant F._runtime_variant; mk_safe_string F._safe_string; mk_short_paths F._short_paths; @@ -744,6 +752,7 @@ struct mk_ppx F._ppx; mk_principal F._principal; mk_rectypes F._rectypes; + mk_backtrack F._backtrack; mk_safe_string F._safe_string; mk_short_paths F._short_paths; mk_stdin F._stdin; @@ -811,6 +820,7 @@ struct mk_ppx F._ppx; mk_principal F._principal; mk_rectypes F._rectypes; + mk_backtrack F._backtrack; mk_runtime_variant F._runtime_variant; mk_S F._S; mk_safe_string F._safe_string; @@ -876,6 +886,7 @@ module Make_opttop_options (F : Opttop_options) = struct mk_ppx F._ppx; mk_principal F._principal; mk_rectypes F._rectypes; + mk_backtrack F._backtrack; mk_S F._S; mk_safe_string F._safe_string; mk_short_paths F._short_paths; diff --git a/driver/main_args.mli b/driver/main_args.mli index ddee921d4b..d9a4da0bdd 100644 --- a/driver/main_args.mli +++ b/driver/main_args.mli @@ -26,6 +26,7 @@ module type Common_options = sig val _ppx : string -> unit val _principal : unit -> unit val _rectypes : unit -> unit + val _backtrack : unit -> unit val _safe_string : unit -> unit val _short_paths : unit -> unit val _strict_sequence : unit -> unit @@ -73,6 +74,7 @@ module type Compiler_options = sig val _pp : string -> unit val _principal : unit -> unit val _rectypes : unit -> unit + val _backtrack : unit -> unit val _runtime_variant : string -> unit val _safe_string : unit -> unit val _short_paths : unit -> unit diff --git a/driver/optmain.ml b/driver/optmain.ml index 0a680ce4d8..2edca4182f 100644 --- a/driver/optmain.ml +++ b/driver/optmain.ml @@ -113,6 +113,7 @@ module Options = Main_args.Make_optcomp_options (struct let _ppx s = first_ppx := s :: !first_ppx let _principal = set principal let _rectypes = set recursive_types + let _backtrack = set backtracking_implicits let _runtime_variant s = runtime_variant := s let _safe_string = clear unsafe_string let _short_paths = clear real_paths diff --git a/ocamldoc/odoc_args.ml b/ocamldoc/odoc_args.ml index 77b59025b4..3838cf0c99 100644 --- a/ocamldoc/odoc_args.ml +++ b/ocamldoc/odoc_args.ml @@ -207,6 +207,7 @@ module Options = Main_args.Make_ocamldoc_options(struct let _ppx s = Clflags.all_ppx := s :: !Clflags.all_ppx let _principal = set Clflags.principal let _rectypes = set Clflags.recursive_types + let _backtrack = set Clflags.backtracking_implicits let _safe_string = unset Clflags.unsafe_string let _short_paths = unset Clflags.real_paths let _strict_sequence = set Clflags.strict_sequence diff --git a/tools/ocamlcp.ml b/tools/ocamlcp.ml index 26ced6c567..df75bb4a22 100644 --- a/tools/ocamlcp.ml +++ b/tools/ocamlcp.ml @@ -82,6 +82,7 @@ module Options = Main_args.Make_bytecomp_options (struct let _ppx _s = incompatible "-ppx" let _principal = option "-principal" let _rectypes = option "-rectypes" + let _backtrack = option "-backtrack" let _runtime_variant s = option_with_arg "-runtime-variant" s let _safe_string = option "-safe-string" let _short_paths = option "-short-paths" diff --git a/tools/ocamloptp.ml b/tools/ocamloptp.ml index fd15fe5968..850e6a7495 100644 --- a/tools/ocamloptp.ml +++ b/tools/ocamloptp.ml @@ -83,6 +83,7 @@ module Options = Main_args.Make_optcomp_options (struct let _ppx _s = incompatible "-ppx" let _principal = option "-principal" let _rectypes = option "-rectypes" + let _backtrack = option "-backtrack" let _runtime_variant s = option_with_arg "-runtime-variant" s let _S = option "-S" let _safe_string = option "-safe-string" diff --git a/toplevel/topmain.ml b/toplevel/topmain.ml index 0d8f2d4c21..a85bd83ebe 100644 --- a/toplevel/topmain.ml +++ b/toplevel/topmain.ml @@ -79,6 +79,7 @@ module Options = Main_args.Make_bytetop_options (struct let _ppx s = first_ppx := s :: !first_ppx let _principal = set principal let _rectypes = set recursive_types + let _backtrack = set backtracking_implicits let _safe_string = clear unsafe_string let _short_paths = clear real_paths let _stdin () = file_argument "" diff --git a/utils/clflags.ml b/utils/clflags.ml index 864d68888b..f81748bf1c 100644 --- a/utils/clflags.ml +++ b/utils/clflags.ml @@ -51,6 +51,7 @@ and use_runtime = ref "" (* -use-runtime ... *) and principal = ref false (* -principal *) and real_paths = ref true (* -short-paths *) and recursive_types = ref false (* -rectypes *) +and backtracking_implicits = ref false (* -backtrack *) and strict_sequence = ref false (* -strict-sequence *) and strict_formats = ref false (* -strict-formats *) and applicative_functors = ref true (* -no-app-funct *) diff --git a/utils/clflags.mli b/utils/clflags.mli index aeed7d977c..71cbc2d1d3 100644 --- a/utils/clflags.mli +++ b/utils/clflags.mli @@ -48,6 +48,7 @@ val use_runtime : string ref val principal : bool ref val real_paths : bool ref val recursive_types : bool ref +val backtracking_implicits : bool ref val strict_sequence : bool ref val strict_formats : bool ref val applicative_functors : bool ref From 4e7434d84a6a1c36a4d22d3c52238e6a736ab275 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Mon, 29 Feb 2016 16:14:25 +0900 Subject: [PATCH 483/494] Add local search strategy --- typing/implicitsearch.ml | 78 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 74 insertions(+), 4 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index a77a43f578..e172b5f649 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -722,11 +722,14 @@ module Search = struct acc in bind_candidates acc goal var candidates + + let bind_candidates goal var candidates = + bind_candidates [] goal var candidates end module Backtrack = struct - let search candidates goal vars fold acc = + let search candidates goal0 vars0 fold acc0 = let rec conjunction acc goal = function | [] -> let goal, newvars = Search.unblock goal in @@ -734,7 +737,7 @@ module Backtrack = struct else conjunction acc goal newvars | var :: vars -> disjunction vars acc - (Search.bind_candidates [] goal var candidates) + (Search.bind_candidates goal var candidates) and disjunction vars acc = function | [] -> acc @@ -744,7 +747,69 @@ module Backtrack = struct alternatives in - conjunction acc goal vars + conjunction acc0 goal0 vars0 + +end + +module Local_progress = struct + + let rec bind_candidates acc goal (_, id as var) = function + | [] -> + begin match acc with + | None -> `None + | Some (candidate, goal') -> `Some goal' + end + | candidate :: candidates -> + begin match Search.bind_candidate goal var candidate with + | exception exn -> + printf "Cannot bind @[%a <- %a@]: %a\n" + Printtyp.ident id + Search.print_candidate candidate + safe_report_exn exn; + bind_candidates acc goal var candidates + | goal' -> + begin match acc with + | None -> + bind_candidates (Some (candidate, goal')) goal var candidates + | Some (candidate', _) -> + `Ambiguous (var, candidate' :: candidate :: candidates) + end + end + + let bind_candidates goal var candidates = + bind_candidates None goal var candidates + + let search candidates goal0 vars0 fold acc0 = + let rec conjunction blocked goal = function + | [] -> + let goal, newvars = Search.unblock goal in + if newvars = [] then + if blocked = [] then + fold goal acc0 + else unblock goal blocked + else conjunction blocked goal newvars + | var :: vars -> + match bind_candidates goal var candidates with + | `None -> acc0 + | `Some (newvars, goal) -> + conjunction blocked goal (newvars @ vars) + | `Ambiguous var_candidates -> + conjunction (var_candidates :: blocked) goal vars + + and unblock goal blocked0 = + let rec resume blocked' = function + | [] -> failwith "local search is stuck" + | (var, candidates) :: blocked -> + match bind_candidates goal var candidates with + | `None -> acc0 + | `Some (newvars, goal) -> + conjunction (blocked' @ blocked) goal newvars + | `Ambiguous var_candidates -> + resume (var_candidates :: blocked') blocked + in + resume [] blocked0 + in + conjunction [] goal0 vars0 end @@ -775,7 +840,12 @@ let find_pending_instance inst = List.assoc var (Search.construct_paths solution) in let candidates = canonical_candidates env in - let solution = Backtrack.search candidates goal [Termination.empty, var] + let search_fun = + if !Clflags.backtracking_implicits + then Backtrack.search + else Local_progress.search + in + let solution = search_fun candidates goal [Termination.empty, var] (fun solution solutions -> let open Typecore in if solution.Search.blocked <> [] then From 9a066b721c469362f54191c30b24f82c90a5784d Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Mon, 29 Feb 2016 17:30:59 +0900 Subject: [PATCH 484/494] HACK: don't strengthen private rows --- typing/implicitsearch.ml | 4 +++- typing/mtype.ml | 20 ++++++++++++++++++++ typing/mtype.mli | 2 ++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index e172b5f649..e998794508 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -628,7 +628,9 @@ module Search = struct (* Check inclusion relation, collect constraints on parameters *) let (_ : module_coercion), equalities = let mty1 = Env.scrape_alias env mty in - let mty2 = Env.scrape_alias env (Mty_alias (Path.Pident var)) in + let path = Path.Pident var in + let mty2 = (Env.find_module path env).md_type in + let mty2 = Mtype.strengthen_except_rows env mty2 path in Ctype.collect_equalities ~on:flexible @@ fun () -> Ctype.without_moregeneral @@ fun () -> Includemod.modtypes env mty1 mty2 diff --git a/typing/mtype.ml b/typing/mtype.ml index 1fd5af27c3..9b66b75e0b 100644 --- a/typing/mtype.ml +++ b/typing/mtype.ml @@ -30,6 +30,17 @@ let rec scrape env mty = let freshen mty = Subst.modtype Subst.identity mty +let skip_row = ref false + +let is_row id1 id2 = + let s = Ident.name id1 in + let l = String.length s in + l = (String.length (Ident.name id2) + 4) + && s.[l - 4] = '#' + && s.[l - 3] = 'r' + && s.[l - 2] = 'o' + && s.[l - 1] = 'w' + let rec strengthen env mty p = match scrape env mty with Mty_signature sg -> @@ -50,6 +61,8 @@ and strengthen_sig env sg p = [] -> [] | (Sig_value(id, desc) as sigelt) :: rem -> sigelt :: strengthen_sig env rem p + | (Sig_type(id1, _, _) as elt1) :: (Sig_type(id2, _, _) as elt2) :: rem + when !skip_row && is_row id1 id2 -> elt1 :: elt2 :: rem | Sig_type(id, decl, rs) :: rem -> let newdecl = match decl.type_manifest, decl.type_private, decl.type_kind with @@ -91,6 +104,13 @@ and strengthen_sig env sg p = and strengthen_decl env md p = {md with md_type = strengthen env md.md_type p} +let strengthen_except_rows env mty p = + let skip_row' = !skip_row in + skip_row := true; + Misc.try_finally + (fun () -> strengthen env mty p) + (fun () -> skip_row := skip_row') + let () = Env.strengthen := strengthen (* In nondep_supertype, env is only used for the type it assigns to id. diff --git a/typing/mtype.mli b/typing/mtype.mli index 6e815fad89..1e653e9546 100644 --- a/typing/mtype.mli +++ b/typing/mtype.mli @@ -24,6 +24,8 @@ val freshen: module_type -> module_type val strengthen: Env.t -> module_type -> Path.t -> module_type (* Strengthen abstract type components relative to the given path. *) +val strengthen_except_rows: Env.t -> module_type -> Path.t -> module_type + (* Strengthen abstract type components except private rows. *) val strengthen_decl: Env.t -> module_declaration -> Path.t -> module_declaration val nondep_supertype: Env.t -> Ident.t -> module_type -> module_type (* Return the smallest supertype of the given type From 57a708a306c826ef4e4e5271f1588644801b22a9 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Mon, 29 Feb 2016 17:35:20 +0900 Subject: [PATCH 485/494] Private rows test --- .../typing-modular_implicits/private_rows.ml | 33 +++++++++++++++++++ .../private_rows.ml.reference | 17 ++++++++++ .../private_rows.ml.result | 17 ++++++++++ 3 files changed, 67 insertions(+) create mode 100644 testsuite/tests/typing-modular_implicits/private_rows.ml create mode 100644 testsuite/tests/typing-modular_implicits/private_rows.ml.reference create mode 100644 testsuite/tests/typing-modular_implicits/private_rows.ml.result diff --git a/testsuite/tests/typing-modular_implicits/private_rows.ml b/testsuite/tests/typing-modular_implicits/private_rows.ml new file mode 100644 index 0000000000..8b364a4859 --- /dev/null +++ b/testsuite/tests/typing-modular_implicits/private_rows.ml @@ -0,0 +1,33 @@ +module type Show = sig type t val show : t -> string end + +let show {M : Show} = M.show + +implicit module ShowObj {X : sig type x = private < show : string; .. > end} = struct + type t = X.x + let show (o : t) = o#show +end + +implicit module X = struct + type x = < show : string > +end +;; + +let obj = object method show = "show" end +;; + +show obj +;; + +class type show = object method show : string end +;; + +let f (obj : #show) = + print_endline (show obj) +;; + +let g (obj : #show) = + print_endline (show {ShowObj{X}} obj) +;; + +f obj;; +g obj;; diff --git a/testsuite/tests/typing-modular_implicits/private_rows.ml.reference b/testsuite/tests/typing-modular_implicits/private_rows.ml.reference new file mode 100644 index 0000000000..b2fa12dbf5 --- /dev/null +++ b/testsuite/tests/typing-modular_implicits/private_rows.ml.reference @@ -0,0 +1,17 @@ + +# module type Show = sig type t val show : t -> string end +val show : {M : Show} -> M.t -> string = <fun> +implicit module ShowObj : + functor {X : sig type x = private < show : string; .. > end} -> + sig type t = X.x val show : t -> string end +implicit module X : sig type x = < show : string > end +# val obj : < show : string > = <obj> +# - : string = "show" +# class type show = object method show : string end +# val f : show -> unit = <fun> +# val g : show -> unit = <fun> +# show +- : unit = () +# show +- : unit = () +# diff --git a/testsuite/tests/typing-modular_implicits/private_rows.ml.result b/testsuite/tests/typing-modular_implicits/private_rows.ml.result new file mode 100644 index 0000000000..b2fa12dbf5 --- /dev/null +++ b/testsuite/tests/typing-modular_implicits/private_rows.ml.result @@ -0,0 +1,17 @@ + +# module type Show = sig type t val show : t -> string end +val show : {M : Show} -> M.t -> string = <fun> +implicit module ShowObj : + functor {X : sig type x = private < show : string; .. > end} -> + sig type t = X.x val show : t -> string end +implicit module X : sig type x = < show : string > end +# val obj : < show : string > = <obj> +# - : string = "show" +# class type show = object method show : string end +# val f : show -> unit = <fun> +# val g : show -> unit = <fun> +# show +- : unit = () +# show +- : unit = () +# From 696e395a85a26d4a317393f1205bd91773b2779c Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Mon, 29 Feb 2016 17:49:09 +0900 Subject: [PATCH 486/494] Termination error when local search fails (FIXME: better error message) --- typing/implicitsearch.ml | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index e998794508..f0e97b4ee7 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -731,11 +731,14 @@ end module Backtrack = struct - let search candidates goal0 vars0 fold acc0 = + let search candidates goal0 vars0 termination_fail found_solution acc0 = let rec conjunction acc goal = function | [] -> let goal, newvars = Search.unblock goal in - if newvars = [] then fold goal acc + if newvars = [] then + if goal.Search.blocked = [] + then found_solution goal acc0 + else termination_fail goal acc0 else conjunction acc goal newvars | var :: vars -> disjunction vars acc @@ -781,13 +784,15 @@ module Local_progress = struct let bind_candidates goal var candidates = bind_candidates None goal var candidates - let search candidates goal0 vars0 fold acc0 = + let search candidates goal0 vars0 termination_fail found_solution acc0 = let rec conjunction blocked goal = function | [] -> let goal, newvars = Search.unblock goal in if newvars = [] then if blocked = [] then - fold goal acc0 + if goal.Search.blocked = [] + then found_solution goal acc0 + else termination_fail goal acc0 else unblock goal blocked else conjunction blocked goal newvars | var :: vars -> @@ -800,7 +805,7 @@ module Local_progress = struct and unblock goal blocked0 = let rec resume blocked' = function - | [] -> failwith "local search is stuck" + | [] -> termination_fail goal acc0 | (var, candidates) :: blocked -> match bind_candidates goal var candidates with | `None -> acc0 @@ -847,12 +852,13 @@ let find_pending_instance inst = then Backtrack.search else Local_progress.search in - let solution = search_fun candidates goal [Termination.empty, var] + let solution = + let open Typecore in + search_fun candidates goal [Termination.empty, var] + (fun _ _ -> + raise (Error (loc, inst.implicit_env, + Termination_fail inst))) (fun solution solutions -> - let open Typecore in - if solution.Search.blocked <> [] then - raise (Error (loc, inst.implicit_env, - Termination_fail inst)); match solutions with | solution' :: _ -> raise (Error (loc, inst.implicit_env, From aaef9be764dbf5cbe9c98edbce4bdbd310195477 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 2 Mar 2016 17:13:13 +0900 Subject: [PATCH 487/494] Subst: rename implicit parameters!!!!!!! --- typing/subst.ml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/typing/subst.ml b/typing/subst.ml index 3e7b161d5c..7413d67ead 100644 --- a/typing/subst.ml +++ b/typing/subst.ml @@ -184,8 +184,11 @@ let rec typexp s ty = end | Tfield(label, kind, t1, t2) when field_kind_repr kind = Fabsent -> Tlink (typexp s t2) - | Tarrow(Tarr_implicit id, _, _, _) when Tbl.mem id s.modules -> - assert false + | Tarrow(Tarr_implicit id, lhs, rhs, commu) -> + assert (not (Tbl.mem id s.modules)); + let id' = Ident.rename id in + let s = add_module id (Pident id') s in + copy_type_desc (typexp s) (Tarrow(Tarr_implicit id', lhs, rhs, commu)) | _ -> copy_type_desc (typexp s) desc end; ty' From f2876336412a7c7894fbc070eb2940b466025a5b Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 2 Mar 2016 17:15:55 +0900 Subject: [PATCH 488/494] Allow search for multiple implicits --- typing/implicitsearch.ml | 163 +++++++++++++++++++++++---------------- 1 file changed, 95 insertions(+), 68 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index f0e97b4ee7..2599b831a0 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -506,35 +506,40 @@ module Pending = struct in Env.add_type ~check:false ident decl env - let prepare inst = - let env = inst.implicit_env in - let var = inst.implicit_id in - let path, nl, tl = inst.implicit_type in - let constraints = inst.implicit_constraints in - (* Extract base module type *) - let mty = - let mtd = Env.find_modtype path env in - match mtd.mtd_type with - | None -> assert false - | Some mty -> mty - in - (* Turn with constraints into equality constraints *) - let with_cstrs = List.map2 (fun li ty -> - let rec path = function - | Longident.Lident s -> Path.Pdot (Path.Pident var, s, 0) - | Longident.Ldot (l, s) -> Path.Pdot (path l, s, 0) - | Longident.Lapply _ -> assert false - in - Ctype.newconstr (path li) [], ty - ) nl tl - in - (* Reify variables *) - let variables = reify_variables mty tl constraints in - let env = List.fold_left add_variable env variables in - let flexible = - List.fold_left (fun set (_,id) -> add_ident set id) Tbl.empty variables + let prepare env insts = + let prepare_one (env,flexible,vars,constraints) inst = + let var = inst.implicit_id in + let path, nl, tl = inst.implicit_type in + let new_constraints = inst.implicit_constraints in + (* Extract base module type *) + let mty = + let mtd = Env.find_modtype path env in + match mtd.mtd_type with + | None -> assert false + | Some mty -> mty + in + (* Turn with constraints into equality constraints *) + let with_cstrs = List.map2 (fun li ty -> + let rec path = function + | Longident.Lident s -> Path.Pdot (Path.Pident var, s, 0) + | Longident.Ldot (l, s) -> Path.Pdot (path l, s, 0) + | Longident.Lapply _ -> assert false + in + Ctype.newconstr (path li) [], ty + ) nl tl + in + (* Reify variables *) + let variables = reify_variables mty tl new_constraints in + let env = List.fold_left add_variable env variables in + let flexible = List.fold_left + (fun set (_,id) -> add_ident set id) + flexible variables + in + (env, flexible, + (var, mty) :: vars, + (with_cstrs @ new_constraints @ constraints)) in - env, flexible, var, mty, (with_cstrs @ constraints) + List.fold_left prepare_one (env, Tbl.empty, [], []) insts end @@ -676,19 +681,22 @@ module Search = struct in List.flatten unblocked - let construct_paths goal = - let rec mk_spine = function + let construct_paths + ?(unbound=fun ~root var -> Path.Pident var) + goal + = + let rec mk_spine root = function | Path.Pident v -> Path.Pident v - | Path.Pdot (p', s, x) -> Path.Pdot (mk_spine p', s, x) + | Path.Pdot (p', s, x) -> Path.Pdot (mk_spine root p', s, x) | Path.Papply (p1, Path.Pident var, Asttypes.Implicit) -> - Path.Papply (mk_spine p1, mk_var var, Asttypes.Implicit) + Path.Papply (mk_spine root p1, mk_var root var, Asttypes.Implicit) | Path.Papply (_, _, _) -> assert false - and mk_var var = + and mk_var root var = match Tbl.find var goal.bound with - | exception Not_found -> Path.Pident var - | path -> mk_spine path + | exception Not_found -> unbound ~root var + | path -> mk_spine root path in - List.map (fun root -> root, mk_var root) goal.roots + List.map (fun root -> root, mk_var root root) goal.roots let print_roots ppf goal = let open Format in @@ -838,43 +846,68 @@ let canonical_candidates env = in aux [] (Env.implicit_instances env) -let find_pending_instance inst = - let snapshot = Btype.snapshot () in - let env, flexible, var, mty, cstrs = Pending.prepare inst in - let loc = inst.implicit_loc in - let goal = Search.make env flexible [var, mty] cstrs in - let goal_path solution = - List.assoc var (Search.construct_paths solution) +let implicit_env_representative inst = + let rec summary = function + | Env.Env_value (s', _, _) | Env.Env_extension (s', _, _) -> summary s' + | s -> s in + let env = inst.implicit_env in + (summary (Env.summary env), Env.implicit_instances env) + +let find_compatible_environments inst insts = + let repr = implicit_env_representative inst in + List.partition + (fun inst' -> implicit_env_representative inst' = repr) + insts + +let rec find_pending_instances = function [] -> () | inst :: rest -> + let snapshot = Btype.snapshot () in + let insts, rest = find_compatible_environments inst rest in + let insts = inst :: insts in + let env, flexible, vars, cstrs = Pending.prepare inst.implicit_env insts in + let goal = Search.make env flexible vars cstrs in let candidates = canonical_candidates env in let search_fun = if !Clflags.backtracking_implicits then Backtrack.search else Local_progress.search in - let solution = - let open Typecore in - search_fun candidates goal [Termination.empty, var] - (fun _ _ -> - raise (Error (loc, inst.implicit_env, - Termination_fail inst))) - (fun solution solutions -> - match solutions with - | solution' :: _ -> - raise (Error (loc, inst.implicit_env, - Ambiguous_implicit (inst, - goal_path solution, - goal_path solution'))) - | [] -> [solution]) + let termination_fail _ _ = + (* FIXME: report appropriate instance for the error *) + raise (Typecore.Error (inst.implicit_loc, inst.implicit_env, + Typecore.Termination_fail inst)) + in + let add_solution solution solutions = + match solutions with + | solution' :: _ -> + (* FIXME: report appropriate instance for the error *) + let paths = Search.construct_paths solution in + let paths' = Search.construct_paths solution' in + raise (Typecore.Error (inst.implicit_loc, inst.implicit_env, + Typecore.Ambiguous_implicit + (inst, + List.assoc inst.implicit_id paths, + List.assoc inst.implicit_id paths'))) + | [] -> [solution] + in + let solution = search_fun candidates goal + (List.map (fun (v,_) -> Termination.empty, v) vars) + termination_fail + add_solution [] in Btype.backtrack snapshot; match solution with - | [] -> false + | [] -> + raise (Typecore.Error (inst.implicit_loc, inst.implicit_env, + Typecore.No_instance_found inst)) | [solution] -> - let path = List.assoc var (Search.construct_paths solution) in - Link.to_path inst path; - true + let paths = Search.construct_paths solution in + List.iter (fun inst -> + let path = List.assoc inst.implicit_id paths in + Link.to_path inst path; + ) insts; + find_pending_instances rest | _ -> assert false let generalize_implicits () = @@ -902,13 +935,7 @@ let generalize_implicits () = (* The reversal is important to ensure we search from the outer most to the inner most implicits *) let to_generalize = List.flatten (List.rev to_generalize) in - try - let not_instantiable inst = not (find_pending_instance inst) in - let inst = List.find not_instantiable to_generalize in - let loc = inst.implicit_loc in - let env = inst.implicit_env in - raise Typecore.(Error (loc, env, No_instance_found inst)) - with Not_found -> () + find_pending_instances to_generalize let () = Typeimplicit.generalize_implicits_ref := generalize_implicits From 9187ceff052d44bea449151232c116a635ca0df9 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Wed, 2 Mar 2016 17:19:00 +0900 Subject: [PATCH 489/494] Add subtraction arithmetic test --- testsuite/tests/typing-modular_implicits/arithmetic.ml | 9 +++++++++ .../typing-modular_implicits/arithmetic.ml.reference | 5 ++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/testsuite/tests/typing-modular_implicits/arithmetic.ml b/testsuite/tests/typing-modular_implicits/arithmetic.ml index 4bbbb45c2c..d88aac23b5 100644 --- a/testsuite/tests/typing-modular_implicits/arithmetic.ml +++ b/testsuite/tests/typing-modular_implicits/arithmetic.ml @@ -48,3 +48,12 @@ end Resolved code: add (implicit AddS(Z)(Z)(AddZ(Z))) (S Z) Z *) add (S Z) Z ;; + +(* Subtraction *) + +let sub {Add : ADD} (c : Add.c) (a : Add.a) : Add.b = Add.b +;; + +sub (S Z) (S Z);; +sub (S Z) Z;; + diff --git a/testsuite/tests/typing-modular_implicits/arithmetic.ml.reference b/testsuite/tests/typing-modular_implicits/arithmetic.ml.reference index 357a697a48..f80d7e699e 100644 --- a/testsuite/tests/typing-modular_implicits/arithmetic.ml.reference +++ b/testsuite/tests/typing-modular_implicits/arithmetic.ml.reference @@ -28,4 +28,7 @@ implicit module AddS : val c : c end # * - : AddS{Z}{Z}{AddZ{Z}}.c = S Z -# +# val sub : {Add : ADD} -> Add.c -> Add.a -> Add.b = <fun> +# - : AddS{Z}{Z}{AddZ{Z}}.b = Z +# - : AddZ{S{Z}}.b = S Z +# From d8f27c031b10925d61dc12ce24e87b10d3e4a9bd Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 4 Mar 2016 18:23:26 +0900 Subject: [PATCH 490/494] Fix termination checking --- typing/implicitsearch.ml | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 2599b831a0..58d8575217 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -273,9 +273,9 @@ end = struct | x :: xs -> let acc = match x with | Sig_type (id, {type_kind = Type_abstract; type_manifest = None}, _) -> - Path.Pdot (path, Ident.name id, 0) :: acc + Path.Pdot (path, Ident.name id, -1) :: acc | Sig_module (id, md, _) -> - collect_mty acc (Path.Pdot (path, Ident.name id, 0)) md.md_type + collect_mty acc (Path.Pdot (path, Ident.name id, -1)) md.md_type | _ -> acc in collect_sig acc path xs @@ -316,7 +316,7 @@ end = struct let refine_parameter env decreasing argument = let decreased p1 = let p2 = rewrite_path argument p1 in - match smaller env p1 p2 with + match smaller env p2 p1 with | `Smaller -> Some p2 | _ -> None in @@ -423,20 +423,22 @@ end = struct in let rec path arguments decreasing = match arguments, decreasing with - | (id :: _), ((p :: _) :: _) -> rewrite_path id p + | (id :: _), ((p :: _) :: _) -> rewrite_path id p, p | (_ :: arguments), (_ :: decreasing) -> path arguments decreasing | _ -> assert false in - let path = path x.arguments x'.decreasing in + let path, path' = path x.arguments x'.decreasing in print "Cannot ensure termination: %a is not structurally decreasing, " Printtyp.path path; begin match Env.find_type_expansion path env with | exception Not_found -> print "nested occurrence is not constrained." | (_, ty2, _) -> - let _, ty1, _ = Env.find_type_expansion path env in - print "%a is not smaller than %a." + let _, ty1, _ = Env.find_type_expansion path' env in + print "%a = %a is not smaller than %a = %a." + Printtyp.path path Printtyp.type_expr ty2 + Printtyp.path path' Printtyp.type_expr ty1 end end; @@ -521,8 +523,8 @@ module Pending = struct (* Turn with constraints into equality constraints *) let with_cstrs = List.map2 (fun li ty -> let rec path = function - | Longident.Lident s -> Path.Pdot (Path.Pident var, s, 0) - | Longident.Ldot (l, s) -> Path.Pdot (path l, s, 0) + | Longident.Lident s -> Path.Pdot (Path.Pident var, s, -1) + | Longident.Ldot (l, s) -> Path.Pdot (path l, s, -1) | Longident.Lapply _ -> assert false in Ctype.newconstr (path li) [], ty From 6ce0ec62529c92975d7f935f39521018097bd7e1 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Fri, 4 Mar 2016 18:24:13 +0900 Subject: [PATCH 491/494] Expand paths when looking for flexible in termination checking --- typing/implicitsearch.ml | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 58d8575217..95a614acaa 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -357,21 +357,30 @@ end = struct | Path.Pdot (p, _, _) -> aux p in - let it_path = function + let rec it_path = function | Path.Pident _ -> () - | p -> aux p - in - let it = {Btype.type_iterators with Btype.it_path} in + | p -> + match Env.find_type_expansion p env with + | exception Not_found -> aux p + | (_, ty, _) -> it.Btype.it_type_expr it ty; + and it = {Btype.type_iterators with Btype.it_path} in + let rec unmark_path = function + | Path.Pident _ -> () + | p -> + match Env.find_type_expansion p env with + | exception Not_found -> aux p + | (_, ty, _) -> unmark.Btype.it_type_expr unmark ty; + and unmark = {Btype.unmark_iterators with Btype.it_path = unmark_path} in fun path -> match Env.find_type_expansion path env with | exception Not_found -> assert false | (_, ty, _) -> try it.Btype.it_type_expr it ty; - Btype.unmark_type ty; + unmark.Btype.it_type_expr unmark ty; true with Exit -> - Btype.unmark_type ty; + unmark.Btype.it_type_expr unmark ty; false exception Decreasing of Path.t From 5fed1214c0c434d21490785dde974186b798faa2 Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Mon, 7 Mar 2016 10:49:16 +0900 Subject: [PATCH 492/494] Remove implicit escape restriction --- typing/typemod.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typing/typemod.ml b/typing/typemod.ml index a52c750909..eaedb78827 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -319,7 +319,7 @@ let wellformed_functor env loc param res = begin match param with | Mpar_implicit(virt, id, mty) -> if virt = Virtual then wellformed_virtual env loc mty; - no_implicit_escape env loc id res + (*no_implicit_escape env loc id res*) | _ -> () end; Mty_functor(param, res) From 0944ee97114c066541431f87adce4fb0141f2ada Mon Sep 17 00:00:00 2001 From: Frederic Bour <frederic.bour@lakaban.net> Date: Mon, 7 Mar 2016 11:41:40 +0900 Subject: [PATCH 493/494] Better error messages for search failure --- typing/implicitsearch.ml | 102 +++++++++++++++++++++++++++++---------- typing/typecore.ml | 15 ++++++ typing/typecore.mli | 2 + 3 files changed, 93 insertions(+), 26 deletions(-) diff --git a/typing/implicitsearch.ml b/typing/implicitsearch.ml index 95a614acaa..a6f025946c 100644 --- a/typing/implicitsearch.ml +++ b/typing/implicitsearch.ml @@ -692,10 +692,7 @@ module Search = struct in List.flatten unblocked - let construct_paths - ?(unbound=fun ~root var -> Path.Pident var) - goal - = + let construct_path ?(unbound=fun var -> Path.Pident var) goal root = let rec mk_spine root = function | Path.Pident v -> Path.Pident v | Path.Pdot (p', s, x) -> Path.Pdot (mk_spine root p', s, x) @@ -704,10 +701,32 @@ module Search = struct | Path.Papply (_, _, _) -> assert false and mk_var root var = match Tbl.find var goal.bound with - | exception Not_found -> unbound ~root var + | exception Not_found -> unbound var | path -> mk_spine root path in - List.map (fun root -> root, mk_var root root) goal.roots + mk_var root root + + let construct_paths goal = + List.map (fun root -> root, construct_path goal root) goal.roots + + let find_root goal var = + let rec visit_path = function + | Path.Pident _ -> () + | Path.Pdot (p, _, _) -> visit_path p + | Path.Papply (p, Path.Pident v, Asttypes.Implicit) -> + visit_var v; + visit_path p + | Path.Papply (_, _, _) -> assert false + and visit_var v = + if Ident.same var v then raise Exit; + match Tbl.find v goal.bound with + | exception Not_found -> () + | path -> visit_path path + in + List.find (fun root -> + try visit_var root; false + with Exit -> true + ) goal.roots let print_roots ppf goal = let open Format in @@ -755,9 +774,9 @@ module Backtrack = struct | [] -> let goal, newvars = Search.unblock goal in if newvars = [] then - if goal.Search.blocked = [] - then found_solution goal acc0 - else termination_fail goal acc0 + match goal.Search.blocked with + | [] -> found_solution goal acc0 + | blocked -> termination_fail (`Termination blocked) goal acc0 else conjunction acc goal newvars | var :: vars -> disjunction vars acc @@ -809,9 +828,9 @@ module Local_progress = struct let goal, newvars = Search.unblock goal in if newvars = [] then if blocked = [] then - if goal.Search.blocked = [] - then found_solution goal acc0 - else termination_fail goal acc0 + match goal.Search.blocked with + | [] -> found_solution goal acc0 + | blocked -> termination_fail (`Termination blocked) goal acc0 else unblock goal blocked else conjunction blocked goal newvars | var :: vars -> @@ -824,7 +843,7 @@ module Local_progress = struct and unblock goal blocked0 = let rec resume blocked' = function - | [] -> termination_fail goal acc0 + | [] -> termination_fail (`Locally_ambiguous blocked') goal acc0 | (var, candidates) :: blocked -> match bind_candidates goal var candidates with | `None -> acc0 @@ -883,27 +902,58 @@ let rec find_pending_instances = function [] -> () | inst :: rest -> then Backtrack.search else Local_progress.search in - let termination_fail _ _ = - (* FIXME: report appropriate instance for the error *) - raise (Typecore.Error (inst.implicit_loc, inst.implicit_env, - Typecore.Termination_fail inst)) + let is_inst_of root inst = Ident.same inst.implicit_id root in + let path_of_candidate (p, args, _) = + let wild = Path.Pident (Ident.create_persistent "_") in + List.fold_left (fun p _arg -> papply p wild) p args + in + let raise_error inst err = + raise (Typecore.Error (inst.implicit_loc, inst.implicit_env, err)) in + let failure reason partial_solution _ = + match reason with + | `Termination blocked -> + begin match blocked with + | (_, _, (var :: _)) :: _ -> + let root = Search.find_root partial_solution var in + let inst = List.find (is_inst_of root) insts in + raise_error inst (Typecore.Termination_fail inst) + | _ -> assert false + end + | `Locally_ambiguous blocked -> + begin match blocked with + | ((_, var), ((_, c1) :: (_, c2) :: _)) :: _ -> + let root = Search.find_root partial_solution var in + let inst = List.find (is_inst_of root) insts in + let p= Search.construct_path + ~unbound:(fun v -> + if Ident.same v var then Path.Pident var + else Path.Pident (Ident.create_persistent "_")) + partial_solution root + in + let c1 = path_of_candidate c1 and c2 = path_of_candidate c2 in + raise_error inst + (Typecore.Locally_ambiguous_implicit (inst, p, var, c1, c2)) + | _ -> assert false + end + | `Ambiguous solution' -> + List.iter (fun (root, path) -> + let path' = Search.construct_path solution' root in + if not (Path.same path path') then + let inst = List.find (is_inst_of root) insts in + raise_error inst + (Typecore.Ambiguous_implicit (inst, path, path')) + ) (Search.construct_paths partial_solution); + assert false in let add_solution solution solutions = match solutions with | solution' :: _ -> - (* FIXME: report appropriate instance for the error *) - let paths = Search.construct_paths solution in - let paths' = Search.construct_paths solution' in - raise (Typecore.Error (inst.implicit_loc, inst.implicit_env, - Typecore.Ambiguous_implicit - (inst, - List.assoc inst.implicit_id paths, - List.assoc inst.implicit_id paths'))) + failure (`Ambiguous solution') solution () | [] -> [solution] in let solution = search_fun candidates goal (List.map (fun (v,_) -> Termination.empty, v) vars) - termination_fail + failure add_solution [] in diff --git a/typing/typecore.ml b/typing/typecore.ml index 47da13e8ee..ffda72d209 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -70,6 +70,8 @@ type error = | Apply_unexpected_implicit of type_expr | No_instance_found of Typeimplicit.pending_implicit | Ambiguous_implicit of Typeimplicit.pending_implicit * Path.t * Path.t + | Locally_ambiguous_implicit of + Typeimplicit.pending_implicit * Path.t * Ident.t * Path.t * Path.t | Termination_fail of Typeimplicit.pending_implicit exception Error of Location.t * Env.t * error @@ -4301,6 +4303,19 @@ let report_error env ppf = function fprintf ppf "Ambiguous implicit %s:@ %a@ and %a@ are both solutions." (Ident.name inst.Typeimplicit.implicit_id) path p1 path p2 + | Locally_ambiguous_implicit (inst, p, v, c1, c2) -> + let path = + if Path.to_longident c1 = Path.to_longident c2 + then stamped_path + else path in + if inst.Typeimplicit.implicit_id = v then + fprintf ppf "Ambiguous implicit %s:@ %a@ and %a@ are both solutions." + (Ident.name v) path c1 path c2 + else + fprintf ppf "Locally ambiguous solutions for implicit %s:@ in %a@, \ + %s <- %a@ and %s <- %a@ are both valid." + (Ident.name inst.Typeimplicit.implicit_id) + path p (Ident.name v) path c1 (Ident.name v) path c2 | Termination_fail inst -> fprintf ppf "Termination check failed when searching for implicit %s." (Ident.name inst.Typeimplicit.implicit_id) diff --git a/typing/typecore.mli b/typing/typecore.mli index dff8b56eb3..65c62f9482 100644 --- a/typing/typecore.mli +++ b/typing/typecore.mli @@ -118,6 +118,8 @@ type error = | Apply_unexpected_implicit of type_expr | No_instance_found of Typeimplicit.pending_implicit | Ambiguous_implicit of Typeimplicit.pending_implicit * Path.t * Path.t + | Locally_ambiguous_implicit of + Typeimplicit.pending_implicit * Path.t * Ident.t * Path.t * Path.t | Termination_fail of Typeimplicit.pending_implicit exception Error of Location.t * Env.t * error From 8e96fd9481f1f7691a01589b5a3ad18ca28c14a4 Mon Sep 17 00:00:00 2001 From: kakadu <kakadu.hafanana@gmail.com> Date: Tue, 19 Apr 2016 14:46:30 +0300 Subject: [PATCH 494/494] fix decalring implicit module in module signatures --- parsing/parser.mly | 3 +++ 1 file changed, 3 insertions(+) diff --git a/parsing/parser.mly b/parsing/parser.mly index d9b5783501..3aaa1ca534 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -913,6 +913,9 @@ module_declaration: MODULE UIDENT module_declaration_body post_item_attributes { Md.mk (mkrhs $2 2) $3 ~attrs:$4 ~loc:(symbol_rloc()) ~docs:(symbol_docs ()) } + | IMPLICIT MODULE UIDENT module_declaration_body post_item_attributes + { Md.mk (mkrhs $3 2) $4 ~attrs:$5 ~implicit_:Implicit + ~loc:(symbol_rloc()) ~docs:(symbol_docs ()) } ; module_alias: MODULE UIDENT EQUAL mod_longident post_item_attributes