From 2dab435cba5d8ab12db08200bcee88c4668c1370 Mon Sep 17 00:00:00 2001 From: Stephane Glondu Date: Sun, 18 Apr 2010 14:08:52 +0200 Subject: [PATCH] Imported Upstream snapshot 3.12.0~0dev23+10396 --- .depend | 8 +- Changes | 44 +- Makefile.nt | 5 +- README.win32 | 10 + VERSION | 2 +- _tags | 13 +- asmcomp/alpha/selection.ml | 2 +- asmcomp/arm/emit.mlp | 12 +- asmcomp/arm/selection.ml | 12 +- asmcomp/hppa/selection.ml | 4 +- asmcomp/ia64/selection.ml | 4 +- asmcomp/power/selection.ml | 2 +- asmcomp/sparc/selection.ml | 4 +- asmrun/.cvsignore | 3 + asmrun/.depend | 1665 ++++++----------- asmrun/Makefile | 6 +- asmrun/Makefile.nt | 4 +- asmrun/amd64.S | 33 +- asmrun/roots.c | 14 + asmrun/stack.h | 4 + asmrun/startup.c | 4 + boot/ocamlc | Bin 1079505 -> 1087674 bytes boot/ocamldep | Bin 303181 -> 305956 bytes boot/ocamllex | Bin 165937 -> 165849 bytes build/boot-c-parts-windows.sh | 23 - build/boot-c-parts.sh | 45 +- build/fastworld.sh | 7 +- build/install.sh | 7 - build/mkconfig.sh | 7 +- build/new-build-system | 9 +- build/otherlibs-targets.sh | 2 - build/world.sh | 22 +- byterun/.depend | 547 +++--- byterun/debugger.c | 39 +- byterun/debugger.h | 9 +- byterun/finalise.c | 4 +- byterun/gc_ctrl.c | 10 +- byterun/io.c | 13 +- byterun/stacks.c | 11 + byterun/stacks.h | 2 + camlp4/.vcs | 4 - camlp4/Camlp4/Camlp4Ast.partial.ml | 4 +- camlp4/Camlp4/Printers/OCaml.ml | 4 + camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml | 8 +- camlp4/Camlp4Parsers/Camlp4OCamlParser.ml | 15 +- .../Camlp4Parsers/Camlp4OCamlRevisedParser.ml | 17 +- camlp4/Makefile | 99 - camlp4/Makefile.ml | 358 ---- camlp4/boot/Camlp4.ml | 71 +- camlp4/boot/Camlp4Ast.ml | 35 +- camlp4/boot/camlp4boot.ml | 67 + config/Makefile.msvc64 | 3 +- configure | 11 +- debugger/command_line.ml | 25 +- debugger/debugcom.ml | 19 +- debugger/debugcom.mli | 8 + driver/main.ml | 1 + driver/main_args.ml | 31 +- driver/main_args.mli | 4 + driver/optmain.ml | 1 + emacs/caml-help.el | 47 +- emacs/camldebug.el | 13 +- emacs/inf-caml.el | 5 +- lex/parser.mly | 4 +- myocamlbuild.ml | 174 +- ocamlbuild/Makefile | 14 + ocamlbuild/_tags | 2 +- ocamldoc/.depend | 4 +- ocamldoc/odoc_analyse.ml | 4 +- ocamldoc/odoc_ast.ml | 20 + ocamldoc/odoc_cross.ml | 77 +- ocamldoc/odoc_html.ml | 20 + ocamldoc/odoc_info.mli | 4 + ocamldoc/odoc_latex.ml | 19 +- ocamldoc/odoc_module.ml | 15 +- ocamldoc/odoc_sig.ml | 63 +- ocamldoc/odoc_to_text.ml | 19 +- otherlibs/bigarray/.depend | 41 +- otherlibs/bigarray/dllbigarray.dlib | 1 - otherlibs/graph/.depend | 206 +- otherlibs/num/.depend | 30 +- otherlibs/num/Makefile.nt | 2 +- otherlibs/num/big_int.ml | 28 +- otherlibs/num/big_int.mli | 8 +- otherlibs/num/bng_digit.c | 2 +- otherlibs/num/dllnums.dlib | 1 - otherlibs/str/.depend | 18 +- otherlibs/str/dllstr.dlib | 1 - otherlibs/str/str.ml | 6 +- otherlibs/systhreads/.depend | 39 +- otherlibs/systhreads/Makefile | 23 +- otherlibs/systhreads/Makefile.nt | 23 +- otherlibs/systhreads/dllthreads.dlib | 1 - otherlibs/systhreads/libthreads.clib | 2 +- otherlibs/systhreads/libthreadswin32.clib | 1 - otherlibs/systhreads/posix.c | 929 --------- otherlibs/systhreads/st_posix.h | 431 +++++ otherlibs/systhreads/st_stubs.c | 852 +++++++++ otherlibs/systhreads/st_win32.h | 419 +++++ .../systhreads/{thread_posix.ml => thread.ml} | 9 +- otherlibs/systhreads/thread_win32.ml | 76 - otherlibs/systhreads/threads.h | 60 + otherlibs/systhreads/win32.c | 664 ------- otherlibs/threads/.depend | 32 +- otherlibs/unix/.depend | 1069 ++++------- otherlibs/unix/fork.c | 5 + otherlibs/win32graph/dllgraphics.dlib | 1 - otherlibs/win32unix/dllunix.dlib | 17 - parsing/parser.mly | 10 +- stdlib/.depend | 102 + stdlib/Makefile.shared | 1 + stdlib/format.ml | 61 +- stdlib/format.mli | 138 +- stdlib/gc.ml | 1 + stdlib/gc.mli | 6 +- stdlib/lazy.mli | 3 + stdlib/printexc.ml | 32 +- stdlib/printexc.mli | 18 +- stdlib/scanf.ml | 1042 ++++++----- stdlib/scanf.mli | 43 +- testsuite/Makefile | 7 +- testsuite/interactive/lib-graph-2/Makefile | 4 +- testsuite/interactive/lib-graph-3/Makefile | 2 +- testsuite/interactive/lib-graph/Makefile | 4 +- testsuite/makefiles/Makefile.common | 6 +- testsuite/makefiles/Makefile.one | 30 +- testsuite/makefiles/Makefile.several | 26 +- testsuite/tests/asmcomp/Makefile | 6 +- testsuite/tests/asmcomp/amd64.S | 28 +- testsuite/tests/basic-io-2/Makefile | 2 +- testsuite/tests/basic-io/Makefile | 2 +- testsuite/tests/basic-manyargs/Makefile | 2 +- testsuite/tests/basic/equality.ml | 27 +- testsuite/tests/basic/equality.reference | 6 + testsuite/tests/basic/patmatch.ml | 31 +- testsuite/tests/basic/patmatch.reference | 2 +- testsuite/tests/gc-roots/Makefile | 2 +- testsuite/tests/lib-digest/Makefile | 2 +- testsuite/tests/lib-dynlink-bytecode/Makefile | 6 +- testsuite/tests/lib-marshal/Makefile | 2 +- testsuite/tests/lib-num/end_test.reference | 4 +- testsuite/tests/lib-num/test_big_ints.ml | 12 + testsuite/tests/lib-scanf/Makefile | 2 +- testsuite/tests/lib-scanf/tscanf.ml | 55 +- testsuite/tests/runtime-errors/Makefile | 2 +- testsuite/tests/tool-ocamldoc/Makefile | 7 +- testsuite/tests/tool-ocamldoc/t02.ml | 10 + testsuite/tests/tool-ocamldoc/t02.reference | 12 + testsuite/tests/tool-ocamldoc/t03.ml | 7 + testsuite/tests/tool-ocamldoc/t03.reference | 14 + testsuite/tests/typing-fstclassmod/Makefile | 2 +- .../typing-objects/Exemples.ml.reference | 127 +- .../tests/typing-objects/Tests.ml.reference | 55 +- .../typing-poly/poly.ml.principal.reference | 19 +- testsuite/tests/typing-poly/poly.ml.reference | 19 +- testsuite/tests/typing-private-bugs/Makefile | 2 + .../tests/typing-private-bugs/pr5026_bad.ml | 11 + testsuite/tests/typing-typeparam/Makefile | 2 +- tools/Makefile.shared | 2 +- tools/ocamlcp.ml | 1 + toplevel/opttopmain.ml | 1 + toplevel/toplevellib.mllib | 2 +- toplevel/topmain.ml | 1 + typing/ctype.ml | 6 +- typing/env.ml | 24 +- typing/predef.ml | 6 + typing/printtyp.ml | 48 +- typing/subst.ml | 12 +- typing/typeclass.ml | 5 +- typing/typecore.ml | 164 +- typing/typecore.mli | 2 +- typing/typedecl.ml | 30 + typing/typemod.ml | 38 +- utils/ccomp.ml | 2 +- utils/tbl.ml | 6 + utils/tbl.mli | 1 + utils/warnings.ml | 93 +- utils/warnings.mli | 3 + 178 files changed, 5426 insertions(+), 5935 deletions(-) delete mode 100755 build/boot-c-parts-windows.sh delete mode 100644 camlp4/.vcs delete mode 100644 camlp4/Makefile delete mode 100644 camlp4/Makefile.ml delete mode 100644 otherlibs/bigarray/dllbigarray.dlib delete mode 100644 otherlibs/num/dllnums.dlib delete mode 100644 otherlibs/str/dllstr.dlib delete mode 100644 otherlibs/systhreads/dllthreads.dlib delete mode 100644 otherlibs/systhreads/libthreadswin32.clib delete mode 100644 otherlibs/systhreads/posix.c create mode 100644 otherlibs/systhreads/st_posix.h create mode 100644 otherlibs/systhreads/st_stubs.c create mode 100644 otherlibs/systhreads/st_win32.h rename otherlibs/systhreads/{thread_posix.ml => thread.ml} (91%) delete mode 100644 otherlibs/systhreads/thread_win32.ml create mode 100644 otherlibs/systhreads/threads.h delete mode 100644 otherlibs/systhreads/win32.c delete mode 100644 otherlibs/win32graph/dllgraphics.dlib delete mode 100644 otherlibs/win32unix/dllunix.dlib create mode 100644 testsuite/tests/tool-ocamldoc/t02.ml create mode 100644 testsuite/tests/tool-ocamldoc/t02.reference create mode 100644 testsuite/tests/tool-ocamldoc/t03.ml create mode 100644 testsuite/tests/tool-ocamldoc/t03.reference create mode 100644 testsuite/tests/typing-private-bugs/Makefile create mode 100644 testsuite/tests/typing-private-bugs/pr5026_bad.ml diff --git a/.depend b/.depend index daf84360..316b34e9 100644 --- a/.depend +++ b/.depend @@ -227,14 +227,14 @@ typing/typecore.cmx: utils/warnings.cmx typing/typetexp.cmx typing/types.cmx \ parsing/longident.cmx parsing/location.cmx typing/ident.cmx \ typing/env.cmx typing/ctype.cmx utils/clflags.cmx typing/btype.cmx \ parsing/asttypes.cmi typing/annot.cmi typing/typecore.cmi -typing/typedecl.cmo: typing/typetexp.cmi typing/types.cmi \ +typing/typedecl.cmo: utils/warnings.cmi typing/typetexp.cmi typing/types.cmi \ typing/typedtree.cmi typing/subst.cmi typing/printtyp.cmi \ typing/primitive.cmi typing/predef.cmi typing/path.cmi \ parsing/parsetree.cmi utils/misc.cmi parsing/longident.cmi \ parsing/location.cmi typing/includecore.cmi typing/ident.cmi \ typing/env.cmi typing/ctype.cmi utils/config.cmi utils/clflags.cmi \ typing/btype.cmi parsing/asttypes.cmi typing/typedecl.cmi -typing/typedecl.cmx: typing/typetexp.cmx typing/types.cmx \ +typing/typedecl.cmx: utils/warnings.cmx typing/typetexp.cmx typing/types.cmx \ typing/typedtree.cmx typing/subst.cmx typing/printtyp.cmx \ typing/primitive.cmx typing/predef.cmx typing/path.cmx \ parsing/parsetree.cmi utils/misc.cmx parsing/longident.cmx \ @@ -735,8 +735,8 @@ driver/main.cmx: utils/warnings.cmx utils/misc.cmx driver/main_args.cmx \ driver/errors.cmx utils/config.cmx driver/compile.cmx utils/clflags.cmx \ bytecomp/bytepackager.cmx bytecomp/bytelink.cmx \ bytecomp/bytelibrarian.cmx driver/main.cmi -driver/main_args.cmo: driver/main_args.cmi -driver/main_args.cmx: driver/main_args.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/unused_var.cmi \ typing/typemod.cmi typing/typedtree.cmi bytecomp/translmod.cmi \ typing/stypes.cmi bytecomp/simplif.cmi typing/printtyp.cmi \ diff --git a/Changes b/Changes index 76381b29..f7e2be0e 100644 --- a/Changes +++ b/Changes @@ -30,11 +30,37 @@ Language features: "S with type t1 = ... and ... and type tn = ..." (S refers to a module type). - Local opening of modules in a subexpression. Syntax: "let open M in e", or "M.(e)" +- In class definitions, method and instance variable override can now + be made explicit, by writing "method!", "val!" or "inherit!" in place of + "method", "val" and "inherit". It is an error to override an + undefined member (or to use overriding inheritance when nothing get + overriden). Additionally, these constructs disactivate respectively + warnings 7 (method override, code 'M') and 13 (instance variable + override, code 'V'). Note that, by default, warning 7 is inactive + and warning 13 is active. +- "Destructive" substitution in signatures. + By writing " with type t := " and + " with module M := " one replaces "t" and "M" + inside the signature, removing their respective fields. Among other + uses, this allows to merge two signatures containing identically + named fields. + Compilers and toplevel: -- New warning (activated by the warning code 'R') to signal - record patterns without "; _" where some labels of the record type - are not listed in the pattern. +- Warnings are now numbered and can be switched on and off individually. + The old system with letters referring to sets of warnings is still + supported. +- New warnings: + + 9 (code 'R') to signal record patterns without "; _" where + some labels of the record type are not listed in the pattern. + + 28 when giving a wildcard argument to a constant constructor in + a pattern-matching. + + 29 when an end-of-line appears unescaped in a string constant. + + 30 when the same constructor or record field is defined twice in + mutually-recursive type definitions. +* The semantics of warning 7 (code 'M', method override) have changed + (it now detects all overrides, not just repeated definitions inside + the same class body), and it is now inactive by default. - Better error report in case of unbound qualified identifier: if the module is unbound this error is reported in the first place. - Added option '-strict-sequence' to force left hand part of sequence to have @@ -50,17 +76,23 @@ Standard library: functions (int_of_string, Int32.of_string, Int64.of_string, Nativeint.of_string). The decimal string corresponding to max_int + 1 is no longer accepted. -- Format: to prevent confusion when mixing Format printing functions and - direct low level output, values Format.stdout and Format.stderr have been - added. - Scanf: to prevent confusion when mixing Scanf scanning functions and direct low level input, value Scanf.stdin has been added. +* Random: changed the algorithm to produce better randomness. Now passes the + DieHard tests. + +Ocamlbuild: +- Add support for native dynlink. Bug Fixes: - PR#4775: compiler crash on crazy types (temporary fix) +- PR#4970: better error message for instance variables +- PR#4988: contravariance lost with ocamlc -i - PR#5004: problem in Buffer.add_channel with very large lengths. - PR#5008: on AMD64/MSVC port, rare float corruption during GC. - PR#5018: wrong exception raised by Dynlink.loadfile. +- Wrong type for Obj.add_offset. +- Small problem with the representation of Int32, Int64, and Nativeint constants. Objective Caml 3.11.2: ---------------------- diff --git a/Makefile.nt b/Makefile.nt index 62de9eea..22028e64 100644 --- a/Makefile.nt +++ b/Makefile.nt @@ -84,10 +84,10 @@ DRIVER=driver/pparse.cmo driver/errors.cmo driver/compile.cmo \ driver/main_args.cmo driver/main.cmo OPTDRIVER=driver/pparse.cmo driver/opterrors.cmo driver/optcompile.cmo \ - driver/optmain.cmo + driver/main_args.cmo driver/optmain.cmo TOPLEVEL=driver/pparse.cmo driver/errors.cmo driver/compile.cmo \ - toplevel/genprintval.cmo toplevel/toploop.cmo \ + driver/main_args.cmo toplevel/genprintval.cmo toplevel/toploop.cmo \ toplevel/trace.cmo toplevel/topdirs.cmo toplevel/topmain.cmo TOPLEVELLIB=toplevel/toplevellib.cma @@ -101,6 +101,7 @@ TOPOBJS=$(TOPLEVELLIB) $(TOPLEVELSTART) NATTOPOBJS=$(OPTUTILS) $(PARSING) $(TYPING) $(COMP) $(ASMCOMP) \ driver/pparse.cmo driver/opterrors.cmo driver/optcompile.cmo \ + driver/main_args.cmo \ toplevel/genprintval.cmo toplevel/opttoploop.cmo toplevel/opttopdirs.cmo \ toplevel/opttopmain.cmo toplevel/opttopstart.cmo diff --git a/README.win32 b/README.win32 index 9479e113..46fec157 100644 --- a/README.win32 +++ b/README.win32 @@ -61,6 +61,9 @@ Microsoft Visual C++ compiler (items [1] and [2] in the section The native-code compiler (ocamlopt) requires Visual C++ (items [1], [2]), the Microsoft assembler MASM (item [3]) and the flexdll tool (item [5]). +Instead of items [1], [2] and [3], it is possible to use item [6] which contains +everything needed. + The LablTk GUI requires Tcl/Tk 8.5 (item [4]). @@ -103,6 +106,9 @@ http://www.microsoft.com/downloads/details.aspx?FamilyID=7A1C9DA0-0510-44A2-B042 [5] flexdll. Can be downloaded from http://alain.frisch.fr/flexdll.html +[6] Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 Service Pack 1 + + RECOMPILATION FROM THE SOURCES: The command-line tools can be recompiled from the Unix source @@ -322,6 +328,10 @@ THIRD-PARTY SOFTWARE: Includes all we need, namely a C compiler, the masm64 assembler, Windows libraries and include files. + Alternatively, the more recent SDK: + Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 Service Pack 1 + can be used. + [2] flexdll. Can be downloaded from http://alain.frisch.fr/flexdll.html diff --git a/VERSION b/VERSION index 9d186bd0..58fc0bdc 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -3.12.0+dev17 (2010-01-20) +3.12.0+dev23 (2010-05-12) # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli diff --git a/_tags b/_tags index 8e702f5c..a3b54570 100644 --- a/_tags +++ b/_tags @@ -19,7 +19,7 @@ true: use_stdlib # The stdlib neither requires the stdlib nor debug information : -use_stdlib, -debug -<**/*.ml*>: warn_Alerz +<**/*.ml*>: warn_error_A "toplevel/topstart.byte": linkall @@ -28,18 +28,18 @@ true: use_stdlib : include_unix, include_str, include_dynlink : use_unix, use_str, use_dynlink -: camlp4boot, -warn_Alerz, warn_Aler +: camlp4boot, warn_Z : -camlp4boot -"camlp4/Camlp4_import.ml": -warn_Aler - or or "camlp4/Camlp4/Struct/Lexer.ml": -camlp4boot, -warn_Aler, warn_a +"camlp4/Camlp4_import.ml": -warn_Z + or or "camlp4/Camlp4/Struct/Lexer.ml": -camlp4boot, -warn_Z, warn_a or : use_dynlink -"camlp4/Camlp4/Printers/OCaml.ml" or "camlp4/Camlp4/Printers/OCamlr.ml": warn_Alerzv +"camlp4/Camlp4/Printers/OCaml.ml" or "camlp4/Camlp4/Printers/OCamlr.ml": -warn_Z, warn_v : include_unix "camlp4/Camlp4/Struct/DynLoader.ml" or "camlp4/boot/Camlp4.ml": include_dynlink : include_toplevel : -debug -: -warn_Alerz, include_unix +: include_unix <**/pervasives.ml> or <**/pervasives.mli> or <**/camlinternalOO.mli>: nopervasives <**/camlinternalOO*.cmx>: inline(0) @@ -83,4 +83,3 @@ true: use_stdlib "otherlibs/labltk/browser/jglib.cma": -ocamlmklib "otherlibs/labltk/browser/main.byte": use_unix, use_str, ocamlbrowser, bootstrap_thread : include_unix, include_str -: include_unix diff --git a/asmcomp/alpha/selection.ml b/asmcomp/alpha/selection.ml index 6bea0f19..d91ec5bd 100644 --- a/asmcomp/alpha/selection.ml +++ b/asmcomp/alpha/selection.ml @@ -40,7 +40,7 @@ method select_addressing = function | arg -> (Iindexed 0, arg) -method select_operation op args = +method! select_operation op args = match (op, args) with (* Recognize shift-add operations *) ((Caddi|Cadda), diff --git a/asmcomp/arm/emit.mlp b/asmcomp/arm/emit.mlp index 307d097d..cfcb0c94 100644 --- a/asmcomp/arm/emit.mlp +++ b/asmcomp/arm/emit.mlp @@ -573,7 +573,7 @@ let emit_item = function | Cdefine_symbol s -> `{emit_symbol s}:\n` | Cdefine_label lbl -> - `{emit_label (10000 + lbl)}:\n` + `{emit_label (100000 + lbl)}:\n` | Cint8 n -> ` .byte {emit_int n}\n` | Cint16 n -> @@ -583,17 +583,13 @@ let emit_item = function | Cint n -> ` .word {emit_nativeint n}\n` | Csingle f -> - ` .float {emit_string f}\n` + emit_float32_directive ".long" f | Cdouble f -> - (* FIXME: this version of the ARM port is mixed-endian, so we - use .double instead of emit_float64_directive. The next - version is little-endian, so we'll use emit_float64 then. *) - ` .align 0\n`; - ` .double {emit_string f}\n` + emit_float64_split_directive ".long" f | Csymbol_address s -> ` .word {emit_symbol s}\n` | Clabel_address lbl -> - ` .word {emit_label (10000 + lbl)}\n` + ` .word {emit_label (100000 + lbl)}\n` | Cstring s -> emit_string_directive " .ascii " s | Cskip n -> diff --git a/asmcomp/arm/selection.ml b/asmcomp/arm/selection.ml index ded233ed..1574bf01 100644 --- a/asmcomp/arm/selection.ml +++ b/asmcomp/arm/selection.ml @@ -55,7 +55,7 @@ class selector = object(self) inherit Selectgen.selector_generic as super -method regs_for tyv = +method! regs_for tyv = (* Expand floats into pairs of integer registers *) let nty = Array.length tyv in let rec expand i = @@ -94,7 +94,7 @@ method select_shift_arith op shiftop shiftrevop args = | _ -> super#select_operation op args -method select_operation op args = +method! select_operation op args = match op with Cadda | Caddi -> begin match args with @@ -150,12 +150,12 @@ method select_operation op args = args)]) (* Add coercions around loads and stores of 32-bit floats *) | Cload Single -> - (Iextcall("__extendsdfd2", false), [Cop(Cload Word, args)]) + (Iextcall("__extendsfdf2", false), [Cop(Cload Word, args)]) | Cstore Single -> begin match args with | [arg1; arg2] -> let arg2' = - Cop(Cextcall("__truncdfsd2", typ_int, false, Debuginfo.none), + Cop(Cextcall("__truncdfsf2", typ_int, false, Debuginfo.none), [arg2]) in self#select_operation (Cstore Word) [arg1; arg2'] | _ -> assert false @@ -163,7 +163,7 @@ method select_operation op args = (* Other operations are regular *) | _ -> super#select_operation op args -method select_condition = function +method! select_condition = function | Cop(Ccmpf cmp, args) -> (Iinttest_imm(Isigned cmp, 0), Cop(Cextcall(float_comparison_function cmp, @@ -182,7 +182,7 @@ method select_condition = function this simplifies code generation later. *) -method insert_op_debug op dbg rs rd = +method! insert_op_debug op dbg rs rd = match op with | Iintop(Imul) -> self#insert_debug (Iop op) dbg rs [| rd.(0); rs.(0) |]; rd diff --git a/asmcomp/hppa/selection.ml b/asmcomp/hppa/selection.ml index a13b5271..74c546b0 100644 --- a/asmcomp/hppa/selection.ml +++ b/asmcomp/hppa/selection.ml @@ -45,7 +45,7 @@ method select_addressing = function | arg -> (Iindexed 0, arg) -method select_operation op args = +method! select_operation op args = match (op, args) with (* Recognize shift-add operations. *) ((Caddi|Cadda), @@ -92,7 +92,7 @@ method select_operation op args = (* Deal with register constraints *) -method insert_op_debug op dbg rs rd = +method! insert_op_debug op dbg rs rd = match op with Iintop(Idiv | Imod) -> (* handled via calls to millicode *) let rs' = [|phys_reg 20; phys_reg 19|] (* %r26, %r25 *) diff --git a/asmcomp/ia64/selection.ml b/asmcomp/ia64/selection.ml index 86d26917..6be4a18c 100644 --- a/asmcomp/ia64/selection.ml +++ b/asmcomp/ia64/selection.ml @@ -64,7 +64,7 @@ method is_immediate_add n = n >= -8192 && n < 8192 method select_addressing arg = (Iindexed, arg) -method select_operation op args = +method! select_operation op args = let norm_op = match op with Cadda -> Caddi | Csuba -> Csubi | _ -> op in let norm_args = @@ -146,7 +146,7 @@ method private select_imul_imm arg n = ... Note: we use two temp regs and perform stores by groups of 2 in order to expose more instruction-level parallelism. *) -method emit_stores env data regs_addr = +method! emit_stores env data regs_addr = let t1 = Reg.create Addr and t2 = Reg.create Addr in self#insert (Iop(Iintop_imm(Iadd, -8))) regs_addr [|t1|]; self#insert (Iop Imove) regs_addr [|t2|]; diff --git a/asmcomp/power/selection.ml b/asmcomp/power/selection.ml index 2818c4fd..d87b300c 100644 --- a/asmcomp/power/selection.ml +++ b/asmcomp/power/selection.ml @@ -63,7 +63,7 @@ method select_addressing exp = then (Iindexed2, Ctuple[e1; e2]) else (Iindexed d, Cop(Cadda, [e1; e2])) -method select_operation op args = +method! select_operation op args = match (op, args) with (* Prevent the recognition of (x / cst) and (x % cst) when cst is not a power of 2, which do not correspond to an instruction. *) diff --git a/asmcomp/sparc/selection.ml b/asmcomp/sparc/selection.ml index 10538547..965680b6 100644 --- a/asmcomp/sparc/selection.ml +++ b/asmcomp/sparc/selection.ml @@ -38,7 +38,7 @@ method select_addressing = function | arg -> (Iindexed 0, arg) -method select_operation op args = +method! select_operation op args = match (op, args) with (* For SPARC V7 multiplication, division and modulus are turned into calls to C library routines, except if the dividend is a power of 2. @@ -65,7 +65,7 @@ method select_operation op args = (* Override insert_move_args to deal correctly with floating-point arguments being passed into pairs of integer registers. *) -method insert_move_args arg loc stacksize = +method! insert_move_args arg loc stacksize = if stacksize <> 0 then self#insert (Iop(Istackoffset stacksize)) [||] [||]; let locpos = ref 0 in for i = 0 to Array.length arg - 1 do diff --git a/asmrun/.cvsignore b/asmrun/.cvsignore index 55f30ced..9c70fd7b 100644 --- a/asmrun/.cvsignore +++ b/asmrun/.cvsignore @@ -1,3 +1,5 @@ +libasmrun.a +libasmrunp.a main.c misc.c freelist.c @@ -32,3 +34,4 @@ globroots.c unix.c dynlink.c signals.c +debugger.c diff --git a/asmrun/.depend b/asmrun/.depend index 6b66a0c3..ab5bde85 100644 --- a/asmrun/.depend +++ b/asmrun/.depend @@ -1,1164 +1,741 @@ 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/config.h ../byterun/misc.h ../byterun/custom.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/memory.h ../byterun/config.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/stacks.h ../byterun/misc.h ../byterun/mlvalues.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/config.h ../byterun/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.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/config.h ../byterun/misc.h \ - ../byterun/backtrace.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.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/config.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.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/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/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/misc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/gc_ctrl.h \ - ../byterun/misc.h ../byterun/weak.h ../byterun/mlvalues.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/config.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.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/config.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.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/config.h ../byterun/../config/m.h \ + ../byterun/../config/s.h ../byterun/debugger.h ../byterun/misc.h \ + ../byterun/config.h ../byterun/mlvalues.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/config.h \ - ../byterun/misc.h ../byterun/dynlink.h ../byterun/misc.h \ - ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/memory.h ../byterun/config.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/osdeps.h ../byterun/misc.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/config.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/intext.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/io.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.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/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/config.h ../byterun/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/io.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/printexc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/signals.h ../byterun/misc.h \ - ../byterun/mlvalues.h stack.h ../byterun/roots.h ../byterun/misc.h \ - ../byterun/memory.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 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/config.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/signals.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/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/config.h ../byterun/misc.h \ - ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/memory.h ../byterun/config.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/reverse.h ../byterun/stacks.h \ - ../byterun/misc.h ../byterun/mlvalues.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/config.h \ - ../byterun/misc.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/gc_ctrl.h ../byterun/misc.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.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/config.h ../byterun/misc.h \ - ../byterun/compact.h ../byterun/config.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/finalise.h \ - ../byterun/roots.h ../byterun/misc.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/gc_ctrl.h ../byterun/misc.h ../byterun/stacks.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/memory.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/config.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/roots.h ../byterun/misc.h \ - ../byterun/memory.h ../byterun/globroots.h ../byterun/mlvalues.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/config.h ../byterun/custom.h ../byterun/mlvalues.h \ - ../byterun/memory.h ../byterun/config.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.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 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/config.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/intext.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/io.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/reverse.h ../byterun/md5.h \ - ../byterun/mlvalues.h ../byterun/io.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/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/md5.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/config.h ../byterun/misc.h ../byterun/custom.h \ - ../byterun/mlvalues.h ../byterun/fail.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/intext.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/io.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/int64_native.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/int64_native.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/config.h \ - ../byterun/misc.h ../byterun/custom.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/io.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/memory.h ../byterun/config.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/signals.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/sys.h ../byterun/misc.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/config.h ../byterun/misc.h \ - ../byterun/stacks.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/memory.h ../byterun/config.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.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/config.h ../byterun/misc.h ../byterun/sys.h \ - ../byterun/misc.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/config.h ../byterun/custom.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/finalise.h \ - ../byterun/roots.h ../byterun/misc.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/gc_ctrl.h ../byterun/misc.h ../byterun/weak.h \ - ../byterun/mlvalues.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/config.h ../byterun/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/md5.h \ - ../byterun/mlvalues.h ../byterun/io.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.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/config.h ../byterun/misc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/gc_ctrl.h \ - ../byterun/misc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/signals.h ../byterun/misc.h ../byterun/mlvalues.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/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/fix_code.h \ - ../byterun/config.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/interp.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/intext.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/io.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/prims.h \ - ../byterun/stacks.h ../byterun/misc.h ../byterun/mlvalues.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/config.h \ - ../byterun/misc.h ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/gc_ctrl.h \ - ../byterun/misc.h ../byterun/signals.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/weak.h ../byterun/mlvalues.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/config.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/config.h ../byterun/misc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.h ../byterun/mlvalues.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/config.h ../byterun/misc.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.h ../byterun/mlvalues.h stack.h \ - ../byterun/callback.h ../byterun/mlvalues.h ../byterun/alloc.h \ - ../byterun/misc.h ../byterun/mlvalues.h natdynlink.h \ - ../byterun/osdeps.h ../byterun/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.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 \ + natdynlink.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/config.h ../byterun/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/interp.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/memory.h ../byterun/config.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/minor_gc.h ../byterun/misc.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/config.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/alloc.h ../byterun/misc.h ../byterun/mlvalues.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/config.h ../byterun/callback.h \ - ../byterun/mlvalues.h ../byterun/debugger.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/fail.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/printexc.h ../byterun/misc.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/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/misc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/globroots.h ../byterun/mlvalues.h \ - ../byterun/roots.h stack.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/config.h ../byterun/misc.h \ - ../byterun/callback.h ../byterun/mlvalues.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/roots.h ../byterun/misc.h ../byterun/memory.h \ - ../byterun/signals.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/signals_machdep.h ../byterun/sys.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 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/config.h ../byterun/misc.h \ - ../byterun/memory.h ../byterun/config.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/osdeps.h ../byterun/misc.h \ - ../byterun/signals.h ../byterun/misc.h ../byterun/mlvalues.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 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/config.h ../byterun/backtrace.h \ - ../byterun/mlvalues.h ../byterun/custom.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/gc_ctrl.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/osdeps.h \ - ../byterun/misc.h ../byterun/printexc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/sys.h ../byterun/misc.h natdynlink.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/misc.h ../byterun/backtrace.h ../byterun/custom.h \ + ../byterun/fail.h ../byterun/freelist.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/misc.h ../byterun/mlvalues.h ../byterun/osdeps.h \ + ../byterun/printexc.h stack.h ../byterun/sys.h natdynlink.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/config.h ../byterun/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.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/config.h \ - ../byterun/misc.h ../byterun/debugger.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/fail.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/instruct.h ../byterun/osdeps.h \ - ../byterun/misc.h ../byterun/signals.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/stacks.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/sys.h \ - ../byterun/misc.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/config.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/io.h ../byterun/misc.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/config.h \ - ../byterun/misc.h ../byterun/config.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/osdeps.h \ - ../byterun/misc.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/config.h ../byterun/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.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/config.h ../byterun/misc.h ../byterun/custom.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/memory.h ../byterun/config.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/stacks.h ../byterun/misc.h ../byterun/mlvalues.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/config.h ../byterun/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.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/config.h ../byterun/misc.h \ - ../byterun/backtrace.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.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/config.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.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/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/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/misc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/gc_ctrl.h \ - ../byterun/misc.h ../byterun/weak.h ../byterun/mlvalues.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/config.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.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/config.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.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/config.h ../byterun/../config/m.h \ + ../byterun/../config/s.h ../byterun/debugger.h ../byterun/misc.h \ + ../byterun/config.h ../byterun/mlvalues.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/config.h \ - ../byterun/misc.h ../byterun/dynlink.h ../byterun/misc.h \ - ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/memory.h ../byterun/config.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/osdeps.h ../byterun/misc.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/config.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/intext.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/io.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.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/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/config.h ../byterun/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/io.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/printexc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/signals.h ../byterun/misc.h \ - ../byterun/mlvalues.h stack.h ../byterun/roots.h ../byterun/misc.h \ - ../byterun/memory.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 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/config.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/signals.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/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/config.h ../byterun/misc.h \ - ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/memory.h ../byterun/config.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/reverse.h ../byterun/stacks.h \ - ../byterun/misc.h ../byterun/mlvalues.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/config.h \ - ../byterun/misc.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/gc_ctrl.h ../byterun/misc.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.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/config.h ../byterun/misc.h \ - ../byterun/compact.h ../byterun/config.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/finalise.h \ - ../byterun/roots.h ../byterun/misc.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/gc_ctrl.h ../byterun/misc.h ../byterun/stacks.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/memory.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/config.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/roots.h ../byterun/misc.h \ - ../byterun/memory.h ../byterun/globroots.h ../byterun/mlvalues.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/config.h ../byterun/custom.h ../byterun/mlvalues.h \ - ../byterun/memory.h ../byterun/config.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.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 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/config.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/intext.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/io.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/reverse.h ../byterun/md5.h \ - ../byterun/mlvalues.h ../byterun/io.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/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/md5.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/config.h ../byterun/misc.h ../byterun/custom.h \ - ../byterun/mlvalues.h ../byterun/fail.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/intext.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/io.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/int64_native.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/int64_native.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/config.h \ - ../byterun/misc.h ../byterun/custom.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/io.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/memory.h ../byterun/config.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/signals.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/sys.h ../byterun/misc.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/config.h ../byterun/misc.h \ - ../byterun/stacks.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/memory.h ../byterun/config.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.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/config.h ../byterun/misc.h ../byterun/sys.h \ - ../byterun/misc.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/config.h ../byterun/custom.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/finalise.h \ - ../byterun/roots.h ../byterun/misc.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/gc_ctrl.h ../byterun/misc.h ../byterun/weak.h \ - ../byterun/mlvalues.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/config.h ../byterun/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/md5.h \ - ../byterun/mlvalues.h ../byterun/io.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.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/config.h ../byterun/misc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/gc_ctrl.h \ - ../byterun/misc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/signals.h ../byterun/misc.h ../byterun/mlvalues.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/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/fix_code.h \ - ../byterun/config.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/interp.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/intext.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/io.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/prims.h \ - ../byterun/stacks.h ../byterun/misc.h ../byterun/mlvalues.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/config.h \ - ../byterun/misc.h ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/gc_ctrl.h \ - ../byterun/misc.h ../byterun/signals.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/weak.h ../byterun/mlvalues.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/config.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/config.h ../byterun/misc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.h ../byterun/mlvalues.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/config.h ../byterun/misc.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.h ../byterun/mlvalues.h stack.h \ - ../byterun/callback.h ../byterun/mlvalues.h ../byterun/alloc.h \ - ../byterun/misc.h ../byterun/mlvalues.h natdynlink.h \ - ../byterun/osdeps.h ../byterun/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.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 \ + natdynlink.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/config.h ../byterun/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/interp.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/memory.h ../byterun/config.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/minor_gc.h ../byterun/misc.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/config.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/alloc.h ../byterun/misc.h ../byterun/mlvalues.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/config.h ../byterun/callback.h \ - ../byterun/mlvalues.h ../byterun/debugger.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/fail.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/printexc.h ../byterun/misc.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/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/misc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/globroots.h ../byterun/mlvalues.h \ - ../byterun/roots.h stack.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/config.h ../byterun/misc.h \ - ../byterun/callback.h ../byterun/mlvalues.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/roots.h ../byterun/misc.h ../byterun/memory.h \ - ../byterun/signals.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/signals_machdep.h ../byterun/sys.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 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/config.h ../byterun/misc.h \ - ../byterun/memory.h ../byterun/config.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/osdeps.h ../byterun/misc.h \ - ../byterun/signals.h ../byterun/misc.h ../byterun/mlvalues.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 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/config.h ../byterun/backtrace.h \ - ../byterun/mlvalues.h ../byterun/custom.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/gc_ctrl.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/osdeps.h \ - ../byterun/misc.h ../byterun/printexc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/sys.h ../byterun/misc.h natdynlink.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/misc.h ../byterun/backtrace.h ../byterun/custom.h \ + ../byterun/fail.h ../byterun/freelist.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/misc.h ../byterun/mlvalues.h ../byterun/osdeps.h \ + ../byterun/printexc.h stack.h ../byterun/sys.h natdynlink.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/config.h ../byterun/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.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/config.h \ - ../byterun/misc.h ../byterun/debugger.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/fail.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/instruct.h ../byterun/osdeps.h \ - ../byterun/misc.h ../byterun/signals.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/stacks.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/sys.h \ - ../byterun/misc.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/config.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/io.h ../byterun/misc.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/config.h \ - ../byterun/misc.h ../byterun/config.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/osdeps.h \ - ../byterun/misc.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/config.h ../byterun/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.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/config.h ../byterun/misc.h ../byterun/custom.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/memory.h ../byterun/config.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/stacks.h ../byterun/misc.h ../byterun/mlvalues.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/config.h ../byterun/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.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/config.h ../byterun/misc.h \ - ../byterun/backtrace.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.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/config.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.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/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/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/misc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/gc_ctrl.h \ - ../byterun/misc.h ../byterun/weak.h ../byterun/mlvalues.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/config.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.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/config.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.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/config.h ../byterun/../config/m.h \ + ../byterun/../config/s.h ../byterun/debugger.h ../byterun/misc.h \ + ../byterun/config.h ../byterun/mlvalues.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/config.h \ - ../byterun/misc.h ../byterun/dynlink.h ../byterun/misc.h \ - ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/memory.h ../byterun/config.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/osdeps.h ../byterun/misc.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/config.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/intext.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/io.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.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/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/config.h ../byterun/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/io.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/printexc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/signals.h ../byterun/misc.h \ - ../byterun/mlvalues.h stack.h ../byterun/roots.h ../byterun/misc.h \ - ../byterun/memory.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 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/config.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/signals.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/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/config.h ../byterun/misc.h \ - ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/memory.h ../byterun/config.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/reverse.h ../byterun/stacks.h \ - ../byterun/misc.h ../byterun/mlvalues.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/config.h \ - ../byterun/misc.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/gc_ctrl.h ../byterun/misc.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.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/config.h ../byterun/misc.h \ - ../byterun/compact.h ../byterun/config.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/finalise.h \ - ../byterun/roots.h ../byterun/misc.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/gc_ctrl.h ../byterun/misc.h ../byterun/stacks.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/memory.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/config.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/roots.h ../byterun/misc.h \ - ../byterun/memory.h ../byterun/globroots.h ../byterun/mlvalues.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/config.h ../byterun/custom.h ../byterun/mlvalues.h \ - ../byterun/memory.h ../byterun/config.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.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 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/config.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/intext.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/io.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/reverse.h ../byterun/md5.h \ - ../byterun/mlvalues.h ../byterun/io.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/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/md5.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/config.h ../byterun/misc.h ../byterun/custom.h \ - ../byterun/mlvalues.h ../byterun/fail.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/intext.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/io.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/int64_native.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/int64_native.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/config.h \ - ../byterun/misc.h ../byterun/custom.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/io.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/memory.h ../byterun/config.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/signals.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/sys.h ../byterun/misc.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/config.h ../byterun/misc.h \ - ../byterun/stacks.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/memory.h ../byterun/config.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.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/config.h ../byterun/misc.h ../byterun/sys.h \ - ../byterun/misc.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/config.h ../byterun/custom.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/finalise.h \ - ../byterun/roots.h ../byterun/misc.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/gc_ctrl.h ../byterun/misc.h ../byterun/weak.h \ - ../byterun/mlvalues.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/config.h ../byterun/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/md5.h \ - ../byterun/mlvalues.h ../byterun/io.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.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/config.h ../byterun/misc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/gc_ctrl.h \ - ../byterun/misc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/signals.h ../byterun/misc.h ../byterun/mlvalues.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/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/fix_code.h \ - ../byterun/config.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/interp.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/intext.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/io.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/prims.h \ - ../byterun/stacks.h ../byterun/misc.h ../byterun/mlvalues.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/config.h \ - ../byterun/misc.h ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/gc_ctrl.h \ - ../byterun/misc.h ../byterun/signals.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/weak.h ../byterun/mlvalues.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/config.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/config.h ../byterun/misc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.h ../byterun/mlvalues.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/config.h ../byterun/misc.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.h ../byterun/mlvalues.h stack.h \ - ../byterun/callback.h ../byterun/mlvalues.h ../byterun/alloc.h \ - ../byterun/misc.h ../byterun/mlvalues.h natdynlink.h \ - ../byterun/osdeps.h ../byterun/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.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 \ + natdynlink.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/config.h ../byterun/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/interp.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/memory.h ../byterun/config.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/minor_gc.h ../byterun/misc.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/config.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/alloc.h ../byterun/misc.h ../byterun/mlvalues.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/config.h ../byterun/callback.h \ - ../byterun/mlvalues.h ../byterun/debugger.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/fail.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/printexc.h ../byterun/misc.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/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/misc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/globroots.h ../byterun/mlvalues.h \ - ../byterun/roots.h stack.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/config.h ../byterun/misc.h \ - ../byterun/callback.h ../byterun/mlvalues.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/config.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/roots.h ../byterun/misc.h ../byterun/memory.h \ - ../byterun/signals.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/signals_machdep.h ../byterun/sys.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 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/config.h ../byterun/misc.h \ - ../byterun/memory.h ../byterun/config.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/osdeps.h ../byterun/misc.h \ - ../byterun/signals.h ../byterun/misc.h ../byterun/mlvalues.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 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/config.h ../byterun/backtrace.h \ - ../byterun/mlvalues.h ../byterun/custom.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/gc_ctrl.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/osdeps.h \ - ../byterun/misc.h ../byterun/printexc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/sys.h ../byterun/misc.h natdynlink.h + ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ + ../byterun/misc.h ../byterun/backtrace.h ../byterun/custom.h \ + ../byterun/fail.h ../byterun/freelist.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/misc.h ../byterun/mlvalues.h ../byterun/osdeps.h \ + ../byterun/printexc.h stack.h ../byterun/sys.h natdynlink.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/config.h ../byterun/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.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/config.h \ - ../byterun/misc.h ../byterun/debugger.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/fail.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/instruct.h ../byterun/osdeps.h \ - ../byterun/misc.h ../byterun/signals.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/stacks.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/sys.h \ - ../byterun/misc.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/config.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/io.h ../byterun/misc.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/config.h \ - ../byterun/misc.h ../byterun/config.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/osdeps.h \ - ../byterun/misc.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/config.h ../byterun/misc.h ../byterun/fail.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.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/asmrun/Makefile b/asmrun/Makefile index 633ce525..3e37ab1e 100644 --- a/asmrun/Makefile +++ b/asmrun/Makefile @@ -26,7 +26,7 @@ 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 \ floats.o str.o array.o io.o extern.o intern.o hash.o sys.o parsing.o \ gc_ctrl.o terminfo.o md5.o obj.o lexing.o printexc.o callback.o weak.o \ - compact.o finalise.o custom.o unix.o backtrace.o natdynlink.o + compact.o finalise.o custom.o unix.o backtrace.o natdynlink.o debugger.o ASMOBJS=$(ARCH).o @@ -142,12 +142,14 @@ dynlink.c: ../byterun/dynlink.c ln -s ../byterun/dynlink.c dynlink.c signals.c: ../byterun/signals.c ln -s ../byterun/signals.c signals.c +debugger.c: ../byterun/debugger.c + ln -s ../byterun/debugger.c debugger.c LINKEDFILES=misc.c freelist.c major_gc.c minor_gc.c memory.c alloc.c array.c \ compare.c ints.c floats.c str.c io.c extern.c intern.c hash.c sys.c \ parsing.c gc_ctrl.c terminfo.c md5.c obj.c lexing.c printexc.c callback.c \ weak.c compact.c finalise.c meta.c custom.c main.c globroots.c unix.c \ - dynlink.c signals.c + dynlink.c signals.c debugger.c clean:: rm -f $(LINKEDFILES) diff --git a/asmrun/Makefile.nt b/asmrun/Makefile.nt index ca24bc71..75fe2614 100644 --- a/asmrun/Makefile.nt +++ b/asmrun/Makefile.nt @@ -24,13 +24,13 @@ COBJS=startup.$(O) main.$(O) fail.$(O) roots.$(O) signals.$(O) signals_asm.$(O) intern.$(O) hash.$(O) sys.$(O) parsing.$(O) gc_ctrl.$(O) terminfo.$(O) \ md5.$(O) obj.$(O) lexing.$(O) win32.$(O) printexc.$(O) callback.$(O) \ weak.$(O) compact.$(O) finalise.$(O) custom.$(O) globroots.$(O) \ - backtrace.$(O) natdynlink.$(O) + backtrace.$(O) natdynlink.$(O) debugger.$(O) LINKEDFILES=misc.c freelist.c major_gc.c minor_gc.c memory.c alloc.c array.c \ compare.c ints.c floats.c str.c io.c extern.c intern.c hash.c sys.c \ parsing.c gc_ctrl.c terminfo.c md5.c obj.c lexing.c printexc.c callback.c \ weak.c compact.c meta.c finalise.c custom.c main.c globroots.c \ - dynlink.c signals.c + dynlink.c signals.c debugger.c ifeq ($(TOOLCHAIN),mingw) ASMOBJS=$(ARCH).o diff --git a/asmrun/amd64.S b/asmrun/amd64.S index 42172c94..97de5183 100644 --- a/asmrun/amd64.S +++ b/asmrun/amd64.S @@ -126,7 +126,7 @@ FUNCTION(G(caml_call_gc)) RECORD_STACK_FRAME(0) -.L105: +.Lcaml_call_gc: /* Build array of registers, save it into caml_gc_regs */ pushq %r13 pushq %r12 @@ -203,6 +203,7 @@ FUNCTION(G(caml_call_gc)) ret FUNCTION(G(caml_alloc1)) +.Lcaml_alloc1: subq $16, %r15 CMP_VAR(caml_young_limit, %r15) jb .L100 @@ -210,11 +211,12 @@ FUNCTION(G(caml_alloc1)) .L100: RECORD_STACK_FRAME(0) subq $8, %rsp - call .L105 + call .Lcaml_call_gc addq $8, %rsp - jmp G(caml_alloc1) + jmp .Lcaml_alloc1 FUNCTION(G(caml_alloc2)) +.Lcaml_alloc2: subq $24, %r15 CMP_VAR(caml_young_limit, %r15) jb .L101 @@ -222,11 +224,12 @@ FUNCTION(G(caml_alloc2)) .L101: RECORD_STACK_FRAME(0) subq $8, %rsp - call .L105 + call .Lcaml_call_gc addq $8, %rsp - jmp G(caml_alloc2) + jmp .Lcaml_alloc2 FUNCTION(G(caml_alloc3)) +.Lcaml_alloc3: subq $32, %r15 CMP_VAR(caml_young_limit, %r15) jb .L102 @@ -234,11 +237,12 @@ FUNCTION(G(caml_alloc3)) .L102: RECORD_STACK_FRAME(0) subq $8, %rsp - call .L105 + call .Lcaml_call_gc addq $8, %rsp - jmp G(caml_alloc3) + jmp .Lcaml_alloc3 FUNCTION(G(caml_allocN)) +.Lcaml_allocN: pushq %rax /* save desired size */ subq %rax, %r15 CMP_VAR(caml_young_limit, %r15) @@ -247,13 +251,14 @@ FUNCTION(G(caml_allocN)) ret .L103: RECORD_STACK_FRAME(8) - call .L105 + call .Lcaml_call_gc popq %rax /* recover desired size */ - jmp G(caml_allocN) + jmp .Lcaml_allocN /* Call a C function from Caml */ FUNCTION(G(caml_c_call)) +.Lcaml_c_call: /* Record lowest stack address and return address */ popq %r12 STORE_VAR(%r12, caml_last_return_address) @@ -283,7 +288,7 @@ FUNCTION(G(caml_start_program)) /* Initial entry point is G(caml_program) */ leaq GCALL(caml_program)(%rip), %r12 /* Common code for caml_start_program and caml_callback* */ -.L106: +.Lcaml_start_program: /* Build a callback link */ subq $8, %rsp /* stack 16-aligned */ PUSH_VAR(caml_gc_regs) @@ -386,7 +391,7 @@ FUNCTION(G(caml_callback_exn)) movq %rdi, %rbx /* closure */ movq %rsi, %rax /* argument */ movq 0(%rbx), %r12 /* code pointer */ - jmp .L106 + jmp .Lcaml_start_program FUNCTION(G(caml_callback2_exn)) /* Save callee-save registers */ @@ -402,7 +407,7 @@ FUNCTION(G(caml_callback2_exn)) movq %rsi, %rax /* first argument */ movq %rdx, %rbx /* second argument */ leaq GCALL(caml_apply2)(%rip), %r12 /* code pointer */ - jmp .L106 + jmp .Lcaml_start_program FUNCTION(G(caml_callback3_exn)) /* Save callee-save registers */ @@ -419,11 +424,11 @@ FUNCTION(G(caml_callback3_exn)) movq %rdi, %rsi /* closure */ movq %rcx, %rdi /* third argument */ leaq GCALL(caml_apply3)(%rip), %r12 /* code pointer */ - jmp .L106 + jmp .Lcaml_start_program FUNCTION(G(caml_ml_array_bound_error)) leaq GCALL(caml_array_bound_error)(%rip), %rax - jmp G(caml_c_call) + jmp .Lcaml_c_call .data .globl G(caml_system__frametable) diff --git a/asmrun/roots.c b/asmrun/roots.c index dad820f3..cb75a099 100644 --- a/asmrun/roots.c +++ b/asmrun/roots.c @@ -127,6 +127,7 @@ void caml_init_frame_descriptors(void) /* Communication with [caml_start_program] and [caml_call_gc]. */ +char * caml_top_of_stack; char * caml_bottom_of_stack = NULL; /* no stack initially */ uintnat caml_last_return_address = 1; /* not in Caml code initially */ value * caml_gc_regs; @@ -357,3 +358,16 @@ void caml_do_local_roots(scanning_action f, char * bottom_of_stack, } } } + +uintnat (*caml_stack_usage_hook)(void) = NULL; + +uintnat caml_stack_usage (void) +{ + uintnat sz; + sz = (value *) caml_top_of_stack - (value *) caml_bottom_of_stack; + if (caml_stack_usage_hook != NULL) + sz += (*caml_stack_usage_hook)(); + return sz; +} + + diff --git a/asmrun/stack.h b/asmrun/stack.h index 578e9cf8..62a33e71 100644 --- a/asmrun/stack.h +++ b/asmrun/stack.h @@ -117,7 +117,11 @@ extern void caml_init_frame_descriptors(void); extern void caml_register_frametable(intnat *); extern void caml_register_dyn_global(void *); +extern uintnat caml_stack_usage (void); +extern uintnat (*caml_stack_usage_hook)(void); + /* Declaration of variables used in the asm code */ +extern char * caml_top_of_stack; extern char * caml_bottom_of_stack; extern uintnat caml_last_return_address; extern value * caml_gc_regs; diff --git a/asmrun/startup.c b/asmrun/startup.c index d22e58fe..8bfe7621 100644 --- a/asmrun/startup.c +++ b/asmrun/startup.c @@ -29,6 +29,7 @@ #include "mlvalues.h" #include "osdeps.h" #include "printexc.h" +#include "stack.h" #include "sys.h" #include "natdynlink.h" #ifdef HAS_UI @@ -144,17 +145,20 @@ void caml_main(char **argv) static char proc_self_exe[256]; #endif value res; + char tos; caml_init_ieee_floats(); caml_init_custom_operations(); #ifdef DEBUG caml_verb_gc = 63; #endif + caml_top_of_stack = &tos; parse_camlrunparam(); caml_init_gc (minor_heap_init, heap_size_init, heap_chunk_init, percent_free_init, max_percent_free_init); init_atoms(); caml_init_signals(); + caml_debugger_init (); /* force debugger.o stub to be linked */ exe_name = argv[0]; if (exe_name == NULL) exe_name = ""; #ifdef __linux__ diff --git a/boot/ocamlc b/boot/ocamlc index 3340e82e3ed6b1df2071af0a305387fff8b125b7..142d937d3ac8086f501eb005ac38d45eae98adec 100755 GIT binary patch delta 141349 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
  • tWho;e;7WgXOVEpTn%O) zK@)*%9BC6x3m2-})sy)48?~r;Ecbw_M6zwQ`Me+%pn~^Y*JIVHfM0uUd~HqGUH_NYh_~ zMFMNZuVHHlwgk990sCKHSAE~e*RgHncahf-I81iDj#cFtDSN}(c9H@oz8S0=#h2{O z9|?y1ahgXq|Lkd>bq&5XtA$pNI_T;q_+xLXP8ewAiuWz+JrrE`7FuMV?0pL@c%F=W z+uHVrd*G%tn=31Ob+E8naQgd2nM|S;GGTyQL#@dF(@8Yyf@jDg|2<86W z%21~`2|t_ZW#+YyDs_2A1x|*x zDs50>N`?=GVO{U#*2qFH)Bq5@~lUkAnPIjOV;hYfZ|VE zLkjUXksd5XJ0kpI-0w|@VMRzc%H!Koe+-t9)>C7wcv6N|6CF2K#dVm9APNxcRRqT$ zTlG3PQ|h0I$gp*a_XD||ej_gLS#*b!QuW%$aqjeW*jbB5`P}s|kB*Wl?^=a?%4kw< zM3TGqUF)I<+}64frZgm2N4B}Un ziM8B7F*`oB)IYHgr zZQR-c%M1pmz+&NcSU6#s{sLxXPS>NPCMP1f>A)it*B7dUCfm{GFJM{1?FL`M2#Rx6 zUt(WcjEvl2mE)^+hn3qyZ?mL^Bs0_3-5=w~$<$xOYKtWQ6DV(Vd4r$FxB%uJz6dq< zE9(;DLX3m`X1e_Pl{Lv2i%~Z2*^#+Bt!Isk0H*gPxfj-3?|O`jgLEHVk2z4kZ?I(( zo8rI0jwx){f8Y~5GnTg_B3hlN3F@BFJ0g1HrV@)sC|7^W4NGAswDWdZV?5<<#V(8# zj<0Lr!okn5kNWc&xEH9+zpXo?#-UNWNQoPf97A2zWY3e@f1}sH>d3#bXYj<@IQKg= zQcGqOyCfWaH8xbrvmyak1MzR1Ieq_JQ!Q7VcAQuy-Hmk6U}cxAKh%ru^_H zJ6#sdM&D5UJ*FfRRY;P%;Ct(`!0tDiny9S;tcCk(#wzm{ty64kiZjKU(RiWhfMQE^ zKyTRruy~BDIbgNCYt@{xxAjY&k^7TP$9mw(2AEv zr&-h;WZTCMO2?}(Py2jPbc!rH7GqWIyx8(|s46N;yM{1Su`gp5&vcxh>U6(h`c6^M z-&=#zd9CG`_anhDE_rFV0SMD}7B)TeO|GhcI=O>`lwNE84y4Lt_8)<)=N++Tq4|~{fmX!E(xX;}+MP*SumcFN%+jM6BQ(gdqiVld%`aA= z#e6ORfGqN(BUm-jXW5!zahB{?pw=Mce^sh)-mhv|Bz7`}EDb+f?QJdQ*!T7;bU4PF zlhIWcAG3Pm@5*BsD=B2LqHz${5A8e#`#28E{AL}9;+j;1RPR7{*5-GZ3L2#3ckG!g zcWZu!0>!7l5re7*aT_gvkI>N&wTl)FJu%=Yu_V~543bS9?A)$wE)8}L{_Y6Jp*NH0 za3xt1n_(xbK0iRAkQD;?73({XylI~qudqc*O_&CW@YwU9wB~zk+CoCj=m$OaEXegV z!>&N@wAZk)Pu=YsVfXR?ep;kGY&a=S{Mam0g7{EhAh-!PvKiw^VODPvs;9><_zb|w zu}HgrJDP6D{T<<0#U=_#QIuWOwA0&%C{}Tw)I{02xM*-kl-=tD3w{}1n};R~0$z#N z9;sG9nyaUXoc3hp2V4n@>@&r5Q0)lCZQE||Pu_wOyqdpCdXPdK%)PAAi z7;mV^!Ao7s4&xY`y5}q>ifmRYW|Hlq zqP0o3=|Kh?laUfs;KjiW$@Y7m*6zj>TR502Nws^a&B$5|$zg1l<65C6)t-&ixoM!5 zdT%~W9!j(M4pvPXco5Ierm5_YrP(|zHL<(euanJDVMQmKPm=EH1dhff zS()}kcr}>{vMy6;l3)qkU*h)j+ZLIvu(Q1h92=Wuj|`Io4n6caj&SKtB!7_YNSfo4 z806)xStk_y*>Fc>w!Kx&w{nmLHIXhs9rD0qk~ww)z_#YtOFh>}Sr@c$ ztgPu`7Z}%q!LqUbnAFwgc9gzd?MiqXyQ*wQVl;xUY2B2(RdrLEsJ0sgg+0y_&KG)7LrXl0+FjZfaYsY!6lWK%DX*aFcW8J!3FmQ+KksC2ChWi+<3mo+Z z`DMC1)x#d&lvGztDMo*c=3Yg@2TO2VX@l2_Azy1A%c-h+1-rxYz{n6ZFi)@_SDS)% z=0Up4B`qH<@?`0<&H<_}f zpOq=s_Cn>#Wp*!gA2-XfUQ8(Ez3u)WZ%uD-6GpPVA=I(bwvSz;)>4656K))&5l_t* zWcWYH{62Pm;t+Ha6pwJ8*o0idG$z@GIpB?hGf>=7DLaFl>B>#C0 zE<2djIQT>*u_@b{b5tj>=^UjJA_mwc!IAd=E&ZASc3+jSHSX%g^rdxy{rXv~Bw00- zcr6AW5rGkCA>giV!m6sXrO%nUhTPdn#z-FOl)@w)?l3mW#!^;mc>4V zji&t|0SDP*jTyn62mPLoz)*jX{obWBgR(`S4RED!Bp2{f@-^!e@wc2TUMhz|+v2YA zLlJmuy3p?8nJqbk?fy}>Aw_Ie#Sz?@G}t~&Swvu`?WLGw72Npy9M7dDTVmBY|+ zV^{VtFneG-`?+ju)`8@`4+*Fmbp1msOKUR`B|7{zh$ z!Z?W~Rw9!A1MqcMv;p6^cyG8JxV8~r3gp2SB{XgH)*ug^8l>ukAi>@8_2(-w!gY{i zFD6~c)07p;OsEWK8fiJvgK7QE8a;x7C>L7J0=1G6=#bR1mtXcII?-Z`v{T|21D1=( zS`mokj>XNNEmgXD6n!dD4MTWV`SBnkR1ZxoB%4N|zgs7JN7-rd%K)Ks3lJpvd~_<$$guO# z1tDaf_1UyZs`SfN5fbNn`$n$$YLRCteqTofSp7g5=@8Z zLl6z9-DB;E|KqC4)Qjwe7+4&-2y>cZckIO&E#R|koEk1wjD!>VFYy{n1G{1Ev!PdeME4AY>oW>MzynQ76=5RT132G4| z=B2hjOPi%h7yiw*Bt7ZtdgCUgOYO7^nuBtvtU-t2Z!a9P;f_997XADij&TT5abbDL z8e|*X`cc-&lja`26w?TBoo^z@^Ni$9v}dY0C9BPnT2!BRa!*4gm9=cpWp+Q@c0K07Y;iITQ4Zu)bG=$TGVI-mx;fukjLgOz~*J%QEr?#IBZ#8^E>d2tnUYp>|rTfve%PR#$P7agUi{ zlcNI#W!%`*B5FH!@r^L~l}pu)YHAf+&F3ZjHXDK+#VgYGCg@d6iEpxZ19W0JW}~or zmjjD(*;sDpw`fPovhKr+07RC}goUR;md~_%B{r=> z2SHi50`mtT{Bp)DJ1#2}Olv#cKNv_7NH%R2=+PhxXMw(N$nseVxgE36_zluH%bu#v zghT**C|ouict9NpYLJRs6x36t4~w%%Y^_Gj3L8l-+{RC3kk zn=RS-Mx-U9k6L(Krr2wpU^!#t9J?@U4fJ($t(J)DkX_zF94WHTT|LLHG?YP$)z-XD zv%4+zH+hrY>37)wq+Mg=JbS+LHqw!*-BPOF$xf1k^X!{}_S8G=zEyKxidNU&vN;FC z`J|{UIys4@WWljbm^({fYc5WRPM107dg7`U-EGN=J26OZIynFUCV~y^PP-PlSKVcA zgw##E8=Vk7-T9!H+9#7MYX@K)w0JqrmQ4RgL>vyZV2Pnv*4$%HQ+;V?$*2N14ZYXi zj)WNt?3FD#d5%Y^=IQI+Aw~`?fEsvP`YyCx`Fu4VXj*YG?7^l~oDr4Qjuj-R?njBZ z>Wm~~xRo45jxnU>E9{xXvrZl5gS~j$X;B{TMj6lp_oPKj^=mlFl6hGS?&7;VIze{w zzr!}xnATqE#jR!wq16&(>V4>dvA%yFNU&ZO-fwU9)Jn-Bdza@Osjjs9O7SyTIa>A~ zbhL{qVHx{7LnmS!4j6wo)wDn>Onm_{j!W1Gtim|BXFbw$j*~uws*_V0_M83TCc({t zTM4%X?l(9SiOz#7XJY)=#(KD047P|6-@SI4T1@SPC_fytD};-c*p+s22X>W;Q1G?x z4=0`!&y0#zi%tN+ftuL6afWB}Lv}(E;hCP)rO2UjtsZTZF^|~kQ7pZcWGqHg_p7o~ zaLZujgSKAqRDAFO^lc zzXLTS8AJ~sw2X6T*BK|6k>xWF*=Hv)yg7pL3c=JEl8Mbt5`_2SzJOO;JkFgMyV_FK zQV@?9YBL|PQ<~yKse8E;JpyIFsb2=wy+blK!e*NH7{n>P+Po?Z8A45#)dH&Q6J z$Wzt!w0Jfim)~{pdN<<2^1|;!4sa=jK4NHokwS4s7?1aP<%BAE!3wp%5Pd$sy zB8uj950-)OEWsHoz|6SCY6V)nShlSILGZfH3M_gQ%lehdt9)Js);y2ZhGH4{g6c)e zU$9qu-j|$J2#j&puYwgF@5_RlakJhx-$)58EhY7Wry_KnQ|(fUA@(Q-R*-N`|c zfC&}NmJ@^Q0O#PJ0{QsFAT-$MTs}E9$kvmCpd3}ur!7F5u2RtWu)>9K)SDLYMxFIs@82S~m|ux7g;etb=SM~mP! zwRVN^Pi!^5A5Si87NQ(?L(Qm^S=+B<+Bwjtn_-RMo_w5VM;~Nxp4eVgd-R4UZH%#{LlRFc+N1y zY{g`RvR+>Yvmu3g!ZFJLwcPd4Qr}4ayLP!c1K&z&-oQO|o8Ps$yKKk17)tMu*nij) z+kJ~XsD#a=9JeI;B>yz1{#G(` z18RatyElM*q5VM}0uO8i4KUt)4|;Z=RKAA=|1Fa9J`^J!5Pu(wwd`*w1jJKUd%YZc z-yUY`E((iKJ+O;o@&}mG{V4JQW)cutJ)uPNa^F*m8$+)c-gL$6}+Sh~r+ z2Wby%;w0TI`4H_5tg1i4L^yO5P2MFkY}bED*=BSVKzcJ~CjVAnVZfxE2L4X!H`{BF z<p-bTQn&gWrYtTQz4@$(w0?*kUX-FhY$~e}l$K)zjy+f-Oph zs6!6yIxNZmEIN63RWM4oLnvvA5yyco5xEzRKe9T9l6sKDxVemwvQIGBcx@AI&tCEg zM%~3fTHPft4@d4tJY*)=B=2sdip(fY_&J7 zNrH=UUp|JBrK6$};wjaX8BWyb$H@AvcA+|^NxbfaLoJmoOo7j8lZcF?V-hm9_9-Lk zZz=fH?mL{6Iu$u`0YhZTJZ2ahtHv z8`p-Vux*GeHQ#?s8S{HYQq$WAcoFwi z9P#P`M?69~@vrzM?Z`sQWaDRc|KX+hQ=_1(cm=|k1^r&ZzfV=Ai}211hSuw4{^yYA z9kTp$yC6)ELs>g36gZ1LIDdXPD%KO#C<<5kK|x?F`?=BpPi?cu%A6h8=j$BwM$3{{ zd}n$LsU42tX}TYWS5|GuZcMTV$%%R1x~PnFQs)iaGIS|?FG$B0WEeT;H;;ThCo(B& z3jS^_X=9zV#E$rrRA9|Xusv`dIq;<~+5Q*)Wa?-s`Y z7sUC-iZ=cmv_Flmwxipzd05|JaLk=j!Q9W3y6Tpm`H5c>IoI!X}oPA6v)18KI zGHWPF_6A9^>pQe-@#In!yhoUTRUwj|+$P?*!B5Je`+ugp~4tscv9NVs} z%Q;_QhJmrf7uYPc&s2{l$B>m-G;>z=v%rH=8B#F@m&!I>83GlJD??=28_?a$zO>H_ zonIdO(jF7~UA)8YZF~>4wHJ5!uh?PV(C5|N;pd+7aFU07-5rh%#ow2J$qoG3Dh=_` zQlA@*J)1K<)@fwJU62c=(J-@d^q;J$^I$$-2g`{T-xAAz8lzY@_8h+<>J1#jei+BF zbrvI$MQE0>Qhm_MA4kd)gw+2Q2jEx=zgfc5C%8{w9~UK4cm)5Y;PvG6s{glH}mGko-m*_I?WP2pl_s{ZjpvomP>9ZQ}&hJaQhsi{XeF zv+4+^F?X6_z6&=RG^hF1NK1JB-Ves>?={W7pZulKA4aWG0I<+(I9<)5zo44gsAdWt zV~@>`$*9U67bjg}Y8 z`|)?jp99t85TB(o3;I2SesB21f|{!yR~8VCJk0?-8+14v8-L0=U~ms*q(3vXiD62CtI8fC*_f~rsXa= zVn0t@`u}3PDvv~Id@_2YyY^T6S=&B{hGGNkbIT%~ULO09{+5+dPLby)ITq#Adw!N3 zUguENXk5kN9UU2WE}3rt9GjRw`pIyl#9`!c5&XSucl_8AM-Zl2U<1B!WuxVcj6aHC z&VGnMAh_l>?|3O5Yv3^Fju@{rSk5Rs2y$GlD=0wczxt3xQ*`mY>pObu6RP$hf5@9Cgk8RH;@&Ycr z!RvfZQ3rB1aV3ZekZ@K3PvGEFv@Z3%{XN=LjsU z9#us@r^(`jQMg3xc^uI5#yO9L(W*`J1X3I4a7@w-Vfs)kDX)lx8IVsrEIy2Gf8{er#*0qVw*u+c(w?rl<$)WM3 zC<&712ZZh-1Clp03Hfzy5nP)DCgUw@;WdDT5)Uzsh)9UfZV}fv*(r?AK`@ms1WL(k z7g?C>WQ38dD?o@PJGG`Zl}*Xb7^ho{0`S~4pIR81;$*~kZ&pqZnVsVFO3Vx99mX%R zKE)~Qlpjn1-KH?>*(`_CB&VHIka&792Y4aa&2HBWyIzP7CrxcT=c)MKCkpnvi&LF0 zp7=h93`Z*2d#P08SJ?zIl9LQ75$5 zxC9{KJ(OBu2nD&c1xOig%$CI+os`QbG>-#@daQvzRi8ZZ4`4#aBbNa#yc_U!ax(f{ zj^I$GR2&53FopujZodR!;bRg$m>xf=MULv?qAOYitAWqvPIzH$a*Ldb4n!ok(_^M7 zEs~~XLIq!m;Be)zqw@)5wzN4IP!E;qsi%m)`V{fkgvT2gDIXYxy}H*TJe;zM4%1o$ zvoaOeh3C?O?XN#Y{Pa`Am;G^kMXMYB7@*aSr-;Al6!GPM7!OIm`40hblETg}4&K$@koc*P5JO zQTHQ*_EJ9)X34xRPRePE{-AE`w*OU7^5YQCt8)4tOKh@+_M`ND(2Z%zc5_95BS z#VM+&3I@{z$l!;A-P3VuHt{N~*t%xXFDIVi_OI~~)2Qf4AoKNFlKniL= zDoTzE_qk@iQ(>ql@<=zWey|33nzQCC?zkf!T4{1IkUvfhE{0<`jU$BPNUaG@7M_lo z5`#&l7Nip9=3eIpaxUwb+2J?H!pjV?hZI3T zY)$O!ssl^Ys;1{#UD;yX089c=Dl~o!Bi?Kl1tU3qou&3FG&Y&FMmF_z#$zL~|4e5- zUISZsrn3@nbXkF$hk3h-duu=E!w6$FINgI=XNm_vf4$;X3~<^S#;caxFw~d6{N;g; zX}ktz>TaaEn}<19+J0sRx+kLx!6I7P`^8Ux^q#4@pmxt>KHKcjn0+W zK3H&*Gv8RR@JN+!Z*m^SgF!RPQOZAX6+Ei6frX^W<3lTOn@`>x=N->S?twW#4sT1P z-R`XM;3?&8cQ_-BI*?%~Zd6%2*TJ5)FLBm#!d$1lu_YM1Xs(lDd>r_20rRhjb~Kn# zxH`f?Dw?Ewh}6_M8CA;)E&29tr%RNAli2xauOTvZzOxV>A*9Vc&b!7Zpv!#hQpoFM zCOkMGTH4&}^ftBz+C&!Lfm@w!y4RUyd}^sng=O4YCq*q>4Drf~#n{}sc{WZ(j9B2@ zY_l9M@E9ujuVJBl=K?2MmF;y8EO3_d5iM0}>WHXlcinwXoF}Ta;{N>oSP)r-0Jq_O z=h+D3b4#{-5RoeD9&{d18N|BdA99X(Jlmw`VMmO^SXlbSOmZ6@c6u6~?UFCfydaz_ zFghAv09Rg-w5$Ub?iT$6TSto@M+f(%+xQn}rXg$J#kBmP$DE_aKZDhL=5gm!d2@r4 zA`dNduDn85gc^-9t7Slk4?`I0dcts8G$}_{!%=RShT_REt$v5NGO z!l<{ZzP=|(rvC*})9-1pr{`<8`fm=d4gW@Bmpez=@#HoOWF~BJEu=%-jAvnN&FhUY z7Pb<+=Ydazrv$?|JLm()w3OU$!Ha3WYw z@Xvy{NEp&ybjBFFEQvb{H&Kl)G^5?mUvzo~QW}zfo|)`szU)jgcw5-OzvB#8@qeQ% z_sLhB+dT657EpZuo6(l7NfIw3Uvp-v{M)!2Uqh=x9!lPDrjboHz3GgFYROpRRN-s& z8c55(rGAZb!1EpMx&vCI2NrM-JIQYAx1IAm#_k}?+_cuY&;Adnz;e{i%d|%}I2~nB zt@EE?W%A#FbpKaMK5>Rg!#mDJ_MRs2iGO!$JbT5r&Y9XNwB6X2BsqOLX0Dhyzv&>s zK6leP=a9$qz0|(zR0NAE{D-s2vtMF2I4g|pcnbgRe9yVgI2a7x|F$N(c)Z2<%i&-L(=#mH0DuRvmm;^ta{sbTQ<8GeIpv{$^i>m zWFQ=WWR;(w*VY27Jn>m>-e$Bm4EiN?ut1)YIxa*#$7380*1BPfGYJ@%e2gxSY2zh7 z%}%Qta2S{7f9yQrIl}g+3zDtZR;T~Dgd(eVhNE&rBdH&0PnJF<%eysOo%KdA%bA~p zl@7bUZO$gcK8m~o{89gfvor`%@g*RFZ&7sH;anHIA+vFBM6&zx4rgG5{Yz7_V>_Wn zezoN5i=(sMCH2k&9^+V$0f&C$q^KNinevU}Z}%G#4FtMi*f7%mjyu_$-A04rfo0!1 zk44Jd7+;E9xEsxm6AAC^c2*hK{(QrKoNEn3`De(0A}EN||2nUGoCvfRn<&zjC-&eD z#lw4?6oW-!nS22N)n7xM|}*zN;+of%$rH$(ygs5zRni=-WN{D#k# zfd`#&Ml}4zQQc(SLFZ~CCiqcoIhI>|$a&g`V#n7?9i@=;!_I9+Ynwg!%ZHuLk)BQN zwqKnb!;VF{0n(QxVozZD@6Kfb`nwgsJ0n|D_IbR4sosY-PrnU3sM`a+}G^sE=$wo(8I;I%V0quMVo=#Gd2DFV--%s}>^v{wW*JNU{xT}TAKEa~9; z0aCLt-B*r_85`5lcK9sl=vxVIZ%0rOx5aewWq7(uekWfEaS;<61@&wyT6mK zBP_#c>}e!-rf+WmB17)>Bc?lJGOE&dN6ROE-*1Sk>+G9o^niF|#iUE#9nh1-*}gcp zGz+_R(7M&xzHPXo1g{AD#FHnnU48SIZ?rGXUDefx?k+!ocEbg}1X=fDWP%LM^_^|> z3}dZa-(cf3@~$}DeII&Gmu=mB!#uqtqld3=06lEq=;7;P^bX>Yo`g-U7;E5s#SW~t zta=~Jx4#SY^yY4m=$+kAR(hT<+USEO$i+*ZL-TxbZPRb4 zQcvdjev3eX)u;RLxW?toY5;cTeRsO=B82wu<;%F3N|Ks|0~K-!rI#(H!w2JUa??1t z$#DFI#-A{qThq%I%YtjqK*J4j>(4+lDk+T@^Gsic>V0vUQ+F!^k9Y@;ZYeB5mNR{i z8D~N@tix@gnP>Tq8i_;&|C*Rup(gofBcH&Zwbifz4CsNToPIh;IOlBNC1DS;5MSCP zTS@g{>`~hP1=haP&p~4jai^W*!!A`)Qm;u2aSseYDxiztjx%_4k}DmBV~#nJjbzobF{<27e?lq0h19tt>O$(?=#| zo0ugG^L6(OVA4huS$Q7xm8XDZ`Q^>wzRN(%6!9}C(Qh+dtLxPZmS`Z$i96tr{YzkG1a|xE*fp0dtk0_e1tL8Ui_su)t!8|?@^EEYB@F^Dx*~P-s7t< zu0gN(QBvJgseniSlJQOlBrzLZYa=^9fC@FU-`s@Lmq*}4$D+H@w# zxS&jjHiN$5B;hxnB>W~FE;aZ0>TzbP@_t`nmS(%|{l1k3t_+*<0QA_Or1}A$-D>ef+*brN@C9KK2(L?1%bOC_Kl1xL20cd z_I#{okA4IS=vEp3h%Xg^PVhQ^{ydLRt)j5WS8x0o9isSB#=?#v_v{l5Rcn(6MUch##`ud1u7`Vc+Vd6Q_0VMjeX zO5C>2TU*Yv)Ksj6V%<7#YManf)A@p~@)NO98=$W7_R2bwV_ti`w_~?Zb&3A()LP`o zm?9Re_pV{Ti|7sL27eD^Y(O2#$xo8vP7`mUkvIZ1uhH1%VRPposYzaqt~i8_CR49Q zmmflh-rj#z!to)5G%<2Df!Br5(N)OR=rTj-8dlO_*`|7l>5Z>$iK8kBucS*4p^N?t zx;7znjjGcj|4LI=pFh4@Nl1HFK^nPTjgGFxTsoSHs);Tz=yC5gcpYt}pNS{DGdxS& zWWf8R_g#jk?e{1ZjXhbKCENpbs zI(a8zu|3k-MzrMSGl_(VhXla z*y#LEP4>RO!QWpUFDkm@Ge&sCKLr?hnsZxp^_M_km?8spQpd%~H@sc=DyMtw{U$CF z9`LOGZ$zumshXBFRnr{gZofuZRPVPQ3}n6K#bmN2ygN|6c%o?st~D(&=WW#e>OjU$ z?<&=gh6fJ3CwTy?H4dYbo6@l~v3!75fHH_w?!C@bC^i|3SS!z|JK{o^O#df8${B#vH>2xh}o34zJ(HKWT!kdfx8*^e+!HQ)hJMd9!r9>SNz87*HG!RQ!U=BNB4bJ6?QR$7~?q zsEQY|-i?aveG1nwmqm{OW~_K}hn5Kler?Sfm8m4{6c*|B&N`p(ndS<<0B zqRSa{NzVxX84QP>72D3Bc+Umuob~pge24t*Js2ie!$j(JVKK5&o`<0yh-hBrd{4^1 z;3^+j{D(J-d0woV|*XP+(6&7{gI{;dbKkt3cX>#5R-i&6{wNa-) z9Y$+xG-{z9U&6)I3+PBM<5lXo(mjngr+epkUUI~S*6uot(fyaayV&1X*jQCpvEuwt z%;A4qfq51e63@(ORbEd*rQaM_!_35R+=;lWmN^zL{E4Y;F6S?M#L}&1^8nmv0PZ*! zUay(OUI~o%n(G+b8n|GZc+F5C5Nn%)g}n-m@nlm1r+3j*)JHY`UdPO1udDd{y5{v* z(<6A`L|wD4&fW+hq2n=qp*J+AVo^`>ENf^k!O9-RSB<$A@3x3Cld;67a8ag@zm55r zawDqKPGmfsF=aFt+UBcY&tL89?^n!j3kVVn`{X%{88P96LLnHKvhy z6pMoyjm;#_?y9I2jm=xCcugPVLV@h}uBg)#j@i2j-rRp$WHvFou=j+&38eg|s+7G= z%n^8fL2QiK<*LH=h~gL+`ggHC#_S>IRze54l-&oEojbRZ)diQ;gPWRpp8r}O{ zmuHPow~e>cSIZ)kHwq0GHb8!CYT4L*{Fs|n(G0o9bHI(?|vdiwJ^uC|A~z)U_{(Q z+`>$dOBpT?O(W6ih}xnw4Yf_tzonVrr#{wgrbObRX{b%vxoM)w#70LNe^-YSy$g3` zUJDpCc{fej)7dG6SG>d`8jABRO;alD=0b{-G6*jRIN_ku?Ze?b}bVpj5N!F)O z-yJ*R!QDhNR!*{kRci0@PZ3#(W_Dw`J|`C;(c}XMDlPtQqUn$O%uVXRAyD~=>~j|` zrnWY-JzrEN_q8_Xpp(gLWBTzx+q-SdA^b~q25j?{OH@tPA;4)S$+d%0y1kqU49W8F zRoK6F;kZ8r?ny6nHbv~$Sj@TH*2H5izl-ORQTgAvWYu#2)`g3c$#6XQ-!Yu&Ca0K< z5MPjDX0Rh-TZ%b@eHTbR&fV2iT~&krxGwZx3z+#8VQYlKf*Q!+fi&Z zWc|4Y+*cyIlNp0%vj7LN79zTxsDbPaN5sh*a4$KyQ{r$sM4iS9$<3H>=sUIXO}hw_gaaFZO|IkBCj{3#BSl=C%E(sUge_*(EM@@lyt>Plognc`kpo6T0~%dC-Ye~{SYqDxvCXQIgG|9z`L4#+B38y za)9c7%4>iV-8u1GSMyHQHe$udZszrVYQxY*wkn#vT7!+$&}$Gueq~$*9(EOY_*LMw z6rAG*uEg%psc~%p`XB@9Z0MFN*Reg~-5w^EQ^ok6W&-y_h=o1PwVnt^>=d!Fmzf|2 z_cGJCH$v=~hf(T7P0YF;GnC*Y1~uz?qgS{rqBG1~kL4iIYh{?}+>Q{hW|)I{od|KN zF=khr_c33_d0C!%PV_Nv^3<&qCSgT=&16qxrHse=n(5H*KwmSfaXmoEjMT!(jP)xy zGy0j!Jq;?85ELuU^fNnp8oIDRYJU@RWOD4;#S`U%r5=IR1I$^haWsIT;u}>G;Y6FR zu45A#yVn`y7U+s9<x8D{(rOmmFKMSg<$KG~o*eGtH@?gZj23@R6n4a&arpvTIDW zyv)VE;kYSd;xAZw+6y4ZbHpD$j#Zb-*T7P|afFz(gGB}2A8anwA#v1jGb6Hzqw2Fb zf6?jYoOo=wxsJy~h@l@uU^(qh%;QbZGJDD)DVeJkHqw^N*3>B%hJjgT5{!E?3yNJuVMAwmK6xKAeMw(;sL2{=lh>au7UGg;T5pzaiK!}%OUyn1v6tVJp zoQF4v!`Guj-4KW!jjk5!V?Ab>nPSCAJa@ixjQJ|?3&xtMct6y0W6fNo>fB%+#Np=~ z%*Bq-jZ;x`_KoIEffF~HPcx6NGUs*U%{4p@PV`B56LHMIob{n1yx5}TCRi*!Ld{?9 zUW_Gx%{Q5S@Pz!?o6G>S1J6xB5#>v#8H!GgtOZ26=g-|p<3Yr`bv(p$b2whim5nj* z@3mI>xV1>I)=8*T-U=4NU2bCMVBE@aCdZt{62Jj0BZ+Iq$E8L%;KhMxhm92a#8%~GTm7h*JcJaDiO z)eLB@B6Bfs8$mY^M9HD?G~^_Eaj~(8PR;>uF+5Ni-W`~xe&|V9wYQ5YewbwzHYWR0 zfk|iAPsk`=4(L*=7k*VWEY`GaN-;>wh$zy}qezTe3Xe-L$$?+wy%m%Th#9UD2 zLZGVL)Kc@LyycEY1b8rb8?Kb+w<8Z9XPSYDWoAcpqVfs|P4FaDR@km`v$#4V8V_!g zn{C#Gj}_0xu;jQ9v&}8_sK27iCMp&+gJhUF#@kLTn`5eZB78P)FkU>cc@9QK$HksG zW-$&u=9;Nu#VhEv>^-<#Z}%v^6u9D8?b^H@*y$#yLvzicVPrBxR5Y@qpBgmJq+8K4 z=bJN(EAmX0d3N{YB7dqBS(&(Z#E%QA<08>-X7MRFL)XQ0{R+SND|~A4Ley4TV9P@4 zTF;4nx0^#)`#{Vh^fJ=U;eqVMW~v&r)xv8x%_F=+gh(5Qg_8U4fbDk)@15p;tePIa z(;VA79hRdWz9BYhHZ&baF9jgGyOrqPR~ru)jmpSo)N6K(5N~9K#f#NT&7qi$JF*o0 zoh8!mLMyh!op+h3VVxkok4QZpo+^&rWj@V2M+E2p0#_`gbs=iVC08R`{PjW_>naW} zH)D7=WkK=cWt=T~-)+{e;SEe0}e?t#pE$k8{5IV+$W)jnP-gqM|#fx{cjKp5*C5Koz_ z!ZEd!^rD$tOLV>f_j~dcvk;W^x0+MwDftDjNzZ=lH8V@Kx4<8-nJ2?}p9r;v%ilIf zH0}%Ksp|USI0469*vR$!iy3d5iPivsyCc~R8}52|8|E4m*!Q-XPzza~eb3yl*L=%E z;NS=5MuTUfD$q}fXFoE(V;=@qevEDpOW}L=<5KNfk@N}7H<%7R0w+GfiJT1yJoYKF z;6s&v22LC>Pf?e3_;Ygs4&%R&4Q|gDW_EX~ExKYNWrsmavL~IYsD=`-0WD$G+w^eh z9r0rAiEvX)pNqBCwFk|GSTBhE(%gs_A@2JUSzV=2*@w(6EQLBc>fNZb?t_iI->prz zhTU{{AmeK@D^l9u3amP9_UFyApe^xHXpN0{=mbC|86nP|HFsH*1qBkbC$Q^RvoxGv z7eP0e4ZmQ1X2gvQ5kYLDs->@gFw;tBqaR#g1^5_@N^>Kk#9(IKE5B_!9FH=bVb&5p z7UzI?Z&Y9fw@y)g`Xj7&IlCc{X<12JzI=$zL5bK%J?ac(6IqqDKPK>G9qTw_H;Pq} z*4V~_kUfQ4u#Lgyk`D^#^{o0_ydPzme)6*MAfzIb`6zu;we*B)>50|S+11jMs-<(P zr6&i|VnYL~Wn^v;AQi|H2O3zZJU>GC8scvG<_)cv`4kNC{~eBH_9@I1zc;j&h}Rog zO~si;mQS>6jNPYER#!Gt)QPrYcu|D-`Y;|C8GavbNF5w)HHt5GvLFYXij9VpRAx$3 znP*+WadQXk5 zTkUsOOW#v1y`oxrWwrFZVn~eDh2MvYYKlAK9*wcm`28vo;hK3>gy{2ASo2kf{;VzT zc)nJnxCbDFPHZ?2%X)awNxLVn)q(L%t+99uR)qMl4QtE)DLabZf#%Jv+O^of#P*hW zVa&vz@P_V|)-3i=0ON#v4RZ#T^~2Mv)t;;{qEySP9JkDB$iHNs0o0D{Sty&|`mtfBbLoPy99B zuRZzK1lm)7gMa#O@X!1u9_!i9{v`n(H253*^M8YX;ji$tp8n!r5dgpOZ}6M`2LIAu z;AO|W`7a2lOWN``_?Q0%|H{?ze%TtgUY$VV1Al{m^>6U6T@?@eQwd+cDuKdp`y2cl ze}jMXYIyO-P){B4Pgyij-NxJt4O4(I2$udQ9xT_T# z`EQU^?L_F6y5frvDeqn(g*dytSDh0UY=MpXjBspZ(f@#^dcP7cvL3_ZPs6)ezR35l z5G_l;=L+z?Rkfn4yshPf>ba{IG*gG`4hjETGYLI1M1jt9d#@m&_Y*fG%lCIk_FX|D z-#Pptz%^9R)?Ss?7l%~*WG^ext=3O!l9yrkG|j2YT^G1xat)jdO|t$H~7PUga7)k z@g1~p{+dAhwmM$DJ>UqyRjW1orrM2Y?zJjZy6N{)&)K6D9A8ZHOz{U(Rw0dn3XC94Yks+4l-vboaU%lH`H2yL(DJ?$BqVi z46{lZk{gF(uzEG4~lvgxcQ-4n7U3!d01u#%-4 z)9i?As7gAqr$9F0vjw;&AZ=@=%AIcYK)&myJ9g-;>~Lbb)$t0hU?udJVf6=>e}+?t zOfqT)Acq0L;ld2ZcGtMJ%PN$$vj7Ka)X`Ks%D!V%MV&9S8i2LVOly^-xKV-MpJ}xQ z`0PyT07PPul_jzMVErs~^VnBp&5=qkhC%2Oq-wj)E_Ph-A2p&^y68JXf2a=Eoye zecdcdJXD4mmS3A;pnXm$Kdgh&>wN%ONHCP|?SGgi?Tlg_3yBj(>Jcy-D&mL`JcG(-Oup+YZ4wHY_iTr;?$W-yhb zs*pN2(Z`}&VJfEgz1DjiFZ8c{pLGb+oIl=Y&0x(r7^v(6u*G4crg$wj8i49vF>95z zn;Txy^#Q9p5A%vXy?FEHbc(u&{Au=scy7doq~rt%cZp{o zv@Qbn)M_iC;c3v)*^XFUT~7xNueP#vtkP#ZWM%T&Uh#YrZ(FhXA*+xL2*j>IJNM8_ z(rMg@8-AX*V#T6|t)|@T4Xl6In#kAyQSpdX%uT4g)*8+&uh_BHYQk-=SijC1!|OQk zx(+Q6!awD!UjZ9GqB?FI;K_uxo?e z;89mF!|3}ORlq>eJR;4tkl#~nktE8B<``)t*&iF3rwL&0-Aqa(y_ibuea31K8B-H3 zCbDVu?9_Esvn#;TnI=AK4QSFFxIV~@0u`3DC7+3fLC=Lp$+utl0tcQ&H=Ys)TGA{Y z$7wi{<}FYRB;`~y;SwC07F4-oc}uVOaG@1NT}fp@!x1N+p=??yeBk}(t)`48dc~yc zunci`}h{qZHMi&(bNdWW?YS(`A|nB>J`Nt9@N2906GCaWV)hO_Rc z<xBL3K9ZRG8|>f42>c-{=fNF#wiv-aZTW-D4gY}SFIu??vbD3ERq zu~G33ii9mzu|-|(N+hX->0;d$3?Dm+?OPx%O8mG5CzVc=N{FOZN9;t`8RGhgI?c>z zDcNl)gz8d>sz;f+?T=7hy`pZ05rsz=Q(wUudGE_O@pPwnVkD7<+O7wI{djh9<11D! z>m}-MwG!J?qohDukdwRKMRC{Yy&=dQo1YdlwpuYQGeSWS!9X4#B7(%?=7Wn+Y4=w2 z?tNr?!^222a4F}bvi|}V--16erR_!YF6a~Smp4M$crCb!-x1o!Y3A9>9c;0te}4z9fd?B8xh zccQAHHtkw?aCNc}ljb@ZMG5~~kT|3|sUV4QBr&wkhF(E-@+~X9@v!P(HzSetHXhR$ zx!r0SIlMZJ%mHUlvE54NJPTFXk~e1~#LsWToub6aT~;)GmNT$or!|S;b`k(|<{^!w zTZq&I+*cO$Z=4CDME%|HeteW?x0Qv%%H0@F9Rw8@czXy2l)J5={2&vjdSR{Q#rurf zt7h+SAl|>vXdSriUF&)*=Ah-;yq!2PnARx&g}c+E_F^*lU|`Q)T*F0-M4seBzu-fD zuX-AZ^=I{P(flK;ZsaIns`RX4--ERp)x825dq3WUb>eweJFx5{t59bn#UGzo`@%>t z6B!%Op+1xyZU#>L59d@q8vV}>6l(8h)+Riu>Hpk%O3q|cv8if9{p7gF_yR4SmVn8_ z-JTk6AIUbNJ#O+tvFZ!!NBNAuTbtC%$0GZxvj#Nfl0yDRlQ%9Y6|g@xV!7c87C8lT z;}s>QX$djqjGTgz(^!N4knyQsT6_3SP7gcyD{BBdDOP@Et>Y8CmG2R#D=%Y71-Hl$ zFPjBk_4be&yJuK=R!G+dI zk$42duaSXWN6@FUiGjo4V~q^Y4W0cF>};~g z_{GX-qrC^UYp=yr-j8&l`NOhfZs#CEX zap89~*>fWG4=cLmOyJ#?xf?l5!Ip@PPFqyzpTY6MMV&vSk%^;y(O+=T3B4G2{DZD3 z_Wxm}N6rGw?fzs&BKn+_-tcCCso|thn?N9kJ}0uzVd!#Bbh&IzmCj2|Dh?Z!jwq&! zj6bdHhE$sb@?j(M5b8^@=JPf>aS z{2Js;*QxNKGXG_JZbs}PH1vEJ+=2Tee*HUGr^DM*oD8$^&iM%YYfriZ>*&C| z_CimJ151^#z@uKf5A%>&D3cbVq5(3Au5lp z)fbU+8HgnZdl4JKsQi^VAx<>U0?-#n3azn`bGUMJ#EIs) z{|htbK_Y;zyso5h{r|91M{eZy)ry8hxyk?w0^NYoa2-PQoFng*=SKp|W(} zN0t^wD`!O@-iE+15sdNy%z zF*V?tDqLe)B(2WZ9I(D(<3>Cge*WFMfqt#+g}Q&m#i}2%np-VhP%S;KT6##ebkAz( zlxpebRnva0PE`OV{;Dc;y4qK^zO9ztUoHJkwe&01(oa@N55lx@6@aEKt(KlwEj_(j zdOXsrrZ;RF)(epcQ9P|y=2H_>Y$o=m*>%O*J8=CtyPfS5dl#|Vt9C~>YIZy7kAuvHsJ+KHJO(pP)XE ze3E)#Lep7{+E1KVnQo`zMJU_T?IF18^meq<-BgZP-qAk5<4w`06K-^#-w7=^K|I&V z9z`!s=>)=&BE7Sn;b{*+)TP}l7Id~tS&P8Q&h|;2wG@ZD+nIRD8xAp|Uk`f(Pc+5C z7wHziUbe|wo0t{HTVOx#fxi4UaWKP<Q~h4A`{@RANw1d#H!bWEAi{!CvTk zH}|v~@wQixUhZkv=1HMhB%8w5+ioRB_OjD>ipnprwwK+J@pew`Cwki^a=*~qP6|tf zrEHOX8IwKzGVB374eUv{Bww3h_jEOEe?_+K`q-`6ZGo|U>{_f-2Z(UT6=WA04U*AA zVf0{A6_{An*S;`}NN6BTmj%@4QngYjsrFgBoNDPYNK5mBm$DoI=HQ z3Lz)AAo6;mPJcT(vH_y5VmFgCkp-|A-ruh6kE(_v4 zYPdE?lZI5=#6$5^ku=awWL;NnUlkqcRw=z-hL9Pe;^ErSt9loY5Z?~8`*?;s@DZzG zqchNiS3ZKfhwS>iQRCjgkPlLzrKn_VRH|6Kcg~KE_n@G35~iFPwm++NdOuxQHESH^ z!w1<7*jJ){roApM9o|hNNs`hM+X!r=ba!mj<8%z{&$LI@uUG$ZJifOEgPhlJrS?^A zE$x#)m+^L_Zg=S5YuzEOeOgLdC;S6rCfdTN`≫aqZ%I$M;N)>mAoKE+TMgvi(Px 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

    7bW z;l$vSuxT<0w9G3>3T8&5e-^X@OFbd`+65OFPeNZ7VM@!x9KHM62hYW_ZQ0o&SZFLq z&On%UdqzZC-q5t*ZGpg3-lmS=h``g{{`4SDEL|bxoxxE%qOeJ5{kT{t_6%&a-q<-f z#droYmcJV9WoSllyz#96;Jus?jE^v$3uS%PHTVU-z-{dooND|vlr}aic&G6<|DkgD z`S2v3g&o<=y9YZMt3x0MYps^C6VM=Sr>=qLqqC9N|9OyQdis~xY&Ln)F}|ce!)!X)-(92u@=?N!HM7B^a#e=FV+KqjZh{UvHLqan9^WcbhLNy|8e&w@Kw~@-*}Rl?lW^~p)F9lK!HLRTJ}|1*>{wE z6RhlOS%f0nWfN2sMAV3=;P&_^3b=83SsGM1(XOfWklF@)hPxi?@X9np{j>tTJphGs0(;Fona=~-a{x+8)4epHv7Zc$_| zL`h>tq`4QSdfpi)(blQ}PIwRQ@$3p1ReLW?-F~_Uh47TIyTamgNSJqHQi(#Cgh3C* z)EmIk2|m->8j8eqZ)1%>_HArqW!Y~a6<+5N>nIAWRJCRn(N!Y6`2A$!HP#5VzMrgy z^d*aV6R}CBV{+9smcQm(Ua;Ja;B5~sbK6=YqTVSD%C>09R!Ltz8u~qQRle0-ysK}7 z_4j&2<#@dZIL)B-vO_D~kfzg_~8SSj}n)^I# zIc^_%a2aR^n^U*4=5X4#xALPt0xNkf3~-_;89a< z>|`~ru-5ID=Q>$|s83uG{p5?CRW&=@*&3=Q*@nxK&+$Qll|x0O8r=9aO8z$;UAP5Z ztS&7NAR5&X>fwHblNz)uIH_BDumapU7x$Sg>0%}E&t+0qE2-t73MfBzDGyhGd)vi* zA&U^5e<@cGmm?KW{>!C2S^;jIi~C9*B`#mfi^S!d3Mld9rc!jQ0^Cd&_pR*R4P3sH z6XCQxUIAr)m-0jfxNa^E-+w@K`ArwxicWX4A{(BpfVjR(e5wLmip)hSuv9gwoCTh(08VsXzj~bX zH;3^(G7&e<2YXpJ>RN@57WB6I`Kk7Mw-)N!dKv$71x%^({PGv@bAJK<^)KMRX}G|9 z@H4%w<-FSO02Dv~wT0Bb_S&-;x$1grjmium{dgfG+x9`O{efI-XQt=}r73-^*-__R zN&V!RK33nT3m!k&JI_jw`ZE-pE+6b`y%$DX7I8VEBf43qE%a$t_QS36H+i(5H8Sd= zOOGb8ztvb=!t1^MRyT1Ox9Yl>`Q~d?n5^MZdj>0?gR)efTQKBq%>mc+Zjk2(~ z!PZ&bAx6RGT2-UWGWfvoA=Xr0jaCJRiVZI%!VNr0X8wu~gJPbCg=Y~wIcJsW;3?A! z3>=1vq|xc|FF%itweWS+ zXgmmGyl|XV5JjKaP)V1?^I56|>`fnjTMHbzSr<6lCTi4;?aLsEw z@NNgwJp#RET2;8H9If6^2IkBHA5jI8>CMc)imiD(UZ&5sMxw}<&$d!qQg?-lf^Nce z(9^Y-4$1;5MZ(iT_iv&jd_Q?~HqwO0(k

    669OAT5WXR9#q+a?+&~bnK+mzRjS;W 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

    PI-3r_h`k;b;5RVmU8s{*;< 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 YswY;ujNIF;xR6NGo1d}rLL%e;0BHV>KmY&$ delta 49343 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 diff --git a/build/boot-c-parts-windows.sh b/build/boot-c-parts-windows.sh deleted file mode 100755 index 3e2ca3dc..00000000 --- a/build/boot-c-parts-windows.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh -# $Id$ -cd `dirname $0`/.. -set -ex - -. config/config.sh - -(cd byterun && make -f Makefile.nt) -(cd asmrun && make -f Makefile.nt all meta.$O dynlink.$O) -(cd yacc && make -f Makefile.nt) -(cd win32caml && make) - -mkdir -p _build/boot -cp -f byterun/ocamlrun.exe \ - byterun/libcamlrun.$A \ - asmrun/libasmrun.$A \ - yacc/ocamlyacc.exe \ - boot/ocamlc \ - boot/ocamllex \ - boot/ocamldep \ - _build/boot -mkdir -p _build/byterun -cp -f byterun/ocamlrun.exe boot diff --git a/build/boot-c-parts.sh b/build/boot-c-parts.sh index a38c1641..9999392e 100755 --- a/build/boot-c-parts.sh +++ b/build/boot-c-parts.sh @@ -1,22 +1,37 @@ #!/bin/sh -# $Id$ cd `dirname $0`/.. set -ex -# Create a bunch of symlinks to _build/boot +. config/config.sh + +if "$WINDOWS"; then + MAKEOPTS='-f Makefile.nt' + LINK='cp -f' +else + MAKEOPTS='' + LINK='ln -s -f' +fi + +(cd byterun && make $MAKEOPTS) +(cd asmrun && make $MAKEOPTS all meta."$O" dynlink."$O") +(cd yacc && make $MAKEOPTS) + +if "$WINDOWS"; then + (cd win32caml && make) +fi + mkdir -p _build/boot -ln -sf ../../byterun/ocamlrun \ - ../../byterun/libcamlrun.a \ - ../../asmrun/libasmrun.a \ - ../../asmrun/libasmrunp.a \ - ../../yacc/ocamlyacc \ - ../../boot/ocamlc \ - ../../boot/ocamllex \ - ../../boot/ocamldep \ - _build/boot -[ -f boot/ocamlrun ] || ln -sf ../byterun/ocamlrun boot +# Create a bunch of symlinks (or copies) to _build/boot +(cd _build/boot && +$LINK ../../byterun/ocamlrun$EXE \ + ../../byterun/libcamlrun.$A \ + ../../asmrun/libasmrun.$A \ + ../../yacc/ocamlyacc$EXE \ + ../../boot/ocamlc \ + ../../boot/ocamllex \ + ../../boot/ocamldep \ + . ) -(cd byterun && make) -(cd asmrun && make all meta.o dynlink.o) -(cd yacc && make) +(cd boot && +[ -f boot/ocamlrun$EXE ] || $LINK ../byterun/ocamlrun$EXE . ) diff --git a/build/fastworld.sh b/build/fastworld.sh index 5c08e1aa..10ffa812 100755 --- a/build/fastworld.sh +++ b/build/fastworld.sh @@ -24,12 +24,7 @@ if [ -e ocamlbuild_mixed_mode ]; then fi ./mkconfig.sh ./mkmyocamlbuild_config.sh -. ../config/config.sh -if [ "x$EXE" = "x.exe" -a "x$SYSTEM" != "xcygwin" ]; then - ./boot-c-parts-windows.sh -else - ./boot-c-parts.sh -fi +./boot-c-parts.sh ./boot.sh $@ cd .. diff --git a/build/install.sh b/build/install.sh index 2197069c..1a60a87e 100755 --- a/build/install.sh +++ b/build/install.sh @@ -344,10 +344,6 @@ installdir \ otherlibs/labltk/lib/labltk.cma \ otherlibs/labltk/lib/labltk.cmxa \ otherlibs/labltk/lib/labltk.cmx \ - otherlibs/labltk/tkanim/*.mli \ - otherlibs/labltk/tkanim/*.cmi \ - otherlibs/labltk/tkanim/tkanim.cma \ - otherlibs/labltk/tkanim/tkanim.cmxa \ otherlibs/labltk/compiler/tkcompiler \ $LIBDIR/labltk @@ -376,7 +372,6 @@ installdir \ otherlibs/"$WIN32"unix/dllunix$EXT_DLL \ otherlibs/threads/dllvmthreads$EXT_DLL \ otherlibs/labltk/support/dlllabltk$EXT_DLL \ - otherlibs/labltk/tkanim/dlltkanim$EXT_DLL \ $STUBLIBDIR installlibdir \ @@ -403,8 +398,6 @@ installlibdir \ otherlibs/labltk/support/liblabltk.$A \ otherlibs/labltk/lib/labltk.$A \ otherlibs/labltk/jpf/jpflib.$A \ - otherlibs/labltk/tkanim/libtkanim.$A \ - otherlibs/labltk/tkanim/tkanim.$A \ otherlibs/labltk/frx/frxlib.$A \ $LIBDIR/labltk diff --git a/build/mkconfig.sh b/build/mkconfig.sh index 0eb69303..d7c2d91e 100755 --- a/build/mkconfig.sh +++ b/build/mkconfig.sh @@ -1,5 +1,4 @@ #!/bin/sh -# $Id$ cd `dirname $0`/.. @@ -8,3 +7,9 @@ sed -e 's/^\(.*\$([0-9]).*\)$/# \1/' \ -e 's/^FLEX.*$//g' \ -e 's/^\([^#=]*\)=\([^"]*\)$/if [ "x$\1" = "x" ]; then \1="\2"; fi/' \ config/Makefile > config/config.sh + +if [ "x$EXE" = "x.exe" -a "x$SYSTEM" != "xcygwin" ]; then + echo "WINDOWS=true" >> config/config.sh +else + echo "WINDOWS=false" >> config/config.sh +fi diff --git a/build/new-build-system b/build/new-build-system index b16f6deb..690ea4ad 100644 --- a/build/new-build-system +++ b/build/new-build-system @@ -12,17 +12,16 @@ utils/config.mlbuild # Should be renamed as utils/config.ml build/ world.sh # Build all the OCaml world + world.byte.sh # Build the bytecode world + world.native.sh # Build the native world + world.all.sh # Build all the world the don't bootstrap fastworld.sh # Same as above but faster boot-c-parts.sh # Compile byterun, ocamlyacc and asmrun with the Makefiles - boot-c-parts-windows.sh # Same as boot-c-parts.sh but for windows boot.sh # Compile the stdlib and ocamlc camlp4-targets.sh # Setup camlp4 targets otherlibs-targets.sh # Setup otherlibs targets targets.sh # All targets of the OCaml distribution - world.byte.sh # Build the bytecode world - world.native.sh # Build the native world - world.all.sh # Build all the world the don't bootstrap install.sh # Install all needed files distclean.sh # Clean all generated files @@ -34,7 +33,7 @@ build/ camlp4-bootstrap.sh # Partial stuffs (just camlp4 and ocamlbuild) - partial-boot.sh + mixed-boot.sh camlp4-byte-only.sh camlp4-native-only.sh ocamlbuild-byte-only.sh diff --git a/build/otherlibs-targets.sh b/build/otherlibs-targets.sh index 19980424..301b75f1 100644 --- a/build/otherlibs-targets.sh +++ b/build/otherlibs-targets.sh @@ -101,8 +101,6 @@ for lib in $OTHERLIBRARIES; do add_byte lib/labltktop$EXE lib/labltk$EXE add_ocaml_lib jpf/jpflib add_ocaml_lib frx/frxlib - add_ocaml_lib tkanim/tkanim - add_file tkanim/libtkanim.$A add_byte browser/ocamlbrowser$EXE ;; dbm) diff --git a/build/world.sh b/build/world.sh index bbe1632a..0b9a4b28 100755 --- a/build/world.sh +++ b/build/world.sh @@ -13,8 +13,6 @@ # # ######################################################################### -# $Id$ - cd `dirname $0` set -e if [ -e ocamlbuild_mixed_mode ]; then @@ -22,13 +20,17 @@ if [ -e ocamlbuild_mixed_mode ]; then echo 'please cleanup and re-launch (make clean ; ./build/distclean.sh)' exit 1 fi +case "$1" in + all|a|al) mode=all;; + byte|b|by|byt) mode=byte;; + native|na|nat|nati|nativ) mode=native;; + *) echo 'Unexpected target. Expected targets are: all,byte,native' \ + >/dev/stderr + exit 1;; +esac +shift ./mkconfig.sh ./mkmyocamlbuild_config.sh -. ../config/config.sh -if [ "x$EXE" = "x.exe" -a "x$SYSTEM" != "xcygwin" ]; then - ./boot-c-parts-windows.sh -else - ./boot-c-parts.sh -fi -./boot.sh $@ -./world.all.sh $@ +./boot-c-parts.sh +./boot.sh "$@" +./world."$mode".sh "$@" diff --git a/byterun/.depend b/byterun/.depend index b92cc6de..2044d56c 100644 --- a/byterun/.depend +++ b/byterun/.depend @@ -1,410 +1,407 @@ 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 \ - fix_code.h exec.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - startup.h stacks.h sys.h backtrace.h + compatibility.h mlvalues.h misc.h alloc.h io.h instruct.h intext.h \ + fix_code.h exec.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ + startup.h stacks.h sys.h backtrace.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 config.h ../config/m.h ../config/s.h \ - compatibility.h debugger.h misc.h mlvalues.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 + compatibility.h debugger.h misc.h mlvalues.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 fix_code.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 fix_code.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 \ - md5.h io.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 md5.h \ + io.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 + ../config/s.h misc.h custom.h memory.h gc.h major_gc.h freelist.h \ + minor_gc.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 custom.h fail.h gc.h intext.h io.h fix_code.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 fix_code.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 fix_code.h \ - memory.h gc.h major_gc.h freelist.h minor_gc.h int64_native.h + ../config/s.h mlvalues.h custom.h fail.h intext.h io.h fix_code.h \ + memory.h gc.h major_gc.h freelist.h minor_gc.h int64_native.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 + ../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 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 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 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 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 \ - fix_code.h exec.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - startup.h stacks.h sys.h backtrace.h + compatibility.h mlvalues.h misc.h alloc.h io.h instruct.h intext.h \ + fix_code.h exec.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ + startup.h stacks.h sys.h backtrace.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 config.h ../config/m.h ../config/s.h \ - compatibility.h debugger.h misc.h mlvalues.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 + compatibility.h debugger.h misc.h mlvalues.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 fix_code.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 fix_code.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 \ - md5.h io.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 md5.h \ + io.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 + ../config/s.h misc.h custom.h memory.h gc.h major_gc.h freelist.h \ + minor_gc.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 custom.h fail.h gc.h intext.h io.h fix_code.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 fix_code.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 fix_code.h \ - memory.h gc.h major_gc.h freelist.h minor_gc.h int64_native.h + ../config/s.h mlvalues.h custom.h fail.h intext.h io.h fix_code.h \ + memory.h gc.h major_gc.h freelist.h minor_gc.h int64_native.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 + ../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 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 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 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 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 \ - fix_code.h exec.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - startup.h stacks.h sys.h backtrace.h + compatibility.h mlvalues.h misc.h alloc.h io.h instruct.h intext.h \ + fix_code.h exec.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ + startup.h stacks.h sys.h backtrace.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 config.h ../config/m.h ../config/s.h \ - compatibility.h debugger.h misc.h mlvalues.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 + compatibility.h debugger.h misc.h mlvalues.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 fix_code.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 fix_code.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 \ - md5.h io.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 md5.h \ + io.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 + ../config/s.h misc.h custom.h memory.h gc.h major_gc.h freelist.h \ + minor_gc.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 custom.h fail.h gc.h intext.h io.h fix_code.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 fix_code.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 fix_code.h \ - memory.h gc.h major_gc.h freelist.h minor_gc.h int64_native.h + ../config/s.h mlvalues.h custom.h fail.h intext.h io.h fix_code.h \ + memory.h gc.h major_gc.h freelist.h minor_gc.h int64_native.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 + ../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 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 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 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 diff --git a/byterun/debugger.c b/byterun/debugger.c index 3639c43b..f9689126 100644 --- a/byterun/debugger.c +++ b/byterun/debugger.c @@ -13,7 +13,7 @@ /* $Id$ */ -/* Interface with the debugger */ +/* Interface with the byte-code debugger */ #ifdef _WIN32 #include @@ -23,20 +23,13 @@ #include "config.h" #include "debugger.h" -#include "fail.h" -#include "fix_code.h" -#include "instruct.h" -#include "intext.h" -#include "io.h" #include "misc.h" -#include "mlvalues.h" -#include "stacks.h" -#include "sys.h" int caml_debugger_in_use = 0; uintnat caml_event_count; +int caml_debugger_fork_mode = 1; /* parent by default */ -#if !defined(HAS_SOCKETS) +#if !defined(HAS_SOCKETS) || defined(NATIVE_CODE) void caml_debugger_init(void) { @@ -46,6 +39,10 @@ void caml_debugger(enum event_kind event) { } +void caml_debugger_cleanup_fork(void) +{ +} + #else #ifdef HAS_UNISTD @@ -67,6 +64,15 @@ void caml_debugger(enum event_kind event) #include #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" + static int sock_domain; /* Socket domain for the debugger */ static union { /* Socket address for the debugger */ struct sockaddr s_gen; @@ -109,7 +115,7 @@ static void open_connection(void) #endif if (dbg_socket == -1 || connect(dbg_socket, &sock_addr.s_gen, sock_addr_len) == -1){ - caml_fatal_error_arg2 ("cannot connect to debugger at %s", dbg_addr, + caml_fatal_error_arg2 ("cannot connect to debugger at %s\n", dbg_addr, "error: %s\n", strerror (errno)); } #ifdef _WIN32 @@ -412,8 +418,19 @@ void caml_debugger(enum event_kind event) caml_putword(dbg_out, (Code_val(val)-caml_start_code) * sizeof(opcode_t)); caml_flush(dbg_out); break; + case REQ_SET_FORK_MODE: + caml_debugger_fork_mode = caml_getword(dbg_in); + break; } } } +void caml_debugger_cleanup_fork(void) +{ + /* We could remove all of the breakpoints, but closing the connection + * means that they'll just be skipped anyway. */ + close_connection(); + caml_debugger_in_use = 0; +} + #endif diff --git a/byterun/debugger.h b/byterun/debugger.h index ce479d27..57a58f1c 100644 --- a/byterun/debugger.h +++ b/byterun/debugger.h @@ -21,8 +21,8 @@ #include "misc.h" #include "mlvalues.h" -extern int caml_debugger_in_use; -extern int running; +CAMLextern int caml_debugger_in_use; +CAMLextern int caml_debugger_fork_mode; /* non-zero for parent */ extern uintnat caml_event_count; enum event_kind { @@ -32,6 +32,7 @@ enum event_kind { void caml_debugger_init (void); void caml_debugger (enum event_kind event); +void caml_debugger_cleanup_fork (void); /* Communication protocol */ @@ -84,9 +85,11 @@ enum debugger_request { REQ_MARSHAL_OBJ = 'M', /* mlvalue v */ /* Send a copy of the data structure rooted at v, using the same format as [caml_output_value]. */ - REQ_GET_CLOSURE_CODE = 'C' /* mlvalue v */ + REQ_GET_CLOSURE_CODE = 'C', /* mlvalue v */ /* Send the code address of the given closure. Reply is one uint32. */ + REQ_SET_FORK_MODE = 'K' /* uint32 m */ + /* Set whether to follow the child (m=0) or the parent on fork. */ }; /* Replies to a REQ_GO request. All replies are followed by three uint32: diff --git a/byterun/finalise.c b/byterun/finalise.c index 68515581..bc7996d5 100644 --- a/byterun/finalise.c +++ b/byterun/finalise.c @@ -122,6 +122,7 @@ static int running_finalisation_function = 0; void caml_final_do_calls (void) { struct final f; + value res; if (running_finalisation_function) return; @@ -139,8 +140,9 @@ void caml_final_do_calls (void) -- to_do_hd->size; f = to_do_hd->item[to_do_hd->size]; running_finalisation_function = 1; - caml_callback (f.fun, f.val + f.offset); /* FIXME PR#4742 */ + res = caml_callback_exn (f.fun, f.val + f.offset); running_finalisation_function = 0; + if (Is_exception_result (res)) caml_raise (Extract_exception (res)); } caml_gc_message (0x80, "Done calling finalisation functions.\n", 0); } diff --git a/byterun/gc_ctrl.c b/byterun/gc_ctrl.c index 0083f367..0fe22151 100644 --- a/byterun/gc_ctrl.c +++ b/byterun/gc_ctrl.c @@ -24,7 +24,11 @@ #include "minor_gc.h" #include "misc.h" #include "mlvalues.h" +#ifdef NATIVE_CODE +#include "stack.h" +#else #include "stacks.h" +#endif #ifndef NATIVE_CODE extern uintnat caml_max_stack_size; /* defined in stacks.c */ @@ -214,7 +218,7 @@ static value heap_stats (int returnstats) intnat cpct = caml_stat_compactions; intnat top_heap_words = Wsize_bsize (caml_stat_top_heap_size); - res = caml_alloc_tuple (15); + res = caml_alloc_tuple (16); Store_field (res, 0, caml_copy_double (minwords)); Store_field (res, 1, caml_copy_double (prowords)); Store_field (res, 2, caml_copy_double (majwords)); @@ -230,6 +234,7 @@ static value heap_stats (int returnstats) Store_field (res, 12, Val_long (fragments)); Store_field (res, 13, Val_long (cpct)); Store_field (res, 14, Val_long (top_heap_words)); + Store_field (res, 15, Val_long (caml_stack_usage())); CAMLreturn (res); }else{ CAMLreturn (Val_unit); @@ -266,7 +271,7 @@ CAMLprim value caml_gc_quick_stat(value v) intnat cpct = caml_stat_compactions; intnat heap_chunks = caml_stat_heap_chunks; - res = caml_alloc_tuple (15); + res = caml_alloc_tuple (16); Store_field (res, 0, caml_copy_double (minwords)); Store_field (res, 1, caml_copy_double (prowords)); Store_field (res, 2, caml_copy_double (majwords)); @@ -282,6 +287,7 @@ CAMLprim value caml_gc_quick_stat(value v) Store_field (res, 12, Val_long (0)); Store_field (res, 13, Val_long (cpct)); Store_field (res, 14, Val_long (top_heap_words)); + Store_field (res, 15, Val_long (caml_stack_usage())); CAMLreturn (res); } diff --git a/byterun/io.c b/byterun/io.c index 44d1f293..e7c7f048 100644 --- a/byterun/io.c +++ b/byterun/io.c @@ -494,19 +494,30 @@ CAMLprim value caml_channel_descriptor(value vchannel) CAMLprim value caml_ml_close_channel(value vchannel) { int result; + int do_syscall; + int fd; /* For output channels, must have flushed before */ struct channel * channel = Channel(vchannel); if (channel->fd != -1){ - result = close(channel->fd); + fd = channel->fd; channel->fd = -1; + do_syscall = 1; }else{ + do_syscall = 0; result = 0; } /* Ensure that every read or write on the channel will cause an immediate caml_flush_partial or caml_refill, thus raising a Sys_error exception */ channel->curr = channel->max = channel->end; + + if (do_syscall) { + caml_enter_blocking_section(); + result = close(fd); + caml_leave_blocking_section(); + } + if (result == -1) caml_sys_error (NO_ARG); return Val_unit; } diff --git a/byterun/stacks.c b/byterun/stacks.c index f43a4423..f2de29f0 100644 --- a/byterun/stacks.c +++ b/byterun/stacks.c @@ -102,3 +102,14 @@ void caml_change_max_stack_size (uintnat new_max_size) } caml_max_stack_size = new_max_size; } + +CAMLexport uintnat (*caml_stack_usage_hook)(void) = NULL; + +uintnat caml_stack_usage(void) +{ + uintnat sz; + sz = caml_stack_high - caml_extern_sp; + if (caml_stack_usage_hook != NULL) + sz += (*caml_stack_usage_hook)(); + return sz; +} diff --git a/byterun/stacks.h b/byterun/stacks.h index 0c23a0a3..48e8acc9 100644 --- a/byterun/stacks.h +++ b/byterun/stacks.h @@ -36,6 +36,8 @@ CAMLextern value * caml_trap_barrier; void caml_init_stack (uintnat init_max_size); void caml_realloc_stack (asize_t required_size); void caml_change_max_stack_size (uintnat new_max_size); +uintnat caml_stack_usage (void); +CAMLextern uintnat (*caml_stack_usage_hook)(void); #endif /* CAML_STACKS_H */ diff --git a/camlp4/.vcs b/camlp4/.vcs deleted file mode 100644 index 70f42110..00000000 --- a/camlp4/.vcs +++ /dev/null @@ -1,4 +0,0 @@ ---- -exclude: - - !re boot/camlp4boot\.save\..* - - build/camlp4_config.ml diff --git a/camlp4/Camlp4/Camlp4Ast.partial.ml b/camlp4/Camlp4/Camlp4Ast.partial.ml index 19b5053b..4ed2fb99 100644 --- a/camlp4/Camlp4/Camlp4Ast.partial.ml +++ b/camlp4/Camlp4/Camlp4Ast.partial.ml @@ -148,7 +148,9 @@ (* `s *) | ExVrn of loc and string (* while e do { e } *) - | ExWhi of loc and expr and expr ] + | ExWhi of loc and expr and expr + (* let open i in e *) + | ExOpI of loc and ident and expr ] and module_type = [ MtNil of loc (* i *) (* A.B.C *) diff --git a/camlp4/Camlp4/Printers/OCaml.ml b/camlp4/Camlp4/Printers/OCaml.ml index b3641718..b47d4555 100644 --- a/camlp4/Camlp4/Printers/OCaml.ml +++ b/camlp4/Camlp4/Printers/OCaml.ml @@ -456,6 +456,9 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct | _ -> pp f "@[@[<2>let %a%a@]@ @[in@ %a@]@]" o#rec_flag r o#binding bi o#reset_semi#expr e ] + | <:expr< let open $i$ in $e$ >> -> + pp f "@[<2>let open %a@]@ @[<2>in@ %a@]" + o#ident i o#reset_semi#expr e | <:expr< match $e$ with [ $a$ ] >> -> pp f "@[@[@[<2>match %a@]@ with@]%a@]" o#expr e o#match_case a @@ -549,6 +552,7 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct <:expr< if $_$ then $_$ else $_$ >> | <:expr< let $rec:_$ $_$ in $_$ >> | <:expr< let module $_$ = $_$ in $_$ >> | + <:expr< let open $_$ in $_$ >> | <:expr< assert $_$ >> | <:expr< assert False >> | <:expr< lazy $_$ >> | <:expr< new $_$ >> | <:expr< object ($_$) $_$ end >> -> diff --git a/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml b/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml index dc5192bf..8354935d 100644 --- a/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml +++ b/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml @@ -490,7 +490,11 @@ module Make (Ast : Sig.Camlp4Ast) = struct mkrangepat loc c1 c2 | _ -> error loc "range pattern allowed only for characters" ] | PaRec loc p -> - mkpat loc (Ppat_record (List.map mklabpat (list_of_patt p []), Closed)) + let ps = list_of_patt p [] in + let is_wildcard = fun [ <:patt< _ >> -> True | _ -> False ] in + let (wildcards,ps) = List.partition is_wildcard ps in + let is_closed = if wildcards = [] then Closed else Open in + mkpat loc (Ppat_record (List.map mklabpat ps, is_closed)) | PaStr loc s -> mkpat loc (Ppat_constant (Const_string (string_of_string_token loc s))) | <:patt@loc< ($p1$, $p2$) >> -> @@ -731,6 +735,8 @@ module Make (Ast : Sig.Camlp4Ast) = struct | ExWhi loc e1 el -> let e2 = ExSeq loc el in mkexp loc (Pexp_while (expr e1) (expr e2)) + | <:expr@loc< let open $i$ in $e$ >> -> + mkexp loc (Pexp_open (long_uident i) (expr e)) | <:expr@loc< $_$,$_$ >> -> error loc "expr, expr: not allowed here" | <:expr@loc< $_$;$_$ >> -> error loc "expr; expr: not allowed here, use do {...} or [|...|] to surround them" diff --git a/camlp4/Camlp4Parsers/Camlp4OCamlParser.ml b/camlp4/Camlp4Parsers/Camlp4OCamlParser.ml index fa550bac..2bedf9aa 100644 --- a/camlp4/Camlp4Parsers/Camlp4OCamlParser.ml +++ b/camlp4/Camlp4Parsers/Camlp4OCamlParser.ml @@ -115,13 +115,15 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct | _ -> 1 ]) ; - value test_label_eq = - Gram.Entry.of_parser "test_label_eq" + value test_label_expr_list = + Gram.Entry.of_parser "test_label_expr_list" (test 1 where rec test lev strm = match stream_peek_nth lev strm with [ Some (UIDENT _ | LIDENT _ | KEYWORD ".") -> test (lev + 1) strm - | Some (KEYWORD "=") -> () + | Some (KEYWORD ("="|";"|"}")) -> + (* ";" and "}" occur due to record punning *) + () | _ -> raise Stream.Failure ]) ; @@ -178,6 +180,7 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct DELETE_RULE Gram meth_list: meth_decl; opt_dot_dot END; DELETE_RULE Gram expr: "let"; opt_rec; binding; "in"; SELF END; DELETE_RULE Gram expr: "let"; "module"; a_UIDENT; module_binding0; "in"; SELF END; + DELETE_RULE Gram expr: "let"; "open"; module_longident; "in"; SELF END; DELETE_RULE Gram expr: "fun"; "["; LIST0 match_case0 SEP "|"; "]" END; DELETE_RULE Gram expr: "if"; SELF; "then"; SELF; "else"; SELF END; DELETE_RULE Gram expr: "do"; do_sequence END; @@ -284,6 +287,8 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct | _ -> <:str_item< value $rec:r$ $bi$ >> ] | "let"; "module"; m = a_UIDENT; mb = module_binding0; "in"; e = expr -> <:str_item< let module $m$ = $mb$ in $e$ >> + | "let"; "open"; i = module_longident; "in"; e = expr -> + <:str_item< let open $id:i$ in $e$ >> ] ] ; seq_expr: @@ -300,6 +305,8 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct | "let"; "module"; m = a_UIDENT; mb = module_binding0; "in"; e = expr LEVEL ";" -> <:expr< let module $m$ = $mb$ in $e$ >> + | "let"; "open"; i = module_longident; "in"; e = expr LEVEL ";" -> + <:expr< let open $id:i$ in $e$ >> | "function"; a = match_case -> <:expr< fun [ $a$ ] >> | "if"; e1 = SELF; "then"; e2 = expr LEVEL "top"; @@ -335,7 +342,7 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct expr: LEVEL "simple" (* LEFTA *) [ [ "false" -> <:expr< False >> | "true" -> <:expr< True >> - | "{"; test_label_eq; lel = label_expr_list; "}" -> + | "{"; test_label_expr_list; lel = label_expr_list; "}" -> <:expr< { $lel$ } >> | "{"; e = expr LEVEL "."; "with"; lel = label_expr_list; "}" -> <:expr< { ($e$) with $lel$ } >> diff --git a/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml b/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml index 9dab8bd7..f31636e2 100644 --- a/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml +++ b/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml @@ -255,6 +255,12 @@ Very old (no more supported) syntax:\n\ | e -> e ] ; + value rec lid_of_ident = + fun + [ <:ident< $_$ . $i$ >> -> lid_of_ident i + | <:ident< $lid:lid$ >> -> lid + | _ -> assert False ]; + value module_type_app mt1 mt2 = match (mt1, mt2) with [ (<:module_type@_loc< $id:i1$ >>, <:module_type< $id:i2$ >>) -> @@ -598,6 +604,8 @@ Very old (no more supported) syntax:\n\ <:expr< let $rec:r$ $bi$ in $x$ >> | "let"; "module"; m = a_UIDENT; mb = module_binding0; "in"; e = SELF -> <:expr< let module $m$ = $mb$ in $e$ >> + | "let"; "open"; i = module_longident; "in"; e = SELF -> + <:expr< let open $id:i$ in $e$ >> | "fun"; "["; a = LIST0 match_case0 SEP "|"; "]" -> <:expr< fun [ $list:a$ ] >> | "fun"; e = fun_def -> e @@ -754,6 +762,8 @@ Very old (no more supported) syntax:\n\ k <:expr< let module $m$ = $mb$ in $e$ >> | "let"; "module"; m = a_UIDENT; mb = module_binding0; ";"; el = SELF -> <:expr< let module $m$ = $mb$ in $mksequence _loc el$ >> + | "let"; "open"; i = module_longident; "in"; e = SELF -> + <:expr< let open $id:i$ in $e$ >> | `ANTIQUOT ("list" as n) s -> <:expr< $anti:mk_anti ~c:"expr;" n s$ >> | e = expr; k = sequence' -> k e ] ] ; @@ -819,7 +829,9 @@ Very old (no more supported) syntax:\n\ <:rec_binding< $anti:mk_anti ~c:"ident" n s$ = $e$ >> | `ANTIQUOT ("list" as n) s -> <:rec_binding< $anti:mk_anti ~c:"rec_binding" n s$ >> - | i = label_longident; e = fun_binding -> <:rec_binding< $i$ = $e$ >> ] ] + | i = label_longident; e = fun_binding -> <:rec_binding< $i$ = $e$ >> + | i = label_longident -> + <:rec_binding< $i$ = $lid:lid_of_ident i$ >> ] ] ; fun_def: [ [ p = labeled_ipatt; (w, e) = fun_def_cont -> @@ -909,6 +921,8 @@ Very old (no more supported) syntax:\n\ ; label_patt_list: [ [ p1 = label_patt; ";"; p2 = SELF -> <:patt< $p1$ ; $p2$ >> + | p1 = label_patt; ";"; "_" -> <:patt< $p1$ ; _ >> + | p1 = label_patt; ";"; "_"; ";" -> <:patt< $p1$ ; _ >> | p1 = label_patt; ";" -> p1 | p1 = label_patt -> p1 ] ]; @@ -919,6 +933,7 @@ Very old (no more supported) syntax:\n\ | `ANTIQUOT ("list" as n) s -> <:patt< $anti:mk_anti ~c:"patt;" n s$ >> | i = label_longident; "="; p = patt -> <:patt< $i$ = $p$ >> + | i = label_longident -> <:patt< $i$ = $lid:lid_of_ident i$ >> ] ] ; ipatt: diff --git a/camlp4/Makefile b/camlp4/Makefile deleted file mode 100644 index 8686e25b..00000000 --- a/camlp4/Makefile +++ /dev/null @@ -1,99 +0,0 @@ -######################################################################### -# # -# Objective Caml # -# # -# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # -# # -# Copyright 2006 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. # -# # -######################################################################### - - - -# RELEASE NOTE: -# Do not forget to call make genclean to update Makefile.clean before a -# release. - -OCAMLC=../boot/ocamlrun ../ocamlc -nostdlib \ - -I ../stdlib -I ../otherlibs/unix -I ../otherlibs/win32unix -I build -g -OCAMLRUN=../boot/ocamlrun -I ../otherlibs/unix -I ../otherlibs/win32unix -YAM=$(OCAMLRUN) ./yam -YAM_OPTIONS=-verbosity '$(VERBOSE)' - -default: all - -opt install doc all pack just_doc: yam - @echo 'YAM $@ (use "make $@ VERBOSE=1" for a verbose make)' - @$(YAM) $(YAM_OPTIONS) $@ - -smartclean:: - if test -x ../boot/ocamlrun; then \ - if test -x ../ocaml; then \ - $(OCAML) build/build.ml -clean; \ - else \ - if test -x ./yam; then \ - $(YAM) $(YAM_OPTIONS) -clean; \ - else \ - $(MAKE) staticclean; \ - fi; \ - fi; \ - else \ - rm -f $(CLEANFILES); \ - fi - -genclean: yam - $(YAM) -genclean Makefile.clean - (echo /Camlp4Ast.ml/d; echo w; echo q) | ed Makefile.clean - -clean:: - rm -f yam .cache-status - rm -f $(CLEANFILES) - rm -f *.cm[io] build/*.cm[io] - -YAM_OBJS=build/YaM.cmo build/camlp4_config.cmo Makefile.cmo - -yam: $(YAM_OBJS) - $(OCAMLC) -o yam unix.cma $(YAM_OBJS) - -.SUFFIXES: .mli .ml .cmi .cmo - -.mli.cmi: - $(OCAMLC) -c $*.mli -.ml.cmo: - $(OCAMLC) -c $*.ml - -build/YaM.cmo: build/YaM.cmi -Makefile.cmo: build/YaM.cmi build/camlp4_config.cmo - -uninstall: - rm -rf "$(LIBDIR)/camlp4" - cd "$(BINDIR)"; rm -f *camlp4* - -depend: - -# Normal bootstrap - -bootstrap: backup promote clean all compare -bootstrap-debug: backup promote-debug clean all compare - -backup restore boot-clean:: - cd boot && $(MAKE) $@ - -promote-debug: - cp camlp4boot-debug.run boot/camlp4boot - -promote: - cp camlp4boot.run boot/camlp4boot - -compare: - @if (cmp camlp4boot.run boot/camlp4boot); \ - then echo "Fixpoint reached, bootstrap succeeded."; \ - else echo "Fixpoint not reached, try one more bootstrapping cycle."; \ - fi - -.PHONY: clean install all uninstall backup restore boot-clean promote-debug \ - promote compare opt doc smartclean depend - -include Makefile.clean diff --git a/camlp4/Makefile.ml b/camlp4/Makefile.ml deleted file mode 100644 index eefedf14..00000000 --- a/camlp4/Makefile.ml +++ /dev/null @@ -1,358 +0,0 @@ -(****************************************************************************) -(* *) -(* Objective Caml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 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 LICENSE at the top of the Objective *) -(* Caml source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) -open YaM -open Format - -let getenv var default = - try Sys.getenv var - with Not_found -> - default - -let libdir_camlp4 = (getenv "LIBDIR" Camlp4_config.libdir) ^ "/camlp4/." - -let bindir = (getenv "BINDIR" Camlp4_config.bindir) ^ "/." - -(** -let unixlib = - match Sys.os_type with - | "Win32" -> "../otherlibs/win32unix" - | _ -> "../otherlibs/unix" -**) -let ocamlrun = "../boot/ocamlrun" (* " -I " ^ unixlib *) -let ocamlrun_os = - Filename.concat Filename.parent_dir_name - (Filename.concat "boot" "ocamlrun") -(* ^ " -I " ^ unixlib *) - -let ocaml = ocamlrun ^ " ../ocaml -I ../stdlib" (* "-I " ^ unixlib *) - -let debug_mode = - (* true *) - false - -let camlp4_modules = - [ - ocamlrun_os; - "./boot/camlp4boot"; - ] -let camlp4_modules = - if debug_mode then "env STATIC_CAMLP4_DEBUG=\\*" :: camlp4_modules - else camlp4_modules - -let debug_opt x = if debug_mode && Sys.file_exists x then [x] else [] -let filter_opt x = if Sys.file_exists x then [x] else [] - -let camlp4boot = "'" ^ String.concat " " camlp4_modules ^ "'" -let camlp4boot_may_debug mods = - let camlp4_modules = camlp4_modules @ - debug_opt "./boot/ExceptionTracer.cmo" @ - filter_opt "./boot/Profiler.cmo" @ mods - in "'" ^ String.concat " " camlp4_modules ^ "'" - -let ocamlc = - best ["../ocamlc.opt", "../ocamlc.opt"; - "../ocamlc", ocamlrun ^^ "../ocamlc"; - "", "echo no byte compiler available && false"] -let ocamlopt = - best ["../ocamlopt.opt", "../ocamlopt.opt"; - "../ocamlopt", ocamlrun ^^ "../ocamlopt"; - "", "echo no native compiler available && false"] - -let () = - !options.ocamlc := ocamlc ^^ " -nostdlib -I ../stdlib"; - !options.ocamlopt := ocamlopt ^^ " -nostdlib -I ../stdlib"; - !options.ocamldoc := ocamlrun ^^ "../ocamldoc/ocamldoc"; - !options.ocamlyacc := ocamlrun ^^ "../boot/ocamlyacc"; - !options.ocamllex := ocamlrun ^^ "../boot/ocamllex"; - !options.ocamldep := ocamlrun ^^ "../tools/ocamldep"; - () - -let options_without_camlp4 = new_scope (lazy !options) - -let windows = Sys.os_type = "Win32" - -let may_define_unix = if windows then [] else ["-D UNIX"] - -let () = - !options.ocaml_Flags ^= "-w Aler -warn-error Aler"^^ - (if getenv "DTYPES" "" <> "" then "-annot" - else ""); - !options.ocaml_P4 := camlp4boot_may_debug may_define_unix; - !options.ocaml_P4_opt := camlp4boot_may_debug ("-D OPT" :: may_define_unix); - () - -let options_without_debug () = { (!options) with ocaml_P4 = ref camlp4boot - ; ocaml_P4_opt = ref camlp4boot } - -let parsing = "../parsing" -and typing = "../typing" -and toplevel = "../toplevel" -and utils = "../utils" -and dynlink = "../otherlibs/dynlink" -and unix = - match Sys.os_type with - | "Win32" -> "../otherlibs/win32unix" - | _ -> "../otherlibs/unix" -and build = "build" - -let ocaml_Module_with_genmap = - generic_ocaml_Module_extension ".genmap.ml" - (fun _ i o -> - "if test ! -e"^^o^^ - "|| ( test -e ./camlp4boot.run"^^ - "&& test -e Camlp4Filters/GenerateMap.cmo"^^ - "&& test -e Camlp4Filters/GenerateFold.cmo"^^ - "&& test -e Camlp4Filters/MetaGenerator.cmo"^^ - "&& test -e Camlp4Filters/RemoveTrashModule.cmo ) ;"^^ - "then ( echo 'module Camlp4FiltersTrash = struct' ;"^^ - "cat Camlp4/Sig/Camlp4Ast.ml ; echo 'end;' ) > Camlp4/Struct/Camlp4Ast.tmp.ml ;"^^ - "( echo '(* Generated file! Do not edit by hand *)' ;"^^ - "../boot/ocamlrun ./camlp4boot.run"^^ - "./Camlp4Filters/GenerateMap.cmo"^^ - "./Camlp4Filters/GenerateFold.cmo"^^ - "./Camlp4Filters/MetaGenerator.cmo"^^ - "./Camlp4Filters/RemoveTrashModule.cmo -printer OCamlr"^^ - i^^" -no_comments ) >"^^o^^"; else : ; fi") - -let camlp4_package_as_one_dir = - ocaml_PackageDir "Camlp4" (lazy [ - ocaml_IModule ~includes:[build] "Config"; - ocaml_IModule ~o:(options_without_debug ()) "Debug"; - ocaml_IModule "Options"; - ocaml_PackageDir "Sig" (lazy [ - ocaml_Interface "Id"; - ocaml_Interface ~ext_includes:[parsing] "Loc"; - ocaml_Interface "Error"; - ocaml_Interface "Warning"; - ocaml_Interface "Type"; - ocaml_Interface "Token"; - ocaml_Interface "Lexer"; - ocaml_PackageDir "Grammar" (lazy [ - ocaml_Interface "Action"; - ocaml_Interface "Structure"; - ocaml_Interface "Dynamic"; - ocaml_Interface "Static" - ]); - ocaml_IModule "Mapper"; - ocaml_Interface "Ast"; - ocaml_Module "Camlp4Ast"; - ocaml_Interface "Quotation"; - ocaml_Interface "Camlp4Token"; - ocaml_Interface "DynLoader"; - ocaml_Interface "AntiquotSyntax"; - ocaml_Interface "Parser"; - ocaml_Interface "Printer"; - ocaml_Interface "Syntax"; - ocaml_Interface "Camlp4Syntax"; - ocaml_Interface "AstFilters"; - ocaml_Interface "SyntaxExtension"; - ]); - ocaml_IModule "ErrorHandler"; - ocaml_PackageDir "Struct" (lazy [ - ocaml_IModule ~ext_includes:[parsing] "Loc"; - ocaml_Module "Warning"; - ocaml_IModule "EmptyError"; - ocaml_IModule "EmptyPrinter"; - ocaml_IModule "Token"; - ocaml_Lexer ~includes:[utils] ~ext_includes:[parsing] ~pp:"" "Lexer"; - ocaml_PackageDir "Grammar" (lazy [ - ocaml_Module "Context"; - ocaml_Module "Structure"; - ocaml_Module "Search"; - ocaml_Module "Tools"; - ocaml_IModule "Print"; - ocaml_Module "Failed"; - ocaml_Module "Parser"; - ocaml_IModule "Fold"; - ocaml_Module "Insert"; - ocaml_Module "Delete"; - ocaml_Module "Entry"; - ocaml_Module "Find"; - ocaml_Module "Dynamic"; - ocaml_Module "Static" - ]); - ocaml_Module "Quotation"; - ocaml_IModule ~ext_includes:[dynlink] "DynLoader"; - ocaml_Module_with_genmap ~flags:"-w z -warn-error z" "Camlp4Ast"; - ocaml_IModule "FreeVars"; - ocaml_Module "AstFilters"; - ocaml_IModule ~ext_includes:[parsing] "Camlp4Ast2OCamlAst"; - ocaml_Module "CleanAst"; - ocaml_IModule "CommentFilter"; - ]); - ocaml_Module "OCamlInitSyntax"; - ocaml_PackageDir "Printers" (lazy [ - ocaml_IModule "Null"; - ocaml_IModule "DumpOCamlAst"; - ocaml_IModule "DumpCamlp4Ast"; - ocaml_IModule "OCaml"; - ocaml_IModule "OCamlr" ~flags:"-w v -warn-error v"; - (* ocaml_IModule "OCamlrr"; *) - ]); - ocaml_IModule "PreCast"; - ocaml_IModule "Register" - ]) - -let camlp4_parsers = - ocaml_PackageDir "Camlp4Parsers" (lazy [ - ocaml_Module "OCamlr"; - ocaml_Module "OCaml"; - (* ocaml_Module "OCamlrr"; *) - ocaml_Module "OCamlQuotationBase"; - ocaml_Module "OCamlQuotation"; - ocaml_Module "OCamlRevisedQuotation"; - ocaml_Module "OCamlOriginalQuotation"; - ocaml_Module "OCamlRevisedParser"; - ocaml_Module "OCamlParser"; - ocaml_Module "Grammar"; - ocaml_Module "Macro"; - ocaml_Module ~o:(options_without_debug ()) "Debug"; - ocaml_Module "LoadCamlp4Ast"; - ]) - -let camlp4_printers = - ocaml_PackageDir "Camlp4Printers" (lazy [ - ocaml_Module "DumpOCamlAst"; - ocaml_Module "DumpCamlp4Ast"; - ocaml_Module "OCaml"; - ocaml_Module "OCamlr"; - (* ocaml_Module "OCamlrr"; *) - ocaml_Module "Null"; - ocaml_Module ~ext_includes:[unix] "Auto"; - ]) - -let camlp4_filters = - ocaml_PackageDir "Camlp4Filters" (lazy [ - ocaml_Module "ExceptionTracer"; - ocaml_Module "Tracer"; - ocaml_Module "StripLocations"; - ocaml_Module "LiftCamlp4Ast"; - ocaml_Module "GenerateMap"; - ocaml_Module "GenerateFold"; - ocaml_Module "MetaGenerator"; - ocaml_Module "RemoveTrashModule"; - ocaml_Module "Profiler"; - ]) - -let camlp4_top = - ocaml_PackageDir "Camlp4Top" (lazy [ - ocaml_Module ~ext_includes:[toplevel; typing; parsing] "Rprint"; - ocaml_Module ~ext_includes:[toplevel; parsing; utils] "Camlp4Top"; - ]) - -let split c s = - let rec self acc s = - try - let pos = String.rindex s c in - let x = String.sub s 0 pos - and y = String.sub s (pos + 1) (String.length s - pos - 1) - in self (y :: acc) x - with Not_found -> s :: acc - in self [] s -let chop_end c s = - let pos = String.rindex s c in - String.sub s (pos + 1) (String.length s - pos - 1) -let file ppf f = - let cin = open_in f in - let rec loop () = - pp_print_string ppf (input_line cin); - fprintf ppf "@\n"; - loop () - in try loop () with End_of_file -> () -let ext_split f = split '.' f - - -let print_packed_sources ppf ?(skip = fun _ -> false) package_dir = - let _ = - fold_units_sources [package_dir] (fun name sources k (skip, inside) -> - eprintf "%s: [%s] (%b)@." name (String.concat "; " sources) inside; - let name = try chop_end '/' name with Not_found -> name in - let k () = ignore (k (skip, true)) in - if not inside then k () else ( - if skip name then fprintf ppf "(**/**)@\n" else fprintf ppf "(** *)@\n"; - fprintf ppf "@[<2>module %s " name; - let (mli, ml, mll, k) = - List.fold_right - (fun x (mli, ml, mll, k) -> - match ext_split x with - | [_; "mli"] -> (Some x, ml, mll, k) - | [_; "ml"] -> (mli, Some x, mll, k) - | [_; "mll"] -> (mli, ml, Some x, k) - | [x; "meta"; "ml"] -> (mli, Some (x^".ml"), mll, fun () -> ()) - | [x; "genmap"; "ml"] -> (mli, Some (x^".ml"), mll, fun () -> ()) - | [_; ext] -> failwith ("unknown extension " ^ ext) - | _ -> failwith ("bad file "^x)) - sources (None, None, None, k) in - (match (ml, mll, mli) with - | (None, None, Some mli) -> fprintf ppf "=@ @[<2>struct@\n" - | (_, _, Some mli) -> fprintf ppf ":@,@[<2>sig@\n%a@]@\nend@\n" file mli; - fprintf ppf "=@ @[<2>struct@\n" - | _ -> fprintf ppf "=@ @[<2>struct@\n"); - (match (ml, mll, mli) with - | (_, Some mll, _) -> - fprintf ppf "(*___CAMLP4_LEXER___ %a ___CAMLP4_LEXER___*)@\n();" - file (String.sub mll 0 (String.length mll - 1)) - | (Some ml, _, _) -> k (); fprintf ppf "%a" file ml - | (None, _, Some mli) -> k (); fprintf ppf "%a" file mli - | _ -> if sources <> [] then () else k ()); - fprintf ppf "@]@\nend;@]@\n"; - if skip name then fprintf ppf "(**/**)@\n"; - ); - (skip, inside) - ) (skip, false) in fprintf ppf "@." - -let run l = - let cmd = String.concat " " l in - let () = Format.printf "%s@." cmd in - let st = YaM.call cmd in - if st <> 0 then failwith ("Exit: " ^ string_of_int st) - -let sed re str file = - run ["sed"; "-i"; "-e"; "'s/"^re^"/"^str^"/'"; file] - -let pack () = - let revised_to_ocaml f = - run ["./boot/camlp4boot -printer OCaml -o "^f^".ml -impl "^f^".ml4"] in - let ppf_of_file f = formatter_of_out_channel (open_out f) in - let skip_struct = function "Struct" -> true | _ -> false in - print_packed_sources (ppf_of_file "Camlp4.ml4") - ~skip:skip_struct camlp4_package_as_one_dir; - print_packed_sources (ppf_of_file "Camlp4Parsers.ml4") camlp4_parsers; - print_packed_sources (ppf_of_file "Camlp4Printers.ml4") camlp4_printers; - print_packed_sources (ppf_of_file "Camlp4Filters.ml4") camlp4_filters; - print_packed_sources (ppf_of_file "Camlp4Top.ml4") camlp4_top; - revised_to_ocaml "Camlp4"; - sed "(\\*___CAMLP4_LEXER___" "" "Camlp4.ml"; - sed "___CAMLP4_LEXER___\\*)" "" "Camlp4.ml"; - sed "^ *# [0-9]\\+.*$" "" "Camlp4.ml"; - revised_to_ocaml "Camlp4Parsers"; - revised_to_ocaml "Camlp4Printers"; - revised_to_ocaml "Camlp4Filters"; - revised_to_ocaml "Camlp4Top" - -let just_doc () = - run ["cd doc && ../../ocamldoc/ocamldoc"; - "-v -short-functors -html"; - "-I ../../parsing -I ../build -I ../../utils -I .."; - "-dump ocamldoc.out"; - "-t 'Camlp4 a Pre-Processor-Pretty-Printer for Objective Caml'"; - "../Camlp4.ml"; "../Camlp4Parsers.ml"; "../Camlp4Printers.ml"; - "../Camlp4Filters.ml"; "../Camlp4Top.ml"] - -let doc () = - pack (); just_doc () diff --git a/camlp4/boot/Camlp4.ml b/camlp4/boot/Camlp4.ml index b2ae399f..fa03d37c 100644 --- a/camlp4/boot/Camlp4.ml +++ b/camlp4/boot/Camlp4.ml @@ -640,7 +640,7 @@ module Sig = (** {6 Traversals} *) (** This class is the base class for map traversal on the Ast. To make a custom traversal class one just extend it like that: - + This example swap pairs expression contents: open Camlp4.PreCast; [class swap = object @@ -1046,6 +1046,8 @@ module Sig = ExVrn of loc * string | (* while e do { e } *) ExWhi of loc * expr * expr + | (* let open i in e *) + ExOpI of loc * ident * expr and module_type = | MtNil of loc | (* i *) @@ -1821,6 +1823,7 @@ module Sig = | ExTyc of loc * expr * ctyp | ExVrn of loc * string | ExWhi of loc * expr * expr + | ExOpI of loc * ident * expr and module_type = | MtNil of loc | MtId of loc * ident @@ -8064,6 +8067,17 @@ module Struct = meta_loc _loc x0) and meta_expr _loc = function + | Ast.ExOpI (x0, x1, x2) -> + Ast.ExApp (_loc, + Ast.ExApp (_loc, + Ast.ExApp (_loc, + Ast.ExId (_loc, + Ast.IdAcc (_loc, + Ast.IdUid (_loc, "Ast"), + Ast.IdUid (_loc, "ExOpI"))), + meta_loc _loc x0), + meta_ident _loc x1), + meta_expr _loc x2) | Ast.ExWhi (x0, x1, x2) -> Ast.ExApp (_loc, Ast.ExApp (_loc, @@ -10103,6 +10117,17 @@ module Struct = meta_loc _loc x0) and meta_expr _loc = function + | Ast.ExOpI (x0, x1, x2) -> + Ast.PaApp (_loc, + Ast.PaApp (_loc, + Ast.PaApp (_loc, + Ast.PaId (_loc, + Ast.IdAcc (_loc, + Ast.IdUid (_loc, "Ast"), + Ast.IdUid (_loc, "ExOpI"))), + meta_loc _loc x0), + meta_ident _loc x1), + meta_expr _loc x2) | Ast.ExWhi (x0, x1, x2) -> Ast.PaApp (_loc, Ast.PaApp (_loc, @@ -11950,6 +11975,10 @@ module Struct = let _x = o#loc _x in let _x_i1 = o#expr _x_i1 in let _x_i2 = o#expr _x_i2 in ExWhi (_x, _x_i1, _x_i2) + | ExOpI (_x, _x_i1, _x_i2) -> + let _x = o#loc _x in + let _x_i1 = o#ident _x_i1 in + let _x_i2 = o#expr _x_i2 in ExOpI (_x, _x_i1, _x_i2) method ctyp : ctyp -> ctyp = function @@ -12715,6 +12744,9 @@ module Struct = | ExWhi (_x, _x_i1, _x_i2) -> let o = o#loc _x in let o = o#expr _x_i1 in let o = o#expr _x_i2 in o + | ExOpI (_x, _x_i1, _x_i2) -> + let o = o#loc _x in + let o = o#ident _x_i1 in let o = o#expr _x_i2 in o method ctyp : ctyp -> 'self_type = function @@ -13889,8 +13921,14 @@ module Struct = | _ -> error loc "range pattern allowed only for characters") | PaRec (loc, p) -> - mkpat loc - (Ppat_record (List.map mklabpat (list_of_patt p []), Closed)) + let ps = list_of_patt p [] in + let is_wildcard = + (function | Ast.PaAny _ -> true | _ -> false) in + let (wildcards, ps) = List.partition is_wildcard ps in + let is_closed = if wildcards = [] then Closed else Open + in + mkpat loc + (Ppat_record (((List.map mklabpat ps), is_closed))) | PaStr (loc, s) -> mkpat loc (Ppat_constant @@ -14189,6 +14227,8 @@ module Struct = | ExWhi (loc, e1, el) -> let e2 = ExSeq (loc, el) in mkexp loc (Pexp_while (expr e1, expr e2)) + | Ast.ExOpI (loc, i, e) -> + mkexp loc (Pexp_open (long_uident i, expr e)) | Ast.ExCom (loc, _, _) -> error loc "expr, expr: not allowed here" | Ast.ExSem (loc, _, _) -> @@ -14539,7 +14579,8 @@ module Struct = (Pcf_cstr (((ctyp t1), (ctyp t2), (mkloc loc)))) :: l | Ast.CrSem (_, cst1, cst2) -> class_str_item cst1 (class_str_item cst2 l) - | CrInh (_, ce, "") -> (Pcf_inher (Fresh, class_expr ce, None)) :: l + | CrInh (_, ce, "") -> + (Pcf_inher (Fresh, class_expr ce, None)) :: l | CrInh (_, ce, pb) -> (Pcf_inher (Fresh, class_expr ce, Some pb)) :: l | CrIni (_, e) -> (Pcf_init (expr e)) :: l @@ -14549,9 +14590,12 @@ module Struct = | Ast.TyNil _ -> None | t -> Some (mkpolytype (ctyp t))) in let e = mkexp loc (Pexp_poly (expr e, t)) - in (Pcf_meth ((s, (mkprivate b), Fresh, e, (mkloc loc)))) :: l + in + (Pcf_meth ((s, (mkprivate b), Fresh, e, (mkloc loc)))) :: + l | CrVal (loc, s, b, e) -> - (Pcf_val ((s, (mkmutable b), Fresh, (expr e), (mkloc loc)))) :: l + (Pcf_val ((s, (mkmutable b), Fresh, (expr e), (mkloc loc)))) :: + l | CrVir (loc, s, b, t) -> (Pcf_virt ((s, (mkprivate b), (mkpolytype (ctyp t)), (mkloc loc)))) :: @@ -18404,6 +18448,9 @@ module Printers = "@[@[<2>let %a%a@]@ @[in@ %a@]@]" o#rec_flag r o#binding bi o#reset_semi#expr e) + | Ast.ExOpI (_, i, e) -> + pp f "@[<2>let open %a@]@ @[<2>in@ %a@]" o#ident i + o#reset_semi#expr e | Ast.ExMat (_, e, a) -> pp f "@[@[@[<2>match %a@]@ with@]%a@]" o#expr e o#match_case a @@ -18518,9 +18565,9 @@ module Printers = Ast.ExFun (_, _) | Ast.ExMat (_, _, _) | Ast.ExTry (_, _, _) | Ast.ExIfe (_, _, _, _) | Ast.ExLet (_, _, _, _) | Ast.ExLmd (_, _, _, _) | - Ast.ExAsr (_, _) | Ast.ExAsf _ | Ast.ExLaz (_, _) | - Ast.ExNew (_, _) | Ast.ExObj (_, _, _) -> - pp f "(%a)" o#reset#expr e + Ast.ExOpI (_, _, _) | Ast.ExAsr (_, _) | + Ast.ExAsf _ | Ast.ExLaz (_, _) | Ast.ExNew (_, _) | + Ast.ExObj (_, _, _) -> pp f "(%a)" o#reset#expr e method direction_flag = fun f b -> @@ -19410,7 +19457,11 @@ module Printers = pp f "@[<2>%a@ when@ %a@ ->@ %a@]" o#patt p o#under_pipe#expr w o#under_pipe#expr e - method sum_type = fun f t -> pp f "@[[ %a ]@]" o#ctyp t + method sum_type = + fun f -> + function + | Ast.TyNil _ -> pp f "[]" + | t -> pp f "@[[ %a ]@]" o#ctyp t method ident = fun f i -> diff --git a/camlp4/boot/Camlp4Ast.ml b/camlp4/boot/Camlp4Ast.ml index 68ce6da4..d7af05e7 100644 --- a/camlp4/boot/Camlp4Ast.ml +++ b/camlp4/boot/Camlp4Ast.ml @@ -1180,7 +1180,17 @@ module Make (Loc : Sig.Loc) : Sig.Camlp4Ast with module Loc = Loc = (meta_loc _loc x0) ] and meta_expr _loc = fun - [ Ast.ExWhi x0 x1 x2 -> + [ Ast.ExOpI x0 x1 x2 -> + Ast.ExApp _loc + (Ast.ExApp _loc + (Ast.ExApp _loc + (Ast.ExId _loc + (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") + (Ast.IdUid _loc "ExOpI"))) + (meta_loc _loc x0)) + (meta_ident _loc x1)) + (meta_expr _loc x2) + | Ast.ExWhi x0 x1 x2 -> Ast.ExApp _loc (Ast.ExApp _loc (Ast.ExApp _loc @@ -3100,7 +3110,17 @@ module Make (Loc : Sig.Loc) : Sig.Camlp4Ast with module Loc = Loc = (meta_loc _loc x0) ] and meta_expr _loc = fun - [ Ast.ExWhi x0 x1 x2 -> + [ Ast.ExOpI x0 x1 x2 -> + Ast.PaApp _loc + (Ast.PaApp _loc + (Ast.PaApp _loc + (Ast.PaId _loc + (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") + (Ast.IdUid _loc "ExOpI"))) + (meta_loc _loc x0)) + (meta_ident _loc x1)) + (meta_expr _loc x2) + | Ast.ExWhi x0 x1 x2 -> Ast.PaApp _loc (Ast.PaApp _loc (Ast.PaApp _loc @@ -4817,7 +4837,11 @@ module Make (Loc : Sig.Loc) : Sig.Camlp4Ast with module Loc = Loc = | ExWhi _x _x_i1 _x_i2 -> let _x = o#loc _x in let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#expr _x_i2 in ExWhi _x _x_i1 _x_i2 ]; + let _x_i2 = o#expr _x_i2 in ExWhi _x _x_i1 _x_i2 + | ExOpI _x _x_i1 _x_i2 -> + let _x = o#loc _x in + let _x_i1 = o#ident _x_i1 in + let _x_i2 = o#expr _x_i2 in ExOpI _x _x_i1 _x_i2 ]; method ctyp : ctyp -> ctyp = fun [ TyNil _x -> let _x = o#loc _x in TyNil _x @@ -5457,7 +5481,10 @@ module Make (Loc : Sig.Loc) : Sig.Camlp4Ast with module Loc = Loc = | ExVrn _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o | ExWhi _x _x_i1 _x_i2 -> let o = o#loc _x in - let o = o#expr _x_i1 in let o = o#expr _x_i2 in o ]; + let o = o#expr _x_i1 in let o = o#expr _x_i2 in o + | ExOpI _x _x_i1 _x_i2 -> + let o = o#loc _x in + let o = o#ident _x_i1 in let o = o#expr _x_i2 in o ]; method ctyp : ctyp -> 'self_type = fun [ TyNil _x -> let o = o#loc _x in o diff --git a/camlp4/boot/camlp4boot.ml b/camlp4/boot/camlp4boot.ml index 8b5537a5..d84dc53b 100644 --- a/camlp4/boot/camlp4boot.ml +++ b/camlp4/boot/camlp4boot.ml @@ -415,6 +415,12 @@ Very old (no more supported) syntax:\n\ | (Ast.ExSem (_, _, _) as e) -> Ast.ExSeq (_loc, e) | e -> e + let rec lid_of_ident = + function + | Ast.IdAcc (_, _, i) -> lid_of_ident i + | Ast.IdLid (_, lid) -> lid + | _ -> assert false + let module_type_app mt1 mt2 = match (mt1, mt2) with | (Ast.MtId (_loc, i1), Ast.MtId (_, i2)) -> @@ -1874,6 +1880,16 @@ Very old (no more supported) syntax:\n\ (_loc : Gram.Loc.t) -> (Ast.ExFun (_loc, Ast.mcOr_of_list a) : 'expr)))); + ([ Gram.Skeyword "let"; Gram.Skeyword "open"; + Gram.Snterm + (Gram.Entry.obj + (module_longident : + 'module_longident Gram.Entry.t)); + Gram.Skeyword "in"; Gram.Sself ], + (Gram.Action.mk + (fun (e : 'expr) _ (i : 'module_longident) _ _ + (_loc : Gram.Loc.t) -> + (Ast.ExOpI (_loc, i, e) : 'expr)))); ([ Gram.Skeyword "let"; Gram.Skeyword "module"; Gram.Snterm (Gram.Entry.obj @@ -2671,6 +2687,16 @@ Very old (no more supported) syntax:\n\ mk_anti ~c: "expr;" n s) : 'sequence) | _ -> assert false))); + ([ Gram.Skeyword "let"; Gram.Skeyword "open"; + Gram.Snterm + (Gram.Entry.obj + (module_longident : + 'module_longident Gram.Entry.t)); + Gram.Skeyword "in"; Gram.Sself ], + (Gram.Action.mk + (fun (e : 'sequence) _ (i : 'module_longident) _ + _ (_loc : Gram.Loc.t) -> + (Ast.ExOpI (_loc, i, e) : 'sequence)))); ([ Gram.Skeyword "let"; Gram.Skeyword "module"; Gram.Snterm (Gram.Entry.obj @@ -3041,6 +3067,17 @@ Very old (no more supported) syntax:\n\ (None, [ (None, None, [ ([ Gram.Snterm + (Gram.Entry.obj + (label_longident : + 'label_longident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'label_longident) (_loc : Gram.Loc.t) + -> + (Ast.RbEq (_loc, i, + Ast.ExId (_loc, + Ast.IdLid (_loc, lid_of_ident i))) : + 'label_expr)))); + ([ Gram.Snterm (Gram.Entry.obj (label_longident : 'label_longident Gram.Entry.t)); @@ -3673,6 +3710,25 @@ Very old (no more supported) syntax:\n\ (Gram.Action.mk (fun _ (p1 : 'label_patt) (_loc : Gram.Loc.t) -> (p1 : 'label_patt_list)))); + ([ Gram.Snterm + (Gram.Entry.obj + (label_patt : 'label_patt Gram.Entry.t)); + Gram.Skeyword ";"; Gram.Skeyword "_"; + Gram.Skeyword ";" ], + (Gram.Action.mk + (fun _ _ _ (p1 : 'label_patt) + (_loc : Gram.Loc.t) -> + (Ast.PaSem (_loc, p1, Ast.PaAny _loc) : + 'label_patt_list)))); + ([ Gram.Snterm + (Gram.Entry.obj + (label_patt : 'label_patt Gram.Entry.t)); + Gram.Skeyword ";"; Gram.Skeyword "_" ], + (Gram.Action.mk + (fun _ _ (p1 : 'label_patt) (_loc : Gram.Loc.t) + -> + (Ast.PaSem (_loc, p1, Ast.PaAny _loc) : + 'label_patt_list)))); ([ Gram.Snterm (Gram.Entry.obj (label_patt : 'label_patt Gram.Entry.t)); @@ -3687,6 +3743,17 @@ Very old (no more supported) syntax:\n\ (None, [ (None, None, [ ([ Gram.Snterm + (Gram.Entry.obj + (label_longident : + 'label_longident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'label_longident) (_loc : Gram.Loc.t) + -> + (Ast.PaEq (_loc, i, + Ast.PaId (_loc, + Ast.IdLid (_loc, lid_of_ident i))) : + 'label_patt)))); + ([ Gram.Snterm (Gram.Entry.obj (label_longident : 'label_longident Gram.Entry.t)); diff --git a/config/Makefile.msvc64 b/config/Makefile.msvc64 index 5088fc17..3dd60b9d 100644 --- a/config/Makefile.msvc64 +++ b/config/Makefile.msvc64 @@ -89,7 +89,8 @@ BYTECCLINKOPTS= DLLCCCOMPOPTS=/Ox /MD ### Libraries needed -EXTRALIBS=bufferoverflowu.lib +#EXTRALIBS=bufferoverflowu.lib # for the old PSDK compiler only +EXTRALIBS= BYTECCLIBS=advapi32.lib ws2_32.lib $(EXTRALIBS) NATIVECCLIBS=advapi32.lib ws2_32.lib $(EXTRALIBS) diff --git a/configure b/configure index 40a89e85..f21bca47 100755 --- a/configure +++ b/configure @@ -576,7 +576,16 @@ if test $withsharedlibs = "yes"; then byteccrpath="-Wl,-rpath," mksharedlibrpath="-rpath " shared_libraries_supported=true;; - i[3456]86-*-darwin[4-9]*) + i[3456]86-*-darwin10.*) + if test $arch64 == true; then + mksharedlib="$bytecc -bundle -flat_namespace -undefined suppress" + bytecccompopts="$dl_defs $bytecccompopts" + dl_needs_underscore=false + shared_libraries_supported=true + else + shared_libraries_supported=false + fi;; + i[3456]86-*-darwin*) mksharedlib="$bytecc -bundle -flat_namespace -undefined suppress -read_only_relocs suppress" bytecccompopts="$dl_defs $bytecccompopts" dl_needs_underscore=false diff --git a/debugger/command_line.ml b/debugger/command_line.ml index 5fdf3da4..babb65bb 100644 --- a/debugger/command_line.ml +++ b/debugger/command_line.ml @@ -807,6 +807,22 @@ let loading_mode_variable ppf = find loading_modes; fprintf ppf "@." +let follow_fork_variable = + (function lexbuf -> + let mode = + match identifier_eol Lexer.lexeme lexbuf with + | "child" -> Fork_child + | "parent" -> Fork_parent + | _ -> error "Syntax error." + in + fork_mode := mode; + if !loaded then update_follow_fork_mode ()), + function ppf -> + fprintf ppf "%s@." + (match !fork_mode with + Fork_child -> "child" + | Fork_parent -> "parent") + (** Infos. **) let pr_modules ppf mods = @@ -1106,7 +1122,14 @@ It can be either :\n\ var_action = integer_variable false 1 "Must be at least 1" max_printer_steps; var_help = -"maximal number of value nodes printed." }]; +"maximal number of value nodes printed." }; + { var_name = "follow_fork_mode"; + var_action = follow_fork_variable; + var_help = +"process to follow after forking.\n\ +It can be either : + child : the newly created process.\n\ + parent : the process that called fork.\n" }]; info_list := (* info name, function, help *) diff --git a/debugger/debugcom.ml b/debugger/debugcom.ml index 5bfbb2bf..dfe905ba 100644 --- a/debugger/debugcom.ml +++ b/debugger/debugcom.ml @@ -22,8 +22,25 @@ open Primitives let conn = ref Primitives.std_io +(* Set which process the debugger follows on fork. *) + +type follow_fork_mode = + Fork_child + | Fork_parent + +let fork_mode = ref Fork_parent + +let update_follow_fork_mode () = + let a = match !fork_mode with Fork_child -> 0 | Fork_parent -> 1 in + output_char !conn.io_out 'K'; + output_binary_int !conn.io_out a + +(* Set the current connection, and update the fork mode in case it has + * changed. *) + let set_current_connection io_chan = - conn := io_chan + conn := io_chan; + update_follow_fork_mode () (* Modify the program code *) diff --git a/debugger/debugcom.mli b/debugger/debugcom.mli index 6c7a5344..abf4fd0b 100644 --- a/debugger/debugcom.mli +++ b/debugger/debugcom.mli @@ -32,6 +32,10 @@ type checkpoint_report = Checkpoint_done of int | Checkpoint_failed +type follow_fork_mode = + Fork_child + | Fork_parent + (* Set the current connection with the debuggee *) val set_current_connection : Primitives.io_channel -> unit @@ -76,6 +80,10 @@ val up_frame : int -> int * int (* Set the trap barrier to given stack position. *) val set_trap_barrier : int -> unit +(* Set whether the debugger follow the child or the parent process on fork *) +val fork_mode : follow_fork_mode ref +val update_follow_fork_mode : unit -> unit + (* Handling of remote values *) exception Marshalling_error diff --git a/driver/main.ml b/driver/main.ml index cae487b8..18480739 100644 --- a/driver/main.ml +++ b/driver/main.ml @@ -129,6 +129,7 @@ module Options = Main_args.Make_bytecomp_options (struct let _version = print_version_string let _w = (Warnings.parse_options false) let _warn_error = (Warnings.parse_options true) + let _warn_help = Warnings.help_warnings let _where = print_standard_library let _verbose = set verbose let _nopervasives = set nopervasives diff --git a/driver/main_args.ml b/driver/main_args.ml index 8b6cedd8..8af91932 100644 --- a/driver/main_args.ml +++ b/driver/main_args.ml @@ -258,21 +258,28 @@ let mk_vmthread f = let mk_w f = "-w", Arg.String f, + Printf.sprintf " Enable or disable warnings according to :\n\ - \ + enable warning \n\ - \ + enable set \n\ - \ - disable warning \n\ - \ - disable set \n\ - \ @ enable warning and treat it as an error\n\ - \ @ enable set and treat them as errors\n\ - \ default setting is \"+a-4-6-9-27-28-29\"" + \ + enable warnings in \n\ + \ - disable warnings in \n\ + \ @ enable warnings in and treat them as errors\n\ + \ can be:\n\ + \ a single warning number\n\ + \ .. a range of consecutive warning numbers\n\ + \ a predefined set\n\ + \ default setting is %S" Warnings.defaults_w ;; let mk_warn_error f = "-warn-error", Arg.String f, + Printf.sprintf " Enable or disable error status for warnings according\n\ \ to . See option -w for the syntax of .\n\ - \ Default setting is \"-a\"" + \ Default setting is %S" Warnings.defaults_warn_error +;; + +let mk_warn_help f = + "-warn-help", Arg.Unit f, " Show description of warning numbers" ;; let mk_where f = @@ -401,6 +408,7 @@ module type Bytecomp_options = sig val _verbose : unit -> unit val _w : string -> unit val _warn_error : string -> unit + val _warn_help : unit -> unit val _where : unit -> unit val _nopervasives : unit -> unit @@ -429,6 +437,7 @@ module type Bytetop_options = sig val _version : unit -> unit val _w : string -> unit val _warn_error : string -> unit + val _warn_help : unit -> unit val _dparsetree : unit -> unit val _drawlambda : unit -> unit @@ -480,6 +489,7 @@ module type Optcomp_options = sig val _verbose : unit -> unit val _w : string -> unit val _warn_error : string -> unit + val _warn_help : unit -> unit val _where : unit -> unit val _nopervasives : unit -> unit @@ -522,6 +532,7 @@ module type Opttop_options = sig val _version : unit -> unit val _w : string -> unit val _warn_error : string -> unit + val _warn_help : unit -> unit val _dparsetree : unit -> unit val _drawlambda : unit -> unit @@ -596,6 +607,7 @@ struct mk_vmthread F._vmthread; mk_w F._w; mk_warn_error F._warn_error; + mk_warn_help F._warn_help; mk_where F._where; mk_nopervasives F._nopervasives; @@ -627,6 +639,7 @@ struct mk_version F._version; mk_w F._w; mk_warn_error F._warn_error; + mk_warn_help F._warn_help; mk_dparsetree F._dparsetree; mk_drawlambda F._drawlambda; @@ -682,6 +695,7 @@ struct mk_verbose F._verbose; mk_w F._w; mk_warn_error F._warn_error; + mk_warn_help F._warn_help; mk_where F._where; mk_nopervasives F._nopervasives; @@ -724,6 +738,7 @@ module Make_opttop_options (F : Opttop_options) = struct mk_version F._version; mk_w F._w; mk_warn_error F._warn_error; + mk_warn_help F._warn_help; mk_dparsetree F._dparsetree; mk_drawlambda F._drawlambda; diff --git a/driver/main_args.mli b/driver/main_args.mli index 874410f9..e0a7e2fa 100644 --- a/driver/main_args.mli +++ b/driver/main_args.mli @@ -54,6 +54,7 @@ module type Bytecomp_options = val _verbose : unit -> unit val _w : string -> unit val _warn_error : string -> unit + val _warn_help : unit -> unit val _where : unit -> unit val _nopervasives : unit -> unit @@ -83,6 +84,7 @@ module type Bytetop_options = sig val _version : unit -> unit val _w : string -> unit val _warn_error : string -> unit + val _warn_help : unit -> unit val _dparsetree : unit -> unit val _drawlambda : unit -> unit @@ -134,6 +136,7 @@ module type Optcomp_options = sig val _verbose : unit -> unit val _w : string -> unit val _warn_error : string -> unit + val _warn_help : unit -> unit val _where : unit -> unit val _nopervasives : unit -> unit @@ -176,6 +179,7 @@ module type Opttop_options = sig val _version : unit -> unit val _w : string -> unit val _warn_error : string -> unit + val _warn_help : unit -> unit val _dparsetree : unit -> unit val _drawlambda : unit -> unit diff --git a/driver/optmain.ml b/driver/optmain.ml index 53b19a75..51a9162d 100644 --- a/driver/optmain.ml +++ b/driver/optmain.ml @@ -138,6 +138,7 @@ module Options = Main_args.Make_optcomp_options (struct let _verbose = set verbose let _w s = Warnings.parse_options false s let _warn_error s = Warnings.parse_options true s + let _warn_help = Warnings.help_warnings let _where () = print_standard_library () let _nopervasives = set nopervasives diff --git a/emacs/caml-help.el b/emacs/caml-help.el index e6517185..2adba675 100644 --- a/emacs/caml-help.el +++ b/emacs/caml-help.el @@ -497,7 +497,8 @@ This uses info files produced by HeVeA. (message "Scanning info files in %s" dir) (save-window-excursion (set-buffer (get-buffer-create "*caml-help*")) - (or (shell-command command (current-buffer)) (error "HERE")) + (or (shell-command command (current-buffer)) + (error "Could not run:%s" command)) (goto-char (point-min)) (while (re-search-forward module-regexp (point-max) t) (if (equal (char-after (match-end 1)) 127) @@ -624,7 +625,8 @@ current buffer using \\[ocaml-qualified-identifier]." (progn (message "Help for entry %s not found in module %s" entry module) - (goto-char here))))) + (goto-char here))) + )) (ocaml-link-activate (cdr info-section)) (if (window-live-p window) (select-window window)) )) @@ -778,26 +780,27 @@ buffer positions." (mapconcat 'car links "\\|") "\\)[^A-Za-z0-9'_]")) (case-fold-search nil)) - (goto-char (point-min)) - (let ((buffer-read-only nil) - ;; use of dynamic scoping, need not be restored! - (modified-p (buffer-modified-p))) - (unwind-protect - (save-excursion - (goto-char (point-min)) - (while (re-search-forward regexp (point-max) t) - (put-text-property (match-beginning 1) (match-end 1) - 'mouse-face 'highlight) - (put-text-property (match-beginning 1) (match-end 1) - 'local-map ocaml-link-map) - (if (x-display-color-p) - (put-text-property (match-beginning 1) (match-end 1) - 'face 'ocaml-link-face))) - ) - ;; need to restore flag if buffer was unmodified. - (unless modified-p (set-buffer-modified-p nil)) - )) - )))) + (save-excursion + (goto-char (point-min)) + (let ((buffer-read-only nil) + ;; use of dynamic scoping, need not be restored! + (modified-p (buffer-modified-p))) + (unwind-protect + (save-excursion + (goto-char (point-min)) + (while (re-search-forward regexp (point-max) t) + (put-text-property (match-beginning 1) (match-end 1) + 'mouse-face 'highlight) + (put-text-property (match-beginning 1) (match-end 1) + 'local-map ocaml-link-map) + (if (x-display-color-p) + (put-text-property (match-beginning 1) (match-end 1) + 'face 'ocaml-link-face))) + ) + ;; need to restore flag if buffer was unmodified. + (unless modified-p (set-buffer-modified-p nil)) + )) + ))))) diff --git a/emacs/camldebug.el b/emacs/camldebug.el index cc51c826..d5ba599c 100644 --- a/emacs/camldebug.el +++ b/emacs/camldebug.el @@ -573,7 +573,11 @@ the camldebug commands `cd DIR' and `directory'." (let ((output)) (if (buffer-name (process-buffer proc)) (let ((process-window)) - (save-excursion + ;; it does not seem necessary to save excursion here, + ;; since set-buffer as a temporary effect. + ;; comint-output-filter explicitly avoids it. + ;; in version 23, it prevents the marker to stay at end of buffer + ;; (save-excursion (set-buffer (process-buffer proc)) ;; If we have been so requested, delete the debugger prompt. (if (marker-buffer camldebug-delete-prompt-marker) @@ -590,7 +594,12 @@ the camldebug commands `cd DIR' and `directory'." (>= (point) (process-mark proc)) (get-buffer-window (current-buffer)))) ;; Insert the text, moving the process-marker. - (comint-output-filter proc output)) + (comint-output-filter proc output) + ;; ) + ;; this was the end of save-excursion. + ;; if save-excursion is used (comint-next-prompt 1) would be needed + ;; to move the mark past then next prompt, but this is not as good + ;; as solution. (if process-window (save-selected-window (select-window process-window) diff --git a/emacs/inf-caml.el b/emacs/inf-caml.el index f2291f90..ba2eb039 100644 --- a/emacs/inf-caml.el +++ b/emacs/inf-caml.el @@ -94,8 +94,9 @@ be sent from another buffer in Caml mode. (if (string-match "[^ ]" s) (setq inferior-caml-output t))) (defun inferior-caml-mode-output-hook () - (setq comint-output-filter-functions - (list (function inferior-caml-signal-output)))) + (set-variable 'comint-output-filter-functions + (list (function inferior-caml-signal-output)) + t)) (add-hook 'inferior-caml-mode-hooks 'inferior-caml-mode-output-hook) ;; To launch ocaml whenever needed diff --git a/lex/parser.mly b/lex/parser.mly index dd818e78..9bc0906a 100644 --- a/lex/parser.mly +++ b/lex/parser.mly @@ -54,11 +54,11 @@ let as_cset = function %token Tstar Tmaybe Tplus Tlparen Trparen Tcaret Tdash Tlet Tas Tsharp %right Tas -%left Tsharp %left Tor %nonassoc CONCAT %nonassoc Tmaybe Tstar Tplus - Tident Tchar Tstring Tunderscore Teof Tlbracket Tlparen +%left Tsharp +%nonassoc Tident Tchar Tstring Tunderscore Teof Tlbracket Tlparen %start lexer_definition %type lexer_definition diff --git a/myocamlbuild.ml b/myocamlbuild.ml index 92067c4d..2ee15ff9 100644 --- a/myocamlbuild.ml +++ b/myocamlbuild.ml @@ -45,30 +45,21 @@ let syscamllib x = if ccomptype = "msvc" then A(Printf.sprintf "lib%s.lib" x) else A("-l"^x) -let mkobj obj file opts = - let obj = obj-.-C.o in +let ccoutput cc obj file = if ccomptype = "msvc" then - Seq[Cmd(S[Sh C.bytecc; Sh C.bytecccompopts; opts; A"-c"; Px file]); + Seq[Cmd(S[cc; A"-c"; Px file]); mv (Pathname.basename (Pathname.update_extension C.o file)) obj] else - Cmd(S[Sh C.bytecc; Sh C.bytecccompopts; opts; A"-c"; P file; A"-o"; Px obj]) + Cmd(S[cc; A"-c"; P file; A"-o"; Px obj]) -let mkdynobj obj file opts = - let d_obj = obj-.-"d"-.-C.o in - if ccomptype = "msvc" then - Seq[Cmd(S[Sh C.bytecc; opts; Sh C.dllcccompopts; A"-c"; Px file]); - mv (Pathname.basename (Pathname.update_extension C.o file)) d_obj] - else - Cmd(S[Sh C.bytecc; opts; Sh C.dllcccompopts; A"-c"; P file; A"-o"; Px d_obj]) +let mkobj obj file opts = + let tags = tags_of_pathname file++"c"++"compile"++ccomptype in + let bytecc_with_opts = S[Sh C.bytecc; Sh C.bytecccompopts; opts; T tags] in + ccoutput bytecc_with_opts obj file let mknatobj obj file opts = - let obj = obj-.-C.o in - if ccomptype = "msvc" then - Seq[Cmd(S[Sh C.nativecc; opts; A"-c"; Px file]); - mv (Pathname.basename (Pathname.update_extension C.o file)) obj] - else - Cmd(S[Sh C.nativecc; A"-O"; opts; - Sh C.nativecccompopts; A"-c"; P file; A"-o"; Px obj]) + let nativecc_with_opts = S[Sh C.nativecc; opts; Sh C.nativecccompopts] in + ccoutput nativecc_with_opts obj file let add_exe a = if not windows || Pathname.check_extension a "exe" then a @@ -126,6 +117,11 @@ let dynlink_dir = if_mixed_dir "otherlibs/dynlink";; let str_dir = if_mixed_dir "otherlibs/str";; let toplevel_dir = if_mixed_dir "toplevel";; +let systhreads_file f = "otherlibs/systhreads"/f +let systhreads_obj f = "otherlibs/systhreads"/f-.-C.o +let systhreads_lib f = "otherlibs/systhreads"/f-.-C.a +let systhreads_dll f = "otherlibs/systhreads"/f-.-C.so + let ocamlc_solver = let native_deps = ["ocamlc.opt"; "stdlib/stdlib.cmxa"; "stdlib/std_exit.cmx"; "stdlib/std_exit"-.-C.o] in @@ -196,12 +192,10 @@ dispatch begin function let hot_camlp4boot = "camlp4"/"boot"/"camlp4boot.byte";; let cold_camlp4boot = "camlp4boot" (* The installed version *);; +let cold_camlp4o = "camlp4o" (* The installed version *);; flag ["ocaml"; "ocamlyacc"] (A"-v");; -flag ["ocaml"; "compile"; "warn_Aler"] (S[A"-w";A"Aler"; A"-warn-error";A"Almer"]);; -flag ["ocaml"; "compile"; "warn_Alerzv"] (S[A"-w";A"Alerzv"; A"-warn-error";A"Almerzv"]);; - non_dependency "otherlibs/threads/pervasives.ml" "Unix";; non_dependency "otherlibs/threads/pervasives.ml" "String";; @@ -314,13 +308,6 @@ copy_rule "The thread specific unix library (mllib)" ~insert:`bottom "otherl (* Temporary rule, waiting for a full usage of ocamlbuild *) copy_rule "Temporary rule, waiting for a full usage of ocamlbuild" "%.mlbuild" "%.ml";; -if windows then - copy_rule "thread_win32.ml -> thread.ml" - "otherlibs/systhreads/thread_win32.ml" "otherlibs/systhreads/thread.ml" -else - copy_rule "thread_posix.ml -> thread.ml" - "otherlibs/systhreads/thread_posix.ml" "otherlibs/systhreads/thread.ml";; - copy_rule "graph/graphics.ml -> win32graph/graphics.ml" "otherlibs/graph/graphics.ml" "otherlibs/win32graph/graphics.ml";; copy_rule "graph/graphics.mli -> win32graph/graphics.mli" "otherlibs/graph/graphics.mli" "otherlibs/win32graph/graphics.mli";; @@ -410,17 +397,7 @@ rule "C files" ~dep:"%.c" ~insert:(`before "ocaml C stubs: c -> o") begin fun env _ -> - let c = env "%.c" in - mkobj (env "%") c (T(tags_of_pathname c++"c"++"compile"++ccomptype)) - end;; - -rule "C files for windows dynamic libraries" - ~prod:("%.d"-.-C.o) - ~dep:"%.c" - ~insert:(`before "C files") - begin fun env _ -> - let c = env "%.c" in - mkdynobj (env "%") c (T(tags_of_pathname c++"c"++"compile"++"dll"++ccomptype)) + mkobj (env ("%"-.-C.o)) (env "%.c") N end;; (* ../ is because .h files are not dependencies so they are not imported in build dir *) @@ -484,89 +461,54 @@ flag ["c"; "compile"; "otherlibs_labltk"] (S[A"-Ibyterun"; Sh C.tk_defs; Sh C.sh (* Sys threads *) -rule "posix native systhreads" - ~prod:"otherlibs/systhreads/posix_n.o" - ~dep:"otherlibs/systhreads/posix.c" - ~insert:`top - begin fun _ _ -> - Cmd(S[Sh C.nativecc; A"-O"; A"-I../asmrun"; A"-I../byterun"; - Sh C.nativecccompopts; Sh C.sharedcccompopts; - A"-DNATIVE_CODE"; A("-DTARGET_"^C.arch); A("-DSYS_"^C.system); A"-c"; - A"otherlibs/systhreads/posix.c"; A"-o"; Px"otherlibs/systhreads/posix_n.o"]) - end;; - -rule "posix bytecode systhreads" - ~prod:"otherlibs/systhreads/posix_b.o" - ~dep:"otherlibs/systhreads/posix.c" - ~insert:`top - begin fun _ _ -> - Cmd(S[Sh C.bytecc; A"-O"; A"-I../byterun"; - Sh C.bytecccompopts; Sh C.sharedcccompopts; - A"-c"; A"otherlibs/systhreads/posix.c"; A"-o"; Px"otherlibs/systhreads/posix_b.o"]) - end;; - -rule "windows native systhreads" - ~prod:("otherlibs/systhreads/win32_n"-.-C.o) - ~dep:"otherlibs/systhreads/win32.c" - ~insert:`top - begin fun _ _ -> - mknatobj "otherlibs/systhreads/win32_n" - "otherlibs/systhreads/win32.c" - (S[A"-I../asmrun"; A"-I../byterun"; A"-DNATIVE_CODE"]) - end;; +let systhreads_stubs_headers = + List.map systhreads_file + [if windows then "st_win32.h" else "st_posix.h"; "threads.h"] +;; -rule "windows bytecode static systhreads" - ~prod:("otherlibs/systhreads/win32_b"-.-C.o) - ~dep:"otherlibs/systhreads/win32.c" +rule "native systhreads" + ~prod:(systhreads_obj "st_stubs_n") + ~deps:(systhreads_file "st_stubs.c" :: systhreads_stubs_headers) ~insert:`top begin fun _ _ -> - mkobj "otherlibs/systhreads/win32_b" "otherlibs/systhreads/win32.c" - ((*A"-O"; why ? *) A"-I../byterun") + mknatobj (systhreads_obj "st_stubs_n") + (systhreads_file "st_stubs.c") + (S[A"-I../asmrun"; A"-I../byterun"; A"-Iotherlibs/systhreads"; + if windows then N else Sh C.sharedcccompopts; + A"-DNATIVE_CODE"; A("-DTARGET_"^C.arch); A("-DSYS_"^C.system)]) end;; -rule "windows bytecode dynamic systhreads" - ~prod:("otherlibs/systhreads/win32_b.d"-.-C.o) - ~dep:"otherlibs/systhreads/win32.c" +rule "bytecode systhreads" + ~prod:(systhreads_obj "st_stubs_b") + ~deps:(systhreads_file "st_stubs.c" :: systhreads_stubs_headers) ~insert:`top begin fun _ _ -> - mkdynobj "otherlibs/systhreads/win32_b" "otherlibs/systhreads/win32.c" - ((*A"-O"; why ? *) A"-I../byterun") + mkobj (systhreads_obj "st_stubs_b") (systhreads_file "st_stubs.c") + (S[A"-I../byterun"; A"-Iotherlibs/systhreads"; Sh C.sharedcccompopts]) end;; -if windows then begin - rule "windows libthreadsnat.a" - ~prod:("otherlibs/systhreads/libthreadsnat"-.-C.a) - ~dep:("otherlibs/systhreads/win32_n"-.-C.o) - ~insert:`top - begin fun _ _ -> - mklib ("otherlibs/systhreads/libthreadsnat"-.-C.a) (P("otherlibs/systhreads/win32_n"-.-C.o)) N - end -end else begin -(* Dynamic linking with -lpthread is risky on many platforms, so - do not create a shared object for libthreadsnat. *) rule "libthreadsnat.a" - ~prod:"otherlibs/systhreads/libthreadsnat.a" - ~dep:"otherlibs/systhreads/posix_n.o" + ~prod:(systhreads_lib "libthreadsnat") + ~dep:(systhreads_obj "st_stubs_n") ~insert:`top begin fun _ _ -> - mklib "otherlibs/systhreads/libthreadsnat.a" (A"otherlibs/systhreads/posix_n.o") N + if windows then + mklib (systhreads_lib "libthreadsnat") (P(systhreads_obj "st_stubs_n")) N + else + (* Dynamic linking with -lpthread is risky on many platforms, so + do not create a shared object for libthreadsnat. *) + Cmd(S[ar; A"rc"; Px(systhreads_lib "libthreadsnat"); + P(systhreads_obj "st_stubs_n")]) end; (* See remark above: force static linking of libthreadsnat.a *) -flag ["ocaml"; "link"; "library"; "otherlibs_systhreads"; "native"] begin - S[A"-cclib"; syscamllib "threadsnat"; (* A"-cclib"; syscamllib "unix"; seems to be useless and can be dangerous during bootstrap *) Sh C.pthread_link] -end; -end;; - if windows then -copy_rule "systhreads/libthreads.clib is diffrent on windows" - ~insert:`top - ("otherlibs/systhreads/libthreadswin32"-.-C.a) - ("otherlibs/systhreads/libthreads"-.-C.a);; + flag ["ocaml"; "link"; "library"; "otherlibs_systhreads"; "native"] begin + S[A"-cclib"; syscamllib "threadsnat"; (* A"-cclib"; syscamllib "unix"; seems to be useless and can be dangerous during bootstrap *) Sh C.pthread_link] + end;; flag ["ocaml"; "ocamlmklib"; "otherlibs_systhreads"] (S[(* A"-cclib"; syscamllib "unix";; seems to be useless and can be dangerous during bootstrap *) Sh C.pthread_link]);; - flag ["c"; "compile"; "otherlibs"] begin S[A"-I"; P"../byterun"; A"-I"; P(".."/unix_dir); @@ -641,28 +583,6 @@ rule "camlheader" A"cp"; A"stdlib/camlheader"; A"stdlib/camlheader_ur"]) end;; -rule "ocaml C stubs on windows: dlib & d.o* -> dll" - ~prod:"%.dll" - ~deps:["%.dlib"(*; "byterun/libcamlrun"-.-C.a*)] - ~insert:`top - begin fun env build -> - let dlib = env "%.dlib" in - let dll = env "%.dll" in - let objs = string_list_of_file dlib in - let include_dirs = Pathname.include_dirs_of (Pathname.dirname dll) in - let resluts = build begin - List.map begin fun d_o -> - List.map (fun dir -> dir / (Pathname.update_extension C.o d_o)) include_dirs - end objs - end in - let objs = List.map begin function - | Outcome.Good d_o -> d_o - | Outcome.Bad exn -> raise exn - end resluts in - mkdll dll (S[atomize objs; P("byterun/libcamlrun"-.-C.a)]) - (T(tags_of_pathname dll++"dll"++"link"++"c")) - end;; - copy_rule "win32unix use some unix files" "otherlibs/unix/%" "otherlibs/win32unix/%";; (* Temporary rule *) @@ -834,7 +754,7 @@ rule "camlp4: Camlp4/Struct/Lexer.ml -> boot/Lexer.ml" ~prod:"camlp4/boot/Lexer.ml" ~dep:"camlp4/Camlp4/Struct/Lexer.ml" begin fun _ _ -> - Cmd(S[P"camlp4o"; P"camlp4/Camlp4/Struct/Lexer.ml"; + Cmd(S[P cold_camlp4o; P"camlp4/Camlp4/Struct/Lexer.ml"; A"-printer"; A"r"; A"-o"; Px"camlp4/boot/Lexer.ml"]) end;; @@ -928,8 +848,6 @@ Pathname.define_context "otherlibs/labltk/jpf" ["otherlibs/labltk/jpf"; "otherlibs/labltk/labltk"; "otherlibs/labltk/support"; "stdlib"];; Pathname.define_context "otherlibs/labltk/frx" ["otherlibs/labltk/frx"; "otherlibs/labltk/camltk"; "otherlibs/labltk/support"; "stdlib"];; -Pathname.define_context "otherlibs/labltk/tkanim" - ["otherlibs/labltk/tkanim"; "otherlibs/labltk/camltk"; "otherlibs/labltk/support"; "stdlib"];; Pathname.define_context "otherlibs/labltk/browser" ["otherlibs/labltk/browser"; "otherlibs/labltk/labltk"; "otherlibs/labltk/support"; "parsing"; "utils"; "typing"; "stdlib"];; diff --git a/ocamlbuild/Makefile b/ocamlbuild/Makefile index 36bf9ee9..0f190336 100644 --- a/ocamlbuild/Makefile +++ b/ocamlbuild/Makefile @@ -1,3 +1,17 @@ +######################################################################### +# # +# Objective Caml # +# # +# Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2007 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. # +# # +######################################################################### + +# $Id$ + .PHONY: all byte native profile debug ppcache doc ifndef INSTALL_PREFIX diff --git a/ocamlbuild/_tags b/ocamlbuild/_tags index 48081d07..617d6a72 100644 --- a/ocamlbuild/_tags +++ b/ocamlbuild/_tags @@ -1,6 +1,6 @@ # OCamlbuild tags file true: debug -<*.ml> or <*.mli>: warn_A, warn_error_A, warn_e, annot +<*.ml> or <*.mli>: warn_L, warn_R, warn_Z, annot "discard_printf.ml": rectypes "ocamlbuildlib.cma" or "ocamlbuildlightlib.cma": linkall <*.byte> or <*.native> or <*.top>: use_unix diff --git a/ocamldoc/.depend b/ocamldoc/.depend index b0aba86c..851a3be0 100644 --- a/ocamldoc/.depend +++ b/ocamldoc/.depend @@ -200,8 +200,8 @@ 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_messages.cmo odoc_info.cmi -odoc_to_text.cmx: odoc_messages.cmx odoc_info.cmx +odoc_to_text.cmo: odoc_module.cmo odoc_messages.cmo odoc_info.cmi +odoc_to_text.cmx: odoc_module.cmx odoc_messages.cmx odoc_info.cmx odoc_type.cmo: ../typing/types.cmi odoc_types.cmi odoc_name.cmi \ ../parsing/asttypes.cmi odoc_type.cmx: ../typing/types.cmx odoc_types.cmx odoc_name.cmx \ diff --git a/ocamldoc/odoc_analyse.ml b/ocamldoc/odoc_analyse.ml index 83ba02b0..143da019 100644 --- a/ocamldoc/odoc_analyse.ml +++ b/ocamldoc/odoc_analyse.ml @@ -427,6 +427,8 @@ and remove_module_elements_between_stop_in_module_kind k = | Odoc_module.Module_constraint (k2, mtkind) -> Odoc_module.Module_constraint (remove_module_elements_between_stop_in_module_kind k2, remove_module_elements_between_stop_in_module_type_kind mtkind) + | Odoc_module.Module_typeof _ -> k + | Odoc_module.Module_unpack _ -> 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 = @@ -437,7 +439,7 @@ and remove_module_elements_between_stop_in_module_type_kind tk = | Odoc_module.Module_type_alias _ -> tk | Odoc_module.Module_type_with (tk2, s) -> Odoc_module.Module_type_with (remove_module_elements_between_stop_in_module_type_kind tk2, s) - + | Odoc_module.Module_type_typeof _ -> tk (** Remove elements between the stop special comment. *) let remove_elements_between_stop module_list = diff --git a/ocamldoc/odoc_ast.ml b/ocamldoc/odoc_ast.ml index 4922d059..3456e14d 100644 --- a/ocamldoc/odoc_ast.ml +++ b/ocamldoc/odoc_ast.ml @@ -1647,6 +1647,24 @@ module Analyser = m_kind = Module_struct elements2 ; } + | (Parsetree.Pmod_unpack (p_exp, pkg_type), + Typedtree.Tmod_unpack (t_exp, tt_modtype)) -> + print_DEBUG ("Odoc_ast: case Parsetree.Pmod_unpack + Typedtree.Tmod_unpack "^module_name); + let code = + let loc = p_module_expr.Parsetree.pmod_loc in + let loc_end = loc.Location.loc_end.Lexing.pos_cnum in + let exp_loc = p_exp.Parsetree.pexp_loc in + let exp_loc_end = exp_loc.Location.loc_end.Lexing.pos_cnum in + let s = get_string_of_file exp_loc_end loc_end in + Printf.sprintf "(val ...%s" s + in + let name = Odoc_env.full_module_type_name env (Name.from_longident (fst pkg_type)) in + let alias = { mta_name = name ; mta_module = None } in + { m_base with + m_type = Odoc_env.subst_module_type env tt_modtype ; + m_kind = Module_unpack (code, alias) ; + } + | (parsetree, typedtree) -> (*DEBUG*)let s_parse = (*DEBUG*) match parsetree with @@ -1655,6 +1673,7 @@ module Analyser = (*DEBUG*) | Parsetree.Pmod_functor _ -> "Pmod_functor" (*DEBUG*) | Parsetree.Pmod_apply _ -> "Pmod_apply" (*DEBUG*) | Parsetree.Pmod_constraint _ -> "Pmod_constraint" + (*DEBUG*) | Parsetree.Pmod_unpack _ -> "Pmod_unpack" (*DEBUG*)in (*DEBUG*)let s_typed = (*DEBUG*) match typedtree with @@ -1663,6 +1682,7 @@ module Analyser = (*DEBUG*) | Typedtree.Tmod_functor _ -> "Tmod_functor" (*DEBUG*) | Typedtree.Tmod_apply _ -> "Tmod_apply" (*DEBUG*) | Typedtree.Tmod_constraint _ -> "Tmod_constraint" + (*DEBUG*) | Typedtree.Tmod_unpack _ -> "Tmod_unpack" (*DEBUG*)in (*DEBUG*)let code = get_string_of_file pos_start pos_end in print_DEBUG (Printf.sprintf "code=%s\ns_parse=%s\ns_typed=%s\n" code s_parse s_typed); diff --git a/ocamldoc/odoc_cross.ml b/ocamldoc/odoc_cross.ml index 2f81e5db..4d9f3ca2 100644 --- a/ocamldoc/odoc_cross.ml +++ b/ocamldoc/odoc_cross.ml @@ -343,6 +343,34 @@ let rec associate_in_module module_list (acc_b_modif, acc_incomplete_top_module_ { mt_name = "" ; mt_info = None ; mt_type = None ; mt_is_interface = false ; mt_file = "" ; mt_kind = Some tk ; mt_loc = Odoc_types.dummy_loc } + + | Module_typeof _ -> + (acc_b, acc_inc, acc_names) + + | Module_unpack (code, mta) -> + begin + match mta.mta_module with + Some _ -> + (acc_b, acc_inc, acc_names) + | None -> + let mt_opt = + try Some (lookup_module_type mta.mta_name) + with Not_found -> None + in + match mt_opt with + None -> (acc_b, (Name.head m.m_name) :: acc_inc, + (* we don't want to output warning messages for + "sig ... end" or "struct ... end" modules not found *) + (if mta.mta_name = Odoc_messages.struct_end or + mta.mta_name = Odoc_messages.sig_end then + acc_names + else + (NF_mt mta.mta_name) :: acc_names) + ) + | Some mt -> + mta.mta_module <- Some mt ; + (true, acc_inc, acc_names) + end in iter_kind (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) m.m_kind @@ -362,27 +390,31 @@ and associate_in_module_type module_list (acc_b_modif, acc_incomplete_top_module iter_kind (acc_b, acc_inc, acc_names) k | Module_type_alias mta -> - match mta.mta_module with - Some _ -> - (acc_b, acc_inc, acc_names) - | None -> - let mt_opt = - try Some (lookup_module_type mta.mta_name) - with Not_found -> None - in - match mt_opt with - None -> (acc_b, (Name.head mt.mt_name) :: acc_inc, - (* we don't want to output warning messages for - "sig ... end" or "struct ... end" modules not found *) - (if mta.mta_name = Odoc_messages.struct_end or - mta.mta_name = Odoc_messages.sig_end then - acc_names - else - (NF_mt mta.mta_name) :: acc_names) - ) - | Some mt -> - mta.mta_module <- Some mt ; - (true, acc_inc, acc_names) + begin + match mta.mta_module with + Some _ -> + (acc_b, acc_inc, acc_names) + | None -> + let mt_opt = + try Some (lookup_module_type mta.mta_name) + with Not_found -> None + in + match mt_opt with + None -> (acc_b, (Name.head mt.mt_name) :: acc_inc, + (* we don't want to output warning messages for + "sig ... end" or "struct ... end" modules not found *) + (if mta.mta_name = Odoc_messages.struct_end or + mta.mta_name = Odoc_messages.sig_end then + acc_names + else + (NF_mt mta.mta_name) :: acc_names) + ) + | Some mt -> + mta.mta_module <- Some mt ; + (true, acc_inc, acc_names) + end + | Module_type_typeof _ -> + (acc_b, acc_inc, acc_names) in match mt.mt_kind with None -> (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) @@ -795,6 +827,8 @@ and assoc_comments_module_kind parent_name module_list mk = Module_constraint (assoc_comments_module_kind parent_name module_list mk1, assoc_comments_module_type_kind parent_name module_list mtk) + | Module_typeof _ -> mk + | Module_unpack _ -> mk and assoc_comments_module_type_kind parent_name module_list mtk = match mtk with @@ -809,6 +843,7 @@ and assoc_comments_module_type_kind parent_name module_list mtk = | Module_type_with (mtk1, s) -> Module_type_with (assoc_comments_module_type_kind parent_name module_list mtk1, s) + | Module_type_typeof _ -> mtk and assoc_comments_class_kind parent_name module_list ck = match ck with diff --git a/ocamldoc/odoc_html.ml b/ocamldoc/odoc_html.ml index cf86d1b3..7cfb9890 100644 --- a/ocamldoc/odoc_html.ml +++ b/ocamldoc/odoc_html.ml @@ -1225,6 +1225,22 @@ class html = | Module_constraint (k, tk) -> (* TODO: on affiche quoi ? *) self#html_of_module_kind b father ?modu k + | Module_typeof s -> + bs b "module type of "; + bs b (self#create_fully_qualified_module_idents_links father s); + bs b "" + | Module_unpack (code, mta) -> + bs b ""; + begin + match mta.mta_module with + None -> + bs b (self#create_fully_qualified_module_idents_links father (self#escape code)) + | Some mt -> + let (html_file, _) = Naming.html_files mt.mt_name in + bp b " %s " html_file (self#escape code) + end; + bs b "" + method html_of_module_parameter b father p = let (s_functor,s_arrow) = @@ -1298,6 +1314,10 @@ class html = bs b " "; bs b (self#create_fully_qualified_module_idents_links father s); bs b "" + | Module_type_typeof s -> + bs b "module type of "; + bs b (self#create_fully_qualified_module_idents_links father s); + bs b "" (** Print html code to display the type of a module parameter.. *) method html_of_module_parameter_type b m_name p = diff --git a/ocamldoc/odoc_info.mli b/ocamldoc/odoc_info.mli index d9c0cfeb..4dc56954 100644 --- a/ocamldoc/odoc_info.mli +++ b/ocamldoc/odoc_info.mli @@ -447,6 +447,8 @@ module Module : Should appear in interface files only. *) | Module_constraint of module_kind * module_type_kind (** A module constraint by a module type. *) + | Module_typeof of string (** by now only the code of the module expression *) + | Module_unpack of string * module_type_alias (** code of the expression and module type alias *) (** Representation of a module. *) and t_module = Odoc_module.t_module = @@ -479,6 +481,8 @@ module Module : (** Complete alias name and corresponding module type if we found it. *) | Module_type_with of module_type_kind * string (** The module type kind and the code of the with constraint. *) + | Module_type_typeof of string + (** by now only the code of the module expression *) (** Representation of a module type. *) and t_module_type = Odoc_module.t_module_type = diff --git a/ocamldoc/odoc_latex.ml b/ocamldoc/odoc_latex.ml index d35b2f31..3750996a 100644 --- a/ocamldoc/odoc_latex.ml +++ b/ocamldoc/odoc_latex.ml @@ -102,8 +102,8 @@ class text = ("\\.\\.\\.", "$\\ldots$"); ("\\\\", "MAXENCE"^"XXX") ; ("&", "MAXENCE"^"YYY") ; - ("\\$", "MAXENCE"^"ZZZ") - ] + ("\\$", "MAXENCE"^"ZZZ"); + ] val mutable subst_strings_simple = [ @@ -624,6 +624,11 @@ class latex = [ Code " "; Code (self#relative_idents father s); ] + | Module_type_typeof s -> + self#latex_of_text fmt + [ Code "module type of "; + Code (self#relative_idents father s); + ] method latex_of_module_kind fmt father kind = match kind with @@ -654,6 +659,16 @@ class latex = | Module_constraint (k, tk) -> (* TODO: on affiche quoi ? *) self#latex_of_module_kind fmt father k + | Module_typeof s -> + self#latex_of_text fmt + [ Code "module type of "; + Code (self#relative_idents father s); + ] + | Module_unpack (s, _) -> + self#latex_of_text fmt + [ + Code (self#relative_idents father s); + ] method latex_of_class_kind fmt father kind = match kind with diff --git a/ocamldoc/odoc_module.ml b/ocamldoc/odoc_module.ml index 3352bd8d..cc1fe02c 100644 --- a/ocamldoc/odoc_module.ml +++ b/ocamldoc/odoc_module.ml @@ -60,6 +60,8 @@ and module_kind = | Module_apply of module_kind * module_kind | 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 *) + | Module_unpack of string * module_type_alias (** code of the expression and module type alias *) (** Representation of a module. *) and t_module = { @@ -87,6 +89,7 @@ and module_type_kind = | Module_type_functor of module_parameter * module_type_kind | Module_type_alias of module_type_alias (** complete name and corresponding module type if we found it *) | Module_type_with of module_type_kind * string (** the module type kind and the code of the with constraint *) + | Module_type_typeof of string (** by now only the code of the module expression *) (** Representation of a module type. *) and t_module_type = { @@ -243,6 +246,8 @@ let rec module_elements ?(trans=true) m = m_code_intf = None ; m_text_only = false ; } + | Module_typeof _ -> [] + | Module_unpack _ -> [] (* module_type_elements ~trans: trans { mt_name = "" ; mt_info = None ; mt_type = None ; @@ -271,6 +276,7 @@ and module_type_elements ?(trans=true) mt = | Some mt -> module_type_elements mt else [] + | Some (Module_type_typeof _) -> [] in iter_kind mt.mt_kind @@ -358,7 +364,8 @@ let rec module_type_parameters ?(trans=true) mt = [] | Some (Module_type_struct _) -> [] - | None -> + | Some (Module_type_typeof _) -> [] + | None -> [] in iter mt.mt_kind @@ -398,8 +405,9 @@ and module_parameters ?(trans=true) m = mt_loc = Odoc_types.dummy_loc } | Module_struct _ | Module_apply _ - | Module_with _ -> - [] + | Module_with _ + | Module_typeof _ + | Module_unpack _ -> [] in iter m.m_kind @@ -426,6 +434,7 @@ let rec module_type_is_functor mt = | Some (Module_type_with (k, _)) -> iter (Some k) | Some (Module_type_struct _) + | Some (Module_type_typeof _) | None -> false in iter mt.mt_kind diff --git a/ocamldoc/odoc_sig.ml b/ocamldoc/odoc_sig.ml index 67a0b9f6..34a71e84 100644 --- a/ocamldoc/odoc_sig.ml +++ b/ocamldoc/odoc_sig.ml @@ -791,50 +791,27 @@ module Analyser = let (maybe_more, mods) = f ~first: true 0 pos_start_ele decls in (maybe_more, new_env, mods) - | Parsetree.Psig_modtype (name, Parsetree.Pmodtype_abstract) -> - let sig_mtype = - try Signature_search.search_module_type table name - with Not_found -> - raise (Failure (Odoc_messages.module_type_not_found current_module_name name)) - in - let complete_name = Name.concat current_module_name name in - let mt = - { - mt_name = complete_name ; - mt_info = comment_opt ; - mt_type = sig_mtype ; - mt_is_interface = true ; - mt_file = !file_name ; - mt_kind = None ; - mt_loc = { loc_impl = None ; loc_inter = Some (!file_name, pos_start_ele) } ; - } - in - let (maybe_more, info_after_opt) = - My_ir.just_after_special - !file_name - (get_string_of_file pos_end_ele pos_limit) - in - mt.mt_info <- merge_infos mt.mt_info info_after_opt ; - let new_env = Odoc_env.add_module_type env mt.mt_name in - (maybe_more, new_env, [ Element_module_type mt ]) - - | Parsetree.Psig_modtype (name, Parsetree.Pmodtype_manifest module_type) -> + | Parsetree.Psig_modtype (name, pmodtype_decl) -> let complete_name = Name.concat current_module_name name in - let sig_mtype_opt = + let sig_mtype = try Signature_search.search_module_type table name with Not_found -> raise (Failure (Odoc_messages.module_type_not_found current_module_name name)) in let module_type_kind = - match sig_mtype_opt with - | Some sig_mtype -> Some (analyse_module_type_kind env complete_name module_type sig_mtype) - | None -> None + match pmodtype_decl with + Parsetree.Pmodtype_abstract -> None + | Parsetree.Pmodtype_manifest module_type -> + match sig_mtype with + | Some sig_mtype -> Some (analyse_module_type_kind env complete_name module_type sig_mtype) + | None -> None in + let mt = { mt_name = complete_name ; mt_info = comment_opt ; - mt_type = sig_mtype_opt ; + mt_type = sig_mtype ; mt_is_interface = true ; mt_file = !file_name ; mt_kind = module_type_kind ; @@ -849,7 +826,7 @@ module Analyser = mt.mt_info <- merge_infos mt.mt_info info_after_opt ; let new_env = Odoc_env.add_module_type env mt.mt_name in let new_env2 = - match sig_mtype_opt with (* A VOIR : cela peut-il être Tmty_ident ? dans ce cas, on aurait pas la signature *) + match sig_mtype with (* A VOIR : cela peut-il être Tmty_ident ? dans ce cas, on aurait pas la signature *) Some (Types.Tmty_signature s) -> Odoc_env.add_signature new_env mt.mt_name ~rel: (Name.simple mt.mt_name) s | _ -> new_env in @@ -865,10 +842,12 @@ module Analyser = "??" | Parsetree.Pmty_with (mt, _) -> f mt.Parsetree.pmty_desc - | Parsetree.Pmty_typeof _ -> (* TODO *) - "??" + | Parsetree.Pmty_typeof mexpr -> + match mexpr.Parsetree.pmod_desc with + Parsetree.Pmod_ident longident -> Name.from_longident longident + | _ -> "??" in - let name = (f module_type.Parsetree.pmty_desc) in + let name = f module_type.Parsetree.pmty_desc in let full_name = Odoc_env.full_module_or_module_type_name env name in let im = { @@ -1096,7 +1075,10 @@ module Analyser = ) | Parsetree.Pmty_typeof module_expr -> - assert false (* TODO *) + let loc_start = module_expr.Parsetree.pmod_loc.Location.loc_start.Lexing.pos_cnum in + let loc_end = module_expr.Parsetree.pmod_loc.Location.loc_end.Lexing.pos_cnum in + let s = get_string_of_file loc_start loc_end in + Module_type_typeof s (** analyse of a Parsetree.module_type and a Types.module_type.*) and analyse_module_kind env current_module_name module_type sig_module_type = @@ -1162,7 +1144,10 @@ module Analyser = Module_with (k, s) ) | Parsetree.Pmty_typeof module_expr -> - assert false (* TODO *) + let loc_start = module_expr.Parsetree.pmod_loc.Location.loc_start.Lexing.pos_cnum in + let loc_end = module_expr.Parsetree.pmod_loc.Location.loc_end.Lexing.pos_cnum in + let s = get_string_of_file loc_start loc_end in + Module_typeof s (** 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 322ed441..a3db5bd9 100644 --- a/ocamldoc/odoc_to_text.ml +++ b/ocamldoc/odoc_to_text.ml @@ -543,6 +543,19 @@ class virtual to_text = [Code " -> "] @ (self#text_of_module_kind ~with_def_syntax: false k) + | Module_typeof s -> + let code = Printf.sprintf "%smodule type of %s" + (if with_def_syntax then " : " else "") + s + in + [Code code] + | Module_unpack (code, _) -> + let code = Printf.sprintf "%s%s" + (if with_def_syntax then " : " else "") + code + in + [Code code] + (** Return html code for a [module_type_kind].*) method text_of_module_type_kind ?(with_def_syntax=true) tk = match tk with @@ -570,5 +583,9 @@ class virtual to_text = | Some mt -> mt.mt_name)) ] - + | Odoc_module.Module_type_typeof s -> + let code = Printf.sprintf "%smodule type of %s" + (if with_def_syntax then " = " else "") s + in + [ Code code ] end diff --git a/otherlibs/bigarray/.depend b/otherlibs/bigarray/.depend index 11e339d3..5026d55e 100644 --- a/otherlibs/bigarray/.depend +++ b/otherlibs/bigarray/.depend @@ -1,32 +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 \ - ../../byterun/config.h ../../byterun/misc.h bigarray.h \ - ../../byterun/custom.h ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/intext.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/io.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/fix_code.h \ - ../../byterun/config.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/memory.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.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/fix_code.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/config.h ../../byterun/custom.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/io.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/sys.h ../../byterun/misc.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 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/config.h ../../byterun/alloc.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/custom.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/sys.h ../../byterun/misc.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/bigarray/dllbigarray.dlib b/otherlibs/bigarray/dllbigarray.dlib deleted file mode 100644 index 5ab81172..00000000 --- a/otherlibs/bigarray/dllbigarray.dlib +++ /dev/null @@ -1 +0,0 @@ -bigarray_stubs.d.o mmap_win32.d.o diff --git a/otherlibs/graph/.depend b/otherlibs/graph/.depend index 31398124..e71de341 100644 --- a/otherlibs/graph/.depend +++ b/otherlibs/graph/.depend @@ -1,149 +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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h image.h ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/signals.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h image.h ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/custom.h \ - ../../byterun/compatibility.h ../../byterun/mlvalues.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h image.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/callback.h \ - ../../byterun/compatibility.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.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 5530c4bc..bfd028c0 100644 --- a/otherlibs/num/.depend +++ b/otherlibs/num/.depend @@ -1,6 +1,6 @@ bng.o: bng.c bng.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/compatibility.h bng_ia32.c \ - bng_digit.c + ../../byterun/../config/s.h ../../byterun/compatibility.h bng_amd64.c \ + bng_digit.c bng_alpha.o: bng_alpha.c bng_amd64.o: bng_amd64.c bng_digit.o: bng_digit.c @@ -9,24 +9,14 @@ bng_mips.o: bng_mips.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/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/compatibility.h ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/misc.h ../../byterun/custom.h \ - ../../byterun/compatibility.h ../../byterun/mlvalues.h \ - ../../byterun/intext.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/io.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/fix_code.h \ - ../../byterun/config.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.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/fix_code.h ../../byterun/fail.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/num/Makefile.nt b/otherlibs/num/Makefile.nt index b986460c..16103b2b 100644 --- a/otherlibs/num/Makefile.nt +++ b/otherlibs/num/Makefile.nt @@ -25,7 +25,7 @@ COBJS=bng.$(O) nat_stubs.$(O) include ../Makefile.nt clean:: - cd test ; $(MAKEREC) clean + rm -f *~ bng.$(O): bng.h bng_digit.c \ bng_alpha.c bng_amd64.c bng_ia32.c bng_mips.c bng_ppc.c bng_sparc.c diff --git a/otherlibs/num/big_int.ml b/otherlibs/num/big_int.ml index 8342d52d..6b601518 100644 --- a/otherlibs/num/big_int.ml +++ b/otherlibs/num/big_int.ml @@ -682,8 +682,8 @@ let shift_left_big_int bi n = (* Shift right by N bits (rounds toward zero) *) -let shift_right_big_int bi n = - if n < 0 then invalid_arg "shift_right_big_int" +let shift_right_towards_zero_big_int bi n = + if n < 0 then invalid_arg "shift_right_towards_zero_big_int" else if n = 0 then bi else if bi.sign = 0 then bi else begin @@ -702,17 +702,6 @@ let shift_right_big_int bi n = end end -(************************************* -(* Compute 2^n *) - -let two_power_big_int n = - if n < 0 then invalid_arg "two_power_big_int"; - let size_res = (n + length_of_digit - 1) / length_of_digit in - let res = make_nat n in - set_digit_nat_native res (n / length_of_digit) - (Nativeint.shift_left 1n (n mod length_of_digit)); - { sign = 1; abs_value = res } - (* Compute 2^n - 1 *) let two_power_m1_big_int n = @@ -720,20 +709,19 @@ let two_power_m1_big_int n = else if n = 0 then zero_big_int else begin let size_res = (n + length_of_digit - 1) / length_of_digit in - let res = make_nat n in + let res = make_nat size_res in set_digit_nat_native res (n / length_of_digit) (Nativeint.shift_left 1n (n mod length_of_digit)); ignore (decr_nat res 0 size_res 0); { sign = 1; abs_value = res } end -(* Shift right logical by N bits (rounds toward minus infinity) *) +(* Shift right by N bits (rounds toward minus infinity) *) -let lsr_big_int bi n = - if n < 0 then invalid_arg "asr_big_int" - else if bi.sign >= 0 then asr_big_int bi n - else asr_big_int (sub_big_int bi (two_power_m1_big_int n)) n -**************************) +let shift_right_big_int bi n = + if n < 0 then invalid_arg "shift_right_big_int" + else if bi.sign >= 0 then shift_right_towards_zero_big_int bi n + else shift_right_towards_zero_big_int (sub_big_int bi (two_power_m1_big_int n)) n (* Extract N bits starting at ofs. Treats bi in two's complement. diff --git a/otherlibs/num/big_int.mli b/otherlibs/num/big_int.mli index 70c4c73d..2ac7b7eb 100644 --- a/otherlibs/num/big_int.mli +++ b/otherlibs/num/big_int.mli @@ -168,8 +168,12 @@ val shift_left_big_int : big_int -> int -> big_int Equivalent to multiplication by [2^n]. *) val shift_right_big_int : big_int -> int -> big_int (** [shift_right_big_int b n] returns [b] shifted right by [n] bits. - The shift is performed on the absolute value of [b]. - The result has the same sign as [b]. + Equivalent to division by [2^n] with the result being + rounded towards minus infinity. *) +val shift_right_towards_zero_big_int : big_int -> int -> big_int + (** [shift_right_towards_zero_big_int b n] returns [b] shifted + right by [n] bits. The shift is performed on the absolute + value of [b], and the result has the same sign as [b]. Equivalent to division by [2^n] with the result being rounded towards zero. *) val extract_big_int : big_int -> int -> int -> big_int diff --git a/otherlibs/num/bng_digit.c b/otherlibs/num/bng_digit.c index 20012aa5..168b44ad 100644 --- a/otherlibs/num/bng_digit.c +++ b/otherlibs/num/bng_digit.c @@ -92,7 +92,7 @@ } #endif -#define BngLowHalf(d) ((d) & ((1L << BNG_BITS_PER_HALF_DIGIT) - 1)) +#define BngLowHalf(d) ((d) & (((bngdigit)1 << BNG_BITS_PER_HALF_DIGIT) - 1)) #define BngHighHalf(d) ((d) >> BNG_BITS_PER_HALF_DIGIT) #ifndef BngMult diff --git a/otherlibs/num/dllnums.dlib b/otherlibs/num/dllnums.dlib deleted file mode 100644 index e54aa8e2..00000000 --- a/otherlibs/num/dllnums.dlib +++ /dev/null @@ -1 +0,0 @@ -bng.d.o nat_stubs.d.o diff --git a/otherlibs/str/.depend b/otherlibs/str/.depend index 83d70098..c9eb9951 100644 --- a/otherlibs/str/.depend +++ b/otherlibs/str/.depend @@ -1,17 +1,9 @@ strstubs.o: strstubs.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/alloc.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.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/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/str/dllstr.dlib b/otherlibs/str/dllstr.dlib deleted file mode 100644 index 0c346262..00000000 --- a/otherlibs/str/dllstr.dlib +++ /dev/null @@ -1 +0,0 @@ -strstubs.d.o diff --git a/otherlibs/str/str.ml b/otherlibs/str/str.ml index 741eaa56..f3f760ac 100644 --- a/otherlibs/str/str.ml +++ b/otherlibs/str/str.ml @@ -29,7 +29,7 @@ module Charset = struct type t = string (* of length 32 *) - let empty = String.make 32 '\000' + (*let empty = String.make 32 '\000'*) let full = String.make 32 '\255' let make_empty () = String.make 32 '\000' @@ -44,9 +44,9 @@ module Charset = let singleton c = let s = make_empty () in add s c; s - let range c1 c2 = + (*let range c1 c2 = let s = make_empty () in add_range s c1 c2; s - + *) let complement s = let r = String.create 32 in for i = 0 to 31 do diff --git a/otherlibs/systhreads/.depend b/otherlibs/systhreads/.depend index 43ac5781..dc859aa8 100644 --- a/otherlibs/systhreads/.depend +++ b/otherlibs/systhreads/.depend @@ -1,27 +1,14 @@ -posix.o: posix.c ../../byterun/alloc.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/compatibility.h \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/misc.h ../../byterun/backtrace.h \ - ../../byterun/mlvalues.h ../../byterun/callback.h \ - ../../byterun/compatibility.h ../../byterun/mlvalues.h \ - ../../byterun/custom.h ../../byterun/compatibility.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/io.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/printexc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/roots.h \ - ../../byterun/misc.h ../../byterun/memory.h ../../byterun/signals.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/stacks.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/sys.h \ - ../../byterun/misc.h +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 condition.cmi: mutex.cmi event.cmi: mutex.cmi: @@ -37,7 +24,3 @@ thread.cmo: thread.cmi thread.cmx: thread.cmi threadUnix.cmo: thread.cmi threadUnix.cmi threadUnix.cmx: thread.cmx threadUnix.cmi -thread_posix.cmo: -thread_posix.cmx: -thread_win32.cmo: -thread_win32.cmx: diff --git a/otherlibs/systhreads/Makefile b/otherlibs/systhreads/Makefile index b74f9bc7..f5c80c0e 100644 --- a/otherlibs/systhreads/Makefile +++ b/otherlibs/systhreads/Makefile @@ -20,13 +20,11 @@ CAMLOPT=../../ocamlcompopt.sh -I ../unix MKLIB=../../boot/ocamlrun ../../tools/ocamlmklib COMPFLAGS=-warn-error A -g -BYTECODE_C_OBJS=posix_b.o -NATIVECODE_C_OBJS=posix_n.o +BYTECODE_C_OBJS=st_stubs_b.o +NATIVECODE_C_OBJS=st_stubs_n.o THREAD_OBJS= thread.cmo mutex.cmo condition.cmo event.cmo threadUnix.cmo -GENFILES=thread.ml - all: libthreads.a threads.cma allopt: libthreadsnat.a threads.cmxa @@ -34,19 +32,19 @@ allopt: libthreadsnat.a threads.cmxa libthreads.a: $(BYTECODE_C_OBJS) $(MKLIB) -o threads $(BYTECODE_C_OBJS) -posix_b.o: posix.c +st_stubs_b.o: st_stubs.c st_posix.h $(BYTECC) -O -I../../byterun $(BYTECCCOMPOPTS) $(SHAREDCCCOMPOPTS) \ - -c posix.c - mv posix.o posix_b.o + -c st_stubs.c + mv st_stubs.o st_stubs_b.o # Dynamic linking with -lpthread is risky on many platforms, so # do not create a shared object for libthreadsnat. libthreadsnat.a: $(NATIVECODE_C_OBJS) $(AR) rc libthreadsnat.a $(NATIVECODE_C_OBJS) -posix_n.o: posix.c - $(NATIVECC) -O -I../../asmrun -I../../byterun $(NATIVECCCOMPOPTS) $(SHAREDCCCOMPOPTS) -DNATIVE_CODE -DTARGET_$(ARCH) -DSYS_$(SYSTEM) -c posix.c - mv posix.o posix_n.o +st_stubs_n.o: st_stubs.c st_posix.h + $(NATIVECC) -O -I../../asmrun -I../../byterun $(NATIVECCCOMPOPTS) $(SHAREDCCCOMPOPTS) -DNATIVE_CODE -DTARGET_$(ARCH) -DSYS_$(SYSTEM) -c st_stubs.c + mv st_stubs.o st_stubs_n.o threads.cma: $(THREAD_OBJS) $(MKLIB) -ocamlc '$(CAMLC)' -o threads $(THREAD_OBJS) \ @@ -65,15 +63,11 @@ threads.cmxa: $(THREAD_OBJS:.cmo=.cmx) $(THREAD_OBJS:.cmo=.cmx): ../../ocamlopt -thread.ml: thread_posix.ml - ln -s thread_posix.ml thread.ml - partialclean: rm -f *.cm* clean: partialclean rm -f *.o *.a *.so - rm -f $(GENFILES) install: if test -f dllthreads.so; then cp dllthreads.so $(STUBLIBDIR)/dllthreads.so; fi @@ -83,6 +77,7 @@ install: cp $(THREAD_OBJS:.cmo=.cmi) threads.cma $(LIBDIR)/threads rm -f $(LIBDIR)/threads/stdlib.cma cp thread.mli mutex.mli condition.mli event.mli threadUnix.mli $(LIBDIR) + cp threads.h $(LIBDIR)/caml/threads.h installopt: cp libthreadsnat.a $(LIBDIR)/libthreadsnat.a diff --git a/otherlibs/systhreads/Makefile.nt b/otherlibs/systhreads/Makefile.nt index a5380134..8c559e0b 100644 --- a/otherlibs/systhreads/Makefile.nt +++ b/otherlibs/systhreads/Makefile.nt @@ -24,10 +24,8 @@ CFLAGS=-I../../byterun $(EXTRACFLAGS) CAMLOBJS=thread.cmo mutex.cmo condition.cmo event.cmo threadUnix.cmo CMIFILES=$(CAMLOBJS:.cmo=.cmi) -COBJS=win32_b.$(O) -COBJS_NAT=win32_n.$(O) - -GENFILES=thread.ml +COBJS=st_stubs_b.$(O) +COBJS_NAT=st_stubs_n.$(O) LIBNAME=threads @@ -41,9 +39,9 @@ $(LIBNAME).cma: $(CAMLOBJS) lib$(LIBNAME).$(A): $(COBJS) $(MKLIB) -o $(LIBNAME) $(COBJS) $(LDOPTS) -win32_b.$(O): win32.c - $(BYTECC) $(BYTECCCOMPOPTS) $(CFLAGS) -c win32.c - mv win32.$(O) win32_b.$(O) +st_stubs_b.$(O): st_stubs.c st_win32.h + $(BYTECC) $(BYTECCCOMPOPTS) $(CFLAGS) -c st_stubs.c + mv st_stubs.$(O) st_stubs_b.$(O) @@ -58,21 +56,17 @@ $(LIBNAME).cmxs: $(LIBNAME).cmxa lib$(LIBNAME)nat.$(A) lib$(LIBNAME)nat.$(A): $(COBJS_NAT) $(MKLIB) -o $(LIBNAME)nat $(COBJS_NAT) $(LDOPTS) -win32_n.$(O): win32.c - $(NATIVECC) -DNATIVE_CODE -O -I../../asmrun -I../../byterun $(NATIVECCCOMPOPTS) -c win32.c - mv win32.$(O) win32_n.$(O) +st_stubs_n.$(O): st_stubs.c st_win32.h + $(NATIVECC) -DNATIVE_CODE -I../../asmrun -I../../byterun $(NATIVECCCOMPOPTS) -c st_stubs.c + mv st_stubs.$(O) st_stubs_n.$(O) $(CAMLOBJS:.cmo=.cmx): ../../ocamlopt -thread.ml: thread_win32.ml - cp thread_win32.ml thread.ml - partialclean: rm -f *.cm* clean: partialclean rm -f *.dll *.$(A) *.$(O) - rm -f $(GENFILES) install: cp dllthreads.dll $(STUBLIBDIR)/dllthreads.dll @@ -80,6 +74,7 @@ install: mkdir -p $(LIBDIR)/threads cp $(CMIFILES) threads.cma $(LIBDIR)/threads rm -f $(LIBDIR)/threads/stdlib.cma + cp threads.h $(LIBDIR)/caml/threads.h installopt: cp libthreadsnat.$(A) $(LIBDIR)/libthreadsnat.$(A) diff --git a/otherlibs/systhreads/dllthreads.dlib b/otherlibs/systhreads/dllthreads.dlib deleted file mode 100644 index 40686f64..00000000 --- a/otherlibs/systhreads/dllthreads.dlib +++ /dev/null @@ -1 +0,0 @@ -win32_b.d.o diff --git a/otherlibs/systhreads/libthreads.clib b/otherlibs/systhreads/libthreads.clib index 111ec5ae..a0582d41 100644 --- a/otherlibs/systhreads/libthreads.clib +++ b/otherlibs/systhreads/libthreads.clib @@ -1 +1 @@ -posix_b.o +st_stubs_b.o diff --git a/otherlibs/systhreads/libthreadswin32.clib b/otherlibs/systhreads/libthreadswin32.clib deleted file mode 100644 index 51b11a2d..00000000 --- a/otherlibs/systhreads/libthreadswin32.clib +++ /dev/null @@ -1 +0,0 @@ -win32_b.o diff --git a/otherlibs/systhreads/posix.c b/otherlibs/systhreads/posix.c deleted file mode 100644 index f20f49ad..00000000 --- a/otherlibs/systhreads/posix.c +++ /dev/null @@ -1,929 +0,0 @@ -/***********************************************************************/ -/* */ -/* Objective Caml */ -/* */ -/* Xavier Leroy and Damien Doligez, INRIA Rocquencourt */ -/* */ -/* Copyright 1995 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. */ -/* */ -/***********************************************************************/ - -/* $Id$ */ - -/* Thread interface for POSIX 1003.1c threads */ - -#include -#include -#include -#include -#include -#ifdef __sun -#define _POSIX_PTHREAD_SEMANTICS -#endif -#include -#include -#ifdef __linux__ -#include -#endif -#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" -#ifdef NATIVE_CODE -#include "stack.h" -#else -#include "stacks.h" -#endif -#include "sys.h" - -/* Initial size of stack when a thread is created (4 Ko) */ -#define Thread_stack_size (Stack_size / 4) - -/* Max computation time before rescheduling, in microseconds (50ms) */ -#define Thread_timeout 50000 - -/* The ML value describing a thread (heap-allocated) */ - -struct caml_thread_descr { - value ident; /* Unique integer ID */ - value start_closure; /* The closure to start this thread */ - value terminated; /* Mutex held while the thread is running */ -}; - -#define Ident(v) (((struct caml_thread_descr *)(v))->ident) -#define Start_closure(v) (((struct caml_thread_descr *)(v))->start_closure) -#define Terminated(v) (((struct caml_thread_descr *)(v))->terminated) - -/* The infos on threads (allocated via malloc()) */ - -struct caml_thread_struct { - pthread_t pthread; /* The Posix thread id */ - value descr; /* The heap-allocated descriptor (root) */ - struct caml_thread_struct * next; /* Double linking of running threads */ - struct caml_thread_struct * prev; -#ifdef NATIVE_CODE - char * bottom_of_stack; /* Saved value of caml_bottom_of_stack */ - uintnat last_retaddr; /* Saved value of caml_last_return_address */ - value * gc_regs; /* Saved value of caml_gc_regs */ - char * exception_pointer; /* Saved value of caml_exception_pointer */ - struct caml__roots_block * local_roots; /* Saved value of local_roots */ - struct longjmp_buffer * exit_buf; /* For thread exit */ -#else - value * stack_low; /* The execution stack for this thread */ - value * stack_high; - value * stack_threshold; - value * sp; /* Saved value of extern_sp for this thread */ - value * trapsp; /* Saved value of trapsp for this thread */ - struct caml__roots_block * local_roots; /* Saved value of local_roots */ - struct longjmp_buffer * external_raise; /* Saved external_raise */ -#endif - int backtrace_pos; /* Saved backtrace_pos */ - code_t * backtrace_buffer; /* Saved backtrace_buffer */ - value backtrace_last_exn; /* Saved backtrace_last_exn (root) */ -}; - -typedef struct caml_thread_struct * caml_thread_t; - -/* The descriptor for the currently executing thread */ -static caml_thread_t curr_thread = NULL; - -/* Track whether one thread is running Caml code. There can be - at most one such thread at any time. */ -static volatile int caml_runtime_busy = 1; - -/* Number of threads waiting to run Caml code. */ -static volatile int caml_runtime_waiters = 0; - -/* Mutex that protects the two variables above. */ -static pthread_mutex_t caml_runtime_mutex = PTHREAD_MUTEX_INITIALIZER; - -/* Condition signaled when caml_runtime_busy becomes 0 */ -static pthread_cond_t caml_runtime_is_free = PTHREAD_COND_INITIALIZER; - -/* Whether the ``tick'' thread is already running */ -static int caml_tick_thread_running = 0; - -/* The key used for storing the thread descriptor in the specific data - of the corresponding Posix thread. */ -static pthread_key_t thread_descriptor_key; - -/* The key used for unlocking I/O channels on exceptions */ -static pthread_key_t last_channel_locked_key; - -/* Identifier for next thread creation */ -static intnat thread_next_ident = 0; - -/* Forward declarations */ -value caml_threadstatus_new (void); -void caml_threadstatus_terminate (value); -int caml_threadstatus_wait (value); -static void caml_pthread_check (int, char *); - -/* Imports for the native-code compiler */ -extern struct longjmp_buffer caml_termination_jmpbuf; -extern void (*caml_termination_hook)(void *); - -/* Hook for scanning the stacks of the other threads */ - -static void (*prev_scan_roots_hook) (scanning_action); - -static void caml_thread_scan_roots(scanning_action action) -{ - caml_thread_t th; - - th = curr_thread; - do { - (*action)(th->descr, &th->descr); - (*action)(th->backtrace_last_exn, &th->backtrace_last_exn); - /* Don't rescan the stack of the current thread, it was done already */ - if (th != curr_thread) { -#ifdef NATIVE_CODE - if (th->bottom_of_stack != NULL) - do_local_roots(action, th->bottom_of_stack, th->last_retaddr, - th->gc_regs, th->local_roots); -#else - do_local_roots(action, th->sp, th->stack_high, th->local_roots); -#endif - } - th = th->next; - } while (th != curr_thread); - /* Hook */ - if (prev_scan_roots_hook != NULL) (*prev_scan_roots_hook)(action); -} - -/* Hooks for enter_blocking_section and leave_blocking_section */ - -static void caml_thread_enter_blocking_section(void) -{ - /* Save the stack-related global variables in the thread descriptor - of the current thread */ -#ifdef NATIVE_CODE - curr_thread->bottom_of_stack = caml_bottom_of_stack; - curr_thread->last_retaddr = caml_last_return_address; - curr_thread->gc_regs = caml_gc_regs; - curr_thread->exception_pointer = caml_exception_pointer; - curr_thread->local_roots = local_roots; -#else - curr_thread->stack_low = stack_low; - curr_thread->stack_high = stack_high; - curr_thread->stack_threshold = stack_threshold; - curr_thread->sp = extern_sp; - curr_thread->trapsp = trapsp; - curr_thread->local_roots = local_roots; - curr_thread->external_raise = external_raise; -#endif - curr_thread->backtrace_pos = backtrace_pos; - curr_thread->backtrace_buffer = backtrace_buffer; - curr_thread->backtrace_last_exn = backtrace_last_exn; - /* Tell other threads that the runtime is free */ - pthread_mutex_lock(&caml_runtime_mutex); - caml_runtime_busy = 0; - pthread_mutex_unlock(&caml_runtime_mutex); - pthread_cond_signal(&caml_runtime_is_free); -} - -static void caml_thread_leave_blocking_section(void) -{ - /* Wait until the runtime is free */ - pthread_mutex_lock(&caml_runtime_mutex); - while (caml_runtime_busy) { - caml_runtime_waiters++; - pthread_cond_wait(&caml_runtime_is_free, &caml_runtime_mutex); - caml_runtime_waiters--; - } - caml_runtime_busy = 1; - pthread_mutex_unlock(&caml_runtime_mutex); - /* Update curr_thread to point to the thread descriptor corresponding - to the thread currently executing */ - curr_thread = pthread_getspecific(thread_descriptor_key); - /* Restore the stack-related global variables */ -#ifdef NATIVE_CODE - caml_bottom_of_stack= curr_thread->bottom_of_stack; - caml_last_return_address = curr_thread->last_retaddr; - caml_gc_regs = curr_thread->gc_regs; - caml_exception_pointer = curr_thread->exception_pointer; - local_roots = curr_thread->local_roots; -#else - stack_low = curr_thread->stack_low; - stack_high = curr_thread->stack_high; - stack_threshold = curr_thread->stack_threshold; - extern_sp = curr_thread->sp; - trapsp = curr_thread->trapsp; - local_roots = curr_thread->local_roots; - external_raise = curr_thread->external_raise; -#endif - backtrace_pos = curr_thread->backtrace_pos; - backtrace_buffer = curr_thread->backtrace_buffer; - backtrace_last_exn = curr_thread->backtrace_last_exn; -} - -static int caml_thread_try_leave_blocking_section(void) -{ - /* Disable immediate processing of signals (PR#3659). - try_leave_blocking_section always fails, forcing the signal to be - recorded and processed at the next leave_blocking_section or - polling. */ - return 0; -} - -/* Hooks for I/O locking */ - -static void caml_io_mutex_free(struct channel *chan) -{ - pthread_mutex_t * mutex = chan->mutex; - if (mutex != NULL) { - pthread_mutex_destroy(mutex); - stat_free((char *) mutex); - } -} - -static void caml_io_mutex_lock(struct channel *chan) -{ - if (chan->mutex == NULL) { - pthread_mutex_t * mutex = - (pthread_mutex_t *) stat_alloc(sizeof(pthread_mutex_t)); - pthread_mutex_init(mutex, NULL); - chan->mutex = (void *) mutex; - } - /* PR#4351: first try to acquire mutex without releasing the master lock */ - if (pthread_mutex_trylock(chan->mutex) == 0) { - pthread_setspecific(last_channel_locked_key, (void *) chan); - return; - } - /* If unsuccessful, block on mutex */ - enter_blocking_section(); - pthread_mutex_lock(chan->mutex); - /* Problem: if a signal occurs at this point, - and the signal handler raises an exception, we will not - unlock the mutex. The alternative (doing the setspecific - before locking the mutex is also incorrect, since we could - then unlock a mutex that is unlocked or locked by someone else. */ - pthread_setspecific(last_channel_locked_key, (void *) chan); - leave_blocking_section(); -} - -static void caml_io_mutex_unlock(struct channel *chan) -{ - pthread_mutex_unlock(chan->mutex); - pthread_setspecific(last_channel_locked_key, NULL); -} - -static void caml_io_mutex_unlock_exn(void) -{ - struct channel * chan = pthread_getspecific(last_channel_locked_key); - if (chan != NULL) caml_io_mutex_unlock(chan); -} - -/* The "tick" thread fakes a SIGVTALRM signal at regular intervals. */ - -static void * caml_thread_tick(void * arg) -{ - struct timeval timeout; - sigset_t mask; -#ifdef __linux__ - int tickcount = 0; -#endif - - /* Block all signals so that we don't try to execute - a Caml signal handler */ - sigfillset(&mask); - pthread_sigmask(SIG_BLOCK, &mask, NULL); - while(1) { - /* select() seems to be the most efficient way to suspend the - thread for sub-second intervals */ - timeout.tv_sec = 0; - timeout.tv_usec = Thread_timeout; - select(0, NULL, NULL, NULL, &timeout); - /* This signal should never cause a callback, so don't go through - handle_signal(), tweak the global variable directly. */ - caml_pending_signals[SIGVTALRM] = 1; - caml_signals_are_pending = 1; -#ifdef NATIVE_CODE - young_limit = young_end; -#else - something_to_do = 1; -#endif -#ifdef __linux__ - /* Hack around LinuxThreads' non-standard signal handling: - if program is killed on a signal, e.g. SIGINT, the current - thread will not die on this signal (because of the signal blocking - above). Hence, periodically check that the thread manager (our - parent process) still exists. */ - tickcount++; - if (tickcount >= 2000000 / Thread_timeout) { /* every 2 secs approx */ - tickcount = 0; - if (getppid() == 1) pthread_exit(NULL); - } -#endif - } - return NULL; /* prevents compiler warning */ -} - -/* Reinitialize the thread machinery after a fork() (PR#4577) */ - -static void caml_thread_reinitialize(void) -{ - caml_thread_t thr, next; - struct channel * chan; - - /* Remove all other threads (now nonexistent) - from the doubly-linked list of threads */ - thr = curr_thread->next; - while (thr != curr_thread) { - next = thr->next; - stat_free(thr); - thr = next; - } - curr_thread->next = curr_thread; - curr_thread->prev = curr_thread; - /* Reinitialize the master lock machinery, - just in case the fork happened while other threads were doing - leave_blocking_section */ - pthread_mutex_init(&caml_runtime_mutex, NULL); - pthread_cond_init(&caml_runtime_is_free, NULL); - caml_runtime_waiters = 0; /* no other thread is waiting for the RTS */ - caml_runtime_busy = 1; /* normally useless */ - /* Tick thread is not currently running in child process, will be - re-created at next Thread.create */ - caml_tick_thread_running = 0; - /* Reinitialize all IO mutexes */ - for (chan = caml_all_opened_channels; - chan != NULL; - chan = chan->next) { - if (chan->mutex != NULL) pthread_mutex_init(chan->mutex, NULL); - } -} - -/* Initialize the thread machinery */ - -value caml_thread_initialize(value unit) /* ML */ -{ - value mu = Val_unit; - value descr; - - /* Protect against repeated initialization (PR#1325) */ - if (curr_thread != NULL) return Val_unit; - Begin_root (mu); - /* Initialize the keys */ - pthread_key_create(&thread_descriptor_key, NULL); - pthread_key_create(&last_channel_locked_key, NULL); - /* Create and initialize the termination semaphore */ - mu = caml_threadstatus_new(); - /* Create a descriptor for the current thread */ - descr = alloc_small(3, 0); - Ident(descr) = Val_long(thread_next_ident); - Start_closure(descr) = Val_unit; - Terminated(descr) = mu; - thread_next_ident++; - /* Create an info block for the current thread */ - curr_thread = - (caml_thread_t) stat_alloc(sizeof(struct caml_thread_struct)); - curr_thread->pthread = pthread_self(); - curr_thread->descr = descr; - curr_thread->next = curr_thread; - curr_thread->prev = curr_thread; - curr_thread->backtrace_last_exn = Val_unit; -#ifdef NATIVE_CODE - curr_thread->exit_buf = &caml_termination_jmpbuf; -#endif - /* The stack-related fields will be filled in at the next - enter_blocking_section */ - /* Associate the thread descriptor with the thread */ - pthread_setspecific(thread_descriptor_key, (void *) curr_thread); - /* Set up the hooks */ - prev_scan_roots_hook = scan_roots_hook; - scan_roots_hook = caml_thread_scan_roots; - enter_blocking_section_hook = caml_thread_enter_blocking_section; - leave_blocking_section_hook = caml_thread_leave_blocking_section; - try_leave_blocking_section_hook = caml_thread_try_leave_blocking_section; -#ifdef NATIVE_CODE - caml_termination_hook = pthread_exit; -#endif - caml_channel_mutex_free = caml_io_mutex_free; - caml_channel_mutex_lock = caml_io_mutex_lock; - caml_channel_mutex_unlock = caml_io_mutex_unlock; - caml_channel_mutex_unlock_exn = caml_io_mutex_unlock_exn; - /* Set up fork() to reinitialize the thread machinery in the child - (PR#4577) */ - pthread_atfork(NULL, NULL, caml_thread_reinitialize); - End_roots(); - return Val_unit; -} - -/* Thread cleanup at termination */ - -static void caml_thread_stop(void) -{ - caml_thread_t th = curr_thread; - - /* Signal that the thread has terminated */ - caml_threadstatus_terminate(Terminated(th->descr)); - /* Remove th from the doubly-linked list of threads */ - th->next->prev = th->prev; - th->prev->next = th->next; - /* Release the runtime system */ - pthread_mutex_lock(&caml_runtime_mutex); - caml_runtime_busy = 0; - pthread_mutex_unlock(&caml_runtime_mutex); - pthread_cond_signal(&caml_runtime_is_free); -#ifndef NATIVE_CODE - /* Free the memory resources */ - stat_free(th->stack_low); -#endif - if (th->backtrace_buffer != NULL) free(th->backtrace_buffer); - /* Free the thread descriptor */ - stat_free(th); -} - -/* Create a thread */ - -static void * caml_thread_start(void * arg) -{ - caml_thread_t th = (caml_thread_t) arg; - value clos; -#ifdef NATIVE_CODE - struct longjmp_buffer termination_buf; -#endif - - /* Associate the thread descriptor with the thread */ - pthread_setspecific(thread_descriptor_key, (void *) th); - /* Acquire the global mutex and set up the stack variables */ - leave_blocking_section(); -#ifdef NATIVE_CODE - /* Setup termination handler (for caml_thread_exit) */ - if (sigsetjmp(termination_buf.buf, 0) == 0) { - th->exit_buf = &termination_buf; -#endif - /* Callback the closure */ - clos = Start_closure(th->descr); - modify(&(Start_closure(th->descr)), Val_unit); - callback_exn(clos, Val_unit); - caml_thread_stop(); -#ifdef NATIVE_CODE - } -#endif - /* The thread now stops running */ - return NULL; -} - -value caml_thread_new(value clos) /* ML */ -{ - pthread_attr_t attr; - caml_thread_t th; - pthread_t tick_pthread; - value mu = Val_unit; - value descr; - int err; - - Begin_roots2 (clos, mu) - /* Create and initialize the termination semaphore */ - mu = caml_threadstatus_new(); - /* Create a descriptor for the new thread */ - descr = alloc_small(3, 0); - Ident(descr) = Val_long(thread_next_ident); - Start_closure(descr) = clos; - Terminated(descr) = mu; - thread_next_ident++; - /* Create an info block for the current thread */ - th = (caml_thread_t) stat_alloc(sizeof(struct caml_thread_struct)); - th->descr = descr; -#ifdef NATIVE_CODE - th->bottom_of_stack = NULL; - th->exception_pointer = NULL; - th->local_roots = NULL; -#else - /* Allocate the stacks */ - th->stack_low = (value *) stat_alloc(Thread_stack_size); - th->stack_high = th->stack_low + Thread_stack_size / sizeof(value); - th->stack_threshold = th->stack_low + Stack_threshold / sizeof(value); - th->sp = th->stack_high; - th->trapsp = th->stack_high; - th->local_roots = NULL; - th->external_raise = NULL; -#endif - th->backtrace_pos = 0; - th->backtrace_buffer = NULL; - th->backtrace_last_exn = Val_unit; - /* Add thread info block to the list of threads */ - th->next = curr_thread->next; - th->prev = curr_thread; - curr_thread->next->prev = th; - curr_thread->next = th; - /* Create the new thread */ - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - err = pthread_create(&th->pthread, &attr, caml_thread_start, (void *) th); - if (err != 0) { - /* Creation failed, remove thread info block from list of threads */ - th->next->prev = curr_thread; - curr_thread->next = th->next; -#ifndef NATIVE_CODE - stat_free(th->stack_low); -#endif - stat_free(th); - caml_pthread_check(err, "Thread.create"); - } - End_roots(); - /* Create the tick thread if not already done. - Because of PR#4666, we start the tick thread late, only when we create - the first additional thread in the current process*/ - if (! caml_tick_thread_running) { - caml_tick_thread_running = 1; - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - err = pthread_create(&tick_pthread, &attr, caml_thread_tick, NULL); - caml_pthread_check(err, "Thread.create"); - } - return descr; -} - -/* Return the current thread */ - -value caml_thread_self(value unit) /* ML */ -{ - if (curr_thread == NULL) invalid_argument("Thread.self: not initialized"); - return curr_thread->descr; -} - -/* Return the identifier of a thread */ - -value caml_thread_id(value th) /* ML */ -{ - return Ident(th); -} - -/* Print uncaught exception and backtrace */ - -value caml_thread_uncaught_exception(value exn) /* ML */ -{ - char * msg = format_caml_exception(exn); - fprintf(stderr, "Thread %d killed on uncaught exception %s\n", - Int_val(Ident(curr_thread->descr)), msg); - free(msg); - if (caml_backtrace_active) print_exception_backtrace(); - fflush(stderr); - return Val_unit; -} - -/* Terminate current thread */ - -value caml_thread_exit(value unit) /* ML */ -{ -#ifdef NATIVE_CODE - /* We cannot call pthread_exit here because on some systems this - raises a C++ exception, and ocamlopt-generated stack frames - cannot be unwound. Instead, we longjmp to the thread creation - point (in caml_thread_start) or to the point in caml_main - where caml_termination_hook will be called. */ - struct longjmp_buffer * exit_buf; - if (curr_thread == NULL) invalid_argument("Thread.exit: not initialized"); - exit_buf = curr_thread->exit_buf; - caml_thread_stop(); - siglongjmp(exit_buf->buf, 1); -#else - /* No such problem in bytecode */ - if (curr_thread == NULL) invalid_argument("Thread.exit: not initialized"); - caml_thread_stop(); - pthread_exit(NULL); -#endif - return Val_unit; /* not reached */ -} - -/* Allow re-scheduling */ - -value caml_thread_yield(value unit) /* ML */ -{ - if (caml_runtime_waiters == 0) return Val_unit; - enter_blocking_section(); -#ifndef __linux__ - /* sched_yield() doesn't do what we want in Linux 2.6 and up (PR#2663) */ - sched_yield(); -#endif - leave_blocking_section(); - return Val_unit; -} - -/* Suspend the current thread until another thread terminates */ - -value caml_thread_join(value th) /* ML */ -{ - int retcode = caml_threadstatus_wait(Terminated(th)); - caml_pthread_check(retcode, "Thread.join"); - return Val_unit; -} - -/* Mutex operations */ - -#define Mutex_val(v) (* ((pthread_mutex_t **) Data_custom_val(v))) -#define Max_mutex_number 1000 - -static void caml_mutex_finalize(value wrapper) -{ - pthread_mutex_t * mut = Mutex_val(wrapper); - pthread_mutex_destroy(mut); - stat_free(mut); -} - -static int caml_mutex_condition_compare(value wrapper1, value wrapper2) -{ - pthread_mutex_t * mut1 = Mutex_val(wrapper1); - pthread_mutex_t * mut2 = Mutex_val(wrapper2); - return mut1 == mut2 ? 0 : mut1 < mut2 ? -1 : 1; -} - -static struct custom_operations caml_mutex_ops = { - "_mutex", - caml_mutex_finalize, - caml_mutex_condition_compare, - custom_hash_default, - custom_serialize_default, - custom_deserialize_default -}; - -value caml_mutex_new(value unit) /* ML */ -{ - pthread_mutex_t * mut; - value wrapper; - mut = stat_alloc(sizeof(pthread_mutex_t)); - caml_pthread_check(pthread_mutex_init(mut, NULL), "Mutex.create"); - wrapper = alloc_custom(&caml_mutex_ops, sizeof(pthread_mutex_t *), - 1, Max_mutex_number); - Mutex_val(wrapper) = mut; - return wrapper; -} - -value caml_mutex_lock(value wrapper) /* ML */ -{ - int retcode; - pthread_mutex_t * mut = Mutex_val(wrapper); - /* PR#4351: first try to acquire mutex without releasing the master lock */ - retcode = pthread_mutex_trylock(mut); - if (retcode == 0) return Val_unit; - /* If unsuccessful, block on mutex */ - Begin_root(wrapper) /* prevent the deallocation of mutex */ - enter_blocking_section(); - retcode = pthread_mutex_lock(mut); - leave_blocking_section(); - End_roots(); - caml_pthread_check(retcode, "Mutex.lock"); - return Val_unit; -} - -value caml_mutex_unlock(value wrapper) /* ML */ -{ - int retcode; - pthread_mutex_t * mut = Mutex_val(wrapper); - /* PR#4351: no need to release and reacquire master lock */ - retcode = pthread_mutex_unlock(mut); - caml_pthread_check(retcode, "Mutex.unlock"); - return Val_unit; -} - -value caml_mutex_try_lock(value wrapper) /* ML */ -{ - int retcode; - pthread_mutex_t * mut = Mutex_val(wrapper); - retcode = pthread_mutex_trylock(mut); - if (retcode == EBUSY) return Val_false; - caml_pthread_check(retcode, "Mutex.try_lock"); - return Val_true; -} - -/* Conditions operations */ - -#define Condition_val(v) (* ((pthread_cond_t **) Data_custom_val(v))) -#define Max_condition_number 1000 - -static void caml_condition_finalize(value wrapper) -{ - pthread_cond_t * cond = Condition_val(wrapper); - pthread_cond_destroy(cond); - stat_free(cond); -} - -static struct custom_operations caml_condition_ops = { - "_condition", - caml_condition_finalize, - caml_mutex_condition_compare, - custom_hash_default, - custom_serialize_default, - custom_deserialize_default -}; - -value caml_condition_new(value unit) /* ML */ -{ - pthread_cond_t * cond; - value wrapper; - cond = stat_alloc(sizeof(pthread_cond_t)); - caml_pthread_check(pthread_cond_init(cond, NULL), "Condition.create"); - wrapper = alloc_custom(&caml_condition_ops, sizeof(pthread_cond_t *), - 1, Max_condition_number); - Condition_val(wrapper) = cond; - return wrapper; -} - -value caml_condition_wait(value wcond, value wmut) /* ML */ -{ - int retcode; - pthread_cond_t * cond = Condition_val(wcond); - pthread_mutex_t * mut = Mutex_val(wmut); - Begin_roots2(wcond, wmut) /* prevent deallocation of cond and mutex */ - enter_blocking_section(); - retcode = pthread_cond_wait(cond, mut); - leave_blocking_section(); - End_roots(); - caml_pthread_check(retcode, "Condition.wait"); - return Val_unit; -} - -value caml_condition_signal(value wrapper) /* ML */ -{ - int retcode; - pthread_cond_t * cond = Condition_val(wrapper); - retcode = pthread_cond_signal(cond); - caml_pthread_check(retcode, "Condition.signal"); - return Val_unit; -} - -value caml_condition_broadcast(value wrapper) /* ML */ -{ - int retcode; - pthread_cond_t * cond = Condition_val(wrapper); - retcode = pthread_cond_broadcast(cond); - caml_pthread_check(retcode, "Condition.broadcast"); - return Val_unit; -} - -/* Thread status blocks */ - -struct caml_threadstatus { - pthread_mutex_t lock; /* mutex for mutual exclusion */ - enum { ALIVE, TERMINATED } status; /* status of thread */ - pthread_cond_t terminated; /* signaled when thread terminates */ -}; - -#define Threadstatus_val(v) \ - (* ((struct caml_threadstatus **) Data_custom_val(v))) -#define Max_threadstatus_number 500 - -static void caml_threadstatus_finalize(value wrapper) -{ - struct caml_threadstatus * ts = Threadstatus_val(wrapper); - pthread_mutex_destroy(&ts->lock); - pthread_cond_destroy(&ts->terminated); - stat_free(ts); -} - -static struct custom_operations caml_threadstatus_ops = { - "_threadstatus", - caml_threadstatus_finalize, - caml_mutex_condition_compare, - custom_hash_default, - custom_serialize_default, - custom_deserialize_default -}; - -value caml_threadstatus_new (void) -{ - struct caml_threadstatus * ts; - value wrapper; - ts = stat_alloc(sizeof(struct caml_threadstatus)); - caml_pthread_check(pthread_mutex_init(&ts->lock, NULL), "Thread.create"); - caml_pthread_check(pthread_cond_init(&ts->terminated, NULL), - "Thread.create"); - ts->status = ALIVE; - wrapper = alloc_custom(&caml_threadstatus_ops, - sizeof(struct caml_threadstatus *), - 1, Max_threadstatus_number); - Threadstatus_val(wrapper) = ts; - return wrapper; -} - -void caml_threadstatus_terminate (value wrapper) -{ - struct caml_threadstatus * ts = Threadstatus_val(wrapper); - pthread_mutex_lock(&ts->lock); - ts->status = TERMINATED; - pthread_mutex_unlock(&ts->lock); - pthread_cond_broadcast(&ts->terminated); -} - -int caml_threadstatus_wait (value wrapper) -{ - struct caml_threadstatus * ts = Threadstatus_val(wrapper); - int retcode; - - Begin_roots1(wrapper) /* prevent deallocation of ts */ - enter_blocking_section(); - retcode = pthread_mutex_lock(&ts->lock); - if (retcode != 0) goto error; - while (ts->status != TERMINATED) { - retcode = pthread_cond_wait(&ts->terminated, &ts->lock); - if (retcode != 0) goto error; - } - retcode = pthread_mutex_unlock(&ts->lock); - error: - leave_blocking_section(); - End_roots(); - return retcode; -} - -/* Signal mask */ - -static void decode_sigset(value vset, sigset_t * set) -{ - sigemptyset(set); - while (vset != Val_int(0)) { - int sig = caml_convert_signal_number(Int_val(Field(vset, 0))); - sigaddset(set, sig); - vset = Field(vset, 1); - } -} - -#ifndef NSIG -#define NSIG 64 -#endif - -static value encode_sigset(sigset_t * set) -{ - value res = Val_int(0); - int i; - - Begin_root(res) - for (i = 1; i < NSIG; i++) - if (sigismember(set, i) > 0) { - value newcons = alloc_small(2, 0); - Field(newcons, 0) = Val_int(caml_rev_convert_signal_number(i)); - Field(newcons, 1) = res; - res = newcons; - } - End_roots(); - return res; -} - -static int sigmask_cmd[3] = { SIG_SETMASK, SIG_BLOCK, SIG_UNBLOCK }; - -value caml_thread_sigmask(value cmd, value sigs) /* ML */ -{ - int how; - sigset_t set, oldset; - int retcode; - - how = sigmask_cmd[Int_val(cmd)]; - decode_sigset(sigs, &set); - enter_blocking_section(); - retcode = pthread_sigmask(how, &set, &oldset); - leave_blocking_section(); - caml_pthread_check(retcode, "Thread.sigmask"); - return encode_sigset(&oldset); -} - -/* Synchronous signal wait */ - -value caml_wait_signal(value sigs) /* ML */ -{ -#ifdef HAS_SIGWAIT - sigset_t set; - int retcode, signo; - - decode_sigset(sigs, &set); - enter_blocking_section(); - retcode = sigwait(&set, &signo); - leave_blocking_section(); - caml_pthread_check(retcode, "Thread.wait_signal"); - return Val_int(signo); -#else - invalid_argument("Thread.wait_signal not implemented"); - return Val_int(0); /* not reached */ -#endif -} - -/* Error report */ - -static void caml_pthread_check(int retcode, char *msg) -{ - char * err; - int errlen, msglen; - value str; - - if (retcode == 0) return; - err = strerror(retcode); - msglen = strlen(msg); - errlen = strlen(err); - str = alloc_string(msglen + 2 + errlen); - memmove (&Byte(str, 0), msg, msglen); - memmove (&Byte(str, msglen), ": ", 2); - memmove (&Byte(str, msglen + 2), err, errlen); - raise_sys_error(str); -} diff --git a/otherlibs/systhreads/st_posix.h b/otherlibs/systhreads/st_posix.h new file mode 100644 index 00000000..5f9592d6 --- /dev/null +++ b/otherlibs/systhreads/st_posix.h @@ -0,0 +1,431 @@ +/***********************************************************************/ +/* */ +/* Objective Caml */ +/* */ +/* Xavier Leroy and Damien Doligez, INRIA Rocquencourt */ +/* */ +/* Copyright 2009 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. */ +/* */ +/***********************************************************************/ + +/* $Id: posix.c 9270 2009-05-20 11:52:42Z doligez $ */ + +/* POSIX thread implementation of the "st" interface */ + +#include +#include +#include +#include +#include +#ifdef __sun +#define _POSIX_PTHREAD_SEMANTICS +#endif +#include +#include +#ifdef __linux__ +#include +#endif + +#ifdef __GNUC__ +#define INLINE inline +#else +#define INLINE +#endif + +typedef int st_retcode; + +#define SIGPREEMPTION SIGVTALRM + +/* OS-specific initialization */ + +static int st_initialize(void) +{ + return 0; +} + +/* Thread creation. Created in detached mode if [res] is NULL. */ + +typedef pthread_t st_thread_id; + +static int st_thread_create(st_thread_id * res, + void * (*fn)(void *), void * arg) +{ + pthread_t thr; + pthread_attr_t attr; + int rc; + + pthread_attr_init(&attr); + if (res == NULL) pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + rc = pthread_create(&thr, &attr, fn, arg); + if (res != NULL) *res = thr; + return rc; +} + +#define ST_THREAD_FUNCTION void * + +/* Cleanup at thread exit */ + +static INLINE void st_thread_cleanup(void) +{ + return; +} + +/* Thread termination */ + +static void st_thread_exit(void) +{ + pthread_exit(NULL); +} + +static void st_thread_kill(st_thread_id thr) +{ + pthread_cancel(thr); +} + +/* Scheduling hints */ + +static void INLINE st_thread_yield(void) +{ +#ifndef __linux__ + /* sched_yield() doesn't do what we want in Linux 2.6 and up (PR#2663) */ + sched_yield(); +#endif +} + +/* Thread-specific state */ + +typedef pthread_key_t st_tlskey; + +static int st_tls_newkey(st_tlskey * res) +{ + return pthread_key_create(res, NULL); +} + +static INLINE void * st_tls_get(st_tlskey k) +{ + return pthread_getspecific(k); +} + +static INLINE void st_tls_set(st_tlskey k, void * v) +{ + pthread_setspecific(k, v); +} + +/* The master lock. This is a mutex that is held most of the time, + so we implement it in a slightly consoluted way to avoid + all risks of busy-waiting. Also, we count the number of waiting + threads. */ + +typedef struct { + pthread_mutex_t lock; /* to protect contents */ + int busy; /* 0 = free, 1 = taken */ + volatile int waiters; /* number of threads waiting on master lock */ + pthread_cond_t is_free; /* signaled when free */ +} st_masterlock; + +static void st_masterlock_init(st_masterlock * m) +{ + pthread_mutex_init(&m->lock, NULL); + pthread_cond_init(&m->is_free, NULL); + m->busy = 1; + m->waiters = 0; +} + +static void st_masterlock_acquire(st_masterlock * m) +{ + pthread_mutex_lock(&m->lock); + while (m->busy) { + m->waiters ++; + pthread_cond_wait(&m->is_free, &m->lock); + m->waiters --; + } + m->busy = 1; + pthread_mutex_unlock(&m->lock); +} + +static void st_masterlock_release(st_masterlock * m) +{ + pthread_mutex_lock(&m->lock); + m->busy = 0; + pthread_mutex_unlock(&m->lock); + pthread_cond_signal(&m->is_free); +} + +static INLINE int st_masterlock_waiters(st_masterlock * m) +{ + return m->waiters; +} + +/* Mutexes */ + +typedef pthread_mutex_t * st_mutex; + +static int st_mutex_create(st_mutex * res) +{ + int rc; + st_mutex m = malloc(sizeof(pthread_mutex_t)); + if (m == NULL) return ENOMEM; + rc = pthread_mutex_init(m, NULL); + if (rc != 0) { free(m); return rc; } + *res = m; + return 0; +} + +static int st_mutex_destroy(st_mutex m) +{ + int rc; + rc = pthread_mutex_destroy(m); + free(m); + return rc; +} + +static INLINE int st_mutex_lock(st_mutex m) +{ + return pthread_mutex_lock(m); +} + +#define PREVIOUSLY_UNLOCKED 0 +#define ALREADY_LOCKED EBUSY + +static INLINE int st_mutex_trylock(st_mutex m) +{ + return pthread_mutex_trylock(m); +} + +static INLINE int st_mutex_unlock(st_mutex m) +{ + return pthread_mutex_unlock(m); +} + +/* Condition variables */ + +typedef pthread_cond_t * st_condvar; + +static int st_condvar_create(st_condvar * res) +{ + int rc; + st_condvar c = malloc(sizeof(pthread_cond_t)); + if (c == NULL) return ENOMEM; + rc = pthread_cond_init(c, NULL); + if (rc != 0) { free(c); return rc; } + *res = c; + return 0; +} + +static int st_condvar_destroy(st_condvar c) +{ + int rc; + rc = pthread_cond_destroy(c); + free(c); + return rc; +} + +static INLINE int st_condvar_signal(st_condvar c) +{ + return pthread_cond_signal(c); +} + +static INLINE int st_condvar_broadcast(st_condvar c) +{ + return pthread_cond_broadcast(c); +} + +static INLINE int st_condvar_wait(st_condvar c, st_mutex m) +{ + return pthread_cond_wait(c, m); +} + +/* Triggered events */ + +typedef struct st_event_struct { + pthread_mutex_t lock; /* to protect contents */ + int status; /* 0 = not triggered, 1 = triggered */ + pthread_cond_t triggered; /* signaled when triggered */ +} * st_event; + +static int st_event_create(st_event * res) +{ + int rc; + st_event e = malloc(sizeof(struct st_event_struct)); + if (e == NULL) return ENOMEM; + rc = pthread_mutex_init(&e->lock, NULL); + if (rc != 0) { free(e); return rc; } + rc = pthread_cond_init(&e->triggered, NULL); + if (rc != 0) { free(e); return rc; } + e->status = 0; + *res = e; + return 0; +} + +static int st_event_destroy(st_event e) +{ + int rc1, rc2; + rc1 = pthread_mutex_destroy(&e->lock); + rc2 = pthread_cond_destroy(&e->triggered); + free(e); + return rc1 != 0 ? rc1 : rc2; +} + +static int st_event_trigger(st_event e) +{ + int rc; + rc = pthread_mutex_lock(&e->lock); + if (rc != 0) return rc; + e->status = 1; + rc = pthread_mutex_unlock(&e->lock); + if (rc != 0) return rc; + rc = pthread_cond_broadcast(&e->triggered); + return rc; +} + +static int st_event_wait(st_event e) +{ + int rc; + rc = pthread_mutex_lock(&e->lock); + if (rc != 0) return rc; + while(e->status == 0) { + rc = pthread_cond_wait(&e->triggered, &e->lock); + if (rc != 0) return rc; + } + rc = pthread_mutex_unlock(&e->lock); + return rc; +} + +/* Reporting errors */ + +static void st_check_error(int retcode, char * msg) +{ + char * err; + int errlen, msglen; + value str; + + if (retcode == 0) return; + if (retcode == ENOMEM) raise_out_of_memory(); + err = strerror(retcode); + msglen = strlen(msg); + errlen = strlen(err); + str = alloc_string(msglen + 2 + errlen); + memmove (&Byte(str, 0), msg, msglen); + memmove (&Byte(str, msglen), ": ", 2); + memmove (&Byte(str, msglen + 2), err, errlen); + raise_sys_error(str); +} + +/* The tick thread: posts a SIGPREEMPTION signal periodically */ + +static void * caml_thread_tick(void * arg) +{ + struct timeval timeout; + sigset_t mask; +#ifdef __linux__ + int tickcount = 0; +#endif + + /* Block all signals so that we don't try to execute a Caml signal handler */ + sigfillset(&mask); + pthread_sigmask(SIG_BLOCK, &mask, NULL); + /* Allow async cancellation */ + pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); + while(1) { + /* select() seems to be the most efficient way to suspend the + thread for sub-second intervals */ + timeout.tv_sec = 0; + timeout.tv_usec = Thread_timeout * 1000; + select(0, NULL, NULL, NULL, &timeout); + /* The preemption signal should never cause a callback, so don't + go through caml_handle_signal(), just record signal delivery via + caml_record_signal(). */ + caml_record_signal(SIGPREEMPTION); +#ifdef __linux__ + /* Hack around LinuxThreads' non-standard signal handling: + if program is killed on a signal, e.g. SIGINT, the current + thread will not die on this signal (because of the signal blocking + above). Hence, periodically check that the thread manager (our + parent process) still exists. */ + tickcount++; + if (tickcount >= 2000 / Thread_timeout) { /* every 2 secs approx */ + tickcount = 0; + if (getppid() == 1) pthread_exit(NULL); + } +#endif + } + return NULL; /* prevents compiler warning */ +} + +/* "At fork" processing */ + +static int st_atfork(void (*fn)(void)) +{ + return pthread_atfork(NULL, NULL, fn); +} + +/* Signal handling */ + +static void st_decode_sigset(value vset, sigset_t * set) +{ + sigemptyset(set); + while (vset != Val_int(0)) { + int sig = caml_convert_signal_number(Int_val(Field(vset, 0))); + sigaddset(set, sig); + vset = Field(vset, 1); + } +} + +#ifndef NSIG +#define NSIG 64 +#endif + +static value st_encode_sigset(sigset_t * set) +{ + value res = Val_int(0); + int i; + + Begin_root(res) + for (i = 1; i < NSIG; i++) + if (sigismember(set, i) > 0) { + value newcons = alloc_small(2, 0); + Field(newcons, 0) = Val_int(caml_rev_convert_signal_number(i)); + Field(newcons, 1) = res; + res = newcons; + } + End_roots(); + return res; +} + +static int sigmask_cmd[3] = { SIG_SETMASK, SIG_BLOCK, SIG_UNBLOCK }; + +value caml_thread_sigmask(value cmd, value sigs) /* ML */ +{ + int how; + sigset_t set, oldset; + int retcode; + + how = sigmask_cmd[Int_val(cmd)]; + st_decode_sigset(sigs, &set); + enter_blocking_section(); + retcode = pthread_sigmask(how, &set, &oldset); + leave_blocking_section(); + st_check_error(retcode, "Thread.sigmask"); + return st_encode_sigset(&oldset); +} + +value caml_wait_signal(value sigs) /* ML */ +{ +#ifdef HAS_SIGWAIT + sigset_t set; + int retcode, signo; + + st_decode_sigset(sigs, &set); + enter_blocking_section(); + retcode = sigwait(&set, &signo); + leave_blocking_section(); + st_check_error(retcode, "Thread.wait_signal"); + return Val_int(signo); +#else + invalid_argument("Thread.wait_signal not implemented"); + return Val_int(0); /* not reached */ +#endif +} diff --git a/otherlibs/systhreads/st_stubs.c b/otherlibs/systhreads/st_stubs.c new file mode 100644 index 00000000..2e65ecd0 --- /dev/null +++ b/otherlibs/systhreads/st_stubs.c @@ -0,0 +1,852 @@ +/***********************************************************************/ +/* */ +/* Objective Caml */ +/* */ +/* Xavier Leroy and Damien Doligez, INRIA Rocquencourt */ +/* */ +/* Copyright 1995 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. */ +/* */ +/***********************************************************************/ + +/* $Id: posix.c 9270 2009-05-20 11:52:42Z doligez $ */ + +#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" +#ifdef NATIVE_CODE +#include "stack.h" +#else +#include "stacks.h" +#endif +#include "sys.h" +#include "threads.h" + +/* Initial size of bytecode stack when a thread is created (4 Ko) */ +#define Thread_stack_size (Stack_size / 4) + +/* Max computation time before rescheduling, in milliseconds */ +#define Thread_timeout 50 + +/* OS-specific code */ +#ifdef _WIN32 +#include "st_win32.h" +#else +#include "st_posix.h" +#endif + +/* The ML value describing a thread (heap-allocated) */ + +struct caml_thread_descr { + value ident; /* Unique integer ID */ + value start_closure; /* The closure to start this thread */ + value terminated; /* Triggered event for thread termination */ +}; + +#define Ident(v) (((struct caml_thread_descr *)(v))->ident) +#define Start_closure(v) (((struct caml_thread_descr *)(v))->start_closure) +#define Terminated(v) (((struct caml_thread_descr *)(v))->terminated) + +/* The infos on threads (allocated via malloc()) */ + +struct caml_thread_struct { + value descr; /* The heap-allocated descriptor (root) */ + struct caml_thread_struct * next; /* Double linking of running threads */ + struct caml_thread_struct * prev; +#ifdef NATIVE_CODE + char * top_of_stack; /* Top of stack for this thread (approx.) */ + char * bottom_of_stack; /* Saved value of caml_bottom_of_stack */ + uintnat last_retaddr; /* Saved value of caml_last_return_address */ + value * gc_regs; /* Saved value of caml_gc_regs */ + char * exception_pointer; /* Saved value of caml_exception_pointer */ + struct caml__roots_block * local_roots; /* Saved value of local_roots */ + struct longjmp_buffer * exit_buf; /* For thread exit */ +#else + value * stack_low; /* The execution stack for this thread */ + value * stack_high; + value * stack_threshold; + value * sp; /* Saved value of extern_sp for this thread */ + value * trapsp; /* Saved value of trapsp for this thread */ + struct caml__roots_block * local_roots; /* Saved value of local_roots */ + struct longjmp_buffer * external_raise; /* Saved external_raise */ +#endif + int backtrace_pos; /* Saved backtrace_pos */ + code_t * backtrace_buffer; /* Saved backtrace_buffer */ + value backtrace_last_exn; /* Saved backtrace_last_exn (root) */ +}; + +typedef struct caml_thread_struct * caml_thread_t; + +/* The "head" of the circular list of thread descriptors */ +static caml_thread_t all_threads = NULL; + +/* The descriptor for the currently executing thread */ +static caml_thread_t curr_thread = NULL; + +/* The master lock protecting the Caml runtime system */ +static st_masterlock caml_master_lock; + +/* Whether the ``tick'' thread is already running */ +static int caml_tick_thread_running = 0; + +/* The thread identifier of the ``tick'' thread */ +static st_thread_id caml_tick_thread_id; + +/* The key used for storing the thread descriptor in the specific data + of the corresponding system thread. */ +static st_tlskey thread_descriptor_key; + +/* The key used for unlocking I/O channels on exceptions */ +static st_tlskey last_channel_locked_key; + +/* Identifier for next thread creation */ +static intnat thread_next_ident = 0; + +/* Forward declarations */ +static value caml_threadstatus_new (void); +static void caml_threadstatus_terminate (value); +static st_retcode caml_threadstatus_wait (value); + +/* Imports from the native-code runtime system */ +#ifdef NATIVE_CODE +extern struct longjmp_buffer caml_termination_jmpbuf; +extern void (*caml_termination_hook)(void); +#endif + +/* Hook for scanning the stacks of the other threads */ + +static void (*prev_scan_roots_hook) (scanning_action); + +static void caml_thread_scan_roots(scanning_action action) +{ + caml_thread_t th; + + th = curr_thread; + do { + (*action)(th->descr, &th->descr); + (*action)(th->backtrace_last_exn, &th->backtrace_last_exn); + /* Don't rescan the stack of the current thread, it was done already */ + if (th != curr_thread) { +#ifdef NATIVE_CODE + if (th->bottom_of_stack != NULL) + do_local_roots(action, th->bottom_of_stack, th->last_retaddr, + th->gc_regs, th->local_roots); +#else + do_local_roots(action, th->sp, th->stack_high, th->local_roots); +#endif + } + th = th->next; + } while (th != curr_thread); + /* Hook */ + if (prev_scan_roots_hook != NULL) (*prev_scan_roots_hook)(action); +} + +/* Hooks for enter_blocking_section and leave_blocking_section */ + +static void caml_thread_enter_blocking_section(void) +{ + /* Save the stack-related global variables in the thread descriptor + of the current thread */ +#ifdef NATIVE_CODE + curr_thread->bottom_of_stack = caml_bottom_of_stack; + curr_thread->last_retaddr = caml_last_return_address; + curr_thread->gc_regs = caml_gc_regs; + curr_thread->exception_pointer = caml_exception_pointer; + curr_thread->local_roots = local_roots; +#else + curr_thread->stack_low = stack_low; + curr_thread->stack_high = stack_high; + curr_thread->stack_threshold = stack_threshold; + curr_thread->sp = extern_sp; + curr_thread->trapsp = trapsp; + curr_thread->local_roots = local_roots; + curr_thread->external_raise = external_raise; +#endif + curr_thread->backtrace_pos = backtrace_pos; + curr_thread->backtrace_buffer = backtrace_buffer; + curr_thread->backtrace_last_exn = backtrace_last_exn; + /* Tell other threads that the runtime is free */ + st_masterlock_release(&caml_master_lock); +} + +static void caml_thread_leave_blocking_section(void) +{ + /* Wait until the runtime is free */ + st_masterlock_acquire(&caml_master_lock); + /* Update curr_thread to point to the thread descriptor corresponding + to the thread currently executing */ + curr_thread = st_tls_get(thread_descriptor_key); + /* Restore the stack-related global variables */ +#ifdef NATIVE_CODE + caml_bottom_of_stack= curr_thread->bottom_of_stack; + caml_last_return_address = curr_thread->last_retaddr; + caml_gc_regs = curr_thread->gc_regs; + caml_exception_pointer = curr_thread->exception_pointer; + local_roots = curr_thread->local_roots; +#else + stack_low = curr_thread->stack_low; + stack_high = curr_thread->stack_high; + stack_threshold = curr_thread->stack_threshold; + extern_sp = curr_thread->sp; + trapsp = curr_thread->trapsp; + local_roots = curr_thread->local_roots; + external_raise = curr_thread->external_raise; +#endif + backtrace_pos = curr_thread->backtrace_pos; + backtrace_buffer = curr_thread->backtrace_buffer; + backtrace_last_exn = curr_thread->backtrace_last_exn; +} + +static int caml_thread_try_leave_blocking_section(void) +{ + /* Disable immediate processing of signals (PR#3659). + try_leave_blocking_section always fails, forcing the signal to be + recorded and processed at the next leave_blocking_section or + polling. */ + return 0; +} + +/* Hooks for I/O locking */ + +static void caml_io_mutex_free(struct channel *chan) +{ + st_mutex mutex = chan->mutex; + if (mutex != NULL) st_mutex_destroy(mutex); +} + +static void caml_io_mutex_lock(struct channel *chan) +{ + st_mutex mutex = chan->mutex; + + if (mutex == NULL) { + st_mutex_create(&mutex); + chan->mutex = mutex; + } + /* PR#4351: first try to acquire mutex without releasing the master lock */ + if (st_mutex_trylock(mutex) == PREVIOUSLY_UNLOCKED) { + st_tls_set(last_channel_locked_key, (void *) chan); + return; + } + /* If unsuccessful, block on mutex */ + enter_blocking_section(); + st_mutex_lock(mutex); + /* Problem: if a signal occurs at this point, + and the signal handler raises an exception, we will not + unlock the mutex. The alternative (doing the setspecific + before locking the mutex is also incorrect, since we could + then unlock a mutex that is unlocked or locked by someone else. */ + st_tls_set(last_channel_locked_key, (void *) chan); + leave_blocking_section(); +} + +static void caml_io_mutex_unlock(struct channel *chan) +{ + st_mutex_unlock(chan->mutex); + st_tls_set(last_channel_locked_key, NULL); +} + +static void caml_io_mutex_unlock_exn(void) +{ + struct channel * chan = st_tls_get(last_channel_locked_key); + if (chan != NULL) caml_io_mutex_unlock(chan); +} + +/* Hook for estimating stack usage */ + +static uintnat (*prev_stack_usage_hook)(void); + +static uintnat caml_thread_stack_usage(void) +{ + uintnat sz; + caml_thread_t th; + + /* Don't add stack for current thread, this is done elsewhere */ + for (sz = 0, th = curr_thread->next; + th != curr_thread; + th = th->next) { +#ifdef NATIVE_CODE + sz += (value *) th->top_of_stack - (value *) th->bottom_of_stack; +#else + sz += th->stack_high - th->sp; +#endif + } + if (prev_stack_usage_hook != NULL) + sz += prev_stack_usage_hook(); + return sz; +} + +/* Create and setup a new thread info block. + This block has no associated thread descriptor and + is not inserted in the list of threads. */ + +static caml_thread_t caml_thread_new_info(void) +{ + caml_thread_t th; + + th = (caml_thread_t) malloc(sizeof(struct caml_thread_struct)); + if (th == NULL) return NULL; + th->descr = Val_unit; /* filled later */ +#ifdef NATIVE_CODE + th->bottom_of_stack = NULL; + th->top_of_stack = NULL; + th->last_retaddr = 1; + th->exception_pointer = NULL; + th->local_roots = NULL; + th->exit_buf = NULL; +#else + /* Allocate the stacks */ + th->stack_low = (value *) stat_alloc(Thread_stack_size); + th->stack_high = th->stack_low + Thread_stack_size / sizeof(value); + th->stack_threshold = th->stack_low + Stack_threshold / sizeof(value); + th->sp = th->stack_high; + th->trapsp = th->stack_high; + th->local_roots = NULL; + th->external_raise = NULL; +#endif + th->backtrace_pos = 0; + th->backtrace_buffer = NULL; + th->backtrace_last_exn = Val_unit; + return th; +} + +/* Allocate a thread descriptor block. */ + +static value caml_thread_new_descriptor(value clos) +{ + value mu = Val_unit; + value descr; + Begin_roots2 (clos, mu) + /* Create and initialize the termination semaphore */ + mu = caml_threadstatus_new(); + /* Create a descriptor for the new thread */ + descr = alloc_small(3, 0); + Ident(descr) = Val_long(thread_next_ident); + Start_closure(descr) = clos; + Terminated(descr) = mu; + thread_next_ident++; + End_roots(); + return descr; +} + +/* Remove a thread info block from the list of threads. + Free it and its stack resources. */ + +static void caml_thread_remove_info(caml_thread_t th) +{ + if (th->next == th) all_threads = NULL; /* last Caml thread exiting */ + th->next->prev = th->prev; + th->prev->next = th->next; +#ifndef NATIVE_CODE + stat_free(th->stack_low); +#endif + if (th->backtrace_buffer != NULL) free(th->backtrace_buffer); + stat_free(th); +} + +/* Reinitialize the thread machinery after a fork() (PR#4577) */ + +static void caml_thread_reinitialize(void) +{ + caml_thread_t thr, next; + struct channel * chan; + + /* Remove all other threads (now nonexistent) + from the doubly-linked list of threads */ + thr = curr_thread->next; + while (thr != curr_thread) { + next = thr->next; + stat_free(thr); + thr = next; + } + curr_thread->next = curr_thread; + curr_thread->prev = curr_thread; + all_threads = curr_thread; + /* Reinitialize the master lock machinery, + just in case the fork happened while other threads were doing + leave_blocking_section */ + st_masterlock_init(&caml_master_lock); + /* Tick thread is not currently running in child process, will be + re-created at next Thread.create */ + caml_tick_thread_running = 0; + /* Destroy all IO mutexes; will be reinitialized on demand */ + for (chan = caml_all_opened_channels; + chan != NULL; + chan = chan->next) { + if (chan->mutex != NULL) { + st_mutex_destroy(chan->mutex); + chan->mutex = NULL; + } + } +} + +/* Initialize the thread machinery */ + +CAMLprim value caml_thread_initialize(value unit) /* ML */ +{ + /* Protect against repeated initialization (PR#1325) */ + if (curr_thread != NULL) return Val_unit; + /* OS-specific initialization */ + st_initialize(); + /* Initialize and acquire the master lock */ + st_masterlock_init(&caml_master_lock); + /* Initialize the keys */ + st_tls_newkey(&thread_descriptor_key); + st_tls_newkey(&last_channel_locked_key); + /* Set up a thread info block for the current thread */ + curr_thread = + (caml_thread_t) stat_alloc(sizeof(struct caml_thread_struct)); + curr_thread->descr = caml_thread_new_descriptor(Val_unit); + curr_thread->next = curr_thread; + curr_thread->prev = curr_thread; + all_threads = curr_thread; + curr_thread->backtrace_last_exn = Val_unit; +#ifdef NATIVE_CODE + curr_thread->exit_buf = &caml_termination_jmpbuf; +#endif + /* The stack-related fields will be filled in at the next + enter_blocking_section */ + /* Associate the thread descriptor with the thread */ + st_tls_set(thread_descriptor_key, (void *) curr_thread); + /* Set up the hooks */ + prev_scan_roots_hook = scan_roots_hook; + scan_roots_hook = caml_thread_scan_roots; + enter_blocking_section_hook = caml_thread_enter_blocking_section; + leave_blocking_section_hook = caml_thread_leave_blocking_section; + try_leave_blocking_section_hook = caml_thread_try_leave_blocking_section; +#ifdef NATIVE_CODE + caml_termination_hook = st_thread_exit; +#endif + caml_channel_mutex_free = caml_io_mutex_free; + caml_channel_mutex_lock = caml_io_mutex_lock; + caml_channel_mutex_unlock = caml_io_mutex_unlock; + caml_channel_mutex_unlock_exn = caml_io_mutex_unlock_exn; + prev_stack_usage_hook = caml_stack_usage_hook; + caml_stack_usage_hook = caml_thread_stack_usage; + /* Set up fork() to reinitialize the thread machinery in the child + (PR#4577) */ + st_atfork(caml_thread_reinitialize); + return Val_unit; +} + +/* Cleanup the thread machinery on program exit or DLL unload. */ + +CAMLprim value caml_thread_cleanup(value unit) /* ML */ +{ + if (caml_tick_thread_running) st_thread_kill(caml_tick_thread_id); + return Val_unit; +} + +/* Thread cleanup at termination */ + +static void caml_thread_stop(void) +{ + /* Signal that the thread has terminated */ + caml_threadstatus_terminate(Terminated(curr_thread->descr)); + /* Remove th from the doubly-linked list of threads and free its info block */ + caml_thread_remove_info(curr_thread); + /* OS-specific cleanups */ + st_thread_cleanup(); + /* Release the runtime system */ + st_masterlock_release(&caml_master_lock); +} + +/* Create a thread */ + +static ST_THREAD_FUNCTION caml_thread_start(void * arg) +{ + caml_thread_t th = (caml_thread_t) arg; + value clos; +#ifdef NATIVE_CODE + struct longjmp_buffer termination_buf; + char tos; +#endif + + /* Associate the thread descriptor with the thread */ + st_tls_set(thread_descriptor_key, (void *) th); + /* Acquire the global mutex */ + leave_blocking_section(); +#ifdef NATIVE_CODE + /* Record top of stack (approximative) */ + th->top_of_stack = &tos; + /* Setup termination handler (for caml_thread_exit) */ + if (sigsetjmp(termination_buf.buf, 0) == 0) { + th->exit_buf = &termination_buf; +#endif + /* Callback the closure */ + clos = Start_closure(th->descr); + modify(&(Start_closure(th->descr)), Val_unit); + callback_exn(clos, Val_unit); + caml_thread_stop(); +#ifdef NATIVE_CODE + } +#endif + /* The thread now stops running */ + return 0; +} + +CAMLprim value caml_thread_new(value clos) /* ML */ +{ + caml_thread_t th; + st_retcode err; + + /* Create a thread info block */ + th = caml_thread_new_info(); + if (th == NULL) caml_raise_out_of_memory(); + /* Equip it with a thread descriptor */ + th->descr = caml_thread_new_descriptor(clos); + /* Add thread info block to the list of threads */ + th->next = curr_thread->next; + th->prev = curr_thread; + curr_thread->next->prev = th; + curr_thread->next = th; + /* Create the new thread */ + err = st_thread_create(NULL, caml_thread_start, (void *) th); + if (err != 0) { + /* Creation failed, remove thread info block from list of threads */ + caml_thread_remove_info(th); + st_check_error(err, "Thread.create"); + } + /* Create the tick thread if not already done. + Because of PR#4666, we start the tick thread late, only when we create + the first additional thread in the current process*/ + if (! caml_tick_thread_running) { + err = st_thread_create(&caml_tick_thread_id, caml_thread_tick, NULL); + st_check_error(err, "Thread.create"); + caml_tick_thread_running = 1; + } + return th->descr; +} + +/* Register a thread already created from C */ + +CAMLexport int caml_c_thread_register(void) +{ + caml_thread_t th; + st_retcode err; + + /* Already registered? */ + if (st_tls_get(thread_descriptor_key) != NULL) return 0; + /* Create a thread info block */ + th = caml_thread_new_info(); + if (th == NULL) return 0; +#ifdef NATIVE_CODE + th->top_of_stack = (char *) &err; +#endif + /* Take master lock to protect access to the chaining of threads */ + st_masterlock_acquire(&caml_master_lock); + /* Add thread info block to the list of threads */ + if (all_threads == NULL) { + th->next = th; + th->prev = th; + all_threads = th; + } else { + th->next = all_threads->next; + th->prev = all_threads; + all_threads->next->prev = th; + all_threads->next = th; + } + /* Associate the thread descriptor with the thread */ + st_tls_set(thread_descriptor_key, (void *) th); + /* Release the master lock */ + st_masterlock_release(&caml_master_lock); + /* Now we can re-enter the run-time system and heap-allocate the descriptor */ + leave_blocking_section(); + th->descr = caml_thread_new_descriptor(Val_unit); /* no closure */ + /* Create the tick thread if not already done. */ + if (! caml_tick_thread_running) { + err = st_thread_create(&caml_tick_thread_id, caml_thread_tick, NULL); + if (err == 0) caml_tick_thread_running = 1; + } + /* Exit the run-time system */ + enter_blocking_section(); + return 1; +} + +/* Unregister a thread that was created from C and registered with + the function above */ + +CAMLexport int caml_c_thread_unregister(void) +{ + caml_thread_t th = st_tls_get(thread_descriptor_key); + /* Not registered? */ + if (th == NULL) return 0; + /* Wait until the runtime is available */ + st_masterlock_acquire(&caml_master_lock); + /* Forget the thread descriptor */ + st_tls_set(thread_descriptor_key, NULL); + /* Remove thread info block from list of threads, and free it */ + caml_thread_remove_info(th); + /* Release the runtime */ + st_masterlock_release(&caml_master_lock); + return 1; +} + +/* Return the current thread */ + +CAMLprim value caml_thread_self(value unit) /* ML */ +{ + if (curr_thread == NULL) invalid_argument("Thread.self: not initialized"); + return curr_thread->descr; +} + +/* Return the identifier of a thread */ + +CAMLprim value caml_thread_id(value th) /* ML */ +{ + return Ident(th); +} + +/* Print uncaught exception and backtrace */ + +CAMLprim value caml_thread_uncaught_exception(value exn) /* ML */ +{ + char * msg = format_caml_exception(exn); + fprintf(stderr, "Thread %d killed on uncaught exception %s\n", + Int_val(Ident(curr_thread->descr)), msg); + free(msg); + if (caml_backtrace_active) print_exception_backtrace(); + fflush(stderr); + return Val_unit; +} + +/* Terminate current thread */ + +CAMLprim value caml_thread_exit(value unit) /* ML */ +{ + struct longjmp_buffer * exit_buf = NULL; + + if (curr_thread == NULL) invalid_argument("Thread.exit: not initialized"); + + /* In native code, we cannot call pthread_exit here because on some + systems this raises a C++ exception, and ocamlopt-generated stack + frames cannot be unwound. Instead, we longjmp to the thread + creation point (in caml_thread_start) or to the point in + caml_main where caml_termination_hook will be called. + Note that threads created in C then registered do not have + a creation point (exit_buf == NULL). + */ +#ifdef NATIVE_CODE + exit_buf = curr_thread->exit_buf; +#endif + caml_thread_stop(); + if (exit_buf != NULL) { + /* Native-code and (main thread or thread created by Caml) */ + siglongjmp(exit_buf->buf, 1); + } else { + /* Bytecode, or thread created from C */ + st_thread_exit(); + } + return Val_unit; /* not reached */ +} + +/* Allow re-scheduling */ + +CAMLprim value caml_thread_yield(value unit) /* ML */ +{ + if (st_masterlock_waiters(&caml_master_lock) == 0) return Val_unit; + enter_blocking_section(); + st_thread_yield(); + leave_blocking_section(); + return Val_unit; +} + +/* Suspend the current thread until another thread terminates */ + +CAMLprim value caml_thread_join(value th) /* ML */ +{ + st_retcode rc = caml_threadstatus_wait(Terminated(th)); + st_check_error(rc, "Thread.join"); + return Val_unit; +} + +/* Mutex operations */ + +#define Mutex_val(v) (* ((st_mutex *) Data_custom_val(v))) +#define Max_mutex_number 5000 + +static void caml_mutex_finalize(value wrapper) +{ + st_mutex_destroy(Mutex_val(wrapper)); +} + +static int caml_mutex_condition_compare(value wrapper1, value wrapper2) +{ + st_mutex mut1 = Mutex_val(wrapper1); + st_mutex mut2 = Mutex_val(wrapper2); + return mut1 == mut2 ? 0 : mut1 < mut2 ? -1 : 1; +} + +static struct custom_operations caml_mutex_ops = { + "_mutex", + caml_mutex_finalize, + caml_mutex_condition_compare, + custom_hash_default, + custom_serialize_default, + custom_deserialize_default +}; + +CAMLprim value caml_mutex_new(value unit) /* ML */ +{ + st_mutex mut = NULL; /* suppress warning */ + value wrapper; + st_check_error(st_mutex_create(&mut), "Mutex.create"); + wrapper = alloc_custom(&caml_mutex_ops, sizeof(st_mutex *), + 1, Max_mutex_number); + Mutex_val(wrapper) = mut; + return wrapper; +} + +CAMLprim value caml_mutex_lock(value wrapper) /* ML */ +{ + st_mutex mut = Mutex_val(wrapper); + st_retcode retcode; + + /* PR#4351: first try to acquire mutex without releasing the master lock */ + if (st_mutex_trylock(mut) == PREVIOUSLY_UNLOCKED) return Val_unit; + /* If unsuccessful, block on mutex */ + Begin_root(wrapper) /* prevent the deallocation of mutex */ + enter_blocking_section(); + retcode = st_mutex_lock(mut); + leave_blocking_section(); + End_roots(); + st_check_error(retcode, "Mutex.lock"); + return Val_unit; +} + +CAMLprim value caml_mutex_unlock(value wrapper) /* ML */ +{ + st_mutex mut = Mutex_val(wrapper); + st_retcode retcode; + /* PR#4351: no need to release and reacquire master lock */ + retcode = st_mutex_unlock(mut); + st_check_error(retcode, "Mutex.unlock"); + return Val_unit; +} + +CAMLprim value caml_mutex_try_lock(value wrapper) /* ML */ +{ + st_mutex mut = Mutex_val(wrapper); + st_retcode retcode; + retcode = st_mutex_trylock(mut); + if (retcode == ALREADY_LOCKED) return Val_false; + st_check_error(retcode, "Mutex.try_lock"); + return Val_true; +} + +/* Conditions operations */ + +#define Condition_val(v) (* (st_condvar *) Data_custom_val(v)) +#define Max_condition_number 5000 + +static void caml_condition_finalize(value wrapper) +{ + st_condvar_destroy(Condition_val(wrapper)); +} + +static struct custom_operations caml_condition_ops = { + "_condition", + caml_condition_finalize, + caml_mutex_condition_compare, + custom_hash_default, + custom_serialize_default, + custom_deserialize_default +}; + +CAMLprim value caml_condition_new(value unit) /* ML */ +{ + st_condvar cond = NULL; /* suppress warning */ + value wrapper; + st_check_error(st_condvar_create(&cond), "Condition.create"); + wrapper = alloc_custom(&caml_condition_ops, sizeof(st_condvar *), + 1, Max_condition_number); + Condition_val(wrapper) = cond; + return wrapper; +} + +CAMLprim value caml_condition_wait(value wcond, value wmut) /* ML */ +{ + st_condvar cond = Condition_val(wcond); + st_mutex mut = Mutex_val(wmut); + st_retcode retcode; + + Begin_roots2(wcond, wmut) /* prevent deallocation of cond and mutex */ + enter_blocking_section(); + retcode = st_condvar_wait(cond, mut); + leave_blocking_section(); + End_roots(); + st_check_error(retcode, "Condition.wait"); + return Val_unit; +} + +CAMLprim value caml_condition_signal(value wrapper) /* ML */ +{ + st_check_error(st_condvar_signal(Condition_val(wrapper)), + "Condition.signal"); + return Val_unit; +} + +CAMLprim value caml_condition_broadcast(value wrapper) /* ML */ +{ + st_check_error(st_condvar_broadcast(Condition_val(wrapper)), + "Condition.signal"); + return Val_unit; +} + +/* Thread status blocks */ + +#define Threadstatus_val(v) (* ((st_event *) Data_custom_val(v))) +#define Max_threadstatus_number 500 + +static void caml_threadstatus_finalize(value wrapper) +{ + st_event_destroy(Threadstatus_val(wrapper)); +} + +static struct custom_operations caml_threadstatus_ops = { + "_threadstatus", + caml_threadstatus_finalize, + custom_compare_default, + custom_hash_default, + custom_serialize_default, + custom_deserialize_default +}; + +static value caml_threadstatus_new (void) +{ + st_event ts = NULL; /* suppress warning */ + value wrapper; + st_check_error(st_event_create(&ts), "Thread.create"); + wrapper = alloc_custom(&caml_threadstatus_ops, sizeof(st_event *), + 1, Max_threadstatus_number); + Threadstatus_val(wrapper) = ts; + return wrapper; +} + +static void caml_threadstatus_terminate (value wrapper) +{ + st_event_trigger(Threadstatus_val(wrapper)); +} + +static st_retcode caml_threadstatus_wait (value wrapper) +{ + st_event ts = Threadstatus_val(wrapper); + st_retcode retcode; + + Begin_roots1(wrapper) /* prevent deallocation of ts */ + enter_blocking_section(); + retcode = st_event_wait(ts); + leave_blocking_section(); + End_roots(); + return retcode; +} diff --git a/otherlibs/systhreads/st_win32.h b/otherlibs/systhreads/st_win32.h new file mode 100644 index 00000000..e3e37c8c --- /dev/null +++ b/otherlibs/systhreads/st_win32.h @@ -0,0 +1,419 @@ +/***********************************************************************/ +/* */ +/* Objective Caml */ +/* */ +/* Xavier Leroy and Damien Doligez, INRIA Rocquencourt */ +/* */ +/* Copyright 2009 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. */ +/* */ +/***********************************************************************/ + +/* $Id: posix.c 9270 2009-05-20 11:52:42Z doligez $ */ + +/* Win32 implementation of the "st" interface */ + +#include +#include +#include +#include + +#define INLINE __inline + +#if 1 +#define TRACE(x) +#define TRACE1(x,y) +#else +#include +#define TRACE(x) printf("%d: %s\n", GetCurrentThreadId(), x); fflush(stdout) +#define TRACE1(x,y) printf("%d: %s %p\n", GetCurrentThreadId(), x, (void *)y); fflush(stdout) +#endif + +typedef DWORD st_retcode; + +#define SIGPREEMPTION SIGTERM + +/* Thread-local storage assocaiting a Win32 event to every thread. */ +static DWORD st_thread_sem_key; + +/* OS-specific initialization */ + +static DWORD st_initialize(void) +{ + st_thread_sem_key = TlsAlloc(); + if (st_thread_sem_key == TLS_OUT_OF_INDEXES) + return GetLastError(); + else + return 0; +} + +/* Thread creation. Created in detached mode if [res] is NULL. */ + +typedef HANDLE st_thread_id; + +static DWORD st_thread_create(st_thread_id * res, + LPTHREAD_START_ROUTINE fn, void * arg) +{ + HANDLE h = CreateThread(NULL, 0, fn, arg, 0, NULL); + TRACE1("st_thread_create", h); + if (h == NULL) return GetLastError(); + if (res == NULL) + CloseHandle(h); + else + *res = h; + return 0; +} + +#define ST_THREAD_FUNCTION DWORD WINAPI + +/* Cleanup at thread exit */ + +static void st_thread_cleanup(void) +{ + HANDLE ev = (HANDLE) TlsGetValue(st_thread_sem_key); + if (ev != NULL) CloseHandle(ev); +} + +/* Thread termination */ + +static void st_thread_exit(void) +{ + TRACE("st_thread_exit"); + ExitThread(0); +} + +static void st_thread_kill(st_thread_id thr) +{ + TRACE1("st_thread_kill", thr); + TerminateThread(thr, 0); + CloseHandle(thr); +} + +/* Scheduling hints */ + +static INLINE void st_thread_yield(void) +{ + Sleep(0); +} + +/* Thread-specific state */ + +typedef DWORD st_tlskey; + +static DWORD st_tls_newkey(st_tlskey * res) +{ + *res = TlsAlloc(); + if (*res == TLS_OUT_OF_INDEXES) + return GetLastError(); + else + return 0; +} + +static INLINE void * st_tls_get(st_tlskey k) +{ + return TlsGetValue(k); +} + +static INLINE void st_tls_set(st_tlskey k, void * v) +{ + TlsSetValue(k, v); +} + +/* The master lock. */ + +typedef CRITICAL_SECTION st_masterlock; + +static void st_masterlock_init(st_masterlock * m) +{ + TRACE("st_masterlock_init"); + InitializeCriticalSection(m); + EnterCriticalSection(m); +} + +static INLINE void st_masterlock_acquire(st_masterlock * m) +{ + TRACE("st_masterlock_acquire"); + EnterCriticalSection(m); + TRACE("st_masterlock_acquire (done)"); +} + +static INLINE void st_masterlock_release(st_masterlock * m) +{ + LeaveCriticalSection(m); + TRACE("st_masterlock_released"); +} + +static INLINE int st_masterlock_waiters(st_masterlock * m) +{ + return 1; /* info not maintained */ +} + +/* Mutexes */ + +typedef CRITICAL_SECTION * st_mutex; + +static DWORD st_mutex_create(st_mutex * res) +{ + st_mutex m = malloc(sizeof(CRITICAL_SECTION)); + if (m == NULL) return ERROR_NOT_ENOUGH_MEMORY; + InitializeCriticalSection(m); + *res = m; + return 0; +} + +static DWORD st_mutex_destroy(st_mutex m) +{ + DeleteCriticalSection(m); + free(m); + return 0; +} + +static INLINE DWORD st_mutex_lock(st_mutex m) +{ + TRACE1("st_mutex_lock", m); + EnterCriticalSection(m); + TRACE1("st_mutex_lock (done)", m); + return 0; +} + +/* Error codes with the 29th bit set are reserved for the application */ + +#define PREVIOUSLY_UNLOCKED 0 +#define ALREADY_LOCKED (1<<29) + +static INLINE DWORD st_mutex_trylock(st_mutex m) +{ + TRACE1("st_mutex_trylock", m); + if (TryEnterCriticalSection(m)) { + TRACE1("st_mutex_trylock (success)", m); + return PREVIOUSLY_UNLOCKED; + } else { + TRACE1("st_mutex_trylock (failure)", m); + return ALREADY_LOCKED; + } +} + +static INLINE DWORD st_mutex_unlock(st_mutex m) +{ + TRACE1("st_mutex_unlock", m); + LeaveCriticalSection(m); + return 0; +} + +/* Condition variables */ + +/* A condition variable is just a list of threads currently + waiting on this c.v. Each thread is represented by its + associated event. */ + +struct st_wait_list { + HANDLE event; /* event of the first waiting thread */ + struct st_wait_list * next; +}; + +typedef struct st_condvar_struct { + CRITICAL_SECTION lock; /* protect the data structure */ + struct st_wait_list * waiters; /* list of threads waiting */ +} * st_condvar; + +static DWORD st_condvar_create(st_condvar * res) +{ + st_condvar c = malloc(sizeof(struct st_condvar_struct)); + if (c == NULL) return ERROR_NOT_ENOUGH_MEMORY; + InitializeCriticalSection(&c->lock); + c->waiters = NULL; + *res = c; + return 0; +} + +static DWORD st_condvar_destroy(st_condvar c) +{ + TRACE1("st_condvar_destroy", c); + DeleteCriticalSection(&c->lock); + free(c); + return 0; +} + +static DWORD st_condvar_signal(st_condvar c) +{ + DWORD rc = 0; + struct st_wait_list * curr, * next; + + TRACE1("st_condvar_signal", c); + EnterCriticalSection(&c->lock); + curr = c->waiters; + if (curr != NULL) { + next = curr->next; + /* Wake up the first waiting thread */ + TRACE1("st_condvar_signal: waking up", curr->event); + if (! SetEvent(curr->event)) rc = GetLastError(); + /* Remove it from the waiting list */ + c->waiters = next; + } + LeaveCriticalSection(&c->lock); + return rc; +} + +static DWORD st_condvar_broadcast(st_condvar c) +{ + DWORD rc = 0; + struct st_wait_list * curr, * next; + + TRACE1("st_condvar_broadcast", c); + EnterCriticalSection(&c->lock); + /* Wake up all waiting threads */ + curr = c->waiters; + while (curr != NULL) { + next = curr->next; + TRACE1("st_condvar_signal: waking up", curr->event); + if (! SetEvent(curr->event)) rc = GetLastError(); + curr = next; + } + /* Remove them all from the waiting list */ + c->waiters = NULL; + LeaveCriticalSection(&c->lock); + return rc; +} + +static DWORD st_condvar_wait(st_condvar c, st_mutex m) +{ + HANDLE ev; + struct st_wait_list wait; + + TRACE1("st_condvar_wait", c); + /* Recover (or create) the event associated with the calling thread */ + ev = (HANDLE) TlsGetValue(st_thread_sem_key); + if (ev == 0) { + ev = CreateEvent(NULL, + FALSE /*auto reset*/, + FALSE /*initially unset*/, + NULL); + if (ev == NULL) return GetLastError(); + TlsSetValue(st_thread_sem_key, (void *) ev); + } + EnterCriticalSection(&c->lock); + /* Insert the current thread in the waiting list (atomically) */ + wait.event = ev; + wait.next = c->waiters; + c->waiters = &wait; + LeaveCriticalSection(&c->lock); + /* Release the mutex m */ + LeaveCriticalSection(m); + /* Wait for our event to be signaled. There is no risk of lost + wakeup, since we inserted ourselves on the waiting list of c + before releasing m */ + TRACE1("st_condvar_wait: blocking on event", ev); + if (WaitForSingleObject(ev, INFINITE) == WAIT_FAILED) + return GetLastError(); + /* Reacquire the mutex m */ + TRACE1("st_condvar_wait: restarted, acquiring mutex", m); + EnterCriticalSection(m); + TRACE1("st_condvar_wait: acquired mutex", m); + return 0; +} + +/* Triggered events */ + +typedef HANDLE st_event; + +static DWORD st_event_create(st_event * res) +{ + st_event m = + CreateEvent(NULL, TRUE/*manual reset*/, FALSE/*initially unset*/, NULL); + TRACE1("st_event_create", m); + if (m == NULL) return GetLastError(); + *res = m; + return 0; +} + +static DWORD st_event_destroy(st_event e) +{ + TRACE1("st_event_destroy", e); + if (CloseHandle(e)) + return 0; + else + return GetLastError(); +} + +static DWORD st_event_trigger(st_event e) +{ + TRACE1("st_event_trigger", e); + if (SetEvent(e)) + return 0; + else + return GetLastError(); +} + +static DWORD st_event_wait(st_event e) +{ + TRACE1("st_event_wait", e); + if (WaitForSingleObject(e, INFINITE) == WAIT_FAILED) + return GetLastError(); + else + return 0; +} + +/* Reporting errors */ + +static void st_check_error(DWORD retcode, char * msg) +{ + char err[1024]; + int errlen, msglen; + value str; + + if (retcode == 0) return; + if (retcode == ERROR_NOT_ENOUGH_MEMORY) raise_out_of_memory(); + if (! FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + retcode, + 0, + err, + sizeof(err), + NULL)) { + sprintf(err, "error code %lx", retcode); + } + msglen = strlen(msg); + errlen = strlen(err); + str = alloc_string(msglen + 2 + errlen); + memmove (&Byte(str, 0), msg, msglen); + memmove (&Byte(str, msglen), ": ", 2); + memmove (&Byte(str, msglen + 2), err, errlen); + raise_sys_error(str); +} + +/* The tick thread: posts a SIGPREEMPTION signal periodically */ + +static DWORD WINAPI caml_thread_tick(void * arg) +{ + while(1) { + Sleep(Thread_timeout); + /* The preemption signal should never cause a callback, so don't + go through caml_handle_signal(), just record signal delivery via + caml_record_signal(). */ + caml_record_signal(SIGPREEMPTION); + } + return 0; /* prevents compiler warning */ +} + +/* "At fork" processing -- none under Win32 */ + +static DWORD st_atfork(void (*fn)(void)) +{ + return 0; +} + +/* Signal handling -- none under Win32 */ + +value caml_thread_sigmask(value cmd, value sigs) /* ML */ +{ + invalid_argument("Thread.sigmask not implemented"); + return Val_int(0); /* not reached */ +} + +value caml_wait_signal(value sigs) /* ML */ +{ + invalid_argument("Thread.wait_signal not implemented"); + return Val_int(0); /* not reached */ +} diff --git a/otherlibs/systhreads/thread_posix.ml b/otherlibs/systhreads/thread.ml similarity index 91% rename from otherlibs/systhreads/thread_posix.ml rename to otherlibs/systhreads/thread.ml index 9f077b33..e7d528f6 100644 --- a/otherlibs/systhreads/thread_posix.ml +++ b/otherlibs/systhreads/thread.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id$ *) +(* $Id: thread_posix.ml 9547 2010-01-22 12:48:24Z doligez $ *) (* User-level threads *) @@ -51,8 +51,13 @@ let preempt signal = yield() (* Initialization of the scheduler *) +let preempt_signal = + match Sys.os_type with + | "Win32" -> Sys.sigterm + | _ -> Sys.sigvtalrm + let _ = - ignore(Sys.signal Sys.sigvtalrm (Sys.Signal_handle preempt)); + ignore(Sys.signal preempt_signal (Sys.Signal_handle preempt)); thread_initialize() (* Wait functions *) diff --git a/otherlibs/systhreads/thread_win32.ml b/otherlibs/systhreads/thread_win32.ml deleted file mode 100644 index 32422319..00000000 --- a/otherlibs/systhreads/thread_win32.ml +++ /dev/null @@ -1,76 +0,0 @@ -(***********************************************************************) -(* *) -(* Caml Special Light *) -(* *) -(* Xavier Leroy and Pascal Cuoq, projet Cristal, INRIA Rocquencourt *) -(* *) -(* Copyright 1995 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. *) -(* *) -(***********************************************************************) - -(* $Id$ *) - -(* User-level threads *) - -type t - -external thread_initialize : unit -> unit = "caml_thread_initialize" -external thread_new : (unit -> unit) -> t = "caml_thread_new" - -external yield : unit -> unit = "caml_thread_yield" -external self : unit -> t = "caml_thread_self" -external id : t -> int = "caml_thread_id" -external join : t -> unit = "caml_thread_join" -external thread_uncaught_exception : exn -> unit = - "caml_thread_uncaught_exception" - -(* For new, make sure the function passed to thread_new never - raises an exception. *) - -exception Thread_exit - -let create fn arg = - thread_new - (fun () -> - try - fn arg; () - with Thread_exit -> () - | exn -> - flush stdout; flush stderr; - thread_uncaught_exception exn) - -let exit () = raise Thread_exit - -(* Thread.kill is currently not implemented because there is no way - to do correct cleanup under Win32. *) - -let kill th = invalid_arg "Thread.kill: not implemented" - -(* Preemption *) - -let preempt signal = yield() - -(* Initialization of the scheduler *) - -let _ = - ignore(Sys.signal Sys.sigterm (Sys.Signal_handle preempt)); - thread_initialize() - -(* Wait functions *) - -external delay: float -> unit = "caml_thread_delay" - -let wait_read fd = () -let wait_write fd = () - -let wait_timed_read fd delay = true -let wait_timed_write fd delay = true -let select rd wr ex delay = invalid_arg "Thread.select: not implemented" - -let wait_pid p = Unix.waitpid [] p - -let sigmask cmd set = invalid_arg "Thread.sigmask: not implemented" -let wait_signal set = invalid_arg "Thread.wait_signal: not implemented" diff --git a/otherlibs/systhreads/threads.h b/otherlibs/systhreads/threads.h new file mode 100644 index 00000000..74662425 --- /dev/null +++ b/otherlibs/systhreads/threads.h @@ -0,0 +1,60 @@ +/***********************************************************************/ +/* */ +/* Objective Caml */ +/* */ +/* Xavier Leroy and Damien Doligez, INRIA Rocquencourt */ +/* */ +/* Copyright 1995 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. */ +/* */ +/***********************************************************************/ + +/* $Id: posix.c 9270 2009-05-20 11:52:42Z doligez $ */ + +#ifndef CAML_THREADS_H +#define CAML_THREADS_H + +CAMLextern void caml_enter_blocking_section (void); +CAMLextern void caml_leave_blocking_section (void); +#define caml_acquire_runtime_system caml_leave_blocking_section +#define caml_release_runtime_system caml_enter_blocking_section + +/* Manage the master lock around the Caml run-time system. + Only one thread at a time can execute Caml compiled code or + Caml run-time system functions. + + When Caml calls a C function, the current thread holds the master + lock. The C function can release it by calling + [caml_release_runtime_system]. Then, another thread can execute Caml + code. However, the calling thread must not access any Caml data, + nor call any runtime system function, nor call back into Caml. + + Before returning to its Caml caller, or accessing Caml data, + or call runtime system functions, the current thread must + re-acquire the master lock by calling [caml_acquire_runtime_system]. + + Symmetrically, if a C function (not called from Caml) wishes to + call back into Caml code, it should invoke [caml_acquire_runtime_system] + first, then do the callback, then invoke [caml_release_runtime_system]. + + For historical reasons, alternate names can be used: + [caml_enter_blocking_section] instead of [caml_release_runtime_system] + [caml_leave_blocking_section] instead of [caml_acquire_runtime_system] + Intuition: a ``blocking section'' is a piece of C code that does not + use the runtime system (typically, a blocking I/O operation). +*/ + +CAMLextern int caml_c_thread_register(void); +CAMLextern int caml_c_thread_unregister(void); + +/* If a thread is created by C code (instead of by Caml itself), + it must be registered with the Caml runtime system before + being able to call back into Caml code or use other runtime system + functions. Just call [caml_c_thread_register] once. + Before the thread finishes, it must call [caml_c_thread_unregister]. + Both functions return 1 on success, 0 on error. +*/ + +#endif /* CAML_THREADS_H */ diff --git a/otherlibs/systhreads/win32.c b/otherlibs/systhreads/win32.c deleted file mode 100644 index dfec43cc..00000000 --- a/otherlibs/systhreads/win32.c +++ /dev/null @@ -1,664 +0,0 @@ -/***********************************************************************/ -/* */ -/* Objective Caml */ -/* */ -/* Xavier Leroy and Pascal Cuoq, INRIA Rocquencourt */ -/* */ -/* Copyright 1995 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. */ -/* */ -/***********************************************************************/ - -/* $Id$ */ - -/* Thread interface for Win32 threads */ - -#include -#include -#include -#include -#include -#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" -#ifdef NATIVE_CODE -#include "stack.h" -#else -#include "stacks.h" -#endif -#include "sys.h" - -/* Initial size of stack when a thread is created (4 Ko) */ -#define Thread_stack_size (Stack_size / 4) - -/* Max computation time before rescheduling, in milliseconds (50ms) */ -#define Thread_timeout 50 - -/* Signal used for timer preemption (any unused, legal signal number) */ -#define SIGTIMER SIGTERM - -/* The ML value describing a thread (heap-allocated) */ - -struct caml_thread_handle { - value final_fun; /* Finalization function */ - HANDLE handle; /* Windows handle */ -}; - -struct caml_thread_descr { - value ident; /* Unique integer ID */ - value start_closure; /* The closure to start this thread */ - struct caml_thread_handle * thread_handle; /* Finalized object with handle */ -}; - -#define Ident(v) (((struct caml_thread_descr *)(v))->ident) -#define Start_closure(v) (((struct caml_thread_descr *)(v))->start_closure) -#define Threadhandle(v) (((struct caml_thread_descr *)(v))->thread_handle) - -/* The infos on threads (allocated via malloc()) */ - -struct caml_thread_struct { - HANDLE wthread; /* The Windows thread handle */ - value descr; /* The heap-allocated descriptor (root) */ - struct caml_thread_struct * next; /* Double linking of running threads */ - struct caml_thread_struct * prev; -#ifdef NATIVE_CODE - char * bottom_of_stack; /* Saved value of caml_bottom_of_stack */ - uintnat last_retaddr; /* Saved value of caml_last_return_address */ - value * gc_regs; /* Saved value of caml_gc_regs */ - char * exception_pointer; /* Saved value of caml_exception_pointer */ - struct caml__roots_block * local_roots; /* Saved value of local_roots */ -#else - value * stack_low; /* The execution stack for this thread */ - value * stack_high; - value * stack_threshold; - value * sp; /* Saved value of extern_sp for this thread */ - value * trapsp; /* Saved value of trapsp for this thread */ - struct caml__roots_block * local_roots; /* Saved value of local_roots */ - struct longjmp_buffer * external_raise; /* Saved external_raise */ - int backtrace_pos; /* Saved backtrace_pos */ - code_t * backtrace_buffer; /* Saved backtrace_buffer */ - value backtrace_last_exn; /* Saved backtrace_last_exn (root) */ -#endif -}; - -typedef struct caml_thread_struct * caml_thread_t; - -/* The descriptor for the currently executing thread (thread-specific) */ - -static caml_thread_t curr_thread = NULL; - -/* The global mutex used to ensure that at most one thread is running - Caml code */ -static HANDLE caml_mutex; - -/* The key used for storing the thread descriptor in the specific data - of the corresponding Posix thread. */ -static DWORD thread_descriptor_key; - -/* The key used for unlocking I/O channels on exceptions */ -static DWORD last_channel_locked_key; - -/* Identifier for next thread creation */ -static intnat thread_next_ident = 0; - -/* Forward declarations */ - -static void caml_wthread_error (char * msg); - -/* Hook for scanning the stacks of the other threads */ - -static void (*prev_scan_roots_hook) (scanning_action); - -static void caml_thread_scan_roots(scanning_action action) -{ - caml_thread_t th; - - th = curr_thread; - do { - (*action)(th->descr, &th->descr); -#ifndef NATIVE_CODE - (*action)(th->backtrace_last_exn, &th->backtrace_last_exn); -#endif - /* Don't rescan the stack of the current thread, it was done already */ - if (th != curr_thread) { -#ifdef NATIVE_CODE - if (th->bottom_of_stack != NULL) - do_local_roots(action, th->bottom_of_stack, th->last_retaddr, - th->gc_regs, th->local_roots); -#else - do_local_roots(action, th->sp, th->stack_high, th->local_roots); -#endif - } - th = th->next; - } while (th != curr_thread); - /* Hook */ - if (prev_scan_roots_hook != NULL) (*prev_scan_roots_hook)(action); -} - -/* Hooks for enter_blocking_section and leave_blocking_section */ - -static void caml_thread_enter_blocking_section(void) -{ - /* Save the stack-related global variables in the thread descriptor - of the current thread */ -#ifdef NATIVE_CODE - curr_thread->bottom_of_stack = caml_bottom_of_stack; - curr_thread->last_retaddr = caml_last_return_address; - curr_thread->gc_regs = caml_gc_regs; - curr_thread->exception_pointer = caml_exception_pointer; - curr_thread->local_roots = local_roots; -#else - curr_thread->stack_low = stack_low; - curr_thread->stack_high = stack_high; - curr_thread->stack_threshold = stack_threshold; - curr_thread->sp = extern_sp; - curr_thread->trapsp = trapsp; - curr_thread->local_roots = local_roots; - curr_thread->external_raise = external_raise; - curr_thread->backtrace_pos = backtrace_pos; - curr_thread->backtrace_buffer = backtrace_buffer; - curr_thread->backtrace_last_exn = backtrace_last_exn; -#endif - /* Release the global mutex */ - ReleaseMutex(caml_mutex); -} - -static void caml_thread_leave_blocking_section(void) -{ - WaitForSingleObject(caml_mutex, INFINITE); - /* Update curr_thread to point to the thread descriptor corresponding - to the thread currently executing */ - curr_thread = TlsGetValue(thread_descriptor_key); - /* Restore the stack-related global variables */ -#ifdef NATIVE_CODE - caml_bottom_of_stack= curr_thread->bottom_of_stack; - caml_last_return_address = curr_thread->last_retaddr; - caml_gc_regs = curr_thread->gc_regs; - caml_exception_pointer = curr_thread->exception_pointer; - local_roots = curr_thread->local_roots; -#else - stack_low = curr_thread->stack_low; - stack_high = curr_thread->stack_high; - stack_threshold = curr_thread->stack_threshold; - extern_sp = curr_thread->sp; - trapsp = curr_thread->trapsp; - local_roots = curr_thread->local_roots; - external_raise = curr_thread->external_raise; - backtrace_pos = curr_thread->backtrace_pos; - backtrace_buffer = curr_thread->backtrace_buffer; - backtrace_last_exn = curr_thread->backtrace_last_exn; -#endif -} - -static int caml_thread_try_leave_blocking_section(void) -{ - /* Disable immediate processing of signals (PR#3659). - try_leave_blocking_section always fails, forcing the signal to be - recorded and processed at the next leave_blocking_section or - polling. */ - return 0; -} - -/* Hooks for I/O locking */ - -static void caml_io_mutex_free(struct channel * chan) -{ - HANDLE mutex = chan->mutex; - if (mutex != NULL) { - CloseHandle(mutex); - } -} - -static void caml_io_mutex_lock(struct channel * chan) -{ - if (chan->mutex == NULL) { - HANDLE mutex = CreateMutex(NULL, FALSE, NULL); - if (mutex == NULL) caml_wthread_error("Thread.iolock"); - chan->mutex = (void *) mutex; - } - /* PR#4351: first try to acquire mutex without releasing the master lock */ - if (WaitForSingleObject((HANDLE) chan->mutex, 0) == WAIT_OBJECT_0) { - TlsSetValue(last_channel_locked_key, (void *) chan); - return; - } - enter_blocking_section(); - WaitForSingleObject((HANDLE) chan->mutex, INFINITE); - /* Problem: if a signal occurs at this point, - and the signal handler raises an exception, we will not - unlock the mutex. The alternative (doing the setspecific - before locking the mutex is also incorrect, since we could - then unlock a mutex that is unlocked or locked by someone else. */ - TlsSetValue(last_channel_locked_key, (void *) chan); - leave_blocking_section(); -} - -static void caml_io_mutex_unlock(struct channel * chan) -{ - ReleaseMutex((HANDLE) chan->mutex); - TlsSetValue(last_channel_locked_key, NULL); -} - -static void caml_io_mutex_unlock_exn(void) -{ - struct channel * chan = TlsGetValue(last_channel_locked_key); - if (chan != NULL) caml_io_mutex_unlock(chan); -} - -/* The "tick" thread fakes a signal at regular intervals. */ - -static DWORD WINAPI caml_thread_tick(void * arg) -{ - while(1) { - Sleep(Thread_timeout); - caml_pending_signals[SIGTIMER] = 1; - caml_signals_are_pending = 1; -#ifdef NATIVE_CODE - young_limit = young_end; -#else - something_to_do = 1; -#endif - } -} - -static void caml_thread_finalize(value vthread) -{ - CloseHandle(((struct caml_thread_handle *)vthread)->handle); -} - -/* Initialize the thread machinery */ - -CAMLprim value caml_thread_initialize(value unit) -{ - value vthread = Val_unit; - value descr; - HANDLE tick_thread; - DWORD th_id; - - /* Protect against repeated initialization (PR#1325) */ - if (curr_thread != NULL) return Val_unit; - Begin_root (vthread); - /* Initialize the main mutex and acquire it */ - caml_mutex = CreateMutex(NULL, TRUE, NULL); - if (caml_mutex == NULL) caml_wthread_error("Thread.init"); - /* Initialize the TLS keys */ - thread_descriptor_key = TlsAlloc(); - last_channel_locked_key = TlsAlloc(); - /* Create a finalized value to hold thread handle */ - vthread = alloc_final(sizeof(struct caml_thread_handle) / sizeof(value), - caml_thread_finalize, 1, 1000); - ((struct caml_thread_handle *)vthread)->handle = NULL; - /* Create a descriptor for the current thread */ - descr = alloc_tuple(sizeof(struct caml_thread_descr) / sizeof(value)); - Ident(descr) = Val_long(thread_next_ident); - Start_closure(descr) = Val_unit; - Threadhandle(descr) = (struct caml_thread_handle *) vthread; - thread_next_ident++; - /* Create an info block for the current thread */ - curr_thread = - (caml_thread_t) stat_alloc(sizeof(struct caml_thread_struct)); - DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), - GetCurrentProcess(), &(curr_thread->wthread), - 0, FALSE, DUPLICATE_SAME_ACCESS); - if (curr_thread->wthread == NULL) caml_wthread_error("Thread.init"); - ((struct caml_thread_handle *)vthread)->handle = curr_thread->wthread; - curr_thread->descr = descr; - curr_thread->next = curr_thread; - curr_thread->prev = curr_thread; - /* The stack-related fields will be filled in at the next - enter_blocking_section */ - /* Associate the thread descriptor with the thread */ - TlsSetValue(thread_descriptor_key, (void *) curr_thread); - /* Set up the hooks */ - prev_scan_roots_hook = scan_roots_hook; - scan_roots_hook = caml_thread_scan_roots; - enter_blocking_section_hook = caml_thread_enter_blocking_section; - leave_blocking_section_hook = caml_thread_leave_blocking_section; - try_leave_blocking_section_hook = caml_thread_try_leave_blocking_section; - caml_channel_mutex_free = caml_io_mutex_free; - caml_channel_mutex_lock = caml_io_mutex_lock; - caml_channel_mutex_unlock = caml_io_mutex_unlock; - caml_channel_mutex_unlock_exn = caml_io_mutex_unlock_exn; - /* Fork the tick thread */ - tick_thread = CreateThread(NULL, 0, caml_thread_tick, NULL, 0, &th_id); - if (tick_thread == NULL) caml_wthread_error("Thread.init"); - CloseHandle(tick_thread); - End_roots(); - return Val_unit; -} - -/* Create a thread */ - -static DWORD WINAPI caml_thread_start(void * arg) -{ - caml_thread_t th = (caml_thread_t) arg; - value clos; - - /* Associate the thread descriptor with the thread */ - TlsSetValue(thread_descriptor_key, (void *) th); - TlsSetValue(last_channel_locked_key, NULL); - /* Acquire the global mutex and set up the stack variables */ - leave_blocking_section(); - /* Callback the closure */ - clos = Start_closure(th->descr); - modify(&(Start_closure(th->descr)), Val_unit); - callback_exn(clos, Val_unit); - /* Remove th from the doubly-linked list of threads */ - th->next->prev = th->prev; - th->prev->next = th->next; - /* Release the main mutex (forever) */ - ReleaseMutex(caml_mutex); -#ifndef NATIVE_CODE - /* Free the memory resources */ - stat_free(th->stack_low); - if (th->backtrace_buffer != NULL) free(th->backtrace_buffer); -#endif - /* Free the thread descriptor */ - stat_free(th); - /* The thread now stops running */ - return 0; -} - -CAMLprim value caml_thread_new(value clos) -{ - caml_thread_t th; - value vthread = Val_unit; - value descr; - DWORD th_id; - - Begin_roots2 (clos, vthread) - /* Create a finalized value to hold thread handle */ - vthread = alloc_final(sizeof(struct caml_thread_handle) / sizeof(value), - caml_thread_finalize, 1, 1000); - ((struct caml_thread_handle *)vthread)->handle = NULL; - /* Create a descriptor for the new thread */ - descr = alloc_tuple(sizeof(struct caml_thread_descr) / sizeof(value)); - Ident(descr) = Val_long(thread_next_ident); - Start_closure(descr) = clos; - Threadhandle(descr) = (struct caml_thread_handle *) vthread; - thread_next_ident++; - /* Create an info block for the current thread */ - th = (caml_thread_t) stat_alloc(sizeof(struct caml_thread_struct)); - th->descr = descr; -#ifdef NATIVE_CODE - th->bottom_of_stack = NULL; - th->exception_pointer = NULL; - th->local_roots = NULL; -#else - /* Allocate the stacks */ - th->stack_low = (value *) stat_alloc(Thread_stack_size); - th->stack_high = th->stack_low + Thread_stack_size / sizeof(value); - th->stack_threshold = th->stack_low + Stack_threshold / sizeof(value); - th->sp = th->stack_high; - th->trapsp = th->stack_high; - th->local_roots = NULL; - th->external_raise = NULL; - th->backtrace_pos = 0; - th->backtrace_buffer = NULL; - th->backtrace_last_exn = Val_unit; -#endif - /* Add thread info block to the list of threads */ - th->next = curr_thread->next; - th->prev = curr_thread; - curr_thread->next->prev = th; - curr_thread->next = th; - /* Fork the new thread */ - th->wthread = - CreateThread(NULL, 0, caml_thread_start, (void *) th, 0, &th_id); - if (th->wthread == NULL) { - /* Fork failed, remove thread info block from list of threads */ - th->next->prev = curr_thread; - curr_thread->next = th->next; -#ifndef NATIVE_CODE - stat_free(th->stack_low); -#endif - stat_free(th); - caml_wthread_error("Thread.create"); - } - ((struct caml_thread_handle *)vthread)->handle = th->wthread; - End_roots(); - return descr; -} - -/* Return the current thread */ - -CAMLprim value caml_thread_self(value unit) -{ - if (curr_thread == NULL) invalid_argument("Thread.self: not initialized"); - return curr_thread->descr; -} - -/* Return the identifier of a thread */ - -CAMLprim value caml_thread_id(value th) -{ - return Ident(th); -} - -/* Print uncaught exception and backtrace */ - -CAMLprim value caml_thread_uncaught_exception(value exn) -{ - char * msg = format_caml_exception(exn); - fprintf(stderr, "Thread %d killed on uncaught exception %s\n", - Int_val(Ident(curr_thread->descr)), msg); - free(msg); -#ifndef NATIVE_CODE - if (backtrace_active) print_exception_backtrace(); -#endif - fflush(stderr); - return Val_unit; -} - -/* Allow re-scheduling */ - -CAMLprim value caml_thread_yield(value unit) -{ - enter_blocking_section(); - Sleep(0); - leave_blocking_section(); - return Val_unit; -} - -/* Suspend the current thread until another thread terminates */ - -CAMLprim value caml_thread_join(value th) -{ - HANDLE h; - - Begin_root(th) /* prevent deallocation of handle */ - h = Threadhandle(th)->handle; - enter_blocking_section(); - WaitForSingleObject(h, INFINITE); - leave_blocking_section(); - End_roots(); - return Val_unit; -} - -/* Mutex operations */ - -#define Mutex_val(v) (*((HANDLE *) Data_custom_val(v))) -#define Max_mutex_number 1000 - -static void caml_mutex_finalize(value mut) -{ - CloseHandle(Mutex_val(mut)); -} - -static int caml_mutex_compare(value wrapper1, value wrapper2) -{ - HANDLE h1 = Mutex_val(wrapper1); - HANDLE h2 = Mutex_val(wrapper2); - return h1 == h2 ? 0 : h1 < h2 ? -1 : 1; -} - -static struct custom_operations caml_mutex_ops = { - "_mutex", - caml_mutex_finalize, - caml_mutex_compare, - custom_hash_default, - custom_serialize_default, - custom_deserialize_default -}; - -CAMLprim value caml_mutex_new(value unit) -{ - value mut; - mut = alloc_custom(&caml_mutex_ops, sizeof(HANDLE), 1, Max_mutex_number); - Mutex_val(mut) = CreateMutex(0, FALSE, NULL); - if (Mutex_val(mut) == NULL) caml_wthread_error("Mutex.create"); - return mut; -} - -CAMLprim value caml_mutex_lock(value mut) -{ - int retcode; - /* PR#4351: first try to acquire mutex without releasing the master lock */ - retcode = WaitForSingleObject(Mutex_val(mut), 0); - if (retcode == WAIT_OBJECT_0) return Val_unit; - Begin_root(mut) /* prevent deallocation of mutex */ - enter_blocking_section(); - retcode = WaitForSingleObject(Mutex_val(mut), INFINITE); - leave_blocking_section(); - End_roots(); - if (retcode == WAIT_FAILED) caml_wthread_error("Mutex.lock"); - return Val_unit; -} - -CAMLprim value caml_mutex_unlock(value mut) -{ - BOOL retcode; - /* PR#4351: no need to release and reacquire master lock */ - retcode = ReleaseMutex(Mutex_val(mut)); - if (!retcode) caml_wthread_error("Mutex.unlock"); - return Val_unit; -} - -CAMLprim value caml_mutex_try_lock(value mut) -{ - int retcode; - retcode = WaitForSingleObject(Mutex_val(mut), 0); - if (retcode == WAIT_FAILED || retcode == WAIT_ABANDONED) - caml_wthread_error("Mutex.try_lock"); - return Val_bool(retcode == WAIT_OBJECT_0); -} - -/* Delay */ - -CAMLprim value caml_thread_delay(value val) -{ - enter_blocking_section(); - Sleep((DWORD)(Double_val(val)*1000)); /* milliseconds */ - leave_blocking_section(); - return Val_unit; -} - -/* Conditions operations */ - -struct caml_condvar { - uintnat count; /* Number of waiting threads */ - HANDLE sem; /* Semaphore on which threads are waiting */ -}; - -#define Condition_val(v) ((struct caml_condvar *) Data_custom_val(v)) -#define Max_condition_number 1000 - -static void caml_condition_finalize(value cond) -{ - CloseHandle(Condition_val(cond)->sem); -} - -static int caml_condition_compare(value wrapper1, value wrapper2) -{ - HANDLE h1 = Condition_val(wrapper1)->sem; - HANDLE h2 = Condition_val(wrapper2)->sem; - return h1 == h2 ? 0 : h1 < h2 ? -1 : 1; -} - -static struct custom_operations caml_condition_ops = { - "_condition", - caml_condition_finalize, - caml_condition_compare, - custom_hash_default, - custom_serialize_default, - custom_deserialize_default -}; - -CAMLprim value caml_condition_new(value unit) -{ - value cond; - cond = alloc_custom(&caml_condition_ops, sizeof(struct caml_condvar), - 1, Max_condition_number); - Condition_val(cond)->sem = CreateSemaphore(NULL, 0, 0x7FFFFFFF, NULL); - if (Condition_val(cond)->sem == NULL) - caml_wthread_error("Condition.create"); - Condition_val(cond)->count = 0; - return cond; -} - -CAMLprim value caml_condition_wait(value cond, value mut) -{ - int retcode; - HANDLE m = Mutex_val(mut); - HANDLE s = Condition_val(cond)->sem; - HANDLE handles[2]; - - Condition_val(cond)->count ++; - Begin_roots2(cond, mut) /* prevent deallocation of cond and mutex */ - enter_blocking_section(); - /* Release mutex */ - ReleaseMutex(m); - /* Wait for semaphore to be non-null, and decrement it. - Simultaneously, re-acquire mutex. */ - handles[0] = s; - handles[1] = m; - retcode = WaitForMultipleObjects(2, handles, TRUE, INFINITE); - leave_blocking_section(); - End_roots(); - if (retcode == WAIT_FAILED) caml_wthread_error("Condition.wait"); - return Val_unit; -} - -CAMLprim value caml_condition_signal(value cond) -{ - HANDLE s = Condition_val(cond)->sem; - - if (Condition_val(cond)->count > 0) { - Condition_val(cond)->count --; - /* Increment semaphore by 1, waking up one waiter */ - ReleaseSemaphore(s, 1, NULL); - } - return Val_unit; -} - -CAMLprim value caml_condition_broadcast(value cond) -{ - HANDLE s = Condition_val(cond)->sem; - uintnat c = Condition_val(cond)->count; - - if (c > 0) { - Condition_val(cond)->count = 0; - /* Increment semaphore by c, waking up all waiters */ - ReleaseSemaphore(s, c, NULL); - } - return Val_unit; -} - -/* Error report */ - -static void caml_wthread_error(char * msg) -{ - char errmsg[1024]; - sprintf(errmsg, "%s: error code %lx", msg, GetLastError()); - raise_sys_error(copy_string(errmsg)); -} diff --git a/otherlibs/threads/.depend b/otherlibs/threads/.depend index ba507a09..8adb2095 100644 --- a/otherlibs/threads/.depend +++ b/otherlibs/threads/.depend @@ -1,26 +1,14 @@ scheduler.o: scheduler.c ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/compatibility.h ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/misc.h ../../byterun/backtrace.h ../../byterun/mlvalues.h \ - ../../byterun/callback.h ../../byterun/compatibility.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/io.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/printexc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/roots.h \ - ../../byterun/misc.h ../../byterun/memory.h ../../byterun/signals.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/stacks.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/sys.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/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: marshal.cmi: diff --git a/otherlibs/unix/.depend b/otherlibs/unix/.depend index 22ddf3e7..cf80dc69 100644 --- a/otherlibs/unix/.depend +++ b/otherlibs/unix/.depend @@ -1,816 +1,449 @@ accept.o: accept.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/signals.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h unixsupport.h socketaddr.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.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 addrofstr.o: addrofstr.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/fail.h ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h unixsupport.h socketaddr.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 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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.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/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/compatibility.h \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/misc.h unixsupport.h socketaddr.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.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/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h unixsupport.h + ../../byterun/compatibility.h ../../byterun/config.h \ + ../../byterun/../config/m.h ../../byterun/../config/s.h \ + ../../byterun/misc.h unixsupport.h connect.o: connect.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/compatibility.h \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/misc.h ../../byterun/signals.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h unixsupport.h socketaddr.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/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/fail.h ../../byterun/compatibility.h ../../byterun/misc.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/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/memory.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/gc.h ../../byterun/mlvalues.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/misc.h ../../byterun/minor_gc.h \ - ../../byterun/misc.h ../../byterun/misc.h ../../byterun/mlvalues.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 dup.o: dup.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h unixsupport.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.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/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/compatibility.h \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/misc.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 fchown.o: fchown.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/compatibility.h \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/misc.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 fcntl.o: fcntl.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/compatibility.h \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/misc.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.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/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/compatibility.h ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/misc.h ../../byterun/io.h ../../byterun/misc.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 ../../byterun/io.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/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/alloc.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/signals.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.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/signals.h unixsupport.h \ + cst2constr.h socketaddr.h ../../byterun/misc.h getcwd.o: getcwd.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.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 ../../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/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.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/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.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/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/alloc.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.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 \ + ../../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/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/alloc.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/signals.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h unixsupport.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/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/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/alloc.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.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 \ + ../../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/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/alloc.h ../../byterun/compatibility.h \ - ../../byterun/misc.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/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/alloc.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/signals.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h unixsupport.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/signals.h unixsupport.h \ + socketaddr.h ../../byterun/misc.h getpeername.o: getpeername.c ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/compatibility.h ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/misc.h unixsupport.h socketaddr.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.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/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.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/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/alloc.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.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 \ + ../../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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.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 ../../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/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/alloc.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.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 \ + ../../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/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/compatibility.h ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/misc.h unixsupport.h socketaddr.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/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/alloc.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.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 \ + ../../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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.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 ../../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/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/alloc.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.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 \ + ../../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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.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 ../../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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h unixsupport.h ../../byterun/signals.h \ - ../../byterun/compatibility.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/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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h listen.o: listen.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/compatibility.h \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/misc.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/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/compatibility.h \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/misc.h ../../byterun/signals.h \ - ../../byterun/compatibility.h ../../byterun/misc.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 ../../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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/io.h ../../byterun/misc.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 ../../byterun/io.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h mkfifo.o: mkfifo.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/compatibility.h \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/misc.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 nice.o: nice.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/signals.h \ - ../../byterun/compatibility.h ../../byterun/misc.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 ../../byterun/memory.h ../../byterun/gc.h \ + ../../byterun/major_gc.h ../../byterun/freelist.h \ + ../../byterun/minor_gc.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/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/alloc.h ../../byterun/compatibility.h \ - ../../byterun/misc.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 pipe.o: pipe.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.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/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/compatibility.h \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/signals.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.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/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/fail.h ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.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 unixsupport.h readlink.o: readlink.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/alloc.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.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 \ + ../../byterun/fail.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h rewinddir.o: rewinddir.c ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/compatibility.h ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/misc.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/signals.h \ - ../../byterun/compatibility.h ../../byterun/misc.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 ../../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/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/alloc.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/signals.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h unixsupport.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/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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.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/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/alloc.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.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 \ + ../../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/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/compatibility.h \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/misc.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.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/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/compatibility.h \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/misc.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/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/compatibility.h \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/misc.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/signals.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/signals.h \ - ../../byterun/compatibility.h ../../byterun/misc.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 socket.o: socket.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/compatibility.h \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/misc.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 socketaddr.o: socketaddr.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/alloc.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h unixsupport.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/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ + ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h \ + socketaddr.h ../../byterun/misc.h socketpair.o: socketpair.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/alloc.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.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 \ + ../../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/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/memory.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/gc.h ../../byterun/mlvalues.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/misc.h ../../byterun/minor_gc.h \ - ../../byterun/misc.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/alloc.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h unixsupport.h socketaddr.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h unixsupport.h cst2constr.h ../../byterun/io.h \ - ../../byterun/misc.h ../../byterun/mlvalues.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 \ + 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/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/alloc.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h unixsupport.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 unixsupport.h socketaddr.h ../../byterun/misc.h symlink.o: symlink.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/compatibility.h \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/misc.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 termios.o: termios.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/alloc.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.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 \ + ../../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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.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 ../../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/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/fail.h ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/io.h ../../byterun/misc.h \ - ../../byterun/mlvalues.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/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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.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/compatibility.h ../../byterun/misc.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/alloc.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/callback.h \ - ../../byterun/compatibility.h ../../byterun/mlvalues.h \ - ../../byterun/memory.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/gc.h ../../byterun/mlvalues.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/misc.h ../../byterun/minor_gc.h \ - ../../byterun/misc.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h unixsupport.h + ../../byterun/config.h ../../byterun/../config/m.h \ + ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h utimes.o: utimes.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/compatibility.h \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/misc.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 wait.o: wait.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/signals.h \ - ../../byterun/compatibility.h ../../byterun/misc.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 ../../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/compatibility.h \ - ../../byterun/misc.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/memory.h \ - ../../byterun/compatibility.h ../../byterun/config.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/misc.h ../../byterun/mlvalues.h \ - ../../byterun/misc.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/misc.h ../../byterun/mlvalues.h ../../byterun/signals.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/mlvalues.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 unix.cmi: unixLabels.cmi: unix.cmi unix.cmo: unix.cmi diff --git a/otherlibs/unix/fork.c b/otherlibs/unix/fork.c index 428137dc..74ec6294 100644 --- a/otherlibs/unix/fork.c +++ b/otherlibs/unix/fork.c @@ -14,6 +14,7 @@ /* $Id$ */ #include +#include #include "unixsupport.h" CAMLprim value unix_fork(value unit) @@ -21,5 +22,9 @@ CAMLprim value unix_fork(value unit) int ret; ret = fork(); if (ret == -1) uerror("fork", Nothing); + if (caml_debugger_in_use) + if ((caml_debugger_fork_mode && ret == 0) || + (!caml_debugger_fork_mode && ret != 0)) + caml_debugger_cleanup_fork(); return Val_int(ret); } diff --git a/otherlibs/win32graph/dllgraphics.dlib b/otherlibs/win32graph/dllgraphics.dlib deleted file mode 100644 index ab0ba91b..00000000 --- a/otherlibs/win32graph/dllgraphics.dlib +++ /dev/null @@ -1 +0,0 @@ -open.d.o draw.d.o events.d.o dib.d.o diff --git a/otherlibs/win32unix/dllunix.dlib b/otherlibs/win32unix/dllunix.dlib deleted file mode 100644 index e3ebf34e..00000000 --- a/otherlibs/win32unix/dllunix.dlib +++ /dev/null @@ -1,17 +0,0 @@ -# Files in this directory -accept.d.o bind.d.o channels.d.o close.d.o -close_on.d.o connect.d.o createprocess.d.o dup.d.o dup2.d.o errmsg.d.o -getpeername.d.o getpid.d.o getsockname.d.o gettimeofday.d.o -link.d.o listen.d.o lockf.d.o lseek.d.o nonblock.d.o -mkdir.d.o open.d.o pipe.d.o read.d.o rename.d.o -select.d.o sendrecv.d.o -shutdown.d.o sleep.d.o socket.d.o sockopt.d.o startup.d.o stat.d.o -system.d.o unixsupport.d.o windir.d.o winwait.d.o write.d.o -winlist.d.o winworker.d.o windbug.d.o - -# Files from the ../unix directory -access.d.o addrofstr.d.o chdir.d.o chmod.d.o cst2constr.d.o -cstringv.d.o envir.d.o execv.d.o execve.d.o execvp.d.o -exit.d.o getcwd.d.o gethost.d.o gethostname.d.o getproto.d.o -getserv.d.o gmtime.d.o putenv.d.o rmdir.d.o -socketaddr.d.o strofaddr.d.o time.d.o unlink.d.o utimes.d.o diff --git a/parsing/parser.mly b/parsing/parser.mly index 6232e4fd..87a56596 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -450,6 +450,8 @@ module_expr: { unclosed "(" 1 ")" 3 } | LPAREN VAL expr COLON package_type RPAREN { mkmod(Pmod_unpack($3, $5)) } + | LPAREN VAL expr COLON error + { unclosed "(" 1 ")" 5 } ; structure: structure_tail { $1 } @@ -850,8 +852,6 @@ expr: { mkexp(Pexp_letmodule($3, $4, $6)) } | LET OPEN mod_longident IN seq_expr { mkexp(Pexp_open($3, $5)) } - | mod_longident DOT LPAREN seq_expr RPAREN - { mkexp(Pexp_open($1, $4)) } | FUNCTION opt_bar match_cases { mkexp(Pexp_function("", None, List.rev $3)) } | FUN labeled_simple_pattern fun_def @@ -970,6 +970,10 @@ simple_expr: { let (t, t') = $3 in mkexp(Pexp_constraint($2, t, t')) } | simple_expr DOT label_longident { mkexp(Pexp_field($1, $3)) } + | mod_longident DOT LPAREN seq_expr RPAREN + { mkexp(Pexp_open($1, $4)) } + | mod_longident DOT LPAREN seq_expr error + { unclosed "(" 3 ")" 5 } | simple_expr DOT LPAREN seq_expr RPAREN { mkexp(Pexp_apply(ghexp(Pexp_ident(array_function "Array" "get")), ["",$1; "",$4])) } @@ -1014,6 +1018,8 @@ simple_expr: { mkexp(Pexp_send($1, $3)) } | LPAREN MODULE module_expr COLON package_type RPAREN { mkexp (Pexp_pack ($3, $5)) } + | LPAREN MODULE module_expr COLON error + { unclosed "(" 1 ")" 5 } ; simple_labeled_expr_list: labeled_simple_expr diff --git a/stdlib/.depend b/stdlib/.depend index 1c7e2a3f..0267136b 100644 --- a/stdlib/.depend +++ b/stdlib/.depend @@ -144,3 +144,105 @@ sys.cmo: sys.cmi sys.cmx: sys.cmi weak.cmo: sys.cmi obj.cmi hashtbl.cmi array.cmi weak.cmi weak.cmx: sys.cmx obj.cmx hashtbl.cmx array.cmx weak.cmi +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 +buffer.cmo: sys.cmi string.cmi buffer.cmi +buffer.p.cmx: sys.p.cmx string.p.cmx buffer.cmi +callback.cmo: obj.cmi callback.cmi +callback.p.cmx: obj.p.cmx callback.cmi +camlinternalLazy.cmo: obj.cmi camlinternalLazy.cmi +camlinternalLazy.p.cmx: obj.p.cmx camlinternalLazy.cmi +camlinternalMod.cmo: obj.cmi camlinternalOO.cmi array.cmi camlinternalMod.cmi +camlinternalMod.p.cmx: obj.p.cmx camlinternalOO.p.cmx array.p.cmx camlinternalMod.cmi +camlinternalOO.cmo: sys.cmi string.cmi obj.cmi map.cmi list.cmi char.cmi \ + array.cmi camlinternalOO.cmi +camlinternalOO.p.cmx: sys.p.cmx string.p.cmx obj.p.cmx map.p.cmx list.p.cmx char.p.cmx \ + array.p.cmx camlinternalOO.cmi +char.cmo: char.cmi +char.p.cmx: char.cmi +complex.cmo: complex.cmi +complex.p.cmx: complex.cmi +digest.cmo: string.cmi printf.cmi digest.cmi +digest.p.cmx: string.p.cmx printf.p.cmx digest.cmi +filename.cmo: sys.cmi string.cmi random.cmi printf.cmi buffer.cmi \ + filename.cmi +filename.p.cmx: sys.p.cmx string.p.cmx random.p.cmx printf.p.cmx buffer.p.cmx \ + filename.cmi +format.cmo: string.cmi printf.cmi pervasives.cmi obj.cmi list.cmi buffer.cmi \ + format.cmi +format.p.cmx: string.p.cmx printf.p.cmx pervasives.p.cmx obj.p.cmx list.p.cmx buffer.p.cmx \ + format.cmi +gc.cmo: sys.cmi printf.cmi gc.cmi +gc.p.cmx: sys.p.cmx printf.p.cmx gc.cmi +genlex.cmo: string.cmi stream.cmi list.cmi hashtbl.cmi char.cmi genlex.cmi +genlex.p.cmx: string.p.cmx stream.p.cmx list.p.cmx hashtbl.p.cmx char.p.cmx genlex.cmi +hashtbl.cmo: sys.cmi array.cmi hashtbl.cmi +hashtbl.p.cmx: sys.p.cmx array.p.cmx hashtbl.cmi +int32.cmo: pervasives.cmi int32.cmi +int32.p.cmx: pervasives.p.cmx int32.cmi +int64.cmo: pervasives.cmi int64.cmi +int64.p.cmx: pervasives.p.cmx int64.cmi +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 array.cmi lexing.cmi +lexing.p.cmx: sys.p.cmx string.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 +map.cmo: map.cmi +map.p.cmx: map.cmi +marshal.cmo: string.cmi marshal.cmi +marshal.p.cmx: string.p.cmx marshal.cmi +moreLabels.cmo: set.cmi map.cmi hashtbl.cmi moreLabels.cmi +moreLabels.p.cmx: set.p.cmx map.p.cmx hashtbl.p.cmx moreLabels.cmi +nativeint.cmo: sys.cmi pervasives.cmi nativeint.cmi +nativeint.p.cmx: sys.p.cmx pervasives.p.cmx nativeint.cmi +obj.cmo: marshal.cmi int32.cmi array.cmi obj.cmi +obj.p.cmx: marshal.p.cmx int32.p.cmx array.p.cmx obj.cmi +oo.cmo: camlinternalOO.cmi oo.cmi +oo.p.cmx: camlinternalOO.p.cmx oo.cmi +parsing.cmo: obj.cmi lexing.cmi array.cmi parsing.cmi +parsing.p.cmx: obj.p.cmx lexing.p.cmx array.p.cmx parsing.cmi +pervasives.cmo: pervasives.cmi +pervasives.p.cmx: pervasives.cmi +printexc.cmo: printf.cmi obj.cmi buffer.cmi array.cmi printexc.cmi +printexc.p.cmx: printf.p.cmx obj.p.cmx buffer.p.cmx array.p.cmx printexc.cmi +printf.cmo: string.cmi pervasives.cmi obj.cmi list.cmi char.cmi buffer.cmi \ + array.cmi printf.cmi +printf.p.cmx: string.p.cmx pervasives.p.cmx obj.p.cmx list.p.cmx char.p.cmx buffer.p.cmx \ + array.p.cmx printf.cmi +queue.cmo: obj.cmi queue.cmi +queue.p.cmx: obj.p.cmx queue.cmi +random.cmo: string.cmi pervasives.cmi nativeint.cmi int64.cmi int32.cmi \ + digest.cmi char.cmi array.cmi random.cmi +random.p.cmx: string.p.cmx pervasives.p.cmx nativeint.p.cmx int64.p.cmx int32.p.cmx \ + digest.p.cmx char.p.cmx array.p.cmx random.cmi +scanf.cmo: string.cmi printf.cmi pervasives.cmi obj.cmi list.cmi hashtbl.cmi \ + buffer.cmi array.cmi scanf.cmi +scanf.p.cmx: string.p.cmx printf.p.cmx pervasives.p.cmx obj.p.cmx list.p.cmx hashtbl.p.cmx \ + buffer.p.cmx array.p.cmx scanf.cmi +set.cmo: set.cmi +set.p.cmx: set.cmi +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 +stdLabels.cmo: stringLabels.cmi listLabels.cmi arrayLabels.cmi stdLabels.cmi +stdLabels.p.cmx: stringLabels.p.cmx listLabels.p.cmx arrayLabels.p.cmx stdLabels.cmi +std_exit.cmo: +std_exit.p.cmx: +stream.cmo: string.cmi obj.cmi list.cmi lazy.cmi stream.cmi +stream.p.cmx: string.p.cmx obj.p.cmx list.p.cmx lazy.p.cmx stream.cmi +string.cmo: pervasives.cmi list.cmi char.cmi string.cmi +string.p.cmx: pervasives.p.cmx list.p.cmx char.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 +weak.p.cmx: sys.p.cmx obj.p.cmx hashtbl.p.cmx array.p.cmx weak.cmi diff --git a/stdlib/Makefile.shared b/stdlib/Makefile.shared index a02650a6..b4f47b4b 100755 --- a/stdlib/Makefile.shared +++ b/stdlib/Makefile.shared @@ -94,3 +94,4 @@ include .depend depend: $(CAMLDEP) *.mli *.ml > .depend + $(CAMLDEP) *.ml | sed -e 's/\.cmx/.p.cmx/g' >>.depend diff --git a/stdlib/format.ml b/stdlib/format.ml index 429bf7dd..a8d6ec9e 100644 --- a/stdlib/format.ml +++ b/stdlib/format.ml @@ -817,9 +817,25 @@ let pp_get_all_formatter_output_functions state () = state.pp_output_newline, state.pp_output_spaces) ;; +(* Default function to output new lines. *) +let display_newline state () = state.pp_output_function "\n" 0 1;; + +(* Default function to output spaces. *) +let blank_line = String.make 80 ' ';; +let rec display_blanks state n = + if n > 0 then + if n <= 80 then state.pp_output_function blank_line 0 n else + begin + state.pp_output_function blank_line 0 80; + display_blanks state (n - 80) + end +;; + let pp_set_formatter_out_channel state os = state.pp_output_function <- output os; - state.pp_flush_function <- (fun () -> flush os) + state.pp_flush_function <- (fun () -> flush os); + state.pp_output_newline <- display_newline state; + state.pp_output_spaces <- display_blanks state; ;; (************************************************************** @@ -873,20 +889,6 @@ let pp_make_formatter f g h i = } ;; -(* Default function to output spaces. *) -let blank_line = String.make 80 ' ';; -let rec display_blanks state n = - if n > 0 then - if n <= 80 then state.pp_output_function blank_line 0 n else - begin - state.pp_output_function blank_line 0 80; - display_blanks state (n - 80) - end -;; - -(* Default function to output new lines. *) -let display_newline state () = state.pp_output_function "\n" 0 1;; - (* Make a formatter with default functions to output spaces and new lines. *) let make_formatter output flush = let ppf = pp_make_formatter output flush ignore ignore in @@ -1067,8 +1069,8 @@ let implode_rev s0 = function (* [mkprintf] is the printf-like function generator: given the - [to_s] flag that tells if we are printing into a string, - the [get_out] function that has to be called to get a [ppf] function to - output onto. - It generates a [kprintf] function that takes as arguments a [k] + output onto, + it generates a [kprintf] function that takes as arguments a [k] continuation function to be called at the end of formatting, and a printing format string to print the rest of the arguments according to the format string. @@ -1309,24 +1311,31 @@ let ifprintf ppf = ikfprintf ignore ppf;; let printf fmt = fprintf std_formatter fmt;; let eprintf fmt = fprintf err_formatter fmt;; +let ksprintf k = + let b = Buffer.create 512 in + let k ppf = k (string_out b ppf) in + mkprintf true (fun _ -> formatter_of_buffer b) k +;; + +let sprintf fmt = ksprintf (fun s -> s) fmt;; + +(************************************************************** + + Deprecated stuff. + + **************************************************************) + let kbprintf k b = mkprintf false (fun _ -> formatter_of_buffer b) k ;; +(* Deprecated error prone function bprintf. *) let bprintf b = let k ppf = pp_flush_queue ppf false in kbprintf k b ;; -let ksprintf k = - let b = Buffer.create 512 in - let k ppf = k (string_out b ppf) in - mkprintf true (fun _ -> formatter_of_buffer b) k -;; - -let sprintf fmt = ksprintf (fun s -> s) fmt;; - -(* Obsolete alias for ksprintf. *) +(* Deprecated alias for ksprintf. *) let kprintf = ksprintf;; at_exit print_flush diff --git a/stdlib/format.mli b/stdlib/format.mli index 2998a0b2..292f5758 100644 --- a/stdlib/format.mli +++ b/stdlib/format.mli @@ -341,12 +341,16 @@ val get_mark_tags : unit -> bool;; (** {6 Redirecting the standard formatter output} *) val set_formatter_out_channel : Pervasives.out_channel -> unit;; -(** Redirect the pretty-printer output to the given channel. *) +(** 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;; + (string -> int -> int -> unit) -> (unit -> unit) -> unit +;; (** [set_formatter_output_functions out flush] redirects the - pretty-printer output to the functions [out] and [flush]. + relevant pretty-printer output functions to the functions [out] and + [flush]. The [out] function performs the pretty-printer string output. It is called with a string [s], a start position [p], and a number of characters @@ -356,7 +360,8 @@ val set_formatter_output_functions : or using low level function [print_flush] or [print_newline]). *) val get_formatter_output_functions : - unit -> (string -> int -> int -> unit) * (unit -> unit);; + 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} *) @@ -372,6 +377,7 @@ val set_all_formatter_output_functions : newline:(unit -> unit) -> spaces:(int -> unit) -> unit +;; (** [set_all_formatter_output_functions out flush outnewline outspace] redirects the pretty-printer output to the functions [out] and [flush] as described in [set_formatter_output_functions]. In @@ -392,19 +398,21 @@ val get_all_formatter_output_functions : (string -> int -> int -> unit) * (unit -> unit) * (unit -> unit) * - (int -> unit);; + (int -> unit) +;; (** 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. *) + current setting and restore it afterwards. *) -(** {6 Changing the meaning of printing semantics tags} *) +(** {6:tags Changing the meaning of printing semantics tags} *) type formatter_tag_functions = { mark_open_tag : tag -> string; mark_close_tag : tag -> string; 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 @@ -413,7 +421,8 @@ type formatter_tag_functions = { regular printing when a tag is closed or opened. *) val set_formatter_tag_functions : - formatter_tag_functions -> unit;; + 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]. @@ -431,24 +440,29 @@ val set_formatter_tag_functions : material in the pretty-printer queue. *) val get_formatter_tag_functions : - unit -> formatter_tag_functions;; + unit -> formatter_tag_functions +;; (** Return the current tag functions of the pretty-printer. *) (** {6 Multiple formatted output} *) type formatter;; (** Abstract data corresponding to a pretty-printer (also called a - formatter) and all its machinery. Defining new pretty-printers permits the output of - material in parallel on several channels. - Parameters of a pretty-printer are local to this pretty-printer: + formatter) and all its machinery. + + Defining new pretty-printers permits unrelated output of material in + parallel on several output channels. + All the parameters of a pretty-printer are local to this pretty-printer: margin, maximum indentation limit, maximum number of boxes simultaneously opened, ellipsis, and so on, are specific to each pretty-printer and may be fixed independently. - Given an output channel [oc], a new formatter writing to - that channel is obtained by calling [formatter_of_out_channel oc]. + Given a [Pervasives.out_channel] output channel [oc], a new formatter + writing to that channel is simply obtained by calling + [formatter_of_out_channel oc]. Alternatively, the [make_formatter] function allocates a new formatter with explicit output and flushing functions - (convenient to output material to strings for instance). *) + (convenient to output material to strings for instance). +*) val formatter_of_out_channel : out_channel -> formatter;; (** [formatter_of_out_channel oc] returns a new formatter that @@ -482,11 +496,12 @@ val flush_str_formatter : unit -> string;; 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]. Hence, a formatter to the out channel [oc] - is returned by [make_formatter (output oc) (fun () -> flush oc)]. *) + (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 + [make_formatter (Pervasives.output oc) (fun () -> Pervasives.flush oc)]. *) (** {6 Basic functions to use with formatters} *) @@ -532,20 +547,26 @@ 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;; + formatter -> (string -> int -> int -> unit) -> (unit -> unit) -> unit +;; val pp_get_formatter_output_functions : - formatter -> unit -> (string -> int -> int -> unit) * (unit -> unit);; + formatter -> unit -> (string -> int -> int -> unit) * (unit -> unit) +;; val pp_set_all_formatter_output_functions : formatter -> out:(string -> int -> int -> unit) -> flush:(unit -> unit) -> - newline:(unit -> unit) -> spaces:(int -> unit) -> unit;; + newline:(unit -> unit) -> spaces:(int -> unit) -> unit +;; val pp_get_all_formatter_output_functions : formatter -> unit -> (string -> int -> int -> unit) * (unit -> unit) * (unit -> unit) * - (int -> unit);; + (int -> unit) +;; val pp_set_formatter_tag_functions : - formatter -> formatter_tag_functions -> unit;; + formatter -> formatter_tag_functions -> unit +;; val pp_get_formatter_tag_functions : - formatter -> unit -> formatter_tag_functions;; + formatter -> unit -> formatter_tag_functions +;; (** These functions are the basic ones: usual functions operating on the standard formatter are defined via partial evaluation of these primitives. For instance, @@ -554,13 +575,16 @@ val pp_get_formatter_tag_functions : (** {6 [printf] like functions for pretty-printing.} *) val fprintf : formatter -> ('a, formatter, unit) format -> 'a;; -(** [fprintf ff format arg1 ... argN] formats the arguments - [arg1] to [argN] according to the format string [format], - and outputs the resulting string on the formatter [ff]. - The format is a character string which contains three types of - objects: plain characters and conversion specifications as - specified in the [printf] module, and pretty-printing - indications. + +(** [fprintf ff fmt arg1 ... argN] formats the arguments [arg1] to [argN] + according to the format string [fmt], and outputs the resulting string on + the formatter [ff]. + + The format [fmt] is a character string which contains three types of + objects: plain characters and conversion specifications as specified in + the [Printf] module, and pretty-printing indications specific to the + [Format] module. + The pretty-printing indication characters are introduced by a [@] character, and their meanings are: - [@\[]: open a pretty-printing box. The type and offset of the @@ -621,10 +645,6 @@ val printf : ('a, formatter, unit) format -> 'a;; val eprintf : ('a, formatter, unit) format -> 'a;; (** Same as [fprintf] above, but output on [err_formatter]. *) -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. *) - 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. @@ -633,33 +653,28 @@ val sprintf : ('a, unit, string) format -> 'a;; In case of multiple and related calls to [sprintf] to output material on a single string, you should consider using [fprintf] - with a formatter writing to a buffer: flushing the buffer at the - end of pretty-printing returns the desired string. You can also use - the predefined formatter [str_formatter] and call - [flush_str_formatter ()] to get the result. *) + with the predefined formatter [str_formatter] and call + [flush_str_formatter ()] to get the final result. -val bprintf : Buffer.t -> ('a, formatter, unit) format -> 'a;; -(** Same as [sprintf] above, but instead of printing on a string, - writes into the given extensible buffer. - As for [sprintf], the pretty-printer queue is flushed at the end of each - call to [bprintf]. - - In case of multiple and related calls to [bprintf] to output - material on the same buffer [b], you should consider using - [fprintf] with a formatter writing to the buffer [b] (as obtained - by [formatter_of_buffer b]), otherwise the repeated flushes of the - pretty-printer queue would result in unexpected and badly formatted - output. *) + Alternatively, you can use [Format.fprintf] with a formatter writing to a + buffer of your own: flushing the formatter and the buffer at the end of + pretty-printing returns the desired string. *) + +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. *) (** Formatted output functions with continuations. *) val kfprintf : (formatter -> 'a) -> formatter -> - ('b, formatter, unit, 'a) format4 -> 'b;; + ('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;; + ('b, formatter, unit, 'a) format4 -> 'b +;; (** Same as [kfprintf] above, but does not print anything. Useful to ignore some material when conditionally printing. *) @@ -667,5 +682,14 @@ 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. *) +(** {6 Deprecated} *) + +val bprintf : Buffer.t -> ('a, formatter, unit) format -> 'a;; +(** Deprecated and error prone function. Do not use it. + + If you need to print to some buffer [b], you must first define a + formatter writing to [b], using [let to_b = formatter_of_buffer b]; then + use regular calls to [Format.fprintf] on formatter [to_b]. *) + val kprintf : (string -> 'a) -> ('b, unit, string, 'a) format4 -> 'b;; -(** A deprecated synonym for [ksprintf]. *) +(** Deprecated name. A synonym for [ksprintf]. *) diff --git a/stdlib/gc.ml b/stdlib/gc.ml index db98de97..6482ebb7 100644 --- a/stdlib/gc.ml +++ b/stdlib/gc.ml @@ -29,6 +29,7 @@ type stat = { fragments : int; compactions : int; top_heap_words : int; + stack_size : int; };; type control = { diff --git a/stdlib/gc.mli b/stdlib/gc.mli index 809998c5..b02b758c 100644 --- a/stdlib/gc.mli +++ b/stdlib/gc.mli @@ -70,6 +70,9 @@ type stat = top_heap_words : int; (** Maximum size reached by the major heap, in words. *) + + stack_size: int; + (** Current size of the stack, in words. *) } (** The memory management counters are returned in a [stat] record. @@ -221,7 +224,8 @@ val finalise : ('a -> unit) -> 'a -> unit The [f] function can use all features of O'Caml, including assignments that make the value reachable again. It can also loop forever (in this case, the other - finalisation functions will be called during the execution of f). + finalisation functions will not be called during the execution of f, + unless it calls [finalise_release]). It can call [finalise] on [v] or other values to register other functions or even itself. It can raise an exception; in this case the exception will interrupt whatever the program was doing when diff --git a/stdlib/lazy.mli b/stdlib/lazy.mli index f0255c22..3b85717f 100644 --- a/stdlib/lazy.mli +++ b/stdlib/lazy.mli @@ -27,6 +27,9 @@ type 'a t = 'a lazy_t;; for the [lazy] keyword. You should not use it directly. Always use [Lazy.t] instead. + Note: [Lazy.force] is not thread-safe. If you use this module in + a multi-threaded program, you will need to add some locks. + Note: if the program is compiled with the [-rectypes] option, ill-founded recursive definitions of the form [let rec x = lazy x] or [let rec x = lazy(lazy(...(lazy x)))] are accepted by the type-checker diff --git a/stdlib/printexc.ml b/stdlib/printexc.ml index 63da48c5..9e435c59 100644 --- a/stdlib/printexc.ml +++ b/stdlib/printexc.ml @@ -42,25 +42,25 @@ let fields x = | n -> sprintf "(%s%s)" (field x 1) (other_fields x 2) ;; -let to_string = function - | Out_of_memory -> "Out of memory" - | Stack_overflow -> "Stack overflow" - | Match_failure(file, line, char) -> - sprintf locfmt file line char (char+5) "Pattern matching failed" - | Assert_failure(file, line, char) -> - sprintf locfmt file line char (char+6) "Assertion failed" - | x -> - let rec conv = function - | hd :: tl -> - (match try hd x with _ -> None with - | Some s -> s - | None -> conv tl) - | [] -> +let to_string x = + let rec conv = function + | hd :: tl -> + (match try hd x with _ -> None with + | Some s -> s + | None -> conv tl) + | [] -> + match x with + | Out_of_memory -> "Out of memory" + | Stack_overflow -> "Stack overflow" + | Match_failure(file, line, char) -> + sprintf locfmt file line char (char+5) "Pattern matching failed" + | Assert_failure(file, line, char) -> + sprintf locfmt file line char (char+6) "Assertion failed" + | _ -> let x = Obj.repr x in let constructor = (Obj.magic(Obj.field (Obj.field x 0) 0) : string) in constructor ^ (fields x) in - conv !printers -;; + conv !printers let print fct arg = try diff --git a/stdlib/printexc.mli b/stdlib/printexc.mli index 99729e10..166b4988 100644 --- a/stdlib/printexc.mli +++ b/stdlib/printexc.mli @@ -15,11 +15,11 @@ (** Facilities for printing exceptions. *) -val to_string : exn -> string +val to_string: exn -> string (** [Printexc.to_string e] returns a string representation of the exception [e]. *) -val print : ('a -> 'b) -> 'a -> 'b +val print: ('a -> 'b) -> 'a -> 'b (** [Printexc.print fn x] applies [fn] to [x] and returns the result. If the evaluation of [fn x] raises any exception, the name of the exception is printed on standard error output, @@ -27,7 +27,7 @@ val print : ('a -> 'b) -> 'a -> 'b The typical use is to catch and report exceptions that escape a function application. *) -val catch : ('a -> 'b) -> 'a -> 'b +val catch: ('a -> 'b) -> 'a -> 'b (** [Printexc.catch fn x] is similar to {!Printexc.print}, but aborts the program with exit code 2 after printing the uncaught exception. This function is deprecated: the runtime @@ -58,11 +58,13 @@ val backtrace_status: unit -> bool (** [Printexc.backtrace_status()] returns [true] if exception backtraces are currently recorded, [false] if not. *) -val register_printer : (exn -> string option) -> unit -(** [Printexc.register_printer fn] registers [fn] as an exception printer. - The printer should return [None] if it does not know how to convert - the passed exception, and [Some s] with [s] the resulting string if - it can convert the passed exception. +val register_printer: (exn -> string option) -> unit +(** [Printexc.register_printer fn] registers [fn] as an exception + printer. The printer should return [None] or raise an exception + if it does not know how to convert the passed exception, and [Some + s] with [s] the resulting string if it can convert the passed + exception. Exceptions raised by the printer are ignored. + When converting an exception into a string, the printers will be invoked in the reverse order of their registrations, until a printer returns a [Some s] value (if no such printer exists, the runtime will use a diff --git a/stdlib/scanf.ml b/stdlib/scanf.ml index 1e62e4b8..3d3d16c2 100644 --- a/stdlib/scanf.ml +++ b/stdlib/scanf.ml @@ -18,379 +18,379 @@ (* Scanning buffers. *) module type SCANNING = sig -type in_channel;; - -type scanbuf = in_channel;; - -val stdin : in_channel;; -(* The scanning buffer reading from [Pervasives.stdin]. - [stdib] is equivalent to [Scanning.from_channel Pervasives.stdin]. *) - -val stdib : in_channel;; -(* An alias for [Scanf.stdin], the scanning buffer reading from - [Pervasives.stdin]. *) - -val next_char : scanbuf -> char;; -(* [Scanning.next_char ib] advance the scanning buffer for - one character. - If no more character can be read, sets a end of file condition and - returns '\000'. *) - -val invalidate_current_char : scanbuf -> unit;; -(* [Scanning.invalidate_current_char ib] mark the current_char as already - scanned. *) - -val peek_char : scanbuf -> char;; -(* [Scanning.peek_char ib] returns the current char available in - the buffer or reads one if necessary (when the current character is - already scanned). - If no character can be read, sets an end of file condition and - returns '\000'. *) - -val checked_peek_char : scanbuf -> char;; -(* Same as above but always returns a valid char or fails: - instead of returning a null char when the reading method of the - input buffer has reached an end of file, the function raises exception - [End_of_file]. *) - -val store_char : int -> scanbuf -> char -> int;; -(* [Scanning.store_char lim ib c] adds [c] to the token buffer - of the scanning buffer. It also advances the scanning buffer for one - character and returns [lim - 1], indicating the new limit - for the length of the current token. *) - -val skip_char : int -> scanbuf -> int;; -(* [Scanning.skip_char lim ib] ignores the current character. *) - -val ignore_char : int -> scanbuf -> int;; -(* [Scanning.ignore_char ib lim] ignores the current character and - decrements the limit. *) - -val token : scanbuf -> string;; -(* [Scanning.token ib] returns the string stored into the token - buffer of the scanning buffer: it returns the token matched by the - format. *) - -val reset_token : scanbuf -> unit;; -(* [Scanning.reset_token ib] resets the token buffer of - the given scanning buffer. *) - -val char_count : scanbuf -> int;; -(* [Scanning.char_count ib] returns the number of characters - read so far from the given buffer. *) - -val line_count : scanbuf -> int;; -(* [Scanning.line_count ib] returns the number of new line - characters read so far from the given buffer. *) - -val token_count : scanbuf -> int;; -(* [Scanning.token_count ib] returns the number of tokens read - so far from [ib]. *) - -val eof : scanbuf -> bool;; -(* [Scanning.eof ib] returns the end of input condition - of the given buffer. *) - -val end_of_input : scanbuf -> bool;; -(* [Scanning.end_of_input ib] tests the end of input condition - of the given buffer (if no char has ever been read, an attempt to - read one is performed). *) - -val beginning_of_input : scanbuf -> bool;; -(* [Scanning.beginning_of_input ib] tests the beginning of input - condition of the given buffer. *) - -val name_of_input : scanbuf -> string;; -(* [Scanning.name_of_input ib] returns the name of the character - source for input buffer [ib]. *) - -val open_in : string -> scanbuf;; -val open_in_bin : string -> scanbuf;; -val from_file : string -> scanbuf;; -val from_file_bin : string -> scanbuf;; -val from_string : string -> scanbuf;; -val from_function : (unit -> char) -> scanbuf;; -val from_channel : Pervasives.in_channel -> scanbuf;; - -val close_in : scanbuf -> unit;; + type in_channel;; + + type scanbuf = in_channel;; + + val stdin : in_channel;; + (* The scanning buffer reading from [Pervasives.stdin]. + [stdib] is equivalent to [Scanning.from_channel Pervasives.stdin]. *) + + val stdib : in_channel;; + (* An alias for [Scanf.stdin], the scanning buffer reading from + [Pervasives.stdin]. *) + + val next_char : scanbuf -> char;; + (* [Scanning.next_char ib] advance the scanning buffer for + one character. + If no more character can be read, sets a end of file condition and + returns '\000'. *) + + val invalidate_current_char : scanbuf -> unit;; + (* [Scanning.invalidate_current_char ib] mark the current_char as already + scanned. *) + + val peek_char : scanbuf -> char;; + (* [Scanning.peek_char ib] returns the current char available in + the buffer or reads one if necessary (when the current character is + already scanned). + If no character can be read, sets an end of file condition and + returns '\000'. *) + + val checked_peek_char : scanbuf -> char;; + (* Same as above but always returns a valid char or fails: + instead of returning a null char when the reading method of the + input buffer has reached an end of file, the function raises exception + [End_of_file]. *) + + val store_char : int -> scanbuf -> char -> int;; + (* [Scanning.store_char lim ib c] adds [c] to the token buffer + of the scanning buffer. It also advances the scanning buffer for one + character and returns [lim - 1], indicating the new limit + for the length of the current token. *) + + val skip_char : int -> scanbuf -> int;; + (* [Scanning.skip_char lim ib] ignores the current character. *) + + val ignore_char : int -> scanbuf -> int;; + (* [Scanning.ignore_char ib lim] ignores the current character and + decrements the limit. *) + + val token : scanbuf -> string;; + (* [Scanning.token ib] returns the string stored into the token + buffer of the scanning buffer: it returns the token matched by the + format. *) + + val reset_token : scanbuf -> unit;; + (* [Scanning.reset_token ib] resets the token buffer of + the given scanning buffer. *) + + val char_count : scanbuf -> int;; + (* [Scanning.char_count ib] returns the number of characters + read so far from the given buffer. *) + + val line_count : scanbuf -> int;; + (* [Scanning.line_count ib] returns the number of new line + characters read so far from the given buffer. *) + + val token_count : scanbuf -> int;; + (* [Scanning.token_count ib] returns the number of tokens read + so far from [ib]. *) + + val eof : scanbuf -> bool;; + (* [Scanning.eof ib] returns the end of input condition + of the given buffer. *) + + val end_of_input : scanbuf -> bool;; + (* [Scanning.end_of_input ib] tests the end of input condition + of the given buffer (if no char has ever been read, an attempt to + read one is performed). *) + + val beginning_of_input : scanbuf -> bool;; + (* [Scanning.beginning_of_input ib] tests the beginning of input + condition of the given buffer. *) + + val name_of_input : scanbuf -> string;; + (* [Scanning.name_of_input ib] returns the name of the character + source for input buffer [ib]. *) + + val open_in : string -> scanbuf;; + val open_in_bin : string -> scanbuf;; + val from_file : string -> scanbuf;; + val from_file_bin : string -> scanbuf;; + val from_string : string -> scanbuf;; + val from_function : (unit -> char) -> scanbuf;; + val from_channel : Pervasives.in_channel -> scanbuf;; + + val close_in : scanbuf -> unit;; end ;; module Scanning : SCANNING = struct -(* The run-time library for scanf. *) -type in_channel_name = - | From_file of string * Pervasives.in_channel - | From_string - | From_function - | From_channel of Pervasives.in_channel -;; - -type in_channel = { - mutable eof : bool; - mutable current_char : char; - mutable current_char_is_valid : bool; - mutable char_count : int; - mutable line_count : int; - mutable token_count : int; - mutable get_next_char : unit -> char; - tokbuf : Buffer.t; - input_name : in_channel_name; -} -;; - -type scanbuf = in_channel;; - -let null_char = '\000';; - -(* Reads a new character from input buffer. Next_char never fails, - even in case of end of input: it then simply sets the end of file - condition. *) -let next_char ib = - try - let c = ib.get_next_char () in - ib.current_char <- c; - ib.current_char_is_valid <- true; - ib.char_count <- succ ib.char_count; - if c = '\n' then ib.line_count <- succ ib.line_count; - c with - | End_of_file -> - let c = null_char in - ib.current_char <- c; - ib.current_char_is_valid <- false; - ib.eof <- true; + (* The run-time library for scanf. *) + type in_channel_name = + | From_file of string * Pervasives.in_channel + | From_string + | From_function + | From_channel of Pervasives.in_channel + ;; + + type in_channel = { + mutable eof : bool; + mutable current_char : char; + mutable current_char_is_valid : bool; + mutable char_count : int; + mutable line_count : int; + mutable token_count : int; + mutable get_next_char : unit -> char; + tokbuf : Buffer.t; + input_name : in_channel_name; + } + ;; + + type scanbuf = in_channel;; + + let null_char = '\000';; + + (* Reads a new character from input buffer. Next_char never fails, + even in case of end of input: it then simply sets the end of file + condition. *) + let next_char ib = + try + let c = ib.get_next_char () in + ib.current_char <- c; + ib.current_char_is_valid <- true; + ib.char_count <- succ ib.char_count; + if c = '\n' then ib.line_count <- succ ib.line_count; + c with + | End_of_file -> + let c = null_char in + ib.current_char <- c; + ib.current_char_is_valid <- false; + ib.eof <- true; + c + ;; + + let peek_char ib = + if ib.current_char_is_valid then ib.current_char else next_char ib;; + + (* Returns a valid current char for the input buffer. In particular + no irrelevant null character (as set by [next_char] in case of end + of input) is returned, since [End_of_file] is raised when + [next_char] sets the end of file condition while trying to read a + new character. *) + let checked_peek_char ib = + let c = peek_char ib in + if ib.eof then raise End_of_file; c -;; - -let peek_char ib = - if ib.current_char_is_valid then ib.current_char else next_char ib;; - -(* Returns a valid current char for the input buffer. In particular - no irrelevant null character (as set by [next_char] in case of end - of input) is returned, since [End_of_file] is raised when - [next_char] sets the end of file condition while trying to read a - new character. *) -let checked_peek_char ib = - let c = peek_char ib in - if ib.eof then raise End_of_file; - c -;; - -let end_of_input ib = - ignore (peek_char ib); - ib.eof -;; - -let eof ib = ib.eof;; - -let beginning_of_input ib = ib.char_count = 0;; -let name_of_input ib = - match ib.input_name with - | From_file (fname, _ic) -> fname - | From_string -> "unnamed character string" - | From_function -> "unnamed function" - | From_channel _ic -> "unnamed pervasives input channel" -;; - -let char_count ib = - if ib.current_char_is_valid then ib.char_count - 1 else ib.char_count -;; -let line_count ib = ib.line_count;; -let reset_token ib = Buffer.reset ib.tokbuf;; -let invalidate_current_char ib = ib.current_char_is_valid <- false;; - -let token ib = - let tokbuf = ib.tokbuf in - let tok = Buffer.contents tokbuf in - Buffer.clear tokbuf; - ib.token_count <- succ ib.token_count; - tok -;; - -let token_count ib = ib.token_count;; - -let skip_char max ib = - invalidate_current_char ib; - max -;; - -let ignore_char max ib = skip_char (max - 1) ib;; - -let store_char max ib c = - Buffer.add_char ib.tokbuf c; - ignore_char max ib -;; - -let default_token_buffer_size = 1024;; - -let create iname next = { - eof = false; - current_char = null_char; - current_char_is_valid = false; - char_count = 0; - line_count = 0; - token_count = 0; - get_next_char = next; - tokbuf = Buffer.create default_token_buffer_size; - input_name = iname; -} -;; - -let from_string s = - let i = ref 0 in - let len = String.length s in - let next () = - if !i >= len then raise End_of_file else - let c = s.[!i] in - incr i; - c in - create From_string next -;; - -let from_function = create From_function;; - -(* Scanning from an input channel. *) - -(* Position of the problem: - - We cannot prevent the scanning mechanism to use one lookahead character, - if needed by the semantics of the format string specifications (e.g. a - trailing ``skip space'' specification in the format string); in this case, - the mandatory lookahead character is indeed read from the input and not - used to return the token read. It is thus mandatory to be able to store - an unused lookahead character somewhere to get it as the first character - of the next scan. - - To circumvent this problem, all the scanning functions get a low level - input buffer argument where they store the lookahead character when - needed; additionally, the input buffer is the only source of character of - a scanner. The [scanbuf] input buffers are defined in module {!Scanning}. - - Now we understand that it is extremely important that related successive - calls to scanners indeed read from the same input buffer. In effect, if a - scanner [scan1] is reading from [ib1] and stores an unused lookahead - character [c1] into its input buffer [ib1], then another scanner [scan2] - not reading from the same buffer [ib1] will miss the character [c], - seemingly vanished in the air from the point of view of [scan2]. - - This mechanism works perfectly to read from strings, from files, and from - functions, since in those cases, allocating two buffers reading from the - same source is unnatural. - - Still, there is a difficulty in the case of scanning from an input - channel. In effect, when scanning from an input channel [ic], this channel - may not have been allocated from within this library. Hence, it may be - shared (two functions of the user's program may successively read from - [ic]). This is highly error prone since, one of the function may seek the - input channel, while the other function has still an unused lookahead - character in its input buffer. In conclusion, you should never mix direct - low level reading and high level scanning from the same input channel. - - This phenomenon of reading mess is even worse when one defines more than - one scanning buffer reading from the same input channel - [ic]. Unfortunately, we have no simple way to get rid of this problem - (unless the basic input channel API is modified to offer a ``consider this - char as unread'' procedure to keep back the unused lookahead character as - available in the input channel for further reading). - - To prevent some of the confusion the scanning buffer allocation function - is a memo function that never allocates two different scanning buffers for - the same input channel. This way, the user can naively perform successive - call to [fscanf] below, without allocating a new scanning buffer at each - invocation and hence preserving the expected semantics. - - As mentioned above, a more ambitious fix could be to change the input - channel API to allow arbitrary mixing of direct and formatted reading from - input channels. *) - -(* Perform bufferized input to improve efficiency. *) -let file_buffer_size = ref 1024;; - -(* The scanner closes the input channel at end of input. *) -let scan_close_at_end ic = close_in ic; raise End_of_file;; - -(* The scanner does not close the input channel at end of input: - it just raises [End_of_file]. *) -let scan_raise_at_end _ic = raise End_of_file;; - -let from_ic scan_close_ic iname ic = - let len = !file_buffer_size in - let buf = String.create len in - let i = ref 0 in - let lim = ref 0 in - let eof = ref false in - let next () = - if !i < !lim then begin let c = buf.[!i] in incr i; c end else - if !eof then raise End_of_file else begin - lim := input ic buf 0 len; - if !lim = 0 then begin eof := true; scan_close_ic ic end else begin - i := 1; - buf.[0] - end - end in - create iname next -;; - -let from_ic_close_at_end = from_ic scan_close_at_end;; - -(* The scanning buffer reading from [Pervasives.stdin]. - One could try to define [stdib] as a scanning buffer reading a character at a - time (no bufferization at all), but unfortunately the top-level - interaction would be wrong. - This is due to some kind of ``race condition'' when reading from [Pervasives.stdin], - since the interactive compiler and [scanf] will simultaneously read the - material they need from [Pervasives.stdin]; then, confusion will result from what should - be read by the top-level and what should be read by [scanf]. - This is even more complicated by the one character lookahead that [scanf] - is sometimes obliged to maintain: the lookahead character will be available - for the next ([scanf]) entry, seemingly coming from nowhere. - Also no [End_of_file] is raised when reading from stdin: if not enough - characters have been read, we simply ask to read more. *) -let stdin = - from_ic scan_raise_at_end - (From_file ("-", Pervasives.stdin)) Pervasives.stdin -;; - -let stdib = stdin;; - -let open_in fname = - match fname with - | "-" -> stdin - | fname -> - let ic = open_in fname in - from_ic_close_at_end (From_file (fname, ic)) ic -;; - -let open_in_bin fname = - match fname with - | "-" -> stdin - | fname -> - let ic = open_in_bin fname in - from_ic_close_at_end (From_file (fname, ic)) ic -;; - -let from_file = open_in;; -let from_file_bin = open_in_bin;; - -let memo_from_ic = - let memo = ref [] in - (fun scan_close_ic ic -> - try List.assq ic !memo with - | Not_found -> - let ib = from_ic scan_close_ic (From_channel ic) ic in - memo := (ic, ib) :: !memo; - ib) -;; - -let from_channel = memo_from_ic scan_raise_at_end;; - -let close_in ib = - match ib.input_name with - | From_file (_fname, ic) -> Pervasives.close_in ic - | From_string | From_function -> () - | From_channel ic -> Pervasives.close_in ic -;; + ;; + + let end_of_input ib = + ignore (peek_char ib); + ib.eof + ;; + + let eof ib = ib.eof;; + + let beginning_of_input ib = ib.char_count = 0;; + let name_of_input ib = + match ib.input_name with + | From_file (fname, _ic) -> fname + | From_string -> "unnamed character string" + | From_function -> "unnamed function" + | From_channel _ic -> "unnamed pervasives input channel" + ;; + + let char_count ib = + if ib.current_char_is_valid then ib.char_count - 1 else ib.char_count + ;; + let line_count ib = ib.line_count;; + let reset_token ib = Buffer.reset ib.tokbuf;; + let invalidate_current_char ib = ib.current_char_is_valid <- false;; + + let token ib = + let tokbuf = ib.tokbuf in + let tok = Buffer.contents tokbuf in + Buffer.clear tokbuf; + ib.token_count <- succ ib.token_count; + tok + ;; + + let token_count ib = ib.token_count;; + + let skip_char max ib = + invalidate_current_char ib; + max + ;; + + let ignore_char max ib = skip_char (max - 1) ib;; + + let store_char max ib c = + Buffer.add_char ib.tokbuf c; + ignore_char max ib + ;; + + let default_token_buffer_size = 1024;; + + let create iname next = { + eof = false; + current_char = null_char; + current_char_is_valid = false; + char_count = 0; + line_count = 0; + token_count = 0; + get_next_char = next; + tokbuf = Buffer.create default_token_buffer_size; + input_name = iname; + } + ;; + + let from_string s = + let i = ref 0 in + let len = String.length s in + let next () = + if !i >= len then raise End_of_file else + let c = s.[!i] in + incr i; + c in + create From_string next + ;; + + let from_function = create From_function;; + + (* Scanning from an input channel. *) + + (* Position of the problem: + + We cannot prevent the scanning mechanism to use one lookahead character, + if needed by the semantics of the format string specifications (e.g. a + trailing ``skip space'' specification in the format string); in this case, + the mandatory lookahead character is indeed read from the input and not + used to return the token read. It is thus mandatory to be able to store + an unused lookahead character somewhere to get it as the first character + of the next scan. + + To circumvent this problem, all the scanning functions get a low level + input buffer argument where they store the lookahead character when + needed; additionally, the input buffer is the only source of character of + a scanner. The [scanbuf] input buffers are defined in module {!Scanning}. + + Now we understand that it is extremely important that related successive + calls to scanners indeed read from the same input buffer. In effect, if a + scanner [scan1] is reading from [ib1] and stores an unused lookahead + character [c1] into its input buffer [ib1], then another scanner [scan2] + not reading from the same buffer [ib1] will miss the character [c], + seemingly vanished in the air from the point of view of [scan2]. + + This mechanism works perfectly to read from strings, from files, and from + functions, since in those cases, allocating two buffers reading from the + same source is unnatural. + + Still, there is a difficulty in the case of scanning from an input + channel. In effect, when scanning from an input channel [ic], this channel + may not have been allocated from within this library. Hence, it may be + shared (two functions of the user's program may successively read from + [ic]). This is highly error prone since, one of the function may seek the + input channel, while the other function has still an unused lookahead + character in its input buffer. In conclusion, you should never mix direct + low level reading and high level scanning from the same input channel. + + This phenomenon of reading mess is even worse when one defines more than + one scanning buffer reading from the same input channel + [ic]. Unfortunately, we have no simple way to get rid of this problem + (unless the basic input channel API is modified to offer a ``consider this + char as unread'' procedure to keep back the unused lookahead character as + available in the input channel for further reading). + + To prevent some of the confusion the scanning buffer allocation function + is a memo function that never allocates two different scanning buffers for + the same input channel. This way, the user can naively perform successive + call to [fscanf] below, without allocating a new scanning buffer at each + invocation and hence preserving the expected semantics. + + As mentioned above, a more ambitious fix could be to change the input + channel API to allow arbitrary mixing of direct and formatted reading from + input channels. *) + + (* Perform bufferized input to improve efficiency. *) + let file_buffer_size = ref 1024;; + + (* The scanner closes the input channel at end of input. *) + let scan_close_at_end ic = close_in ic; raise End_of_file;; + + (* The scanner does not close the input channel at end of input: + it just raises [End_of_file]. *) + let scan_raise_at_end _ic = raise End_of_file;; + + let from_ic scan_close_ic iname ic = + let len = !file_buffer_size in + let buf = String.create len in + let i = ref 0 in + let lim = ref 0 in + let eof = ref false in + let next () = + if !i < !lim then begin let c = buf.[!i] in incr i; c end else + if !eof then raise End_of_file else begin + lim := input ic buf 0 len; + if !lim = 0 then begin eof := true; scan_close_ic ic end else begin + i := 1; + buf.[0] + end + end in + create iname next + ;; + + let from_ic_close_at_end = from_ic scan_close_at_end;; + + (* The scanning buffer reading from [Pervasives.stdin]. + One could try to define [stdib] as a scanning buffer reading a character at a + time (no bufferization at all), but unfortunately the top-level + interaction would be wrong. + This is due to some kind of ``race condition'' when reading from [Pervasives.stdin], + since the interactive compiler and [scanf] will simultaneously read the + material they need from [Pervasives.stdin]; then, confusion will result from what should + be read by the top-level and what should be read by [scanf]. + This is even more complicated by the one character lookahead that [scanf] + is sometimes obliged to maintain: the lookahead character will be available + for the next ([scanf]) entry, seemingly coming from nowhere. + Also no [End_of_file] is raised when reading from stdin: if not enough + characters have been read, we simply ask to read more. *) + let stdin = + from_ic scan_raise_at_end + (From_file ("-", Pervasives.stdin)) Pervasives.stdin + ;; + + let stdib = stdin;; + + let open_in fname = + match fname with + | "-" -> stdin + | fname -> + let ic = open_in fname in + from_ic_close_at_end (From_file (fname, ic)) ic + ;; + + let open_in_bin fname = + match fname with + | "-" -> stdin + | fname -> + let ic = open_in_bin fname in + from_ic_close_at_end (From_file (fname, ic)) ic + ;; + + let from_file = open_in;; + let from_file_bin = open_in_bin;; + + let memo_from_ic = + let memo = ref [] in + (fun scan_close_ic ic -> + try List.assq ic !memo with + | Not_found -> + let ib = from_ic scan_close_ic (From_channel ic) ic in + memo := (ic, ib) :: !memo; + ib) + ;; + + let from_channel = memo_from_ic scan_raise_at_end;; + + let close_in ib = + match ib.input_name with + | From_file (_fname, ic) -> Pervasives.close_in ic + | From_string | From_function -> () + | From_channel ic -> Pervasives.close_in ic + ;; end ;; @@ -409,19 +409,47 @@ external string_to_format : exception Scan_failure of string;; let bad_input s = raise (Scan_failure s);; -let bad_input_char c = bad_input (String.make 1 c);; let bad_input_escape c = bad_input (Printf.sprintf "illegal escape character %C" c) ;; +let bad_token_length message = + bad_input + (Printf.sprintf + "scanning of %s failed: \ + the specified length was too short for token" message) +;; + +let bad_end_of_input message = + bad_input + (Printf.sprintf + "scanning of %s failed: \ + premature end of file occurred before end of token" message) +;; + +let int_max = function + | None -> max_int + | Some max -> max +;; + +let int_min = function + | None -> 0 + | Some max -> max +;; + +let float_min = function + | None -> max_int + | Some min -> min +;; + module Sformat = Printf.CamlinternalPr.Sformat;; module Tformat = Printf.CamlinternalPr.Tformat;; let bad_conversion fmt i c = invalid_arg (Printf.sprintf - "scanf: bad conversion %%%c, at char number %i \ + "scanf: bad conversion %%%C, at char number %i \ in format string ``%s''" c i (Sformat.to_string fmt)) ;; @@ -458,11 +486,17 @@ let compatible_format_type fmt1 fmt2 = (* Checking that [c] is indeed in the input, then skips it. In this case, the character c has been explicitely specified in the format as being mandatory in the input; hence we should fail with - End_of_file in case of end_of_input. - That's why we use checked_peek_char here. + End_of_file in case of end_of_input. (Remember that Scan_failure is raised + only when (we can prove by evidence) that the input does not match the + format string given. We must thus differentiate End_of_file as an error + due to lack of input, and Scan_failure which is due to provably wrong + input. I am not sure this is worth to burden: it is complex and somehow + subliminal; should be clearer to fail with Scan_failure "Not enough input + to complete scanning"!) + + That's why, waiting for a better solution, we use checked_peek_char here. We are also careful to treat "\r\n" in the input as a end of line marker: it - always matches a '\n' specification in the input format string. - *) + always matches a '\n' specification in the input format string. *) let rec check_char ib c = let ci = Scanning.checked_peek_char ib in if ci = c then Scanning.invalidate_current_char ib else begin @@ -497,7 +531,8 @@ let token_bool ib = match Scanning.token ib with | "true" -> true | "false" -> false - | s -> bad_input ("invalid boolean " ^ s);; + | s -> bad_input (Printf.sprintf "invalid boolean %S" s) +;; (* Extract an integer literal token. Since the functions Pervasives.*int*_of_string do not accept a leading +, @@ -543,14 +578,15 @@ let token_int64 conv ib = int64_of_string (token_int_literal conv ib);; (* Scanning numbers. *) -(* Digits scanning functions suppose that one character has been - checked and is available, since they return at end of file with the - currently found token selected. The digits scanning functions scan - a possibly empty sequence of digits, (hence a successful scanning - from one of those functions does not imply that the token is a - well-formed number: to get a true number, it is mandatory to check - that at least one digit is available before calling a digit - scanning function). *) +(* Digits scanning functions suppose that one character has been checked and + is available, since they return at end of file with the currently found + token selected. + + Put it in another way, the digits scanning functions scan for a possibly + empty sequence of digits, (hence, a successful scanning from one of those + functions does not imply that the token is a well-formed number: to get a + true number, it is mandatory to check that at least one valid digit is + available before calling one of the digit scanning functions). *) (* The decimal case is treated especially for optimization purposes. *) let rec scan_decimal_digits max ib = @@ -568,12 +604,14 @@ let rec scan_decimal_digits max ib = ;; let scan_decimal_digits_plus max ib = + if max = 0 then bad_token_length "decimal digits" else let c = Scanning.checked_peek_char ib in match c with | '0' .. '9' -> let max = Scanning.store_char max ib c in scan_decimal_digits max ib - | c -> bad_input_char c + | c -> + bad_input (Printf.sprintf "character %C is not a decimal digit" c) ;; let scan_digits_plus digitp max ib = @@ -592,11 +630,16 @@ let scan_digits_plus digitp max ib = scan_digits max | _ -> max in + (* Ensure we have got enough width left, + and read at list one digit. *) + if max = 0 then bad_token_length "digits" else let c = Scanning.checked_peek_char ib in + if digitp c then let max = Scanning.store_char max ib c in scan_digits max - else bad_input_char c + else + bad_input (Printf.sprintf "character %C is not a digit" c) ;; let is_binary_digit = function @@ -660,7 +703,7 @@ let scan_optionally_signed_int max ib = scan_unsigned_int max ib ;; -let scan_int_conv conv max ib = +let scan_int_conv conv max _min ib = match conv with | 'b' -> scan_binary_int max ib | 'd' -> scan_optionally_signed_decimal_int max ib @@ -703,20 +746,51 @@ let scan_int_part max ib = scan_decimal_digits max ib ;; -let scan_float max ib = +(* + For the time being we have (as found in scanf.mli): + The field width is composed of an optional integer literal + indicating the maximal width of the token to read. + Unfortunately, the type-checker let the user write an optional precision, + since this is valid for printf format strings. + + Thus, the next step for Scanf is to support a full width indication, more + or less similar to the one for printf, possibly extended to the + specification of a [max, min] range for the width of the token read for + strings. Something like the following spec for scanf.mli: + + The optional [width] is an integer indicating the maximal + width of the token read. For instance, [%6d] reads an integer, + having at most 6 characters. + + The optional [precision] is a dot [.] followed by an integer: + - in the floating point number conversions ([%f], [%e], [%g], [%F], [%E], and + [%F] conversions, the [precision] indicates the maximum number of digits + that may follow the decimal point. For instance, [%.4f] reads a [float] + with at most 4 fractional digits, + - in the string conversions ([%s], [%S], [%\[ range \]]), and in the + integer number conversions ([%i], [%d], [%u], [%x], [%o], and their + [int32], [int64], and [native_int] correspondent), the + [precision] indicates the required minimum width of the token read, + - on all other conversions, the width and precision are meaningless and + ignored (FIXME: lead to a runtime error ? type checking error ?). + +*) +let scan_float max max_frac_part ib = let max = scan_int_part max ib in - if max = 0 then max else + if max = 0 then max, max_frac_part else let c = Scanning.peek_char ib in - if Scanning.eof ib then max else + if Scanning.eof ib then max, max_frac_part else match c with | '.' -> let max = Scanning.store_char max ib c in - let max = scan_frac_part max ib in - scan_exp_part max ib - | c -> scan_exp_part max ib + let max_precision = min max max_frac_part in + let max = max - (max_precision - scan_frac_part max_precision ib) in + scan_exp_part max ib, max_frac_part + | c -> + scan_exp_part max ib, max_frac_part ;; -let scan_Float max ib = +let scan_Float max max_frac_part ib = let max = scan_optionally_signed_decimal_int max ib in if max = 0 then bad_float () else let c = Scanning.peek_char ib in @@ -724,6 +798,8 @@ let scan_Float max ib = match c with | '.' -> let max = Scanning.store_char max ib c in + let max_precision = min max max_frac_part in + let max = max - (max_precision - scan_frac_part max_precision ib) in let max = scan_frac_part max ib in scan_exp_part max ib | 'e' | 'E' -> @@ -753,6 +829,9 @@ let scan_string stp max ib = (* Scan a char: peek strictly one character in the input, whatsoever. *) let scan_char max ib = + (* The case max = 0 could not happen here, since it is tested before + calling scan_char, in the main scanning function. + if max = 0 then bad_token_length "a character" else *) Scanning.store_char max ib (Scanning.checked_peek_char ib) ;; @@ -773,9 +852,11 @@ let char_for_decimal_code c0 c1 c2 = 100 * decimal_value_of_char c0 + 10 * decimal_value_of_char c1 + decimal_value_of_char c2 in - if c < 0 || c > 255 - then bad_input (Printf.sprintf "bad char \\%c%c%c" c0 c1 c2) - else char_of_int c + if c < 0 || c > 255 then + bad_input + (Printf.sprintf + "bad character decimal encoding \\%c%c%c" c0 c1 c2) else + char_of_int c ;; (* The integer value corresponding to the facial value of a valid @@ -798,21 +879,23 @@ let char_for_hexadecimal_code c1 c2 = let c = 16 * hexadecimal_value_of_char c1 + hexadecimal_value_of_char c2 in - if c < 0 || c > 255 - then bad_input (Printf.sprintf "bad char \\%c%c" c1 c2) - else char_of_int c + if c < 0 || c > 255 then + bad_input + (Printf.sprintf "bad character hexadecimal encoding \\%c%c" c1 c2) else + char_of_int c ;; -(* Called when encountering '\\' as starter of a char. +(* Called in particular when encountering '\\' as starter of a char. Stops before the corresponding '\''. *) let check_next_char message max ib = - if max = 0 then bad_input message else + if max = 0 then bad_token_length message else let c = Scanning.peek_char ib in - if Scanning.eof ib then bad_input message else c + if Scanning.eof ib then bad_end_of_input message else + c ;; -let check_next_char_for_char = check_next_char "a char";; -let check_next_char_for_string = check_next_char "a string";; +let check_next_char_for_char = check_next_char "a Char";; +let check_next_char_for_string = check_next_char "a String";; let scan_backslash_char max ib = match check_next_char_for_char max ib with @@ -837,14 +920,15 @@ let scan_backslash_char max ib = let c1 = get_digit () in let c2 = get_digit () in Scanning.store_char (max - 2) ib (char_for_hexadecimal_code c1 c2) - | c -> bad_input_char c + | c -> + bad_input_escape c ;; (* Scan a character (a Caml token). *) let scan_Char max ib = let rec find_start max = - match check_next_char_for_char max ib with + match Scanning.checked_peek_char ib with | '\'' -> find_char (Scanning.ignore_char max ib) | c -> character_mismatch '\'' c @@ -865,7 +949,7 @@ let scan_Char max ib = let scan_String max ib = let rec find_start max = - match check_next_char_for_string max ib with + match Scanning.checked_peek_char ib with | '\"' -> find_stop (Scanning.ignore_char max ib) | c -> character_mismatch '\"' c @@ -896,14 +980,15 @@ let scan_String max ib = (* Scan a boolean (a Caml token). *) let scan_bool max ib = - if max < 4 then bad_input "a boolean" else + if max < 4 then bad_token_length "a boolean" else let c = Scanning.checked_peek_char ib in - if Scanning.eof ib then bad_input "a boolean" else let m = match c with | 't' -> 4 | 'f' -> 5 - | _ -> bad_input "a boolean" in + | c -> + bad_input + (Printf.sprintf "the character %C cannot start a boolean" c) in scan_string [] (min max m) ib ;; @@ -1154,6 +1239,14 @@ let rec skip_whites ib = end ;; +(* The global error report function for [Scanf]. *) +let scanf_bad_input ib = function + | Scan_failure s | Failure s -> + let i = Scanning.char_count ib in + bad_input (Printf.sprintf "scanf: bad input at char number %i: ``%s''" i s) + | x -> raise x +;; + let list_iter_i f l = let rec loop i = function | [] -> () @@ -1162,34 +1255,26 @@ let list_iter_i f l = loop 0 l ;; -(* The global error report function for [Scanf]. *) -let scanf_bad_input ib = function - | Scan_failure s | Failure s -> - let i = Scanning.char_count ib in - bad_input (Printf.sprintf "scanf: bad input at char number %i: %s" i s) - | x -> raise x -;; - let ascanf sc fmt = let ac = Tformat.ac_of_format fmt in - match ac.Tformat.ac_rdrs with - | 0 -> - Obj.magic (fun f -> sc fmt [||] f) - | 1 -> - Obj.magic (fun x f -> sc fmt [| Obj.repr x |] f) - | 2 -> - Obj.magic (fun x y f -> sc fmt [| Obj.repr x; Obj.repr y; |] f) - | 3 -> - Obj.magic - (fun x y z f -> sc fmt [| Obj.repr x; Obj.repr y; Obj.repr z; |] f) - | nargs -> - let rec loop i args = - if i >= nargs then - let a = Array.make nargs (Obj.repr 0) in - list_iter_i (fun i arg -> a.(nargs - i - 1) <- arg) args; - Obj.magic (fun f -> sc fmt a f) - else Obj.magic (fun x -> loop (succ i) (x :: args)) in - loop 0 [] + match ac.Tformat.ac_rdrs with + | 0 -> + Obj.magic (fun f -> sc fmt [||] f) + | 1 -> + Obj.magic (fun x f -> sc fmt [| Obj.repr x |] f) + | 2 -> + Obj.magic (fun x y f -> sc fmt [| Obj.repr x; Obj.repr y; |] f) + | 3 -> + Obj.magic + (fun x y z f -> sc fmt [| Obj.repr x; Obj.repr y; Obj.repr z; |] f) + | nargs -> + let rec loop i args = + if i >= nargs then + let a = Array.make nargs (Obj.repr 0) in + list_iter_i (fun i arg -> a.(nargs - i - 1) <- arg) args; + Obj.magic (fun f -> sc fmt a f) + else Obj.magic (fun x -> loop (succ i) (x :: args)) in + loop 0 [] ;; (* The [scan_format] main scanning function. @@ -1215,8 +1300,6 @@ let ascanf sc fmt = let scan_format ib ef fmt rv f = - let lim = Sformat.length fmt - 1 in - let limr = Array.length rv - 1 in let return v = Obj.magic v () in @@ -1226,13 +1309,13 @@ let scan_format ib ef fmt rv f = let rec scan fmt = + let lim = Sformat.length fmt - 1 in + let rec scan_fmt ir f i = if i > lim then ir, f else match Sformat.get fmt i with | ' ' -> skip_whites ib; scan_fmt ir f (succ i) - | '%' -> - if i > lim then incomplete_format fmt else - scan_conversion false max_int ir f (succ i) + | '%' -> scan_skip ir f (succ i) | '@' -> let i = succ i in if i > lim then incomplete_format fmt else begin @@ -1240,8 +1323,43 @@ let scan_format ib ef fmt rv f = scan_fmt ir f (succ i) end | c -> check_char ib c; scan_fmt ir f (succ i) - and scan_conversion skip max ir f i = + and scan_skip ir f i = + if i > lim then ir, f else + match Sformat.get fmt i with + | '_' -> scan_limits true ir f (succ i) + | _ -> scan_limits false ir f i + + and scan_limits skip ir f i = + if i > lim then ir, f else + let max_opt, min_opt, i = + match Sformat.get fmt i with + | '0' .. '9' as conv -> + let rec read_width accu i = + if i > lim then accu, i else + match Sformat.get fmt i with + | '0' .. '9' as c -> + let accu = 10 * accu + decimal_value_of_char c in + read_width accu (succ i) + | _ -> accu, i in + + let max, i = read_width (decimal_value_of_char conv) (succ i) in + + if i > lim then incomplete_format fmt else + begin + match Sformat.get fmt i with + | '.' -> + let min, i = read_width 0 (succ i) in + (Some max, Some min, i) + | _ -> Some max, None, i + end + | _ -> None, None, i in + + scan_conversion skip max_opt min_opt ir f i + + and scan_conversion skip max_opt min_opt ir f i = let stack = if skip then no_stack else stack in + let max = int_max max_opt in + let min = int_min min_opt in match Sformat.get fmt i with | '%' as conv -> check_char ib conv; scan_fmt ir f (succ i) @@ -1257,25 +1375,31 @@ let scan_format ib ef fmt rv f = let i, stp = scan_fmt_stoppers (succ i) in let _x = scan_chars_in_char_set stp char_set max ib in scan_fmt ir (stack f (token_string ib)) (succ i) - | 'c' when max = 0 -> + | ('c' | 'C') when max = 0 -> let c = Scanning.checked_peek_char ib in scan_fmt ir (stack f c) (succ i) - | 'c' | 'C' as conv -> - if max <> 1 && max <> max_int then bad_conversion fmt i conv else - let _x = - if conv = 'c' then scan_char max ib else scan_Char max ib in + | 'c' -> + let _x = scan_char max ib in + scan_fmt ir (stack f (token_char ib)) (succ i) + | 'C' -> + let _x = scan_Char max ib in scan_fmt ir (stack f (token_char ib)) (succ i) | 'd' | 'i' | 'o' | 'u' | 'x' | 'X' as conv -> - let _x = scan_int_conv conv max ib in + let _x = scan_int_conv conv max min ib in scan_fmt ir (stack f (token_int conv ib)) (succ i) | 'N' as conv -> scan_fmt ir (stack f (get_count conv ib)) (succ i) | 'f' | 'e' | 'E' | 'g' | 'G' -> - let _x = scan_float max ib in + let min = float_min min_opt in + let _x = scan_float max min ib in scan_fmt ir (stack f (token_float ib)) (succ i) | 'F' -> - let _x = scan_Float max ib in + let min = float_min min_opt in + let _x = scan_Float max min ib in scan_fmt ir (stack f (token_float ib)) (succ i) +(* | 'B' | 'b' when max = Some 0 -> + let _x = scan_bool max ib in + scan_fmt ir (stack f (token_int ib)) (succ i) *) | 'B' | 'b' -> let _x = scan_bool max ib in scan_fmt ir (stack f (token_bool ib)) (succ i) @@ -1289,7 +1413,7 @@ let scan_format ib ef fmt rv f = match Sformat.get fmt i with (* This is in fact an integer conversion (e.g. %ld, %ni, or %Lo). *) | 'd' | 'i' | 'o' | 'u' | 'x' | 'X' as conv1 -> - let _x = scan_int_conv conv1 max ib in + let _x = scan_int_conv conv1 max min ib in (* Look back to the character that triggered the integer conversion (this character is either 'l', 'n' or 'L') to find the conversion to apply to the integer token read. *) @@ -1304,24 +1428,6 @@ let scan_format ib ef fmt rv f = else bad_input "end of input not found" | ',' -> scan_fmt ir f (succ i) - | '_' -> - if i > lim then incomplete_format fmt else - scan_conversion true max ir f (succ i) - | '0' .. '9' as conv -> - let rec read_width accu i = - if i > lim then accu, i else - match Sformat.get fmt i with - | '0' .. '9' as c -> - let accu = 10 * accu + decimal_value_of_char c in - read_width accu (succ i) - | _ -> accu, i in - let max, i = read_width (decimal_value_of_char conv) (succ i) in - if i > lim then incomplete_format fmt else begin - match Sformat.get fmt i with - | '.' -> - let p, i = read_width 0 (succ i) in - scan_conversion skip (succ (max + p)) ir f i - | _ -> scan_conversion skip max ir f i end | '(' | '{' as conv (* ')' '}' *) -> let i = succ i in (* Find the static specification for the format to read. *) @@ -1338,7 +1444,7 @@ let scan_format ib ef fmt rv f = read. *) if conv = '{' (* '}' *) then scan_fmt ir (stack f rf) j else (* Or else, read according to the format string just read. *) - let ir, nf = scan (Obj.magic rf) ir (stack f rf) 0 in + let ir, nf = scan (string_to_format rf) ir (stack f rf) 0 in (* Return the format string read and the value just read, then go on with the rest of the format. *) scan_fmt ir nf j diff --git a/stdlib/scanf.mli b/stdlib/scanf.mli index 315ea166..dae3000c 100644 --- a/stdlib/scanf.mli +++ b/stdlib/scanf.mli @@ -119,6 +119,10 @@ val open_in : string -> in_channel;; val open_in_bin : string -> in_channel;; (** Bufferized file reading in binary mode. *) +val close_in : in_channel -> unit;; +(** Close the [Pervasives.input_channel] associated with the given + [Scanning.in_channel]. *) + val from_file : string -> in_channel;; (** An alias for [open_in] above. *) val from_file_bin : string -> in_channel;; @@ -241,11 +245,12 @@ val bscanf : Scanning.in_channel -> ('a, 'b, 'c, 'd) scanner;; - [d]: reads an optionally signed decimal integer. - [i]: reads an optionally signed integer - (usual input formats for hexadecimal ([0x[d]+] and [0X[d]+]), - octal ([0o[d]+]), and binary [0b[d]+] notations are understood). + (usual input conventions for decimal ([0-9]+), hexadecimal + ([0x[0-9a-f]+] and [0X[0-9A-F]+]), octal ([0o[0-7]+]), and binary + ([0b[0-1]+]) notations are understood). - [u]: reads an unsigned decimal integer. - - [x] or [X]: reads an unsigned hexadecimal integer. - - [o]: reads an unsigned octal integer. + - [x] or [X]: reads an unsigned hexadecimal integer ([[0-9a-f]+] or [[0-9A-F]+]). + - [o]: reads an unsigned octal integer ([[0-7]+]). - [s]: reads a string argument that spreads as much as possible, until the following bounding condition holds: - a whitespace has been found (see {!Scanf.space}), @@ -272,11 +277,11 @@ val bscanf : Scanning.in_channel -> ('a, 'b, 'c, 'd) scanner;; - [b]: reads a boolean argument (for backward compatibility; do not use in new programs). - [ld], [li], [lu], [lx], [lX], [lo]: reads an [int32] argument to - the format specified by the second letter (decimal, hexadecimal, etc). + the format specified by the second letter for regular integers. - [nd], [ni], [nu], [nx], [nX], [no]: reads a [nativeint] argument to - the format specified by the second letter. + the format specified by the second letter for regular integers. - [Ld], [Li], [Lu], [Lx], [LX], [Lo]: reads an [int64] argument to - the format specified by the second letter. + the format specified by the second letter for regular integers. - [\[ range \]]: reads characters that matches one of the characters mentioned in the range of characters [range] (or not mentioned in it, if the range starts with [^]). Reads a [string] that can be @@ -296,16 +301,24 @@ val bscanf : Scanning.in_channel -> ('a, 'b, 'c, 'd) scanner;; - [\{ fmt %\}]: reads a format string argument. The format string read must have the same type as the format string specification [fmt]. - For instance, ["%\{%i%\}"] reads any format string that can read a value of - type [int]; hence [Scanf.sscanf "fmt:\\\"number is %u\\\"" "fmt:%\{%i%\}"] + For instance, ["%{ %i %}"] reads any format string that can read a value of + type [int]; hence [Scanf.sscanf "fmt:\"number is %u\"" "fmt:%{%i%}"] succeeds and returns the format string ["number is %u"]. - [\( fmt %\)]: scanning format substitution. - Reads a format string to replace [fmt]. + Reads a format string to read with it instead of [fmt]. The format string read must have the same type as the format string - specification [fmt]. - For instance, ["%\( %i% \)"] reads any format string that can read a value - of type [int]; hence [Scanf.sscanf "\\\"%4d\\\"1234.00" "%\(%i%\)"] - is equivalent to [Scanf.sscanf "1234.00" "%4d"]. + specification [fmt] that is replaces. + For instance, ["%( %i %)"] reads any format string that can read a value + of type [int]. + Returns the format string read, and the value read using the format + string read. + Hence, [Scanf.sscanf "\"%4d\"1234.00" "%(%i%)" + (fun fmt i -> fmt, i)] evaluates to [("%4d", 1234)]. + If the special flag [_] is used, the conversion discards the + format string read and only returns the value read with the format + string read. + Hence, [Scanf.sscanf "\"%4d\"1234.00" "%_(%i%)"] is simply + equivalent to [Scanf.sscanf "1234.00" "%4d"]. - [l]: returns the number of lines read so far. - [n]: returns the number of characters read so far. - [N] or [L]: returns the number of tokens read so far. @@ -329,7 +342,7 @@ val bscanf : Scanning.in_channel -> ('a, 'b, 'c, 'd) scanner;; Notes: - as mentioned above, a [%s] conversion always succeeds, even if there is - nothing to read in the input: it simply returns [""]. + nothing to read in the input: in this case, it simply returns [""]. - in addition to the relevant digits, ['_'] characters may appear inside numbers (this is reminiscent to the usual Caml lexical diff --git a/testsuite/Makefile b/testsuite/Makefile index a9e4b6c6..10425ca5 100644 --- a/testsuite/Makefile +++ b/testsuite/Makefile @@ -1,6 +1,7 @@ # $Id$ BASEDIR=${PWD} +NO_PRINT=`($(MAKE) empty --no-print-directory > /dev/null 2>&1) && echo '--no-print-directory' || echo ''` default: @echo "Available targets:" @@ -13,7 +14,7 @@ default: all: @for dir in tests/*; do \ - $(MAKE) one DIR=$$dir; \ + $(MAKE) $(NO_PRINT) one DIR=$$dir; \ done 2>&1 | tee _log @$(MAKE) report @@ -21,7 +22,7 @@ list: @if [ -z $(FILE) ]; then echo "No value set for variable 'FILE'."; exit 1; fi @if [ ! -f $(FILE) ]; then echo "File '$(FILE)' does not exist."; exit 1; fi @while read LINE; do \ - $(MAKE) one DIR=$$LINE; \ + $(MAKE) $(NO_PRINT) one DIR=$$LINE; \ done < $(FILE) 2>&1 | tee _log @$(MAKE) report @@ -56,4 +57,6 @@ report: FORCE @echo ' ' `grep '^Error' _log | wc -l` 'compilation error(s)' @echo ' ' `grep '^Warning' _log | wc -l` 'compilation warning(s)' +empty: FORCE + FORCE: diff --git a/testsuite/interactive/lib-graph-2/Makefile b/testsuite/interactive/lib-graph-2/Makefile index 354953bf..6ede5e50 100644 --- a/testsuite/interactive/lib-graph-2/Makefile +++ b/testsuite/interactive/lib-graph-2/Makefile @@ -1,6 +1,6 @@ -MODULES= +#MODULES= MAIN_MODULE=graph_test -ADD_COMPFLAGS= +#ADD_COMPFLAGS= LIBRARIES=graphics include ../../makefiles/Makefile.one diff --git a/testsuite/interactive/lib-graph-3/Makefile b/testsuite/interactive/lib-graph-3/Makefile index 295f4789..a37aa33d 100644 --- a/testsuite/interactive/lib-graph-3/Makefile +++ b/testsuite/interactive/lib-graph-3/Makefile @@ -1,4 +1,4 @@ -MODULES= +#MODULES= MAIN_MODULE=sorts ADD_COMPFLAGS=-thread LIBRARIES=unix threads graphics diff --git a/testsuite/interactive/lib-graph/Makefile b/testsuite/interactive/lib-graph/Makefile index de2c9e86..be825658 100644 --- a/testsuite/interactive/lib-graph/Makefile +++ b/testsuite/interactive/lib-graph/Makefile @@ -1,6 +1,6 @@ -MODULES= +#MODULES= MAIN_MODULE=graph_example -ADD_COMPFLAGS= +#ADD_COMPFLAGS= LIBRARIES=graphics include ../../makefiles/Makefile.one diff --git a/testsuite/makefiles/Makefile.common b/testsuite/makefiles/Makefile.common index 1ee9bc8e..a1abd1aa 100644 --- a/testsuite/makefiles/Makefile.common +++ b/testsuite/makefiles/Makefile.common @@ -15,9 +15,9 @@ OCAMLMKLIB=$(OCAMLRUN) $(TOPDIR)/tools/ocamlmklib$(EXE) OCAMLYACC=$(TOPDIR)/yacc/ocamlyacc$(EXE) OCAMLBUILD=$(TOPDIR)/_build/ocamlbuild/ocamlbuild.native DUMPOBJ=$(OCAMLRUN) $(TOPDIR)/tool/dumpobj$(EXE) -COMPFLAGS= -FORTRAN_COMPILER=/sw/bin/gcc -FORTRAN_LIBRARY=/sw/lib/gcc4.3/lib/libgfortran.a +#COMPFLAGS= +#FORTRAN_COMPILER= +#FORTRAN_LIBRARY= defaultclean: @rm -f *.cmo *.cmi *.cmx *.cma *.cmxa *.cmxs *.$(O) *.$(SO) *.$(A) diff --git a/testsuite/makefiles/Makefile.one b/testsuite/makefiles/Makefile.one index 081b3691..4921d7df 100644 --- a/testsuite/makefiles/Makefile.one +++ b/testsuite/makefiles/Makefile.one @@ -1,18 +1,22 @@ # $Id$ -CMI_FILES=$(patsubst %,%.cmi,$(MODULES)) -CMO_FILES=$(patsubst %,%.cmo,$(MODULES)) -CMX_FILES=$(patsubst %,%.cmx,$(MODULES)) -CMA_FILES=$(patsubst %,%.cma,$(LIBRARIES)) -CMXA_FILES=$(patsubst %,%.cmxa,$(LIBRARIES)) -ML_FILES=$(patsubst %,%.ml,$(LEX_MODULES) $(YACC_MODULES)) -O_FILES=$(patsubst %,%.$(O),$(C_FILES)) +CMI_FILES=$(MODULES:=.cmi) +CMO_FILES=$(MODULES:=.cmo) +CMX_FILES=$(MODULES:=.cmx) +CMA_FILES=$(LIBRARIES:=.cma) +CMXA_FILES=$(LIBRARIES:=.cmxa) +ML_LEX_FILES=$(LEX_MODULES:=.ml) +ML_YACC_FILES=$(YACC_MODULES:=.ml) +MLI_YACC_FILES=$(YACC_MODULES:=.mli) +ML_FILES=$(ML_LEX_FILES) $(ML_YACC_FILES) +O_FILES=$(C_FILES:=.o) +ADD_CMO_FILES=$(ADD_MODULES:=.cmo) +ADD_CMX_FILES=$(ADD_MODULES:=.cmx) -GENERATED_SOURCES=$(patsubst %,%.ml,$(LEX_MODULES)) $(patsubst %,%.ml,$(YACC_MODULES)) $(patsubst %,%.mli,$(YACC_MODULES)) +GENERATED_SOURCES=$(ML_LEX_FILES) $(ML_YACC_FILES) $(MLI_YACC_FILES) -ifdef C_FILES -ADD_CFLAGS+=-custom -endif +CUSTOM_FLAG=`if [ -z "$(C_FILES)" ]; then true; else echo '-custom'; fi` +ADD_CFLAGS+=$(CUSTOM_FLAG) default: compile run @@ -20,8 +24,8 @@ compile: $(ML_FILES) $(CMO_FILES) $(CMX_FILES) $(MAIN_MODULE).cmo $(MAIN_MODULE) @for file in $(C_FILES); do \ $(NATIVECC) $(NATIVECCCOMPOPTS) -c -I$(TOPDIR)/byterun $$file.c; \ done; - @$(OCAMLC) $(ADD_COMPFLAGS) $(ADD_CFLAGS) -o program.byte $(O_FILES) $(CMA_FILES) $(CMO_FILES) $(patsubst %,%.cmo,$(ADD_MODULES)) $(MAIN_MODULE).cmo - @$(OCAMLOPT) $(ADD_COMPFLAGS) -o program.native $(O_FILES) $(CMXA_FILES) $(CMX_FILES) $(patsubst %,%.cmx,$(ADD_MODULES)) $(MAIN_MODULE).cmx + @$(OCAMLC) $(ADD_COMPFLAGS) $(ADD_CFLAGS) -o program.byte $(O_FILES) $(CMA_FILES) $(CMO_FILES) $(ADD_CMO_FILES) $(MAIN_MODULE).cmo + @$(OCAMLOPT) $(ADD_COMPFLAGS) -o program.native $(O_FILES) $(CMXA_FILES) $(CMX_FILES) $(ADD_CMX_FILES) $(MAIN_MODULE).cmx run: @printf " ... testing with ocamlc" diff --git a/testsuite/makefiles/Makefile.several b/testsuite/makefiles/Makefile.several index 2e298226..09925132 100644 --- a/testsuite/makefiles/Makefile.several +++ b/testsuite/makefiles/Makefile.several @@ -2,18 +2,20 @@ CC=$(NATIVECC) $(NATIVECCCOMPOPTS) FC=$(FORTAN_COMPILER) -CMO_FILES=$(patsubst %,%.cmo,$(MODULES)) -CMX_FILES=$(patsubst %,%.cmx,$(MODULES)) -CMA_FILES=$(patsubst %,%.cma,$(LIBRARIES)) -CMXA_FILES=$(patsubst %,%.cmxa,$(LIBRARIES)) -O_FILES=$(patsubst %,%.$(O),$(C_FILES) $(F_FILES)) -ifdef C_FILES -ADD_CFLAGS+=-custom -endif -ifdef F_FILES -ADD_CFLAGS+=$(FORTRAN_LIBRARY) -ADD_OPTFLAGS+=$(FORTRAN_LIBRARY) -endif +CMO_FILES=$(MODULES:=.cmo) +CMX_FILES=$(MODULES:=.cmx) +CMA_FILES=$(LIBRARIES:=.cma) +CMXA_FILES=$(LIBRARIES:=.cmxa) +O_FILES=$(C_FILES:=.o) + +CUSTOM_FLAG=`if [ -z "$(C_FILES)" ]; then true; else echo '-custom'; fi` +ADD_CFLAGS+=$(CUSTOM_FLAG) +FORTRAN_LIB=`if [ -z "$(F_FILES)" ]; then true; else echo '$(FORTRAN_LIBRARY)'; fi` +ADD_CFLAGS+=$(FORTRAN_LIB) +ADD_OPTFLAGS+=$(FORTRAN_LIB) + +check: + @if [ -n "$(FORTRAN_COMPILER)" -o -z "$(F_FILES)" ]; then $(MAKE) run-all; fi run-all: @for file in $(C_FILES); do \ diff --git a/testsuite/tests/asmcomp/Makefile b/testsuite/tests/asmcomp/Makefile index c81a55c0..583680de 100644 --- a/testsuite/tests/asmcomp/Makefile +++ b/testsuite/tests/asmcomp/Makefile @@ -96,7 +96,7 @@ ADD_COMPFLAGS=$(INCLUDES) -g default: arch codegen tests -codegen: parsecmm.ml lexcmm.ml $(patsubst %.cmo,%.cmi,$(OBJS)) $(OBJS) main.cmo +codegen: parsecmm.ml lexcmm.ml $(OBJS:.cmo=.cmi) $(OBJS) main.cmo @$(OCAMLC) $(LINKFLAGS) -o codegen $(OTHEROBJS) $(OBJS) main.cmo parsecmm.mli parsecmm.ml: parsecmm.mly @@ -120,7 +120,7 @@ ARGS_tagged-integr=-DINT_FLOAT -DFUN=test main.c ARGS_tagged-quicksort=-DSORT -DFUN=quicksort main.c ARGS_tagged-tak=-DUNIT_INT -DFUN=takmain main.c -tests: $(patsubst %,%.o,$(CASES)) +tests: $(CASES:=.o) @for c in $(CASES); do \ printf " ... testing '$$c':"; \ $(MAKE) one CC="$(CC) $(CFLAGS)" NAME=$$c; \ @@ -133,7 +133,7 @@ one: clean: defaultclean @rm -f ./codegen *.out @rm -f parsecmm.ml parsecmm.mli lexcmm.ml - @rm -f $(patsubst %,%.s,$(CASES)) + @rm -f $(CASES:=.s) power.o: power-$(SYSTEM).o @cp power-$(SYSTEM).o power.o diff --git a/testsuite/tests/asmcomp/amd64.S b/testsuite/tests/asmcomp/amd64.S index e40fecf7..bb2dc2b0 100644 --- a/testsuite/tests/asmcomp/amd64.S +++ b/testsuite/tests/asmcomp/amd64.S @@ -18,9 +18,21 @@ #define ALIGN 16 #endif - .globl _call_gen_code +#ifdef SYS_macosx +#define CALL_GEN_CODE _call_gen_code +#define CAML_C_CALL _caml_c_call +#define CAML_NEGF_MASK _caml_negf_mask +#define CAML_ABSF_MASK _caml_absf_mask +#else +#define CALL_GEN_CODE call_gen_code +#define CAML_C_CALL caml_c_call +#define CAML_NEGF_MASK caml_negf_mask +#define CAML_ABSF_MASK caml_absf_mask +#endif + + .globl CALL_GEN_CODE .align ALIGN -_call_gen_code: +CALL_GEN_CODE: pushq %rbx pushq %rbp pushq %r12 @@ -41,9 +53,9 @@ _call_gen_code: popq %rbx ret - .globl caml_c_call + .globl CAML_C_CALL .align ALIGN -caml_c_call: +CAML_C_CALL: jmp *%rax #ifdef SYS_macosx @@ -51,13 +63,13 @@ caml_c_call: #else .section .rodata.cst8,"aM",@progbits,8 #endif - .globl _caml_negf_mask + .globl CAML_NEGF_MASK .align ALIGN -_caml_negf_mask: +CAML_NEGF_MASK: .quad 0x8000000000000000, 0 - .globl _caml_absf_mask + .globl CAML_ABSF_MASK .align ALIGN -_caml_absf_mask: +CAML_ABSF_MASK: .quad 0x7FFFFFFFFFFFFFFF, 0 .comm young_limit, 8 diff --git a/testsuite/tests/basic-io-2/Makefile b/testsuite/tests/basic-io-2/Makefile index 74b861e7..9a7d2ba0 100644 --- a/testsuite/tests/basic-io-2/Makefile +++ b/testsuite/tests/basic-io-2/Makefile @@ -1,4 +1,4 @@ -MODULES= +#MODULES= MAIN_MODULE=io EXEC_ARGS=io.ml diff --git a/testsuite/tests/basic-io/Makefile b/testsuite/tests/basic-io/Makefile index 9d645bed..b0edfabb 100644 --- a/testsuite/tests/basic-io/Makefile +++ b/testsuite/tests/basic-io/Makefile @@ -1,4 +1,4 @@ -MODULES= +#MODULES= MAIN_MODULE=wc EXEC_ARGS=wc.ml diff --git a/testsuite/tests/basic-manyargs/Makefile b/testsuite/tests/basic-manyargs/Makefile index 47674589..ef8a4f54 100644 --- a/testsuite/tests/basic-manyargs/Makefile +++ b/testsuite/tests/basic-manyargs/Makefile @@ -1,4 +1,4 @@ -MODULES= +#MODULES= MAIN_MODULE=manyargs C_FILES=manyargsprim diff --git a/testsuite/tests/basic/equality.ml b/testsuite/tests/basic/equality.ml index 133a3fe1..f69120c9 100644 --- a/testsuite/tests/basic/equality.ml +++ b/testsuite/tests/basic/equality.ml @@ -76,5 +76,30 @@ let _ = test 40 eqftffff (cmpgen nan 0.0); test 41 eqftffff (cmpfloat nan nan); test 42 eqftffff (cmpfloat nan 0.0); - test 43 eqtrue ([||] = [||]) + test 43 eqtrue ([||] = [||]); + (* Convoluted forms to test both the "positive" and "negative" cases + of float tests *) + let cmpfloatpos (x:float) (y:float) = + ((let r = ref false in (if x = y then r := true); !r), + (let r = ref false in (if x <> y then r := true); !r), + (let r = ref false in (if x < y then r := true); !r), + (let r = ref false in (if x <= y then r := true); !r), + (let r = ref false in (if x > y then r := true); !r), + (let r = ref false in (if x >= y then r := true); !r)) + and cmpfloatneg (x:float) (y:float) = + ((let r = ref true in (if not (x = y) then r := false); !r), + (let r = ref true in (if not (x <> y) then r := false); !r), + (let r = ref true in (if not (x < y) then r := false); !r), + (let r = ref true in (if not (x <= y) then r := false); !r), + (let r = ref true in (if not (x > y) then r := false); !r), + (let r = ref true in (if not (x >= y) then r := false); !r)) in + let testcmpfloat x y = + cmpfloatpos x y = cmpgen x y && + cmpfloatneg x y = cmpgen x y in + test 50 eqtrue (testcmpfloat nan nan); + test 51 eqtrue (testcmpfloat nan 0.0); + test 52 eqtrue (testcmpfloat 0.0 nan); + test 53 eqtrue (testcmpfloat 0.0 0.0); + test 54 eqtrue (testcmpfloat 1.0 0.0); + test 55 eqtrue (testcmpfloat 0.0 1.0) diff --git a/testsuite/tests/basic/equality.reference b/testsuite/tests/basic/equality.reference index 1d5f1401..6070a6b0 100644 --- a/testsuite/tests/basic/equality.reference +++ b/testsuite/tests/basic/equality.reference @@ -41,3 +41,9 @@ Test 40 passed. Test 41 passed. Test 42 passed. Test 43 passed. +Test 50 passed. +Test 51 passed. +Test 52 passed. +Test 53 passed. +Test 54 passed. +Test 55 passed. diff --git a/testsuite/tests/basic/patmatch.ml b/testsuite/tests/basic/patmatch.ml index 3101f333..1cc37c1c 100644 --- a/testsuite/tests/basic/patmatch.ml +++ b/testsuite/tests/basic/patmatch.ml @@ -51,6 +51,35 @@ let l = function open Printf +external string_create: int -> string = "caml_create_string" +external unsafe_chr: int -> char = "%identity" +external string_unsafe_set : string -> int -> char -> unit + = "%string_unsafe_set" + +(* The following function is roughly equivalent to Char.escaped, + except that it is locale-independent. *) +let escaped = function + | '\'' -> "\\'" + | '\\' -> "\\\\" + | '\n' -> "\\n" + | '\t' -> "\\t" + | '\r' -> "\\r" + | '\b' -> "\\b" + | c -> + if ((k c) <> "othr") && ((Char.code c) <= 191) then begin + let s = string_create 1 in + string_unsafe_set s 0 c; + s + end else begin + let n = Char.code c in + let s = string_create 4 in + string_unsafe_set s 0 '\\'; + string_unsafe_set s 1 (unsafe_chr (48 + n / 100)); + string_unsafe_set s 2 (unsafe_chr (48 + (n / 10) mod 10)); + string_unsafe_set s 3 (unsafe_chr (48 + n mod 10)); + s + end + let _ = for i = -5 to 10 do printf "f(%d) = %d\n" i (f i) done; List.iter (fun i -> printf "g(%d) = %d\n" i (g i)) @@ -62,7 +91,7 @@ let _ = done; for i = 0 to 255 do let c = Char.chr i in - printf "k(%s) = %s\t" (Char.escaped c) (k c) + printf "k(%s) = %s\t" (escaped c) (k c) done; printf "\n"; printf "p([|\"hello\"|]) = %s\n" (p [|"hello"|]); diff --git a/testsuite/tests/basic/patmatch.reference b/testsuite/tests/basic/patmatch.reference index 7a35b130..eb7dc978 100644 --- a/testsuite/tests/basic/patmatch.reference +++ b/testsuite/tests/basic/patmatch.reference @@ -57,7 +57,7 @@ h({) = ? h(|) = ? h(}) = ? h(~) = ? -k(\000) = othr k(\001) = othr k(\002) = othr k(\003) = othr k(\004) = othr k(\005) = othr k(\006) = othr k(\007) = othr k(\b) = othr k(\t) = blk k(\n) = blk k(\011) = othr k(\012) = othr k(\r) = blk k(\014) = othr k(\015) = othr k(\016) = othr k(\017) = othr k(\018) = othr k(\019) = othr k(\020) = othr k(\021) = othr k(\022) = othr k(\023) = othr k(\024) = othr k(\025) = othr k(\026) = othr k(\027) = othr k(\028) = othr k(\029) = othr k(\030) = othr k(\031) = othr k( ) = blk k(!) = oper k(") = othr k(#) = oper k($) = oper k(%) = oper k(&) = oper k(\') = othr k(() = othr k()) = othr k(*) = oper k(+) = oper k(,) = othr k(-) = othr k(.) = othr k(/) = oper k(0) = dig k(1) = dig k(2) = dig k(3) = dig k(4) = dig k(5) = dig k(6) = dig k(7) = dig k(8) = dig k(9) = dig k(:) = oper k(;) = othr k(<) = oper k(=) = oper k(>) = oper k(?) = oper k(@) = oper k(A) = letr k(B) = letr k(C) = letr k(D) = letr k(E) = letr k(F) = letr k(G) = letr k(H) = letr k(I) = letr k(J) = letr k(K) = letr k(L) = letr k(M) = letr k(N) = letr k(O) = letr k(P) = letr k(Q) = letr k(R) = letr k(S) = letr k(T) = letr k(U) = letr k(V) = letr k(W) = letr k(X) = letr k(Y) = letr k(Z) = letr k([) = othr k(\\) = oper k(]) = othr k(^) = oper k(_) = othr k(`) = othr k(a) = letr k(b) = letr k(c) = letr k(d) = letr k(e) = letr k(f) = letr k(g) = letr k(h) = letr k(i) = letr k(j) = letr k(k) = letr k(l) = letr k(m) = letr k(n) = letr k(o) = letr k(p) = letr k(q) = letr k(r) = letr k(s) = letr k(t) = letr k(u) = letr k(v) = letr k(w) = letr k(x) = letr k(y) = letr k(z) = letr k({) = othr k(|) = oper k(}) = othr k(~) = oper k(\127) = othr k(\128) = othr k(\129) = othr k(\130) = othr k(\131) = othr k(\132) = othr k(\133) = othr k(\134) = othr k(\135) = othr k(\136) = othr k(\137) = othr k(\138) = othr k(\139) = othr k(\140) = othr k(\141) = othr k(\142) = othr k(\143) = othr k(\144) = othr k(\145) = othr k(\146) = othr k(\147) = othr k(\148) = othr k(\149) = othr k(\150) = othr k(\151) = othr k(\152) = othr k(\153) = othr k(\154) = othr k(\155) = othr k(\156) = othr k(\157) = othr k(\158) = othr k(\159) = othr k( ) = othr k(¡) = othr k(¢) = othr k(£) = othr k(¤) = othr k(¥) = othr k(¦) = othr k(§) = othr k(¨) = othr k(©) = othr k(ª) = othr k(«) = othr k(¬) = othr k(­) = othr k(®) = othr k(¯) = othr k(°) = othr k(±) = othr k(²) = othr k(³) = othr k(´) = othr k(µ) = othr k(¶) = othr k(·) = othr k(¸) = othr k(¹) = othr k(º) = othr k(») = othr k(¼) = othr k(½) = othr k(¾) = othr k(¿) = othr k(À) = letr k(Á) = letr k(Â) = letr k(Ã) = letr k(Ä) = letr k(Å) = letr k(Æ) = letr k(Ç) = letr k(È) = letr k(É) = letr k(Ê) = letr k(Ë) = letr k(Ì) = letr k(Í) = letr k(Î) = letr k(Ï) = letr k(Ð) = letr k(Ñ) = letr k(Ò) = letr k(Ó) = letr k(Ô) = letr k(Õ) = letr k(Ö) = letr k(×) = letr k(Ø) = letr k(Ù) = letr k(Ú) = letr k(Û) = letr k(Ü) = letr k(Ý) = letr k(Þ) = letr k(ß) = letr k(à) = letr k(á) = letr k(â) = letr k(ã) = letr k(ä) = letr k(å) = letr k(æ) = letr k(ç) = letr k(è) = letr k(é) = letr k(ê) = letr k(ë) = letr k(ì) = letr k(í) = letr k(î) = letr k(ï) = letr k(ð) = letr k(ñ) = letr k(ò) = letr k(ó) = letr k(ô) = letr k(õ) = letr k(ö) = letr k(÷) = letr k(ø) = letr k(ù) = letr k(ú) = letr k(û) = letr k(ü) = letr k(ý) = letr k(þ) = letr k(ÿ) = letr +k(\000) = othr k(\001) = othr k(\002) = othr k(\003) = othr k(\004) = othr k(\005) = othr k(\006) = othr k(\007) = othr k(\b) = othr k(\t) = blk k(\n) = blk k(\011) = othr k(\012) = othr k(\r) = blk k(\014) = othr k(\015) = othr k(\016) = othr k(\017) = othr k(\018) = othr k(\019) = othr k(\020) = othr k(\021) = othr k(\022) = othr k(\023) = othr k(\024) = othr k(\025) = othr k(\026) = othr k(\027) = othr k(\028) = othr k(\029) = othr k(\030) = othr k(\031) = othr k( ) = blk k(!) = oper k(\034) = othr k(#) = oper k($) = oper k(%) = oper k(&) = oper k(\') = othr k(\040) = othr k(\041) = othr k(*) = oper k(+) = oper k(\044) = othr k(\045) = othr k(\046) = othr k(/) = oper k(0) = dig k(1) = dig k(2) = dig k(3) = dig k(4) = dig k(5) = dig k(6) = dig k(7) = dig k(8) = dig k(9) = dig k(:) = oper k(\059) = othr k(<) = oper k(=) = oper k(>) = oper k(?) = oper k(@) = oper k(A) = letr k(B) = letr k(C) = letr k(D) = letr k(E) = letr k(F) = letr k(G) = letr k(H) = letr k(I) = letr k(J) = letr k(K) = letr k(L) = letr k(M) = letr k(N) = letr k(O) = letr k(P) = letr k(Q) = letr k(R) = letr k(S) = letr k(T) = letr k(U) = letr k(V) = letr k(W) = letr k(X) = letr k(Y) = letr k(Z) = letr k(\091) = othr k(\\) = oper k(\093) = othr k(^) = oper k(\095) = othr k(\096) = othr k(a) = letr k(b) = letr k(c) = letr k(d) = letr k(e) = letr k(f) = letr k(g) = letr k(h) = letr k(i) = letr k(j) = letr k(k) = letr k(l) = letr k(m) = letr k(n) = letr k(o) = letr k(p) = letr k(q) = letr k(r) = letr k(s) = letr k(t) = letr k(u) = letr k(v) = letr k(w) = letr k(x) = letr k(y) = letr k(z) = letr k(\123) = othr k(|) = oper k(\125) = othr k(~) = oper k(\127) = othr k(\128) = othr k(\129) = othr k(\130) = othr k(\131) = othr k(\132) = othr k(\133) = othr k(\134) = othr k(\135) = othr k(\136) = othr k(\137) = othr k(\138) = othr k(\139) = othr k(\140) = othr k(\141) = othr k(\142) = othr k(\143) = othr k(\144) = othr k(\145) = othr k(\146) = othr k(\147) = othr k(\148) = othr k(\149) = othr k(\150) = othr k(\151) = othr k(\152) = othr k(\153) = othr k(\154) = othr k(\155) = othr k(\156) = othr k(\157) = othr k(\158) = othr k(\159) = othr k(\160) = othr k(\161) = othr k(\162) = othr k(\163) = othr k(\164) = othr k(\165) = othr k(\166) = othr k(\167) = othr k(\168) = othr k(\169) = othr k(\170) = othr k(\171) = othr k(\172) = othr k(\173) = othr k(\174) = othr k(\175) = othr k(\176) = othr k(\177) = othr k(\178) = othr k(\179) = othr k(\180) = othr k(\181) = othr k(\182) = othr k(\183) = othr k(\184) = othr k(\185) = othr k(\186) = othr k(\187) = othr k(\188) = othr k(\189) = othr k(\190) = othr k(\191) = othr k(\192) = letr k(\193) = letr k(\194) = letr k(\195) = letr k(\196) = letr k(\197) = letr k(\198) = letr k(\199) = letr k(\200) = letr k(\201) = letr k(\202) = letr k(\203) = letr k(\204) = letr k(\205) = letr k(\206) = letr k(\207) = letr k(\208) = letr k(\209) = letr k(\210) = letr k(\211) = letr k(\212) = letr k(\213) = letr k(\214) = letr k(\215) = letr k(\216) = letr k(\217) = letr k(\218) = letr k(\219) = letr k(\220) = letr k(\221) = letr k(\222) = letr k(\223) = letr k(\224) = letr k(\225) = letr k(\226) = letr k(\227) = letr k(\228) = letr k(\229) = letr k(\230) = letr k(\231) = letr k(\232) = letr k(\233) = letr k(\234) = letr k(\235) = letr k(\236) = letr k(\237) = letr k(\238) = letr k(\239) = letr k(\240) = letr k(\241) = letr k(\242) = letr k(\243) = letr k(\244) = letr k(\245) = letr k(\246) = letr k(\247) = letr k(\248) = letr k(\249) = letr k(\250) = letr k(\251) = letr k(\252) = letr k(\253) = letr k(\254) = letr k(\255) = letr p([|"hello"|]) = hello p([|1.0|]) = 1.000000 q([|2|]) = 2 diff --git a/testsuite/tests/gc-roots/Makefile b/testsuite/tests/gc-roots/Makefile index 71082b9f..f07d6751 100644 --- a/testsuite/tests/gc-roots/Makefile +++ b/testsuite/tests/gc-roots/Makefile @@ -1,4 +1,4 @@ -MODULES= +#MODULES= MAIN_MODULE=globroots C_FILES=globrootsprim ADD_COMPFLAGS=-w a diff --git a/testsuite/tests/lib-digest/Makefile b/testsuite/tests/lib-digest/Makefile index 6d222274..e81a715a 100644 --- a/testsuite/tests/lib-digest/Makefile +++ b/testsuite/tests/lib-digest/Makefile @@ -1,4 +1,4 @@ -MODULES= +#MODULES= MAIN_MODULE=md5 ADD_COMPFLAGS=-w a diff --git a/testsuite/tests/lib-dynlink-bytecode/Makefile b/testsuite/tests/lib-dynlink-bytecode/Makefile index 33c431b1..00ffc63a 100644 --- a/testsuite/tests/lib-dynlink-bytecode/Makefile +++ b/testsuite/tests/lib-dynlink-bytecode/Makefile @@ -16,17 +16,17 @@ compile: run: @printf " ... testing 'main'" - @./main plug1.cma plug2.cma > main.result + @export LD_LIBRARY_PATH=`pwd` && ./main plug1.cma plug2.cma > main.result @diff -q main.reference main.result > /dev/null || (echo " => failed" && exit 1) @echo " => passed" @printf " ... testing 'static'" - @./static > static.result + @export LD_LIBRARY_PATH=`pwd` && ./static > static.result @diff -q static.reference static.result > /dev/null || (echo " => failed" && exit 1) @echo " => passed" @printf " ... testing 'custom'" - @./custom > custom.result + @export LD_LIBRARY_PATH=`pwd` && ./custom > custom.result @diff -q custom.reference custom.result > /dev/null || (echo " => failed" && exit 1) @echo " => passed" diff --git a/testsuite/tests/lib-marshal/Makefile b/testsuite/tests/lib-marshal/Makefile index 0d28b8d9..df63a1fd 100644 --- a/testsuite/tests/lib-marshal/Makefile +++ b/testsuite/tests/lib-marshal/Makefile @@ -1,4 +1,4 @@ -MODULES= +#MODULES= MAIN_MODULE=intext C_FILES=intextaux diff --git a/testsuite/tests/lib-num/end_test.reference b/testsuite/tests/lib-num/end_test.reference index 274cef90..8a78296e 100644 --- a/testsuite/tests/lib-num/end_test.reference +++ b/testsuite/tests/lib-num/end_test.reference @@ -78,7 +78,9 @@ xor_big_int shift_left_big_int 1... 2... 2... 3... 4... 5... 6... shift_right_big_int - 1... 2... 3... 4... 5... + 1... 2... 3... 4... 5... 6... +shift_right_towards_zero_big_int + 1... 2... extract_big_int 1... 2... 3... 4... 5... 6... create_ratio diff --git a/testsuite/tests/lib-num/test_big_ints.ml b/testsuite/tests/lib-num/test_big_ints.ml index 3474dd41..46ffc597 100644 --- a/testsuite/tests/lib-num/test_big_ints.ml +++ b/testsuite/tests/lib-num/test_big_ints.ml @@ -888,7 +888,19 @@ test 4 eq_big_int big_int_of_string "39614081257132168796771975168");; test 5 eq_big_int (shift_right_big_int (big_int_of_string "-5299989648942") 32, + big_int_of_int (-1235));; +test 6 eq_big_int + (shift_right_big_int (big_int_of_string "-16570089876543209725755392") 27, + big_int_of_string "-123456790123456789");; + +testing_function "shift_right_towards_zero_big_int";; + +test 1 eq_big_int + (shift_right_towards_zero_big_int (big_int_of_string "-5299989648942") 32, big_int_of_int (-1234));; +test 2 eq_big_int + (shift_right_towards_zero_big_int (big_int_of_string "-16570089876543209725755392") 27, + big_int_of_string "-123456790123456789");; testing_function "extract_big_int";; diff --git a/testsuite/tests/lib-scanf/Makefile b/testsuite/tests/lib-scanf/Makefile index 0be4bf14..8f8b3c5b 100644 --- a/testsuite/tests/lib-scanf/Makefile +++ b/testsuite/tests/lib-scanf/Makefile @@ -1,4 +1,4 @@ -MODULES= +#MODULES= MAIN_MODULE=tscanf ADD_COMPFLAGS=-I $(BASEDIR)/lib ADD_MODULES=testing diff --git a/testsuite/tests/lib-scanf/tscanf.ml b/testsuite/tests/lib-scanf/tscanf.ml index c6fa1f54..cab4d7be 100644 --- a/testsuite/tests/lib-scanf/tscanf.ml +++ b/testsuite/tests/lib-scanf/tscanf.ml @@ -514,7 +514,7 @@ let test22 () = test (test22 ()) ;; -(* Should work and does not with this version of scan_int_list! +(* Should work but does not with this version of scan_int_list! scan_int_list (Scanning.from_string "[1;2;3;4; ]");; (* Should lead to a bad input error. *) scan_int_list (Scanning.from_string "[1;2;3;4 5]");; @@ -918,10 +918,10 @@ let scan_float_list_list = (* The killer way to define [scan_float_list_list]. *) (* let scan_float_list_list = scan_list scan_float_list;; *) -test ( +let test340 () = scan_float_list_list (Scanning.from_string "[[1.0] ; []; [2.0; 3; 5.0; 6.];]") = - [[1.]; []; [2.; 3.; 5.; 6.]]) + [[1.]; []; [2.; 3.; 5.; 6.]] ;; (* A general scan_list_list functional. *) @@ -945,7 +945,7 @@ let test35 () = sscanf " " "%N%s%N" (fun x s y -> x, s, y) = (0, "", 1) ;; -test (test35 ()) +test (test340 () && test35 ()) ;; (* The prefered reader functionnals. *) @@ -1127,7 +1127,39 @@ let test48 () = (* Complex test of scanning a meta format specified in the scanner input format string and extraction of its specification from a string. *) sscanf "12 \"%i\"89 " "%i %{%d%}%s %!" - (fun i f s -> i = 12 && f = "%i" && s = "89") + (fun i f s -> i = 12 && f = "%i" && s = "89") && + (* Testing scanf format string replacement *) + let k s = + Scanf.sscanf s + "%(%f%)" (fun _fmt i -> i) in + k "\" : %1f\": 987654321" = 9.0 && + k "\" : %2f\": 987654321" = 98.0 && + k "\" : %3f\": 9.87654321" = 9.8 && + k "\" : %4f\": 9.87654321" = 9.87 && + + let h s = + Scanf.sscanf s + "Read integers with %(%i%)" (fun _fmt i -> i) in + h "Read integers with \"%1d\"987654321" = 9 && + h "Read integers with \"%2d\"987654321" = 98 && + h "Read integers with \"%3u\"987654321" = 987 && + h "Read integers with \"%4x\"987654321" = 39030 && + + let i s = + Scanf.sscanf s + "with %(%i %s%)" (fun _fmt amount currency -> amount, currency) in + i "with \" : %d %s\" : 21 euros" = (21, "euros") && + i "with \" : %d %s\" : 987654321 dollars" = (987654321, "dollars") && + i "with \" : %u %s\" : 54321 pounds" = (54321, "pounds") && + i "with \" : %x %s\" : 321 yens" = (801, "yens") && + + let j s = + Scanf.sscanf s + "with %(%i %_s %s%)" (fun _fmt amount currency -> amount, currency) in + j "with \" : %1d %_s %s\" : 987654321 euros" = (9, "euros") && + j "with \" : %2d %_s %s\" : 987654321 dollars" = (98, "dollars") && + j "with \" : %3u %_s %s\" : 987654321 pounds" = (987, "pounds") && + j "with \" : %4x %_s %s\" : 987654321 yens" = (39030, "yens") ;; test (test48 ()) @@ -1377,7 +1409,7 @@ test (test56 ()) ;; (* Testing the scanning of formats. *) -let test48 () = +let test57 () = (* Testing format_from_string. *) let test_format_scan s fmt efmt = format_from_string s fmt = efmt in @@ -1409,6 +1441,17 @@ let test48 () = (fun i f s -> i = 12 && f = "%i" && s = "89") ;; +test (test57 ()) +;; + +(* +let test58 () = +;; + +test (test58 ()) +;; +*) + (* To be continued ... (* Trying to scan records. *) let rec scan_fields ib scan_field accu = diff --git a/testsuite/tests/runtime-errors/Makefile b/testsuite/tests/runtime-errors/Makefile index 62f05380..4945c1f8 100644 --- a/testsuite/tests/runtime-errors/Makefile +++ b/testsuite/tests/runtime-errors/Makefile @@ -20,6 +20,6 @@ run: done clean: defaultclean - @rm -f *.byte *.native *.result + @rm -f *.bytecode *.native *.result include ../../makefiles/Makefile.common diff --git a/testsuite/tests/tool-ocamldoc/Makefile b/testsuite/tests/tool-ocamldoc/Makefile index e61924e6..5e7398ba 100644 --- a/testsuite/tests/tool-ocamldoc/Makefile +++ b/testsuite/tests/tool-ocamldoc/Makefile @@ -6,9 +6,12 @@ run: $(CUSTOM_MODULE).cmo printf " ... testing '$$file'"; \ $(OCAMLDOC) -g $(CUSTOM_MODULE).cmo -o `basename $$file ml`result $$file; \ diff -q `basename $$file ml`reference `basename $$file ml`result > /dev/null && echo " => passed" || (echo " => failed" && exit 1); \ - done + done; + @$(OCAMLDOC) -html t*.ml 2>&1 | grep -v test_types_display || true + @$(OCAMLDOC) -latex t*.ml 2>&1 | grep -v test_types_display || true + clean: defaultclean - @rm -f *.result + @rm -f *.result *.html *.tex *.log *.out *.sty *.toc *.css *.aux include ../../makefiles/Makefile.common diff --git a/testsuite/tests/tool-ocamldoc/t02.ml b/testsuite/tests/tool-ocamldoc/t02.ml new file mode 100644 index 00000000..d7c97421 --- /dev/null +++ b/testsuite/tests/tool-ocamldoc/t02.ml @@ -0,0 +1,10 @@ +module Foo = struct type u type t = int let x = 1 end;; +module type TFoo = module type of Foo;; + +module type TBar = TFoo with type u := float;; + +module type Gee = + sig + module M : module type of Foo + include module type of Foo + end diff --git a/testsuite/tests/tool-ocamldoc/t02.reference b/testsuite/tests/tool-ocamldoc/t02.reference new file mode 100644 index 00000000..f1e7de43 --- /dev/null +++ b/testsuite/tests/tool-ocamldoc/t02.reference @@ -0,0 +1,12 @@ +# +# module T02: +# +# module T02.Foo: +# +# module type T02.TFoo: +# +# module type T02.TBar: +# +# module type T02.Gee: +# +# module T02.Gee.M: diff --git a/testsuite/tests/tool-ocamldoc/t03.ml b/testsuite/tests/tool-ocamldoc/t03.ml new file mode 100644 index 00000000..43f1857d --- /dev/null +++ b/testsuite/tests/tool-ocamldoc/t03.ml @@ -0,0 +1,7 @@ +module Foo = struct type t = int let x = 1 end;; +module type MT = module type of Foo;; +module Bar = struct type t = int let x = 2 end;; + +module type MT2 = sig type t val x : t end;; +module type Gee = MT2 with type t = float ;; +module T = (val (if true then (module Foo:MT2 with type t = int) else (module Bar: MT2 with type t = int)) : MT2 with type t = int);; \ No newline at end of file diff --git a/testsuite/tests/tool-ocamldoc/t03.reference b/testsuite/tests/tool-ocamldoc/t03.reference new file mode 100644 index 00000000..174e2199 --- /dev/null +++ b/testsuite/tests/tool-ocamldoc/t03.reference @@ -0,0 +1,14 @@ +# +# module T03: +# +# module T03.Foo: +# +# module type T03.MT: +# +# module T03.Bar: +# +# module type T03.MT2: +# +# module type T03.Gee: +# +# module T03.T: diff --git a/testsuite/tests/typing-fstclassmod/Makefile b/testsuite/tests/typing-fstclassmod/Makefile index 68001d76..a8a96229 100644 --- a/testsuite/tests/typing-fstclassmod/Makefile +++ b/testsuite/tests/typing-fstclassmod/Makefile @@ -1,4 +1,4 @@ -MODULES= +#MODULES= MAIN_MODULE=fstclassmod ADD_COMPFLAGS=-w a diff --git a/testsuite/tests/typing-objects/Exemples.ml.reference b/testsuite/tests/typing-objects/Exemples.ml.reference index 42fa5963..aa95aaea 100644 --- a/testsuite/tests/typing-objects/Exemples.ml.reference +++ b/testsuite/tests/typing-objects/Exemples.ml.reference @@ -121,41 +121,9 @@ Type point = point is not a subtype of color_point = color_point print_string (self#color); print_string ")" end;; -Warning 7: the following methods are overriden by the class printable_point : - get_x move -# - class printable_color_point y c = object (self) - inherit color_point y c - inherit printable_point y as super - method print = - print_string "("; - super#print; - print_string ", "; - print_string (self#color); - print_string ")" - end;; - - -Warning 13: the following instance variables are overriden by the class printable_point : +Warning 13: the following instance variables are overriden by the class printable_point : x The behaviour changed in ocaml 3.10 (previous behaviour was hiding.) -# - class printable_color_point y c = object (self) - inherit color_point y c - inherit printable_point y as super - method print = - print_string "("; - super#print; - print_string ", "; - print_string (self#color); - print_string ")" - end;; - - - - - -Warning 7: the method print is overridden. class printable_color_point : int -> string -> @@ -304,18 +272,7 @@ val pr : < x : int; .. > list -> unit = method set_x : 'a -> unit method x : 'a end -# # - class ['a] double_link x = object (self) - inherit ['a] link x - val mutable prev = None - method prev = prev - method set_next l = - next <- l; - match l with Some l -> l#set_prev (Some self) | None -> () - method set_prev l = prev <- l - end;; -Warning 7: the method set_next is overridden. -class ['a] double_link : +# class ['a] double_link : 'a -> object ('b) val mutable next : 'b option @@ -362,85 +319,7 @@ class ['a] double_link : # - : float = 5. # - : float = 1.5 # - : float = 15. -# # - class calculator arg acc = object (self) - val arg = arg - val acc = acc - method enter n = new calculator n acc - method add = new calculator_add arg self#equals - method sub = new calculator_sub arg self#equals - method equals = arg - end and calculator_add arg acc = object - inherit calculator arg acc - method enter n = new calculator_add n acc - method equals = acc +. arg - end and calculator_sub arg acc = object - inherit calculator arg acc - method enter n = new calculator_sub n acc - method equals = acc -. arg - end;; -Warning 7: the method enter is overridden. -# - class calculator arg acc = object (self) - val arg = arg - val acc = acc - method enter n = new calculator n acc - method add = new calculator_add arg self#equals - method sub = new calculator_sub arg self#equals - method equals = arg - end and calculator_add arg acc = object - inherit calculator arg acc - method enter n = new calculator_add n acc - method equals = acc +. arg - end and calculator_sub arg acc = object - inherit calculator arg acc - method enter n = new calculator_sub n acc - method equals = acc -. arg - end;; - -Warning 7: the method equals is overridden. -# - class calculator arg acc = object (self) - val arg = arg - val acc = acc - method enter n = new calculator n acc - method add = new calculator_add arg self#equals - method sub = new calculator_sub arg self#equals - method equals = arg - end and calculator_add arg acc = object - inherit calculator arg acc - method enter n = new calculator_add n acc - method equals = acc +. arg - end and calculator_sub arg acc = object - inherit calculator arg acc - method enter n = new calculator_sub n acc - method equals = acc -. arg - end;; - - -Warning 7: the method enter is overridden. -# - class calculator arg acc = object (self) - val arg = arg - val acc = acc - method enter n = new calculator n acc - method add = new calculator_add arg self#equals - method sub = new calculator_sub arg self#equals - method equals = arg - end and calculator_add arg acc = object - inherit calculator arg acc - method enter n = new calculator_add n acc - method equals = acc +. arg - end and calculator_sub arg acc = object - inherit calculator arg acc - method enter n = new calculator_sub n acc - method equals = acc -. arg - end;; - - - -Warning 7: the method equals is overridden. -class calculator : +# class calculator : float -> float -> object diff --git a/testsuite/tests/typing-objects/Tests.ml.reference b/testsuite/tests/typing-objects/Tests.ml.reference index 5c26800e..d93c5ec0 100644 --- a/testsuite/tests/typing-objects/Tests.ml.reference +++ b/testsuite/tests/typing-objects/Tests.ml.reference @@ -151,65 +151,14 @@ and 'a t = 'a t u # class ['a] c : 'a #c -> object end # class c : unit -> object method f : int end and d : unit -> object method f : int end -# # class e () = object inherit c () inherit d () end;; -Warning 7: the following methods are overriden by the class d : - f -class e : unit -> object method f : int end +# class e : unit -> object method f : int end # - : int = 2 # # class c () = object val x = - true val y = -. () end;; Error: This expression has type bool but an expression was expected of type int # class c : unit -> object method f : int method g : int method h : int end # class d : unit -> object method h : int method i : int method j : int end -# # class e () = object - method f = 3 - inherit c () - method g = 3 - method i = 3 - inherit d () - method j = 3 - end;; -Warning 7: the following methods are overriden by the class c : - f -# class e () = object - method f = 3 - inherit c () - method g = 3 - method i = 3 - inherit d () - method j = 3 - end;; - - -Warning 7: the method g is overridden. -# class e () = object - method f = 3 - inherit c () - method g = 3 - method i = 3 - inherit d () - method j = 3 - end;; - - - -Warning 7: the following methods are overriden by the class d : - h i -# class e () = object - method f = 3 - inherit c () - method g = 3 - method i = 3 - inherit d () - method j = 3 - end;; - - - - - -Warning 7: the method j is overridden. -class e : +# class e : unit -> object method f : int diff --git a/testsuite/tests/typing-poly/poly.ml.principal.reference b/testsuite/tests/typing-poly/poly.ml.principal.reference index 9187c712..8b1b45a6 100644 --- a/testsuite/tests/typing-poly/poly.ml.principal.reference +++ b/testsuite/tests/typing-poly/poly.ml.principal.reference @@ -218,23 +218,8 @@ val f4 : id -> int * bool = end # val id : 'a -> 'a = # class c : object method id : 'a -> 'a end -# # class c' = object - inherit c - method id = id - end - ;; -Warning 7: the method id is overridden. -class c' : object method id : 'a -> 'a end -# # class d = object - inherit c as c - val mutable count = 0 - method id x = count <- count+1; x - method count = count - method old : 'a. 'a -> 'a = c#id - end - ;; -Warning 7: the method id is overridden. -class d : +# class c' : object method id : 'a -> 'a end +# class d : object val mutable count : int method count : int diff --git a/testsuite/tests/typing-poly/poly.ml.reference b/testsuite/tests/typing-poly/poly.ml.reference index 48b47f3c..e599b19c 100644 --- a/testsuite/tests/typing-poly/poly.ml.reference +++ b/testsuite/tests/typing-poly/poly.ml.reference @@ -204,23 +204,8 @@ and b : object method id : 'a -> 'a end end # val id : 'a -> 'a = # class c : object method id : 'a -> 'a end -# # class c' = object - inherit c - method id = id - end - ;; -Warning 7: the method id is overridden. -class c' : object method id : 'a -> 'a end -# # class d = object - inherit c as c - val mutable count = 0 - method id x = count <- count+1; x - method count = count - method old : 'a. 'a -> 'a = c#id - end - ;; -Warning 7: the method id is overridden. -class d : +# class c' : object method id : 'a -> 'a end +# class d : object val mutable count : int method count : int diff --git a/testsuite/tests/typing-private-bugs/Makefile b/testsuite/tests/typing-private-bugs/Makefile new file mode 100644 index 00000000..9375ddba --- /dev/null +++ b/testsuite/tests/typing-private-bugs/Makefile @@ -0,0 +1,2 @@ +include ../../makefiles/Makefile.okbad +include ../../makefiles/Makefile.common diff --git a/testsuite/tests/typing-private-bugs/pr5026_bad.ml b/testsuite/tests/typing-private-bugs/pr5026_bad.ml new file mode 100644 index 00000000..0e6d215d --- /dev/null +++ b/testsuite/tests/typing-private-bugs/pr5026_bad.ml @@ -0,0 +1,11 @@ +type untyped;; +type -'a typed = private untyped;; +type -'typing wrapped = private sexp +and +'a t = 'a typed wrapped +and sexp = private untyped wrapped;; +class type ['a] s3 = object + val underlying : 'a t +end;; +class ['a] s3object r : ['a] s3 = object + val underlying = r +end;; diff --git a/testsuite/tests/typing-typeparam/Makefile b/testsuite/tests/typing-typeparam/Makefile index 6ac1ce13..ef9558e1 100644 --- a/testsuite/tests/typing-typeparam/Makefile +++ b/testsuite/tests/typing-typeparam/Makefile @@ -1,4 +1,4 @@ -MODULES= +#MODULES= MAIN_MODULE=newtype ADD_COMPFLAGS=-w a diff --git a/tools/Makefile.shared b/tools/Makefile.shared index 477ba73a..1abf73b4 100644 --- a/tools/Makefile.shared +++ b/tools/Makefile.shared @@ -66,7 +66,7 @@ ocamlprof: $(CSLPROF) profiling.cmo $(CAMLC) $(LINKFLAGS) -o ocamlprof $(CSLPROF_IMPORTS) $(CSLPROF) ocamlcp: ocamlcp.cmo - $(CAMLC) $(LINKFLAGS) -o ocamlcp main_args.cmo ocamlcp.cmo + $(CAMLC) $(LINKFLAGS) -o ocamlcp warnings.cmo main_args.cmo ocamlcp.cmo install:: cp ocamlprof $(BINDIR)/ocamlprof$(EXE) diff --git a/tools/ocamlcp.ml b/tools/ocamlcp.ml index 7c8d725f..a2232dc1 100644 --- a/tools/ocamlcp.ml +++ b/tools/ocamlcp.ml @@ -84,6 +84,7 @@ module Options = Main_args.Make_bytecomp_options (struct let _verbose = option "-verbose" let _w = option_with_arg "-w" let _warn_error = option_with_arg "-warn-error" + let _warn_help = option "-warn-help" let _where = option "-where" let _nopervasives = option "-nopervasives" let _dparsetree = option "-dparsetree" diff --git a/toplevel/opttopmain.ml b/toplevel/opttopmain.ml index 3575abbb..388e7257 100644 --- a/toplevel/opttopmain.ml +++ b/toplevel/opttopmain.ml @@ -77,6 +77,7 @@ module Options = Main_args.Make_opttop_options (struct let _version () = print_version () let _w s = Warnings.parse_options false s let _warn_error s = Warnings.parse_options true s + let _warn_help = Warnings.help_warnings let _dparsetree = set dump_parsetree let _drawlambda = set dump_rawlambda diff --git a/toplevel/toplevellib.mllib b/toplevel/toplevellib.mllib index 906aeb43..a5e8b03f 100644 --- a/toplevel/toplevellib.mllib +++ b/toplevel/toplevellib.mllib @@ -16,4 +16,4 @@ Translclass Translmod Simplif Runtimedef Meta Instruct Bytegen Printinstr Opcodes Emitcode Bytesections Dll Symtable Bytelink Bytelibrarian Bytepackager -Pparse Errors Compile Genprintval Toploop Trace Topdirs Topmain +Pparse Errors Compile Main_args Genprintval Toploop Trace Topdirs Topmain diff --git a/toplevel/topmain.ml b/toplevel/topmain.ml index b63eefcb..803624c5 100644 --- a/toplevel/topmain.ml +++ b/toplevel/topmain.ml @@ -71,6 +71,7 @@ module Options = Main_args.Make_bytetop_options (struct let _version () = print_version () let _w s = Warnings.parse_options false s let _warn_error s = Warnings.parse_options true s + let _warn_help = Warnings.help_warnings let _dparsetree = set dump_parsetree let _drawlambda = set dump_rawlambda let _dlambda = set dump_lambda diff --git a/typing/ctype.ml b/typing/ctype.ml index 4b9e84b2..fb4cc62b 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -1251,7 +1251,7 @@ let rec non_recursive_abbrev env ty0 ty = match ty.desc with Tconstr(p, args, abbrev) -> begin try - non_recursive_abbrev env ty0 (try_expand_once env ty) + non_recursive_abbrev env ty0 (try_expand_once_opt env ty) with Cannot_expand -> if !Clflags.recursive_types then () else iter_type_expr (non_recursive_abbrev env ty0) ty @@ -3183,7 +3183,7 @@ let cyclic_abbrev env id ty = Tconstr (p, tl, abbrev) -> p = Path.Pident id || List.memq ty seen || begin try - check_cycle (ty :: seen) (expand_abbrev env ty) + check_cycle (ty :: seen) (expand_abbrev_opt env ty) with Cannot_expand -> false | Unify _ -> true @@ -3297,6 +3297,8 @@ let rec nondep_type_rec env id ty = end else Tconstr(p, List.map (nondep_type_rec env id) tl, ref Mnil) + | Tpackage(p, _, _) when Path.isfree id p -> + raise Not_found | Tobject (t1, name) -> Tobject (nondep_type_rec env id t1, ref (match !name with diff --git a/typing/env.ml b/typing/env.ml index c7bcb61d..04424799 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -739,32 +739,10 @@ let add_item comp env = | Tsig_class(id, decl, _) -> add_class id decl env | Tsig_cltype(id, decl, _) -> add_cltype id decl env -(* Remove a previous identifier with same name *) -let rec filter_value id = function - Env_empty -> Env_empty - | Env_value (sum, id', vd) -> - if Ident.equal id id' then sum - else Env_value(filter_value id sum, id', vd) - | Env_type (sum, id', td) -> Env_type (filter_value id sum, id', td) - | Env_exception (sum, id', ed) -> Env_exception (filter_value id sum, id', ed) - | Env_module (sum, id', mty) -> Env_module (filter_value id sum, id', mty) - | Env_modtype (sum, id', mty) -> Env_modtype (filter_value id sum, id', mty) - | Env_class (sum, id', cty) -> Env_class (filter_value id sum, id', cty) - | Env_cltype (sum, id', cty) -> Env_cltype (filter_value id sum, id', cty) - | Env_open (sum, path) -> Env_open (filter_value id sum, path) - -let remove_value id env = - { env with summary = filter_value id env.summary } - -let add_item_for_signature comp env = - match comp with - Tsig_value(id, decl) -> add_value id decl (remove_value id env) - | _ -> add_item comp env - let rec add_signature sg env = match sg with [] -> env - | comp :: rem -> add_signature rem (add_item_for_signature comp env) + | comp :: rem -> add_signature rem (add_item comp env) (* Open a signature path *) diff --git a/typing/predef.ml b/typing/predef.ml index 048e2d99..728eb572 100644 --- a/typing/predef.ml +++ b/typing/predef.ml @@ -201,3 +201,9 @@ let builtin_values = ident_failure; ident_not_found; ident_sys_error; ident_end_of_file; ident_division_by_zero; ident_sys_blocked_io; ident_assert_failure; ident_undefined_recursive_module ] + +(* Start non-predef identifiers at 1000. This way, more predefs can + be defined in this file (above!) without breaking .cmi + compatibility. *) + +let _ = Ident.set_current_time 999 diff --git a/typing/printtyp.ml b/typing/printtyp.ml index 2134afb5..03c5e911 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -33,7 +33,17 @@ let rec longident ppf = function (* Print an identifier *) -let ident ppf id = fprintf ppf "%s" (Ident.name id) +let unique_names = ref Ident.empty + +let ident_name id = + try Ident.find_same id !unique_names with Not_found -> Ident.name id + +let add_unique id = + try ignore (Ident.find_same id !unique_names) + with Not_found -> + unique_names := Ident.add id (Ident.unique_toplevel_name id) !unique_names + +let ident ppf id = fprintf ppf "%s" (ident_name id) (* Print a path *) @@ -41,7 +51,7 @@ let ident_pervasive = Ident.create_persistent "Pervasives" let rec tree_of_path = function | Pident id -> - Oide_ident (Ident.name id) + Oide_ident (ident_name id) | Pdot(Pident id, s, pos) when Ident.same id ident_pervasive -> Oide_ident s | Pdot(p, s, pos) -> @@ -288,7 +298,7 @@ let reset_loop_marks () = visited_objects := []; aliased := []; delayed := [] let reset () = - reset_names (); reset_loop_marks () + unique_names := Ident.empty; reset_names (); reset_loop_marks () let reset_and_mark_loops ty = reset (); mark_loops ty @@ -539,11 +549,8 @@ let rec tree_of_type_decl id decl = let abstr = match decl.type_kind with Type_abstract -> - begin match decl.type_manifest with - None -> true - | Some ty -> has_constr_row ty - end - | Type_variant _ | Type_record(_,_) -> + decl.type_manifest = None || decl.type_private = Private + | Type_variant _ | Type_record _ -> decl.type_private = Private in let vari = @@ -963,8 +970,32 @@ let explanation unif mis ppf = None -> () | Some (t3, t4) -> explanation unif t3 t4 ppf +let ident_same_name id1 id2 = + if Ident.equal id1 id2 && not (Ident.same id1 id2) then begin + add_unique id1; add_unique id2 + end + +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') -> + path_same_name p1 p2; path_same_name p1' p2' + | _ -> () + +let type_same_name t1 t2 = + match (repr t1).desc, (repr t2).desc with + Tconstr (p1, _, _), Tconstr (p2, _, _) -> path_same_name p1 p2 + | _ -> () + +let rec trace_same_names = function + (t1, t1') :: (t2, t2') :: rem -> + type_same_name t1 t2; type_same_name t1' t2'; trace_same_names rem + | _ -> () + let unification_error unif tr txt1 ppf txt2 = reset (); + trace_same_names tr; let tr = List.map (fun (t, t') -> (t, hide_variant_name t')) tr in let mis = mismatch unif tr in match tr with @@ -996,6 +1027,7 @@ let report_unification_error ppf tr txt1 txt2 = let trace fst txt ppf tr = print_labels := not !Clflags.classic; + trace_same_names tr; try match tr with t1 :: t2 :: tr' -> if fst then trace fst txt ppf (t1 :: t2 :: filter_trace tr') diff --git a/typing/subst.ml b/typing/subst.ml index 971d8b29..6aa27660 100644 --- a/typing/subst.ml +++ b/typing/subst.ml @@ -309,11 +309,17 @@ and modtype_declaration s = function Tmodtype_abstract -> Tmodtype_abstract | Tmodtype_manifest mty -> Tmodtype_manifest(modtype s mty) +(* For every binding k |-> d of m1, add k |-> f d to m2 + and return resulting merged map. *) + +let merge_tbls f m1 m2 = + Tbl.fold (fun k d accu -> Tbl.add k (f d) accu) m1 m2 + (* Composition of substitutions: apply (compose s1 s2) x = apply s2 (apply s1 x) *) let compose s1 s2 = - { types = Tbl.map (fun id p -> type_path s2 p) s1.types; - modules = Tbl.map (fun id p -> module_path s2 p) s1.modules; - modtypes = Tbl.map (fun id mty -> modtype s2 mty) s1.modtypes; + { types = merge_tbls (type_path s2) s1.types s2.types; + modules = merge_tbls (module_path s2) s1.modules s2.modules; + modtypes = merge_tbls (modtype s2) s1.modtypes s2.modtypes; for_saving = false } diff --git a/typing/typeclass.ml b/typing/typeclass.ml index 013275ca..142f22cb 100644 --- a/typing/typeclass.ml +++ b/typing/typeclass.ml @@ -774,12 +774,13 @@ and class_expr cl_num val_env met_env scl = let loc = default.pexp_loc in let scases = [{ppat_loc = loc; ppat_desc = - Ppat_construct(Longident.Lident"Some", + Ppat_construct(Longident.(Ldot (Lident"*predef*", "Some")), Some{ppat_loc = loc; ppat_desc = Ppat_var"*sth*"}, false)}, {pexp_loc = loc; pexp_desc = Pexp_ident(Longident.Lident"*sth*")}; {ppat_loc = loc; ppat_desc = - Ppat_construct(Longident.Lident"None", None, false)}, + Ppat_construct(Longident.(Ldot (Lident"*predef*", "None")), + None, false)}, default] in let smatch = {pexp_loc = loc; pexp_desc = diff --git a/typing/typecore.ml b/typing/typecore.ml index fb915226..0f55bbab 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -49,7 +49,7 @@ type error = | Private_type of type_expr | Private_label of Longident.t * type_expr | Unbound_instance_variable of string - | Instance_variable_not_mutable of string + | Instance_variable_not_mutable of bool * string | Not_subtype of (type_expr * type_expr) list * (type_expr * type_expr) list | Outside_class | Value_multiply_overridden of string @@ -305,11 +305,74 @@ let rec build_as_type env p = | Tpat_any | Tpat_var _ | Tpat_constant _ | Tpat_array _ | Tpat_lazy _ -> p.pat_type +(* Narrowing unbound identifier errors. *) +let rec narrow_unbound_lid_error env lid make_error = + let module_is_bound mlid = + ignore (Env.lookup_module mlid env) in + match lid with + | Longident.Lident _ -> make_error lid + | Longident.Ldot (mlid, _) -> + begin + try + module_is_bound mlid; + make_error lid with + | Not_found -> Unbound_module mlid + end + | Longident.Lapply (flid, mlid) -> + begin + try + module_is_bound flid; + begin + try + module_is_bound mlid; + make_error lid with + | Not_found -> Unbound_module mlid + end with + | Not_found -> Unbound_functor flid + end +;; + +let unbound_lid_error env loc lid make_error = + let err = narrow_unbound_lid_error env lid make_error in + raise (Error (loc, err)) +;; + +let find_type env loc lid = + try Env.lookup_type lid env + with Not_found -> + unbound_lid_error env loc lid + (fun lid -> + raise (Typetexp.Error (loc, Typetexp.Unbound_type_constructor lid))) +;; + +let find_constructor env loc lid = + try + match lid with + | Longident.Ldot (Longident.Lident "*predef*", s) -> + Env.lookup_constructor (Longident.Lident s) Env.initial + | _ -> Env.lookup_constructor lid env + with Not_found -> + unbound_lid_error env loc lid + (fun lid -> Unbound_constructor lid) +;; + +let find_label env loc lid = + try + Env.lookup_label lid env + with Not_found -> + unbound_lid_error env loc lid + (fun lid -> Unbound_label lid) +;; + +let find_class env loc lid = + try Env.lookup_class lid env with + | Not_found -> + unbound_lid_error env loc lid + (fun lid -> Unbound_class lid) +;; + let build_or_pat env loc lid = - let path, decl = - try Env.lookup_type lid env - with Not_found -> - raise(Typetexp.Error(loc, Typetexp.Unbound_type_constructor lid)) + let path, decl = find_type env loc lid in let tyl = List.map (fun _ -> newvar()) decl.type_params in let row0 = @@ -461,11 +524,7 @@ let rec type_pat env sp = pat_type = newty (Ttuple(List.map (fun p -> p.pat_type) pl)); pat_env = env } | Ppat_construct(lid, sarg, explicit_arity) -> - let constr = - try - Env.lookup_constructor lid env - with Not_found -> - raise(Error(loc, Unbound_constructor lid)) in + let constr = find_constructor env loc lid in let sargs = match sarg with None -> [] @@ -506,11 +565,7 @@ let rec type_pat env sp = | Ppat_record(lid_sp_list, closed) -> let ty = newvar() in let type_label_pat (lid, sarg) = - let label = - try - Env.lookup_label lid env - with Not_found -> - raise(Error(loc, Unbound_label lid)) in + let label = find_label env loc lid in begin_def (); let (vars, ty_arg, ty_res) = instance_label false label in if vars = [] then end_def (); @@ -1015,37 +1070,6 @@ let unify_exp env exp expected_ty = | Tags(l1,l2) -> raise(Typetexp.Error(exp.exp_loc, Typetexp.Variant_tags (l1, l2))) -let rec narrow_unbound_lid_error env make_error lid = - let module_is_bound mlid = - ignore (Env.lookup_module mlid env) in - match lid with - | Longident.Lident _ -> make_error lid - | Longident.Ldot (mlid, _) -> - begin - try - module_is_bound mlid; - make_error lid with - | Not_found -> Unbound_module mlid - end - | Longident.Lapply (flid, mlid) -> - begin - try - module_is_bound flid; - begin - try - module_is_bound mlid; - make_error lid with - | Not_found -> Unbound_module mlid - end with - | Not_found -> Unbound_functor flid - end -;; - -let unbound_ident_error loc env make_error lid = - let err = narrow_unbound_lid_error env make_error lid in - raise (Error (loc, err)) -;; - let rec type_exp env sexp = let loc = sexp.pexp_loc in match sexp.pexp_desc with @@ -1080,7 +1104,8 @@ let rec type_exp env sexp = exp_type = instance desc.val_type; exp_env = env } with Not_found -> - unbound_ident_error loc env (fun lid -> Unbound_value lid) lid + unbound_lid_error env loc lid + (fun lid -> Unbound_value lid) end | Pexp_constant cst -> re { @@ -1180,11 +1205,7 @@ let rec type_exp env sexp = let ty = newvar() in let num_fields = ref 0 in let type_label_exp (lid, sarg) = - let label = - try - Env.lookup_label lid env - with Not_found -> - raise(Error(loc, Unbound_label lid)) in + let label = find_label env loc lid in begin_def (); if !Clflags.principal then begin_def (); let (vars, ty_arg, ty_res) = instance_label true label in @@ -1255,11 +1276,7 @@ let rec type_exp env sexp = exp_env = env } | Pexp_field(sarg, lid) -> let arg = type_exp env sarg in - let label = - try - Env.lookup_label lid env - with Not_found -> - raise(Error(loc, Unbound_label lid)) in + let label = find_label env loc lid in let (_, ty_arg, ty_res) = instance_label false label in unify_exp env arg ty_res; re { @@ -1269,11 +1286,7 @@ let rec type_exp env sexp = exp_env = env } | Pexp_setfield(srecord, lid, snewval) -> let record = type_exp env srecord in - let label = - try - Env.lookup_label lid env - with Not_found -> - raise(Error(loc, Unbound_label lid)) in + let label = find_label env loc lid in if label.lbl_mut = Immutable then raise(Error(loc, Label_not_mutable lid)); begin_def (); @@ -1520,10 +1533,7 @@ let rec type_exp env sexp = raise(Error(e.pexp_loc, Undefined_method (obj.exp_type, met))) end | Pexp_new cl -> - let (cl_path, cl_decl) = - try Env.lookup_class cl env with Not_found -> - raise(Error(loc, Unbound_class cl)) - in + let (cl_path, cl_decl) = find_class env loc cl in begin match cl_decl.cty_new with None -> raise(Error(loc, Virtual_class cl)) @@ -1549,9 +1559,9 @@ let rec type_exp env sexp = exp_type = instance Predef.type_unit; exp_env = env } | Val_ivar _ -> - raise(Error(loc, Instance_variable_not_mutable lab)) + raise(Error(loc,Instance_variable_not_mutable(true,lab))) | _ -> - raise(Error(loc, Unbound_instance_variable lab)) + raise(Error(loc,Instance_variable_not_mutable(false,lab))) with Not_found -> raise(Error(loc, Unbound_instance_variable lab)) @@ -1942,11 +1952,7 @@ and type_application env funct sargs = type_args [] [] ty ty sargs [] and type_construct env loc lid sarg explicit_arity ty_expected = - let constr = - try - Env.lookup_constructor lid env - with Not_found -> - raise(Error(loc, Unbound_constructor lid)) in + let constr = find_constructor env loc lid in let sargs = match sarg with None -> [] @@ -2020,13 +2026,14 @@ and type_expect ?in_function env sexp ty_expected = {ppat_loc = default_loc; ppat_desc = Ppat_construct - (Longident.Lident "Some", + (Longident.(Ldot (Lident "*predef*", "Some")), Some {ppat_loc = default_loc; ppat_desc = Ppat_var "*sth*"}, false)}, {pexp_loc = default_loc; pexp_desc = Pexp_ident(Longident.Lident "*sth*")}; {ppat_loc = default_loc; - ppat_desc = Ppat_construct(Longident.Lident "None", None, false)}, + ppat_desc = Ppat_construct + (Longident.(Ldot (Lident "*predef*", "None")), None, false)}, default; ] in let smatch = { @@ -2393,8 +2400,11 @@ let report_error ppf = function longident cl | Unbound_instance_variable v -> fprintf ppf "Unbound instance variable %s" v - | Instance_variable_not_mutable v -> - fprintf ppf "The instance variable %s is not mutable" v + | Instance_variable_not_mutable (b, v) -> + if b then + fprintf ppf "The instance variable %s is not mutable" v + else + fprintf ppf "The value %s is not an instance variable" v | Not_subtype(tr1, tr2) -> report_subtyping_error ppf tr1 "is not a subtype of" tr2 | Outside_class -> diff --git a/typing/typecore.mli b/typing/typecore.mli index a1a9ecd9..11132827 100644 --- a/typing/typecore.mli +++ b/typing/typecore.mli @@ -89,7 +89,7 @@ type error = | Private_type of type_expr | Private_label of Longident.t * type_expr | Unbound_instance_variable of string - | Instance_variable_not_mutable of string + | Instance_variable_not_mutable of bool * string | Not_subtype of (type_expr * type_expr) list * (type_expr * type_expr) list | Outside_class | Value_multiply_overridden of string diff --git a/typing/typedecl.ml b/typing/typedecl.ml index 6ee97aa6..1d0eaad1 100644 --- a/typing/typedecl.ml +++ b/typing/typedecl.ml @@ -599,6 +599,34 @@ let compute_variance_decls env cldecls = {cltydef with clty_variance = variance})) decls cldecls +(* Check multiple declarations of labels/constructors *) + +let check_duplicates name_sdecl_list = + let labels = Hashtbl.create 7 and constrs = Hashtbl.create 7 in + List.iter + (fun (name, sdecl) -> match sdecl.ptype_kind with + Ptype_variant cl -> + List.iter + (fun (cname, _, loc) -> + try + let name' = Hashtbl.find constrs cname in + Location.prerr_warning loc + (Warnings.Duplicate_definitions + ("constructor", cname, name', name)) + with Not_found -> Hashtbl.add constrs cname name) + cl + | Ptype_record fl -> + List.iter + (fun (cname, _, _, loc) -> + try + let name' = Hashtbl.find labels cname in + Location.prerr_warning loc + (Warnings.Duplicate_definitions ("label", cname, name', name)) + with Not_found -> Hashtbl.add labels cname name) + fl + | Ptype_abstract -> ()) + name_sdecl_list + (* Force recursion to go through id for private types*) let name_recursion sdecl id decl = match decl with @@ -645,6 +673,8 @@ let transl_type_decl env name_sdecl_list = (* Translate each declaration. *) let decls = List.map2 (transl_declaration temp_env) name_sdecl_list id_list in + (* Check for duplicates *) + check_duplicates name_sdecl_list; (* Build the final env. *) let newenv = List.fold_right diff --git a/typing/typemod.ml b/typing/typemod.ml index 000131ed..dbe61f42 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -899,21 +899,6 @@ and type_structure funct_body anchor env sstr scope = let type_module = type_module false None let type_structure = type_structure false None -let type_module_type_of env smod = - match smod.pmod_desc with - | Pmod_ident lid -> (* turn off strengthening in this case *) - let (path, mty) = type_module_path env smod.pmod_loc lid in mty - | _ -> - (type_module env smod).mod_type - -(* Fill in the forward declarations *) -let () = - Typecore.type_module := type_module; - Typetexp.transl_modtype_longident := transl_modtype_longident; - Typetexp.transl_modtype := transl_modtype; - Typecore.type_open := type_open; - type_module_type_of_fwd := type_module_type_of - (* Normalize types in a signature *) let rec normalize_modtype env = function @@ -960,6 +945,29 @@ and simplify_signature sg = in simplif StringSet.empty StringSet.empty [] (List.rev sg) +(* Extract the module type of a module expression *) + +let type_module_type_of env smod = + let mty = + match smod.pmod_desc with + | Pmod_ident lid -> (* turn off strengthening in this case *) + let (path, mty) = type_module_path env smod.pmod_loc lid in mty + | _ -> (type_module env smod).mod_type in + (* PR#5037: clean up inferred signature to remove duplicate specs *) + let mty = simplify_modtype mty in + (* PR#5036: must not contain non-generalized type variables *) + if not (closed_modtype mty) then + raise(Error(smod.pmod_loc, Non_generalizable_module mty)); + mty + +(* Fill in the forward declarations *) +let () = + Typecore.type_module := type_module; + Typetexp.transl_modtype_longident := transl_modtype_longident; + Typetexp.transl_modtype := transl_modtype; + Typecore.type_open := type_open; + type_module_type_of_fwd := type_module_type_of + (* Typecheck an implementation file *) let type_implementation sourcefile outputprefix modulename initial_env ast = diff --git a/utils/ccomp.ml b/utils/ccomp.ml index fbbbdf10..94a29217 100644 --- a/utils/ccomp.ml +++ b/utils/ccomp.ml @@ -120,8 +120,8 @@ let call_linker mode output_name files extra = (if !Clflags.gprofile then Config.cc_profile else "") "" (*(Clflags.std_include_flag "-I")*) (quote_prefixed "-L" !Config.load_path) + (String.concat " " (List.rev !Clflags.ccopts)) files extra - (String.concat " " (List.rev !Clflags.ccopts)) in command cmd = 0 diff --git a/utils/tbl.ml b/utils/tbl.ml index d6689f08..b0651693 100644 --- a/utils/tbl.ml +++ b/utils/tbl.ml @@ -99,6 +99,12 @@ let rec map f = function Empty -> Empty | Node(l, v, d, r, h) -> Node(map f l, v, f v d, map f r, h) +let rec fold f m accu = + match m with + | Empty -> accu + | Node(l, v, d, r, _) -> + fold f r (f v d (fold f l accu)) + open Format let print print_key print_data ppf tbl = diff --git a/utils/tbl.mli b/utils/tbl.mli index 21c89b04..44a021a7 100644 --- a/utils/tbl.mli +++ b/utils/tbl.mli @@ -24,6 +24,7 @@ val mem: 'a -> ('a, 'b) t -> bool val remove: 'a -> ('a, 'b) t -> ('a, 'b) t val iter: ('a -> 'b -> unit) -> ('a, 'b) t -> unit val map: ('a -> 'b -> 'c) -> ('a, 'b) t -> ('a, 'c) t +val fold: ('a -> 'b -> 'c -> 'c) -> ('a, 'b) t -> 'c -> 'c open Format diff --git a/utils/warnings.ml b/utils/warnings.ml index 8f84369d..fff95d29 100644 --- a/utils/warnings.ml +++ b/utils/warnings.ml @@ -49,6 +49,7 @@ type t = | Unused_var_strict of string (* 27 *) | Wildcard_arg_to_constant_constr (* 28 *) | Eol_in_string (* 29 *) + | Duplicate_definitions of string * string * string * string (*30 *) ;; (* If you remove a warning, leave a hole in the numbering. NEVER change @@ -87,9 +88,10 @@ let number = function | Unused_var_strict _ -> 27 | Wildcard_arg_to_constant_constr -> 28 | Eol_in_string -> 29 + | Duplicate_definitions _ -> 30 ;; -let last_warning_number = 29;; +let last_warning_number = 30;; (* Must be the max number returned by the [number] function. *) let letter = function @@ -118,7 +120,7 @@ let letter = function | 'u' -> [11; 12] | 'v' -> [13] | 'w' -> [] - | 'x' -> [14; 15; 16; 17; 18; 19; 20; 21; 22; 23; 24; 25] + | 'x' -> [14; 15; 16; 17; 18; 19; 20; 21; 22; 23; 24; 25; 30] | 'y' -> [26] | 'z' -> [27] | _ -> assert false @@ -131,15 +133,25 @@ let is_active x = active.(number x);; let is_error x = error.(number x);; let parse_opt flags s = - let check i = - if i < 1 then raise (Arg.Bad "Bad warning number 0"); - if i > last_warning_number then - raise (Arg.Bad "Bad warning number (too large)"); - in let set i = flags.(i) <- true in let clear i = flags.(i) <- false in let set_all i = active.(i) <- true; error.(i) <- true in let error () = raise (Arg.Bad "Ill-formed list of warnings") in + let rec get_num n i = + if i >= String.length s then i, n + else match s.[i] with + | '0'..'9' -> get_num (10 * n + Char.code s.[i] - Char.code '0') (i + 1) + | _ -> i, n + in + let get_range i = + let i, n1 = get_num 0 i in + if i + 2 < String.length s && s.[i] = '.' && s.[i + 1] = '.' then + let i, n2 = get_num 0 (i + 2) in + if n2 < n1 then error (); + i, n1, n2 + else + i, n1, n1 + in let rec loop i = if i >= String.length s then () else match s.[i] with @@ -156,7 +168,10 @@ let parse_opt flags s = and loop_letter_num myset i = if i >= String.length s then error () else match s.[i] with - | '0' .. '9' -> loop_num myset i 0 + | '0' .. '9' -> + let i, n1, n2 = get_range i in + for n = n1 to min n2 last_warning_number do myset n done; + loop i | 'A' .. 'Z' -> List.iter myset (letter (Char.lowercase s.[i])); loop (i+1) @@ -164,21 +179,14 @@ let parse_opt flags s = List.iter myset (letter s.[i]); loop (i+1) | _ -> error () - and loop_num myset i n = - if i >= String.length s then myset n else - match s.[i] with - | '0' .. '9' -> - let nn = 10 * n + Char.code s.[i] - Char.code '0' in - check nn; - loop_num myset (i+1) nn - | _ -> myset n; loop i in loop 0 ;; let parse_options errflag s = parse_opt (if errflag then error else active) s;; -let defaults_w = "+a-4-6-9-27-28-29";; +(* If you change these, don't forget to change them in man/ocamlc.m *) +let defaults_w = "+a-4-6-7-9-27..29";; let defaults_warn_error = "-a";; let () = parse_options false defaults_w;; @@ -249,6 +257,9 @@ let message = function "wildcard pattern given as argument to a constant constructor" | Eol_in_string -> "unescaped end-of-line in a string constant (non-portable code)" + | Duplicate_definitions (kind, cname, tc1, tc2) -> + Printf.sprintf "the %s %s is defined in both types %s and %s." + kind cname tc1 tc2 ;; let nerrors = ref 0;; @@ -281,3 +292,51 @@ let check_fatal () = raise e; end; ;; + + +let descriptions = + [ + 1, "Suspicious-looking start-of-comment mark."; + 2, "Suspicious-looking end-of-comment mark."; + 3, "Deprecated syntax."; + 4, "Fragile pattern matching: matching that will remain complete even\n\ + \ if additional constructors are added to one of the variant types\n\ + \ matched."; + 5, "Partially applied function: expression whose result has function\n\ + \ type and is ignored."; + 6, "Label omitted in function application."; + 7, "Some methods are overriden in the class where they are defined."; + 8, "Partial match: missing cases in pattern-matching."; + 9, "Missing fields in a record pattern."; + 10, "Expression on the left-hand side of a sequence that doesn't have type\n\ + \ \"unit\" (and that is not a function, see warning number 5)."; + 11, "Redundant case in a pattern matching (unused match case)."; + 12, "Redundant sub-pattern in a pattern-matching."; + 13, "Override of an instance variable."; + 14, "Illegal backslash escape in a string constant."; + 15, "Private method made public implicitly."; + 16, "Unerasable optional argument."; + 17, "Undeclared virtual method."; + 18, "Non-principal type."; + 19, "Type without principality."; + 20, "Unused function argument."; + 21, "Non-returning statement."; + 22, "Camlp4 warning."; + 23, "Useless record \"with\" clause."; + 24, "Bad module name: the source file name is not a valid OCaml module name."; + 25, "Pattern-matching with all clauses guarded. Exhaustiveness cannot be\n\ + \ checked"; + 26, "Suspicious unused variable: unused variable that is bound with \"let\"\n\ + \ or \"as\", and doesn't start with an underscore (\"_\") character."; + 27, "Innocuous unused variable: unused variable that is not bound with\n\ + \ \"let\" nor \"as\", and doesn't start with an underscore (\"_\")\n\ + \ character."; + 28, "Wildcard pattern given as argument to a constant constructor."; + 29, "Unescaped end-of-line in a string constant (non-portable code)."; + 30, "Two labels or constructors of the same name are defined in two\n\ + \ mutually recursive types."; + ] + +let help_warnings () = + List.iter (fun (i, s) -> Printf.printf "%3i %s\n" i s) descriptions; + exit 0 diff --git a/utils/warnings.mli b/utils/warnings.mli index 0664788e..c9e577d9 100644 --- a/utils/warnings.mli +++ b/utils/warnings.mli @@ -44,6 +44,7 @@ type t = | Unused_var_strict of string (* 27 *) | Wildcard_arg_to_constant_constr (* 28 *) | Eol_in_string (* 29 *) + | Duplicate_definitions of string * string * string * string (*30 *) ;; val parse_options : bool -> string -> unit;; @@ -61,3 +62,5 @@ val print : formatter -> t -> int;; exception Errors of int;; val check_fatal : unit -> unit;; + +val help_warnings: unit -> unit -- 2.30.2