From 919e17821ee05626b8b5b854d87d0cc375914131 Mon Sep 17 00:00:00 2001 From: Stephane Glondu Date: Tue, 19 May 2009 17:41:21 +0200 Subject: [PATCH] Imported Upstream version 3.11.1~rc0 --- .depend | 44 ++--- Changes | 50 +++++- Makefile | 12 +- VERSION | 4 +- _tags | 3 +- asmcomp/amd64/emit.mlp | 13 +- asmcomp/amd64/proc.ml | 6 +- asmcomp/cmmgen.ml | 15 +- asmcomp/emitaux.ml | 15 +- asmcomp/emitaux.mli | 4 +- asmcomp/i386/emit.mlp | 13 +- asmcomp/i386/emit_nt.mlp | 4 +- asmcomp/power/emit.mlp | 6 +- asmrun/signals_osdep.h | 34 +++- boot/myocamlbuild.boot | Bin 394071 -> 394617 bytes boot/ocamlc | Bin 1040675 -> 1043760 bytes boot/ocamldep | Bin 288237 -> 289197 bytes boot/ocamllex | Bin 164503 -> 165447 bytes bytecomp/bytegen.ml | 4 +- bytecomp/bytepackager.ml | 28 +-- bytecomp/dll.ml | 11 +- bytecomp/instruct.ml | 3 +- bytecomp/instruct.mli | 3 +- byterun/Makefile | 12 +- byterun/finalise.c | 4 +- byterun/globroots.c | 24 ++- byterun/int64_emul.h | 5 +- byterun/int64_native.h | 5 +- byterun/ints.c | 47 ++++- camlp4/Camlp4/Printers/OCamlr.ml | 6 +- .../Camlp4Parsers/Camlp4OCamlRevisedParser.ml | 1 + camlp4/boot/Camlp4.ml | 46 +++-- camlp4/boot/camlp4boot.ml | 66 ++++--- configure | 22 ++- debugger/.depend | 164 +++++++++--------- debugger/breakpoints.ml | 11 +- debugger/command_line.ml | 37 ++-- debugger/debugger_config.ml | 4 +- debugger/debugger_config.mli | 3 +- debugger/dynlink.ml | 25 ++- debugger/dynlink.mli | 38 ++-- debugger/envaux.ml | 35 ++-- debugger/eval.ml | 18 +- debugger/events.ml | 4 +- debugger/frames.ml | 4 +- debugger/history.ml | 3 +- debugger/input_handling.ml | 4 +- debugger/lexer.mll | 3 +- debugger/loadprinter.ml | 3 +- debugger/main.ml | 12 +- debugger/parameters.ml | 8 +- debugger/parameters.mli | 3 +- debugger/parser.mly | 29 +++- debugger/parser_aux.mli | 6 +- debugger/primitives.ml | 58 +------ debugger/primitives.mli | 23 +-- debugger/printval.ml | 4 +- debugger/program_loading.ml | 3 +- debugger/program_management.ml | 5 +- debugger/show_information.ml | 3 +- debugger/show_source.ml | 3 +- debugger/source.ml | 26 ++- debugger/symbols.ml | 4 +- debugger/time_travel.ml | 4 +- debugger/unix_tools.ml | 8 +- driver/main.ml | 10 +- man/ocaml.m | 4 +- myocamlbuild.ml | 10 +- ocamlbuild/Makefile | 10 ++ ocamlbuild/bool.ml | 2 +- ocamlbuild/bool.mli | 2 +- ocamlbuild/command.ml | 2 +- ocamlbuild/command.mli | 2 +- ocamlbuild/configuration.ml | 2 +- ocamlbuild/configuration.mli | 2 +- ocamlbuild/discard_printf.ml | 2 +- ocamlbuild/discard_printf.mli | 2 +- ocamlbuild/display.ml | 2 +- ocamlbuild/display.mli | 2 +- ocamlbuild/fda.ml | 2 +- ocamlbuild/fda.mli | 2 +- ocamlbuild/flags.ml | 2 +- ocamlbuild/flags.mli | 2 +- ocamlbuild/glob.ml | 2 +- ocamlbuild/glob.mli | 2 +- ocamlbuild/glob_ast.ml | 2 +- ocamlbuild/glob_ast.mli | 2 +- ocamlbuild/glob_lexer.mli | 2 +- ocamlbuild/glob_lexer.mll | 2 +- ocamlbuild/hooks.ml | 2 +- ocamlbuild/hooks.mli | 2 +- ocamlbuild/hygiene.ml | 2 +- ocamlbuild/hygiene.mli | 2 +- ocamlbuild/lexers.mli | 2 +- ocamlbuild/lexers.mll | 2 +- ocamlbuild/log.ml | 2 +- ocamlbuild/log.mli | 2 +- ocamlbuild/main.ml | 2 +- ocamlbuild/main.mli | 2 +- ocamlbuild/misc/opentracer.ml | 2 +- ocamlbuild/my_std.ml | 2 +- ocamlbuild/my_std.mli | 2 +- ocamlbuild/my_unix.ml | 2 +- ocamlbuild/my_unix.mli | 2 +- ocamlbuild/ocaml_arch.ml | 2 +- ocamlbuild/ocaml_arch.mli | 2 +- ocamlbuild/ocaml_compiler.ml | 2 +- ocamlbuild/ocaml_compiler.mli | 2 +- ocamlbuild/ocaml_dependencies.ml | 2 +- ocamlbuild/ocaml_dependencies.mli | 2 +- ocamlbuild/ocaml_specific.ml | 14 +- ocamlbuild/ocaml_specific.mli | 2 +- ocamlbuild/ocaml_tools.ml | 2 +- ocamlbuild/ocaml_tools.mli | 2 +- ocamlbuild/ocaml_utils.ml | 2 +- ocamlbuild/ocaml_utils.mli | 2 +- ocamlbuild/ocamlbuild.ml | 2 +- ocamlbuild/ocamlbuild.mli | 2 +- ocamlbuild/ocamlbuild_executor.ml | 2 +- ocamlbuild/ocamlbuild_executor.mli | 2 +- ocamlbuild/ocamlbuild_pack.mlpack | 1 + ocamlbuild/ocamlbuild_plugin.ml | 2 +- ocamlbuild/ocamlbuild_unix_plugin.ml | 2 +- ocamlbuild/ocamlbuild_unix_plugin.mli | 2 +- ocamlbuild/ocamlbuild_where.ml | 5 + ocamlbuild/ocamlbuild_where.mli | 2 +- ocamlbuild/ocamlbuildlight.ml | 2 +- ocamlbuild/ocamlbuildlight.mli | 2 +- ocamlbuild/options.ml | 2 +- ocamlbuild/options.mli | 2 +- ocamlbuild/pathname.ml | 2 +- ocamlbuild/pathname.mli | 2 +- ocamlbuild/plugin.ml | 2 +- ocamlbuild/plugin.mli | 2 +- ocamlbuild/ppcache.ml | 2 +- ocamlbuild/ppcache.mli | 2 +- ocamlbuild/report.ml | 2 +- ocamlbuild/report.mli | 2 +- ocamlbuild/resource.ml | 2 +- ocamlbuild/resource.mli | 2 +- ocamlbuild/rule.ml | 2 +- ocamlbuild/rule.mli | 2 +- ocamlbuild/shell.ml | 2 +- ocamlbuild/shell.mli | 2 +- ocamlbuild/signatures.mli | 2 +- ocamlbuild/slurp.ml | 2 +- ocamlbuild/slurp.mli | 2 +- ocamlbuild/solver.ml | 2 +- ocamlbuild/solver.mli | 2 +- ocamlbuild/start.sh | 2 +- ocamlbuild/std_signatures.mli | 2 +- ocamlbuild/tags.ml | 2 +- ocamlbuild/tags.mli | 2 +- ocamlbuild/tools.ml | 2 +- ocamlbuild/tools.mli | 2 +- ocamldoc/.depend | 8 - ocamldoc/Makefile | 31 ++-- ocamldoc/Makefile.nt | 11 +- ocamldoc/odoc.ml | 22 +-- ocamldoc/odoc_args.ml | 10 +- ocamldoc/odoc_args.mli | 6 +- ocamldoc/odoc_messages.ml | 7 +- ocamldoc/odoc_name.ml | 15 +- ocamldoc/odoc_opt.ml | 81 --------- otherlibs/dbm/Makefile | 3 +- otherlibs/labltk/lib/Makefile | 4 +- otherlibs/labltk/support/Makefile.common | 6 +- otherlibs/labltk/tkanim/Makefile | 4 +- otherlibs/num/big_int.ml | 6 +- otherlibs/num/test/test_big_ints.ml | 10 ++ otherlibs/str/str.ml | 33 ++-- otherlibs/systhreads/posix.c | 38 ++-- otherlibs/unix/unix.mli | 5 +- otherlibs/win32unix/pipe.c | 5 +- otherlibs/win32unix/stat.c | 6 +- otherlibs/win32unix/unixsupport.c | 3 +- stdlib/format.ml | 13 +- stdlib/map.mli | 6 +- stdlib/parsing.ml | 14 +- stdlib/pervasives.mli | 58 ++++--- stdlib/printf.ml | 47 ++++- stdlib/scanf.ml | 24 ++- typing/ctype.ml | 55 +++--- typing/ctype.mli | 5 +- typing/env.ml | 26 ++- typing/includeclass.ml | 8 +- typing/parmatch.ml | 15 +- typing/subst.ml | 11 +- typing/subst.mli | 6 +- typing/typeclass.ml | 10 +- typing/typecore.ml | 30 ++-- typing/typedecl.ml | 24 ++- typing/typetexp.ml | 2 +- utils/config.mlbuild | 20 ++- utils/config.mlp | 16 +- utils/tbl.ml | 6 +- utils/tbl.mli | 3 +- 197 files changed, 1137 insertions(+), 861 deletions(-) create mode 100644 ocamlbuild/ocamlbuild_where.ml delete mode 100644 ocamldoc/odoc_opt.ml diff --git a/.depend b/.depend index 57e692f3..b52df953 100644 --- a/.depend +++ b/.depend @@ -164,13 +164,15 @@ typing/oprint.cmo: typing/outcometree.cmi parsing/asttypes.cmi \ typing/oprint.cmx: typing/outcometree.cmi parsing/asttypes.cmi \ typing/oprint.cmi typing/parmatch.cmo: utils/warnings.cmi typing/types.cmi typing/typedtree.cmi \ - typing/predef.cmi typing/path.cmi utils/misc.cmi parsing/location.cmi \ - typing/ident.cmi typing/env.cmi typing/datarepr.cmi typing/ctype.cmi \ - typing/btype.cmi parsing/asttypes.cmi typing/parmatch.cmi + typing/subst.cmi typing/predef.cmi typing/path.cmi utils/misc.cmi \ + parsing/location.cmi typing/ident.cmi typing/env.cmi typing/datarepr.cmi \ + typing/ctype.cmi typing/btype.cmi parsing/asttypes.cmi \ + typing/parmatch.cmi typing/parmatch.cmx: utils/warnings.cmx typing/types.cmx typing/typedtree.cmx \ - typing/predef.cmx typing/path.cmx utils/misc.cmx parsing/location.cmx \ - typing/ident.cmx typing/env.cmx typing/datarepr.cmx typing/ctype.cmx \ - typing/btype.cmx parsing/asttypes.cmi typing/parmatch.cmi + typing/subst.cmx typing/predef.cmx typing/path.cmx utils/misc.cmx \ + parsing/location.cmx typing/ident.cmx typing/env.cmx typing/datarepr.cmx \ + typing/ctype.cmx typing/btype.cmx parsing/asttypes.cmi \ + typing/parmatch.cmi typing/path.cmo: typing/ident.cmi typing/path.cmi typing/path.cmx: typing/ident.cmx typing/path.cmi typing/predef.cmo: typing/types.cmi typing/path.cmi typing/ident.cmi \ @@ -287,7 +289,7 @@ bytecomp/bytesections.cmi: bytecomp/cmo_format.cmi: bytecomp/lambda.cmi typing/ident.cmi bytecomp/dll.cmi: bytecomp/emitcode.cmi: bytecomp/instruct.cmi bytecomp/cmo_format.cmi -bytecomp/instruct.cmi: typing/types.cmi parsing/location.cmi \ +bytecomp/instruct.cmi: typing/types.cmi typing/subst.cmi parsing/location.cmi \ bytecomp/lambda.cmi typing/ident.cmi typing/env.cmi bytecomp/lambda.cmi: typing/types.cmi typing/primitive.cmi typing/path.cmi \ parsing/location.cmi typing/ident.cmi typing/env.cmi parsing/asttypes.cmi @@ -310,12 +312,12 @@ bytecomp/translmod.cmi: typing/typedtree.cmi typing/primitive.cmi \ bytecomp/translobj.cmi: bytecomp/lambda.cmi typing/ident.cmi typing/env.cmi bytecomp/typeopt.cmi: typing/typedtree.cmi typing/path.cmi \ bytecomp/lambda.cmi -bytecomp/bytegen.cmo: typing/types.cmi bytecomp/switch.cmi typing/stypes.cmi \ - typing/primitive.cmi utils/misc.cmi bytecomp/lambda.cmi \ +bytecomp/bytegen.cmo: typing/types.cmi bytecomp/switch.cmi typing/subst.cmi \ + typing/stypes.cmi typing/primitive.cmi utils/misc.cmi bytecomp/lambda.cmi \ bytecomp/instruct.cmi typing/ident.cmi utils/config.cmi \ parsing/asttypes.cmi typing/annot.cmi bytecomp/bytegen.cmi -bytecomp/bytegen.cmx: typing/types.cmx bytecomp/switch.cmx typing/stypes.cmx \ - typing/primitive.cmx utils/misc.cmx bytecomp/lambda.cmx \ +bytecomp/bytegen.cmx: typing/types.cmx bytecomp/switch.cmx typing/subst.cmx \ + typing/stypes.cmx typing/primitive.cmx utils/misc.cmx bytecomp/lambda.cmx \ bytecomp/instruct.cmx typing/ident.cmx utils/config.cmx \ parsing/asttypes.cmi typing/annot.cmi bytecomp/bytegen.cmi bytecomp/bytelibrarian.cmo: utils/misc.cmi utils/config.cmi \ @@ -335,15 +337,15 @@ bytecomp/bytelink.cmx: bytecomp/symtable.cmx bytecomp/opcodes.cmx \ utils/clflags.cmx utils/ccomp.cmx bytecomp/bytesections.cmx \ bytecomp/bytelink.cmi bytecomp/bytepackager.cmo: typing/typemod.cmi bytecomp/translmod.cmi \ - utils/misc.cmi bytecomp/instruct.cmi typing/ident.cmi typing/env.cmi \ - bytecomp/emitcode.cmi utils/config.cmi bytecomp/cmo_format.cmi \ - utils/clflags.cmi bytecomp/bytelink.cmi bytecomp/bytegen.cmi \ - bytecomp/bytepackager.cmi + typing/subst.cmi typing/path.cmi utils/misc.cmi bytecomp/instruct.cmi \ + typing/ident.cmi typing/env.cmi bytecomp/emitcode.cmi utils/config.cmi \ + bytecomp/cmo_format.cmi utils/clflags.cmi bytecomp/bytelink.cmi \ + bytecomp/bytegen.cmi bytecomp/bytepackager.cmi bytecomp/bytepackager.cmx: typing/typemod.cmx bytecomp/translmod.cmx \ - utils/misc.cmx bytecomp/instruct.cmx typing/ident.cmx typing/env.cmx \ - bytecomp/emitcode.cmx utils/config.cmx bytecomp/cmo_format.cmi \ - utils/clflags.cmx bytecomp/bytelink.cmx bytecomp/bytegen.cmx \ - bytecomp/bytepackager.cmi + typing/subst.cmx typing/path.cmx utils/misc.cmx bytecomp/instruct.cmx \ + typing/ident.cmx typing/env.cmx bytecomp/emitcode.cmx utils/config.cmx \ + bytecomp/cmo_format.cmi utils/clflags.cmx bytecomp/bytelink.cmx \ + bytecomp/bytegen.cmx bytecomp/bytepackager.cmi bytecomp/bytesections.cmo: utils/config.cmi bytecomp/bytesections.cmi bytecomp/bytesections.cmx: utils/config.cmx bytecomp/bytesections.cmi bytecomp/dll.cmo: utils/misc.cmi utils/config.cmi bytecomp/dll.cmi @@ -358,9 +360,9 @@ bytecomp/emitcode.cmx: bytecomp/translmod.cmx typing/primitive.cmx \ bytecomp/instruct.cmx typing/env.cmx utils/config.cmx \ bytecomp/cmo_format.cmi utils/clflags.cmx typing/btype.cmx \ parsing/asttypes.cmi bytecomp/emitcode.cmi -bytecomp/instruct.cmo: typing/types.cmi parsing/location.cmi \ +bytecomp/instruct.cmo: typing/types.cmi typing/subst.cmi parsing/location.cmi \ bytecomp/lambda.cmi typing/ident.cmi typing/env.cmi bytecomp/instruct.cmi -bytecomp/instruct.cmx: typing/types.cmx parsing/location.cmx \ +bytecomp/instruct.cmx: typing/types.cmx typing/subst.cmx parsing/location.cmx \ bytecomp/lambda.cmx typing/ident.cmx typing/env.cmx bytecomp/instruct.cmi bytecomp/lambda.cmo: typing/types.cmi typing/primitive.cmi typing/path.cmi \ utils/misc.cmi parsing/location.cmi typing/ident.cmi typing/env.cmi \ diff --git a/Changes b/Changes index 4176ceb6..34eb1d98 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,51 @@ +Objective Caml 3.11.1: +---------------------- + +Bug fixes: +- PR#4095: ocamldebug: strange behaviour of control-C +- PR#4403: ocamldebug: improved handling of packed modules +- PR#4650: Str.regexp_case_fold mis-handling complemented character sets [^a] +- PR#4660: Scanf.format_from_string: handling of double quote +- PR#4666: Unix.exec* failure in multithread programs under MacOS X and FreeBSD +- PR#4667: debugger out of sync with dynlink changes +- PR#4678: random "out of memory" error with systhreads +- PR#4690: issue with dynamic loading under MacOS 10.5 +- PR#4692: wrong error message with options -i and -pack passed to ocamlc +- PR#4699: in otherlibs/dbm, fixed construction of dlldbm.so. +- PR#4704: error in caml_modify_generational_global_root() +- PR#4708: (ocamldoc) improved printing of infix identifiers such as "lor". +- PR#4722: typo in configure script +- PR#4729: documented the fact that PF_INET6 is not available on all platforms +- PR#4730: incorrect typing involving abbreviation "type 'a t = 'a" +- PR#4731: incorrect quoting of arguments passed to the assembler on x86-64 +- PR#4735: Unix.LargeFile.fstat cannot report size over 32bits on Win32 +- PR#4740: guard against possible processor error in + {Int32,Int64,Nativeint}.{div,rem} +- PR#4745: type inference wrongly produced non-generalizable type variables. +- PR#4749: better pipe size for win32unix +- PR#4756: printf: no error reported for wrong format '%_s' +- PR#4758: scanf: handling of \ by format '%S' +- PR#4766: incorrect simplification of some type abbreviations. +- PR#4768: printf: %F does not respect width and precision specifications +- PR#4769: Format.bprintf fails to flush +- PR#4775: compiler crash on crazy types (temporary fix) +- PR#4776: bad interaction between exceptions and classes +- PR#4780: labltk build problem under Windows. +- PR#4790: under Windows, map ERROR_NO_DATA Win32 error to EPIPE Unix error. +- PR#4792: bug in Big_int.big_int_of_int64 on 32-bit platforms. +- Module Parsing: improved computation of locations when an ocamlyacc rule + starts with an empty nonterminal +- Type-checker: fixed wrong variance computation for private types +- x86-32 code generator, MSVC port: wrong "fld" instruction generated. +- ocamlbuild: incorrectly using the compile-time value of $OCAMLLIB +- Makefile problem when configured with -no-shared-libs +- ocamldoc: use dynamic loading in native code + +Other changes: +- Improved wording of various error messages + (contributed by Jonathan Davies, Citrix). +- Support for 64-bit mode in Solaris/x86 (PR#4670). + Objective Caml 3.11.0: ---------------------- @@ -2387,4 +2435,4 @@ Caml Special Light 1.06: * First public release. -$Id: Changes,v 1.183.2.8 2008/12/03 16:16:30 doligez Exp $ +$Id: Changes,v 1.183.2.13 2009/05/19 14:46:13 doligez Exp $ diff --git a/Makefile b/Makefile index 5a015ee3..c33a2686 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ # # ######################################################################### -# $Id: Makefile,v 1.222.2.2 2008/10/23 15:29:11 ertai Exp $ +# $Id: Makefile,v 1.222.2.3 2009/05/19 14:46:13 doligez Exp $ # The main Makefile @@ -739,14 +739,8 @@ clean:: $(CAMLOPT) $(COMPFLAGS) -c $< partialclean:: - rm -f utils/*.cm[iox] utils/*.[so] utils/*~ - rm -f parsing/*.cm[iox] parsing/*.[so] parsing/*~ - rm -f typing/*.cm[iox] typing/*.[so] typing/*~ - rm -f bytecomp/*.cm[iox] bytecomp/*.[so] bytecomp/*~ - rm -f asmcomp/*.cm[iox] asmcomp/*.[so] asmcomp/*~ - rm -f driver/*.cm[iox] driver/*.[so] driver/*~ - rm -f toplevel/*.cm[iox] toplevel/*.[so] toplevel/*~ - rm -f tools/*.cm[iox] tools/*.[so] tools/*~ + for d in utils parsing typing bytecomp asmcomp driver toplevel tools; \ + do rm -f $$d/*.cm[iox] $$d/*.annot $$d/*.[so] $$d/*~; done rm -f *~ depend: beforedepend diff --git a/VERSION b/VERSION index 8444af03..7486269b 100644 --- a/VERSION +++ b/VERSION @@ -1,6 +1,6 @@ -3.11.0 +3.11.1+rc0 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli -# $Id: VERSION,v 1.26.2.7 2008/12/03 16:16:30 doligez Exp $ +# $Id: VERSION,v 1.26.2.13 2009/05/19 14:46:13 doligez Exp $ diff --git a/_tags b/_tags index 47121f86..37ba928e 100644 --- a/_tags +++ b/_tags @@ -26,8 +26,7 @@ true: use_stdlib : -debug : ocamldoc_sources : include_unix, include_str, include_dynlink -"ocamldoc/odoc.byte": use_unix, use_str, use_dynlink -"ocamldoc/odoc_opt.native": use_unix, use_str +: use_unix, use_str, use_dynlink : camlp4boot, -warn_Alez, warn_Ale : -camlp4boot diff --git a/asmcomp/amd64/emit.mlp b/asmcomp/amd64/emit.mlp index 4516178a..a5b4643f 100644 --- a/asmcomp/amd64/emit.mlp +++ b/asmcomp/amd64/emit.mlp @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: emit.mlp,v 1.16.2.2 2008/11/08 16:08:09 xleroy Exp $ *) +(* $Id: emit.mlp,v 1.16.2.4 2009/03/28 15:10:04 xleroy Exp $ *) (* Emission of x86-64 (AMD 64) assembly code *) @@ -668,7 +668,11 @@ let fundecl fundecl = bound_error_call := 0; ` .text\n`; emit_align 16; - ` .globl {emit_symbol fundecl.fun_name}\n`; + if macosx && is_generic_function fundecl.fun_name + then (* PR#4690 *) + ` .private_extern {emit_symbol fundecl.fun_name}\n` + else + ` .globl {emit_symbol fundecl.fun_name}\n`; `{emit_symbol fundecl.fun_name}:\n`; if !Clflags.gprofile then emit_profile(); if frame_required() then begin @@ -753,12 +757,13 @@ let begin_assembly() = let lbl_begin = Compilenv.make_symbol (Some "code_begin") in ` .text\n`; ` .globl {emit_symbol lbl_begin}\n`; - `{emit_symbol lbl_begin}:\n` + `{emit_symbol lbl_begin}:\n`; + if macosx then ` nop\n` (* PR#4690 *) let end_assembly() = let lbl_end = Compilenv.make_symbol (Some "code_end") in ` .text\n`; - if macosx then ` NOP\n`; (* suppress "ld warning: atom sorting error" *) + if macosx then ` nop\n`; (* suppress "ld warning: atom sorting error" *) ` .globl {emit_symbol lbl_end}\n`; `{emit_symbol lbl_end}:\n`; ` .data\n`; diff --git a/asmcomp/amd64/proc.ml b/asmcomp/amd64/proc.ml index f4cf2555..d6766eee 100644 --- a/asmcomp/amd64/proc.ml +++ b/asmcomp/amd64/proc.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: proc.ml,v 1.5 2007/11/06 15:16:55 frisch Exp $ *) +(* $Id: proc.ml,v 1.5.4.1 2009/03/28 15:52:13 xleroy Exp $ *) (* Description of the AMD64 processor *) @@ -197,5 +197,5 @@ let contains_calls = ref false (* Calling the assembler *) let assemble_file infile outfile = - Ccomp.command (Config.asm ^ " -o " ^ outfile ^ " " ^ infile) - + Ccomp.command (Config.asm ^ " -o " ^ + Filename.quote outfile ^ " " ^ Filename.quote infile) diff --git a/asmcomp/cmmgen.ml b/asmcomp/cmmgen.ml index e9041f06..9cf8c956 100644 --- a/asmcomp/cmmgen.ml +++ b/asmcomp/cmmgen.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: cmmgen.ml,v 1.114 2008/08/05 13:35:20 xleroy Exp $ *) +(* $Id: cmmgen.ml,v 1.114.2.1 2009/01/26 17:06:10 xleroy Exp $ *) (* Translation from closed lambda to C-- *) @@ -1943,9 +1943,8 @@ module IntSet = Set.Make( end) let default_apply = IntSet.add 2 (IntSet.add 3 IntSet.empty) - (* These apply funs are always present in the main program. - TODO: add more, and do the same for send and curry funs - (maybe up to 10-15?). *) + (* These apply funs are always present in the main program because + the run-time system needs them (cf. asmrun/.S) . *) let generic_functions shared units = let (apply,send,curry) = @@ -1955,12 +1954,8 @@ let generic_functions shared units = List.fold_right IntSet.add ui.Compilenv.ui_send_fun send, List.fold_right IntSet.add ui.Compilenv.ui_curry_fun curry) (IntSet.empty,IntSet.empty,IntSet.empty) - units - in - let apply = - if shared then IntSet.diff apply default_apply - else IntSet.union apply default_apply - in + units in + let apply = if shared then apply else IntSet.union apply default_apply in let accu = IntSet.fold (fun n accu -> apply_function n :: accu) apply [] in let accu = IntSet.fold (fun n accu -> send_function n :: accu) send accu in IntSet.fold (fun n accu -> curry_function n @ accu) curry accu diff --git a/asmcomp/emitaux.ml b/asmcomp/emitaux.ml index ee381a59..fe8279a3 100644 --- a/asmcomp/emitaux.ml +++ b/asmcomp/emitaux.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: emitaux.ml,v 1.12 2007/01/29 12:10:50 xleroy Exp $ *) +(* $Id: emitaux.ml,v 1.12.12.1 2009/01/26 17:06:10 xleroy Exp $ *) (* Common functions for emitting assembly code *) @@ -156,3 +156,16 @@ let emit_frames a = List.iter emit_frame !frame_descriptors; Hashtbl.iter emit_filename filenames; frame_descriptors := [] + +(* Detection of functions that can be duplicated between a DLL and + the main program (PR#4690) *) + +let isprefix s1 s2 = + String.length s1 <= String.length s2 + && String.sub s2 0 (String.length s1) = s1 + +let is_generic_function name = + List.exists + (fun p -> isprefix p name) + ["caml_apply"; "caml_curry"; "caml_send"; "caml_tuplify"] + diff --git a/asmcomp/emitaux.mli b/asmcomp/emitaux.mli index bf8ef1e7..a63c8bab 100644 --- a/asmcomp/emitaux.mli +++ b/asmcomp/emitaux.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: emitaux.mli,v 1.12 2007/01/29 12:10:50 xleroy Exp $ *) +(* $Id: emitaux.mli,v 1.12.12.1 2009/01/26 17:06:10 xleroy Exp $ *) (* Common functions for emitting assembly code *) @@ -45,3 +45,5 @@ type emit_frame_actions = efa_string: string -> unit } val emit_frames: emit_frame_actions -> unit + +val is_generic_function: string -> bool diff --git a/asmcomp/i386/emit.mlp b/asmcomp/i386/emit.mlp index 13af9815..a073675f 100644 --- a/asmcomp/i386/emit.mlp +++ b/asmcomp/i386/emit.mlp @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: emit.mlp,v 1.41.2.2 2008/11/08 16:08:09 xleroy Exp $ *) +(* $Id: emit.mlp,v 1.41.2.4 2009/03/28 15:10:04 xleroy Exp $ *) (* Emission of Intel 386 assembly code *) @@ -888,7 +888,11 @@ let fundecl fundecl = bound_error_call := 0; ` .text\n`; emit_align 16; - ` .globl {emit_symbol fundecl.fun_name}\n`; + if macosx && is_generic_function fundecl.fun_name + then (* PR#4690 *) + ` .private_extern {emit_symbol fundecl.fun_name}\n` + else + ` .globl {emit_symbol fundecl.fun_name}\n`; `{emit_symbol fundecl.fun_name}:\n`; if !Clflags.gprofile then emit_profile(); let n = frame_size() - 4 in @@ -954,12 +958,13 @@ let begin_assembly() = let lbl_begin = Compilenv.make_symbol (Some "code_begin") in ` .text\n`; ` .globl {emit_symbol lbl_begin}\n`; - `{emit_symbol lbl_begin}:\n` + `{emit_symbol lbl_begin}:\n`; + if macosx then ` nop\n` (* PR#4690 *) let end_assembly() = let lbl_end = Compilenv.make_symbol (Some "code_end") in ` .text\n`; - if macosx then ` NOP\n`; (* suppress "ld warning: atom sorting error" *) + if macosx then ` nop\n`; (* suppress "ld warning: atom sorting error" *) ` .globl {emit_symbol lbl_end}\n`; `{emit_symbol lbl_end}:\n`; ` .data\n`; diff --git a/asmcomp/i386/emit_nt.mlp b/asmcomp/i386/emit_nt.mlp index 8cf816ac..5195b21f 100644 --- a/asmcomp/i386/emit_nt.mlp +++ b/asmcomp/i386/emit_nt.mlp @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: emit_nt.mlp,v 1.28 2008/01/11 16:13:11 doligez Exp $ *) +(* $Id: emit_nt.mlp,v 1.28.4.1 2009/03/21 16:15:47 xleroy Exp $ *) (* Emission of Intel 386 assembly code, MASM syntax. *) @@ -379,7 +379,7 @@ let emit_instr i = if is_tos src then ` fstp {emit_reg dst}\n` else if is_tos dst then - ` fld {emit_reg dst}\n` + ` fld {emit_reg src}\n` else begin ` fld {emit_reg src}\n`; ` fstp {emit_reg dst}\n` diff --git a/asmcomp/power/emit.mlp b/asmcomp/power/emit.mlp index e9c12fee..5c2063d4 100644 --- a/asmcomp/power/emit.mlp +++ b/asmcomp/power/emit.mlp @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: emit.mlp,v 1.26 2007/11/09 15:06:57 frisch Exp $ *) +(* $Id: emit.mlp,v 1.26.4.1 2009/01/26 17:06:10 xleroy Exp $ *) (* Emission of PowerPC assembly code *) @@ -835,6 +835,10 @@ let fundecl fundecl = call_gc_label := 0; float_literals := []; int_literals := []; + if Config.system = "rhapsody" && is_generic_function fundecl.fun_name + then (* PR#4690 *) + ` .private_extern {emit_symbol fundecl.fun_name}\n` + else ` .globl {emit_symbol fundecl.fun_name}\n`; begin match Config.system with | "elf" | "bsd" -> diff --git a/asmrun/signals_osdep.h b/asmrun/signals_osdep.h index 919ff452..0422c2d1 100644 --- a/asmrun/signals_osdep.h +++ b/asmrun/signals_osdep.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: signals_osdep.h,v 1.11.4.1 2008/11/07 10:34:16 xleroy Exp $ */ +/* $Id: signals_osdep.h,v 1.11.4.2 2009/03/28 15:18:31 xleroy Exp $ */ /* Processor- and OS-dependent signal interface */ @@ -76,6 +76,25 @@ #define CONTEXT_SP (CONTEXT_STATE.CONTEXT_REG(rsp)) #define CONTEXT_FAULTING_ADDRESS ((char *) info->si_addr) +/****************** AMD64, Solaris x86 */ + +#elif defined(TARGET_amd64) && defined (SYS_solaris) + + #include + + #define DECLARE_SIGNAL_HANDLER(name) \ + static void name(int sig, siginfo_t * info, ucontext_t * context) + + #define SET_SIGACT(sigact,name) \ + sigact.sa_sigaction = (void (*)(int,siginfo_t *,void *)) (name); \ + sigact.sa_flags = SA_SIGINFO + + typedef greg_t context_reg; + #define CONTEXT_PC (context->uc_mcontext.gregs[REG_RIP]) + #define CONTEXT_EXCEPTION_POINTER (context->uc_mcontext.gregs[REG_R14]) + #define CONTEXT_YOUNG_PTR (context->uc_mcontext.gregs[REG_R15]) + #define CONTEXT_FAULTING_ADDRESS ((char *) info->si_addr) + /****************** I386, Linux */ #elif defined(TARGET_i386) && defined(SYS_linux_elf) @@ -126,6 +145,19 @@ #define CONTEXT_PC (CONTEXT_STATE.CONTEXT_REG(eip)) #define CONTEXT_FAULTING_ADDRESS ((char *) info->si_addr) +/****************** I386, Solaris x86 */ + +#elif defined(TARGET_i386) && defined(SYS_solaris) + + #define DECLARE_SIGNAL_HANDLER(name) \ + static void name(int sig, siginfo_t * info, void * context) + + #define SET_SIGACT(sigact,name) \ + sigact.sa_sigaction = (name); \ + sigact.sa_flags = SA_SIGINFO + + #define CONTEXT_FAULTING_ADDRESS ((char *) info->si_addr) + /****************** MIPS, all OS */ #elif defined(TARGET_mips) diff --git a/boot/myocamlbuild.boot b/boot/myocamlbuild.boot index 2ee22ef5dfbd950ec21c3f782b463785fb9229ea..58a535d7430f5b16bb8a0815c1c615e58f832650 100755 GIT binary patch delta 10707 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

Cw<9h9%F+9Z0GYdfeb>YT~jdBctMg3HaHoYYB8 zvi${gB7&4aFLK%4YKXdIQo8I^y5ds$w^Qk=NvTGZ`pV??Wou{5qH8AR-!hBhcz$Pf zukAYM?zN$ot2(O>IIXLSG&X(WqJF9upX{QZ;N{)WyWFno9`fduUDdT{ADk}SiuLd= z*CAQ|WF2##BkPNSSgy`NDFt;`A0n9T-PKphs(9ix6~fkZm0VBy*uX^?5vkg8{5|St z)MdS%YLwO55T;YaEazpYRIW@^zT7hwMNxsuKt=rCM?Ir#Hd8SE9Nte2=j&b6Kt9wD zQO|ln-OICDssO9RChMzR;_C0;$fVU+@uW-CMruER<2%5CF?xX}kswa*ua??^O(ci- zisR}Bk)iBIRiIYg*Ox1sViu&y4D0EQXsc7ytK2gcQ)d1Un3ZIFke04w%B2rbJGk{w zWT)~R`qFct+GlCe6!y)B(GU+jRB_!H)tz%wu^LniRj(menAFCK>YV7Qa9zCxxn^!)gLc>y_FPW4l z+4yyS7L%I3mrJH#_9Q-yCEd{NOuWD0j{V&mraAm`=&y* zavHWL+|`7gE^G%Ug02QQt*L>EBRZ+z27?faxE-vxS0}8mt0Cm><`D4A-5e_2oXb0( zafdd{720qkwD5-^@9vJfbw@hFW#2YU1*nlOy-|i<&?9%! zUF{5g#vIkLCC${!R;u+1u_lyZ$ck61#aLVL-b)s%@7AeyyljoyYL~>zjFH5P<5^s= z2J*|+s%f|J3U2W3;o^1bp4$WpMIeHyT(yL=m~ypLoPECDNL}6ru$pcV7AI{`j;7*T zPR}g>V*u`xbSXnL)nL0Llg-I}hA-9kY*2G8G+Q6M34;Mg1)CMV4I63>UiOKajjL?< z7A2R2^eyTq^_-G#l-zTx`ddA3yz7IusqvDWPj+C6;uO0Bxk`HhIdpq5u8i;+18{FO zFaAIHbIg1`__>O+%>_x;9q0YT{|gmrd+B!4%eRx}nMwMbFVq$si}l`L;q=h_74Xbg zidTV4Z4|p4*?Hq`HPc7(>&0jPNl`pvk9tzgN7vsD(Kau_DQu5g999H1SxJ5X$mgvH zfOJ)2E#mUMYO*R)d{-7GRnL9uN!*&t_Mv==`0PG4#JT|5&SPrQeynd<6_`+~xS&Es zSYNx9^;rcDcdNLjLdD%Os8VjPn?<`oYU+Nqrsqsh<&nXV!W2J3lMYEX%`_2}%DF+~ z#}A<17V1k5s6RqU^5a0ZLA?TiYvE%Kyy zypfLSXH-BZNuSiG1au$3NCqNw-#r<8p^3{x7r&gh!@e_54z7lo=CZm$(wKaU@2C=9 zt$GB#aYt5OwQARV$(>lRD7R7h>!&vtt;G$ql&h-MQoAP3@T3AHJdNj_RYUGTK6_S0 zAbtMlRJ(Zj=q?9ANwN&vQkP3H29{w=zGyfN7F~emn>_EFT5t!uZO-4(UD0{NUD+-3K8WDLoklJHKD676fgChM>33xPEmQdR?Ddhf$$^x9<3OW@7Z#^c>o|)VdLkNB`RnOROIu4dHvnW+btGH z(`{fi0!#iOLD)czJZ(4Fw1bt!5=EanvClXOI`p{{`-1ZX`_hT+Bii{flUbF%U>bF(0COHN6> z7ZQCY<>zLKL^%hK_U?uqXy9n?FdE5uqrIadOT|g+2Pfr?%YGs&4`TG57;2f8J$Vce zJFkOO#9on#9+;Uw8J5+;qNq_e-Z(ko}4dm5X-Vyi~Qjz5y`M+Kv>IDD* delta 10984 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 Q%Y*{o7`$s)Sl}D`-_q1_rvLx| diff --git a/boot/ocamllex b/boot/ocamllex index f2775309fdf4e22b389bbc77cffde366962c1a5a..087d530dc18a7e2b601676001253a01dc07e3356 100755 GIT binary patch delta 8119 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 diff --git a/bytecomp/bytegen.ml b/bytecomp/bytegen.ml index 0a5fab87..ffb2b46e 100644 --- a/bytecomp/bytegen.ml +++ b/bytecomp/bytegen.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: bytegen.ml,v 1.72 2008/10/03 15:02:55 maranget Exp $ *) +(* $Id: bytegen.ml,v 1.72.2.1 2009/04/02 09:06:32 xclerc Exp $ *) (* bytegen.ml : translation of lambda terms to lists of instructions. *) @@ -171,6 +171,7 @@ let copy_event ev kind info repr = ev_kind = kind; ev_info = info; ev_typenv = ev.ev_typenv; + ev_typsubst = ev.ev_typsubst; ev_compenv = ev.ev_compenv; ev_stacksize = ev.ev_stacksize; ev_repr = repr } @@ -714,6 +715,7 @@ let rec comp_expr env exp sz cont = ev_kind = kind; ev_info = info; ev_typenv = lev.lev_env; + ev_typsubst = Subst.identity; ev_compenv = env; ev_stacksize = sz; ev_repr = diff --git a/bytecomp/bytepackager.ml b/bytecomp/bytepackager.ml index d0712cb3..7915aede 100644 --- a/bytecomp/bytepackager.ml +++ b/bytecomp/bytepackager.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: bytepackager.ml,v 1.6 2007/02/23 13:44:51 ertai Exp $ *) +(* $Id: bytepackager.ml,v 1.6.10.1 2009/04/02 09:06:32 xclerc Exp $ *) (* "Package" a set of .cmo files into one .cmo file having the original compilation units as sub-modules. *) @@ -66,9 +66,11 @@ let rename_relocation objfile mapping defined base (rel, ofs) = (* Record and relocate a debugging event *) -let relocate_debug base ev = - ev.ev_pos <- base + ev.ev_pos; - events := ev :: !events +let relocate_debug base prefix subst ev = + let ev' = { ev with ev_pos = base + ev.ev_pos; + ev_module = prefix ^ "." ^ ev.ev_module; + ev_typsubst = Subst.compose ev.ev_typsubst subst } in + events := ev' :: !events (* Read the unit information from a .cmo file. *) @@ -110,7 +112,7 @@ let read_member_info file = Accumulate relocs, debug info, etc. Return size of bytecode. *) -let rename_append_bytecode oc mapping defined ofs objfile compunit = +let rename_append_bytecode oc mapping defined ofs prefix subst objfile compunit = let ic = open_in_bin objfile in try Bytelink.check_consistency objfile compunit; @@ -123,7 +125,7 @@ let rename_append_bytecode oc mapping defined ofs objfile compunit = Misc.copy_file_chunk ic oc compunit.cu_codesize; if !Clflags.debug && compunit.cu_debug > 0 then begin seek_in ic compunit.cu_debug; - List.iter (relocate_debug ofs) (input_value ic); + List.iter (relocate_debug ofs prefix subst) (input_value ic); end; close_in ic; compunit.cu_codesize @@ -134,20 +136,22 @@ let rename_append_bytecode oc mapping defined ofs objfile compunit = (* Same, for a list of .cmo and .cmi files. Return total size of bytecode. *) -let rec rename_append_bytecode_list oc mapping defined ofs = function +let rec rename_append_bytecode_list oc mapping defined ofs prefix subst = function [] -> ofs | m :: rem -> match m.pm_kind with | PM_intf -> - rename_append_bytecode_list oc mapping defined ofs rem + rename_append_bytecode_list oc mapping defined ofs prefix subst rem | PM_impl compunit -> let size = - rename_append_bytecode oc mapping defined ofs + rename_append_bytecode oc mapping defined ofs prefix subst m.pm_file compunit in + let id = Ident.create_persistent m.pm_name in + let root = Path.Pident (Ident.create_persistent prefix) in rename_append_bytecode_list - oc mapping (Ident.create_persistent m.pm_name :: defined) - (ofs + size) rem + oc mapping (id :: defined) + (ofs + size) prefix (Subst.add_module id (Path.Pdot (root, Ident.name id, Path.nopos)) subst) rem (* Generate the code that builds the tuple representing the package module *) @@ -187,7 +191,7 @@ let package_object_files files targetfile targetname coercion = let pos_depl = pos_out oc in output_binary_int oc 0; let pos_code = pos_out oc in - let ofs = rename_append_bytecode_list oc mapping [] 0 members in + let ofs = rename_append_bytecode_list oc mapping [] 0 targetname Subst.identity members in build_global_target oc targetname members mapping ofs coercion; let pos_debug = pos_out oc in if !Clflags.debug && !events <> [] then diff --git a/bytecomp/dll.ml b/bytecomp/dll.ml index 540180f0..65112a21 100644 --- a/bytecomp/dll.ml +++ b/bytecomp/dll.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: dll.ml,v 1.13 2006/09/28 21:36:38 xleroy Exp $ *) +(* $Id: dll.ml,v 1.13.14.1 2009/05/01 01:46:50 garrigue Exp $ *) (* Handling of dynamically-linked libraries *) @@ -85,13 +85,16 @@ let close_all_dlls () = Raise [Not_found] if not found. *) let find_primitive prim_name = - let rec find = function + let rec find seen = function [] -> raise Not_found | dll :: rem -> let addr = dll_sym dll prim_name in - if addr == Obj.magic () then find rem else addr in - find !opened_dlls + if addr == Obj.magic () then find (dll :: seen) rem else begin + if seen <> [] then opened_dlls := dll :: List.rev_append seen rem; + addr + end in + find [] !opened_dlls (* If linking in core (dynlink or toplevel), synchronize the VM table of primitive with the linker's table of primitive diff --git a/bytecomp/instruct.ml b/bytecomp/instruct.ml index a1d31df2..2169ac74 100644 --- a/bytecomp/instruct.ml +++ b/bytecomp/instruct.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: instruct.ml,v 1.22 2005/08/25 15:35:16 doligez Exp $ *) +(* $Id: instruct.ml,v 1.22.20.1 2009/04/02 09:06:32 xclerc Exp $ *) open Lambda @@ -26,6 +26,7 @@ type debug_event = ev_kind: debug_event_kind; (* Before/after event *) ev_info: debug_event_info; (* Extra information *) ev_typenv: Env.summary; (* Typing environment *) + ev_typsubst: Subst.t; (* Substitution over types *) ev_compenv: compilation_env; (* Compilation environment *) ev_stacksize: int; (* Size of stack frame *) ev_repr: debug_event_repr } (* Position of the representative *) diff --git a/bytecomp/instruct.mli b/bytecomp/instruct.mli index 5743af92..ce97609f 100644 --- a/bytecomp/instruct.mli +++ b/bytecomp/instruct.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: instruct.mli,v 1.22 2005/10/25 15:56:45 doligez Exp $ *) +(* $Id: instruct.mli,v 1.22.20.1 2009/04/02 09:06:32 xclerc Exp $ *) (* The type of the instructions of the abstract machine *) @@ -44,6 +44,7 @@ type debug_event = ev_kind: debug_event_kind; (* Before/after event *) ev_info: debug_event_info; (* Extra information *) ev_typenv: Env.summary; (* Typing environment *) + ev_typsubst: Subst.t; (* Substitution over types *) ev_compenv: compilation_env; (* Compilation environment *) ev_stacksize: int; (* Size of stack frame *) ev_repr: debug_event_repr } (* Position of the representative *) diff --git a/byterun/Makefile b/byterun/Makefile index a22c069d..ac1c2524 100644 --- a/byterun/Makefile +++ b/byterun/Makefile @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile,v 1.64.2.1 2008/11/08 16:29:02 xleroy Exp $ +# $Id: Makefile,v 1.64.2.3 2009/05/13 05:00:48 garrigue Exp $ include Makefile.common @@ -22,14 +22,14 @@ OBJS=$(COMMONOBJS) unix.o main.o DOBJS=$(OBJS:.o=.d.o) instrtrace.d.o PICOBJS=$(OBJS:.o=.pic.o) -#ifeq ($(SUPPORTS_SHARED_LIBRARIES),true) +TMP_SHARED_LIBRARIES=$(SUPPORTS_SHARED_LIBRARIES:false=) +SHARED_LIBRARIES_DEPS=$(TMP_SHARED_LIBRARIES:true=libcamlrun_shared.so) -all:: libcamlrun_shared.so +all:: $(SHARED_LIBRARIES_DEPS) install:: - cp libcamlrun_shared.so $(LIBDIR)/libcamlrun_shared.so - -#endif + if test -f libcamlrun_shared.so; then \ + cp libcamlrun_shared.so $(LIBDIR)/libcamlrun_shared.so; fi ocamlrun$(EXE): libcamlrun.a prims.o $(MKEXE) $(BYTECCLINKOPTS) -o ocamlrun$(EXE) \ diff --git a/byterun/finalise.c b/byterun/finalise.c index 980866a6..f352f28a 100644 --- a/byterun/finalise.c +++ b/byterun/finalise.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: finalise.c,v 1.23 2008/07/28 12:03:55 doligez Exp $ */ +/* $Id: finalise.c,v 1.23.2.1 2009/05/18 09:37:46 doligez Exp $ */ /* Handling of finalised values. */ @@ -139,7 +139,7 @@ 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); + caml_callback (f.fun, f.val + f.offset); /* FIXME PR#4742 */ running_finalisation_function = 0; } caml_gc_message (0x80, "Done calling finalisation functions.\n", 0); diff --git a/byterun/globroots.c b/byterun/globroots.c index f2372c1c..3f60e95d 100644 --- a/byterun/globroots.c +++ b/byterun/globroots.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: globroots.c,v 1.11 2008/07/14 06:28:27 xleroy Exp $ */ +/* $Id: globroots.c,v 1.11.2.1 2009/03/28 15:26:37 xleroy Exp $ */ /* Registration of global memory roots */ @@ -232,6 +232,28 @@ CAMLexport void caml_modify_generational_global_root(value *r, value newval) caml_delete_global_root(&caml_global_roots_old, r); caml_insert_global_root(&caml_global_roots_young, r); } + /* PR#4704 */ + else if (!Is_block(oldval) && Is_block(newval)) { + /* The previous value in the root was unboxed but now it is boxed. + The root won't appear in any of the root lists thus far (by virtue + of the operation of [caml_register_generational_global_root]), so we + need to make sure it gets in, or else it will never be scanned. */ + if (Is_young(newval)) + caml_insert_global_root(&caml_global_roots_young, r); + else if (Is_in_heap(newval)) + caml_insert_global_root(&caml_global_roots_old, r); + } + else if (Is_block(oldval) && !Is_block(newval)) { + /* The previous value in the root was boxed but now it is unboxed, so + the root should be removed. If [oldval] is young, this will happen + anyway at the next minor collection, but it is safer to delete it + here. */ + if (Is_young(oldval)) + caml_delete_global_root(&caml_global_roots_young, r); + else if (Is_in_heap(oldval)) + caml_delete_global_root(&caml_global_roots_old, r); + } + /* end PR#4704 */ *r = newval; } diff --git a/byterun/int64_emul.h b/byterun/int64_emul.h index ba8a6014..f788103c 100644 --- a/byterun/int64_emul.h +++ b/byterun/int64_emul.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: int64_emul.h,v 1.5 2005/09/22 14:21:50 xleroy Exp $ */ +/* $Id: int64_emul.h,v 1.5.18.1 2009/03/28 18:34:19 xleroy Exp $ */ /* Software emulation of 64-bit integer arithmetic, for C compilers that do not support it. */ @@ -96,8 +96,9 @@ static int64 I64_mul(int64 x, int64 y) } #define I64_is_zero(x) (((x).l | (x).h) == 0) - #define I64_is_negative(x) ((int32) (x).h < 0) +#define I64_is_min_int(x) ((x).l == 0 && (x).h = 0x80000000U) +#define I64_is_minus_one(x) (((x).l & (x).h) == 0xFFFFFFFFU) /* Bitwise operations */ static int64 I64_and(int64 x, int64 y) diff --git a/byterun/int64_native.h b/byterun/int64_native.h index 2341e998..9fe40cbf 100644 --- a/byterun/int64_native.h +++ b/byterun/int64_native.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: int64_native.h,v 1.5 2005/09/22 14:21:50 xleroy Exp $ */ +/* $Id: int64_native.h,v 1.5.18.1 2009/03/28 18:34:19 xleroy Exp $ */ /* Wrapper macros around native 64-bit integer arithmetic, so that it has the same interface as the software emulation @@ -29,6 +29,9 @@ #define I64_mul(x,y) ((x) * (y)) #define I64_is_zero(x) ((x) == 0) #define I64_is_negative(x) ((x) < 0) +#define I64_is_min_int(x) ((x) == ((int64)1 << 63)) +#define I64_is_minus_one(x) ((x) == -1) + #define I64_div(x,y) ((x) / (y)) #define I64_mod(x,y) ((x) % (y)) #define I64_udivmod(x,y,quo,rem) \ diff --git a/byterun/ints.c b/byterun/ints.c index f6448c84..f6c9d70c 100644 --- a/byterun/ints.c +++ b/byterun/ints.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: ints.c,v 1.51 2008/01/11 16:13:16 doligez Exp $ */ +/* $Id: ints.c,v 1.51.4.2 2009/03/28 18:43:08 xleroy Exp $ */ #include #include @@ -248,23 +248,31 @@ CAMLprim value caml_int32_mul(value v1, value v2) CAMLprim value caml_int32_div(value v1, value v2) { + int32 dividend = Int32_val(v1); int32 divisor = Int32_val(v2); if (divisor == 0) caml_raise_zero_divide(); + /* PR#4740: on some processors, division crashes on overflow. + Implement the same behavior as for type "int". */ + if (dividend == (1<<31) && divisor == -1) return v1; #ifdef NONSTANDARD_DIV_MOD - return caml_copy_int32(caml_safe_div(Int32_val(v1), divisor)); + return caml_copy_int32(caml_safe_div(dividend, divisor)); #else - return caml_copy_int32(Int32_val(v1) / divisor); + return caml_copy_int32(dividend / divisor); #endif } CAMLprim value caml_int32_mod(value v1, value v2) { + int32 dividend = Int32_val(v1); int32 divisor = Int32_val(v2); if (divisor == 0) caml_raise_zero_divide(); + /* PR#4740: on some processors, modulus crashes if division overflows. + Implement the same behavior as for type "int". */ + if (dividend == (1<<31) && divisor == -1) return caml_copy_int32(0); #ifdef NONSTANDARD_DIV_MOD - return caml_copy_int32(caml_safe_mod(Int32_val(v1), divisor)); + return caml_copy_int32(caml_safe_mod(dividend, divisor)); #else - return caml_copy_int32(Int32_val(v1) % divisor); + return caml_copy_int32(dividend % divisor); #endif } @@ -430,15 +438,26 @@ CAMLprim value caml_int64_mul(value v1, value v2) CAMLprim value caml_int64_div(value v1, value v2) { + int64 dividend = Int64_val(v1); int64 divisor = Int64_val(v2); if (I64_is_zero(divisor)) caml_raise_zero_divide(); + /* PR#4740: on some processors, division crashes on overflow. + Implement the same behavior as for type "int". */ + if (I64_is_min_int(dividend) && I64_is_minus_one(divisor)) return v1; return caml_copy_int64(I64_div(Int64_val(v1), divisor)); } CAMLprim value caml_int64_mod(value v1, value v2) { + int64 dividend = Int64_val(v1); int64 divisor = Int64_val(v2); if (I64_is_zero(divisor)) caml_raise_zero_divide(); + /* PR#4740: on some processors, division crashes on overflow. + Implement the same behavior as for type "int". */ + if (I64_is_min_int(dividend) && I64_is_minus_one(divisor)) { + int64 zero = I64_literal(0,0); + return caml_copy_int64(zero); + } return caml_copy_int64(I64_mod(Int64_val(v1), divisor)); } @@ -650,25 +669,35 @@ CAMLprim value caml_nativeint_sub(value v1, value v2) CAMLprim value caml_nativeint_mul(value v1, value v2) { return caml_copy_nativeint(Nativeint_val(v1) * Nativeint_val(v2)); } +#define Nativeint_min_int ((intnat) 1 << (sizeof(intnat) * 8 - 1)) + CAMLprim value caml_nativeint_div(value v1, value v2) { + intnat dividend = Nativeint_val(v1); intnat divisor = Nativeint_val(v2); if (divisor == 0) caml_raise_zero_divide(); + /* PR#4740: on some processors, modulus crashes if division overflows. + Implement the same behavior as for type "int". */ + if (dividend == Nativeint_min_int && divisor == -1) return v1; #ifdef NONSTANDARD_DIV_MOD - return caml_copy_nativeint(caml_safe_div(Nativeint_val(v1), divisor)); + return caml_copy_nativeint(caml_safe_div(dividend, divisor)); #else - return caml_copy_nativeint(Nativeint_val(v1) / divisor); + return caml_copy_nativeint(dividend / divisor); #endif } CAMLprim value caml_nativeint_mod(value v1, value v2) { + intnat dividend = Nativeint_val(v1); intnat divisor = Nativeint_val(v2); if (divisor == 0) caml_raise_zero_divide(); + /* PR#4740: on some processors, modulus crashes if division overflows. + Implement the same behavior as for type "int". */ + if (dividend == Nativeint_min_int && divisor == -1) return caml_copy_nativeint(0); #ifdef NONSTANDARD_DIV_MOD - return caml_copy_nativeint(caml_safe_mod(Nativeint_val(v1), divisor)); + return caml_copy_nativeint(caml_safe_mod(dividend, divisor)); #else - return caml_copy_nativeint(Nativeint_val(v1) % divisor); + return caml_copy_nativeint(dividend % divisor); #endif } diff --git a/camlp4/Camlp4/Printers/OCamlr.ml b/camlp4/Camlp4/Printers/OCamlr.ml index a1aa40c5..e268cd06 100644 --- a/camlp4/Camlp4/Printers/OCamlr.ml +++ b/camlp4/Camlp4/Printers/OCamlr.ml @@ -123,7 +123,11 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct pp f "@[<2>%a@ when@ %a@ ->@ %a@]" o#patt p o#under_pipe#expr w o#under_pipe#expr e ]; - method sum_type f t = pp f "@[[ %a ]@]" o#ctyp t; + method sum_type f = + fun + [ <:ctyp<>> -> pp f "[]" + | t -> pp f "@[[ %a ]@]" o#ctyp t + ]; method ident f i = let () = o#node f i Ast.loc_of_ident in diff --git a/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml b/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml index f3beee67..dc3f3af3 100644 --- a/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml +++ b/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml @@ -1040,6 +1040,7 @@ Very old (no more supported) syntax: | "("; t = SELF; "*"; tl = star_ctyp; ")" -> <:ctyp< ( $t$ * $tl$ ) >> | "("; t = SELF; ")" -> t + | "["; "]" -> <:ctyp< [ ] >> | "["; t = constructor_declarations; "]" -> <:ctyp< [ $t$ ] >> | "["; "="; rfl = row_field; "]" -> <:ctyp< [ = $rfl$ ] >> diff --git a/camlp4/boot/Camlp4.ml b/camlp4/boot/Camlp4.ml index ea3f335d..828ee061 100644 --- a/camlp4/boot/Camlp4.ml +++ b/camlp4/boot/Camlp4.ml @@ -372,7 +372,6 @@ module Sig = * - Daniel de Rauglaudre: initial version * - Nicolas Pouillard: refactoring *) - (** Camlp4 signature repository *) (** {6 Basic signatures} *) (** Signature with just a type. *) @@ -1954,12 +1953,17 @@ module Sig = val register_str_item_filter : Ast.str_item filter -> unit + val register_topphrase_filter : Ast.str_item filter -> unit + val fold_interf_filters : ('a -> Ast.sig_item filter -> 'a) -> 'a -> 'a val fold_implem_filters : ('a -> Ast.str_item filter -> 'a) -> 'a -> 'a + val fold_topphrase_filters : + ('a -> Ast.str_item filter -> 'a) -> 'a -> 'a + end module type DynAst = @@ -13301,10 +13305,16 @@ module Struct = let fold_implem_filters f i = Queue.fold f i implem_filters + let topphrase_filters = Queue.create () + + let fold_topphrase_filters f i = Queue.fold f i topphrase_filters + let register_sig_item_filter f = Queue.add f interf_filters let register_str_item_filter f = Queue.add f implem_filters + let register_topphrase_filter f = Queue.add f topphrase_filters + end end @@ -17555,9 +17565,12 @@ module Printers = end = struct module Id = - struct let name = "Camlp4.Printers.Null" - let version = Sys.ocaml_version - end + struct + let name = "Camlp4.Printers.Null" + + let version = Sys.ocaml_version + + end module Make (Syntax : Sig.Syntax) = struct @@ -17820,9 +17833,12 @@ module Printers = open Format module Id = - struct let name = "Camlp4.Printers.OCaml" - let version = Sys.ocaml_version - end + struct + let name = "Camlp4.Printers.OCaml" + + let version = Sys.ocaml_version + + end module Make (Syntax : Sig.Camlp4Syntax) = struct @@ -19254,9 +19270,12 @@ module Printers = open Format module Id = - struct let name = "Camlp4.Printers.OCamlr" - let version = Sys.ocaml_version - end + struct + let name = "Camlp4.Printers.OCamlr" + + let version = Sys.ocaml_version + + end module Make (Syntax : Sig.Camlp4Syntax) = struct @@ -20203,9 +20222,10 @@ module PreCast : end = struct - module Id = struct let name = "Camlp4.PreCast" - let version = Sys.ocaml_version - end + module Id = + struct let name = "Camlp4.PreCast" + let version = Sys.ocaml_version + end type camlp4_token = Sig.camlp4_token = diff --git a/camlp4/boot/camlp4boot.ml b/camlp4/boot/camlp4boot.ml index 0167ceff..e5f75862 100644 --- a/camlp4/boot/camlp4boot.ml +++ b/camlp4/boot/camlp4boot.ml @@ -21,9 +21,12 @@ module R = * - Nicolas Pouillard: refactoring *) module Id = - struct let name = "Camlp4OCamlRevisedParser" - let version = Sys.ocaml_version - end + struct + let name = "Camlp4OCamlRevisedParser" + + let version = Sys.ocaml_version + + end module Make (Syntax : Sig.Camlp4Syntax) = struct @@ -4393,6 +4396,10 @@ Very old (no more supported) syntax: (fun _ (t : 'constructor_declarations) _ (_loc : Gram.Loc.t) -> (Ast.TySum (_loc, t) : 'ctyp)))); + ([ Gram.Skeyword "["; Gram.Skeyword "]" ], + (Gram.Action.mk + (fun _ _ (_loc : Gram.Loc.t) -> + (Ast.TySum (_loc, Ast.TyNil _loc) : 'ctyp)))); ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ")" ], (Gram.Action.mk (fun _ (t : 'ctyp) _ (_loc : Gram.Loc.t) -> @@ -8524,9 +8531,12 @@ module Camlp4QuotationCommon = * - Nicolas Pouillard: initial version *) module Id = - struct let name = "Camlp4QuotationCommon" - let version = Sys.ocaml_version - end + struct + let name = "Camlp4QuotationCommon" + + let version = Sys.ocaml_version + + end module Make (Syntax : Sig.Camlp4Syntax) @@ -9223,9 +9233,12 @@ module Q = * - Nicolas Pouillard: refactoring *) module Id = - struct let name = "Camlp4QuotationExpander" - let version = Sys.ocaml_version - end + struct + let name = "Camlp4QuotationExpander" + + let version = Sys.ocaml_version + + end module Make (Syntax : Sig.Camlp4Syntax) = struct @@ -9262,9 +9275,11 @@ module Rp = * - Nicolas Pouillard: refactoring *) module Id : Sig.Id = - struct let name = "Camlp4OCamlRevisedParserParser" - let version = Sys.ocaml_version - + struct + let name = "Camlp4OCamlRevisedParserParser" + + let version = Sys.ocaml_version + end module Make (Syntax : Sig.Camlp4Syntax) = @@ -10195,7 +10210,8 @@ module G = module Id = struct let name = "Camlp4GrammarParser" let version = Sys.ocaml_version - end + + end module Make (Syntax : Sig.Camlp4Syntax) = struct @@ -12594,7 +12610,8 @@ module M = module Id = struct let name = "Camlp4MacroParser" let version = Sys.ocaml_version - end + + end (* Added statements: @@ -13649,7 +13666,8 @@ module D = module Id = struct let name = "Camlp4DebugParser" let version = Sys.ocaml_version - end + + end module Make (Syntax : Sig.Camlp4Syntax) = struct @@ -13840,9 +13858,12 @@ module L = * - Nicolas Pouillard: revised syntax version *) module Id = - struct let name = "Camlp4ListComprenhsion" - let version = Sys.ocaml_version - end + struct + let name = "Camlp4ListComprenhsion" + + let version = Sys.ocaml_version + + end module Make (Syntax : Sig.Camlp4Syntax) = struct @@ -14216,7 +14237,6 @@ module B = * - Daniel de Rauglaudre: initial version * - Nicolas Pouillard: refactoring *) - open Camlp4 open PreCast.Syntax @@ -14434,7 +14454,7 @@ Options: .ml Parse this implementation file .mli Parse this interface file .%s Load this module inside the Camlp4 core@." - (if DynLoader.is_native then "cmx " else "(cmo|cma)"); + (if DynLoader.is_native then "cmxs " else "(cmo|cma)"); Options.print_usage_list ini_sl; (* loop (ini_sl @ ext_sl) where rec loop = fun @@ -14527,11 +14547,11 @@ You should give the -noassert option to the ocaml compiler instead.@." ("-loaded-modules", (Arg.Set print_loaded_modules), "Print the list of loaded modules."); ("-parser", (Arg.String (rewrite_and_load "Parsers")), - " Load the parser Camlp4Parsers/.cmo"); + " Load the parser Camlp4Parsers/.cm(o|a|xs)"); ("-printer", (Arg.String (rewrite_and_load "Printers")), - " Load the printer Camlp4Printers/.cmo"); + " Load the printer Camlp4Printers/.cm(o|a|xs)"); ("-filter", (Arg.String (rewrite_and_load "Filters")), - " Load the filter Camlp4Filters/.cmo"); + " Load the filter Camlp4Filters/.cm(o|a|xs)"); ("-ignore", (Arg.String ignore), "ignore the next argument"); ("--", (Arg.Unit ignore), "Deprecated, does nothing") ] diff --git a/configure b/configure index 503f5556..e736a923 100755 --- a/configure +++ b/configure @@ -13,7 +13,7 @@ # # ######################################################################### -# $Id: configure,v 1.266.2.1 2008/11/07 10:34:16 xleroy Exp $ +# $Id: configure,v 1.266.2.4 2009/05/19 13:23:47 doligez Exp $ configure_options="$*" prefix=/usr/local @@ -305,8 +305,13 @@ case "$bytecc,$host" in dllccompopts="-D_WIN32 -DCAML_DLL" flexlink="flexlink -chain cygwin -merge-manifest" flexdir=`$flexlink -where | dos2unix` - iflexdir="-I\"$flexdir\"" - mkexe="$flexlink -exe" + if test -z "$flexdir"; then + echo "flexlink not found: native shared libraries won't be available" + withsharedlibs=no + else + iflexdir="-I\"$flexdir\"" + mkexe="$flexlink -exe" + fi exe=".exe" ostype="Cygwin";; gcc*,x86_64-*-linux*) @@ -617,7 +622,11 @@ case "$host" in i[3456]86-*-linux*) arch=i386; system=linux_`sh ./runtest elf.c`;; i[3456]86-*-*bsd*) arch=i386; system=bsd_`sh ./runtest elf.c`;; i[3456]86-*-nextstep*) arch=i386; system=nextstep;; - i[3456]86-*-solaris*) arch=i386; system=solaris;; + i[3456]86-*-solaris*) if $arch64; then + arch=amd64; system=solaris + else + arch=i386; system=solaris + fi;; i[3456]86-*-beos*) arch=i386; system=beos;; i[3456]86-*-cygwin*) arch=i386; system=cygwin;; i[3456]86-*-darwin*) if $arch64; then @@ -686,6 +695,7 @@ case "$arch,$nativecc,$system,$host_type" in if $arch64; then partialld="ld -r -arch ppc64"; fi;; *,gcc*,cygwin,*) nativecccompopts="$gcc_warnings -U_WIN32";; amd64,gcc*,macosx,*) partialld="ld -r -arch x86_64";; + amd64,gcc*,solaris,*) partialld="ld -r -m elf_x86_64";; *,gcc*,*,*) nativecccompopts="$gcc_warnings";; esac @@ -699,6 +709,8 @@ case "$arch,$model,$system" in aspp='gcc -c';; amd64,*,macosx) as='as -arch x86_64' aspp='gcc -arch x86_64 -c';; + amd64,*,solaris) as='as --64' + aspp='gcc -m64 -c';; amd64,*,*) as='as' aspp='gcc -c';; arm,*,*) as='as'; @@ -1103,7 +1115,7 @@ case "$arch,$system" in echo "Cannot detect system stack overflow.";; esac -x# Determine the target architecture for the "num" library +# Determine the target architecture for the "num" library case "$arch" in alpha) bng_arch=alpha; bng_asm_level=1;; diff --git a/debugger/.depend b/debugger/.depend index afac5c0d..f71fcbef 100644 --- a/debugger/.depend +++ b/debugger/.depend @@ -34,32 +34,32 @@ symbols.cmi: ../bytecomp/instruct.cmi time_travel.cmi: primitives.cmi trap_barrier.cmi: unix_tools.cmi: ../otherlibs/unix/unix.cmi -breakpoints.cmo: symbols.cmi source.cmi primitives.cmi pos.cmi \ - ../bytecomp/instruct.cmi exec.cmi debugcom.cmi checkpoints.cmi \ - breakpoints.cmi -breakpoints.cmx: symbols.cmx source.cmx primitives.cmx pos.cmx \ - ../bytecomp/instruct.cmx exec.cmx debugcom.cmx checkpoints.cmx \ - breakpoints.cmi +breakpoints.cmo: symbols.cmi primitives.cmi pos.cmi ../bytecomp/instruct.cmi \ + exec.cmi debugcom.cmi checkpoints.cmi breakpoints.cmi +breakpoints.cmx: symbols.cmx primitives.cmx pos.cmx ../bytecomp/instruct.cmx \ + exec.cmx debugcom.cmx checkpoints.cmx breakpoints.cmi checkpoints.cmo: primitives.cmi int64ops.cmi debugcom.cmi checkpoints.cmi checkpoints.cmx: primitives.cmx int64ops.cmx debugcom.cmx checkpoints.cmi command_line.cmo: unix_tools.cmi ../otherlibs/unix/unix.cmi \ ../typing/types.cmi time_travel.cmi symbols.cmi source.cmi \ show_source.cmi show_information.cmi question.cmi program_management.cmi \ program_loading.cmi printval.cmi primitives.cmi pos.cmi parser_aux.cmi \ - parser.cmi parameters.cmi ../utils/misc.cmi ../parsing/location.cmi \ - loadprinter.cmi lexer.cmi int64ops.cmi ../bytecomp/instruct.cmi \ - input_handling.cmi history.cmi frames.cmi events.cmi eval.cmi envaux.cmi \ - debugger_config.cmi debugcom.cmi ../typing/ctype.cmi ../utils/config.cmi \ - checkpoints.cmi breakpoints.cmi command_line.cmi + parser.cmi parameters.cmi ../utils/misc.cmi ../parsing/longident.cmi \ + ../parsing/location.cmi loadprinter.cmi lexer.cmi int64ops.cmi \ + ../bytecomp/instruct.cmi input_handling.cmi history.cmi frames.cmi \ + events.cmi eval.cmi envaux.cmi debugger_config.cmi debugcom.cmi \ + ../typing/ctype.cmi ../utils/config.cmi checkpoints.cmi breakpoints.cmi \ + command_line.cmi command_line.cmx: unix_tools.cmx ../otherlibs/unix/unix.cmx \ ../typing/types.cmx time_travel.cmx symbols.cmx source.cmx \ show_source.cmx show_information.cmx question.cmx program_management.cmx \ program_loading.cmx printval.cmx primitives.cmx pos.cmx parser_aux.cmi \ - parser.cmx parameters.cmx ../utils/misc.cmx ../parsing/location.cmx \ - loadprinter.cmx lexer.cmx int64ops.cmx ../bytecomp/instruct.cmx \ - input_handling.cmx history.cmx frames.cmx events.cmx eval.cmx envaux.cmx \ - debugger_config.cmx debugcom.cmx ../typing/ctype.cmx ../utils/config.cmx \ - checkpoints.cmx breakpoints.cmx command_line.cmi + parser.cmx parameters.cmx ../utils/misc.cmx ../parsing/longident.cmx \ + ../parsing/location.cmx loadprinter.cmx lexer.cmx int64ops.cmx \ + ../bytecomp/instruct.cmx input_handling.cmx history.cmx frames.cmx \ + events.cmx eval.cmx envaux.cmx debugger_config.cmx debugcom.cmx \ + ../typing/ctype.cmx ../utils/config.cmx checkpoints.cmx breakpoints.cmx \ + command_line.cmi debugcom.cmo: primitives.cmi ../utils/misc.cmi int64ops.cmi \ input_handling.cmi debugcom.cmi debugcom.cmx: primitives.cmx ../utils/misc.cmx int64ops.cmx \ @@ -74,76 +74,70 @@ dynlink.cmx: ../bytecomp/symtable.cmx ../bytecomp/opcodes.cmx \ ../utils/misc.cmx ../bytecomp/meta.cmx ../bytecomp/dll.cmx \ ../utils/consistbl.cmx ../utils/config.cmx ../bytecomp/cmo_format.cmi \ dynlink.cmi -envaux.cmo: ../typing/types.cmi ../typing/printtyp.cmi ../typing/path.cmi \ - ../typing/mtype.cmi ../utils/misc.cmi ../bytecomp/instruct.cmi \ - ../typing/env.cmi envaux.cmi -envaux.cmx: ../typing/types.cmx ../typing/printtyp.cmx ../typing/path.cmx \ - ../typing/mtype.cmx ../utils/misc.cmx ../bytecomp/instruct.cmx \ - ../typing/env.cmx envaux.cmi -eval.cmo: ../typing/types.cmi ../bytecomp/symtable.cmi printval.cmi \ - ../typing/printtyp.cmi ../typing/predef.cmi ../typing/path.cmi \ - parser_aux.cmi ../utils/misc.cmi ../parsing/longident.cmi \ - ../bytecomp/instruct.cmi ../typing/ident.cmi frames.cmi ../typing/env.cmi \ - debugger_config.cmi debugcom.cmi ../typing/ctype.cmi ../typing/btype.cmi \ - eval.cmi -eval.cmx: ../typing/types.cmx ../bytecomp/symtable.cmx printval.cmx \ - ../typing/printtyp.cmx ../typing/predef.cmx ../typing/path.cmx \ - parser_aux.cmi ../utils/misc.cmx ../parsing/longident.cmx \ - ../bytecomp/instruct.cmx ../typing/ident.cmx frames.cmx ../typing/env.cmx \ - debugger_config.cmx debugcom.cmx ../typing/ctype.cmx ../typing/btype.cmx \ - eval.cmi -events.cmo: primitives.cmi ../parsing/location.cmi ../bytecomp/instruct.cmi \ - checkpoints.cmi events.cmi -events.cmx: primitives.cmx ../parsing/location.cmx ../bytecomp/instruct.cmx \ - checkpoints.cmx events.cmi +envaux.cmo: ../typing/types.cmi ../typing/subst.cmi ../typing/printtyp.cmi \ + ../typing/path.cmi ../typing/mtype.cmi ../utils/misc.cmi \ + ../bytecomp/instruct.cmi ../typing/env.cmi envaux.cmi +envaux.cmx: ../typing/types.cmx ../typing/subst.cmx ../typing/printtyp.cmx \ + ../typing/path.cmx ../typing/mtype.cmx ../utils/misc.cmx \ + ../bytecomp/instruct.cmx ../typing/env.cmx envaux.cmi +eval.cmo: ../typing/types.cmi ../bytecomp/symtable.cmi ../typing/subst.cmi \ + printval.cmi ../typing/printtyp.cmi ../typing/predef.cmi \ + ../typing/path.cmi parser_aux.cmi ../utils/misc.cmi \ + ../parsing/longident.cmi ../bytecomp/instruct.cmi ../typing/ident.cmi \ + frames.cmi ../typing/env.cmi debugcom.cmi ../typing/ctype.cmi \ + ../typing/btype.cmi eval.cmi +eval.cmx: ../typing/types.cmx ../bytecomp/symtable.cmx ../typing/subst.cmx \ + printval.cmx ../typing/printtyp.cmx ../typing/predef.cmx \ + ../typing/path.cmx parser_aux.cmi ../utils/misc.cmx \ + ../parsing/longident.cmx ../bytecomp/instruct.cmx ../typing/ident.cmx \ + frames.cmx ../typing/env.cmx debugcom.cmx ../typing/ctype.cmx \ + ../typing/btype.cmx eval.cmi +events.cmo: ../parsing/location.cmi ../bytecomp/instruct.cmi events.cmi +events.cmx: ../parsing/location.cmx ../bytecomp/instruct.cmx events.cmi exec.cmo: exec.cmi exec.cmx: exec.cmi -frames.cmo: symbols.cmi primitives.cmi ../utils/misc.cmi \ - ../bytecomp/instruct.cmi events.cmi debugcom.cmi checkpoints.cmi \ - frames.cmi -frames.cmx: symbols.cmx primitives.cmx ../utils/misc.cmx \ - ../bytecomp/instruct.cmx events.cmx debugcom.cmx checkpoints.cmx \ - frames.cmi -history.cmo: primitives.cmi ../utils/misc.cmi int64ops.cmi \ - debugger_config.cmi checkpoints.cmi history.cmi -history.cmx: primitives.cmx ../utils/misc.cmx int64ops.cmx \ - debugger_config.cmx checkpoints.cmx history.cmi +frames.cmo: symbols.cmi ../utils/misc.cmi ../bytecomp/instruct.cmi events.cmi \ + debugcom.cmi frames.cmi +frames.cmx: symbols.cmx ../utils/misc.cmx ../bytecomp/instruct.cmx events.cmx \ + debugcom.cmx frames.cmi +history.cmo: primitives.cmi int64ops.cmi debugger_config.cmi checkpoints.cmi \ + history.cmi +history.cmx: primitives.cmx int64ops.cmx debugger_config.cmx checkpoints.cmx \ + history.cmi input_handling.cmo: ../otherlibs/unix/unix.cmi primitives.cmi \ input_handling.cmi input_handling.cmx: ../otherlibs/unix/unix.cmx primitives.cmx \ input_handling.cmi int64ops.cmo: int64ops.cmi int64ops.cmx: int64ops.cmi -lexer.cmo: primitives.cmi parser.cmi lexer.cmi -lexer.cmx: primitives.cmx parser.cmx lexer.cmi +lexer.cmo: parser.cmi lexer.cmi +lexer.cmx: parser.cmx lexer.cmi loadprinter.cmo: ../typing/types.cmi ../bytecomp/symtable.cmi printval.cmi \ ../typing/printtyp.cmi ../typing/path.cmi ../utils/misc.cmi \ ../parsing/longident.cmi ../typing/ident.cmi ../typing/env.cmi \ - dynlink.cmi debugger_config.cmi ../typing/ctype.cmi ../utils/config.cmi \ - loadprinter.cmi + dynlink.cmi ../typing/ctype.cmi ../utils/config.cmi loadprinter.cmi loadprinter.cmx: ../typing/types.cmx ../bytecomp/symtable.cmx printval.cmx \ ../typing/printtyp.cmx ../typing/path.cmx ../utils/misc.cmx \ ../parsing/longident.cmx ../typing/ident.cmx ../typing/env.cmx \ - dynlink.cmx debugger_config.cmx ../typing/ctype.cmx ../utils/config.cmx \ - loadprinter.cmi + dynlink.cmx ../typing/ctype.cmx ../utils/config.cmx loadprinter.cmi main.cmo: unix_tools.cmi ../otherlibs/unix/unix.cmi time_travel.cmi \ - show_information.cmi question.cmi program_management.cmi primitives.cmi \ - parameters.cmi ../utils/misc.cmi input_handling.cmi frames.cmi exec.cmi \ + show_information.cmi question.cmi program_management.cmi parameters.cmi \ + ../utils/misc.cmi input_handling.cmi frames.cmi exec.cmi \ ../typing/env.cmi debugger_config.cmi ../utils/config.cmi \ command_line.cmi ../utils/clflags.cmi checkpoints.cmi main.cmx: unix_tools.cmx ../otherlibs/unix/unix.cmx time_travel.cmx \ - show_information.cmx question.cmx program_management.cmx primitives.cmx \ - parameters.cmx ../utils/misc.cmx input_handling.cmx frames.cmx exec.cmx \ + show_information.cmx question.cmx program_management.cmx parameters.cmx \ + ../utils/misc.cmx input_handling.cmx frames.cmx exec.cmx \ ../typing/env.cmx debugger_config.cmx ../utils/config.cmx \ command_line.cmx ../utils/clflags.cmx checkpoints.cmx -parameters.cmo: primitives.cmi ../utils/misc.cmi envaux.cmi \ +parameters.cmo: primitives.cmi envaux.cmi debugger_config.cmi \ ../utils/config.cmi parameters.cmi -parameters.cmx: primitives.cmx ../utils/misc.cmx envaux.cmx \ +parameters.cmx: primitives.cmx envaux.cmx debugger_config.cmx \ ../utils/config.cmx parameters.cmi -parser.cmo: primitives.cmi parser_aux.cmi ../parsing/longident.cmi \ - int64ops.cmi input_handling.cmi parser.cmi -parser.cmx: primitives.cmx parser_aux.cmi ../parsing/longident.cmx \ - int64ops.cmx input_handling.cmx parser.cmi +parser.cmo: parser_aux.cmi ../parsing/longident.cmi int64ops.cmi \ + input_handling.cmi parser.cmi +parser.cmx: parser_aux.cmi ../parsing/longident.cmx int64ops.cmx \ + input_handling.cmx parser.cmi pattern_matching.cmo: ../typing/typedtree.cmi parser_aux.cmi \ ../utils/misc.cmi debugger_config.cmi debugcom.cmi ../typing/ctype.cmi \ pattern_matching.cmi @@ -158,49 +152,47 @@ primitives.cmo: ../otherlibs/unix/unix.cmi primitives.cmi primitives.cmx: ../otherlibs/unix/unix.cmx primitives.cmi printval.cmo: ../typing/types.cmi ../bytecomp/symtable.cmi \ ../typing/printtyp.cmi ../typing/path.cmi parser_aux.cmi \ - ../typing/outcometree.cmi ../typing/oprint.cmi ../utils/misc.cmi \ + ../typing/outcometree.cmi ../typing/oprint.cmi \ ../toplevel/genprintval.cmi debugcom.cmi printval.cmi printval.cmx: ../typing/types.cmx ../bytecomp/symtable.cmx \ ../typing/printtyp.cmx ../typing/path.cmx parser_aux.cmi \ - ../typing/outcometree.cmi ../typing/oprint.cmx ../utils/misc.cmx \ + ../typing/outcometree.cmi ../typing/oprint.cmx \ ../toplevel/genprintval.cmx debugcom.cmx printval.cmi program_loading.cmo: unix_tools.cmi ../otherlibs/unix/unix.cmi primitives.cmi \ - parameters.cmi ../utils/misc.cmi input_handling.cmi debugger_config.cmi \ - program_loading.cmi + parameters.cmi input_handling.cmi debugger_config.cmi program_loading.cmi program_loading.cmx: unix_tools.cmx ../otherlibs/unix/unix.cmx primitives.cmx \ - parameters.cmx ../utils/misc.cmx input_handling.cmx debugger_config.cmx \ - program_loading.cmi + parameters.cmx input_handling.cmx debugger_config.cmx program_loading.cmi program_management.cmo: unix_tools.cmi ../otherlibs/unix/unix.cmi \ time_travel.cmi symbols.cmi question.cmi program_loading.cmi \ - primitives.cmi parameters.cmi ../utils/misc.cmi int64ops.cmi \ - ../bytecomp/instruct.cmi input_handling.cmi history.cmi \ - debugger_config.cmi debugcom.cmi breakpoints.cmi program_management.cmi + primitives.cmi parameters.cmi int64ops.cmi input_handling.cmi history.cmi \ + debugger_config.cmi breakpoints.cmi program_management.cmi program_management.cmx: unix_tools.cmx ../otherlibs/unix/unix.cmx \ time_travel.cmx symbols.cmx question.cmx program_loading.cmx \ - primitives.cmx parameters.cmx ../utils/misc.cmx int64ops.cmx \ - ../bytecomp/instruct.cmx input_handling.cmx history.cmx \ - debugger_config.cmx debugcom.cmx breakpoints.cmx program_management.cmi + primitives.cmx parameters.cmx int64ops.cmx input_handling.cmx history.cmx \ + debugger_config.cmx breakpoints.cmx program_management.cmi question.cmo: primitives.cmi lexer.cmi input_handling.cmi question.cmi question.cmx: primitives.cmx lexer.cmx input_handling.cmx question.cmi -show_information.cmo: symbols.cmi show_source.cmi printval.cmi primitives.cmi \ +show_information.cmo: symbols.cmi show_source.cmi printval.cmi \ ../utils/misc.cmi ../bytecomp/instruct.cmi frames.cmi events.cmi \ debugcom.cmi checkpoints.cmi breakpoints.cmi show_information.cmi -show_information.cmx: symbols.cmx show_source.cmx printval.cmx primitives.cmx \ +show_information.cmx: symbols.cmx show_source.cmx printval.cmx \ ../utils/misc.cmx ../bytecomp/instruct.cmx frames.cmx events.cmx \ debugcom.cmx checkpoints.cmx breakpoints.cmx show_information.cmi -show_source.cmo: source.cmi primitives.cmi parameters.cmi ../utils/misc.cmi \ +show_source.cmo: source.cmi primitives.cmi parameters.cmi \ ../parsing/location.cmi ../bytecomp/instruct.cmi events.cmi \ debugger_config.cmi show_source.cmi -show_source.cmx: source.cmx primitives.cmx parameters.cmx ../utils/misc.cmx \ +show_source.cmx: source.cmx primitives.cmx parameters.cmx \ ../parsing/location.cmx ../bytecomp/instruct.cmx events.cmx \ debugger_config.cmx show_source.cmi -source.cmo: primitives.cmi ../utils/misc.cmi ../utils/config.cmi source.cmi -source.cmx: primitives.cmx ../utils/misc.cmx ../utils/config.cmx source.cmi -symbols.cmo: ../bytecomp/symtable.cmi primitives.cmi ../bytecomp/instruct.cmi \ - events.cmi debugger_config.cmi debugcom.cmi checkpoints.cmi \ +source.cmo: primitives.cmi ../utils/misc.cmi debugger_config.cmi \ + ../utils/config.cmi source.cmi +source.cmx: primitives.cmx ../utils/misc.cmx debugger_config.cmx \ + ../utils/config.cmx source.cmi +symbols.cmo: ../bytecomp/symtable.cmi ../bytecomp/instruct.cmi events.cmi \ + debugger_config.cmi debugcom.cmi checkpoints.cmi \ ../bytecomp/bytesections.cmi symbols.cmi -symbols.cmx: ../bytecomp/symtable.cmx primitives.cmx ../bytecomp/instruct.cmx \ - events.cmx debugger_config.cmx debugcom.cmx checkpoints.cmx \ +symbols.cmx: ../bytecomp/symtable.cmx ../bytecomp/instruct.cmx events.cmx \ + debugger_config.cmx debugcom.cmx checkpoints.cmx \ ../bytecomp/bytesections.cmx symbols.cmi time_travel.cmo: trap_barrier.cmi symbols.cmi question.cmi \ program_loading.cmi primitives.cmi ../utils/misc.cmi int64ops.cmi \ diff --git a/debugger/breakpoints.ml b/debugger/breakpoints.ml index fb65c8b4..2c8d7253 100644 --- a/debugger/breakpoints.ml +++ b/debugger/breakpoints.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: breakpoints.ml,v 1.13 2005/08/23 20:16:43 doligez Exp $ *) +(* $Id: breakpoints.ml,v 1.13.18.1 2009/04/02 09:44:21 xclerc Exp $ *) (******************************* Breakpoints ***************************) @@ -20,7 +20,6 @@ open Debugcom open Instruct open Primitives open Printf -open Source (*** Debugging. ***) let debug_breakpoints = ref false @@ -68,7 +67,7 @@ let rec breakpoints_at_pc pc = [] end @ - List.map fst (filter (function (_, {ev_pos = pos}) -> pos = pc) !breakpoints) + List.map fst (List.filter (function (_, {ev_pos = pos}) -> pos = pc) !breakpoints) (* Is there a breakpoint at `pc' ? *) let breakpoint_at_pc pc = @@ -155,7 +154,7 @@ let remove_position pos = let count = List.assoc pos !positions in decr count; if !count = 0 then begin - positions := assoc_remove !positions pos; + positions := List.remove_assoc pos !positions; new_version () end @@ -181,7 +180,7 @@ let remove_breakpoint number = let pos = ev.ev_pos in Exec.protect (function () -> - breakpoints := assoc_remove !breakpoints number; + breakpoints := List.remove_assoc number !breakpoints; remove_position pos; printf "Removed breakpoint %d at %d : %s" number ev.ev_pos (Pos.get_desc ev); @@ -210,7 +209,7 @@ let exec_with_temporary_breakpoint pc funct = let count = List.assoc pc !positions in decr count; if !count = 0 then begin - positions := assoc_remove !positions pc; + positions := List.remove_assoc pc !positions; reset_instr pc; Symbols.set_event_at_pc pc end diff --git a/debugger/command_line.ml b/debugger/command_line.ml index 475d8646..280fbc01 100644 --- a/debugger/command_line.ml +++ b/debugger/command_line.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: command_line.ml,v 1.25 2008/07/29 08:31:41 xleroy Exp $ *) +(* $Id: command_line.ml,v 1.25.2.2 2009/04/02 09:44:21 xclerc Exp $ *) (************************ Reading and executing commands ***************) @@ -87,7 +87,7 @@ let eol = end_of_line Lexer.lexeme let matching_elements list name instr = - filter (function a -> isprefix instr (name a)) !list + List.filter (function a -> isprefix instr (name a)) !list let all_matching_instructions = matching_elements instruction_list (fun i -> i.instr_name) @@ -97,7 +97,7 @@ let all_matching_instructions = let matching_instructions instr = let all = all_matching_instructions instr in - let prio = filter (fun i -> i.instr_prio) all in + let prio = List.filter (fun i -> i.instr_prio) all in if prio = [] then all else prio let matching_variables = @@ -143,6 +143,11 @@ let add_breakpoint_after_pc pc = end in try_add 0 +let module_of_longident id = + match id with + | Some x -> Some (String.concat "." (Longident.flatten x)) + | None -> None + let convert_module mdle = match mdle with | Some m -> @@ -235,14 +240,24 @@ let instr_dir ppf lexbuf = if yes_or_no "Reinitialize directory list" then begin Config.load_path := !default_load_path; Envaux.reset_cache (); + Hashtbl.clear Debugger_config.load_path_for; flush_buffer_list () end end - else - List.iter (function x -> add_path (expand_path x)) - (List.rev new_directory); + else begin + let new_directory' = List.rev new_directory in + match new_directory' with + | mdl :: for_keyw :: tl when (String.lowercase for_keyw) = "for" && (List.length tl) > 0 -> + List.iter (function x -> add_path_for mdl (expand_path x)) tl + | _ -> + List.iter (function x -> add_path (expand_path x)) new_directory' + end; let print_dirs ppf l = List.iter (function x -> fprintf ppf "@ %s" x) l in - fprintf ppf "@[<2>Directories :%a@]@." print_dirs !Config.load_path + fprintf ppf "@[<2>Directories :%a@]@." print_dirs !Config.load_path; + Hashtbl.iter + (fun mdl dirs -> + fprintf ppf "@[<2>Source directories for %s :%a@]@." mdl print_dirs dirs) + Debugger_config.load_path_for let instr_kill ppf lexbuf = eol lexbuf; @@ -562,7 +577,7 @@ let instr_break ppf lexbuf = raise Toplevel end | BA_pos1 (mdle, line, column) -> (* break @ [MODULE] LINE [COL] *) - let module_name = convert_module mdle in + let module_name = convert_module (module_of_longident mdle) in new_breakpoint (try let buffer = @@ -585,7 +600,7 @@ let instr_break ppf lexbuf = raise Toplevel) | BA_pos2 (mdle, position) -> (* break @ [MODULE] # POSITION *) try - new_breakpoint (event_near_pos (convert_module mdle) position) + new_breakpoint (event_near_pos (convert_module (module_of_longident mdle)) position) with | Not_found -> eprintf "Can't find any event there.@." @@ -697,7 +712,7 @@ let instr_list ppf lexbuf = | Not_found -> ("", -1) in - let mdle = convert_module mo in + let mdle = convert_module (module_of_longident mo) in let pos = Lexing.dummy_pos in let beginning = match beg with @@ -841,7 +856,7 @@ let info_breakpoints ppf lexbuf = let info_events ppf lexbuf = ensure_loaded (); - let mdle = convert_module (opt_identifier_eol Lexer.lexeme lexbuf) in + let mdle = convert_module (module_of_longident (opt_longident_eol Lexer.lexeme lexbuf)) in print_endline ("Module : " ^ mdle); print_endline " Address Characters Kind Repr."; List.iter diff --git a/debugger/debugger_config.ml b/debugger/debugger_config.ml index 9af436d5..d8ed23de 100644 --- a/debugger/debugger_config.ml +++ b/debugger/debugger_config.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: debugger_config.ml,v 1.11 2008/07/29 08:31:41 xleroy Exp $ *) +(* $Id: debugger_config.ml,v 1.11.2.1 2009/04/02 09:06:32 xclerc Exp $ *) (**************************** Configuration file ***********************) @@ -62,6 +62,8 @@ let runtime_program = "ocamlrun" (* Time history size (for `last') *) let history_size = ref 30 +let load_path_for = Hashtbl.create 7 + (*** Time travel parameters. ***) (* Step between checkpoints for long displacements.*) diff --git a/debugger/debugger_config.mli b/debugger/debugger_config.mli index a3a9b05c..befdba63 100644 --- a/debugger/debugger_config.mli +++ b/debugger/debugger_config.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: debugger_config.mli,v 1.5 2002/11/17 16:42:10 xleroy Exp $ *) +(* $Id: debugger_config.mli,v 1.5.28.1 2009/04/02 09:06:32 xclerc Exp $ *) (********************** Configuration file *****************************) @@ -25,6 +25,7 @@ val event_mark_after : string val shell : string val runtime_program : string val history_size : int ref +val load_path_for : (string, string list) Hashtbl.t (*** Time travel paramaters. ***) diff --git a/debugger/dynlink.ml b/debugger/dynlink.ml index 65e35ed5..9dec9333 100644 --- a/debugger/dynlink.ml +++ b/debugger/dynlink.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: dynlink.ml,v 1.2 2006/09/28 21:36:38 xleroy Exp $ *) +(* $Id: dynlink.ml,v 1.2.14.1 2009/04/02 09:21:20 xclerc Exp $ *) (* Dynamic loading of .cmo files *) @@ -34,6 +34,7 @@ type error = | Corrupted_interface of string | File_not_found of string | Cannot_open_dll of string + | Inconsistent_implementation of string exception Error of error @@ -96,9 +97,20 @@ let default_available_units () = (* Initialize the linker tables and everything *) +let inited = ref false + let init () = - default_crcs := Symtable.init_toplevel(); - default_available_units () + if not !inited then begin + default_crcs := Symtable.init_toplevel(); + default_available_units (); + inited := true; + end + +let clear_available_units () = init(); clear_available_units () +let allow_only l = init(); allow_only l +let prohibit l = init(); prohibit l +let add_available_units l = init(); add_available_units l +let default_available_units () = init(); default_available_units () (* Read the CRC of an interface from its .cmi file *) @@ -186,6 +198,7 @@ let load_compunit ic file_name compunit = end let loadfile file_name = + init(); let ic = open_in_bin file_name in try let buffer = String.create (String.length Config.cmo_magic_number) in @@ -213,6 +226,7 @@ let loadfile file_name = close_in ic; raise exc let loadfile_private file_name = + init(); let initial_symtable = Symtable.current_state() and initial_crc = !crc_interfaces in try @@ -250,3 +264,8 @@ let error_message = function "cannot find file " ^ name ^ " in search path" | Cannot_open_dll reason -> "error loading shared library: " ^ reason + | Inconsistent_implementation name -> + "implementation mismatch on " ^ name + +let is_native = false +let adapt_filename f = f diff --git a/debugger/dynlink.mli b/debugger/dynlink.mli index f349bf37..bccfab74 100644 --- a/debugger/dynlink.mli +++ b/debugger/dynlink.mli @@ -11,21 +11,22 @@ (* *) (***********************************************************************) -(* $Id: dynlink.mli,v 1.1 2006/05/11 15:51:31 xleroy Exp $ *) +(* $Id: dynlink.mli,v 1.1.14.1 2009/04/02 09:21:20 xclerc Exp $ *) -(** Dynamic loading of bytecode object files. *) +(** Dynamic loading of object files. *) -(** {6 Initialization} *) +val is_native: bool +(** [true] if the program is native, + [false] if the program is bytecode. *) -val init : unit -> unit -(** Initialize the [Dynlink] library. - Must be called before any other function in this module. *) - -(** {6 Dynamic loading of compiled bytecode files} *) +(** {6 Dynamic loading of compiled files} *) val loadfile : string -> unit -(** Load the given bytecode object file ([.cmo] file) or - bytecode library file ([.cma] file), and link it with the running program. +(** In bytecode: load the given bytecode object file ([.cmo] file) or + bytecode library file ([.cma] file), and link it with the running + program. In native code: load the given OCaml plugin file (usually + [.cmxs]), and link it with the running + program. All toplevel expressions in the loaded compilation units are evaluated. No facilities are provided to access value names defined by the unit. Therefore, the unit @@ -37,6 +38,10 @@ val loadfile_private : string -> unit are hidden (cannot be referenced) from other modules dynamically loaded afterwards. *) +val adapt_filename : string -> string +(** In bytecode, the identity function. In native code, replace the last + extension with [.cmxs]. *) + (** {6 Access control} *) val allow_only: string list -> unit @@ -68,7 +73,8 @@ val allow_unsafe_modules : bool -> unit dynamically linked. A compilation unit is ``unsafe'' if it contains declarations of external functions, which can break type safety. By default, dynamic linking of unsafe object files is - not allowed. *) + not allowed. In native code, this function does nothing; object files + with external functions are always allowed to be dynamically linked. *) (** {6 Deprecated, low-level API for access control} *) @@ -77,7 +83,8 @@ val allow_unsafe_modules : bool -> unit since the default initialization of allowed units, along with the [allow_only] and [prohibit] function, provides a better, safer mechanism to control access to program units. The three functions - below are provided for backward compatibility only. *) + below are provided for backward compatibility only and are not + available in native code. *) val add_interfaces : string list -> string list -> unit (** [add_interfaces units path] grants dynamically-linked object @@ -97,6 +104,12 @@ val clear_available_units : unit -> unit (** Empty the list of compilation units accessible to dynamically-linked programs. *) +(** {6 Deprecated, initialization} *) + +val init : unit -> unit +(** @deprecated Initialize the [Dynlink] library. This function is called + automatically when needed. *) + (** {6 Error reporting} *) type linking_error = @@ -113,6 +126,7 @@ type error = | Corrupted_interface of string | File_not_found of string | Cannot_open_dll of string + | Inconsistent_implementation of string exception Error of error (** Errors in dynamic linking are reported by raising the [Error] diff --git a/debugger/envaux.ml b/debugger/envaux.ml index 9905fbc1..d048bb1d 100644 --- a/debugger/envaux.ml +++ b/debugger/envaux.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: envaux.ml,v 1.7 2000/03/06 22:11:17 weis Exp $ *) +(* $Id: envaux.ml,v 1.7.38.1 2009/04/02 09:06:32 xclerc Exp $ *) open Misc open Types @@ -23,7 +23,7 @@ type error = exception Error of error let env_cache = - (Hashtbl.create 59 : (Env.summary, Env.t) Hashtbl.t) + (Hashtbl.create 59 : ((Env.summary * Subst.t), Env.t) Hashtbl.t) let reset_cache () = Hashtbl.clear env_cache; @@ -34,45 +34,46 @@ let extract_sig env mty = Tmty_signature sg -> sg | _ -> fatal_error "Envaux.extract_sig" -let rec env_from_summary sum = +let rec env_from_summary sum subst = try - Hashtbl.find env_cache sum + Hashtbl.find env_cache (sum, subst) with Not_found -> let env = match sum with Env_empty -> Env.empty | Env_value(s, id, desc) -> - Env.add_value id desc (env_from_summary s) + Env.add_value id (Subst.value_description subst desc) (env_from_summary s subst) | Env_type(s, id, desc) -> - Env.add_type id desc (env_from_summary s) + Env.add_type id (Subst.type_declaration subst desc) (env_from_summary s subst) | Env_exception(s, id, desc) -> - Env.add_exception id desc (env_from_summary s) + Env.add_exception id (Subst.exception_declaration subst desc) (env_from_summary s subst) | Env_module(s, id, desc) -> - Env.add_module id desc (env_from_summary s) + Env.add_module id (Subst.modtype subst desc) (env_from_summary s subst) | Env_modtype(s, id, desc) -> - Env.add_modtype id desc (env_from_summary s) + Env.add_modtype id (Subst.modtype_declaration subst desc) (env_from_summary s subst) | Env_class(s, id, desc) -> - Env.add_class id desc (env_from_summary s) + Env.add_class id (Subst.class_declaration subst desc) (env_from_summary s subst) | Env_cltype (s, id, desc) -> - Env.add_cltype id desc (env_from_summary s) + Env.add_cltype id (Subst.cltype_declaration subst desc) (env_from_summary s subst) | Env_open(s, path) -> - let env = env_from_summary s in + let env = env_from_summary s subst in + let path' = Subst.module_path subst path in let mty = try - Env.find_module path env + Env.find_module path' env with Not_found -> - raise (Error (Module_not_found path)) + raise (Error (Module_not_found path')) in - Env.open_signature path (extract_sig env mty) env + Env.open_signature path' (extract_sig env mty) env in - Hashtbl.add env_cache sum env; + Hashtbl.add env_cache (sum, subst) env; env let env_of_event = function None -> Env.empty - | Some ev -> env_from_summary ev.Instruct.ev_typenv + | Some ev -> env_from_summary ev.Instruct.ev_typenv ev.Instruct.ev_typsubst (* Error report *) diff --git a/debugger/eval.ml b/debugger/eval.ml index 4a2e5ae8..9e0a82dd 100644 --- a/debugger/eval.ml +++ b/debugger/eval.ml @@ -11,9 +11,8 @@ (* *) (***********************************************************************) -(* $Id: eval.ml,v 1.30 2007/11/28 22:32:14 weis Exp $ *) +(* $Id: eval.ml,v 1.30.4.5 2009/04/19 08:42:43 xleroy Exp $ *) -open Debugger_config open Misc open Path open Instruct @@ -42,7 +41,9 @@ let abstract_type = let rec path event = function Pident id -> if Ident.global id then - Debugcom.Remote_value.global (Symtable.get_global_position id) + try + Debugcom.Remote_value.global (Symtable.get_global_position id) + with Symtable.Error _ -> raise(Error(Unbound_identifier id)) else begin match event with Some ev -> @@ -88,8 +89,8 @@ let rec expression event env = function end | E_result -> begin match event with - Some {ev_kind = Event_after ty} when !Frames.current_frame = 0 -> - (Debugcom.Remote_value.accu(), ty) + Some {ev_kind = Event_after ty; ev_typsubst = subst} when !Frames.current_frame = 0 -> + (Debugcom.Remote_value.accu(), Subst.type_expr subst ty) | _ -> raise(Error(No_result)) end @@ -178,15 +179,14 @@ let report_error ppf = function | Tuple_index(ty, len, pos) -> Printtyp.reset_and_mark_loops ty; fprintf ppf - "@[Cannot extract field number %i from a %i-components \ - tuple of type@ %a@]@." + "@[Cannot extract field number %i from a %i-tuple of type@ %a@]@." pos len Printtyp.type_expr ty | Array_index(len, pos) -> fprintf ppf - "@[Cannot extract element number %i from array of length %i@]@." pos len + "@[Cannot extract element number %i from an array of length %i@]@." pos len | List_index(len, pos) -> fprintf ppf - "@[Cannot extract element number %i from list of length %i@]@." pos len + "@[Cannot extract element number %i from a list of length %i@]@." pos len | String_index(s, len, pos) -> fprintf ppf "@[Cannot extract character number %i@ \ diff --git a/debugger/events.ml b/debugger/events.ml index 70b47c0f..de623554 100644 --- a/debugger/events.ml +++ b/debugger/events.ml @@ -11,13 +11,11 @@ (* *) (***********************************************************************) -(* $Id: events.ml,v 1.6 2005/08/25 15:35:16 doligez Exp $ *) +(* $Id: events.ml,v 1.6.18.1 2009/04/02 09:44:21 xclerc Exp $ *) (********************************* Events ******************************) open Instruct -open Primitives -open Checkpoints let get_pos ev = match ev.ev_kind with diff --git a/debugger/frames.ml b/debugger/frames.ml index a2fb14e1..3a43530f 100644 --- a/debugger/frames.ml +++ b/debugger/frames.ml @@ -11,14 +11,12 @@ (* *) (***********************************************************************) -(* $Id: frames.ml,v 1.10 2005/08/25 15:35:16 doligez Exp $ *) +(* $Id: frames.ml,v 1.10.18.1 2009/04/02 09:44:21 xclerc Exp $ *) (***************************** Frames **********************************) open Instruct -open Primitives open Debugcom -open Checkpoints open Events open Symbols diff --git a/debugger/history.ml b/debugger/history.ml index 9a8279c1..ab9f54a1 100644 --- a/debugger/history.ml +++ b/debugger/history.ml @@ -11,11 +11,10 @@ (* *) (***********************************************************************) -(* $Id: history.ml,v 1.5 2002/10/29 17:53:24 doligez Exp $ *) +(* $Id: history.ml,v 1.5.28.1 2009/04/02 09:44:21 xclerc Exp $ *) open Int64ops open Checkpoints -open Misc open Primitives open Debugger_config diff --git a/debugger/input_handling.ml b/debugger/input_handling.ml index 1b87c6c2..480819b7 100644 --- a/debugger/input_handling.ml +++ b/debugger/input_handling.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: input_handling.ml,v 1.5 2006/12/09 13:49:10 ertai Exp $ *) +(* $Id: input_handling.ml,v 1.5.14.1 2009/04/02 09:44:21 xclerc Exp $ *) (**************************** Input control ****************************) @@ -30,7 +30,7 @@ let add_file file controller = (* Remove a file from the list of actives files. *) let remove_file file = - active_files := assoc_remove !active_files file.io_fd + active_files := List.remove_assoc file.io_fd !active_files (* Change the controller for the given file. *) let change_controller file controller = diff --git a/debugger/lexer.mll b/debugger/lexer.mll index 017801b6..4737986b 100644 --- a/debugger/lexer.mll +++ b/debugger/lexer.mll @@ -11,11 +11,10 @@ (* *) (***********************************************************************) -(* $Id: lexer.mll,v 1.8 2003/01/03 15:39:54 doligez Exp $ *) +(* $Id: lexer.mll,v 1.8.28.1 2009/04/02 09:44:21 xclerc Exp $ *) { -open Primitives open Parser } diff --git a/debugger/loadprinter.ml b/debugger/loadprinter.ml index 54ec1fdf..bb861e0e 100644 --- a/debugger/loadprinter.ml +++ b/debugger/loadprinter.ml @@ -10,12 +10,11 @@ (* *) (***********************************************************************) -(* $Id: loadprinter.ml,v 1.19 2004/11/29 02:27:25 garrigue Exp $ *) +(* $Id: loadprinter.ml,v 1.19.20.1 2009/04/02 09:44:21 xclerc Exp $ *) (* Loading and installation of user-defined printer functions *) open Misc -open Debugger_config open Longident open Path open Types diff --git a/debugger/main.ml b/debugger/main.ml index 1d8d4965..8b6f3c21 100644 --- a/debugger/main.ml +++ b/debugger/main.ml @@ -11,10 +11,8 @@ (* *) (***********************************************************************) -(* $Id: main.ml,v 1.21 2008/07/29 08:31:41 xleroy Exp $ *) +(* $Id: main.ml,v 1.21.2.2 2009/04/02 09:44:21 xclerc Exp $ *) -open Primitives -open Misc open Input_handling open Question open Command_line @@ -47,12 +45,12 @@ let rec protect ppf restart loop = !current_checkpoint.c_pid; pp_print_flush ppf (); stop_user_input (); - loop ppf) + restart ppf) | Toplevel -> protect ppf restart (function ppf -> pp_print_flush ppf (); stop_user_input (); - loop ppf) + restart ppf) | Sys.Break -> protect ppf restart (function ppf -> fprintf ppf "Interrupted.@."; @@ -62,7 +60,7 @@ let rec protect ppf restart loop = try_select_frame 0; show_current_event ppf; end); - loop ppf) + restart ppf) | Current_checkpoint_lost -> protect ppf restart (function ppf -> fprintf ppf "Trying to recover...@."; @@ -70,7 +68,7 @@ let rec protect ppf restart loop = recover (); try_select_frame 0; show_current_event ppf; - loop ppf) + restart ppf) | Current_checkpoint_lost_start_at (time, init_duration) -> protect ppf restart (function ppf -> let b = diff --git a/debugger/parameters.ml b/debugger/parameters.ml index 9d38ed77..80dfb4ca 100644 --- a/debugger/parameters.ml +++ b/debugger/parameters.ml @@ -11,13 +11,13 @@ (* *) (***********************************************************************) -(* $Id: parameters.ml,v 1.3 2002/02/14 15:17:10 doligez Exp $ *) +(* $Id: parameters.ml,v 1.3.28.1 2009/04/02 09:06:32 xclerc Exp $ *) (* Miscellaneous parameters *) open Primitives open Config -open Misc +open Debugger_config let program_loaded = ref false let program_name = ref "" @@ -31,5 +31,9 @@ let add_path dir = load_path := dir :: except dir !load_path; Envaux.reset_cache() +let add_path_for mdl dir = + let old = try Hashtbl.find load_path_for mdl with Not_found -> [] in + Hashtbl.replace load_path_for mdl (dir :: old) + (* Used by emacs ? *) let emacs = ref false diff --git a/debugger/parameters.mli b/debugger/parameters.mli index 3d8b3e20..f392677e 100644 --- a/debugger/parameters.mli +++ b/debugger/parameters.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: parameters.mli,v 1.2 1999/11/17 18:57:26 xleroy Exp $ *) +(* $Id: parameters.mli,v 1.2.40.1 2009/04/02 09:06:32 xclerc Exp $ *) (* Miscellaneous parameters *) @@ -21,6 +21,7 @@ val arguments : string ref val default_load_path : string list ref val add_path : string -> unit +val add_path_for : string -> string -> unit (* Used by emacs ? *) val emacs : bool ref diff --git a/debugger/parser.mly b/debugger/parser.mly index 829412b6..750f2963 100644 --- a/debugger/parser.mly +++ b/debugger/parser.mly @@ -11,12 +11,11 @@ /* */ /***********************************************************************/ -/* $Id: parser.mly,v 1.7 2002/10/29 17:53:24 doligez Exp $ */ +/* $Id: parser.mly,v 1.7.28.3 2009/04/15 11:09:56 xclerc Exp $ */ %{ open Int64ops -open Primitives open Input_handling open Longident open Parser_aux @@ -93,7 +92,7 @@ open Parser_aux %type break_argument_eol %start list_arguments_eol -%type list_arguments_eol +%type list_arguments_eol %start end_of_line %type end_of_line @@ -101,6 +100,12 @@ open Parser_aux %start longident_eol %type longident_eol +%start opt_longident +%type opt_longident + +%start opt_longident_eol +%type opt_longident_eol + %% /* Raw arguments */ @@ -173,7 +178,15 @@ module_path : ; longident_eol : - longident end_of_line { $1 }; + longident end_of_line { $1 }; + +opt_longident : + UIDENT { Some (Lident $1) } + | module_path DOT UIDENT { Some (Ldot($1, $3)) } + | { None }; + +opt_longident_eol : + opt_longident end_of_line { $1 }; identifier : LIDENT { $1 } @@ -220,16 +233,16 @@ break_argument_eol : end_of_line { BA_none } | integer_eol { BA_pc $1 } | expression end_of_line { BA_function $1 } - | AT opt_identifier INTEGER opt_integer_eol { BA_pos1 ($2, (to_int $3), $4)} - | AT opt_identifier SHARP integer_eol { BA_pos2 ($2, $4) } + | AT opt_longident INTEGER opt_integer_eol { BA_pos1 ($2, (to_int $3), $4)} + | AT opt_longident SHARP integer_eol { BA_pos2 ($2, $4) } ; /* Arguments for list */ list_arguments_eol : - opt_identifier integer opt_integer_eol + opt_longident integer opt_integer_eol { ($1, Some $2, $3) } - | opt_identifier_eol + | opt_longident_eol { ($1, None, None) }; /* End of line */ diff --git a/debugger/parser_aux.mli b/debugger/parser_aux.mli index ff10352f..74da5529 100644 --- a/debugger/parser_aux.mli +++ b/debugger/parser_aux.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: parser_aux.mli,v 1.4 1999/11/17 18:57:26 xleroy Exp $ *) +(* $Id: parser_aux.mli,v 1.4.40.1 2009/04/02 09:06:32 xclerc Exp $ *) (*open Globals*) @@ -28,7 +28,7 @@ type break_arg = BA_none (* break *) | BA_pc of int (* break PC *) | BA_function of expression (* break FUNCTION *) - | BA_pos1 of string option * int * int option + | BA_pos1 of Longident.t option * int * int option (* break @ [MODULE] LINE [POS] *) - | BA_pos2 of string option * int (* break @ [MODULE] # OFFSET *) + | BA_pos2 of Longident.t option * int (* break @ [MODULE] # OFFSET *) diff --git a/debugger/primitives.ml b/debugger/primitives.ml index db1185ba..96dbb03a 100644 --- a/debugger/primitives.ml +++ b/debugger/primitives.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: primitives.ml,v 1.6 2002/10/29 17:53:24 doligez Exp $ *) +(* $Id: primitives.ml,v 1.6.28.1 2009/04/02 09:44:21 xclerc Exp $ *) (*********************** Basic functions and types *********************) @@ -36,26 +36,6 @@ let index a l = | b::l -> if a = b then i else index_rec (i + 1) l in index_rec 0 l -(* Remove an element from an association list *) -let assoc_remove lst elem = - let rec remove = - function - [] -> [] - | ((a, _) as c::t) -> - if a = elem then t - else c::(remove t) - in remove lst - -(* Nth element of a list. *) -let rec list_nth p0 p1 = - match (p0,p1) with - ([], _) -> - invalid_arg "list_nth" - | ((a::_), 0) -> - a - | ((_::l), n) -> - list_nth l (n - 1) - (* Return the `n' first elements of `l' *) (* ### n l -> l' *) let rec list_truncate = @@ -87,44 +67,8 @@ let list_replace x y = else a::(repl l) in repl -(* Filter `list' according to `predicate'. *) -(* ### predicate list -> list' *) -let filter p = - let rec filter2 = - function - [] -> - [] - | a::l -> - if p a then - a::(filter2 l) - else - filter2 l - in filter2 - -(* Find the first element `element' of `list' *) -(* so that `predicate element' holds. *) -(* ### predicate list -> element *) -let find p = - let rec find2 = - function - [] -> - raise Not_found - | a::l -> - if p a then a - else find2 l - in find2 - (*** Operations on strings. ***) -(* Return the position of the first occurence of char `c' in string `s' *) -(* Raise `Not_found' if `s' does not contain `c'. *) -(* ### c s -> pos *) -let string_pos s c = - let i = ref 0 and l = String.length s in - while !i < l && String.get s !i != c do i := !i + 1 done; - if !i = l then raise Not_found; - !i - (* Remove blanks (spaces and tabs) at beginning and end of a string. *) let is_space = function | ' ' | '\t' -> true | _ -> false diff --git a/debugger/primitives.mli b/debugger/primitives.mli index 587c5a20..adf0ce95 100644 --- a/debugger/primitives.mli +++ b/debugger/primitives.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: primitives.mli,v 1.2 1999/11/17 18:57:26 xleroy Exp $ *) +(* $Id: primitives.mli,v 1.2.40.1 2009/04/02 09:44:21 xclerc Exp $ *) (********************* Basic functions and types ***********************) @@ -29,12 +29,6 @@ val except : 'a -> 'a list -> 'a list (* Position of an element in a list. Head of list has position 0. *) val index : 'a -> 'a list -> int -(* Remove on element from an association list. *) -val assoc_remove : ('a * 'b) list -> 'a -> ('a * 'b) list - -(* Nth element of a list. *) -val list_nth : 'a list -> int -> 'a - (* Return the `n' first elements of `l'. *) (* ### n l -> l' *) val list_truncate : int -> 'a list -> 'a list @@ -47,23 +41,8 @@ val list_truncate2 : int -> 'a list -> 'a list * 'a list (* ### x y l -> l' *) val list_replace : 'a -> 'a -> 'a list -> 'a list -(* Filter `list' according to `predicate'. *) -(* ### predicate list -> list' *) -val filter : ('a -> bool) -> 'a list -> 'a list - -(* Find the first element `element' of `list' *) -(* so that `predicate element' holds. *) -(* Raise `Not_found' if no such element. *) -(* ### predicate list -> element *) -val find : ('a -> bool) -> 'a list -> 'a - (*** Operations on strings. ***) -(* Return the position of the first occurence of char `c' in string `s' *) -(* Raise `Not_found' if `s' does not contain `c'. *) -(* ### c s -> pos *) -val string_pos : string -> char -> int - (* Remove blanks (spaces and tabs) at beginning and end of a string. *) val string_trim : string -> string diff --git a/debugger/printval.ml b/debugger/printval.ml index b6244f2e..e984b415 100644 --- a/debugger/printval.ml +++ b/debugger/printval.ml @@ -11,12 +11,10 @@ (* *) (***********************************************************************) -(* $Id: printval.ml,v 1.21 2002/02/13 11:09:17 ddr Exp $ *) +(* $Id: printval.ml,v 1.21.28.1 2009/04/02 09:44:21 xclerc Exp $ *) (* To print values *) -open Misc -open Obj open Format open Parser_aux open Path diff --git a/debugger/program_loading.ml b/debugger/program_loading.ml index a820a09c..4d5d368c 100644 --- a/debugger/program_loading.ml +++ b/debugger/program_loading.ml @@ -11,12 +11,11 @@ (* *) (***********************************************************************) -(* $Id: program_loading.ml,v 1.8 2008/07/29 08:31:41 xleroy Exp $ *) +(* $Id: program_loading.ml,v 1.8.2.1 2009/04/02 09:44:21 xclerc Exp $ *) (* Program loading *) open Unix -open Misc open Debugger_config open Parameters open Input_handling diff --git a/debugger/program_management.ml b/debugger/program_management.ml index 1a83e60a..660ef292 100644 --- a/debugger/program_management.ml +++ b/debugger/program_management.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: program_management.ml,v 1.13 2008/07/29 08:31:41 xleroy Exp $ *) +(* $Id: program_management.ml,v 1.13.2.1 2009/04/02 09:44:21 xclerc Exp $ *) (* Manage the loading of the program *) @@ -19,13 +19,10 @@ open Int64ops open Unix open Unix_tools open Debugger_config -open Misc -open Instruct open Primitives open Parameters open Input_handling open Question -open Debugcom open Program_loading open Time_travel diff --git a/debugger/show_information.ml b/debugger/show_information.ml index 28dc179a..165fbf35 100644 --- a/debugger/show_information.ml +++ b/debugger/show_information.ml @@ -11,11 +11,10 @@ (* *) (***********************************************************************) -(* $Id: show_information.ml,v 1.13 2005/08/25 15:35:16 doligez Exp $ *) +(* $Id: show_information.ml,v 1.13.18.1 2009/04/02 09:44:21 xclerc Exp $ *) open Instruct open Format -open Primitives open Debugcom open Checkpoints open Events diff --git a/debugger/show_source.ml b/debugger/show_source.ml index aa1aa9cf..1189b506 100644 --- a/debugger/show_source.ml +++ b/debugger/show_source.ml @@ -11,11 +11,10 @@ (* *) (***********************************************************************) -(* $Id: show_source.ml,v 1.14 2006/12/09 13:49:10 ertai Exp $ *) +(* $Id: show_source.ml,v 1.14.14.1 2009/04/02 09:44:21 xclerc Exp $ *) open Debugger_config open Instruct -open Misc open Parameters open Primitives open Printf diff --git a/debugger/source.ml b/debugger/source.ml index fec96b9f..644fe845 100644 --- a/debugger/source.ml +++ b/debugger/source.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: source.ml,v 1.8 2006/12/09 13:49:10 ertai Exp $ *) +(* $Id: source.ml,v 1.8.14.1 2009/04/02 09:06:32 xclerc Exp $ *) (************************ Source management ****************************) @@ -23,17 +23,37 @@ let source_extensions = [".ml"] (*** Conversion function. ***) let source_of_module pos mdle = + let is_submodule m m' = + let len' = String.length m' in + try + (String.sub m 0 len') = m' && (String.get m len') = '.' + with + Invalid_argument _ -> false in + let path = + Hashtbl.fold + (fun mdl dirs acc -> + if is_submodule mdle mdl then + dirs + else + acc) + Debugger_config.load_path_for + !Config.load_path in let fname = pos.Lexing.pos_fname in if fname = "" then + let innermost_module = + try + let dot_index = String.rindex mdle '.' in + String.sub mdle (succ dot_index) (pred ((String.length mdle) - dot_index)) + with Not_found -> mdle in let rec loop = function | [] -> raise Not_found | ext :: exts -> - try find_in_path_uncap !Config.load_path (mdle ^ ext) + try find_in_path_uncap path (innermost_module ^ ext) with Not_found -> loop exts in loop source_extensions else if Filename.is_implicit fname then - find_in_path !Config.load_path fname + find_in_path path fname else fname diff --git a/debugger/symbols.ml b/debugger/symbols.ml index 9834b6f5..4b22d895 100644 --- a/debugger/symbols.ml +++ b/debugger/symbols.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: symbols.ml,v 1.18 2005/08/25 15:35:16 doligez Exp $ *) +(* $Id: symbols.ml,v 1.18.18.1 2009/04/02 09:44:21 xclerc Exp $ *) (* Handling of symbol tables (globals and events) *) @@ -92,7 +92,7 @@ let read_symbols bytecode_file = modules := md :: !modules; Hashtbl.add all_events_by_module md sorted_evl; let real_evl = - Primitives.filter + List.filter (function {ev_kind = Event_pseudo} -> false | _ -> true) diff --git a/debugger/time_travel.ml b/debugger/time_travel.ml index 8917bd5e..0d020246 100644 --- a/debugger/time_travel.ml +++ b/debugger/time_travel.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: time_travel.ml,v 1.21 2006/12/09 16:23:37 ertai Exp $ *) +(* $Id: time_travel.ml,v 1.21.14.1 2009/04/02 09:44:21 xclerc Exp $ *) (**************************** Time travel ******************************) @@ -384,7 +384,7 @@ let kill_all_checkpoints () = (* --- Assume that the checkpoint is valid. *) let forget_process fd pid = let checkpoint = - find (function c -> c.c_pid = pid) (!current_checkpoint::!checkpoints) + List.find (function c -> c.c_pid = pid) (!current_checkpoint::!checkpoints) in Printf.eprintf "Lost connection with process %d" pid; let kont = diff --git a/debugger/unix_tools.ml b/debugger/unix_tools.ml index 1e153622..c9f233bb 100644 --- a/debugger/unix_tools.ml +++ b/debugger/unix_tools.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: unix_tools.ml,v 1.9 2008/07/29 08:31:41 xleroy Exp $ *) +(* $Id: unix_tools.ml,v 1.9.2.1 2009/04/02 09:44:21 xclerc Exp $ *) (****************** Tools for Unix *************************************) @@ -22,7 +22,7 @@ open Primitives (*** Convert a socket name into a socket address. ***) let convert_address address = try - let n = string_pos address ':' in + let n = String.index address ':' in let host = String.sub address 0 n and port = String.sub address (n + 1) (String.length address - n - 1) in @@ -90,7 +90,7 @@ let search_in_path name = let rec expand_path ch = let rec subst_variable ch = try - let pos = string_pos ch '$' in + let pos = String.index ch '$' in if (pos + 1 < String.length ch) && (ch.[pos + 1] = '$') then (String.sub ch 0 (pos + 1)) ^ (subst_variable @@ -121,7 +121,7 @@ let rec expand_path ch = in if ch.[0] = '~' then try - match string_pos ch '/' with + match String.index ch '/' with 1 -> (let tail = String.sub ch 2 (String.length ch - 2) in diff --git a/driver/main.ml b/driver/main.ml index 7459f66b..74968452 100644 --- a/driver/main.ml +++ b/driver/main.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: main.ml,v 1.71.2.1 2008/10/15 08:48:51 xleroy Exp $ *) +(* $Id: main.ml,v 1.71.2.2 2009/01/14 13:19:32 doligez Exp $ *) open Config open Clflags @@ -154,9 +154,13 @@ let main () = Arg.parse Options.list anonymous usage; if List.length (List.filter (fun x -> !x) - [make_archive;make_package;compile_only;output_c_object]) > 1 + [make_archive;make_package;compile_only;output_c_object]) + > 1 then - fatal "Please specify at most one of -pack, -a, -c, -output-obj"; + if !print_types then + fatal "Option -i is incompatible with -pack, -a, -output-obj" + else + fatal "Please specify at most one of -pack, -a, -c, -output-obj"; if !make_archive then begin Compile.init_path(); diff --git a/man/ocaml.m b/man/ocaml.m index 5f97b9c1..8087d747 100644 --- a/man/ocaml.m +++ b/man/ocaml.m @@ -1,4 +1,4 @@ -\" $Id: ocaml.m,v 1.10 2008/09/15 14:05:30 doligez Exp $ +\" $Id: ocaml.m,v 1.10.2.1 2009/01/13 15:17:09 doligez Exp $ .TH OCAML 1 @@ -54,7 +54,7 @@ exits after the execution of the last phrase. The following command-line options are recognized by .BR ocaml (1). .TP -.BI -I \ directory +.BI \-I \ directory Add the given directory to the list of directories searched for source and compiled files. By default, the current directory is searched first, then the standard library directory. Directories added diff --git a/myocamlbuild.ml b/myocamlbuild.ml index 2c947952..6e9d40d6 100644 --- a/myocamlbuild.ml +++ b/myocamlbuild.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: myocamlbuild.ml,v 1.23.2.2 2008/10/23 15:29:11 ertai Exp $ *) +(* $Id: myocamlbuild.ml,v 1.23.2.5 2009/05/05 13:40:18 ertai Exp $ *) open Ocamlbuild_plugin open Command @@ -131,6 +131,7 @@ let ocamlc_solver = "stdlib/std_exit.cmx"; "stdlib/std_exit"-.-C.o] in let byte_deps = ["ocamlc"; "stdlib/stdlib.cma"; "stdlib/std_exit.cmo"] in fun () -> + if Pathname.exists "../ocamlcomp.sh" then S[A"../ocamlcomp.sh"] else if List.for_all Pathname.exists native_deps then S[A"./ocamlc.opt"; A"-nostdlib"] else if List.for_all Pathname.exists byte_deps then @@ -141,7 +142,8 @@ Command.setup_virtual_command_solver "OCAMLC" ocamlc_solver;; Command.setup_virtual_command_solver "OCAMLCWIN" (convert_for_windows_shell ocamlc_solver);; let ocamlopt_solver () = - S[if Pathname.exists "ocamlopt.opt" && Pathname.exists ("stdlib/stdlib.cmxa") + S[if Pathname.exists "../ocamlcompopt.sh" then S[A"../ocamlcompopt.sh"] else + if Pathname.exists "ocamlopt.opt" && Pathname.exists ("stdlib/stdlib.cmxa") then A"./ocamlopt.opt" else S[ocamlrun; A"./ocamlopt"]; A"-nostdlib"];; @@ -341,9 +343,11 @@ copy_rule' "lex/main.byte" "lex/ocamllex";; copy_rule' "lex/main.native" "lex/ocamllex.opt";; copy_rule' "debugger/main.byte" "debugger/ocamldebug";; copy_rule' "ocamldoc/odoc.byte" "ocamldoc/ocamldoc";; -copy_rule' "ocamldoc/odoc_opt.native" "ocamldoc/ocamldoc.opt";; +copy_rule' "ocamldoc/odoc.native" "ocamldoc/ocamldoc.opt";; copy_rule' "tools/ocamlmklib.byte" "tools/ocamlmklib";; copy_rule' "otherlibs/dynlink/extract_crc.byte" "otherlibs/dynlink/extract_crc";; +copy_rule' "myocamlbuild_config.mli" "ocamlbuild/ocamlbuild_Myocamlbuild_config.mli";; +copy_rule' "myocamlbuild_config.ml" "ocamlbuild/ocamlbuild_Myocamlbuild_config.ml";; copy_rule' ~insert:`bottom "%" "%.exe";; diff --git a/ocamlbuild/Makefile b/ocamlbuild/Makefile index 84dcc47b..36bf9ee9 100644 --- a/ocamlbuild/Makefile +++ b/ocamlbuild/Makefile @@ -24,6 +24,7 @@ ifdef O OCAMLBUILD_OPTIONS := $(OCAMLBUILD_OPTIONS) $(O) endif +ifeq ($(wildcard ./ocamlbuild_Myocamlbuil*_config.ml),./ocamlbuild_Myocamlbuild_config.ml) ifeq ($(wildcard ./boot/oc*build),./boot/ocamlbuild) OCAMLBUILD=INSTALL_LIB=$(INSTALL_LIB) INSTALL_BIN=$(INSTALL_BIN) $(OCAMLBUILDCMD) -build-dir $(BUILDDIR) -no-links $(OCAMLBUILD_OPTIONS) LIBS=ocamlbuildlib ocamlbuildlightlib @@ -35,6 +36,8 @@ all: $(OCAMLBUILD) $(BYTE) $(NATIVE) byte: $(OCAMLBUILD) $(BYTE) +native: + $(OCAMLBUILD) $(NATIVE) profile: $(OCAMLBUILD) $(LIBS:=.p.cmxa) $(PROGRAMS:=.p.native) debug: @@ -52,6 +55,13 @@ all byte native: ocamlbuild.byte.start cp $(BUILDDIR)/ocamlbuild.native boot/ocamlbuild $(MAKE) $(MFLAGS) $(MAKECMDGOALS) OCAMLBUILD_OPTIONS="-nothing-should-be-rebuilt -verbose -1" endif +else +all byte native: + @echo "Please copy the myocamlbuild_config.ml of the OCaml source distribution" + @echo " as ocamlbuild_Myocamlbuild_config.ml" + @echo + @echo "$$ cp ../myocamlbuild_config.ml ocamlbuild_Myocamlbuild_config.ml" +endif ocamlbuild.byte.start: ./start.sh diff --git a/ocamlbuild/bool.ml b/ocamlbuild/bool.ml index 19cb9142..d31944c1 100644 --- a/ocamlbuild/bool.ml +++ b/ocamlbuild/bool.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: bool.ml,v 1.1 2007/02/07 08:59:13 ertai Exp $ *) + (* Original author: Berke Durak *) (* Bool *) diff --git a/ocamlbuild/bool.mli b/ocamlbuild/bool.mli index 1f4a92e6..59ead55a 100644 --- a/ocamlbuild/bool.mli +++ b/ocamlbuild/bool.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: bool.mli,v 1.1 2007/02/07 08:59:13 ertai Exp $ *) + (* Original author: Berke Durak *) (* Bool *) diff --git a/ocamlbuild/command.ml b/ocamlbuild/command.ml index 077e2ac9..40f4022a 100644 --- a/ocamlbuild/command.ml +++ b/ocamlbuild/command.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: command.ml,v 1.8 2008/07/25 14:28:56 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) (* Command *) diff --git a/ocamlbuild/command.mli b/ocamlbuild/command.mli index 389d6f3b..48e7fdc2 100644 --- a/ocamlbuild/command.mli +++ b/ocamlbuild/command.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: command.mli,v 1.6 2008/07/25 14:25:20 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) (* Command *) diff --git a/ocamlbuild/configuration.ml b/ocamlbuild/configuration.ml index f57a6f0c..c4903cae 100644 --- a/ocamlbuild/configuration.ml +++ b/ocamlbuild/configuration.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: configuration.ml,v 1.2 2007/11/28 16:03:48 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) open My_std open Log diff --git a/ocamlbuild/configuration.mli b/ocamlbuild/configuration.mli index c27edc32..8ee2f42b 100644 --- a/ocamlbuild/configuration.mli +++ b/ocamlbuild/configuration.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: configuration.mli,v 1.3 2008/01/11 16:13:16 doligez Exp $ *) + (* Original author: Nicolas Pouillard *) (* Configuration *) diff --git a/ocamlbuild/discard_printf.ml b/ocamlbuild/discard_printf.ml index 5bcd8763..0d2e925d 100644 --- a/ocamlbuild/discard_printf.ml +++ b/ocamlbuild/discard_printf.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: discard_printf.ml,v 1.1 2007/02/07 08:59:13 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) let rec greedy _ = greedy diff --git a/ocamlbuild/discard_printf.mli b/ocamlbuild/discard_printf.mli index 737ebdb2..255f5d1a 100644 --- a/ocamlbuild/discard_printf.mli +++ b/ocamlbuild/discard_printf.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: discard_printf.mli,v 1.1 2007/02/07 08:59:13 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) (* Discard_printf *) diff --git a/ocamlbuild/display.ml b/ocamlbuild/display.ml index 326ab16b..8178afec 100644 --- a/ocamlbuild/display.ml +++ b/ocamlbuild/display.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: display.ml,v 1.3.4.1 2008/11/06 15:40:39 ertai Exp $ *) + (* Original author: Berke Durak *) (* Display *) open My_std;; diff --git a/ocamlbuild/display.mli b/ocamlbuild/display.mli index de47ca5a..fd0b066d 100644 --- a/ocamlbuild/display.mli +++ b/ocamlbuild/display.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: display.mli,v 1.1 2007/02/07 08:59:13 ertai Exp $ *) + (* Original author: Berke Durak *) (* Display *) diff --git a/ocamlbuild/fda.ml b/ocamlbuild/fda.ml index 21a81ae7..4d4bbac0 100644 --- a/ocamlbuild/fda.ml +++ b/ocamlbuild/fda.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: fda.ml,v 1.4 2007/11/22 18:29:31 ertai Exp $ *) + (* Original author: Berke Durak *) (* FDA *) diff --git a/ocamlbuild/fda.mli b/ocamlbuild/fda.mli index 97160345..c86d6857 100644 --- a/ocamlbuild/fda.mli +++ b/ocamlbuild/fda.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: fda.mli,v 1.2 2007/02/08 16:53:39 ertai Exp $ *) + (* Original author: Berke Durak *) (* Fda *) diff --git a/ocamlbuild/flags.ml b/ocamlbuild/flags.ml index 1696b323..bdf4fc6f 100644 --- a/ocamlbuild/flags.ml +++ b/ocamlbuild/flags.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: flags.ml,v 1.2 2007/02/26 17:05:30 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) open Command open Bool (* FIXME remove me *) diff --git a/ocamlbuild/flags.mli b/ocamlbuild/flags.mli index 8901b709..941a75b7 100644 --- a/ocamlbuild/flags.mli +++ b/ocamlbuild/flags.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: flags.mli,v 1.2 2007/02/26 17:05:30 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) val of_tags : Tags.t -> Command.spec val of_tag_list : Tags.elt list -> Command.spec diff --git a/ocamlbuild/glob.ml b/ocamlbuild/glob.ml index 5a3bb1e8..6ecffedc 100644 --- a/ocamlbuild/glob.ml +++ b/ocamlbuild/glob.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: glob.ml,v 1.5 2008/07/25 14:38:31 ertai Exp $ *) + (* Original author: Berke Durak *) (* Glob *) open My_std;; diff --git a/ocamlbuild/glob.mli b/ocamlbuild/glob.mli index 102dd81a..f047c5b6 100644 --- a/ocamlbuild/glob.mli +++ b/ocamlbuild/glob.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: glob.mli,v 1.2 2007/11/21 21:02:15 ertai Exp $ *) + (* Original author: Berke Durak *) (* Glob *) diff --git a/ocamlbuild/glob_ast.ml b/ocamlbuild/glob_ast.ml index ff4a60d2..a4efaedd 100644 --- a/ocamlbuild/glob_ast.ml +++ b/ocamlbuild/glob_ast.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: glob_ast.ml,v 1.1 2007/02/07 08:59:13 ertai Exp $ *) + (* Original author: Berke Durak *) (* Glob_ast *) diff --git a/ocamlbuild/glob_ast.mli b/ocamlbuild/glob_ast.mli index 15783d78..9c778624 100644 --- a/ocamlbuild/glob_ast.mli +++ b/ocamlbuild/glob_ast.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: glob_ast.mli,v 1.1 2007/02/07 08:59:13 ertai Exp $ *) + (* Original author: Berke Durak *) (* Glob_ast *) diff --git a/ocamlbuild/glob_lexer.mli b/ocamlbuild/glob_lexer.mli index eea41c22..245870ec 100644 --- a/ocamlbuild/glob_lexer.mli +++ b/ocamlbuild/glob_lexer.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: glob_lexer.mli,v 1.1 2007/02/07 08:59:13 ertai Exp $ *) + (* Original author: Berke Durak *) open Glob_ast diff --git a/ocamlbuild/glob_lexer.mll b/ocamlbuild/glob_lexer.mll index 58616156..99c30168 100644 --- a/ocamlbuild/glob_lexer.mll +++ b/ocamlbuild/glob_lexer.mll @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: glob_lexer.mll,v 1.4 2007/11/21 21:03:14 ertai Exp $ *) + (* Original author: Berke Durak *) (* Glob *) { diff --git a/ocamlbuild/hooks.ml b/ocamlbuild/hooks.ml index 0697ef47..e7fd50d5 100644 --- a/ocamlbuild/hooks.ml +++ b/ocamlbuild/hooks.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: hooks.ml,v 1.1 2007/02/07 08:59:13 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) type message = | Before_hygiene diff --git a/ocamlbuild/hooks.mli b/ocamlbuild/hooks.mli index eb0f6b64..aced084d 100644 --- a/ocamlbuild/hooks.mli +++ b/ocamlbuild/hooks.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: hooks.mli,v 1.1 2007/02/07 08:59:13 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) type message = | Before_hygiene diff --git a/ocamlbuild/hygiene.ml b/ocamlbuild/hygiene.ml index 7b0a135c..f6101e91 100644 --- a/ocamlbuild/hygiene.ml +++ b/ocamlbuild/hygiene.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: hygiene.ml,v 1.5 2007/11/22 18:29:32 ertai Exp $ *) + (* Original author: Berke Durak *) (* Hygiene *) open My_std diff --git a/ocamlbuild/hygiene.mli b/ocamlbuild/hygiene.mli index b1e18d99..33420382 100644 --- a/ocamlbuild/hygiene.mli +++ b/ocamlbuild/hygiene.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: hygiene.mli,v 1.3 2007/02/22 15:56:23 ertai Exp $ *) + (* Original author: Berke Durak *) (* Hygiene *) diff --git a/ocamlbuild/lexers.mli b/ocamlbuild/lexers.mli index a9b7ed43..472a3cac 100644 --- a/ocamlbuild/lexers.mli +++ b/ocamlbuild/lexers.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: lexers.mli,v 1.5 2008/01/11 16:13:16 doligez Exp $ *) + (* Original author: Nicolas Pouillard *) exception Error of string diff --git a/ocamlbuild/lexers.mll b/ocamlbuild/lexers.mll index 2a6a2dbd..67fa1e60 100644 --- a/ocamlbuild/lexers.mll +++ b/ocamlbuild/lexers.mll @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: lexers.mll,v 1.7 2008/07/25 14:24:29 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) { exception Error of string diff --git a/ocamlbuild/log.ml b/ocamlbuild/log.ml index 08899545..2fd2b2b1 100644 --- a/ocamlbuild/log.ml +++ b/ocamlbuild/log.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: log.ml,v 1.3 2008/01/11 16:13:16 doligez Exp $ *) + (* Original author: Nicolas Pouillard *) open My_std diff --git a/ocamlbuild/log.mli b/ocamlbuild/log.mli index 6e1c80ed..8f4167bf 100644 --- a/ocamlbuild/log.mli +++ b/ocamlbuild/log.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: log.mli,v 1.3 2008/01/11 16:13:16 doligez Exp $ *) + (* Original author: Nicolas Pouillard *) (* Log *) diff --git a/ocamlbuild/main.ml b/ocamlbuild/main.ml index 38dc396f..7b48b420 100644 --- a/ocamlbuild/main.ml +++ b/ocamlbuild/main.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: main.ml,v 1.21.4.1 2008/11/06 15:40:39 ertai Exp $ *) + (* Original author: Berke Durak *) open My_std open Log diff --git a/ocamlbuild/main.mli b/ocamlbuild/main.mli index 95e469a1..c401be7d 100644 --- a/ocamlbuild/main.mli +++ b/ocamlbuild/main.mli @@ -9,6 +9,6 @@ (* *) (***********************************************************************) -(* $Id: main.mli,v 1.1 2007/02/07 08:59:14 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) val main : unit -> unit diff --git a/ocamlbuild/misc/opentracer.ml b/ocamlbuild/misc/opentracer.ml index 77966a0d..b011f154 100644 --- a/ocamlbuild/misc/opentracer.ml +++ b/ocamlbuild/misc/opentracer.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: opentracer.ml,v 1.1 2007/02/07 08:59:15 ertai Exp $ *) + open My_std module type TRACER = sig diff --git a/ocamlbuild/my_std.ml b/ocamlbuild/my_std.ml index bb809da8..b5abd118 100644 --- a/ocamlbuild/my_std.ml +++ b/ocamlbuild/my_std.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: my_std.ml,v 1.10 2008/10/01 08:36:26 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) open Format diff --git a/ocamlbuild/my_std.mli b/ocamlbuild/my_std.mli index 790f7de6..9346725b 100644 --- a/ocamlbuild/my_std.mli +++ b/ocamlbuild/my_std.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: my_std.mli,v 1.1 2007/02/07 08:59:14 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) (* My_std *) diff --git a/ocamlbuild/my_unix.ml b/ocamlbuild/my_unix.ml index 29f2f5ac..89e9431e 100644 --- a/ocamlbuild/my_unix.ml +++ b/ocamlbuild/my_unix.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: my_unix.ml,v 1.5 2008/01/11 16:13:16 doligez Exp $ *) + (* Original author: Nicolas Pouillard *) open My_std open Format diff --git a/ocamlbuild/my_unix.mli b/ocamlbuild/my_unix.mli index 670903b2..b1acd3a6 100644 --- a/ocamlbuild/my_unix.mli +++ b/ocamlbuild/my_unix.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: my_unix.mli,v 1.4 2008/01/11 16:13:16 doligez Exp $ *) + (* Original author: Nicolas Pouillard *) type file_kind = | FK_dir diff --git a/ocamlbuild/ocaml_arch.ml b/ocamlbuild/ocaml_arch.ml index a54ce156..5563dddd 100644 --- a/ocamlbuild/ocaml_arch.ml +++ b/ocamlbuild/ocaml_arch.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: ocaml_arch.ml,v 1.1 2007/02/07 08:59:14 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) open My_std open Command diff --git a/ocamlbuild/ocaml_arch.mli b/ocamlbuild/ocaml_arch.mli index 356bcf2c..ffdc4edd 100644 --- a/ocamlbuild/ocaml_arch.mli +++ b/ocamlbuild/ocaml_arch.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: ocaml_arch.mli,v 1.1 2007/02/07 08:59:14 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) include Signatures.ARCH diff --git a/ocamlbuild/ocaml_compiler.ml b/ocamlbuild/ocaml_compiler.ml index 93adf5ab..1d736c09 100644 --- a/ocamlbuild/ocaml_compiler.ml +++ b/ocamlbuild/ocaml_compiler.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: ocaml_compiler.ml,v 1.10 2008/01/11 16:13:16 doligez Exp $ *) + (* Original author: Nicolas Pouillard *) open My_std open Format diff --git a/ocamlbuild/ocaml_compiler.mli b/ocamlbuild/ocaml_compiler.mli index 06353766..72d37022 100644 --- a/ocamlbuild/ocaml_compiler.mli +++ b/ocamlbuild/ocaml_compiler.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: ocaml_compiler.mli,v 1.2 2007/02/12 10:26:08 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) val forpack_flags : string -> Tags.t -> Command.spec diff --git a/ocamlbuild/ocaml_dependencies.ml b/ocamlbuild/ocaml_dependencies.ml index 8d9ee167..666b1842 100644 --- a/ocamlbuild/ocaml_dependencies.ml +++ b/ocamlbuild/ocaml_dependencies.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: ocaml_dependencies.ml,v 1.3 2008/01/11 16:13:16 doligez Exp $ *) + (* Original author: Nicolas Pouillard *) open My_std open Log diff --git a/ocamlbuild/ocaml_dependencies.mli b/ocamlbuild/ocaml_dependencies.mli index 89082327..68bc427c 100644 --- a/ocamlbuild/ocaml_dependencies.mli +++ b/ocamlbuild/ocaml_dependencies.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: ocaml_dependencies.mli,v 1.1 2007/02/07 08:59:14 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) (** Ocaml dependencies *) diff --git a/ocamlbuild/ocaml_specific.ml b/ocamlbuild/ocaml_specific.ml index d9085010..e5ad0a22 100644 --- a/ocamlbuild/ocaml_specific.ml +++ b/ocamlbuild/ocaml_specific.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: ocaml_specific.ml,v 1.23.2.1 2008/10/22 11:23:57 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) open My_std open Format @@ -441,18 +441,6 @@ flag ["ocaml"; "doc"; "docfile"; "extension:tex"] (A"-latex");; flag ["ocaml"; "doc"; "docfile"; "extension:ltx"] (A"-latex");; flag ["ocaml"; "doc"; "docfile"; "extension:texi"] (A"-texi");; -(** Ocamlbuild plugin for it's own building *) -let install_lib = lazy (try Sys.getenv "INSTALL_LIB" with Not_found -> !*stdlib_dir/"ocamlbuild" (* not My_std.getenv since it's lazy*)) in -let install_bin = lazy (My_std.getenv ~default:"/usr/local/bin" "INSTALL_BIN") in -rule "ocamlbuild_where.ml" - ~prod:"%ocamlbuild_where.ml" - begin fun env _ -> - Echo( - ["let bindir = ref \""; String.escaped !*install_bin; "\";;\n"; - "let libdir = ref (try Filename.concat (Sys.getenv \"OCAMLLIB\") \"ocamlbuild\" with Not_found -> \""; - String.escaped !*install_lib; "\");;\n"], - env "%ocamlbuild_where.ml") - end;; ocaml_lib "ocamlbuildlib";; ocaml_lib "ocamlbuildlightlib";; diff --git a/ocamlbuild/ocaml_specific.mli b/ocamlbuild/ocaml_specific.mli index be502625..42e512c7 100644 --- a/ocamlbuild/ocaml_specific.mli +++ b/ocamlbuild/ocaml_specific.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: ocaml_specific.mli,v 1.2 2007/02/26 16:27:45 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) diff --git a/ocamlbuild/ocaml_tools.ml b/ocamlbuild/ocaml_tools.ml index 6fa70e6b..74a27a87 100644 --- a/ocamlbuild/ocaml_tools.ml +++ b/ocamlbuild/ocaml_tools.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: ocaml_tools.ml,v 1.12 2008/07/25 15:06:47 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) open My_std open Pathname.Operators diff --git a/ocamlbuild/ocaml_tools.mli b/ocamlbuild/ocaml_tools.mli index 8b30e6a4..542573de 100644 --- a/ocamlbuild/ocaml_tools.mli +++ b/ocamlbuild/ocaml_tools.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: ocaml_tools.mli,v 1.7 2008/07/25 15:06:47 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) val ocamldoc_c : Tags.t -> string -> string -> Command.t diff --git a/ocamlbuild/ocaml_utils.ml b/ocamlbuild/ocaml_utils.ml index 43aacd15..d42c884b 100644 --- a/ocamlbuild/ocaml_utils.ml +++ b/ocamlbuild/ocaml_utils.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: ocaml_utils.ml,v 1.8 2008/07/25 14:49:03 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) open My_std open Format diff --git a/ocamlbuild/ocaml_utils.mli b/ocamlbuild/ocaml_utils.mli index 8abc2233..09329bdd 100644 --- a/ocamlbuild/ocaml_utils.mli +++ b/ocamlbuild/ocaml_utils.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: ocaml_utils.mli,v 1.6 2008/07/25 14:26:13 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) val stdlib_dir : Pathname.t Lazy.t val module_name_of_filename : Pathname.t -> string diff --git a/ocamlbuild/ocamlbuild.ml b/ocamlbuild/ocamlbuild.ml index f0792d42..d3b82518 100644 --- a/ocamlbuild/ocamlbuild.ml +++ b/ocamlbuild/ocamlbuild.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: ocamlbuild.ml,v 1.3 2008/01/11 16:13:16 doligez Exp $ *) + (* Original author: Nicolas Pouillard *) Ocamlbuild_unix_plugin.setup (); Ocamlbuild_pack.Main.main () diff --git a/ocamlbuild/ocamlbuild.mli b/ocamlbuild/ocamlbuild.mli index 9cddf473..3f466934 100644 --- a/ocamlbuild/ocamlbuild.mli +++ b/ocamlbuild/ocamlbuild.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: ocamlbuild.mli,v 1.1 2007/02/07 08:59:14 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) (** Nothing to export for now *) diff --git a/ocamlbuild/ocamlbuild_executor.ml b/ocamlbuild/ocamlbuild_executor.ml index c432c19f..587f4210 100644 --- a/ocamlbuild/ocamlbuild_executor.ml +++ b/ocamlbuild/ocamlbuild_executor.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: ocamlbuild_executor.ml,v 1.4 2007/11/28 17:21:59 ertai Exp $ *) + (* Original author: Berke Durak *) (* Ocamlbuild_executor *) diff --git a/ocamlbuild/ocamlbuild_executor.mli b/ocamlbuild/ocamlbuild_executor.mli index d8f78169..fc25badc 100644 --- a/ocamlbuild/ocamlbuild_executor.mli +++ b/ocamlbuild/ocamlbuild_executor.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: ocamlbuild_executor.mli,v 1.4 2007/11/28 17:21:59 ertai Exp $ *) + (* Original author: Berke Durak *) (* Ocamlbuild_executor *) diff --git a/ocamlbuild/ocamlbuild_pack.mlpack b/ocamlbuild/ocamlbuild_pack.mlpack index acc3aa6a..92b16c7c 100644 --- a/ocamlbuild/ocamlbuild_pack.mlpack +++ b/ocamlbuild/ocamlbuild_pack.mlpack @@ -23,6 +23,7 @@ Fda Ocaml_specific Ocaml_arch Ocamlbuild_where +Ocamlbuild_Myocamlbuild_config Lexers Glob Bool diff --git a/ocamlbuild/ocamlbuild_plugin.ml b/ocamlbuild/ocamlbuild_plugin.ml index 44e29dca..930ba17c 100644 --- a/ocamlbuild/ocamlbuild_plugin.ml +++ b/ocamlbuild/ocamlbuild_plugin.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: ocamlbuild_plugin.ml,v 1.11 2008/07/25 14:42:28 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) open Ocamlbuild_pack diff --git a/ocamlbuild/ocamlbuild_unix_plugin.ml b/ocamlbuild/ocamlbuild_unix_plugin.ml index 59bbbee7..1e4efff4 100644 --- a/ocamlbuild/ocamlbuild_unix_plugin.ml +++ b/ocamlbuild/ocamlbuild_unix_plugin.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: ocamlbuild_unix_plugin.ml,v 1.3 2008/07/31 07:36:12 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) open Format open Ocamlbuild_pack diff --git a/ocamlbuild/ocamlbuild_unix_plugin.mli b/ocamlbuild/ocamlbuild_unix_plugin.mli index 682a9ad4..24269e5a 100644 --- a/ocamlbuild/ocamlbuild_unix_plugin.mli +++ b/ocamlbuild/ocamlbuild_unix_plugin.mli @@ -9,6 +9,6 @@ (* *) (***********************************************************************) -(* $Id: ocamlbuild_unix_plugin.mli,v 1.2 2007/11/22 18:34:22 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) val setup : unit -> unit diff --git a/ocamlbuild/ocamlbuild_where.ml b/ocamlbuild/ocamlbuild_where.ml new file mode 100644 index 00000000..1703a533 --- /dev/null +++ b/ocamlbuild/ocamlbuild_where.ml @@ -0,0 +1,5 @@ +let bindir = ref Ocamlbuild_Myocamlbuild_config.bindir;; +let libdir = ref begin + try Filename.concat (Sys.getenv "OCAMLLIB") "ocamlbuild" + with Not_found -> Ocamlbuild_Myocamlbuild_config.libdir +end;; diff --git a/ocamlbuild/ocamlbuild_where.mli b/ocamlbuild/ocamlbuild_where.mli index e71809f1..eb4c0727 100644 --- a/ocamlbuild/ocamlbuild_where.mli +++ b/ocamlbuild/ocamlbuild_where.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: ocamlbuild_where.mli,v 1.2 2007/10/08 14:19:34 doligez Exp $ *) + (* Original author: Nicolas Pouillard *) diff --git a/ocamlbuild/ocamlbuildlight.ml b/ocamlbuild/ocamlbuildlight.ml index 24eb35a3..7fabd81d 100644 --- a/ocamlbuild/ocamlbuildlight.ml +++ b/ocamlbuild/ocamlbuildlight.ml @@ -9,6 +9,6 @@ (* *) (***********************************************************************) -(* $Id: ocamlbuildlight.ml,v 1.1 2007/02/07 08:59:14 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) Ocamlbuild_pack.Main.main ();; diff --git a/ocamlbuild/ocamlbuildlight.mli b/ocamlbuild/ocamlbuildlight.mli index ae07af39..38ffd979 100644 --- a/ocamlbuild/ocamlbuildlight.mli +++ b/ocamlbuild/ocamlbuildlight.mli @@ -9,6 +9,6 @@ (* *) (***********************************************************************) -(* $Id: ocamlbuildlight.mli,v 1.1 2007/02/07 08:59:14 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) (* Nothing *) diff --git a/ocamlbuild/options.ml b/ocamlbuild/options.ml index b3a03c51..7e9bd5b3 100644 --- a/ocamlbuild/options.ml +++ b/ocamlbuild/options.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: options.ml,v 1.16 2008/07/25 14:49:03 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) let version = "ocamlbuild "^(Sys.ocaml_version);; diff --git a/ocamlbuild/options.mli b/ocamlbuild/options.mli index 98550053..7e07748b 100644 --- a/ocamlbuild/options.mli +++ b/ocamlbuild/options.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: options.mli,v 1.1 2007/02/07 08:59:14 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) include Signatures.OPTIONS with type command_spec = Command.spec diff --git a/ocamlbuild/pathname.ml b/ocamlbuild/pathname.ml index 584c3fd9..7ec8f24c 100644 --- a/ocamlbuild/pathname.ml +++ b/ocamlbuild/pathname.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: pathname.ml,v 1.6 2008/01/11 16:13:16 doligez Exp $ *) + (* Original author: Nicolas Pouillard *) open My_std open Format diff --git a/ocamlbuild/pathname.mli b/ocamlbuild/pathname.mli index 0a7acae6..1ba9badc 100644 --- a/ocamlbuild/pathname.mli +++ b/ocamlbuild/pathname.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: pathname.mli,v 1.4 2008/01/11 16:13:16 doligez Exp $ *) + (* Original author: Nicolas Pouillard *) include Signatures.PATHNAME val link_to_dir : t -> t -> bool diff --git a/ocamlbuild/plugin.ml b/ocamlbuild/plugin.ml index 043a6fca..97d76af0 100644 --- a/ocamlbuild/plugin.ml +++ b/ocamlbuild/plugin.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: plugin.ml,v 1.4.4.1 2008/11/06 15:40:39 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) open My_std open Format diff --git a/ocamlbuild/plugin.mli b/ocamlbuild/plugin.mli index e5494f6b..863de8df 100644 --- a/ocamlbuild/plugin.mli +++ b/ocamlbuild/plugin.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: plugin.mli,v 1.1 2007/02/07 08:59:14 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) (* Plugin *) diff --git a/ocamlbuild/ppcache.ml b/ocamlbuild/ppcache.ml index 41cca6f1..1b576004 100644 --- a/ocamlbuild/ppcache.ml +++ b/ocamlbuild/ppcache.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: ppcache.ml,v 1.3 2008/01/11 16:13:16 doligez Exp $ *) + (* Original author: Nicolas Pouillard *) open My_std open Command diff --git a/ocamlbuild/ppcache.mli b/ocamlbuild/ppcache.mli index 5cd30f2d..d59015f5 100644 --- a/ocamlbuild/ppcache.mli +++ b/ocamlbuild/ppcache.mli @@ -9,6 +9,6 @@ (* *) (***********************************************************************) -(* $Id: ppcache.mli,v 1.1 2007/02/07 08:59:14 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) (* nothing to export *) diff --git a/ocamlbuild/report.ml b/ocamlbuild/report.ml index 9ec17731..e9c5d503 100644 --- a/ocamlbuild/report.ml +++ b/ocamlbuild/report.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: report.ml,v 1.1 2007/02/07 08:59:14 ertai Exp $ *) + (* Original author: Berke Durak *) (* Report *) diff --git a/ocamlbuild/report.mli b/ocamlbuild/report.mli index a0385f9a..16785d70 100644 --- a/ocamlbuild/report.mli +++ b/ocamlbuild/report.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: report.mli,v 1.1 2007/02/07 08:59:14 ertai Exp $ *) + (* Original author: Berke Durak *) (* Report *) diff --git a/ocamlbuild/resource.ml b/ocamlbuild/resource.ml index 6326bdaf..e0bb74ba 100644 --- a/ocamlbuild/resource.ml +++ b/ocamlbuild/resource.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: resource.ml,v 1.9 2008/01/11 16:13:16 doligez Exp $ *) + (* Original author: Nicolas Pouillard *) open My_std open Format diff --git a/ocamlbuild/resource.mli b/ocamlbuild/resource.mli index d80186ca..4822768b 100644 --- a/ocamlbuild/resource.mli +++ b/ocamlbuild/resource.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: resource.mli,v 1.7 2008/01/11 16:13:16 doligez Exp $ *) + (* Original author: Nicolas Pouillard *) open My_std diff --git a/ocamlbuild/rule.ml b/ocamlbuild/rule.ml index 3d6a110c..bf217e7d 100644 --- a/ocamlbuild/rule.ml +++ b/ocamlbuild/rule.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: rule.ml,v 1.20 2008/07/25 14:50:47 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) open My_std open Format diff --git a/ocamlbuild/rule.mli b/ocamlbuild/rule.mli index 2afba6bc..9be718e2 100644 --- a/ocamlbuild/rule.mli +++ b/ocamlbuild/rule.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: rule.mli,v 1.12 2008/07/25 14:50:47 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) open My_std open Resource diff --git a/ocamlbuild/shell.ml b/ocamlbuild/shell.ml index 1e2664d4..6c849639 100644 --- a/ocamlbuild/shell.ml +++ b/ocamlbuild/shell.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: shell.ml,v 1.4 2008/01/11 16:13:16 doligez Exp $ *) + (* Original author: Nicolas Pouillard *) open My_std diff --git a/ocamlbuild/shell.mli b/ocamlbuild/shell.mli index ae1bbe5b..d393c7b3 100644 --- a/ocamlbuild/shell.mli +++ b/ocamlbuild/shell.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: shell.mli,v 1.1 2007/02/07 08:59:14 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) val is_simple_filename : string -> bool val quote_filename_if_needed : string -> string diff --git a/ocamlbuild/signatures.mli b/ocamlbuild/signatures.mli index 479e3e5a..4304d749 100644 --- a/ocamlbuild/signatures.mli +++ b/ocamlbuild/signatures.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: signatures.mli,v 1.28 2008/07/25 14:42:28 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) (** This module contains all module signatures that the user could use to build an ocamlbuild plugin. *) diff --git a/ocamlbuild/slurp.ml b/ocamlbuild/slurp.ml index 7a9de141..896628db 100644 --- a/ocamlbuild/slurp.ml +++ b/ocamlbuild/slurp.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: slurp.ml,v 1.1 2007/02/07 08:59:14 ertai Exp $ *) + (* Original author: Berke Durak *) (* Slurp *) open My_std diff --git a/ocamlbuild/slurp.mli b/ocamlbuild/slurp.mli index 6a4eece4..a3a141d8 100644 --- a/ocamlbuild/slurp.mli +++ b/ocamlbuild/slurp.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: slurp.mli,v 1.1 2007/02/07 08:59:15 ertai Exp $ *) + (* Original author: Berke Durak *) (* Slurp *) diff --git a/ocamlbuild/solver.ml b/ocamlbuild/solver.ml index ae48be04..1f4f4ef0 100644 --- a/ocamlbuild/solver.ml +++ b/ocamlbuild/solver.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: solver.ml,v 1.8 2008/07/25 14:50:47 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) open My_std open Log diff --git a/ocamlbuild/solver.mli b/ocamlbuild/solver.mli index 18ca8aee..b2ec4952 100644 --- a/ocamlbuild/solver.mli +++ b/ocamlbuild/solver.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: solver.mli,v 1.1 2007/02/07 08:59:15 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) type backtrace = private | Leaf of Pathname.t diff --git a/ocamlbuild/start.sh b/ocamlbuild/start.sh index 331967cf..742e81ad 100755 --- a/ocamlbuild/start.sh +++ b/ocamlbuild/start.sh @@ -12,7 +12,7 @@ # # ######################################################################### -# $Id: start.sh,v 1.6 2008/01/11 16:13:16 doligez Exp $ + set -e set -x diff --git a/ocamlbuild/std_signatures.mli b/ocamlbuild/std_signatures.mli index 358bb661..8cef4413 100644 --- a/ocamlbuild/std_signatures.mli +++ b/ocamlbuild/std_signatures.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: std_signatures.mli,v 1.1 2007/02/07 08:59:15 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) (** Some signatures from the standard library. *) diff --git a/ocamlbuild/tags.ml b/ocamlbuild/tags.ml index e9dc20d8..811657ac 100644 --- a/ocamlbuild/tags.ml +++ b/ocamlbuild/tags.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: tags.ml,v 1.2 2007/02/22 15:56:23 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) include Set.Make(String) diff --git a/ocamlbuild/tags.mli b/ocamlbuild/tags.mli index 51a154ee..dadf9afa 100644 --- a/ocamlbuild/tags.mli +++ b/ocamlbuild/tags.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: tags.mli,v 1.1 2007/02/07 08:59:15 ertai Exp $ *) + (* Original author: Nicolas Pouillard *) include Signatures.TAGS diff --git a/ocamlbuild/tools.ml b/ocamlbuild/tools.ml index 458d59a2..587c2c75 100644 --- a/ocamlbuild/tools.ml +++ b/ocamlbuild/tools.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: tools.ml,v 1.4 2008/01/11 16:13:16 doligez Exp $ *) + (* Original author: Nicolas Pouillard *) (* Tools *) diff --git a/ocamlbuild/tools.mli b/ocamlbuild/tools.mli index 2bc0854e..6c4b6f3e 100644 --- a/ocamlbuild/tools.mli +++ b/ocamlbuild/tools.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: tools.mli,v 1.3 2008/01/11 16:13:16 doligez Exp $ *) + (* Original author: Nicolas Pouillard *) (* Tools *) diff --git a/ocamldoc/.depend b/ocamldoc/.depend index f0b3e1ab..c5cfab00 100644 --- a/ocamldoc/.depend +++ b/ocamldoc/.depend @@ -146,14 +146,6 @@ odoc_name.cmx: ../typing/path.cmx odoc_misc.cmx ../typing/ident.cmx \ odoc_name.cmi odoc_ocamlhtml.cmo: odoc_ocamlhtml.cmx: -odoc_opt.cmo: ../typing/typedtree.cmi odoc_texi.cmo odoc_messages.cmo \ - odoc_man.cmo odoc_latex.cmo odoc_info.cmi odoc_html.cmo odoc_global.cmi \ - odoc_dot.cmo odoc_args.cmi odoc_analyse.cmi ../utils/misc.cmi \ - ../utils/config.cmi ../utils/clflags.cmi -odoc_opt.cmx: ../typing/typedtree.cmx odoc_texi.cmx odoc_messages.cmx \ - odoc_man.cmx odoc_latex.cmx odoc_info.cmx odoc_html.cmx odoc_global.cmx \ - odoc_dot.cmx odoc_args.cmx odoc_analyse.cmx ../utils/misc.cmx \ - ../utils/config.cmx ../utils/clflags.cmx odoc_parameter.cmo: ../typing/types.cmi odoc_types.cmi odoc_parameter.cmx: ../typing/types.cmx odoc_types.cmx odoc_parser.cmo: odoc_types.cmi odoc_comments_global.cmi odoc_parser.cmi diff --git a/ocamldoc/Makefile b/ocamldoc/Makefile index 0878a795..66f9fddc 100644 --- a/ocamldoc/Makefile +++ b/ocamldoc/Makefile @@ -9,7 +9,7 @@ #(* *) #(***********************************************************************) -# $Id: Makefile,v 1.66 2008/01/11 16:13:16 doligez Exp $ +# $Id: Makefile,v 1.66.4.1 2009/04/09 13:56:38 guesdon Exp $ include ../config/Makefile @@ -111,16 +111,17 @@ CMOFILES= odoc_config.cmo \ CMXFILES= $(CMOFILES:.cmo=.cmx) CMIFILES= $(CMOFILES:.cmo=.cmi) -EXECMOFILES=$(CMOFILES)\ - odoc_dag2html.cmo\ - odoc_to_text.cmo\ - odoc_ocamlhtml.cmo\ - odoc_html.cmo\ - odoc_man.cmo\ +EXECMOFILES=$(CMOFILES) \ + odoc_dag2html.cmo \ + odoc_to_text.cmo \ + odoc_ocamlhtml.cmo \ + odoc_html.cmo \ + odoc_man.cmo \ odoc_latex_style.cmo \ - odoc_latex.cmo\ - odoc_texi.cmo\ - odoc_dot.cmo + odoc_latex.cmo \ + odoc_texi.cmo \ + odoc_dot.cmo \ + odoc.cmo EXECMXFILES= $(EXECMOFILES:.cmo=.cmx) EXECMIFILES= $(EXECMOFILES:.cmo=.cmi) @@ -199,10 +200,10 @@ libopt: $(OCAMLDOC_LIBCMXA) $(OCAMLDOC_LIBCMI) debug: make OCAMLPP="" -$(OCAMLDOC): $(EXECMOFILES) odoc.cmo - $(OCAMLC) -o $@ -linkall unix.cma str.cma dynlink.cma $(LINKFLAGS) $(OCAMLCMOFILES) $(EXECMOFILES) odoc.cmo -$(OCAMLDOC_OPT): $(EXECMXFILES) odoc_opt.cmx - $(OCAMLOPT) -o $@ unix.cmxa str.cmxa $(LINKFLAGS) $(OCAMLCMXFILES) $(EXECMXFILES) odoc_opt.cmx +$(OCAMLDOC): $(EXECMOFILES) + $(OCAMLC) -o $@ -linkall unix.cma str.cma dynlink.cma $(LINKFLAGS) $(OCAMLCMOFILES) $(EXECMOFILES) +$(OCAMLDOC_OPT): $(EXECMXFILES) + $(OCAMLOPT) -o $@ unix.cmxa str.cmxa dynlink.cmxa $(LINKFLAGS) $(OCAMLCMXFILES) $(EXECMXFILES) $(OCAMLDOC_LIBCMA): $(LIBCMOFILES) $(OCAMLC) -a -o $@ $(LINKFLAGS) $(OCAMLCMOFILES) $(LIBCMOFILES) @@ -211,7 +212,7 @@ $(OCAMLDOC_LIBCMXA): $(LIBCMXFILES) manpages: stdlib_man/Pervasives.3o -dot: $(EXECMOFILES) odoc.cmo +dot: $(EXECMOFILES) $(OCAMLDOC_RUN) -dot -dot-reduce -o ocamldoc.dot $(INCLUDES) \ odoc*.ml diff --git a/ocamldoc/Makefile.nt b/ocamldoc/Makefile.nt index 0b6e916c..009bfbd1 100644 --- a/ocamldoc/Makefile.nt +++ b/ocamldoc/Makefile.nt @@ -9,7 +9,7 @@ #(* *) #(***********************************************************************) -# $Id: Makefile.nt,v 1.27 2007/11/06 15:16:56 frisch Exp $ +# $Id: Makefile.nt,v 1.27.4.1 2009/04/09 13:56:38 guesdon Exp $ include ../config/Makefile @@ -115,6 +115,7 @@ EXECMOFILES=$(CMOFILES)\ odoc_latex.cmo\ odoc_texi.cmo\ odoc_dot.cmo\ + odoc.cmo EXECMXFILES= $(EXECMOFILES:.cmo=.cmx) @@ -186,10 +187,10 @@ libopt: $(OCAMLDOC_LIBCMXA) $(OCAMLDOC_LIBCMI) debug: make OCAMLPP="" -$(OCAMLDOC): $(EXECMOFILES) odoc.cmo - $(OCAMLC) -o $@ -linkall unix.cma str.cma dynlink.cma $(LINKFLAGS) $(OCAMLCMOFILES) $(EXECMOFILES) odoc.cmo -$(OCAMLDOC_OPT): $(EXECMXFILES) odoc_opt.cmx - $(OCAMLOPT) -o $@ unix.cmxa str.cmxa $(LINKFLAGS) $(OCAMLCMXFILES) $(EXECMXFILES) odoc_opt.cmx +$(OCAMLDOC): $(EXECMOFILES) + $(OCAMLC) -o $@ -linkall unix.cma str.cma dynlink.cma $(LINKFLAGS) $(OCAMLCMOFILES) $(EXECMOFILES) +$(OCAMLDOC_OPT): $(EXECMXFILES) + $(OCAMLOPT) -o $@ unix.cmxa str.cmxa $(LINKFLAGS) $(OCAMLCMXFILES) $(EXECMXFILES) $(OCAMLDOC_LIBCMA): $(LIBCMOFILES) $(OCAMLC) -a -o $@ $(LINKFLAGS) $(OCAMLCMOFILES) $(LIBCMOFILES) diff --git a/ocamldoc/odoc.ml b/ocamldoc/odoc.ml index 472e93bd..97c70f3f 100644 --- a/ocamldoc/odoc.ml +++ b/ocamldoc/odoc.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc.ml,v 1.9 2006/09/20 11:14:36 doligez Exp $ *) +(* $Id: odoc.ml,v 1.9.14.1 2009/04/09 13:56:38 guesdon Exp $ *) (** Main module for bytecode. *) @@ -25,17 +25,18 @@ let print_DEBUG s = print_string s ; print_newline () (* we check if we must load a module given on the command line *) let arg_list = Array.to_list Sys.argv -let (cmo_or_cma_opt, paths) = +let (cm_opt, paths) = let rec iter (f_opt, inc) = function [] | _ :: [] -> (f_opt, inc) | "-g" :: file :: q when ((Filename.check_suffix file "cmo") or - (Filename.check_suffix file "cma")) & + (Filename.check_suffix file "cma") or + (Filename.check_suffix file "cmxs")) & (f_opt = None) -> - iter (Some file, inc) q - | "-i" :: dir :: q -> - iter (f_opt, inc @ [dir]) q - | _ :: q -> + iter (Some file, inc) q + | "-i" :: dir :: q -> + iter (f_opt, inc @ [dir]) q + | _ :: q -> iter (f_opt, inc) q in iter (None, []) arg_list @@ -63,12 +64,11 @@ let get_real_filename name = ) let _ = - match cmo_or_cma_opt with + match cm_opt with None -> () | Some file -> - (* initializations for dynamic loading *) - Dynlink.init (); + let file = Dynlink.adapt_filename file in Dynlink.allow_unsafe_modules true; try let real_file = get_real_filename file in @@ -147,4 +147,4 @@ let _ = exit 0 -(* eof $Id: odoc.ml,v 1.9 2006/09/20 11:14:36 doligez Exp $ *) +(* eof $Id: odoc.ml,v 1.9.14.1 2009/04/09 13:56:38 guesdon Exp $ *) diff --git a/ocamldoc/odoc_args.ml b/ocamldoc/odoc_args.ml index f82458a9..d9ba9324 100644 --- a/ocamldoc/odoc_args.ml +++ b/ocamldoc/odoc_args.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* cvsid $Id: odoc_args.ml,v 1.22 2008/07/25 13:28:23 guesdon Exp $ *) +(* cvsid $Id: odoc_args.ml,v 1.22.2.1 2009/04/09 13:56:38 guesdon Exp $ *) (** Command-line arguments. *) @@ -24,8 +24,6 @@ type source_file = let include_dirs = Clflags.include_dirs -let bytecode_mode = ref true - class type doc_generator = object method generate : Odoc_module.t_module list -> unit @@ -254,10 +252,8 @@ let options = ref [ "-dot", Arg.Unit (fun () -> set_doc_generator !default_dot_generator), M.generate_dot ; "-customdir", Arg.Unit (fun () -> Printf.printf "%s\n" Odoc_config.custom_generators_path; exit 0), M.display_custom_generators_dir ; - "-i", Arg.String (fun s -> if !bytecode_mode then () else (prerr_endline (M.option_not_in_native_code "-i"); exit 1)), - M.add_load_dir ; - "-g", Arg.String (fun s -> if !bytecode_mode then () else (prerr_endline (M.option_not_in_native_code "-g"); exit 1)), - M.load_file ^ + "-i", Arg.String (fun s -> ()), M.add_load_dir ; + "-g", Arg.String (fun s -> ()), M.load_file ^ "\n\n *** HTML options ***\n"; (* html only options *) diff --git a/ocamldoc/odoc_args.mli b/ocamldoc/odoc_args.mli index bd34ec52..f2fd6b39 100644 --- a/ocamldoc/odoc_args.mli +++ b/ocamldoc/odoc_args.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_args.mli,v 1.17 2008/07/25 13:28:23 guesdon Exp $ *) +(* $Id: odoc_args.mli,v 1.17.2.1 2009/04/09 13:56:38 guesdon Exp $ *) (** Analysis of the command line arguments. *) @@ -22,10 +22,6 @@ type source_file = (** The include_dirs in the OCaml compiler. *) val include_dirs : string list ref -(** Indicate if we are in bytecode mode or not. - (For the [ocamldoc] command).*) -val bytecode_mode : bool ref - (** The class type of documentation generators. *) class type doc_generator = object method generate : Odoc_module.t_module list -> unit end diff --git a/ocamldoc/odoc_messages.ml b/ocamldoc/odoc_messages.ml index f288da10..cadca59a 100644 --- a/ocamldoc/odoc_messages.ml +++ b/ocamldoc/odoc_messages.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_messages.ml,v 1.32 2008/07/25 13:28:23 guesdon Exp $ *) +(* $Id: odoc_messages.ml,v 1.32.2.1 2009/04/09 13:56:38 guesdon Exp $ *) (** The messages of the application. *) @@ -24,7 +24,6 @@ let message_version = software^" "^config_version let usage = "Usage : "^(Sys.argv.(0))^" [options] \n" let options_are = "Options are :" let option_version = "\tPrint version and exit" -let bytecode_only = "(bytecode version only)" let latex_only = "(LaTeX only)" let texi_only = "(TeXinfo only)" let latex_texi_only = "(LaTeX and TeXinfo only)" @@ -41,8 +40,8 @@ let option_intf ="\tConsider as a .mli file" let option_text ="\tConsider as a .txt file" let display_custom_generators_dir = "\tDisplay custom generators standard directory and exit" let add_load_dir = "

\tAdd the given directory to the search path for custom\n"^ - "\t\tgenerators "^bytecode_only -let load_file = "\n\t\tLoad file defining a new documentation generator\n\t\t"^bytecode_only + "\t\tgenerators" +let load_file = "\n\t\tLoad file defining a new documentation generator" let nolabels = "\tIgnore non-optional labels in types" let werr = "\tTreat ocamldoc warnings as errors" let hide_warnings = "\n\t\tdo not print ocamldoc warnings" diff --git a/ocamldoc/odoc_name.ml b/ocamldoc/odoc_name.ml index edcaf892..a8459747 100644 --- a/ocamldoc/odoc_name.ml +++ b/ocamldoc/odoc_name.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_name.ml,v 1.10 2006/07/06 07:19:06 pouillar Exp $ *) +(* $Id: odoc_name.ml,v 1.10.14.1 2009/03/12 18:21:08 doligez Exp $ *) (** Representation of element names. *) @@ -35,12 +35,13 @@ type t = string let parens_if_infix name = match name with - "" -> "" - | s -> - if List.mem s.[0] infix_chars then - "("^s^")" - else - s + | "" -> "" + | s when s.[0] = '*' || s.[String.length s - 1] = '*' -> "( " ^ s ^ " )" + | s when List.mem s.[0] infix_chars -> "(" ^ s ^ ")" + | "or" | "mod" | "land" | "lor" | "lxor" | "lsl" | "lsr" | "asr" -> + "(" ^ name ^ ")" + | _ -> name +;; let cut name = match name with diff --git a/ocamldoc/odoc_opt.ml b/ocamldoc/odoc_opt.ml deleted file mode 100644 index 791db14d..00000000 --- a/ocamldoc/odoc_opt.ml +++ /dev/null @@ -1,81 +0,0 @@ -(***********************************************************************) -(* OCamldoc *) -(* *) -(* Maxence Guesdon, projet Cristal, INRIA Rocquencourt *) -(* *) -(* Copyright 2001 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: odoc_opt.ml,v 1.6 2006/09/20 11:14:37 doligez Exp $ *) - -(** Main module for native version.*) - -open Config -open Clflags -open Misc -open Format -open Typedtree - -let _ = Odoc_args.bytecode_mode := false - - -let html_generator = new Odoc_html.html -let default_latex_generator = new Odoc_latex.latex -let default_texi_generator = new Odoc_texi.texi -let default_man_generator = new Odoc_man.man -let default_dot_generator = new Odoc_dot.dot -let _ = Odoc_args.parse - (html_generator :> Odoc_args.doc_generator) - (default_latex_generator :> Odoc_args.doc_generator) - (default_texi_generator :> Odoc_args.doc_generator) - (default_man_generator :> Odoc_args.doc_generator) - (default_dot_generator :> Odoc_args.doc_generator) - -let loaded_modules = - List.flatten - (List.map - (fun f -> - Odoc_info.verbose (Odoc_messages.loading f); - try - let l = Odoc_analyse.load_modules f in - Odoc_info.verbose Odoc_messages.ok; - l - with Failure s -> - prerr_endline s ; - incr Odoc_global.errors ; - [] - ) - !Odoc_args.load - ) - -let modules = Odoc_analyse.analyse_files ~init: loaded_modules !Odoc_args.files - -let _ = - match !Odoc_args.dump with - None -> () - | Some f -> - try Odoc_analyse.dump_modules f modules - with Failure s -> - prerr_endline s ; - incr Odoc_global.errors - -let _ = - match !Odoc_args.doc_generator with - None -> - () - | Some gen -> - Odoc_info.verbose Odoc_messages.generating_doc; - gen#generate modules; - Odoc_info.verbose Odoc_messages.ok - -let _ = - if !Odoc_global.errors > 0 then - ( - prerr_endline (Odoc_messages.errors_occured !Odoc_global.errors) ; - exit 1 - ) - else - exit 0 diff --git a/otherlibs/dbm/Makefile b/otherlibs/dbm/Makefile index 68fd200a..71fe0ba1 100644 --- a/otherlibs/dbm/Makefile +++ b/otherlibs/dbm/Makefile @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile,v 1.26 2007/11/06 15:16:56 frisch Exp $ +# $Id: Makefile,v 1.26.4.1 2009/03/31 11:33:25 xleroy Exp $ # Makefile for the ndbm library @@ -21,6 +21,7 @@ CAMLOBJS=dbm.cmo COBJS=cldbm.o EXTRACFLAGS=$(DBM_INCLUDES) LINKOPTS=$(DBM_LINK) +LDOPTS=-ldopt "$(DBM_LINK)" include ../Makefile diff --git a/otherlibs/labltk/lib/Makefile b/otherlibs/labltk/lib/Makefile index e2fe5f16..5aec48c4 100644 --- a/otherlibs/labltk/lib/Makefile +++ b/otherlibs/labltk/lib/Makefile @@ -32,7 +32,7 @@ $(LIBNAME).cma: $(SUPPORT) ../Widgets.src $(MAKE) superclean cd ../labltk; $(MAKE) cd ../camltk; $(MAKE) - $(MKLIB) -ocamlc '$(CAMLC)' -o $(LIBNAME) \ + $(MKLIB) -ocamlc '$(CAMLCB)' -o $(LIBNAME) \ -I ../labltk -I ../camltk $(TKOBJS) \ -ccopt "\"$(TK_LINK)\"" @@ -40,7 +40,7 @@ $(LIBNAME).cmxa: $(SUPPORT:.cmo=.cmx) ../Widgets.src $(MAKE) superclean cd ../labltk; $(MAKE) opt cd ../camltk; $(MAKE) opt - $(MKLIB) -ocamlopt '$(CAMLOPT)' -o $(LIBNAME) -oc $(LIBNAME) \ + $(MKLIB) -ocamlopt '$(CAMLOPTB)' -o $(LIBNAME) -oc $(LIBNAME) \ -I ../labltk -I ../camltk $(TKOBJS:.cmo=.cmx) \ -ccopt "\"$(TK_LINK)\"" diff --git a/otherlibs/labltk/support/Makefile.common b/otherlibs/labltk/support/Makefile.common index 21580482..56f6fd13 100644 --- a/otherlibs/labltk/support/Makefile.common +++ b/otherlibs/labltk/support/Makefile.common @@ -13,8 +13,10 @@ INSTALLDIR=$(LIBDIR)/$(LIBNAME) ## Tools from the Objective Caml distribution CAMLRUN=$(TOPDIR)/boot/ocamlrun -CAMLC=$(CAMLRUN) $(TOPDIR)/ocamlc -nostdlib -I $(TOPDIR)/stdlib -CAMLOPT=$(CAMLRUN) $(TOPDIR)/ocamlopt -nostdlib -I $(TOPDIR)/stdlib +CAMLC=$(TOPDIR)/ocamlcomp.sh +CAMLOPT=$(TOPDIR)/ocamlcompopt.sh +CAMLCB=$(CAMLRUN) $(TOPDIR)/ocamlc +CAMLOPTB=$(CAMLRUN) $(TOPDIR)/ocamlopt CAMLCOMP=$(CAMLC) -c -warn-error A CAMLYACC=$(TOPDIR)/boot/ocamlyacc -v CAMLLEX=$(CAMLRUN) $(TOPDIR)/boot/ocamllex diff --git a/otherlibs/labltk/tkanim/Makefile b/otherlibs/labltk/tkanim/Makefile index 574069ea..c2974388 100644 --- a/otherlibs/labltk/tkanim/Makefile +++ b/otherlibs/labltk/tkanim/Makefile @@ -14,10 +14,10 @@ OBJS=tkanim.cmo COBJS= cltkaniminit.$(O) tkAnimGIF.$(O) tkanim.cma: $(OBJS) - $(MKLIB) -ocamlc '$(CAMLC)' -o tkanim $(OBJS) + $(MKLIB) -ocamlc '$(CAMLCB)' -o tkanim $(OBJS) tkanim.cmxa: $(OBJS:.cmo=.cmx) - $(MKLIB) -ocamlopt '$(CAMLOPT)' -o tkanim $(OBJS:.cmo=.cmx) + $(MKLIB) -ocamlopt '$(CAMLOPTB)' -o tkanim $(OBJS:.cmo=.cmx) libtkanim.$(A): $(COBJS) $(MKLIB) -o tkanim $(COBJS) diff --git a/otherlibs/num/big_int.ml b/otherlibs/num/big_int.ml index dd8c3364..8c47f7bc 100644 --- a/otherlibs/num/big_int.ml +++ b/otherlibs/num/big_int.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: big_int.ml,v 1.24 2008/08/03 09:04:40 xleroy Exp $ *) +(* $Id: big_int.ml,v 1.24.2.1 2009/05/18 13:08:03 xleroy Exp $ *) open Int_misc open Nat @@ -367,8 +367,8 @@ let big_int_of_int64 i = else if i > 0L then (1, i) else (-1, Int64.neg i) in let res = create_nat 2 in - set_digit_nat_native res 0 (Int64.to_nativeint i); - set_digit_nat_native res 1 (Int64.to_nativeint (Int64.shift_right i 32)); + set_digit_nat_native res 0 (Int64.to_nativeint absi); + set_digit_nat_native res 1 (Int64.to_nativeint (Int64.shift_right absi 32)); { sign = sg; abs_value = res } end diff --git a/otherlibs/num/test/test_big_ints.ml b/otherlibs/num/test/test_big_ints.ml index f3080e5d..c9026a3f 100644 --- a/otherlibs/num/test/test_big_ints.ml +++ b/otherlibs/num/test/test_big_ints.ml @@ -750,6 +750,16 @@ test 2 eq_big_int (big_int_of_int64 9223372036854775807L, big_int_of_string "9223372036854775807");; test 3 eq_big_int (big_int_of_int64 (-9223372036854775808L), big_int_of_string "-9223372036854775808");; +test 4 eq_big_int (*PR#4792*) + (big_int_of_int64 (Int64.of_int32 Int32.min_int), big_int_of_string "-2147483648");; +test 5 eq_big_int + (big_int_of_int64 1234L, big_int_of_string "1234");; +test 6 eq_big_int + (big_int_of_int64 0x1234567890ABCDEFL, big_int_of_string "1311768467294899695");; +test 7 eq_big_int + (big_int_of_int64 (-1234L), big_int_of_string "-1234");; +test 8 eq_big_int + (big_int_of_int64 (-0x1234567890ABCDEFL), big_int_of_string "-1311768467294899695");; testing_function "int64_of_big_int";; diff --git a/otherlibs/str/str.ml b/otherlibs/str/str.ml index 1e1fb51e..a8453529 100644 --- a/otherlibs/str/str.ml +++ b/otherlibs/str/str.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: str.ml,v 1.22 2008/08/01 12:27:13 xleroy Exp $ *) +(* $Id: str.ml,v 1.22.2.1 2008/12/12 08:54:15 xleroy Exp $ *) (** String utilities *) @@ -96,7 +96,7 @@ module Charset = type re_syntax = Char of char | String of string - | CharClass of Charset.t + | CharClass of Charset.t * bool (* true = complemented, false = normal *) | Seq of re_syntax list | Alt of re_syntax * re_syntax | Star of re_syntax @@ -156,7 +156,7 @@ let displ dest from = dest - from - 1 let rec is_nullable = function Char c -> false | String s -> s = "" - | CharClass cl -> false + | CharClass(cl, cmpl) -> false | Seq rl -> List.for_all is_nullable rl | Alt (r1, r2) -> is_nullable r1 || is_nullable r2 | Star r -> true @@ -175,7 +175,7 @@ let rec is_nullable = function let rec first = function Char c -> Charset.singleton c | String s -> if s = "" then Charset.full else Charset.singleton s.[0] - | CharClass cl -> cl + | CharClass(cl, cmpl) -> if cmpl then Charset.complement cl else cl | Seq rl -> first_seq rl | Alt (r1, r2) -> Charset.union (first r1) (first r2) | Star r -> Charset.full @@ -197,12 +197,13 @@ and first_seq = function (* Transform a Char or CharClass regexp into a character class *) let charclass_of_regexp fold_case re = - let cl = + let (cl1, compl) = match re with - Char c -> Charset.singleton c - | CharClass cl -> cl + | Char c -> (Charset.singleton c, false) + | CharClass(cl, compl) -> (cl, compl) | _ -> assert false in - if fold_case then Charset.fold_case cl else cl + let cl2 = if fold_case then Charset.fold_case cl1 else cl1 in + if compl then Charset.complement cl2 else cl2 (* The case fold table: maps characters to their lowercase equivalent *) @@ -289,9 +290,10 @@ let compile fold_case re = else emit_instr op_STRING (cpool_index s) end - | CharClass cl -> - let cl' = if fold_case then Charset.fold_case cl else cl in - emit_instr op_CHARCLASS (cpool_index cl') + | CharClass(cl, compl) -> + let cl1 = if fold_case then Charset.fold_case cl else cl in + let cl2 = if compl then Charset.complement cl1 else cl1 in + emit_instr op_CHARCLASS (cpool_index cl2) | Seq rl -> emit_seq_code rl | Alt(r1, r2) -> @@ -492,10 +494,11 @@ let parse s = and regexp3 i = match s.[i] with '\\' -> regexpbackslash (i+1) - | '[' -> let (c, j) = regexpclass0 (i+1) in (CharClass c, j) + | '[' -> let (c, compl, j) = regexpclass0 (i+1) in + (CharClass(c, compl), j) | '^' -> (Bol, i+1) | '$' -> (Eol, i+1) - | '.' -> (CharClass dotclass, i+1) + | '.' -> (CharClass(dotclass, false), i+1) | c -> (Char c, i+1) and regexpbackslash i = if i >= len then (Char '\\', i) else @@ -520,8 +523,8 @@ let parse s = (Char c, i + 1) and regexpclass0 i = if i < len && s.[i] = '^' - then let (c, j) = regexpclass1 (i+1) in (Charset.complement c, j) - else regexpclass1 i + then let (c, j) = regexpclass1 (i+1) in (c, true, j) + else let (c, j) = regexpclass1 i in (c, false, j) and regexpclass1 i = let c = Charset.make_empty() in let j = regexpclass2 c i i in diff --git a/otherlibs/systhreads/posix.c b/otherlibs/systhreads/posix.c index 4a94dc67..89a0b524 100644 --- a/otherlibs/systhreads/posix.c +++ b/otherlibs/systhreads/posix.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: posix.c,v 1.58 2008/09/27 10:46:55 xleroy Exp $ */ +/* $Id: posix.c,v 1.58.2.2 2009/03/28 17:35:59 xleroy Exp $ */ /* Thread interface for POSIX 1003.1c threads */ @@ -111,6 +111,9 @@ 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; @@ -332,8 +335,6 @@ static void * caml_thread_tick(void * arg) static void caml_thread_reinitialize(void) { caml_thread_t thr, next; - pthread_t tick_pthread; - pthread_attr_t attr; struct channel * chan; /* Remove all other threads (now nonexistent) @@ -353,24 +354,21 @@ static void caml_thread_reinitialize(void) 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); } - /* Fork a new tick thread */ - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - pthread_create(&tick_pthread, &attr, caml_thread_tick, NULL); } /* Initialize the thread machinery */ value caml_thread_initialize(value unit) /* ML */ { - pthread_t tick_pthread; - pthread_attr_t attr; value mu = Val_unit; value descr; @@ -395,6 +393,7 @@ value caml_thread_initialize(value unit) /* ML */ 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 @@ -415,12 +414,6 @@ value caml_thread_initialize(value unit) /* ML */ 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 */ - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - caml_pthread_check( - pthread_create(&tick_pthread, &attr, caml_thread_tick, NULL), - "Thread.init"); /* Set up fork() to reinitialize the thread machinery in the child (PR#4577) */ pthread_atfork(NULL, NULL, caml_thread_reinitialize); @@ -488,6 +481,7 @@ 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; @@ -526,12 +520,12 @@ value caml_thread_new(value clos) /* ML */ th->prev = curr_thread; curr_thread->next->prev = th; curr_thread->next = th; - /* Fork the new thread */ + /* 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) { - /* Fork failed, remove thread info block from list of threads */ + /* Creation failed, remove thread info block from list of threads */ th->next->prev = curr_thread; curr_thread->next = th->next; #ifndef NATIVE_CODE @@ -541,6 +535,16 @@ value caml_thread_new(value clos) /* ML */ 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; } diff --git a/otherlibs/unix/unix.mli b/otherlibs/unix/unix.mli index 851c4f85..26d08a22 100644 --- a/otherlibs/unix/unix.mli +++ b/otherlibs/unix/unix.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: unix.mli,v 1.89 2008/09/04 13:53:43 doligez Exp $ *) +(* $Id: unix.mli,v 1.89.2.1 2009/03/28 16:58:56 xleroy Exp $ *) (** Interface to the Unix system *) @@ -900,7 +900,8 @@ type socket_domain = PF_UNIX (** Unix domain *) | PF_INET (** Internet domain (IPv4) *) | PF_INET6 (** Internet domain (IPv6) *) -(** The type of socket domains. *) +(** The type of socket domains. Not all platforms support + IPv6 sockets (type [PF_INET6]). *) type socket_type = SOCK_STREAM (** Stream socket *) diff --git a/otherlibs/win32unix/pipe.c b/otherlibs/win32unix/pipe.c index 5fe65256..9a7ced3c 100644 --- a/otherlibs/win32unix/pipe.c +++ b/otherlibs/win32unix/pipe.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: pipe.c,v 1.7 2001/12/07 13:40:45 xleroy Exp $ */ +/* $Id: pipe.c,v 1.7.28.1 2009/03/28 15:30:08 xleroy Exp $ */ #include #include @@ -19,7 +19,8 @@ #include "unixsupport.h" #include -#define SIZEBUF 1024 +/* PR#4749: pick a size that matches that of I/O buffers */ +#define SIZEBUF 4096 CAMLprim value unix_pipe(value unit) { diff --git a/otherlibs/win32unix/stat.c b/otherlibs/win32unix/stat.c index d9a6e461..d5f9b52f 100644 --- a/otherlibs/win32unix/stat.c +++ b/otherlibs/win32unix/stat.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: stat.c,v 1.3 2006/09/21 13:57:34 xleroy Exp $ */ +/* $Id: stat.c,v 1.3.14.1 2009/03/28 16:39:50 xleroy Exp $ */ #include #include @@ -107,9 +107,5 @@ CAMLprim value unix_fstat_64(value handle) ret = _fstati64(win_CRT_fd_of_filedescr(handle), &buf); if (ret == -1) uerror("fstat", Nothing); - if (buf.st_size > Max_long) { - win32_maperr(ERROR_ARITHMETIC_OVERFLOW); - uerror("fstat", Nothing); - } return stat_aux(1, &buf); } diff --git a/otherlibs/win32unix/unixsupport.c b/otherlibs/win32unix/unixsupport.c index ae2d527d..792b424f 100644 --- a/otherlibs/win32unix/unixsupport.c +++ b/otherlibs/win32unix/unixsupport.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: unixsupport.c,v 1.21 2007/02/07 14:45:46 doligez Exp $ */ +/* $Id: unixsupport.c,v 1.21.12.1 2009/05/19 12:32:36 xleroy Exp $ */ #include #include @@ -108,6 +108,7 @@ static struct error_entry win_error_table[] = { { ERROR_NO_PROC_SLOTS, 0, EAGAIN}, { ERROR_DRIVE_LOCKED, 0, EACCES}, { ERROR_BROKEN_PIPE, 0, EPIPE}, + { ERROR_NO_DATA, 0, EPIPE}, { ERROR_DISK_FULL, 0, ENOSPC}, { ERROR_INVALID_TARGET_HANDLE, 0, EBADF}, { ERROR_INVALID_HANDLE, 0, EINVAL}, diff --git a/stdlib/format.ml b/stdlib/format.ml index 6f4128c5..1a41375e 100644 --- a/stdlib/format.ml +++ b/stdlib/format.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: format.ml,v 1.74 2008/09/08 12:30:19 weis Exp $ *) +(* $Id: format.ml,v 1.74.2.1 2009/04/29 18:33:31 weis Exp $ *) (* A pretty-printing facility and definition of formatters for ``parallel'' (i.e. unrelated or independent) pretty-printing on multiple out channels. *) @@ -1040,9 +1040,9 @@ let get_buffer_out b = s ;; -(* [ppf] is supposed to be a pretty-printer that outputs in buffer [b]: - to extract contents of [ppf] as a string we flush [ppf] and get the string - out of [b]. *) +(* [ppf] is supposed to be a pretty-printer that outputs to buffer [b]: + to extract the contents of [ppf] as a string we flush [ppf] and get the + string out of [b]. *) let string_out b ppf = pp_flush_queue ppf false; get_buffer_out b @@ -1311,7 +1311,10 @@ let kbprintf k b = mkprintf false (fun _ -> formatter_of_buffer b) k ;; -let bprintf b = kbprintf ignore b;; +let bprintf b = + let k ppf = pp_flush_queue ppf false in + kbprintf k b +;; let ksprintf k = let b = Buffer.create 512 in diff --git a/stdlib/map.mli b/stdlib/map.mli index fe0893cd..877b0f9e 100644 --- a/stdlib/map.mli +++ b/stdlib/map.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: map.mli,v 1.33 2005/10/25 18:34:07 doligez Exp $ *) +(* $Id: map.mli,v 1.33.18.1 2009/03/21 16:35:48 xleroy Exp $ *) (** Association tables over ordered types. @@ -73,9 +73,7 @@ module type S = (** [iter f m] applies [f] to all bindings in map [m]. [f] receives the key as first argument, and the associated value as second argument. The bindings are passed to [f] in increasing - order with respect to the ordering over the type of the keys. - Only current bindings are presented to [f]: - bindings hidden by more recent bindings are not passed to [f]. *) + order with respect to the ordering over the type of the keys. *) val map: ('a -> 'b) -> 'a t -> 'b t (** [map f m] returns a map with same domain as [m], where the diff --git a/stdlib/parsing.ml b/stdlib/parsing.ml index 1f048c76..476a04da 100644 --- a/stdlib/parsing.ml +++ b/stdlib/parsing.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: parsing.ml,v 1.19 2008/08/06 09:38:21 xleroy Exp $ *) +(* $Id: parsing.ml,v 1.19.2.1 2009/01/13 15:17:51 doligez Exp $ *) (* The parsing engine *) @@ -180,9 +180,15 @@ let peek_val env n = Obj.magic env.v_stack.(env.asp - n) let symbol_start_pos () = - if env.rule_len > 0 - then env.symb_start_stack.(env.asp - env.rule_len + 1) - else env.symb_end_stack.(env.asp) + let rec loop i = + if i <= 0 then env.symb_end_stack.(env.asp) + else begin + let st = env.symb_start_stack.(env.asp - i + 1) in + let en = env.symb_end_stack.(env.asp - i + 1) in + if st <> en then st else loop (i - 1) + end + in + loop env.rule_len ;; let symbol_end_pos () = env.symb_end_stack.(env.asp);; let rhs_start_pos n = env.symb_start_stack.(env.asp - (env.rule_len - n));; diff --git a/stdlib/pervasives.mli b/stdlib/pervasives.mli index e2699a75..935db8de 100644 --- a/stdlib/pervasives.mli +++ b/stdlib/pervasives.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: pervasives.mli,v 1.113 2008/10/06 13:33:21 doligez Exp $ *) +(* $Id: pervasives.mli,v 1.113.2.2 2009/04/30 09:05:57 weis Exp $ *) (** The initially opened module. @@ -24,6 +24,7 @@ name, without prefixing them by [Pervasives]. *) + (** {6 Exceptions} *) external raise : exn -> 'a = "%raise" @@ -42,7 +43,6 @@ exception Exit (** {6 Comparisons} *) - external ( = ) : 'a -> 'a -> bool = "%equal" (** [e1 = e2] tests for structural equality of [e1] and [e2]. Mutable structures (e.g. references and arrays) are equal @@ -100,8 +100,7 @@ val max : 'a -> 'a -> 'a external ( == ) : 'a -> 'a -> bool = "%eq" (** [e1 == e2] tests for physical equality of [e1] and [e2]. - On integers and characters, physical equality is identical to structural - equality. On mutable structures, [e1 == e2] is true if and only if + On mutable structures, [e1 == e2] is true if and only if physical modification of [e1] also affects [e2]. On non-mutable structures, the behavior of [(==)] is implementation-dependent; however, it is guaranteed that @@ -113,7 +112,6 @@ external ( != ) : 'a -> 'a -> bool = "%noteq" (** {6 Boolean operations} *) - external not : bool -> bool = "%boolnot" (** The boolean negation. *) @@ -186,10 +184,8 @@ val min_int : int (** The smallest representable integer. *) - (** {7 Bitwise operations} *) - external ( land ) : int -> int -> int = "%andint" (** Bitwise logical and. *) @@ -250,10 +246,10 @@ external ( /. ) : float -> float -> float = "%divfloat" (** Floating-point division. *) external ( ** ) : float -> float -> float = "caml_power_float" "pow" "float" -(** Exponentiation *) +(** Exponentiation. *) external sqrt : float -> float = "caml_sqrt_float" "sqrt" "float" -(** Square root *) +(** Square root. *) external exp : float -> float = "caml_exp_float" "exp" "float" (** Exponential. *) @@ -265,47 +261,57 @@ external log10 : float -> float = "caml_log10_float" "log10" "float" (** Base 10 logarithm. *) external cos : float -> float = "caml_cos_float" "cos" "float" -(** See {!Pervasives.atan2}. *) +(** [cos a] returns the cosine of angle [a] measured in radians. *) external sin : float -> float = "caml_sin_float" "sin" "float" -(** See {!Pervasives.atan2}. *) +(** [sin a] returns the sine of angle [a] measured in radians. *) external tan : float -> float = "caml_tan_float" "tan" "float" -(** See {!Pervasives.atan2}. *) +(** [tan a] returns the tangent of angle [a] measured in radians. *) external acos : float -> float = "caml_acos_float" "acos" "float" -(** See {!Pervasives.atan2}. *) +(** [acos f] returns the arc cosine of [f]. The return angle is measured + in radians. *) external asin : float -> float = "caml_asin_float" "asin" "float" -(** See {!Pervasives.atan2}. *) +(** [asin f] returns the arc sine of [f]. The return angle is measured + in radians. *) external atan : float -> float = "caml_atan_float" "atan" "float" -(** See {!Pervasives.atan2}. *) +(** [atan f] returns the arc tangent of [f]. The return angle is measured + in radians. *) external atan2 : float -> float -> float = "caml_atan2_float" "atan2" "float" -(** The usual trigonometric functions. *) +(** [atan2 y x] returns the principal value of the arc tangent of + [y / x], using the signs of both arguments to determine the quadrant of the + result. The return angle is measured in radians. *) external cosh : float -> float = "caml_cosh_float" "cosh" "float" -(** See {!Pervasives.tanh}. *) +(** [cosh a] returns the hyperbolic cosine of angle [a] measured + in radians. *) external sinh : float -> float = "caml_sinh_float" "sinh" "float" -(** See {!Pervasives.tanh}. *) +(** [sinh a] returns the hyperbolic sine of angle [a] measured + in radians. *) external tanh : float -> float = "caml_tanh_float" "tanh" "float" -(** The usual hyperbolic trigonometric functions. *) +(** [tanh f] returns the hyperbolic tangent of angle [a] measured + in radians. *) external ceil : float -> float = "caml_ceil_float" "ceil" "float" -(** See {!Pervasives.floor}. *) +(** Round the given float to an integer value. + [ceil f] returns the least integer value greater than or + equal to [f]. + See also {!Pervasives.floor}. *) external floor : float -> float = "caml_floor_float" "floor" "float" (** Round the given float to an integer value. [floor f] returns the greatest integer value less than or equal to [f]. - [ceil f] returns the least integer value greater than or - equal to [f]. *) + See also {!Pervasives.ceil}. *) external abs_float : float -> float = "%absfloat" -(** Return the absolute value of the argument. *) +(** [abs_float f] returns the absolute value of [f]. *) external mod_float : float -> float -> float = "caml_fmod_float" "fmod" "float" (** [mod_float a b] returns the remainder of [a] with respect to @@ -442,7 +448,6 @@ external float_of_string : string -> float = "caml_float_of_string" if the given string is not a valid representation of a float. *) - (** {6 Pair operations} *) external fst : 'a * 'b -> 'a = "%field0" @@ -544,8 +549,8 @@ val read_float : unit -> float The result is unspecified if the line read is not a valid representation of a floating-point number. *) -(** {7 General output functions} *) +(** {7 General output functions} *) type open_flag = Open_rdonly (** open for reading. *) @@ -771,6 +776,7 @@ val set_binary_mode_in : in_channel -> bool -> unit This function has no effect under operating systems that do not distinguish between text mode and binary mode. *) + (** {7 Operations on large files} *) module LargeFile : @@ -789,6 +795,7 @@ module LargeFile : regular integers (type [int]), these alternate functions allow operating on files whose sizes are greater than [max_int]. *) + (** {6 References} *) type 'a ref = { mutable contents : 'a } @@ -853,7 +860,6 @@ val ( ^^ ) : (** {6 Program termination} *) - val exit : int -> 'a (** Terminate the process, returning the given status code to the operating system: usually 0 to indicate no errors, diff --git a/stdlib/printf.ml b/stdlib/printf.ml index b6e4c2dd..920afdb4 100644 --- a/stdlib/printf.ml +++ b/stdlib/printf.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: printf.ml,v 1.58 2008/09/27 20:50:01 weis Exp $ *) +(* $Id: printf.ml,v 1.58.2.2 2009/04/29 19:02:05 weis Exp $ *) external format_float: string -> float -> string = "caml_format_float" @@ -142,7 +142,8 @@ let extract_format fmt start stop widths = | ('*', []) -> assert false (* should not happen *) | (c, _) -> - Buffer.add_char b c; fill_format (succ i) widths in + Buffer.add_char b c; + fill_format (succ i) widths in fill_format start (List.rev widths); Buffer.contents b ;; @@ -156,6 +157,15 @@ let extract_format_int conv fmt start stop widths = | _ -> sfmt ;; +let extract_format_float conv fmt start stop widths = + let sfmt = extract_format fmt start stop widths in + match conv with + | 'F' -> + sfmt.[String.length sfmt - 1] <- 'f'; + sfmt + | _ -> sfmt +;; + (* Returns the position of the next character following the meta format string, starting from position [i], inside a given format [fmt]. According to the character [conv], the meta format string is @@ -297,7 +307,7 @@ let ac_of_format fmt = let count_arguments_of_format fmt = let ac = ac_of_format fmt in - ac.ac_rglr + ac.ac_skip + ac.ac_rdrs + ac.ac_rglr ;; let list_iter_i f l = @@ -417,6 +427,31 @@ let get_index spec n = | Spec_index p -> p ;; +(* Format a float argument as a valid Caml lexem. *) +let format_float_lexem = + let valid_float_lexem sfmt s = + let l = String.length s in + if l = 0 then "nan" else + let add_dot sfmt s = + if s.[0] = ' ' || s.[0] = '+' || s.[0] = '0' + then String.sub s 1 (l - 1) ^ "." + else String.sub s 0 (l - 1) ^ "." in + + let rec loop i = + if i >= l then add_dot sfmt s else + match s.[i] with + | '.' -> s + | _ -> loop (i + 1) in + + loop 0 in + + (fun sfmt x -> + let s = format_float sfmt x in + match classify_float x with + | FP_normal | FP_subnormal | FP_zero -> valid_float_lexem sfmt s + | FP_nan | FP_infinite -> s) +;; + (* Decode a format string and act on it. [fmt] is the [printf] format string, and [pos] points to a [%] character in the format string. @@ -485,9 +520,11 @@ let scan_format fmt args n pos cont_s cont_a cont_t cont_f cont_m = let (x : float) = get_arg spec n in let s = format_float (extract_format fmt pos i widths) x in cont_s (next_index spec n) s (succ i) - | 'F' -> + | 'F' as conv -> let (x : float) = get_arg spec n in - cont_s (next_index spec n) (string_of_float x) (succ i) + let s = + format_float_lexem (extract_format_float conv fmt pos i widths) x in + cont_s (next_index spec n) s (succ i) | 'B' | 'b' -> let (x : bool) = get_arg spec n in cont_s (next_index spec n) (string_of_bool x) (succ i) diff --git a/stdlib/scanf.ml b/stdlib/scanf.ml index 0d6b637a..7ec4f83d 100644 --- a/stdlib/scanf.ml +++ b/stdlib/scanf.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: scanf.ml,v 1.80 2008/09/27 20:45:05 weis Exp $ *) +(* $Id: scanf.ml,v 1.80.2.2 2009/04/29 18:27:37 weis Exp $ *) (* The run-time library for scanners. *) @@ -782,8 +782,7 @@ let scan_String max ib = | '\n', true | ' ', false -> skip_spaces false (Scanning.ignore_char ib max) - | '\\', false -> loop false max - | c, false -> loop false (Scanning.store_char ib c max) + | c, false -> loop false max | _, _ -> loop false (scan_backslash_char (max - 1) ib) in loop true max ;; @@ -1272,22 +1271,29 @@ let scanf fmt = bscanf Scanning.stdib fmt;; let bscanf_format ib fmt f = let fmt = Sformat.unsafe_to_string fmt in - let fmt1 = ignore (scan_String max_int ib); token_string ib in + let fmt1 = + ignore (scan_String max_int ib); + token_string ib in if not (compatible_format_type fmt1 fmt) then format_mismatch fmt1 fmt else f (string_to_format fmt1) ;; -let sscanf_format s fmt f = bscanf_format (Scanning.from_string s) fmt f;; +let sscanf_format s fmt = bscanf_format (Scanning.from_string s) fmt;; -let quote_string s = - let b = Buffer.create (String.length s + 2) in +let string_to_String s = + let l = String.length s in + let b = Buffer.create (l + 2) in Buffer.add_char b '\"'; - Buffer.add_string b s; + for i = 0 to l - 1 do + let c = s.[i] in + if c = '\"' then Buffer.add_char b '\\'; + Buffer.add_char b c; + done; Buffer.add_char b '\"'; Buffer.contents b ;; let format_from_string s fmt = - sscanf_format (quote_string s) fmt (fun x -> x) + sscanf_format (string_to_String s) fmt (fun x -> x) ;; diff --git a/typing/ctype.ml b/typing/ctype.ml index eb6ec2c8..d84f765c 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: ctype.ml,v 1.216.2.1 2008/10/08 13:07:13 doligez Exp $ *) +(* $Id: ctype.ml,v 1.216.2.5 2009/05/19 05:51:03 garrigue Exp $ *) (* Operations on core types *) @@ -385,23 +385,32 @@ let closed_schema ty = exception Non_closed of type_expr * bool let free_variables = ref [] +let really_closed = ref None let rec free_vars_rec real ty = let ty = repr ty in if ty.level >= lowest_level then begin ty.level <- pivot_level - ty.level; - begin match ty.desc with - Tvar -> + begin match ty.desc, !really_closed with + Tvar, _ -> free_variables := (ty, real) :: !free_variables + | Tconstr (path, tl, _), Some env -> + begin try + let (_, body) = Env.find_type_expansion path env in + if (repr body).level <> generic_level then + free_variables := (ty, real) :: !free_variables + with Not_found -> () + end; + List.iter (free_vars_rec true) tl (* Do not count "virtual" free variables | Tobject(ty, {contents = Some (_, p)}) -> free_vars_rec false ty; List.iter (free_vars_rec true) p *) - | Tobject (ty, _) -> + | Tobject (ty, _), _ -> free_vars_rec false ty - | Tfield (_, _, ty1, ty2) -> + | Tfield (_, _, ty1, ty2), _ -> free_vars_rec true ty1; free_vars_rec false ty2 - | Tvariant row -> + | Tvariant row, _ -> let row = row_repr row in iter_row (free_vars_rec true) row; if not (static_row row) then free_vars_rec false row.row_more @@ -410,15 +419,17 @@ let rec free_vars_rec real ty = end; end -let free_vars ty = +let free_vars ?env ty = free_variables := []; + really_closed := env; free_vars_rec true ty; let res = !free_variables in free_variables := []; + really_closed := None; res -let free_variables ty = - let tl = List.map fst (free_vars ty) in +let free_variables ?env ty = + let tl = List.map fst (free_vars ?env ty) in unmark_type ty; tl @@ -2030,7 +2041,7 @@ let rec moregen inst_nongen type_pairs env t1 t2 = with Not_found -> TypePairs.add type_pairs (t1', t2') (); match (t1'.desc, t2'.desc) with - (Tvar, _) when may_instantiate inst_nongen t1 -> + (Tvar, _) when may_instantiate inst_nongen t1' -> moregen_occur env t1'.level t2; link_type t1' t2 | (Tarrow (l1, t1, u1, _), Tarrow (l2, t2, u2, _)) when l1 = l2 @@ -3172,10 +3183,11 @@ let cyclic_abbrev env id ty = in check_cycle [] ty (* Normalize a type before printing, saving... *) -let rec normalize_type_rec env ty = +(* Cannot use mark_type because deep_occur uses it too *) +let rec normalize_type_rec env visited ty = let ty = repr ty in - if ty.level >= lowest_level then begin - mark_type_node ty; + if not (TypeSet.mem ty !visited) then begin + visited := TypeSet.add ty !visited; begin match ty.desc with | Tvariant row -> let row = row_repr row in @@ -3204,11 +3216,15 @@ let rec normalize_type_rec env ty = begin match !nm with | None -> () | Some (n, v :: l) -> - let v' = repr v in + if deep_occur ty (newgenty (Ttuple l)) then + (* The abbreviation may be hiding something, so remove it *) + set_name nm None + else let v' = repr v in begin match v'.desc with | Tvar|Tunivar -> if v' != v then set_name nm (Some (n, v' :: l)) - | Tnil -> log_type ty; ty.desc <- Tconstr (n, l, ref Mnil) + | Tnil -> + log_type ty; ty.desc <- Tconstr (n, l, ref Mnil) | _ -> set_name nm None end | _ -> @@ -3221,12 +3237,11 @@ let rec normalize_type_rec env ty = log_type ty; fi.desc <- fi'.desc | _ -> () end; - iter_type_expr (normalize_type_rec env) ty + iter_type_expr (normalize_type_rec env visited) ty end let normalize_type env ty = - normalize_type_rec env ty; - unmark_type ty + normalize_type_rec env (ref TypeSet.empty) ty (*************************) @@ -3267,8 +3282,8 @@ let rec nondep_type_rec env id ty = (recursive type), so one cannot just take its description. *) - with Cannot_expand -> - raise Not_found + with Cannot_expand | Unify _ -> (* expand_abbrev failed *) + raise Not_found (* cf. PR4775 for Unify *) end else Tconstr(p, List.map (nondep_type_rec env id) tl, ref Mnil) diff --git a/typing/ctype.mli b/typing/ctype.mli index d8c3d60f..9444d820 100644 --- a/typing/ctype.mli +++ b/typing/ctype.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: ctype.mli,v 1.55.4.1 2008/10/16 03:05:26 garrigue Exp $ *) +(* $Id: ctype.mli,v 1.55.4.2 2009/02/13 05:05:36 garrigue Exp $ *) (* Operations on core types *) @@ -224,7 +224,8 @@ val closed_schema: type_expr -> bool (* Check whether the given type scheme contains no non-generic type variables *) -val free_variables: type_expr -> type_expr list +val free_variables: ?env:Env.t -> type_expr -> type_expr list + (* If env present, then check for incomplete definitions too *) val closed_type_decl: type_declaration -> type_expr option type closed_class_failure = CC_Method of type_expr * bool * string * type_expr diff --git a/typing/env.ml b/typing/env.ml index 508ea1e4..06c0ec69 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: env.ml,v 1.66 2008/10/06 13:53:54 doligez Exp $ *) +(* $Id: env.ml,v 1.66.2.1 2009/04/28 05:11:54 garrigue Exp $ *) (* Environment handling *) @@ -92,19 +92,29 @@ let empty = { cltypes = Ident.empty; summary = Env_empty } -let diff_keys tbl1 tbl2 = +let diff_keys is_local tbl1 tbl2 = let keys2 = Ident.keys tbl2 in List.filter (fun id -> - match Ident.find_same id tbl2 with Pident _, _ -> - (try ignore (Ident.find_same id tbl1); false with Not_found -> true) - | _ -> false) + is_local (Ident.find_same id tbl2) && + try ignore (Ident.find_same id tbl1); false with Not_found -> true) keys2 +let is_ident = function + Pident _ -> true + | Pdot _ | Papply _ -> false + +let is_local (p, _) = is_ident p + +let is_local_exn = function + {cstr_tag = Cstr_exception p} -> is_ident p + | _ -> false + let diff env1 env2 = - diff_keys env1.values env2.values @ - diff_keys env1.modules env2.modules @ - diff_keys env1.classes env2.classes + diff_keys is_local env1.values env2.values @ + diff_keys is_local_exn env1.constrs env2.constrs @ + diff_keys is_local env1.modules env2.modules @ + diff_keys is_local env1.classes env2.classes (* Forward declarations *) diff --git a/typing/includeclass.ml b/typing/includeclass.ml index 452e7276..2f06f122 100644 --- a/typing/includeclass.ml +++ b/typing/includeclass.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: includeclass.ml,v 1.8 2006/04/05 02:28:13 garrigue Exp $ *) +(* $Id: includeclass.ml,v 1.8.16.1 2009/04/19 08:42:43 xleroy Exp $ *) (* Inclusion checks for the class language *) @@ -47,7 +47,7 @@ let include_err ppf = fprintf ppf "@[%a@]" (Printtyp.unification_error false trace (function ppf -> - fprintf ppf "One type parameter has type")) + fprintf ppf "A type parameter has type")) (function ppf -> fprintf ppf "but is expected to have type") | CM_Class_type_mismatch (cty1, cty2) -> @@ -58,7 +58,7 @@ let include_err ppf = fprintf ppf "@[%a@]" (Printtyp.unification_error false trace (function ppf -> - fprintf ppf "One parameter has type")) + fprintf ppf "A parameter has type")) (function ppf -> fprintf ppf "but is expected to have type") | CM_Val_type_mismatch (lab, trace) -> @@ -92,7 +92,7 @@ let include_err ppf = | CM_Public_method lab -> fprintf ppf "@[The public method %s cannot become private" lab | CM_Virtual_method lab -> - fprintf ppf "@[The virtual method %s cannot become concrete" lab + fprintf ppf "@[The virtual method %s cannot become concrete" lab | CM_Private_method lab -> fprintf ppf "The private method %s cannot become public" lab diff --git a/typing/parmatch.ml b/typing/parmatch.ml index 7ea21eb2..48e9821b 100644 --- a/typing/parmatch.ml +++ b/typing/parmatch.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: parmatch.ml,v 1.76 2008/07/15 18:11:46 mauny Exp $ *) +(* $Id: parmatch.ml,v 1.76.2.2 2009/03/16 04:24:05 garrigue Exp $ *) (* Detection of partial matches and unused match cases. *) @@ -113,13 +113,18 @@ and compats ps qs = match ps,qs with exception Empty (* Empty pattern *) +(* May need a clean copy, cf. PR#4745 *) +let clean_copy ty = + if ty.level = Btype.generic_level then ty + else Subst.type_expr Subst.identity ty + let get_type_path ty tenv = - let ty = Ctype.repr (Ctype.expand_head tenv ty) in + let ty = Ctype.repr (Ctype.expand_head tenv (clean_copy ty)) in match ty.desc with | Tconstr (path,_,_) -> path | _ -> fatal_error "Parmatch.get_type_path" -let get_type_descr ty tenv = +let rec get_type_descr ty tenv = match (Ctype.repr ty).desc with | Tconstr (path,_,_) -> Env.find_type path tenv | _ -> fatal_error "Parmatch.get_type_descr" @@ -129,7 +134,7 @@ let rec get_constr tag ty tenv = | {type_kind=Type_variant constr_list} -> Datarepr.find_constr_by_tag tag constr_list | {type_manifest = Some _} -> - get_constr tag (Ctype.expand_head_once tenv ty) tenv + get_constr tag (Ctype.expand_head_once tenv (clean_copy ty)) tenv | _ -> fatal_error "Parmatch.get_constr" let find_label lbl lbls = @@ -142,7 +147,7 @@ let rec get_record_labels ty tenv = match get_type_descr ty tenv with | {type_kind = Type_record(lbls, rep)} -> lbls | {type_manifest = Some _} -> - get_record_labels (Ctype.expand_head_once tenv ty) tenv + get_record_labels (Ctype.expand_head_once tenv (clean_copy ty)) tenv | _ -> fatal_error "Parmatch.get_record_labels" diff --git a/typing/subst.ml b/typing/subst.ml index 6df3fb02..dc3fb212 100644 --- a/typing/subst.ml +++ b/typing/subst.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: subst.ml,v 1.52 2008/01/11 16:13:16 doligez Exp $ *) +(* $Id: subst.ml,v 1.52.4.1 2009/04/02 09:06:32 xclerc Exp $ *) (* Substitutions *) @@ -294,3 +294,12 @@ and signature_component s comp newid = and modtype_declaration s = function Tmodtype_abstract -> Tmodtype_abstract | Tmodtype_manifest mty -> Tmodtype_manifest(modtype s mty) + +(* 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; + for_saving = false } diff --git a/typing/subst.mli b/typing/subst.mli index 4bf6c212..bf9f0652 100644 --- a/typing/subst.mli +++ b/typing/subst.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: subst.mli,v 1.13 2008/01/11 16:13:16 doligez Exp $ *) +(* $Id: subst.mli,v 1.13.4.1 2009/04/02 09:06:33 xclerc Exp $ *) (* Substitutions *) @@ -52,3 +52,7 @@ val cltype_declaration: t -> cltype_declaration -> cltype_declaration val modtype: t -> module_type -> module_type val signature: t -> signature -> signature val modtype_declaration: t -> modtype_declaration -> modtype_declaration + +(* Composition of substitutions: + apply (compose s1 s2) x = apply s2 (apply s1 x) *) +val compose: t -> t -> t diff --git a/typing/typeclass.ml b/typing/typeclass.ml index e26f777c..b18a0aa0 100644 --- a/typing/typeclass.ml +++ b/typing/typeclass.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: typeclass.ml,v 1.93 2008/02/29 14:21:22 doligez Exp $ *) +(* $Id: typeclass.ml,v 1.93.4.1 2009/04/19 08:42:43 xleroy Exp $ *) open Misc open Parsetree @@ -1574,12 +1574,12 @@ let report_error ppf = function fprintf ppf "@[The type of self cannot be coerced to@ \ the type of the current class:@ %a.@.\ - Some occurences are contravariant@]" + Some occurrences are contravariant@]" Printtyp.type_scheme ty | Non_collapsable_conjunction (id, clty, trace) -> fprintf ppf "@[The type of this class,@ %a,@ \ - contains non-collapsable conjunctive types in constraints@]" + contains non-collapsible conjunctive types in constraints@]" (Printtyp.class_declaration id) clty; Printtyp.report_unification_error ppf trace (fun ppf -> fprintf ppf "Type") @@ -1589,11 +1589,11 @@ let report_error ppf = function (function ppf -> fprintf ppf "This object is expected to have type") (function ppf -> - fprintf ppf "but has actually type") + fprintf ppf "but actually has type") | Mutability_mismatch (lab, mut) -> let mut1, mut2 = if mut = Immutable then "mutable", "immutable" else "immutable", "mutable" in fprintf ppf - "@[The instance variable is %s,@ it cannot be redefined as %s@]" + "@[The instance variable is %s;@ it cannot be redefined as %s@]" mut1 mut2 diff --git a/typing/typecore.ml b/typing/typecore.ml index ade0e5c6..55e112b9 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: typecore.ml,v 1.199 2008/07/29 15:42:44 doligez Exp $ *) +(* $Id: typecore.ml,v 1.199.2.3 2009/04/19 09:21:08 xleroy Exp $ *) (* Typechecking for the core language *) @@ -1263,10 +1263,11 @@ let rec type_exp env sexp = begin match arg.exp_desc, !self_coercion, (repr ty').desc with Texp_ident(_, {val_kind=Val_self _}), (path,r) :: _, Tconstr(path',_,_) when Path.same path path' -> + (* prerr_endline "self coercion"; *) r := sexp.pexp_loc :: !r; force () - | _ when free_variables arg.exp_type = [] - && free_variables ty' = [] -> + | _ when free_variables ~env arg.exp_type = [] + && free_variables ~env ty' = [] -> if not gen && (* first try a single coercion *) let snap = snapshot () in let ty, b = enlarge_type env ty' in @@ -1282,6 +1283,7 @@ let rec type_exp env sexp = Location.prerr_warning sexp.pexp_loc (Warnings.Not_principal "this ground coercion"); with Subtype (tr1, tr2) -> + (* prerr_endline "coercion failed"; *) raise(Error(sexp.pexp_loc, Not_subtype(tr1, tr2))) end; | _ -> @@ -2105,7 +2107,7 @@ let report_error ppf = function | Constructor_arity_mismatch(lid, expected, provided) -> fprintf ppf "@[The constructor %a@ expects %i argument(s),@ \ - but is here applied to %i argument(s)@]" + but is applied here to %i argument(s)@]" longident lid expected provided | Label_mismatch(lid, trace) -> report_unification_error ppf trace @@ -2113,13 +2115,13 @@ let report_error ppf = function fprintf ppf "The record field label %a@ belongs to the type" longident lid) (function ppf -> - fprintf ppf "but is here mixed with labels of type") + fprintf ppf "but is mixed here with labels of type") | Pattern_type_clash trace -> report_unification_error ppf trace (function ppf -> fprintf ppf "This pattern matches values of type") (function ppf -> - fprintf ppf "but is here used to match values of type") + fprintf ppf "but a pattern was expected which matches values of type") | Multiply_bound_variable name -> fprintf ppf "Variable %s is bound several times in this matching" name | Orpat_vars id -> @@ -2130,15 +2132,15 @@ let report_error ppf = function (function ppf -> fprintf ppf "This expression has type") (function ppf -> - fprintf ppf "but is here used with type") + fprintf ppf "but an expression was expected of type") | Apply_non_function typ -> begin match (repr typ).desc with Tarrow _ -> - fprintf ppf "This function is applied to too many arguments,@ "; + fprintf ppf "This function is applied to too many arguments;@ "; fprintf ppf "maybe you forgot a `;'" | _ -> fprintf ppf - "This expression is not a function, it cannot be applied" + "This expression is not a function; it cannot be applied" end | Apply_wrong_label (l, ty) -> let print_label ppf = function @@ -2148,7 +2150,7 @@ let report_error ppf = function in reset_and_mark_loops ty; fprintf ppf - "@[@[<2>Expecting function has type@ %a@]@.\ + "@[@[<2>The function applied to this argument has type@ %a@]@.\ This argument cannot be applied %a@]" type_expr ty print_label l | Label_multiply_defined lid -> @@ -2176,14 +2178,14 @@ let report_error ppf = function | Unbound_class cl -> fprintf ppf "Unbound class %a" longident cl | Virtual_class cl -> - fprintf ppf "One cannot create instances of the virtual class %a" + fprintf ppf "Cannot instantiate the virtual class %a" 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 | Not_subtype(tr1, tr2) -> - report_subtyping_error ppf tr1 "is not a subtype of type" tr2 + report_subtyping_error ppf tr1 "is not a subtype of" tr2 | Outside_class -> fprintf ppf "This object duplication occurs outside a method definition" | Value_multiply_overridden v -> @@ -2214,8 +2216,8 @@ let report_error ppf = function end | Abstract_wrong_label (l, ty) -> let label_mark = function - | "" -> "but its first argument is not labeled" - | l -> sprintf "but its first argument is labeled ~%s" l in + | "" -> "but its first argument is not labelled" + | l -> sprintf "but its first argument is labelled ~%s" l in reset_and_mark_loops ty; fprintf ppf "@[@[<2>This function should have type@ %a@]@,%s@]" type_expr ty (label_mark l) diff --git a/typing/typedecl.ml b/typing/typedecl.ml index 6e5702cf..ee2f9cd2 100644 --- a/typing/typedecl.ml +++ b/typing/typedecl.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: typedecl.ml,v 1.82 2008/08/07 09:29:22 xleroy Exp $ *) +(* $Id: typedecl.ml,v 1.82.2.2 2009/04/19 08:42:43 xleroy Exp $ *) (**** Typing of type definitions ****) @@ -509,14 +509,13 @@ let compute_variance_decl env check decl (required, loc) = compute_variance env tvl true cn cn ty) ftl end; - let priv = decl.type_private - and required = + let required = List.map (fun (c,n as r) -> if c || n then r else (true,true)) required in List.iter2 (fun (ty, co, cn, ct) (c, n) -> - if ty.desc <> Tvar || priv = Private then begin + if ty.desc <> Tvar then begin co := c; cn := n; ct := n; compute_variance env tvl2 c n n ty end) @@ -535,6 +534,7 @@ let compute_variance_decl env check decl (required, loc) = incr pos; if !co && not c || !cn && not n then raise (Error(loc, Bad_variance (!pos, (!co,!cn), (c,n)))); + if decl.type_private = Private then (c,n,n) else let ct = if decl.type_kind = Type_abstract then ct else cn in (!co, !cn, !ct)) tvl0 required @@ -848,12 +848,12 @@ let report_error ppf = function (function ppf -> fprintf ppf "This type constructor expands to type") (function ppf -> - fprintf ppf "but is here used with type") + fprintf ppf "but is used here with type") | Null_arity_external -> fprintf ppf "External identifiers must be functions" | Missing_native_external -> fprintf ppf "@[An external function with more than 5 arguments \ - requires second stub function@ \ + requires a second stub function@ \ for native-code compilation@]" | Unbound_type_var (ty, decl) -> fprintf ppf "A type variable is unbound in this type declaration"; @@ -910,16 +910,24 @@ let report_error ppf = function | (false,true) -> "contravariant" | (false,false) -> "unrestricted" in + let suffix n = + let teen = (n mod 100)/10 = 1 in + match n mod 10 with + | 1 when not teen -> "st" + | 2 when not teen -> "nd" + | 3 when not teen -> "rd" + | _ -> "th" + in if n < 1 then fprintf ppf "%s@ %s@ %s" "In this definition, a type variable" "has a variance that is not reflected" - "by its occurence in type parameters." + "by its occurrence in type parameters." else fprintf ppf "%s@ %s@ %s %d%s %s %s,@ %s %s" "In this definition, expected parameter" "variances are not satisfied." - "The" n (match n with 1 -> "st" | 2 -> "nd" | 3 -> "rd" | _ -> "th") + "The" n (suffix n) "type parameter was expected to be" (variance v2) "but it is" (variance v1) | Unavailable_type_constructor p -> diff --git a/typing/typetexp.ml b/typing/typetexp.ml index fa3f0c89..dc9165f7 100644 --- a/typing/typetexp.ml +++ b/typing/typetexp.ml @@ -556,7 +556,7 @@ let report_error ppf = function Printtyp.type_expr ty | Variant_tags (lab1, lab2) -> fprintf ppf - "Variant tags `%s@ and `%s have same hash value.@ Change one of them." + "Variant tags `%s@ and `%s have the same hash value.@ Change one of them." lab1 lab2 | Invalid_variable_name name -> fprintf ppf "The type variable name %s is not allowed in programs" name diff --git a/utils/config.mlbuild b/utils/config.mlbuild index 6afd4106..ee8e66a0 100644 --- a/utils/config.mlbuild +++ b/utils/config.mlbuild @@ -10,7 +10,17 @@ (* *) (***********************************************************************) -(* $Id: config.mlbuild,v 1.3 2007/11/27 12:22:59 ertai Exp $ *) +(* $Id: config.mlbuild,v 1.3.4.4 2009/05/19 14:41:21 doligez Exp $ *) + +(***********************************************************************) +(** **) +(** WARNING WARNING WARNING **) +(** **) +(** When you change this file, you must make the parallel change **) +(** in config.mlp **) +(** **) +(***********************************************************************) + (* The main OCaml version string has moved to ../VERSION *) let version = Sys.ocaml_version @@ -40,10 +50,8 @@ let standard_runtime = else C.bindir^"/ocamlrun" let ccomp_type = C.ccomptype let bytecomp_c_compiler = sf "%s %s %s" C.bytecc C.bytecccompopts C.sharedcccompopts -let bytecomp_c_linker = if windows then "flexlink" else sf "%s %s" C.bytecc C.bytecclinkopts let bytecomp_c_libraries = C.bytecclibs let native_c_compiler = sf "%s %s" C.nativecc C.nativecccompopts -let native_c_linker = if windows then "flexlink" else sf "%s %s" C.nativecc C.nativecclinkopts let native_c_libraries = C.nativecclibs let native_pack_linker = C.packld let ranlib = C.ranlibcmd @@ -54,8 +62,8 @@ let mkmaindll = C.mkmaindll let exec_magic_number = "Caml1999X008" and cmi_magic_number = "Caml1999I011" -and cmo_magic_number = "Caml1999O006" -and cma_magic_number = "Caml1999A007" +and cmo_magic_number = "Caml1999O007" +and cma_magic_number = "Caml1999A008" and cmx_magic_number = "Caml1999Y011" and cmxa_magic_number = "Caml1999Z010" and ast_impl_magic_number = "Caml1999M012" @@ -102,10 +110,8 @@ let print_config oc = p "standard_runtime" standard_runtime; p "ccomp_type" ccomp_type; p "bytecomp_c_compiler" bytecomp_c_compiler; - p "bytecomp_c_linker" bytecomp_c_linker; p "bytecomp_c_libraries" bytecomp_c_libraries; p "native_c_compiler" native_c_compiler; - p "native_c_linker" native_c_linker; p "native_c_libraries" native_c_libraries; p "native_pack_linker" native_pack_linker; p "ranlib" ranlib; diff --git a/utils/config.mlp b/utils/config.mlp index c6fa0e6e..ce6bc7d5 100644 --- a/utils/config.mlp +++ b/utils/config.mlp @@ -10,7 +10,17 @@ (* *) (***********************************************************************) -(* $Id: config.mlp,v 1.208 2008/04/16 06:50:31 frisch Exp $ *) +(* $Id: config.mlp,v 1.208.2.2 2009/05/18 09:38:16 doligez Exp $ *) + +(***********************************************************************) +(** **) +(** WARNING WARNING WARNING **) +(** **) +(** When you change this file, you must make the parallel change **) +(** in config.mlbuild **) +(** **) +(***********************************************************************) + (* The main OCaml version string has moved to ../VERSION *) let version = Sys.ocaml_version @@ -41,8 +51,8 @@ let mkmaindll = "%%MKMAINDLL%%" let exec_magic_number = "Caml1999X008" and cmi_magic_number = "Caml1999I011" -and cmo_magic_number = "Caml1999O006" -and cma_magic_number = "Caml1999A007" +and cmo_magic_number = "Caml1999O007" +and cma_magic_number = "Caml1999A008" and cmx_magic_number = "Caml1999Y011" and cmxa_magic_number = "Caml1999Z010" and ast_impl_magic_number = "Caml1999M012" diff --git a/utils/tbl.ml b/utils/tbl.ml index 4e32f47b..eaa9f140 100644 --- a/utils/tbl.ml +++ b/utils/tbl.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: tbl.ml,v 1.13 2004/11/25 13:28:27 doligez Exp $ *) +(* $Id: tbl.ml,v 1.13.22.1 2009/04/02 09:06:33 xclerc Exp $ *) type ('a, 'b) t = Empty @@ -95,6 +95,10 @@ let rec iter f = function | Node(l, v, d, r, _) -> iter f l; f v d; iter f r +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) + open Format let print print_key print_data ppf tbl = diff --git a/utils/tbl.mli b/utils/tbl.mli index f17a8856..ee840dd4 100644 --- a/utils/tbl.mli +++ b/utils/tbl.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: tbl.mli,v 1.7 2000/04/21 08:13:22 weis Exp $ *) +(* $Id: tbl.mli,v 1.7.44.1 2009/04/02 09:06:33 xclerc Exp $ *) (* Association tables from any ordered type to any type. We use the generic ordering to compare keys. *) @@ -23,6 +23,7 @@ val find: 'a -> ('a, 'b) t -> 'b val mem: 'a -> ('a, 'b) t -> bool val remove: 'a -> ('a, 'b) t -> ('a, 'b) t val iter: ('a -> 'b -> 'c) -> ('a, 'b) t -> unit +val map: ('a -> 'b -> 'c) -> ('a, 'b) t -> ('a, 'c) t open Format -- 2.30.2