From b96287d44838b8338a0aee56481546bf9374354f Mon Sep 17 00:00:00 2001 From: Stephane Glondu Date: Sat, 21 Jul 2012 14:36:39 +0200 Subject: [PATCH] Imported Upstream version 4.00.0~rc1 --- Changes | 53 +- INSTALL | 3 + Makefile | 6 +- Makefile.nt | 16 +- README.win32 | 52 +- VERSION | 4 +- asmcomp/amd64/emit.mlp | 6 +- asmcomp/debuginfo.ml | 5 +- asmcomp/debuginfo.mli | 2 +- asmcomp/emitaux.ml | 81 +- asmcomp/power/arch.ml | 4 +- asmcomp/printlinear.ml | 4 +- asmrun/amd64.S | 30 +- boot/ocamlc | Bin 1213057 -> 1230292 bytes boot/ocamldep | Bin 327298 -> 326759 bytes boot/ocamllex | Bin 175499 -> 175491 bytes bytecomp/dll.ml | 5 +- bytecomp/dll.mli | 5 +- bytecomp/symtable.ml | 4 +- bytecomp/translcore.ml | 10 +- byterun/Makefile | 2 +- byterun/compact.c | 14 +- byterun/custom.c | 3 +- byterun/dynlink.c | 11 +- byterun/fix_code.c | 22 +- byterun/fix_code.h | 3 +- byterun/freelist.c | 6 +- byterun/gc_ctrl.c | 22 +- byterun/io.c | 7 +- byterun/major_gc.c | 13 +- byterun/startup.c | 14 +- byterun/win32.c | 63 +- camlp4/Camlp4/Printers/OCaml.ml | 23 +- camlp4/Camlp4Filters/Camlp4MetaGenerator.ml | 4 +- camlp4/Camlp4Top/Rprint.ml | 13 +- camlp4/boot/Camlp4.ml | 30 +- camlp4/boot/Camlp4Ast.ml | 10 +- camlp4/boot/camlp4boot.ml | 20 +- config/auto-aux/cfi.S | 9 +- config/auto-aux/tryassemble | 10 + configure | 12 +- debugger/envaux.mli | 3 +- debugger/loadprinter.ml | 11 +- debugger/printval.ml | 4 +- emacs/caml-types.el | 36 +- ocamlbuild/findlib.ml | 18 +- ocamlbuild/ocaml_specific.ml | 8 + ocamldoc/Makefile | 12 +- ocamldoc/Makefile.nt | 4 +- ocamldoc/odoc_name.ml | 8 +- ocamldoc/odoc_name.mli | 5 +- ocamldoc/odoc_sig.ml | 57 +- ocamldoc/odoc_sig.mli | 4 +- otherlibs/bigarray/mmap_unix.c | 6 +- otherlibs/labltk/browser/searchpos.ml | 3 +- otherlibs/labltk/support/cltkFile.c | 6 +- otherlibs/systhreads/Makefile | 4 +- parsing/parser.mly | 43 +- stdlib/scanf.mli | 4 +- stdlib/stream.ml | 93 +- testsuite/Makefile | 2 +- testsuite/makefiles/Makefile.one | 5 +- testsuite/makefiles/Makefile.several | 8 +- testsuite/tests/asmcomp/Makefile | 5 +- testsuite/tests/asmcomp/i386.S | 5 +- testsuite/tests/asmcomp/sparc.S | 4 +- testsuite/tests/lib-scanf-2/Makefile | 3 +- testsuite/tests/lib-stream/Makefile | 4 + .../tests/lib-stream/count_concat_bug.ml | 57 ++ .../lib-stream/count_concat_bug.reference | 2 + testsuite/tests/lib-threads/test1.checker | 2 +- testsuite/tests/lib-threads/test4.checker | 2 +- testsuite/tests/lib-threads/test5.checker | 2 +- testsuite/tests/lib-threads/test6.checker | 2 +- testsuite/tests/lib-threads/testA.checker | 2 +- testsuite/tests/lib-threads/testexit.checker | 2 +- testsuite/tests/regression/pr5233/Makefile | 4 + testsuite/tests/regression/pr5233/pr5233.ml | 50 + .../tests/regression/pr5233/pr5233.reference | 2 + testsuite/tests/typing-gadts/pr5689.ml | 74 ++ .../pr5689.ml.principal.reference | 28 + .../tests/typing-gadts/pr5689.ml.reference | 28 + testsuite/tests/typing-misc/Makefile | 4 + testsuite/tests/typing-misc/constraints.ml | 16 + .../typing-misc/constraints.ml.reference | 29 + testsuite/tests/typing-misc/records.ml | 12 + .../tests/typing-misc/records.ml.reference | 25 + testsuite/tests/typing-typeparam/Makefile | 7 +- testsuite/tests/typing-typeparam/newtype.ml | 13 +- .../typing-typeparam/newtype.ml.reference | 19 + .../tests/typing-typeparam/newtype.reference | 5 - tools/make-version-header.sh | 43 + tools/ocamldep.ml | 52 +- tools/ocamlmklib.mlp | 7 +- tools/typedtreeIter.ml | 12 +- tools/untypeast.ml | 32 +- toplevel/genprintval.ml | 10 +- toplevel/genprintval.mli | 10 +- toplevel/topdirs.ml | 12 +- toplevel/topdirs.mli | 3 +- toplevel/toploop.ml | 4 +- typing/btype.ml | 10 +- typing/btype.mli | 4 +- typing/cmt_format.ml | 866 +++++++++++++++++- typing/cmt_format.mli | 1 + typing/ctype.ml | 70 +- typing/env.ml | 35 +- typing/env.mli | 10 +- typing/parmatch.ml | 6 +- typing/printtyped.ml | 32 +- typing/typeclass.ml | 22 +- typing/typecore.ml | 42 +- typing/typedecl.ml | 36 +- typing/typedtree.ml | 6 +- typing/typedtree.mli | 6 +- 115 files changed, 2081 insertions(+), 603 deletions(-) create mode 100644 testsuite/tests/lib-stream/Makefile create mode 100644 testsuite/tests/lib-stream/count_concat_bug.ml create mode 100644 testsuite/tests/lib-stream/count_concat_bug.reference create mode 100644 testsuite/tests/regression/pr5233/Makefile create mode 100644 testsuite/tests/regression/pr5233/pr5233.ml create mode 100644 testsuite/tests/regression/pr5233/pr5233.reference create mode 100644 testsuite/tests/typing-gadts/pr5689.ml create mode 100644 testsuite/tests/typing-gadts/pr5689.ml.principal.reference create mode 100644 testsuite/tests/typing-gadts/pr5689.ml.reference create mode 100644 testsuite/tests/typing-misc/Makefile create mode 100644 testsuite/tests/typing-misc/constraints.ml create mode 100644 testsuite/tests/typing-misc/constraints.ml.reference create mode 100644 testsuite/tests/typing-misc/records.ml create mode 100644 testsuite/tests/typing-misc/records.ml.reference create mode 100644 testsuite/tests/typing-typeparam/newtype.ml.reference delete mode 100644 testsuite/tests/typing-typeparam/newtype.reference create mode 100755 tools/make-version-header.sh diff --git a/Changes b/Changes index 8f708f96..3f876233 100644 --- a/Changes +++ b/Changes @@ -36,13 +36,14 @@ Native-code compiler: savings of 28%. . Added support for position-independent code, natdynlink, profiling and exception backtraces. -- In -g mode, generation of CFI information and a few filename/line - number debugging annotations, enabling in particular precise stack - backtraces with the gdb debugger. Currently supported for x86 32-bits - and 64-bits only. (PR#5487) +- Generation of CFI information, and filename/line number debugging (with -g) + annotations, enabling in particular precise stack backtraces with + the gdb debugger. Currently supported for x86 32-bits and 64-bits only. + (PR#5487) - New tool: ocamloptp, the equivalent of ocamlcp for the native-code compiler. OCamldoc: +- PR#5645: ocamldoc doesn't handle module/type substitution in signatures - PR#5544: improve HTML output (less formatting in html code) - PR#5522: allow refering to record fields and variant constructors - fix PR#5419 (error message in french) @@ -64,7 +65,7 @@ Standard library: . Fixed behavior of generic hash function w.r.t. -0.0 and NaN (PR#5222) . Added optional "random" parameter to Hashtbl.create to randomize collision patterns and improve security (PR#5572, CVE-2012-0839) - . Added "randomize" function and "R" parameter to OCAMLRUNPARAMS + . Added "randomize" function and "R" parameter to OCAMLRUNPARAM to turn randomization on by default (PR#5572, CVE-2012-0839) . Added new functorial interface "MakeSeeded" to support randomization with user-provided seeded hash functions. @@ -75,7 +76,7 @@ Standard library: - Random: . More random initialization (Random.self_init()), using /dev/urandom when available (e.g. Linux, FreeBSD, MacOS X, Solaris) - . Faster implementation of Random.float + * Faster implementation of Random.float (changes the generated sequences) - Scanf: new function "unescaped" (PR#3888) - Set and Map: more efficient implementation of "filter" and "partition" - String: new function "map" (PR#3888) @@ -104,7 +105,7 @@ Bug Fixes: - PR#3571: in Bigarrays, call msync() before unmapping to commit changes - PR#4292: various documentation problems - PR#4511, PR#4838: local modules remove polymorphism -- PR#4549: Filename.dirname is not handling multiple / on Unix +* PR#4549: Filename.dirname is not handling multiple / on Unix - PR#4688: (Windows) special floating-point values aren't converted to strings correctly - PR#4697: Unix.putenv leaks memory on failure @@ -115,24 +116,31 @@ Bug Fixes: - PR#4892: Array.set could raise "out of bounds" before evaluating 3rd arg - PR#4937: camlp4 incorrectly handles optional arguments if 'option' is redefined -- PR#5024: camlp4r now handles underscores in irrefutable patern matching of - records +- PR#5024: camlp4r now handles underscores in irrefutable pattern matching of + records - PR#5064, PR#5485: try to ensure that 4K words of stack are available before calling into C functions, raising a Stack_overflow exception otherwise. This reduces (but does not eliminate) the risk of segmentation faults due to stack overflow in C code +- PR#5073: wrong location for 'Unbound record field label' error - PR#5084: sub-sub-module building fails for native code compilation - PR#5120: fix the output function of Camlp4.Debug.formatter +- PR#5131: compilation of custom runtime with g++ generates lots of warnings +- PR#5137: caml-types-explore does not work - PR#5159: better documentation of type Lexing.position - PR#5171: Map.join does more comparisons than needed - PR#5176: emacs mode: stack overflow in regexp matcher - PR#5179: port OCaml to mingw-w64 - PR#5211: updated Genlex documentation to state that camlp4 is mandatory for 'parser' keyword and associated notation +- PR#5214: ocamlfind plugin invokes 'cut' utility +- PR#5218: use $(MAKE) instead of "make" in Makefiles - PR#5224: confusing error message in non-regular type definition - PR#5231: camlp4: fix parsing of <:str_item< type t = $x$ >> +- PR#5233: finaliser on weak array gives dangling pointers (crash) - PR#5238, PR#5277: Sys_error when getting error location - PR#5261, PR#5497: Ocaml source-code examples are not "copy-paste-able" +* PR#5279: executable name is not initialized properly in caml_startup_code - PR#5290: added hash functions for channels, nats, mutexes, conditions - PR#5295: OS threads: problem with caml_c_thread_unregister() - PR#5301: camlp4r and exception equal to another one with parameters @@ -141,6 +149,8 @@ Bug Fixes: - PR#5309: Queue.add is not thread/signal safe - PR#5310: Ratio.create_ratio/create_normalized_ratio have misleading names - PR#5311: better message for warning 23 +* PR#5312: command-line arguments @reponsefile auto-expansion feature + removed from the Windows OCaml runtime, to avoid conflicts with "-w @..." - PR#5313: ocamlopt -g misses optimizations - PR#5316: objinfo now shows ccopts/ccobjs/force_link when applicable - PR#5318: segfault on stack overflow when reading marshaled data @@ -200,6 +210,7 @@ Bug Fixes: and -docflags switches - PR#5543: in Bigarray.map_file, try to avoid using lseek() when growing file - PR#5538: combining -i and -annot in ocamlc +- PR#5648: (probably fixed) test failures in tests/lib-threads - PR#5551: repeated calls to find_in_path degrade performance - PR#5552: Mac OS X: unrecognized gcc option "-no-cpp-precomp" - PR#5555: add Hashtbl.reset to resize the bucket table to its initial size @@ -210,6 +221,7 @@ Bug Fixes: - PR#5585: typo: "explicitely" - PR#5587: documentation: "allows to" is not correct English - PR#5593: remove C file when -output-obj fails +- PR#5597: register names for instrtrace primitives in embedded bytecode - PR#5598: add backslash-space support in strings in ocamllex - PR#5603: wrong .file debug info generated by ocamlopt -g - PR#5604: fix permissions of files created by ocamlbuild itself @@ -218,9 +230,24 @@ Bug Fixes: - PR#5616: move ocamlbuild documentation to the reference manual - PR#5619: Uncaught CType.Unify exception in the compiler - PR#5620: invalid printing of type manifest (camlp4 revised syntax) +- PR#5637: invalid printing of anonymous type parameters (camlp4 revised syntax) +- PR#5643: issues with .cfi and .loc directives generated by ocamlopt -g +- PR#5644: Stream.count broken when used with Sapp or Slazy nodes +- PR#5647: Cannot use install_printer in debugger +- PR#5651: printer for abstract data type (camlp4 revised syntax) +- PR#5654: self pattern variable location tweak +- PR#5655: ocamlbuild doesn't pass cflags when building C stubs +- PR#5657: wrong error location for abbreviated record fields +- PR#5659: ocamlmklib -L option breaks with MSVC +- PR#5661: fixes for the test suite +- PR#5668: Camlp4 produces invalid syntax for "let _ = ..." +- PR#5671: initialization of compare_ext field in caml_final_custom_operations() +- PR#5677: do not use "value" as identifier (genprintval.ml) +- PR#5687: dynlink broken when used from "output-obj" main program (bytecode) - problem with printing of string literals in camlp4 (reported on caml-list) - emacs mode: colorization of comments and strings now works correctly - problem with forall and method (reported on caml-list on 2011-07-26) +- crash when using OCAMLRUNPARAM=a=X with invalid X (reported in private) Feature wishes: - PR#352: new option "-stdin" to make ocaml read stdin as a script @@ -240,9 +267,11 @@ Feature wishes: - PR#5215: marshalling of dynlinked closure - PR#5236: new '%revapply' primitive with the semantics 'revapply x f = f x', and '%apply' with semantics 'apply f x = f x'. +- PR#5255: natdynlink detection on powerpc, hurd, sparc - PR#5295: OS threads: problem with caml_c_thread_unregister() - PR#5297: compiler now checks existence of builtin primitives - PR#5329: (Windows) more efficient Unix.select if all fd's are sockets +- PR#5357: warning for useless open statements - PR#5358: first class modules don't allow "with type" declarations for types in sub-modules - PR#5385: configure: emit a warning when MACOSX_DEPLOYMENT_TARGET is set @@ -253,7 +282,6 @@ Feature wishes: - PR#5420: Unix.openfile share mode (Windows) - PR#5421: Unix: do not leak fds in various open_proc* functions - PR#5434: implement Unix.times in win32unix (partially) -- PR#5437: warning for useless open statements - PR#5438: new warnings for unused declarations - PR#5439: upgrade config.guess and config.sub - PR#5445 and others: better printing of types with user-provided names @@ -269,7 +297,12 @@ Feature wishes: - PR#5555: add function Hashtbl.reset to resize the bucket table to its initial size. - PR#5586: increase UNIX_BUFFER_SIZE to 64KiB +- PR#5597: register names for instrtrace primitives in embedded bytecode - PR#5599: Add warn() tag in ocamlbuild to control -w compiler switch +- PR#5628: add #remove_directory and Topdirs.remove_directory to remove + a directory from the load path +- PR#5636: in system threads library, issue with linking of pthread_atfork +- PR#5666: C includes don't provide a revision number - ocamldebug: ability to inspect values that contain code pointers - ocamldebug: new 'environment' directive to set environment variables for debuggee diff --git a/INSTALL b/INSTALL index 0e709192..98dfd31d 100644 --- a/INSTALL +++ b/INSTALL @@ -169,6 +169,9 @@ Examples: For Sun Solaris with the "acc" compiler: ./configure -cc "acc -fast" -libs "-lucb" + For Sun Solaris on Sparc 64bit, to compile natively (32bit only) + ./configure -cc "gcc -m32" -as "as -32" -aspp "gcc -m32 -c" + For AIX 4.3 with the IBM compiler xlc: ./configure -cc "xlc_r -D_AIX43 -Wl,-bexpall,-brtl -qmaxmem=8192" diff --git a/Makefile b/Makefile index 70919395..7a5978f4 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ # # ######################################################################### -# $Id: Makefile 12511 2012-05-30 13:29:48Z lefessan $ +# $Id: Makefile 12692 2012-07-10 15:20:34Z doligez $ # The main Makefile @@ -387,7 +387,7 @@ ocamlnat: ocamlopt otherlibs/dynlink/dynlink.cmxa $(NATTOPOBJS:.cmo=.cmx) toplevel/opttoploop.cmx: otherlibs/dynlink/dynlink.cmxa otherlibs/dynlink/dynlink.cmxa: otherlibs/dynlink/natdynlink.ml - cd otherlibs/dynlink && make allopt + cd otherlibs/dynlink && $(MAKE) allopt # The configuration file @@ -761,7 +761,7 @@ clean:: package-macosx: sudo rm -rf package-macosx/root - make PREFIX="`pwd`"/package-macosx/root install + $(MAKE) PREFIX="`pwd`"/package-macosx/root install tools/make-package-macosx sudo rm -rf package-macosx/root diff --git a/Makefile.nt b/Makefile.nt index 3a064b9f..671cf20a 100644 --- a/Makefile.nt +++ b/Makefile.nt @@ -10,7 +10,7 @@ # # ######################################################################### -# $Id: Makefile.nt 12511 2012-05-30 13:29:48Z lefessan $ +# $Id: Makefile.nt 12692 2012-07-10 15:20:34Z doligez $ # The main Makefile @@ -246,9 +246,9 @@ installoptopt: cp ocamlc.opt $(BINDIR)/ocamlc.opt$(EXE) cp ocamlopt.opt $(BINDIR)/ocamlopt.opt$(EXE) cp lex/ocamllex.opt $(BINDIR)/ocamllex.opt$(EXE) - cp compilerlibs/ocamlcommon.cmxa compilerlibs/ocamlcommon.a \ - compilerlibs/ocamlbytecomp.cmxa compilerlibs/ocamlbytecomp.a \ - compilerlibs/ocamloptcomp.cmxa compilerlibs/ocamloptcomp.a \ + cp compilerlibs/ocamlcommon.cmxa compilerlibs/ocamlcommon.$(A) \ + compilerlibs/ocamlbytecomp.cmxa compilerlibs/ocamlbytecomp.$(A) \ + compilerlibs/ocamloptcomp.cmxa compilerlibs/ocamloptcomp.$(A) \ $(COMPLIBDIR) clean:: partialclean @@ -319,7 +319,7 @@ ocamlnat: ocamlopt otherlibs/dynlink/dynlink.cmxa $(NATTOPOBJS:.cmo=.cmx) toplevel/opttoploop.cmx: otherlibs/dynlink/dynlink.cmxa otherlibs/dynlink/dynlink.cmxa: otherlibs/dynlink/natdynlink.ml - cd otherlibs/dynlink && make allopt + cd otherlibs/dynlink && $(MAKE) allopt # The configuration file @@ -386,14 +386,14 @@ beforedepend:: parsing/lexer.ml compilerlibs/ocamlcommon.cmxa: $(COMMON:.cmo=.cmx) $(CAMLOPT) -a -o $@ $(COMMON:.cmo=.cmx) partialclean:: - rm -f compilerlibs/ocamlcommon.cmxa compilerlibs/ocamlcommon.a + rm -f compilerlibs/ocamlcommon.cmxa compilerlibs/ocamlcommon.$(A) # The bytecode compiler compiled with the native-code compiler compilerlibs/ocamlbytecomp.cmxa: $(BYTECOMP:.cmo=.cmx) $(CAMLOPT) -a -o $@ $(BYTECOMP:.cmo=.cmx) partialclean:: - rm -f compilerlibs/ocamlbytecomp.cmxa compilerlibs/ocamlbytecomp.a + rm -f compilerlibs/ocamlbytecomp.cmxa compilerlibs/ocamlbytecomp.$(A) ocamlc.opt: compilerlibs/ocamlcommon.cmxa compilerlibs/ocamlbytecomp.cmxa $(BYTESTART:.cmo=.cmx) $(CAMLOPT) $(LINKFLAGS) -ccopt "$(BYTECCLINKOPTS)" -o ocamlc.opt \ @@ -411,7 +411,7 @@ partialclean:: compilerlibs/ocamloptcomp.cmxa: $(ASMCOMP:.cmo=.cmx) $(CAMLOPT) -a -o $@ $(ASMCOMP:.cmo=.cmx) partialclean:: - rm -f compilerlibs/ocamloptcomp.cmxa compilerlibs/ocamloptcomp.a + rm -f compilerlibs/ocamloptcomp.cmxa compilerlibs/ocamloptcomp.$(A) ocamlopt.opt: compilerlibs/ocamlcommon.cmxa compilerlibs/ocamloptcomp.cmxa $(OPTSTART:.cmo=.cmx) $(CAMLOPT) $(LINKFLAGS) -o ocamlopt.opt \ diff --git a/README.win32 b/README.win32 index 54d42ef9..067cc623 100644 --- a/README.win32 +++ b/README.win32 @@ -91,8 +91,7 @@ THIRD-PARTY SOFTWARE: Can be downloaded from http://alain.frisch.fr/flexdll.html [3] TCL/TK version 8.5. Windows binaries are available as part of the - ActiveTCL distribution at http://www.activestate.com/products/ActiveTcl/ - + ActiveTCL distribution at http://www.activestate.com/activetcl/downloads RECOMPILATION FROM THE SOURCES: @@ -186,7 +185,7 @@ contributed his changes to the OCaml project. REQUIREMENTS: -This port runs under MS Windows Vista, XP, and 2000. +This port runs under MS Windows Seven, Vista, XP, and 2000. The base bytecode system (ocamlc, ocaml, ocamllex, ocamlyacc, ...) runs without any additional tools. @@ -202,10 +201,14 @@ the Setup tool from Cygwin): mingw64-i686-binutils mingw64-i686-gcc + mingw64-i686-gcc-core mingw64-i686-runtime -NOTE: +NOTES: + + - Do not use the Cygwin version of flexdll for this port. + - There is another 32-bit gcc compiler, from the MinGW.org project, packaged in Cygwin under the name mingw-gcc. It is not currently supported by flexdll and OCaml. @@ -223,7 +226,7 @@ NOTE: The LablTk GUI requires Tcl/Tk 8.5. Windows binaries are available as part of the ActiveTCL distribution at -http://www.activestate.com/products/ActiveTcl/ + http://www.activestate.com/activetcl/downloads Note that you will need to install the 32-bit version of ActiveTCL, even if you are on a 64-bit version of Windows. @@ -246,23 +249,26 @@ environment variable. E.g. if Tcl/Tk was installed in C:\tcl, add RECOMPILATION FROM THE SOURCES: You will need the following software components to perform the recompilation: -- Windows NT, 2000, XP, or Vista. -- Cygwin: http://sourceware.cygnus.com/cygwin/ - Install at least the following packages: +- Windows NT, 2000, XP, Vista, or Seven. +- Cygwin: http://cygwin.com/ + Install at least the following packages (and their dependencies, as + computed by Cygwin's setup.exe): mingw64-i686-binutils mingw64-i686-gcc + mingw64-i686-gcc-core mingw64-i686-runtime diffutils make ncurses -- TCL/TK version 8.5 (see above). -- The flexdll tool (see above). +- Tcl/Tk version 8.5 (see above). +- The flexdll tool (see above). Do not forget to add the flexdll directory + to your PATH The standalone mingw toolchain from the MinGW-w64 project (http://mingw-w64.sourceforge.net/) is not supported. Please use the version packaged in Cygwin instead. -Start a Cygwin shell and unpack the source distribution +Start a new Cygwin shell and unpack the source distribution (ocaml-X.YY.Z.tar.gz) with "tar xzf". Change to the top-level directory of the OCaml distribution. Then, do @@ -273,7 +279,7 @@ directory of the OCaml distribution. Then, do Then, edit config/Makefile as needed, following the comments in this file. Normally, the only variables that need to be changed are PREFIX where to install everything - TK_ROOT where TCL/TK was installed + TK_ROOT where Tcl/Tk was installed Finally, use "make -f Makefile.nt" to build the system, e.g. @@ -317,14 +323,17 @@ the OCaml packages). Alternatively, recompile from the source distribution. RECOMPILATION FROM THE SOURCES: +Before starting, make sure that the gcc version installed by cygwin +is not 4.5.3 (it has a bug that affects OCaml). If needed, use cygwin's +setup.exe to downgrade to 4.3.4. + You will need to recompile (and install) flexdll from source with Cygwin's C compiler because the official binary version of flexdll doesn't handle Cygwin's symbolic links and sometimes fails to launch the C compiler. In order to recompile flexdll, you first need to configure, compile, -and install OCaml without flexdll support (by following the instructions -in file INSTALL, except the "make opt.opt" part), then modify the +and install OCaml without flexdll support, then modify the flexdll Makefile to change line 51 from: LINKFLAGS = -ccopt "-link version_res.o" to: @@ -333,7 +342,7 @@ to: Then "make CHAINS=cygwin" and add the flexdll directory to your PATH. Make sure to add it before "/usr/bin" or you will get cygwin's flexlink. -Then, OCaml's source directory, type: +Then, in OCaml's source directory, type: make clean make distclean and follow the instructions for Unix machines given in the file INSTALL. @@ -341,11 +350,14 @@ and follow the instructions for Unix machines given in the file INSTALL. NOTES: -The libraries available in this port are "num", "str", "threads", -"unix" and "labltk". "graph" is not available. -The replay debugger is fully supported. -When upgrading from 3.12.0 to 3.12.1, you will need to remove -/usr/local/bin/ocamlmktop.exe before typing "make install". +- There is a problem with cygwin's port of gcc version 4.5.3. You should + use cygwin's setup program to downgrade to 4.3.4 before compiling OCaml. +- The replay debugger is fully supported. +- When upgrading from 3.12.0 to 3.12.1, you will need to remove + /usr/local/bin/ocamlmktop.exe before typing "make install". +- In order to use the "graph" and "labltk" libraries, you will need + to use Cygwin's setup.exe to install the xinit, libX11-devel, tcl, + and tcl-tk packages before compiling OCaml. ------------------------------------------------------------------------------ diff --git a/VERSION b/VERSION index 58bb2927..b9d49671 100644 --- a/VERSION +++ b/VERSION @@ -1,6 +1,6 @@ -4.00.0+beta2 +4.00.0+rc1 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli -# $Id: VERSION 12567 2012-06-04 17:01:09Z doligez $ +# $Id: VERSION 12743 2012-07-19 14:37:16Z doligez $ diff --git a/asmcomp/amd64/emit.mlp b/asmcomp/amd64/emit.mlp index 35c7f313..47f652d0 100644 --- a/asmcomp/amd64/emit.mlp +++ b/asmcomp/amd64/emit.mlp @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: emit.mlp 12448 2012-05-12 09:49:40Z xleroy $ *) +(* $Id: emit.mlp 12664 2012-07-09 08:35:23Z lefessan $ *) (* Emission of x86-64 (AMD 64) assembly code *) @@ -396,7 +396,9 @@ let emit_instr fallthrough i = if alloc then begin ` {load_symbol_addr s}, %rax\n`; ` {emit_call "caml_c_call"}\n`; - record_frame i.live i.dbg + record_frame i.live i.dbg; + ` {load_symbol_addr "caml_young_ptr"}, %r11\n`; + ` movq (%r11), %r15\n`; end else begin ` {emit_call s}\n` end diff --git a/asmcomp/debuginfo.ml b/asmcomp/debuginfo.ml index ab0f5c04..19986f83 100644 --- a/asmcomp/debuginfo.ml +++ b/asmcomp/debuginfo.ml @@ -31,11 +31,12 @@ let none = { dinfo_char_end = 0 } +(* PR#5643: cannot use (==) because Debuginfo values are marshalled *) let is_none t = - t == none + t = none let to_string d = - if d == none + if d = none then "" else Printf.sprintf "{%s:%d,%d-%d}" d.dinfo_file d.dinfo_line d.dinfo_char_start d.dinfo_char_end diff --git a/asmcomp/debuginfo.mli b/asmcomp/debuginfo.mli index cf6179cd..ef4d55ad 100644 --- a/asmcomp/debuginfo.mli +++ b/asmcomp/debuginfo.mli @@ -12,7 +12,7 @@ type kind = Dinfo_call | Dinfo_raise -type t = { +type t = private { dinfo_kind: kind; dinfo_file: string; dinfo_line: int; diff --git a/asmcomp/emitaux.ml b/asmcomp/emitaux.ml index 1fffc65a..a0659794 100644 --- a/asmcomp/emitaux.ml +++ b/asmcomp/emitaux.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: emitaux.ml 12448 2012-05-12 09:49:40Z xleroy $ *) +(* $Id: emitaux.ml 12699 2012-07-11 15:26:15Z lefessan $ *) (* Common functions for emitting assembly code *) @@ -114,41 +114,6 @@ let emit_float32_directive directive f = let x = Int32.bits_of_float (float_of_string f) in emit_printf "\t%s\t0x%lx\n" directive x -(* Emit debug information *) - -(* This assoc list is expected to be very short *) -let file_pos_nums = - (ref [] : (string * int) list ref) - -(* Number of files *) -let file_pos_num_cnt = ref 1 - -(* Reset debug state at beginning of asm file *) -let reset_debug_info () = - file_pos_nums := []; - file_pos_num_cnt := 1 - -(* We only diplay .file if the file has not been seen before. We - display .loc for every instruction. *) -let emit_debug_info dbg = - if !Clflags.debug && not (Debuginfo.is_none dbg) then ( - let line = dbg.Debuginfo.dinfo_line in - let file_name = dbg.Debuginfo.dinfo_file in - let file_num = - try List.assoc file_name !file_pos_nums - with Not_found -> - let file_num = !file_pos_num_cnt in - incr file_pos_num_cnt; - emit_string " .file "; - emit_int file_num; emit_char ' '; - emit_string_literal file_name; emit_char '\n'; - file_pos_nums := (file_name,file_num) :: !file_pos_nums; - file_num in - emit_string " .loc "; - emit_int file_num; emit_char ' '; - emit_int line; emit_char '\n' - ) - (* Record live pointers at call points *) type frame_descr = @@ -182,13 +147,13 @@ let emit_frames a = lbl in let emit_frame fd = a.efa_label fd.fd_lbl; - a.efa_16 (if fd.fd_debuginfo == Debuginfo.none + a.efa_16 (if Debuginfo.is_none fd.fd_debuginfo then fd.fd_frame_size else fd.fd_frame_size + 1); a.efa_16 (List.length fd.fd_live_offset); List.iter a.efa_16 fd.fd_live_offset; a.efa_align Arch.size_addr; - if fd.fd_debuginfo != Debuginfo.none then begin + if not (Debuginfo.is_none fd.fd_debuginfo) then begin let d = fd.fd_debuginfo in let line = min 0xFFFFF d.dinfo_line and char_start = min 0xFF d.dinfo_char_start @@ -228,7 +193,7 @@ let is_generic_function name = (* CFI directives *) let is_cfi_enabled () = - !Clflags.debug && Config.asm_cfi_supported + Config.asm_cfi_supported let cfi_startproc () = if is_cfi_enabled () then @@ -243,4 +208,40 @@ let cfi_adjust_cfa_offset n = begin emit_string " .cfi_adjust_cfa_offset "; emit_int n; emit_string "\n"; end - + +(* Emit debug information *) + +(* This assoc list is expected to be very short *) +let file_pos_nums = + (ref [] : (string * int) list ref) + +(* Number of files *) +let file_pos_num_cnt = ref 1 + +(* Reset debug state at beginning of asm file *) +let reset_debug_info () = + file_pos_nums := []; + file_pos_num_cnt := 1 + +(* We only diplay .file if the file has not been seen before. We + display .loc for every instruction. *) +let emit_debug_info dbg = + if is_cfi_enabled () && + !Clflags.debug && not (Debuginfo.is_none dbg) then begin + let line = dbg.Debuginfo.dinfo_line in + assert (line <> 0); (* clang errors out on zero line numbers *) + let file_name = dbg.Debuginfo.dinfo_file in + let file_num = + try List.assoc file_name !file_pos_nums + with Not_found -> + let file_num = !file_pos_num_cnt in + incr file_pos_num_cnt; + emit_string " .file "; + emit_int file_num; emit_char ' '; + emit_string_literal file_name; emit_char '\n'; + file_pos_nums := (file_name,file_num) :: !file_pos_nums; + file_num in + emit_string " .loc "; + emit_int file_num; emit_char ' '; + emit_int line; emit_char '\n' + end diff --git a/asmcomp/power/arch.ml b/asmcomp/power/arch.ml index 696073e3..c940fa34 100644 --- a/asmcomp/power/arch.ml +++ b/asmcomp/power/arch.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: arch.ml 12187 2012-02-24 10:13:02Z xleroy $ *) +(* $Id: arch.ml 12583 2012-06-07 12:19:23Z xleroy $ *) (* Specific operations for the PowerPC processor *) @@ -48,7 +48,7 @@ let size_float = 8 (* Behavior of division *) -let division_crashes_on_overflow = false +let division_crashes_on_overflow = true (* Operations on addressing modes *) diff --git a/asmcomp/printlinear.ml b/asmcomp/printlinear.ml index 44a39597..e617177c 100644 --- a/asmcomp/printlinear.ml +++ b/asmcomp/printlinear.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: printlinear.ml 12179 2012-02-21 17:41:02Z xleroy $ *) +(* $Id: printlinear.ml 12610 2012-06-17 08:15:25Z xleroy $ *) (* Pretty-printing of linearized machine code *) @@ -65,7 +65,7 @@ let instr ppf i = | Lraise -> fprintf ppf "raise %a" reg i.arg.(0) end; - if i.dbg != Debuginfo.none then + if not (Debuginfo.is_none i.dbg) then fprintf ppf " %s" (Debuginfo.to_string i.dbg) let rec all_instr ppf i = diff --git a/asmrun/amd64.S b/asmrun/amd64.S index 45bddd1c..fd26e198 100644 --- a/asmrun/amd64.S +++ b/asmrun/amd64.S @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: amd64.S 12179 2012-02-21 17:41:02Z xleroy $ */ +/* $Id: amd64.S 12664 2012-07-09 08:35:23Z lefessan $ */ /* Asm part of the runtime system, AMD64 processor */ /* Must be preprocessed by cpp */ @@ -22,7 +22,7 @@ #if defined(SYS_macosx) -#define LBL(x) L##x +#define LBL(x) L##x #define G(r) _##r #define GREL(r) _##r@GOTPCREL #define GCALL(r) _##r @@ -35,8 +35,8 @@ name: #elif defined(SYS_mingw64) - -#define LBL(x) .L##x + +#define LBL(x) .L##x #define G(r) r #undef GREL #define GCALL(r) r @@ -50,7 +50,7 @@ #else -#define LBL(x) .L##x +#define LBL(x) .L##x #define G(r) r #define GREL(r) r@GOTPCREL #define GCALL(r) r@PLT @@ -74,7 +74,7 @@ #define CFI_ENDPROC #define CFI_ADJUST(n) #endif - + #if defined(__PIC__) && !defined(SYS_mingw64) /* Position-independent operations on global variables. */ @@ -119,7 +119,7 @@ popq %r11 #else - + /* Non-PIC operations on global variables. Slightly faster. */ #define STORE_VAR(srcreg,dstlabel) \ @@ -148,10 +148,10 @@ #endif -/* Save and restore all callee-save registers on stack. +/* Save and restore all callee-save registers on stack. Keep the stack 16-aligned. */ -#if defined(SYS_mingw64) +#if defined(SYS_mingw64) /* Win64 API: callee-save regs are rbx, rbp, rsi, rdi, r12-r15, xmm6-xmm15 */ @@ -219,11 +219,11 @@ popq %rbp; \ popq %rbx -#endif +#endif #ifdef SYS_mingw64 /* Calls from OCaml to C must reserve 32 bytes of extra stack space */ -# define PREPARE_FOR_C_CALL subq $32, %rsp +# define PREPARE_FOR_C_CALL subq $32, %rsp # define CLEANUP_AFTER_C_CALL addq $32, %rsp #else # define PREPARE_FOR_C_CALL @@ -389,6 +389,7 @@ LBL(caml_c_call): popq %r12 STORE_VAR(%r12, caml_last_return_address) STORE_VAR(%rsp, caml_bottom_of_stack) + pushq %r12 #ifndef SYS_mingw64 /* Touch the stack to trigger a recoverable segfault if insufficient space remains */ @@ -402,12 +403,7 @@ LBL(caml_c_call): /* Call the function (address in %rax) */ /* No need to PREPARE_FOR_C_CALL since the caller already reserved the stack space if needed (cf. amd64/proc.ml) */ - call *%rax - /* Reload alloc ptr */ - LOAD_VAR(caml_young_ptr, %r15) - /* Return to caller */ - pushq %r12 - ret + jmp *%rax /* Start the OCaml program */ diff --git a/boot/ocamlc b/boot/ocamlc index 97d88e42fe37b847c0305c3e5a87004c2f046616..3dbcbc00c7414d479d174f47e3a319051baeedd1 100755 GIT binary patch delta 111726 zcmc$Hd3Y5?({E@=y$^@$3<@HrgnQhVW!)hZsy+XC@-k+=28MLWFji)-c9<6r> z2?;T%szS}7-sP&7I(`F|?e?ifl<=+^Yd`soI$5J-Ul@s;z6lPKX1HBH_sl^~rv zM~&AffXR3|^O%-IBbK2kbEX6xb%^AI6>7a8k)rKOKd4=AQl`Q-jjOfADv%!LVl#L6e|#U8GqkKY)c`p+bJ3k4iil<)57l znf3;*)C}YxM&`exXvzIc~H4&LFsF2q)~qx$)wc9 zBvazLyKqX4f*~R2zX=H4!$orpIJf2w1*Kn+W!U|>!M$l;4^Qp#`4ZhrqWj2ef63Yd z(jJn=t)oUk>=T31VL|Etd|gw#?~sNV?-%Q#5r`x3fV7l zQ{5`vBax2knQ*;54N8%;|$3jk*d91lxsj8PJseGU$881m@x=0FT-e8HtC8V~* zjg<70UGx{e476#Mi~eVc8|uP+AaQpnu&Sf9Z4x=$Mfj-1&2{1KleiHs+|B<`c8J8W z@|`-`NZgIUu|959U{$_ZD2doIrX(8eDtM|o(6Vu|;BE4{$W`uTNi)V(Zk5ELrJ|n2 zGLH>#2j{U@&5@aRyD~@0f({N@A)O`eCP~M*0*PDV!ucf5tu;&H*b^LW{C3>$FXz^m zyO7@j$+%@M+=mi(7jT?+zs%!S?2vg54p|}3NF2A8>6g3cD`lSa@p3U`nJ1AeBq1}I zB5{>2+;tMSz=i8AarXkpl|3Z$Shz+qZ>o#Fmc-2#^t7|DC$9YP7lB4QW@2qJuhp^~ zyTt>Nh8yb6<9a5^Jjabd5;92Q92a3+dx^V8@?~7k7yfdgakmMhB;isQ;qRXZgye=g zCj3(3?sMVZmN>TspO?4_7ad95{oDy0hUF6ZfQ#@ZiF3?|tdPDE=eAf2iE~>lRpK6W z@iQfErGvW`3{M>kw9YXfS8`C|$RPyo1&Mpug{zdfRW95NTHPPvt)GhpTkTOv!dA0pWMJEqg*Dce)7Ql(<)2xD67=En-1;%RClziOfUG zMBW}(-dLIE;E)y4sazsolZ1@S2F^YGNR%{hxM_!yG|ht2sj|%bR~Uzcd~>9x zfFA~>U*$9pZ;r}01QFaDlr9TOmjB6m(xUXEe3gFz%e0$AwdB{{*=(MZQ_?ko^*9E29$ub9BW$H`Z4=$Wf;!Xg^ zjXEXsxL1UTJm}v+A}{3FM}gM=_Nc$UJ5|Q|2*W&O7VM>y13O zHaeC|Vs(5jj*t>J4fp?6lIRzgl*tn3burf^?wpJ6m-hp$j&#v|DRJSzv7Mu39xfs8$UFyE z&JsN?kufeN)rlm?}H$})9aW%4C1&V`G*T8`Tv67u_@nv8!$nk7$g z6?#|V5?#2hLFJy3H1RH)NkKHjYot+si7b@lDwJ1)C?up#P+FH|Qc#8ktuM>s67to- znvMAwX*UgPe2>I6XzQwUqeSMqaH}LP6F6qlQ0CzhvXDj&_arsBQIcdyk^&b=Z<*)d zxbBt*>Dl3)#PTGW$Fei)#;$Ug-wVj>;JDn6635~(eNz|xE}54n^NL(~4_S|EI)`rx}@pssx(^S zy0~zE9SAhA#DzN{akO`YC${_pnd%4%mZZC+#3f{_%yV!oNtMKL%}n3JMZZAiu>_pg z)0H<&=CLH4*DH`$E}k5;lbI43!WGq*xNfpQ9~ZO#?hiD}!7=@tz`1q4IVk%WD?8J*d!BS;*Z>hXm2|`Ul3%CC=@gX%gr5&M;*^4IkynP`;&kqdb}A&%YCB zSZ~?re)2j}3eC&xdnC;WS3_n>oa30>xEp|TD`c>war;$ki5nf@71(RYkVv;984@?f zRq2_x1H!T(Y|^nZ50{YrGLNn2jF&G-+&C9*y~JG)TrKQ%g^ZV(xP&Z2rn?0*gVNUp zrMm{D^N?o22D&PY2%<6EY3`E#eSt!QU4^~|&MnB1p!A-g^z%XK4MFMENV8zqx$0O1 zT#37q89{}{1*L}trTZdX45nRZ_h=7wNkTFlNk{u(NPAuBKi~5EBV6f|NJqNTN06qe zIZAzd?+u<`maDr$Y2A5GHYN8lEE;;z6HUpNJQmGOwD4qef2c*hdxu-JHcs=}$>%-e z>m?_FSvnvL&<&sg1_3ewAvEuIPb!`M!()ZA5DY#V*--J-^2sElngJSXw5P5TN9_*l zmd^fvBlR&tefFXRZHS^Yv8xlcJms3E;Lgfx2w>;u-^KHOKVKajc*m2Qcw+>3msjR!atax3lMsW4Sb)Jjp7 zzV2$K(WO@mE8T}Aw}%xH4d5!6{M=uGwtA_ed4#W71E3sk>}DhX2#BAId#)`(hJh1MSK2lir4&t#Yz#~i)VkURchpAd& zc|Td!EBUc6whrR|^`C(_;h3Ij_5tVkB-ghEX(yl4RYi7rv@B4IZzPJm$3E50CmMZosKBcU(%GW}fPdg4MNf{h7+XDDk8_*lj3Qz=3 z;(ga#FYU?E;;FEcW>7+=R!?b0#hF?QwYf&m{~ndAw$Lc5+>=4=c50S=FjMQLs4X=b zwMzpkORKB2V)9Iyo2A{Ow+2(VTDHfhw4sW|T4rclV49jzrA4JB@6hbylvSs+L*~?QfvP zDm_@hJhdlU{%v?})?iTS0G6*;5ZB&FGnYPrHqFh|=EwAvH0(xPrXNM-X{j;&gNhEI z;yf)WabOVoTFG&cMqhp!o=D5`AkkoYJWm^=mTGi=wE-`*ZL-07gWgzS;E%Kq@!Ti~=oF9RoweS{byfKpUdoC}nJ1s9hU77Cc$8=lp(uV_ezXbg)pXN4p9k z$xXER6HjVHePFpCavkHjj&3+t#5uIR3p{gfBQ08)NEMAVpEAjX?|lp8__2}JfsYT} zJYCJEAG5UBm=thf)36DqpnmC(WdVP@S+?>P_QzEEtg+Thohpi_P)QT5pK@!!owqm9 z8g`rpV(uf3C*H>FknRF-d%*M{x*14w^)uOzG6}9ZoOkvboqS_?+WZ>H5(7id)2D=L>3 zG=tXfq=%Ymdtw#_Rdg4PYp$gxEDAy|mi6CFRn4_AG4}*zFA0=d8ic-Amb#BiWzv)u z5MmkB{CiXZz12dCS1PEwh1OKPAGr6zQ>bxEt!?86BomH^>J>|YaP2!5>07` zjw6^IYy+oyl>23&@)-4Li!S@PM&+Z_L^{}3tE;ZRny?IR)e{=^?QbShemjJ(CuNM= z1m4v9gYam3c{}YMMcF`!?X^3Ur|6;fTB`cA>~n|Pqf1Z?3oc%nv@m}QxjvDRNEs$uu8b^COqWLchhSV?OUC+>uGdn=&htP!pK_wZ!VIGO;w#Sp?!tDH7S%QnQZ9obfzf$U z%jUd6WhHR7H=*izo)qORVQZo6eG>I{!2BZypj9PZwcC_;Xh&B#ZbCPRbg3)UdVs3C zqW`t(rnObyg$SilDYUYic9-%VC3Xkp^zMjiqr0Pj9l}{FcopmMeX8n?sP(~B%;5m$ z!>gE&0+^2(lS+fGfq9Qm^)*_Oa#V~tw5SK`v4_@yHucb+pe;u|^_1g+g7)@A){>rD zOXbUehQ96z0luOOJu!TJO|5&uIlhqt#ME9|y!tKt>8K}L`7Thy_jIV2)nZO!mkw8U&~a^Q9*z0 zB()l#)eUoc`+owaQqRNL7g}-l)B&1TQ7+KDfm)9GJK{*J8fWhssNLuZ`$PJ{e&g!g z#=fRh>!7HALK|OrSCYnVMs>j}zzqXf$nqcHpxQNi_E-v}

&!HOPG?eeU*-4R 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î_~)igL)y)UtGl{YQe!71l*@6w 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¯m}^~=;!oZ2 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 C)$88? delta 100839 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⁣sS<9TIo%wgx8m4Q=cvS3 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%0AgzY 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 Phsni}k!^bRS|$YmIv5c> delta 95 zcmZp^&DDLIYl0-3c2a6dqEVw{t0d!ANv1a$oL?9i7(X&F2tVA;m&wG+%&TLfXJDXb u08zJHE{Dm*QIR7!($|TBf!WJB$T=8Dzhz)xV0TW;%`vpJw2Uw?umAu&A{j3L diff --git a/bytecomp/dll.ml b/bytecomp/dll.ml index 67f38819..c765cbef 100644 --- a/bytecomp/dll.ml +++ b/bytecomp/dll.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: dll.ml 11156 2011-07-27 14:17:02Z doligez $ *) +(* $Id: dll.ml 12661 2012-07-07 11:41:17Z scherer $ *) (* Handling of dynamically-linked libraries *) @@ -40,6 +40,9 @@ let names_of_opened_dlls = ref ([] : string list) let add_path dirs = search_path := dirs @ !search_path +let remove_path dirs = + search_path := List.filter (fun d -> not (List.mem d dirs)) !search_path + (* Extract the name of a DLLs from its external name (xxx.so or -lxxx) *) let extract_dll_name file = diff --git a/bytecomp/dll.mli b/bytecomp/dll.mli index 2b1dec0c..4eaecfde 100644 --- a/bytecomp/dll.mli +++ b/bytecomp/dll.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: dll.mli 11156 2011-07-27 14:17:02Z doligez $ *) +(* $Id: dll.mli 12661 2012-07-07 11:41:17Z scherer $ *) (* Handling of dynamically-linked libraries *) @@ -46,6 +46,9 @@ val synchronize_primitive: int -> dll_address -> unit (* Add the given directories at the head of the search path for DLLs *) val add_path: string list -> unit +(* Remove the given directories from the search path for DLLs *) +val remove_path: string list -> unit + (* Initialization for separate compilation. Initialize the DLL search path to the directories given in the environment variable CAML_LD_LIBRARY_PATH, plus contents of ld.conf file diff --git a/bytecomp/symtable.ml b/bytecomp/symtable.ml index 872a4bbf..7ab4bfd9 100644 --- a/bytecomp/symtable.ml +++ b/bytecomp/symtable.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: symtable.ml 11306 2011-12-13 17:50:08Z frisch $ *) +(* $Id: symtable.ml 12629 2012-06-21 15:55:03Z doligez $ *) (* To assign numbers to globals and primitives *) @@ -126,7 +126,7 @@ let output_primitive_table outchan = fprintf outchan " %s,\n" prim.(i) done; fprintf outchan " (primitive) 0 };\n"; - fprintf outchan "char * caml_names_of_builtin_cprim[] = {\n"; + fprintf outchan "const char * caml_names_of_builtin_cprim[] = {\n"; for i = 0 to Array.length prim - 1 do fprintf outchan " \"%s\",\n" prim.(i) done; diff --git a/bytecomp/translcore.ml b/bytecomp/translcore.ml index a6f531e0..b515cd1a 100644 --- a/bytecomp/translcore.ml +++ b/bytecomp/translcore.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: translcore.ml 12511 2012-05-30 13:29:48Z lefessan $ *) +(* $Id: translcore.ml 12681 2012-07-10 08:33:16Z garrigue $ *) (* Translation from typed abstract syntax to lambda terms, for the core language *) @@ -484,18 +484,19 @@ let rec push_defaults loc bindings pat_expr_list partial = [pat, exp] | (pat, exp) :: _ when bindings <> [] -> let param = name_pattern "param" pat_expr_list in + let name = Ident.name param in let exp = { exp with exp_loc = loc; exp_desc = Texp_match ({exp with exp_type = pat.pat_type; exp_desc = - Texp_ident (Path.Pident param, mknoloc (Longident.Lident "param"), + Texp_ident (Path.Pident param, mknoloc (Longident.Lident name), {val_type = pat.pat_type; val_kind = Val_reg; Types.val_loc = Location.none; })}, pat_expr_list, partial) } in push_defaults loc bindings - [{pat with pat_desc = Tpat_var (param, mknoloc "param")}, exp] Total + [{pat with pat_desc = Tpat_var (param, mknoloc name)}, exp] Total | _ -> pat_expr_list @@ -833,9 +834,6 @@ and transl_exp0 e = cl_loc = e.exp_loc; cl_type = Cty_signature cty; cl_env = e.exp_env } - | Texp_poly (exp, _ ) - | Texp_newtype (_, exp) - -> transl_exp exp and transl_list expr_list = List.map transl_exp expr_list diff --git a/byterun/Makefile b/byterun/Makefile index 32cccdb0..2d1006ec 100644 --- a/byterun/Makefile +++ b/byterun/Makefile @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile 12567 2012-06-04 17:01:09Z doligez $ +# $Id: Makefile 12566 2012-06-04 16:33:59Z doligez $ include Makefile.common diff --git a/byterun/compact.c b/byterun/compact.c index c1e66994..11a2cad2 100644 --- a/byterun/compact.c +++ b/byterun/compact.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: compact.c 12524 2012-05-31 11:50:51Z doligez $ */ +/* $Id: compact.c 12621 2012-06-20 15:39:09Z doligez $ */ #include @@ -397,7 +397,7 @@ uintnat caml_percent_max; /* used in gc_ctrl.c and memory.c */ void caml_compact_heap (void) { - uintnat target_size; + uintnat target_size, live; do_compaction (); /* Compaction may fail to shrink the heap to a reasonable size @@ -416,13 +416,15 @@ void caml_compact_heap (void) /* We compute: freewords = caml_fl_cur_size (exact) heapsize = caml_heap_size (exact) - usedwords = heap_size - freewords - target_size = usedwords * (1 + caml_percent_free / 100) + live = heap_size - freewords + target_size = live * (1 + caml_percent_free / 100) + = live / 100 * (100 + caml_percent_free) + We add 1 to live/100 to make sure it isn't 0. We recompact if target_size < heap_size / 2 */ - target_size = (caml_stat_heap_size - Bsize_wsize (caml_fl_cur_size)) - * (100 + caml_percent_free) / 100; + live = caml_stat_heap_size - Bsize_wsize (caml_fl_cur_size); + target_size = (live / 100 + 1) * (100 + caml_percent_free); target_size = caml_round_heap_chunk_size (target_size); if (target_size < caml_stat_heap_size / 2){ char *chunk; diff --git a/byterun/custom.c b/byterun/custom.c index 7388602f..41813a1b 100644 --- a/byterun/custom.c +++ b/byterun/custom.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: custom.c 11156 2011-07-27 14:17:02Z doligez $ */ +/* $Id: custom.c 12658 2012-07-06 16:44:24Z xleroy $ */ #include @@ -83,6 +83,7 @@ struct custom_operations * caml_final_custom_operations(final_fun fn) ops->hash = custom_hash_default; ops->serialize = custom_serialize_default; ops->deserialize = custom_deserialize_default; + ops->compare_ext = custom_compare_ext_default; l = caml_stat_alloc(sizeof(struct custom_operations_list)); l->ops = ops; l->next = custom_ops_final_table; diff --git a/byterun/dynlink.c b/byterun/dynlink.c index 736a6d8f..5cb2ed7d 100644 --- a/byterun/dynlink.c +++ b/byterun/dynlink.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: dynlink.c 11156 2011-07-27 14:17:02Z doligez $ */ +/* $Id: dynlink.c 12677 2012-07-09 14:15:48Z doligez $ */ /* Dynamic loading of C primitives. */ @@ -184,8 +184,15 @@ void caml_build_primitive_table_builtin(void) { int i; caml_ext_table_init(&caml_prim_table, 0x180); - for (i = 0; caml_builtin_cprim[i] != 0; i++) +#ifdef DEBUG + caml_ext_table_init(&caml_prim_name_table, 0x180); +#endif + for (i = 0; caml_builtin_cprim[i] != 0; i++) { caml_ext_table_add(&caml_prim_table, (void *) caml_builtin_cprim[i]); +#ifdef DEBUG + caml_ext_table_add(&caml_prim_name_table, strdup(caml_names_of_builtin_cprim[i])); +#endif +} } #endif /* NATIVE_CODE */ diff --git a/byterun/fix_code.c b/byterun/fix_code.c index 84d46689..c3142197 100644 --- a/byterun/fix_code.c +++ b/byterun/fix_code.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: fix_code.c 12227 2012-03-13 14:44:48Z xleroy $ */ +/* $Id: fix_code.c 12715 2012-07-16 10:37:03Z frisch $ */ /* Handling of blocks of bytecode (endianness switch, threading). */ @@ -38,15 +38,8 @@ unsigned char caml_code_md5[16]; /* Read the main bytecode block from a file */ -void caml_load_code(int fd, asize_t len) -{ - int i; +void caml_init_code_fragments() { struct code_fragment * cf; - - caml_code_size = len; - caml_start_code = (code_t) caml_stat_alloc(caml_code_size); - if (read(fd, (char *) caml_start_code, caml_code_size) != caml_code_size) - caml_fatal_error("Fatal error: truncated bytecode file.\n"); /* Register the code in the table of code fragments */ cf = caml_stat_alloc(sizeof(struct code_fragment)); cf->code_start = (char *) caml_start_code; @@ -55,6 +48,17 @@ void caml_load_code(int fd, asize_t len) cf->digest_computed = 1; caml_ext_table_init(&caml_code_fragments_table, 8); caml_ext_table_add(&caml_code_fragments_table, cf); +} + +void caml_load_code(int fd, asize_t len) +{ + int i; + + caml_code_size = len; + caml_start_code = (code_t) caml_stat_alloc(caml_code_size); + if (read(fd, (char *) caml_start_code, caml_code_size) != caml_code_size) + caml_fatal_error("Fatal error: truncated bytecode file.\n"); + caml_init_code_fragments(); /* Prepare the code for execution */ #ifdef ARCH_BIG_ENDIAN caml_fixup_endianness(caml_start_code, caml_code_size); diff --git a/byterun/fix_code.h b/byterun/fix_code.h index e344018a..81124878 100644 --- a/byterun/fix_code.h +++ b/byterun/fix_code.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: fix_code.h 12227 2012-03-13 14:44:48Z xleroy $ */ +/* $Id: fix_code.h 12715 2012-07-16 10:37:03Z frisch $ */ /* Handling of blocks of bytecode (endianness switch, threading). */ @@ -27,6 +27,7 @@ extern code_t caml_start_code; extern asize_t caml_code_size; extern unsigned char * caml_saved_code; +void caml_init_code_fragments(); void caml_load_code (int fd, asize_t len); void caml_fixup_endianness (code_t code, asize_t len); void caml_set_instruction (code_t pos, opcode_t instr); diff --git a/byterun/freelist.c b/byterun/freelist.c index 4733a538..f84478ba 100644 --- a/byterun/freelist.c +++ b/byterun/freelist.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: freelist.c 11156 2011-07-27 14:17:02Z doligez $ */ +/* $Id: freelist.c 12708 2012-07-13 12:03:26Z doligez $ */ #define FREELIST_DEBUG 0 #if FREELIST_DEBUG @@ -532,14 +532,14 @@ void caml_set_allocation_policy (uintnat p) switch (p){ case Policy_next_fit: fl_prev = Fl_head; + policy = p; break; case Policy_first_fit: flp_size = 0; beyond = NULL; + policy = p; break; default: - Assert (0); break; } - policy = p; } diff --git a/byterun/gc_ctrl.c b/byterun/gc_ctrl.c index ece9a54d..5d6c8245 100644 --- a/byterun/gc_ctrl.c +++ b/byterun/gc_ctrl.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: gc_ctrl.c 12149 2012-02-10 16:15:24Z doligez $ */ +/* $Id: gc_ctrl.c 12708 2012-07-13 12:03:26Z doligez $ */ #include "alloc.h" #include "compact.h" @@ -356,21 +356,12 @@ static intnat norm_minsize (intnat s) return s; } -static intnat norm_policy (intnat p) -{ - if (p >= 0 && p <= 1){ - return p; - }else{ - return 1; - } -} - CAMLprim value caml_gc_set(value v) { uintnat newpf, newpm; asize_t newheapincr; asize_t newminsize; - uintnat newpolicy; + uintnat oldpolicy; caml_verb_gc = Long_val (Field (v, 3)); @@ -396,10 +387,11 @@ CAMLprim value caml_gc_set(value v) caml_gc_message (0x20, "New heap increment size: %luk bytes\n", caml_major_heap_increment/1024); } - newpolicy = norm_policy (Long_val (Field (v, 6))); - if (newpolicy != caml_allocation_policy){ - caml_gc_message (0x20, "New allocation policy: %d\n", newpolicy); - caml_set_allocation_policy (newpolicy); + oldpolicy = caml_allocation_policy; + caml_set_allocation_policy (Long_val (Field (v, 6))); + if (oldpolicy != caml_allocation_policy){ + caml_gc_message (0x20, "New allocation policy: %d\n", + caml_allocation_policy); } /* Minor heap size comes last because it will trigger a minor collection diff --git a/byterun/io.c b/byterun/io.c index d7d341f8..ca01a4fe 100644 --- a/byterun/io.c +++ b/byterun/io.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: io.c 12149 2012-02-10 16:15:24Z doligez $ */ +/* $Id: io.c 12641 2012-06-25 12:02:16Z lefessan $ */ /* Buffered input/output. */ @@ -279,6 +279,11 @@ CAMLexport int caml_do_read(int fd, char *p, unsigned int n) do { caml_enter_blocking_section(); retcode = read(fd, p, n); +#if defined(_WIN32) + if (retcode == -1 && errno == ENOMEM && n > 16384){ + retcode = read(fd, p, 16384); + } +#endif caml_leave_blocking_section(); } while (retcode == -1 && errno == EINTR); if (retcode == -1) caml_sys_io_error(NO_ARG); diff --git a/byterun/major_gc.c b/byterun/major_gc.c index 772c3fc4..ab8f7459 100644 --- a/byterun/major_gc.c +++ b/byterun/major_gc.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: major_gc.c 11156 2011-07-27 14:17:02Z doligez $ */ +/* $Id: major_gc.c 12625 2012-06-21 13:43:03Z doligez $ */ #include @@ -233,7 +233,11 @@ static void mark_slice (intnat work) weak_prev = &Field (cur, 0); work -= Whsize_hd (hd); }else{ - /* Subphase_weak1 is done. Start removing dead weak arrays. */ + /* Subphase_weak1 is done. + Handle finalised values and start removing dead weak arrays. */ + gray_vals_cur = gray_vals_ptr; + caml_final_update (); + gray_vals_ptr = gray_vals_cur; caml_gc_subphase = Subphase_weak2; weak_prev = &caml_weak_list_head; } @@ -254,10 +258,7 @@ static void mark_slice (intnat work) } work -= 1; }else{ - /* Subphase_weak2 is done. Handle finalised values. */ - gray_vals_cur = gray_vals_ptr; - caml_final_update (); - gray_vals_ptr = gray_vals_cur; + /* Subphase_weak2 is done. Go to Subphase_final. */ caml_gc_subphase = Subphase_final; } } diff --git a/byterun/startup.c b/byterun/startup.c index 5f35e877..b774016d 100644 --- a/byterun/startup.c +++ b/byterun/startup.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: startup.c 12215 2012-03-10 01:46:37Z meyer $ */ +/* $Id: startup.c 12715 2012-07-16 10:37:03Z frisch $ */ /* Start-up code */ @@ -443,6 +443,10 @@ CAMLexport void caml_startup_code( { value res; char* cds_file; + char * exe_name; +#ifdef __linux__ + static char proc_self_exe[256]; +#endif caml_init_ieee_floats(); caml_init_custom_operations(); @@ -455,6 +459,11 @@ CAMLexport void caml_startup_code( strcpy(caml_cds_file, cds_file); } parse_camlrunparam(); + exe_name = argv[0]; +#ifdef __linux__ + if (caml_executable_name(proc_self_exe, sizeof(proc_self_exe)) == 0) + exe_name = proc_self_exe; +#endif caml_external_raise = NULL; /* Initialize the abstract machine */ caml_init_gc (minor_heap_init, heap_size_init, heap_chunk_init, @@ -468,6 +477,7 @@ CAMLexport void caml_startup_code( /* Load the code */ caml_start_code = code; caml_code_size = code_size; + caml_init_code_fragments(); if (caml_debugger_in_use) { int len, i; len = code_size / sizeof(opcode_t); @@ -489,7 +499,7 @@ CAMLexport void caml_startup_code( caml_section_table_size = section_table_size; /* Initialize system libraries */ caml_init_exceptions(); - caml_sys_init("", argv); + caml_sys_init(exe_name, argv); /* Execute the program */ caml_debugger(PROGRAM_START); res = caml_interprete(caml_start_code, caml_code_size); diff --git a/byterun/win32.c b/byterun/win32.c index cc0f046b..f8ba9c98 100644 --- a/byterun/win32.c +++ b/byterun/win32.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: win32.c 12242 2012-03-14 15:27:58Z xleroy $ */ +/* $Id: win32.c 12686 2012-07-10 11:34:39Z scherer $ */ /* Win32-specific stuff */ @@ -205,7 +205,6 @@ static int argvsize; static void store_argument(char * arg); static void expand_argument(char * arg); static void expand_pattern(char * arg); -static void expand_diversion(char * filename); static void out_of_memory(void) { @@ -227,10 +226,6 @@ static void expand_argument(char * arg) { char * p; - if (arg[0] == '@') { - expand_diversion(arg + 1); - return; - } for (p = arg; *p != 0; p++) { if (*p == '*' || *p == '?') { expand_pattern(arg); @@ -265,62 +260,6 @@ static void expand_pattern(char * pat) _findclose(handle); } -static void expand_diversion(char * filename) -{ - struct _stat stat; - int fd; - char * buf, * endbuf, * p, * q, * s; - int inquote; - - if (_stat(filename, &stat) == -1 || - (fd = _open(filename, O_RDONLY | O_BINARY, 0)) == -1) { - fprintf(stderr, "Cannot open file %s\n", filename); - exit(2); - } - buf = (char *) malloc(stat.st_size + 1); - if (buf == NULL) out_of_memory(); - _read(fd, buf, stat.st_size); - endbuf = buf + stat.st_size; - _close(fd); - for (p = buf; p < endbuf; /*nothing*/) { - /* Skip leading blanks */ - while (p < endbuf && isspace(*p)) p++; - if (p >= endbuf) break; - s = p; - /* Skip to end of argument, taking quotes into account */ - q = s; - inquote = 0; - while (p < endbuf) { - if (! inquote) { - if (isspace(*p)) break; - if (*p == '"') { inquote = 1; p++; continue; } - *q++ = *p++; - } else { - switch (*p) { - case '"': - inquote = 0; p++; continue; - case '\\': - if (p + 4 <= endbuf && strncmp(p, "\\\\\\\"", 4) == 0) { - p += 4; *q++ = '\\'; *q++ = '"'; continue; - } - if (p + 3 <= endbuf && strncmp(p, "\\\\\"", 3) == 0) { - p += 3; *q++ = '\\'; inquote = 0; continue; - } - if (p + 2 <= endbuf && p[1] == '"') { - p += 2; *q++ = '"'; continue; - } - /* fallthrough */ - default: - *q++ = *p++; - } - } - } - /* Delimit argument and expand it */ - *q++ = 0; - expand_argument(s); - p++; - } -} CAMLexport void caml_expand_command_line(int * argcp, char *** argvp) { diff --git a/camlp4/Camlp4/Printers/OCaml.ml b/camlp4/Camlp4/Printers/OCaml.ml index c1b5f1d9..338655f0 100644 --- a/camlp4/Camlp4/Printers/OCaml.ml +++ b/camlp4/Camlp4/Printers/OCaml.ml @@ -106,8 +106,8 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct "Cannot print %S this identifier does not respect OCaml lexing rules (%s)" str (Lexer.Error.to_string exn)) ]; - value ocaml_char x = - match x with [ "'" -> "\\'" | c -> c ]; + (* This is to be sure character literals are always escaped. *) + value ocaml_char x = Char.escaped (Struct.Token.Eval.char x); value rec get_expr_args a al = match a with @@ -301,16 +301,19 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct | <:binding< $b1$ and $b2$ >> -> do { o#binding f b1; pp f o#andsep; o#binding f b2 } | <:binding< $p$ = $e$ >> -> - let (pl, e) = + let (pl, e') = match p with [ <:patt< ($_$ : $_$) >> -> ([], e) | _ -> expr_fun_args e ] in - match (p, e) with - [ (<:patt< $lid:_$ >>, <:expr< ($e$ : $t$) >>) -> + match (p, e') with + [ (<:patt< $lid:_$ >>, <:expr< ($e'$ : $t$) >>) -> pp f "%a :@ %a =@ %a" - (list o#fun_binding "@ ") [`patt p::pl] o#ctyp t o#expr e - | _ -> pp f "%a @[<0>%a=@]@ %a" o#simple_patt - p (list' o#fun_binding "" "@ ") pl o#expr e ] + (list o#fun_binding "@ ") [`patt p::pl] o#ctyp t o#expr e' + | (<:patt< $lid:_$ >>, _) -> + pp f "%a @[<0>%a=@]@ %a" o#simple_patt + p (list' o#fun_binding "" "@ ") pl o#expr e' + | _ -> + pp f "%a =@ %a" o#simple_patt p o#expr e ] | <:binding< $anti:s$ >> -> o#anti f s ]; method record_binding f bi = @@ -557,7 +560,7 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct | <:expr< $int64:s$ >> -> o#numeric f s "L" | <:expr< $int32:s$ >> -> o#numeric f s "l" | <:expr< $flo:s$ >> -> o#numeric f s "" - | <:expr< $chr:s$ >> -> pp f "'%s'" s + | <:expr< $chr:s$ >> -> pp f "'%s'" (ocaml_char s) | <:expr< $id:i$ >> -> o#var_ident f i | <:expr< { $b$ } >> -> pp f "@[@[{%a@]@ }@]" o#record_binding b @@ -667,7 +670,7 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct | <:patt< $int32:s$ >> -> o#numeric f s "l" | <:patt< $int:s$ >> -> o#numeric f s "" | <:patt< $flo:s$ >> -> o#numeric f s "" - | <:patt< $chr:s$ >> -> pp f "'%s'" s + | <:patt< $chr:s$ >> -> pp f "'%s'" (ocaml_char s) | <:patt< ~ $s$ >> -> pp f "~%s" s | <:patt< ` $uid:s$ >> -> pp f "`%a" o#var s | <:patt< # $i$ >> -> pp f "@[<2>#%a@]" o#ident i diff --git a/camlp4/Camlp4Filters/Camlp4MetaGenerator.ml b/camlp4/Camlp4Filters/Camlp4MetaGenerator.ml index b716d5af..af338a2a 100644 --- a/camlp4/Camlp4Filters/Camlp4MetaGenerator.ml +++ b/camlp4/Camlp4Filters/Camlp4MetaGenerator.ml @@ -161,10 +161,10 @@ value filter st = let bi = mk_meta m in <:module_expr< struct - value meta_string _loc s = $m.str$ _loc s; + value meta_string _loc s = $m.str$ _loc (safe_string_escaped s); value meta_int _loc s = $m.int$ _loc s; value meta_float _loc s = $m.flo$ _loc s; - value meta_char _loc s = $m.chr$ _loc s; + value meta_char _loc s = $m.chr$ _loc (String.escaped s); value meta_bool _loc = fun [ False -> $m_uid m "False"$ diff --git a/camlp4/Camlp4Top/Rprint.ml b/camlp4/Camlp4Top/Rprint.ml index d913efcc..0a177824 100644 --- a/camlp4/Camlp4Top/Rprint.ml +++ b/camlp4/Camlp4Top/Rprint.ml @@ -301,7 +301,9 @@ and print_ty_label ppf lab = ; value type_parameter ppf (ty, (co, cn)) = - fprintf ppf "%s'%s" (if not cn then "+" else if not co then "-" else "") + fprintf ppf "%s%s%s" + (if not cn then "+" else if not co then "-" else "") + (if ty = "_" then "" else "'") ty ; @@ -451,8 +453,13 @@ and print_out_type_decl kwd ppf (name, args, ty, priv, constraints) = print_kind ty2 | ty -> print_kind ppf ty ] in - fprintf ppf "@[<2>@[@[%s %t@] =%a@]%a@]" kwd type_defined - print_types ty print_constraints constraints + match ty with + [ Otyp_abstract -> + fprintf ppf "@[<2>@[@[%s %t@]@]%a@]" kwd type_defined + print_constraints constraints + | _ -> + fprintf ppf "@[<2>@[@[%s %t@] =%a@]%a@]" kwd type_defined + print_types ty print_constraints constraints ] ; (* Phrases *) diff --git a/camlp4/boot/Camlp4.ml b/camlp4/boot/Camlp4.ml index 4030702a..4d79a539 100644 --- a/camlp4/boot/Camlp4.ml +++ b/camlp4/boot/Camlp4.ml @@ -3531,7 +3531,7 @@ module Struct = let skip_opt_linefeed (__strm : _ Stream.t) = match Stream.peek __strm with - | Some '\010' -> (Stream.junk __strm; ()) + | Some '\n' -> (Stream.junk __strm; ()) | _ -> () let chr c = @@ -3541,8 +3541,8 @@ module Struct = let rec backslash (__strm : _ Stream.t) = match Stream.peek __strm with - | Some '\010' -> (Stream.junk __strm; '\010') - | Some '\013' -> (Stream.junk __strm; '\013') + | Some '\n' -> (Stream.junk __strm; '\n') + | Some '\r' -> (Stream.junk __strm; '\r') | Some 'n' -> (Stream.junk __strm; '\n') | Some 'r' -> (Stream.junk __strm; '\r') | Some 't' -> (Stream.junk __strm; '\t') @@ -3581,8 +3581,8 @@ module Struct = let rec backslash_in_string strict store (__strm : _ Stream.t) = match Stream.peek __strm with - | Some '\010' -> (Stream.junk __strm; skip_indent __strm) - | Some '\013' -> + | Some '\n' -> (Stream.junk __strm; skip_indent __strm) + | Some '\r' -> (Stream.junk __strm; let s = __strm in (skip_opt_linefeed s; skip_indent s)) | _ -> @@ -7418,13 +7418,15 @@ module Struct = module Expr = struct - let meta_string _loc s = Ast.ExStr (_loc, s) + let meta_string _loc s = + Ast.ExStr (_loc, (safe_string_escaped s)) let meta_int _loc s = Ast.ExInt (_loc, s) let meta_float _loc s = Ast.ExFlo (_loc, s) - let meta_char _loc s = Ast.ExChr (_loc, s) + let meta_char _loc s = + Ast.ExChr (_loc, (String.escaped s)) let meta_bool _loc = function @@ -9747,13 +9749,15 @@ module Struct = module Patt = struct - let meta_string _loc s = Ast.PaStr (_loc, s) + let meta_string _loc s = + Ast.PaStr (_loc, (safe_string_escaped s)) let meta_int _loc s = Ast.PaInt (_loc, s) let meta_float _loc s = Ast.PaFlo (_loc, s) - let meta_char _loc s = Ast.PaChr (_loc, s) + let meta_char _loc s = + Ast.PaChr (_loc, (String.escaped s)) let meta_bool _loc = function @@ -18955,7 +18959,7 @@ module Printers = "Cannot print %S this identifier does not respect OCaml lexing rules (%s)" str (Lexer.Error.to_string exn)) - let ocaml_char x = match x with | "'" -> "\\'" | c -> c + let ocaml_char x = Char.escaped (Struct.Token.Eval.char x) let rec get_expr_args a al = match a with @@ -19484,7 +19488,7 @@ module Printers = | Ast.ExInt64 (_, s) -> o#numeric f s "L" | Ast.ExInt32 (_, s) -> o#numeric f s "l" | Ast.ExFlo (_, s) -> o#numeric f s "" - | Ast.ExChr (_, s) -> pp f "'%s'" s + | Ast.ExChr (_, s) -> pp f "'%s'" (ocaml_char s) | Ast.ExId (_, i) -> o#var_ident f i | Ast.ExRec (_, b, (Ast.ExNil _)) -> pp f "@[@[{%a@]@ }@]" o#record_binding b @@ -19629,7 +19633,7 @@ module Printers = | Ast.PaInt32 (_, s) -> o#numeric f s "l" | Ast.PaInt (_, s) -> o#numeric f s "" | Ast.PaFlo (_, s) -> o#numeric f s "" - | Ast.PaChr (_, s) -> pp f "'%s'" s + | Ast.PaChr (_, s) -> pp f "'%s'" (ocaml_char s) | Ast.PaLab (_, s, (Ast.PaNil _)) -> pp f "~%s" s | Ast.PaVrn (_, s) -> pp f "`%a" o#var s | Ast.PaTyp (_, i) -> pp f "@[<2>#%a@]" o#ident i @@ -20487,6 +20491,8 @@ module Printers = else ()) | Ast.TyCol (_, t1, (Ast.TyMut (_, t2))) -> pp f "@[%a :@ mutable %a@]" o#ctyp t1 o#ctyp t2 + | Ast.TyMan (_, t1, t2) -> + pp f "@[<2>%a ==@ %a@]" o#simple_ctyp t1 o#ctyp t2 | t -> super#ctyp f t method simple_ctyp = fun f t -> diff --git a/camlp4/boot/Camlp4Ast.ml b/camlp4/boot/Camlp4Ast.ml index fb49d01b..0b9a3de0 100644 --- a/camlp4/boot/Camlp4Ast.ml +++ b/camlp4/boot/Camlp4Ast.ml @@ -471,10 +471,11 @@ module Make (Loc : Sig.Loc) : Sig.Camlp4Ast with module Loc = Loc = value meta_loc = meta_loc_expr; module Expr = struct - value meta_string _loc s = Ast.ExStr _loc s; + value meta_string _loc s = + Ast.ExStr _loc (safe_string_escaped s); value meta_int _loc s = Ast.ExInt _loc s; value meta_float _loc s = Ast.ExFlo _loc s; - value meta_char _loc s = Ast.ExChr _loc s; + value meta_char _loc s = Ast.ExChr _loc (String.escaped s); value meta_bool _loc = fun [ False -> Ast.ExId _loc (Ast.IdUid _loc "False") @@ -2577,10 +2578,11 @@ module Make (Loc : Sig.Loc) : Sig.Camlp4Ast with module Loc = Loc = value meta_loc = meta_loc_patt; module Patt = struct - value meta_string _loc s = Ast.PaStr _loc s; + value meta_string _loc s = + Ast.PaStr _loc (safe_string_escaped s); value meta_int _loc s = Ast.PaInt _loc s; value meta_float _loc s = Ast.PaFlo _loc s; - value meta_char _loc s = Ast.PaChr _loc s; + value meta_char _loc s = Ast.PaChr _loc (String.escaped s); value meta_bool _loc = fun [ False -> Ast.PaId _loc (Ast.IdUid _loc "False") diff --git a/camlp4/boot/camlp4boot.ml b/camlp4/boot/camlp4boot.ml index a434eea4..9f7a6d7b 100644 --- a/camlp4/boot/camlp4boot.ml +++ b/camlp4/boot/camlp4boot.ml @@ -3033,8 +3033,16 @@ New syntax:\ [ (None, (Some Camlp4.Sig.Grammar.RightA), [ ([ Gram.Snterm (Gram.Entry.obj - (labeled_ipatt : - 'labeled_ipatt Gram.Entry.t)); + (cvalue_binding : + 'cvalue_binding Gram.Entry.t)) ], + (Gram.Action.mk + (fun (bi : 'cvalue_binding) (_loc : Gram.Loc.t) + -> (bi : 'fun_binding)))); + ([ Gram.Stry + (Gram.Snterm + (Gram.Entry.obj + (labeled_ipatt : + 'labeled_ipatt Gram.Entry.t))); Gram.Sself ], (Gram.Action.mk (fun (e : 'fun_binding) (p : 'labeled_ipatt) @@ -3042,14 +3050,6 @@ New syntax:\ (Ast.ExFun (_loc, (Ast.McArr (_loc, p, (Ast.ExNil _loc), e))) : 'fun_binding)))); - ([ Gram.Stry - (Gram.Snterm - (Gram.Entry.obj - (cvalue_binding : - 'cvalue_binding Gram.Entry.t))) ], - (Gram.Action.mk - (fun (bi : 'cvalue_binding) (_loc : Gram.Loc.t) - -> (bi : 'fun_binding)))); ([ Gram.Stry (Gram.srules fun_binding [ ([ Gram.Skeyword "("; Gram.Skeyword "type" ], diff --git a/config/auto-aux/cfi.S b/config/auto-aux/cfi.S index e055423a..acd052df 100644 --- a/config/auto-aux/cfi.S +++ b/config/auto-aux/cfi.S @@ -1,3 +1,6 @@ -.cfi_startproc -.cfi_adjust_cfa_offset 8 -.cfi_endproc +camlPervasives__loop_1128: + .file 1 "pervasives.ml" + .loc 1 193 + .cfi_startproc + .cfi_adjust_cfa_offset 8 + .cfi_endproc diff --git a/config/auto-aux/tryassemble b/config/auto-aux/tryassemble index feffbed2..7cd5582c 100644 --- a/config/auto-aux/tryassemble +++ b/config/auto-aux/tryassemble @@ -5,3 +5,13 @@ $aspp -o tst $* || exit 100 else $aspp -o tst $* 2> /dev/null || exit 100 fi + +# test as also (if differs) +if test "$aspp" != "$as"; then +if test "$verbose" = yes; then +echo "tryassemble: $as -o tst $*" >&2 +$as -o tst $* || exit 100 +else +$as -o tst $* 2> /dev/null || exit 100 +fi +fi diff --git a/configure b/configure index 72f42408..e08bbce3 100755 --- a/configure +++ b/configure @@ -13,7 +13,7 @@ # # ######################################################################### -# $Id: configure 12567 2012-06-04 17:01:09Z doligez $ +# $Id: configure 12645 2012-06-26 15:33:50Z doligez $ configure_options="$*" prefix=/usr/local @@ -629,6 +629,7 @@ if test $withsharedlibs = "yes"; then case "$host" in *-*-cygwin*) natdynlink=true;; i[3456]86-*-linux*) natdynlink=true;; + i[3456]86-*-gnu*) natdynlink=true;; x86_64-*-linux*) natdynlink=true;; i[3456]86-*-darwin[89].*) natdynlink=true;; i[3456]86-*-darwin*) @@ -636,8 +637,8 @@ if test $withsharedlibs = "yes"; then natdynlink=true fi;; x86_64-*-darwin*) natdynlink=true;; - powerpc64-*-linux*) natdynlink=true;; - sparc-*-linux*) natdynlink=true;; + powerpc*-*-linux*) natdynlink=true;; + sparc*-*-linux*) natdynlink=true;; i686-*-kfreebsd*) natdynlink=true;; x86_64-*-kfreebsd*) natdynlink=true;; i[345]86-*-freebsd*) natdynlink=true;; @@ -1556,11 +1557,14 @@ fi asm_cfi_supported=false -export aspp +export as aspp if sh ./tryassemble cfi.S; then echo "#define ASM_CFI_SUPPORTED" >> m.h asm_cfi_supported=true + echo "Assembler supports CFI" +else + echo "Assembler does not support CFI" fi # Final twiddling of compiler options to work around known bugs diff --git a/debugger/envaux.mli b/debugger/envaux.mli index 836a37c6..14cbe2db 100644 --- a/debugger/envaux.mli +++ b/debugger/envaux.mli @@ -11,12 +11,13 @@ (* *) (***********************************************************************) -(* $Id: envaux.mli 11156 2011-07-27 14:17:02Z doligez $ *) +(* $Id: envaux.mli 12700 2012-07-11 17:23:37Z lefessan $ *) open Format (* Convert environment summaries to environments *) +val env_from_summary : Env.summary -> Subst.t -> Env.t val env_of_event: Instruct.debug_event option -> Env.t (* Empty the environment caches. To be called when load_path changes. *) diff --git a/debugger/loadprinter.ml b/debugger/loadprinter.ml index e3998fd6..44c0108a 100644 --- a/debugger/loadprinter.ml +++ b/debugger/loadprinter.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: loadprinter.ml 11284 2011-11-24 09:02:48Z garrigue $ *) +(* $Id: loadprinter.ml 12673 2012-07-09 12:40:51Z xclerc $ *) (* Loading and installation of user-defined printer functions *) @@ -95,6 +95,15 @@ let rec eval_path = function (* Install, remove a printer (as in toplevel/topdirs) *) +(* since 4.00, "topdirs.cmi" is not in the same directory as the standard + libray, so we load it beforehand as it cannot be found in the search path. *) +let () = + let compiler_libs = + Filename.concat Config.standard_library "compiler-libs" in + let topdirs = + Filename.concat compiler_libs "topdirs.cmi" in + ignore (Env.read_signature "Topdirs" topdirs) + let match_printer_type desc typename = let (printer_type, _) = try diff --git a/debugger/printval.ml b/debugger/printval.ml index 20f2be7d..ed9cf6ff 100644 --- a/debugger/printval.ml +++ b/debugger/printval.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: printval.ml 11156 2011-07-27 14:17:02Z doligez $ *) +(* $Id: printval.ml 12689 2012-07-10 14:54:19Z doligez $ *) (* To print values *) @@ -47,7 +47,7 @@ let check_depth ppf depth obj ty = module EvalPath = struct - type value = Debugcom.Remote_value.t + type valu = Debugcom.Remote_value.t exception Error let rec eval_path = function Pident id -> diff --git a/emacs/caml-types.el b/emacs/caml-types.el index 04e22373..4b9556c4 100644 --- a/emacs/caml-types.el +++ b/emacs/caml-types.el @@ -10,7 +10,7 @@ ;(* *) ;(***********************************************************************) -;(* $Id: caml-types.el 12149 2012-02-10 16:15:24Z doligez $ *) +;(* $Id: caml-types.el 12695 2012-07-10 17:49:46Z doligez $ *) ; An emacs-lisp complement to the "-annot" option of ocamlc and ocamlopt. @@ -594,7 +594,7 @@ The function uses two overlays. . One overlay delimits the largest region whose all subnodes are well-typed. . Another overlay delimits the current node under the mouse (whose type - annotation is beeing displayed). + annotation is being displayed). " (interactive "e") (set-buffer (window-buffer (caml-event-window event))) @@ -686,30 +686,30 @@ The function uses two overlays. target-pos (vector target-file target-line target-bol cnum)) (save-excursion - (setq node (caml-types-find-location "type" - target-pos () target-tree)) + (setq node (caml-types-find-location target-pos "type" () + target-tree)) (set-buffer caml-types-buffer) (erase-buffer) (cond - (node - (setq Left - (caml-types-get-pos target-buf (elt node 0)) - Right - (caml-types-get-pos target-buf (elt node 1))) - (move-overlay - caml-types-expr-ovl Left Right target-buf) - (setq limits - (caml-types-find-interval target-buf - target-pos node) - type (elt node 2)) - ) - (t + ((null node) (delete-overlay caml-types-expr-ovl) (setq type "*no type information*") (setq limits (caml-types-find-interval - target-buf target-pos target-tree)) + target-buf target-pos target-tree))) + (t + (let ((left + (caml-types-get-pos target-buf (elt node 0))) + (right + (caml-types-get-pos target-buf (elt node 1)))) + (move-overlay + caml-types-expr-ovl left right target-buf) + (setq limits + (caml-types-find-interval target-buf + target-pos node) + type (cdr (assoc "type" (elt node 2)))) )) + ) (setq mes (format "type: %s" type)) (insert type) )) diff --git a/ocamlbuild/findlib.ml b/ocamlbuild/findlib.ml index 873adbab..b5ef8781 100644 --- a/ocamlbuild/findlib.ml +++ b/ocamlbuild/findlib.ml @@ -112,8 +112,24 @@ let rec query name = | Lexers.Error s -> error (Cannot_parse_query (name, s)) +let split_nl s = + let x = ref [] in + let rec go s = + let pos = String.index s '\n' in + x := (String.before s pos)::!x; + go (String.after s (pos + 1)) + in + try + go s + with Not_found -> !x + +let before_space s = + try + String.before s (String.index s ' ') + with Not_found -> s + let list () = - run_and_parse Lexers.blank_sep_strings "%s list | cut -d' ' -f1" ocamlfind + List.map before_space (split_nl & run_and_read "%s list" ocamlfind) (* The closure algorithm is easy because the dependencies are already closed and sorted for each package. We only have to make the union. We could also diff --git a/ocamlbuild/ocaml_specific.ml b/ocamlbuild/ocaml_specific.ml index f996f48e..e23a0e99 100644 --- a/ocamlbuild/ocaml_specific.ml +++ b/ocamlbuild/ocaml_specific.ml @@ -382,10 +382,18 @@ flag ["ocaml"; "compile"] begin atomize !Options.ocaml_cflags end;; +flag ["c"; "compile"] begin + atomize !Options.ocaml_cflags +end;; + flag ["ocaml"; "link"] begin atomize !Options.ocaml_lflags end;; +flag ["c"; "link"] begin + atomize !Options.ocaml_lflags +end;; + flag ["ocaml"; "ocamlyacc"] (atomize !Options.ocaml_yaccflags);; flag ["ocaml"; "menhir"] (atomize !Options.ocaml_yaccflags);; flag ["ocaml"; "doc"] (atomize !Options.ocaml_docflags);; diff --git a/ocamldoc/Makefile b/ocamldoc/Makefile index b9dd6900..74c82d3f 100644 --- a/ocamldoc/Makefile +++ b/ocamldoc/Makefile @@ -9,7 +9,7 @@ #(* *) #(***********************************************************************) -# $Id: Makefile 12511 2012-05-30 13:29:48Z lefessan $ +# $Id: Makefile 12707 2012-07-13 11:23:13Z doligez $ include ../config/Makefile @@ -50,7 +50,9 @@ ODOC_TEST=odoc_test.cmo GENERATORS_CMOS= \ generators/odoc_todo.cmo \ generators/odoc_literate.cmo -GENERATORS_CMXS=$(GENERATORS_CMOS:.cmo=.cmxs) +GENERATORS_CMXS_TMP1=$(GENERATORS_CMOS:.cmo=.cmxs) +GENERATORS_CMXS_TMP2=$(NATDYNLINK:false=) +GENERATORS_CMXS=$(GENERATORS_CMXS_TMP2:true=$(GENERATORS_CMXS_TMP1)) # Compilation @@ -207,7 +209,7 @@ libopt: $(OCAMLDOC_LIBCMXA) $(OCAMLDOC_LIBCMI) generatorsopt: $(GENERATORS_CMXS) debug: - make OCAMLPP="" + $(MAKE) OCAMLPP="" $(OCAMLDOC): $(EXECMOFILES) $(OCAMLC) -o $@ -linkall unix.cma str.cma dynlink.cma $(LINKFLAGS) $(OCAMLCMOFILES) $(EXECMOFILES) @@ -215,9 +217,9 @@ $(OCAMLDOC_OPT): $(EXECMXFILES) $(OCAMLOPT) -o $@ -linkall unix.cmxa str.cmxa dynlink.cmxa $(LINKFLAGS) $(OCAMLCMXFILES) $(EXECMXFILES) $(OCAMLDOC_LIBCMA): $(LIBCMOFILES) - $(OCAMLC) -a -o $@ $(LINKFLAGS) $(OCAMLCMOFILES) $(LIBCMOFILES) + $(OCAMLC) -a -o $@ $(LINKFLAGS) $(OCAMLSRCDIR)/tools/depend.cmo $(LIBCMOFILES) $(OCAMLDOC_LIBCMXA): $(LIBCMXFILES) - $(OCAMLOPT) -a -o $@ $(LINKFLAGS) $(OCAMLCMXFILES) $(LIBCMXFILES) + $(OCAMLOPT) -a -o $@ $(LINKFLAGS) $(OCAMLSRCDIR)/tools/depend.cmx $(LIBCMXFILES) manpages: stdlib_man/Pervasives.3o diff --git a/ocamldoc/Makefile.nt b/ocamldoc/Makefile.nt index 8133f3ae..ad44bf8f 100644 --- a/ocamldoc/Makefile.nt +++ b/ocamldoc/Makefile.nt @@ -9,7 +9,7 @@ #(* *) #(***********************************************************************) -# $Id: Makefile.nt 12553 2012-06-04 12:39:11Z protzenk $ +# $Id: Makefile.nt 12692 2012-07-10 15:20:34Z doligez $ include ../config/Makefile @@ -187,7 +187,7 @@ opt.opt: exeopt libopt exeopt: $(OCAMLDOC_OPT) libopt: $(OCAMLDOC_LIBCMXA) $(OCAMLDOC_LIBCMI) debug: - make OCAMLPP="" + $(MAKE) OCAMLPP="" $(OCAMLDOC): $(EXECMOFILES) $(OCAMLC) -o $@ -linkall unix.cma str.cma dynlink.cma $(LINKFLAGS) $(OCAMLCMOFILES) $(EXECMOFILES) diff --git a/ocamldoc/odoc_name.ml b/ocamldoc/odoc_name.ml index 04a6808a..e937a00b 100644 --- a/ocamldoc/odoc_name.ml +++ b/ocamldoc/odoc_name.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_name.ml 10643 2010-08-02 14:37:22Z doligez $ *) +(* $Id: odoc_name.ml 12622 2012-06-21 05:46:28Z guesdon $ *) (** Representation of element names. *) @@ -215,3 +215,9 @@ let to_path n = | Some p -> p let from_longident = Odoc_misc.string_of_longident + +module Set = Set.Make (struct + type z = t + type t = z + let compare = String.compare +end) diff --git a/ocamldoc/odoc_name.mli b/ocamldoc/odoc_name.mli index 5b968657..8f21e53b 100644 --- a/ocamldoc/odoc_name.mli +++ b/ocamldoc/odoc_name.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_name.mli 10643 2010-08-02 14:37:22Z doligez $ *) +(* $Id: odoc_name.mli 12622 2012-06-21 05:46:28Z guesdon $ *) (** Representation of element names. *) @@ -67,3 +67,6 @@ val to_path : t -> Path.t (** Get a name from a [Longident.t].*) val from_longident : Longident.t -> t + +(** Set of Name.t *) +module Set : Set.S with type elt = t diff --git a/ocamldoc/odoc_sig.ml b/ocamldoc/odoc_sig.ml index a0eed49e..28772530 100644 --- a/ocamldoc/odoc_sig.ml +++ b/ocamldoc/odoc_sig.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_sig.ml 12511 2012-05-30 13:29:48Z lefessan $ *) +(* $Id: odoc_sig.ml 12622 2012-06-21 05:46:28Z guesdon $ *) (** Analysis of interface files. *) @@ -257,6 +257,38 @@ module Analyser = in Odoc_type.Type_record (List.map f l) + let erased_names_of_constraints constraints acc = + List.fold_right (fun (longident, constraint_) acc -> + match constraint_ with + | Parsetree.Pwith_type _ | Parsetree.Pwith_module _ -> acc + | Parsetree.Pwith_typesubst _ | Parsetree.Pwith_modsubst _ -> + Name.Set.add (Name.from_longident longident.txt) acc) + constraints acc + + let filter_out_erased_items_from_signature erased signature = + if Name.Set.is_empty erased then signature + else List.fold_right (fun sig_item acc -> + let take_item psig_desc = { sig_item with Parsetree.psig_desc } :: acc in + match sig_item.Parsetree.psig_desc with + | Parsetree.Psig_value (_, _) + | Parsetree.Psig_exception (_, _) + | Parsetree.Psig_open _ + | Parsetree.Psig_include _ + | Parsetree.Psig_class _ + | Parsetree.Psig_class_type _ as tp -> take_item tp + | Parsetree.Psig_type types -> + (match List.filter (fun (name, _) -> not (Name.Set.mem name.txt erased)) types with + | [] -> acc + | types -> take_item (Parsetree.Psig_type types)) + | Parsetree.Psig_module (name, _) + | Parsetree.Psig_modtype (name, _) as m -> + if Name.Set.mem name.txt erased then acc else take_item m + | Parsetree.Psig_recmodule mods -> + (match List.filter (fun (name, _) -> not (Name.Set.mem name.txt erased)) mods with + | [] -> acc + | mods -> take_item (Parsetree.Psig_recmodule mods))) + signature [] + (** Analysis of the elements of a class, from the information in the parsetree and in the class signature. @return the couple (inherited_class list, elements).*) let analyse_class_elements env current_class_name last_pos pos_limit @@ -1013,7 +1045,8 @@ module Analyser = (maybe_more, new_env, eles) (** Return a module_type_kind from a Parsetree.module_type and a Types.module_type *) - and analyse_module_type_kind env current_module_name module_type sig_module_type = + and analyse_module_type_kind + ?(erased = Name.Set.empty) env current_module_name module_type sig_module_type = match module_type.Parsetree.pmty_desc with Parsetree.Pmty_ident longident -> let name = @@ -1027,6 +1060,7 @@ module Analyser = | Parsetree.Pmty_signature ast -> ( + let ast = filter_out_erased_items_from_signature erased ast in (* we must have a signature in the module type *) match sig_module_type with Types.Mty_signature signat -> @@ -1057,7 +1091,7 @@ module Analyser = mp_kind = mp_kind ; } in - let k = analyse_module_type_kind env + let k = analyse_module_type_kind ~erased env current_module_name module_type2 body_module_type @@ -1069,13 +1103,15 @@ module Analyser = raise (Failure "Parsetree.Pmty_functor _ but not Types.Mty_functor _") ) - | Parsetree.Pmty_with (module_type2, _) -> + | Parsetree.Pmty_with (module_type2, constraints) -> (* of module_type * (Longident.t * with_constraint) list *) ( let loc_start = module_type2.Parsetree.pmty_loc.Location.loc_end.Lexing.pos_cnum in let loc_end = module_type.Parsetree.pmty_loc.Location.loc_end.Lexing.pos_cnum in let s = get_string_of_file loc_start loc_end in - let k = analyse_module_type_kind env current_module_name module_type2 sig_module_type in + let erased = erased_names_of_constraints constraints erased in + let k = analyse_module_type_kind ~erased env current_module_name module_type2 sig_module_type in + Module_type_with (k, s) ) @@ -1086,7 +1122,8 @@ module Analyser = Module_type_typeof s (** analyse of a Parsetree.module_type and a Types.module_type.*) - and analyse_module_kind env current_module_name module_type sig_module_type = + and analyse_module_kind + ?(erased = Name.Set.empty) env current_module_name module_type sig_module_type = match module_type.Parsetree.pmty_desc with Parsetree.Pmty_ident longident -> let k = analyse_module_type_kind env current_module_name module_type sig_module_type in @@ -1094,6 +1131,7 @@ module Analyser = | Parsetree.Pmty_signature signature -> ( + let signature = filter_out_erased_items_from_signature erased signature in match sig_module_type with Types.Mty_signature signat -> Module_struct @@ -1128,7 +1166,7 @@ module Analyser = mp_kind = mp_kind ; } in - let k = analyse_module_kind env + let k = analyse_module_kind ~erased env current_module_name module_type2 body_module_type @@ -1139,13 +1177,14 @@ module Analyser = (* if we're here something's wrong *) raise (Failure "Parsetree.Pmty_functor _ but not Types.Mty_functor _") ) - | Parsetree.Pmty_with (module_type2, _) -> + | Parsetree.Pmty_with (module_type2, constraints) -> (*of module_type * (Longident.t * with_constraint) list*) ( let loc_start = module_type2.Parsetree.pmty_loc.Location.loc_end.Lexing.pos_cnum in let loc_end = module_type.Parsetree.pmty_loc.Location.loc_end.Lexing.pos_cnum in let s = get_string_of_file loc_start loc_end in - let k = analyse_module_type_kind env current_module_name module_type2 sig_module_type in + let erased = erased_names_of_constraints constraints erased in + let k = analyse_module_type_kind ~erased env current_module_name module_type2 sig_module_type in Module_with (k, s) ) | Parsetree.Pmty_typeof module_expr -> diff --git a/ocamldoc/odoc_sig.mli b/ocamldoc/odoc_sig.mli index cd329970..cd2ca50a 100644 --- a/ocamldoc/odoc_sig.mli +++ b/ocamldoc/odoc_sig.mli @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_sig.mli 12511 2012-05-30 13:29:48Z lefessan $ *) +(* $Id: odoc_sig.mli 12622 2012-06-21 05:46:28Z guesdon $ *) (** The module for analysing a signature and source code and creating modules, classes, ..., elements.*) @@ -156,7 +156,7 @@ module Analyser : (** Return a module_type_kind from a Parsetree.module_type and a Types.module_type *) val analyse_module_type_kind : - Odoc_env.env -> Odoc_name.t -> + ?erased:Odoc_name.Set.t -> Odoc_env.env -> Odoc_name.t -> Parsetree.module_type -> Types.module_type -> Odoc_module.module_type_kind diff --git a/otherlibs/bigarray/mmap_unix.c b/otherlibs/bigarray/mmap_unix.c index ec0bfec6..971c7495 100644 --- a/otherlibs/bigarray/mmap_unix.c +++ b/otherlibs/bigarray/mmap_unix.c @@ -11,7 +11,11 @@ /* */ /***********************************************************************/ -/* $Id: mmap_unix.c 12326 2012-04-09 10:22:59Z xleroy $ */ +/* $Id: mmap_unix.c 12582 2012-06-07 12:17:44Z xleroy $ */ + +/* Needed (under Linux at least) to get pwrite's prototype in unistd.h. + Must be defined before the first system .h is included. */ +#define _XOPEN_SOURCE 500 #include #include diff --git a/otherlibs/labltk/browser/searchpos.ml b/otherlibs/labltk/browser/searchpos.ml index 0e5ab033..30d25a9d 100644 --- a/otherlibs/labltk/browser/searchpos.ml +++ b/otherlibs/labltk/browser/searchpos.ml @@ -12,7 +12,7 @@ (* *) (*************************************************************************) -(* $Id: searchpos.ml 12511 2012-05-30 13:29:48Z lefessan $ *) +(* $Id: searchpos.ml 12681 2012-07-10 08:33:16Z garrigue $ *) open Asttypes open StdLabels @@ -819,7 +819,6 @@ and search_pos_expr ~pos exp = search_pos_class_structure ~pos cls | Texp_pack modexp -> search_pos_module_expr modexp ~pos - | _ -> assert false (* TODO ................................... *) end; add_found_str (`Exp(`Expr, exp.exp_type)) ~env:exp.exp_env ~loc:exp.exp_loc end diff --git a/otherlibs/labltk/support/cltkFile.c b/otherlibs/labltk/support/cltkFile.c index 812e3cc3..be7ee8f6 100644 --- a/otherlibs/labltk/support/cltkFile.c +++ b/otherlibs/labltk/support/cltkFile.c @@ -14,11 +14,7 @@ /* */ /***********************************************************************/ -/* $Id: cltkFile.c 11156 2011-07-27 14:17:02Z doligez $ */ - -#ifdef __CYGWIN__ -#define _WIN32 -#endif +/* $Id: cltkFile.c 12716 2012-07-16 20:01:36Z doligez $ */ #ifdef _WIN32 #include diff --git a/otherlibs/systhreads/Makefile b/otherlibs/systhreads/Makefile index 3d3f8fb6..502498f1 100644 --- a/otherlibs/systhreads/Makefile +++ b/otherlibs/systhreads/Makefile @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile 11156 2011-07-27 14:17:02Z doligez $ +# $Id: Makefile 12585 2012-06-08 11:35:37Z xleroy $ include ../../config/Makefile @@ -30,7 +30,7 @@ all: libthreads.a threads.cma allopt: libthreadsnat.a threads.cmxa libthreads.a: $(BYTECODE_C_OBJS) - $(MKLIB) -o threads $(BYTECODE_C_OBJS) + $(MKLIB) -o threads $(BYTECODE_C_OBJS) -lpthread st_stubs_b.o: st_stubs.c st_posix.h $(BYTECC) -O -I../../byterun $(BYTECCCOMPOPTS) $(SHAREDCCCOMPOPTS) \ diff --git a/parsing/parser.mly b/parsing/parser.mly index f20f77de..cf48b9bb 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -10,7 +10,7 @@ /* */ /***********************************************************************/ -/* $Id: parser.mly 12511 2012-05-30 13:29:48Z lefessan $ */ +/* $Id: parser.mly 12638 2012-06-21 17:10:58Z frisch $ */ /* The parser definition */ @@ -1212,18 +1212,19 @@ expr_comma_list: | expr COMMA expr { [$3; $1] } ; record_expr: - simple_expr WITH lbl_expr_list opt_semi { (Some $1, List.rev $3) } - | lbl_expr_list opt_semi { (None, List.rev $1) } + simple_expr WITH lbl_expr_list { (Some $1, $3) } + | lbl_expr_list { (None, $1) } ; lbl_expr_list: + lbl_expr { [$1] } + | lbl_expr SEMI lbl_expr_list { $1 :: $3 } + | lbl_expr SEMI { [$1] } +; +lbl_expr: label_longident EQUAL expr - { [mkrhs $1 1,$3] } + { (mkrhs $1 1,$3) } | label_longident - { [mkrhs $1 1, exp_of_label $1 1] } - | lbl_expr_list SEMI label_longident EQUAL expr - { (mkrhs $3 3, $5) :: $1 } - | lbl_expr_list SEMI label_longident - { (mkrhs $3 3, exp_of_label $3 3) :: $1 } + { (mkrhs $1 1, exp_of_label $1 1) } ; field_expr_list: label EQUAL expr @@ -1280,9 +1281,9 @@ simple_pattern: { mkpat(Ppat_variant($1, None)) } | SHARP type_longident { mkpat(Ppat_type (mkrhs $2 2)) } - | LBRACE lbl_pattern_list record_pattern_end RBRACE - { mkpat(Ppat_record(List.rev $2, $3)) } - | LBRACE lbl_pattern_list opt_semi error + | LBRACE lbl_pattern_list RBRACE + { let (fields, closed) = $2 in mkpat(Ppat_record(fields, closed)) } + | LBRACE lbl_pattern_list error { unclosed "{" 1 "}" 4 } | LBRACKET pattern_semi_list opt_semi RBRACKET { reloc_pat (mktailpat (List.rev $2)) } @@ -1319,14 +1320,16 @@ pattern_semi_list: | pattern_semi_list SEMI pattern { $3 :: $1 } ; lbl_pattern_list: - label_longident EQUAL pattern { [(mkrhs $1 1, $3)] } - | label_longident { [(mkrhs $1 1, pat_of_label $1 1)] } - | lbl_pattern_list SEMI label_longident EQUAL pattern { (mkrhs $3 3, $5) :: $1 } - | lbl_pattern_list SEMI label_longident { (mkrhs $3 3, pat_of_label $3 3) :: $1 } -; -record_pattern_end: - opt_semi { Closed } - | SEMI UNDERSCORE opt_semi { Open } + lbl_pattern { [$1], Closed } + | lbl_pattern SEMI { [$1], Closed } + | lbl_pattern SEMI UNDERSCORE opt_semi { [$1], Open } + | lbl_pattern SEMI lbl_pattern_list { let (fields, closed) = $3 in $1 :: fields, closed } +; +lbl_pattern: + label_longident EQUAL pattern + { (mkrhs $1 1,$3) } + | label_longident + { (mkrhs $1 1, pat_of_label $1 1) } ; /* Primitive declarations */ diff --git a/stdlib/scanf.mli b/stdlib/scanf.mli index df77b8b3..2e9d4bc3 100644 --- a/stdlib/scanf.mli +++ b/stdlib/scanf.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: scanf.mli 12230 2012-03-13 16:10:02Z doligez $ *) +(* $Id: scanf.mli 12571 2012-06-05 18:21:50Z doligez $ *) (** Formatted input functions. *) @@ -140,7 +140,7 @@ val open_in_bin : file_name -> in_channel;; *) val close_in : in_channel -> unit;; -(** Closes the [Pervasives.input_channel] associated with the given +(** Closes the [Pervasives.in_channel] associated with the given [Scanning.in_channel] formatted input channel. @since 3.12.0 *) diff --git a/stdlib/stream.ml b/stdlib/stream.ml index 6e6d08c7..454c0f4a 100644 --- a/stdlib/stream.ml +++ b/stdlib/stream.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: stream.ml 11156 2011-07-27 14:17:02Z doligez $ *) +(* $Id: stream.ml 12683 2012-07-10 10:01:57Z scherer $ *) (* The fields of type t are not mutable to preserve polymorphism of the empty stream. This is type safe because the empty stream is never @@ -21,8 +21,8 @@ type 'a t = { count : int; data : 'a data } and 'a data = Sempty | Scons of 'a * 'a data - | Sapp of 'a data * 'a data - | Slazy of 'a data Lazy.t + | Sapp of 'a data * 'a t + | Slazy of 'a t Lazy.t | Sgen of 'a gen | Sbuffio of buffio and 'a gen = { mutable curr : 'a option option; func : int -> 'a option } @@ -42,26 +42,37 @@ let fill_buff b = b.len <- input b.ic b.buff 0 (String.length b.buff); b.ind <- 0 ;; -let rec get_data count d = match d with - (* Returns either Sempty or Scons(a, _) even when d is a generator - or a buffer. In those cases, the item a is seen as extracted from - the generator/buffer. - The count parameter is used for calling `Sgen-functions'. *) +let rec get_data s d = match d with + (* Only return a "forced stream", that is either Sempty or + Scons(a,_). If d is a generator or a buffer, the item a is seen as + extracted from the generator/buffer. + + Forcing also updates the "count" field of the delayed stream, + in the Sapp and Slazy cases (see slazy/lapp implementation below). *) Sempty | Scons (_, _) -> d - | Sapp (d1, d2) -> - begin match get_data count d1 with - Scons (a, d11) -> Scons (a, Sapp (d11, d2)) - | Sempty -> get_data count d2 + | Sapp (d1, s2) -> + begin match get_data s d1 with + Scons (a, d11) -> Scons (a, Sapp (d11, s2)) + | Sempty -> + set_count s s2.count; + get_data s s2.data | _ -> assert false end - | Sgen {curr = Some None; func = _ } -> Sempty - | Sgen ({curr = Some(Some a); func = f} as g) -> + | Sgen {curr = Some None; _ } -> Sempty + | Sgen ({curr = Some(Some a); _ } as g) -> g.curr <- None; Scons(a, d) - | Sgen g -> - begin match g.func count with + | Sgen ({curr = None; _} as g) -> + (* Warning: anyone using g thinks that an item has been read *) + begin match g.func s.count with None -> g.curr <- Some(None); Sempty - | Some a -> Scons(a, d) - (* Warning: anyone using g thinks that an item has been read *) + | Some a -> + (* One must not update g.curr here, because there Scons(a,d) + result of get_data, if the outer stream s was a Sapp, will + be used to update the outer stream to Scons(a,s): there is + already a memoization process at the outer layer. If g.curr + was updated here, the saved element would be produced twice, + once by the outer layer, once by Sgen/g.curr. *) + Scons(a, d) end | Sbuffio b -> if b.ind >= b.len then fill_buff b; @@ -69,7 +80,10 @@ let rec get_data count d = match d with let r = Obj.magic (String.unsafe_get b.buff b.ind) in (* Warning: anyone using g thinks that an item has been read *) b.ind <- succ b.ind; Scons(r, d) - | Slazy f -> get_data count (Lazy.force f) + | Slazy f -> + let s2 = Lazy.force f in + set_count s s2.count; + get_data s s2.data ;; let rec peek s = @@ -78,14 +92,20 @@ let rec peek s = Sempty -> None | Scons (a, _) -> Some a | Sapp (_, _) -> - begin match get_data s.count s.data with - Scons(a, _) as d -> set_data s d; Some a + begin match get_data s s.data with + | Scons(a, _) as d -> set_data s d; Some a | Sempty -> None | _ -> assert false end - | Slazy f -> set_data s (Lazy.force f); peek s - | Sgen {curr = Some a} -> a - | Sgen g -> let x = g.func s.count in g.curr <- Some x; x + | Slazy f -> + let s2 = Lazy.force f in + set_count s s2.count; + set_data s s2.data; + peek s + | Sgen {curr = Some a; _ } -> a + | Sgen ({curr = None; _ } as g) -> + let x = g.func s.count in + g.curr <- Some x; x | Sbuffio b -> if b.ind >= b.len then fill_buff b; if b.len == 0 then begin set_data s Sempty; None end @@ -157,18 +177,21 @@ let of_channel ic = (* Stream expressions builders *) -let iapp i s = {count = 0; data = Sapp (i.data, s.data)};; -let icons i s = {count = 0; data = Scons (i, s.data)};; -let ising i = {count = 0; data = Scons (i, Sempty)};; +(* In the slazy and lapp case, we can't statically predict the value + of the "count" field. We put a dummy 0 value, which will be updated + when the parameter stream is forced (see update code in [get_data] + and [peek]). *) -let lapp f s = - {count = 0; data = Slazy (lazy(Sapp ((f ()).data, s.data)))} -;; -let lcons f s = {count = 0; data = Slazy (lazy(Scons (f (), s.data)))};; -let lsing f = {count = 0; data = Slazy (lazy(Scons (f (), Sempty)))};; +let ising i = {count = 0; data = Scons (i, Sempty)};; +let icons i s = {count = s.count - 1; data = Scons (i, s.data)};; +let iapp i s = {count = i.count; data = Sapp (i.data, s)};; let sempty = {count = 0; data = Sempty};; -let slazy f = {count = 0; data = Slazy (lazy(f ()).data)};; +let slazy f = {count = 0; data = Slazy (lazy (f()))};; + +let lsing f = {count = 0; data = Slazy (lazy (ising (f())))};; +let lcons f s = {count = 0; data = Slazy (lazy (icons (f()) s))};; +let lapp f s = {count = 0; data = Slazy (lazy(iapp (f()) s))};; (* For debugging use *) @@ -188,11 +211,11 @@ and dump_data f = print_string ", "; dump_data f d; print_string ")" - | Sapp (d1, d2) -> + | Sapp (d1, s2) -> print_string "Sapp ("; dump_data f d1; print_string ", "; - dump_data f d2; + dump f s2; print_string ")" | Slazy _ -> print_string "Slazy" | Sgen _ -> print_string "Sgen" diff --git a/testsuite/Makefile b/testsuite/Makefile index b8aac46e..d454f53d 100644 --- a/testsuite/Makefile +++ b/testsuite/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile 11135 2011-07-21 07:13:25Z xclerc $ +# $Id: Makefile 12579 2012-06-06 15:46:37Z doligez $ BASEDIR=${PWD} NO_PRINT=`($(MAKE) empty --no-print-directory > /dev/null 2>&1) && echo '--no-print-directory' || echo ''` diff --git a/testsuite/makefiles/Makefile.one b/testsuite/makefiles/Makefile.one index 7b252160..9a7c5278 100644 --- a/testsuite/makefiles/Makefile.one +++ b/testsuite/makefiles/Makefile.one @@ -1,4 +1,4 @@ -# $Id: Makefile.one 12551 2012-06-04 11:40:59Z doligez $ +# $Id: Makefile.one 12649 2012-06-27 12:29:20Z doligez $ CMI_FILES=$(MODULES:=.cmi) CMO_FILES=$(MODULES:=.cmo) @@ -20,7 +20,7 @@ ADD_CFLAGS+=$(CUSTOM_FLAG) default: compile run -compile: $(ML_FILES) $(CMO_FILES) $(CMX_FILES) $(MAIN_MODULE).cmo $(MAIN_MODULE).cmx +compile: $(ML_FILES) $(CMO_FILES) $(MAIN_MODULE).cmo @for file in $(C_FILES); do \ $(NATIVECC) $(NATIVECCCOMPOPTS) -c -I$(TOPDIR)/byterun $$file.c; \ done; @@ -28,6 +28,7 @@ compile: $(ML_FILES) $(CMO_FILES) $(CMX_FILES) $(MAIN_MODULE).cmo $(MAIN_MODULE) @$(OCAMLC) $(ADD_COMPFLAGS) $(ADD_CFLAGS) -o program.byte $(O_FILES) $(CMA_FILES) $(CMO_FILES) $(ADD_CMO_FILES) $(MAIN_MODULE).cmo @if [ -z "$(BYTECODE_ONLY)" ]; then \ rm -f program.native program.native.exe; \ + $(MAKE) $(CMX_FILES) $(MAIN_MODULE).cmx; \ $(OCAMLOPT) $(ADD_COMPFLAGS) -o program.native $(O_FILES) $(CMXA_FILES) $(CMX_FILES) $(ADD_CMX_FILES) $(MAIN_MODULE).cmx; \ fi diff --git a/testsuite/makefiles/Makefile.several b/testsuite/makefiles/Makefile.several index 66a7674b..54df8236 100644 --- a/testsuite/makefiles/Makefile.several +++ b/testsuite/makefiles/Makefile.several @@ -1,4 +1,4 @@ -# $Id: Makefile.several 12551 2012-06-04 11:40:59Z doligez $ +# $Id: Makefile.several 12618 2012-06-19 14:17:41Z doligez $ CC=$(NATIVECC) $(NATIVECCCOMPOPTS) FC=$(FORTAN_COMPILER) @@ -47,12 +47,12 @@ run-file: sh `basename $(FILE) ml`runner; \ else \ ./program $(PROGRAM_ARGS) > `basename $(FILE) ml`result; \ - fi + fi || (echo " => failed" && exit 1) @if [ -f `basename $(FILE) ml`checker ]; then \ sh `basename $(FILE) ml`checker; \ else \ - $(DIFF) `basename $(FILE) ml`reference `basename $(FILE) ml`result > /dev/null || (echo " => failed" && exit 1); \ - fi + $(DIFF) `basename $(FILE) ml`reference `basename $(FILE) ml`result > /dev/null; \ + fi || (echo " => failed" && exit 1) promote: defaultpromote diff --git a/testsuite/tests/asmcomp/Makefile b/testsuite/tests/asmcomp/Makefile index fb1af49c..8143873d 100644 --- a/testsuite/tests/asmcomp/Makefile +++ b/testsuite/tests/asmcomp/Makefile @@ -1,4 +1,5 @@ BASEDIR=../.. + CC=$(NATIVECC) CFLAGS=$(NATIVECCCOMPOPTS) -g @@ -141,11 +142,11 @@ clean: defaultclean @rm -f parsecmm.ml parsecmm.mli lexcmm.ml @rm -f $(CASES:=.s) +include $(BASEDIR)/makefiles/Makefile.common + power.o: power-$(SYSTEM).o @cp power-$(SYSTEM).o power.o promote: -include $(BASEDIR)/makefiles/Makefile.common - arch: $(ARCH).o diff --git a/testsuite/tests/asmcomp/i386.S b/testsuite/tests/asmcomp/i386.S index fdda4de4..19041085 100644 --- a/testsuite/tests/asmcomp/i386.S +++ b/testsuite/tests/asmcomp/i386.S @@ -10,12 +10,13 @@ /* */ /***********************************************************************/ -/* $Id: i386.S 11156 2011-07-27 14:17:02Z doligez $ */ +/* $Id: i386.S 12649 2012-06-27 12:29:20Z doligez $ */ /* Linux with ELF binaries does not prefix identifiers with _. Linux with a.out binaries, FreeBSD, and NextStep do. */ -#ifdef SYS_linux_elf +#if defined(SYS_linux_elf) || defined(SYS_bsd_elf) \ + || defined(SYS_solaris) || defined(SYS_beos) || defined(SYS_gnu) #define G(x) x #define FUNCTION_ALIGN 16 #else diff --git a/testsuite/tests/asmcomp/sparc.S b/testsuite/tests/asmcomp/sparc.S index 7d17548d..8f2c8354 100644 --- a/testsuite/tests/asmcomp/sparc.S +++ b/testsuite/tests/asmcomp/sparc.S @@ -10,9 +10,9 @@ /* */ /***********************************************************************/ -/* $Id: sparc.S 11156 2011-07-27 14:17:02Z doligez $ */ +/* $Id: sparc.S 12649 2012-06-27 12:29:20Z doligez $ */ -#ifndef SYS_solaris +#if defined(SYS_solaris) || defined(SYS_elf) #define Call_gen_code _call_gen_code #define Caml_c_call _caml_c_call #else diff --git a/testsuite/tests/lib-scanf-2/Makefile b/testsuite/tests/lib-scanf-2/Makefile index 216b3963..7362fad9 100644 --- a/testsuite/tests/lib-scanf-2/Makefile +++ b/testsuite/tests/lib-scanf-2/Makefile @@ -2,10 +2,11 @@ BASEDIR=../.. default: compile run -compile: tscanf2_io.cmo tscanf2_io.cmx +compile: tscanf2_io.cmo @$(OCAMLC) unix.cma tscanf2_io.cmo -o master.byte tscanf2_master.ml @$(OCAMLC) tscanf2_io.cmo -o slave.byte tscanf2_slave.ml @if [ -z "$(BYTECODE_ONLY)" ]; then \ + $(MAKE) tscanf2_io.cmx; \ $(OCAMLOPT) unix.cmxa tscanf2_io.cmx -o master.native tscanf2_master.ml; \ $(OCAMLOPT) tscanf2_io.cmx -o slave.native tscanf2_slave.ml; \ fi diff --git a/testsuite/tests/lib-stream/Makefile b/testsuite/tests/lib-stream/Makefile new file mode 100644 index 00000000..65ecf125 --- /dev/null +++ b/testsuite/tests/lib-stream/Makefile @@ -0,0 +1,4 @@ +BASEDIR=../.. +MODULES=testing +include $(BASEDIR)/makefiles/Makefile.several +include $(BASEDIR)/makefiles/Makefile.common diff --git a/testsuite/tests/lib-stream/count_concat_bug.ml b/testsuite/tests/lib-stream/count_concat_bug.ml new file mode 100644 index 00000000..97ec6bce --- /dev/null +++ b/testsuite/tests/lib-stream/count_concat_bug.ml @@ -0,0 +1,57 @@ +let is_empty s = + try Stream.empty s; true with Stream.Failure -> false + +let test_icons = + let s = Stream.of_string "ab" in + let s = Stream.icons 'c' s in + Testing.test (Stream.next s = 'c'); + Testing.test (Stream.next s = 'a'); + Testing.test (Stream.next s = 'b'); + Testing.test (is_empty s); + () + +let test_lcons = + let s = Stream.of_string "ab" in + let s = Stream.lcons (fun () -> 'c') s in + Testing.test (Stream.next s = 'c'); + Testing.test (Stream.next s = 'a'); + Testing.test (Stream.next s = 'b'); + Testing.test (is_empty s); + () + +let test_iapp = + let s = Stream.of_string "ab" in + let s = Stream.iapp (Stream.of_list ['c']) s in + Testing.test (Stream.next s = 'c'); + Testing.test (Stream.next s = 'a'); + Testing.test (Stream.next s = 'b'); + Testing.test (is_empty s); + () + +let test_lapp_right = + let s1 = Stream.of_list ['c'] in + let s2 = Stream.of_string "ab" in + let s = Stream.lapp (fun () -> s1) s2 in + Testing.test (Stream.next s = 'c'); + Testing.test (Stream.next s = 'a'); + Testing.test (Stream.next s = 'b'); + Testing.test (is_empty s); + () + +let test_lapp_left = + let s1 = Stream.of_string "bc" in + let s2 = Stream.of_list ['a'] in + Testing.test (Stream.next s1 = 'b'); + let s = Stream.lapp (fun () -> s1) s2 in + Testing.test (Stream.next s = 'c'); + Testing.test (Stream.next s = 'a'); + Testing.test (is_empty s); + () + +let test_slazy = + let s = Stream.of_string "ab" in + Testing.test (Stream.next s = 'a'); + let s = Stream.slazy (fun () -> s) in + Testing.test (Stream.next s = 'b'); + Testing.test (is_empty s); + () diff --git a/testsuite/tests/lib-stream/count_concat_bug.reference b/testsuite/tests/lib-stream/count_concat_bug.reference new file mode 100644 index 00000000..acdc75ca --- /dev/null +++ b/testsuite/tests/lib-stream/count_concat_bug.reference @@ -0,0 +1,2 @@ +0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 +All tests succeeded. diff --git a/testsuite/tests/lib-threads/test1.checker b/testsuite/tests/lib-threads/test1.checker index cbfe7ce5..1d104572 100644 --- a/testsuite/tests/lib-threads/test1.checker +++ b/testsuite/tests/lib-threads/test1.checker @@ -1 +1 @@ -sort test1.result | diff -q test1.reference - +LC_ALL=C sort test1.result | diff -q test1.reference - diff --git a/testsuite/tests/lib-threads/test4.checker b/testsuite/tests/lib-threads/test4.checker index ae27a0d5..b8661a98 100644 --- a/testsuite/tests/lib-threads/test4.checker +++ b/testsuite/tests/lib-threads/test4.checker @@ -1 +1 @@ -sort -u test4.result | diff -q test4.reference - +LC_ALL=C sort -u test4.result | diff -q test4.reference - diff --git a/testsuite/tests/lib-threads/test5.checker b/testsuite/tests/lib-threads/test5.checker index 030fcc91..e9918757 100644 --- a/testsuite/tests/lib-threads/test5.checker +++ b/testsuite/tests/lib-threads/test5.checker @@ -1 +1 @@ -sort -u test5.result | diff -q test5.reference - +LC_ALL=C sort -u test5.result | diff -q test5.reference - diff --git a/testsuite/tests/lib-threads/test6.checker b/testsuite/tests/lib-threads/test6.checker index 40ab24f8..d2e9930a 100644 --- a/testsuite/tests/lib-threads/test6.checker +++ b/testsuite/tests/lib-threads/test6.checker @@ -1 +1 @@ -sort -u test6.result | diff -q test6.reference - +LC_ALL=C sort -u test6.result | diff -q test6.reference - diff --git a/testsuite/tests/lib-threads/testA.checker b/testsuite/tests/lib-threads/testA.checker index 4c309401..9f5d00a8 100644 --- a/testsuite/tests/lib-threads/testA.checker +++ b/testsuite/tests/lib-threads/testA.checker @@ -1 +1 @@ -sort testA.result | diff -q testA.reference - +LC_ALL=C sort testA.result | diff -q testA.reference - diff --git a/testsuite/tests/lib-threads/testexit.checker b/testsuite/tests/lib-threads/testexit.checker index 5834e5d0..c1182d6f 100644 --- a/testsuite/tests/lib-threads/testexit.checker +++ b/testsuite/tests/lib-threads/testexit.checker @@ -1 +1 @@ -sort testexit.result | diff -q testexit.reference - +LC_ALL=C sort testexit.result | diff -q testexit.reference - diff --git a/testsuite/tests/regression/pr5233/Makefile b/testsuite/tests/regression/pr5233/Makefile new file mode 100644 index 00000000..c7a1ed0e --- /dev/null +++ b/testsuite/tests/regression/pr5233/Makefile @@ -0,0 +1,4 @@ +MAIN_MODULE=pr5233 + +include ../../../makefiles/Makefile.one +include ../../../makefiles/Makefile.common diff --git a/testsuite/tests/regression/pr5233/pr5233.ml b/testsuite/tests/regression/pr5233/pr5233.ml new file mode 100644 index 00000000..d0b5f762 --- /dev/null +++ b/testsuite/tests/regression/pr5233/pr5233.ml @@ -0,0 +1,50 @@ +open Printf;; + +(* PR#5233: Create a dangling pointer and use it to access random parts + of the heap. *) + +(* The buggy weak array will end up in smuggle. *) +let smuggle = ref (Weak.create 1);; + +(* This will be the weak array (W). *) +let t = ref (Weak.create 1);; + +(* Set a finalisation function on W. *) +Gc.finalise (fun w -> smuggle := w) !t;; + +(* Free W and run its finalisation function. *) +t := Weak.create 1;; +Gc.full_major ();; + +(* smuggle now contains W, whose pointers are not erased, even + when the contents is deallocated. *) + +let size = 1_000_000;; + +let check o = + printf "checking..."; + match o with + | None -> printf " no value\n"; + | Some s -> + printf " value found / testing..."; + for i = 0 to size - 1 do + if s.[i] != ' ' then failwith "bad"; + done; + printf " ok\n"; +;; + +Weak.set !smuggle 0 (Some (String.make size ' '));; + +(* Check the data just to make sure. *) +check (Weak.get !smuggle 0);; + +(* Get a dangling pointer in W. *) +Gc.full_major ();; + +(* Fill the heap with other stuff. *) +let rec fill n accu = if n = 0 then accu else fill (n-1) (123 :: accu);; +let r = fill ((Gc.stat ()).Gc.heap_words / 3) [];; +Gc.minor ();; + +(* Now follow the dangling pointer and exhibit the problem. *) +check (Weak.get !smuggle 0);; diff --git a/testsuite/tests/regression/pr5233/pr5233.reference b/testsuite/tests/regression/pr5233/pr5233.reference new file mode 100644 index 00000000..ef728f63 --- /dev/null +++ b/testsuite/tests/regression/pr5233/pr5233.reference @@ -0,0 +1,2 @@ +checking... value found / testing... ok +checking... no value diff --git a/testsuite/tests/typing-gadts/pr5689.ml b/testsuite/tests/typing-gadts/pr5689.ml new file mode 100644 index 00000000..304f8e6c --- /dev/null +++ b/testsuite/tests/typing-gadts/pr5689.ml @@ -0,0 +1,74 @@ +type inkind = [ `Link | `Nonlink ] + +type _ inline_t = + | Text: string -> [< inkind > `Nonlink ] inline_t + | Bold: 'a inline_t list -> 'a inline_t + | Link: string -> [< inkind > `Link ] inline_t + | Mref: string * [ `Nonlink ] inline_t list -> [< inkind > `Link ] inline_t +;; + +let uppercase seq = + let rec process: type a. a inline_t -> a inline_t = function + | Text txt -> Text (String.uppercase txt) + | Bold xs -> Bold (List.map process xs) + | Link lnk -> Link lnk + | Mref (lnk, xs) -> Mref (lnk, List.map process xs) + in List.map process seq +;; + +type ast_t = + | Ast_Text of string + | Ast_Bold of ast_t list + | Ast_Link of string + | Ast_Mref of string * ast_t list +;; + +let inlineseq_from_astseq seq = + let rec process_nonlink = function + | Ast_Text txt -> Text txt + | Ast_Bold xs -> Bold (List.map process_nonlink xs) + | _ -> assert false in + let rec process_any = function + | Ast_Text txt -> Text txt + | Ast_Bold xs -> Bold (List.map process_any xs) + | Ast_Link lnk -> Link lnk + | Ast_Mref (lnk, xs) -> Mref (lnk, List.map process_nonlink xs) + in List.map process_any seq +;; + +(* OK *) +type _ linkp = + | Nonlink : [ `Nonlink ] linkp + | Maylink : inkind linkp +;; +let inlineseq_from_astseq seq = + let rec process : type a. a linkp -> ast_t -> a inline_t = + fun allow_link ast -> + match (allow_link, ast) with + | (Maylink, Ast_Text txt) -> Text txt + | (Nonlink, Ast_Text txt) -> Text txt + | (x, Ast_Bold xs) -> Bold (List.map (process x) xs) + | (Maylink, Ast_Link lnk) -> Link lnk + | (Nonlink, Ast_Link _) -> assert false + | (Maylink, Ast_Mref (lnk, xs)) -> + Mref (lnk, List.map (process Nonlink) xs) + | (Nonlink, Ast_Mref _) -> assert false + in List.map (process Maylink) seq +;; + +(* Bad *) +type _ linkp2 = Kind : 'a linkp -> ([< inkind ] as 'a) linkp2 +;; +let inlineseq_from_astseq seq = +let rec process : type a. a linkp2 -> ast_t -> a inline_t = + fun allow_link ast -> + match (allow_link, ast) with + | (Kind _, Ast_Text txt) -> Text txt + | (x, Ast_Bold xs) -> Bold (List.map (process x) xs) + | (Kind Maylink, Ast_Link lnk) -> Link lnk + | (Kind Nonlink, Ast_Link _) -> assert false + | (Kind Maylink, Ast_Mref (lnk, xs)) -> + Mref (lnk, List.map (process (Kind Nonlink)) xs) + | (Kind Nonlink, Ast_Mref _) -> assert false + in List.map (process (Kind Maylink)) seq +;; diff --git a/testsuite/tests/typing-gadts/pr5689.ml.principal.reference b/testsuite/tests/typing-gadts/pr5689.ml.principal.reference new file mode 100644 index 00000000..f1e142aa --- /dev/null +++ b/testsuite/tests/typing-gadts/pr5689.ml.principal.reference @@ -0,0 +1,28 @@ + +# type inkind = [ `Link | `Nonlink ] +type _ inline_t = + Text : string -> [< inkind > `Nonlink ] inline_t + | Bold : 'a inline_t list -> 'a inline_t + | Link : string -> [< inkind > `Link ] inline_t + | Mref : string * + [ `Nonlink ] inline_t list -> [< inkind > `Link ] inline_t +# val uppercase : 'a inline_t list -> 'a inline_t list = +# type ast_t = + Ast_Text of string + | Ast_Bold of ast_t list + | Ast_Link of string + | Ast_Mref of string * ast_t list +# val inlineseq_from_astseq : ast_t list -> inkind inline_t list = +# type _ linkp = Nonlink : [ `Nonlink ] linkp | Maylink : inkind linkp +# val inlineseq_from_astseq : ast_t list -> inkind inline_t list = +# type _ linkp2 = Kind : 'a linkp -> ([< inkind ] as 'a) linkp2 +# Characters 272-279: + | (Kind Maylink, Ast_Link lnk) -> Link lnk + ^^^^^^^ +Error: This pattern matches values of type inkind linkp + but a pattern was expected which matches values of type + ([< inkind ] as 'a) linkp + Type inkind = [ `Link | `Nonlink ] is not compatible with type + 'a = [< `Link | `Nonlink ] + Types for tag `Nonlink are incompatible +# diff --git a/testsuite/tests/typing-gadts/pr5689.ml.reference b/testsuite/tests/typing-gadts/pr5689.ml.reference new file mode 100644 index 00000000..f1e142aa --- /dev/null +++ b/testsuite/tests/typing-gadts/pr5689.ml.reference @@ -0,0 +1,28 @@ + +# type inkind = [ `Link | `Nonlink ] +type _ inline_t = + Text : string -> [< inkind > `Nonlink ] inline_t + | Bold : 'a inline_t list -> 'a inline_t + | Link : string -> [< inkind > `Link ] inline_t + | Mref : string * + [ `Nonlink ] inline_t list -> [< inkind > `Link ] inline_t +# val uppercase : 'a inline_t list -> 'a inline_t list = +# type ast_t = + Ast_Text of string + | Ast_Bold of ast_t list + | Ast_Link of string + | Ast_Mref of string * ast_t list +# val inlineseq_from_astseq : ast_t list -> inkind inline_t list = +# type _ linkp = Nonlink : [ `Nonlink ] linkp | Maylink : inkind linkp +# val inlineseq_from_astseq : ast_t list -> inkind inline_t list = +# type _ linkp2 = Kind : 'a linkp -> ([< inkind ] as 'a) linkp2 +# Characters 272-279: + | (Kind Maylink, Ast_Link lnk) -> Link lnk + ^^^^^^^ +Error: This pattern matches values of type inkind linkp + but a pattern was expected which matches values of type + ([< inkind ] as 'a) linkp + Type inkind = [ `Link | `Nonlink ] is not compatible with type + 'a = [< `Link | `Nonlink ] + Types for tag `Nonlink are incompatible +# diff --git a/testsuite/tests/typing-misc/Makefile b/testsuite/tests/typing-misc/Makefile new file mode 100644 index 00000000..5f42b705 --- /dev/null +++ b/testsuite/tests/typing-misc/Makefile @@ -0,0 +1,4 @@ +BASEDIR=../.. +include $(BASEDIR)/makefiles/Makefile.toplevel +include $(BASEDIR)/makefiles/Makefile.common + diff --git a/testsuite/tests/typing-misc/constraints.ml b/testsuite/tests/typing-misc/constraints.ml new file mode 100644 index 00000000..5408ca2c --- /dev/null +++ b/testsuite/tests/typing-misc/constraints.ml @@ -0,0 +1,16 @@ +type 'a t = [`A of 'a t t] as 'a;; (* fails *) + +type 'a t = [`A of 'a t t];; (* fails *) + +type 'a t = [`A of 'a t t] constraint 'a = 'a t;; + +type 'a t = [`A of 'a t] constraint 'a = 'a t;; + +type 'a t = [`A of 'a] as 'a;; + +type 'a v = [`A of u v] constraint 'a = t and t = u and u = t;; (* fails *) + +type 'a t = 'a;; +let f (x : 'a t as 'a) = ();; (* fails *) + +let f (x : 'a t) (y : 'a) = x = y;; diff --git a/testsuite/tests/typing-misc/constraints.ml.reference b/testsuite/tests/typing-misc/constraints.ml.reference new file mode 100644 index 00000000..fe520440 --- /dev/null +++ b/testsuite/tests/typing-misc/constraints.ml.reference @@ -0,0 +1,29 @@ + +# Characters 12-32: + type 'a t = [`A of 'a t t] as 'a;; (* fails *) + ^^^^^^^^^^^^^^^^^^^^ +Error: Constraints are not satisfied in this type. + Type + [ `A of 'a ] t t as 'a + should be an instance of + ([ `A of 'b t t ] as 'b) t +# Characters 5-27: + type 'a t = [`A of 'a t t];; (* fails *) + ^^^^^^^^^^^^^^^^^^^^^^ +Error: In the definition of t, type 'a t t should be 'a t +# type 'a t = [ `A of 'a t t ] constraint 'a = 'a t +# type 'a t = [ `A of 'a t ] constraint 'a = 'a t +# type 'a t = 'a constraint 'a = [ `A of 'a ] +# Characters 47-52: + type 'a v = [`A of u v] constraint 'a = t and t = u and u = t;; (* fails *) + ^^^^^ +Error: The type abbreviation t is cyclic +# type 'a t = 'a +# Characters 11-21: + let f (x : 'a t as 'a) = ();; (* fails *) + ^^^^^^^^^^ +Error: This alias is bound to type 'a t = 'a + but is used as an instance of type 'a + The type variable 'a occurs inside 'a +# val f : 'a t -> 'a -> bool = +# diff --git a/testsuite/tests/typing-misc/records.ml b/testsuite/tests/typing-misc/records.ml new file mode 100644 index 00000000..36fa5ec7 --- /dev/null +++ b/testsuite/tests/typing-misc/records.ml @@ -0,0 +1,12 @@ +(* undefined labels *) +type t = {x:int;y:int};; +{x=3;z=2};; +fun {x=3;z=2} -> ();; + +(* mixed labels *) +{x=3; contents=2};; + +(* private types *) +type u = private {mutable u:int};; +{u=3};; +fun x -> x.u <- 3;; diff --git a/testsuite/tests/typing-misc/records.ml.reference b/testsuite/tests/typing-misc/records.ml.reference new file mode 100644 index 00000000..d69991a2 --- /dev/null +++ b/testsuite/tests/typing-misc/records.ml.reference @@ -0,0 +1,25 @@ + +# type t = { x : int; y : int; } +# Characters 5-6: + {x=3;z=2};; + ^ +Error: Unbound record field label z +# Characters 9-10: + fun {x=3;z=2} -> ();; + ^ +Error: Unbound record field label z +# Characters 26-34: + {x=3; contents=2};; + ^^^^^^^^ +Error: The record field label Pervasives.contents belongs to the type + 'a ref but is mixed here with labels of type t +# type u = private { mutable u : int; } +# Characters 0-5: + {u=3};; + ^^^^^ +Error: Cannot create values of the private type u +# Characters 11-12: + fun x -> x.u <- 3;; + ^ +Error: Cannot assign field u of the private type u +# diff --git a/testsuite/tests/typing-typeparam/Makefile b/testsuite/tests/typing-typeparam/Makefile index 748631f9..5f42b705 100644 --- a/testsuite/tests/typing-typeparam/Makefile +++ b/testsuite/tests/typing-typeparam/Makefile @@ -1,7 +1,4 @@ -#MODULES= BASEDIR=../.. -MAIN_MODULE=newtype -ADD_COMPFLAGS=-w a - -include $(BASEDIR)/makefiles/Makefile.one +include $(BASEDIR)/makefiles/Makefile.toplevel include $(BASEDIR)/makefiles/Makefile.common + diff --git a/testsuite/tests/typing-typeparam/newtype.ml b/testsuite/tests/typing-typeparam/newtype.ml index 24eb2fcf..abe58763 100644 --- a/testsuite/tests/typing-typeparam/newtype.ml +++ b/testsuite/tests/typing-typeparam/newtype.ml @@ -1,6 +1,7 @@ let property (type t) () = let module M = struct exception E of t end in (fun x -> M.E x), (function M.E x -> Some x | _ -> None) +;; let () = let (int_inj, int_proj) = property () in @@ -13,15 +14,19 @@ let () = Printf.printf "%b\n%!" (int_proj s = None); Printf.printf "%b\n%!" (string_proj i = None); Printf.printf "%b\n%!" (string_proj s = None) - - - +;; let sort_uniq (type s) cmp l = let module S = Set.Make(struct type t = s let compare = cmp end) in S.elements (List.fold_right S.add l S.empty) +;; let () = print_endline (String.concat "," (sort_uniq compare [ "abc"; "xyz"; "abc" ])) +;; - +let f x (type a) (y : a) = (x = y);; (* Fails *) +class ['a] c = object (self) + method m : 'a -> 'a = fun x -> x + method n : 'a -> 'a = fun (type g) (x:g) -> self#m x +end;; (* Fails *) diff --git a/testsuite/tests/typing-typeparam/newtype.ml.reference b/testsuite/tests/typing-typeparam/newtype.ml.reference new file mode 100644 index 00000000..c28cf53a --- /dev/null +++ b/testsuite/tests/typing-typeparam/newtype.ml.reference @@ -0,0 +1,19 @@ + +# val property : unit -> ('a -> exn) * (exn -> 'a option) = +# false +true +true +false +# val sort_uniq : ('a -> 'a -> int) -> 'a list -> 'a list = +# abc,xyz +# Characters 33-34: + let f x (type a) (y : a) = (x = y);; (* Fails *) + ^ +Error: This expression has type a but an expression was expected of type a + The type constructor a would escape its scope +# Characters 117-118: + method n : 'a -> 'a = fun (type g) (x:g) -> self#m x + ^ +Error: This expression has type g but an expression was expected of type g + The type constructor g would escape its scope +# diff --git a/testsuite/tests/typing-typeparam/newtype.reference b/testsuite/tests/typing-typeparam/newtype.reference deleted file mode 100644 index ab102d7d..00000000 --- a/testsuite/tests/typing-typeparam/newtype.reference +++ /dev/null @@ -1,5 +0,0 @@ -false -true -true -false -abc,xyz diff --git a/tools/make-version-header.sh b/tools/make-version-header.sh new file mode 100755 index 00000000..22320ec1 --- /dev/null +++ b/tools/make-version-header.sh @@ -0,0 +1,43 @@ +#!/bin/sh + +######################################################################### +# # +# OCaml # +# # +# Damien Doligez, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2003 Institut National de Recherche en Informatique et # +# en Automatique. All rights reserved. As an exception to the # +# licensing rules of OCaml, this file is freely redistributable, # +# modified or not, without constraints. # +# # +######################################################################### + +# For maximal compatibility with older versions, we Use "ocamlc -v" +# instead of "ocamlc -vnum" or the VERSION file in .../lib/ocaml/. + +# This script extracts the components from an OCaml version number +# and provides them as C defines: +# OCAML_VERSION_MAJOR: the major version number +# OCAML_VERSION_MAJOR: the minor version number +# OCAML_VERSION_PATCHLEVEL: the patchlevel number if present, or 0 if absent +# OCAML_VERSION_ADDITIONAL: this is defined only if the additional-info +# field is present, and is a string that contains that field. +# Note that additional-info is always absent in officially-released +# versions of OCaml. + +version="`ocamlc -v | sed -n -e 's/.*version //p'`" + +major="`echo "$version" | sed -n -e '1s/^\([0-9]*\)\..*/\1/p'`" +minor="`echo "$version" | sed -n -e '1s/^[0-9]*\.\([0-9]*\).*/\1/p'`" +patchlevel="`echo "$version" | sed -n -e '1s/^[0-9]*\.[0-9]*\.\([0-9]*\).*/\1/p'`" +suffix="`echo "$version" | sed -n -e '1s/^[^+]*+\(.*\)/\1/p'`" + +echo "#define OCAML_VERSION_MAJOR $major" +echo "#define OCAML_VERSION_MINOR $minor" +case $patchlevel in "") patchlevel=0;; esac +echo "#define OCAML_VERSION_PATCHLEVEL $patchlevel" +case "$suffix" in + "") echo "#undef OCAML_VERSION_ADDITIONAL";; + *) echo "#define OCAML_VERSION_ADDITIONAL \"$suffix\"";; +esac diff --git a/tools/ocamldep.ml b/tools/ocamldep.ml index e7068580..8df3421f 100644 --- a/tools/ocamldep.ml +++ b/tools/ocamldep.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: ocamldep.ml 12387 2012-04-20 15:33:56Z doligez $ *) +(* $Id: ocamldep.ml 12620 2012-06-20 13:17:14Z doligez $ *) open Longident open Parsetree @@ -196,7 +196,7 @@ let preprocess sourcefile = None -> sourcefile | Some pp -> flush Pervasives.stdout; - let tmpfile = Filename.temp_file "ocamldeppp" "" in + let tmpfile = Filename.temp_file "ocamldep_pp" "" in let comm = Printf.sprintf "%s %s > %s" pp sourcefile tmpfile in if Sys.command comm <> 0 then begin Misc.remove_file tmpfile; @@ -256,7 +256,8 @@ let report_err source_file exn = | Sys_error msg -> Format.fprintf Format.err_formatter "@[I/O error:@ %s@]@." msg | Preprocessing_error -> - Format.fprintf Format.err_formatter "@[Preprocessing error on file %s@]@." + Format.fprintf Format.err_formatter + "@[Preprocessing error on file %s@]@." source_file | x -> raise x @@ -265,12 +266,14 @@ let read_parse_and_extract parse_function extract_function source_file = try let input_file = preprocess source_file in let ic = open_in_bin input_file in + let cleanup () = close_in ic; remove_preprocessed input_file in try let ast = parse_function ic in extract_function Depend.StringSet.empty ast; + cleanup (); !Depend.free_structure_names with x -> - close_in ic; remove_preprocessed input_file; raise x + cleanup (); raise x with x -> report_err source_file x; Depend.StringSet.empty @@ -295,13 +298,18 @@ let ml_file_dependencies source_file = let init_deps = if !all_dependencies then [source_file] else [] in let cmi_name = basename ^ ".cmi" in let init_deps, extra_targets = - if List.exists (fun ext -> Sys.file_exists (basename ^ ext)) !mli_synonyms + if List.exists (fun ext -> Sys.file_exists (basename ^ ext)) + !mli_synonyms then (cmi_name :: init_deps, cmi_name :: init_deps), [] - else (init_deps, init_deps), ( if !all_dependencies then [cmi_name] else [] ) in + else (init_deps, init_deps), + (if !all_dependencies then [cmi_name] else []) + in let (byt_deps, native_deps) = Depend.StringSet.fold (find_dependency ML) extracted_deps init_deps in - if not !native_only then print_dependencies (byte_targets @ extra_targets) byt_deps; + if not !native_only then begin + print_dependencies (byte_targets @ extra_targets) byt_deps; + end; print_dependencies (native_targets @ extra_targets) native_deps; end @@ -429,34 +437,34 @@ let _ = Clflags.classic := false; add_to_load_path Filename.current_dir_name; Arg.parse [ + "-all", Arg.Set all_dependencies, + " Generate dependencies on all files"; "-I", Arg.String add_to_load_path, "

Add to the list of include directories"; "-impl", Arg.String (file_dependencies_as ML), - " Process as a .ml file"; + " Process as a .ml file"; "-intf", Arg.String (file_dependencies_as MLI), - " Process as a .mli file"; + " Process as a .mli file"; "-ml-synonym", Arg.String(add_to_synonym_list ml_synonyms), - " Consider as a synonym of the .ml extension"; + " Consider as a synonym of the .ml extension"; "-mli-synonym", Arg.String(add_to_synonym_list mli_synonyms), - " Consider as a synonym of the .mli extension"; - "-sort", Arg.Set sort_files, - " Sort files according to their dependencies"; + " Consider as a synonym of the .mli extension"; "-modules", Arg.Set raw_dependencies, - " Print module dependencies in raw form (not suitable for make)"; + " Print module dependencies in raw form (not suitable for make)"; "-native", Arg.Set native_only, - " Generate dependencies for a pure native-code project (no .cmo files)"; - "-all", Arg.Set all_dependencies, - " Generate dependencies on all files (not accommodating for make shortcomings)"; + " Generate dependencies for native-code only (no .cmo files)"; "-one-line", Arg.Set one_line, - " Output one line per file, regardless of the length"; + " Output one line per file, regardless of the length"; "-pp", Arg.String(fun s -> preprocessor := Some s), - " Pipe sources through preprocessor "; + " Pipe sources through preprocessor "; "-slash", Arg.Set force_slash, - " (Windows) Use forward slash / instead of backslash \\ in file paths"; + " (Windows) Use forward slash / instead of backslash \\ in file paths"; + "-sort", Arg.Set sort_files, + " Sort files according to their dependencies"; "-version", Arg.Unit print_version, - " Print version and exit"; + " Print version and exit"; "-vnum", Arg.Unit print_version_num, - " Print version number and exit"; + " Print version number and exit"; ] file_dependencies usage; if !sort_files then sort_files_by_dependencies !files; exit (if !error_occurred then 2 else 0) diff --git a/tools/ocamlmklib.mlp b/tools/ocamlmklib.mlp index f114b132..b6c236ea 100644 --- a/tools/ocamlmklib.mlp +++ b/tools/ocamlmklib.mlp @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: ocamlmklib.mlp 12149 2012-02-10 16:15:24Z doligez $ *) +(* $Id: ocamlmklib.mlp 12723 2012-07-17 18:25:54Z doligez $ *) open Printf open Myocamlbuild_config @@ -28,6 +28,7 @@ and caml_opts = ref [] (* -ccopt to pass to ocamlc, ocamlopt *) and dynlink = ref supports_shared_libraries and failsafe = ref false (* whether to fall back on static build only *) and c_libs = ref [] (* libs to pass to mksharedlib and ocamlc -cclib *) +and c_Lopts = ref [] (* options to pass to mksharedlib and ocamlc -cclib *) and c_opts = ref [] (* options to pass to mksharedlib and ocamlc -ccopt *) and ld_opts = ref [] (* options to pass only to the linker *) and ocamlc = ref (compiler_path "ocamlc") @@ -93,7 +94,7 @@ let parse_arguments argv = else if starts_with s "-l" then c_libs := s :: !c_libs else if starts_with s "-L" then - (c_opts := s :: !c_opts; + (c_Lopts := s :: !c_Lopts; let l = chop_prefix s "-L" in if not (Filename.is_relative l) then rpath := l :: !rpath) else if s = "-ocamlc" then @@ -137,6 +138,8 @@ let parse_arguments argv = (fun r -> r := List.rev !r) [ bytecode_objs; native_objs; caml_libs; caml_opts; c_libs; c_objs; c_opts; ld_opts; rpath ]; +(* Put -L options in front of -l options in -cclib to mimic -ccopt behavior *) + c_libs := !c_Lopts @ !c_libs; if !output_c = "" then output_c := !output diff --git a/tools/typedtreeIter.ml b/tools/typedtreeIter.ml index 4af9a3a0..a4f45ec9 100644 --- a/tools/typedtreeIter.ml +++ b/tools/typedtreeIter.ml @@ -228,8 +228,11 @@ module MakeIterator(Iter : IteratorArgument) : sig Iter.enter_expression exp; List.iter (function (cstr, _) -> match cstr with - Texp_constraint (cty1, cty2) -> option iter_core_type cty1; option iter_core_type cty2 - | Texp_open (path, _, _) -> ()) + Texp_constraint (cty1, cty2) -> + option iter_core_type cty1; option iter_core_type cty2 + | Texp_open (path, _, _) -> () + | Texp_poly cto -> option iter_core_type cto + | Texp_newtype s -> ()) exp.exp_extra; begin match exp.exp_desc with @@ -322,11 +325,6 @@ module MakeIterator(Iter : IteratorArgument) : sig iter_class_structure cl | Texp_pack (mexpr) -> iter_module_expr mexpr - | Texp_poly (exp, None) -> iter_expression exp - | Texp_poly (exp, Some ct) -> - iter_expression exp; iter_core_type ct - | Texp_newtype (s, exp) -> - iter_expression exp end; Iter.leave_expression exp; diff --git a/tools/untypeast.ml b/tools/untypeast.ml index 7f44cff7..eb9ffbaf 100644 --- a/tools/untypeast.ml +++ b/tools/untypeast.ml @@ -176,15 +176,22 @@ and untype_pattern pat = and option f x = match x with None -> None | Some e -> Some (f e) +and untype_extra (extra, loc) sexp = + let desc = + match extra with + Texp_constraint (cty1, cty2) -> + Pexp_constraint (sexp, + option untype_core_type cty1, + option untype_core_type cty2) + | Texp_open (path, lid, _) -> Pexp_open (lid, sexp) + | Texp_poly cto -> Pexp_poly (sexp, option untype_core_type cto) + | Texp_newtype s -> Pexp_newtype (s, sexp) + in + { pexp_desc = desc; + pexp_loc = loc } + and untype_expression exp = let desc = - match exp.exp_extra with - (Texp_constraint (cty1, cty2), _) :: rem -> - Pexp_constraint (untype_expression { exp with exp_extra = rem }, - option untype_core_type cty1, option untype_core_type cty2) - | (Texp_open (path, lid, _), _) :: rem -> - Pexp_open (lid, untype_expression { exp with exp_extra = rem} ) - | [] -> match exp.exp_desc with Texp_ident (path, lid, _) -> Pexp_ident (lid) | Texp_constant cst -> Pexp_constant cst @@ -279,15 +286,10 @@ and untype_expression exp = Pexp_object (untype_class_structure cl) | Texp_pack (mexpr) -> Pexp_pack (untype_module_expr mexpr) - | Texp_poly (exp, None) -> Pexp_poly(untype_expression exp, None) - | Texp_poly (exp, Some ct) -> - Pexp_poly (untype_expression exp, Some (untype_core_type ct)) - | Texp_newtype (s, exp) -> - Pexp_newtype (s, untype_expression exp) in - { pexp_loc = exp.exp_loc; - pexp_desc = desc; - } + List.fold_right untype_extra exp.exp_extra + { pexp_loc = exp.exp_loc; + pexp_desc = desc } and untype_package_type pack = (pack.pack_txt, diff --git a/toplevel/genprintval.ml b/toplevel/genprintval.ml index 4eaa1495..1e89e0aa 100644 --- a/toplevel/genprintval.ml +++ b/toplevel/genprintval.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: genprintval.ml 12511 2012-05-30 13:29:48Z lefessan $ *) +(* $Id: genprintval.ml 12689 2012-07-10 14:54:19Z doligez $ *) (* To print values *) @@ -33,10 +33,10 @@ module type OBJ = module type EVALPATH = sig - type value - val eval_path: Path.t -> value + type valu + val eval_path: Path.t -> valu exception Error - val same_value: value -> value -> bool + val same_value: valu -> valu -> bool end module type S = @@ -52,7 +52,7 @@ module type S = Env.t -> t -> type_expr -> Outcometree.out_value end -module Make(O : OBJ)(EVP : EVALPATH with type value = O.t) = struct +module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct type t = O.t diff --git a/toplevel/genprintval.mli b/toplevel/genprintval.mli index bd45764e..0d1f7081 100644 --- a/toplevel/genprintval.mli +++ b/toplevel/genprintval.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: genprintval.mli 11156 2011-07-27 14:17:02Z doligez $ *) +(* $Id: genprintval.mli 12689 2012-07-10 14:54:19Z doligez $ *) (* Printing of values *) @@ -29,10 +29,10 @@ module type OBJ = module type EVALPATH = sig - type value - val eval_path: Path.t -> value + type valu + val eval_path: Path.t -> valu exception Error - val same_value: value -> value -> bool + val same_value: valu -> valu -> bool end module type S = @@ -48,5 +48,5 @@ module type S = Env.t -> t -> type_expr -> Outcometree.out_value end -module Make(O : OBJ)(EVP : EVALPATH with type value = O.t) : +module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) : (S with type t = O.t) diff --git a/toplevel/topdirs.ml b/toplevel/topdirs.ml index 0af7a2c9..56181052 100644 --- a/toplevel/topdirs.ml +++ b/toplevel/topdirs.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: topdirs.ml 12184 2012-02-23 19:54:44Z doligez $ *) +(* $Id: topdirs.ml 12661 2012-07-07 11:41:17Z scherer $ *) (* Toplevel directives *) @@ -41,6 +41,16 @@ let dir_directory s = let _ = Hashtbl.add directive_table "directory" (Directive_string dir_directory) +(* To remove a directory from the load path *) +let dir_remove_directory s = + let d = expand_directory Config.standard_library s in + Config.load_path := List.filter (fun d' -> d' <> d) !Config.load_path; + Dll.remove_path [d] + +let _ = + Hashtbl.add directive_table "remove_directory" + (Directive_string dir_remove_directory) + (* To change the current directory *) let dir_cd s = Sys.chdir s diff --git a/toplevel/topdirs.mli b/toplevel/topdirs.mli index f831bc08..ffcecca2 100644 --- a/toplevel/topdirs.mli +++ b/toplevel/topdirs.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: topdirs.mli 11156 2011-07-27 14:17:02Z doligez $ *) +(* $Id: topdirs.mli 12661 2012-07-07 11:41:17Z scherer $ *) (* The toplevel directives. *) @@ -18,6 +18,7 @@ open Format val dir_quit : unit -> unit val dir_directory : string -> unit +val dir_remove_directory : string -> unit val dir_cd : string -> unit val dir_load : formatter -> string -> unit val dir_use : formatter -> string -> unit diff --git a/toplevel/toploop.ml b/toplevel/toploop.ml index 90e8dab3..88bd3ccc 100644 --- a/toplevel/toploop.ml +++ b/toplevel/toploop.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: toploop.ml 12542 2012-06-01 14:06:31Z frisch $ *) +(* $Id: toploop.ml 12689 2012-07-10 14:54:19Z doligez $ *) (* The interactive toplevel loop *) @@ -66,7 +66,7 @@ let rec eval_path = function (* To print values *) module EvalPath = struct - type value = Obj.t + type valu = Obj.t exception Error let eval_path p = try eval_path p with Symtable.Error _ -> raise Error let same_value v1 v2 = (v1 == v2) diff --git a/typing/btype.ml b/typing/btype.ml index 72f3e6c1..a036222b 100644 --- a/typing/btype.ml +++ b/typing/btype.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: btype.ml 12534 2012-06-01 05:24:38Z garrigue $ *) +(* $Id: btype.ml 12726 2012-07-18 03:34:36Z garrigue $ *) (* Basic operations on core types *) @@ -126,6 +126,14 @@ let rec row_more row = | {desc=Tvariant row'} -> row_more row' | ty -> ty +let row_fixed row = + let row = row_repr row in + row.row_fixed || + match (repr row.row_more).desc with + Tvar _ | Tnil -> false + | Tunivar _ | Tconstr _ -> true + | _ -> assert false + let static_row row = let row = row_repr row in row.row_closed && diff --git a/typing/btype.mli b/typing/btype.mli index 53d56036..ac863be8 100644 --- a/typing/btype.mli +++ b/typing/btype.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: btype.mli 12534 2012-06-01 05:24:38Z garrigue $ *) +(* $Id: btype.mli 12726 2012-07-18 03:34:36Z garrigue $ *) (* Basic operations on core types *) @@ -64,6 +64,8 @@ val row_field: label -> row_desc -> row_field (* Return the canonical representative of a row field *) val row_more: row_desc -> type_expr (* Return the extension variable of the row *) +val row_fixed: row_desc -> bool + (* Return whether the row should be treated as fixed or not *) val static_row: row_desc -> bool (* Return whether the row is static or not *) val hash_variant: label -> int diff --git a/typing/cmt_format.ml b/typing/cmt_format.ml index 04545a8e..41bc08ea 100644 --- a/typing/cmt_format.ml +++ b/typing/cmt_format.ml @@ -19,6 +19,8 @@ open Typedtree integrated in Typerex). *) + + let read_magic_number ic = let len_magic_number = String.length Config.cmt_magic_number in let magic_number = String.create len_magic_number in @@ -54,11 +56,856 @@ type cmt_infos = { cmt_initial_env : Env.t; cmt_imports : (string * Digest.t) list; cmt_interface_digest : Digest.t option; + cmt_use_summaries : bool; } type error = Not_a_typedtree of string + + + + + + + +let need_to_clear_env = + try ignore (Sys.getenv "OCAML_BINANNOT_WITHENV"); false + with Not_found -> true + +(* Re-introduce sharing after clearing environments *) +let env_hcons = Hashtbl.create 133 +let keep_only_summary env = + let new_env = Env.keep_only_summary env in + try + Hashtbl.find env_hcons new_env + with Not_found -> + Hashtbl.add env_hcons new_env new_env; + new_env +let clear_env_hcons () = Hashtbl.clear env_hcons + + + + +module TypedtreeMap : sig + + open Asttypes + open Typedtree + + module type MapArgument = sig + val enter_structure : structure -> structure + val enter_value_description : value_description -> value_description + val enter_type_declaration : type_declaration -> type_declaration + val enter_exception_declaration : + exception_declaration -> exception_declaration + val enter_pattern : pattern -> pattern + val enter_expression : expression -> expression + val enter_package_type : package_type -> package_type + val enter_signature : signature -> signature + val enter_signature_item : signature_item -> signature_item + val enter_modtype_declaration : modtype_declaration -> modtype_declaration + val enter_module_type : module_type -> module_type + val enter_module_expr : module_expr -> module_expr + val enter_with_constraint : with_constraint -> with_constraint + val enter_class_expr : class_expr -> class_expr + val enter_class_signature : class_signature -> class_signature + val enter_class_description : class_description -> class_description + val enter_class_type_declaration : + class_type_declaration -> class_type_declaration + val enter_class_infos : 'a class_infos -> 'a class_infos + val enter_class_type : class_type -> class_type + val enter_class_type_field : class_type_field -> class_type_field + val enter_core_type : core_type -> core_type + val enter_core_field_type : core_field_type -> core_field_type + val enter_class_structure : class_structure -> class_structure + val enter_class_field : class_field -> class_field + val enter_structure_item : structure_item -> structure_item + + val leave_structure : structure -> structure + val leave_value_description : value_description -> value_description + val leave_type_declaration : type_declaration -> type_declaration + val leave_exception_declaration : + exception_declaration -> exception_declaration + val leave_pattern : pattern -> pattern + val leave_expression : expression -> expression + val leave_package_type : package_type -> package_type + val leave_signature : signature -> signature + val leave_signature_item : signature_item -> signature_item + val leave_modtype_declaration : modtype_declaration -> modtype_declaration + val leave_module_type : module_type -> module_type + val leave_module_expr : module_expr -> module_expr + val leave_with_constraint : with_constraint -> with_constraint + val leave_class_expr : class_expr -> class_expr + val leave_class_signature : class_signature -> class_signature + val leave_class_description : class_description -> class_description + val leave_class_type_declaration : + class_type_declaration -> class_type_declaration + val leave_class_infos : 'a class_infos -> 'a class_infos + val leave_class_type : class_type -> class_type + val leave_class_type_field : class_type_field -> class_type_field + val leave_core_type : core_type -> core_type + val leave_core_field_type : core_field_type -> core_field_type + val leave_class_structure : class_structure -> class_structure + val leave_class_field : class_field -> class_field + val leave_structure_item : structure_item -> structure_item + + end + + module MakeMap : + functor + (Iter : MapArgument) -> + sig + val map_structure : structure -> structure + val map_pattern : pattern -> pattern + val map_structure_item : structure_item -> structure_item + val map_expression : expression -> expression + val map_class_expr : class_expr -> class_expr + + val map_signature : signature -> signature + val map_signature_item : signature_item -> signature_item + val map_module_type : module_type -> module_type + end + + module DefaultMapArgument : MapArgument + +end = struct + + open Asttypes + open Typedtree + + module type MapArgument = sig + val enter_structure : structure -> structure + val enter_value_description : value_description -> value_description + val enter_type_declaration : type_declaration -> type_declaration + val enter_exception_declaration : + exception_declaration -> exception_declaration + val enter_pattern : pattern -> pattern + val enter_expression : expression -> expression + val enter_package_type : package_type -> package_type + val enter_signature : signature -> signature + val enter_signature_item : signature_item -> signature_item + val enter_modtype_declaration : modtype_declaration -> modtype_declaration + val enter_module_type : module_type -> module_type + val enter_module_expr : module_expr -> module_expr + val enter_with_constraint : with_constraint -> with_constraint + val enter_class_expr : class_expr -> class_expr + val enter_class_signature : class_signature -> class_signature + val enter_class_description : class_description -> class_description + val enter_class_type_declaration : + class_type_declaration -> class_type_declaration + val enter_class_infos : 'a class_infos -> 'a class_infos + val enter_class_type : class_type -> class_type + val enter_class_type_field : class_type_field -> class_type_field + val enter_core_type : core_type -> core_type + val enter_core_field_type : core_field_type -> core_field_type + val enter_class_structure : class_structure -> class_structure + val enter_class_field : class_field -> class_field + val enter_structure_item : structure_item -> structure_item + + val leave_structure : structure -> structure + val leave_value_description : value_description -> value_description + val leave_type_declaration : type_declaration -> type_declaration + val leave_exception_declaration : + exception_declaration -> exception_declaration + val leave_pattern : pattern -> pattern + val leave_expression : expression -> expression + val leave_package_type : package_type -> package_type + val leave_signature : signature -> signature + val leave_signature_item : signature_item -> signature_item + val leave_modtype_declaration : modtype_declaration -> modtype_declaration + val leave_module_type : module_type -> module_type + val leave_module_expr : module_expr -> module_expr + val leave_with_constraint : with_constraint -> with_constraint + val leave_class_expr : class_expr -> class_expr + val leave_class_signature : class_signature -> class_signature + val leave_class_description : class_description -> class_description + val leave_class_type_declaration : + class_type_declaration -> class_type_declaration + val leave_class_infos : 'a class_infos -> 'a class_infos + val leave_class_type : class_type -> class_type + val leave_class_type_field : class_type_field -> class_type_field + val leave_core_type : core_type -> core_type + val leave_core_field_type : core_field_type -> core_field_type + val leave_class_structure : class_structure -> class_structure + val leave_class_field : class_field -> class_field + val leave_structure_item : structure_item -> structure_item + + end + + + module MakeMap(Map : MapArgument) = struct + + let may_map f v = + match v with + None -> v + | Some x -> Some (f x) + + + open Misc + open Asttypes + + let rec map_structure str = + let str = Map.enter_structure str in + let str_items = List.map map_structure_item str.str_items in + Map.leave_structure { str with str_items = str_items } + + and map_binding (pat, exp) = (map_pattern pat, map_expression exp) + + and map_bindings rec_flag list = + List.map map_binding list + + and map_structure_item item = + let item = Map.enter_structure_item item in + let str_desc = + match item.str_desc with + Tstr_eval exp -> Tstr_eval (map_expression exp) + | Tstr_value (rec_flag, list) -> + Tstr_value (rec_flag, map_bindings rec_flag list) + | Tstr_primitive (id, name, v) -> + Tstr_primitive (id, name, map_value_description v) + | Tstr_type list -> + Tstr_type (List.map ( + fun (id, name, decl) -> + (id, name, map_type_declaration decl) ) list) + | Tstr_exception (id, name, decl) -> + Tstr_exception (id, name, map_exception_declaration decl) + | Tstr_exn_rebind (id, name, path, lid) -> + Tstr_exn_rebind (id, name, path, lid) + | Tstr_module (id, name, mexpr) -> + Tstr_module (id, name, map_module_expr mexpr) + | Tstr_recmodule list -> + let list = + List.map (fun (id, name, mtype, mexpr) -> + (id, name, map_module_type mtype, map_module_expr mexpr) + ) list + in + Tstr_recmodule list + | Tstr_modtype (id, name, mtype) -> + Tstr_modtype (id, name, map_module_type mtype) + | Tstr_open (path, lid) -> Tstr_open (path, lid) + | Tstr_class list -> + let list = + List.map (fun (ci, string_list, virtual_flag) -> + let ci = Map.enter_class_infos ci in + let ci_expr = map_class_expr ci.ci_expr in + (Map.leave_class_infos { ci with ci_expr = ci_expr}, + string_list, virtual_flag) + ) list + in + Tstr_class list + | Tstr_class_type list -> + let list = List.map (fun (id, name, ct) -> + let ct = Map.enter_class_infos ct in + let ci_expr = map_class_type ct.ci_expr in + (id, name, Map.leave_class_infos { ct with ci_expr = ci_expr}) + ) list in + Tstr_class_type list + | Tstr_include (mexpr, idents) -> + Tstr_include (map_module_expr mexpr, idents) + in + Map.leave_structure_item { item with str_desc = str_desc} + + and map_value_description v = + let v = Map.enter_value_description v in + let val_desc = map_core_type v.val_desc in + Map.leave_value_description { v with val_desc = val_desc } + + and map_type_declaration decl = + let decl = Map.enter_type_declaration decl in + let typ_cstrs = List.map (fun (ct1, ct2, loc) -> + (map_core_type ct1, + map_core_type ct2, + loc) + ) decl.typ_cstrs in + let typ_kind = match decl.typ_kind with + Ttype_abstract -> Ttype_abstract + | Ttype_variant list -> + let list = List.map (fun (s, name, cts, loc) -> + (s, name, List.map map_core_type cts, loc) + ) list in + Ttype_variant list + | Ttype_record list -> + let list = + List.map (fun (s, name, mut, ct, loc) -> + (s, name, mut, map_core_type ct, loc) + ) list in + Ttype_record list + in + let typ_manifest = + match decl.typ_manifest with + None -> None + | Some ct -> Some (map_core_type ct) + in + Map.leave_type_declaration { decl with typ_cstrs = typ_cstrs; + typ_kind = typ_kind; typ_manifest = typ_manifest } + + and map_exception_declaration decl = + let decl = Map.enter_exception_declaration decl in + let exn_params = List.map map_core_type decl.exn_params in + let decl = { exn_params = exn_params; + exn_exn = decl.exn_exn; + exn_loc = decl.exn_loc } in + Map.leave_exception_declaration decl; + + and map_pattern pat = + let pat = Map.enter_pattern pat in + let pat_desc = + match pat.pat_desc with + | Tpat_alias (pat1, p, text) -> + let pat1 = map_pattern pat1 in + Tpat_alias (pat1, p, text) + | Tpat_tuple list -> Tpat_tuple (List.map map_pattern list) + | Tpat_construct (path, lid, cstr_decl, args, arity) -> + Tpat_construct (path, lid, cstr_decl, + List.map map_pattern args, arity) + | Tpat_variant (label, pato, rowo) -> + let pato = match pato with + None -> pato + | Some pat -> Some (map_pattern pat) + in + Tpat_variant (label, pato, rowo) + | Tpat_record (list, closed) -> + Tpat_record (List.map (fun (path, lid, lab_desc, pat) -> + (path, lid, lab_desc, map_pattern pat) ) list, closed) + | Tpat_array list -> Tpat_array (List.map map_pattern list) + | Tpat_or (p1, p2, rowo) -> + Tpat_or (map_pattern p1, map_pattern p2, rowo) + | Tpat_lazy p -> Tpat_lazy (map_pattern p) + | Tpat_constant _ + | Tpat_any + | Tpat_var _ -> pat.pat_desc + + in + let pat_extra = List.map map_pat_extra pat.pat_extra in + Map.leave_pattern { pat with pat_desc = pat_desc; pat_extra = pat_extra } + + and map_pat_extra pat_extra = + match pat_extra with + | Tpat_constraint ct, loc -> (Tpat_constraint (map_core_type ct), loc) + | (Tpat_type _ | Tpat_unpack), _ -> pat_extra + + and map_expression exp = + let exp = Map.enter_expression exp in + let exp_desc = + match exp.exp_desc with + Texp_ident (_, _, _) + | Texp_constant _ -> exp.exp_desc + | Texp_let (rec_flag, list, exp) -> + Texp_let (rec_flag, + map_bindings rec_flag list, + map_expression exp) + | Texp_function (label, cases, partial) -> + Texp_function (label, map_bindings Nonrecursive cases, partial) + | Texp_apply (exp, list) -> + Texp_apply (map_expression exp, + List.map (fun (label, expo, optional) -> + let expo = + match expo with + None -> expo + | Some exp -> Some (map_expression exp) + in + (label, expo, optional) + ) list ) + | Texp_match (exp, list, partial) -> + Texp_match ( + map_expression exp, + map_bindings Nonrecursive list, + partial + ) + | Texp_try (exp, list) -> + Texp_try ( + map_expression exp, + map_bindings Nonrecursive list + ) + | Texp_tuple list -> + Texp_tuple (List.map map_expression list) + | Texp_construct (path, lid, cstr_desc, args, arity) -> + Texp_construct (path, lid, cstr_desc, + List.map map_expression args, arity ) + | Texp_variant (label, expo) -> + let expo =match expo with + None -> expo + | Some exp -> Some (map_expression exp) + in + Texp_variant (label, expo) + | Texp_record (list, expo) -> + let list = + List.map (fun (path, lid, lab_desc, exp) -> + (path, lid, lab_desc, map_expression exp) + ) list in + let expo = match expo with + None -> expo + | Some exp -> Some (map_expression exp) + in + Texp_record (list, expo) + | Texp_field (exp, path, lid, label) -> + Texp_field (map_expression exp, path, lid, label) + | Texp_setfield (exp1, path, lid, label, exp2) -> + Texp_setfield ( + map_expression exp1, + path, lid, + label, + map_expression exp2) + | Texp_array list -> + Texp_array (List.map map_expression list) + | Texp_ifthenelse (exp1, exp2, expo) -> + Texp_ifthenelse ( + map_expression exp1, + map_expression exp2, + match expo with + None -> expo + | Some exp -> Some (map_expression exp) + ) + | Texp_sequence (exp1, exp2) -> + Texp_sequence ( + map_expression exp1, + map_expression exp2 + ) + | Texp_while (exp1, exp2) -> + Texp_while ( + map_expression exp1, + map_expression exp2 + ) + | Texp_for (id, name, exp1, exp2, dir, exp3) -> + Texp_for ( + id, name, + map_expression exp1, + map_expression exp2, + dir, + map_expression exp3 + ) + | Texp_when (exp1, exp2) -> + Texp_when ( + map_expression exp1, + map_expression exp2 + ) + | Texp_send (exp, meth, expo) -> + Texp_send (map_expression exp, meth, may_map map_expression expo) + | Texp_new (path, lid, cl_decl) -> exp.exp_desc + | Texp_instvar (_, path, _) -> exp.exp_desc + | Texp_setinstvar (path, lid, path2, exp) -> + Texp_setinstvar (path, lid, path2, map_expression exp) + | Texp_override (path, list) -> + Texp_override ( + path, + List.map (fun (path, lid, exp) -> + (path, lid, map_expression exp) + ) list + ) + | Texp_letmodule (id, name, mexpr, exp) -> + Texp_letmodule ( + id, name, + map_module_expr mexpr, + map_expression exp + ) + | Texp_assert exp -> Texp_assert (map_expression exp) + | Texp_assertfalse -> exp.exp_desc + | Texp_lazy exp -> Texp_lazy (map_expression exp) + | Texp_object (cl, string_list) -> + Texp_object (map_class_structure cl, string_list) + | Texp_pack (mexpr) -> + Texp_pack (map_module_expr mexpr) + in + let exp_extra = List.map map_exp_extra exp.exp_extra in + Map.leave_expression { + exp with + exp_desc = exp_desc; + exp_extra = exp_extra } + + and map_exp_extra exp_extra = + let loc = snd exp_extra in + match fst exp_extra with + | Texp_constraint (Some ct, None) -> + Texp_constraint (Some (map_core_type ct), None), loc + | Texp_constraint (None, Some ct) -> + Texp_constraint (None, Some (map_core_type ct)), loc + | Texp_constraint (Some ct1, Some ct2) -> + Texp_constraint (Some (map_core_type ct1), + Some (map_core_type ct2)), loc + | Texp_poly (Some ct) -> + Texp_poly (Some ( map_core_type ct )), loc + | Texp_newtype _ + | Texp_constraint (None, None) + | Texp_open _ + | Texp_poly None -> exp_extra + + + and map_package_type pack = + let pack = Map.enter_package_type pack in + let pack_fields = List.map ( + fun (s, ct) -> (s, map_core_type ct) ) pack.pack_fields in + Map.leave_package_type { pack with pack_fields = pack_fields } + + and map_signature sg = + let sg = Map.enter_signature sg in + let sig_items = List.map map_signature_item sg.sig_items in + Map.leave_signature { sg with sig_items = sig_items } + + and map_signature_item item = + let item = Map.enter_signature_item item in + let sig_desc = + match item.sig_desc with + Tsig_value (id, name, v) -> + Tsig_value (id, name, map_value_description v) + | Tsig_type list -> Tsig_type ( + List.map (fun (id, name, decl) -> + (id, name, map_type_declaration decl) + ) list + ) + | Tsig_exception (id, name, decl) -> + Tsig_exception (id, name, map_exception_declaration decl) + | Tsig_module (id, name, mtype) -> + Tsig_module (id, name, map_module_type mtype) + | Tsig_recmodule list -> + Tsig_recmodule (List.map ( + fun (id, name, mtype) -> + (id, name, map_module_type mtype) ) list) + | Tsig_modtype (id, name, mdecl) -> + Tsig_modtype (id, name, map_modtype_declaration mdecl) + | Tsig_open (path, lid) -> item.sig_desc + | Tsig_include (mty, lid) -> Tsig_include (map_module_type mty, lid) + | Tsig_class list -> Tsig_class (List.map map_class_description list) + | Tsig_class_type list -> + Tsig_class_type (List.map map_class_type_declaration list) + in + Map.leave_signature_item { item with sig_desc = sig_desc } + + and map_modtype_declaration mdecl = + let mdecl = Map.enter_modtype_declaration mdecl in + let mdecl = + match mdecl with + Tmodtype_abstract -> Tmodtype_abstract + | Tmodtype_manifest mtype -> + Tmodtype_manifest (map_module_type mtype) + in + Map.leave_modtype_declaration mdecl + + + and map_class_description cd = + let cd = Map.enter_class_description cd in + let ci_expr = map_class_type cd.ci_expr in + Map.leave_class_description { cd with ci_expr = ci_expr} + + and map_class_type_declaration cd = + let cd = Map.enter_class_type_declaration cd in + let ci_expr = map_class_type cd.ci_expr in + Map.leave_class_type_declaration { cd with ci_expr = ci_expr } + + and map_module_type mty = + let mty = Map.enter_module_type mty in + let mty_desc = + match mty.mty_desc with + Tmty_ident (path, lid) -> mty.mty_desc + | Tmty_signature sg -> Tmty_signature (map_signature sg) + | Tmty_functor (id, name, mtype1, mtype2) -> + Tmty_functor (id, name, map_module_type mtype1, + map_module_type mtype2) + | Tmty_with (mtype, list) -> + Tmty_with (map_module_type mtype, + List.map (fun (path, lid, withc) -> + (path, lid, map_with_constraint withc) + ) list) + | Tmty_typeof mexpr -> + Tmty_typeof (map_module_expr mexpr) + in + Map.leave_module_type { mty with mty_desc = mty_desc} + + and map_with_constraint cstr = + let cstr = Map.enter_with_constraint cstr in + let cstr = + match cstr with + Twith_type decl -> Twith_type (map_type_declaration decl) + | Twith_typesubst decl -> Twith_typesubst (map_type_declaration decl) + | Twith_module (path, lid) -> cstr + | Twith_modsubst (path, lid) -> cstr + in + Map.leave_with_constraint cstr + + and map_module_expr mexpr = + let mexpr = Map.enter_module_expr mexpr in + let mod_desc = + match mexpr.mod_desc with + Tmod_ident (p, lid) -> mexpr.mod_desc + | Tmod_structure st -> Tmod_structure (map_structure st) + | Tmod_functor (id, name, mtype, mexpr) -> + Tmod_functor (id, name, map_module_type mtype, + map_module_expr mexpr) + | Tmod_apply (mexp1, mexp2, coercion) -> + Tmod_apply (map_module_expr mexp1, map_module_expr mexp2, coercion) + | Tmod_constraint (mexpr, mod_type, Tmodtype_implicit, coercion ) -> + Tmod_constraint (map_module_expr mexpr, mod_type, + Tmodtype_implicit, coercion) + | Tmod_constraint (mexpr, mod_type, + Tmodtype_explicit mtype, coercion) -> + Tmod_constraint (map_module_expr mexpr, mod_type, + Tmodtype_explicit (map_module_type mtype), + coercion) + | Tmod_unpack (exp, mod_type) -> + Tmod_unpack (map_expression exp, mod_type) + in + Map.leave_module_expr { mexpr with mod_desc = mod_desc } + + and map_class_expr cexpr = + let cexpr = Map.enter_class_expr cexpr in + let cl_desc = + match cexpr.cl_desc with + | Tcl_constraint (cl, None, string_list1, string_list2, concr ) -> + Tcl_constraint (map_class_expr cl, None, string_list1, + string_list2, concr) + | Tcl_structure clstr -> Tcl_structure (map_class_structure clstr) + | Tcl_fun (label, pat, priv, cl, partial) -> + Tcl_fun (label, map_pattern pat, + List.map (fun (id, name, exp) -> + (id, name, map_expression exp)) priv, + map_class_expr cl, partial) + + | Tcl_apply (cl, args) -> + Tcl_apply (map_class_expr cl, + List.map (fun (label, expo, optional) -> + (label, may_map map_expression expo, + optional) + ) args) + | Tcl_let (rec_flat, bindings, ivars, cl) -> + Tcl_let (rec_flat, map_bindings rec_flat bindings, + List.map (fun (id, name, exp) -> + (id, name, map_expression exp)) ivars, + map_class_expr cl) + + | Tcl_constraint (cl, Some clty, vals, meths, concrs) -> + Tcl_constraint ( map_class_expr cl, + Some (map_class_type clty), vals, meths, concrs) + + | Tcl_ident (id, name, tyl) -> + Tcl_ident (id, name, List.map map_core_type tyl) + in + Map.leave_class_expr { cexpr with cl_desc = cl_desc } + + and map_class_type ct = + let ct = Map.enter_class_type ct in + let cltyp_desc = + match ct.cltyp_desc with + Tcty_signature csg -> Tcty_signature (map_class_signature csg) + | Tcty_constr (path, lid, list) -> + Tcty_constr (path, lid, List.map map_core_type list) + | Tcty_fun (label, ct, cl) -> + Tcty_fun (label, map_core_type ct, map_class_type cl) + in + Map.leave_class_type { ct with cltyp_desc = cltyp_desc } + + and map_class_signature cs = + let cs = Map.enter_class_signature cs in + let csig_self = map_core_type cs.csig_self in + let csig_fields = List.map map_class_type_field cs.csig_fields in + Map.leave_class_signature { cs with + csig_self = csig_self; csig_fields = csig_fields } + + + and map_class_type_field ctf = + let ctf = Map.enter_class_type_field ctf in + let ctf_desc = + match ctf.ctf_desc with + Tctf_inher ct -> Tctf_inher (map_class_type ct) + | Tctf_val (s, mut, virt, ct) -> + Tctf_val (s, mut, virt, map_core_type ct) + | Tctf_virt (s, priv, ct) -> + Tctf_virt (s, priv, map_core_type ct) + | Tctf_meth (s, priv, ct) -> + Tctf_meth (s, priv, map_core_type ct) + | Tctf_cstr (ct1, ct2) -> + Tctf_cstr (map_core_type ct1, map_core_type ct2) + in + Map.leave_class_type_field { ctf with ctf_desc = ctf_desc } + + and map_core_type ct = + let ct = Map.enter_core_type ct in + let ctyp_desc = + match ct.ctyp_desc with + Ttyp_any + | Ttyp_var _ -> ct.ctyp_desc + | Ttyp_arrow (label, ct1, ct2) -> + Ttyp_arrow (label, map_core_type ct1, map_core_type ct2) + | Ttyp_tuple list -> Ttyp_tuple (List.map map_core_type list) + | Ttyp_constr (path, lid, list) -> + Ttyp_constr (path, lid, List.map map_core_type list) + | Ttyp_object list -> Ttyp_object (List.map map_core_field_type list) + | Ttyp_class (path, lid, list, labels) -> + Ttyp_class (path, lid, List.map map_core_type list, labels) + | Ttyp_alias (ct, s) -> Ttyp_alias (map_core_type ct, s) + | Ttyp_variant (list, bool, labels) -> + Ttyp_variant (List.map map_row_field list, bool, labels) + | Ttyp_poly (list, ct) -> Ttyp_poly (list, map_core_type ct) + | Ttyp_package pack -> Ttyp_package (map_package_type pack) + in + Map.leave_core_type { ct with ctyp_desc = ctyp_desc } + + and map_core_field_type cft = + let cft = Map.enter_core_field_type cft in + let field_desc = match cft.field_desc with + Tcfield_var -> Tcfield_var + | Tcfield (s, ct) -> Tcfield (s, map_core_type ct) + in + Map.leave_core_field_type { cft with field_desc = field_desc } + + and map_class_structure cs = + let cs = Map.enter_class_structure cs in + let cstr_pat = map_pattern cs.cstr_pat in + let cstr_fields = List.map map_class_field cs.cstr_fields in + Map.leave_class_structure { cs with cstr_pat = cstr_pat; + cstr_fields = cstr_fields } + + and map_row_field rf = + match rf with + Ttag (label, bool, list) -> + Ttag (label, bool, List.map map_core_type list) + | Tinherit ct -> Tinherit (map_core_type ct) + + and map_class_field cf = + let cf = Map.enter_class_field cf in + let cf_desc = + match cf.cf_desc with + Tcf_inher (ovf, cl, super, vals, meths) -> + Tcf_inher (ovf, map_class_expr cl, super, vals, meths) + | Tcf_constr (cty, cty') -> + Tcf_constr (map_core_type cty, map_core_type cty') + | Tcf_val (lab, name, mut, ident, Tcfk_virtual cty, override) -> + Tcf_val (lab, name, mut, ident, Tcfk_virtual (map_core_type cty), + override) + | Tcf_val (lab, name, mut, ident, Tcfk_concrete exp, override) -> + Tcf_val (lab, name, mut, ident, Tcfk_concrete (map_expression exp), + override) + | Tcf_meth (lab, name, priv, Tcfk_virtual cty, override) -> + Tcf_meth (lab, name, priv, Tcfk_virtual (map_core_type cty), + override) + | Tcf_meth (lab, name, priv, Tcfk_concrete exp, override) -> + Tcf_meth (lab, name, priv, Tcfk_concrete (map_expression exp), + override) + | Tcf_init exp -> Tcf_init (map_expression exp) + in + Map.leave_class_field { cf with cf_desc = cf_desc } + + end + +module DefaultMapArgument = struct + + let enter_structure t = t + let enter_value_description t = t + let enter_type_declaration t = t + let enter_exception_declaration t = t + let enter_pattern t = t + let enter_expression t = t + let enter_package_type t = t + let enter_signature t = t + let enter_signature_item t = t + let enter_modtype_declaration t = t + let enter_module_type t = t + let enter_module_expr t = t + let enter_with_constraint t = t + let enter_class_expr t = t + let enter_class_signature t = t + let enter_class_description t = t + let enter_class_type_declaration t = t + let enter_class_infos t = t + let enter_class_type t = t + let enter_class_type_field t = t + let enter_core_type t = t + let enter_core_field_type t = t + let enter_class_structure t = t + let enter_class_field t = t + let enter_structure_item t = t + + + let leave_structure t = t + let leave_value_description t = t + let leave_type_declaration t = t + let leave_exception_declaration t = t + let leave_pattern t = t + let leave_expression t = t + let leave_package_type t = t + let leave_signature t = t + let leave_signature_item t = t + let leave_modtype_declaration t = t + let leave_module_type t = t + let leave_module_expr t = t + let leave_with_constraint t = t + let leave_class_expr t = t + let leave_class_signature t = t + let leave_class_description t = t + let leave_class_type_declaration t = t + let leave_class_infos t = t + let leave_class_type t = t + let leave_class_type_field t = t + let leave_core_type t = t + let leave_core_field_type t = t + let leave_class_structure t = t + let leave_class_field t = t + let leave_structure_item t = t + + end + +end + +module ClearEnv = TypedtreeMap.MakeMap (struct + open TypedtreeMap + include DefaultMapArgument + + let leave_pattern p = { p with pat_env = keep_only_summary p.pat_env } + let leave_expression e = + let exp_extra = List.map (function + (Texp_open (path, lloc, env), loc) -> + (Texp_open (path, lloc, keep_only_summary env), loc) + | exp_extra -> exp_extra) e.exp_extra in + { e with + exp_env = keep_only_summary e.exp_env; + exp_extra = exp_extra } + let leave_class_expr c = + { c with cl_env = keep_only_summary c.cl_env } + let leave_module_expr m = + { m with mod_env = keep_only_summary m.mod_env } + let leave_structure s = + { s with str_final_env = keep_only_summary s.str_final_env } + let leave_structure_item str = + { str with str_env = keep_only_summary str.str_env } + let leave_module_type m = + { m with mty_env = keep_only_summary m.mty_env } + let leave_signature s = + { s with sig_final_env = keep_only_summary s.sig_final_env } + let leave_signature_item s = + { s with sig_env = keep_only_summary s.sig_env } + let leave_core_type c = + { c with ctyp_env = keep_only_summary c.ctyp_env } + let leave_class_type c = + { c with cltyp_env = keep_only_summary c.cltyp_env } + +end) + +let rec clear_part p = match p with + | Partial_structure s -> Partial_structure (ClearEnv.map_structure s) + | Partial_structure_item s -> + Partial_structure_item (ClearEnv.map_structure_item s) + | Partial_expression e -> Partial_expression (ClearEnv.map_expression e) + | Partial_pattern p -> Partial_pattern (ClearEnv.map_pattern p) + | Partial_class_expr ce -> Partial_class_expr (ClearEnv.map_class_expr ce) + | Partial_signature s -> Partial_signature (ClearEnv.map_signature s) + | Partial_signature_item s -> + Partial_signature_item (ClearEnv.map_signature_item s) + | Partial_module_type s -> Partial_module_type (ClearEnv.map_module_type s) + +let clear_env binary_annots = + if need_to_clear_env then + match binary_annots with + | Implementation s -> Implementation (ClearEnv.map_structure s) + | Interface s -> Interface (ClearEnv.map_signature s) + | Packed _ -> binary_annots + | Partial_implementation array -> + Partial_implementation (Array.map clear_part array) + | Partial_interface array -> + Partial_interface (Array.map clear_part array) + + else binary_annots + + + + exception Error of error let input_cmt ic = (input_value ic : cmt_infos) @@ -69,7 +916,7 @@ let output_cmt oc cmt = let read filename = (* Printf.fprintf stderr "Cmt_format.read %s\n%!" filename; *) - let ic = open_in filename in + let ic = open_in_bin filename in try let magic_number = read_magic_number ic in let cmi, cmt = @@ -109,7 +956,8 @@ let read_cmt filename = let read_cmi filename = match read filename with - None, _ -> raise (Cmi_format.Error (Cmi_format.Not_an_interface filename)) + None, _ -> + raise (Cmi_format.Error (Cmi_format.Not_an_interface filename)) | Some cmi, _ -> cmi let saved_types = ref [] @@ -119,9 +967,12 @@ let get_saved_types () = !saved_types let set_saved_types l = saved_types := l let save_cmt filename modname binary_annots sourcefile initial_env sg = - if !Clflags.binary_annotations && not !Clflags.print_types then begin + if !Clflags.binary_annotations + && not !Clflags.print_types + && not !Clflags.dont_write_files + then begin let imports = Env.imported_units () in - let oc = open_out filename in + let oc = open_out_bin filename in let this_crc = match sg with None -> None @@ -138,17 +989,20 @@ let save_cmt filename modname binary_annots sourcefile initial_env sg = let source_digest = Misc.may_map Digest.file sourcefile in let cmt = { cmt_modname = modname; - cmt_annots = binary_annots; + cmt_annots = clear_env binary_annots; cmt_comments = Lexer.comments (); cmt_args = Sys.argv; cmt_sourcefile = sourcefile; cmt_builddir = Sys.getcwd (); cmt_loadpath = !Config.load_path; cmt_source_digest = source_digest; - cmt_initial_env = initial_env; + cmt_initial_env = if need_to_clear_env then + keep_only_summary initial_env else initial_env; cmt_imports = List.sort compare imports; cmt_interface_digest = this_crc; + cmt_use_summaries = need_to_clear_env; } in + clear_env_hcons (); output_cmt oc cmt; close_out oc; set_saved_types []; diff --git a/typing/cmt_format.mli b/typing/cmt_format.mli index ab49d0dd..578d1743 100644 --- a/typing/cmt_format.mli +++ b/typing/cmt_format.mli @@ -57,6 +57,7 @@ type cmt_infos = { cmt_initial_env : Env.t; cmt_imports : (string * Digest.t) list; cmt_interface_digest : Digest.t option; + cmt_use_summaries : bool; } type error = diff --git a/typing/ctype.ml b/typing/ctype.ml index ac984c46..f9a0294a 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: ctype.ml 12534 2012-06-01 05:24:38Z garrigue $ *) +(* $Id: ctype.ml 12726 2012-07-18 03:34:36Z garrigue $ *) (* Operations on core types *) @@ -2165,14 +2165,15 @@ and unify3 env t1 t1' t2 t2' = | (Tfield _, Tfield _) -> (* special case for GADTs *) unify_fields env t1' t2' | _ -> - begin match !umode with - | Expression -> - occur !env t1' t2'; - link_type t1' t2 - | Pattern -> - add_type_equality t1' t2' - end; - try match (d1, d2) with + begin match !umode with + | Expression -> + occur !env t1' t2'; + link_type t1' t2 + | Pattern -> + add_type_equality t1' t2' + end; + try + begin match (d1, d2) with (Tarrow (l1, t1, u1, c1), Tarrow (l2, t2, u2, c2)) when l1 = l2 || !Clflags.classic && not (is_optional l1 || is_optional l2) -> unify env t1 t2; unify env u1 u2; @@ -2246,20 +2247,20 @@ and unify3 env t1 t1' t2 t2' = unify_list env tl1 tl2 | (_, _) -> raise (Unify []) - with Unify trace -> - t1'.desc <- d1; - raise (Unify trace) - end; - (* XXX Commentaires + changer "create_recursion" *) - if create_recursion then begin - match t2.desc with - Tconstr (p, tl, abbrev) -> - forget_abbrev abbrev p; - let t2'' = expand_head_unif !env t2 in - if not (closed_parameterized_type tl t2'') then - link_type (repr t2) (repr t2') - | _ -> - () (* t2 has already been expanded by update_level *) + end; + (* XXX Commentaires + changer "create_recursion" *) + if create_recursion then + match t2.desc with + Tconstr (p, tl, abbrev) -> + forget_abbrev abbrev p; + let t2'' = expand_head_unif !env t2 in + if not (closed_parameterized_type tl t2'') then + link_type (repr t2) (repr t2') + | _ -> + () (* t2 has already been expanded by update_level *) + with Unify trace -> + t1'.desc <- d1; + raise (Unify trace) end and unify_list env tl1 tl2 = @@ -2339,11 +2340,12 @@ and unify_row env row1 row2 = with Not_found -> ()) r2 end; + let fixed1 = row_fixed row1 and fixed2 = row_fixed row2 in let more = - if row1.row_fixed then rm1 else - if row2.row_fixed then rm2 else + if fixed1 then rm1 else + if fixed2 then rm2 else newty2 (min rm1.level rm2.level) (Tvar None) in - let fixed = row1.row_fixed || row2.row_fixed + let fixed = fixed1 || fixed2 and closed = row1.row_closed || row2.row_closed in let keep switch = List.for_all @@ -2377,8 +2379,8 @@ and unify_row env row1 row2 = if closed then filter_row_fields row.row_closed rest else rest in - if rest <> [] && (row.row_closed || row.row_fixed) - || closed && row.row_fixed && not row.row_closed then begin + if rest <> [] && (row.row_closed || row_fixed row) + || closed && row_fixed row && not row.row_closed then begin let t1 = mkvariant [] true and t2 = mkvariant rest false in raise (Unify [if row == row1 then (t1,t2) else (t2,t1)]) end; @@ -2387,7 +2389,7 @@ and unify_row env row1 row2 = if !trace_gadt_instances && rm.desc = Tnil then () else if !trace_gadt_instances then update_level !env rm.level (newgenty (Tvariant row)); - if row.row_fixed then + if row_fixed row then if more == rm then () else if is_Tvar rm then link_type rm more else unify env rm more else @@ -2401,7 +2403,7 @@ and unify_row env row1 row2 = set_more row1 r2; List.iter (fun (l,f1,f2) -> - try unify_row_field env row1.row_fixed row2.row_fixed more l f1 f2 + try unify_row_field env fixed1 fixed2 more l f1 f2 with Unify trace -> raise (Unify ((mkvariant [l,f1] true, mkvariant [l,f2] true) :: trace))) @@ -2419,7 +2421,7 @@ and unify_row_field env fixed1 fixed2 more l f1 f2 = | Reither(c1, tl1, m1, e1), Reither(c2, tl2, m2, e2) -> if e1 == e2 then () else let redo = - (m1 || m2 || + (m1 || m2 || fixed1 || fixed2 || !rigid_variants && (List.length tl1 = 1 || List.length tl2 = 1)) && begin match tl1 @ tl2 with [] -> false | t1 :: tl -> @@ -2440,8 +2442,8 @@ and unify_row_field env fixed1 fixed2 more l f1 f2 = let f1' = Reither(c1 || c2, tl1', m1 || m2, e) and f2' = Reither(c1 || c2, tl2', m1 || m2, e) in set_row_field e1 f1'; set_row_field e2 f2'; - | Reither(_, _, false, e1), Rabsent -> set_row_field e1 f2 - | Rabsent, Reither(_, _, false, e2) -> set_row_field e2 f1 + | Reither(_, _, false, e1), Rabsent when not fixed1 -> set_row_field e1 f2 + | Rabsent, Reither(_, _, false, e2) when not fixed2 -> set_row_field e2 f1 | Rabsent, Rabsent -> () | Reither(false, tl, _, e1), Rpresent(Some t2) when not fixed1 -> set_row_field e1 f2; @@ -2834,7 +2836,7 @@ let rec rigidify_rec vars ty = | Tvariant row -> let row = row_repr row in let more = repr row.row_more in - if is_Tvar more && not row.row_fixed then begin + if is_Tvar more && not (row_fixed row) then begin let more' = newty2 more.level more.desc in let row' = {row with row_fixed=true; row_fields=[]; row_more=more'} in link_type more (newty2 ty.level (Tvariant row')) diff --git a/typing/env.ml b/typing/env.ml index 99e083bc..334a7378 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: env.ml 12542 2012-06-01 14:06:31Z frisch $ *) +(* $Id: env.ml 12706 2012-07-13 08:49:06Z lefessan $ *) (* Environment handling *) @@ -171,7 +171,7 @@ and structure_components = { mutable comp_annotations: (string, (Annot.ident * int)) Tbl.t; mutable comp_constrs: (string, (constructor_description * int)) Tbl.t; mutable comp_labels: (string, (label_description * int)) Tbl.t; - mutable comp_constrs_by_path: + mutable comp_constrs_by_path: (string, (constructor_description list * int)) Tbl.t; mutable comp_types: (string, (type_declaration * int)) Tbl.t; mutable comp_modules: @@ -195,11 +195,11 @@ let subst_modtype_maker (subst, mty) = Subst.modtype subst mty let empty = { values = EnvTbl.empty; annotations = EnvTbl.empty; constrs = EnvTbl.empty; - labels = EnvTbl.empty; types = EnvTbl.empty; + labels = EnvTbl.empty; types = EnvTbl.empty; constrs_by_path = EnvTbl.empty; modules = EnvTbl.empty; modtypes = EnvTbl.empty; components = EnvTbl.empty; classes = EnvTbl.empty; - cltypes = EnvTbl.empty; + cltypes = EnvTbl.empty; summary = Env_empty; local_constraints = false; gadt_instances = []; in_signature = false; } @@ -730,7 +730,7 @@ let rec scrape_modtype mty env = (* Compute constructor descriptions *) let constructors_of_type ty_path decl = - let handle_variants cstrs = + let handle_variants cstrs = Datarepr.constructor_descrs (newgenty (Tconstr(ty_path, decl.type_params, ref Mnil))) cstrs decl.type_private @@ -798,7 +798,7 @@ and components_of_module_maker (env, sub, path, mty) = Mty_signature sg -> let c = { comp_values = Tbl.empty; comp_annotations = Tbl.empty; - comp_constrs = Tbl.empty; + comp_constrs = Tbl.empty; comp_labels = Tbl.empty; comp_types = Tbl.empty; comp_constrs_by_path = Tbl.empty; comp_modules = Tbl.empty; comp_modtypes = Tbl.empty; @@ -827,7 +827,7 @@ and components_of_module_maker (env, sub, path, mty) = Tbl.add (Ident.name id) (decl', nopos) c.comp_types; let constructors = constructors_of_type path decl' in c.comp_constrs_by_path <- - Tbl.add (Ident.name id) + Tbl.add (Ident.name id) (List.map snd constructors, nopos) c.comp_constrs_by_path; List.iter (fun (name, descr) -> @@ -886,8 +886,8 @@ and components_of_module_maker (env, sub, path, mty) = | Mty_ident p -> Structure_comps { comp_values = Tbl.empty; comp_annotations = Tbl.empty; - comp_constrs = Tbl.empty; - comp_labels = Tbl.empty; + comp_constrs = Tbl.empty; + comp_labels = Tbl.empty; comp_types = Tbl.empty; comp_constrs_by_path = Tbl.empty; comp_modules = Tbl.empty; comp_modtypes = Tbl.empty; comp_components = Tbl.empty; comp_classes = Tbl.empty; @@ -956,8 +956,8 @@ and store_type id path info env = constructors env.constrs; - constrs_by_path = - EnvTbl.add id + constrs_by_path = + EnvTbl.add id (path,List.map snd constructors) env.constrs_by_path; labels = List.fold_right @@ -1303,6 +1303,19 @@ let initial = Predef.build_initial_env add_type add_exception empty (* Return the environment summary *) let summary env = env.summary +let keep_only_summary env = + { empty with + summary = env.summary; + local_constraints = env.local_constraints; + in_signature = env.in_signature; +} + +let env_of_only_summary env_from_summary env = + let new_env = env_from_summary env.summary Subst.identity in + { new_env with + local_constraints = env.local_constraints; + in_signature = env.in_signature; + } (* Error report *) diff --git a/typing/env.mli b/typing/env.mli index d8ca2837..fad7d773 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: env.mli 12542 2012-06-01 14:06:31Z frisch $ *) +(* $Id: env.mli 12706 2012-07-13 08:49:06Z lefessan $ *) (* Environment handling *) @@ -141,6 +141,14 @@ val crc_units: Consistbl.t val summary: t -> summary +(* Return an equivalent environment where all fields have been reset, + except the summary. The initial environment can be rebuilt from the + summary, using Envaux.env_of_only_summary. *) + +val keep_only_summary : t -> t +val env_of_only_summary : (summary -> Subst.t -> t) -> t -> t + + (* Error report *) type error = diff --git a/typing/parmatch.ml b/typing/parmatch.ml index e23153c4..a0d42baf 100644 --- a/typing/parmatch.ml +++ b/typing/parmatch.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: parmatch.ml 12520 2012-05-31 07:41:37Z garrigue $ *) +(* $Id: parmatch.ml 12726 2012-07-18 03:34:36Z garrigue $ *) (* Detection of partial matches and unused match cases. *) @@ -653,7 +653,7 @@ let full_match ignore_generalized closing env = match env with env in let row = row_of_pat p in - if closing && not row.row_fixed then + if closing && not (Btype.row_fixed row) then (* closing=true, we are considering the variant as closed *) List.for_all (fun (tag,f) -> @@ -1239,7 +1239,7 @@ let rec pressure_variants tdefs = function begin match constrs, tdefs with ({pat_desc=Tpat_variant _} as p,_):: _, Some env -> let row = row_of_pat p in - if row.row_fixed + if Btype.row_fixed row || pressure_variants None (filter_extra pss) then () else close_variant env row | _ -> () diff --git a/typing/printtyped.ml b/typing/printtyped.ml index 28969ff1..55a0e2ec 100644 --- a/typing/printtyped.ml +++ b/typing/printtyped.ml @@ -230,19 +230,26 @@ and pattern i ppf x = line i ppf "Ppat_lazy\n"; pattern i ppf p; -and expression i ppf x = - line i ppf "expression %a\n" fmt_location x.exp_loc; - let i = i+1 in - match x.exp_extra with - | (Texp_constraint (cto1, cto2), _) :: rem -> +and expression_extra i ppf x = + match x with + | Texp_constraint (cto1, cto2) -> line i ppf "Pexp_constraint\n"; option i core_type ppf cto1; option i core_type ppf cto2; - expression i ppf { x with exp_extra = rem } - | (Texp_open (m, _,_), _) :: rem -> + | Texp_open (m, _, _) -> line i ppf "Pexp_open \"%a\"\n" fmt_path m; - expression i ppf { x with exp_extra = rem } - | [] -> + | Texp_poly cto -> + line i ppf "Pexp_poly\n"; + option i core_type ppf cto; + | Texp_newtype s -> + line i ppf "Pexp_newtype \"%s\"\n" s; + +and expression i ppf x = + line i ppf "expression %a\n" fmt_location x.exp_loc; + let i = + List.fold_left (fun i (extra,_) -> expression_extra i ppf extra; i+1) + (i+1) x.exp_extra + in match x.exp_desc with | Texp_ident (li,_,_) -> line i ppf "Pexp_ident %a\n" fmt_path li; | Texp_instvar (_, li,_) -> line i ppf "Pexp_instvar %a\n" fmt_path li; @@ -342,16 +349,9 @@ and expression i ppf x = | Texp_lazy (e) -> line i ppf "Pexp_lazy"; expression i ppf e; - | Texp_poly (e, cto) -> - line i ppf "Pexp_poly\n"; - expression i ppf e; - option i core_type ppf cto; | Texp_object (s, _) -> line i ppf "Pexp_object"; class_structure i ppf s - | Texp_newtype (s, e) -> - line i ppf "Pexp_newtype \"%s\"\n" s; - expression i ppf e | Texp_pack me -> line i ppf "Pexp_pack"; module_expr i ppf me diff --git a/typing/typeclass.ml b/typing/typeclass.ml index a6847c64..cae89d4d 100644 --- a/typing/typeclass.ml +++ b/typing/typeclass.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: typeclass.ml 12520 2012-05-31 07:41:37Z garrigue $ *) +(* $Id: typeclass.ml 12616 2012-06-19 10:51:33Z garrigue $ *) open Misc open Parsetree @@ -343,12 +343,13 @@ let type_constraint val_env sty sty' loc = end; (cty, cty') -let mkpat d = { ppat_desc = d; ppat_loc = Location.none } -let make_method cl_num expr = +let make_method self_loc cl_num expr = + let mkpat d = { ppat_desc = d; ppat_loc = self_loc } in + let mkid s = mkloc s self_loc in { pexp_desc = Pexp_function ("", None, - [mkpat (Ppat_alias (mkpat(Ppat_var (mknoloc "self-*")), - mknoloc ("self-" ^ cl_num))), + [mkpat (Ppat_alias (mkpat (Ppat_var (mkid "self-*")), + mkid ("self-" ^ cl_num))), expr]); pexp_loc = expr.pexp_loc } @@ -492,7 +493,7 @@ let class_type env scty = (*******************************) -let rec class_field cl_num self_type meths vars +let rec class_field self_loc cl_num self_type meths vars (val_env, met_env, par_env, fields, concr_meths, warn_vals, inher) cf = let loc = cf.pcf_loc in @@ -630,7 +631,7 @@ let rec class_field cl_num self_type meths vars with Ctype.Unify trace -> raise(Error(loc, Field_type_mismatch ("method", lab.txt, trace))) end; - let meth_expr = make_method cl_num expr in + let meth_expr = make_method self_loc cl_num expr in (* backup variables for Pexp_override *) let vars_local = !vars in @@ -657,7 +658,7 @@ let rec class_field cl_num self_type meths vars concr_meths, warn_vals, inher) | Pcf_init expr -> - let expr = make_method cl_num expr in + let expr = make_method self_loc cl_num expr in let vars_local = !vars in let field = lazy begin @@ -678,6 +679,9 @@ and class_structure cl_num final val_env met_env loc (* Environment for substructures *) let par_env = met_env in + (* Location of self. Used for locations of self arguments *) + let self_loc = {spat.ppat_loc with Location.loc_ghost = true} in + (* Self type, with a dummy method preventing it from being closed/escaped. *) let self_type = Ctype.newvar () in Ctype.unify val_env @@ -718,7 +722,7 @@ and class_structure cl_num final val_env met_env loc (* Typing of class fields *) let (_, _, _, fields, concr_meths, _, inher) = - List.fold_left (class_field cl_num self_type meths vars) + List.fold_left (class_field self_loc cl_num self_type meths vars) (val_env, meth_env, par_env, [], Concr.empty, Concr.empty, []) str in diff --git a/typing/typecore.ml b/typing/typecore.ml index 81baa2bd..12262788 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: typecore.ml 12536 2012-06-01 08:08:53Z garrigue $ *) +(* $Id: typecore.ml 12726 2012-07-18 03:34:36Z garrigue $ *) (* Typechecking for the core language *) @@ -330,7 +330,7 @@ let finalize_variant pat = begin match opat with None -> assert false | Some pat -> List.iter (unify_pat pat.pat_env pat) (ty::tl) end - | Reither (c, l, true, e) when not row.row_fixed -> + | Reither (c, l, true, e) when not (row_fixed row) -> set_row_field e (Reither (c, [], false, ref None)) | _ -> () end; @@ -526,7 +526,7 @@ let rec find_record_qual = function | ({ txt = Longident.Ldot (modname, _) }, _) :: _ -> Some modname | _ :: rest -> find_record_qual rest -let type_label_a_list ?labels env loc type_lbl_a lid_a_list = +let type_label_a_list ?labels env type_lbl_a lid_a_list = let record_qual = find_record_qual lid_a_list in let lbl_a_list = List.map @@ -536,9 +536,9 @@ let type_label_a_list ?labels env loc type_lbl_a lid_a_list = Longident.Lident s, Some labels, _ when Hashtbl.mem labels s -> (Hashtbl.find labels s : Path.t * Types.label_description) | Longident.Lident s, _, Some modname -> - Typetexp.find_label env loc (Longident.Ldot (modname, s)) + Typetexp.find_label env lid.loc (Longident.Ldot (modname, s)) | _ -> - Typetexp.find_label env loc lid.txt + Typetexp.find_label env lid.loc lid.txt in (path, lid, label, a) ) lid_a_list in (* Invariant: records are sorted in the typed tree *) @@ -764,7 +764,7 @@ let rec type_pat ~constrs ~labels ~no_existentials ~mode ~env sp expected_ty = (label_path, label_lid, label, arg) in let lbl_pat_list = - type_label_a_list ?labels !env loc type_label_pat lid_sp_list in + type_label_a_list ?labels !env type_label_pat lid_sp_list in check_recordpat_labels loc lbl_pat_list closed; rp { pat_desc = Tpat_record (lbl_pat_list, closed); @@ -994,9 +994,6 @@ let rec is_nonexpansive exp = match exp.exp_desc with Texp_ident(_,_,_) -> true | Texp_constant _ -> true - | Texp_poly (e, _) - | Texp_newtype (_, e) - -> is_nonexpansive e | Texp_let(rec_flag, pat_exp_list, body) -> List.for_all (fun (pat, exp) -> is_nonexpansive exp) pat_exp_list && is_nonexpansive body @@ -1753,7 +1750,7 @@ and type_expect ?in_function env sexp ty_expected = end | Pexp_record(lid_sexp_list, opt_sexp) -> let lbl_exp_list = - type_label_a_list env loc (type_label_exp true env loc ty_expected) + type_label_a_list env (type_label_exp true env loc ty_expected) lid_sexp_list in let rec check_duplicates seen_pos lid_sexp lbl_exp = match (lid_sexp, lbl_exp) with @@ -2247,7 +2244,7 @@ and type_expect ?in_function env sexp ty_expected = match (expand_head env ty).desc with Tpoly (ty', []) -> let exp = type_expect env sbody ty' in - re { exp with exp_type = instance env ty } + { exp with exp_type = instance env ty } | Tpoly (ty', tl) -> (* One more level to generalize locally *) begin_def (); @@ -2260,16 +2257,19 @@ and type_expect ?in_function env sexp ty_expected = let exp = type_expect env sbody ty'' in end_def (); check_univars env false "method" exp ty_expected vars; - re { exp with exp_type = instance env ty } + { exp with exp_type = instance env ty } | Tvar _ -> let exp = type_exp env sbody in let exp = {exp with exp_type = newty (Tpoly (exp.exp_type, []))} in unify_exp env exp ty; - re exp + exp | _ -> assert false in - re { exp with exp_desc = Texp_poly(exp, cty) } + re { exp with exp_extra = (Texp_poly cty, loc) :: exp.exp_extra } | Pexp_newtype(name, sbody) -> + let ty = newvar () in + (* remember original level *) + begin_def (); (* Create a fake abstract type declaration for name. *) let level = get_current_level () in let decl = { @@ -2283,9 +2283,6 @@ and type_expect ?in_function env sexp ty_expected = type_loc = loc; } in - let ty = newvar () in - (* remember original level *) - begin_def (); Ident.set_current_time ty.level; let (id, new_env) = Env.enter_type name decl env in Ctype.init_def(Ident.current_time()); @@ -2312,7 +2309,8 @@ and type_expect ?in_function env sexp ty_expected = (* non-expansive if the body is non-expansive, so we don't introduce any new extra node in the typed AST. *) - rue { body with exp_loc = sexp.pexp_loc; exp_type = ety } + rue { body with exp_loc = loc; exp_type = ety; + exp_extra = (Texp_newtype name, loc) :: body.exp_extra } | Pexp_pack m -> let (p, nl, tl) = match Ctype.expand_head env (instance env ty_expected) with @@ -2357,7 +2355,7 @@ and type_label_exp create env loc ty_expected begin try unify env (instance_def ty_res) (instance env ty_expected) with Unify trace -> - raise(Error(loc , Label_mismatch(lid_of_label label, trace))) + raise (Error(lid.loc, Label_mismatch(lid_of_label label, trace))) end; (* Instantiate so that we can generalize internal nodes *) let ty_arg = instance_def ty_arg in @@ -2367,8 +2365,10 @@ and type_label_exp create env loc ty_expected generalize_structure ty_arg end; if label.lbl_private = Private then - raise(Error(loc, if create then Private_type ty_expected - else Private_label (lid_of_label label, ty_expected))); + if create then + raise (Error(loc, Private_type ty_expected)) + else + raise (Error(lid.loc, Private_label(lid_of_label label, ty_expected))); let arg = let snap = if vars = [] then None else Some (Btype.snapshot ()) in let arg = type_argument env sarg ty_arg (instance env ty_arg) in diff --git a/typing/typedecl.ml b/typing/typedecl.ml index cfc3d568..37ff396a 100644 --- a/typing/typedecl.ml +++ b/typing/typedecl.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: typedecl.ml 12550 2012-06-04 10:02:17Z frisch $ *) +(* $Id: typedecl.ml 12609 2012-06-14 10:47:30Z garrigue $ *) (**** Typing of type definitions ****) @@ -402,12 +402,25 @@ let check_abbrev env (_, sdecl) (id, decl) = end | _ -> () +(* Check that recursion is well-founded *) + +let check_well_founded env loc path decl = + Misc.may + (fun body -> + try Ctype.correct_abbrev env path decl.type_params body with + | Ctype.Recursive_abbrev -> + raise(Error(loc, Recursive_abbrev (Path.name path))) + | Ctype.Unify trace -> raise(Error(loc, Type_clash trace))) + decl.type_manifest + (* Check for ill-defined abbrevs *) let check_recursion env loc path decl to_check = (* to_check is true for potentially mutually recursive paths. (path, decl) is the type declaration to be checked. *) + if decl.type_params = [] then () else + let visited = ref [] in let rec check_regular cpath args prev_exp ty = @@ -450,22 +463,13 @@ let check_recursion env loc path decl to_check = Btype.iter_type_expr (check_regular cpath args prev_exp) ty end in - match decl.type_manifest with - | None -> () - | Some body -> - (* Check that recursion is well-founded *) - begin try - Ctype.correct_abbrev env path decl.type_params body - with Ctype.Recursive_abbrev -> - raise(Error(loc, Recursive_abbrev (Path.name path))) - | Ctype.Unify trace -> raise(Error(loc, Type_clash trace)) - end; - (* Check that recursion is regular *) - if decl.type_params = [] then () else + Misc.may + (fun body -> let (args, body) = Ctype.instance_parameterized_type ~keep_names:true decl.type_params body in - check_regular path args [] body + check_regular path args [] body) + decl.type_manifest let check_abbrev_recursion env id_loc_list (id, _, tdecl) = let decl = tdecl.typ_type in @@ -830,6 +834,9 @@ let transl_type_decl env name_sdecl_list = List.map2 (fun id (_,sdecl) -> (id, sdecl.ptype_loc)) id_list name_sdecl_list in + List.iter (fun (id, decl) -> + check_well_founded newenv (List.assoc id id_loc_list) (Path.Pident id) decl) + decls; List.iter (check_abbrev_recursion newenv id_loc_list) tdecls; (* Check that all type variable are closed *) List.iter2 @@ -1019,6 +1026,7 @@ let approx_type_decl env name_sdecl_list = let check_recmod_typedecl env loc recmod_ids path decl = (* recmod_ids is the list of recursively-defined module idents. (path, decl) is the type declaration to be checked. *) + check_well_founded env loc path decl; check_recursion env loc path decl (fun path -> List.exists (fun id -> Path.isfree id path) recmod_ids) diff --git a/typing/typedtree.ml b/typing/typedtree.ml index 48c68c98..c3ba3b71 100644 --- a/typing/typedtree.ml +++ b/typing/typedtree.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: typedtree.ml 12520 2012-05-31 07:41:37Z garrigue $ *) +(* $Id: typedtree.ml 12681 2012-07-10 08:33:16Z garrigue $ *) (* Abstract syntax tree after typing *) @@ -61,6 +61,8 @@ and expression = and exp_extra = | Texp_constraint of core_type option * core_type option | Texp_open of Path.t * Longident.t loc * Env.t + | Texp_poly of core_type option + | Texp_newtype of string and expression_desc = Texp_ident of Path.t * Longident.t loc * Types.value_description @@ -98,9 +100,7 @@ and expression_desc = | Texp_assert of expression | Texp_assertfalse | Texp_lazy of expression - | Texp_poly of expression * core_type option | Texp_object of class_structure * string list - | Texp_newtype of string * expression | Texp_pack of module_expr and meth = diff --git a/typing/typedtree.mli b/typing/typedtree.mli index 0a32ba2a..38b5e258 100644 --- a/typing/typedtree.mli +++ b/typing/typedtree.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: typedtree.mli 12521 2012-05-31 07:57:32Z garrigue $ *) +(* $Id: typedtree.mli 12681 2012-07-10 08:33:16Z garrigue $ *) (* Abstract syntax tree after typing *) @@ -60,6 +60,8 @@ and expression = and exp_extra = | Texp_constraint of core_type option * core_type option | Texp_open of Path.t * Longident.t loc * Env.t + | Texp_poly of core_type option + | Texp_newtype of string and expression_desc = Texp_ident of Path.t * Longident.t loc * Types.value_description @@ -97,9 +99,7 @@ and expression_desc = | Texp_assert of expression | Texp_assertfalse | Texp_lazy of expression - | Texp_poly of expression * core_type option | Texp_object of class_structure * string list - | Texp_newtype of string * expression | Texp_pack of module_expr and meth = -- 2.30.2