From b4487092fcc7bc534956f23f47e96303d1a90ba8 Mon Sep 17 00:00:00 2001 From: Stephane Glondu Date: Fri, 12 Jun 2015 16:23:52 +0200 Subject: [PATCH] Imported Upstream version 4.02.2~rc1 --- .depend | 215 +- .gitignore | 31 +- .merlin | 51 + .travis-ci.sh | 8 +- Changes | 455 +++- INSTALL | 17 +- Makefile | 42 +- Makefile.nt | 51 +- README.win32 | 47 +- VERSION | 2 +- asmcomp/amd64/emit.mlp | 6 + asmcomp/arm/emit.mlp | 4 +- asmcomp/arm64/arch.ml | 13 + asmcomp/arm64/emit.mlp | 302 ++- asmcomp/asmlink.ml | 12 +- asmcomp/branch_relaxation.ml | 138 + asmcomp/branch_relaxation.mli | 26 + asmcomp/branch_relaxation_intf.ml | 64 + asmcomp/cmmgen.ml | 33 +- asmcomp/emitaux.ml | 9 + asmcomp/emitaux.mli | 1 + asmcomp/power/emit.mlp | 192 +- asmrun/.depend | 1797 +++++++------ asmrun/Makefile | 86 +- asmrun/Makefile.nt | 4 +- asmrun/amd64.S | 8 +- asmrun/backtrace.c | 29 +- asmrun/fail.c | 20 +- asmrun/i386.S | 2 +- asmrun/natdynlink.c | 31 +- asmrun/roots.c | 16 +- asmrun/signals_asm.c | 12 +- asmrun/signals_osdep.h | 29 +- asmrun/stack.h | 13 + asmrun/startup.c | 32 +- boot/ocamlc | Bin 1715876 -> 1745784 bytes boot/ocamldep | Bin 532314 -> 556857 bytes boot/ocamllex | Bin 254314 -> 256437 bytes bytecomp/bytelink.ml | 49 +- bytecomp/lambda.ml | 7 +- bytecomp/symtable.ml | 4 +- bytecomp/translmod.ml | 6 +- byterun/.depend | 1144 +++++--- byterun/.ignore | 6 +- byterun/Makefile | 59 +- byterun/Makefile.common | 35 +- byterun/Makefile.nt | 21 +- byterun/alloc.c | 16 +- byterun/array.c | 10 +- byterun/backtrace.c | 44 +- byterun/callback.c | 27 +- byterun/caml/address_class.h | 82 + byterun/{ => caml}/alloc.h | 0 byterun/{ => caml}/backtrace.h | 0 byterun/{ => caml}/callback.h | 2 + byterun/{ => caml}/compact.h | 0 byterun/{ => caml}/compare.h | 0 byterun/{ => caml}/compatibility.h | 0 byterun/{ => caml}/config.h | 4 +- byterun/{ => caml}/custom.h | 0 byterun/{ => caml}/debugger.h | 0 byterun/{ => caml}/dynlink.h | 0 byterun/{ => caml}/exec.h | 0 byterun/{ => caml}/fail.h | 0 byterun/{ => caml}/finalise.h | 0 byterun/{ => caml}/fix_code.h | 0 byterun/{ => caml}/freelist.h | 0 byterun/{ => caml}/gc.h | 0 byterun/{ => caml}/gc_ctrl.h | 0 byterun/{ => caml}/globroots.h | 0 byterun/{ => caml}/hash.h | 9 +- byterun/{ => caml}/instrtrace.h | 0 byterun/{ => caml}/instruct.h | 0 byterun/{ => caml}/int64_emul.h | 0 byterun/{ => caml}/int64_format.h | 0 byterun/{ => caml}/int64_native.h | 0 byterun/{ => caml}/interp.h | 0 byterun/{ => caml}/intext.h | 0 byterun/{ => caml}/io.h | 0 byterun/{ => caml}/major_gc.h | 0 byterun/{ => caml}/md5.h | 0 byterun/{ => caml}/memory.h | 40 +- byterun/{ => caml}/minor_gc.h | 6 +- byterun/{ => caml}/misc.h | 15 + byterun/{ => caml}/mlvalues.h | 4 +- byterun/{ => caml}/osdeps.h | 0 byterun/{ => caml}/prims.h | 0 byterun/{ => caml}/printexc.h | 0 byterun/{ => caml}/reverse.h | 0 byterun/{ => caml}/roots.h | 0 byterun/{ => caml}/signals.h | 0 byterun/{ => caml}/signals_machdep.h | 0 byterun/{ => caml}/stacks.h | 0 byterun/{ => caml}/startup.h | 0 byterun/{ => caml}/sys.h | 0 byterun/{ => caml}/ui.h | 0 byterun/{ => caml}/weak.h | 0 byterun/compact.c | 23 +- byterun/compare.c | 10 +- byterun/custom.c | 10 +- byterun/debugger.c | 24 +- byterun/dynlink.c | 28 +- byterun/extern.c | 24 +- byterun/fail.c | 20 +- byterun/finalise.c | 10 +- byterun/fix_code.c | 86 +- byterun/floats.c | 20 +- byterun/freelist.c | 16 +- byterun/gc_ctrl.c | 24 +- byterun/globroots.c | 10 +- byterun/hash.c | 8 +- byterun/instrtrace.c | 12 +- byterun/intern.c | 26 +- byterun/interp.c | 34 +- byterun/ints.c | 14 +- byterun/io.c | 20 +- byterun/lexing.c | 6 +- byterun/main.c | 6 +- byterun/major_gc.c | 55 +- byterun/md5.c | 28 +- byterun/memory.c | 23 +- byterun/meta.c | 26 +- byterun/minor_gc.c | 40 +- byterun/misc.c | 13 +- byterun/obj.c | 20 +- byterun/parsing.c | 8 +- byterun/printexc.c | 14 +- byterun/roots.c | 18 +- byterun/signals.c | 22 +- byterun/signals_byt.c | 10 +- byterun/stacks.c | 10 +- byterun/startup.c | 58 +- byterun/str.c | 8 +- byterun/sys.c | 22 +- byterun/terminfo.c | 10 +- byterun/unix.c | 16 +- byterun/weak.c | 10 +- byterun/win32.c | 19 +- compilerlibs/.gitignore | 0 config/Makefile.mingw | 2 +- config/Makefile.mingw64 | 2 +- config/Makefile.msvc | 2 +- config/Makefile.msvc64 | 2 +- config/auto-aux/nanosecond_stat.c | 28 + config/auto-aux/searchpath | 11 +- configure | 100 +- debugger/.depend | 2 +- debugger/Makefile.shared | 12 +- debugger/command_line.ml | 6 +- debugger/debugcom.ml | 18 +- debugger/source.ml | 2 + driver/compenv.ml | 15 +- driver/compenv.mli | 8 +- driver/compile.ml | 68 +- driver/main.ml | 8 + driver/main_args.ml | 24 +- driver/main_args.mli | 3 + driver/optcompile.ml | 16 +- driver/optmain.ml | 3 + driver/pparse.ml | 18 +- driver/pparse.mli | 5 + emacs/caml-types.el | 57 +- experimental/doligez/check-bounds.diff | 149 ++ experimental/doligez/checkheaders | 152 ++ experimental/frisch/Makefile | 79 + experimental/frisch/copy_typedef.ml | 181 ++ experimental/frisch/eval.ml | 141 + experimental/frisch/extension_points.txt | 740 ++++++ experimental/frisch/ifdef.ml | 118 + experimental/frisch/js_syntax.ml | 112 + experimental/frisch/metaquot_test.ml | 27 + experimental/frisch/minidoc.ml | 72 + experimental/frisch/nomli.ml | 114 + experimental/frisch/ppx_builder.ml | 100 + experimental/frisch/ppx_matches.ml | 29 + experimental/frisch/test_builder.ml | 19 + experimental/frisch/test_copy_typedef.ml | 19 + experimental/frisch/test_copy_typedef.mli | 20 + experimental/frisch/test_eval.ml | 37 + experimental/frisch/test_ifdef.ml | 25 + experimental/frisch/test_js.ml | 22 + experimental/frisch/test_matches.ml | 3 + experimental/frisch/test_nomli.ml | 30 + experimental/frisch/testdoc.mli | 29 + experimental/frisch/unused_exported_values.ml | 63 + experimental/garrigue/.cvsignore | 2 + experimental/garrigue/caml_set_oid.diff | 141 + experimental/garrigue/coerce.diff | 93 + experimental/garrigue/countchars.ml | 16 + experimental/garrigue/dirs_multimatch | 1 + experimental/garrigue/dirs_poly | 1 + experimental/garrigue/fixedtypes.ml | 77 + experimental/garrigue/gadt-escape-check.diff | 519 ++++ .../garrigue/generative-functors.diff | 1008 +++++++ experimental/garrigue/impure-functors.diff | 223 ++ experimental/garrigue/marshal_objects.diff | 800 ++++++ experimental/garrigue/module-errors.diff | 403 +++ experimental/garrigue/multimatch.diff | 1418 ++++++++++ experimental/garrigue/multimatch.ml | 158 ++ experimental/garrigue/newlabels.ps | 1458 ++++++++++ experimental/garrigue/nongeneral-let.diff | 428 +++ experimental/garrigue/objvariant.diff | 354 +++ experimental/garrigue/objvariant.ml | 42 + experimental/garrigue/parser-lessminus.diff | 77 + .../garrigue/pattern-local-types.diff | 467 ++++ experimental/garrigue/printers.ml | 11 + .../garrigue/propagation-to-patterns.diff | 212 ++ experimental/garrigue/show_types.diff | 419 +++ experimental/garrigue/tests.ml | 22 + experimental/garrigue/valvirt.diff | 2349 +++++++++++++++++ .../garrigue/variable-names-Tvar.diff | 1656 ++++++++++++ experimental/garrigue/variable-names.ml | 4 + experimental/garrigue/varunion.ml | 435 +++ experimental/garrigue/with-module-type.diff | 530 ++++ lex/.depend | 6 +- lex/Makefile | 14 +- lex/Makefile.nt | 11 +- man/ocaml.m | 4 +- man/ocamlc.m | 37 +- man/ocamlopt.m | 17 +- man/ocamlrun.m | 3 + ocamlbuild/.depend | 50 +- ocamlbuild/Makefile | 30 +- ocamlbuild/Makefile.noboot | 227 -- ocamlbuild/command.ml | 5 +- ocamlbuild/command.mli | 2 + ocamlbuild/configuration.ml | 9 +- ocamlbuild/main.ml | 23 +- ocamlbuild/my_unix.ml | 6 + ocamlbuild/ocaml_compiler.ml | 8 +- ocamlbuild/ocaml_compiler.mli | 2 + ocamlbuild/ocaml_dependencies.ml | 58 +- ocamlbuild/ocaml_specific.ml | 44 +- ocamlbuild/ocaml_tools.ml | 10 +- ocamlbuild/ocamlbuild_unix_plugin.ml | 11 +- ocamlbuild/options.ml | 4 +- ocamlbuild/test/good-output | 1473 +++++++++++ ocamlbuild/test/runtest.sh | 56 + ocamlbuild/test/test1/foo.ml | 13 + ocamlbuild/test/test10/dbdi | 24 + ocamlbuild/test/test10/test.sh | 18 + ocamlbuild/test/test11/_tags | 14 + ocamlbuild/test/test11/a/aa.ml | 13 + ocamlbuild/test/test11/a/aa.mli | 13 + ocamlbuild/test/test11/b/bb.ml | 13 + ocamlbuild/test/test11/b/libb.mllib | 1 + ocamlbuild/test/test11/myocamlbuild.ml | 17 + ocamlbuild/test/test11/test.sh | 25 + ocamlbuild/test/test2/_tags | 15 + ocamlbuild/test/test2/tata.ml | 13 + ocamlbuild/test/test2/tata.mli | 14 + ocamlbuild/test/test2/test.sh | 30 + ocamlbuild/test/test2/titi.ml | 13 + ocamlbuild/test/test2/toto.ml | 17 + ocamlbuild/test/test2/tutu.ml | 14 + ocamlbuild/test/test2/tutu.mli | 15 + ocamlbuild/test/test2/tyty.mli | 13 + ocamlbuild/test/test2/vivi1.ml | 14 + ocamlbuild/test/test2/vivi2.ml | 14 + ocamlbuild/test/test2/vivi3.ml | 14 + ocamlbuild/test/test3/_tags | 13 + ocamlbuild/test/test3/a.ml | 13 + ocamlbuild/test/test3/a.mli | 13 + ocamlbuild/test/test3/b.ml | 13 + ocamlbuild/test/test3/b.mli | 13 + ocamlbuild/test/test3/c.ml | 13 + ocamlbuild/test/test3/c.mli | 13 + ocamlbuild/test/test3/d.ml | 13 + ocamlbuild/test/test3/d.mli | 13 + ocamlbuild/test/test3/e.ml | 13 + ocamlbuild/test/test3/e.mli | 13 + ocamlbuild/test/test3/f.ml | 14 + ocamlbuild/test/test3/f.mli | 13 + ocamlbuild/test/test3/proj.odocl | 1 + ocamlbuild/test/test3/test.sh | 23 + ocamlbuild/test/test4/_tags | 14 + ocamlbuild/test/test4/a/aa.ml | 13 + ocamlbuild/test/test4/a/aa.mli | 13 + ocamlbuild/test/test4/b/bb.ml | 14 + ocamlbuild/test/test4/test.sh | 23 + ocamlbuild/test/test5/_tags | 13 + ocamlbuild/test/test5/a.ml | 13 + ocamlbuild/test/test5/a.mli | 13 + ocamlbuild/test/test5/b.ml | 13 + ocamlbuild/test/test5/c.mlpack | 1 + ocamlbuild/test/test5/d.ml | 13 + ocamlbuild/test/test5/stack.ml | 13 + ocamlbuild/test/test5/test.sh | 23 + ocamlbuild/test/test6/a.ml | 13 + ocamlbuild/test/test6/a.mli | 13 + ocamlbuild/test/test6/b.ml | 13 + ocamlbuild/test/test6/b.mli | 13 + ocamlbuild/test/test6/b.mli.v1 | 13 + ocamlbuild/test/test6/b.mli.v2 | 14 + ocamlbuild/test/test6/d.ml | 14 + ocamlbuild/test/test6/d.mli | 13 + ocamlbuild/test/test6/d.mli.v1 | 14 + ocamlbuild/test/test6/d.mli.v2 | 13 + ocamlbuild/test/test6/main.ml | 13 + ocamlbuild/test/test6/main.mli | 13 + ocamlbuild/test/test6/test.sh | 37 + ocamlbuild/test/test7/_tags | 13 + ocamlbuild/test/test7/aa.ml | 13 + ocamlbuild/test/test7/bb.mli | 13 + ocamlbuild/test/test7/bb1.ml | 13 + ocamlbuild/test/test7/bb2.ml | 15 + ocamlbuild/test/test7/bb3.ml | 15 + ocamlbuild/test/test7/bbcc.mllib | 1 + ocamlbuild/test/test7/c2.ml | 13 + ocamlbuild/test/test7/c2.mli | 13 + ocamlbuild/test/test7/c3.ml | 13 + ocamlbuild/test/test7/cc.ml | 13 + ocamlbuild/test/test7/cool_plugin.ml | 13 + ocamlbuild/test/test7/main.ml | 13 + ocamlbuild/test/test7/myocamlbuild.ml | 19 + ocamlbuild/test/test7/test.sh | 30 + ocamlbuild/test/test8/a.ml | 13 + ocamlbuild/test/test8/myocamlbuild.ml | 28 + ocamlbuild/test/test8/test.sh | 23 + ocamlbuild/test/test9/dbgl | 22 + ocamlbuild/test/test9/test.sh | 18 + ocamlbuild/test/test9/testglob.ml | 146 + ocamlbuild/test/test_virtual/foo.itarget | 1 + ocamlbuild/test/test_virtual/foo1 | 1 + ocamlbuild/test/test_virtual/foo2 | 1 + ocamlbuild/test/test_virtual/myocamlbuild.ml | 23 + ocamlbuild/test/test_virtual/test.sh | 28 + ocamlbuild/testsuite/internal.ml | 7 + ocamldoc/.depend | 26 +- ocamldoc/Makefile | 20 +- ocamldoc/Makefile.nt | 20 +- ocamldoc/odoc_ast.ml | 28 +- ocamldoc/odoc_name.ml | 1 + ocamldoc/odoc_sig.ml | 19 +- otherlibs/Makefile | 6 +- otherlibs/Makefile.shared | 3 +- otherlibs/bigarray/.depend | 41 +- otherlibs/bigarray/Makefile | 4 +- otherlibs/bigarray/Makefile.nt | 4 +- otherlibs/bigarray/bigarray.h | 14 +- otherlibs/bigarray/bigarray.mli | 6 +- otherlibs/bigarray/bigarray_stubs.c | 14 +- otherlibs/bigarray/mmap_unix.c | 12 +- otherlibs/bigarray/mmap_win32.c | 10 +- otherlibs/dynlink/Makefile | 15 +- otherlibs/graph/.depend | 167 +- otherlibs/graph/Makefile | 4 +- otherlibs/graph/draw.c | 2 +- otherlibs/graph/dump_img.c | 4 +- otherlibs/graph/events.c | 4 +- otherlibs/graph/fill.c | 2 +- otherlibs/graph/image.c | 4 +- otherlibs/graph/libgraph.h | 2 +- otherlibs/graph/make_img.c | 2 +- otherlibs/graph/open.c | 8 +- otherlibs/graph/text.c | 2 +- otherlibs/num/.depend | 26 +- otherlibs/num/Makefile | 4 +- otherlibs/num/bng.c | 2 +- otherlibs/num/bng.h | 2 +- otherlibs/num/nat.ml | 8 +- otherlibs/num/nat_stubs.c | 16 +- otherlibs/num/num.ml | 105 +- otherlibs/str/.depend | 14 +- otherlibs/str/Makefile | 4 +- otherlibs/str/strstubs.c | 8 +- otherlibs/systhreads/.depend | 25 +- otherlibs/systhreads/Makefile | 16 +- otherlibs/systhreads/Makefile.nt | 12 +- otherlibs/systhreads/st_posix.h | 16 + otherlibs/systhreads/st_stubs.c | 28 +- otherlibs/systhreads/threads.h | 8 + otherlibs/threads/.depend | 25 +- otherlibs/threads/Makefile | 16 +- otherlibs/threads/scheduler.c | 28 +- otherlibs/unix/.depend | 1144 ++++---- otherlibs/unix/Makefile | 4 +- otherlibs/unix/accept.c | 10 +- otherlibs/unix/access.c | 8 +- otherlibs/unix/addrofstr.c | 6 +- otherlibs/unix/alarm.c | 2 +- otherlibs/unix/bind.c | 4 +- otherlibs/unix/chdir.c | 6 +- otherlibs/unix/chmod.c | 6 +- otherlibs/unix/chown.c | 6 +- otherlibs/unix/chroot.c | 6 +- otherlibs/unix/close.c | 4 +- otherlibs/unix/closedir.c | 6 +- otherlibs/unix/connect.c | 6 +- otherlibs/unix/cst2constr.c | 4 +- otherlibs/unix/cstringv.c | 4 +- otherlibs/unix/dup.c | 2 +- otherlibs/unix/dup2.c | 2 +- otherlibs/unix/envir.c | 4 +- otherlibs/unix/errmsg.c | 4 +- otherlibs/unix/execv.c | 4 +- otherlibs/unix/execve.c | 4 +- otherlibs/unix/execvp.c | 4 +- otherlibs/unix/exit.c | 2 +- otherlibs/unix/fchmod.c | 6 +- otherlibs/unix/fchown.c | 6 +- otherlibs/unix/fcntl.c | 4 +- otherlibs/unix/fork.c | 4 +- otherlibs/unix/ftruncate.c | 8 +- otherlibs/unix/getaddrinfo.c | 12 +- otherlibs/unix/getcwd.c | 6 +- otherlibs/unix/getegid.c | 2 +- otherlibs/unix/geteuid.c | 2 +- otherlibs/unix/getgid.c | 2 +- otherlibs/unix/getgr.c | 8 +- otherlibs/unix/getgroups.c | 6 +- otherlibs/unix/gethost.c | 10 +- otherlibs/unix/gethostname.c | 6 +- otherlibs/unix/getlogin.c | 4 +- otherlibs/unix/getnameinfo.c | 10 +- otherlibs/unix/getpeername.c | 4 +- otherlibs/unix/getpid.c | 2 +- otherlibs/unix/getppid.c | 2 +- otherlibs/unix/getproto.c | 8 +- otherlibs/unix/getpw.c | 8 +- otherlibs/unix/getserv.c | 8 +- otherlibs/unix/getsockname.c | 4 +- otherlibs/unix/gettimeofday.c | 6 +- otherlibs/unix/getuid.c | 2 +- otherlibs/unix/gmtime.c | 8 +- otherlibs/unix/initgroups.c | 6 +- otherlibs/unix/isatty.c | 2 +- otherlibs/unix/itimer.c | 8 +- otherlibs/unix/kill.c | 6 +- otherlibs/unix/link.c | 6 +- otherlibs/unix/listen.c | 4 +- otherlibs/unix/lockf.c | 6 +- otherlibs/unix/lseek.c | 8 +- otherlibs/unix/mkdir.c | 6 +- otherlibs/unix/mkfifo.c | 8 +- otherlibs/unix/nanosecond_stat.h | 25 + otherlibs/unix/nice.c | 2 +- otherlibs/unix/open.c | 10 +- otherlibs/unix/opendir.c | 8 +- otherlibs/unix/pipe.c | 4 +- otherlibs/unix/putenv.c | 6 +- otherlibs/unix/read.c | 6 +- otherlibs/unix/readdir.c | 8 +- otherlibs/unix/readlink.c | 10 +- otherlibs/unix/rename.c | 6 +- otherlibs/unix/rewinddir.c | 4 +- otherlibs/unix/rmdir.c | 6 +- otherlibs/unix/select.c | 10 +- otherlibs/unix/sendrecv.c | 10 +- otherlibs/unix/setgid.c | 2 +- otherlibs/unix/setgroups.c | 8 +- otherlibs/unix/setsid.c | 4 +- otherlibs/unix/setuid.c | 2 +- otherlibs/unix/shutdown.c | 4 +- otherlibs/unix/signals.c | 10 +- otherlibs/unix/sleep.c | 4 +- otherlibs/unix/socket.c | 4 +- otherlibs/unix/socketaddr.c | 6 +- otherlibs/unix/socketaddr.h | 15 +- otherlibs/unix/socketpair.c | 6 +- otherlibs/unix/sockopt.c | 9 +- otherlibs/unix/stat.c | 22 +- otherlibs/unix/strofaddr.c | 6 +- otherlibs/unix/symlink.c | 8 +- otherlibs/unix/termios.c | 78 +- otherlibs/unix/time.c | 4 +- otherlibs/unix/times.c | 6 +- otherlibs/unix/truncate.c | 10 +- otherlibs/unix/umask.c | 2 +- otherlibs/unix/unixsupport.c | 10 +- otherlibs/unix/unixsupport.h | 13 + otherlibs/unix/unlink.c | 6 +- otherlibs/unix/utimes.c | 8 +- otherlibs/unix/wait.c | 10 +- otherlibs/unix/write.c | 6 +- otherlibs/win32graph/dib.c | 4 +- otherlibs/win32graph/draw.c | 10 +- otherlibs/win32graph/events.c | 4 +- otherlibs/win32graph/open.c | 8 +- otherlibs/win32unix/accept.c | 8 +- otherlibs/win32unix/bind.c | 2 +- otherlibs/win32unix/channels.c | 8 +- otherlibs/win32unix/close.c | 4 +- otherlibs/win32unix/close_on.c | 2 +- otherlibs/win32unix/connect.c | 4 +- otherlibs/win32unix/createprocess.c | 4 +- otherlibs/win32unix/dup.c | 2 +- otherlibs/win32unix/dup2.c | 2 +- otherlibs/win32unix/errmsg.c | 4 +- otherlibs/win32unix/getpeername.c | 2 +- otherlibs/win32unix/getpid.c | 2 +- otherlibs/win32unix/getsockname.c | 2 +- otherlibs/win32unix/gettimeofday.c | 42 +- otherlibs/win32unix/link.c | 4 +- otherlibs/win32unix/listen.c | 2 +- otherlibs/win32unix/lockf.c | 8 +- otherlibs/win32unix/lseek.c | 4 +- otherlibs/win32unix/mkdir.c | 2 +- otherlibs/win32unix/nonblock.c | 4 +- otherlibs/win32unix/open.c | 4 +- otherlibs/win32unix/pipe.c | 6 +- otherlibs/win32unix/read.c | 6 +- otherlibs/win32unix/rename.c | 2 +- otherlibs/win32unix/select.c | 10 +- otherlibs/win32unix/sendrecv.c | 8 +- otherlibs/win32unix/shutdown.c | 2 +- otherlibs/win32unix/sleep.c | 4 +- otherlibs/win32unix/socket.c | 2 +- otherlibs/win32unix/socketaddr.h | 15 +- otherlibs/win32unix/sockopt.c | 8 +- otherlibs/win32unix/startup.c | 2 +- otherlibs/win32unix/stat.c | 6 +- otherlibs/win32unix/system.c | 8 +- otherlibs/win32unix/times.c | 4 +- otherlibs/win32unix/unixsupport.c | 12 +- otherlibs/win32unix/unixsupport.h | 13 + otherlibs/win32unix/windir.c | 8 +- otherlibs/win32unix/winwait.c | 8 +- otherlibs/win32unix/winworker.c | 8 +- otherlibs/win32unix/write.c | 6 +- parsing/ast_helper.ml | 120 +- parsing/ast_helper.mli | 62 +- parsing/ast_mapper.ml | 4 + parsing/docstrings.ml | 344 +++ parsing/docstrings.mli | 148 ++ parsing/lexer.mli | 5 +- parsing/lexer.mll | 172 +- parsing/location.ml | 45 +- parsing/location.mli | 18 +- parsing/parse.ml | 2 + parsing/parser.mly | 759 ++++-- parsing/parsetree.mli | 2 +- parsing/pprintast.ml | 61 +- parsing/pprintast.mli | 1 + parsing/printast.ml | 4 +- stdlib/.depend | 58 +- stdlib/.ignore | 2 + stdlib/Makefile | 29 +- stdlib/Makefile.nt | 6 +- stdlib/Makefile.shared | 22 +- stdlib/array.ml | 4 + stdlib/array.mli | 3 +- stdlib/arrayLabels.mli | 62 +- stdlib/buffer.mli | 11 +- stdlib/bytesLabels.mli | 4 +- stdlib/camlinternalFormat.ml | 65 +- stdlib/camlinternalFormatBasics.ml | 43 + stdlib/camlinternalFormatBasics.mli | 15 + stdlib/digest.ml | 6 +- stdlib/digest.mli | 6 +- stdlib/format.ml | 15 +- stdlib/format.mli | 253 +- stdlib/gc.mli | 9 +- stdlib/hashtbl.mli | 4 +- stdlib/header.c | 6 +- stdlib/headernt.c | 4 +- stdlib/list.mli | 3 +- stdlib/listLabels.mli | 32 +- stdlib/marshal.mli | 6 +- stdlib/obj.ml | 3 + stdlib/obj.mli | 3 + stdlib/pervasives.mli | 49 +- stdlib/printexc.mli | 10 +- stdlib/printf.mli | 7 +- stdlib/scanf.ml | 10 + stdlib/scanf.mli | 63 +- stdlib/stream.mli | 3 +- testsuite/makefiles/Makefile.one | 3 +- testsuite/makefiles/Makefile.toplevel | 4 +- testsuite/tests/asmcomp/mainarith.c | 2 +- testsuite/tests/asmcomp/sparc.S | 2 +- testsuite/tests/basic-manyargs/manyargsprim.c | 2 +- testsuite/tests/basic/divint.ml | 7 + testsuite/tests/basic/divint.reference | 4 + testsuite/tests/callback/Makefile | 12 +- testsuite/tests/callback/callbackprim.c | 6 +- testsuite/tests/embedded/Makefile | 11 +- testsuite/tests/float-unboxing/Makefile | 7 + .../float_subst_boxed_number.ml | 26 + .../float_subst_boxed_number.reference | 0 testsuite/tests/gc-roots/globrootsprim.c | 8 +- testsuite/tests/lib-bigarray-2/bigarrfstub.c | 2 +- testsuite/tests/lib-dynlink-bytecode/Makefile | 9 +- testsuite/tests/lib-dynlink-native/Makefile | 10 +- testsuite/tests/lib-format/pr6824.ml | 7 + testsuite/tests/lib-format/pr6824.reference | 6 + testsuite/tests/lib-hashtbl/htbl.ml | 2 +- testsuite/tests/lib-marshal/intextaux.c | 4 +- testsuite/tests/lib-scanf/tscanf.ml | 7 +- testsuite/tests/misc/weaklifetime.ml | 74 + testsuite/tests/misc/weaklifetime.reference | 0 .../tests/prim-bigstring/bigstring_access.ml | 65 +- .../tests/prim-bigstring/string_access.ml | 65 +- .../typing-extensions/open_types.ml.reference | 14 +- .../tests/typing-gadts/pr5985.ml.reference | 40 +- testsuite/tests/typing-gadts/pr6690.ml | 28 + .../pr6690.ml.principal.reference | 23 + .../tests/typing-gadts/pr6690.ml.reference | 27 + testsuite/tests/typing-gadts/pr6817.ml | 24 + .../tests/typing-gadts/pr6817.ml.reference | 9 + testsuite/tests/typing-gadts/test.ml | 13 + .../typing-gadts/test.ml.principal.reference | 23 + .../tests/typing-gadts/test.ml.reference | 23 + .../yallop_bugs.ml.principal.reference | 4 +- .../typing-gadts/yallop_bugs.ml.reference | 4 +- .../typing-misc/constraints.ml.reference | 12 +- testsuite/tests/typing-misc/polyvars.ml | 8 + .../polyvars.ml.principal.reference | 4 +- .../tests/typing-misc/polyvars.ml.reference | 4 +- testsuite/tests/typing-misc/wellfounded.ml | 11 + .../wellfounded.ml.principal.reference | 7 + .../typing-misc/wellfounded.ml.reference | 7 + .../Exemples.ml.principal.reference | 4 +- .../typing-objects/Exemples.ml.reference | 4 +- .../Tests.ml.principal.reference | 32 +- .../tests/typing-objects/Tests.ml.reference | 32 +- .../typing-poly/poly.ml.principal.reference | 20 +- testsuite/tests/typing-poly/poly.ml.reference | 20 +- .../private.ml.principal.reference | 4 +- .../tests/typing-private/private.ml.reference | 4 +- .../tests/typing-rectypes-bugs/pr6870_bad.ml | 2 + testsuite/tests/typing-short-paths/pr6836.ml | 6 + .../typing-short-paths/pr6836.ml.reference | 7 + .../tests/typing-short-paths/short-paths.ml | 3 + .../short-paths.ml.reference | 2 + testsuite/tests/typing-warnings/pr6872.ml | 9 + .../pr6872.ml.principal.reference | 35 + .../tests/typing-warnings/pr6872.ml.reference | 30 + .../tests/typing-warnings/unused_types.ml | 18 + .../typing-warnings/unused_types.ml.reference | 21 + testsuite/tests/utils/Makefile | 2 + tools/.depend | 4 +- tools/Makefile.shared | 23 +- tools/eqparsetree.ml | 10 +- tools/objinfo_helper.c | 14 +- tools/ocamlcp.ml | 3 + tools/ocamlmklib.ml | 29 +- tools/ocamloptp.ml | 2 + tools/untypeast.ml | 2 +- toplevel/genprintval.ml | 203 +- toplevel/genprintval.mli | 17 + toplevel/opttoploop.ml | 2 +- toplevel/topdirs.ml | 101 +- toplevel/toploop.ml | 7 + toplevel/toploop.mli | 11 + typing/ctype.ml | 39 +- typing/ctype.mli | 1 + typing/env.ml | 95 +- typing/env.mli | 7 +- typing/oprint.ml | 5 +- typing/parmatch.ml | 7 +- typing/parmatch.mli | 1 - typing/printtyp.ml | 83 +- typing/stypes.ml | 4 + typing/subst.ml | 21 +- typing/subst.mli | 2 + typing/typeclass.ml | 2 +- typing/typecore.ml | 16 +- typing/typecore.mli | 3 + typing/typedecl.ml | 60 +- typing/typedecl.mli | 2 +- typing/typedtreeIter.ml | 35 +- typing/typedtreeIter.mli | 7 +- typing/typemod.ml | 82 +- typing/typemod.mli | 6 +- typing/types.ml | 4 +- typing/types.mli | 4 +- typing/typetexp.ml | 1 + utils/ccomp.ml | 19 +- utils/clflags.ml | 3 + utils/clflags.mli | 3 + utils/misc.ml | 11 + utils/misc.mli | 4 + utils/warnings.ml | 32 +- utils/warnings.mli | 5 +- yacc/Makefile | 2 +- yacc/Makefile.nt | 4 +- 677 files changed, 27972 insertions(+), 5202 deletions(-) create mode 100644 .merlin create mode 100644 asmcomp/branch_relaxation.ml create mode 100644 asmcomp/branch_relaxation.mli create mode 100644 asmcomp/branch_relaxation_intf.ml create mode 100644 byterun/caml/address_class.h rename byterun/{ => caml}/alloc.h (100%) rename byterun/{ => caml}/backtrace.h (100%) rename byterun/{ => caml}/callback.h (94%) rename byterun/{ => caml}/compact.h (100%) rename byterun/{ => caml}/compare.h (100%) rename byterun/{ => caml}/compatibility.h (100%) rename byterun/{ => caml}/config.h (98%) rename byterun/{ => caml}/custom.h (100%) rename byterun/{ => caml}/debugger.h (100%) rename byterun/{ => caml}/dynlink.h (100%) rename byterun/{ => caml}/exec.h (100%) rename byterun/{ => caml}/fail.h (100%) rename byterun/{ => caml}/finalise.h (100%) rename byterun/{ => caml}/fix_code.h (100%) rename byterun/{ => caml}/freelist.h (100%) rename byterun/{ => caml}/gc.h (100%) rename byterun/{ => caml}/gc_ctrl.h (100%) rename byterun/{ => caml}/globroots.h (100%) rename byterun/{ => caml}/hash.h (94%) rename byterun/{ => caml}/instrtrace.h (100%) rename byterun/{ => caml}/instruct.h (100%) rename byterun/{ => caml}/int64_emul.h (100%) rename byterun/{ => caml}/int64_format.h (100%) rename byterun/{ => caml}/int64_native.h (100%) rename byterun/{ => caml}/interp.h (100%) rename byterun/{ => caml}/intext.h (100%) rename byterun/{ => caml}/io.h (100%) rename byterun/{ => caml}/major_gc.h (100%) rename byterun/{ => caml}/md5.h (100%) rename byterun/{ => caml}/memory.h (92%) rename byterun/{ => caml}/minor_gc.h (92%) rename byterun/{ => caml}/misc.h (90%) rename byterun/{ => caml}/mlvalues.h (100%) rename byterun/{ => caml}/osdeps.h (100%) rename byterun/{ => caml}/prims.h (100%) rename byterun/{ => caml}/printexc.h (100%) rename byterun/{ => caml}/reverse.h (100%) rename byterun/{ => caml}/roots.h (100%) rename byterun/{ => caml}/signals.h (100%) rename byterun/{ => caml}/signals_machdep.h (100%) rename byterun/{ => caml}/stacks.h (100%) rename byterun/{ => caml}/startup.h (100%) rename byterun/{ => caml}/sys.h (100%) rename byterun/{ => caml}/ui.h (100%) rename byterun/{ => caml}/weak.h (100%) create mode 100644 compilerlibs/.gitignore create mode 100644 config/auto-aux/nanosecond_stat.c create mode 100644 experimental/doligez/check-bounds.diff create mode 100755 experimental/doligez/checkheaders create mode 100644 experimental/frisch/Makefile create mode 100644 experimental/frisch/copy_typedef.ml create mode 100644 experimental/frisch/eval.ml create mode 100644 experimental/frisch/extension_points.txt create mode 100644 experimental/frisch/ifdef.ml create mode 100644 experimental/frisch/js_syntax.ml create mode 100644 experimental/frisch/metaquot_test.ml create mode 100644 experimental/frisch/minidoc.ml create mode 100644 experimental/frisch/nomli.ml create mode 100644 experimental/frisch/ppx_builder.ml create mode 100644 experimental/frisch/ppx_matches.ml create mode 100644 experimental/frisch/test_builder.ml create mode 100644 experimental/frisch/test_copy_typedef.ml create mode 100644 experimental/frisch/test_copy_typedef.mli create mode 100644 experimental/frisch/test_eval.ml create mode 100644 experimental/frisch/test_ifdef.ml create mode 100644 experimental/frisch/test_js.ml create mode 100644 experimental/frisch/test_matches.ml create mode 100644 experimental/frisch/test_nomli.ml create mode 100644 experimental/frisch/testdoc.mli create mode 100644 experimental/frisch/unused_exported_values.ml create mode 100644 experimental/garrigue/.cvsignore create mode 100644 experimental/garrigue/caml_set_oid.diff create mode 100644 experimental/garrigue/coerce.diff create mode 100644 experimental/garrigue/countchars.ml create mode 100644 experimental/garrigue/dirs_multimatch create mode 100644 experimental/garrigue/dirs_poly create mode 100644 experimental/garrigue/fixedtypes.ml create mode 100644 experimental/garrigue/gadt-escape-check.diff create mode 100644 experimental/garrigue/generative-functors.diff create mode 100644 experimental/garrigue/impure-functors.diff create mode 100644 experimental/garrigue/marshal_objects.diff create mode 100644 experimental/garrigue/module-errors.diff create mode 100644 experimental/garrigue/multimatch.diff create mode 100644 experimental/garrigue/multimatch.ml create mode 100644 experimental/garrigue/newlabels.ps create mode 100644 experimental/garrigue/nongeneral-let.diff create mode 100644 experimental/garrigue/objvariant.diff create mode 100644 experimental/garrigue/objvariant.ml create mode 100644 experimental/garrigue/parser-lessminus.diff create mode 100644 experimental/garrigue/pattern-local-types.diff create mode 100644 experimental/garrigue/printers.ml create mode 100644 experimental/garrigue/propagation-to-patterns.diff create mode 100644 experimental/garrigue/show_types.diff create mode 100644 experimental/garrigue/tests.ml create mode 100644 experimental/garrigue/valvirt.diff create mode 100644 experimental/garrigue/variable-names-Tvar.diff create mode 100644 experimental/garrigue/variable-names.ml create mode 100644 experimental/garrigue/varunion.ml create mode 100644 experimental/garrigue/with-module-type.diff delete mode 100644 ocamlbuild/Makefile.noboot create mode 100644 ocamlbuild/test/good-output create mode 100755 ocamlbuild/test/runtest.sh create mode 100644 ocamlbuild/test/test1/foo.ml create mode 100644 ocamlbuild/test/test10/dbdi create mode 100755 ocamlbuild/test/test10/test.sh create mode 100644 ocamlbuild/test/test11/_tags create mode 100644 ocamlbuild/test/test11/a/aa.ml create mode 100644 ocamlbuild/test/test11/a/aa.mli create mode 100644 ocamlbuild/test/test11/b/bb.ml create mode 100644 ocamlbuild/test/test11/b/libb.mllib create mode 100644 ocamlbuild/test/test11/myocamlbuild.ml create mode 100755 ocamlbuild/test/test11/test.sh create mode 100644 ocamlbuild/test/test2/_tags create mode 100644 ocamlbuild/test/test2/tata.ml create mode 100644 ocamlbuild/test/test2/tata.mli create mode 100755 ocamlbuild/test/test2/test.sh create mode 100644 ocamlbuild/test/test2/titi.ml create mode 100644 ocamlbuild/test/test2/toto.ml create mode 100644 ocamlbuild/test/test2/tutu.ml create mode 100644 ocamlbuild/test/test2/tutu.mli create mode 100644 ocamlbuild/test/test2/tyty.mli create mode 100644 ocamlbuild/test/test2/vivi1.ml create mode 100644 ocamlbuild/test/test2/vivi2.ml create mode 100644 ocamlbuild/test/test2/vivi3.ml create mode 100644 ocamlbuild/test/test3/_tags create mode 100644 ocamlbuild/test/test3/a.ml create mode 100644 ocamlbuild/test/test3/a.mli create mode 100644 ocamlbuild/test/test3/b.ml create mode 100644 ocamlbuild/test/test3/b.mli create mode 100644 ocamlbuild/test/test3/c.ml create mode 100644 ocamlbuild/test/test3/c.mli create mode 100644 ocamlbuild/test/test3/d.ml create mode 100644 ocamlbuild/test/test3/d.mli create mode 100644 ocamlbuild/test/test3/e.ml create mode 100644 ocamlbuild/test/test3/e.mli create mode 100644 ocamlbuild/test/test3/f.ml create mode 100644 ocamlbuild/test/test3/f.mli create mode 100644 ocamlbuild/test/test3/proj.odocl create mode 100755 ocamlbuild/test/test3/test.sh create mode 100644 ocamlbuild/test/test4/_tags create mode 100644 ocamlbuild/test/test4/a/aa.ml create mode 100644 ocamlbuild/test/test4/a/aa.mli create mode 100644 ocamlbuild/test/test4/b/bb.ml create mode 100755 ocamlbuild/test/test4/test.sh create mode 100644 ocamlbuild/test/test5/_tags create mode 100644 ocamlbuild/test/test5/a.ml create mode 100644 ocamlbuild/test/test5/a.mli create mode 100644 ocamlbuild/test/test5/b.ml create mode 100644 ocamlbuild/test/test5/c.mlpack create mode 100644 ocamlbuild/test/test5/d.ml create mode 100644 ocamlbuild/test/test5/stack.ml create mode 100755 ocamlbuild/test/test5/test.sh create mode 100644 ocamlbuild/test/test6/a.ml create mode 100644 ocamlbuild/test/test6/a.mli create mode 100644 ocamlbuild/test/test6/b.ml create mode 100644 ocamlbuild/test/test6/b.mli create mode 100644 ocamlbuild/test/test6/b.mli.v1 create mode 100644 ocamlbuild/test/test6/b.mli.v2 create mode 100644 ocamlbuild/test/test6/d.ml create mode 100644 ocamlbuild/test/test6/d.mli create mode 100644 ocamlbuild/test/test6/d.mli.v1 create mode 100644 ocamlbuild/test/test6/d.mli.v2 create mode 100644 ocamlbuild/test/test6/main.ml create mode 100644 ocamlbuild/test/test6/main.mli create mode 100755 ocamlbuild/test/test6/test.sh create mode 100644 ocamlbuild/test/test7/_tags create mode 100644 ocamlbuild/test/test7/aa.ml create mode 100644 ocamlbuild/test/test7/bb.mli create mode 100644 ocamlbuild/test/test7/bb1.ml create mode 100644 ocamlbuild/test/test7/bb2.ml create mode 100644 ocamlbuild/test/test7/bb3.ml create mode 100644 ocamlbuild/test/test7/bbcc.mllib create mode 100644 ocamlbuild/test/test7/c2.ml create mode 100644 ocamlbuild/test/test7/c2.mli create mode 100644 ocamlbuild/test/test7/c3.ml create mode 100644 ocamlbuild/test/test7/cc.ml create mode 100644 ocamlbuild/test/test7/cool_plugin.ml create mode 100644 ocamlbuild/test/test7/main.ml create mode 100644 ocamlbuild/test/test7/myocamlbuild.ml create mode 100755 ocamlbuild/test/test7/test.sh create mode 100644 ocamlbuild/test/test8/a.ml create mode 100644 ocamlbuild/test/test8/myocamlbuild.ml create mode 100755 ocamlbuild/test/test8/test.sh create mode 100644 ocamlbuild/test/test9/dbgl create mode 100755 ocamlbuild/test/test9/test.sh create mode 100644 ocamlbuild/test/test9/testglob.ml create mode 100644 ocamlbuild/test/test_virtual/foo.itarget create mode 100644 ocamlbuild/test/test_virtual/foo1 create mode 100644 ocamlbuild/test/test_virtual/foo2 create mode 100644 ocamlbuild/test/test_virtual/myocamlbuild.ml create mode 100755 ocamlbuild/test/test_virtual/test.sh create mode 100644 otherlibs/unix/nanosecond_stat.h create mode 100644 parsing/docstrings.ml create mode 100644 parsing/docstrings.mli create mode 100644 testsuite/tests/float-unboxing/Makefile create mode 100644 testsuite/tests/float-unboxing/float_subst_boxed_number.ml create mode 100644 testsuite/tests/float-unboxing/float_subst_boxed_number.reference create mode 100644 testsuite/tests/lib-format/pr6824.ml create mode 100644 testsuite/tests/lib-format/pr6824.reference create mode 100644 testsuite/tests/misc/weaklifetime.ml create mode 100644 testsuite/tests/misc/weaklifetime.reference create mode 100644 testsuite/tests/typing-gadts/pr6690.ml create mode 100644 testsuite/tests/typing-gadts/pr6690.ml.principal.reference create mode 100644 testsuite/tests/typing-gadts/pr6690.ml.reference create mode 100644 testsuite/tests/typing-gadts/pr6817.ml create mode 100644 testsuite/tests/typing-gadts/pr6817.ml.reference create mode 100644 testsuite/tests/typing-misc/wellfounded.ml create mode 100644 testsuite/tests/typing-misc/wellfounded.ml.principal.reference create mode 100644 testsuite/tests/typing-misc/wellfounded.ml.reference create mode 100644 testsuite/tests/typing-rectypes-bugs/pr6870_bad.ml create mode 100644 testsuite/tests/typing-short-paths/pr6836.ml create mode 100644 testsuite/tests/typing-short-paths/pr6836.ml.reference create mode 100644 testsuite/tests/typing-warnings/pr6872.ml create mode 100644 testsuite/tests/typing-warnings/pr6872.ml.principal.reference create mode 100644 testsuite/tests/typing-warnings/pr6872.ml.reference create mode 100644 testsuite/tests/typing-warnings/unused_types.ml create mode 100644 testsuite/tests/typing-warnings/unused_types.ml.reference diff --git a/.depend b/.depend index 5d95a9bb..d7eed05a 100644 --- a/.depend +++ b/.depend @@ -25,14 +25,16 @@ utils/terminfo.cmx : utils/terminfo.cmi utils/warnings.cmo : utils/warnings.cmi utils/warnings.cmx : utils/warnings.cmi parsing/ast_helper.cmi : parsing/parsetree.cmi parsing/longident.cmi \ - parsing/location.cmi parsing/asttypes.cmi + parsing/location.cmi parsing/docstrings.cmi parsing/asttypes.cmi parsing/ast_mapper.cmi : parsing/parsetree.cmi parsing/location.cmi parsing/asttypes.cmi : parsing/location.cmi +parsing/docstrings.cmi : parsing/parsetree.cmi parsing/location.cmi parsing/lexer.cmi : parsing/parser.cmi parsing/location.cmi parsing/location.cmi : utils/warnings.cmi parsing/longident.cmi : parsing/parse.cmi : parsing/parsetree.cmi -parsing/parser.cmi : parsing/parsetree.cmi parsing/location.cmi +parsing/parser.cmi : parsing/parsetree.cmi parsing/location.cmi \ + parsing/docstrings.cmi parsing/parsetree.cmi : parsing/longident.cmi parsing/location.cmi \ parsing/asttypes.cmi parsing/pprintast.cmi : parsing/parsetree.cmi parsing/longident.cmi \ @@ -40,9 +42,11 @@ parsing/pprintast.cmi : parsing/parsetree.cmi parsing/longident.cmi \ parsing/printast.cmi : parsing/parsetree.cmi parsing/syntaxerr.cmi : parsing/location.cmi parsing/ast_helper.cmo : parsing/parsetree.cmi parsing/longident.cmi \ - parsing/location.cmi parsing/asttypes.cmi parsing/ast_helper.cmi + parsing/location.cmi parsing/docstrings.cmi parsing/asttypes.cmi \ + parsing/ast_helper.cmi parsing/ast_helper.cmx : parsing/parsetree.cmi parsing/longident.cmx \ - parsing/location.cmx parsing/asttypes.cmi parsing/ast_helper.cmi + parsing/location.cmx parsing/docstrings.cmx parsing/asttypes.cmi \ + parsing/ast_helper.cmi parsing/ast_mapper.cmo : parsing/parsetree.cmi utils/misc.cmi \ parsing/longident.cmi parsing/location.cmi utils/config.cmi \ utils/clflags.cmi parsing/asttypes.cmi parsing/ast_helper.cmi \ @@ -51,10 +55,14 @@ parsing/ast_mapper.cmx : parsing/parsetree.cmi utils/misc.cmx \ parsing/longident.cmx parsing/location.cmx utils/config.cmx \ utils/clflags.cmx parsing/asttypes.cmi parsing/ast_helper.cmx \ parsing/ast_mapper.cmi +parsing/docstrings.cmo : utils/warnings.cmi parsing/parsetree.cmi \ + parsing/location.cmi parsing/asttypes.cmi parsing/docstrings.cmi +parsing/docstrings.cmx : utils/warnings.cmx parsing/parsetree.cmi \ + parsing/location.cmx parsing/asttypes.cmi parsing/docstrings.cmi parsing/lexer.cmo : utils/warnings.cmi parsing/parser.cmi utils/misc.cmi \ - parsing/location.cmi parsing/lexer.cmi + parsing/location.cmi parsing/docstrings.cmi parsing/lexer.cmi parsing/lexer.cmx : utils/warnings.cmx parsing/parser.cmx utils/misc.cmx \ - parsing/location.cmx parsing/lexer.cmi + parsing/location.cmx parsing/docstrings.cmx parsing/lexer.cmi parsing/location.cmo : utils/warnings.cmi utils/terminfo.cmi \ parsing/location.cmi parsing/location.cmx : utils/warnings.cmx utils/terminfo.cmx \ @@ -62,15 +70,19 @@ parsing/location.cmx : utils/warnings.cmx utils/terminfo.cmx \ parsing/longident.cmo : utils/misc.cmi parsing/longident.cmi parsing/longident.cmx : utils/misc.cmx parsing/longident.cmi parsing/parse.cmo : parsing/syntaxerr.cmi parsing/parser.cmi \ - parsing/location.cmi parsing/lexer.cmi parsing/parse.cmi + parsing/location.cmi parsing/lexer.cmi parsing/docstrings.cmi \ + parsing/parse.cmi parsing/parse.cmx : parsing/syntaxerr.cmx parsing/parser.cmx \ - parsing/location.cmx parsing/lexer.cmx parsing/parse.cmi + parsing/location.cmx parsing/lexer.cmx parsing/docstrings.cmx \ + parsing/parse.cmi parsing/parser.cmo : parsing/syntaxerr.cmi parsing/parsetree.cmi \ - parsing/longident.cmi parsing/location.cmi utils/clflags.cmi \ - parsing/asttypes.cmi parsing/ast_helper.cmi parsing/parser.cmi + parsing/longident.cmi parsing/location.cmi parsing/docstrings.cmi \ + utils/clflags.cmi parsing/asttypes.cmi parsing/ast_helper.cmi \ + parsing/parser.cmi parsing/parser.cmx : parsing/syntaxerr.cmx parsing/parsetree.cmi \ - parsing/longident.cmx parsing/location.cmx utils/clflags.cmx \ - parsing/asttypes.cmi parsing/ast_helper.cmx parsing/parser.cmi + parsing/longident.cmx parsing/location.cmx parsing/docstrings.cmx \ + utils/clflags.cmx parsing/asttypes.cmi parsing/ast_helper.cmx \ + parsing/parser.cmi parsing/pprintast.cmo : parsing/parsetree.cmi utils/misc.cmi \ parsing/longident.cmi parsing/location.cmi parsing/asttypes.cmi \ parsing/pprintast.cmi @@ -94,10 +106,10 @@ typing/ctype.cmi : typing/types.cmi typing/path.cmi parsing/longident.cmi \ typing/ident.cmi typing/env.cmi parsing/asttypes.cmi typing/datarepr.cmi : typing/types.cmi typing/path.cmi typing/ident.cmi \ parsing/asttypes.cmi +typing/envaux.cmi : typing/subst.cmi typing/path.cmi typing/env.cmi typing/env.cmi : utils/warnings.cmi typing/types.cmi typing/subst.cmi \ typing/path.cmi parsing/longident.cmi parsing/location.cmi \ typing/ident.cmi utils/consistbl.cmi parsing/asttypes.cmi -typing/envaux.cmi : typing/subst.cmi typing/path.cmi typing/env.cmi typing/ident.cmi : typing/includeclass.cmi : typing/types.cmi typing/env.cmi typing/ctype.cmi typing/includecore.cmi : typing/types.cmi typing/typedtree.cmi \ @@ -115,10 +127,10 @@ typing/parmatch.cmi : typing/types.cmi typing/typedtree.cmi \ typing/path.cmi : typing/ident.cmi typing/predef.cmi : typing/types.cmi typing/path.cmi typing/ident.cmi typing/primitive.cmi : +typing/printtyped.cmi : typing/typedtree.cmi typing/printtyp.cmi : typing/types.cmi typing/path.cmi \ typing/outcometree.cmi parsing/longident.cmi typing/ident.cmi \ typing/env.cmi -typing/printtyped.cmi : typing/typedtree.cmi typing/stypes.cmi : typing/typedtree.cmi parsing/location.cmi \ typing/annot.cmi typing/subst.cmi : typing/types.cmi typing/path.cmi typing/ident.cmi @@ -130,12 +142,13 @@ typing/typecore.cmi : typing/types.cmi typing/typedtree.cmi typing/path.cmi \ typing/ident.cmi typing/env.cmi parsing/asttypes.cmi typing/annot.cmi typing/typedecl.cmi : typing/types.cmi typing/typedtree.cmi typing/path.cmi \ parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ - typing/includecore.cmi typing/ident.cmi typing/env.cmi + typing/includecore.cmi typing/ident.cmi typing/env.cmi \ + parsing/asttypes.cmi +typing/typedtreeIter.cmi : typing/typedtree.cmi parsing/asttypes.cmi +typing/typedtreeMap.cmi : typing/typedtree.cmi typing/typedtree.cmi : typing/types.cmi typing/primitive.cmi typing/path.cmi \ parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ typing/ident.cmi typing/env.cmi parsing/asttypes.cmi -typing/typedtreeIter.cmi : typing/typedtree.cmi parsing/asttypes.cmi -typing/typedtreeMap.cmi : typing/typedtree.cmi typing/typemod.cmi : typing/types.cmi typing/typedtree.cmi typing/path.cmi \ parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ typing/includemod.cmi typing/ident.cmi typing/env.cmi \ @@ -176,6 +189,12 @@ typing/datarepr.cmo : typing/types.cmi typing/path.cmi parsing/location.cmi \ typing/datarepr.cmx : typing/types.cmx typing/path.cmx parsing/location.cmx \ typing/ident.cmx typing/btype.cmx parsing/asttypes.cmi \ typing/datarepr.cmi +typing/envaux.cmo : typing/types.cmi typing/subst.cmi typing/printtyp.cmi \ + typing/path.cmi utils/misc.cmi typing/ident.cmi typing/env.cmi \ + parsing/asttypes.cmi typing/envaux.cmi +typing/envaux.cmx : typing/types.cmx typing/subst.cmx typing/printtyp.cmx \ + typing/path.cmx utils/misc.cmx typing/ident.cmx typing/env.cmx \ + parsing/asttypes.cmi typing/envaux.cmi typing/env.cmo : utils/warnings.cmi typing/types.cmi utils/tbl.cmi \ typing/subst.cmi typing/predef.cmi typing/path.cmi utils/misc.cmi \ parsing/longident.cmi parsing/location.cmi typing/ident.cmi \ @@ -188,12 +207,6 @@ typing/env.cmx : utils/warnings.cmx typing/types.cmx utils/tbl.cmx \ typing/datarepr.cmx utils/consistbl.cmx utils/config.cmx \ typing/cmi_format.cmx utils/clflags.cmx typing/btype.cmx \ parsing/asttypes.cmi typing/env.cmi -typing/envaux.cmo : typing/types.cmi typing/subst.cmi typing/printtyp.cmi \ - typing/path.cmi utils/misc.cmi typing/ident.cmi typing/env.cmi \ - parsing/asttypes.cmi typing/envaux.cmi -typing/envaux.cmx : typing/types.cmx typing/subst.cmx typing/printtyp.cmx \ - typing/path.cmx utils/misc.cmx typing/ident.cmx typing/env.cmx \ - parsing/asttypes.cmi typing/envaux.cmi typing/ident.cmo : typing/ident.cmi typing/ident.cmx : typing/ident.cmi typing/includeclass.cmo : typing/types.cmi typing/printtyp.cmi \ @@ -252,6 +265,12 @@ typing/predef.cmx : typing/types.cmx typing/path.cmx parsing/location.cmx \ typing/ident.cmx typing/btype.cmx parsing/asttypes.cmi typing/predef.cmi typing/primitive.cmo : utils/misc.cmi typing/primitive.cmi typing/primitive.cmx : utils/misc.cmx typing/primitive.cmi +typing/printtyped.cmo : typing/typedtree.cmi parsing/printast.cmi \ + typing/path.cmi utils/misc.cmi parsing/longident.cmi parsing/location.cmi \ + typing/ident.cmi parsing/asttypes.cmi typing/printtyped.cmi +typing/printtyped.cmx : typing/typedtree.cmx parsing/printast.cmx \ + typing/path.cmx utils/misc.cmx parsing/longident.cmx parsing/location.cmx \ + typing/ident.cmx parsing/asttypes.cmi typing/printtyped.cmi typing/printtyp.cmo : typing/types.cmi typing/primitive.cmi \ typing/predef.cmi typing/path.cmi typing/outcometree.cmi \ typing/oprint.cmi utils/misc.cmi parsing/longident.cmi \ @@ -264,12 +283,6 @@ typing/printtyp.cmx : typing/types.cmx typing/primitive.cmx \ parsing/location.cmx typing/ident.cmx typing/env.cmx typing/ctype.cmx \ utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi \ typing/printtyp.cmi -typing/printtyped.cmo : typing/typedtree.cmi parsing/printast.cmi \ - typing/path.cmi utils/misc.cmi parsing/longident.cmi parsing/location.cmi \ - typing/ident.cmi parsing/asttypes.cmi typing/printtyped.cmi -typing/printtyped.cmx : typing/typedtree.cmx parsing/printast.cmx \ - typing/path.cmx utils/misc.cmx parsing/longident.cmx parsing/location.cmx \ - typing/ident.cmx parsing/asttypes.cmi typing/printtyped.cmi typing/stypes.cmo : typing/typedtree.cmi typing/printtyp.cmi \ parsing/location.cmi utils/clflags.cmi typing/annot.cmi typing/stypes.cmi typing/stypes.cmx : typing/typedtree.cmx typing/printtyp.cmx \ @@ -284,20 +297,20 @@ typing/typeclass.cmo : utils/warnings.cmi typing/typetexp.cmi \ typing/types.cmi typing/typedtree.cmi typing/typedecl.cmi \ typing/typecore.cmi parsing/syntaxerr.cmi typing/subst.cmi \ typing/stypes.cmi typing/printtyp.cmi typing/predef.cmi typing/path.cmi \ - parsing/parsetree.cmi typing/parmatch.cmi utils/misc.cmi \ - parsing/longident.cmi parsing/location.cmi typing/includeclass.cmi \ - typing/ident.cmi typing/env.cmi typing/ctype.cmi typing/cmt_format.cmi \ - utils/clflags.cmi typing/btype.cmi parsing/asttypes.cmi \ - parsing/ast_helper.cmi typing/typeclass.cmi + parsing/parsetree.cmi utils/misc.cmi parsing/longident.cmi \ + parsing/location.cmi typing/includeclass.cmi typing/ident.cmi \ + typing/env.cmi typing/ctype.cmi typing/cmt_format.cmi utils/clflags.cmi \ + typing/btype.cmi parsing/asttypes.cmi parsing/ast_helper.cmi \ + typing/typeclass.cmi typing/typeclass.cmx : utils/warnings.cmx typing/typetexp.cmx \ typing/types.cmx typing/typedtree.cmx typing/typedecl.cmx \ typing/typecore.cmx parsing/syntaxerr.cmx typing/subst.cmx \ typing/stypes.cmx typing/printtyp.cmx typing/predef.cmx typing/path.cmx \ - parsing/parsetree.cmi typing/parmatch.cmx utils/misc.cmx \ - parsing/longident.cmx parsing/location.cmx typing/includeclass.cmx \ - typing/ident.cmx typing/env.cmx typing/ctype.cmx typing/cmt_format.cmx \ - utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi \ - parsing/ast_helper.cmx typing/typeclass.cmi + parsing/parsetree.cmi utils/misc.cmx parsing/longident.cmx \ + parsing/location.cmx typing/includeclass.cmx typing/ident.cmx \ + typing/env.cmx typing/ctype.cmx typing/cmt_format.cmx utils/clflags.cmx \ + typing/btype.cmx parsing/asttypes.cmi parsing/ast_helper.cmx \ + typing/typeclass.cmi typing/typecore.cmo : utils/warnings.cmi typing/typetexp.cmi \ typing/types.cmi typing/typedtree.cmi parsing/syntaxerr.cmi \ typing/subst.cmi typing/stypes.cmi typing/printtyp.cmi \ @@ -332,14 +345,6 @@ typing/typedecl.cmx : utils/warnings.cmx typing/typetexp.cmx \ typing/ident.cmx typing/env.cmx typing/ctype.cmx utils/config.cmx \ utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi \ parsing/ast_helper.cmx typing/typedecl.cmi -typing/typedtree.cmo : typing/types.cmi typing/primitive.cmi typing/path.cmi \ - parsing/parsetree.cmi utils/misc.cmi parsing/longident.cmi \ - parsing/location.cmi typing/ident.cmi typing/env.cmi parsing/asttypes.cmi \ - typing/typedtree.cmi -typing/typedtree.cmx : typing/types.cmx typing/primitive.cmx typing/path.cmx \ - parsing/parsetree.cmi utils/misc.cmx parsing/longident.cmx \ - parsing/location.cmx typing/ident.cmx typing/env.cmx parsing/asttypes.cmi \ - typing/typedtree.cmi typing/typedtreeIter.cmo : typing/typedtree.cmi utils/misc.cmi \ parsing/asttypes.cmi typing/typedtreeIter.cmi typing/typedtreeIter.cmx : typing/typedtree.cmx utils/misc.cmx \ @@ -348,6 +353,14 @@ typing/typedtreeMap.cmo : typing/typedtree.cmi utils/misc.cmi \ typing/typedtreeMap.cmi typing/typedtreeMap.cmx : typing/typedtree.cmx utils/misc.cmx \ typing/typedtreeMap.cmi +typing/typedtree.cmo : typing/types.cmi typing/primitive.cmi typing/path.cmi \ + parsing/parsetree.cmi utils/misc.cmi parsing/longident.cmi \ + parsing/location.cmi typing/ident.cmi typing/env.cmi parsing/asttypes.cmi \ + typing/typedtree.cmi +typing/typedtree.cmx : typing/types.cmx typing/primitive.cmx typing/path.cmx \ + parsing/parsetree.cmi utils/misc.cmx parsing/longident.cmx \ + parsing/location.cmx typing/ident.cmx typing/env.cmx parsing/asttypes.cmi \ + typing/typedtree.cmi typing/typemod.cmo : utils/warnings.cmi typing/typetexp.cmi typing/types.cmi \ typing/typedtree.cmi typing/typedecl.cmi typing/typecore.cmi \ typing/typeclass.cmi typing/subst.cmi typing/stypes.cmi \ @@ -431,15 +444,17 @@ bytecomp/bytelibrarian.cmx : utils/misc.cmx parsing/location.cmx \ utils/config.cmx bytecomp/cmo_format.cmi utils/clflags.cmx \ bytecomp/bytelink.cmx bytecomp/bytelibrarian.cmi bytecomp/bytelink.cmo : utils/warnings.cmi bytecomp/symtable.cmi \ - bytecomp/opcodes.cmo utils/misc.cmi parsing/location.cmi typing/ident.cmi \ - bytecomp/dll.cmi utils/consistbl.cmi utils/config.cmi \ - bytecomp/cmo_format.cmi utils/clflags.cmi utils/ccomp.cmi \ - bytecomp/bytesections.cmi bytecomp/bytelink.cmi + bytecomp/opcodes.cmo utils/misc.cmi parsing/location.cmi \ + bytecomp/instruct.cmi typing/ident.cmi bytecomp/dll.cmi \ + utils/consistbl.cmi utils/config.cmi bytecomp/cmo_format.cmi \ + utils/clflags.cmi utils/ccomp.cmi bytecomp/bytesections.cmi \ + bytecomp/bytelink.cmi bytecomp/bytelink.cmx : utils/warnings.cmx bytecomp/symtable.cmx \ - bytecomp/opcodes.cmx utils/misc.cmx parsing/location.cmx typing/ident.cmx \ - bytecomp/dll.cmx utils/consistbl.cmx utils/config.cmx \ - bytecomp/cmo_format.cmi utils/clflags.cmx utils/ccomp.cmx \ - bytecomp/bytesections.cmx bytecomp/bytelink.cmi + bytecomp/opcodes.cmx utils/misc.cmx parsing/location.cmx \ + bytecomp/instruct.cmx typing/ident.cmx bytecomp/dll.cmx \ + utils/consistbl.cmx utils/config.cmx bytecomp/cmo_format.cmi \ + utils/clflags.cmx utils/ccomp.cmx bytecomp/bytesections.cmx \ + bytecomp/bytelink.cmi bytecomp/bytepackager.cmo : typing/typemod.cmi bytecomp/translmod.cmi \ typing/subst.cmi bytecomp/printlambda.cmi typing/path.cmi utils/misc.cmi \ parsing/location.cmi bytecomp/instruct.cmi typing/ident.cmi \ @@ -520,12 +535,12 @@ bytecomp/switch.cmo : bytecomp/switch.cmi bytecomp/switch.cmx : bytecomp/switch.cmi bytecomp/symtable.cmo : utils/tbl.cmi bytecomp/runtimedef.cmi \ typing/predef.cmi utils/misc.cmi bytecomp/meta.cmi parsing/location.cmi \ - bytecomp/lambda.cmi typing/ident.cmi bytecomp/dll.cmi \ + bytecomp/lambda.cmi typing/ident.cmi bytecomp/dll.cmi utils/config.cmi \ bytecomp/cmo_format.cmi utils/clflags.cmi bytecomp/bytesections.cmi \ parsing/asttypes.cmi bytecomp/symtable.cmi bytecomp/symtable.cmx : utils/tbl.cmx bytecomp/runtimedef.cmx \ typing/predef.cmx utils/misc.cmx bytecomp/meta.cmx parsing/location.cmx \ - bytecomp/lambda.cmx typing/ident.cmx bytecomp/dll.cmx \ + bytecomp/lambda.cmx typing/ident.cmx bytecomp/dll.cmx utils/config.cmx \ bytecomp/cmo_format.cmi utils/clflags.cmx bytecomp/bytesections.cmx \ parsing/asttypes.cmi bytecomp/symtable.cmi bytecomp/translclass.cmo : typing/types.cmi bytecomp/typeopt.cmi \ @@ -578,27 +593,29 @@ bytecomp/typeopt.cmo : typing/types.cmi typing/typedtree.cmi \ bytecomp/typeopt.cmx : typing/types.cmx typing/typedtree.cmx \ typing/predef.cmx typing/path.cmx bytecomp/lambda.cmx typing/ident.cmx \ typing/env.cmx typing/ctype.cmx bytecomp/typeopt.cmi -asmcomp/CSEgen.cmi : asmcomp/mach.cmi asmcomp/asmgen.cmi : bytecomp/lambda.cmi asmcomp/cmm.cmi asmcomp/asmlibrarian.cmi : asmcomp/asmlink.cmi : asmcomp/cmx_format.cmi asmcomp/asmpackager.cmi : typing/env.cmi +asmcomp/branch_relaxation.cmi : asmcomp/linearize.cmi \ + asmcomp/branch_relaxation_intf.cmo asmcomp/clambda.cmi : bytecomp/lambda.cmi typing/ident.cmi \ asmcomp/debuginfo.cmi parsing/asttypes.cmi asmcomp/closure.cmi : bytecomp/lambda.cmi asmcomp/clambda.cmi -asmcomp/cmm.cmi : bytecomp/lambda.cmi typing/ident.cmi asmcomp/debuginfo.cmi asmcomp/cmmgen.cmi : asmcomp/cmx_format.cmi asmcomp/cmm.cmi \ asmcomp/clambda.cmi +asmcomp/cmm.cmi : bytecomp/lambda.cmi typing/ident.cmi asmcomp/debuginfo.cmi asmcomp/cmx_format.cmi : asmcomp/clambda.cmi asmcomp/codegen.cmi : asmcomp/cmm.cmi asmcomp/coloring.cmi : asmcomp/comballoc.cmi : asmcomp/mach.cmi asmcomp/compilenv.cmi : typing/ident.cmi asmcomp/cmx_format.cmi \ asmcomp/clambda.cmi +asmcomp/CSEgen.cmi : asmcomp/mach.cmi asmcomp/deadcode.cmi : asmcomp/mach.cmi asmcomp/debuginfo.cmi : parsing/location.cmi bytecomp/lambda.cmi -asmcomp/emit.cmi : asmcomp/linearize.cmi asmcomp/cmm.cmi asmcomp/emitaux.cmi : asmcomp/debuginfo.cmi +asmcomp/emit.cmi : asmcomp/linearize.cmi asmcomp/cmm.cmi asmcomp/interf.cmi : asmcomp/mach.cmi asmcomp/linearize.cmi : asmcomp/reg.cmi asmcomp/mach.cmi bytecomp/lambda.cmi \ asmcomp/debuginfo.cmi @@ -611,8 +628,8 @@ asmcomp/printlinear.cmi : asmcomp/linearize.cmi asmcomp/printmach.cmi : asmcomp/reg.cmi asmcomp/mach.cmi asmcomp/proc.cmi : asmcomp/reg.cmi asmcomp/mach.cmi asmcomp/reg.cmi : typing/ident.cmi asmcomp/cmm.cmi -asmcomp/reload.cmi : asmcomp/mach.cmi asmcomp/reloadgen.cmi : asmcomp/reg.cmi asmcomp/mach.cmi +asmcomp/reload.cmi : asmcomp/mach.cmi asmcomp/schedgen.cmi : asmcomp/mach.cmi asmcomp/linearize.cmi asmcomp/scheduling.cmi : asmcomp/linearize.cmi asmcomp/selectgen.cmi : utils/tbl.cmi asmcomp/reg.cmi asmcomp/mach.cmi \ @@ -621,12 +638,6 @@ asmcomp/selection.cmi : asmcomp/mach.cmi asmcomp/cmm.cmi asmcomp/spill.cmi : asmcomp/mach.cmi asmcomp/split.cmi : asmcomp/mach.cmi asmcomp/strmatch.cmi : asmcomp/cmm.cmi -asmcomp/CSE.cmo : asmcomp/mach.cmi asmcomp/CSEgen.cmi asmcomp/arch.cmo -asmcomp/CSE.cmx : asmcomp/mach.cmx asmcomp/CSEgen.cmx asmcomp/arch.cmx -asmcomp/CSEgen.cmo : asmcomp/reg.cmi asmcomp/proc.cmi asmcomp/mach.cmi \ - asmcomp/CSEgen.cmi -asmcomp/CSEgen.cmx : asmcomp/reg.cmx asmcomp/proc.cmx asmcomp/mach.cmx \ - asmcomp/CSEgen.cmi asmcomp/arch.cmo : asmcomp/arch.cmx : asmcomp/asmgen.cmo : bytecomp/translmod.cmi asmcomp/split.cmi \ @@ -677,6 +688,14 @@ asmcomp/asmpackager.cmx : typing/typemod.cmx bytecomp/translmod.cmx \ utils/config.cmx asmcomp/compilenv.cmx asmcomp/cmx_format.cmi \ utils/clflags.cmx utils/ccomp.cmx asmcomp/asmlink.cmx asmcomp/asmgen.cmx \ asmcomp/asmpackager.cmi +asmcomp/branch_relaxation_intf.cmo : asmcomp/linearize.cmi asmcomp/arch.cmo +asmcomp/branch_relaxation_intf.cmx : asmcomp/linearize.cmx asmcomp/arch.cmx +asmcomp/branch_relaxation.cmo : utils/misc.cmi asmcomp/mach.cmi \ + asmcomp/linearize.cmi asmcomp/cmm.cmi asmcomp/branch_relaxation_intf.cmo \ + asmcomp/branch_relaxation.cmi +asmcomp/branch_relaxation.cmx : utils/misc.cmx asmcomp/mach.cmx \ + asmcomp/linearize.cmx asmcomp/cmm.cmx asmcomp/branch_relaxation_intf.cmx \ + asmcomp/branch_relaxation.cmi asmcomp/clambda.cmo : bytecomp/lambda.cmi typing/ident.cmi \ asmcomp/debuginfo.cmi parsing/asttypes.cmi asmcomp/clambda.cmi asmcomp/clambda.cmx : bytecomp/lambda.cmx typing/ident.cmx \ @@ -691,10 +710,6 @@ asmcomp/closure.cmx : utils/tbl.cmx bytecomp/switch.cmx typing/primitive.cmx \ asmcomp/debuginfo.cmx asmcomp/compilenv.cmx utils/clflags.cmx \ asmcomp/clambda.cmx parsing/asttypes.cmi asmcomp/arch.cmx \ asmcomp/closure.cmi -asmcomp/cmm.cmo : bytecomp/lambda.cmi typing/ident.cmi asmcomp/debuginfo.cmi \ - asmcomp/arch.cmo asmcomp/cmm.cmi -asmcomp/cmm.cmx : bytecomp/lambda.cmx typing/ident.cmx asmcomp/debuginfo.cmx \ - asmcomp/arch.cmx asmcomp/cmm.cmi asmcomp/cmmgen.cmo : typing/types.cmi bytecomp/switch.cmi \ asmcomp/strmatch.cmi asmcomp/proc.cmi typing/primitive.cmi utils/misc.cmi \ bytecomp/lambda.cmi typing/ident.cmi asmcomp/debuginfo.cmi \ @@ -707,6 +722,10 @@ asmcomp/cmmgen.cmx : typing/types.cmx bytecomp/switch.cmx \ utils/config.cmx asmcomp/compilenv.cmx asmcomp/cmx_format.cmi \ asmcomp/cmm.cmx utils/clflags.cmx asmcomp/clambda.cmx \ parsing/asttypes.cmi asmcomp/arch.cmx asmcomp/cmmgen.cmi +asmcomp/cmm.cmo : bytecomp/lambda.cmi typing/ident.cmi asmcomp/debuginfo.cmi \ + asmcomp/arch.cmo asmcomp/cmm.cmi +asmcomp/cmm.cmx : bytecomp/lambda.cmx typing/ident.cmx asmcomp/debuginfo.cmx \ + asmcomp/arch.cmx asmcomp/cmm.cmi asmcomp/codegen.cmo : asmcomp/split.cmi asmcomp/spill.cmi asmcomp/reload.cmi \ asmcomp/reg.cmi asmcomp/printmach.cmi asmcomp/printlinear.cmi \ asmcomp/printcmm.cmi asmcomp/liveness.cmi asmcomp/linearize.cmi \ @@ -729,6 +748,12 @@ asmcomp/compilenv.cmo : utils/misc.cmi parsing/location.cmi typing/ident.cmi \ asmcomp/compilenv.cmx : utils/misc.cmx parsing/location.cmx typing/ident.cmx \ typing/env.cmx utils/config.cmx asmcomp/cmx_format.cmi \ asmcomp/clambda.cmx asmcomp/compilenv.cmi +asmcomp/CSEgen.cmo : asmcomp/reg.cmi asmcomp/proc.cmi asmcomp/mach.cmi \ + asmcomp/CSEgen.cmi +asmcomp/CSEgen.cmx : asmcomp/reg.cmx asmcomp/proc.cmx asmcomp/mach.cmx \ + asmcomp/CSEgen.cmi +asmcomp/CSE.cmo : asmcomp/mach.cmi asmcomp/CSEgen.cmi asmcomp/arch.cmo +asmcomp/CSE.cmx : asmcomp/mach.cmx asmcomp/CSEgen.cmx asmcomp/arch.cmx asmcomp/deadcode.cmo : asmcomp/reg.cmi asmcomp/proc.cmi asmcomp/mach.cmi \ asmcomp/deadcode.cmi asmcomp/deadcode.cmx : asmcomp/reg.cmx asmcomp/proc.cmx asmcomp/mach.cmx \ @@ -737,20 +762,20 @@ asmcomp/debuginfo.cmo : parsing/location.cmi bytecomp/lambda.cmi \ asmcomp/debuginfo.cmi asmcomp/debuginfo.cmx : parsing/location.cmx bytecomp/lambda.cmx \ asmcomp/debuginfo.cmi +asmcomp/emitaux.cmo : asmcomp/linearize.cmi asmcomp/debuginfo.cmi \ + utils/config.cmi utils/clflags.cmi asmcomp/arch.cmo asmcomp/emitaux.cmi +asmcomp/emitaux.cmx : asmcomp/linearize.cmx asmcomp/debuginfo.cmx \ + utils/config.cmx utils/clflags.cmx asmcomp/arch.cmx asmcomp/emitaux.cmi asmcomp/emit.cmo : asmcomp/reg.cmi asmcomp/proc.cmi utils/misc.cmi \ asmcomp/mach.cmi asmcomp/linearize.cmi bytecomp/lambda.cmi \ asmcomp/emitaux.cmi asmcomp/debuginfo.cmi utils/config.cmi \ - asmcomp/compilenv.cmi asmcomp/cmm.cmi utils/clflags.cmi asmcomp/arch.cmo \ - asmcomp/emit.cmi + asmcomp/compilenv.cmi asmcomp/cmm.cmi utils/clflags.cmi \ + asmcomp/branch_relaxation.cmi asmcomp/arch.cmo asmcomp/emit.cmi asmcomp/emit.cmx : asmcomp/reg.cmx asmcomp/proc.cmx utils/misc.cmx \ asmcomp/mach.cmx asmcomp/linearize.cmx bytecomp/lambda.cmx \ asmcomp/emitaux.cmx asmcomp/debuginfo.cmx utils/config.cmx \ - asmcomp/compilenv.cmx asmcomp/cmm.cmx utils/clflags.cmx asmcomp/arch.cmx \ - asmcomp/emit.cmi -asmcomp/emitaux.cmo : asmcomp/linearize.cmi asmcomp/debuginfo.cmi \ - utils/config.cmi utils/clflags.cmi asmcomp/arch.cmo asmcomp/emitaux.cmi -asmcomp/emitaux.cmx : asmcomp/linearize.cmx asmcomp/debuginfo.cmx \ - utils/config.cmx utils/clflags.cmx asmcomp/arch.cmx asmcomp/emitaux.cmi + asmcomp/compilenv.cmx asmcomp/cmm.cmx utils/clflags.cmx \ + asmcomp/branch_relaxation.cmx asmcomp/arch.cmx asmcomp/emit.cmi asmcomp/interf.cmo : asmcomp/reg.cmi asmcomp/proc.cmi asmcomp/mach.cmi \ asmcomp/interf.cmi asmcomp/interf.cmx : asmcomp/reg.cmx asmcomp/proc.cmx asmcomp/mach.cmx \ @@ -803,14 +828,14 @@ asmcomp/proc.cmx : asmcomp/reg.cmx utils/misc.cmx asmcomp/mach.cmx \ asmcomp/arch.cmx asmcomp/proc.cmi asmcomp/reg.cmo : typing/ident.cmi asmcomp/cmm.cmi asmcomp/reg.cmi asmcomp/reg.cmx : typing/ident.cmx asmcomp/cmm.cmx asmcomp/reg.cmi -asmcomp/reload.cmo : asmcomp/reloadgen.cmi asmcomp/reg.cmi asmcomp/mach.cmi \ - asmcomp/cmm.cmi utils/clflags.cmi asmcomp/arch.cmo asmcomp/reload.cmi -asmcomp/reload.cmx : asmcomp/reloadgen.cmx asmcomp/reg.cmx asmcomp/mach.cmx \ - asmcomp/cmm.cmx utils/clflags.cmx asmcomp/arch.cmx asmcomp/reload.cmi asmcomp/reloadgen.cmo : asmcomp/reg.cmi utils/misc.cmi asmcomp/mach.cmi \ asmcomp/reloadgen.cmi asmcomp/reloadgen.cmx : asmcomp/reg.cmx utils/misc.cmx asmcomp/mach.cmx \ asmcomp/reloadgen.cmi +asmcomp/reload.cmo : asmcomp/reloadgen.cmi asmcomp/reg.cmi asmcomp/mach.cmi \ + asmcomp/cmm.cmi utils/clflags.cmi asmcomp/arch.cmo asmcomp/reload.cmi +asmcomp/reload.cmx : asmcomp/reloadgen.cmx asmcomp/reg.cmx asmcomp/mach.cmx \ + asmcomp/cmm.cmx utils/clflags.cmx asmcomp/arch.cmx asmcomp/reload.cmi asmcomp/schedgen.cmo : asmcomp/reg.cmi asmcomp/proc.cmi asmcomp/mach.cmi \ asmcomp/linearize.cmi asmcomp/cmm.cmi asmcomp/arch.cmo \ asmcomp/schedgen.cmi @@ -849,8 +874,8 @@ driver/compenv.cmi : driver/compile.cmi : driver/compmisc.cmi : typing/env.cmi driver/errors.cmi : -driver/main.cmi : driver/main_args.cmi : +driver/main.cmi : driver/optcompile.cmi : driver/opterrors.cmi : driver/optmain.cmi : @@ -885,6 +910,8 @@ driver/compmisc.cmx : typing/typemod.cmx utils/misc.cmx \ parsing/asttypes.cmi driver/compmisc.cmi driver/errors.cmo : parsing/location.cmi driver/errors.cmi driver/errors.cmx : parsing/location.cmx driver/errors.cmi +driver/main_args.cmo : utils/warnings.cmi driver/main_args.cmi +driver/main_args.cmx : utils/warnings.cmx driver/main_args.cmi driver/main.cmo : utils/warnings.cmi utils/misc.cmi driver/main_args.cmi \ parsing/location.cmi utils/config.cmi driver/compmisc.cmi \ driver/compile.cmi driver/compenv.cmi utils/clflags.cmi \ @@ -895,8 +922,6 @@ driver/main.cmx : utils/warnings.cmx utils/misc.cmx driver/main_args.cmx \ driver/compile.cmx driver/compenv.cmx utils/clflags.cmx \ bytecomp/bytepackager.cmx bytecomp/bytelink.cmx \ bytecomp/bytelibrarian.cmx driver/main.cmi -driver/main_args.cmo : utils/warnings.cmi driver/main_args.cmi -driver/main_args.cmx : utils/warnings.cmx driver/main_args.cmi driver/optcompile.cmo : utils/warnings.cmi typing/typemod.cmi \ typing/typedtree.cmi typing/typecore.cmi bytecomp/translmod.cmi \ typing/stypes.cmi bytecomp/simplif.cmi typing/printtyped.cmi \ @@ -952,13 +977,15 @@ toplevel/expunge.cmo : bytecomp/symtable.cmi bytecomp/runtimedef.cmi \ toplevel/expunge.cmx : bytecomp/symtable.cmx bytecomp/runtimedef.cmx \ utils/misc.cmx typing/ident.cmx bytecomp/bytesections.cmx toplevel/genprintval.cmo : typing/types.cmi typing/printtyp.cmi \ - typing/predef.cmi typing/path.cmi typing/outcometree.cmi utils/misc.cmi \ - parsing/longident.cmi typing/ident.cmi typing/env.cmi typing/datarepr.cmi \ - typing/ctype.cmi typing/btype.cmi toplevel/genprintval.cmi + typing/predef.cmi typing/path.cmi typing/outcometree.cmi \ + typing/oprint.cmi utils/misc.cmi parsing/longident.cmi typing/ident.cmi \ + typing/env.cmi typing/datarepr.cmi typing/ctype.cmi typing/btype.cmi \ + toplevel/genprintval.cmi toplevel/genprintval.cmx : typing/types.cmx typing/printtyp.cmx \ - typing/predef.cmx typing/path.cmx typing/outcometree.cmi utils/misc.cmx \ - parsing/longident.cmx typing/ident.cmx typing/env.cmx typing/datarepr.cmx \ - typing/ctype.cmx typing/btype.cmx toplevel/genprintval.cmi + typing/predef.cmx typing/path.cmx typing/outcometree.cmi \ + typing/oprint.cmx utils/misc.cmx parsing/longident.cmx typing/ident.cmx \ + typing/env.cmx typing/datarepr.cmx typing/ctype.cmx typing/btype.cmx \ + toplevel/genprintval.cmi toplevel/opttopdirs.cmo : utils/warnings.cmi typing/types.cmi \ typing/printtyp.cmi toplevel/opttoploop.cmi utils/misc.cmi \ parsing/longident.cmi typing/ident.cmi typing/env.cmi typing/ctype.cmi \ @@ -1010,7 +1037,7 @@ toplevel/topdirs.cmo : utils/warnings.cmi typing/typetexp.cmi \ parsing/longident.cmi parsing/location.cmi typing/ident.cmi \ typing/env.cmi bytecomp/dll.cmi typing/ctype.cmi utils/consistbl.cmi \ utils/config.cmi bytecomp/cmo_format.cmi utils/clflags.cmi \ - parsing/asttypes.cmi toplevel/topdirs.cmi + typing/btype.cmi parsing/asttypes.cmi toplevel/topdirs.cmi toplevel/topdirs.cmx : utils/warnings.cmx typing/typetexp.cmx \ typing/types.cmx toplevel/trace.cmx toplevel/toploop.cmx \ bytecomp/symtable.cmx typing/printtyp.cmx typing/predef.cmx \ @@ -1018,7 +1045,7 @@ toplevel/topdirs.cmx : utils/warnings.cmx typing/typetexp.cmx \ parsing/longident.cmx parsing/location.cmx typing/ident.cmx \ typing/env.cmx bytecomp/dll.cmx typing/ctype.cmx utils/consistbl.cmx \ utils/config.cmx bytecomp/cmo_format.cmi utils/clflags.cmx \ - parsing/asttypes.cmi toplevel/topdirs.cmi + typing/btype.cmx parsing/asttypes.cmi toplevel/topdirs.cmi toplevel/toploop.cmo : utils/warnings.cmi typing/types.cmi \ typing/typemod.cmi typing/typedtree.cmi typing/typecore.cmi \ bytecomp/translmod.cmi bytecomp/symtable.cmi bytecomp/simplif.cmi \ diff --git a/.gitignore b/.gitignore index 6c66ecc5..87f7cda4 100644 --- a/.gitignore +++ b/.gitignore @@ -202,11 +202,11 @@ /byterun/.depend /byterun/.depend.nt /byterun/.DS_Store -/byterun/jumptbl.h +/byterun/caml/jumptbl.h /byterun/primitives /byterun/prims.c -/byterun/opnames.h -/byterun/version.h +/byterun/caml/opnames.h +/byterun/caml/version.h /byterun/ocamlrun /byterun/ocamlrun.exe /byterun/ocamlrund @@ -2161,6 +2161,31 @@ /testsuite/tests/tool-debugger/find-artifacts/compiler-libs /testsuite/tests/tool-debugger/find-artifacts/out +# /testsuite/tests/tool-debugger/no_debug_event/ +/testsuite/tests/tool-debugger/no_debug_event/*.o +/testsuite/tests/tool-debugger/no_debug_event/*.a +/testsuite/tests/tool-debugger/no_debug_event/*.so +/testsuite/tests/tool-debugger/no_debug_event/*.obj +/testsuite/tests/tool-debugger/no_debug_event/*.lib +/testsuite/tests/tool-debugger/no_debug_event/*.dll +/testsuite/tests/tool-debugger/no_debug_event/*.cm[ioxat] +/testsuite/tests/tool-debugger/no_debug_event/*.cmx[as] +/testsuite/tests/tool-debugger/no_debug_event/*.cmti +/testsuite/tests/tool-debugger/no_debug_event/*.annot +/testsuite/tests/tool-debugger/no_debug_event/*.result +/testsuite/tests/tool-debugger/no_debug_event/*.byte +/testsuite/tests/tool-debugger/no_debug_event/*.native +/testsuite/tests/tool-debugger/no_debug_event/program +/testsuite/tests/tool-debugger/no_debug_event/*.exe +/testsuite/tests/tool-debugger/no_debug_event/*.exe.manifest +/testsuite/tests/tool-debugger/no_debug_event/.depend +/testsuite/tests/tool-debugger/no_debug_event/.depend.nt +/testsuite/tests/tool-debugger/no_debug_event/.DS_Store +/testsuite/tests/tool-debugger/no_debug_event/compiler-libs +/testsuite/tests/tool-debugger/no_debug_event/out +/testsuite/tests/tool-debugger/no_debug_event/c +/testsuite/tests/tool-debugger/no_debug_event/c.exe + # /testsuite/tests/tool-lexyacc/ /testsuite/tests/tool-lexyacc/*.o /testsuite/tests/tool-lexyacc/*.a diff --git a/.merlin b/.merlin new file mode 100644 index 00000000..99779840 --- /dev/null +++ b/.merlin @@ -0,0 +1,51 @@ +S ./asmcomp +B ./asmcomp + +S ./bytecomp +B ./bytecomp + +S ./driver +B ./driver + +S ./lex +B ./lex + +S ./otherlibs/bigarray +B ./otherlibs/bigarray + +S ./otherlibs/dynlink +B ./otherlibs/dynlink + +S ./otherlibs/graph +B ./otherlibs/graph + +S ./otherlibs/num +B ./otherlibs/num + +S ./otherlibs/str +B ./otherlibs/str + +S ./otherlibs/systhreads +B ./otherlibs/systhreads + +S ./otherlibs/threads +B ./otherlibs/threads + +S ./otherlibs/unix +B ./otherlibs/unix + +S ./parsing +B ./parsing + +S ./stdlib +B ./stdlib + +S ./toplevel +B ./toplevel + +S ./typing +B ./typing + +S ./utils +B ./utils + diff --git a/.travis-ci.sh b/.travis-ci.sh index 788c997a..e34353af 100644 --- a/.travis-ci.sh +++ b/.travis-ci.sh @@ -3,11 +3,11 @@ i386) ./configure make world.opt sudo make install - cd testsuite && make all - git clone git://github.com/ocaml/camlp4 - cd camlp4 && ./configure && make && sudo make install + (cd testsuite && make all) + git clone git://github.com/ocaml/camlp4 -b 4.02 + (cd camlp4 && ./configure && make && sudo make install) git clone git://github.com/ocaml/opam - cd opam && ./configure && make lib-ext && make && sudo make install + (cd opam && ./configure && make lib-ext && make && sudo make install) opam init -y -a git://github.com/ocaml/opam-repository opam install -y utop ;; diff --git a/Changes b/Changes index f1435285..dfa9e700 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,244 @@ -OCaml 4.02.1: +OCaml 4.02.2: ------------- + +(Changes that can break existing programs are marked with a "*") + +Language features: +- PR#6583: add a new class of binary operators with the same syntactic + precedence as method calls; these operators start with # followed + by a non-empty sequence of operator symbols (for instance #+, #!?). + It is also possible to use '#' as part of these extra symbols + (for instance ##, or #+#); this is rejected by the type-checker, + but can be used e.g. by ppx rewriters. + (Alain Frisch, request by Gabriel Radanne) +* PR#6016: add a "nonrec" keyword for type declarations + (Jérémie Dimino) + +Compilers: +- PR#6600: make -short-paths faster by building the printing map + incrementally + (Jacques Garrigue) +- PR#6642: replace $CAMLORIGIN in -ccopt with the path to cma or cmxa + (Peter Zotov, Gabriel Scherer, review by Damien Doligez) +- PR#6797: new option -output-complete-obj + to output an object file with included runtime and autolink libraries + (Peter Zotov) +- PR#6845: -no-check-prims to tell ocamlc not to check primitives in runtime + (Alain Frisch) +- GPR#149: Attach documentation comments to parse tree + (Leo White) +- GPR#159: Better locations for structure/signature items + (Leo White) + +Toplevel and debugger: +- PR#5958: generalized polymorphic #install_printer + (Pierre Chambart and Grégoire Henry) + +OCamlbuild: +- PR#6237: explicit "infer" tag to control or disable menhir --infer + (Hugo Heuzard) +- PR#6625: pass -linkpkg to files built with -output-obj. + (Peter Zotov) +- PR#6702: explicit "linkpkg" and "dontlink(foo)" flags + (Peter Zotov, Gabriel Scherer) +- PR#6712: Ignore common VCS directories + (Peter Zotov) +- PR#6720: pass -g to C compilers when tag 'debug' is set + (Peter Zotov, Gabriel Scherer) +- PR#6733: add .byte.so and .native.so targets to pass + -output-obj -cclib -shared. + (Peter Zotov) +- PR#6733: "runtime_variant(X)" to pass -runtime-variant X option. + (Peter Zotov) +- PR#6774: new menhir-specific flags "only_tokens" and "external_tokens(Foo)" + (François Pottier) + +Libraries: +- PR#6285: Add support for nanosecond precision in Unix.stat() + (Jérémie Dimino, report by user 'gfxmonk') +- PR#6781: Add higher baud rates to Unix termios + (Damien Doligez, report by Berke Durak) +- PR#6834: Add Obj.{first,last}_non_constant_constructor_tag + (Mark Shinwell, request by Gabriel Scherer) + +Runtime: +- PR#6078: Release the runtime system when calling caml_dlopen + (Jérémie Dimino) +- PR#6675: GC hooks + (Damien Doligez and Roshan James) + +Build system: +- PR#5418 (comments) : generate dependencies with $(CC) instead of gcc + (Damien Doligez and Michael Grünewald) +- PR#6266: Cross compilation for iOs, Android etc + (Peter Zotov, review by Damien Doligez and Mark Shinwell) + +Installation procedure: +- Update instructions for x86-64 PIC mode and POWER architecture builds + (Mark Shinwell) + +Bug fixes: +- PR#5271: Location.prerr_warning is hard-coded to use Format.err_formatter + (Damien Doligez, report by Rolf Rolles) +- PR#5395: OCamlbuild mishandles relative symlinks and include paths + (Damien Doligez, report by Didier Le Botlan) +- PR#5822: wrong value of Options.ext_dll on windows + (Damien Doligez and Daniel Weil) +- PR#5836, PR#6684: printing lazy values in ocamldebug may segfault + (Gabriel Scherer, request by the Coq team) +- PR#5887: move the byterun/*.h headers to byterun/caml/*.h to avoid + header name clashes + (Jérôme Vouillon and Adrien Nader and Peter Zotov) +- PR#6281: Graphics window does not acknowledge second click (double click) + (Kyle Headley) +- PR#6490: incorrect backtraces in gdb on AArch64. Also fixes incorrect + backtraces on 32-bit ARM. + (Mark Shinwell) +- PR#6573: extern "C" for systhreads/threads.h + (Mickaël Delahaye) +- PR#6575: Array.init evaluates callback although it should not do so + (Alain Frisch, report by Gerd Stolpmann) +- PR#6607: The manual doesn't mention 0x200 flag for OCAMLRUNPARAM=v + (Alain Frisch) +- PR#6616: allow meaningful use of -use-runtime without -custom. + (Peter Zotov) +- PR#6617: allow android build with pthreads support (since SDK r10c) + (Peter Zotov) +- PR#6626: ocamlbuild on cygwin cannot find ocamlfind + (Gergely Szilvasy) +- PR#6628: Configure script rejects legitimate arguments + (Michael Grünewald, Damien Doligez) +- PR#6630: Failure of tests/prim-bigstring/{big,}string.ml on big-endian + architectures + (Pierre Chambart, testing by Mark Shinwell) +- PR#6640: ocamlbuild: wrong "unused tag" warning on "precious" + (report by user 'william') +- PR#6652: ocamlbuild -clean does not print a newline after output + (Damien Doligez, report by Andi McClure) +- PR#6658: cross-compiler: version check not working on OS X + (Gerd Stolpmann) +- PR#6665: Failure of tests/asmcomp on sparc + (Stéphane Glondu) +- PR#6667: wrong implementation of %bswap16 on ARM64 + (Xavier Leroy) +- PR#6669: fix 4.02 regression in toplevel printing of lazy values + (Leo White, review by Gabriel Scherer) +- PR#6671: Windows: environment variable 'TZ' affects Unix.gettimeofday + (Mickael Delahaye and Damien Doligez) +- PR#6680: Missing parentheses in warning about polymorphic variant value + (Jacques Garrigue and Gabriel Scherer, report by Philippe Veber) +- PR#6686: Bug in [subst_boxed_number] + (Jérémie Dimino, Mark Shinwell) +- PR#6690: Uncaught exception (Not_found) with (wrong) wildcard or unification + type variable in place of a local abstract type + (Jacques Garrigue, report by Mikhail Mandrykin) +- PR#6693 (part two): Incorrect relocation types in x86-64 runtime system + (Peter Zotov, review by Jacques-Henri Jourdan, Xavier Leroy and Mark Shinwell) +- PR#6717: Pprintast does not print let-pattern attributes + (Gabriel Scherer, report by Peter Zotov) +- PR#6727: Printf.sprintf "%F" misbehavior + (Benoît Vaugon, report by Vassili Karpov) +- PR#6747: ocamlobjinfo: missing symbol caml_plugin_header due to underscore + (Damien Doligez, Maverick Woo) +- PR#6749: ocamlopt returns n for (n mod 1) instead of 0 + (Mark Shinwell and Jérémie Dimino) +- PR#6753: Num.quo_num and Num.mod_num incorrect for some negative arguments + (Xavier Leroy) +- PR#6758: Ocamldoc "analyse_module: parsetree and typedtree don't match" + (Damien Doligez, report by user 'maro') +- PR#6759: big_int_of_string incorrectly parses some hexa literals + (Damien Doligez, report by Pierre-yves Strub) +- PR#6763: #show with -short-paths doesn't select shortest type paths + (Jacques Garrigue, report by David Sheets) +- PR#6768: Typechecker overflow the stack on cyclic type + (Jacques Garrigue, report by user 'darktenaibre') +- PR#6772: asmrun/signals_asm.c doesn't compile on NetBSD/i386 + (Kenji Tokudome) +- PR#6775: Digest.file leaks file descriptor on error + (Valentin Gatien-Baron) +- PR#6779: Cross-compilers cannot link bytecode using custom primitives + (Damien Doligez, request by Peter Zotov) +- PR#6787: Soundness bug with polymorphic variants + (Jacques Garrigue, with help from Leo White and Grégoire Henry, + report by Michael O'Connor) +- PR#6790: otherlibs should be built with -g + (Damien Doligez, report by Peter Zotov) +- PR#6791: "%s@[", "%s@{" regression in Scanf + (Benoît Vaugon) +- PR#6793: ocamlbuild passes nonsensical "-ocamlc ..." commands to menhir + (Gabriel Scherer, report by Damien Doligez) +- PR#6799: include guards missing for unixsupport.h and other files + (Andreas Hauptmann) +- PR#6810: Improve documentation of Bigarray.Genarray.map_file + (Mark Shinwell and Daniel Bünzli) +- PR#6812: -short-paths and -no-alias-deps can create inconsistent assumptions + (Jacques Garrigue, report by Valentin Gatien-Baron) +- PR#6817: GADT exhaustiveness breakage with modules + (Leo White, report by Pierre Chambart) +- PR#6824: fix buffer sharing on partial application of Format.asprintf + (Gabriel Scherer, report by Alain Frisch) +- PR#6831: Build breaks for -aspp gcc on solaris-like OSs + (John Tibble) +- PR#6836: Assertion failure using -short-paths + (Jacques Garrigue, report by David Sheets) +- PR#6837: Build profiling libraries on FreeBSD and NetBSD x86-64 + (Mark Shinwell, report by Michael Grünewald) +- PR#6841: Changing compilation unit name with -o breaks ocamldebug + (Jacques Garrigue, report by Jordan Walke) +- PR#6843: record weak dependencies even when the .cmi is missing + (Leo White, Gabriel Scherer) +- PR#6849: Inverted pattern unification error + (Jacques Garrigue, report by Leo White) +- PR#6857: __MODULE__ doesn't give the current module with -o + (Jacques Garrigue, report by Valentin Gatien-Baron) +- PR#6862: Exhaustiveness check wrong for class constructor arguments + (Jacques Garrigue) +- PR#6869: Improve comment on [Hashtbl.hash_param] + (Mark Shinwell, report by Jun Furuse) +- PR#6870: Unsoundness when -rectypes fails to detect non-contractive type + (Jacques Garrigue, report by Stephen Dolan) +- PR#6872: Type-directed propagation fails to disambiguate variants + that are also exception constructors + (Jacques Garrigue, report by Romain Beauxis) +- PR#6878: AArch64 backend generates invalid asm: conditional branch + out of range (Mark Shinwell, report by Richard Jones, testing by Richard + Jones and Xavier Leroy, code review by Xavier Leroy and Thomas Refis) +- PR#6879: Wrong optimization of 1 mod n + (Mark Shinwell, report by Jean-Christophe Filliâtre) +- PR#6884: The __CYGWIN32__ #define should be replaced with __CYGWIN__ + (Adrien Nader) +- PR#6886: -no-alias-deps allows to build self-referential compilation units + (Jacques Garrigue, report by Valentin Gatien-Baron) +- PR#6889: ast_mapper fails to rewrite class attributes + (Sébastien Briais) +- PR#6893: ocamlbuild: "tag not used" warning when using (p)dep + (Gabriel Scherer, report by Christiano Haesbaert) +- GPR#143: fix getsockopt behaviour for boolean socket options + (Anil Madhavapeddy and Andrew Ray) +- GPR#190: typo in pervasives + (Guillaume Bury) +- Misplaced assertion in major_gc.c for no-naked-pointers mode + (Stephen Dolan, Mark Shinwell) + +Feature wishes: +- PR#6452, GPR#140: add internal suport for custom printing formats + (Jérémie Dimino) +- PR#6641: add -g, -ocamlcflags, -ocamloptflags options to ocamlmklib + (Peter Zotov) +- PR#6693: also build libasmrun_shared.so and lib{asm,caml}run_pic.a + (Peter Zotov, review by Mark Shinwell) +- PR#6842: export Typemod.modtype_of_package + (Jacques Garrigue, request by Jun Furuse) +- GPR#139: more versatile specification of locations of .annot + (Christophe Troestler, review by Damien Doligez) +- GPR#157: store the path of cmos inside debug section at link time + (Hugo Heuzard, review by Damien Doligez) +- GPR#191: Making gc.h and some part of memory.h public + (Thomas Refis) + +OCaml 4.02.1 (14 Oct 2014): +--------------------------- + (Changes that can break existing programs are marked with a "*") Standard library: @@ -17,7 +256,7 @@ Standard library: (Xavier Leroy, Alain Frisch, relase-worthy report by Jacques-Pascal Deplaix) - PR#6530: Add stack overflow handling for native code (OpenBSD i386 and amd64) (Cristopher Zimmermann) -- PR#6533: broken semantics of %(%) when substitued by a box +- PR#6533: broken semantics of %(%) when substituted by a box (Benoît Vaugon, report by Boris Yakobowski) - PR#6534: legacy support for %.10s (Benoît Vaugon, Gabriel Scherer, report by Nick Chapman) @@ -49,6 +288,8 @@ Standard library: (Jacques Garrigue, report by Mark Shinwell) - PR#6572: Fatal error with recursive modules (Jacques Garrigue, report by Quentin Stievenart) +- PR#6575: Array.init evaluates callback although it should not do so + (Alain Frisch, report by Gerd Stolpmann) - PR#6578: Recursive module containing alias causes Segmentation fault (Jacques Garrigue) - PR#6581: Some bugs in generative functors @@ -66,8 +307,8 @@ Standard library: - ocamlbuild: add an -ocamlmklib option to change the ocamlmklib command (Jérôme Vouillon) -OCaml 4.02.0: -------------- +OCaml 4.02.0 (29 Aug 2014): +--------------------------- (Changes that can break existing programs are marked with a "*") @@ -76,7 +317,7 @@ Language features: (Alain Frisch) - Generative functors (PR#5905) (Jacques Garrigue) -- Module aliases +* Module aliases (Jacques Garrigue) * Alternative syntax for string literals {id|...|id} (can break comments) (Alain Frisch) @@ -107,8 +348,8 @@ Type system: an applicative functor if no types are created (Jacques Garrigue, suggestion by Leo White) * Module aliases are now typed in a specific way, which remembers their - identity. In particular this changes the signature inferred by - "module type of" + identity. Compiled interfaces become smaller, but may depend on the + original modules. This also changes the signature inferred by "module type of". (Jacques Garrigue, feedback from Leo White, Mark Shinwell and Nick Chapman) - PR#6331: Slight change in the criterion to distinguish private abbreviations and private row types: create a private abbreviation for @@ -359,7 +600,7 @@ Features wishes: - PR#4855: 'camlp4 -I +dir' accepted, dir is relative to 'camlp4 -where' (Jun Furuse and Hongbo Zhang, report by Dmitry Grebeniuk) - PR#5201: ocamlbuild: add --norc to the bash invocation to help performances - (user 'daweil') + (Daniel Weil) - PR#5650: Camlp4FoldGenerator doesn't handle well "abstract" types (Hongbo Zhang) - PR#5808: allow simple patterns, not just identifiers, in "let p : t = ..." @@ -419,8 +660,8 @@ Features wishes: - make ocamldebug -I auto-detection work with ocamlbuild (Josh Watzman) -OCaml 4.01.0: -------------- +OCaml 4.01.0 (12 Sep 2013): +--------------------------- (Changes that can break existing programs are marked with a "*") @@ -855,8 +1096,8 @@ Tools: (Guillaume Melquiond, Alain Frisch) -OCaml 4.00.1: -------------- +OCaml 4.00.1 (5 Oct 2012): +-------------------------- Bug fixes: - PR#4019: better documentation of Str.matched_string @@ -885,8 +1126,8 @@ Bug fixes: - PR#5761: Incorrect bigarray custom block size -OCaml 4.00.0: -------------- +OCaml 4.00.0 (26 Jul 2012): +--------------------------- (Changes that can break existing programs are marked with a "*") @@ -1212,8 +1453,8 @@ Other changes: - Copy VERSION file to library directory when installing. -OCaml 3.12.1: -------------- +OCaml 3.12.1 (4 Jul 2011): +-------------------------- Bug fixes: - PR#4345, PR#4767: problems with camlp4 printing of float values @@ -1310,8 +1551,8 @@ Other changes: comparing a custom block value with an unboxed integer. -Objective Caml 3.12.0: ----------------------- +Objective Caml 3.12.0 (2 Aug 2010): +----------------------------------- (Changes that can break existing programs are marked with a "*" ) @@ -1441,8 +1682,8 @@ Bug Fixes: - Small problem with representation of Int32, Int64, and Nativeint constants. - Use RTLD_LOCAL for native dynlink in private mode. -Objective Caml 3.11.2: ----------------------- +Objective Caml 3.11.2 (20 Jan 2010): +------------------------------------ Bug fixes: - PR#4151: better documentation for min and max w.r.t. NaN @@ -1490,8 +1731,8 @@ Feature wishes: - PR#4723: "clear_rules" function to empty the set of ocamlbuild rules - PR#4921: configure option to help cross-compilers -Objective Caml 3.11.1: ----------------------- +Objective Caml 3.11.1 (12 Jun 2009): +------------------------------------ Bug fixes: - PR#4095: ocamldebug: strange behaviour of control-C @@ -1546,8 +1787,8 @@ Other changes: - Support for 64-bit mode in Solaris/x86 (PR#4670). -Objective Caml 3.11.0: ----------------------- +Objective Caml 3.11.0 (03 Dec 2008): +------------------------------------ (Changes that can break existing programs are marked with a "*" ) @@ -1677,8 +1918,8 @@ Bug fixes: - PR#4614: Inconsistent declaration of CamlCBCmd in LablTk library. -Objective Caml 3.10.2: ----------------------- +Objective Caml 3.10.2 (29 Feb 2008): +------------------------------------ Bug fixes: - PR#1217 (partial) Typo in ocamldep man page @@ -1695,8 +1936,8 @@ Bug fixes: - Bug in typing of polymorphic variants (reported on caml-list) -Objective Caml 3.10.1: ----------------------- +Objective Caml 3.10.1 (11 Jan 2008): +------------------------------------ Bug fixes: - PR#3830 small bugs in docs @@ -1782,8 +2023,8 @@ New features: emacs files -Objective Caml 3.10.0: ----------------------- +Objective Caml 3.10.0 (18 May 2007): +------------------------------------ (Changes that can break existing programs are marked with a "*" ) @@ -1860,8 +2101,8 @@ Lexer generator (ocamllex): improved error reporting. License: fixed a typo in the "special exception" to the LGPL. -Objective Caml 3.09.3: ----------------------- +Objective Caml 3.09.3 (15 Sep 2006): +------------------------------------ Bug fixes: - ocamldoc: -using modtype constraint to filter module elements displayed @@ -1896,8 +2137,8 @@ New features: -Objective Caml 3.09.2: ----------------------- +Objective Caml 3.09.2 (14 Apr 2006): +------------------------------------ Bug fixes: - Makefile: problem with "make world.opt" PR#3954 @@ -1927,8 +2168,8 @@ New features: - ported to MacOS X on Intel PR#3985 - configure: added support for GNU Hurd PR#3991 -Objective Caml 3.09.1: ----------------------- +Objective Caml 3.09.1 (4 Jan 2006): +----------------------------------- Bug fixes: - compilers: raise not_found with -principal PR#3855 @@ -1962,8 +2203,8 @@ Bug fixes: New features: - otherlibs/labltk: browser uses menu bars instead of menu buttons -Objective Caml 3.09.0: ----------------------- +Objective Caml 3.09.0 (27 Oct 2006): +------------------------------------ (Changes that can break existing programs are marked with a "*" ) @@ -2037,8 +2278,8 @@ Miscellaneous: - Configuration information is installed in `ocamlc -where`/Makefile.config and can be used by client Makefiles or shell scripts. -Objective Caml 3.08.4: ----------------------- +Objective Caml 3.08.4 (11 Aug 2005): +------------------------------------ New features: - configure: find X11 config in some 64-bit Linux distribs @@ -2085,8 +2326,8 @@ Bug fixes: - yacc: avoid name capture for idents of the Parsing module -Objective Caml 3.08.3: ----------------------- +Objective Caml 3.08.3 (24 Mar 2005): +------------------------------------ New features: - support for ocamlopt -pack under Mac OS X (PR#2634, PR#3320) @@ -2130,8 +2371,8 @@ Bug fixes: - windows: better handling of InterpreterPath registry entry (PR#3334, PR#3432) -Objective Caml 3.08.2: ----------------------- +Objective Caml 3.08.2 (22 Nov 2004): +------------------------------------ Bug fixes: - runtime: memory leak when unmarshalling big data structures (PR#3247) @@ -2151,8 +2392,8 @@ Misc: - unix: added missing #includes (PR#3088) -Objective Caml 3.08.1: ----------------------- +Objective Caml 3.08.1 (19 Aug 2004): +------------------------------------ Licence: - The emacs files are now under GPL @@ -2176,8 +2417,8 @@ Misc: - added -v option to ocamllex - ocamldoc: new -intf and -impl options supported (PR#3036) -Objective Caml 3.08.0: ----------------------- +Objective Caml 3.08.0 (13 Jul 2004): +------------------------------------ (Changes that can break existing programs are marked with a "*" ) @@ -2278,8 +2519,8 @@ Camlp4: - See camlp4/CHANGES and camlp4/ICHANGES for more info. -Objective Caml 3.07: --------------------- +Objective Caml 3.07 (29 Sep 2003): +---------------------------------- Language features: - Experimental support for recursive module definitions @@ -2438,8 +2679,8 @@ OCamldoc: - fix: empty [] in generated HTML indexes -Objective Caml 3.06: --------------------- +Objective Caml 3.06 (20 Aug 2002): +---------------------------------- Type-checking: - Apply value restriction to polymorphic record fields. @@ -2464,8 +2705,8 @@ Windows ports: - Fixed two problems with the Mingw port under Cygwin 1.3. -Objective Caml 3.05: --------------------- +Objective Caml 3.05 (29 Jul 2002): +---------------------------------- Language features: - Support for polymorphic methods and record fields. @@ -2596,8 +2837,8 @@ Windows port: - LablTk library: fixed a bug in Fileinput -Objective Caml 3.04: --------------------- +Objective Caml 3.04 (13 Dec 2001): +---------------------------------- Type-checker: - Allowed coercing self to the type of the current class, avoiding @@ -2664,8 +2905,8 @@ License: added special exception to the LGPL'ed code (libraries and runtime system) allowing unrestricted linking, whether static or dynamic. -Objective Caml 3.03 ALPHA: --------------------------- +Objective Caml 3.03 ALPHA (12 Oct 2001): +---------------------------------------- Language: - Removed built-in syntactic sugar for streams and stream patterns @@ -2745,8 +2986,8 @@ Windows port: -Objective Caml 3.02: --------------------- +Objective Caml 3.02 (30 Jul 2001): +---------------------------------- Both compilers: - Fixed embarrassing bug in pattern-matching compilation @@ -2811,8 +3052,8 @@ MacOS 9 port: - Removed the last traces of support for 68k -Objective Caml 3.01: --------------------- +Objective Caml 3.01 (09 Mar 2001): +---------------------------------- New language features: - Variables are allowed in "or" patterns, e.g. @@ -2929,8 +3170,8 @@ Mac OS ports: - Int64.format works on Mac OS 8/9. -Objective Caml 3.00: --------------------- +Objective Caml 3.00 (25 Apr 2000): +---------------------------------- Language: - OCaml/OLabl merger: @@ -3040,8 +3281,8 @@ Macintosh port: program written in O'Caml. -Objective Caml 2.04: --------------------- +Objective Caml 2.04 (26 Nov 1999): +---------------------------------- - C interface: corrected inconsistent change in the CAMLparam* macros. - Fixed internal error in ocamlc -g. @@ -3054,8 +3295,8 @@ Objective Caml 2.04: - Native-code compiler: fixed bug in assembling certain floating-point constants (masm doesn't grok 2e5, wants 2.0e5). -Objective Caml 2.03: --------------------- +Objective Caml 2.03 (19 Nov 1999): +---------------------------------- New ports: - Ported to BeOS / Intel x86 (bytecode and native-code). @@ -3140,8 +3381,8 @@ Others: not loading properly. -Objective Caml 2.02: --------------------- +Objective Caml 2.02 (04 Mar 1999): +---------------------------------- * Type system: - Check that all components of a signature have unique names. @@ -3223,8 +3464,8 @@ Objective Caml 2.02: - Fixed end-of-line bug in ocamlcp causing problems with generated sources. -Objective Caml 2.01: --------------------- +Objective Caml 2.01 (09 Dec 1998): +---------------------------------- * Typing: - Added warning for expressions of the form "a; b" where a does not have @@ -3301,8 +3542,8 @@ Objective Caml 2.01: * Macintosh port: source code for Macintosh application merged in. -Objective Caml 2.00: --------------------- +Objective Caml 2.00 (19 Aug 1998): +---------------------------------- * Language: - New class language. See http://caml.inria.fr/ocaml/refman/ @@ -3400,8 +3641,8 @@ Objective Caml 2.00: - Fixed bug with next-error under Emacs 20. -Objective Caml 1.07: --------------------- +Objective Caml 1.07 (11 Dec 1997): +---------------------------------- * Native-code compiler: - Revised interface between generated code and GC, fixes serious GC @@ -3425,8 +3666,8 @@ Objective Caml 1.07: * MS Windows port: better handling of long command lines in Sys.command -Objective Caml 1.06: --------------------- +Objective Caml 1.06 (18 Nov 1997): +---------------------------------- * Language: - Added two new keywords: "assert" (check assertion) and "lazy" @@ -3523,8 +3764,8 @@ Objective Caml 1.06: * Emacs editing mode and debugger interface updated to July '97 version. -Objective Caml 1.05: --------------------- +Objective Caml 1.05 (21 Mar 1997): +---------------------------------- * Typing: fixed several bugs causing spurious type errors. @@ -3542,8 +3783,8 @@ handling of checkpoints; various other small fixes. * Macintosh port: fixed signed division problem in bytecomp/emitcode.ml -Objective Caml 1.04: --------------------- +Objective Caml 1.04 (11 Mar 1997): +---------------------------------- * Replay debugger ported from Caml Light; added debugger support in compiler (option -g) and runtime system. Debugger is alpha-quality @@ -3605,8 +3846,8 @@ Objective Caml 1.04: * Emacs editing mode and debugger interface included in distribution. -Objective Caml 1.03: --------------------- +Objective Caml 1.03 (29 Oct 1996): +---------------------------------- * Typing: - bug with type names escaping their scope via unification with @@ -3654,8 +3895,9 @@ Objective Caml 1.03: * Perl-free, cpp-free, cholesterol-free installation procedure. -Objective Caml 1.02: --------------------- +Objective Caml 1.02 (27 Sep 1996): +---------------------------------- + * Typing: - fixed bug with type names escaping their scope via unification with non-generalized type variables '_a; @@ -3711,8 +3953,9 @@ Objective Caml 1.02: and call caml_main() later. -Objective Caml 1.01: --------------------- +Objective Caml 1.01 (12 Jun 1996): +---------------------------------- + * Typing: better report of type incompatibilities; non-generalizable type variables in a struct...end no longer flagged immediately as an error; @@ -3763,8 +4006,8 @@ Objective Caml 1.01: some error messages have been made clearer; several bugs fixes. -Objective Caml 1.00: --------------------- +Objective Caml 1.00 (9 May 1996): +--------------------------------- * Merge of Jerome Vouillon and Didier Remy's object-oriented extensions. @@ -3799,8 +4042,8 @@ marshaling to/from strings. * Dynlink library: added support for linking libraries (.cma files). -Caml Special Light 1.15: ------------------------- +Caml Special Light 1.15 (15 Mar 1996): +-------------------------------------- * Caml Special Light now runs under Windows NT and 95. Many thanks to Kevin Gallo (Microsoft Research) who contributed his initial port. @@ -3830,8 +4073,8 @@ manifest module type specifications. * Unix library: bug in gethostbyaddr fixed; bounds checking for read, write, etc. -Caml Special Light 1.14: ------------------------- +Caml Special Light 1.14 (8 Feb 1996): +------------------------------------- * cslopt ported to the PowerPC/RS6000 architecture. Better support for AIX in the bytecode system as well. @@ -3844,8 +4087,8 @@ out-of-order pops fixed. * Several bug fixes in callbacks and signals. -Caml Special Light 1.13: ------------------------- +Caml Special Light 1.13 (4 Jan 1996): +------------------------------------- * Pattern-matching compilation revised to factor out accesses inside matched structures. @@ -3868,13 +4111,13 @@ Intel decided to organize the floating-point registers as a stack). * cslopt for the Sparc: don't use Sparc V8 smul and sdiv instructions, emulation on V7 processors is abysmal. -Caml Special Light 1.12: ------------------------- +Caml Special Light 1.12 (30 Nov 1995): +-------------------------------------- * Fixed an embarrassing bug with references to floats. -Caml Special Light 1.11: ------------------------- +Caml Special Light 1.11 (29 Nov 1995): +-------------------------------------- * Streams and stream parsers a la Caml Light are back (thanks to Daniel de Rauglaudre). @@ -3896,8 +4139,8 @@ core on me). * Lower memory consumption for the native-code compiler. -Caml Special Light 1.10: ------------------------- +Caml Special Light 1.10 (07 Nov 1995): +-------------------------------------- * Many bug fixes (too many to list here). @@ -3914,8 +4157,8 @@ arbitrary-precision arithmetic have been ported (thanks to John Malecki and Victor Manuel Gulias Fernandez); better docs for the Unix and regexp libraries. -Caml Special Light 1.07: ------------------------- +Caml Special Light 1.07 (20 Sep 1995): +-------------------------------------- * Syntax: optional ;; allowed in compilation units and structures (back by popular demand) @@ -3931,7 +4174,7 @@ no calls to ranlib in Solaris * Standard library: added List.memq; documentation of Array fixed. -Caml Special Light 1.06: ------------------------- +Caml Special Light 1.06 (12 Sep 1995): +-------------------------------------- * First public release. diff --git a/INSTALL b/INSTALL index 63ae5c67..a83bbd3b 100644 --- a/INSTALL +++ b/INSTALL @@ -140,15 +140,24 @@ Examples: or: ./configure -prefix /usr -mandir '$(PREFIX)/man/manl' - On a Linux x86/64 bits host, to build a 32-bit version of OCaml: + On a Linux x86-64 host, to build a 32-bit version of OCaml: ./configure -cc "gcc -m32" -as "as --32" -aspp "gcc -m32 -c" \ -host i386-linux -partialld "ld -r -melf_i386" - On a Linux x86/64 bits host, to build the run-time system in PIC mode - (enables putting the runtime in a shared library, - at a small performance cost): + On a Linux x86-64 host, to build the run-time system in PIC mode, + no special options should be required---the libraries should be built + automatically. The old instructions were: ./configure -cc "gcc -fPIC" -aspp "gcc -c -fPIC" + On a 64-bit POWER architecture host running Linux, OCaml only operates + in a 32-bit environment. If your system compiler is configured as 32-bit, + e.g. Red Hat 5.9, you don't need to do anything special. If that is + not the case (e.g. Red Hat 6.4), then IBM's "Advance Toolchain" can + be used. For example: + export PATH=/opt/at7.0/bin:$PATH + ./configure -cc "gcc -m32" -as "as -a32" -aspp "gcc -m32 -c" \ + -partialld "ld -r -m elf32ppc" + On a MacOSX 10.5/Intel Core 2 or MacOSX 10.5/PowerPC host, to build a 64-bit version of OCaml: ./configure -cc "gcc -m64" diff --git a/Makefile b/Makefile index 6c0e7e64..1cfc9b40 100644 --- a/Makefile +++ b/Makefile @@ -13,20 +13,20 @@ # The main Makefile include config/Makefile +CAMLRUN ?= boot/ocamlrun +CAMLYACC ?= boot/ocamlyacc include stdlib/StdlibModules -CAMLC=boot/ocamlrun boot/ocamlc -nostdlib -I boot -CAMLOPT=boot/ocamlrun ./ocamlopt -nostdlib -I stdlib -I otherlibs/dynlink -COMPFLAGS=-strict-sequence -w +33..39+48 -warn-error A -bin-annot \ +CAMLC=$(CAMLRUN) boot/ocamlc -nostdlib -I boot +CAMLOPT=$(CAMLRUN) ./ocamlopt -nostdlib -I stdlib -I otherlibs/dynlink +COMPFLAGS=-strict-sequence -w +33..39+48+50 -warn-error A -bin-annot \ -safe-string $(INCLUDES) LINKFLAGS= -CAMLYACC=boot/ocamlyacc YACCFLAGS=-v -CAMLLEX=boot/ocamlrun boot/ocamllex -CAMLDEP=boot/ocamlrun tools/ocamldep +CAMLLEX=$(CAMLRUN) boot/ocamllex +CAMLDEP=$(CAMLRUN) tools/ocamldep DEPFLAGS=$(INCLUDES) -CAMLRUN=byterun/ocamlrun SHELL=/bin/sh MKDIR=mkdir -p @@ -43,7 +43,7 @@ UTILS=utils/misc.cmo utils/tbl.cmo utils/config.cmo \ utils/consistbl.cmo PARSING=parsing/location.cmo parsing/longident.cmo \ - parsing/ast_helper.cmo \ + parsing/docstrings.cmo parsing/ast_helper.cmo \ parsing/syntaxerr.cmo parsing/parser.cmo \ parsing/lexer.cmo parsing/parse.cmo parsing/printast.cmo \ parsing/pprintast.cmo \ @@ -94,6 +94,8 @@ ASMCOMP=asmcomp/arch.cmo asmcomp/debuginfo.cmo \ asmcomp/deadcode.cmo \ asmcomp/printlinear.cmo asmcomp/linearize.cmo \ asmcomp/schedgen.cmo asmcomp/scheduling.cmo \ + asmcomp/branch_relaxation_intf.cmo \ + asmcomp/branch_relaxation.cmo \ asmcomp/emitaux.cmo asmcomp/emit.cmo asmcomp/asmgen.cmo \ asmcomp/asmlink.cmo asmcomp/asmlibrarian.cmo asmcomp/asmpackager.cmo \ driver/opterrors.cmo driver/optcompile.cmo @@ -192,7 +194,7 @@ coldstart: if test -f boot/libcamlrun.a; then :; else \ ln -s ../byterun/libcamlrun.a boot/libcamlrun.a; fi if test -d stdlib/caml; then :; else \ - ln -s ../byterun stdlib/caml; fi + ln -s ../byterun/caml stdlib/caml; fi # Build the core system: the minimum needed to make depend and bootstrap core: @@ -317,7 +319,7 @@ install: cp ocaml $(INSTALL_BINDIR)/ocaml$(EXE) cd stdlib; $(MAKE) install cp lex/ocamllex $(INSTALL_BINDIR)/ocamllex$(EXE) - cp yacc/ocamlyacc$(EXE) $(INSTALL_BINDIR)/ocamlyacc$(EXE) + cp $(CAMLYACC)$(EXE) $(INSTALL_BINDIR)/ocamlyacc$(EXE) cp utils/*.cmi parsing/*.cmi typing/*.cmi bytecomp/*.cmi driver/*.cmi \ toplevel/*.cmi $(INSTALL_COMPLIBDIR) cp compilerlibs/ocamlcommon.cma compilerlibs/ocamlbytecomp.cma \ @@ -538,8 +540,8 @@ $(COMMON:.cmo=.cmx) $(BYTECOMP:.cmo=.cmx) $(ASMCOMP:.cmo=.cmx): ocamlopt # The numeric opcodes -bytecomp/opcodes.ml: byterun/instruct.h - sed -n -e '/^enum/p' -e 's/,//g' -e '/^ /p' byterun/instruct.h | \ +bytecomp/opcodes.ml: byterun/caml/instruct.h + sed -n -e '/^enum/p' -e 's/,//g' -e '/^ /p' byterun/caml/instruct.h | \ awk -f tools/make-opcodes > bytecomp/opcodes.ml partialclean:: @@ -552,9 +554,9 @@ beforedepend:: bytecomp/opcodes.ml byterun/primitives: cd byterun; $(MAKE) primitives -bytecomp/runtimedef.ml: byterun/primitives byterun/fail.h +bytecomp/runtimedef.ml: byterun/primitives byterun/caml/fail.h (echo 'let builtin_exceptions = [|'; \ - sed -n -e 's|.*/\* \("[A-Za-z_]*"\) \*/$$| \1;|p' byterun/fail.h | \ + sed -n -e 's|.*/\* \("[A-Za-z_]*"\) \*/$$| \1;|p' byterun/caml/fail.h | \ sed -e '$$s/;$$//'; \ echo '|]'; \ echo 'let builtin_primitives = [|'; \ @@ -628,8 +630,7 @@ partialclean:: beforedepend:: asmcomp/emit.ml tools/cvt_emit: tools/cvt_emit.mll - cd tools; \ - $(MAKE) CAMLC="../$(CAMLRUN) ../boot/ocamlc -I ../stdlib" cvt_emit + cd tools && $(MAKE) cvt_emit # The "expunge" utility @@ -677,7 +678,7 @@ library: ocamlc cd stdlib; $(MAKE) all library-cross: - cd stdlib; $(MAKE) RUNTIME=../byterun/ocamlrun all + cd stdlib; $(MAKE) CAMLRUN=../byterun/ocamlrun all libraryopt: cd stdlib; $(MAKE) allopt @@ -751,7 +752,7 @@ alldepend:: otherlibraries: ocamltools for i in $(OTHERLIBRARIES); do \ - (cd otherlibs/$$i; $(MAKE) RUNTIME=$(RUNTIME) all) || exit $$?; \ + (cd otherlibs/$$i; $(MAKE) all) || exit $$?; \ done otherlibrariesopt: @@ -798,9 +799,8 @@ alldepend:: # Check that the stack limit is reasonable. checkstack: - @if $(BYTECC) $(BYTECCCOMPOPTS) $(BYTECCLINKOPTS) \ - -o tools/checkstack tools/checkstack.c; \ - then tools/checkstack; \ + @if $(MKEXE) -o tools/checkstack$(EXE) tools/checkstack.c; \ + then tools/checkstack$(EXE); \ else :; \ fi @rm -f tools/checkstack diff --git a/Makefile.nt b/Makefile.nt index 16b53fe2..3179374c 100644 --- a/Makefile.nt +++ b/Makefile.nt @@ -13,18 +13,18 @@ # The main Makefile include config/Makefile +CAMLRUN ?= boot/ocamlrun +CAMLYACC ?= boot/ocamlyacc include stdlib/StdlibModules -CAMLC=boot/ocamlrun boot/ocamlc -nostdlib -I boot -CAMLOPT=boot/ocamlrun ./ocamlopt -nostdlib -I stdlib -I otherlibs/dynlink +CAMLC=$(CAMLRUN) boot/ocamlc -nostdlib -I boot +CAMLOPT=$(CAMLRUN) ./ocamlopt -nostdlib -I stdlib -I otherlibs/dynlink COMPFLAGS=-strict-sequence -w +33..39+48 -warn-error A -bin-annot $(INCLUDES) LINKFLAGS= -CAMLYACC=boot/ocamlyacc YACCFLAGS= -CAMLLEX=boot/ocamlrun boot/ocamllex -CAMLDEP=boot/ocamlrun tools/ocamldep +CAMLLEX=$(CAMLRUN) boot/ocamllex +CAMLDEP=$(CAMLRUN) tools/ocamldep DEPFLAGS=$(INCLUDES) -CAMLRUN=byterun/ocamlrun OCAMLBUILDBYTE=$(WITH_OCAMLBUILD:=.byte) OCAMLBUILDNATIVE=$(WITH_OCAMLBUILD:=.native) @@ -39,7 +39,7 @@ UTILS=utils/misc.cmo utils/tbl.cmo utils/config.cmo \ utils/consistbl.cmo PARSING=parsing/location.cmo parsing/longident.cmo \ - parsing/ast_helper.cmo \ + parsing/docstrings.cmo parsing/ast_helper.cmo \ parsing/syntaxerr.cmo parsing/parser.cmo \ parsing/lexer.cmo parsing/parse.cmo parsing/printast.cmo \ parsing/pprintast.cmo \ @@ -277,7 +277,9 @@ installopt: if test -n "$(WITH_OCAMLDOC)"; then (cd ocamldoc; $(MAKEREC) installopt); fi if test -n "$(WITH_OCAMLBUILD)"; then (cd ocamlbuild; $(MAKE) installopt); \ else :; fi - for i in $(OTHERLIBRARIES); do $(MAKEREC) -C otherlibs/$$i installopt; done + for i in $(OTHERLIBRARIES); do \ + $(MAKEREC) -C otherlibs/$$i installopt || exit $$?; \ + done if test -f ocamlopt.opt ; then $(MAKEREC) installoptopt; fi cd tools; $(MAKE) installopt @@ -463,8 +465,8 @@ $(COMMON:.cmo=.cmx) $(BYTECOMP:.cmo=.cmx) $(ASMCOMP:.cmo=.cmx): ocamlopt # The numeric opcodes -bytecomp/opcodes.ml: byterun/instruct.h - sed -n -e "/^enum/p" -e "s|,||g" -e "/^ /p" byterun/instruct.h | \ +bytecomp/opcodes.ml: byterun/caml/instruct.h + sed -n -e "/^enum/p" -e "s|,||g" -e "/^ /p" byterun/caml/instruct.h | \ gawk -f tools/make-opcodes > bytecomp/opcodes.ml partialclean:: @@ -477,9 +479,9 @@ beforedepend:: bytecomp/opcodes.ml byterun/primitives: cd byterun ; $(MAKEREC) primitives -bytecomp/runtimedef.ml: byterun/primitives byterun/fail.h +bytecomp/runtimedef.ml: byterun/primitives byterun/caml/fail.h (echo 'let builtin_exceptions = [|'; \ - sed -n -e 's|.*/\* \("[A-Za-z_]*"\) \*/$$| \1;|p' byterun/fail.h | \ + sed -n -e 's|.*/\* \("[A-Za-z_]*"\) \*/$$| \1;|p' byterun/caml/fail.h | \ sed -e '$$s/;$$//'; \ echo '|]'; \ echo 'let builtin_primitives = [|'; \ @@ -550,7 +552,7 @@ beforedepend:: asmcomp/scheduling.ml # Preprocess the code emitters asmcomp/emit.ml: $(ASMCOMP_EMIT) tools/cvt_emit - boot/ocamlrun tools/cvt_emit < $(ASMCOMP_EMIT) > asmcomp/emit.ml + $(CAMLRUN) tools/cvt_emit < $(ASMCOMP_EMIT) > asmcomp/emit.ml partialclean:: rm -f asmcomp/emit.ml @@ -603,7 +605,7 @@ alldepend:: library: cd stdlib ; $(MAKEREC) all library-cross: - cd stdlib ; $(MAKEREC) RUNTIME=../byterun/ocamlrun all + cd stdlib ; $(MAKEREC) CAMLRUN=../byterun/ocamlrun all libraryopt: cd stdlib ; $(MAKEREC) allopt partialclean:: @@ -659,15 +661,25 @@ alldepend:: # The extra libraries otherlibraries: - for i in $(OTHERLIBRARIES); do $(MAKEREC) -C otherlibs/$$i all; done + for i in $(OTHERLIBRARIES); do \ + $(MAKEREC) -C otherlibs/$$i all || exit $$?; \ + done otherlibrariesopt: - for i in $(OTHERLIBRARIES); do $(MAKEREC) -C otherlibs/$$i allopt; done + for i in $(OTHERLIBRARIES); \ + do $(MAKEREC) -C otherlibs/$$i allopt || exit $$?; \ + done partialclean:: - for i in $(OTHERLIBRARIES); do $(MAKEREC) -C otherlibs/$$i partialclean; done + for i in $(OTHERLIBRARIES); \ + do $(MAKEREC) -C otherlibs/$$i partialclean || exit $$?; \ + done clean:: - for i in $(OTHERLIBRARIES); do $(MAKEREC) -C otherlibs/$$i clean; done + for i in $(OTHERLIBRARIES); do \ + $(MAKEREC) -C otherlibs/$$i clean || exit $$?; \ + done alldepend:: - for i in $(OTHERLIBRARIES); do $(MAKEREC) -C otherlibs/$$i depend; done + for i in $(OTHERLIBRARIES); do \ + $(MAKEREC) -C otherlibs/$$i depend || exit $$?; \ + done # The replay debugger @@ -729,6 +741,7 @@ alldepend:: depend distclean: $(MAKE) clean + rm -f asmrun/.depend.nt byterun/.depend.nt rm -f boot/ocamlrun boot/ocamlrun.exe boot/camlheader boot/ocamlyacc \ boot/*.cm* boot/libcamlrun.a rm -f config/Makefile config/m.h config/s.h diff --git a/README.win32 b/README.win32 index 111c9a10..0f520f46 100644 --- a/README.win32 +++ b/README.win32 @@ -1,11 +1,14 @@ Release notes on the MS Windows ports of OCaml ---------------------------------------------- -There are no less than four ports of OCaml for MS Windows available: +There are no less than five ports of OCaml for MS Windows available: - a native Win32 port, built with the Microsoft development tools; - a native Win32 port, built with the 32-bit version of the gcc compiler from the mingw-w64 project, packaged in Cygwin (under the name mingw64-i686); + - a native Win32 port, built with the 64-bit version of the gcc + compiler from the mingw-w64 project, packaged in Cygwin + (under the name mingw64-x86_64); - a port consisting of the Unix sources compiled under the Cygwin Unix-like environment for Windows; - a native Win64 port (64-bit Windows), built with the Microsoft @@ -15,7 +18,7 @@ Here is a summary of the main differences between these ports: Native MS Native MinGW Cygwin -64 bits? Win32 or Win64 Win32 only Win32 only +64 bits? Win32 or Win64 Win32 or Win64 Win32 only Third-party software required - for base bytecode system none none none @@ -161,12 +164,12 @@ contributed his changes to the OCaml project. ------------------------------------------------------------------------------ - The native Win32 port built with Mingw - -------------------------------------- + The native Win32 and Win64 ports built with Mingw + ------------------------------------------------- REQUIREMENTS: -This port runs under MS Windows Seven, Vista, XP, and 2000. +Those ports run under MS Windows Seven, Vista, XP, and 2000. The base bytecode system (ocamlc, ocaml, ocamllex, ocamlyacc, ...) runs without any additional tools. @@ -177,14 +180,18 @@ the Cygwin development tools, available at http://www.cygwin.com/ and the flexdll tool, available at http://alain.frisch.fr/flexdll.html -You will need to install at least the following Cygwin packages (use -the Setup tool from Cygwin): +You will need to install at least the following Cygwin packages for +the 32-bit flavor (use the Setup tool from Cygwin): mingw64-i686-binutils - mingw64-i686-gcc mingw64-i686-gcc-core mingw64-i686-runtime +and the following packages for the 64-bit: + + mingw64-x86_64-binutils + mingw64-x86_64-gcc-core + mingw64-x86_64-runtime NOTES: @@ -218,13 +225,22 @@ You will need the following software components to perform the recompilation: - Cygwin: http://cygwin.com/ Install at least the following packages (and their dependencies, as computed by Cygwin's setup.exe): - mingw64-i686-binutils - mingw64-i686-gcc - mingw64-i686-gcc-core - mingw64-i686-runtime + + For both flavor of OCaml (32-bit and 64-bit): diffutils make ncurses + + For the 32 bit flavor of OCaml: + mingw64-i686-binutils + mingw64-i686-gcc-core + mingw64-i686-runtime + + For the 64 bit flavor of OCaml: + mingw64-x86_64-binutils + mingw64-x86_64-gcc-core + mingw64-x86_64-runtime + - The flexdll tool (see above). Do not forget to add the flexdll directory to your PATH @@ -238,8 +254,13 @@ directory of the OCaml distribution. Then, do cp config/m-nt.h config/m.h cp config/s-nt.h config/s.h + +For a 32 bit OCaml: cp config/Makefile.mingw config/Makefile +For a 64 bit OCaml: + cp config/Makefile.mingw64 config/Makefile + Then, edit config/Makefile as needed, following the comments in this file. Normally, the only variable that need to be changed is PREFIX where to install everything @@ -260,7 +281,7 @@ NOTES: * The replay debugger is partially supported (no reverse execution). -* The default Makefile.mingw passes -static-libgcc to the linker. +* The default Makefile.mingw and Makefile.mingw64 pass -static-libgcc to the linker. For more information on this topic: http://gcc.gnu.org/onlinedocs/gcc-4.9.1/gcc/Link-Options.html#Link-Options diff --git a/VERSION b/VERSION index 9023b27c..7fb240e1 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.02.1 +4.02.2+rc1 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli diff --git a/asmcomp/amd64/emit.mlp b/asmcomp/amd64/emit.mlp index b576ece9..d56d0f5f 100644 --- a/asmcomp/amd64/emit.mlp +++ b/asmcomp/amd64/emit.mlp @@ -20,6 +20,12 @@ open Mach open Linearize open Emitaux +(* [Branch_relaxation] is not used in this file, but is required by + emit.mlp files for certain other targets; the reference here ensures + that when releases are being prepared the .depend files are correct + for all targets. *) +open! Branch_relaxation + let macosx = (Config.system = "macosx") let mingw64 = (Config.system = "mingw64") let cygwin = (Config.system = "cygwin") diff --git a/asmcomp/arm/emit.mlp b/asmcomp/arm/emit.mlp index 61035b85..4948fb2b 100644 --- a/asmcomp/arm/emit.mlp +++ b/asmcomp/arm/emit.mlp @@ -852,8 +852,10 @@ let fundecl fundecl = let n = frame_size() in if n > 0 then begin ignore(emit_stack_adjustment (-n)); - if !contains_calls then + if !contains_calls then begin + cfi_offset ~reg:14 (* lr *) ~offset:(-4); ` str lr, [sp, #{emit_int(n - 4)}]\n` + end end; `{emit_label !tailrec_entry_point}:\n`; emit_all 0 fundecl.fun_body; diff --git a/asmcomp/arm64/arch.ml b/asmcomp/arm64/arch.ml index bfbe183f..3e62da89 100644 --- a/asmcomp/arm64/arch.ml +++ b/asmcomp/arm64/arch.ml @@ -34,8 +34,12 @@ type addressing_mode = (* Specific operations *) type specific_operation = + | Ifar_alloc of int + | Ifar_intop_checkbound + | Ifar_intop_imm_checkbound of int | Ishiftarith of arith_operation * int | Ishiftcheckbound of int + | Ifar_shiftcheckbound of int | Imuladd (* multiply and add *) | Imulsub (* multiply and subtract *) | Inegmulf (* floating-point negate and multiply *) @@ -91,6 +95,12 @@ let print_addressing printreg addr ppf arg = let print_specific_operation printreg op ppf arg = match op with + | Ifar_alloc n -> + fprintf ppf "(far) alloc %i" n + | Ifar_intop_checkbound -> + fprintf ppf "%a (far) check > %a" printreg arg.(0) printreg arg.(1) + | Ifar_intop_imm_checkbound n -> + fprintf ppf "%a (far) check > %i" printreg arg.(0) n | Ishiftarith(op, shift) -> let op_name = function | Ishiftadd -> "+" @@ -103,6 +113,9 @@ let print_specific_operation printreg op ppf arg = printreg arg.(0) (op_name op) printreg arg.(1) shift_mark | Ishiftcheckbound n -> fprintf ppf "check %a >> %i > %a" printreg arg.(0) n printreg arg.(1) + | Ifar_shiftcheckbound n -> + fprintf ppf + "(far) check %a >> %i > %a" printreg arg.(0) n printreg arg.(1) | Imuladd -> fprintf ppf "(%a * %a) + %a" printreg arg.(0) diff --git a/asmcomp/arm64/emit.mlp b/asmcomp/arm64/emit.mlp index 734bd23e..750c2b23 100644 --- a/asmcomp/arm64/emit.mlp +++ b/asmcomp/arm64/emit.mlp @@ -231,6 +231,32 @@ let emit_intconst dst n = in if n < 0n then emit_neg true 48 else emit_pos true 48 +let num_instructions_for_intconst n = + let num_instructions = ref 0 in + let rec count_pos first shift = + if shift < 0 then begin + if first then incr num_instructions + end else begin + let s = Nativeint.(logand (shift_right_logical n shift) 0xFFFFn) in + if s = 0n then count_pos first (shift - 16) else begin + incr num_instructions; + count_pos false (shift - 16) + end + end + and count_neg first shift = + if shift < 0 then begin + if first then incr num_instructions + end else begin + let s = Nativeint.(logand (shift_right_logical n shift) 0xFFFFn) in + if s = 0xFFFFn then count_neg first (shift - 16) else begin + incr num_instructions; + count_neg false (shift - 16) + end + end + in + if n < 0n then count_neg true 48 else count_pos true 48; + !num_instructions + (* Recognize float constants appropriate for FMOV dst, #fpimm instruction: "a normalized binary floating point encoding with 1 sign bit, 4 bits of fraction and a 3-bit exponent" *) @@ -302,6 +328,217 @@ let emit_load_symbol_addr dst s = ` ldr {emit_reg dst}, [{emit_reg dst}, #:got_lo12:{emit_symbol s}]\n` end +(* The following functions are used for calculating the sizes of the + call GC and bounds check points emitted out-of-line from the function + body. See branch_relaxation.mli. *) + +let num_call_gc_and_check_bound_points instr = + let rec loop instr ((call_gc, check_bound) as totals) = + match instr.desc with + | Lend -> totals + | Lop (Ialloc _) when !fastcode_flag -> + loop instr.next (call_gc + 1, check_bound) + | Lop (Iintop Icheckbound) + | Lop (Iintop_imm (Icheckbound, _)) + | Lop (Ispecific (Ishiftcheckbound _)) -> + let check_bound = + (* When not in debug mode, there is at most one check-bound point. *) + if not !Clflags.debug then 1 + else check_bound + 1 + in + loop instr.next (call_gc, check_bound) + (* The following four should never be seen, since this function is run + before branch relaxation. *) + | Lop (Ispecific (Ifar_alloc _)) + | Lop (Ispecific Ifar_intop_checkbound) + | Lop (Ispecific (Ifar_intop_imm_checkbound _)) + | Lop (Ispecific (Ifar_shiftcheckbound _)) -> assert false + | _ -> loop instr.next totals + in + loop instr (0, 0) + +let max_out_of_line_code_offset instr ~num_call_gc ~num_check_bound = + if num_call_gc < 1 && num_check_bound < 1 then 0 + else begin + let size_of_call_gc = 2 in + let size_of_check_bound = 1 in + let size_of_last_thing = + (* Call-GC points come before check-bound points. *) + if num_check_bound >= 1 then size_of_check_bound else size_of_call_gc + in + let total_size = + size_of_call_gc*num_call_gc + size_of_check_bound*num_check_bound + in + let max_offset = total_size - size_of_last_thing in + assert (max_offset >= 0); + max_offset + end + +module BR = Branch_relaxation.Make (struct + (* CR-someday mshinwell: B and BL have +/- 128Mb ranges; for the moment we + assume we will never exceed this. It would seem to be most likely to + occur for branches between functions; in this case, the linker should be + able to insert veneers anyway. (See section 4.6.7 of the document + "ELF for the ARM 64-bit architecture (AArch64)".) *) + + type distance = int + + module Cond_branch = struct + type t = TB | CB | Bcc + + let all = [TB; CB; Bcc] + + (* AArch64 instructions are 32 bits wide, so [distance] in this module + means units of 32-bit words. *) + let max_displacement = function + | TB -> 32 * 1024 / 4 (* +/- 32Kb *) + | CB | Bcc -> 1 * 1024 * 1024 / 4 (* +/- 1Mb *) + + let classify_instr = function + | Lop (Ialloc _) + | Lop (Iintop Icheckbound) + | Lop (Iintop_imm (Icheckbound, _)) + | Lop (Ispecific (Ishiftcheckbound _)) -> Some Bcc + (* The various "far" variants in [specific_operation] don't need to + return [Some] here, since their code sequences never contain any + conditional branches that might need relaxing. *) + | Lcondbranch (Itruetest, _) + | Lcondbranch (Ifalsetest, _) -> Some CB + | Lcondbranch (Iinttest _, _) + | Lcondbranch (Iinttest_imm _, _) + | Lcondbranch (Ifloattest _, _) -> Some Bcc + | Lcondbranch (Ioddtest, _) + | Lcondbranch (Ieventest, _) -> Some TB + | Lcondbranch3 _ -> Some Bcc + | _ -> None + end + + let offset_pc_at_branch = 0 + + let epilogue_size () = + if !contains_calls then 3 else 2 + + let instr_size = function + | Lend -> 0 + | Lop (Imove | Ispill | Ireload) -> 1 + | Lop (Iconst_int n | Iconst_blockheader n) -> + num_instructions_for_intconst n + | Lop (Iconst_float _) -> 2 + | Lop (Iconst_symbol _) -> 2 + | Lop (Icall_ind) -> 1 + | Lop (Icall_imm _) -> 1 + | Lop (Itailcall_ind) -> epilogue_size () + | Lop (Itailcall_imm s) -> + if s = !function_name then 1 else epilogue_size () + | Lop (Iextcall (_, false)) -> 1 + | Lop (Iextcall (_, true)) -> 3 + | Lop (Istackoffset _) -> 2 + | Lop (Iload (size, addr)) | Lop (Istore (size, addr, _)) -> + let based = match addr with Iindexed _ -> 0 | Ibased _ -> 1 in + based + begin match size with Single -> 2 | _ -> 1 end + | Lop (Ialloc _) when !fastcode_flag -> 4 + | Lop (Ispecific (Ifar_alloc _)) when !fastcode_flag -> 5 + | Lop (Ialloc num_words) | Lop (Ispecific (Ifar_alloc num_words)) -> + begin match num_words with + | 16 | 24 | 32 -> 1 + | _ -> 1 + num_instructions_for_intconst (Nativeint.of_int num_words) + end + | Lop (Iintop (Icomp _)) -> 2 + | Lop (Iintop_imm (Icomp _, _)) -> 2 + | Lop (Iintop Icheckbound) -> 2 + | Lop (Ispecific Ifar_intop_checkbound) -> 3 + | Lop (Iintop_imm (Icheckbound, _)) -> 2 + | Lop (Ispecific (Ifar_intop_imm_checkbound _)) -> 3 + | Lop (Ispecific (Ishiftcheckbound _)) -> 2 + | Lop (Ispecific (Ifar_shiftcheckbound _)) -> 3 + | Lop (Iintop Imod) -> 2 + | Lop (Iintop Imulh) -> 1 + | Lop (Iintop _) -> 1 + | Lop (Iintop_imm _) -> 1 + | Lop (Ifloatofint | Iintoffloat | Iabsf | Inegf | Ispecific Isqrtf) -> 1 + | Lop (Iaddf | Isubf | Imulf | Idivf | Ispecific Inegmulf) -> 1 + | Lop (Ispecific (Imuladdf | Inegmuladdf | Imulsubf | Inegmulsubf)) -> 1 + | Lop (Ispecific (Ishiftarith _)) -> 1 + | Lop (Ispecific (Imuladd | Imulsub)) -> 1 + | Lop (Ispecific (Ibswap 16)) -> 2 + | Lop (Ispecific (Ibswap _)) -> 1 + | Lreloadretaddr -> 0 + | Lreturn -> epilogue_size () + | Llabel _ -> 0 + | Lbranch _ -> 1 + | Lcondbranch (tst, _) -> + begin match tst with + | Itruetest -> 1 + | Ifalsetest -> 1 + | Iinttest _ -> 2 + | Iinttest_imm _ -> 2 + | Ifloattest _ -> 2 + | Ioddtest -> 1 + | Ieventest -> 1 + end + | Lcondbranch3 (lbl0, lbl1, lbl2) -> + 1 + begin match lbl0 with None -> 0 | Some _ -> 1 end + + begin match lbl1 with None -> 0 | Some _ -> 1 end + + begin match lbl2 with None -> 0 | Some _ -> 1 end + | Lswitch jumptbl -> 3 + Array.length jumptbl + | Lsetuptrap _ -> 2 + | Lpushtrap -> 3 + | Lpoptrap -> 1 + | Lraise k -> + begin match !Clflags.debug, k with + | true, (Lambda.Raise_regular | Lambda.Raise_reraise) -> 1 + | false, _ + | true, Lambda.Raise_notrace -> 4 + end + + let relax_allocation ~num_words = + Lop (Ispecific (Ifar_alloc num_words)) + + let relax_intop_checkbound () = + Lop (Ispecific Ifar_intop_checkbound) + + let relax_intop_imm_checkbound ~bound = + Lop (Ispecific (Ifar_intop_imm_checkbound bound)) + + let relax_specific_op = function + | Ishiftcheckbound shift -> Lop (Ispecific (Ifar_shiftcheckbound shift)) + | _ -> assert false +end) + +(* Output the assembly code for allocation. *) + +let assembly_code_for_allocation i ~n ~far = + let lbl_frame = record_frame_label i.live i.dbg in + if !fastcode_flag then begin + let lbl_redo = new_label() in + let lbl_call_gc = new_label() in + `{emit_label lbl_redo}:`; + ` sub {emit_reg reg_alloc_ptr}, {emit_reg reg_alloc_ptr}, #{emit_int n}\n`; + ` cmp {emit_reg reg_alloc_ptr}, {emit_reg reg_alloc_limit}\n`; + ` add {emit_reg i.res.(0)}, {emit_reg reg_alloc_ptr}, #8\n`; + if not far then begin + ` b.lo {emit_label lbl_call_gc}\n` + end else begin + let lbl = new_label () in + ` b.cs {emit_label lbl}\n`; + ` b {emit_label lbl_call_gc}\n`; + `{emit_label lbl}:\n` + end; + call_gc_sites := + { gc_lbl = lbl_call_gc; + gc_return_lbl = lbl_redo; + gc_frame_lbl = lbl_frame } :: !call_gc_sites + end else begin + begin match n with + | 16 -> ` bl {emit_symbol "caml_alloc1"}\n` + | 24 -> ` bl {emit_symbol "caml_alloc2"}\n` + | 32 -> ` bl {emit_symbol "caml_alloc3"}\n` + | _ -> emit_intconst reg_x15 (Nativeint.of_int n); + ` bl {emit_symbol "caml_allocN"}\n` + end; + `{emit_label lbl_frame}: add {emit_reg i.res.(0)}, {emit_reg reg_alloc_ptr}, #8\n` + end + (* Output the assembly code for an instruction *) let emit_instr i = @@ -410,29 +647,9 @@ let emit_instr i = ` str {emit_reg src}, {emit_addressing addr base}\n` end | Lop(Ialloc n) -> - let lbl_frame = record_frame_label i.live i.dbg in - if !fastcode_flag then begin - let lbl_redo = new_label() in - let lbl_call_gc = new_label() in - `{emit_label lbl_redo}:`; - ` sub {emit_reg reg_alloc_ptr}, {emit_reg reg_alloc_ptr}, #{emit_int n}\n`; - ` cmp {emit_reg reg_alloc_ptr}, {emit_reg reg_alloc_limit}\n`; - ` add {emit_reg i.res.(0)}, {emit_reg reg_alloc_ptr}, #8\n`; - ` b.lo {emit_label lbl_call_gc}\n`; - call_gc_sites := - { gc_lbl = lbl_call_gc; - gc_return_lbl = lbl_redo; - gc_frame_lbl = lbl_frame } :: !call_gc_sites - end else begin - begin match n with - | 16 -> ` bl {emit_symbol "caml_alloc1"}\n` - | 24 -> ` bl {emit_symbol "caml_alloc2"}\n` - | 32 -> ` bl {emit_symbol "caml_alloc3"}\n` - | _ -> emit_intconst reg_x15 (Nativeint.of_int n); - ` bl {emit_symbol "caml_allocN"}\n` - end; - `{emit_label lbl_frame}: add {emit_reg i.res.(0)}, {emit_reg reg_alloc_ptr}, #8\n` - end + assembly_code_for_allocation i ~n ~far:false + | Lop(Ispecific (Ifar_alloc n)) -> + assembly_code_for_allocation i ~n ~far:true | Lop(Iintop(Icomp cmp)) -> ` cmp {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; ` cset {emit_reg i.res.(0)}, {emit_string (name_for_comparison cmp)}\n` @@ -443,14 +660,35 @@ let emit_instr i = let lbl = bound_error_label i.dbg in ` cmp {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; ` b.ls {emit_label lbl}\n` + | Lop(Ispecific Ifar_intop_checkbound) -> + let lbl = bound_error_label i.dbg in + let lbl2 = new_label () in + ` cmp {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; + ` b.hi {emit_label lbl2}\n`; + ` b {emit_label lbl}\n`; + `{emit_label lbl2}:\n`; | Lop(Iintop_imm(Icheckbound, n)) -> let lbl = bound_error_label i.dbg in ` cmp {emit_reg i.arg.(0)}, #{emit_int n}\n`; ` b.ls {emit_label lbl}\n` + | Lop(Ispecific(Ifar_intop_imm_checkbound bound)) -> + let lbl = bound_error_label i.dbg in + let lbl2 = new_label () in + ` cmp {emit_reg i.arg.(0)}, #{emit_int bound}\n`; + ` b.hi {emit_label lbl2}\n`; + ` b {emit_label lbl}\n`; + `{emit_label lbl2}:\n`; | Lop(Ispecific(Ishiftcheckbound shift)) -> let lbl = bound_error_label i.dbg in ` cmp {emit_reg i.arg.(1)}, {emit_reg i.arg.(0)}, lsr #{emit_int shift}\n`; ` b.cs {emit_label lbl}\n` + | Lop(Ispecific(Ifar_shiftcheckbound shift)) -> + let lbl = bound_error_label i.dbg in + let lbl2 = new_label () in + ` cmp {emit_reg i.arg.(1)}, {emit_reg i.arg.(0)}, lsr #{emit_int shift}\n`; + ` b.lo {emit_label lbl2}\n`; + ` b {emit_label lbl}\n`; + `{emit_label lbl2}:\n`; | Lop(Iintop Imod) -> ` sdiv {emit_reg reg_tmp1}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; ` msub {emit_reg i.res.(0)}, {emit_reg reg_tmp1}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(0)}\n` @@ -506,7 +744,7 @@ let emit_instr i = begin match size with | 16 -> ` rev16 {emit_wreg i.res.(0)}, {emit_wreg i.arg.(0)}\n`; - ` ubfm {emit_reg i.res.(0)}, {emit_reg i.res.(0)}, #0, #16\n` + ` ubfm {emit_reg i.res.(0)}, {emit_reg i.res.(0)}, #0, #15\n` | 32 -> ` rev {emit_wreg i.res.(0)}, {emit_wreg i.arg.(0)}\n` | 64 -> @@ -654,12 +892,24 @@ let fundecl fundecl = let n = frame_size() in if n > 0 then emit_stack_adjustment (-n); - if !contains_calls then - ` str x30, [sp, #{emit_int (n-8)}]\n`; + if !contains_calls then begin + cfi_offset ~reg:30 (* return address *) ~offset:(-8); + ` str x30, [sp, #{emit_int (n-8)}]\n` + end; `{emit_label !tailrec_entry_point}:\n`; + let num_call_gc, num_check_bound = + num_call_gc_and_check_bound_points fundecl.fun_body + in + let max_out_of_line_code_offset = + max_out_of_line_code_offset fundecl.fun_body ~num_call_gc + ~num_check_bound + in + BR.relax fundecl.fun_body ~max_out_of_line_code_offset; emit_all fundecl.fun_body; List.iter emit_call_gc !call_gc_sites; List.iter emit_call_bound_error !bound_error_sites; + assert (List.length !call_gc_sites = num_call_gc); + assert (List.length !bound_error_sites = num_check_bound); cfi_endproc(); ` .type {emit_symbol fundecl.fun_name}, %function\n`; ` .size {emit_symbol fundecl.fun_name}, .-{emit_symbol fundecl.fun_name}\n`; diff --git a/asmcomp/asmlink.ml b/asmcomp/asmlink.ml index 153da7ca..cea7b568 100644 --- a/asmcomp/asmlink.ml +++ b/asmcomp/asmlink.ml @@ -91,10 +91,11 @@ let extract_crc_implementations () = let lib_ccobjs = ref [] let lib_ccopts = ref [] -let add_ccobjs l = +let add_ccobjs origin l = if not !Clflags.no_auto_link then begin lib_ccobjs := l.lib_ccobjs @ !lib_ccobjs; - lib_ccopts := l.lib_ccopts @ !lib_ccopts + let replace_origin = Misc.replace_substring ~before:"$CAMLORIGIN" ~after:origin in + lib_ccopts := List.map replace_origin l.lib_ccopts @ !lib_ccopts end let runtime_lib () = @@ -179,7 +180,7 @@ let scan_file obj_name tolink = match read_file obj_name with | Library (file_name,infos) -> (* This is an archive file. Each unit contained in it will be linked in only if needed. *) - add_ccobjs infos; + add_ccobjs (Filename.dirname file_name) infos; List.fold_right (fun (info, crc) reqd -> if info.ui_force_link @@ -284,12 +285,13 @@ let link_shared ppf objfiles output_name = let call_linker file_list startup_file output_name = let main_dll = !Clflags.output_c_object && Filename.check_suffix output_name Config.ext_dll + and main_obj_runtime = !Clflags.output_complete_object in let files = startup_file :: (List.rev file_list) in let files, c_lib = - if (not !Clflags.output_c_object) || main_dll then + if (not !Clflags.output_c_object) || main_dll || main_obj_runtime then files @ (List.rev !Clflags.ccobjs) @ runtime_lib (), - (if !Clflags.nopervasives then "" else Config.native_c_libraries) + (if !Clflags.nopervasives || main_obj_runtime then "" else Config.native_c_libraries) else files, "" in diff --git a/asmcomp/branch_relaxation.ml b/asmcomp/branch_relaxation.ml new file mode 100644 index 00000000..d4609e4a --- /dev/null +++ b/asmcomp/branch_relaxation.ml @@ -0,0 +1,138 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) +(* Mark Shinwell, Jane Street Europe *) +(* *) +(* Copyright 1996 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +open Mach +open Linearize + +module Make (T : Branch_relaxation_intf.S) = struct + let label_map code = + let map = Hashtbl.create 37 in + let rec fill_map pc instr = + match instr.desc with + | Lend -> (pc, map) + | Llabel lbl -> Hashtbl.add map lbl pc; fill_map pc instr.next + | op -> fill_map (pc + T.instr_size op) instr.next + in + fill_map 0 code + + let branch_overflows map pc_branch lbl_dest max_branch_offset = + let pc_dest = Hashtbl.find map lbl_dest in + let delta = pc_dest - (pc_branch + T.offset_pc_at_branch) in + delta <= -max_branch_offset || delta >= max_branch_offset + + let opt_branch_overflows map pc_branch opt_lbl_dest max_branch_offset = + match opt_lbl_dest with + | None -> false + | Some lbl_dest -> + branch_overflows map pc_branch lbl_dest max_branch_offset + + let instr_overflows ~code_size ~max_out_of_line_code_offset instr map pc = + match T.Cond_branch.classify_instr instr.desc with + | None -> false + | Some branch -> + let max_branch_offset = + (* Remember to cut some slack for multi-word instructions (in the + [Linearize] sense of the word) where the branch can be anywhere in + the middle. 12 words of slack is plenty. *) + T.Cond_branch.max_displacement branch - 12 + in + match instr.desc with + | Lop (Ialloc _) + | Lop (Iintop Icheckbound) + | Lop (Iintop_imm (Icheckbound, _)) + | Lop (Ispecific _) -> + (* We assume that any branches eligible for relaxation generated + by these instructions only branch forward. We further assume + that any of these may branch to an out-of-line code block. *) + code_size + max_out_of_line_code_offset - pc >= max_branch_offset + | Lcondbranch (_, lbl) -> + branch_overflows map pc lbl max_branch_offset + | Lcondbranch3 (lbl0, lbl1, lbl2) -> + opt_branch_overflows map pc lbl0 max_branch_offset + || opt_branch_overflows map pc lbl1 max_branch_offset + || opt_branch_overflows map pc lbl2 max_branch_offset + | _ -> + Misc.fatal_error "Unsupported instruction for branch relaxation" + + let fixup_branches ~code_size ~max_out_of_line_code_offset map code = + let expand_optbranch lbl n arg next = + match lbl with + | None -> next + | Some l -> + instr_cons (Lcondbranch (Iinttest_imm (Isigned Cmm.Ceq, n), l)) + arg [||] next + in + let rec fixup did_fix pc instr = + match instr.desc with + | Lend -> did_fix + | _ -> + let overflows = + instr_overflows ~code_size ~max_out_of_line_code_offset instr map pc + in + if not overflows then + fixup did_fix (pc + T.instr_size instr.desc) instr.next + else + match instr.desc with + | Lop (Ialloc num_words) -> + instr.desc <- T.relax_allocation ~num_words; + fixup true (pc + T.instr_size instr.desc) instr.next + | Lop (Iintop Icheckbound) -> + instr.desc <- T.relax_intop_checkbound (); + fixup true (pc + T.instr_size instr.desc) instr.next + | Lop (Iintop_imm (Icheckbound, bound)) -> + instr.desc <- T.relax_intop_imm_checkbound ~bound; + fixup true (pc + T.instr_size instr.desc) instr.next + | Lop (Ispecific specific) -> + instr.desc <- T.relax_specific_op specific; + fixup true (pc + T.instr_size instr.desc) instr.next + | Lcondbranch (test, lbl) -> + let lbl2 = new_label() in + let cont = + instr_cons (Lbranch lbl) [||] [||] + (instr_cons (Llabel lbl2) [||] [||] instr.next) + in + instr.desc <- Lcondbranch (invert_test test, lbl2); + instr.next <- cont; + fixup true (pc + T.instr_size instr.desc) instr.next + | Lcondbranch3 (lbl0, lbl1, lbl2) -> + let cont = + expand_optbranch lbl0 0 instr.arg + (expand_optbranch lbl1 1 instr.arg + (expand_optbranch lbl2 2 instr.arg instr.next)) + in + instr.desc <- cont.desc; + instr.next <- cont.next; + fixup true pc instr + | _ -> + (* Any other instruction has already been rejected in + [instr_overflows] above. + We can *never* get here. *) + assert false + in + fixup false 0 code + + (* Iterate branch expansion till all conditional branches are OK *) + + let rec relax code ~max_out_of_line_code_offset = + let min_of_max_branch_offsets = + List.fold_left (fun min_of_max_branch_offsets branch -> + min min_of_max_branch_offsets + (T.Cond_branch.max_displacement branch)) + max_int T.Cond_branch.all + in + let (code_size, map) = label_map code in + if code_size >= min_of_max_branch_offsets + && fixup_branches ~code_size ~max_out_of_line_code_offset map code + then relax code ~max_out_of_line_code_offset + else () +end diff --git a/asmcomp/branch_relaxation.mli b/asmcomp/branch_relaxation.mli new file mode 100644 index 00000000..e2a93f83 --- /dev/null +++ b/asmcomp/branch_relaxation.mli @@ -0,0 +1,26 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) +(* Mark Shinwell, Jane Street Europe *) +(* *) +(* Copyright 2015 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* Fix up conditional branches that exceed hardware-allowed ranges. *) + +module Make (T : Branch_relaxation_intf.S) : sig + val relax + : Linearize.instruction + (* [max_offset_of_out_of_line_code] specifies the furthest distance, + measured from the first address immediately after the last instruction + of the function, that may be branched to from within the function in + order to execute "out of line" code blocks such as call GC and + bounds check points. *) + -> max_out_of_line_code_offset:T.distance + -> unit +end diff --git a/asmcomp/branch_relaxation_intf.ml b/asmcomp/branch_relaxation_intf.ml new file mode 100644 index 00000000..0812c7c1 --- /dev/null +++ b/asmcomp/branch_relaxation_intf.ml @@ -0,0 +1,64 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) +(* Mark Shinwell, Jane Street Europe *) +(* *) +(* Copyright 2015 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +module type S = sig + (* The distance between two instructions, in arbitrary units (typically + the natural word size of instructions). *) + type distance = int + + module Cond_branch : sig + (* The various types of conditional branches for a given target that + may require relaxation. *) + type t + + (* All values of type [t] that the emitter may produce. *) + val all : t list + + (* If [max_displacement branch] is [n] then [branch] is assumed to + reach any address in the range [pc - n, pc + n] (inclusive), after + the [pc] of the branch has been adjusted by [offset_pc_at_branch] + (see below). *) + val max_displacement : t -> distance + + (* Which variety of conditional branch may be produced by the emitter for a + given instruction description. For the moment we assume that only one + such variety per instruction description is needed. + + N.B. The only instructions supported are the following: + - Lop (Ialloc _) + - Lop (Iintop Icheckbound) + - Lop (Iintop_imm (Icheckbound, _)) + - Lop (Ispecific _) + - Lcondbranch (_, _) + - Lcondbranch3 (_, _, _) + [classify_instr] is expected to return [None] when called on any + instruction not in this list. *) + val classify_instr : Linearize.instruction_desc -> t option + end + + (* The value to be added to the program counter (in [distance] units) + when it is at a branch instruction, prior to calculating the distance + to a branch target. *) + val offset_pc_at_branch : distance + + (* The maximum size of a given instruction. *) + val instr_size : Linearize.instruction_desc -> distance + + (* Insertion of target-specific code to relax operations that cannot be + relaxed generically. It is assumed that these rewrites do not change + the size of out-of-line code (cf. branch_relaxation.mli). *) + val relax_allocation : num_words:int -> Linearize.instruction_desc + val relax_intop_checkbound : unit -> Linearize.instruction_desc + val relax_intop_imm_checkbound : bound:int -> Linearize.instruction_desc + val relax_specific_op : Arch.specific_operation -> Linearize.instruction_desc +end diff --git a/asmcomp/cmmgen.ml b/asmcomp/cmmgen.ml index 1f640b9b..83149660 100644 --- a/asmcomp/cmmgen.ml +++ b/asmcomp/cmmgen.ml @@ -349,10 +349,10 @@ let mod_int c1 c2 dbg = (c1, Cconst_int 0) -> Csequence(c1, Cop(Craise (Raise_regular, dbg), [Cconst_symbol "caml_exn_Division_by_zero"])) - | (c1, Cconst_int 1) -> - c1 - | (Cconst_int(0 | 1) as c1, c2) -> - Csequence(c2, c1) + | (c1, Cconst_int (1 | (-1))) -> + Csequence(c1, Cconst_int 0) + | (Cconst_int 0, c2) -> + Csequence(c2, Cconst_int 0) | (Cconst_int n1, Cconst_int n2) -> Cconst_int (n1 mod n2) | (c1, (Cconst_int n as c2)) when n <> min_int -> @@ -1254,13 +1254,21 @@ let subst_boxed_number unbox_fn boxed_id unboxed_id box_chunk box_offset exp = Cassign(id, subst arg) | Ctuple argv -> Ctuple(List.map subst argv) | Cop(Cload chunk, [Cvar id]) as e -> - if Ident.same id boxed_id && chunk = box_chunk && box_offset = 0 - then Cvar unboxed_id - else e + if not (Ident.same id boxed_id) then e + else if chunk = box_chunk && box_offset = 0 then + Cvar unboxed_id + else begin + need_boxed := true; + e + end | Cop(Cload chunk, [Cop(Cadda, [Cvar id; Cconst_int ofs])]) as e -> - if Ident.same id boxed_id && chunk = box_chunk && ofs = box_offset - then Cvar unboxed_id - else e + if not (Ident.same id boxed_id) then e + else if chunk = box_chunk && ofs = box_offset then + Cvar unboxed_id + else begin + need_boxed := true; + e + end | Cop(op, argv) -> Cop(op, List.map subst argv) | Csequence(e1, e2) -> Csequence(subst e1, subst e2) | Cifthenelse(e1, e2, e3) -> Cifthenelse(subst e1, subst e2, subst e3) @@ -1270,7 +1278,10 @@ let subst_boxed_number unbox_fn boxed_id unboxed_id box_chunk box_offset exp = | Ccatch(nfail, ids, e1, e2) -> Ccatch(nfail, ids, subst e1, subst e2) | Cexit (nfail, el) -> Cexit (nfail, List.map subst el) | Ctrywith(e1, id, e2) -> Ctrywith(subst e1, id, subst e2) - | e -> e in + | Cconst_int _ | Cconst_natint _ | Cconst_float _ | Cconst_symbol _ + | Cconst_pointer _ | Cconst_natpointer _ + | Cconst_blockheader _ as e -> e + in let res = subst exp in (res, !need_boxed, !assigned) diff --git a/asmcomp/emitaux.ml b/asmcomp/emitaux.ml index 24a621b3..ec2e8f06 100644 --- a/asmcomp/emitaux.ml +++ b/asmcomp/emitaux.ml @@ -195,6 +195,15 @@ let cfi_adjust_cfa_offset n = emit_string "\t.cfi_adjust_cfa_offset\t"; emit_int n; emit_string "\n"; end +let cfi_offset ~reg ~offset = + if is_cfi_enabled () then begin + emit_string "\t.cfi_offset "; + emit_int reg; + emit_string ", "; + emit_int offset; + emit_string "\n" + end + (* Emit debug information *) (* This assoc list is expected to be very short *) diff --git a/asmcomp/emitaux.mli b/asmcomp/emitaux.mli index 486a5839..e943da38 100644 --- a/asmcomp/emitaux.mli +++ b/asmcomp/emitaux.mli @@ -56,3 +56,4 @@ val is_generic_function: string -> bool val cfi_startproc : unit -> unit val cfi_endproc : unit -> unit val cfi_adjust_cfa_offset : int -> unit +val cfi_offset : reg:int -> offset:int -> unit diff --git a/asmcomp/power/emit.mlp b/asmcomp/power/emit.mlp index 0a26ed14..43440852 100644 --- a/asmcomp/power/emit.mlp +++ b/asmcomp/power/emit.mlp @@ -308,126 +308,87 @@ let defined_functions = ref StringSet.empty (* Label of glue code for calling the GC *) let call_gc_label = ref 0 -(* Fixup conditional branches that exceed hardware allowed range *) - -let load_store_size = function - Ibased(s, d) -> 2 - | Iindexed ofs -> if is_immediate ofs then 1 else 3 - | Iindexed2 -> 1 - -let instr_size = function - Lend -> 0 - | Lop(Imove | Ispill | Ireload) -> 1 - | Lop(Iconst_int n | Iconst_blockheader n) -> - if is_native_immediate n then 1 else 2 - | Lop(Iconst_float s) -> 2 - | Lop(Iconst_symbol s) -> 2 - | Lop(Icall_ind) -> 2 - | Lop(Icall_imm s) -> 1 - | Lop(Itailcall_ind) -> 5 - | Lop(Itailcall_imm s) -> if s = !function_name then 1 else 4 - | Lop(Iextcall(s, true)) -> 3 - | Lop(Iextcall(s, false)) -> if pic_externals then 4 else 1 - | Lop(Istackoffset n) -> 1 - | Lop(Iload(chunk, addr)) -> +module BR = Branch_relaxation.Make (struct + type distance = int + + module Cond_branch = struct + type t = Branch + + let all = [Branch] + + let max_displacement = function + (* 14-bit signed offset in words. *) + | Branch -> 8192 + + let classify_instr = function + | Lop (Ialloc _) + (* [Ialloc_far] does not need to be here, since its code sequence + never involves any conditional branches that might need relaxing. *) + | Lcondbranch _ + | Lcondbranch3 _ -> Some Branch + | _ -> None + end + + let offset_pc_at_branch = 1 + + let load_store_size = function + | Ibased(s, d) -> 2 + | Iindexed ofs -> if is_immediate ofs then 1 else 3 + | Iindexed2 -> 1 + + let instr_size = function + | Lend -> 0 + | Lop(Imove | Ispill | Ireload) -> 1 + | Lop(Iconst_int n | Iconst_blockheader n) -> + if is_native_immediate n then 1 else 2 + | Lop(Iconst_float s) -> 2 + | Lop(Iconst_symbol s) -> 2 + | Lop(Icall_ind) -> 2 + | Lop(Icall_imm s) -> 1 + | Lop(Itailcall_ind) -> 5 + | Lop(Itailcall_imm s) -> if s = !function_name then 1 else 4 + | Lop(Iextcall(s, true)) -> 3 + | Lop(Iextcall(s, false)) -> if pic_externals then 4 else 1 + | Lop(Istackoffset n) -> 1 + | Lop(Iload(chunk, addr)) -> if chunk = Byte_signed then load_store_size addr + 1 else load_store_size addr - | Lop(Istore(chunk, addr, _)) -> load_store_size addr - | Lop(Ialloc n) -> 4 - | Lop(Ispecific(Ialloc_far n)) -> 5 - | Lop(Iintop Imod) -> 3 - | Lop(Iintop(Icomp cmp)) -> 4 - | Lop(Iintop op) -> 1 - | Lop(Iintop_imm(Icomp cmp, n)) -> 4 - | Lop(Iintop_imm(op, n)) -> 1 - | Lop(Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf) -> 1 - | Lop(Ifloatofint) -> 9 - | Lop(Iintoffloat) -> 4 - | Lop(Ispecific sop) -> 1 - | Lreloadretaddr -> 2 - | Lreturn -> 2 - | Llabel lbl -> 0 - | Lbranch lbl -> 1 - | Lcondbranch(tst, lbl) -> 2 - | Lcondbranch3(lbl0, lbl1, lbl2) -> + | Lop(Istore(chunk, addr, _)) -> load_store_size addr + | Lop(Ialloc n) -> 4 + | Lop(Ispecific(Ialloc_far n)) -> 5 + | Lop(Iintop Imod) -> 3 + | Lop(Iintop(Icomp cmp)) -> 4 + | Lop(Iintop op) -> 1 + | Lop(Iintop_imm(Icomp cmp, n)) -> 4 + | Lop(Iintop_imm(op, n)) -> 1 + | Lop(Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf) -> 1 + | Lop(Ifloatofint) -> 9 + | Lop(Iintoffloat) -> 4 + | Lop(Ispecific sop) -> 1 + | Lreloadretaddr -> 2 + | Lreturn -> 2 + | Llabel lbl -> 0 + | Lbranch lbl -> 1 + | Lcondbranch(tst, lbl) -> 2 + | Lcondbranch3(lbl0, lbl1, lbl2) -> 1 + (if lbl0 = None then 0 else 1) + (if lbl1 = None then 0 else 1) + (if lbl2 = None then 0 else 1) - | Lswitch jumptbl -> 8 - | Lsetuptrap lbl -> 1 - | Lpushtrap -> 4 - | Lpoptrap -> 2 - | Lraise _ -> 6 - -let label_map code = - let map = Hashtbl.create 37 in - let rec fill_map pc instr = - match instr.desc with - Lend -> (pc, map) - | Llabel lbl -> Hashtbl.add map lbl pc; fill_map pc instr.next - | op -> fill_map (pc + instr_size op) instr.next - in fill_map 0 code - -let max_branch_offset = 8180 -(* 14-bit signed offset in words. Remember to cut some slack - for multi-word instructions where the branch can be anywhere in - the middle. 12 words of slack is plenty. *) - -let branch_overflows map pc_branch lbl_dest = - let pc_dest = Hashtbl.find map lbl_dest in - let delta = pc_dest - (pc_branch + 1) in - delta <= -max_branch_offset || delta >= max_branch_offset - -let opt_branch_overflows map pc_branch opt_lbl_dest = - match opt_lbl_dest with - None -> false - | Some lbl_dest -> branch_overflows map pc_branch lbl_dest - -let fixup_branches codesize map code = - let expand_optbranch lbl n arg next = - match lbl with - None -> next - | Some l -> - instr_cons (Lcondbranch(Iinttest_imm(Isigned Ceq, n), l)) - arg [||] next in - let rec fixup did_fix pc instr = - match instr.desc with - Lend -> did_fix - | Lcondbranch(test, lbl) when branch_overflows map pc lbl -> - let lbl2 = new_label() in - let cont = - instr_cons (Lbranch lbl) [||] [||] - (instr_cons (Llabel lbl2) [||] [||] instr.next) in - instr.desc <- Lcondbranch(invert_test test, lbl2); - instr.next <- cont; - fixup true (pc + 2) instr.next - | Lcondbranch3(lbl0, lbl1, lbl2) - when opt_branch_overflows map pc lbl0 - || opt_branch_overflows map pc lbl1 - || opt_branch_overflows map pc lbl2 -> - let cont = - expand_optbranch lbl0 0 instr.arg - (expand_optbranch lbl1 1 instr.arg - (expand_optbranch lbl2 2 instr.arg instr.next)) in - instr.desc <- cont.desc; - instr.next <- cont.next; - fixup true pc instr - | Lop(Ialloc n) when codesize - pc >= max_branch_offset -> - instr.desc <- Lop(Ispecific(Ialloc_far n)); - fixup true (pc + 4) instr.next - | op -> - fixup did_fix (pc + instr_size op) instr.next - in fixup false 0 code - -(* Iterate branch expansion till all conditional branches are OK *) - -let rec branch_normalization code = - let (codesize, map) = label_map code in - if codesize >= max_branch_offset && fixup_branches codesize map code - then branch_normalization code - else () + | Lswitch jumptbl -> 8 + | Lsetuptrap lbl -> 1 + | Lpushtrap -> 4 + | Lpoptrap -> 2 + | Lraise _ -> 6 + + let relax_allocation ~num_words = Lop (Ispecific (Ialloc_far num_words)) + (* [classify_addr], above, never identifies these instructions as needing + relaxing. As such, these functions should never be called. *) + let relax_specific_op _ = assert false + let relax_intop_checkbound () = assert false + let relax_intop_imm_checkbound ~bound:_ = assert false +end) (* Output the assembly code for an instruction *) @@ -848,7 +809,10 @@ let fundecl fundecl = ` addi {emit_gpr 1}, {emit_gpr 1}, {emit_int(-n)}\n` end; `{emit_label !tailrec_entry_point}:\n`; - branch_normalization fundecl.fun_body; + (* On this target, there is at most one "out of line" code block per + function: a single "call GC" point. It comes immediately after the + function's body. *) + BR.relax fundecl.fun_body ~max_out_of_line_code_offset:0; emit_all fundecl.fun_body; (* Emit the glue code to call the GC *) if !call_gc_label > 0 then begin diff --git a/asmrun/.depend b/asmrun/.depend index 1088ad8e..e761606f 100644 --- a/asmrun/.depend +++ b/asmrun/.depend @@ -1,753 +1,1044 @@ -alloc.o: alloc.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/custom.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/stacks.h \ - ../byterun/memory.h -array.o: array.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h -backtrace.o: backtrace.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/backtrace.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h stack.h -callback.o: callback.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/mlvalues.h -compact.o: compact.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/misc.h ../byterun/config.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/memory.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/weak.h -compare.o: compare.c ../byterun/custom.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h -custom.o: custom.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/custom.h ../byterun/fail.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/mlvalues.h -debugger.o: debugger.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/config.h ../byterun/debugger.h \ - ../byterun/misc.h -dynlink.o: dynlink.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/dynlink.h \ - ../byterun/fail.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/osdeps.h \ - ../byterun/prims.h -extern.o: extern.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/custom.h ../byterun/fail.h \ - ../byterun/gc.h ../byterun/intext.h ../byterun/io.h ../byterun/io.h \ - ../byterun/md5.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/reverse.h -fail.o: fail.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/io.h ../byterun/gc.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/printexc.h \ - ../byterun/signals.h stack.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/callback.h -finalise.o: finalise.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/mlvalues.h \ - ../byterun/roots.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/signals.h -floats.o: floats.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/fail.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/reverse.h ../byterun/stacks.h ../byterun/memory.h -freelist.o: freelist.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/major_gc.h ../byterun/misc.h ../byterun/mlvalues.h -gc_ctrl.o: gc_ctrl.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/compact.h ../byterun/custom.h \ - ../byterun/finalise.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/freelist.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h stack.h -globroots.o: globroots.c ../byterun/memory.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/globroots.h ../byterun/roots.h -hash.o: hash.c ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/hash.h -intern.o: intern.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/callback.h ../byterun/custom.h \ - ../byterun/fail.h ../byterun/gc.h ../byterun/intext.h ../byterun/io.h \ - ../byterun/io.h ../byterun/md5.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/reverse.h -ints.o: ints.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/custom.h ../byterun/fail.h ../byterun/intext.h \ - ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h -io.o: io.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/custom.h \ - ../byterun/fail.h ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/signals.h \ - ../byterun/sys.h -lexing.o: lexing.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/mlvalues.h ../byterun/stacks.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h -main.o: main.c ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/sys.h -major_gc.o: major_gc.c ../byterun/compact.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/fail.h ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/weak.h -md5.o: md5.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/md5.h ../byterun/io.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/io.h \ - ../byterun/reverse.h -memory.o: memory.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/freelist.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/signals.h -meta.o: meta.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/fail.h ../byterun/fix_code.h \ - ../byterun/interp.h ../byterun/intext.h ../byterun/io.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/prims.h ../byterun/stacks.h ../byterun/memory.h -minor_gc.o: minor_gc.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/finalise.h \ - ../byterun/roots.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/memory.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/roots.h ../byterun/signals.h \ - ../byterun/weak.h -misc.o: misc.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h -natdynlink.o: natdynlink.c ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h stack.h ../byterun/callback.h ../byterun/alloc.h \ - ../byterun/intext.h ../byterun/io.h ../byterun/osdeps.h \ - ../byterun/fail.h -obj.o: obj.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/gc.h ../byterun/interp.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/prims.h -parsing.o: parsing.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/alloc.h -printexc.o: printexc.c ../byterun/backtrace.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/callback.h ../byterun/debugger.h \ - ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/printexc.h -roots.o: roots.c ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/misc.h ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/globroots.h ../byterun/memory.h \ - ../byterun/major_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h stack.h ../byterun/roots.h -signals.o: signals.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/callback.h ../byterun/config.h \ - ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/memory.h ../byterun/signals.h ../byterun/signals_machdep.h \ - ../byterun/sys.h -signals_asm.o: signals_asm.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/osdeps.h ../byterun/signals.h ../byterun/signals_machdep.h \ - signals_osdep.h stack.h -startup.o: startup.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/backtrace.h ../byterun/custom.h \ - ../byterun/debugger.h ../byterun/fail.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/intext.h \ - ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/osdeps.h \ - ../byterun/printexc.h stack.h ../byterun/sys.h -str.o: str.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/mlvalues.h ../byterun/misc.h -sys.o: sys.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/debugger.h \ - ../byterun/fail.h ../byterun/instruct.h ../byterun/mlvalues.h \ - ../byterun/osdeps.h ../byterun/signals.h ../byterun/stacks.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/sys.h -terminfo.o: terminfo.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/fail.h \ - ../byterun/io.h ../byterun/mlvalues.h -unix.o: unix.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/osdeps.h -weak.o: weak.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h -alloc.d.o: alloc.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/custom.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/stacks.h \ - ../byterun/memory.h -array.d.o: array.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h -backtrace.d.o: backtrace.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/backtrace.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h stack.h -callback.d.o: callback.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/mlvalues.h -compact.d.o: compact.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/misc.h ../byterun/config.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/memory.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/weak.h -compare.d.o: compare.c ../byterun/custom.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h -custom.d.o: custom.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/custom.h ../byterun/fail.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/mlvalues.h -debugger.d.o: debugger.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/config.h ../byterun/debugger.h \ - ../byterun/misc.h -dynlink.d.o: dynlink.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/dynlink.h \ - ../byterun/fail.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/osdeps.h \ - ../byterun/prims.h -extern.d.o: extern.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/custom.h ../byterun/fail.h \ - ../byterun/gc.h ../byterun/intext.h ../byterun/io.h ../byterun/io.h \ - ../byterun/md5.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/reverse.h -fail.d.o: fail.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/io.h ../byterun/gc.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/printexc.h \ - ../byterun/signals.h stack.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/callback.h -finalise.d.o: finalise.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/mlvalues.h \ - ../byterun/roots.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/signals.h -floats.d.o: floats.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/fail.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/reverse.h ../byterun/stacks.h ../byterun/memory.h -freelist.d.o: freelist.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/major_gc.h ../byterun/misc.h ../byterun/mlvalues.h -gc_ctrl.d.o: gc_ctrl.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/compact.h ../byterun/custom.h \ - ../byterun/finalise.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/freelist.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h stack.h -globroots.d.o: globroots.c ../byterun/memory.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/globroots.h ../byterun/roots.h -hash.d.o: hash.c ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/hash.h -intern.d.o: intern.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/callback.h ../byterun/custom.h \ - ../byterun/fail.h ../byterun/gc.h ../byterun/intext.h ../byterun/io.h \ - ../byterun/io.h ../byterun/md5.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/reverse.h -ints.d.o: ints.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/custom.h ../byterun/fail.h ../byterun/intext.h \ - ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h -io.d.o: io.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/custom.h \ - ../byterun/fail.h ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/signals.h \ - ../byterun/sys.h -lexing.d.o: lexing.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/mlvalues.h ../byterun/stacks.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h -main.d.o: main.c ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/sys.h -major_gc.d.o: major_gc.c ../byterun/compact.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/fail.h ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/weak.h -md5.d.o: md5.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/md5.h ../byterun/io.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/io.h \ - ../byterun/reverse.h -memory.d.o: memory.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/freelist.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/signals.h -meta.d.o: meta.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/fail.h ../byterun/fix_code.h \ - ../byterun/interp.h ../byterun/intext.h ../byterun/io.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/prims.h ../byterun/stacks.h ../byterun/memory.h -minor_gc.d.o: minor_gc.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/finalise.h \ - ../byterun/roots.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/memory.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/roots.h ../byterun/signals.h \ - ../byterun/weak.h -misc.d.o: misc.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h -natdynlink.d.o: natdynlink.c ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h stack.h ../byterun/callback.h ../byterun/alloc.h \ - ../byterun/intext.h ../byterun/io.h ../byterun/osdeps.h \ - ../byterun/fail.h -obj.d.o: obj.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/gc.h ../byterun/interp.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/prims.h -parsing.d.o: parsing.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/alloc.h -printexc.d.o: printexc.c ../byterun/backtrace.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/callback.h ../byterun/debugger.h \ - ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/printexc.h -roots.d.o: roots.c ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/misc.h ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/globroots.h ../byterun/memory.h \ - ../byterun/major_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h stack.h ../byterun/roots.h -signals.d.o: signals.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/callback.h ../byterun/config.h \ - ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/memory.h ../byterun/signals.h ../byterun/signals_machdep.h \ - ../byterun/sys.h -signals_asm.d.o: signals_asm.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/osdeps.h ../byterun/signals.h ../byterun/signals_machdep.h \ - signals_osdep.h stack.h -startup.d.o: startup.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/backtrace.h ../byterun/custom.h \ - ../byterun/debugger.h ../byterun/fail.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/intext.h \ - ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/osdeps.h \ - ../byterun/printexc.h stack.h ../byterun/sys.h -str.d.o: str.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/mlvalues.h ../byterun/misc.h -sys.d.o: sys.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/debugger.h \ - ../byterun/fail.h ../byterun/instruct.h ../byterun/mlvalues.h \ - ../byterun/osdeps.h ../byterun/signals.h ../byterun/stacks.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/sys.h -terminfo.d.o: terminfo.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/fail.h \ - ../byterun/io.h ../byterun/mlvalues.h -unix.d.o: unix.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/osdeps.h -weak.d.o: weak.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h -alloc.p.o: alloc.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/custom.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/stacks.h \ - ../byterun/memory.h -array.p.o: array.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h -backtrace.p.o: backtrace.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/backtrace.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h stack.h -callback.p.o: callback.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/mlvalues.h -compact.p.o: compact.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/misc.h ../byterun/config.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/memory.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/weak.h -compare.p.o: compare.c ../byterun/custom.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h -custom.p.o: custom.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/custom.h ../byterun/fail.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/mlvalues.h -debugger.p.o: debugger.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/config.h ../byterun/debugger.h \ - ../byterun/misc.h -dynlink.p.o: dynlink.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/dynlink.h \ - ../byterun/fail.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/osdeps.h \ - ../byterun/prims.h -extern.p.o: extern.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/custom.h ../byterun/fail.h \ - ../byterun/gc.h ../byterun/intext.h ../byterun/io.h ../byterun/io.h \ - ../byterun/md5.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/reverse.h -fail.p.o: fail.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/io.h ../byterun/gc.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/printexc.h \ - ../byterun/signals.h stack.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/callback.h -finalise.p.o: finalise.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/fail.h ../byterun/mlvalues.h \ - ../byterun/roots.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/signals.h -floats.p.o: floats.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/fail.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/reverse.h ../byterun/stacks.h ../byterun/memory.h -freelist.p.o: freelist.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/freelist.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/major_gc.h ../byterun/misc.h ../byterun/mlvalues.h -gc_ctrl.p.o: gc_ctrl.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/compact.h ../byterun/custom.h \ - ../byterun/finalise.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/freelist.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h stack.h -globroots.p.o: globroots.c ../byterun/memory.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/roots.h ../byterun/memory.h \ - ../byterun/globroots.h ../byterun/roots.h -hash.p.o: hash.c ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/hash.h -intern.p.o: intern.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/callback.h ../byterun/custom.h \ - ../byterun/fail.h ../byterun/gc.h ../byterun/intext.h ../byterun/io.h \ - ../byterun/io.h ../byterun/md5.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/mlvalues.h ../byterun/misc.h ../byterun/reverse.h -ints.p.o: ints.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/custom.h ../byterun/fail.h ../byterun/intext.h \ - ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h -io.p.o: io.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/custom.h \ - ../byterun/fail.h ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/signals.h \ - ../byterun/sys.h -lexing.p.o: lexing.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/mlvalues.h ../byterun/stacks.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h -main.p.o: main.c ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/sys.h -major_gc.p.o: major_gc.c ../byterun/compact.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ - ../byterun/custom.h ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/fail.h ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/weak.h -md5.p.o: md5.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/md5.h ../byterun/io.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/io.h \ - ../byterun/reverse.h -memory.p.o: memory.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/freelist.h ../byterun/gc.h \ - ../byterun/gc_ctrl.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/signals.h -meta.p.o: meta.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/fail.h ../byterun/fix_code.h \ - ../byterun/interp.h ../byterun/intext.h ../byterun/io.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/prims.h ../byterun/stacks.h ../byterun/memory.h -minor_gc.p.o: minor_gc.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/finalise.h \ - ../byterun/roots.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/major_gc.h \ - ../byterun/memory.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/roots.h ../byterun/signals.h \ - ../byterun/weak.h -misc.p.o: misc.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h -natdynlink.p.o: natdynlink.c ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h stack.h ../byterun/callback.h ../byterun/alloc.h \ - ../byterun/intext.h ../byterun/io.h ../byterun/osdeps.h \ - ../byterun/fail.h -obj.p.o: obj.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/gc.h ../byterun/interp.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/memory.h \ - ../byterun/gc.h ../byterun/major_gc.h ../byterun/minor_gc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/prims.h -parsing.p.o: parsing.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/mlvalues.h ../byterun/config.h \ - ../byterun/misc.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/alloc.h -printexc.p.o: printexc.c ../byterun/backtrace.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/callback.h ../byterun/debugger.h \ - ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/printexc.h -roots.p.o: roots.c ../byterun/finalise.h ../byterun/roots.h \ - ../byterun/misc.h ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/mlvalues.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/globroots.h ../byterun/memory.h \ - ../byterun/major_gc.h ../byterun/minor_gc.h ../byterun/misc.h \ - ../byterun/mlvalues.h stack.h ../byterun/roots.h -signals.p.o: signals.c ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/callback.h ../byterun/config.h \ - ../byterun/fail.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/roots.h \ - ../byterun/memory.h ../byterun/signals.h ../byterun/signals_machdep.h \ - ../byterun/sys.h -signals_asm.p.o: signals_asm.c ../byterun/fail.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/mlvalues.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/osdeps.h ../byterun/signals.h ../byterun/signals_machdep.h \ - signals_osdep.h stack.h -startup.p.o: startup.c ../byterun/callback.h ../byterun/mlvalues.h \ - ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ - ../byterun/misc.h ../byterun/backtrace.h ../byterun/custom.h \ - ../byterun/debugger.h ../byterun/fail.h ../byterun/freelist.h \ - ../byterun/gc.h ../byterun/gc_ctrl.h ../byterun/intext.h \ - ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/osdeps.h \ - ../byterun/printexc.h stack.h ../byterun/sys.h -str.p.o: str.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/mlvalues.h ../byterun/misc.h -sys.p.o: sys.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/debugger.h \ - ../byterun/fail.h ../byterun/instruct.h ../byterun/mlvalues.h \ - ../byterun/osdeps.h ../byterun/signals.h ../byterun/stacks.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/freelist.h ../byterun/minor_gc.h ../byterun/sys.h -terminfo.p.o: terminfo.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ - ../byterun/config.h ../byterun/mlvalues.h ../byterun/fail.h \ - ../byterun/io.h ../byterun/mlvalues.h -unix.p.o: unix.c ../byterun/config.h ../byterun/../config/m.h \ - ../byterun/../config/s.h ../byterun/memory.h ../byterun/config.h \ - ../byterun/gc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/osdeps.h -weak.p.o: weak.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ - ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/memory.h ../byterun/gc.h ../byterun/major_gc.h \ - ../byterun/minor_gc.h ../byterun/mlvalues.h +alloc.o: alloc.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/stacks.h ../byterun/caml/memory.h +array.o: array.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h +backtrace.o: backtrace.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/backtrace.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h stack.h +callback.o: callback.c ../byterun/caml/callback.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h +compact.o: compact.c ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/finalise.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/freelist.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ + ../byterun/caml/major_gc.h ../byterun/caml/memory.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/weak.h +compare.o: compare.c ../byterun/caml/custom.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h +custom.o: custom.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h +debugger.o: debugger.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/config.h ../byterun/caml/debugger.h \ + ../byterun/caml/misc.h +dynlink.o: dynlink.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/dynlink.h \ + ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/osdeps.h ../byterun/caml/prims.h \ + ../byterun/caml/signals.h +extern.o: extern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/gc.h \ + ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/io.h \ + ../byterun/caml/md5.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/reverse.h +fail.o: fail.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/gc.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/printexc.h ../byterun/caml/signals.h stack.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h \ + ../byterun/caml/callback.h +finalise.o: finalise.c ../byterun/caml/callback.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/signals.h +floats.o: floats.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/reverse.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h +freelist.o: freelist.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/freelist.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/mlvalues.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/major_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h +gc_ctrl.o: gc_ctrl.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/compact.h ../byterun/caml/custom.h \ + ../byterun/caml/finalise.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/freelist.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h +globroots.o: globroots.c ../byterun/caml/memory.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h \ + ../byterun/caml/globroots.h ../byterun/caml/roots.h +hash.o: hash.c ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/custom.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/hash.h +intern.o: intern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/callback.h ../byterun/caml/custom.h \ + ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/intext.h \ + ../byterun/caml/io.h ../byterun/caml/io.h ../byterun/caml/md5.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h ../byterun/caml/reverse.h +ints.o: ints.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/intext.h \ + ../byterun/caml/io.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h +io.o: io.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/custom.h \ + ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/signals.h \ + ../byterun/caml/sys.h +lexing.o: lexing.c ../byterun/caml/fail.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h +main.o: main.c ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h ../byterun/caml/sys.h +major_gc.o: major_gc.c ../byterun/caml/compact.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/custom.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/fail.h ../byterun/caml/finalise.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/weak.h +md5.o: md5.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/md5.h ../byterun/caml/io.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/io.h ../byterun/caml/reverse.h +memory.o: memory.c ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/signals.h +meta.o: meta.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/config.h ../byterun/caml/fail.h \ + ../byterun/caml/fix_code.h ../byterun/caml/interp.h \ + ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/prims.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h +minor_gc.o: minor_gc.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/fail.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/finalise.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ + ../byterun/caml/major_gc.h ../byterun/caml/memory.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/signals.h ../byterun/caml/weak.h +misc.o: misc.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h +natdynlink.o: natdynlink.c ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h stack.h ../byterun/caml/callback.h \ + ../byterun/caml/alloc.h ../byterun/caml/intext.h ../byterun/caml/io.h \ + ../byterun/caml/osdeps.h ../byterun/caml/fail.h \ + ../byterun/caml/signals.h +obj.o: obj.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/interp.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/prims.h +parsing.o: parsing.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/alloc.h +printexc.o: printexc.c ../byterun/caml/backtrace.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/callback.h \ + ../byterun/caml/debugger.h ../byterun/caml/fail.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/printexc.h +roots.o: roots.c ../byterun/caml/finalise.h ../byterun/caml/roots.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/globroots.h ../byterun/caml/memory.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h \ + ../byterun/caml/roots.h +signals_asm.o: signals_asm.c ../byterun/caml/fail.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/osdeps.h ../byterun/caml/signals.h \ + ../byterun/caml/signals_machdep.h signals_osdep.h stack.h +signals.o: signals.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/callback.h ../byterun/caml/config.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h \ + ../byterun/caml/signals.h ../byterun/caml/signals_machdep.h \ + ../byterun/caml/sys.h +startup.o: startup.c ../byterun/caml/callback.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/backtrace.h \ + ../byterun/caml/custom.h ../byterun/caml/debugger.h \ + ../byterun/caml/fail.h ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/intext.h ../byterun/caml/io.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/osdeps.h \ + ../byterun/caml/printexc.h stack.h ../byterun/caml/sys.h +str.o: str.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/mlvalues.h ../byterun/caml/misc.h +sys.o: sys.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/debugger.h \ + ../byterun/caml/fail.h ../byterun/caml/instruct.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/osdeps.h \ + ../byterun/caml/signals.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/sys.h +terminfo.o: terminfo.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/fail.h ../byterun/caml/io.h \ + ../byterun/caml/mlvalues.h +unix.o: unix.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/memory.h \ + ../byterun/caml/config.h ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/osdeps.h +weak.o: weak.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h +alloc.d.o: alloc.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/stacks.h ../byterun/caml/memory.h +array.d.o: array.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h +backtrace.d.o: backtrace.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/backtrace.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h stack.h +callback.d.o: callback.c ../byterun/caml/callback.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h +compact.d.o: compact.c ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/finalise.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/freelist.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ + ../byterun/caml/major_gc.h ../byterun/caml/memory.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/weak.h +compare.d.o: compare.c ../byterun/caml/custom.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h +custom.d.o: custom.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h +debugger.d.o: debugger.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/config.h ../byterun/caml/debugger.h \ + ../byterun/caml/misc.h +dynlink.d.o: dynlink.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/dynlink.h \ + ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/osdeps.h ../byterun/caml/prims.h \ + ../byterun/caml/signals.h +extern.d.o: extern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/gc.h \ + ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/io.h \ + ../byterun/caml/md5.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/reverse.h +fail.d.o: fail.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/gc.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/printexc.h ../byterun/caml/signals.h stack.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h \ + ../byterun/caml/callback.h +finalise.d.o: finalise.c ../byterun/caml/callback.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/signals.h +floats.d.o: floats.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/reverse.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h +freelist.d.o: freelist.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/freelist.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/mlvalues.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/major_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h +gc_ctrl.d.o: gc_ctrl.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/compact.h ../byterun/caml/custom.h \ + ../byterun/caml/finalise.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/freelist.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h +globroots.d.o: globroots.c ../byterun/caml/memory.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h \ + ../byterun/caml/globroots.h ../byterun/caml/roots.h +hash.d.o: hash.c ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/custom.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/hash.h +intern.d.o: intern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/callback.h ../byterun/caml/custom.h \ + ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/intext.h \ + ../byterun/caml/io.h ../byterun/caml/io.h ../byterun/caml/md5.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h ../byterun/caml/reverse.h +ints.d.o: ints.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/intext.h \ + ../byterun/caml/io.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h +io.d.o: io.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/custom.h \ + ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/signals.h \ + ../byterun/caml/sys.h +lexing.d.o: lexing.c ../byterun/caml/fail.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h +main.d.o: main.c ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h ../byterun/caml/sys.h +major_gc.d.o: major_gc.c ../byterun/caml/compact.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/custom.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/fail.h ../byterun/caml/finalise.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/weak.h +md5.d.o: md5.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/md5.h ../byterun/caml/io.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/io.h ../byterun/caml/reverse.h +memory.d.o: memory.c ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/signals.h +meta.d.o: meta.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/config.h ../byterun/caml/fail.h \ + ../byterun/caml/fix_code.h ../byterun/caml/interp.h \ + ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/prims.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h +minor_gc.d.o: minor_gc.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/fail.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/finalise.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ + ../byterun/caml/major_gc.h ../byterun/caml/memory.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/signals.h ../byterun/caml/weak.h +misc.d.o: misc.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h +natdynlink.d.o: natdynlink.c ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h stack.h ../byterun/caml/callback.h \ + ../byterun/caml/alloc.h ../byterun/caml/intext.h ../byterun/caml/io.h \ + ../byterun/caml/osdeps.h ../byterun/caml/fail.h \ + ../byterun/caml/signals.h +obj.d.o: obj.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/interp.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/prims.h +parsing.d.o: parsing.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/alloc.h +printexc.d.o: printexc.c ../byterun/caml/backtrace.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/callback.h \ + ../byterun/caml/debugger.h ../byterun/caml/fail.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/printexc.h +roots.d.o: roots.c ../byterun/caml/finalise.h ../byterun/caml/roots.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/globroots.h ../byterun/caml/memory.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h \ + ../byterun/caml/roots.h +signals_asm.d.o: signals_asm.c ../byterun/caml/fail.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/osdeps.h ../byterun/caml/signals.h \ + ../byterun/caml/signals_machdep.h signals_osdep.h stack.h +signals.d.o: signals.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/callback.h ../byterun/caml/config.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h \ + ../byterun/caml/signals.h ../byterun/caml/signals_machdep.h \ + ../byterun/caml/sys.h +startup.d.o: startup.c ../byterun/caml/callback.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/backtrace.h \ + ../byterun/caml/custom.h ../byterun/caml/debugger.h \ + ../byterun/caml/fail.h ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/intext.h ../byterun/caml/io.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/osdeps.h \ + ../byterun/caml/printexc.h stack.h ../byterun/caml/sys.h +str.d.o: str.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/mlvalues.h ../byterun/caml/misc.h +sys.d.o: sys.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/debugger.h \ + ../byterun/caml/fail.h ../byterun/caml/instruct.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/osdeps.h \ + ../byterun/caml/signals.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/sys.h +terminfo.d.o: terminfo.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/fail.h ../byterun/caml/io.h \ + ../byterun/caml/mlvalues.h +unix.d.o: unix.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/memory.h \ + ../byterun/caml/config.h ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/osdeps.h +weak.d.o: weak.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h +alloc.p.o: alloc.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/stacks.h ../byterun/caml/memory.h +array.p.o: array.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h +backtrace.p.o: backtrace.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/backtrace.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h stack.h +callback.p.o: callback.c ../byterun/caml/callback.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h +compact.p.o: compact.c ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/finalise.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/freelist.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ + ../byterun/caml/major_gc.h ../byterun/caml/memory.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/weak.h +compare.p.o: compare.c ../byterun/caml/custom.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h +custom.p.o: custom.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h +debugger.p.o: debugger.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/config.h ../byterun/caml/debugger.h \ + ../byterun/caml/misc.h +dynlink.p.o: dynlink.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/dynlink.h \ + ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/osdeps.h ../byterun/caml/prims.h \ + ../byterun/caml/signals.h +extern.p.o: extern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/gc.h \ + ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/io.h \ + ../byterun/caml/md5.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/reverse.h +fail.p.o: fail.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/gc.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/printexc.h ../byterun/caml/signals.h stack.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h \ + ../byterun/caml/callback.h +finalise.p.o: finalise.c ../byterun/caml/callback.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/fail.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/signals.h +floats.p.o: floats.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/reverse.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h +freelist.p.o: freelist.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/freelist.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/mlvalues.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/major_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h +gc_ctrl.p.o: gc_ctrl.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/compact.h ../byterun/caml/custom.h \ + ../byterun/caml/finalise.h ../byterun/caml/roots.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/freelist.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h +globroots.p.o: globroots.c ../byterun/caml/memory.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h \ + ../byterun/caml/globroots.h ../byterun/caml/roots.h +hash.p.o: hash.c ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/custom.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/hash.h +intern.p.o: intern.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/callback.h ../byterun/caml/custom.h \ + ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/intext.h \ + ../byterun/caml/io.h ../byterun/caml/io.h ../byterun/caml/md5.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h ../byterun/caml/reverse.h +ints.p.o: ints.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/custom.h ../byterun/caml/fail.h ../byterun/caml/intext.h \ + ../byterun/caml/io.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h +io.p.o: io.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/custom.h \ + ../byterun/caml/fail.h ../byterun/caml/io.h ../byterun/caml/memory.h \ + ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/signals.h \ + ../byterun/caml/sys.h +lexing.p.o: lexing.c ../byterun/caml/fail.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h +main.p.o: main.c ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h ../byterun/caml/sys.h +major_gc.p.o: major_gc.c ../byterun/caml/compact.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/custom.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/fail.h ../byterun/caml/finalise.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/weak.h +md5.p.o: md5.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/md5.h ../byterun/caml/io.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/io.h ../byterun/caml/reverse.h +memory.p.o: memory.c ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/signals.h +meta.p.o: meta.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/config.h ../byterun/caml/fail.h \ + ../byterun/caml/fix_code.h ../byterun/caml/interp.h \ + ../byterun/caml/intext.h ../byterun/caml/io.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/prims.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h +minor_gc.p.o: minor_gc.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/fail.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/finalise.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/gc.h ../byterun/caml/gc_ctrl.h \ + ../byterun/caml/major_gc.h ../byterun/caml/memory.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/roots.h \ + ../byterun/caml/signals.h ../byterun/caml/weak.h +misc.p.o: misc.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/misc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h +natdynlink.p.o: natdynlink.c ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h stack.h ../byterun/caml/callback.h \ + ../byterun/caml/alloc.h ../byterun/caml/intext.h ../byterun/caml/io.h \ + ../byterun/caml/osdeps.h ../byterun/caml/fail.h \ + ../byterun/caml/signals.h +obj.p.o: obj.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/gc.h ../byterun/caml/interp.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/prims.h +parsing.p.o: parsing.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/misc.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/alloc.h +printexc.p.o: printexc.c ../byterun/caml/backtrace.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/callback.h \ + ../byterun/caml/debugger.h ../byterun/caml/fail.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/printexc.h +roots.p.o: roots.c ../byterun/caml/finalise.h ../byterun/caml/roots.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/globroots.h ../byterun/caml/memory.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h stack.h \ + ../byterun/caml/roots.h +signals_asm.p.o: signals_asm.c ../byterun/caml/fail.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/osdeps.h ../byterun/caml/signals.h \ + ../byterun/caml/signals_machdep.h signals_osdep.h stack.h +signals.p.o: signals.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/callback.h ../byterun/caml/config.h \ + ../byterun/caml/fail.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/freelist.h \ + ../byterun/caml/minor_gc.h ../byterun/caml/address_class.h \ + ../byterun/caml/misc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/roots.h ../byterun/caml/memory.h \ + ../byterun/caml/signals.h ../byterun/caml/signals_machdep.h \ + ../byterun/caml/sys.h +startup.p.o: startup.c ../byterun/caml/callback.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/misc.h ../byterun/caml/backtrace.h \ + ../byterun/caml/custom.h ../byterun/caml/debugger.h \ + ../byterun/caml/fail.h ../byterun/caml/freelist.h ../byterun/caml/gc.h \ + ../byterun/caml/gc_ctrl.h ../byterun/caml/intext.h ../byterun/caml/io.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/osdeps.h \ + ../byterun/caml/printexc.h stack.h ../byterun/caml/sys.h +str.p.o: str.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/mlvalues.h ../byterun/caml/misc.h +sys.p.o: sys.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/alloc.h \ + ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/debugger.h \ + ../byterun/caml/fail.h ../byterun/caml/instruct.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/osdeps.h \ + ../byterun/caml/signals.h ../byterun/caml/stacks.h \ + ../byterun/caml/memory.h ../byterun/caml/gc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/sys.h +terminfo.p.o: terminfo.c ../byterun/caml/config.h \ + ../byterun/caml/../../config/m.h ../byterun/caml/../../config/s.h \ + ../byterun/caml/alloc.h ../byterun/caml/misc.h ../byterun/caml/config.h \ + ../byterun/caml/mlvalues.h ../byterun/caml/fail.h ../byterun/caml/io.h \ + ../byterun/caml/mlvalues.h +unix.p.o: unix.c ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/memory.h \ + ../byterun/caml/config.h ../byterun/caml/gc.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/misc.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/misc.h \ + ../byterun/caml/osdeps.h +weak.p.o: weak.c ../byterun/caml/alloc.h ../byterun/caml/misc.h \ + ../byterun/caml/config.h ../byterun/caml/../../config/m.h \ + ../byterun/caml/../../config/s.h ../byterun/caml/mlvalues.h \ + ../byterun/caml/fail.h ../byterun/caml/major_gc.h \ + ../byterun/caml/freelist.h ../byterun/caml/memory.h ../byterun/caml/gc.h \ + ../byterun/caml/major_gc.h ../byterun/caml/minor_gc.h \ + ../byterun/caml/address_class.h ../byterun/caml/mlvalues.h diff --git a/asmrun/Makefile b/asmrun/Makefile index 63ff80c6..37b6182d 100644 --- a/asmrun/Makefile +++ b/asmrun/Makefile @@ -16,9 +16,10 @@ include ../config/Makefile CC=$(NATIVECC) FLAGS=-I../byterun -DCAML_NAME_SPACE -DNATIVE_CODE \ -DTARGET_$(ARCH) -DSYS_$(SYSTEM) $(IFLEXDIR) -CFLAGS=$(FLAGS) -O $(NATIVECCCOMPOPTS) +CFLAGS=$(FLAGS) $(NATIVECCCOMPOPTS) DFLAGS=$(FLAGS) -g -DDEBUG $(NATIVECCCOMPOPTS) PFLAGS=$(FLAGS) -pg -O -DPROFILING $(NATIVECCPROFOPTS) +PICFLAGS=$(FLAGS) -O $(SHAREDCCCOMPOPTS) $(NATIVECCCOMPOPTS) COBJS=startup.o main.o fail.o roots.o globroots.o signals.o signals_asm.o \ misc.o freelist.o major_gc.o minor_gc.o memory.o alloc.o compare.o ints.o \ @@ -32,12 +33,13 @@ ASMOBJS=$(ARCH).o OBJS=$(COBJS) $(ASMOBJS) DOBJS=$(COBJS:.o=.d.o) $(ASMOBJS) POBJS=$(COBJS:.o=.p.o) $(ASMOBJS:.o=.p.o) +PICOBJS=$(COBJS:.o=.pic.o) $(ASMOBJS:.o=.pic.o) -all: libasmrun.a all-$(RUNTIMED) all-$(PROFILING) +all: libasmrun.a all-$(RUNTIMED) all-$(PROFILING) all-$(SHARED) libasmrun.a: $(OBJS) rm -f libasmrun.a - ar rc libasmrun.a $(OBJS) + $(ARCMD) rc libasmrun.a $(OBJS) $(RANLIB) libasmrun.a all-noruntimed: @@ -48,7 +50,7 @@ all-runtimed: libasmrund.a libasmrund.a: $(DOBJS) rm -f libasmrund.a - ar rc libasmrund.a $(DOBJS) + $(ARCMD) rc libasmrund.a $(DOBJS) $(RANLIB) libasmrund.a all-noprof: @@ -57,16 +59,29 @@ all-prof: libasmrunp.a libasmrunp.a: $(POBJS) rm -f libasmrunp.a - ar rc libasmrunp.a $(POBJS) + $(ARCMD) rc libasmrunp.a $(POBJS) $(RANLIB) libasmrunp.a +all-noshared: + +all-shared: libasmrun_pic.a libasmrun_shared.so + +libasmrun_pic.a: $(PICOBJS) + rm -f libasmrun_pic.a + ar rc libasmrun_pic.a $(PICOBJS) + $(RANLIB) libasmrun_pic.a + +libasmrun_shared.so: $(PICOBJS) + $(MKDLL) -o libasmrun_shared.so $(PICOBJS) $(NATIVECCLIBS) + INSTALL_LIBDIR=$(DESTDIR)$(LIBDIR) -install: install-default install-$(RUNTIMED) install-$(PROFILING) +install: install-default install-$(RUNTIMED) install-$(PROFILING) install-$(SHARED) install-default: cp libasmrun.a $(INSTALL_LIBDIR)/libasmrun.a cd $(INSTALL_LIBDIR); $(RANLIB) libasmrun.a +.PHONY: install-default install-noruntimed: .PHONY: install-noruntimed @@ -79,10 +94,21 @@ install-runtimed: install-noprof: rm -f $(INSTALL_LIBDIR)/libasmrunp.a ln -s libasmrun.a $(INSTALL_LIBDIR)/libasmrunp.a +.PHONY: install-noprof install-prof: cp libasmrunp.a $(INSTALL_LIBDIR)/libasmrunp.a cd $(INSTALL_LIBDIR); $(RANLIB) libasmrunp.a +.PHONY: install-prof + +install-noshared: +.PHONY: install-noshared + +install-shared: + cp libasmrun_pic.a $(INSTALL_LIBDIR)/libasmrun_pic.a + cd $(INSTALL_LIBDIR); $(RANLIB) libasmrunp.a + cp libasmrun_shared.so $(INSTALL_LIBDIR)/libasmrun_shared.so +.PHONY: install-prof power-bsd_elf.S: power-elf.S cp power-elf.S power-bsd_elf.S @@ -93,6 +119,9 @@ power.o: power-$(SYSTEM).o power.p.o: power-$(SYSTEM).o cp power-$(SYSTEM).o power.p.o +power.pic.o: power-$(SYSTEM).pic.o + cp power-$(SYSTEM).pic.o power.pic.o + main.c: ../byterun/main.c ln -s ../byterun/main.c main.c misc.c: ../byterun/misc.c @@ -173,40 +202,43 @@ LINKEDFILES=misc.c freelist.c major_gc.c minor_gc.c memory.c alloc.c array.c \ clean:: rm -f $(LINKEDFILES) -.SUFFIXES: .S .d.o .p.o - -.S.o: - $(ASPP) -DSYS_$(SYSTEM) -DMODEL_$(MODEL) -o $*.o $*.S || \ +%.o: %.S + $(ASPP) -DSYS_$(SYSTEM) -DMODEL_$(MODEL) -o $@ $< || \ { echo "If your assembler produced syntax errors, it is probably";\ echo "unhappy with the preprocessor. Check your assembler, or";\ echo "try producing $*.o by hand.";\ exit 2; } -.S.p.o: - $(ASPP) -DSYS_$(SYSTEM) -DMODEL_$(MODEL) $(ASPPPROFFLAGS) -o $*.p.o $*.S +%.p.o: %.S + $(ASPP) -DSYS_$(SYSTEM) -DMODEL_$(MODEL) $(ASPPPROFFLAGS) -o $@ $< + +%.pic.o: %.S + $(ASPP) -DSYS_$(SYSTEM) -DMODEL_$(MODEL) $(SHAREDCCCOMPOPTS) -o $@ $< + +%.d.o: %.c + $(CC) -c $(DFLAGS) -o $@ $< + +%.p.o: %.c + $(CC) -c $(PFLAGS) -o $@ $< -.c.d.o: - ln -s -f $*.c $*.d.c - $(CC) -c $(DFLAGS) $*.d.c - rm -f $*.d.c +%.pic.o: %.c + $(CC) -c $(PICFLAGS) -o $@ $< -.c.p.o: - ln -s -f $*.c $*.p.c - $(CC) -c $(PFLAGS) $*.p.c - rm -f $*.p.c +%.o: %.s + $(ASPP) -DSYS_$(SYSTEM) -o $@ $< -.s.o: - $(ASPP) -DSYS_$(SYSTEM) -o $*.o $*.s +%.p.o: %.s + $(ASPP) -DSYS_$(SYSTEM) $(ASPPPROFFLAGS) -o $@ $< -.s.p.o: - $(ASPP) -DSYS_$(SYSTEM) $(ASPPPROFFLAGS) -o $*.p.o $*.s +%.pic.o: %.s + $(ASPP) -DSYS_$(SYSTEM) $(SHAREDCCCOMPOPTS) -o $@ $< clean:: rm -f *.o *.a *~ depend: $(COBJS:.o=.c) ${LINKEDFILES} - -gcc -MM $(FLAGS) *.c > .depend - gcc -MM $(FLAGS) -DDEBUG *.c | sed -e 's/\.o/.d.o/' >> .depend - gcc -MM $(FLAGS) -DDEBUG *.c | sed -e 's/\.o/.p.o/' >> .depend + $(CC) -MM $(FLAGS) *.c > .depend + $(CC) -MM $(FLAGS) -DDEBUG *.c | sed -e 's/\.o/.d.o/' >> .depend + $(CC) -MM $(FLAGS) -DPROFILING *.c | sed -e 's/\.o/.p.o/' >> .depend include .depend diff --git a/asmrun/Makefile.nt b/asmrun/Makefile.nt index 77c2002d..dba8343c 100644 --- a/asmrun/Makefile.nt +++ b/asmrun/Makefile.nt @@ -68,9 +68,7 @@ $(LINKEDFILES): %.c: ../byterun/%.c win32.$(O): ../byterun/win32.c $(CC) -c $(NATIVECCCOMPOPTS) -DNATIVE_CODE $(IFLEXDIR) ../byterun/win32.c -.SUFFIXES: .c .$(O) - -.c.$(O): +%.$(O): %.c $(CC) $(CFLAGS) -c $< clean:: diff --git a/asmrun/amd64.S b/asmrun/amd64.S index d2e00752..be38848e 100644 --- a/asmrun/amd64.S +++ b/asmrun/amd64.S @@ -471,7 +471,7 @@ FUNCTION(G(caml_start_program)) /* Save callee-save registers */ PUSH_CALLEE_SAVE_REGS /* Initial entry point is G(caml_program) */ - leaq GCALL(caml_program)(%rip), %r12 + LEA_VAR(caml_program, %r12) /* Common code for caml_start_program and caml_callback* */ LBL(caml_start_program): /* Build a callback link */ @@ -636,7 +636,7 @@ CFI_STARTPROC movq C_ARG_1, %rdi /* closure -- no op with Unix conventions */ movq C_ARG_2, %rax /* first argument */ movq C_ARG_3, %rbx /* second argument */ - leaq GCALL(caml_apply2)(%rip), %r12 /* code pointer */ + LEA_VAR(caml_apply2, %r12) /* code pointer */ jmp LBL(caml_start_program) CFI_ENDPROC @@ -649,13 +649,13 @@ CFI_STARTPROC movq C_ARG_3, %rbx /* second argument */ movq C_ARG_1, %rsi /* closure */ movq C_ARG_4, %rdi /* third argument */ - leaq GCALL(caml_apply3)(%rip), %r12 /* code pointer */ + LEA_VAR(caml_apply3, %r12) /* code pointer */ jmp LBL(caml_start_program) CFI_ENDPROC FUNCTION(G(caml_ml_array_bound_error)) CFI_STARTPROC - leaq GCALL(caml_array_bound_error)(%rip), %rax + LEA_VAR(caml_array_bound_error, %rax) jmp LBL(caml_c_call) CFI_ENDPROC diff --git a/asmrun/backtrace.c b/asmrun/backtrace.c index 05e0d6b2..fafe13a0 100644 --- a/asmrun/backtrace.c +++ b/asmrun/backtrace.c @@ -17,11 +17,11 @@ #include #include -#include "alloc.h" -#include "backtrace.h" -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" +#include "caml/alloc.h" +#include "caml/backtrace.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" #include "stack.h" int caml_backtrace_active = 0; @@ -204,17 +204,8 @@ CAMLprim value caml_get_current_callstack(value max_frames_value) { /* Extract location information for the given frame descriptor */ -struct loc_info { - int loc_valid; - int loc_is_raise; - char * loc_filename; - int loc_lnum; - int loc_startchr; - int loc_endchr; -}; - -static void extract_location_info(frame_descr * d, - /*out*/ struct loc_info * li) +CAMLexport void extract_location_info(frame_descr * d, + /*out*/ struct caml_loc_info * li) { uintnat infoptr; uint32 info1, info2; @@ -260,7 +251,7 @@ static void extract_location_info(frame_descr * d, useless. We kept it to keep code identical to the byterun/ implementation. */ -static void print_location(struct loc_info * li, int index) +static void print_location(struct caml_loc_info * li, int index) { char * info; @@ -293,7 +284,7 @@ static void print_location(struct loc_info * li, int index) void caml_print_exception_backtrace(void) { int i; - struct loc_info li; + struct caml_loc_info li; for (i = 0; i < caml_backtrace_pos; i++) { extract_location_info((frame_descr *) (caml_backtrace_buffer[i]), &li); @@ -306,7 +297,7 @@ void caml_print_exception_backtrace(void) CAMLprim value caml_convert_raw_backtrace_slot(value backtrace_slot) { CAMLparam1(backtrace_slot); CAMLlocal2(p, fname); - struct loc_info li; + struct caml_loc_info li; extract_location_info(Descrptr_Val(backtrace_slot), &li); diff --git a/asmrun/fail.c b/asmrun/fail.c index cb2c1cbd..c674d1a8 100644 --- a/asmrun/fail.c +++ b/asmrun/fail.c @@ -15,17 +15,17 @@ #include #include -#include "alloc.h" -#include "fail.h" -#include "io.h" -#include "gc.h" -#include "memory.h" -#include "mlvalues.h" -#include "printexc.h" -#include "signals.h" +#include "caml/alloc.h" +#include "caml/fail.h" +#include "caml/io.h" +#include "caml/gc.h" +#include "caml/memory.h" +#include "caml/mlvalues.h" +#include "caml/printexc.h" +#include "caml/signals.h" #include "stack.h" -#include "roots.h" -#include "callback.h" +#include "caml/roots.h" +#include "caml/callback.h" /* The globals holding predefined exceptions */ diff --git a/asmrun/i386.S b/asmrun/i386.S index 347e967c..e55969ee 100644 --- a/asmrun/i386.S +++ b/asmrun/i386.S @@ -19,7 +19,7 @@ /* Linux/BSD with ELF binaries and Solaris do not prefix identifiers with _. Linux/BSD with a.out binaries and NextStep do. */ -#if defined(SYS_solaris) +#if (defined(SYS_solaris) && !defined(__GNUC__)) #define CONCAT(a,b) a/**/b #else #define CONCAT(a,b) a##b diff --git a/asmrun/natdynlink.c b/asmrun/natdynlink.c index 86c4f3e6..82e8795f 100644 --- a/asmrun/natdynlink.c +++ b/asmrun/natdynlink.c @@ -11,15 +11,16 @@ /* */ /***********************************************************************/ -#include "misc.h" -#include "mlvalues.h" -#include "memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/memory.h" #include "stack.h" -#include "callback.h" -#include "alloc.h" -#include "intext.h" -#include "osdeps.h" -#include "fail.h" +#include "caml/callback.h" +#include "caml/alloc.h" +#include "caml/intext.h" +#include "caml/osdeps.h" +#include "caml/fail.h" +#include "caml/signals.h" #include #include @@ -51,10 +52,15 @@ CAMLprim value caml_natdynlink_open(value filename, value global) CAMLlocal1 (res); void *sym; void *handle; + char *p; /* TODO: dlclose in case of error... */ - handle = caml_dlopen(String_val(filename), 1, Int_val(global)); + p = caml_strdup(String_val(filename)); + caml_enter_blocking_section(); + handle = caml_dlopen(p, 1, Int_val(global)); + caml_leave_blocking_section(); + caml_stat_free(p); if (NULL == handle) CAMLreturn(caml_copy_string(caml_dlerror())); @@ -117,10 +123,15 @@ CAMLprim value caml_natdynlink_run_toplevel(value filename, value symbol) CAMLparam2 (filename, symbol); CAMLlocal2 (res, v); void *handle; + char *p; /* TODO: dlclose in case of error... */ - handle = caml_dlopen(String_val(filename), 1, 1); + p = caml_strdup(String_val(filename)); + caml_enter_blocking_section(); + handle = caml_dlopen(p, 1, 1); + caml_leave_blocking_section(); + caml_stat_free(p); if (NULL == handle) { res = caml_alloc(1,1); diff --git a/asmrun/roots.c b/asmrun/roots.c index 93e7a655..32325e2e 100644 --- a/asmrun/roots.c +++ b/asmrun/roots.c @@ -13,15 +13,15 @@ /* To walk the memory roots for garbage collection */ -#include "finalise.h" -#include "globroots.h" -#include "memory.h" -#include "major_gc.h" -#include "minor_gc.h" -#include "misc.h" -#include "mlvalues.h" +#include "caml/finalise.h" +#include "caml/globroots.h" +#include "caml/memory.h" +#include "caml/major_gc.h" +#include "caml/minor_gc.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" #include "stack.h" -#include "roots.h" +#include "caml/roots.h" #include #include diff --git a/asmrun/signals_asm.c b/asmrun/signals_asm.c index df76c501..4ac2a64f 100644 --- a/asmrun/signals_asm.c +++ b/asmrun/signals_asm.c @@ -19,11 +19,11 @@ #include #include #include -#include "fail.h" -#include "memory.h" -#include "osdeps.h" -#include "signals.h" -#include "signals_machdep.h" +#include "caml/fail.h" +#include "caml/memory.h" +#include "caml/osdeps.h" +#include "caml/signals.h" +#include "caml/signals_machdep.h" #include "signals_osdep.h" #include "stack.h" @@ -47,6 +47,8 @@ extern void caml_win32_overflow_detection(); extern char * caml_code_area_start, * caml_code_area_end; extern char caml_system__code_begin, caml_system__code_end; +/* Do not use the macro from address_class.h here. */ +#undef Is_in_code_area #define Is_in_code_area(pc) \ ( ((char *)(pc) >= caml_code_area_start && \ (char *)(pc) <= caml_code_area_end) \ diff --git a/asmrun/signals_osdep.h b/asmrun/signals_osdep.h index f3b4642d..627e3b72 100644 --- a/asmrun/signals_osdep.h +++ b/asmrun/signals_osdep.h @@ -66,18 +66,7 @@ #elif defined(TARGET_arm) && (defined(SYS_linux_eabi) \ || defined(SYS_linux_eabihf)) - #if defined(__ANDROID__) - // The Android NDK does not have sys/ucontext.h yet. - typedef struct ucontext { - uint32_t uc_flags; - struct ucontext *uc_link; - stack_t uc_stack; - struct sigcontext uc_mcontext; - // Other fields omitted... - } ucontext_t; - #else - #include - #endif + #include #define DECLARE_SIGNAL_HANDLER(name) \ static void name(int sig, siginfo_t * info, ucontext_t * context) @@ -163,14 +152,24 @@ #elif defined(TARGET_i386) && defined(SYS_bsd_elf) - #define DECLARE_SIGNAL_HANDLER(name) \ - static void name(int sig, siginfo_t * info, struct sigcontext * context) + #if defined (__NetBSD__) + #include + #define DECLARE_SIGNAL_HANDLER(name) \ + static void name(int sig, siginfo_t * info, ucontext_t * context) + #else + #define DECLARE_SIGNAL_HANDLER(name) \ + static void name(int sig, siginfo_t * info, struct sigcontext * context) + #endif #define SET_SIGACT(sigact,name) \ sigact.sa_sigaction = (void (*)(int,siginfo_t *,void *)) (name); \ sigact.sa_flags = SA_SIGINFO - #define CONTEXT_PC (context->sc_eip) + #if defined (__NetBSD__) + #define CONTEXT_PC (_UC_MACHINE_PC(context)) + #else + #define CONTEXT_PC (context->sc_eip) + #endif #define CONTEXT_FAULTING_ADDRESS ((char *) info->si_addr) /****************** I386, BSD */ diff --git a/asmrun/stack.h b/asmrun/stack.h index 92b3c28a..6e559429 100644 --- a/asmrun/stack.h +++ b/asmrun/stack.h @@ -78,6 +78,15 @@ typedef struct { unsigned short live_ofs[1]; } frame_descr; +struct caml_loc_info { + int loc_valid; + int loc_is_raise; + char * loc_filename; + int loc_lnum; + int loc_startchr; + int loc_endchr; +}; + /* Hash table of frame descriptors */ extern frame_descr ** caml_frame_descriptors; @@ -90,6 +99,10 @@ extern void caml_init_frame_descriptors(void); extern void caml_register_frametable(intnat *); extern void caml_register_dyn_global(void *); +CAMLextern void extract_location_info(frame_descr * d, + /*out*/ struct caml_loc_info * li); + + extern uintnat caml_stack_usage (void); extern uintnat (*caml_stack_usage_hook)(void); diff --git a/asmrun/startup.c b/asmrun/startup.c index 9a00f2d7..1fefe7fd 100644 --- a/asmrun/startup.c +++ b/asmrun/startup.c @@ -15,24 +15,24 @@ #include #include -#include "callback.h" -#include "backtrace.h" -#include "custom.h" -#include "debugger.h" -#include "fail.h" -#include "freelist.h" -#include "gc.h" -#include "gc_ctrl.h" -#include "intext.h" -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" -#include "osdeps.h" -#include "printexc.h" +#include "caml/callback.h" +#include "caml/backtrace.h" +#include "caml/custom.h" +#include "caml/debugger.h" +#include "caml/fail.h" +#include "caml/freelist.h" +#include "caml/gc.h" +#include "caml/gc_ctrl.h" +#include "caml/intext.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/osdeps.h" +#include "caml/printexc.h" #include "stack.h" -#include "sys.h" +#include "caml/sys.h" #ifdef HAS_UI -#include "ui.h" +#include "caml/ui.h" #endif extern int caml_parser_trace; diff --git a/boot/ocamlc b/boot/ocamlc index a1aec5dbc33db078f430c8d2074dc7098a158a85..a70f3df7845ccd7f9921d1fa4d69138b187d3e07 100755 GIT binary patch delta 349330 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%0A`HM_TbI+``kCPM^ZAAcA5~ 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Ç)e4-7x?!}yj(%o87dmiSe{%tDkM@U6fv3>H zTb}_cbbs)+e}GvM%aJ!mw%(VVUcI6}T6%2^o(c~{kBNjxxYXR;VjU{ZLa7FRhPx7u zGfPT;?b1O|Ur$SO+|FJfA!3dbaYF=LnuFUY<;>+7SvbfnIR9D1YzquEJc|f~g*SzT zp9>2=FDC|>dCo&0&o|M*6AxeT$PY8(+hCEWd@%aki?VpI+4tg?khT8S zld5NngXj4Ky6c4Ew*t?2FH7bSbA;<(&gAu>A?8|$RKLs2Xv6tP&fuYD3HI%5916jF zMUDFk*Y%%)|eTAnIp{}EUNYz6Z2yU>=|VqHjwG|(PoA- zjj0=LrlPd?G0<6W1Se@2XZs)s=!7vCj6`;hG0Tw3Ut)H5zv&b-O{z-FBTyOB$C~|R z#bPs2-WqEb8gI#ov0&A989dHh={&{sNy2sJPUN@eI`b1X0I^%J$#mBc**@Mph;zjf zpLC~Juj>%+dONr<+l{Q_@Wyon8U?KEJG!zVObFfYhb<8k)i_o)(JVr-uS~?)wIh^p zY;L^X+~nRF3d@m6lgu>tyA5IMCYilZ_d}D+T-8W1l6el6g9=K`6R3QL$ta*!$|r+~ zwK9LQi6h>nW&?IzyfqoaIgS*Zg7N-6Ek18dF;}QTph=*#%-p71ANdcMig-?I^GvS5 zTT{(eY$~+>0(G1^hcC^5_X7(n%%W&2^&8CU=p@eJ^%Clp_~r&aZ;t&Jl`uk9+-Np; zec-7ceYsCw|1P$xG`a~Q@nOJ!llg)R4SnKfbCByJjMsl8`T`}lm?J6BNZG};3u{`J z;q0n}Dsw+zbyX0d-I$VHn9wZH{Z@09VSFsLx1neLM|R!@QT>Fs9GN-C9PHYIzI#VZ zOPO@O?Fk&4V|Jhrwz{42j=dXqpveC^F>>dbTLC*T55v!=;+YR~Vy}ae`Q}{LzF?qw z#kC%(#P&8BcBh%?`b5zyu0&(U@iDJnaf$DHy|V7>sH^Cb$CHVIn69}7nr zqSo4vI9jXVC2784@Y^K`cmRGEOx7~@J;-yS4|-^k{>k;}LBxzybaBjKQoya&o6nAss&dk+){ zcKh99_O!znpP0#aEH2&IRJHF3nD_G*VN}M5xybDA{=PnM^xRZQSPW|tJB}8^I#4%! zb!501pX5hIyqMu(saXuF>OxcI$g#z+#qs#yUbDBeZd0Cy1O1p9M+KVA-9I#p-}gRq zfcwW#Sh@u6GrNMYL-(2EZGMS>V!R>NF`4S7F0^bzqaG2e0@b+W>_ zAWNX5F?C)FbG4t$T57IPd|{I^Gu`Cqrvj7VCz+3%>u2>?GFuugGdskx=UB4%7f>t{PF9Q;0N1sz zw9evU_-RS#FteoLp|fP#i=1#MDI{I1R_sZ80An>C0zF`kLXY3{fSRf7dw_x^X%Cut zNyk93o=xJ5BM+Jx>X92VQ3UJdvuQH-L9?VOjo4_Q^pJa8H^tnWNml)d%C3V~oLJ8q1+cPsqmQW`Ec3K?AVeA39Q4UMB&kzNcwMRs?BA-HM+y zQ`M`o0M?gmVEhlpy8mG_w>9~c3rF&G&9nqE8u1C(Q-EW7jy?>t6FZOoj^PiyTDHQ> z$#Uu3!f1-taM`m0qFO5$fXUzqHD-ZV<>{2keif4zX$ELbG zDf04T=7X-36uD-V*(}RT6mknSX0x3VOqHy#HZIj=Atyw4*(vh&D)T;<55%lCvsQK?_6cy=;ifl=J+$?rAcc^aR#Bb@u&o~u7(}|z(1O~0Fl;Ad=RZn27 z#pL}741B$1`Wj^`Y+9pCt37MX?q_Es10|Ya!juyM&UkwMG(j>uV={O$1AEoW)?(0x zNw*erBP_b32TW`gAvxQt^%>x8&H&Fn1H7$<2ev+G&NJ+G2>X#g#ROheB}^&Tq1v@l zw+@zNdvN5vMlGug&c{0~wdO2$o|A<#BQe8#8e_-aTG)>r#Pc+Uocz=9AH?ztriPTK zC8R1F5(TL~uC+W?Y1d;c6Ir|7EOB>qGQc|Z2K3?r8L$Dy8Ft2QfXPxQ%Qj#{WN!(Y z>pOqN1I~vwHA$4@jV7NurftMf>kv0*qdC&usUbnp&zSv`C1(lVLaBuA*@>4?+@0%7 zJ^lcWVeM3Yb0IXElVa2$%~&Ux!T? z`S9J1K?>+oW(a7;=u(ZdQVhmHJd= zl1!7j&EWks@w|wENUF?XBU-Ijijb_=_^<`QJq5u3mD$}6?3!N7C@y+WkKmbR}x>vvOONdy^1Bi z^PEc0kq=%qyR_p-%$DKEKug+y<7gY&>*z=AUc*9;iY`^(#AS%Q21CDA4!mY&G_cbZ zo3PIpOqe6RUN`48Fio_bGe>s6&Ot^J-vDpsNQXDT!rH*dHz0lx)3t9Zq22waT5Zex zx4FyR+adhmvu{C1yZt&Sh1<Tk7**9k-458GI6ty>zgZwurYELa6oXq|R+o+;HFqZ|llj-(g{&=C~L!}t8{nm-fCoXG0 z!cz1Fx*Br)BXga*sJ@c5yEt7{pUmF7%Zxv5WbKo}M?zPr{82`z%u?%fz^6sRdmbE{ z`B&%DI@%axvukTe!|IJJnXua|I8C%Jl-0XwRRwnL#%ci`DSG~c)lDope`@x2udiRh zRKbVpgXRAmF=JfyDFT2cbCQIpT>fPgL6l5M-)p9+-GsCSXamwVEP+CcF>ST3%< z7`^cZk!<+PY|DB4XO(!Da|gC_$#0*T9`$HSwdd`uqycNpGI@l_60yTA*gM}*qnl$r&G!NUMRFEK22D_KfK2{#V zW2IxV=?K)UK`w>(9GQlpkQ^Xeq$TR#@{dpm?N!Dm<6sOcpbAxQcKDB6#H5iwQ8JJJ?i0j z*JUZ(soB0dV_{+vlQU;#p+@3@FwNThcgPc{_y0kX0u%l)8^xYR)6gJIXfkZy&1uKZ z&I~yjjK-Y>5T=y@yb6zLakMpveddSRc&(*>jI|gg?TN8UAdvo8tH8KCP#$aH0kKyW z###N1D+0UYEU2y8Kw7+2ak`=|l;v(Kr$L7$9fh(J;06!g6c{L_W@S58GdqP&aT=hV zXoOMAqCFJ#g)+Rc^@;1s6q!00{b*2vHJCD!VC5RSms(vgK3;vbjI25Bdl3?2TGg&mLHkPrrq$Lc4(v0n5nP7s zWm_ZEVu`u*J=l>OZ0n7z(Wn$F!@k6dQ6MM4O@veMz;d63cL8ZsO@YGp%w|^ih=x(Els2=_!2@aO)+DS{2IjVa2;jc9rG>5oJ(^+7Lk7b$Eq-WW zd8U=8IFlg7Yq9(7i%d%`eDP@A^en3vq72Wn@~~U5dkVhydlpo2@4)sf%jBl&eK}Sm zqlJ360Hjk+C>N9&UaU%QiD_*e;TJ1^X>CnW1-WH$J1aL(-NwR00OZ~lbl~AyTTpi} zu(hpq*kJUh+go_INBnsJV}g=r<*Ie})WG6AD>|mZJVuWNctl-b%{v3CPoYH}y05bp zG^*tXzWQAR$+OpEL+#rniITX8qv+VTy=CrR?W;gSG`TN^ek%yzQb8_7V^MD6r5y`8+``yxAw&6 zM2dP^6V8msR)9eBURDCLYJ09VJ{q6)Tj6t z9%+qm^U;tRO(e6(N_B6<7x+|Do_5Cas6N*HeDseqmMdg@U#ly|isgM#C)n-%tnuK> zqy3;f*Gv4xRyA(RFNX50lT8<+P1j3#iPg6SJ5;FrT!Apha|IXwC7?>}cAJEB+k>G) zmsofqP}cUh_Tsj107?MU2cQe1R}8e+aODG4rIrn}XbbKeh|(1fuhU;@9YT(?2Z6lx zf&GJ!znaZ*>e6QE1X$zA-$GyPZG%m)gTBDKbcgrgf$*RqR=)<#Nc*q88KriJC9ZK$ zKRZ*JNy%l_1oXD;m$A2ju%XslxNW{1y|;G&pYZoB67RbPJ-1d8uVn|89@j$9 z*9TT#YvD24df7J$a=Jb+wiqG;EE+KY=+QCY;Cks(f+VVqhT*2R8}2Q^h_YS^$67sI z*Fojug95T>to3Nq@la`%%Fu?+ zW>H7Gl{N&8NB`;n9bTu)z02@avh6s0u_IGuQ3GpH)C|_Dj8&VA%vhxOYKHwL@St`{cmurF)3w@%TZG%q%z>e+Njl3oDPp+f}hWe zCC7@EUJr39k{-NGmGbMYzDiN!n>c zA-Q0iXw@VuwY8Rxh>1`TGjAisZES4fPc(u8gXh7Ml=OQ_twpYB&H`g^%ZF_q6RbqA zcxNeWxP#)EtZsuRTRC=x)7;Z>=fF&=zQj{XD`O&0*Qd=+erVf06sDzv(lW#0Azu+; z7tMsD1n91NJ*1r%^I|b<1I+{wGzES5pmd#Lz3#dJ3#ls`XG=zz)d8>pWmZv(nGTV& zLWx9493-Rie!!RyhXWn2EnuN#@&m+-L%|@Qbi6ueSXD+I z;1mLu$9T*yG(LI!JmQDa{Md<;*$s%k4-uG%nUMMPn^LnG&(s^;;KE3DE;f3t^JD78 zkDavPJO1avu`FKf+;rRkatqR{*+5btzrwnpu`yT*t1O&_HV0#4;8rV52F=BW@tHSU zn+z$d1h9K0fQ#sxN#8p9j?uS+KB4b0eZ$~0dPr?0ax18^;*HB>=Ugk*=q@`6Dg#JT ztC$yk!{}Q_-%R>;&?odArY}HWGJU(~8${nR<+~NWRFYXnUw8VF=^IAhI{0uTW$isE zZzcf+L3U2{AY=bnq=~7~*E$0^B0{0`#q;Zx?+#=sQN=Vfuu=eTNspw~js~B0K0yt#9V;_02qtzQe56O!`za%N*Uz0s2(q z?ow$P?^wN0iAXX910v$YgNQgnphRQ`L?p2CUfAujj)~_`6n4Q?pbB+c5H%+PYHkp9dj!-SLDakm zsQE$Eoe@xX1yKtkpcV#EcSk_o6GSbFfLa_x-5UXgw+2|{>If)&Z;_}a5l~BmD2aet z7DPP|0rg-I^-u)V@*wKr2&lgYQ7a;#YJ#XoBB1^eM6HZ~dNhdoX9Uz^LDZ@UsMSH# z;}K9#1W{`upw|rPqR}*CU|b2%_E$L1~WuJBWHK0&05@^>zf*J3-Wr2&kPw)VmQ- z?*&osM?ifLM12?m^-&PDD*|eF5cP2c)PI7gPeM?dQG0@@|AwG6H?S*@O}RG$YF`lb zSqMsJ_<0cZMFiCTAnMBylrHP5AnNM~r~^UNHxW?Z22lqipbiC5-$g)uA4DAvL22Ua zf~X%NpneRZj)b5z@kfKGpCX{}E-86gH?*mlJ~1<+XBfts~%YBAAki+z7a~4z67YPRmPs2bUKC*TKQ%N5FM- za0MYaO=qEl>l6Xk*}-)Q!D(8$I=F5jIGyKN4z7CyTn`6#b_h=Ad5(kY83EVJ!JQic zcb_HK5g9Dk5Sr5g?P1i+xvesf}V(0?G!(rihfkRK=iBNuMoP%NC&D|3gemk&m zEf$sCqfkSXA5|iY&r8mg_vb|SlMyvZ9^=mH-K{cY#8a^DU)bwPlh?=Dy&7|=;$pZ% zKg-KcSx;elT=jfPfiX%7+qzO)Pjd3AaPBua_q%Xs${e_R0(;hB@mkHD&YkoWa7)@=SBAUB0j`vhpW+yug4uXw|AkMnq*1Z6aaz&~z_Pr{ z;6?;SuE#PbNZblao0d5VHHkBv@J-dVt?>T*zZ=Kf_dB5FxHFe7aM#H34c5G-10B?0 z=gt)oGVf}fi;5nJ z8}}kO8jk(M|BMwp>Lf;L-^Q1~4mV3q6nuRXXZby24OT04DH8vzRp6|O_Ieg;gO^D$ zZmyvaENl&x70+T_<8shurMquOu3W{vLbgAPmA)%ca1*Hw#HF?vMlUd-yFxi}W9;FQ z8NkBwoUNEI_O6YKH?Ee#7g5l^WOl&nX>$cJ4bl8?yr?}#EZu}9Y+|^i?}y_>%t(dd z>K31~`{8&Ib4`7ka}e^w@gnA0nXm~DB}U1iO`y71QCU4!{eg#c`c(WBBJ5@2ec$JyjVp@bsHAPa^yF&K8VzshR z8LDC~jVf72I9;~Bit{NNZL-o7NvxnBju#7_A^To*q$UADKO8TjZm6f09mNmFiM`sNemGvl%&EtKqz0I|^%%;sAC4E(+)mNRXw60?NA8GF z8MY5`^Q2}gsy$yej?PjzeTkW)-+jYNK?#KnB?uCHbeLVh@2#M~qC|HAOJD5x|i0>Tw z@ginfJ?1im{BXR8c|b;P#bf0Q;bk=*lyY?G*oPGTN{cR6UZq7J4rJTD=BEi%&7XW)&r^L~KIU>1wjG5L@Hcy=KKX<+=+m@+%fjKeW9>cD`oK zQM&Px!0^{$>llwp)f?7`&i_PCe#GQ%CQR*At_`#*G%TNiP&UZ6$GkGN7v90oebd_H zZdCu4$bmPlO7|+{g}*4bWNwN}#rGuU|JxeI=j{KsdY}Dx2+7pi*>J4*6Cnh!@~l<^ z0%Z7GR!?J%-2ax9>ssrT(Ph|u_WoN|pI8n_?WOs4>>YR#Pv@*vuBW_`<#zi{J6WDJ zV8+3nQ6(%cksM5 zxq9cUoTN*E8VSejQt-7Dt3)a@@FaW94yzcShr>jNfAdVOQ$q>u()bKzK4v=m>C z4{^`jX%)8Eh$nt5hf0rhkA>4?sv$cs!RFkI;%G~L+i9gGad>El2qe^y#bX-f80)0Z zyH@X5Vi28P^-x<1-@{i$*1gNM@An{fwIOXwnzP~RBNiA>OYwWyR}_{@KiT>o^hiJ1 z6TBUN56z4Ry6;;@I&KVm0=XNS%* za`FSqsxGTZOCpj|c7TryrD{c77iGq?wi!})${b~faPIA68!|n|MGYgvDR0y&ru6y9%IUTd#jr@WgGO2KGfRdk zzRZF}GEA}(WoseMblLC`o*m(!zK^VolxF}Yx?Zxy<2Ud@`d!$ow*9Itq z%afW_5=}alfH{8Z2HHBhin_;=C6pY-XIAWLj6=c+V?1)4@kscl5W;mC)B?0lOW**D zQ%!TOY}$=2NzX~*$JlH2e4y9IR!$?e>)q-SqmELikZE#i1CQ>v#>aruiQlO0S2f>Y z3m*%QlG+<^O4SQqwJlrv-pc%jg)~>uUah-K-A>ihr1?rAsSJUa0;CC%>cE~ZSPm6~^IoPTA20>MOAhbHiG1d6D_l&howtHh&t=$~^PwSf4890W)lWgPlj{q>k z7_rJ@V@FtEt;asdWBitxHqXv^*0!q+*Q;Lj5?)}9&yE2wP@8IVpJbp_Q+tgo>$MPZ zq4>NW7JftO((NwBo6@Se9dP~ID^JhDS3lMy*&c~*Vb4W_%x__f`z<7+v|)coOPgEv zX0-&JI7z&veS|`@FvsS$#Em)jNkBKYvKx`?&8_X%QQf(1>}{^5+mQtg3ifjfYbqSG zd{~Oxp>_|;!gh9n@wRMkXOBXtd3$>jZu8sQf?H;u-4nNwdGhCTZY2pl?B=qPzPuiGqL0OVqN6#*?(xbG z1`bI-*~#WBQr874=t~$JJ((yP zi!OOx?X>K#oNS|!?RYrypS5F{#eRKSiUT1j7~`9;@VDV9x*ZIQaVRYOT}T*uP${zS zrENFJ&|&G<%^sRk=fu!F|3TJvv-47Z3sau1 zJb3#hc>6VY`z?4o5xo5#y!{cpom4j$B&=OGyQRx8<$><@1(&%nl7`AjbXYhhEF2pa zjtdJnGUfbFa9VIt4?EKpZ}MmfoaT2n?5sIG>_V426!Lx#yOpc)DTt>sAuPAVuy9gX zxJg(zIV|i63#WvIy$!=%qRfVXC@U;%hlPEnynD9Yd0Z;s9D-?cutC$DFzp+Ln>u0I zQVch9!W^3!PItm=?1^wx=~Q*i0jGjdJK3bX2aKc2bL{xmEdb|8Py|P#gnC5h)zV3G z5GV2DJh^MJW%I3b?6htfP8phpOed_<6YUN z{H>RbFS40>P{V648G%oF*~N_-x6%X{)%rO1j4N;~^`t)bgvPBKAf@a;Qexm_AA2ER ze=OdIAuJ;~$qKx1k-a+xiu?Zl_AsR^kxCJyl%)0tVg}gj3@?XC5}gG{rnNDvKU<6g zs|P~o=<{y_g_qjc<)3Q?vIg6i7)foBpkhb0ybv8|+bfYZcbLKot~5j5ZNA#Rel*x)JVQCJ~6+}d0VXzI5uG$IO-~1q^v_|x&YGU8kPBg zX+ufx?bYch8Xf-vU+@?B!av7PiR$#{5u!T(1-{E);Jb$6#WNeK| z%M?8tq`;@K|1!lnp(*f{Y>T?4o+xaHhhE3FZXhJ_8ao00v}+Uy-@vwHKoB%M2*UTS z|FXOb8f5Pu``0P@G)S@de@JmrgB1IaqG6@fC&~LEk~Siped`yW4!Y!YQ2*0G15O7G zJRNjt15nj)J11!nK&Sdt=GAsa(%=TM)PDLQ4L~a4WepORZ)uWh4+W^c;h+a5pwncF zr=2S`|7uKMl^O$xYL62TYKlH^?2nf>C_t5YMFSAOO|SG124t1u$_C|orY2@IKo2_| z%_F;cvAp4-=%qh4%1I&gs!*sXW?T(W!$y)V8|*|%7bGZpsM>Z%Dgqg&P*8#c)jjqLr85^LVD7;hS9;%7JP}&M$NUxzOG>u zO2~MCPDzOW27Gp>(KRWpDklIQ-rAw+a^hd$um21Dq(8@Zj4J)}2vL(m@xdc0rvTKj zHIvFt2bDJf)m>xvPnrtQsZpxmwU|{*!^<>wf45N)I6B_`E!wD%x=GMW72+wiOK_WB zYUjEtO!@3xSkQwe!$RLtYWD*oZL*yaTY(I_N=>O<5STRC_8Wk&onrS#ZpWu!?u20N zRJ#np%xN}Gp{orHm=4_saN!LwJ<4X_l>Z7Dd;`WinPGQuGrLl>V>9vG4g41~>;b{J zBnZ()r~-RQ=43lndCz6p`10KicA}dr44j5m1Ww#wZ;3&Q%{SQ#)DmK@447?KJKp`X z?RAcK+0CdbP9?k99u>!h2@|in{}a~c;rDT@dhc88QYT*REtq=tlQ(X$bJda0Tuq^@ zQ5Sr32{)PZAQw8aBKTZ$2u!ZPQ?LMskR8x;rj3SnF`x)66}s3(Iu zEe`vrvirJuMo|Hy$ks1xd^fnt9&S{USyV!NHrX1E(*#w2z}uYxKIjba!DoOEIRpH% zsHn<_1rI$#g5hU?UwsBRS5_lcY;rxkvSE#<)FT?g%gz8VKLdQ~8Q{~x;V3_fO;8bz zaNyI=0H1LN_zh=(&pZRXa@H9Tx1Irh=NaI)odJH&8Q_b8aJg=-eZK01IG%RC(;wr- ze>*z!*K_Sc^uM&*?Ht^C-EQZqh^Bbv!9=Z)#kXS;fc|;A-B%&9q&bo)Z)Pxu{&(1I z5o7utb{7S1MKIn5x&tdhcxroxN}o7S-FnQk`vO=skLyFSY@XfUc}aKcS9s=fa-Q7_ z*k1GPbd^&fb0S$)^Hu7#^X>N;y3{tUB=&~ zDp#n~i|j$F+{#lVV9$K8g|{xUhbrV1 zvK8!Bk0dI@zZeT;X#T}^sw!#u*^Q}l#=-XVEzibk_)TxkJy8F)Xb3fK71D9 z5xWmoIyXLoj#-35@W7eO_JZ7)F@JhsI2d4RbGuY1juZ8;=jyQ@9C*QY3zyYLimEvCo zBdH1tSU1NvlX>jQ;SWM$5CI_`ju&PI$7hgT-C7jy%gk4Tth4J3 z_dMjub+>d`_B4hCe3)Q8%&&UMz`<(xy4I)@cnfjwdOJSCu_(va+cQI7?S5o~-7;xD zat*WB?>rrJ*Xf`I4MF3rRP`~#vhgmger-gbsFSU)C+4cpW2!?Qr0~L&^b|@qnk;Is zBiVJbf1^Ffy%4zt6-}>a>=mfoo@eat{G`t4F<4a1d)A(>YKplOUcRk`YE5|>8IW+@ zLcOKtw&ZjvsKZxrlLL^OyQM0Caq}Ko9LP zGl+SzbrU4>UfI0~op!bif6gA}zOSCFP0wLq!NIW4Axm`V=OK|-O3m}=b+fS<($2AG zBPvbnEI7^3*>e1OdjsMZZ>E9pg1sC{0sfWj0CjoTNq{xMcuDpcSp0v#m-Q}Cxwj}aJ1&*$tR^*;5La;I1uyb{4Xh5=zZ;6&wYhT8fl0a~4zt$Fxfw5(mi0 zm+f44JzA>H!?)#Dy^N|Kls^BmhjwERO-2ebiWe0wY2!f#K-JGPSW3M`Aem3NQmeZ^ znJI&g<8vO#+iXvgph#xKhy$c7eQZVggP9$o zMKH9W5`-I9XD-2psduqA`KIl5V&y6vY0IpAA=&)hfu)AP7CErA5ZKLtk#MHZcHnH3 zQBK?z4vd`jIWQV-x(bQEp1e{Oo)H54K5T#b&am(u2y+Bup>3UXEOZLsAS=3kpBUXi@z*3wG+!G&1@28Rs^SO zrVCmHyw)F^rD~_0J5CqGai&j%B&(4`>tQB zzbb7?>ARSIQlBQv;&(AQS%b)al*5Zn!kSaRt(C3sVsLs=_8@`U2*Jwbz;V)~sp=d?o`*w+IJy!L&+O_3o0&qYxPpMD6>)PQQ{vpB~8xW(jO`U4mx#Mu+@oLdi#3 z%6<+U8;ALj?e3wsy?)H zTW>;I_G&F`tc$i=hXYOyRm%1cVG3O@bsySY&etXXSt>RxwXT+wP;Oi$13t1duKTNO zSTM67GoAyHWDc82SB5xR%zijtn(;&6C*#SO=S_KJUbL?pRUMhdA&$M2^2N6F!|~E- z*{)2>FwDb`v1ao6Qhe+Fw~uTq1vDrz*AcFl=DY0fa`+rqyv>Z6NXt(!g9*Frj7uAU z5QPnr4ae&~IM#=CjfNx5FQ6O>gdV?%W8;tyn@xFm4?a+JWEae3Ob>S3IdLx{eqxk# zN^rHTUWBa#qjqB*`XwCi3iA`k$?dj#HW1xK<;xxwfg|r;_*k0iJ7bZ#Qm+B+4+hp;7Fupz_ zwg0gz)S2;`8Ds+2kQO;bz5+kxi+Gl)O|u;M$%t2__!G>AACdW=U?Tn+Lpe#DmuA6{ z=GVou$4*b7B48dGjF+VWR{BAASjK+Sl$1l5HVn9C*-ET4 zWZUQV*ruV3(pizDBB{DPIkh!;)c}kztsy-+u=RIIO&S(w2K^H=s|8=+S>5gsmN0)q z>Jogxjc1R@zAx-_b;KeotqJ2)n-_`1nd|%Qj7rj;=YZ(%06+WmcW^YNC>jNDnmQ`o z(CjpY#E0{N#c4_4Jd61;Oua@DfR|_Y+jklV#Q!B2hN=ITc18-5k!sBptg3!#&+PUw zz-(dWqGSnSEja8Y)IOv(6HZf`Fa5qkj{gZyDzm;qkNM;@aP3!iY9$4j)nxe;gFWHV z5Y`2=TB&flK#HI4QPJ=-{eKZ(SDATJ%9%GSqdNxIfO+L$UGt)^?I9_jh8HTNEi1fp z?L95pzOU^rS^L7l2y2oRsnYcTY@g4k;(v9~x!Lii7t3D7)(+`xB^B&v%&UQ?cdB&hOB^ z2 z2k%eK(pDysY%Vq>n~q^7JYN=n51qzV<)tl@Liib_o+jD;J+wbbB~Kh)d~avCesIat zyYXS#E{E+j%smDiw&&os^DvnHgB(9>kEs9rIPZYuzWQ(u&}Q!%;!>hts%h z>2M6smNJgn@oFxTrNW(tg^ucUuJ zTAJ}Gr=0DwWwb0&NG^h7K8%A!V2=;W#x7sHGT>NtDjdm9#0lJXZW2mWyS~}6u*%!i zmnSF76EahlqUz*M9vrVbrLYlR*11pSdm81n8v`t*kOeXZbGZmG7EE2GVeN3Rx1HN$ zDAq8vs)AUKp413ic*_&gB<~m7Q(1!*jPQhG0b}Ou89K8o0Anr`9$u8k(86}`B@@8d zuwYVsy7|sx2jNx-{PJM@-ilqikfT_z(3z55ABHVxtP2a@^_#pKi-q{)U+w0u2Y!*P z7aBLq&J0^X*n1pnHcrXRbjfj<+zM}X6}->{%b9p9B1ra_dqeHG^C>h9RONuD)lu2ymWH{OCLqz`Q0AhjxCn}N10Xf ziF-U;7F=^U$|d3bq~>=#cw(1Gk#d(W-F*tf`8YOkc>b{83R-d*^4lM0QVa#s|D-(_ z#XDNzm6I52zFN}5HwrK+gC*;H#VM>gc~ei8WEwtx%VMPA+o7oFAcZbp9*Q05^6kQ{ zYcxU!r8wGGiQB$tUxx9`(iqs#Sg{%JPm~7 zdqmWR2{zC!Xq2w@xE%)glt|UZ`!XUZ`AoNOW}8s)(RHC3r25nKtWzroc!}WQ==c<> zb@nJC$rQY5==SxFeFTXUrLeJYJQ{CVW1o6byUtFf@=(nB0W+d9ZyWVqBRPa@R34Pw zV7oL=@by)u0**+)XS$>^0pCdOE%OspW@{6C1rV@33BC$rfecRct%A%PPxN(1l)@wc zzY@$aSnL}~z7q8TqCQgC1Qtc_z}O}b&dIDQ$5zS`HHYq0q10%mahDRCnsG@TyNwzP z;lC1&RP!Q^TMk(pw(E~zJYk!q(Bn&Onu{PW_5!V1iM~;aJ*bWvO9Yg+O#y+ZYKm_~ z3c1f@ELx3y(!=Yk26nqwb)b0D7n~~UCSr!CwF+Q9IJOe$IuarfcvaK{+jIvG#9O|Z zhH(^M0rwTT7eIG#sLYn)Uh(Pp6e2z>nLfy6Nh6<+&nb(2I6VO$ukoRm;v1O=wHS)% zj!MbtmVmZeG z7-q-o1N9TreWThPN0q62l^Vj0Y+@JWG>8TPFT&I!6wKswUn?n_>Pb}J=B|8>sstAq zh_+X~Nec(x=i|i|VyiM2Zd0RxF@A{yV;*Qs1!I@t4CHe-w(9o)FkhynaM2cFwp86{ z*d{7-Cdz~N?}R3;oHl^G2{-Izva+68`QN+KyOB$&9nFtsCL zI$l@!8IMw}|Bk5@;>l1gUA0VexT?z#Z-yaGn7g$5zn@q14r&nL%h%moDCS$vGTeC+KkqHka@67-CZ?p%uiQVrzLKD z3O4caij;^l$3)a2I+4zV@u@#}u~6z74j}}Q34Sb8~^^l$~TyNLVaMxe+ON<-m~yU2KCkkYX(MG-eb0rkX&`&-7)x z>)9{y|F!WD4-0`!sh&9Eux7mOgJTKNl6k3_9(MwMPn2pse&pfiEZ?Qfnm?UNGZP@>CX5mjg{4kmjv?>1UsZt`7F9 z`e{M94oskcuuU{9w1cW@NI8f4S0cUYUL|X#z2A`Vobc5?{4k8 zC?yut6;hrD$Lm`uZtcr)$Djt6Blw^!Z0*Z6HpoUmC(b5mxXAr+aO`2M0~Ie@h-}dm zlCdPi564ThD;j=30k|}*Bm8~>a0PkdZ{y3Uq~6xOf?$Sukr5N&Zi2fK&W6)%8LH7( zFLs?+REFtErq*h#9R0+{MZhD!N+leWh$1)^M4hke7b@wxaEb=w>cYSRMeKwS7$uq& z(7gK=Ldq)#PUjtL-SNSQr1T$fx)3spg^-{Qa5~ZdXM&b)#%k2wTwkIcIxuSbjxTNN zOEtciw6?yCmTc5$r~Kg#4dh~wHu8l)59}WtDruEzq_?Z|*#&HR>HSQer7^Vru zDPuO=6>w-QRUYHDg+DA_%le4yeQe%FNKqe2;@d&Z>9nEcvE#-&lAvBRL^ubIaW=@v zcD{_(tbRD@WCz<*xAAjQ)6SRLjS7MWk$^MdhJ@kRRy^L|HOr^Y@FAscDbDj{R5B|& zEc#f4busMEEG87j;Vc|R)e}liX#7ZdIPp8y*GXrHQc=&6sRd<@wSt zB20pYHnR1r5$|1 z?uP7{Nks8P&-%61%bUHAWM%U06zZ zPu3kYAvBI0>WG=l2B|IZrDt;(BCR=ank(=s+Sy+dEg4ea!VLIMGk%~J3`Wp=iH4sE z+2JXvtaK!Ds7%|yu`uQnEdLyq&nvY2Q2mRp6Opc@|Aj8Hr%7nlQFy4L)9gtOjU(lS zzEssnQBu{(mwFYOlb5bBgUs0znkpn`)|9o<>LiiLu)4Q+-x5ms+_hEZ)+v@Pd$ZLs1UP2ZI{W zb-4q#!{Cfd7Y=8=2nV|=PpinaAq94JB62Df$_UChGYE&XO$g^bG(KT;w2DLF9XKT> zf=@|85!5Gy^GP`2p`6VR<52UkaAH{a7@i?$&UbY3rD9b1qWteN%1-&1VkO@c- zm2D`Y)Fp&dSA-L~IV3%G3*(VgKs(_pjo6T8~M3r})t%q~uIgL!KI1ShNyoM;ULOlM>=

g0 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

Cq4r#fdKUT~r<9+? zObzPcS(NoGQZ+CeFu^SISu@#u4sh~)s0*v#fEqdStQqH98Bwsq!-_7?N5qgWZ5wyO z-y)LKeTL7O=Pzy9!Mj_p&WN$nd``{0b-%5O$g*ptS$O?wfWkHV3ys2S8im(}h0&-p zSYsXH8(5?4d9z=~_2D3g8QU{2emW`i<MZgc7m<{DK+#I#{)T2N{R|LuklSBEl7<c+ z`!}VZl}6Zrm`G+u*C>rpJ`!i8l2$>xPn5D%*tCBcNkd{KyH??J$}0eAdu^lCBy)#q zwK=+NINt}5hO}%zal>lx;Kqp34zD)zeSePt^?AW8^t~DZLY=sU_yu!N_f3FP0dg2- z12-eg4N*`^@&0QFvr-RSkS^<1V__g?joH)pI^r6Tp0dX5=i35Mh~0t@<!xVM7MQh8 zF%3E=b*-7xQ8$lS3gOO&qr|-tS@K$x{AL7bY(7>Rcdmt8ZH=fA`%Ac7BLajM#**;3 zn3-q24S0B4|A95z^=4v6*4&uC-$7coo1;{)-L>n?oCtp2*0>t1@~t;Jbbr^WhW$h` z&V{2TO07u}zt;$j?Q-XO98lTe)Y#Cy8`qnIGv0Snb19d(KWLPDr=-7V7MZ&mfj^Xr z7tI{=qcaNK3~)p<b|Xos%c@^8SNT3}1jz~<c*&gUD*puV5O$6zX+=%c{&|l0J?Dtu zd-nLL&Hi=v1kFA@NBq8X#P1J}7vplTpVsu*n*8r`#2+|EeBC+X%RfIyg8!T&{)=<O ze|h%!@@D@%dxB>FJ4gJ%bHpDyYdj`xU!64pPEegA{+n~eA3j?=>TmY#*%BcByK}@J zIY)f`S>nqnSKpr{0pou-NBq%q#2@?p_;RIle*FCeD*mT)#2-IL{E6R<?-5jbKmTrm zVEixP@lvxN8b9S#)9{@HJTzQa--r_xdc@%<a|*EyHj_F#5FY(&L^K|8Opz_GnyKA? z3x_*ukmfDdW%y&!r^C~Tvc#!mL%0Z@pG}gXo6NZGF2KV_CAX7~qY_mQi;DsbB|0O~ zyiF#)j*2Kwy?GlQ0fMcM=`L#UwTQ^Ap3TkK40ud<dQzt?r$Y&-C&Q`N6P`j)Ns?@T z&FoO_1^jGkvE@19W6u#EclP-6n)%M2pjoT%c*PLv=yp874Sk@9W;6ylO*F$xXkxIl z&Jk~)Bi?`Z`0{26XHU>9@f`6<=ZH@}YdjQR>$4_+^?Z)_lyk(Vo+aKT>-NXQsC^~! ze_NTo1-o1AWZ4$1Sfm9*=|L|e=(P`enL)2Z(CZlVIt9I~pqCx=ItRTj(*F%i=yIg? z4eYIU4SL;z-g!YUH|XVw|4mG|y33$9%^uO`1N&5|ALI#Mozw%t2+qQH%x{`;-Flv- zk<{H6gvSRp7xVdgMZizJhSp<VK*gq_`$R<df4x!kg%Q!S8%Ot#h~C^ddSFEKsm9R- z5z+nGF=426yEr_$3Bf50k8fyFw?X0XCh}bp9v_zP(r|ba`38r_hvgd*4sRmgW#RE* z`7RHKH<52>cziJ5tbds4<AwoFJ<k~vdw#eR<_N^_6;4<$tQ0w6J#8p<!l+WsN+=gs z0@g5so%#p5;wnjf$Lw+O2*iZXtVcEqU)?BtO{4Ir_^S23Hd1cm&BoD)JDaw@HauQR zZEP~1e#cDDxDIf(Shr}56V@#nD+SxkqVnq<aCamnA#QNO-JEcV6YlJUOPz2>Cp^vx zXE@;-oiG>FS>AXj%taxFCph7RVEE!@H#q>^GdDY7-7^!Nux`gBC#>6Xixj^L%HJww z?_yDDGGZHM#WnAmJ$zFDYUrlAcg=poZv%+)$|2}Z&b{?K3V*5*f9g5nr-jE?w`!gu zbKWzPePt0f<+byrRPC$97l!XarQD9V1|y>2BV3QX^iT_b`#S&+XO-!V!gt13eVCjm zMcd6ouDb$#c9_##?z`jVjm2I(mhis$mN^3%$RDA3bnpzqst>qI71;5CIo@sZ?sjgB zYaKaN3O+P9Sp*|@h`pxbj^8PEqDsys63uo~rRPUxrUG+yq5(V!;0sv_Nge`ovWy>B zZLWqR=Wu&ZBhipfKA&tSs{C9FYJekvpUzKC(fPT?(~zzKTW;rs;L?9Lx}66{$TKXa zrKGpULVDG19H_w8(7Vl(1I}za(&5MCqv5WBy97?x96^ujPcR0l3Z%~`IGK-Kicjzb z*i@PKPcv6tY@UOx6bX$K_dEL`%;L#;NwWW+=2GuWke{mL4^puQ<=i8C_h1QN7NDAm zhe+jK9K>5Ad5b+clKC(5lxw!6e`@yd@>NT&(q>BD;Mk<9$<vL%oKMXKQLcN%_&0Vr z?h6e0w`sc*%267tWIrUs@$VslvO4pd7Ve68b*>;V<Dhve8kOAnE!Na>1IxZO=eu0F zl6?f*3~K^=kC@-M-1o=J?NPC9<iPjX&{-p?KbVE^N`JuK#u};n0jFjDDA`9Lifd%Z zQS%7$^*M$S8^Lu;{5ewfBaWh|g#G0BkLFl~KTzSVD6ht(1!n!k4URQ|UB}HMZr2>C z{RJh?70*d<d~RUoNpn<7-velhrsxpaA8n<W4+5mwn&R9{@)BAk`5p=fOV<|GWHe_< z3o8xY#uip@6j|TGdZz`0KC7f-E^<<%WWrHdOoG$m8j6$p?bu35+vfJmw2Nbn1X7ba zZ5}FXKx;uOE7N=!Agy$QXr=!xI>r1Gz>(ONW%)A$@$uGMpm*S7!zy=~^O1<FU*ulZ zSu(-0Ci@lujDHSjzh%uzScouFM0Bl8v8|=%BTgZq+VCWo)!SU;fEx-b^;<K1l?XSq z;7h-i>w7c;l%8NE`5pr(R9;|Ef+g&*{fSnJ+f@}fk!-ybrQU~P!!@Jl%H~vSvN{D6 z0Y;LRQum`fB`~V3HPej;b#|p$W8915gU3^brdz{WK92f0giXp9v)F1Qo6@bl?&^5C zAD3FlmJF-bE%CB`p|4X_`4FS(G#(+_(%w20{S{hbNyYluw7~XEtEbDm1my$?>FH<{ zx}K1Vakwt)bVuBWKe?l2xW9^(dpla46p|#m9uC;Ie-0+z+0jaNEmeO9ka0i1=-i)W zErmBT+gj>g7BA!axZ1d%jF*g;W7@FD;hn8VT=QjrXDbJur;Ekyf<9fW$<8OO>nbo* zZ|P!r!o&H6t#GeE7i(iXwXFvPNJuIlY7?|WH3X%1KVh|(14FSRcqGR<gp&7mwX$5F zywc6u9p!#1ULO6(YNyV4Q$;YZ?l_iv224`BTjO2x0~Ot^BWzk(533)LuI-C!3U>Ce zDgY|(38`rS-C1>Hr^me<&BdFq>cAGBa=O5J2PutSAo6@cSwm%cFKdvyCSKjyezKR9 ztj@!!>ZL9{F-xYk#ziAVy{$v;ryUCZ1^tUh<78GJYqfhtygdD`-A?t)nMjZAtB?kk zlZkZKe%3zsGiS}wzrR%!M6EEev%eMRcK=neQzto)7~`qR$1`L_-+?Wr6<XP{^?U55 zZaL&KWOBZB7=!8P0t=t=J{PFH2x5u~3kt1K?v+6mDlZjUC)n*T46=H;p9dRHZPi9j z4+7iZ{kco5p*M1R&s7Qz)EvjOglPC+z&La^1?RBKPNZ5QCo@kIO!4+5)~&!H(EU=Y zh0Fc7crnKriGiZQ)=C$_KM%3mx!tQEGmk~Jksd>>N;K-Np;kU)C3?8^i)-~OS6Fjg z-WME+IT%<_WQ}oo*XXd+7h6Y|`tvKTM3a(6sU~VfYhb{06}aSl9*Xbj!0tj;1XZ)f zJ21vmxR{T_-&*i%e-p>s1M@~$B`&pbt=@5lwtX5b9(%PlNl8hfq(6sQ*rKZ~zY|`4 zg(pqYmf?87o~x}TVBxZBtXWa$<HOflS<$2uZgYulo)+kRot5WO0Jr3I_9O-7jIl<# z@kzRLPxT}Qj$Cg&<8rTymk+ON)h_f1+I-nuV$DKneM-^g>t$o9m1Vw&7Evul!Lb!D zNqwo6<lYc3uCMTJQ`$JoaJ?*f<G^aK1fXiBxk<3^$6JXYw`T(A$?#1#Syy4e-*}TH z3|@J&)x{m4py2B1o2^})HfoZSc=*xa<_N`FwJamwqZ6$c$%=fXu4IyWrEbzBYp9Yl zlz<l{cU9uri|sKszM7q6rMu==-(t=8{@p3vxh!YxE!G0ptJ42gYpHirD5~yOYprXu zR8F>dbmA>~^QG<&RvHm@-D92SrIo@Cd`*g{s6=z8Ko)UsVG5K{5G!wKXj8KPZ6FDh z%O7#zV#RG%jr(;7UnR~`luWfIn5wT(7MVgZlYBhY+T_|ImD8-}+_g{-*ZVt3NtsnC zc4wSfj=3F!=0MqTyOr;L6AU!HWgDDov}zS&;JtObd78vdw|aWFYD!98DxWq^i;9zJ z(=BdS&z)|K_r4X1ub*z|^Ax3z_;O^_omPLg_3=Bci`B3aE$gCj-uU>P$UR@;?ozGn zd6zX9WzD_|I&)xPBZ02BrS5L4P<{T^Om>}z9mO$;QHG3|Vf6<;SI)4OcBBQ`&S@*# z&XI?0FM#8Zbp3}E&$N<U@5rQ?7LRTB|ARGMvie%7vb<|ck9rMA%Tz?q+=#Rj?y<H= zOn;=!pJh#9GhUcwT>-RD&9Z_I3?@q6?JZNPa(=}7*|V+1jzlf^7_7ARTN|oyiZ3oO z>RvDnio<AEB=6h@A;RN~_gOEw-jmhk)^pzNA?l5-z<4-cAb>dGe!rC+l)lIAz-FhX zd0e36e)M<~y==^d#+e^jJlERl_U;HVU+F_IFXqb$dJCm;o;623SB=M&HbVpCK5S(J zk<kxhsKG6V4_j;9-uFX!M=r1?x<81Q?pOISNG`zmIA69cwD?%l;f2-+gbE(PsJtsM z<q_n^lS%6qS-rg<h4R-gQiFARrIqF09WS4KV6~Hpl~w_2Tv@4VJX~pQYVQ8n8M8hK zPSW;0ZtZvf(}C>?!oI1t?sV@}!(=-t7i*aNUk!n-GON%`RbOg-+5k<KX-goE5R{&{ z_RN05nt;D&J^?*65Lf(KlUwcsqU4VK@p8+btzIoZbHe|Qm**Ki;Dqbq<tv6icf$XP zm(EMAPf<+sWfs39*}qH)WY;IHhY;HEq*dhpB3`1Og5feSu=puxD){xwEldW$-%nd3 zt_ZhEw86+xAQ9+r;0lK&ARH2ACobHy`Z8$ARh{k#R{M+9L3)>2$yICf{IdKn;5i&7 z`HMB!{Xb`b&Rs!?4GdbLunFvX#;S6;4?5#)`Lob`xz($|dCQ-*3fza{1D`)@JqE=a zU-ic5M4A7*^_KhV_`sEagVObV1A5?}LU^te9K^}F!$A|}i&a*tEBBSvZ21})`vUBX zHB$S6H56Xl8pRa-*H|gQZS)!l{TiuRgVA$fpl%IqVf4~Er4ee@afTs#*I7l5Hmdvs z?p7>ZPir7Bc0CMT@3+8!YHp&`zGO|;BUL;OF=5%q6DZkWy%mKLJ8Xog!MfY1bWHl+ zt<#j`j90BrfDU=p+6gatld7(G6YzvEY_c-l?(eWh@ER<UBk}U{Yt~Z=jribQy@A)Q z(e8Q}2V1OHz2AqUkreo5i?vG)Pp`dU4Q%;?6M4{8^~R;`Wcd&aSJ@aCYY)5;6DK3y zw33O;ZEsrV1B;qBA;3pb?JrgrS+v#alSpRak3*LpERR7`-{oo_IK9=Xb9sN%6-es4 z)_4|n|GU=Bl3VKYw<0UiaftoN87PkY!&<;p_r7Cw37PBUJN`(`+`#5{tWhrS@umuX z(0w9UPRp<XwA*{uD^ST_zGoGBe-7o!+is<)8#{)`$nDl(?=Mb_>Mbk-Z?^`yo~qtq zjflPhwYp{W4j2X}k*EMcT6sj~2FZIH9QoW1Yp(ZHL;*gE@2?@y==ULqPsz&n(SbKe zSvmHO7JXo)yMKeJ_JP&DEmNNkD_om_th<Hms)d!F@&R}Y&kcWI%~A(DXf<fz<4Og? z`os;xJ*0Ri3?%-UDz#t2M98|z>zC(tT1K=BrezAAjdUlu+)}p7%5h`pqJb98uRxng z*`IOjHRcU(s+WD!ydiaTFm;PyYOhL7Jf!w!Z<_4eWleD7Qoj3lS#8|7%ZMf7F1V_3 zPbSKuez+1m{|9%RJolkBiCt`dWZmcTO65mEb7TES*5w5M`jIu&+Y(ihz_>av73Lpo z_hd=?6ej!H-L3p`aJTibnuqd~E182y7s`&0t!a3Fs{bbtYK$l~|Fl-Y8@30-!a^zA zW2H&V3M*aK?t%V5Mc?nSE_TNO%gLB|7VWjtTl#dZVbZW_ua(EtpY63ib#k?nJ^!-O zy{&ZWS3X6BjJs){b)7d}gC+G#d{dSCw$C3pzR&8z6oKxaS>N%HXZiscg@&PKO*;?3 z_N9t#A$6BD$8@>QDs{O`tdCfD>GBod5VsXfSoj}n8>{hsVfAv^GUyA)fnSz=VfA(p zOO$WEu(G`g;TX(!CmM34nb=19jkDqsNh#LlhEMKc|0Ws1HKNmBqWhp<CLF{t?@F%z z3dR{;AOFhgq00XXo!T0m%ei^)uVGpPm4#nh?XIM4qvt*3K;0u6KFF!-8u&ND@kcy# zd?Egh$cLNwp!>1r_6>|T>KK-eRivwNtGa#II;DtheuudZQ0V@h^&8UW9YHtGmyz%k z^r;x|+>xOE`kq$%mLt|OZyQaTz=V1$Kgye;!+4I1GvT9_M;S1jrfK1tFNcn*vg3}y zLrurj_%Q64m9MV7(bHBo318S9vxYiDLRqW}pP~L3#3AEH>t<x0_oFo(-l-q08AS8x z!$zVy-<>LzKUujEYXZ8f!c^I3KUuxbm8Sb~>wj%XTF%?j;fNoCisYo%31uTzoWK}` z;AbbSM-;)h+_30pt5#y(gY8|i%9kwVzrZ4D7XTv`x)g_crEX?iQXuV=wOaMT`@dR$ zQjJZhs`xP}F#R{oLtXP9Pqp)1^Islo_eMY#yX>v-M!W5a-ZY2YLu8xV=1igP5$x0F zM%l?1r#n#*D_vAZ_+<vY&<Z#in62WlLq;YOXMi)up_`XS*?y%PXl;`d8QESc+S)1V z^lA9amF2Jsoh-Auxt)UDw$$c!zcb3{z%sIA?b{yS@`+>SI0D+-9;Ema<=_ROb;~jB zIlef?FImy{GA~Q#Dqnl4kG7!*HZ{jmPPDy0p<`1`mAV!-EM2Lu#|mUWOy(59TS@Vg zFovt%^6BYt#WdU$w=~8!kal&9J%WAb^4J&BAK<ai^L5fJ&6df!v2M(!J$5RSdu%lV zo8DmZ;a>YX$81m+wB>)*(jz;)Ht(7~=Czli$iSm5?YmvxEL~>6h_ltoNTts{$toAN zvT3K(w?Yedwz6T=1@Lzc4I3mWQR+_?S@tQF*tQ4Kf8Vx0LV_B<eT3-}>`~rqU4zso z*c08I4SC~fEJdF##oOq!674DOE{1$RF1DS-B-vDgfe(}HTV3uPgWnUj%Sc9BwY+F~ zWXE?66+64N9bA_KO>S?VRJHuY;Cr4}&1z%!R>by8eH%1mQK98=cT<Y4Q&q`A!;$7) zD`TJ_+Ss^vj#<*AUy9wweO^#^%AyoI`+TY@#R~9g4)LcyPS<hdH9bs&6kny-y-1Rb zRJ*-9*HDWSGCtKVaOVXvkoZ@F3z(m!+MSs4=_GehWptPHwsx9YqG4qjaBTAVQrr}{ z2iZ55A2)peW6MO<-e_FG0A@RK9tPzjZEa8Ju@2hs8h=tXTxObF?Fr<yvvGk}PeWb7 z?7jel>ZzE-KvkMuNfl7MJ|WHZxD3j$x4L_&IDDSi-mY->4h916w6{A%XY@g5QEGGG z_`B)r)2C?|^#z>%g@L$i`x}?HpA+t1-35wfK%k(DJ=oQGpaac!`~t_n$nh_B{KCMx z96QGieD-&<54s0|)9^7~;NW@aP1hxX^zOE}mF1a;DoIqWf3err147}tG%%@`9UIk_ z+cT6grWp^%CBMtyxS=#(D*Hm5KbDXC+F78$slIma0aVIVR|RnVk+lC87~4Kr$}Y4| zqNFMP?7`~XG*x;g98JaWsy~)p{h)b24tV<8{oD#m@+6b;v@MgfV%mlHfM=kc67gnA zc(h*@545La4&=$VM>)3ggnXOJKfChn9Ekd<e0vT}t%{3Ox?>mF{W=Z-omm0Tdhti{ zuwo8Jn(^02*C+ARP5fgm<7E3lEL<(R*p9n^DDek7SoQa1D5(H{lgJuneI-Gm1Dh|q zF1CBPF9+w9n{C`f!BAmFXHg*(-x?`63O1ipX#0b!gVoQtGI9H_z05UC#tyQ1U+cO- zb{dGgYmj}k<#1HX)xWwnRpW*v$`_Z|_;Nl_cBvifc3%N*>E~`E%WqBa1eOo6Yg}!M zkX&0Y`ZzP&uGEke+!B{5<(J!KF#75*N56a`*+cDV@Rkg<7lD%5!|Xk-;_BgG?BQ~F zxLxkPGHC71xx(J-5WTd>K7f-41;uuzdjxdEf3Y<@tJqG?7}*4^$t_oFxNIo4r@OCl z^5kD>d#)a(<HGufc}D*Z{Mz4vUl$IST@$d9@zRy{UhfzOj(1qDLVM>2c3g!PqNUG_ zgpR=T5hLyS@Jg@7P&-y;Uv2AYSk2XT5-yF|c(t90Inw^Ck$Ir_uOXvJ0lkvIlxu9; z<thzSi~>P$cT4HD0MC~N*P{1sl-1WNS^M}}8_RTJT!(tr$g=BTeq1W0W9$_7cyI?7 z5lb#_<&ouM>}|LVWztw+b*U^FYmW&H<ruLmFudE>+g))%O2PHEpuD};+sjec%o|jd zr8fiFn`QG2sB)ovd4s(VpC8ng*j3(1q4tk0MW@~){qKj_Fl`(Lj(cSDI7NfQ;}nY7 zH!81quALT`bEBOHT^ZOg-iGl#9QW?qTTFG?5Bf$+<$OuMnYNX%diO1cymq<2&Eo-F zzdaxKy6^EPwhze#)B|-XrLO>vKlbviVBmYrL^*o1os4qgCfaG<$+{=GP=RBU6YUPl z`k@?BZBX_+QZdm^QXh0RRqPa}h~a^a6Vb2k+YDJhphbH*KFLmP&0A!6I)u1g14nB< zs3g1Ig1(*~D82=G)I7U|l--IkP4C@PXR!8rq~=yTsV~8(D75c-4>82AJ>1oBH^J%c zd@fu!WUtrR{o&w7*{=-Co)Df+3MM<XCx(L?WgifhJt;gL*4Lfv$>HEe**k}2C$$=o zuhZG7W<uab*@>`jJBNc%I?0=2Cn<_jcQ$}WPq7Ofn%7LRXEcx>Um0GHwc&oZ**(2e zL##3LHppYXth>!F^iB&wPu&J?g&7}%rTD;9yC+!c@KjicxRhfW7<G-To(Az-BV}b6 zwYXXUR#3aIj;dF;39*M^LSD}+Oh5J-a<U8sVV-rnJ=rWnRcto-nCWoG{oSz9O8mHa zVc+fcTu5E%9rke~A3fck0dLoI=z`lZowIY)z{atU{6XfwL*pIjd8ZxEZ$}5+4fzGK zciTO%H-)0}39XxHXL_gW#1i)hs)#`UKY&>?Xw{RDM2O5xyN->aRIrXarQ#lY1vE;B zS#|(r?VqJ;Xg(X6q3vgbDwoQnptq91yO<$KzL;$nAZEwCcJHeEQ63q8ukCl;9gJIa zuiZZw_Ym+Hd7q6<N=(elVfJ99x5A#G#lLFN4RLC#_8ys%;?I<KD(pLh8t4n8O#h=& zUBmupr+8=R)&<J`2qYqw+R#mk*158Bj>3A!91N1kKUXO)sH<|<OxZQpUhe&aE=FcP zps=ZZ0M`3Gj!~Rd<MOv4QD(uGJ%(X(Q7SG+!N&1}Aor!R;X!+-Yj*WR(4F_n{)Z4y z?a!2<^X#$sd*wVeBjV1N_lnRSlkqT==A|<1VS5bIJPa<Tnrtie58Fk<?*l^Ya`Fnz zR%%X~vmA|S9haXYz9Kwc9WU(82HX#@wgYvsS%7oDj=w>0TJ;8Zf4Wgwaea!I(8_B{ zZT=C(79hTbRDRezNs($!P(cTF&WCY<OTx+)qJgxGE|rZ7VS5dd4v*NuJE1{@N9;|2 zcou~qd5i3=-nl4N2}|JAA`X}s3?H?3!d|O;)Sm2y!X364odqz${Q^55r<INoSs+03 zWp<oD#cPMieM-Or7<ZPav31B2#Sl}L*z=v4qq=?x-{5%yX;0XFV!RJHb*p{H5fFWx zA4&`CuCY_y-5=C(VWtQ1)WaM*E+39R!Y`Hd6~W<dh27izkfBasc<1R-Wb+E}(ZjeP z7}h7Y!=3?0tO?XUV~>vtjUc+y?rBhi$R6s;dt~fNyW!wlL+Z+vc9trH<46P;U$n2Z z4HZYl6pE{U-p)}_YTs~Zii~>R$w0*s5f!L<-X7wHi0)qnYvmr9v>MAI*fS1#o)=VT zbkJM*f;}E_acf{V-V<21#*TIM{Sz9)0&jr(3GNy=@*-J%eiLzhowx;3w-#gWLOBJm z?;}m5Om<Q(Y9fw<2y3X6;&pcJMUNs$HiFdc1V7d&T-7MNxKa3Vsa*%nv_=lEv(wzw zG=JNxEi*CX=^S4>_Y%zgd8N(t^>+4UPayXc)S{)FqY67oEBQY=@ocIRf=2O65l@j` zCSR@x!#pVkFWTF|H*qi7Q7)xQ(#5|4q<%_fZUFZ!myH{s{w|fcm+j?Lv=@EevQ6Nf zm+e{#P1#`VrLG95HIr=tyTn_A;#n=OVcN(gu0X{`44m*c{@t$P((kZMApBEed}OCp ztsRDUdp5xm!?xolOr@TZuAA*u8Bgmn!sLV~|3$;)#AZrmAoVqSRPdIASgGA=Cj}P0 zZX0gbtUygImR3+)<(qa|TiRbkkX_qfv^4l5n%G`{6SImH!Fdx#Q^-_`S6c}<a<kQ* zsNQIDNxF%ZsI^<|ktnzMTXt{nGY&d1R(IIAl<X~g7c@nmx9y?czapvt#kUaS1FXBR zdK-h;vr_vu)~lXVgF`#%@ehpN17+hs?1S)X-m&+oK}b*Vw3zS}E|}3%r8b(+C6vZ` zTq~vKT|2FNxKbr`p4Zd~qgwbWJD3>ns&Q=4dum*n_Z|kYzlGY6x82_DT@?zVNm<fk zhwb;S4u_SX@#_#3{S=_hrQ%O5ljP_Q`xF{p|Gr(=nn=;UC9Sng&@7uT!#)6y<58~< zFnUjwx)0EEFKE_Uu+v_yl)NvHw+jYS1e=Ufb-86%f3RBaM|NDG>LV<)g+udC#(HGm zZhJz+f;5S;CQ$sbU5Mqlz~Vi2RTMfnd!JI_!}dXUu9b>?_8j**><~N`+a{2<->z|U z9`kQ-?)rdn0D4tTifE6vm%Q&Vjo#i4PnWUe7iD7|RwS^i{5cx-QlRd0@OShEkR?va zmPe(yUq-2c=I!LAFYF2KSDZlaFYS@;Krj$k^(E{YpmylL6b)=ZAGC|y8-tNm@t=6) z=s|lU;HwYWS?<3BegNC_M-M?`zUmZrpe63;82^<$+qDT#0oh~Ro1KU;U)wz!?1HSS z@>)-4>ZaF-AABlFayk2nt$7`AuBcEZHcI-M_$1#JfV7gqyXW874`Eui<Qsdbw-zx> z=rDfCVY|-t241kRbG&bcqQFmBOZ?WJt$3oT(SNHL^+=Qdo$X0ze7`l#%GOl{|4i{t z!e7MjEvfhp6}%l;!OrjOV%I+;{fOQBck6ja%8sBzakTG<-7lf>iWAG;MohQ>l2;F| zz))Hb8GbjsCftHnk2UA{QdbYtL3vqH^gYD-J(=)5@Y)_qt(3v0@3FjsRsSFCeCJ5k zy2DsAMGlW_{lQN4?ubkud(<B0eLn;%Jxbjv>yFwJ)k|)iwq?NS{#Ynok73Tjw%}cu zH*oZO%P}Zqn3g|6#6OUaf3&xIcRI!4&Xu2_&oSFQ4g+?O^gnJdS7e}~V5z#}A;ZTp zB<zx5C%{S{ss-5gvi*eJm8ZzeM1P{h|7^#hq|~47lyWWWgHZ$xL8VXOb7qzaM^&cS z1bAqjz&OH~*8`u`>oC)>EczVH8pD}h!?8$pxk`8$fK)JCwbGT)0twH2sS_qsY2>(6 zrFHE5>R&J>p;f=wB@qAFzo;q8Grw^8M)v<==lDKC>3UF@D3#A)*JgQtybREIk&m?w zmmw$Z@#^B>C<KWyd2Dy6H{LpFmv{bH2g9^AlYP<{j+GG9Hs_RG;QgnLlO3m^MF&dH zU!lqO$jo2uq3*pw^RV;3bfQKDe+oE<0~&2aGprfi!<#`Q_We#7`!!rf|7K@pke*p^ zY@%NJ<0~8FR#t&w?KdnFVUYWcVih?28&>|XKQ`8%nemw}su7z1*6_z`{5;2mAwErP zm!GROU0wcMi<MFgG+hrEa+}M41!~#s@~61#4EdMK-wwfD+)0Xe`?+0J(;4?`_Hg@$ z;P2UPKc=FA8n^$bJ}y}q<<DuOImV5`3*h)8F+Mlsv*!L+y#H}98!pSD{an<3E80KC zN79k+g6-|v!k=b+;Uv5Y;2<x{{Uh<D+T;qnx>nx8pXdG(%R~4y#{FMI7G@;0ks~eq zp6LG}o3FZELX!KSAp=_a+qe&5cP9q^SCB+6{I6l903Q7fQ%c@9I7;(ejDM#4upt>9 z#D9x?^uI$o4;I6y@Q*Mp{2SnYg1ZKee9yRgmF_Y3_YN9(dBW4~hbA)QIT?;R2pw|} z`q4q?rv`-fdHtpC<4yxkIO%_O(*F`n?>=eB3oZT6x=#g{dMC&F`+%NMzW4?@);|-S zgb5qgVdDH<0mqDtYX>!P{@&exMNNu(8?nuAO~9GXBOagsAzFey|Mb4pI(j7H68BQ4 zU8kGK&90|mt!k43F!C8<;?~iPkcrapz}!}-JfS(l1t^WofIn4{m{J=4D%#U#AMnO@ z!yo64HYMY~IJmra3to`K!&tMuEu4~uONHql;f^t7{a9$>EkD98^MuD`N{;2<(Vee} z!roVEloClbtR<6z!(X_@$BK;Y9}Kgs%=VA>^0aHPx%+K@4?GTK_|-jT{r&zlSFDWn z`-h?*R{9Z#g&n`Y2nK-~<_9PE$9m&J_$b&r3H~9<rn9APgD*|iUgyKbpo#vG>hN<j zN$=Gv$ww~qg=)oxVM($((VvP=uTS(BwQhwd_7n9elg39@v2;;$L(;ATvF0cFM|+J> zEQU`UjZOCV^qL`<LTY@npXUzill|kvt@>%L{pnsSGU-dL{d1i;e%VfZ6g;Mle~J^% zYuy~1%JDHC`KFD(XKNc7!?E;-7X&U&L4(wSRE`=ixD=y@J*9Z1eld>E=8nOl{LU2r zv0&Ov_0YK<nV*tlss3_zf+?S$=f*lxTfgU`a79QXsQ`|;i#^EEkbIy|2;k4qRe7O! zshRTsczYA@D2gp?c)DjMB#=Ntx_bf%WU@ejkOjiNWgrkhz_5dWvIGPKArKH0bU=|s zP|!#U1toyH2yq?U5QVF#c*%9eEB6BG6;u=y6|W-s-nY7YG6{p;=YRh1tA1*#>YS=m zr%s((ySfH1$Imp=`kL~_)^~HQt#zdLY<-l`zbP_0u(i2XsVGKZs8>7hL`xcwu64H7 zi7V2zOx<G@|0K@v8_0+B(K)80(MF0>>Dni9Gd;A+P7qZsG@hiL-BL@7YGR3Ny4chb znzdFOYN;g#xBf|uYYnHE-2}%;j>Y5Sg~SXkNzQ$ocq@pjp~h!uLy>N0hL&7w0l>7= zajqAfOfPSxt*SNYv8PfvveHT_bX6;8`E+r%m6n60rMETI8%G>V+Q=rbrH$5~FORp~ z5RXaF3z&5~GqpWYO)cI}1`cFmOo&Rf!{Vp5T2WMzU9`a9EX^rj1!rrIqSgGGjeY@* zItQ6ND5`Sgc=BtGHW9^;-Qeb7jWAZ^YOUno;-VZ<tPcjB%hm8Hh$rA}uZ`gXcX6JU z<NgRUBd72UM2+pw(|iECIv|=nU&~iPzRnsBJa^I}1BW|k8<bl0K^Y-pC#|eje7>nF z>8uq*@lP8~Ilj_a+nv(fE+DlFh6-kH0-B^a>^5y;|KkwQp*5czCwgBUZ^(Q7slTCZ zAxE6*q9wPmXO#s&+fyzZ7M#f8Hfb%VRyo*Rd&TUokR;Z6UA25giba)Y%0zy5O%sW| zFpI!8Zg=!}(#en7Z13|0D!Xf))jvs+C#Lt(j@s#F+UW$+jS$E3L3z6PHD61Xy<5B} zF^o)ccujm#$RbRv_i2&xPdX?(GMoZw+GWIDfIh7h143Ev_nHRsd!y4(Q!yam>m#wK zkH*8`6@9dv)}hUwG}1uB2bY5j!|A~a`?Zh8N#djeE$<RhwGa;#XiK1N-oDWKA;Q;J z;|zELLh2CAB)@PPWyxhYu~_QVM4&ImbdFR>3cikP2MzNGC}580d>0Ni_HVDHi%<G# z8>}dX{4)-=S#<I}6^}f2L=|P{#Ey>xQgc|&=czMTm=z-T2gT7s*$`v<OJ3Uc*G__c zE0j9`O$GN?4gju~*fPMJfenx|11KuKb{n9zjcOSze20P1R_YDMX6DLyZze2dkAoHR z($%%Xb%kbs#88=uy^P{3F#U)WN3THtG+i8et3hWtm4mbl*>zLKq-8H0Fo%8%XP%16 z)L8k)Xw+HRSOVU`T6aawfVw~8Y%X6(JSdh8(L9jxrXgA}Bz|Ft>~4~-L{3A*o-5Iw zr;FGktr}Oe#|}jwG#xLzwN+8AtRkHhRYOr|Xc?Ux;T@(G;Jy6RVcH^e2&|8ZqWcJq zYt+Fbv@^P_0E=JNg(>NwBhj6GB$m>_dEAj0(Q!UyB;?m%lxF^2Wdkv(5GxM<C~ZLy zHyYi>TCrs`rp!3nF-H5OMO`)If5iHb4Mk*&2XCgwViJ#i_OaTNaMoQV>v!K(a%L}c z%^ZhXYZI)sN#is>ayUK?(!<<;yex3v@!GSEIa0Etq4=rhnQ_(^Rl<wq1Xb@uJ(nSN zufiFwV$4(^sKpbsxo}QR&~ntaar}e(<|6qn{Jm)Mt&O}&mY8%k>Yn9jR8}$#du#8j zkvjK9C@FhOp8f{|$FGK-p#ZLlWGK*fqE^p+2}ju`NA`i=Gk4=FoUJWzT5gC~Jyq8A zV^g&vwywBexRRa*nW9ZkgEruD)N4`WIe`w>LcI|jIvo|08`v@({TK$LqcgP9OS|nH zG3h!jtya?}yE)?C@Zf_0w+pQ|85=3sASqXSrf4@ClUmX&?K8C<<o7H-WQw1y4V5x; zi47Mb63cSRB9(wxH(Q&fwvQ8WKSiTp*J~4?kn%4Y^Y6qYsqA_!w`U&en3E)a=x4vD z<rNAX9qeYqO(2?7*wL`8Z%+F<l+V!?$+;vhSDB-Yk={&k1l}mV8fuF;X=1}2(Bh)G zXaOC?q`BG$5MzfDZSy6^YC2h(%8q~~Bn5ld)#k)HR?`{tEgq}s5~^&8V%0qDtTh#^ z`NM_H^PzNeMCE*0)m8IRpIysKwLJM^*(JJ^N~K>{s%195<ZmwUiC#W#H9l6VEmgb4 znVbDf7NF1X9(ZVhhEFvfEWZH`-YG4@NWSO>?O;j|yUkcLe%9X%*qK(TrUwvrguS7^ zXR)>eC&eb*hz1BU8*Y-#QeM8>NWuR?)LWuyVP{8}jx3RFmwjyD+!AdhHb?^lZb3VM zTjFQCm@e*JhUrW%k+d9L(n&FCxtub^dhjjUqs!%(i))X^1Cw;C#Mqbq;!CT*hFi6G zHRR;Uq;jkQ_OH-RS!aJLZ%3zzD-CYf&hdW%UR|lpL8`W^H0<w#;2PwJA#M%$I2l;6 z22jRYxK_glKEkz54iBx?X&Etm37|tZtl`n+w>7|N-F4cRPPyj}kko&BN{AQY8!%gB zQ=y?~YoQWF+TGg7;O(6)fv2icq58p6sZQh8W2j@!E;Tmr^4;2C_8$BAWoL4kHWvQH zWm={zHJ76;v7sNGEGFjTuM={vY!DsCaf+j5D|;Fxek#+>HRHc`(zJ(V8)4Ayuw;g5 zB4Z=8M*54bi=4B0R~ZgCZqx=?5PYU}FYcJ0SgsA0M+87cmXV8%LRj*TuOZ8|t!ghQ zK28h;{6fR&oLvE2bdYg5nVsIO-F6w70hK7WZo$L>?_jrR4M^(r1KM<_k}pPX(>_74 z?RKan1XJhgY)usH*J8zIuV`A-?-#7U=E3V9Ejj9BFz9_1ZSJJ-y(*P#3qn!P1(CRy zn{(jcE!%;-hqV<r<$!CoOGV~m8qaJ@dQ8I~f|Ngw`O;}I<8k!JyTqZ#F(t<9+b7T? zpB77>fGXi@s3){RT|?g|je@K=<grU5oYhGc8w)!db_6V&C1q+I#OwZ~HWCy!JPD?8 zb;Og}YhbTrr*;g^(5J8rr{0kcPW=0H-1@n=o_$nTp1S`1DeRVD?{62{U@tLYmz>Q$ zv`bFlWrU*L+F4NcRiZe%0*_T9A4EL(v{qKDx;gQzsqO{OXhQXw)h#lf)n=f1Z+Mo? z8{5#<)#jVTtmo0mp^~20@@m@bJx?YFK6_qEss{{ehFo1zBLsp>o|yO&2I%TnWv`I1 z7bEvBMYP*i-^ikbILJHUN)3d|R!2prG<cSPo41tobg>LcWf!aoZ$HddUfU~YK2>{V z2XkRBM*dxa*{^AM^|(tsv`@PY!B($B(`3a50Nk@56H1)zJb)CkV*86F2SCKCr5y*b zrrafdI)Ir-Z+zyYz15@-x?B!N1#qv1`yni+B7H^dn_5QwegJcX`&|{2=fyR}N4w^o zG%U>ZSm@y6rFl0;w2_~n5SIYBjl)zKxaOk4k5SPWw~oB2y(Sk9%|+#8qadabr0q!+ zF2j1<ofy-<7HH^_NROL~DXe#<8i`T4@M2iQ<?oe;u_ocZZ+)Dxi1moHceJD^o7QkK z;2mhkaB;RU(i26=8?fWWvQ;r2EVe7&(L6l|AS1FF{MHG64&v;5ST9$>ve#qo9JEtl z?bcAgd_p753j!3=6>!N2`65C497&p}d=G6bQXF~@cjJF{P>aTe1d|rwuL!FTYLPl; zVw@KYgk>+wq_^Q~I+>))+Zbk}aXKS95sq&r_A@rWjY=FOb|Qi-5qZfM7v909g{+bC zcX2Ri{JUDLIyeq*+FOd(-f||0qC?n$Wdqj4ghN_#lL^R@(;;dfwb1VW^KnHAa-JZf z4{3u!5_Dt&*=Xw~uxgsik2F{kwRd$U;8iO4$Ncz^RNLtHwDsx`a%G5T-$N6TGRa5R z7X5cj1W)1}s+Q)z(voKpT)S&If!ZL8%)xFf8vLwM3XFIz0$4frVjvV|*9+@uDCjbc zeRq@>epaqEJ5(K0#M!??2H@&2hh33-SbIwy7ANL?AK6@ZsxVTV6a%WX0)4o}>4;EH zMMV{w6qZ<3+IT6zc+uk@TB4u&#rE9-mTb3zh3ta5M4c;uB^%VU4zO&EBdttEg=P{) z94t2JhATc`Z6tA)e>4dFN%>Lyw(rYw4}D+DGmuk|)nfQbVGO#_3-y}Ey@+KdYa<hu z<`HrB)_Tc}zrm;;3f^>4JZ&gOpCy2^bc{~2S0c<xwZkbEo~@TKO6M2+FEW*Y*^ZUj z8qGuTg}{gA)$$J!cd?!k*U<VuWwtIa(x#N1eZ|v}R4Jn)7(GKdIe>5|CzTeSImL>h z*=Tm3J%-Qu#%$A4IeIZI4eJcjlz%dE6+G-7--r$@|4{2wKk7;Zn!{cxN{(P|nRZO8 zP?T<>$M@)wx{9T6#MZAdPucOkmLQJN_XT~`^f}MKm;4QUY4qjOw;x!gljv~<3H^wq z43&hj8kj)PM8>&|vHkSzpl|nwOh?~g`o5sA(MRw(&w^G5k#rWk<cSGz#9YE}16<^P z3*U~jS{Jb!Fr`RrI12n1OwvwVV3Hvs=?6Huq6ZzEvWFv_Uus^F|8J)K0a3HWD}>Jd z7=SMb7$hz*HtvZ08qO7B-#2hF%MlQ}87bpyL~0{8d<ei{0s<d_nKRP&Ay5NF6;a7w z0d*b#(dZNSJcy(W5V;=#l|#UokFXV1{U7)iG5y?g@Cga~7kr-(ww|!_^zEk4^D%s9 z=<5uh(nSpY7{ty{Vv9ZoG0#bDpVC?QP6OHq>;$S$Y7^X;+HLs`5Lt)&zXJ(bhiSn& zETB);;cfKEI{X6h6rb2a9q24xp$@Pr#chOl5=RM;73mCCWLmHy3xX9{44=|dEM>jR z`rJW4NAU^(sMe!&@DZZvu#(N%Ee_T$>e;Ma;UsT|S@-){!R^ISR<Kpixvb}jW*y#U zR_YeB4pF!HX0<tgM6x!rQq5|6>l;v%)m9HRYStI))~qkVnv)e32v$_!Lsprr9#(V@ zaTXN~Czh2eE3mU&fq_NmFuPQ`iz?I+TGLrNT}A9Ch<S#kc<m%8bg8K<fy(-+2|Lnp zXrOH5Jb}pmo?Xg#QSpoB(I<qU0F|h#P1H4EP!mnmq%f$-CTdC;RI!Pg8U{7ZL|q#O zh5scYhcm*UW}2w$!k}iEsM%pq*PEz0VNi2TR7n`rJQFoP3<`hgNe&l;K`k^<H-teg zGEs}epl&o#H-$khF;Ppypl&u%w}e6YP1Le5sO2W=)-b5sOw@`nsM}4{$}p%^CTevU z)EX0YM+nN+!?h-AT?oq7Lwx8?@!k~%wO*onZwQ0B8?fFa0mGRF$6L-6zr>(wXL=9f z$cca``CUuQD*KZp95mTp?yZ#s-`Gjs$^o@o79z=*!bEKfgSyW|-5&<E*+gv#gL=S3 zJs1YH)kIZ<pzJbkGf~^apmvz3heA*`^ADS-N5Y^UHBpa+K|OAwo(O|_(nReHgL=wD z?Fxh1ZK5i}pq@5S&xAoeYoeYDgL>XXy%2)31%-dvqnhmrLD|xH(L}uz2KBOudL;y9 z6MWS~?G1x^%|z`BLD_k|Zlc}@gW7MR4unDd%|yK!2KAPSIv9eoIegnhy%Pq7e_W+B z4uzm>4&O6Te-DE?Y@({dp#EW^-VcNNz(jo*2KAAN`Zx^g6BBhL4C+%8_0KS<&rH<O zFsOf-sDFn+9WznK!=O%>sL#WozA#Z=hC%(uM12(ob<#wg3WNIEM12zm^{t6I9R~HC ziTXYa>Wqmx8-lWR;|CM<V;Iyq6ZKOV)XygBmk<;;&)9RGH&MTapzOT<YodM&gZkY> zT?m8v!$e&SLD?!=El~z{BkFd`N@KANZ)XfO49;ocTp>7{N4JHG2!pF<;UYtDHY-sU zu6_v4rrE&4MTfz~Sh$8EIGbi83l|#(7iZxbhrz{LI4ukgSD{L|7$G>DPmhI52!m^4 z;hKiQC0e+o5S(3xW)`k_7+kW2^M=8tSh&<MxHJ=|r-#9{2<(Z}H@n(B_j~R2@`H84 z>+6J<1y;o9I}|rpywT;itC`}=$mn}TVyr$1-{)@N%6R>QjUq*VO^+4h*ExM6@5@Lm zLDO)K|4tG49~BoN!7tt-{>(wWNBvAt;<jx5d9f`{-=$nBmTqa3QOIpJ@GZ~r(Vc9C zx#z&}Ov^2?+)~S31(zh#U{CxkQu@U=Eh{=UBak1j$0}uMEfU0%bxyB1`IVX=-ugDu zD-Ivj6XJL<j#MAC+#MqJZGBJ_2@QpPBQRLkv8#NI*tw-q&X74)ta+Ae=Y69U_FL|9 z%Uxl)cU$g#a7j83_JBBL=&Qt;Zz3b3iY)vHk$V(Z$>x6>8H?|cw<I=BWc51iqRzLX zt%OT5+$mmvrtI~NP0Qxai%pq@U{~0dNW%??+p$xp!!3a2^scYSP0-C-5nbkys2u*^ z-}(f7Y7}<_xhXYJ#O^^=e$vs<tWCezr|_xp`gu4Fogs!c(bJSxVqFS$>(@8YBbC;o zqM4o;bvsgWWz|N!(nL?}nh6HD^>+>IFR-IwN5C>l+b}pT#E8qneH(hBk}cZO!JB_C zvfCwQH`TlAWY9nyA1n>K(p=o*p(jfe%jtuqA*!8;;;v5uf<9OpqT1J_qEvjaG(_cz zv5ER^TsSA{iSCYMRd}0Y$GMaA4y}h*be(Zi6}amnxoek&4C0Xzj+A*xo$wWP!iAzD zN%zYyr8yHXfTh^U2=@h>$-_<Z7)4((vYDPHD*=D80WVg!5O!L#Zeb)i73nF#?&3J= z11shWaGLcD6O(HI#>A@&O7~eYwz-}ua~UW$w2JXG%SR&aR<WUzt<VDkk>Zu+dZH9K z_u720G!&h$MyhPoK3E!}de@-%D#iy(LsXv{6gAfeOG8wF*pj9vN3pq+-@c+U871o{ z4#7z&3{$c!D`tP<MAflq54M9?$QE5xbFIVuLl%j;)CR5(mWJ64tl^{yf<9OpqOPbx zwM5VdOGDHkvBhg?U;_kwurx#su1PfvK_4s)QA3FG#E=#4)MHZ?*)Ma~^EAmrkY=^% zI6j0<u=H2THW&31ybKnZ&2E|%94gMDMJmHYbShfk@G!DzZN(fB2B%xNky2Pqb|Xs; zcx;q3w!q@WI<!hz_tYUDaWE{;sG6ciAn1doA!>9D3iFd%s4)^HKU$*%e6Tc3H5P1A z2l2^AvhHcddSkJ#3d8+K;R9PyJ}b(2aUl&&cLHOYI&iftmKc++$4cghBPL_hFt2N5 z6}F~MgetCGY`Q*J8b+Te>rS5hVv?d7siXnxgQa22Ni{`JLC^<FL)2t3poLzBn=EAS zX{&g#sp3<mii`ctbS=i#>1%7sGhLLl)bnIfazV-mOGC0VYI5`-=!2ypYGw^89YG%~ z4N=!gl<Wdph@;K*9O)e@Vw3eWu{lH6l<P%h2823CG9mlJxza29!xGsaij&E@hJgzg z1{So^hf4PNCdda%!;I$F@W9T+2TMa#sW{roYDcLE`e12@S|DOu>*m!VXa#6(aTwO* zHiq4tzZ6qjqbtLmYpwNys2ji<D{X-I5YQ%Hs_?_G<?^kX{l;#9h;5_aCW|^Cu&IrX zV;+mdzD#|5`^6yOLrfmpq0W+6txgbKI{Pu!H?{J{#$~-<Xey?+)%QdtV%Eg?IBuS$ z`*Fbeu`Em<mWYE{`WP_i&DQg~F0~m%Ljx)K=8XltIV4~Ey=AR@#ine%yK;;8FdN+Z z#f5Bryu8M-wV05j=PAp?h8+D-b$MfvGBv8HJfOgKOx+{9CR@ip#L*0YuCB?Ht;D8W zy+}DBPUV8+a1q-M-N<m!ww*p6&gyo0=a{RIbOUTLY@A4MuV-}Sc*i<m55ZoKtrxrp z-*=K}luhPr3r`A6ESnjZ=;l}zS2pz4w77}zO@L)&62L{_PvTRSXWQ$8m5$|kdJg6n zzFqh}qJN(5ZNZP7XjZ^xz*2Uc=CJ>Ygyo2Yx0X)DBmZUhPq@g_3*0;K$_fpx8aLZ} zI_ODJ?1<S*wi3R0{0q#)ipWTLU*D}_Y6m@EzEM@gS$fU)tV28MIQQB?#~yY^J+jGd zA(hJFq{0Rx=HTBimUYxUb*c0f$2&sceZ>XSN$7<7Jt;<Z($6)&x6V7Vu?SP)sVTQN zmap9!cL9v0&V;2|{D&C!c7s$={e_DC?|5g27-FbPU-CVc$X)8p5c#vzXgT+06(;>E zhAdW_##Q5=zgd;EtciG06_1*Dt9>kPWB=LdEz2m6&EgA7A}R1*u$;KiP#-vEas*$A z2&|O7qU12H*Pa-IDSu8^J#rXNJg_xU9ql$a9R32>(Xbpi2<IU+Hdzv(`r0rGmCD3U zmvjom@h@=<d@E>oT!l>8*-+?q95PDUQtjc|O@U!D87+?U4!HAO(ZAt8<-4I@Sq(7J zLCq2SqH$Hph;Di-+*`2}QTj1=52DyyQ(ksy*t-zU8d?KVKDab2Nh?@8UV=Ez+(;@k z$sHoLyYA7+8+%8acNtAobu<#ym5s&nyBjz6lSitnEfP)~*#;?EySQX56_zSP7|9HV z%Q(c@@hEo2Bhza`n6~qfYXabkVF^R^sE!`u*Y5fVWt|w@18wxqz|tOiT0NZJtSHd) zT$f&}8ThilKHUW=4<3v`4~GB->lyM$3yw{%b$jFu0CzQ(2Z%-gA^NZQ2Pof_`Y~mF zz+0r_2-ODBcBnoP|7O2#sJ=?MhfeoE(J=ivMJWroMxg6c?`>?J+8i+wUB{L{#Yp{S z9@m>NT3-U^$Y`DCV+V}U$6s=obtBr6{KEoqXpCNrV_Ugn_3q~7=4>FgO!0BnIDLGx zEdW81Qe;q6+2`1OHSSUzr{~w47Q&@fSSF1bufJjycG5wd-^rPP-h!=%t%#DR@>9B0 z51de*fX__qW2rTnFP@<DcC3dc=<mWQxmwSMQz@Om*{k)#aghGLx%zAJVA(v>O)oKH zzMe1Q=j%yIxyYT5QAmiP^K~3C3;=^qDtd{1r6d|SU8;Y}%kGZcpic)l;9HDZQa3f` z>5Ra)H|j0|&)%e$(w(|ge^O1kFGN$QIrrBIZx*?JRLd4I)vpKC2O5iEF5KApZ3&kC z1<Ujm^3wrbcw6Hp?Jt(;OQRk{dTJMrRL;VM#Qx<v4}R@g4z7Czjx5*DQF{)p#2AGm zS$i-bG+3pdl9HCqS{(0<J6)4k>-=ot!fO33NaMg7eZSgdD+qHU$!G&%*>;)H7E!Sd zh2J6$t%C+vhzskWU|Yn5JM~#`4&JE?IFs%|cf3Vxxl3Oq|L;^oLJmB3SH&(ZzWhx! z+5FR#z@+thKvD8V!rdUfP4vB6AJgnkFhH{umNjjsC0r4Mi=D}3$JEHcvAgvys((9x z>?x>WoLTIs6Mm>p_~AO?N9u$htrLE%PWbWKVb$@3*mSR+6Zd3oxMQa{0&wb6b-=so zgm<G2Z`2KuzftG4P75~bezmf3S&Cwa!>!%1BC%XwHtgv-iJqwwezs2dxjNzJ>x5qr zr_1#M9L>%ZdZM}qU1U*19L*Lw{t-y%38^ny@tu(8bXaNvWy~;T{L&>UUJgmY7_Za` zzgjm%$Gvr8yjCZ?FC?shBAd+XV#X$@_ZwpMCVfQQek+Du^9RJ~O?qbB-|B$hBsjSp zJEjZ}B6n}qiE=O`Z0Gg1nb$j}^RDR}GM)EK=kKO-*mSB)=O3o?zUh1*9reS;;?w)} zK4Q_mdRwvoUfpZ{=|N)=H>JKIZriMT)z8r21NcUvXbWoLlkJUT#Rmi*4F$(<(bLs` z)j(p!=5l?)Xcp<qkRmYrpE}{M>V!|$37@JH{u;bJptqm)4d5J%Iej4AZ>=!rrVO99 z!kkhu{GAo%D9!NqR+wU)3CnSmRe1(*b}I55nW)^X<CNwDdSr{UfOBvtfaUareTPl! z2P+K@l_lX)1LuRfx8si%eLMeiR@hGSlNDzE!5MvE?1SiS<Oq{2Chci}i;K7Fk?PNl z#fw|@HtH|t@MeFjQC-g&9Z0UwC)A5NALKw@U%vHGeL>W(HY||zn7*5z@nJ|$6lYT0 zTHyD`^&>8fq95+k$H?xG(>@kkc7wJ*(04ZyHs&}<HdA0JqW@xi-iUqxmvKgmjHfZ7 zvM-Ablsv8DEc<Vb1CyWCuTWxs2MhL&*dCFaiXrpxb65#q0GyK?=D0_keNNAd`2!$Z z4v6}^o)~ixAd1?IRrxW#nVk3qKF3X79~&wE8IE<<5|-Tn4VkMBO%$kno~tWPYVCQF zeSXtUM_o|<0<ZoB-udTvzr*$C5ghKnz(@QAzTThW{g?&+X#`At{sLeBFYpci43GRB z(SH^J_?W-IH~b5Hqd&pR|BH|PlL*v-xWB+R{tJBk<?-hK#cP+3AUh=eFYv}+;60bc zk1%_@gv&-S@lE~$-!v32FWHM@gG&V1o;B|=PkAR@3Tk#KsQIO!<V!)`OF=2MK>J?S z(_&Hqs_8xOxAe&|X|-a>)92~6Kr&&AS_xyDHS*{!0jk?uq>7Rp)sr<2YjpNTobt0{ z=aip4V_#UxBBNFYGS60_ApW1c>~7IX$po!yWxua|TyiaRn@iEW$(x4RW!6F;e+#=o z<J-qY%W7#`3nwL#1yG%u%Dxnob15kIQc$}~LG3RE<y{Kua4D$crJzo=KtJup-c@IS zYQ~JJC*u-jIlF|$q<ouk!KFhw_He~5u9{-YTJHu>Ep<s0@4gzB?(YtG-Kq~AD0=(_ zzUN=yd;K{++mZk05gfiyd`%nd4RB2nrQY?q6jV?Pl>53qD5ft!H3RhO*RgQw7dQn> z6xNU(-qnA1;tIXo!<gF^;*V*tq{jW9hxH7#FkbZj1XF<ZReF+WRHY99Vr&(5b_+qU zgE)Rz&j~zPrTY}XPya*59if3P?_>3d;MotcelHA6`bfuh?rQ_<KH;uFp(yzjGp*f6 z@EWpEZ1_}97M~o^+eVSxY}92_G4w3(X`f<8K*l9Qh&Enk*h5UJ!iF3p_hjC<HsDh| zTK-!g7vi`C_MiG|E~L2dZ+)%YD{U#(9n;G!Z~Ae4x8*%@oU2rk`yD>#Yji>%AUFBq zMeYT>$er8Sz~u%f^x0P2vnQ|s$2Fdx>lyOi2gA}ib`U3o?{h3!`^T512xAx_Juy+` zCIjb>4Bv!#KbI|bcS5yecQV6*aqEn6sm1o9*G`Ks{l3uqNAc3497YivrWl^U2Vdx8 z6+eZ*u8AA0Env9_kwO5x^=05imw^wx41CyS;KOlKYuJoOTqeQT%fQE72G0HEa0R<Q z2*+F_w8VVJA1=Y%%fL%61D|&p`24zX&UIJ?rF9V&e8FYl3oiq|;WF?=mx22iUk0)K zGVnE*f!}%=_+6KQuQ%c1k&}9F*%BRM*|%1s#5Lrn(4sR=>A7fxV^87zPN7(O3LA$M zRlFGb4QA<uqUsbDKWL<<^!^f&A|@c2^m<JSYrn=~16|P9dY%NQ6O0AdH`o{}6y9%S z`oX5N_#3@Hfcw7THkml`4LTv*DY6q|WcP2;F@b?^@fwT_<dO<m+V`y_aQa*Q1BOmx zJHJpIJ&j`)j5eKo;#055xZ|YYJIToG?<^A2Ndn&ue<w>=@;&lIPxqZHR>Jq#p+l!- z0#|>pcbDYy#h$P6dXAK_55{7|pV2!sVYpj}jM+!X_A4fx!J7`E3#4Spp$)+cXUG~5 z?^#Qz1Ef%8^eb)oR-DBa7z%V2-6s2u2BI<!$3t>{&?9vj28^R!L@>*eAN2l`qwxS; z(vC#c4>HqJKS;XiKVp{<)%&AfB=hyxu&~Txq5PaaLgGf1e~sf1X1SJ~!&@uV{yE(v z^ICztxa_OddzJrWVONF2;@_PtRa-5VZNR4E?sK|Vc7->Fiw+sybQ$=P%fN5G44hkm zmoN+Zx8U1I^=G{qPc8hc&rRWL2z!7C?auAl#tBjRGnDT{;ONi#A~k9tNN{90DJn-c zNQ~kFR}K_n*{}LsYyA1?SF{4YE@&y*{x|5ITI1dFUww@G3Q%fLR{0{vv)}Y|oWtqx zn_e6>C`iBJH~rZrm)+PDvwzpmSeZ<^0Npb4TXz9^Z+drL2xk4|1*o<OP5&bpcW8}w zX^r=>KTz7?qUshSt;O9a9Sw&%4)$En%fhp42+CnlRP4d2v)zmEGOXYtn)~3uq>K77 zCq7#8sm5G1?Ml_)e)vJv@N++WfXm>`E1O)#c<kc-<T5gp{6Lc1z@HFu_D+dn+<dFC zNABO-lX=b?Yew0MD~)9H4Pl@v!obO~E5+G*#(8`@bt=->4OwoAGIsPEg*0rXoRJTu zwBcR@`wQ%7SgJ=y*kNIC07=|%v8=w4sg8)3Us3L_Z=@?D#i{znTF7WY1EVvXWyhWP zC!+?25B}I_W0pS3s>9H?M<)Usq9F!+F8p+ZM6o}{@TsHY#jxM-UwO$54c^>Qi49eX zr;)+_u%t2~F^bKQL|Tc;j_3~#H!_lRRwHMWsj&9pp%dk?Mq<nfU}#uFCq%1QDf~^b z#twB%yx7)JZ7GW5j8<JGK|~2EIFhkrAwf!oM1vW_AB-ms#2K0TSQPF$fH@tqXX@q$ zzap`*ksgPsh7@`lTnhdwF|@J4k5ZR4HuB({4d8|w|7*Ai?32dEuS(Q7(BpPt193z% zK0t(>y3rrbPr6b2njsb|M|3faMKzx?XNePr(L826Xw;r%i^H$#(fI2zIpe<iQgrfO ziN<%%xJbZb@Q#C}=`k4*Ecj_foXEs2NsST=4e;~?qbO=3NJz~WOB0N(U@xhO(V4fH zDkHH2JFAJYnk+Yw1+BUXbJB^aZd}(A>BK*^HZ@9=Nn&49BN0b9k2W<5peNo$BMna9 zL}OyZDWHuxs5Pk++X|g+)Z%!Yb}%pc8CRYJ#hEG+lF)vN#HJ);Ow_a>JHI9wdG@yC z%k?>+4rm5F8if;TXctB0&5g7sMTpHAZVId|Cc^58p;frYve8Gl!)9W0gE!e#B;z~j z!x!-{VGWXvd(mnE*uhpS3pGB)*eUO1r>@vbKKz|(Dyr&Qn<YyNQ_6fVB#R}f##rmd zk|U``J`R>8q#4O_P^0pY4n@xQrpY2V-SEV;s|6}aGhUXbN4&%)51Ec!s8uuI+7oi> zJ(ZLi$L@k>DX7SH-%R3OgxP&C?M#c)0b)zKks;4yO0+oMSH-`sCE`MXGwCS&NwK1Z zF(Qi%t`U-@z|!0UOP=|CK2X6mfT^FZmd5y)>yQJJ5QJ|fGmL`PvjDPX&mC+UmY)63 z>`<K8l3@&rx&BfLb3$X)p)fZTXHqD+gn~XVG?qo7r8qthUCa20hS7n!t&CVjnJ<>L zM!$Ai>}hS3$^TuoYbaW5Y6HwTQPsv+0%vfh@d?|&(=N1u?rmi&@_vm$eo0$n1_*rF z)+lPnOGZ!u!R_E;_*o03V8#dcS6JSD@C7X8by`f#GO9=YR_9>GNrb5}nXqL2?{)BN z>V%gfOnKY!PvHaQ*z!-<i)I_qan0*|$NZ!?oo(c_xB~|`s6tFd)7kn^IR$<)XO5x1 z95k)vViKIz^%0{nFnnui=k+6wClSUm%Z7a|9z%3}U!C*br3lwIPl24vF*JYRH#4ab zl602^^Mt^*TCju=*qwkiK$uxmwU{*}Ki7)OlU6o6EiD*lJT@%px9U8}cX9~u;(u#P z<anKM`G3Xabj^sl1#n7;(<!ewnv0&WSVXro4%c6Rie?8twZ8b_r3NiUgZ73OZL4j2 zV^&Q^o{2*+M%%1~h|407Qn>d4H-zGaHxHY3%#ebnPAvl39+UP6xoH=QUR(<;ciwIU z$ZnQ+-|=`OPdnyKo>>JXRsd_4%+Ba0;Oz#!r@VuaG0o102eSKyNwEYe>>krDSvulj zr$BaE)ah_JEk(LNDbmfg(75q0Sxy?*<;9899WYCxx1osbXn303g2+DPL&F+j!P)=# zg%1Z`aI$SeM<ZEYL&UPB!E$9`b45amJR&2H9g^XJuy*IrNK_^0Y4W@cQwLEvb!B8q zFw%#ByL2+T50lIR%sfWHa?(zYmV;AP=&f+Wb@RmCX2n?%8b=)HWE88n$BT9sBJhg5 zvk}>tbxA3+4U_gt3yEE$N$to$27qK>G%Q8U$gJ?tj-L}G2`len43cv&7Lp_>2Z<4r zx)_OZ9E|L-mRzn9RRGJ~sut!fuBfZg1F~M%)yQbE8oaT&+BMA7_FQZ%;AClvIMNl9 zg(>*cLnE&>XK!48{Z*<yxXRQ>Zp`u(Av()PcGkp;r;7}uE1NjUu=YsO4VQvuseG_B zES0QuxV92tq23+L;BJ&&C@h(v<$RE_r-*yI8=d748e>b3@Lu9ncO&`AS|EVg)271G z+yhHys0B_~GJ6N4!`>it&Q3|O7T3m$<z4w7COwQKOr$pSFw!E{A$~M&zKK)u*Xs|v zBgL^E20x2A)dMq6T<+D==w7Sp><Pk2F}r6NS=|*c&nz{x<wKU%V|%reYQ$_nR<?Ww zi7$IvDo$mn5tX+WX0lVnj9$iC_3rqMDGkj(8ofuv=3@X^Aae7K(w<!N*n*${xR0<N zE^{k`pYkQ1x!DtkH25imd&Tj5ET0yLNS~33uY(avi{q*$1(pQLLBJ<se~8ET;_#A= zjS@kWY$2gKy9q6%z1vXk6GM9&crWe4$bLWl8F6(R(`JH;d)hTi;xu+`Qhk^yWilF; zJs=t1g3Q@dvQQ_)+1>^ZWVY>tPUrzKxX?)K*%}DDdN@_3A#oc<KB%*Vk>G;}Q+G)a z$M!)fWosx1eg!CMn@yrf9PNYpk+<OBUn2^P!7&vfNd|~b1z>Ai;KKr=ffBbJC{~5d z^?<<HzL2>*|H~4RG72jhz-a@NLD?aTqP!qx6k7eToWy$Cka05o5NOJ!5BzpF8roPN zju$_4i!*Pxr4q7$wsxHqzZN2YsnyA1(fu*8A~V&{#A`{|3oq?&bkIY^W>fcySNdbj zWVap!SwuM#sJGGAFmdCv4ZSgsgh--D3>{!(bfw5?DDq<1B+G9TV(D$}xTvFHbzo&X zz(|f^0XWkjC|?`}NOr#L?Lt%8JvFJ;E%P|hb|4xKCY}Sa{{CJZ8E9m73~fJTfoevg zWRZE16~f6jiOTjRO0GaZHTMdmN8F>pvtsSFbdh-F3ah#@#c_D!9=jw)>>xCS$1ef< z1{<Cfii!E#n)$>f(UuJ|JU!Vm*q5>FWZ4Nzop=(_?GcZpsI4SL7HtI|Cq5ixjE~!S z3FROIp-tndOQJ0vY~-cvstZO~K_;oNvP#9F!RXa?*NrBa3D%+BA;t*#7lh=B9MZ7e z(@^jy#D*b8hWiAFI>m+!PPDOl__vZ{Lk#}qv;3#>f-8+yt-0W1dZx*NWslzymJ-on zDIwypIK9%yi~3jas^p_r8k^Nhbkf_L&6TIcrXph%x<c<zBLMnGh8mx#3*yDRwXwJj zf0*%5NA^*q+aH!%#)7gxDulJ?oRm0~rA7!34M!_W5mm#Dw63gHre<Gh*F`w0_N<9i zS(kBQSu}RHC*n$Z&cTDDy<OUx+>VSe(qhO23vU)WawJs#q-Zq~GwPFK>`3D_I7dgK z+dnB>qp*j@|9(Ypa}qa+@qb%hkBt<YM;T+Y*f2QEle(?koTYjYro6f3z$_$8ct@kM z>4lVn)e(uKz1U9cE276>(8t?1IKgWwNtcH5V~I_6OU4+3;_5cslQ{KjERx?Z%62UV zkL9kPSTGi)!6koVjqXu>K|&(SuZ4bf#8tn>csJ>$h(lKynNbCHy}vNdaH=h&imK)Z zX4H_euxv*?VQrjOOqhW2t7w8@-o=(I!&&U<XqcnjTTF$Y1z@w}w0Iz_R6gN#;X4I? zlo1(Y0LH9Xt$67g6Yq&(G>;7yxmOz*V$gH$X!V(R{&P1DVl{4{iS<_--nd8V+}(A5 zc|&I+4qKmn2it*%C)bN@U5Xea&0ZlB7MwW707iB=>e#SuBKI0}Ki6S_Yj+eU8MnMW zs^5Q&k={Ch#ckbGO8_Hf>a9&_wm5W+k?eN>MFn9O1Jw(nU$hp#gxkwoW^_B?jL$4= zQY`?pnWP3qAk1Nrc$zQjtb6xz-3vHqi0dXAt<?|yD^47ZY??Bz&ib+m!fd4^M8bzf z)kGtw{b_tj5lX+jPI!8qaF_F<-6Z3Rj`#drJDnS0yX@&!HZ0?JKZP!5D<@%h`WX?4 zyA$y#=itf4#F~|BLCkXy8f8KK*&`2<*o(nVfIJT@1uwAzD>NLT?#B(cDMmsB8;a)O z%ur06XS5ZsO@XSg;WmIxwNhcv6mOB`LQXB8L4{7xO@(eG_BF=W6-C9Cf}6`TwAaPO z#=GbdaKB%23vP#z0rp;G;*!P*u||uk0r=MZ*{Q}*G)t>>ww-2_qPP{)jEPD<TIHg+ zXHgbPr-n1%BiPN|dM$Rval`Ai#$m~28?k9Rdd<G#z;xpiI9q1OnaaT#*ucb9elv|^ z^#x3A_!oq$W*QYzmR`~JI=mMMh^5yV`*Hr!Hw(SMbTM`oX0-PG#`fH6x~Lk5`z7t* zb%C9;kU>qAWQnNjjnsB_EwJ!x>nuD^QM%x!z_NDsphPwu>=?Z2PV87W8mpGgo^YEa zlfGCtsV5~|w3lktzdQ=``}Iabt$mA^5yu`-aKv(7J@W+3D*y)-ON^a^{iE=eCl91P zJI5H@GE{f$a&d@~9VwV5<FCexxCfm^6Y3ZXbpm*{CCY^1;bP=mBj0^9($^OyFX58U z-E*NAC(BFZAb@>*51WjnwHG67RpXZOQ!vUFq$C}iwuFh;&eW0;qb;ickV)mN>1gwe z9N7xugRNjJK1|s&&v+DyGig4y8}X`WzEs5MQgaY0HHzhp-F?KSQod3M94du|_GZyJ zrlrBM$FLh+C|kBPdFF#^z_=_jyZw&1P*(F~^B5OPK}o%a3Lu&rHZ$QeI*l#a-x`aj z7a9g$bsbzNxBk8B@TZE6>SGF?d;@m<pA{Q!0BdN#HyB&vSPvj5smLKpR4g*e<mP>p zIJ*c9d&FWaX7TQ4v9+YKYb|Uofsz560!v=^g(%Aj5ql#fXSd`)$&JP$MR{GEy2&VT zUx(=n4$dr*Z<~7DjHv@|($8=wis~iCR5ZCNg78*rDZYhz1Fxv|VFHzW3tojx7YCQ3 zB6<lc(b$_owRZgdwc~fV#n=o|e3xk44IXL8FUKwNe83zg1Id2qR}>qU7tj>p%Z4zv zY6fO9%Zx6q|AwN;9Ypp$Fcb$Pa~3y{02sosMY7E3?r#Dw$|yJH+39h-r+zca5LN(; zUGe=8Mzu&Bm4Nlag$)<cjKj2c$N3uvLKv2Sv}{eGUn&q>r1b|A6VZn%2@@_s2f#0v z88wu~&g>9Mz~bAP<-s4CmIdT&uOX+7O~k$jlw|n@8(T3TQn1u`rq6}oY=MyRc7TP_ zVw`zcLWByYeVsUz1sge4G&Q{IzZ~L!f)|4*8Tk?nvZ5&n)~wBVYxuiaa4wwQL`|}` zxb$JV)(-LFYV5fD7hI~Ma-Pf6GZSDM%su2@_5Uu@|0g2l2=FK3q|`El5yFXwVt6Yk z2J!UjhRv<wSES)HQ~7V<_?mFJk?805k2Gnp?93@K9&BSLN=e(~*C8I&fH20Py0A71 zU`NB+B4x+QPS>_nCzgeH#$Rhqe>oXJISXV1Wg}%nBQJKf@>*BI$ruH~jK{&Yf@MQw zw{Z|<jC08HHI>y17~|3014}u)jjrWzJ^TkkA$pOV73h)Af2YQZ-@j0!#o=3&Xn!b& z%={J1r|DW8N+u{7n?b0Nl)#@cNXG3UCR9J2R$7h#R-sgkH&s5oY<+okL(QtCp?}8} z|8s9Q`o_GA5>k{DIi@AI8)@y>kV)UJ2?6HV9w?AQh%TdoelEghvca!o&7HH-h~_7x zsPxwVbEV@S<&8w0C8b1I6?WaX7nLiG<c{neXqfqX$UL+L?YA3V;Mn8XtFd-6X)|^{ zEC-YRy>3$BTZL_97L_U4ugHwcS7F`B)=I;KhpmLR>h2Lckq|S6gR6{8KSe`bVR{-? z9mP&s%@BZ;WTA>JSOKOAlr}|c!$P|qy9Bo4k43!Eu<UNAYgHCEEEe(*-MYrb2>)s$ zT251ZV#8`9CzXX_3DRN792sf_%S0sd4=C(vqcHAPOApy{XjY0YYmBt0_mKz3z%^p( z8mygHigkc0i$&!c!!wK(3-YqSb^+K@3G>0yNI?STgx^O1j16lGzmEVI2@?r-VBXEn zfXyV;0^`%-JB(!c(#94A#lTXr1RsD!rY1MUQ=DX(e&Rn2gE!|vuiSwyiCqm1li3od z78JnRWWm40&j^8Wp2sxoZWu3sY-rM8ZDEAgCRy4JYv;kjBM&iptr6Gp{}U5p%UUBN zE3~V$dEv~3#tX}`1o;tX*J4`-H~p`ZYTI@l*5P)IftgFTGA<_w7MN>-7I5tz>V#6G z{-XfbU|CqkqsCn(o*@SUR@6t}Iv7bDUuUHG?X;o!u_1nJ)v0~Cdm3PNW!XAF8Gt3J z3)B@`@O8`N1dbJHS8hmMFsm8_6|8Qpb7@LL28v<H#Ft{vomj|ls+cOOx~hr1MoOyU zCl=eJL^dcs>J|-CvMRjzGTB;o<C8yl<#kd;zz&3^AXz9DW~JD07pifk*m;*>UL_ST zD%Kkwxxvjg$OKbiZPFYg>Jnj=jm0D+lWXY4qVg`OAzRj?=O)rl6iO(gE^%=j(VMZh z*rA2X!!7fG>g8@gA5X%pr&=6}NgL4P5S2xgs5ldEzDLfKuYYB+*gb_Kk3_P?+WNyG z&%AC+t`SL;QR*gLDRS>N65FvpBEz7WjM6TEy_9nBnjl3AP0Fve*mpPgErj<Ttjt!5 zq4!{mAk;}NJ5wG#jOu;_%0S_=cIvhr4ls=K>1E=u|MS9<Ii_DJ4wV^+sqC!@N`tl4 z9bU;lb@`w1Vse?0n#FR_*y5mm+D(-e$npkR6O|y1GBAg3%z-8}hqeea1({-J8ZPJ0 z%$x^?%b5i|dYOWb0?ro3ze3}PWg88Tyj}`1f(-i@fRP$6_T6iEuKIUqDhS6Op~<b? zMUkt}Qn2yVEd}M_gQYRa=Yj)ytdY$)D6Wt!$UN1?7A>1iFrF+xzfcXkBnM0T>{?=_ z*`(MH)Fvfm!6<g+`QWE9nT;(sJpN;UB8zlHwbhBWOj0SZwj78fX_B+Me(Kb5#HG9l zry57WWjZ^|W}a$>#Y>MkW5is6sbOESuN({g6Xv^ab+IDmZH{U#<|e6;ma6@wGJkHW z6i6)<Mn+S%Ve-hlDH&Tj@5hT*h0!bO3-C#v_6XM|W09Oqu*ox;%`SWF1cdEQp3zxB zI$Rdfjz^e*ur;TaWc!Lkn~Z`KqL`fRfO;F6gju0~&58B2{|bBG6coENnyNbC{RrE+ zGhSnd_{Z~DRx~&o9qZpxC-U7Pk%!61=7vvb-fY$62|}pF6V;P&7LoBonYu27Zmt#2 z!;OYe!YykMwcuPMkTBiQ_%<V4--N>3Sn)Z935Bz{k`5<?ghwI&pxC<BkwmLH;e?P9 zw6zF%gM@16xa*|*39k`s@iS90kY=Upg8Zdc5I_VQj>%aK!GDDi7;eR5FA-WYHVUSv z1ViDZM>v~!D4gjD_qVQtK%GbgMHrfZs>}pbvQRknl5k2S6h7R7bMz%VR2R0_yjWrR zF>kE_$nZL=#B7FcKqx-jKf?-tiN--g;xl0xClqFf*)Hw$tbh91u*@|v@@JnE$~jhy zvP6s+3U6n@yVilXx8U9C!1FA4_d4(n7Q6@H6r0UaM+?E%f1w$ZL5jGSSn&XsO>M={ zELVoos4Vuh2md{LJU2F36vg9qvGtj1QVb)K6S}?2a*unW##<rWZrBxX960$S61Nj} zitHR!Yz40q-Yi#+*or%5MWX>YJ3UuX63RLsj};zVF&j6+iZ<4A$74S{G9!zXL1MEl zcL`jsxO&6Vu!qQpWf5D7eOtl)T5)PCUY>jzFJ2#xKY35CFe26e#0Oee7*FVp-?{}C zW&YctY<kn7<aLR36m1Ip=Xs-(syrl;_82LF0ekRHD57PD?A-R*fz~e>N7V9HjTgj= zuNuv-Z8E0PrQ)v+M^(C<xFrIPOHu!T<5tv*a3U0^GP=@LPjRYnA{A%EHI=R?#aRzd zeZ|>eT&1gl;*5q9tvK}wm97}YX~1cyIGc`1ZLzS@6|1;ci9vgfX7P;`_q)?8UGa+h z#KcOMrno<!C<gB}ngs6MYaDgCHY)XF#e)6DTR9IY^{<?gmcb{}vfhkJ*W*h4xf5!G zo>J<sy-M8tn$a$>`G9di4NQB>_%0?PC1+vj{G8cyizm;{!O!)xb7bM$iCaE0lCsh- zgUy*TbB-B({=zw_#l=zC(~FD6cOMy<3GK6H7cZP&I<3^3HM?ZNjQP_hPmRhTcF@O0 zy5HM*_Ec}yd~ep|`NcE5i@S81*r|ipn>E+la{lBwvu938ojgA+t7LjqAyRm=rYxK@ zb@nuG*0r-IFPJ!I^7Ye7OC}d14DhsTXU>^6)myr-q-6fIQe-w}cH68ub0-$hy&iEE zOk6l;(abqhyGb%NsNo^F|DW;@Pkn5ZU(@pX$;ER^7k4b4J$cUb+NH}XPR*X1nq8Wj zJvlAAbZ%F(&{>m9N@h>XnmTzt_-xlMyF+&S%VWgaPmGRn72AE=eLE+a*4L&*src*@ z91~t3E_`D6MDHWUU}tmO5WC@sk<lD+pG@~=6?<z^Fr}|u3y7*%96w_8_qX$UdwYA& zp6y*UdH$T4bEcPOr?&N0JelhCZg{etcf_;>-nrKXaUk?$YIc2JSFg84@g>L>rP=kZ zlpVbzZk#iB&W+c5ubn&JPVPNW;4{<rG}9wWeBC%LW@ZQ0e`>_Jl$gM_f1%kbDS;=B z83$Yn{_f{X<ESztF!(>lMpa~;GTOQBP#oLElvBo4xD5K0Q$|MMt5e35D7EK6vGXgu z8M*dHV?@2I-cw4a%~>E`{}K3x=Zv@17k)94T=iQ|Ua(;P%qa^OObaCaW++Od?3oLu zUGEJ-MYG?H5rNge8<mRi|6x3Yd&|-<8l9AT#rTUxRV@BA6aV)!N>N5D3a&4^N_4L_ zytz{q<yzeIrYJKMWu~HBrzrT>_}PjwM^Vt%l_<(Qd^eydxVvnj4}->FaaXm`CVsf0 zj8&9rigLZ8Ebw8pbMF-Ys5XodF04*NA2${Q_0ZwPV<DhnMrYtq#sBt1V!7Ci&qkl8 z$;Kj2gg@KCCj(DQOr|b<qA;9B;g!dqKdte9aC|!A>4IB~+u+*89`fn#=#DPBHx8QA zJbfI&$1lD89RuVu5G%VYYCVG-gK$Hj`3!N`PcQWR<}(_rH~YB?JKy6R<MB)gd9KFi z5?4DWI<CY{XeY-c%qlW*dwaBe@*Vzs3>r1hwT^4C9a8L=f@i8@8lEQqcOQR{{0wa5 z{NH;Dum-vj&rQ~|#Nox$*Wn+9Bg9J`HwT|v@Wtmy`CNx{%FFT0lFw`mybJN%DxcdN zw>cK$xdG3x;L{ib^yQ!Fxan+J-N#=S5E5R2OI26k(&^QXRo1h{u?B0hRLp799CtYG z#Ir8!v(~|9gX3;IWq9tD&qloM;8X7K;kgTsaQItbGb_(=zxAxgS>mmj8Mk*-SkE@c zHpgbi7Q83O#Wtw<>~QSBY~Jq}jwcS!!@=i42cO6AJo-O9P5Jh7w__KcC-LmW^8}ts zJWu0!3eO{W#^C9P=K(y=;CWm=&*G^1f?Ch*j&M&aOvzJ%&vTB@#~&KF)W6ALKc%<{ z;QHV*-!b2@5>Eo2hvbuk!-!+?6yj-6>zRWWt;vqLct+qEil-Z%Ys|+Fr!$_JcoyL) z!7~rf^ZyT?7aT7*@)8|;ux%HE=RQ2m<&%UZM!<S7n+!2#r@YtgF~rAi&q%)u{jh31 zPHc@vU@5QSoq-d-^tq(Vup*%@{L(Uvg#oOJRfkQ(1;0&&6ih0l5g}8UX%)mWDPwV8 zlNAVww<A1D8j!XbKSGSC=gCqc#PWKc=S7!Dk2ju3X3eJ_1_LKj&5HDFOCyjxk^>qu zcjn04Bj84gyeLn`7&AwvXC%9TEJQs?JG8JQ7y*(lJZ7$@AQTxUQD(<js(3rf^R6hb z?-?LIukSgCFFuyXdYUGtFdLYw)HKV-kXKDtTZp^Yc$)ZEsjGo#X(89BcSv8VI!?M1 z@q5_9F=0ogonxfRWkUgjA*P-Zse}Zjw+bmI!*?yL8}=U-C2kEx!@f_^(9{<v8hCX7 zWc7RH1H`FT&RDd*knV>e9N<=&VCY8WBk8|OS%jGa31whMiLPz()b{E;#A&5ODfK00 z2|{y$9;Ob5Z-iQ;a*-&FSQG2fr{vf{>0X6IZIxu1%^3OX1>{ckE_J=SLA_hOM=ewD zRX3{Ts!%tn_o?@*o7FAq1L}k7R<%Oirfyevs1K<Rt83Lq)JN6F)W_8)RIxn9)6~CC z-J`y!zNEgaz9Q+`*>+Y3saF6p5O%QIPwlUEQ@g7@)ShZDwa|(=K)q7>hTwOs$|Z8B z;hGZPG69;QaAk|@FqId<br;7L{5}PX9W!nQn5KjHp{1vtGeYUZT8Q^_Qo710IJn@r zV8wX}f2ByIf4F0+dWD@*emyfzhExpo+*vi7UzFSnBZ4bVuF|g#^0)%N-;qHx^_-Or z<LMUuJ7orZKPg;|eiMQ}3%}-A=!dgFS*qNuj1LlI@)dw{a}s(fe|xK4;kH&=scqCu zwXK@1W~n)9uG&t$B}i0v+yMV<%odr>G;hh&4K2v47IY|}uPbjTeN?RPeKLxjfbQE? zfLmC$>5WODZ4$Bczq^%3pZ;zzX{q$_A1tC}UJdZuN$n`1{q1zpZ7uP4NPnfp7X!~K z{7VPEf8QUZ%J3w0lx)~yLoEK-sN@chTQphgiJ9I@>7nE(-IdNEH1>!1ahwUGi)m(A zuI<cKXREW+66ABe%6+^>7@z7P<c2*Tr12wsNh0ocG~{d4DHc;dTj*s9tFFeZLTDu> z_A@bwM}vgDTjH1C_n`VWD|MXGNQsf~IWp-h(ogRP(svNPcVORj{LN7XcR%b~+^MAb zRQ?trqJdGC`;q2O68GI&V4P|ucW%&t5M#U~m#MUYo35lO$x3r&uX+e<ysf@tF(U~$ z@?}i=bFoIj2~R9IVwKmeINT`0!Kgy{hQ+P87(s$|DG$hm75III+R)7ZqC}u4!idgm zya!p~j}T>=MQ@@7GjG&qfcw$EN>UET1?4yR5)t<zTm$Y85;Ie#E>=HBXoB<$_-<8} zE4M4R$rx*uI}CVUlSmv!k=ZQ7Z$Ko)ds-x;XT-WpLaiTe4w~OCrs7p4`U21OS1A1u zrLT<E-ikcHioVKnP3IoWCjSNR(}?w`71PA*m7ztFkA3)UrX&UN@k(R(n<yUq>aqn5 zd0ry9g>|+33J^!u9T92+B>b<^ND?`wG?y;AIJmzceuBDEEtl!mD65qO#ZWYaUR7R} zB>fMWjD-B&Ed74Wq)IL5LUn;f)Q<KhJi|a{s3gptR&Ecb%iZF?%eVs+pTrHu?-1CJ zWYTuZRQS1VXc_Ts15b>+`DBNTZo~178Ny#UvXv~QrP4x4#aAIvn<oB`mFuwzqlrO2 ze<-naIJ;9>hlJOvkI6WpKRd0!qe0+}LElp8+pO@-&OaURJKl2~aJ=C-Y~i`n+zN}* zj~$<wZHw?hlHb+vt%uz}5X@bU8!d+JbUYC((Lv=kWgkLYmG_jt!|f2nyevPZa5!EF zLjECr$CZD>b%EAild$}K#F77SFt|PFYocn1xJZU?$L|Wqa;$^!b*C~ML<%g@1C_7v z76{X#WdFNLo^nJvs#GZ4k3OU{R8@5zHWsF<I}m;X);7;#2~lAOc$<$jt>y2PN*R_< zrrB({w)3{~m=bUtR;rNs`^q*OY`UUid4k*jj0`jd=eJ=|_$5Mx7N_{S0wG~W#yVz~ z!>=wwJk#vP605&*AC_D+8?nTAQhCQp`2rwYB%D8$SOq)>_W{0>Qszfu3NQ*SXBt+W z%N+hY9nICzSU+5g<wQ?qGBz4!Ivz&#bW(rCG^(EZ3N|2mIv!T9QhH&Dzr~TR-t6=_ z3SAwPj>>LFYo)z<lhPZ@wC|KYm=1PUmnfs1<Iv5_Ro1GvtFxiFE1`woD?cimocXTy zt~2Tpb)U=UnxZsyKBDyYyEw6F@BGx+&3%(=k*n0z*YTt44X5Gy!nxo1nJdrL!PU|A zf-B%^>b}Ok#(lf{SJxcO3?Ft5aXsRE$azw|2TQum%8%+<wGbal4R8!}ar<Mx-10a8 z751p_IHsb1o~I@{lbi>f9#^^JoccG%n-J|LhyO;$K4ri1y3z@QVmIeW=a<fNt}aTx z+EwYNI$i%%H#-00{K|PsIi^01HRDe8CdW^%-(3ydW1NxhC34Y!i=&Hcn_|xU;$2N$ ziLO{zg)7~?9YctUJ?vz)7bjW`mfcwIeD_lKvP@6r?!xUoOM5#U+138@YFa^dHMCXT zsf?1fn_X=__KYsOdQ!na=aoHn^!Ty!kDXg%4*f-kA3HM*8k~znva4Tbz>!vPzB}FQ z>c=JA;W(}oRo9P9Q?BkyI871Kr6`a08LOlfq!n!U_uMY~p?^7<{rApFSE>7P7a4gQ zmXS-5;d%HQK<W&)h5vi>b<64(RWD<?B1WnOj$2)0)q#b(3-4CXtD4iy>R#z8t}!Y{ zvwBXl-oRDbdsd%p=Z(G>eGbRVUHoOPH(ecM#61oUwKS!@DI7F>XMHEjd>S%h7`-ju zxxoC|;~3)dAKCsZ(|l&7JgpX07gfjfJ?Sj%y*GcPy1i#l=M(Dr?%%sen^aCXZ*ru$ zcB3HoGuMWWwytyVwCVR7et#2BXL~ZrGd#T#hPo=cS9GUj8$y;eOr7K6sAu@^F+o8% zZf0>@TV2t8d(Td;^XdrXr8%!dx<NAS_MR_801n63GSnFvy;x1L|Jb>HWD#l)$CTXL zQ4#<1<Ck@|z2|HQCaqw%>v`91*H?Ym3*(qsPj2?m98=G`Oz}`GUUyID_s(soUvv(Z zxVAcvfZhKfMAkYxeZbNDVd3ew>zQ@^J7S$yPpjAe=DGq=8Kfn!v-^T;cj4P8+fqey z50iuj%ip~XFgHW1igNERq-vP*Tx2d#kam>2$lcA+&^_4M2=QqfyURdzV)dJn_H+(; z9)E%Qk8X{+50MHUDG8VMegl<6e)z9y4}<i_j)iWP_?Y^#(vifha@+|2?!ukwtUhhJ z?os{DPh7rys+sP74_RF8+TOE|a$0!~6i8`IM7Gmx6?C6>4OdVx{_5Y9A3N_Zq-LhL zQ{7G6thdtMg&_SZYIkJJFL?DYKeKkUb2kU{UiZ}M@11?24YC>a=G6Fnbqio_Rvvfx z-TmEcRybYhu8@Ul=$cgUJXqP@^EIjEiG_)UU-kRN)u!K9{r(o||63%Ved>Jod^g>F z>R0{dyXkVuG~eB(pQ%1m+;;twxWn;PzlH8&>SXtJ_;(k+<C<GN+P&BLfGq20&imXC zgP~5!_s&7CWH34&l_ZnlXCpAIe;M{;M;NEv0Q%i^gYvH9arii`EJ3$C1c~N3ccb|q zb53-#Iv|hg^Xg*6DeZj<ZIO_3YH9CRsw<s0yT60v9_DmO8jgK0Am&naDSX$#M<wQC z;*Y6o0rL;5UI6Dnue}Xct5m6H&}6U(2h1do&Jcdu`?_xL$@+b!`W=L9GJlgtw7x4q z?<LDl;sKdMn|^HnFCi{n39^39fKl!b406rzJ3n#{==C%r6;&TX)-xsQU73iHMyj1$ zBz&*qE2*^`QQHp3BY=G5GF$)s?j8{B3Z&TH^EP*B@An+%oWJ3@$FZ>b=Dv5RuT^i9 zy}}3Xx7{X-<_K_;`wQ0>Za>M9_aic!T>Pz5KlPs=w!&Rh{UfqrLp<sJ%JHRS=~ZOK znp}nu8{J~}4*2#qSS7I^;dijJT>hGLDMdD3NDl=&)VD3R57Ak=$vV|^k-xCORaAYT zm)mt(t#EHe(uwW|+^v*H-1*LL-QT+Z>wd!hp(M_lEA4%{@ApnhqNMr;5WHDRi<r~y z#psnwd;beki0rnq*99vL*}bA4+7fh$6}kmG8Z5x>!q*Y=b%*~}bnGUtMEj9!Wx>fP zY&Jv;RuUrE1$_hjNVOsSEFT65^)<(GS9__B|B;Zd@Oug^Wl`Y+?%e9HT!|55oG&ZC zpxh5Q*(aL);`h#xGL0!gY|tr?fFA^hD2v_Mh};5M*v+J#>o$`s`Fo8N;hZkX5d#a) zxVK0Dhz!#rPOCq|?d7WHeBXT`e|KR+SAmP8!)f)aK4#**4IV%>(ofap^x$jvS=khS zK+0cW{o8x?09Tz+ALkG>HPvn;N(7g}^}!aky>*1C^VI&YT)(>WB8sY6dH0}wM@B>; zgatEj2@!FabVNq%RJP0F>;#QaQweqC!y)yY-*wKl3=yu3=#Ok@-a%q)7+9g*h3C~P zB9^%qyUi}zluxy*(DkZAacz&jRoPv5Kg!%JVq8Q4+(m^+uHtmOIdUviN_%H1&jR*U zAG7ZmZP7II@#Syt*`^=lZ|Wz3O2nv$-Gwo-ypQ!WD`N&qb<w@T{X7Wa3s{#LVfwy@ zc0BKDWRV<exm>gw5pDYMVf^8);Yhc;usP`VgPcDHyM*)iB;0m>Ohwy9%yXtn0;iNk zh1;V|ZU+{oN7R$`&T?taV#HV^6Wg6nCLrh`BUW<H6lNHz;CT$%YX0qD?QIvU;ItYU z(FK{;u7sKp%1=YWy9=*zUUa@8hZVvGMcl6xr<0ii*8`4~$jonP09IlVcSo$0Y3>DV zO+=%JgosUuVVjN8UsPS~>Kri?%-|o3A|8+$vIt!|Rn&}$i6Yu&;j4v8#63ttv25=- zJc8YfX|^FTrXj(w!?8KY1XDg5@wk<)sG1|ig9y=3Rpsm$8xZwgt#^$DChCC#{tiKe z3KWTcn5TPp^PTsd2hcQTBs<ix_jTMGan#@kx?<Fk7SX;k+WDUIQ7|(`A+7-Ucf$*5 zcKQ~1^nD&bT3gYW|CnN$3OGK~JHWxjra1$?2iO6)(~wOK|6|fk)P{%+fM1s`Cyvn{ zwsbiD)(RUYEjsq*Dzv%(8txguw2Uz7(cKwQB_U0@3a?`-5S|YfZ?y_!qBGmK$TJyd z_)KpT8gRA9+l5x{aLlUaDWLn&KJ5K4{Qne6v8wt_?$w@hiEV2WrpA|am>n@YVp7EO zN>(36#V)bj;u(HNrxO-0T{^Gt?7%|QHnVH<Vd)C7{BvY{fhEOBpKba&_GP2w*lf;L z??@tj%|AQ7C3lBm-qCzI-3rH`24)$r%b}D_v)AQv*Mw~7lhL-1?v9MmkX;8RY=N>^ zd9N17$dNC3UXCC`Ei>(M*N}J|Li?v<H3bDZ5&o=19%6z#@9c=CogQlAa6Biu#^pMB z<hsJKTIN#Lp0V2Ntqhq){(Oz!&mo&!PHN-TNqDV9CHNv(foIy=k-x*>MzdMHHsp1L zDe}6U?u+S`ygj*jOwW}1-it{Knw@Gkq50pNJZLobyx+V}(>+b+dslkeCRQXGN!T#- zRHT@chc~)Et|7JD62If0-WDw@5FXH4YU`}C?VwMV{B74vIutrw+dP9FwZ^<+$vGaN z$6J{2=$3O^+A%uUswYK}^3bDaLB^Y@v=QCvN#(#FxIu<p)sh4X%Im)o6#}NPb8DJu zmTNjItXvsN%FB`!_PV-M>LOw0_A7mME5YnPC~$0rBE^~BrtV@_9{T)%Y&A^5HuGi! zOAD|}=tqW{w&|k&+8RSHtZlw+XN&5AYTJjgt&rtOXmWq8g6{>x8yyi4-FlKs?qzC@ zNy=1(W7%ftVM_@<RMtkUjo>E^q2~Q`48_ruRX2Z4UoZ;g`M7#e^`MZJxgnS764g5+ z--HjZ@*J5tPoU@7B`L=6v|}xEun~hjVzH4F8<|S~@tnLiKZCN(>l~!C3koWt46ixr zRm*aYW2sU)J%aiA2U3#VQJS7si@n{oUDg+sITIXiY40;Pn32blb}jN)nzl*{NuuqS z3E0n+RmH*#QXh#Jq&^k#6n^ooCieAvv@1ihr$8_<mno8ZW1GlQU31%?tlQ?Fvaq9h z%u$*twbYs7K+hO_h0@TqCTm!(Y!d!isb&iE_x%usvs-yF)NOafBSFkFmT#9bAHu#b z2sbI1mG$@3PHFe05z?#mgHo4%Dm3wS85sJ>>F}CR#~R3==8$y1f?yU&J$YH~V2HB~ zJdt{6t(&5GCt^piP>r=0z{(53wn1tKvMBTP_V-0R%|;e9?@E?laK7LSMC?JTeGt5z zb{aUSmg$E2Yg1!#)POQSNXPPwaQp;in1VZC207Q(OK`kZeFZjE7X$YE#dQ(>>S}j( z{pNqncSSlbR8LZhFUDOQR&VmfN?9w_7rE_Ee(sOpd&b0za{)1p|KJ6B8dtyI(jtDT zK6i1U>$l(AU%06{)-?>}{LnednSJ5G>Z7&FykD*7_{Z<3FRs0){PDRu|98)YtP3%< zVmKVz++*C`-78$fq_hRD%&Dlp&e8J^=fzK>evLFUzpHwOKcap8V{XM!TK&2EVQ_UQ zq7(_{Uzq1Q{l`kzK1p;$#JcL0?wu&hAMPrY_#1WX1&8wo#BM9g@$Mg3mO9T>Use5v z^QG#){XY7SZPnG#aeUPeT8}z+A<bhK9{T-J_mkC6Tzmqdhl0%dO-|g7P5?vl8{V9R zH&2z=2Y(zJ>{mG!V0-%~<#|QmJ=9`s<ZW;?!?xdR$|LH1$|h`2f2yRa&#5mdQ*egr zQ}t10FZTXZm0s#?%G-{1s!MspQQvj5ny!p-JmI`sxyMzeC~AayzjL~4t24p5-{toy zx45EIubQoV?R>}C8M{(V)DoqsdcD%#@u0d)+4_Ijdk=6einDKgW_A}2?a&VAS$Ywq zsaR2zjz<(!iijZn&=fh80|FZKv10`+xIv@A8Wk10q5{gRm_(Ck65k|tW7jBZOpJBE z-*4`nXZJY=j4|Z>zu$NLXRn=d_bEFwyF0sM#;6bc5B)FweFI}w=%s49-qV|n_x63P zfu1=<-|hD@_xTU`G<bKj%&gM81($gZ{V8fs^HcS>{|oO_Z-VI)4E5ghM|j8iYq5fA zty-u5>W$C)TuwF7RN{ruYCXX}L3Q^|z*2#$knW{dstIPAzD)0-SK~#+naKTW;8rWb z`s#`13-4}yrs-;S^Cw%1PWmnVwr=bFMK|=$FbDceOeg<6P_EV2K;aTIz`NXQX1>Oh zd#(DB*EaA?{so|3!TY5b^%8ToM+KjIYt>6A$ie1iy_Z>uH`WK4Q%tFuU^bim%}DQ7 zJ<dPgAL^~g#XZq1)d%{Y_!G_D{{Cj7zf|vUmY5d7f8(+LQcW}0TVs2ARVeoT&3e@? zxEi=?)H44C{iU}S>wuuTv%k(v*5`Zcy>tARbR+K}{W2K0;??z9eMzvytPj@0yyoV# z;5A*}TnsU<YrG^hL$FHWI+V+Lbq>sV#{9!us;B7bf$witdz;&_yksg?XC7*f!xQbj zP%fW){Y+n!*u&l=yodM-S<6TI5iC!5)EsUe1S-;#y-5Gc{MrnK&?#sG-OQP0jyFb4 z4W{a=^aXfWG%dKp{KdP`+-tg<*;qu;1B)nb3?k#9z-I;B{e9KSV54^r+RbdVr%K%^ zs5bM=e3J*ojc7evO{G37_yWe=uO7(bfzCr1p?_=Gc($lhbboJ({?dHx|H;(VxB2@a z2VL~j{u#mUzVUkKo_Z46{^k08gu9zRo4s)rJY){m2C$_lsby+a@IG4mPhdJzJ#n6( zP6|%Ib#nq*+BZJl6PVw4FQJ<5_XeB%9^OWPAMj4_ux1^^FX*2Ie=-;PFQP$JqHdXk zbInU=f=kdI#+rfVL$8DSnd#~u6&&c#_8x|s-<h@QRCBz(La%_i9lc+B58#dcsb;;; z_Ou$8^5~#%Fi}s1%**lOZ?<>2{=NCJe#PvQ557d?CFJQ5)c|7F;&Ip#6l8CRU4twB zTiYbhMU$xyL7jrtST51W^a|?u2YDs_V6z!dHs_%CISI=YJE*dtN?qiac=NDSriphm z)~=k3EUi{AdB5_i@F;mLRza**-I2is>O5eUsr-Td$sR3VsLK37c=6LCI0bD#(u>qk zSpT(Y>c3_t>SKZ}`gwo4zZfeaE4-n>U~h=`jhX1x^M0Yu@Yi}<)e>*1_oR8s{KCxg z*67Rq>--7&mr#GBKi2PPntEHz;ocG6Ed7GM04q1PnitUkw;D8xPF`p4F%)op?=J6U zT&r8n6Xt4fws(gqF`t+-(Lb<U3|8T6MFZUmzh`hBQU`da=)?WXyvMztAt(RslkWw6 zlGn^Df$**VFw@uj*5tfry_ZmqKlfkOH~H(V(w`Z&hGme6{4awQ+r5vyPrP0p+h%=p z8w%`f6w_974TP>%pL$Q2qrAt>GhjIvmt}kJY_rl^g}eC}n6ANG??tGrZ)Tu)?}3C{ zOmE<>^MYW!S02=Zgk@?mva!TJ#ec~^I=Iz~0lQs22Q7>8-rimZ|2fq1RcIV%nu~){ zZ(J}P?V%oCkFUi`)L*N8bz|gJc}-1(Yxg23+sE66DRO<YpDy*=p!k=VrsfVcJ~-Rl zsoMExn+|B-p?|O521RF@rDjmjQT0V?J9?Lw%?0XZ-9_ExACC?_e~Qj|&nY}#_x|YB zGiQ0F>U|XHHnR<6XZtH@H;Vjbq<)QZX^i#Q+mPO@nwkavHglm~3d-|w=5XmwfWXaI zs(Jx3!`giXX6=vh;Rcw$)!d*r0@G2w>n%0|^j-P@6#oTzEa|uaugsa(Wtbx@Q}@|A z-e&exQ&FHD04ewW?5)6E+{5ZZs6NmCJ8E<q8trQ+v8`q;D(NA8hYk#B4!~N43)JuZ zS^DQ{AHTmp6^(d~IZvNt?$b@x&3I&VjQ@zbNMGx3(sOZDq5to#F4J4=^*-4@MYr&$ zLEuYzrk_J|T&sS9x;)XpA4ahrUx&XMPabda@9{T6IUCW*{w-)=s}%?2&7kRxb1NRS zv8k>_u^U4}mzk%0W`?+}=57CBJeoXOqyN82_3-yo=bM|s_z;#zo$tSi*E>=0H~n{r zIL}-F@^^gZrXvh%i0kDc{bT<@;MS`1f-}%>%mMrqeT=U1-#})TsS>l$UumlS3jn_r z&v@Uori_D;Z)2I@T|vFzH2)KGa<CO^;qq(Mo&G0!MX(I7M3$*}sPAiVPxV){iU%Q_ zMfwGbko{tRf4Toll+zmhE3i)o^>8$&n}K<m`BN|I+mP2~s($c^`6)1e^#6p5?heyi zo#CxESEy^%D}F_AsWGUE-l`fs!E5@dJk-9ZZ}8XnAM3?xjlKdy?;vv*TIkhy`g#SH zAP0D--5dSlquw&W<T%3oTrGnESHoYc1_ukkN7`rn+kH|!i=swJ1f;$LQqXOA=bFVR z->dD4X!>k#d-?hM_2b^Txct`W+ad656!zmN;NN=Z;c7n>xfu<$@0#~afB#Igk3R$D zv|61Ds?`u`(C|L@_eMcZhXIQ{V}9rT-rJ~-p*-^&(>r(;N^jQ>>ATUhc7(#MW|Mx- zjPZT~IbGBS{e0eQ6!Z%^z|Q^<Gcfp4Ka5vktM!nej7m^*@9JFes$L$H2JP@*`~$rj zqVmD9-Zd!rJF$~63x1hegfh}F`M+&%cd~aYTKRHJZ6*ejf_L>YuQz^Ez7HyQtJyzj z3gxF`5Stww6y*EkVcRuWo3|8b*7j1wB7cK9S>FYFm!f8yVkVRG7U+4w`~brf-Y&N= z<Ghnl@XPf`G}~qBP`p}PqK^#9%_e`O85x`%++{`uA^4gH?Sp*)TZUG4e$ZR>@$b~F z&E>(V-YGD)TJM%e!JZRTL+Mq)7=(BD)#&3;uRtzS2m3b!Ck8!W>)rZde=qM4|2Ewh z6#HS`w*j5bCI0onnWl@mCHN7-e*Qi_=Yu@%46fB-Fb^`8sSPGTH9(@@4cKK^%<_eK zPd^ac6Wkl*`vA~J{RPE$HCBD>ftQ5U=qUHKS8)q}OYmb9));jj*q5Oz{keKpKc|0- zk65bpd)B{I?HM#uA86m(S53mivyS(ISLt=f?B_hy!z>5QRp?V%_`lQ5Pz84ci-X_m zTU87HTvX**82|M^^A{`>x-VE@_Qgbl3*K6(pR4Eff9pS>b8Ugo5W8W~%frEHtVnn? z*c9w*D)cI~FKT`Rdb%md+v(;s-2*Yg{-}@k_BEUEmB72^12fG$u1?1azI}n?ainIa zWBlcq9kIuKRp<BBe*@x2u#|wldJcdxnb;2tmi~^l0c-SpESDOkUxgS_>}$?}U=hgG zX2;?ipi7W`A8&Q9F|S&>YP^?uN56ybdbpH!k>c{%#V~q3=<c?>+dR%C9>|;ftsPuZ z3%kvFh!4=LUPS77v%9II8=22=H_+TG^NzxTrB!M(a=%Ko@K&jIUKek;Ino@3Rkgc& zN8_u2u7IvWMXpdIOgC?TuaW8F&C?@QKkpEPN9$qUkqDRLd!$j`@!kZ)^Y#3hXv_0- z8`a3~h?X$jJJAZ6r{{TH)Fv!gXand%Z<Jc$ReK}Nz4{byPjpht^~DxL?4{m1?|SbF zZ#jC3JG>3vX!VfAZStP<p7LJyp7!2_s$<j#-q+q3+!TI;RDiYN4gAJ=zdi)C^xOJv z)LDkYcx*s*w8x?unnk~x|Fr6W_-d%FK<%y8!~7%t5&mjD5+`YhBPV8wn9NPVZSQIN z1iZ(Y54o%LT=;o^gFXx4kNg$>Dt|SkT<ZVK&##BbEBwCZUI2L9@1N^$wDHY8x*gQ! zDx9zC-u}b>qyBG!dBH~;@uiLY+OLB6m+>{`eD!DlH~w?})&3v+pZM?le*xv|{-x+6 zmg~(hc(tyBCcIkTr|P0RYZx>Rs#WWtO+Hwz_X_q44hR;hLxMw*TCE2JhXswy5y9AC zc)&)28y!6H<(heZ{&gH^Xcqm;OeKV!5X=nb1g<6g!k>%R?WYD8VK%f}d)^3hS#W7^ zMR1mBWY*x~epRmxdiz%g=jdyKbwU0d|2lNMHw7o@+k*|k-3af8g7x@t?IFZB254{y zPr?N=M!kW@8*gD8cn|a7k>(=|uP5oV(N~;pcx=OYmw%Rx^8=i^hW-=q*(g^j%us@J zF`)m-tinJ<+#tOqZw8}yo`Hzw=3>1J0+-?vIvY2fuc9|NNiR32;rea{GgetO%fWmq z&NKBNa0f#nG;WjiH|Qb$X1#k**S`|sHdNnfx?3>Zdjf6YOh`Bh>4m{*`dF0iDy(QY zP5;cxpM}ojXn&x0xmoQkGK0JsekI7C#C}zqP<N*XPlNPt{wnPSesG|-N}uVSWtIf1 z^eH(1?jIgp1>Ah^an%HAd6tp-tMrI~`(vC|gppKlj60x=4p@<Eek|*T_Ta6v^|=O~ z=kg*(JaN@k5O|uNQh0tcf<iEm;td^2jPX@yu-2DlqL1Ja%!Oc582X6VY8miG2XL-` z<caw#Iu$%E1uS*Fks>wcYcz)LTKgKEF~Qz!B{Q8$laws;TqVzUL@9kyDQO{;_$HfR zoPw{graThdkjN66ORXscot2n_2i)orOi)W9S7;Ij1k5<z!LevKYZp=fWt+^U2~}@D zhX%xwpd%&S4G_jJz37}-9c@b1P_xmoXT;KPye7UBlXfRTegtGmQ5{$esSED_1t>29 z$mra9C~fH_OT>_Gt`z57jy_#dr#4PL;#lWT`cm^WcLYWaDcKSDEF>YdR7xE(EddZA z=v5GrE=VW&J9>m&KPs%OB8pqZr^n6nBX9wbb(5L~=^~;+OO`2A$OX>l*>u-SV12O& zuYPe1*D?Y>;yVh#iZ6|Fvu4q^^qAYV>Uus?W^r)@w(>IG4HyjF2rNqZonEoyDtSnd zyim|8yuHBw0Rkopr*qPVBuCGvXB-$IF|JWCcDdp*6Mkd3)$lBCeUwR@@KFr)*}R;H zj|T`y-E<oj0jZd+cI`LSv_u29ZHes(s;*~VS`2lhxU5rIN$d)1?;7NEl%c;~GtYEF z>o|auf)RjxE=e*e6lsD?J13<}k&cFDI8*RG9QOgY0e3xOTXD}rmn~ov1R%oWxKP#X zC3soUiS0IOQ-sdJDFg0$Ov+f6^VF-hSlA~Bt?)4;Yy?~JgoiPvg<>H-U6hMj=obO* zioPdF?y&IJy^{r>usQJwP_37xeWS5PZj3n=kIarU<IH$`b~eFGG?UC^GsR5B^sv%Q zH#5vkGYf+GWe|QKg06?I)cW+;K2EmP>_C^=uF9ocNE!0~eCZWXtkSKreA&$0Wk<5h zldnUhuOg%iy~JhS`PrYAu^)IuJAP@>uGVMZV`@64U4OC0{^bixVv38!31AL!J+MvX z+LMGA23yM-RPLkD!^>J)&sKhM(>za(>v3is8HI?@H4w5!eU&sO(R(f6fvtZo(j^tX zeoUOysqi@%Q}Vw%*Ba#V!ng13RWtPeWa9VVbna5I3F}RdrY*+TL9So~LCc*k7CXN< zo^A_DN`tt=JfThLB+WvVTBSceBZv4|<`G;**Lu@!N9}ko?_p81(4=PB!k`+~Sn5P1 zg!64;`@AIA;2X9zkjcYkZ4%;+bq;WHZQ(O1bqOryWY#&#n1yzYH(2I+6qJ+Tpv131 z&eIoWZy~)1=bd9b`Fh2P!WVFu%sS^<l%#KPU_2$EqhCxx*c$b7zAJ2zm(Q(*)Y8KO z`L8qmEL^bs5P3~eVSR;sl8zW2OgTQvayarkIOBAe%he}C0Fl>P0asX`O~DCd)e6q? z!E0{~W!}caAlIO70Q?KfP0sP48;^tem*S>*E_>raA^HJI`^7b=JGwQRO9&?6q?pvL zv1xZzWpU$CcWJF+QDw?xV>HxNUD9T#pCYa=D0xfC;aa3iDGPs8J3K??zBmm~;sh^T zE-ooYfu+n|A^!vl8O1s_hAy>#q0JK}aEnYla<8#6M9$^vcPP7*ma#cV%N6pLl=4Ij zKfFX9(XWA+&4uoI2@;>f51qTrIQ(Q?aWQ}E$GE@yf>%g1qB_^IC%zKM9AuRA8XJzq zRabD)b=9~eh?Z)kzZ;r&>b|g1@kIc|(UFTztYkc!wy1>0nIkZvb23mwWgwF>`XXtG zC?eYpb#x`+I9U=+GyT>gJD<tB&OtJ<KOUU(;3eSVI}iDBb@Abp5z2TmHk(Rt`69yh zMdGsT65o+XVgwuFEvOuhx^`L&+#eGNIr6Mim)KcIrkXerB=8;KQ~H!Qr7OVl){a6F zshx`?MzH00BPfTXuALSG$C{>E4yIi^4fAQ#k=2HXD8hFv#BrnwQo0l-{En8g5YO*W zBvHaxmRRr7sW^!VrKqDH;)_il*|>w%4l$#v2_z%kKNqqiWhqSfQ|UXAc!;%?_LB4< zYkSI?igWCeGp5RQblbFCyXfI*xi)?|lP^rmb!x{L4=h?P#9SQDJszEw3!~Sj;fDeQ z3gX~|(4`%DHZ6t1Z(-$N+QoMs)}|3TfamRJwY3RSVJR+EmcmGvO-VeZES4kKei`%g z#R42Vg^CdR2cbsf$i^M4I4q`jT!ad*3lpw<L9`=v;!?t5rP<UDMOul(2)16qbVr?P zI7sJ(jLL{UxNzVngN68xW8|obA&ic27uKYabi$i2A}kh|P3>GHF@mk180-|M{El0U zVya(q<okiyC3Y54U`-rhbcDOGCXJ+1-juEY%Ue4NNh@q;B1t8bzfa6@0#km838i4^ z*TauYcrZ?vrVe+gZ0HD5GGP;VDj>@fO+Gyr<_RHHN|Tl4q-0^jAv}!#E@N!5oK&vJ z;lEkraB}O9vH&I>DjOC<9h0MWVV0x5j#i(Ep7QoHb0v1#>-42WshAYTn1~aVuN2H- zI#uLo9F*bjl^jlPA$53ya0CqLYNoS{HSv~~^TL*SVb6-ligH2-+Yy}HuNG7bm7^7< zsqe7AQ*v0@W8kMrhe|^drK#Up9_JBGm&Mz-<V?_6k}RncLfDSr<bEv?ElQm4B)YVO zuP8Z~qI+ee1=whUdWGN}KnYJBDd?QQLTGbUCFm?kmNYA7M{sf*?L?A7RApl>jxgG1 zdagzElgix6XpiZ+R`opnDysWcOdLi{&vlJPkIT)8E^Lx(5<N36SAxlC^xxw!1^N59 zT&w!;qx5(H*k*jL)rnRS()e+!JtWO<<ajXUFlks5>UbR7g((MOd@|TFdTDubr3x-9 zJ(WVeDX)VQ@<EYZqKC9D=Hd*!<Z%3wMyf(NR2q^fO?g&ema!(@L(el5|2xCF>^gZe zl07BL3UgwFB30txgnXJP7YWXH5?wkC-&b-FqM}|ia&@DNr{|jJ_oHj3=MD_83R%5x z+hz3W^jx>7%?#B1CkfB{DjGZ^cRJSfKRzQ@5tYmY?vLt&<cRi~nd>y|QzeI$4=+tQ zOd66VO?~QEY)Cj=F&-)D3Iv@c$&y;mgndVFa=%y*O$s{tY0Sl4_=%FklCqOalMa=J zBuZ1CSRUsQPFIXaN^&OXEJ>Es2_bApaB{y?5G_=WR+Oeb;eSkyg4~f7z@$T^VNGa( zDWR^3x15qIMkz8S$ttkm1h*qNx!)@ol*-A*T%6&H$x)Cy(gK)ts5GnzEifh2HSv~H za>Xb`rX*Pf7M$RA1Sj|Qf<dXAY|O=7_!4TDhjna)*fJwYI#e1utb<tc#M>#C<V?__ zN7zM?i#t)I5SVZXobitfa8l3-t&2G*!}pTIlEHg#qy;ePP-$2b%CvK&qN_zMxe|1i zq$a5dB88kzpcDF+f@q<1bb?QP!nY@fquf5y0+@8DG^`1AOb+fs;Yd=FD}pF8CCMtV z-~=aBsR+mMVZk6ros}q5f)Onrqjq^%$5xmo9V!h;l%^6U%PH_;e3G&`t0EhTQj)AF z3r=uCC2Aa;sgDY(Q)nuYFlW%m(TJJ33DNSIxsvFtCb%{D<;+~Sx_<!$&S=!kT=Pbc zAu0!;QQKL$_7gr-a!?XonsS&lOz|m|WlH#p@haMKI;Lv)ZD0NIq^InZ!f6tWMI;nL znT0d{*TgcBA#xxiilJi)lOH7q<8+cvV-C--Ce#8FuQndDg|m~4L}lmXngkT^Q8fIV zT<d(Q#mW5J4lJQHf=_+I9!n03gePgH93~BGLYY<_tS{t@rsPRXE-)sX6NE}2S&YCO zq?qHKg6Nbp8*_1ne@zaj@vl+5BzI}_*wS46mJY^{bniOq=)tAA-7tGo>Tl7Y`MKuN zZS!)tA&u^zmpd>ze15Jp`f^^bQ%9h2(6^*XXcGdD;(56i^*%$w9?_Kfx!u~oga01z za4t<*X!NJKxdR(ykhaw73dcLqo>jTrJ`T%YDEuQM%E1$2tHvsdR#fHMN2BNE${M_D ziQYwKRrFL<MioF-)t(kde1Y=wBqf*xVPWq^P3PfuV$3|;<Sd_;YlTAk)6(2Re9IIa zxh%I=blb9A!|42FD6G$5>1SXSAKzRe#zSELfHkKr%;koY0Er?e>0)?sisXMU@Feun za}by-K&{w<=%{gZF4xB)|Dis&Xz^*o=Ri4_#6L$`4xpk5C+1o=C4yuU5<Kn1T#Nn2 z+B*<IrM@Gq#Y7SI?NW5ciMT5(=pZXZAE(J7zNB61ID9t7czTdSQW7$qI#Sn!iwyjs z%aKLzHOMvS?nnhHL=Gllg0buOhB^YL+p+x}*05$AE9=O?B>s1#<p3(GIw99OClyJc zb6O*18)x*{3ArXMg_YPW6;ies0}G5EKOxtA+E{SnrH}PV&8l%QiI2s?XgMg)#TYW3 zI!R~Y-;mngPIq@mAr~SC%L=mOE#^A{hGVr9{g;VttO|kACr(m~J4%VUbZTRYcd*yV zB_&t3IM>7jMYL*Bu7&<mTHL3La%I@ofs8yE)5th|7ZNI|H0IJy4Ka)t!F4owNsj*u zjZR;Z>#VhHD$&DBa*bytd|H2F8O102H^4X;<4p17At{Nuv;`&@hj*|z>UUDEeOCbs z&@tB}g$gN;t4_+5PJ7)Fzn-YZ-<l93jJ^vAl~fvYY0*XBNs^F|Z^>mVq`N~BEJAj~ z0GKsxm`JB@W7=|Q3bBG11I+p^B!mZ@iy@3wuMb-^aR}hH5Y6go75#L5Sf{RVsA%LV zxz+@iM`xdsD?ePvR)zQ!iI{RQ#%&4^9+HxnODF4^qH9jZ%BvKZ{=V9BiI`~B$+<33 z^~q5F%*naZ?%!J6w^lNxGe#JF7ZUnyv~W(Yd3#G;@Eo&*07pm7$>n<eIU#UpNs2rN zE3klR6qus9b8;oKN%Jks4Q`9oPddg3qwhjOC6&fpn%v@?BncgCi!>C6EPxT&qTWR< z6${#88%kb)WXhtqV1-&LXcFR+uwsfK-6Sl5lT~Z3G6YMUz)6$B2&Z$@B7u;td0g=% zoCC&m$(CI%r#oO$MOE)<QV5-dB22`IDH5+H!a7P=WF<R3$H_$*Qk8!O{x|^>z$AT# zlz29kViPTvi*d&#aHLqc&GXG5kjT_`qz)#bC9rfeB%1L>G<}Jsv`z*g5`S0!88ywr zQjNCNE({4Mixxxzark0t{BH-Ma>ha5l@UycoiF;*R3aCFC2x^;1kSK`@u3y&(&00t z4u&G&y~Oww>%<8}I8s<P)-<ux$xU$4HQjQJx(lQ8g(OWmF)+)HJb6bTVKX$sW`>6l zGR+vFE=;k6%uqt_I0(Z}F+eR<%-B0t2BAVl%nZTjExBWHj3QD}DVva{in48p9H}We z#B+uRc^DV2W(kC$V6A=;Bp}xY#C{4ANBCPwKAd1Ip0WxO5*rA=lOmK3=Aa}@;!*D0 zT;seW6BCGJ6*q-1RV`^@X`19A#X9u@ag9TuX^OG8lMFby31@W81!y=z>KKH?!5owf zP3;f&=Q{$?$|~kpbFQl2(T-IhP3<>z4oflf5=a)7HWi7znb-@tazP5Q^F^H#;6e(w z<Sp`!fZ;p%!3L|42T2%rf&@YehjkSz5Xa&8<`}^f{(3<gQ;yG4Ms3f{)yoUB^C@tS zaijuGg%t}RTnx&Z!Ag7^{|b2<awv&uk@L3A+8iTTF&6tG(Fw@azo638+xT=*V3tzK zn&=m-bjQvRzwNR59XVjqkx;|DMD^R6HTNcbSA%a_Eb#(im}2Ky?E-Neq99E%CUo<R z<CL_e%qPe{Sp_5^*eP*hTsRNE^>A@fM4#eBv@?a3`?{7Y{)3G>xdM9=IKlTz#R$l? z3xTJpG?t1!+76@L1?7B^>&RV5aj#2>I|9+C@Qo^wX-$%4gl(UMG39VC=t@9dun_qg zR;pEClp<-Ne*$#G$icXE>^g~hLO+4#Bf{{XCHskNmeDCClh8ReP9XUOM`I|@QDn^^ zhH%RG6O1{K0fjzc^KD}Q6Gmg`BozCf0LC6Hyj){pRf@F=pTOpMNeIgM<RO_Hj*U!d zT=?+2Qi3g<IN`LQ1Vg$%L6Z2C_$Pfda6JB?r>BFV6X-;W5V4jxvN{+mnRFunr2+Is zpkRt+h>66=;iM2gfgV{MqeD6oj@gBdjt0<CWa=2_Z=C5yu!ZLu5G1Ds;1e~$!e=dx zu>KSH9SRSkvT;e%cg|tc(6t6~r|lw@lTtEfm*d+ABnrxflDb5TAW3B@MZBmeh6~2w zYjQf%u^<UwJVz(2%#Dt|zBsp6<FTeIHoU;k{c!eBJ)?c@!EIHORk>0RU-Lu@@52Mv z4)^B#X!#|%f#yOlT76G$w7-WsRYwCa$%V(J-xEx<tGM?~7P>2JmB&pUdlwWRXf^X; z>H?e%v2Rjof~&RAJ^IbXxfcA|Jz8~7?wGoJfNoE<EYhoT?R9EX$pEe?J`hM*TbvDx zR~RRHY~WTKBb4un$b4#sB0~TSQ$%J%M<H;B6FQe-=!7yR{KcG0D0j3)3V~B~YI2b= ztbGc^(KsbSN&i%KD(&+>0tN|tI5EPMvO25?5y6aSDQc(5C9)l*&<pey%YSNrkl=qH z)?Y>$MUMZ5a4wAz!W6Lfy2Y=CQkP{RbatV9g(>xglDw=}7*VL-R9*@rl_<4}Ep38z z9iy;`pKU5xAvDR|oU>w2wL4x4HR%`=n3$!2r*ra_sHgOj1m@s*VWKa@L@>T2VROs^ zXN@mWKf>XtMWDc(3{tr`enE*iIh-S>obdArLb{t&uoLf?Zn1RY6D9&Fl#L-3o{e+o zOCI9H496*a*XgAEpD-dKD@fR88wy}ch|$op0%x08JK>~F<FoM#HXb6u;cl@KVx7XD z)Y$Y;z_-Zb28Wvr-mHwR_=a<K^2CPn99`NV2$jY`+-%U3M;@&_rH=ykDQFhCPvJ9I zp?wN@A|F$T_hl+^L_MWRN`Uw-w$(VsgqRf4*FBN2kbrV2!V%?=dcx|WFL0@NQn;~( za6*NXw}wn*vDQ{_Y_pP62>{s}KKtG`f1Q<c9W*)$i9KP65s4B{DTujFlgHsn>9i9g zDGRiA5htnCC)JaAD+X0;1p<&5a-Akj*d#9M`RIz6CxI6=*CWg-6h6u$zZh9lJuCW2 zTitm_PJv_~N>tcLChm4J7Wj<`y_n+o9FLRWqzjxA(WC5~S+qQ%kIE+sWsd5=B$qfW z2a`;R3BAc$O&rY;EaA=x7k#OA@kz&+XxWAdw!|<wNWm0A)HX}X)Xla;7!%fQ_#qHj zWv(m|oE(a|&N8yxQxRm{mefzpIMbwN{gEI4Zq6uoScZZXpJ{xtH_kF#Z+#Kt{Io%U z%!(HlrmoZ1<8WySPe4F3uGf=kisa6<9{ljsqQn;lCxS3hAyh6dsT;N6QySu_{6>4> zh^!P_WETFdW(ma?QYVlwr!X65<KQVU{Pf+LF0?e|CS4(d5?{=tf3uY+zDUVmm58|+ zp%X}go6rP=pO~9*Na_iM#9ReD>2Jng8B<QuI6je<m3ga`a;xRKS>)#}`OW%PB!!Xj zR0x~ORe%U9#iyo_UTCjM%yUNK@3@H>S83Kd>CpdMYDtlg7(3wIiU#2v5rX1|-}v*s zJ&RdIB<Y0jfJCtH5-#I|(6K`#oyfxlX4Ax>r{n8_$yO2BoIs00KkfR`nhFIjQ2LY6 z2AoeRbZi4pm<nK=6p=T;Vu&M8{!mNcNXW#^tl6lD7Wjb(Dath~wgEc9LIK(UsTU$f zz6v!EDUq@eA!Ed_H*zvaU7;4{5m-eKDJns085Y`*_GcYcS3r=!D3Ej%MimShJH*DT zZQQ*=AsqkT1kF}cZA}4y^)CXp8nQlN|0-Rb`3`uYtxFEw2Y}oOBda(!6CgHqq@x<T z1He^nrAWJwIQf9d!#f~Bl9-BkRO81>qR^=%gPcw<>FG!(=GkOHo~R&<F`<+A04CwK z8r%Mz?KDMD!axEi_&|#pV10)bA-o^N4!M%Z_yg^oA~z7vI?@fa)E1sEVjKVz(ezV+ zB7nZYB`u~%94I)(g=-*UhgfPv0B4$^$T-BN=nZ7qWknEmNQPBRarB4Sq6V9togUzd zjcAeSBp-k@3sanfTDoXtX)d>)15uZALQY>`j-7bKqhY1Fj(G>9^i9UGZo*&bco6I2 zDbB?hlE+a<=&*uushU&?54$TtxsZq~G2<>>OzAL=vpAHL<4jH4WJ>V8mwXRZPqnD8 z8sG|U$TQgox{)sBNZz7rV*v5eLN!y(RhepmI9~F@mD9sF!p(GZeA3w>nsOuV)ysj( ztKC#*i^Mi52y^(LmV3h5$1--$RU%vI*1C;ui%ommTX6}4>QG2^#E;jU<1-liA4@r- zlV>oX&DyMt`u~kqhvEkacmTH3l6Hd<2O2q8(lUz4(=L{@qms**DLE4!X|b#xN9d}` z2`vtVQfLL^AZf}OBp8QxikVKe9pFScAjLQVgA;49X^!DxIT<f(r%=DSU{Wk-<<?RV zj@1!lgk%H?RY80KLkKyC6d>p0Ps!&S8it)X5F?&(I?<7&+gJd>!Xm^>10og*q9y@l zS|Y2-#htdA7?&PsZDHyH{BHOHSnT5DWSmZnNYb=WqQXMoQo*}GEEI&3=?EN|!;*<G zhj;W&n4||4#9xSC7++`xT4jt0w@{0WL<239sIUmJ5MC%23IhKJv@#t5WzspU#3gMJ zMHoj(ykNy2lu2D^o>kAO-vS{zE;Rg-@%JMwK**oRMwoxF(Lbs`sTUA?5#L+9jPMnF z_4k^3UC7j*)f;xl;UtMav%Kx1cwfsOqvhYVpF{}seSGsJ?k{#(`bYSH;A8tq(x(MB zu26Q4OJ>FW4ch~AS>xvj|AC*Ie5t-tUjy|GmLSDgprwH&1y6<FH4E2=`a|yhjn8Ot zUg3at4Do<tq-9=M96P|E6PUwLLi#M8|7D`%PiJ1X)J!?9549T)_$<CYZgW4>4J}n8 zOggLaY^OA_Bl)*ap4@Pa^;z&arnz6Q$e3o4>6m7j<+r@t@cA5|&&9ue={n%#V27($ zozEa~Ki9ti^p`k$I1oY(c2DbP^r&|FSC+})WVE{o$>PzD_}<v4I?W%;bsKm&-r)z6 z^x$N;%cuDfup6T#RT!f!>#odClAU2rYchK8C_itQ|F`mU3;wJ9|5E+T!oCy#m*nS( z{)G;<gJy5z+MBy7_OtDg`6+hEMbBN6c8k8fI9JlM_C>wT%9e|ovgt0s*(e%ucdo_k z3oU@2>p>iVM&Kp9OX9U59gW!e75DS+R5pFrDih0!yQ>SL;dkd+>I<VOD|5NlZOl$H z5nZ}6*PSm~`$zlUlPho07MAk`Yy&HGA9)QLHN7|2Hd=m9Zk8qD+gCsO_MTj`sM)>v zME%eA<_^>OsQY~&8vQ`7ys-#)8X|s80nwRv;U(?f_sdu97vGl~mZgqnti<Oa3+~Ic zG9T!uCbkK;t&qCI<4(jZWov;PXdzh&(AasvNC%XVJ~NaRl*UD{&2S=6;=(~XsGWRY zE^Om?97i@C?R{_V&}_zbV!FuQx#{^`X*$Lhn{g`TRkYduM6E|rVMu1SV1p1lbowCM zCKGCYC(rAtPX22QF*S!t%H%M~9kq(CC_uZL9`Hraw|01PZGMZ#H(?y2ohxdau%YG! z2Hp98N%@r?m5VD@9{mvI(2e;;c7h<HSE!B1NzI%u2zI9Y2jyHcp3lrqobnwNdv<nG zoO5{r`7aiGq15gCs)J~Tze0UzTae_Pz34}Vt!rmF7v<Sn-+7(m_gi+qgrXKl{T*<M zlY)0ePxW1}U&DV;J?p=N=!U;SeY1ml|7YrdXwg$`2V4Hu0Li<%sF`<(e|OQl{*NMd zUi7Z76q$~P@)P|IB=s(eS@6yr7t5y40zS>VU{c@3818&HMT4MAhd3I*yg#9%k$2_F z=3Yp2!JVa^E~qTZEhy5?h2-C%(n=GJG>)f~b~N&C?3SBq6fAvlJJ%@XOIcZ-l+(dQ zj?gfkQWP+*L1YD`q$z{MM6nZ}<;hYqE;TDES+hG-4rnD&XW?YkIw2Celw+mZ?_bW8 z`#)38XD2mAdnKM)PAjbauAE804Iu=PX02wL8%79S)^`d>E%53@5+zDJl`S$QeJ~Rw zs5Xwp2}>CyM!}?V)X{6Ja^>Baa+S)sRB9?qlvSJPqb<4ena-FLFEL7Wb-441fDDHX ztjG%r51f05io~CYIq8R6a=9)wIwGLcOH))$;?HjG%e4r2<*$pTAv&DTKgCT(AMD)T zh)ls=VCkGfsi_t()AnhIJLx->-R8SwN6R0_=gQNf=<!@n&sl?MMo;@{!>0k!sgLK{ zL@V#YC(IqT<~p=~Osz|<bebs_A7hRwPbP<$gIN0c6Rnot@j9#J3ceBfkQkflg2II- z&~%mJUv1tO6{O$o4c0>}O#XVj%^a%LkwDYk<5lRx^u69tOORdz+sxrs9ckR-iX(&u zenUM>4^Or}$ULqf@d!)A*xKZkf^2nA{J4Vn(V49dm=;&A?<@T3S5`CNLuUK<<sSvf zN-;-#{PG1JzwmJda^x;nyz)ejlwyuLW>~PJb|xi7A~~YsLo+!_`4gLxK=`v6bo|`Q zA)hT0;n;BwDd0G3%39@eSaUN7F)!su{;c~O$|h@`;|DVTZ{?4>RDXB={#o{H`FDYs z5!$skm%l@Gn!l{|Y5tsY$z@tOlE2!O!#&E2-Qn`T+nv?UKeOHm8=>W|aBRM!{FTg3 z9S%q8tnsfPjXq7BSWl3%-u)!*6;;6prn$V7G)ct0qFhTNX>D6m0VzjuL5r;7f_AjU zwnBG$sqnvJ$|`p)skU+v<LcB2%@%Y;(mK;x7AnbRwxA@N6@pGxjnlU|xk>m+p%Y*} z*C)`m1uCer525qvb}7ZZC@Hz82J^Ke%zP_qK|vtb4!!23y{KT=i;5G>9X7!&H4;o- z^+Z!lJ8wRD-ouw&?@3!z^<F-^_Fgrb@7{j3XtDkRCp>|1Cs#)0srDRTQ+>87De}sI z=$h)>NRrJbMWy+a_3mjti4%3Au%TI`8e*5qh8S~r(q~9*FKRU!9uK_Uu#G_CLP%n9 z!Xk0fW%0s6oKU?e^-6GkZlBGK!WyeOSdMRSRO+MEUD&964z|Y)R3}|mb%ufGpz`Jb z)&Tc6b@T)JY(=h5^a7Q`?gE|FKKdBdR_(62AKX-LvF-v%+s!QXHMS6bKy6enVUNgH zOlQ;AKSaIeJ*<3<@%a$1y?3S8&HoiX{rHVtR(Q1@t*(Lj%dqk5dHxIj1L}AfQK5R9 zq3UqO!WfO+k4K_ObjGd)z5L^WSJ)hPhT7~m)6+e)Y2@i(U-2)}+Q*k_ixF2C%jT#d zx(ZmO=kxmmU73fd8HmhMt+6Pp9J}%zul7-Oks?uDyy-X_i(dFxqFkSE|Al%ehC_v} z_ehPG@;ENXZVc<ti(RGe!!FHAFVbIoCD@YsCm8FL9t5S0^)Q2JR+5^cANC(Y&Icib z6IH$h<Eqlw&>5^GeOMicMFCTgmx;QEUZA&Nj#Z^A0jb6$;$H7JMj<{CuwMQd{#1QC zwppHn)FPO4um2IkD(vt)3Cjwm;=tD0fGolo{-}Q?!a<PegMJ7klptJ}2T>`;<mOO4 z3At^id)eGh)Rn;;eI@p;t^(=Mpj<zq&c-i(nOmhNU?pJ#2&(|kQ2iGCDrBMyHrH&a zyXb}d&AM)a?f06&Z?6Y<O7D%S!+6~Su_4H8YizamU-;$mlbSy<2I^{kzPU!ft>3{u z#`7V9g|$FmgS@s0x>!qF2OWYtA?gNw9}GTDuY{7-dPQ&<DDU-qVB7RodS<Xt-;2DK zAh$|yM(Iq_ll2l%HbjHQ6kU%GSbDM)qZ}Ixzn=$siEfR3JcpX8x~|Fl$9kQR!>%Zo z-PJIEY%mG?J90U|MBN_NmjkZ!*BT2dP%Z~5ZR+d6K?(9h+!839gp#}(O0I#42Vm#E zP2Oet2EEcYz}7Imo&E;dI>79v?*vbN5=bjywXZKi9u#cf2oc!e4@Ivas;=&hVqAo{ zLfNoo)C+n*;b0sr%!4fEbjVP;yWQYo5NKZ1*soZB4A?tRT&drH%teqr6{Rx~vxMjU z<z_0RpP$Fh(j0PzfN72%8&uhv{1TgCeyzU&`yyROYit(inJJ)n&OhE8h~2BFpiDOV z2LW<0_UrBo;r(%zn?aD(+OU~U(rrvzY&G2tv58iCXXM)WqiLq;VJ-@8LDQV5^T(qx zm18MQDcb4**aou_>s|VQbdvrO=qY+5e*ZrgM$N-kV<nn9R+ice@JOUyG{X%y$duf! zfxvH|ZUAyS5i&P;0gO=C!FaA|hVq@Jmm*aHV?1!uh*I4+kH+=|(1+?qK)nQ^ui*4d zZ~Y^~a@h`CD`2_UW(tgIhU0v5BK($KGwj|uMR(VoA-uD0YdS;1A^re81klbDjs{$T z4hdI_8G>u4nO<YI`ad%*JsMr12YG|N{1C5?X^lyK3CQm=jr9X&lx~1w=wWlHHxfon z(Ot32w^HqF(|OiBXQp8fPBybidVhqSVZ;y^Fc;=c!L{=`IL^k&(s>En>b_#0_x{@} zNBSe={w-vxH7e<6h@XLK{4kH)Zij#=sF&vOSE5U0zQ2G`hof4)F|8ncwl_vU2Fg~T zx*L7jv4AZ0)}o(lhE~%HXBBq$tO9?jUf{7eX^B(`nr=UoT`QeK=GbdCLys{5J;qwE zyLTUqe8A-Q_4Y+B9yX11KWv}f3mrvs{kB)C`*^*<@Vws&LI-#(e%n((_-}BZH4UOG zplm3L|7dSMwjv&7d0D&7(Y_}Ecf9u&nrbV=b^~uebU)ktfoK=4VSEL+hr+DEc`(fL zhQsPX$j9C&z)?^*1a0~huM;*wWsBy~PrrwYvoZ2HSe5G)5a9Vkkr&<~k!CK=`QU7Z z)RkW3bweI|>v8xmeHE_wmi~J0c3f#wRYRZDi%_OjdNy|TMgM<?w-H;P&hs8cJ{s#S z-T*W#xvrn|4)i^AAe+6``Z1KwVBOa5>F<W7`jpql|2>R*+Iz<93D|G2TYD8YUv35U zEUO_X_F>pl;YH9K>i5;JdauEx?kI!7dQZI<@N@MQ-W*+;M>kuAe2heYM#~licdL6; zKU_eq^+4bTVKifIAH_?JdC0R;!@+zcaxe=<u&IuL5zQc@i9cUI>$QUsT~Pd21Z#pE zs;N@XfYI|H`I=w~CVqE#1B1DGAIRv2{$qj8_e6p0=|AK3Lb%1Bg52I6aGV;f&-45E z2m3zuEq>8E!Y={rNYD-R5A}IzaU5%gJPx;*E!flbTF^D|8)FaGskrDi`|LAjq77AH zKi9wdbI^HJBCas>mgAxygyvc1x6Y$8s6v9{-yo=Lrt4wP`BoS(2HQFsf^sM+3>f`E z(^#M5x5hX*M1KsGY%`s(pZ7ta+g*)7QCDFLYK|9!&}OQ1IR+e-@BWw#RA9Uq3ceft z5xNsLZdLkLKR*Z}Z%0ij-4DAiH^(J+ufGtR$+B-}DLjmQxgYhr2AlmYeiz`kB3}mt z6JW$|VdgdzdL=k%#%{RKp7U4X%6Jv#up?)&L#}=aW>VI0y(IXvU!hNh88`ax!q|LX zec<=gAEHPHqgZ_XDF)37<d}Be@2^xtgPZ(H+`J4!VRz9-qwWTQY7n*quY*CTB-jmV zreIfEHr>X-#X&Q)i^agV3R(p-5LRI~Yz}7gVZ^O|hhPw{ti51Fm*7#9&|sbSbq@ds zLnW)B3N{YKuC|Sl$JS7})jv8oB<LHU`wRvEQiXPl0z|k#9~KP5*0|GQ#8jAG1tZ2| zyYR+#%2Ezl9L&ZA<AVtZJE9qu>p7Ul%)rD(VOB6RU<(?O*NdT^jjKM00<`~9T^$^x z&w~;BnZ7Vg=>yF`;MsBZMfXWF>+5qtGeuv94R`zM5g57$<7y$z)oAq?sukNm`U+65 z4aOlh0`0#u=2=6qTkZ|PjiA5DmTJCA55N>jq3(u(n2qJ`U_r1MJMrERI~6w5-3azU zxMcRlZq^fVY0ZFQ&JEB=!P5jC^a?Xfm!U_$2!l>598EEnE<~ni#8HsG07kS%*a}7{ z@Gpa59>U4`raW@beqO{oH6D!MpnEL#^i`PY(+E2mQJ%h1N8l)jh`A7O6iTI$UWafP z)aKN&wiL>-r84>5GSxk7r-QOoGr>0m`??>FOms)roX4_001m}GW@|E;I2Mx$wp|wI z;ra;uYqVfe3<OkYE0WE#kAr~W8gDu=G`+6>jIMhE%7?Sa85kF*;>s8X3eJbip>Bfh zj@qD~oCl-JA@eIemGfT?or~0bh+;u6LeVIQs%K_H4TsrA_AcNY`*N}hcL9Sz-&-FD zlluV6?sk!#7k9Gr9}lUn7(Fr1!OGs_(8%^e6|;?fW9nmQDuw(~Y{bj;PtEXcqn_dQ z1L!!Qco)DaVg>F3hCwaJU=)XoD&%AajB1QY=%hli4njT#Az$6m%a?$98q)0LJ@}=- zG(~^Uo}Q!OeEnmuHKee+E7b<mx_-b6%cEFNORAs(sH459wvi2o>ZuUN>FFrs<#=zV zp6Kz`fd=x{p+0a65mId>#5Du78<Z+!p{4${Hy4zgkhIo!pn4YRKX@%r4g(--0F3B? za%qBAk*BcpJxrqYJIDol_8Iy~OuC-JoaYzjm*z@q^)QGTgaU7!w2>)jBf|iZ%aSvn zIv6`j{39_mZSbbxc9oM*PB14y4YSe&W_@A|BuoHjDaxgcts)QG7XUpBd07CY0rM~v z8yiXS_SwAY!u${Tsrq~vnM14_I9y9O3<FpxXwWG^mKfFoke=Qin9ht)z2JY1%#2Z( zBcUT7kCH<BR}e7~WE_<m`1jd*<ZO5&;4BT^urKnb>66j#FNKOKeJWC|Q5KVuvZz8? zbn_>p^ak68T4HbDO3_edUVNE<IVN?TLH`Ew&Ko#ZQ@MU0<uV};dn?fs4*@9eRl+|D z#U@2NNN@0Y7r?Sugu8%2+B3(fkFjkw8!AhqfnjM}jhSE*v&Em_8NbX7^l$JKI_{;W z9|rGnL0j7u^$Y6jvfwUH=EWbF`!Q#@37gOlK3_j?rs*TiW^WS;=R9?XcYs;x9~r!f zyMVJW3SQx_@dp|o_W{5524ToK6oSt7zw!eNS=VF!|1&>oIx#G3*C2@Fx4j`c&bVPV z^{D@;7j-mY`LW-6F)}v^P?{abb^JIk!TCJStQ)2ehO~wH0^^`~w+`11bc1w9OI?r? zbueLz{C)sV1XCO<)P5X$R&^W?0Q^3Pc>rf4Wa43jWtNV#bghwU1#0#qW3A{oJ~KEg zq3MCJyS^a9@ggL=jMKRV;CU-=0sXAff$%>>db_Dej36ocNw_a8-6+JzLS$Vv9{z(t z1Dm@zX350yMteasc1>aqj8o;fpc`RYKR+XrG#e~U{vHI(!QNKX3&{;A3F7#opgWr0 ze<i}6O2P^?z~kc_QXJ~h=hi<AnSnTF%d5bxP8@49#`CZR^qUE195Vyr8Y4q<RGfF| zB%Edm+S=R_v>0MKo4E-aAL_(0AL_*M`PP7@wt!byGvc_9k;fcy+%|9(`4d&5v9Kjx zi<3RGQ`p?b`j#gESCeskhsUeLkue;Ca@bOUY_iH8!?Zqn{U3PO{S49r?ad7bJ62s| zJ>8ncs(aB=^T98xO{BVNV@j${DfY!ZwT!oC1#J>a$+)Y!m5}QB4IoKc<`C9eK4#P8 zcq_tFzddeW#$YNi7GqQ#S3snzwv=Xu<zmyU>D~gYk57~P+Uk>*nNs18m2kuS$qd@z zDI!C0jez0<97$E$&P}SV6*@PzHb=>@B}$0Z#_L7ki=pr*NFSkwspx{2bL~0_yaG>a z;+VBF0C#?Id^OH%aE?OlL>*g%<$0l-hWWX~Qhy@`%{XQQn(46tJ?u*ZisLPoc5A{R zmZW?Vd(L8|TP8#r+#8Ts<nl2qM@*C!$8Loeh$G|0(HM~S=$0FyTPFMt+e92iJ7Cks zNNC#Nm}+ZWF)`KIu=yPX9zM{?_r<fk{<<sL2?rHkl`nd7Rr2Cs+dKd`*3ED|8Y$j_ zxT}&6bcSadLM1v}F`R7^S1Zmq=9t1Tj*Hu-1wmFkGq8R3I5*=v47Vg~o$1Sr5tuQJ zf_nF6B96ydkrQ+uTg+@e;x-~S3lC#ln(Zxmu4h;lbvP-klb3>Uy)=n<DWtU|Y;V|d zaJ>^@wYyiL<Tc7mft4f>jg)72DbPtdxK29mX@SzPq@FFndaeg!Lu`bHO14a*etp7{ zGO=%q-x3dy*y`TUZ|Z2&o@l*nW!V~_B-UZp9z4G=C1!waGQ0+)aW%!mC&pV?OT)z8 z)Tp)?s)-lZ8F(pVSBJAHuLauaNr+@yUmp`K>=L%i^Z6Z_T~8~5*qCUbxcf}M-~lu; z_Oz@B8N22r#-v?;LXLJXeF%GMc7P7fuo0euZSr15&(Dr_e%l1ensE0fZ1~bCMWf!z zm6;d4Xxf~xU6k*Qrg0x8Jr5Y^ki{0X9W;7&HgpG}1<E7PIPR~11F^hd1jkv1tLz!N zIVvUXA9-^W$Lx^bLM2QnaNz3<JOSNqJ~KT*ACGX75T;iQJJbv!9#}}F1u?7u6G{%< z?d&wDEZWpIY?fyYIPz>y;K)ny)QvUZ+%UvhN3Pf~Xxl-Gc=kMOM7;N4x@H|^dmbs1 zet8hyipOyzf5sD0Y(;o6gW@Gr+$cQ4Vr+}w2v6Ny@4C%rpW=$wH8i$+G1;|8a(2hu zl_8z$;PBw%4zIrjOMN|*<W9)wZ^A>bIA*J1s@S9nnvKRec4}ES&6+ILl~xo@8i=Pg zLaBOb^xU`)Vpl|vto>k&lZyj_Cb)S^z6}LUzaU!p6*jAC+BoEW{+dx?r)Wgmuw<^n zBSbPunIDr#7YKdMQitKrXlgR2yVXAy^s_;CqNSx(2cgKN4KKo-1i7S4w)iK3HZAf< zzn&}GM~1LCW;ah-=ZZ^VmA~4*6tj1fLiB8-aG#P}eU8`sUvsmtbHjA3#GkLvY!-&* zIX@bN%pJ+DAe$MEE6x?B+=U4$F+0ypq=%r3KWPrUMz80ZG^NSu5Q<UDPTgC%3rke1 zLdBraU;k^aLo{hSev<b5Uvixf%Z@h3X^u9><D^+^jINAl;He|cIzgX^2jd*z+_g?~ z7wM?|$GPiwm8^ZX=dM3|*Vq-uQLpW}8+WB;yHZxgF3Dx|*k`$)eGju(RlBMp|Howw z_$aqGn{AUQ|50v_sP5;vgKLx?P1<qWB}UpVW7&=rZ8sYDRc_D!nB*H!FLCUqbG+FQ zSNj4Zy!g78!IW@ZV95WxXv>$mgOKZgCXg(0_p(!g%ypOOk}q<ne-C-=2fv5B?~~W> zVcLHruQz;;Y<>^hSZup8n^V^e2oKvuO=Qh;A-mvz);PXLW$IlhiVb&H<}%u%cUd;A zEQ~a}qR24PY|<e|nq46+npUTf%Q$w=DcC@3kIe$z>6NZ`sVvmy<mgvHczBZ0|5e8A z%0eq-H0e10&5W|+I5Udshn)&7g!T4s3<#ez$g~h?1J18GxCs0^S_m@RDQes>Jf~2r zPLzcIvcSYRrFJ}hmxtBvnE`cthjEZ~F<zWRcfXt~`wsj5C7CY6qbYb)qj2wkQLw^1 zm=DC=TtaSjFibyJirefF<>A2;{CJC9AUKZe<8H6EU@T(gQ~JGGH#^FEZ4+xq+B<rq zENm7{X&(0Yw`J|l><-F>eWOh;=Su!Z#JL-N*K$fw8TC;T^X*GUJ7-$hLh9k481`>S z>h&*{e)Q{HSn)l|>fbP_MuYe_B>j-g^<?IrYaDitMl=r(-f=_tekL6jZTG|a_GxDH zbi1%Ls%jp#`S%3255sQJt>s~}M9gScd+w2z^men+g3?C`e0syD8h-N3rNq7+C#8EB zD^E2D>5e=9cH!=O%Y(mxXpLONau6OWr4Q8j*hL;j^y6D-H4yJ7qt{!7;c)2>If01d z^g#r>m`eMeHhYzGI?kJXSC;OEyaaIc7i?#(qYW*?1$g=yy<QfU9pv)rZt1CIXZ<eM zNJ^eDtvRt(IE=Nrusqy7n%^euoRnTs^PsF5)*8ph8!cKRkB1t;rvB|itb(j9XmHjv zJ}#S4P)@PDuo?2gX1FMMjKsJ&JaD-b1z0Y4KCg3+L|FXMbv?o`x};fH-|voh!h9yv zYK)XJ*`=;T5DlrYuhv-?3Qz6Q+>AnQzRQqlI_lUaEGr{TXS5lSD8@tsnuo)7RBSRC zXC<bJzO&eV`aZU}lb*k**l2B5$oDEX?8Vk9>{O_dpLWIAwY^<fCsDA2o+Pz$M+%~i zVc5A1v+rJH)v60V%#SvFfUQj%L($ZJcmpD@ALMDIync|%DSkdF^WN+wAkTWmB34(8 za)aEtX!>o!eVM_IrQz;f*)Did;<aV+I+EJiR*H1lakW3&LZeJus9n0u<c=F9`T?|s z-FvuxfX$F<YrkEQ_rthGuj?ANsVn`^sHn;KS_8YQUW%c`wHqVzIxu>*EK|U)znqi3 z!r100Eq$Rc&qNfK3rVNOhs#YZ1u6L&m=AT+r{u!zx<A_DUQjl&84vB-oF@J3qjMIx zyzq)HIS5Zhnb+1~+01^)yk)q3@+nWt-BrozaMv1PT<Fc!ysT!LB1OQECB~QduAgD| zKxo1pjr<0?81HE?kWA?w)@fHe=Oh*f+ef{V3-d0YMQy?gB^_Hdos@x0y^4nqDHm4# zTr5PQVba?8#e)3daCqjCt;=#ja&$)PFgQ%!e!I5;qSC45(yE%G-Dp&7G)JTIy^4)= z8E`UPIZGNdP0U)`MB6)r^&6zcY<rwsX|bfJ>G&`Vr6{<<ERF-L6RK-_eT*CJ`-B~$ zEp5X(QLls1CgYCb;4xfk8^=fKqp^5U-gHte?{DQzC!gP?FUVy;#CuZ<Jpuk4EY#sp zH!ta6s{xCS>KsmvR&@zWq7B0^q1|wJST>Fy1s(xpsxEznld7Y#)D^2E+^Lg%#c?&- zZl|!f;S>JD!_j$u$mS}rrquMkOr?DVF%#qbV4D#q)oHHA8cmj49P_<%11y1bm)4G7 zNU-1GPcl11zwQ*)wQGW{IYUQ)ol^=5u4#@_#>oWZQl^Y$&0(vqj`r^oj$)^|qD$C2 z&jl3nf{+zQ1}dSYR6?K5J$Nndps`dL#z@8Sa&WID7TVE@d_E-9!O1R!v-gHLxkQW| zP&4>(R6a3m9*x)?Z-?+=+mHTwH0G9TcMqGKKz3)46y44ZD$cbSMAO6|x4enQ6g$4S zik|L>aq*5GVZ*c|iSn({rEG5;@@uqcTAQ%b(JZ>*cAh9AT)U9BUrucEq}P)!qZN4E zP$?AdYK*RH7j~fR)?LGW2Rm8#R-tH(Nb&WUy|OvtI9Ze&UDqw#-=~~tRM)Vq$BsCq z;nd=s*(>Z&&ViDxvPS=sNB^=%u`KDxL>4=ctQF8cyGOWp9a@BO0NkxQrG4Ct<W(!N z<acx0=##c#nCGlH9k?xxT{t1*0n@IOTwh3795)9STcs=U8Oh{?E1KmNz6!Yc=(XId zUglF~?v5MD=%tQfqr!kr0y+-p{9c3c8b#9-Zx-juAjeUFolE+5SuQALtH?uNCZ_Wu z5a(87v1pkA>6$p{&o-HC(W0r0*c0>I1#`kCbJ!L+N+>%3QKYCYNqUyy2urbEGmd5T z6)Bux7g9BysP3M0E3S<>)zNhyV4WBBP+zJ?^idCGuxLhQ^zpG*u^w6FCHm;s)Z_FK z=bX!B9DUR)Y+E8=G%E~xWj(NYt5uz5z_Ce~3XERt6}F1%_6pnNT?=xy38{#3Ehx3k z2~0)NqI6o-&yIwwe74B6@>%X_V`+uTPx^qiAaoZFnV16>yi|c5Zucf!Zd#;r(?S;v zMN6SGjne4V2g_%qESw}qS+kHGT!!>)Mu_<rGLj0i`I$t6YGfpOqgS|B+97qTSzFn1 zC`{)dhPBoEJ1dIHiyN&oXXh2g9PccDt~4_hm4`$c=-NqfMLBglF5Z5~L~+#-;%<V{ zb|TkH?RG+4c``^I858vaN%Key&2$iHoc++ATwdMf>T+1za>(s6n8v6po{p31T@Kwf zkt!oIom8XbkOna3t^{^>6?SEeba%s(ZjgM*Wt>l!K1ob8x-79_Q0jc!_mGcH^mw=o z1_DPX8u1Ssn;wpdxQx5Cdq20}$7VCe-wv2fH!z533KRo)fxD`dieu^4tV-8zc3hRr z(9UZzPi5j*ax&{@nmLkEWgaQo<&k|DpIoGuuRxe1mPxTP_DqD#EtE;34!TfEb?x*7 zV+-!v%j_*wJ}m^Hq!q3~xk4aD>|%*?ko>Mfkm4=2%N2_hv}m%eC!Z+<iY_h$QRb!s zECe<NI_cV32y|2?jUfvWW&8@sP0Nbalf#w-{x9@cW2}&;a%pAKE}2v3(pKh_6O)=t z4nA!nRPvrS5aDo*EG^#}9OG;B^{!n~WQ{8p>9l}}MR#mf7w3=|W+}S#ef+et70gSg zr^V*kWtsi5r6;`EEQ;*nLUB~cBA>J5I%P$;%1ZAfDS~&B=O;He?!My(-!Mj>_6dJ# zh0&69VTP=;b=GmP7bgp5B+fe}-ZRL0D&8r*ba1$4mkK+a_i%JIEvsELw2U{4q;{6c zWY^xPZtNS*OQh|%(Be2<hE5qXtt7cOl6>+mn|g8EJE}9T|Hi{{Gk;0H@brR}<l~*D zvMa}!l3Q6RKe0~a66dUBoDOoIJ0hI*zgb%7>Vx)X@2R8h1H<wTd@T^5gj~)VAkJQ* z8Yf+JX%js9IC)@LiDv~e+8mRhh#p^vyQ;w0YKwf9o(<7lY$p#qIL0l&S2)%7EkslB zNmZxcXtcJn+`TlVcP>arBHF`*^`Z|N<39S_LAaki@h$vr?1-bnh65+y<pRm$cq&5o zM4C%E2^(!6O;llPkoibA)O;k-7~h`}M^~w%y9bA5@)Tlz1>OMu;?QvS18X*4A(s0v zrzG1jh{w%%)T1Ii^M^{X&lmo8N$6W#4(UaVkNXORJu|t8*^H8MuwgXn7~If}=c5li z*s2q?9TS$e5)tw!i6ZC@N7xWAHilv)?XfzVGA1m?Q~27?c}UAA9#PXVVXIvxsYkTo z7(5#pGBj*P?dU1W+mvE_rM4YZG3@Mv7fF|N!2=ZcysoqD0%VBJUS`Kbh<i510Zg8a zWrez{gUW1&^8JOAp{DR+i)#trVQ(c*E=3Xtv-*Wzxu!IhKDE-J@9TI(SXs8C{v{eQ zEDYNeXH$4NGx`65ms)?Q-Xh*weSMw6$l)ITk)9n~&C=tS^7xzz4?e9W_JfA)op4=z zcvRS7Z1J_ghlodkPUN`pk23LbBKj~VM<Cg@D&rsF_DY#{6vn-;jtZOYM1ctSzf-|K zdweQI{k@B*Y>d<ad!u2tOJfb}sDR{gakdV=qXs@XI_&WuliaOVweI3VsoidNv4U)= z%N6uprQW8f<$p)1Hy#u2k5BufL5GE9`=^ijS(|O}2-`J{tOVlH0W8wTggr{xB1&-n zkP&Kk%T1}fj60JPR}yaG^&L6EX!#$o<$I6R{~_J49vhao{*GBf)MRYfwX?jJVimYs zjkI~OYRd5uZS+q?-SuIvWwc=|W(j(DST>07|H$m#+DKf!J#j5dVA)zZ0X#|jihi&_ z5i3J$R$!BHVV9c532kazw!=zs*<qT{s;D3<pJp_rcb{}hM$@;1{Me4NWNPOwB>9I4 zZ@t|=8CYn2lj0NV^ev&>cCpZ`<|%mk;pXu&o{hsi-kHMJZ1PDKA=zy3R-($%Iexj7 z;48{{_|1j;7(4ppVBAS`pBVNi{7N%j&`P2G@z$Op9baD1rSD}Wjc?&`tC5{2rzY}y zao%b)!|C{iOYU|g4*uxQiD852+~dQsyQPwxe1`l8jJG#@gES+$b5fYwUrHt=cWQYz zl&URO9Q|}6-W5Pkr)c_waQ|*8H$~HtyMLk7q0B0cwoC}ahFNM#DzB4Z;|bxIV(b)P zdkD6k{YF@%XYagrD(#Vp;g}g&tnlvGvSR5%Nk7Y<Eo`aK&dAja9epwgv!f9c`BY$1 z*uQ?t6D_O=!#!r$7rCj-IL_J95J-QFA`%;dFxoH)cgk3)Q4;MrBrL&Kr_q3;!g8Nw zz*wukGRYE-;rP`^+Ux}*eFgD?ahK3M+>1o}j1S97IHTj`74^cxg-Ii9JS#Qj6)n8f zQmI)iCGji6%FMz(;wfEjL;D{Uw(R#^!imcYPqRbe5FIt?7PjD@eWHI;7WCL9P4y@k z|3x()J-B#sxSNTtof<x)S41aG3#+5IriCr^z^HB|mN)3nq5+j*xiO=oft6tkQ!b(2 z|G{%A!<?U=UpZ&y^u=oMx^<oA&r(Cyt?N90!OVH;P^PO@#kzG}7gV3PWZL4HYS_AU zyH(Geu0|kSbmD9^X5G5o7cH(n8Qf#Rw)h0F9S63>^VN8!t52S(jtA}H>QmGN0!~>l zQ%wY5$+Wp@G6XL<v3haGlaZJL>{7B%UAL~w(i2XcJ5x;~=)}b*sLJTD+2I84v~Wv& zYy6t>^zK*;GFPwCTjG24AM{i41ogFUkA0bksxfM?`D6S-{Bk_goQhoxCt^dpo6TS1 zznU^{lDDV-jsL6Q_BthX|5*2Q^(}tO6yW)O9sEr7!II}oZmRcX{6&0n{fY*k$A6DM zj6aIE$Jd%$ym4v*{?(IT<{uthY`!t`)syiD@q0m+hI6rbT?6%g{9gPPepYf0elq+n z%$u*?iI>-1sNRkjsW;*-4gVaEEP1ld>v2OB;;$DY@kgQ8<3{SphNm{XuHh36pO2r5 ze;fZU{!RRT!)5A3_4D`_@h{`k)yDXdcx&9K(dPKEc<)BXG+L5xw6@Xlb^aQE7B^LY zi~E~TOTLM(RKJ4#-^O3ZrS;Y~;;w?t)K@Wc@o~LJ&1>o(@h`mB)#veJ^*>X8k2~Ri zI-ke?0Jf+8tWgZQ)eYA8-^Bake+u|1T<~>VUiuZDB3`M#j@y-fi}uf-BYhJeQu?hj zI=?TTUDd<$D*kH@x5aqvbRn-1+~A|sN8w+$N1*)CTVfmDINo3Fho98;!e9Ek;|KFX z*8#uI*d4#%-A(lYq!hpLZG_DM8em(3y7)z}rwpLSspAsr5lJY#=rwwA+1G{>!~Xcg zkNwHOejV{=+@n;t4B@_Nh#H)v`5O?rzBW7>|8W_vhD8JCgsZUiz_WA0hZ;`>hA()g zs%dJfnjZc1q_9teGx<9si&z!CaZ-3d*Xt~Rpr0iu;S%XWivN^E1LlS;nr~K*gODeQ zP)O~TMYHFIdo-VnfA|hlQ`AiCma$qrp?<0^jc%SBZW%BSfBCJ#4~r+^H^wKaajL5t zgrln(SmQVn=8r;2FG2}bgL<JFua>H=(HT`?i#<=qe|l>l{0VW*V~M&by7Y>$mtGt# zSQ_pYy%vRScDqn@s&N?9#}(>w_&k2Bu8x+?3%lg6O#lRL!uIK#5l%s7g>0+(FXWE# zpITpj+<gP+X5f#F%=>z^CBX;>Dc0i%)Ezhidnh#>P{s-8A+AzQ&ZC7<A=v`>f)<h+ z@W16cP_q#}k4n%?v$4k#$b(kSM)ep%O5j-sGK8MKxY;(Ct#~*HW3$ys`2t8m9gTPh zCsB29o{lqRT5frlD<0w`mW2qMig_*v_i}Zb<yam)wj$i8z33%+IZk&db%W)+F&eud z?Amy_x*2Gteq;&mk1k#ic8o4rfyHxM7KC*goC>fs(`C`K3&IxNMH_t{HvzfY#x6zQ zMTih9bxKsaFl?Wv4VPuIhGphRG1Dj5kS$%D%ZL=mY;<R7aS$geX9;nlN{mqW)s487 z)&P-2Idz1fPPCvp%=MXo|7c6yu>m>9E5?<S2OihBJah-jp2}V)6$d$vLRd!~Y86Uz zAozL+Tf2jUxIQ=!v|D{ddoBt`M`u=rWlfZ_yR#4vho0(&Mfg@?aP-Qe@bf|3sl4XF zE!b-w#X>UJsKW(e+o)+Zo*jR_81u8st_b&vE;%`TH+p_?cyRMORjniHbaJ>ps#+S} z5}mvx9M)oks(lQM&TN94xDS`0k^DA-#9u87XGKq+hI_hWPYaiLhv6l0(<tl}b%??` zb<e_|&9U7K_f_oPbcM|(y>smjJ?BS<o*rJ_coG16*@LL_qGwMH+t-@}fCWb@e-!4L z*Y2VwvM_VOUfljWnsy@;Hn{=w&qY594~wE7!MN2;u(*8hOR>-3n+<YhAlw^-9j^o7 zvp)r4&*i9v`%eiw;2rLxr-Ut|?WcrgS9Z;nH65$cgBGdi<K^Ky_0Wsh)D&i>i>|!# z)G!xef4h<$8izt^`{1#sht)cN3D_?ALC3{Eh)WgkZW(>pAXo3f5od(ude5Jz+K0_l z!OP&8&jT7{0X9?H&xE9?`m(T0_S7n{UZV<!uojZ)8aA4?53V|!M%;y;@7FvELTn_1 z6-ikDB}Ki?4bK{SJf;o`mo*Q@B<>(1RP6)5(og8^Z}lw?Ug56@do>bKgw#<Zqt)l3 za)+N6HnIKa(Y8054OX(dK8#@<dr8}lj!8L0tn=Buu*>7&Iw$FJ2q|`s*3qXF4wHox zq;#`VB$)~%X?j>Vv)Z#+O2}9pc03QR2=`BN;RGbTC-6MP{g9D~1CTquQ%XJ|a|SS! z0^<OeJ%obByMl5M$y!=S0;kzLIY`zh5v1t|9WGHxWCcec;3;CFj0jP5rK)wXy|=b) z$H}J_=VU9A+oSCjxm@&RMXq$e+aQ#uD7q~Psg!Pwy0!MfD`TId?pC!AvO9NM5#B)+ zl!;^L;<vCdx5#G&J_7V3Kj0wO!#{uz`tTcW^>B3EMd4B%M+>`S-`Be?3YQ1<?Tna< zX`^`;g<*3}3T0Y+wz?G4NBGev>%%R_Ho?sSH}VSMH&v}LA?}N#tLj(dI2^YfBh@jW z9*Z-?ISv!*t{C)d9}A;Fmxe8JwL6p%*ums{)<mzU<dSfpzQFbejXkvrGb5QyMCz*O zq)RXbz9uufcvMZrG}wpV8a|K5)K*M>857^PcLFzJCOTb-zaEoj-t7oI{W!kePJYGb zY!)v^aWdwnz;d%usVWbHDi4!e&l30`aYr2AgV`vj!1Q@kf~L~Owj_{^fZ+F;>hb8< zm0?B6y;jJ*D!P7U*gIKqi*Dq#m0=s3st<hRuL`^2OB?<lvA!z7J&il!c%2ouPDR5& zbJRLuNyANp@5Skksg{b0OKpsIeiD<rK=Dg$8HwyT-W+XN6}H?BkM1l>W9<9VSW(@% zHYPrCmC;wL!tU+PRn6@|EnAY9gFLRH!K=f;`2L0Yr8_rTwHhPCj7!7Lc?*EYIV5jv zdA7u6F)a(n!GQ3jU;7wjF-{7@9JZFpS!l}yw+^yvbuNH_xG@w{xf2kTUlvZ3c_kiD z7r@MTbme9E0D7>BetTK?_Z?0w`>WbV9P@tMxePwqcx~9Wa~7G6X9!hv<mF-S=!`2c z=luEQ;la_(x8S3V-LDAuh(6<Fw8ND^oUkSwR$gl=ipl9fd$S%!udQ)Y&Bvl}79R+9 z`*C=Ne;AC5Ixd4O%rr|%&QJuLfw|zEuv_{6>Fh}Zo2s(TO<uaBZJOE&_ohJ8CFx#U zK#(%P3xz_l8?->#gtSfDK%0~##g?t;j5>pYMS+8CEg+0qbmBH~R~(r|WyEh3a6^zq zVNg^C1QGk4`(9p}>iqe>yf*LMv)yygJ@?#mU*57NsQDTdKbFg!u@DwLLaT=?Kwui4 zQb>~s*94Aa2pkwh<3~s+8K96Uw&42(xRU<mCY@Xem#NdBU@IK~4O=lEty_%uaG+}Z zLA_ySe9ISV{_R$pw|N^TqQkafBD!H2Cg`th!6Z835xm7&Iy&?i-leR21YuZ=kQg9g zJN>hcC&OHY`BG!k!gvXf?@Fb{g#VH#OH@N(+IE`fU$%qdbLr<xPlvr1zyGh>I^_8O z<g$Hz>m-%A+I^6vrcwTh-IxsKZNkazmzzWs{0hawfyd~`=m8My?jdlx8@<V}i++_C zlCB1G-JmGxAe2IuHvl5Z``s>-=i80)9#j2#8z?UnFUuPMk>sWAL3x#r((0jerBhvU z&dN`E;Yn&tDdq3EaNtpT^SoeDN>v9|)*!JosQ4yh<fBjshjY<f4n7+cE0nSL4F!AY zP|Wi<ft(1*mGNVFao!jd%$b!>KUStx;C$aCRnvq^`X-6DK|11azJ*fq8nE0cvB>Ct z5{E?Uz?HvzgirC4j`|_868!=lC|<_)^T=42B+G>-CFCQ#XihqkA)PW2*G<-sSLi}B z$>@Hj4oOUhif=NHd=v`dyo$noeH|!6#`g29lz8RzRg#j|#|wSZw~Um9b0y^el_(^b z@4~bDXhA2}fdBJzJgb76%(xoieR$@VZwiDTg+gSwTrJ0}lBh!|IwjstywqJj!j6)T zB*+*ExgNjy|0?N!J)&1j<O<Vz)vq@xEOpB2a3vJsvO;?$x$?IR;qsMF=y6})UaX7% z%Q|o#MITPT9&x|k0+QhGkI~HXkX2-G0UBEM-XN4yDoXH*<zv3@KjzUqp)*wG^N4?5 z^?%>``d&t^|4*9T$DbhiGCpzTak@;sSK6=VnKGWI#$5OXi0P$A$XfsVf1<MpOnj2w zCL`YTPkxH#YjifW*nZ5Oo|LAD6cfb;*f9O(>0jt)KF)N!yeV#Q!l3^)!z_>l3`_Xs zgviVO<YzE3hI}>Nw0UI<PIHxy(^3B3XK7J#tfk&{r_<|-!1u$(`GkdF_>j^>yHym^ zye`qy)2sY`6d+gvMIX{4VKq^mhP5Bk(xH=(G({ZS(;Xlvv5Nbhf#XuR^dS{vYpr5$ zO78doumRftgQ2+f2#tvKaE#3pz}yM<9ib~?PNRfX0nnEadz2Ore!?ntix#s-9Ba1q z>|Y%~{tPWgDWflPA+Cl1@KsKlA&zx506x5UP(pXNteGh0it~Ome7xCaw!sHS>A2V& ztY>*ZZ7s<M(=mMd&N;aK7#%j`3O9h+hV9y~S|}zj?CROSI8Z?!+<S~p)}x66l6_j@ zfRB#RU2&UGlT@3tUZ&KNN8tXC=*VGvkyHUah9uH2V+vqDeD)EYO<smuKc-cN--a4Q zi$4f%`IxR9{G{A`R0o?M6!k2O`GlsE*TMD)t<fLpx0;rG1b_R4J`fRxtw<d!js@#S z*y(S4N+U@ebbLy)BNBgwiLvx+sm_EWpVC%6@5|)@Mb)KH{TVGG3t{JHG~e)NtGHX- z?@*90!ST=NXwnXYj-wI(3D)D3#r_^8_LDpSj^lJ__6e-nJOR7X)UzA=tuUio>1?ff z+W>}cc=|XsCGJCpbhD>0&>O3Fi%O;Y;lgohB+o(k=hT*5(A}Gohtd?CG)df+zsXgo zKZHMgPBT-AIN7}J{i+24gr;C1-Iwse=lB!LED%mm3%)Hn`vkS8ba1W}$Q5u*t)_7R zmu3l+e}NZZ96o_hw0RKPzrc*B?*xs{*dAbP?%t1o{p{-pvOffcC$Z9JVDU*h*8G=# zrhblR2Xgq~?UOWz9EBfF(pyu`{z|_O29h7+`el-<Ts1S<1{-d$_}Jbwd$Y%`*kLcc z@dX{PSA{r|pn>R9G=u2i)>C--{V{my6vb<dPf;B?!;eSkzvq6SNVp8wPto;+!rId` zB}KA-VPOC%q+&l>#Ic2i;#i*+U)iO$R)F;rI!rC(a}Uk|;~5%dST{gzVFTQHhE5{g zu>1@iZ`eN&>4U$Yq4$x)P<fV4CdXm(Sy~)(q2G;#i*W8Nor!0cCwxiE$U#{5CH>ow ziy;K4eSc)q3Rj@@E9xbS;LKOFE&fi0P-&lb1+<)_-jauq%hKYiZ);X;r`;T42JIsu z7SwK6r1-SjZeE=u5FNGJJ&<*tHpcrEieNo0Qul!WJk<*a5er{`g_pXVI#097T@d?k zdQSgxXcezP*aaMQe}#ezw1%93wHN4bMvW%wdnzz`E!vGSV3FB_5o|@EE3`iZMt@gN zui3<ZrdJR@!%r8eH6a%33`ETUCM*G_e@(kH#wxn{v|;0UYw80thc;|t2x>CWZ|Ev( zT?nWlC=*#1hp;NG4s$8gL5K&Ad_#8@pmBT68T|SKMVqYyqEFaPE>4+Xv|+np??swN z9)}Mu;&dAZG2h}7e+EO%w{!-{gx+sy4$Tj-U-$^DSWFj9<3tl!|BVl8(tU?~rBL)8 zuGAL5z2DJN(hUFlj#iU3knueghd#&~6ZHG=jVMitli>jOe2-3d2Ym89tuSIoDFHkD zwa`irz@$rbWcUi~3Y<P+!&i76)Ak?nS8~%;8V=7~qNey$3a?_2@Gs%aB|4p4hSC3_ z1qO7SkY<O!%qQ0IdSgf}5kujv|ImlCzd=dCFdL3u-!0~vJtiEAX4^PvRtZ=(Vlv!) znck|e4)N!R*>LbOW-m)%$Q5kZaByFtb4W3~dxdTzP0;iMMuvm%!Vk1P9)78D#5O3p ziq`)D)?cNghD0iOpEfdjfcB9FIB^w!2^tLK8fAuI92p!bktvXMjV9_dL+l)x169}P zs05KWZ4rh))3`tzBB#KPYcv<1ob=8$dfT9Si2&!CR8wJ)WC^ezX+CL#X+P4Y_=gp> z6hlV>9Q={aD#W>Ge^aoZBQXsL_H!hkl!KE^<kJIN^E}MFPHp5b;J;4u<K9MONL~>6 zPo5W~LZ_PP;v+vsWN1bZc^q#0i7rpZLE0-_bfYxuI<G>>bF`6t@UNe!TmNpTPVYh0 z4VtG<LzpsA>C)lB8+h?jj#b=bV-#M$L8A?$r17J;tga9~xk1ZKINkU1ON0Uy>dFRE zO^1@7X^j!HImM%Om;?n4qHBVef2LCt?+kGr-SSX^RWPiNmM1<CN`ND&U)6^=K@#li zqXjqZ`bG0~dpAe2TQ?13N#xI)#<Sbe<-U$&shgf;yU7z!N!Zdt^r(>DiZX=M9Tgwi zTe^R6Qw9Tu?hsrjY?MKoGW(&&z^Y~?`Z1wmegj+7tbk00x7BQE6b`j+(JT!h$k(tz zgH6HgEUJy;ESR*IFyCCDVS{0<hQ%80mTaozC{g#q;~F+J9Ybl*3Q<<hnaR@~d1xxu zj@krYYZx_#%qUUQLm8_fNnk^V%nem|0dKeB3sE+x5m-`u6Q{r-lc|h{C?~8%R=qb= z+@0{ez+NCvfm6#yi%EeAVgDjAv(O~YL;V(*dIGKz9TUPBjfPj^soCb!M&sMZo|z8h zXZ(d1y)P;$8b>!KkHOqK8dHOyj?os#2xBuW7f?t*dep@bd=!sf3gR;KgfSB-fdgSI zKW-NH--W?A5Iq;v;mmFH^fN>+LrIF;M|Z&baF!=@5TP922xn`oI|dGbX!OAWdh&3f z*fRQYMQl)==%?VW2qtQuB*H5dyuIo1(YPELFp8rOpc|Ky-$6wr+d-~yA8shvjnxFq z+bxcimnk0f8?y&Dw6od9qequw?Whu1uVWT66Q0*GleT~eM@l90idl6oCtlNMb2z;L z6UA_EQjRBu=pQphL5Si6tg^|qZ1{K>6~&S>%cVIf*tszRXA@J=AGrpCK@q2eHBqdD z41>3$Sbk@B(6BK$yLJb%4N)ASEW5BN(u6ZsT+qLq(#GKU5>vBqrKN}+#|LLH&PffB z7j%503L1gyA2Nnxif>0bm|y0Omlka+6={{c4?}dDiMok7D^ZrB4<<=L>Uo=Em@$Ee zI591BUW{pkyckwJWDQm#uL~vlMIo&B!p<1BAQ^pTU~_Qw7uuZ1VThiw6rVyC?40KZ zw&z8dt!G2Y0cg{+bp4^wo;wUr=$SF&2r@|5T`En*nS>jPUy2!G&f{=F&rESK=LgFF z28PD6MdNF%;vQ@gMyV>L1N0a(-V*V{q4hy%z$oaJK~N*S9Lw_XYP9pQtXz*lEI3u_ ztx#-Wqx2Y``eD_u*1#qaga17P>m>fUH?jNFod%WQ6e@*f_*UJ?La{Jis1jU4E52{{ zZow`5R+uAn2sOeTLW^*Z&@9{~EEYP2GU0bZn@}rE6g<KzVKu(7cY!cXSSc(NY(kUZ z6_yG`Lc1_eSR>35X5(8%s)cf4iZEB0AuJb4ga)Aw-%?U4+$q!x4k3I6zT(#|H2NJk zGqWL*k27h~h4!CmvO!KPlqHOMI(%SenS;@0y(ueA+&(LVqeOiNBv{znqzgW`ut6g> z^Zw1jMK150n>O@_T6On+DbJP*dz9Qk4D_D*QP`QqEYa#eDITGI3Jzzn!I28VbMmU- zH4|fM^#OP+o$Vo~p)`X{!8o!pgN?^j_g}n3Au*F>5fj+5*ichmNVS^bzpPd>f>)a! zHD0MzGmh8#;LtdqRx@uvL-#iaG||+`l3PP1dw(UlO_sbSD7lkM-b8l8KeHJnk3wfQ z%fKb?W7*71UX_3&UYAFn;$)JoH2>&L%QY36f^smO3Wj0LAwSDu)5xGpy;+mn>+G#w zhs&vSnC236<g#Z-4CLgo+lJt@gSoaTWKpDevS5KVc`Oxk+eh=*7-EIvd2BSP;Oo)^ zII)Fk{kPo04ifSXT+U}H1J1PwAAz|5gYgL{EnsirN;P&ko9uTFXSLypqUg)TWsAev zc#GY+EU%@RgcTM01bjPcF<1*(cBl635+A;3QixdL!#7K7`c{}sK72>CX1PlA3GqZT z6VVAoGi|m{xS421&+-X_h`M0DDI=@ZZLhaCWToZRwK#nEre?zC`-DV7Zm#p;t8hph zattLzZ}$nq2#H$c6OwA2nUhh8$!@pHZOY|`GyMN9WIqkDhTpiuC*ZRJ(@~2Eq8n}R z5>bsPqQ5x33-!P!!aO~VtEqq9&DD%GU>gi1c4A4Fm1}FDkWs^ua+gfxTE^8(>`G4c z36$vFrO8<Z4xEr|&N{nkna%C6)i$F>_~y}Y@Yb;54R5yk@U7Dk2M}l>5l@u*gme<o zTb*KW$3LHtMZ#aL@(I}_91xX5!jiG(T%vszad|}BTWo1<t8I4FDd#ACLIKf^pXw8a z6YZeeB@rWuu+ASnhjr>Arl1TpQSX5V>R5R^V1P>zbNa_8c^JN~V@VnuxnRm>3^M9j zN!%?&n^O`(<b$LJb~8XdOCc}9&;~XPj@7f_<R2WKDB!ukcVy^PJ2MIMi1r<5wzCbm zWK-}zaQv(xYl-&3YQ_K5@uJutC}QBj26hWE!0QdHQEv`KCCR812}MT3yN#?yi!JGm zgt<*D7iKlFLVa;4hX^~H*l5iJY*p82)corvRueZjl%l#fG8g;~<UZ8IA~aPYl(F!P z0|%EAZaCOXtrzPV4eJ(TF6&&(YBZ}vN#-E<d@;)*D<OIbTS_*->LsiQ!{D1sSTPRr z$Y!=yzdy9TeXy&UJ&e}7wS~>szZr^p1-e_9BkoWr>~Fo1X;A89X)w;oCZc)QIN7cG zPeWpW`g8b;6DJ!?8G~^_eG$T4Y$nmlL9^Ax29bEU&&4Vuu#cW5BySEJbz$I{<iFu! zY0>_Sm8?!rHo^mI+46`>9o*m5seb+a>>Zu4t)we?p(!~%Io*WJj1W^D?s3p1`7do^ zCk0W3!|goLE}i|bX#)<OizIw&Yj&2s-D`JxFdk(^E?TH7vw7>9Fcg?v%j|9(4b5$K zkIB_w;`eJn$~Lw+?~VB>scAmp2cj)SAHGVo$>l!b8qpfC^dr$m<L)}qYSE2<BEmH| zyNy|fKTw65Xo%+1()>!ByM@=0*J$@H^x7H`fvAnQ<35aNR#xCXoM=oiemkRujjOPz zBbwR{+(!}30=|zX8qdsV{Ph7p-%daPzD&AhChjpdP2l_nqN#zd?QBitYvou>BI-_H zJ6K|5eF+v*h<Xl;+rbz);GeyNnboG3%6N#tCv%)GMzdi3OH@{~$KKqK%L7i>IoRIK zrjy&?n{IY8BBMeI2H9}52M1Is=ytKps)llzzRM!9Wp!opeXGrzo8=Qmk;s>(nHy|) z64TOR_cpoeeZm-`ORLy2!rSEVnB;SGrdC_s5;VLIUr4W8Uo!%}`!kF8KeCGzsQvHn zVeM+D+{fJ710?#7m2hGoGs4MztXKGu#H9JV{>V-y#^LkyR+MZsrQ~4uYw$J2!{P3~ zFh^!7w)gfP4Dwn{IU$Y;43=6=B_T_ja6g@p3bc`C1|icR;VqUid?q1jlMphCkoc0W zv?^DNy(_KU<+LMgo@#zI?&hm%Dsi_!RmFFA_?>UDKN%v|Oh@DX4-p>mTRvn<QlqrD zr<l>OxQVdvJfrzNR<TF4q9$pnZr7dC7jong)#V1<<GbMSLTNn6CnTB!3gF*YS)IS) z8mp>?#B$?s*i~liF#7WA@m3+b`<B*Lo7-c@=}Ofx2}7o;%HLRSJgSe*H&wKGTid)Q zo2kgZXMs_z@qe<&ct7!PuQhJahGjZk^&L(a*<}0%ava8#L0L|ht<CFdb~u-W974In zm|@8FG`ZZ~T<pjuPikvxJ8X3ri{ZS(cs(G;e_^rl6{994ug-tq9^*_6us;|_`se(? zxKtf)$+J0~E^lDR=RlYL$o<B*N#|1h;SJwf7lzjfYJcb<@n;W9AJHeKTHTFSLfS>E zPc&QIZd-@db@(tMvaBBO!X|rjtKE%V8^iGusKwSQfx_o=D)U5s{?SUp*NN7NMLy9o zv8|zjbEy7^H6TIy#15|=lGYowWjFoEh2(NTv!m9{=RK#D#QQl}h75HsLBO*dki!Ao zLv4**T>L><zL|qPR#gQoU2nWOrGiTwUSw-QV|wjwr>(iz#Ya1~Xo@&-(qx|q)A!+= zbzr@57}*IY)*A<PzAEWmROf1GwGwqL%Jqq9MNKxhRaGo$T-4mqY-{u&a*}ApHf0sH zI2JYp<VI|f+l4@H5UBf<>yciBA~B({lAG?8+s*-a+ZU?;Kb#<gmpfY=o;oCXK$PrN z<Z?DRum{u=B$iApdmJ8bZ8L(t<V@xw*}}TPlAR{myf(MJ6-^Sc0afQsv`lg|+C99@ zJ9)37@lq!>BY*r{snW?U4sV^So@-Ht$WAd8lN@CKKx(-K3%0g)E73`I$tXsBowgRF zCMTuVTY?sSA<&~!ZJs7cLGqNOU`f5*iM59}@~U%6oOR7@_4c}En+Hv(drqn)TY<XV zohVv&gp+0kfEbRfBx)!JWt8xBI^KJS29i8#Qt=ctL5b5lVz^c12sDqEM~$?qyqv{S zYHO*jx8Ymh@0Yu>)V90>{jXcHgt^q-&izMla8)f>>co(T=-*1_Pb)=RTUSe@8Ktf| z8&8wb-6J@4W~s~B=#U$yiI!;6%J3Wl8uGM+=Y@qfH+PkrEL@k=G8_7oYAY&IGzlG| z3<E}!t=X!Y8_+zX%+@JScUEF3=0eiSBzGWRis**svOr%;V<NL0)mdgo&$g;MrM^h5 zs9kJT-4PI$UeU_?6>E=|L|H2Eo<`mi5jHL?Lz(!{xaYWbW(0Wb1!#;Gxo4#^H%=u- zr}Lt0oZs_uS|tV{>{cgaJY>x5oFg^4QmVqny)8VS*J7!ZGH$GN9cRj{bUV=BP;Dew zE>)9(Ag5Pi(Jqx;NCw&4aU2jdmLvsf8n8H3vU8Ti!*gU*FMcwTbc)#$tU1uzv29WZ z%97A(=u{BG%I%0=75T0teFiRHT`eg6ajs+5j5ep&(ZUxBRuYH8rBRexWyeOTHYmoe za<sHIJ2=HeE~C?2<;7@(6x+Fsj4E&aLVLRdS>n$~erKujVmlkHsu>)QCDZ`BChD4G z1anneEjL=kVo6C$75=<bht`eV#D!;6b+mZ-A^@dHPMulRfhI%G#pY`m*RZn~-K(kt zL*GoUp(G`>nuiH;K@w4Icegm44K9ouleq@j)oz>9(;OIwaf2l#vjRYu8>=#4xIn^8 z877UwxN%%o0D||>B2k%S=ggvNY)?R#K1(uz1d$}g6a@i%<XcJ1J6vZjiT8uoZO7^& zK7_7~#=)IOc@;T9gfwJy$GCuW4wUrJuL_o3t!TDbbR`}x&71<Q8ooldKn5>+?d{n8 zQ69+*vu$oCb_3F=PjmlFn{BsYuaP%+TPt(RY<|loV;G4!hBp~cP^rRC;jDNcjM;3o z7#gqMy=~AO&#aI1H!Xho*>fe}+H72Ch|~TdbzgGr8@6w!KQZgd<pems**L<m?T8_% zb^eMGQ#OB^|G~vUxsVLT?A$ifj)jLd?t1jC4Nq)s^KUrX(<3QZheqnkpK3{Z|Ba`| zOh|fVihswm1^4+oz!*mi)rWt-=($AA?y|9`&(HZ+P6BM*Vl*3e*7j~)^Uj%hOAn5I z<kZ)9-RpmEi}8Dseb>?EkDuPN?!f2Wf1PHn8P|#TDp$7hQQejQ-nrVJ=U;y%(V4gX zi~pQEyBIEPHLfz`cE5gT<I=muD^n(ZylLP3L(s9!m>!!`ap&0k6YLjtvrEognW2V1 zZ8I)1+&y1(e(`?Z`?tKG`^M?xLoJZB-Dovz*g19NGmGC%T(EB4SG~Wdlc9CHvEA_0 z^>mZ*qZcpTuiK@bd(&H9xVqgq$#C_SFPa;RCpcbvX-WG(FE6;}FWq5$ix`F#&aZu3 z>zZ2k*6_=<OaJ&Pn7WNga7VZCtl`ns?(_#^jq6{Ct-8Ow;7bbCJw}J&yU$<x$ENch z&)oM89!^MpZZjO}F>W!ulz2Apxw)?v&2M{W&b!4gruf@-8Sfy5)~D>^!FNB4yf}5$ zjgq19_rj^&#wzvLjd0r@<FJ&!JybQPY$Bd(x~FJHQI$#+eF1a$aGo#}j2SbgCcmKI Fe*w7sG`;`; diff --git a/boot/ocamldep b/boot/ocamldep index 2760d2f95ef5e4ee2669cb76e5fe2cf5d76abf70..d5231c778996f38482d5e93ca5a26a1cdbac9432 100755 GIT binary patch literal 556857 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 literal 532314 zcmeF)37n-@SttIG?j+SFE`*RpB<bocy<}~YU;-pJR3{+>1cG5nFf7$TCxnE6fUE)2 zbb>IbI0K@h;)WYKI)H%NxWNd2Mjf}m3T`-yGs>(wI67p0-`nrgoE+X;b*s}EnE!vy zhaYEq_UAe0eebPG_2$KMU;2_4pL@$~%g?^$-2C4QZ#nmZbI#j+&iUs)=cZc^F1+}q zw|>dj9(B}F?>{>Km-f`)0Y`n=QD2_^#NZ*pmf-B*qTsUNF~O69>x1V7F9}{9ydii? zupDd;9uR0t!IuQPgT;Uh4b7l-lm`E5H27DeSvLpG`Z;KhnS<uoIcSdSX!c}&d>~Hx zij(mqSP1yY5ABLz7X1m?yFAzsv^--ukdxJ7N6%_BbgoA8r47xFjCTfAAAQYzRra<8 z=LMGp;`24Z(}L#&w*_|uZw$UIcxNzHE9|OxZpyf=yNac_jM0_6)#$4JR-?1u=VMH7 z)!}OLsuowHt9o3Gu4=OA+M1L*wyH~U?CX-vTGb_9^h?2)1^A2CI<z&)7Y)6=K4(>@ zW!o&es@2u#=$I!LRkP%c*X*fBotC|}ULTeDV}l!m7Y7G|?+AV(_(1T>!EXeg2>vSg zhv3*0+gAh+4R!_>1bc!f1vdow-{+mLu{ecnF271%#c7^gSDja`=iwn=oQvnmjO9q3 zu%8SuUJ5*K)JoNf^}?kYlL6$ZY3;tst21<@<dJhE?W;3+r0iSh>=XB~IvRU+jM4Sy zQa<IET)D$j`LsR>>Ws>zHV+RuZ5^%ko?#3Ax@XqPuP$5uS#eXt=+*_=EV{4AUQ0Jm z3?4Y}tR-$Ic09A}c~EE1TH|xlz+ds5$Daq!Y1_%2ZS%-JrICGB#_l`qG5_<Pd)oP* zbo0AEd(S=S>fX8BBu#we^x{A*dS5;_iRhmRPszGk(dMxeojQo9d)@IRmri&?prKn1 zipO5rs()7SuE4q6A82?k9Qqq9q^Z-}0%y_q)_~pMylx5bxd*hb3%)0yS1ijuV<5-# z?neSNo)!0n=11p{^V1DYhEp4VVpwC7#_sP5R<rxP0}Z=1eBT!o-%4xWKSFnHvo<RZ z|8$^fb^dt6m*MBxUu)mp(9M$H`ZSB?pAB+a8-B8pUHabHtj&`3QzNq8)9{VSQp;Z% zEZR&H_jO5L#l7~Ivc5H7XRYBe_W88-+$m_)zjL}P!1G`4x#u2wt`26^=br50!LK)W zrp)y|`|8Qr6ricGb@Q(tdOFce0*%gkhLc;*O>}&y81Vmsp!c7z_U>->+>6$nOMZI? ztvEbCV>-yKbBU(tOMaH7G-Al!weqnGFWuXMb%9p?%-XZw(~qr{?Pc#;?IZL51izjh zJH6|<bLGhSzCI|w_YGt9Qs>VYJac>oF>Y&C{>ge@VC;_e-r?SN=aZ>_c2N91jc37` z!G=I%j~tf`56HOc>IX8WXMdoPZJ&Mkjhz$E7<O$A<cEA`<HCUdHw4<<2fL{*!#jc; z<9mvit+mFNI*-rF_+5c>RknTKFt2!dmtqfFZVgIKo#RQ?G&;yFon`NW%{1{~v-ZNE z=<u1(va58<MXyuLoeeQLD?qE=8Q=BnsdfH*ch>n@y6_$ov^gT9Y?F&K0zRO_Cs$(P z+-?lYr|lWH`8KBWu0Rt%Yc-dD^NN|;D<5Bzv0A8H<E77?#SVO8Q4s4b0bAHw{v1gg z_`Q-1&&vM00&%FAh}T7dvxHau_Ink}+AG_|PA=33|DPFrNfzYh2ZM@te;<5L_O1`S zchbcM@1$h)v@6{mA)o3ZPooz-y=0Z0#>;^`0z3a8K*xuoJCeCLF>+VS#SafQh{63~ zgP0zU4dMmjspjRU>iAh1m)&jb*1{7J)3f6~)Aj^vXernb^fj<jz0m89aqh%Xp5@hg z-76U$^{L@r;nTYV`tZoPc1!U7FgXh+1^roQ_u1X<SMF9i4?h$hc9lMQP7b^iJUpm8 zk>T?m`(7J7B{(j)FtF|(LF-;DS=Pw;bl}dqD>yH}ryU3`3B=Z!L!<2v&JM__v&bfP zmM?c?+{U<cR&9{wOtGorjpjFocvqa|M&tLX0eih)R<8JWT7cf(-v)d)w?}@vcU|WE z+Z&XO<z|ehVkOV~(a1a|u<t#uc+DT$%riXn96+z#9o!Stoqu}9>}utgys8PY(<)wK zRpW}?t;5>p^!E2Py}S3>f!L7c92Si`W+ABk45$9E_xV9maF3Y1bXYH2)Q46%DVwdm zFsOO!1Kx`N<1!Y<mcQx+ukkG2Z=QoUB-1)kM-!8@8xD5Ub@C^}+`8PI5nL3sJmwn% z_4H?f`rj33f1TL0bN9o(tm9b>Cc$R{x%yPl(tfn#{h4n5?r#3h%x{W}TY?Pld3k!d zud_wxrhu;719P>|&bM@PHP`OD58C;e&Ahe!hUix}p4Va_uUBNPrMYOJ@lH@Qr*<@7 znt3bZ@AF*~pNjq?nUi@|K!<kI-yeLpW9JW=2gW}X+}w;?TYj{Y`_9ad4{hoB)<KWC zc4s$#dN+Se=KObdOU9;QO%2uBKjgc#){aki^FQn6AL-^F$h?imk7s^-BmZ5QvqRoW z=c@-9ZOnEjW+9pW?0UyQtNx$Z$-j8uB}?1d&A;;>4(fYw_DbKk3~SyS+2Z+PkNo|^ zp8Ln1JG=J2q1$sep{e*egZl;=>)@W$SKQG&ZJ_a<V$XeDI+ljLT2n(8jI8Y#)=nN| zJhYMV&|#15t#1B3u-juhn#u?J9x%|9e;WrHXOEp|{&Vt!ul#d&ln<X6_G*m}A0O5# z=FWAm_vb^?*3M67e*7SpjCW_QHZKX<8vU+8_W2F%tA;gtE(^3)_VYX0PtCmDzh>BX zC%N0}E@cP1#asWdfKToOb9U+3-P)+0+xd=e{?Kmzpl<#p-Tbrv<DPpijgDgjt(E=h z?6E=o+x0)sdOQDvZvLCy{8zjAhr0Psb@Lz2oL+UH_l~9aPFC|)|Jw(8F}Ck{rhj<Q z(!F7zd&IE+sBZt|ogKG!^XClwkM8)M+|gY*&|Nv`dCbsX)AX%f=MVHx=;Ur4*1cQu z=gC8V-O#I<-e2>JhxOJ^>*`m3`Oq&7{S`xh)zDu(^kwhkhdKN3KWXU8o|}gG3x?i1 z5W3rj-ZR<!>xcejL;np!|H`3%_0Yd|=wCPV-#GO9hyK9O-#zqi9{M*8{XZJ|ZyEZx z4*fqK`nL`JJDT1ZcuJr>C=d&A+!2WXFCFvw?_}tmb!U0cFg_vu9mCr0^zOs3PMh=Z z?$kWDj|;5fr)Ov2PV|g%4~R$Uu>PeDPS1FK;9k-%1kVldi8s64CvvbMa6g-qqn8is zw+>_c4;;p|&i;)7`S_0?#&n>?>-j<!{+1pOI`PmK4IaGSjlg>8^Lc_l;=<P*LB(V_ zV{*hcuTInZhwRq`&ckDZX9Qx2mmap=7_bd3eb!6HWf^Pq%Q3si(3S%9#m{$Zc<Dg< z%)q+#x`18o(V~5A#_~ruo?6FSay|Dp1#bwnKaC8&w)A5<)u>uR$Nr)@sabcf#O6bT z%<UPoui`34>jL(PRcpsNnUk$nP7l;@>u>3^S3bWgWB%enUo_?*FLGSI%cq)=bM)fF z9x~OyZGjw=oU+53G5f`@=clV^%Vx1^<&aNb*-U0@v%S)BW5!iO<x6k3SfLk-S$6Z6 z|GmwX54@Fkby~WNoo9Kf^P+~xk~i|s3h?sljmbBA)djk?-tgPwZ<`A=^i?d4%Pw-u zF1mIF^7Px$!zQpM#wTU1Y$bzzWt)8YT%&)&uqV#14%7{MwS575^z3949&(=>;JJO6 z(|ucjwtTC6p)>yWfb25@GRQ*DzT(lN-x%00S~XF0>bLZ?w9YGjI*LZF`2hB;^Fx04 zRI#lyOrCr=gJ{jgu6z-9dv^yKo3xe&pLx~19Fb#vcW`DvzxAGWd)D|}cC|StlWwtN zN7+P%dFjh=S_^b-3&gIK_q@#6b4QRexu?zHE3>8s*dU(n<AvbDU}tbqK>sArZU~MJ zX2t0MqBNg9v^Gv^rj3*RimNkNa$7&F?F(8yF%wIBz0BHc{eODs7J{lNvNi?R2k6P+ z<5D25e0xP8F6@$%Jpmf@<XC%aP<qIqXG4HTt<_oIoN?)5_bgr3OP4yU7+0R@E_+(t zRWo9tHr!hv-}cD8EYQ$^JvP58;OBV(+Tv;NDD>^T;<qpB-UHe=6+hdr4oW6ntql9( z-L9=BmyD8|;gnxY)ULhqi_Y@PJ6+kJZ}rXc>p<wVigo$a>na`elU@6Atd1suc0*8g zf)4nBW><jzEyMjSe{fcS&ff3j?oKy-4{Ldz6COUOm7*7iPY?7(Ywb~?t(t6U|9fcN zO-~435U{KKbx#<Fb^0Bn+NO`+-fvD0o)NI~!~k#IQRv*o*70o)&>5G^v3I7wimv6* z)O%Kjhv;w4xVK?z)@IqDKIvym*(J8t^v?{~tf4J?7c$-yh?kx%Y@f&ePmb7sQ+TUZ ze5bQFsJN6}WvjDVYxvNyvA4BfFB`XqR*ZH8I|I3g%K}X-<hpV|FZ!{(;#(T_#DZOF z4a7wZuMXyk%UE8?X0P+p+Dl&9%RYH&Z7zH3Ge}#9t)1+nV<mg(nzs(e?8Oi6K<^yJ zdjj!9FQ4pi7Ui&LtjPiT-NClNedE3o6S3FG<)22bT4?2p583h|Ki;|MJS!;MelIn- zF7ulLcG2a`UlP!TuHtX39XQxcb7QS+GG+svRS%PlHS1MZ<&)fMtv&x{I3sLn^IEpG z^*|q><JbN`LsRziZ8;FrvPoRb#f4oJn~Fi%+1HZqlIuQcYl&@j9~i62HlO5FKF8|m zKaAW9V%q!4k3KHFjm~=6$d2;4?BcVSt!C4I9Bdl1<8We5|6;I~c+Wb!&MaBw(^_IZ zcGrygI8UtIvtzMVTkI33)#Ci0X2e<U;jTdQ&P-m--39i=Q~lo-h)3OfY*70}&kpp~ zi(Y-yJK93V7Y4h6uMTzunrEoH2QT^-&mQ)~&wDQ(&lP%GTj_LXwYHd#+3rp&Th7Y3 zx24{%$%I>jS?AS#DnED*r&j)RlN&K8|JZ&w{+u1Y-XC!#i+!M$#aK+mv2=>3CU@;! z$2a`$+^s>$L$^QB#8cZBh*__r^t&s_E8Q7>o<8#HZpEjK$+cIu8{=uuJ|6zg%3a-K z?D_Jb?&!+nld>iz8v-(n$L`j;$H*&t`Nxm4uVP#A>V2%cU@<(c4>x5#j}PSY0e{&q z2lc!^Tp!ej^Q!&J)G9eO|Gv!CNxSyuVGRwNZti%l?&f|T-tzxpJ`c3>_jU7c=;qgU z^9ObF2MqJG27A&S^`-gwioR_8aQ8Fc*LL%-$y_a66r2-Gg3knB7knxZgOc^`{Ot3V z%+-{2_qX$4Uv2En&*7|tJjofFg`qE=T9-fjYD@1<)_WId*WKOb4;lJ1hW_;QZ9M<v z?>_glJ@i`!I`3rW>h{t=oon=ZMqV788+>i>mKeDs{mwv+!JW!><2}Qee|2tlXH18< zX!M9jE5|xH;-!&ue6SQ)GoAz**(KAxNpH!_a4N?gr?qm(z_%C}*Ig;DWuLQ17MZPm z=IpC8MJ_wo$9Fc8YmIJtHU+KS<cdM*Xk%aubg;*m4su%^YGYGCk1@1y-kf=_Q;bUI zx{SyCqKA*O{IZ9pjeE&tYsoZ*ik0z7evm6((E4#^<_kgTXzgxw;OlkpA1XeZGOnDI zTzciBmusEv=#ATWSZnjUIdgiftDoZnw#<?%e(1^nsz5V#UNySxF9m4L$u_6g-id*@ zluziaZ3yJ1Y?@@Ou|<7q*9Gf?<-odHyf8Q~sI!pap?9)2r()6Ce=5Q>_Pckqwc5Wf zJp3x3*e^fUv|09^pS_jrC08EAuHs!bve&(+tz<7>E7uj{ioaf*+qiGZTx{vo%67Jh zwKFKzeC%ykHx+C2eXPq~wl4<SO17&7H6`zAg&*#%dTyArV`ISP^0oYt18Z9Op;lTy z9+vq^e((X<yxN_KMtsoI%Qol98l7z1JB;PEVzm|>{8&xL@`w)l%C4%VBXM^5EI0Bk zA7XFL_c{Z7mrJekP;scUdqMX4Jn*w(bbr~;p2M-fVqErLxQhL4j=h(d?+L_gY3SwU z#=tq*7rY`k+<dqC#_E<{`i_*2QzNVQ$+_htJ$$TttbE*`HEn%>SDnbYTJp@R^CLgv zYww1jYNGY=<gCxDpU>*{{?yA~cfd+Ht-HPabbpG0npz&lv+fD+v}69ZdfVLI7hOIx zucm7(r*xJ-t^Q3}SAUa0E1K1Oo>gPL&z0LFt>4`?76*A=3`%c?Q=h87`e#8~%V_b{ zUA!mbIxqeCDLHiYdw86gNuc%f$#nIgU3H!=%9_~osXbFj>waLHxNFAs{?XdWF7tZF zGsmy4<+|pRjJ3)1|37Dose4Ymss@b3$?rk-&jshB?3H8o)4^vpdJoi$(P=B$TfWM# z*s%Exfkv)1Kvy(;+Z@n22{f_X5UdM|uKJ=UZxU!l&wlwdcgJb%ynIEc?LXMv>;9@Z z@EI>!J{z;!XOetPaSuDT1@+t#+lvBplR#_lSaP+B5&4%+R}RKkj<k8=t9CX8bd?X{ zC${27$0X3yvU*}~`yO{7a}DhnpLmni^A@f3NubeD^sOGTv&S}fpLpTd#?~u8Uu?0u z`=H5Rl(DK>uDZH2wu;|>3GAs4=V);tRClKj<Em?Ge;#P<+8-QTI`m$(lzH7vathwD z)(4w{wjSl0UgvZcjpy`o(ALuS%*oZNM#)8|W+s6)#?#Ac>Br<gDRNe`v2?fk`n#vM z*ZxZOj`54(O0g<CTAx~*_@@T6irbhSKJ!fwrH%2gWOvJ3`oxdkSvfAdTc3Nq^Tcm8 ze(@uBH9K0}Z7j>5i1@ttwLEPM#`wjrrEh6k-qPp&^XR~Lsh%PAK5Fi>oaTI<KONos zeC{09meR|CUMyi&9O}%Wp9C6P7N(=m`97AnF&_T5>usJ&Zuvw7+M5D4enUWywc7%` z#@^vJ1>$J!VZ$6xJKvXit?~ERz%veCJxgZYkAD@K_I~`z=6*b7<bM1_=(YBK{OyBF zE8dS|&+4t=TNm(UY`=2U){$89RlECOH;tY6w>37#gQi_?>Br<gA@nQRSGCc~<jW+` z#$?)G$<{Icx)aA@R5rA}wDzz;Eol|6F&o-5ImW+|%`I=~6E}KSvbpuO*V*TI%;wej z>n>c$hE{JI!}4P+ZY@vi`xw8twe&4b%Uk-~5p@sxtWtM|d(ipU+=J&$NB2I5&bqb~ zh`nAMVJrr9zR*qrjU5Zq(dX)=YOIa-7!P0D^_ITmmOoUWUF{C^zTDn{?tgPWkzezD z&6<02*8L|AX9cb{asH$HY|^-2-<Y3oW_fC({E>+dkGfjU{*UG7s6O|waWN1l?;J(r z9_F_=8?%|LZNY}1?q>9wc%YHra|6v7z2?rfFRy$zC$I8tuku`<H_4Pwus;bjpHr-n zQ=e5@+BSD|6n#r8Zt9ub`}(=&zWRH2Y|vUCzF7PfC#~{(XU1~=ErGrL!MfnRfhOla zH67jie7|mF?d8K-)quWgg8$II165u4oXrL{jqS_-a?sWR+DV|bvE81zdM0m{zLM9< zXl0MdqratZX<FX3=x_O2d99vSp7oXD)5>UNkICatOW)G8yrsW=7Mva4x;s4!+#Onf zKe&Ue)z41V13h}WVa%Vp<6E0rTiI04i*~)GFPgG5EK}V#rN{Gye9wJT^tWg2Co<Q> z>c^&|d!MyejjX+RSZib2pS8Mw?;dC$mcGtezbEHvqRo99&o<6g6LrRB$!hsqxnr{E zZs}W^mUmv=El(?})zQkbKFg1mzm+>Ciytk0OVjd}?)F@r72c{>=L(IcE_^=GJZI}% zIXhZg19U_0%NO!Y-QVv`|0?f4&J&--&{%CQ<eezpw62_u{=Mmu**_)U8y~6nCOYMc z9%H$ZbNLZ}_ALfz%-P8<XltY1YZe-swvN#EH1*ym_cfkmtf`}QLA~SAtD$S-<@X2K zy>9@Uyt{f|Y<cnX!SBKw^OJpJer_0O$ZCCHzjsNp$*|w9WjeJ_-LqZm?fpdTUCuh6 zi>~bCN6EF%-qQlDa%9YQ`)p@}x%k$c%_jzO;r-GcJ2nNAK&xD!)#~RxY!G|(<sIkZ z!1qaP)Y#m{7QJ>>z;^g}eB?jd<V7zho`2<Q(eeWg`_Rza)9{@ic-p+-C7TcU7lTQl z^?BhFTU*)aTD$$-DKzXMQ?AGC8MC=^$_{+|?{)FRU8(gs+<$O+`q{{kz3T&V>Ssl4 zYW<R*OM=Re_{dMM+xme(TL|zyA}GEL5Ajtzto_yy4|>~p*yD>j(D>qRs2G#~$e`qx zT~#YB@6rhGqgLRRn>NO+y|@3(y?+Pyzs3Fyq2Co~f7Z?W-#vbB_RHo6haPV${{@|V ze>b(KdD%eIukX)#E9)JdtbLtrPaTo{Bb|&7buxC2@O-r6`9wGWbmkSG6Gr$?{@Z)o zeQ7tpshhvOoBwz>|D|sJ*WLWI|9)?M=XdifyZLjv`K!D6+q(ICy7|Yt`M=HF8F^?R zE^7BJdFHBbcdE|?wSIlp`#k@rPTrS)=HC81yqn*ec|=ZSyEo`iCv-T+|1s|gbRQqM z>+J6sdY}1=?(O*<aCc<U`ECr*ThkZ6JIGv(>pc_oo;7;Ue7zXxi|*86UVYJR9@gDG z=-uP`vXhPGXAeEQ&3*TzzhLMu8hZDKb<ZBXyGlP9`bQ7_6+>U^?h<s5?fS17=1&~@ zCk*|QhyJ>uf9lXbJ^iJDJZR!|Ucesf-g7@5@NZ|JMnIfz3+f)saQfd4Jv+VUh<11I z%HV+}X?F#G8npX=o4LBu?0+Uu1KJyc&jxk(dN%kwFLbg&YsdI64_f)xXWr`n=iUDA zW!~!le=~3O|8eH6{*9TpI@|G`**h~hC(z8F5vX<TK;ZpE95p#Gx4#n5$o0t$o#%qu zxhyCf%qQJkJlcKr)XvpWJNJC6d4|*fM&p~(KP8a!y~En(VZJZ@34!|3@E$!K9sIkK zp6mWQ5A?SL;?eRvKXWq4xII9l{%#F!3Q9IQd9kl|zR|xpXnAhVyyr3R>0Z##WjM8a zok5y9(%L$5aV-R5d`0lpfit0P4a#T!t4;TS=D%fBUp0SOH@~)<pVQ4ZXU<<fsDrxa z*y4Pajn1vHb9-gr+`c&rY}^^}ja}mQ+CV<#hCjy!Hw0+x({*j|ilFHD$2UAh=RB57 ze7l1!0UGv|ZoKFY1X{1xKAmHF@zG0X(b1c*O#gNQoz5H|G_-iM8kZf`K^@;1oF1Sd zw`j`Ns)2><X=?a=0UIlR_Qdb1psxo$x?AaDo4kQ@yE#}6_6F`JHt_GF04<(2_Gr<N zsl7EQd&{SNSz{ad;-MCbhEH1SL-|*6lfTyl@?CyCCga{Oa`~m+&Iss4uSQR7`VGUJ zFKpTvu)p`)+G>8&skMH$c~T2(&{`k+JYAjr-XHqO;zt`lajE!KjQLXX+ZsHQF@J1y z^fvNeebm`>574<KU_ak`TlZy+KV>i8mZ$Pg*Oh@7*xwe=rPZE!yVvU~9s8$T2W=9w z?Lp-U|6;%{wp<&quhxv)XGm|uk+4sVwl<Q<#?r-)%|XSka=amH?0ZdcUGU(*bBvG9 zbopYuDL^Yn{6T}CEaQ`cipeW8CePo5UQX{!+0)o1x3gk>q<mpd?~8Y9d0DF;pI*Ta z{#_Pm72m3xS#d^Rwuz@W^V{8J?mTLD2I9_UO^)$-@ADk=?ylj(bDT-qfj}*aJG#1O ztS<!iG<JSdP|w1>8KXZoczz&H=5qJkfIPXzzZBd$jIT~_eYJY{l`f8WDpu?#vz`xZ zw(opx4b}x38a$hWiZ}hs0lP}xtl0l$Xe##Vp<<8zk7J)ayeYUO*cfOf%ify<_lF#a zQRRbO)|?ITdtJbOv9sRpS5E3&nET98@iiw~yDRXnB_8cQe>JwL5w_KPw;EarCuV<h za6v<NMaHc?*JM7Ae`uZ)jQL3ZyfVIih75MjD?>ew*}>m=WxRNX47sfMS1(Uj2AcS{ z=gB$K+?{f-e{z85;emEbuv-1F+qrZ;ZV&LB7mWGZ)*U`Jq1T@f;OF03WzfAEU&W;F z*M;|Wf%w5{cf@Jk9TAq#dzQT~YtH^<Hq*!yS7$^#wbuoull^k=s=!@`UbE)TxHkBz zU@`FAs=wQSzs~+@x?=Y9XF+6^zIsn<^*NWlzIwjUH^z^r-*aEE&AQy;bDw!8oEaP! zc%E+$)(0B;e6=;b<KCRH^?DZEneiz>f6tIvITd5JXz1N-J-r$%`sIx2XXD;xyd&eC z!+N?ycQ!xj{;rx;=XKxPm-p(O^=AjC1$6MG_D;-rA*lTfr?#+HTuP6;i=DWU?Rir? zV|47nb9JE2k|RzfXN<0uQ!%3Nbpc<rlFc?Y;xVSXc-mOvQ{QUUcuyc6c==W}+>Yf} zy^7tgKu$deJ>xD7HUyq8<dLI>)H=Sh??o9`&9l+^=77wip|f(+=51X=Q}(qs$s-%s zhW1-$*d`teLDf7z+Sn{-PJh``evobbHNkZOeeMwc%AvDr-?-v{2S1vV0=kUry?55% zRYEhb9b(kmA)bo?Ijh;w{{0~5ykcPtcLkbyBCqD|0Q>S;vAQkeHb!D07scbO;%W1Z z2c5X8Nx8W&xF%3r?9sLc?hO3sTRb~+XIpNa+b<R$9v55gs}JJW#+~2lsEw)ltUR<a zeSGM8d&G+lIVn6V<8uS?6z_^BJs`(WdA~JdkY8(?1F{YTnw%~NY=2=e3AB0^)4wm6 z1R6Pe0zNGby|b=Xtf~3ZZLNGFXH$TmyjKP7bDT}yuh`-IqO02BCx15tv;1}EpBbpb zmgY$1=W8Oje93TH^XwAyHm-aVe=&jbA;UvCGiI-IgJ0|C6~i`f;#>0d;?>I+=klNL zTG>~;^W2+kUkvynCr=K@lY@EgP45ro+xCoCva4#Aed^#@!MTA}yt@ugk8&@wq2?dX z9AEj^?)^me#1Adoe<*V?toe6$vR=~BKd;;0*3Iu3e(qSde6*YYlWzW^ZvNQJ)p~2w zXY+H$)`xd@^E-y0Ll&Q29k4-+w`bp)oRy#dqWkw@zO9=-BlFgVCuS}u#eYTSWXfr+ zotd>Zwh!rKd`0H`I4h_+Jf{2GTz{W=tGE8mnU?32j^|f8o*&3ut(ILc$h@`d#?0GT zoRfJQ-^FfzS~ov2bFtvR+SJphFL-}2UKn~lnO9GL(dylidha><Glt%I8=E@=)^`ql zKR;(!KX2%F5B&v0f6>spzsPw+*Lz2_J{kH)550Td-ljm4|1H7A!4m?{h%d<@-;the z@(ldGG5D*1ts$8<?<ss_2maHCd4KoybPt`A&O1H%tH~?*EnWG*R*-W*)7or4_MBOX z$NNvuBTgVzy^d3}wk_~{nb$7we7%m<d^vf9XC=GTYj4*|^v*@m<E>{JpI;kz{_}A; zP$y(*;&E-@9N!f<KX|k|gH6F^leGPTcWh@$J*pKAAD-h((hda9FFVkAx6-UH1kSX^ z#%~JPhL=tCymPKRv)!|MgR1RzoaIAz9^PNhGlPF@Sq#WEwpVpn=fU|x!~fEQuJl}( z@e>35&evZD6~hb<#jx~=VV#NVGFH!8<)PjK$ZKiKMzp<+CuXg+QH^PB{>c4e`;MZG zH-9VU>P9`aF|RX+XBMAl?rMB>u3LTTtj<KQXN+F$7kzt%<aH^KpM3$|X9w<@F}ho` zj_2w?s~YI#&{uNC=vq0IbNXHvh?Q2d*~UgZ#&j1?@4K3NbU?<QK&|5C+hu{)j>S=2 zo#|bHI{f3DHF>=>*bvAMdE`{B<171Klrb4)qxH=JnMFe<Tl8wBVzVyeqAB}Yo17Ci zunq03?>wpwH-^TU$8%xuq+ol%uZop1um}3Hd2H6$U$wkGW38uS&tgz?tq$=5aVgu( zHw8tHzib+#&-Ulh^XUnJ@6GiagOb0PF@0i1-oH;C`B(El9Oi1%8hibFv+^Y7we~YZ z{>c}|l7IX#N2mF>E#%UizB4kHuZ3pq%Z4>_?2&<<?!Oz}+dZG`m96&vqI<{xxy*}> zz39tkaeUJttKTE*g~ML?&DPDsTFJ0>;;`mUDxZ!T)>=RPd#&_C(S34QYv1iZHmrGm z7u^SkHD?{a_l=5&&nVVT9`;Uc_TDz^p-1C>D!w-id+6<{uiE?i?1{a(wl8yW6l?L| zD;_!1SB&kOqtO?gG4M&>+G<X>{-HyE#?UVgy>n&X8P%UT^v;1fJN0J|{kcPbetP#2 zzcq1o=UyCK8+aF?OI&XVw0izljO94Lo_bH+GtM)6Jr~r_a?r1_YiEELjt{&u(1*V6 z7Gw9=F(DE|cQ4wdU|(SG*kP|-`)sp+boPsuvKl|28Q&9nHGW5sUp1co+s`i>=9x}& zdrRgEft=kQyeL3#pUm>Vt&5Lj4<8zR%6{6XT&8{gv*>A`kE7E*ALpih{#5d`7gv1V zSM+St=hv~Pz299o|F1*;Uxwayv(|kdq4)D9y`KZ={oaJ$&wcg&jRrnk6g)YY1fL1S z_ftXDuk)&o>I|*R_*LP>CwJ&h2=31_pg!4f`p|D2`b|T>W$4u(y6r=+-ptP$`g4Z< zyrI9K>mM=9t9K^w*Zfh#{PLl{WazIL`m54ATkO%CEjE#JT_9fH8Pr*Dr-JywGlM?} z*e}kSd|Vq?OZgt+H3nzns{_xN#Q}8|J#R}_(chIdP2QYw{B*o8xGiAEYXWC}A-HfD z(?OQjeio>6{En=XN%yS*Ijvl0t(W`Mto3r)TrqJ!sLhH;?+e`z3DiO9MT@_uJsiKE z7CF6r@=|eUAHRE@d_Yq=oeehCT%643iT%?<*W2K|iVkvHJUjD04A^r_uq)91XgKpH zWlXnq_I)7h=5l3?O+TEqnxnaWpedeb5Bv1G7v<Hne?w6E{GP6Jb9}eHly&E0A<&!; zzFZt!A2=UB8}RwKfRFOJ7})0*o7_G4$bUu9*6IzJ_wlN;^w#W=&E{72O_`G=pL}5# zJ@e{(MrhZnb6<Gwi%w^2C7s!x<{I7a24cjo_RRl&=C2&~<Xm%)s8jyS!E(^rDM#u= zQ#-AEHPOqj{LGRi5AGQGlso5{K62St{OH)E26~?Utm79O`J;DJz`t9E-njPFhW$yP zk<Y)@?>`#W=`USqfGlu#t1J9u79Ad_7>Zfx*p;#78NVTY&Hr6D|717+wajn97wG@{ z(0^v=|8D62$I$<M*Z;#X|DQwu*`dEDJ^RS~cX2}hmqY*W)7QHIKiSHEKa;>?&d)0{ zKfal7$^3+7z9DmWgId(97yEUeSQ869IePl^&ZfTXXk}PGW!OJ$=+%<-hYtN2L%%rm zn}@#Mq2&xcU))nC2O2$OUmUn2oB=gEE5}dIUgbE$>3yX>@VYDPi4_^o3ixU7=Ahks zcC+`mjGbY%uN9rKvqFBYk^7vW<UYUKTW<EQ>-P3$eo^q;p?_Zbwl@2pcm3<+v)%t! znd7HZzpvx>`<gAiXHYx;@yyjz)r4GEzOBoTJ-wRIdk*Ofo^$fYe@*_3<?p6owfx-{ z8nIO08b9Plj$RzJaehJO73clk-Yw1EYWaI<$NR#D_l|DQJytsDZ|z|_dwo{X-yXE_ zoi~5{#Q&0x{|lYJua7;e<?m-h)8|io<?rW*y*hs{%e-Rw@ow+s&E9JH`{y0+H#EGz z-tE1j+514Z=XosduNwMSr(bLSJlmXW&pu~H{p46p&*f_}7KaZ9^t?7G|Jm8<>d)qT zy0iMOBXm}s+mnM!17}-vW{sU$_RIN`b0F*PdVJ>IaceF=+EoF6_6_|N>B-p>c#bRu z^wd2{k6OS(roLoelX0D`3=hc`Q@Ao9TTeC}Y$b0cU3f}YTc>4vuamBRjh*!N>t$E1 z?+DG#fKBBmJ^ZhGgxzZ5(*ZvBUe9+|)->`<PRn=MboX=oVmM0{+gskAj($2yr~BPp zOx<s6Fa~ne`xAoWg3Uo|%lgdAmUS7IU!`LnnP-NNZ0)LmOg<Q^!LmtSYk$nPGY9&; z>G3~4SP1yfzXu0j890NN1UCiyM&P`l@!Wr3U@j&V2lg!nXm$nKr*c-?^Hn-`WUs9c z`uM>P^6Wo4*b<O?Y@m_LX5TxZ-5Q9gbL_o~Za$3JUu(BypHP0t+jJfwHRo5^vMJ-0 z?5CSO6%%}bPi*cEG(KqV6Ta*Xyhl_n)Qb6@pk&FF8g!R9Gp`Ar68v01-WYAwfp-^t zY6P$Q9Pd{JX9TAP#|1^t=Y^nn#H#X5PvyF$XP>>wKYup{#{~R*bnx)NGeKUyJZNpc zIdks|m2c;y;wFZCX!W)BwejG`g~98Bk|igLfmV5C1K+(<lV#q@XMgKId#e^&y8eu{ zeurgh_hZw$<JHIdp!m_ssXLSp#*Yg$V|3ytZ|3U5Tz%A>Jgw-}Q%hfG#eVr?d`&<W z9ekH#IebEJN01{meJ2)swI*+;2hRw^li%)Zy!^mlbtRtcB9AR-zdU$mKwdrX$iYva z@kxOg8NV{1^DkltfANqhXY5xWZJoCD$(E|ov3kt*)E@B=ceaVg_CQQ_1Umz^0GomR zzZvxYiVJ(hlFwfj$Q8PNy>d!t<sA=O=-3m8*HYlFsr**VN;V#i&1hD#`CGI9#b~p0 z`uac(><YBs80xO(-`&lBC_l`&D0JT#@JY<j%F{Py&ziX!dU@uxZ+>;=t**1X`9r#S z|9gl3sr&icA9VANbn~C<=0Dxdf25m#Z#UoH&7YIGx^@@p)kM|3{`g_8e$3UFvtsN_ z>cvMdE_(H(FFIp5b?7}K%=_;#wq#9x+SAzL{CZcuGjQjBm87J(bN?bxtMahij5C}* z=hgexU|>1)ovSlad>M|eljr%r7_{`W)<ZU>uk(6aGZ&wllT~+IZ^LT5&U4TE;H=@J zgT1rlzae`Xx_NoXE7|O?JJot?iyB#pwzY|Vb;6I|3cNG8YvfQo)&=rKSB~lQ-;0q$ zH0(YrKns31p?qNjpe3X3uA;Tq`eME(V8=p0H@#zg>h$!04bKWb5%A-w!LbAEZw$ye zFYrt|EwFFzm|$@jTPs`0cCWLc=<Ttu_S`SpO~LM9TR;ZiZwS<+Gey4f%|X%8+wZ@i z+kblI&fLiXo%G95`Mi|zjR8C8xFryaNuXUHIGgSeb-?yl1aiwS`th)35@_hxO-Bd+ zrb9i8#8qC%pjQv&4|x{``-8HNz3!*-zjPH3y_!4YcLR3ukH2JF|NWq^Yd*;51A?MO z!@i0~OH;MOFJKcrWv3j8?^ywva`@cTu=mBP2Q=kRjoDvgcWaID*Z8<*?2fK=Hq^Pb zrq;+4NBOKZvaE>*{rcKNr$+S4!M;Gfki998e{te#=_L;hnI%VV%T9LSFCWUT^3|NL z>a6(Difhfua%OAJZ*g4;`Z~mmR_@rrUe71=>}30{0L@F26FFnc)x+9b)AJo4o-+dW zTcb<N*t&0+)8jqy+<=`M1N%kKKkFs0?lCmZulT<xAkSF6efuzHYt8AnGtk&Gwl0pf zE{ANlwlIK>%9SyHmV&Y$-NryX)&=&(rDD*^aR-!)HU_N>F(%`&Gi1n1$+#lpF+1dd zjBA21JJdqSxH9808CjmncwBmMCr@6Cw+HegUl#>$2qwX20{6wI0`l!02qr<hXZ@}K zKe`_5xiiq(aZ7hg_V#xBwO09TdHX%G=2^QmbYiYK8_t3F-jH*k_G<3u-0H_%dt~O9 z9UM;i)StN5yJXR-n-6vG!KY=8wq$R}oDDVqXx>Z7srk<g@2LyT+V^LT&Z2ooH~;2t z?)TtY`d4MH?pvR4&sy1?t)p(v-2Mqc-4lA}NAKLW^iLmTdS2M~{@T*>(Y!Fvew&|q zKfgFK?hZUhKOiV+>US|<?^VIJ;P_#@B|RUkivbvK4)|is4>>U=lC8#@0=Y2W7_i;G zxwB`E*ZlNhUN$^*n3o;yYV>7`=b?Go!w2)S>9k>9cAYxR%QnwW^krYg(;9m!UV3xu zfX=*XwY`7s%b$D0xSr3IJ2v2DlYKUtvsteApluJ_bvuHcfine939K2r-^5~1AO=f; zSdm4Jx%i9c{y<wFI8)>w8))tz4c)q+a?HQo0U2U_W*}E+*k5}^-_q>O{=R^HdcM)E zt>l|H&GL<`0=m-ASGFw#8auWI>>P{VYC6QPWS72qbjX(`9`Ybp*94mJqo<>TwPAlO zf8wfk*l1r4_5>#e{F75_cLemY^)&(c^rB%idVTq_d6-+PJkcRWC98C_^3(`Auuop~ zyE7)YmDlS>OJ~K8oU+?_R}<TU<AyQ$&Uvk6IQ30jH2$ko{;Fe*9hGmjBVK5>2mHG* z;KvPthPUL2v0UJ(oRLdT$z`Lql04^JYweSdzLx2L%FANL6&o=q`riIGX3z6lJ!||G z$FcgpD(fXj?D@tPwv}!=%{K*f?GH5h6SJEFJeLO=-^EZnaIl-+bM&-#0a<NK>8D4{ z0>9PE=D;4bI`Gp!kIdrNtFsMFUpji(YT=s#{>+M>=Mum8LH0cH+ZVc51lI-Prd6EO z4|$%qbhiF&%UsMWzRSaSmTkMTzgF8SxAI3fpX!X!t(C16e?EYmIS1;b&bc_ZKG-Yz zmS&bOA)nfy7M;asT1Yc~+H`be?nt%v+ClEd^v;)9h@Uav`Rh({9^?X#b+%QU_=m3Q zdTH3lSFusA=-ai5h1wLaUU%u}b(c+YG^V?1oxajvYt_p~?X`CBoqY9nOrW*%_CB#k zN9D==qsbH5ntgGhZ%-h8;$v>F^}#+_6~8+(*4V7!A&WiM<e_{}hxYsRx;yK+Qv7Y* zvZK#S<$5`LVzEAG$MeSF{P1Z<A`WcSR*C~Xt#5M67xi~^Fy=qGWVU=2H++3ftP}^i zFFWayPkCk6QXv0y!R3L5MjqK&&p0t>?@DprnSG7UEz{BG&S0;TEqt-gKDMxdZoZn= zS-LZ0ZT-P+ntyc126)93EnlGK<pa5UgQ}Yhr#2pw{`o;Z+D`w*IQh##(XHgGXM@Jq zubGYx+RiVr<rlsD;HP!AT9;SrY(?AqyFY81eKw(~b44G&!G8H@%x<*WfrH)jvkw{j z2CxO%_xoP9oX?U?FIgqWcr{sN|F%JH+1bW=Z}zOSwT-)4=W~5$JQiQ~PuZ&u@R%<K zYPR<1=UeHuSGtT#m(PpFW4idQ_VnVmIpCi;-Ev-gXJ))1Ae(RNg3?ER>GPR#mOi@5 z7jdZkmQQq6P0&;8<tx3%1QlO2_r(V9OJg=zR~swYFc$YV4jaQiD-L~*E9Q&g;j^<< zbu4CLBG;OHps735z9v_7ACteDeV2r0Ui-+~6VSC3(C^%{m#rrT3qjf3)3c2aY^Srm z=g7p5hfIEL4km#n=i-A8of>TE@VD|NnQO)8o%>D0Ts}3n;L)6m@=MPLezjwtQR%-m zAa`9*@wGlygKV`ocJBDvo~=#8e3D*cL)E-FoopY|b2y(D_7j@sej=BA^{yQ_*iHA? zztZOhvBh`8z$30=q_y=TmiEMqOnY*=6x1F)v-U1uVNXnoPh9B{+l4@_)bq&uqq}`) zAl|13?vkwm8_1}-mOHZ4NZIIJaxtiLMh5zNKCA5-lUHX^t%|XIa@j?8$rFd-8<VXL z=qVYi@uH_6{TQu%HfU_%zdATIPzU1B)>)?0T#@;vU|ry|Cc38vc)`AyK046o-WN;) zjcoDO<j9_;7VuV_Z_3!7Sm@j5@g#GNEOn=m<-XR)qSu<|kk-m4lO8d@IUrwbOQ(GI zI%nx$2yH#b)$Rp>M)&#C(Y@{2IkKjnv@sji3tQRD)|G5LTpz@W4{C)Ea$7!ScqmTt zbNetic0X+j@VB<x<G=6D)rY<IoQrRrf!i{6uX<lyNgkQ)*%^C2*moDbIk+fb*Cfzx z2p$}q6|f1ej!r$>>R!ljdcLjkP3+Z~*l6m4Zs$jw+A~5HJMH5|>x>kCOS_zPI$GLx zUiZfO&}iamjE_9J_BP{Ic9y5ID-U9=kztM9b??;OwU{+y_IStho<WBg(pP7;oqr*8 z@>yKPO5dK#ic8s5Ipg<2pj{d8q3T<`qZ3zWtZ2n(C0a7nEnc?N_tkrbHF7Q)##f{# z+nyLN1(j=YubMG_ZBTiV1J8}h(dLZtf%=dqyllYZ`(NWReQJQs)sM-f3&^Icbf9&v z{!!qZh_ALa*bvxzOVIDRo7GUoiLDhUv0Wdq`;o(#-OjK$)iamPYEo>(u*MZ9Yn20W z;UAl-?|or|R`D{X*E+pq$PYVUEKX#XuFAz&yuLYfeM~A|-!if%UK*L@UmHWQRIlQu ziL14;Ro|b7W3nb+I|Fgj_<nz!ha+uw*;;W?GwQ)P=gaai7K2@Z=I?Kaan1c*H9Tyy zhR@&Su_m`?1^BIhB!A?i`2Nj6qrO_2zX=Wco_8UCC?v~MJ?-<Yc;)QW(9|65&E5Q! znLG1EL(dxrx$LO3%f@xVyJF+<>DfYOt-m(wY5{$3=i4Gr+}arJ3q4vgTHSvXTJ>YE z<heJCh7Erg8or@nOD_k_=KL`ga@;NU+nCyaL-ys^p1RbxcBA=)(3IXxkNStq^=RFD zwI`2Xnm^)_?p`_HG~`o^#Pvag&)yG<*ZRfbt$C(L`5UP1{71X_FL(1l$(#@6Yj4|U zhJAL!sX@tS`>FXuG&RrksHb%EeVJP?KmKU=eGT^_d0T?w=g-SR&z{Xe@%+N@J0YcC zZ(qN4=-n6S<?T(8QD>-X4Q=Jhp7{wwkH);tfiavk^d}EJ->sMJ-bu_)ANq|$ziH_C zW`EnzZy$QLTIaX^oS{E&=ywnO1w(()(7T(_Uo!NbL+0*K{bcALJ@k8q-aTahF+=~@ zp?_R@yq?P%`#>DE-|uR0DSu4pvV&WP-bXIZ{96O}{G%5RZq_qToUaO;#p8#uSc|)L zcZaiOEVlNH#Sf1$8S-N64p67YivgdgG(TgQqcQg!wO=+=&dLsZP_|V4mpxSrWmDZ} zWmo0AZ1dTHyt2<ZEgkHk$J~8%#V}T1_UbP2zHiPawCc`WO`AKL=I$?f6EjWDjt+JN zJBP8k=jP?Zy!iN`9{9x${-_gvECu3YEMDevA%^<{4L^JEu}QqEx5h5}8oTUk2M%^q zKK9dJz)x@WyEAsa<#0=Yo?bngijTf%OP0Rp+ncq00U2Q2+qo`l6+ib7h@Uz$7Be{% zGcxuBbXCmwJ}YMICVzWyT%c7v?2+&M$eFqL^J`lme%@D)4Q>d=Y*hQLjcj9M*~ZS^ zHZky7@45i3Hp?cq^RH}L$e1r|S{}x1*ThU+YxJufYgH3uYz@d{vv`Uto7DhJ0*wyw zX#Ka|>bNp<Jgpq^N+-KYCmZOTSBE;%T0flcHrDi3J<waI94=-}?6(Abk<a268$OB! zAKx0d<K<Y}8nAyX=X@$TbhdWPTbJ_3Cj6dd+XD7!2M%^q-_Vd*I5A^%Y}gdE=S^(U zm;d&QPv6rnXH5)d`FV2oR`XLFt3K%?i%)DY7vI|F<3g~SUVQY{y-D7cfn19<U-ks# zE(L68eMYBN76UY5MsLN;o>&zf-u_M^b2U4+gyz25$%e9z-$&YB`Cy|n=^17$mb2<s zEX1bbxjADtR;<j$zxL0}Sgh!&^E7s5)c9(;+0@n!o6WVVAu+OkY_P6bui9dRy}f}k zyN;AS?&~potgmLzSS_&)DmTVg24X!{=aq-*)s4HLdi5<o{W%wRIdvC`(=kECq_yF} zS)a!Sxv%`wSN7=FqFeqn^~64LxFyhxpEDhO?jArRK5{U2=d!8p3}+l|oh|egCwGUj zx?O74@5q?{YOTI|5);pOI^7}o#vl*7gN?!ZU{*{#pY4~fvZM5QccrIvwLKlJE#iTn zjeXzR(&mJIGV7ih>)U50`icqK(*yQ9_v}$i*1;LC^{Owm2l9FSFkUH#d?Jeta<eIr zr~QFuOuw4BEYQUI^6BW{nLlnA9~gQuV?)(!$y5{c?Fr<UzF9G@SXVEG;<_<l4}NIv zKx=Ovy~SVp@rtdy@~`h(-M!8WL;r2T_CW3`7sld19{F-I39Qw*VTb&n5ug59%MLcm z&tf1~uMNneM_lZaqaId@H5&5plz+Q3-W;@hmFJe0UUbfR#i!&{yzRHOkKboNasAq$ z>g2kN<!Lz(Gy58!&Yq4A#zf4-gl%eu-lc#I^Z47^ioSfcUOx7|h=2Ks&YU0oFaFj? zH1hwCgNp*^WfEvN1XT-i4t(4?j8{6B<djZ1Whc;QZqJxa=2c&6L6Z|e*WNE=XnKBZ z3-DGhj?Q?@=4-Of{<YZ52YDl3-q-@-$xe3jq2}dF&&O7AJ2_wjzu1nS9QO?!YKpAN zS@rhBU}J!05@>3V?4I8mIo0?4=B*8r%(arI9{$NN@8gM%FYb9wJjolYbFtz>!8<ei zH9X=af6k$}&`+O62OG80AqT~`*p2VVoQzuoa@GY^6V}ISVxIR~xnw_ED!=8=Bx~Aa z`v3R#$5QLhzRcy2zieym$#i-j@QvRWSV%KIXFB>^3}(eyjM!*jO{!Zpun>qFo5^Q` z`KEwPzE_|J?J+@nFIhKt?~z$GTmIL)@@SpUcq;alZ?cTr^}U&+w_fq6{FBYrvjX{B z7rZw=Z^2Jb>E=T_r(2AV4N4|{&0fX$k<*ofzF#zq#nAqdjIsK;bC6%L;Ip&IMt%F- z8>8jlLa-r_Cw=)Z=TP&?g|#-mnNIU8$IlNE$`yZyccnc1*kR^D4#`yu;%vMW@XuTi z^1dYyFTUcl&&PRki(jM1^Bcdl#h|~ND|YtO2Z*tF%S+iozdFJ%f8waM^Ofpt%qITK zvWf07o7&jSV-p+uv&WCB4db#~oHX>}uGM=UKgANgcOki34&<xo<!d#1a@^JU#kxMn zkX5zu^kM8gIv>s>J$nMrl%>FW<y0JMT<?|-&YI^U9dcQD?R$R8!^VL9<QA-N8P@3+ zAHMD!#_Y4sK6bHBJ+Y76R=;(1)%UaX7eC+J6L{Ix_pR-%z34p0-xl=WQ<7=#?IU~c zdO5Bfp{*S4%~;)w!S%yf4EQ7lW6vG=uH1-KjoUnlYsGxb?|SEI`&oX|p;exY*~kwz z%D+6(H<l;%ie2BYB~Q)?8Erqy-pbRrhkjO`-Z8Q#Pa1zJmg=N(SLbv+qBQxmCRZ)I zlgX*(UL#{ipvKY5`M#j?W8CvNx5XouTIIRTxtQJ`_R=Tc6_fT3;#1vK#(dfpX#O1) zHkn)h&CKPw_J1*Rb;EaS<h(yWXBC5%?%i4Am-;^|APcSE+h9|zS$}fY7VLHFFUxw- zW$UPK@8<6rk@ZViL(9IZS$4|7jl<7_YhCaBlnyk%*XcN+`#p$l-TZOg{Oh~<H+S=& z%$%Qf=dq#mi_gb~eQ~qrytMm&k^L+ky1RYmK<B-^=+yV$4RrQS2=sidSp04CcPc86 zpU7I#s@0Omt{d}v6zLAha&~K9+&-9neH%}F7v*;u*u&qVxBhimuX(0Ny(e=$JI@Hp zrtgbQ#}DfpoApbwuHIT1Khw$l^+6_C>g-dQlkfY%I(N=u<w9QU+tZ&g^k~eB&KN58 zClB*ehhFULdtcF?KJ*)he$&uz8TxHQzkTR;4n5!SpF8yD5B<Z2-t)@-!-xLjp?}2C zKWgYN8~V$Kerf34{qC*Jfkyw<K)kfS?|y&cgEM}A;yXg?{pT)BY2x>F!S4s|?;8Vm zs64(RsC#KSV==a`Zs=D-{IRA^@Vqj>qmJaU=<JI%o9$^|DBXNvYx%;ieSv%EnSt|M zG>aLt)4tlO{qkF^@R9X<fmS|yhkI*KvR2af^w6nIwBp<9RW}R4m~OVVy4^wIetp0W zac93evHnMSCiK2!d1@znZwT0MQShC?B=}6AMm`m^vi!SV?fk>T^QLtDP&dD`n?Gyd zS6A)Xc2`^))N`Fr;_S?PSD=2sW8LST+59>!@T?;1Re>7hr@hky{NnWKfX#OX&h+j; z!?!<pM&Pb^{xHU?Ue(B^K<n3H%Axm@TQc4lkh?9Qmksoh%};YS^m6FAW7t=pC4*mh z@UFC9_M_8!`D&r~dppIt-N#EWJB<0^j@%rueNSL-X_%uSV=*Yb56M`}*xu`tW6ip_ zw0Dj5k|FNmC^l8kJ2KuGuou+k`vP|Hy}({Jka1SP4nFxe>X*}(O($ebhrM35z1Ifn zi4E>?vA7{1PYiAhJ{{06&+Jr>nz?#(w%YiT%RccbyRF?8IRD^2zBX7FYz`)YMt+|! z@jN3S1HI>;`gcF@UtUfO76LKZ7?44C)dZbogSCWd`Zu-6TFDmisJMwq#ifm#HFk@E z#-=uIcV#Z7?A6Sl9mt7xAP~n>0_XqKKvVP24Dea!qlW*Ipyj_jbN-^^yGHJLf!vmj z;>S+0sMyq5#Mk<o>7m-f|BH#4zG~95ft+nY%S(RgXyeq@mzu$=PAXP)PSjoTmyNx> zXNE>@JXdDPsd$N_wptuYhuRR6(lKUByI(OQUwp}dvjXw5_MynMU$IknYElg8QRCX3 zfm*V!nX3)8Eq?C|Jip|65@>4c`N3-fymXqgtL9~+J=hcM3+P`OdglNg-?jwo731O+ z2f#<yb%A~F3&tA)^6a@&jtkiQ-9gFDaC%<#R|Hi<?71~4UiCzmT5z5=1!n}}YR^50 zM-18TjFb-ZjRE^hM#(4dv4Oa(3(B{Z;zIwHfV?&y#Y68Cf{npqP&RMN7*DU`>$3K~ zKo0p+wi$~F{x%Nuh*KK}{*$dv@bjPFa-;6aF1yIv7>JujR>h#TPdvar6#vGI`BgS- z$r#^4P`=^oYXiOYwqEe?r((blxHTxBt8Tt0Yn9Usr#6tsA3ozT9*Y_K#Iuc=S|MAH zU+k6w@lw0hm*0Kd$g8-CW%<q@jm*}by8F=X4O)AuF2#rqPY$&9zAIgP?sf55jxP%| z_PhJV*E@$s?#;oA0(M;;Xx1z4Y_8Zl!~Xq{<@D{D#*3%&b85HW%X)S8oqx9Ua@fGm z%JKJRTsam;b*9m$Mm7h0bN1<R{@ARh<WXPsj;C@bHX8%6*YMI!2Rid>g6#pC<$#}J zu3Z`QF{_%jUcBVByyRKa*je)(8Sf12!CiqS4jNkZQ8lxWvAgqKLB%J->1WJ!>B(RR zU#<=4QB$R7ea29FoP$=c=cau!=)NtWUyjv*_|Q}Q;)!0pRvhr4!&CWY^Y;b4&GLpH zeGB%tIop!Ce9%|E@T;|*4c5xG4a0oQm)5TD4_$8;o5<ojwD!o&nE~6iJ;A=9r?Zca zENvED$t$`8q2-tP-oUwFi^fiQ;2Xax#&or3s^t+gx!D{Tvy;8zb!kv~)r#@1K>K9Q zJUun<|J{jS>h{00oA2%BS9bG9b@L0l`C>Q!aQA(W?{LL{ed4vZ+kaB#e60Pg-Ts3! z7mM0opSiog=D$9Chi9(6zngzYH~05=+jw1&dBt08ld~@P!F<nWy`C%jveW*7?7PD} zyNkxYF*$m6j?GUR)=wFFpUKcYWau9{^zKdTi$kwA%(o7`x>Xz2G~Y*%d2#Rqf%-b* z(Vshu;tx-q_Fp!=gYljo><lgnLO%UFQrD+{Uhv}JjluT@KOTG__|;%JsC$ddr2zjA z2J%(U?hL2%-RZXl?uVBChlc%m>EFFZ`X62+{g14X{zunH|6^;U7xQ`Ixo4oOJiI4! z_1MPMTpl(B?)skyS{ivN8o4?)uy#ejhLZi08Ml0y9^xz6|Fol-CA(z)ROsjNv*>?% zjr9L)jr8xGgFYmmcb1&tEy3A=^WYutF~O69I#Vyr*t^1A!M6m<fwLq=8Xw&~a<v%L zdt#lpERE9OUybJIIcV0+L9>1i8fSeqd(_x!G@iXJjaolG5GQ@b$#@bh1nBvpsb72T z8BuF3pL)JL@NB@#KW!`*a?{!~Mnm6fG;COnhFwLooU!w)CieZ`^;P5GEVi*y4`SG^ z_wg*6cD<#Si=t`QTl$u!Uw8i4@PF68IO8C9?ol~fZ5)z&-T#|2cURvKygc}}z_apW z!M_dGMerHHjlnB}w*?;vc4bfd%kEwJ&%3#wk+tuxzms|Y*&yPkZ7KiXK0}PJ4BSig zJa-?uU(o6c>>=m<k#DW${yp(tpSxK*68hfK>Dzxl>w8|O?-}>AzDqlOK1<!7@jSWH zcf$Rw@6-8g*4E2kWPX48=d)(3@8|Akec#>b`^PKjbGGj5`FmNX@0Jzxt@e(y+WGfc z75q$RF?d+uU4E@ToH+2fGd$}q8hq&2&z!M->Wp>&R!?6`K7VUR;_mqm`5vIHr9aEO z*LNiEx?kz^eeekDt2_Ihot|&&=5Orgcic~QEO&bRn?-HBpU};(m|@3`<a=jO&pGeV z#|Q0q8hn3l@IApF1P==F<Ab|`Ukd&{xG=@}=HRD--wz(JE`(_%=j4pl*Gjl9Jj=mD zgI&SJ!Bv6J*6#~^{&RjNf#$tnIq+WL^F_><)^2aV?{QYr>-(X_U~3>AX9wp8_{j9V z&n2;=<g=kZ?`+Dr{XFUOSIc)w_}ckmHy5jR|IfPlf9U3alX=<E`^iVLX8AggpI*jG z{+OTk#Jl(NlbxOawwu4Ro4>o8tD80sKbv{kG3Mt=zRu(4ha350er9{r&+qT-d`~xD z?&dG-<}dH&ug`onKWF(mkDtzD$shAG=^pj-rq0fnbn_kE{9)bvQQiEi%*&2h`K-F_ zYj_?%uWjUy`RRTbtJ`xsJ1_3$|1n0lb@_MQd|gNXrHvh{`Pt`n9zRcQ<d6Az%nU#O zrnB2Gue5%>ubcm3H~;l+{@a=7f1~$p<+1N8uk-l%$Bq0kKkIw0{vP_-&dy)!=CA7J zZ|LUV+|A#SdH%O1KP#{E`1u2k{4qc4ySm=b*LQZlsheNk&9CX^*LCw}W}g3j-gkQS z{O)r(Hn03{j+`@tUBS75^_1=OIr_LLF>XIAJ12g|<NL!+K|h~lZ6R=e^{u?)20u#v z1H1V{y7|`3^S_y&+1KjtDUs#9_R+zW!D9pVxmUe6oIdEUxpyaHpD*|<4q~|!$iH!Y zmsRnw?tNr2Fs4V0@a`MN_Kdv)8vA@8R{Hi`rClfE@}Rz>^?9YW{hxO84|Vfj?dJb7 z^9KZcA-iJf=W+9b|1E9F<9F+acP?w&182iK;`@WKcf^v>+C<O15EFSWdUG=6_tv1D zFAsZ_&)#M>l+8!VF5jE7t+nGR-TYDA{Hn}L|5$9<eSg?_MrX$*-JB1tAMVh0?p|5R zZuMVwtBIcp#%jWzpS{l7```+D&cQ6cpIu?^=T_MJ`4#qlVTHY4Tw(8@udw$^EA0L9 zjJ+&R&$JudeXDM?s`ct0mNlQH*4s?0_3HcmgZIR#({u0p61?XGj|?6gJS%uv@aEwA z0(oQqM}m(Bza9KZ@K?d#1fLDor%2qjUlq9X&j}tLEN4%BWH@bQle=~?aIa`+_^8c8 z<1Ti#(dt`ybXmI~5R+|z_cZNr`RW<qIpVC6qc6R3!xug{6Lh;LHwE@;t?XIInl`W8 zb)hX8M^Y|(?hm=*eSgU1`&#6V)zWd1F{|F31+muTSnlL_o^`dM?(nrWX*>z!oZgbZ z6202GJg9et;u-UYjkElzGscFNW+mUy($o7;??iq-jD6a+;F#%X{M@2z_42u5TDCc_ zElq1%(KuHv%~%{laxa?7L;1oVcVXGwe;4OoJSJXyFFPqXHE=&}4m<~U1?L82JUn<r z;LMYMRd8+alz=~CwKZ6`hI#p_zRTCcm9<vg^U}w(Lw8@*gSd{>#A>#W#s2}hLB-5D zSNmkNv1rG2-_}|$@Acu85AoFQJlIWTliTyp($&gEQ*~5#d(~^{V>>!^QD^g*jJ;?3 z4B~s#R%WKt^F(g@Y~GmpmBB5+yMo^fPKn^B1wJSLVepU~jLU<s4Q>uz7yMkXK0(|W zJTZ7)aC`9f;8%jr1b-E1?AsSi0!=L0svWfD%Z~cp(0bq1uNCAh1?~YoAHkivDWHGs zoXU+hng0JlyVQeLcKzgFmwv4v=Wy*x*gwxMYy2ob#fzV(2kLK@ujPw<z*pmWd%F1| zmhP_AVvA-H96j{urg>+l8s&o;{XfyCl)}`vbTfT&rucY8z-M`LF2(SHfi;jj>zf0y zMK7mqp2?{kdPWrFvBvZCa#1-vF=Ms9S{~U7=-F{;uztWKz2-d2cc0h)9WmhdTH<gd zW8e;(1lkum25X7Kk&J=o&_n>zz8GRKZyb(f433NM69Gv3Vu`^#aX6AOScvZv0Z1E* zf%Uq>yi=?M=XusXIqoobk$x@DdiUKV(AZed`oodsuAT&1FU#HSZZA8@U+tdd^CaMp zUL%(tjg0#u7yl&CTDg^zmnJ8xfsJD{WU`IzeCE67nCF^xe6?QhT<odwjT!$|;5~YM z&^|}Z$y+Uco=*#b=g{Q=o=Kqbmp-lhy*U2P1Ge{c<kWMz{F>!&eP)Tedwmzho>_aV z#iQptocPGiB+$m<^PjUmFT|*&C9`T@zm_vf)+Er_RcEyF_OYz31>_ZdhKFrez0Z=- z+9i)_Tn@@-Ypd03`T4-mP6CbG)y_NFz8i4A7j4C6f7aFtcHq&<{<Y@pLE)Vckk-bg z>{8D_SB>ZG!*a+jXH1;MyWXYE=c#}BtGmJXE|WlGulm%=Ub!o<xyJMK<WwBldAN1) z;P6fYZQi=5@1m<V+Iw_I<m?QNCNPb!X6EE;>{e6k787&+8=oI+3i^F}Ck6|_N;F01 zJhx}5o&l4rlcU$zq}H`BlwI!ZNib&DSUl@{y;H(-dayP4n&7(N8NqUJb8vg`4Z$73 zf#BPMpAJ44XjRkgS@({q9nPK{S8Z?3_;8>O$f;bgL%roc@w{hK`mwr@^A`k@Kuq+S z-10|#svF+}Xout5|4Dr9xpIF&`8>&3OzLhI7i|_#oprga*jF#^@<g^?9Tn=VPO?Ua zzRwLgTG_UiI&9Cy(UF0dt@$&FE7pnnngqQqK3}#nGo9MS$Es<(e!s$d-@f3RgZBrY z4E)S+S8#3M_i2ufQGU<uiGknS)A&mUJM+(=PVFRT5@_24c4(#Z_2I>%Un|I|yy*Gj zP86%%!RDaPB^qe&%S@-XRldr$>thqJug3HCWZoCs65^vKgrtdEZ=2sKEU>S}^Ymoi z7u%wGMcYmYK@0Y^^OeT;)wXr3*!Hgz*dFZb*T&}e)wcDk*!BytZ4B%iTW{Cyt8K@u zV%yte+bpne)}D3kzSLX)-B^DXUKAZGfqk>~@2hQ|H4{S8#?I;0v28W5Z;Xb__POOb zVqWj;?zy_h+B?l>g5L^!58ynU8hAG_uICn6tKE?g49z5182WTmAL-TVp8SgVI1l*Q z(~;xz2>ba)wp!t%bv)MH>(<%be{OGMFl%pCOxCX;k1dBIkL{kLi-Dg>Zwl1xLjr5Y zR|e(tzF}<7n2*MCg+|YRJ>K4?)$&-j;1|#8FVEQLh)JNS-;<`J&*k<Vna>NdTUw&z zta8eiwLG8sItetknQK*dFV1)^U|-Rbb6;%Z%Y=}$G25=m`dYz0JlcJ+O}r<Bq>b6O zCF_R+_G$OUHnlw=B&}>aHRJm1;`5#}ISD+I%=O~!EIC8!nf>VMee$A=e<g6vosU)y zx_RWVqv*zTv7_FhACNJ6v3CEM<CzR&>tnXg;t%;;{66bdJX#;cVV2D&XHWdZZCkJ| zXzeJOY=&LI(Sg6MKaY;efx1BNnW(o;9=)3ac`+y398Kj|j>`T%x69cp8%wSp&t&L} zx2+Abi;w^G^V@UH{W`CVkWOn=jx{=ppN>gTHO6PUN_N@R`&9dQD+YSJ#nbviZskn= z;NU%Y@OMMW+ZpijvBCAhOM*8CKN$Q%@VmjE1%Dm<LvVZ?Iz2cyctmhj@RZ<<!M6nO z3f>cZFpx93gKYtO*sv71mp$_eyE9fp{Q0%ikaKRl5<UCn3Ln}2Zg$JJCu`)>w;@2M zy(4sD=3bH4g3q7}fw+^$Zu(m}bo$P9E&Nx8o*h>N?nCnG-9#M7^bD<7u;;{pj=pCj z9yYR-95&9Q!}pr^w+{El{jKAa`&oy&fcE`K9>l$Rc~Bqn;O>&wm1<S(spr4Ue<$A7 zsM@Tv;F&;H#cy}U<gX9ZZ(ob*1K2qUoHuqr%S--hy!Kb(RlDrk6OgB7>rON8&l3H7 zc8<Pl@R@J)w6a<s_yKsyHzot$O9vU`k+Bq1+}e1d7w4y}5a%)ahj;Y+L`P3+<0Nx! zrC611?pj%q7teipB$vFR(W@h8zI^8c+I6uB?Y`i|z<C$vHn-+$mHWy3x9juBy)d$W zHSnG!){{W<-nA}}M|-~(h}9%uBU(PSG2)ZFyf?blf8|j;R?6es270`7R@^Fw`l>ZF zukPr{AIoFan(utK1bD@yo|o%0rcVy*XA7P+n*zSj`G|o0#|KXdo*Bs1?ZGR9JA=0b zZx6_mtAhK(+LobrzK;}*ynQ$r%iEFC@&9Kz>S9lzzST_CxxTNbBNeB5Cv`76J9@JF z_da!Ozv?)zVTayl=iznNj_I;q@8TIAdKX{GhA}z+m;T^gBS&9s@u`}Tqq_SZklRyT zd*|8`oF7~oToXJkcy93G;Ev$U!H)(%6Z~rMv4E_)^YnE-th@8*SqeM@+{x`(s(W3m zK0dtL8_&!0-oxPW_lMi((>%6)<6-dJbQnBOJPe+P9|q6q9nYS`e6{=>)A3vp9?xC8 zaw?AQN^lR6w>XTgd9GT+bK)@8tC7C1x^O4`?(p8WmRkDIz_XTG`rd}e^YtUa*z?ui zznHOC=S%$p{$CIHJP8(pIxF4}{M>d+dS}I6@w?MO9K}E!E3W9gmv0X2dmc;zGR*m0 zwASkRQF_SJTG__ptG}=E>DS7ZssXl4g0hp{>@55ER5p@Pu|S8%ds_XsMe1#PU{7pY zh^wD7?@CY3C!4w@XHU@AYg>Q(Hy`UucEyVhar1Wx*@K4;XF;vkJAb{4>c?c@t2;)1 z%J;So+Wa_6Y!E-+Cz=~uqqnUO@@h{!CIK7Kil5$G9<~hQSvIf}z5P}v+ghFUlukM( zLFp`A>>ks1bk>2M-e;dV?hk+YrH$#d*6KAc-;PAA#Y!W$kFPa4^!GK!^y~<B1}oJS z-zvsO+E;a>&GNN;R9k4)T1Rax=_(l|Pc2sN)Zrv(>v7f{)W)mN5qbDZ$69S}&zdoN z+!N%scb+@tdjjqCfzP8`P15c>*d4mJ#If!)cTfxW&)??0svPXfoKGJf?lARcK93B% zZ2ta+H`7D+9~=15_O0BqvHCIF(EE4kwhyx8Vo%^qiiy7B@$ig~4k{k*H1upJ(B=Mb zd(UL^vA(xS-1y9QGS3=p^9(9oW3td%AM0BkC0ic;$M8<V$C6DCzwOt%1i5nD_Pvko zyw%s%GoR@C`9Uupdg){L>jQO%-+IMa{cCJu0~u{!>tp>&wxEAi6N5}gV>oY3Rcz5; zJ;>#k#^#D^*)P`osJ_<6`jz~k<Agz<ob3p924V<mim!Dh-M^ayeAd|8K41A!d+wV_ z;NC#HmS;MdCEr=0lO6oCZd|sQtCiBrhDlI*+0pCYGVJ3kpPf%A9rj8`$vzVPlB=<) z<hHuXKmC!=SI?eVF>UQQQgM}oifh%<{|;a2)%YZ)dTVWsuJt+C$FI*7`Q;nhNl>*n ztLD+oiqCzu7k|m7hb?2z?Mc?(5ooUu+@H>cR`(}9{(^A}_sW0EGe(S^nOy<h9~+)K zYIj~<`N5C=2OIuO58Zw4JN2nYH>)4B3;inxxn!uxJpsGjt@?_A&&KY7iUHfu%W+{X zcW)abu~HL!Wye<!Ho1FC2ife=m%n3u?`O%bShDr#LB4UxpY@!U+t#mowzT~$o&2HW zqr<ZV4}D^5{q=$R@*SM@imjhbY2_bUHmIFh{Yp0A`$ygLvyJ0g>ZXq;8=pGJHrA?s z%qwU0u2#N`^(*;6))|8yGV3gh8ytN1-Y|_BU1tO@3HCSr<1>DG@Z4ZI*dC~9{B7N{ zO}#7z#`3m1*c52yzI$iGdBL{886T6wE?Ve0DL_;CZ{_-)>Z3s~yVc2t(v{(%IJ42a zU)f03$A-1m&XQHMWXXMRw^)l|$z!{iZw;K&@}crubk<AX*#rIhfxeAzFTdpr`Mvb? zeC+7`#lxr4T{)TM+dMMPjl7D_JhgUf=zZs2ebw5tvUVhD?FS-9+$#Tl&ctLbwf6sn zzG|&xSAAGtORar8^cDYJ*8NdyVo-J1*GF5oN3yQUud0bY{&f~ss!cN7#U*2&x*EH~ zZj6j0b%(Wn9f>>aU&gj0Rad_eSx2g_oI&S)F;FA!iq`jIGnZ3$bLFzm!2cI(ZBP6Z z5B}=+1@&xq4~T(1_3D`^r|whm-9<egy&w53if0mN*9Y4JG4)x|nRrFuU5C8&0Y2}P zzZuYL?aY8)?X5w3KCG=~BR}XoF<>Vh^pDv_A0JxVjIHxWo$#5BzZJALlCAYNsvk1g z;hl~@YNz}-I%BY3@gS>e)4F${Edk!DNxClyZVWyhh|!(F*1+G7)yyY>_^u1oxaSd@ z>P{r{xS-#sQ_RGv@~(IGptY%$&&PRrDhBMSIF)^CiI;eap_n+sivfA&a@EJ^nOS4= zav+}twu`fT%fa5D_R22vp6;})v7xOS^IBJLY|_+MYY(}9n$I3$`{qD>;(buShp!E; z3pCI2`W{%0f!rF8^=A+J7dLcQWXv`?)qyyPx4emC`MNvft$}#7_MD$Ne*VtOk6z5z zLN5nvp;yOip?8+}UiEFvr=?+?y)|Y_jp?beT-DuzU##2}TLS##?Fe=T@(Fm|d+UNz zf~O60wRJ`y7xvW6jlrh_d*<r-Uj^!DV?f{D0MFII_CO9xCppW(Wr4OYSj(7CK0D~0 zdHs38u7K>14z)`^8`W>cLoc>^cShTzb&km6Q^`LoV=*FcXJm^zh@)DxUcOo9tF>1I zVk#fjO5S3|?4+NJI|EIewVI!ru^MF)IpVq;IDhhqUTulRZwI#oX9umX>=C2w!N!0L z{Oo(~Fy4?}E4{5AcFU!+R(|ngcW`5%4#e}WKn}JA+JV5cKwjD0-qHNp9N^m%h{4j( zqniX8KjdVdUL4#*XpO~eOTahvtnClfygHRnw(0S(VV=HfM}J39{N}CBlZHL_<GKN7 zrhjBmIju8Bw;cXXP&pI_@>6cp@95N{m@NnM*jfIx_Tn3}^Zt;@pWnS7Y@PR<?fzfv z-3z#$S6L@~+MPB#mJxwAEn=I!lcqVA()2_@nm6pE&_XGcrj)j%;7*&JHnd0qX-k`y zga(JAP!$nWMlGJ08E~{ZqcY%(<9NFG6hUOh`9u)K165H0^}~Gs-<#(StB>!yvy&F4 z&NZvozw3M-{`bAs^St|%=$;P5N50C<HedIo|CGQvQi_|ouI+pnJ5*gftJ{3gckbNh z@=*VTz<HFDWFJZ0>af4fIcK!^;kUT*eNo^{xT{wLa$s}7rkSqZm|C%(Ts2$Oo-OKn zHr4Z`){)O2>+$J)@tGcZTsE1nJ7m<|C`Mvt9hA&*we#+7$FuW>i**6JKA3YOcI+1C zZ9)I8VxLlX)pOFG2*||OX<eOac)zVpT|9}y??wk1&NyyhS%BlJwYLX+I8-jpH&36K zmYj+^{YwL}H-C8`K5gF~cg`7s=ZHI%pCyyOTLb&Z*cF@}h*8T!D?{5E|J{Imx%6=B z)+c9${Er9h5ySqSxFKWiRQ`CT$h(R&d&ItKJn2`?$}jy<xouod7e8{^*^$%aiBsh? zdGqBoyDO)y#nD3RQD*>0>{}nK3)u5Z$-|O+clu)dw15v46aLp6{mR}0)iCa}X^ZvB z0H5+;PoT&prS{8nvH88A-IMO{KA~$a7z7G=<cgotm-C5?jgzx8bAv!><=}=NbcqM~ zWbi{COb2){ugD>M3<B>18v|u^z*oiC(yrF8xxUQeuY8<O9yxto<W-KbvyF{-DaF0` z;`)CCe7H8Ke5`wxUt&Too8_Z26Oi5NpGe=j;)r~?eOhp+xiwj{HozCS_v&XS>3?QG zcG+OfOuz<f$p?J#pPicnwuluON^39Q`2Rlx@h#qpgHtnR&16vW`aYYlxrONZ{j5Kf zE;jwI0Dt3b;?JQtV?Uloakekx?3R;#``ug0&S0RCLIz*i_WuTl@_|fy#H5W?>6MEo z1Y+aaK<*y|wMYMxf%7+x19rB0wx=)OE(*vdi|$9;c*RXF%?6c|a}T5K{=+Gm>jJ#^ zI!le?vBp2zjJx-0{8yWC&+Quj#b%t28h?K??j5Pd@6ULBUXoum{*H{>PiNKMuciVq zwhrXk#ogMnUp;Q^=kq;Lep^$zK9jNI(r^9yM8-;<=MEdxCAW0HFYC;?2kr@8A3Qro zO?G4M8)MJP*#Ay!i2kxen=L0dHho89qxp}fU+W$TyGz%XbI9FSWWFcuLSM&R=8S#0 zv8&dcnuA*Hs=q%;Ty6h$VYSue$M<EN{`aP~zI3atYh{#vbvyp2*}EirHwW!_+rA=m z;(vS~H`Max!Q|=k)bekptDR^4I@fY6+YfwgB$wTewA}&ZxTmTn&v{wVjLG5Mf&HWO zIoI}k?v0vfhqL7!W;$@kSnnL@yMOB)tlk04+h=|d@Y^|J%OIeu^)2)r{JKx59j+s5 zbwHMVWNiw_Y4>`LT^{^OVl^MX)_mX)YbpliW9jANl0exR41(4NvfK9q{<JpY-kKj+ zp#B@Owrmg|zO#Yv3fXKmcPLIh<JeQ{<V$NCzS;KL*fyKmy-gq9Pwx85yM8~{`nfyG zX7{*!y*8+vp}%Y@yIMZwlX-TrL#g+L)oHVb|C<B*XS%v%@u}}4ndR#<#>4@iqhzyz zedM1VjPqN3a93x7K6%V{GUSl?LDwd)Y#!%7n-sFix;h|>|72|njt^RYy$|8;s4;%_ z?I+8A@oD88ojy5#8Am2l!@A(8;8XcSt>sgV{c1P1H1p=vqxj;-Y#=xIKtImhGs;Y0 zY>!Tgbw1P6vo$DNjM;N~Kn`1R%<jr#W1(R<R{7WFmpT5lbH(3Jb$%b8dH$%+4*LAf zb@O7$4!+cVabwzppp7q^+WUe%qj-N?^v`Cld||^^^GrtkFdz9b2wIz4&e)+G&Y2XG z*2lOud~T@maYY*9isSjXu3W`QE026~Hb;*8=8k}z{+%T!R|MqL{Ml*uV``57eB2$7 zKWd%x`EZ|)?r3rj#k)0f)jDVB_JE!G@@`YW-j<hoKK@f2Se7|H;aR)#w(hO!SH4xB z4)WDLqgIU%@3>O|J;wWd_jxUud?C|Wv9F#HrJEmv0Pp-e6gO|nn%RJ?;-hp`zvPJh z-2vUkl)VS4;n&=bO52(?=dVfM_=|`2SN^@X4e8S>_g*xd`^x>bFMamoTD>`tE9(Nf z#a*d)3T<-SMfTv}oZt@w@qTK+zv-qHgQ*Vgvestz7`?48?fk0D@oA=8Q}()7>%L_t zIqdjUz&<f<?fZ24t$kDJvs2x-&;CQ%#U^(0M|>)dl{0EQt_fBI{M!;(i(~VAQWw}` z-30-;urW~RVv~9zVB>}mH<|kQz+UyO!PbCGbJnwCZLlqPFgQE#_1@{g+FuL$a;)i} z3p&U$S6~0?`z;pEs={{uu!Y})VBCEz&v07n#IN<eeEz#E5?6k)S-WiL-x2lfX183a zn*IEk3UF$izN$z0UOM=KH+~);%m$@*SK8MGrFW3FJBLr@*Es+Ap_Cr$>8ZYRrqAxf z&8a2Xb3q`VCWDQEf<t3%PW`}93(JMFtL(%FJ<1KiAZUHPJpJ~4!rIo3r1CJQ@96Zq zvnw7|kBW=@s(V;$TA7tIbCHQ(>-eut=F$M4&c?aHA9elHQcnfAVYh!5(mpo1f5iFs zgBrUh?VE!OnsvL=|L%NlW}o|*EpT11Ghl=FBr@<+c5F-A8J!E*Snqt*uiUD>*iCn9 zeO-{=m@(X|k27{p1^6$&tFHB<xGf!(dtz+gj^Ns$Y$^WvcO<!9XR7qodBVw>U`2q( zh1{R=>ViP*ob8Q)GAh^kVH{uL{NZ3(@PArdaPer0i#(h!F5=O~<#p*#2J(1s@VsC) zXk*o$<^CC}e5(Aa_qXcH>FGf2xwboCL-j|Uq4s%E>*qT|mE-+0RJPO^lCwt=tGb8F zr#iC__Y8S1&lf9qfH=6P#7G-&?lipQ3LO6YP2I7d$rzj3J63;PaAkm>9|_1JXC|oe ziEdo1t?R#o{&B|asaW=(`BRw#=Yf2-kCM;!QS$#J<A)<(Y)8rW?lnsOXAe`pyl&;Y z`_2jew3Flhuh=;gza5Oy`)A$yh4Lo1M(O?YPL6XrN-tjJhqJ@ZzX<T@zGau(uV;(< zcp?y|h1w<F<kY^UUB90vpUe2J;M#!xL*<G6t-mF|^qrM?cJgCiAh&T;V|&tG9~|F| zxyJ?p8~NH_&u9Bf#yx4T4CuDrIQ`BIpXKyyV6N})gBe?B-e&3WYua^hIJZZ2aL3#l z&?i=6_?N-z!26qGpT2yf*K->un*w|*`sRIBRCWh%?B12`O`9z8+h@R28Ikhh00;2c zz!}rVA32uo49*U4vMN{{w6adlqW&K1{~|UlPtE3;t|n^`xGOdW3jdBBwhs7mb=s4i zeQfYMyksoI*14>k&(_apexbIKH3-Jpx+in&`prNQhpFHbfx`CsxplTrcaYyL&g=Et zxf{B<*Uz)2UEj99BYWQ7?EAsA-xn;@|8ukUuYy4^ii0O+T$r4Z?+^NNZ_k+Ac8-q@ zDxdl}?d&>><h3&F8J9=9GACyS!6@5G&V2jr1$p1k#oAvskCTI=zYYe$e0Cg44u71l z!;!=P(*pG<dnXSuKk9tSw?Xi5eR1E6lXG<DaDFIGZX6?n?1jp3kBP1IgP`vhS&H*{ zRKAMyjMRq%&y2%aZ>_R9aCh7tI3rIEoTZt-d&f(<T244GD+2e&Y;aZJ&J=Sp?2(6j zY@aFiT5l~s$-ghCb6a!9*92<=GU%2E^2+nz)_{%Vc}5w(Iv|s6rv}@CdOqz*`<sLQ z`W+d&AP|F!eeHi*#x4syYgYuGukx2acLt;Mdk&euIVgFxuP=8ZYf3JD`}z0T-m|KG z{*g(KJD|Vr>$|x@YQ<Wz*^4Jd{wbFSY{vJQfp{wBjkU7KseR&wi;7zte{rX$jl27n zzkC>Fvpt^==o@FJ*ePWjpXe9_t!;9PZOVN?<q?16(XR*cL|o<3)&T$Hi_!96TOfCK z1@h*$fL;CkDLK0{M?T;9PKI;PmuJi~*?SS*m3xAx2W$`zYm~jg=>gu1_jTKk13K*~ zotx9f%S?b5bCoNHvW*|V)4kigIc@Tv7bxa3HGJ>6H*NktGr+aD!J%w%&K6?JuB^Kt z7{@!EC9BRFp7;xF&5u6~KbPXA&ayQt0(od1TllysP_!$S0|O~?T%5%~t$%da7oR!< z=2r&Fo`8L|9#`h41Gdw{hQ95_4rTjX*0=*(yKz6tZhBk$`Z-j-l~2wwJEwyFId)F0 zQ)UA5c)(%Z$9;e6Zn-aOT07*Sd;4z!ehdPo*2vj5kNH=5^T&y+m|DXQwfRAS^NoSB zI-tLQ{;$axJDvZt1DupR=XENm^H27^;7HHwZ1&>Q`EJjv94MWwpK_AU@^wDjc4gh6 z&Pd7X=Nb8Jo=v4c>Wo-72;`AC^>eJa7PpH1(P>v6eN)<B%{-zD$8FxYr<Vpw<wwi0 zxEH^FbQrlLX7u4f-i+GI*S`%0K|dGq)8-;h+0mXIV{(wL=|It!J8e$7C+e=Sr}B7J z+RoNO^;p~LVPmUjPx_|^@>0=%Y2aC<^zAq+V`T%oDqoz%iC{-SUin0KaawCPWbCw{ z<;xoK#_{Exlpk`g^<iK7PYGHd2I;dw*&FZ)XKXZ1H+giHU3{QN!Nbac{|X)a@^wEl z#__Vao2S!$xumo@`+S_4d3=bK;;wV{?Qe6(K62<_J6l`1=^lJemruA}709>BnNeJm zg$thv$X32F*cLn(xMzwJIu(7qvR6@?BWrok_fro0cel$|Jc=cKI|BSxpDpD>#icK= zxS`Kn+1~CQ=L3HfJ`4iflTm!)zT)9NY5iii__NQR)-SP9*y67EyMPU1z|M*R8x{HC ztf}t^JcEx9t_iGhXWQd_U^*a|yyby;dy6Og*kk;*fGpqtpG{pHrg>0?IPj&l$=-2i za4K_bAP*lWbbVavyOY-iZ14;xr$6rZw2T$_QhWYG=E%ZD<<eBzwRU~lI6Nl!vAq2K zQt&sy^RrKW<H8-FuG|pAnj>c_;Da$J+1t`?^IYFNU&&<GAW$w3%xw>9u3|9An9@G4 zHm8q^nZSDf>1&fCmfFSFiD|P@j$IK{PO;VfV~!1YR>&J@q^u6)>q28nCV7f>d$;aQ ze=1<(Q33nP&kbqIAMsG=Wl!nVu00hCaWhtWrqfpR<-xX~VnEMtb@^~_+G2_a`tULc z6ne?s5qO8gg?FJ{ftWcruMBPqoF!+1EWS8z_?2tE9@@^8P0sKa0{x}IsR0|vR&Wh1 zFU~q0#RZ?|<AU!k7h>FUu`hkTv01q%czQ4h<R?DBbA)a=uj~y@5BMM+xG6i^n3yYn z*}>LYXS{FEsMxU0KDxdbw49J}a=<pZ#O6M4Y+n)Jb#p+T^P+x5R}WGvVouIE!IuI$ z+w*yK`o%rpl*$Y1_6$cJ^O&iw)@Qq1nF#2_C%eU5-dq-#TM-NbYc>W7d*p<9dTQUc zwB_?4Fg|L1f2_5eP4rZ(*tD!0qmR9Gx%YAK_g&xkRA7x#Ys#MDz%x#svYTw!9nkB1 zi`U`+hlk1?JWU71LCNXsE??M2PjRO`ZV!9+1=j}O7AX3+2dC?#I1_gU_vxgNRo{<# zaoX$x_wtFsj==eE^N^qXUJ>9B%I}(6l`;0z{q7!qO;Ga0;U9v2{y!;W_TpP%@5_Sg z19lbn^b|+#HFG#De$Deu-RHLAic{xJ*%RQ2Uh-Oh$*wq?FCRv&S&{ieabo|P;7Ipp z>(E~I)1~YU$n;z)`8fW^z`fn(OmRHfthJ`rRSfx3HjaufF68H^y<$kdLidk1&#0;N zaopy{y7Uz}=zM^4w@{2)KWdD;g^XL%+UHqO{n@l}e^ju&X{R|nZ@W@^7AW%f=HSUX zDYzK*vvTCi%aSbyrO(-Mzm+a?ikLqy5QFQ2vdMk_{{`Yt<{(h64&=z%;Fy3Mv6Dkj z2*k_z+7l>zu!bJxtpT5_e~eCw_1gpapqSqod^wPdivqT>#ky*fUAmmZR<^rBF@I&? zYY2)yK3iR{OP@Zv76&C?A8&2nzUtFg`s*C&kMiZ$Gfp1fYJYLgFJ&Ql{vQu4J>ooH zll?1uSl{c{{261$&uYfcOPgPl0l)Co=H0#N&o*=J;aX=O-`oCUdwqFb^Jy-KBk@(* zyTJ2nq418>Ups2d8fT@yR=-`pDSdb5<AN&!Il%YIr9NjHGuLwXj9#CtQSvHR`|{R} zS-&{r#ciu^S#Q1Eo($OQoU7-Wc8yiNA#<k&VrMUooMrRk?JUCCfwOI`+Fddc)S1Ft zd&cIoYd(ACv+JLtV^=U0%x722_b5I}$0$2S@v%Sp7Q)9@+kXTv#11h$Dr@I^CWvAC zOmLPfmN;&G@od29zY3fQc_AP1S8-4mcg~Ep>^M4tDrRB<?xe~idX;^_bAozD+nu(5 zJCUw?1GbXe=DxF{xI5$`u*;qu0UuWf&cODjZO)pSOLM4yOX{UMDfItBr@t@XnI(g+ zlF`~#cLok>eiVN=n+uA=QT$DGF`vx3as0KhdSTWn`-0~Lk0hV`Du1qP+PJ_;&82xn zeDbkmjN;RsQ}d(voXdQ1sUF4Wq6P4otq1w@j;$;tAJ-mO`jC8dugbrAmTJ!i<p=JJ zRX@!m;;x>(WRdClRWkLRv+6sS-sk4KADkt{KF?_J_1Vg~d0KE;V9koaSiM`SYaRK= zMvp%GoOv}_YXW>Z*FX<=ceZbF_W2r+J@RfcIMg0LtJvSe*CiRJ)7)tRyN!R{i1E^q zso@=HU)gkABj4S^mv()+!~2n~%1nTpHkbM8F5+wPvMz1opX%-#efmG1KK<4AZ`O)y zf1i8G-OwMe&tY^`e4dc@l0aQH=-bO~_2RDPpFaN8e0Co2fy?z>&8D0GbpQU>1^+4d z<>0M<wtxSB4}R#+_wWDu{D9kk4W5xNys!Ve{rlgRe-Q3>g6qB*<R8yGC;u?%PX@ml z9QTj=_umk_Be*-?82QEEkAoZYHEsVc8ylyCmj(|6a{*u2B)0OUV$$XodzS~|u{pr2 z__(9p@Adbp%zNJ9-x~5a1<L9GC-R33oR$o73WKzjb|1U#vmWn-jcL=>uEl@(U{1L^ zxFT?`DSHl7!&q6fGZ=JZ?Bu&~_74K3#<j~1KC(d>4F7*%9b5Z0v^*`z{L)}P9etk5 z=Rx)<gW>-V=v&ma`*xAvu49+GUmVzeYk-&9&qsTd%H3^gKNyJZo`CI>fucVZ*l%BP zr0vdEZwOWfbhn(y6F#*z^kq0Nt$s4!ojhjCy#Zh7CY$bRmu@*lzue|?s~`V|(l75@ z{rl2?Y9PmydxED2IPtXyb}4&<(*t%HXV=jI8;xm~jch0z-4*OQH+XEwpr7sbxO4wi z#>9<Hp9{p!9&=xxIr4F+)ET#)oOJ=ce)i88Zq^57kADm5ox#rsv)%l3YCc)-ye{wB z`krfScYpA||6H@iz1qsqCxgsB_jKaw)Zit7wR{`ik6oWG<9%IxeN%8%K!#@q9Wwzg z`OTinHSwd5JmYM%Zz90oeE}J@uY9zw_Skn@P%-GsqxW$U#$NIILbukqczwf&xih-C z$B&p>*3CU(#M}wp+!II4v6H^zdvjYeCI_|$eCOA7T^r}ucWrUvn>FHGej1<d#__fz zkmq=pD}z9hljOB$FQy!P4$6n6ftcPOm?Kx;9{rU89m-6wOCuAtN7o*@J<HYwV&~^= z*g4mMzs`ajW9wwVZZR@W2EM@E!#0J?vH_PTM7K5cUl^o&(B{k1J~pUx%QtH)_vpnT zUhGroZtod)!$)E}f8HFN7_d<>m#Kqypx8Snm9OGtecR`^vL`q%sP*()-|ssg=IV~x zkaqdMJ#Dt*w_>VoeZ`Et>409o7w`DwCmY0tJ#qsl3c2<wb${W&+Vue)biFtJ<Jg*$ z18c~d2s{&%eF3@TiP_R@CVw)R4aj8U6@hj3*1Yv6X1zQvpV%p;beTUX^Ue%;eEOb% ztkU<SMxXWH*z}9H3=MtSmHK%Bo8&_A^s2Pk#OG0aZpwIn&j${%hpzsfYv$P_eswnZ ziH~tM6;~C1d-n#oGv=&8<sAP{32Hst+Ow#?G9bqp#EUrT+b0K%k@=LMU5B%>$61)} z=IdP3-L6mf;CniqWVf7~e{mp}!Mo%MfqavL<lAS@>A{(SxSt<9vui&&O8H)M-_-T3 zx7P2VnI}X4l&(*%{<5w=-SwxsKK<sWyFQ!rmv{XWy8eo;&vx^tc76Wnuk89uy8dZh z|Cp}7s_Um3o&)=K26%SwDdJIm96B@hD-V~y)ln?>=x6VmUVm+`zpmF`-|L^=>p!K} zKcm<8`-ZLlGkg6Fz5ZFf{@K0$IqA#6;>)?5Zu-TaoR<@8gKQa=%5B`*WA96Y2ZFi4 z-Q~PK7`U_ChffcjWkvtlLHk^Jck^5!7n~hB<>iNa{U1wTxhL2Z{77KkF9*t=U@EvN zQ0QD2{Gv{Z=gY@BopQrH0d!WaePVF!0?^v}!mMxm?@r&HfERkT?+D!47j*qMrRFQ1 zwg<Q=4*BxBU^3{>x#O-3)(1O+rv|MavAQ%+oDXNl87$fQ;>X7?2Fn7ri$7cQ@%`Z6 zm0gnl&E5E-)Oflf@GNp3>2emuZmO$O4aeCq6|4;S(eiV4ug?cukjVz^;_G>7m!Iu? z-%q(M7f1QVK62yQ@ar$^XH)qmK77NCIWiXN+v2P(+skI0wl?=|#j7=RvQ6w;n~d}2 zNNf?O)d9I{0_T{2P-m8Z&XHpMY~U<eQ@*g-esZRRL7+I_n*)5$1Y)B7`k>x#<PsZ- zo4sk1O;+(j-$d7+N=-(eCw4lk)&V|F4RB|Ud_1*$ISZp=N8h`G;@#fj9RD{53zhTj zS&O$f1qyw$LCLGLwkKoj0_Shs{OOsK52NPsHq~L&Jm2wfZP1=&zU>a=d)ZVz8W&@} z?hMS&$Jz5UU%uKm&R4cN$FMypy)757%Q#<0&D(!vFg0eLt@HWn-YT7~ukwzsb#Kk* zt2^qE$PYXzxVki$3RVVuUlTZ!)<C`QTFXCU(}DBgJ@m9-QBeE%12w-qZTs}$?!Y-b zD<De_DyJT(hG*9qcCL;}<Z)Brf3+7<w|6=_m6?D&YW7szHl?k&7x18L4y>uQmCx<k zNeffjweFnKWB*1AQjE8I={X^|Iw<~dq7-KbcsTI43awunOayEh1PYtQz+QHge>l>H zL7)tV|39$DJ*X7d;#sh_+6$@4DW8k4@||4+3sTrhZ~5)Mbsj3u?1B1hlIGA3`N{7- zPX}y2Y53X09`C~Lgqwr62Ja1iHTX<$bPVyi;@n^+xGZ>i@b=(0f<Fqr96avm*cogJ zwg-0y?+RukgZ*g^3qN-SY&#`zkK$^1U`>sw`D~oO<kVcPH^%P`fm}T%P>xiGeGApm z=I%IuCK`FIKWr>L>dBz|yrr3I{gjX8XXW5m%Z3*nh7A{Htr%<x*vO_j%g&y=*SOf! z{o_uzr{%!fslYmMb*GoV_)!+3%Rc!cCeBEKPIk09-I-GXJ|794H$_hAQ-3XVKJRO& zb0KjQ*QsE>I67zIvoff7RIbl=2Rv)UdT|?f2b`NZ_g3ks`;m@Od)o6PH)@|+?mD9r z0UjzhN1es~UO746-YuDD5B+4%$Iqh7w|3D_w$hG!Uo`G4+}_L;&!OcZ>*Z^$9~BpJ zd=@GlB?te`d+|Z9^40dqGo^3Kk@)1<*q1ZTr}^S?bR&nniVNOe-psYUjmp6z)$!`X z&@n2{<=u26gAa$3^Um6N2|#h#?$6Y4T%H`Rjw9vcRh`cE{X$$vasJiJ)ll*fPL4_6 zIb+MHbJNCV+#Na5lUccz;h`>fM9XuVbEEFABjMOP<I~2(dmPWLZ{h&nVe#S4WXH~+ zjge=+GrBgwr6RZ7SCwOGcdQzxYJRH8QrDgAJwu;dwfjnqL$&y*ap-x0J2tKl=$B8Y zfB7rl<EH1dz`oW_9GI)G&-je)vpfC9-KARtpSP|F$mYYg;K6_&#f>@p$k0AMaNlU( z7LfCokxi$2k?pN5*6j&a2K>}7?%8g=c%GjL<9x31G>4ycXrz-Jidf-POx5&G1j>AK zK6@<AN_+V09m(f2zT#aj(7i5rYQV0i$1d{Ot^bT(|C@XLXZHI3hH|@qW3NAG`VoK7 zetY<=lux6^c4ppZ{mU#&;e-2dQ{);K3wLR8TCu^q=YzOZJnYT3VZZ;rf}djpYjAB( z<*G6AYD_*FJ30{0>7aD5L*ADi^nutoSM;jI<w)9mS{JnX%Gaq8<FgqnUdtx-f3>-x zqimdytI4b@yULG8Q_S2IK4+=jC;hhX=NaqQhZ`sBR|Lgb<@2ccRZiWV^;ZPWy0JZh zvN&*-pOr!K+B>I}XU|NqD|kxa?yP$;&4cHQ-_wElk|n+sH*(;>*FL`T?^v9evA({| z86$^Y_Y_|1ERs=Yx^$W^ozAB<wU?aQi@&u&`GCJsHsZ^gR!(1MUq<Ug-)HjhP5-q) zKYsnQM=#)NqQjEZbdqs;(3jEbx5nMwUz4GO&oKU6Xdq=euy%Lg8QGs3WLyyov9T7v z#e3yL@s_D!Jlb(Q^GTd){K~ZX?o2E0QnJ?t?oI#R<F3@6;l|lXhx>q!#_eH;8b9ul z?Opq<uHSN2GVodBeHnGG#>ItAobe99o|6uA59X!2n;tfkO&7bYt^72{zS0$O2V-Nd zKF{H1oE_pM*GixGh++Hp+~k3CqEvjXyEky2aY=_cHn=Cw4A`|euvaX6ug5b~*%y2y zC=U0hU4EXOHXrR*+fObTr9+&`_fhAs?^p3?ZSi<}+T`}vj^n_YQATk<X3IfeCQkTQ z`nRU-J+$^XGv@Kdf8%|bWSFbJchl$AnP|CQn!Zw8i}8-&pMp`k%vBu7E<5InL*Gwv z>HFz^uGo$9)BGr#YM+|y)_+{K^UiR^Mq7TY3gl3ojdA*GUM*KzJ!0XEtPSXcJprNC z>i2mtUe64%UJ;O8+^}tVfOC1(A1AYX88x>n^90uY;T+YT)`$E`!0>M);mRE_(OZX8 za90#p<tsVR_s#j>|H|NmK+zurxK_xl=PBL%w7$m6_dzoz&*od(?yt42t=T^0oZj^T zTljlhz6trm!7m5@5Zo6|{4NNat`3~Tij^_t34wc!EVjCL#nk+^pxv`LeP?evxI7RC zV|Az6<2h4%*p5S`eLmY$I(DTkUii2Fre6Q~O+U?p@BPQ8T{tQ20{;qAX%|jSyHNMT zg&AvgU*GFr*XwWT_1W9*e|FPPb7-sciI0LjDtO0*lRMxQ>>>L#K`VcIufMa`e_gMC zWv_p8(@%5wUNV<ju5J#V7F-%E4ps$=f;R8ONPHg%#MQofKUtQxds`lQ_RR!%CYKI* zwj`kAvOxY%b#<ztEPKSC+=~Lflh@jS1G!Ur*`#l8`EhO9UknuE?w49ua^-F-H{GGF z<sVs4Hqilh1kT7*pxh9M*DC|Qk%>2F2}k6u2$lpmvetRU37(1@vT;>0uy-oJlVa_~ zK|S|yLyuBA$Ql?(G0*3|kIvyS@kDGquiUvSgY|*CdSme1;F{nS!JWZ(20t9UFZjja z*8;MwRjQ^FuQgY-HT^k!jN8Y@adV#a{kaSsj6WXhjvA!Ro_762`ii)UZ-2e{QR~IV zTKmKh*Xq)xeL)~5(8{Pd9gYlff4DN_*~69LE?9^RTzZB~2inC8o{E>rv==Iij7<Sv z4|k7y=y3OVmW<ld=E)#y+}-Uu`J%WJ_@~(8{I=`l;cT!va4r;koCBry>`Z%LAjR7L zzBL(J8;}7v2J-UTf?a`l;qI1ztk(u?G3E~07Cac3p9^ja=#g*iYvV@VvVe{DyZg2V z;_QCd5$q58vOTxzE_BaKcWcDu+Q8k+c5-)jZT$1qIGgDClf1jI$$el>srzv%ZTHqh zpwu`&j9dRmarNp>K6$M__$+^lL!2nMn+nRVG>4z_*t<?ACBNc2{2F`p{d_P^s{iZh z<5nLp@953n+3Vlf>tB_A#hwhD+>!S}wz(TxT{mUC?LR$zdrS9J`o}f>f6Vt4+Vy|Y z>wl=%e_OAAd;0kEUf_(Y_36XWmdxY2^uIB`=j$D+`nUA@SErAwde2aoz2vRU{HQsc z?9YdXc0H~?lCk1W-qLMN*;=;X@jY2fm$~w3GHvVaRRi0tzopY>uKc;E(`SF_qTjxf z>5P<&Cue=j|40A+q5Th}Z*R$RhV13<dotI?_RemtHR}WZ!}%ZB?|2W-H(SMn%<`@5 zD^AKza;$S#s=a5Z-7RYG=j!RMUeVRg5F6<^qqEVvl4HMl@w_3w7ta5(H_gX<s<YP^ zKl$*|59asD^M_N7xf_%Z{qp|(9}AxJEBp7~8oVW#&G@;2pBo#b{!-w*>eE5X)#IX9 z|FJ>w`SUr*HCFLHF7s?}xnYC&!yBUWdxLl8kUtpw%x~=9|7!so?W_Fa$9G458|(M} z?L+$y{LMrA_xJkO^!mr9Psg%O7eDl$($!Dx>J43ePHJn|{lU*a^iFzzumA4!`D{J@ zza#xN&+q8<*QMY3_UXSqVB1vovgz!uK0h^?V*lZ+Y55+PmtsUldj|9?pDHg`b?er4 z^@XX$%CnU1AO3LSls~BYiQnG8|EE5(fB&N2*}s2dzTkTL?;iL&1J(k6;rRSP2502- zpdJ5-ZXD0;`1!wg;GD6IU;GsJ-JPGs<<I}sL%CYf>;F@}v0D4t@oQaQJlcDOU36X6 z)t7g*_Yvb)26T$ci#i#_v3WSHt8r$ny#0UT$8o8P?{<wnX9TtOd$ZP9<)AtJ4P8yQ zzT8t+tiHMHd#5yhNmti;`i=8heP&npWA1ae`RT59*7e;3>g&4N^StdFr<*;ByAFTy zb8|@7{*6F!pNWIg=6J5Q{q8dS$mcZy9<8Ns5O{C6KTz2C*nn@w=^<}<pwwFXttES9 z;B!YS+x$#G&bmO~-xATE>wve?actVB2IR<R#T=O@1+5S19-PBXe-5w3N8cv;`NJk9 z*V~XE=TcrN|2y}$_Ohk;ZDZ%W0)CxAe7ZZ@yU))(jN`V|Auc$nwYaZXAF1yAsg)zr z?GF5E>aLi7F7~xK;N7?F|5*CYfc5x!Yp?(MUVpCFzcPKfUHdOdzm<Pp`t9BM#Pr3$ znDeg|OKs!o>em|f85gg1UEM|QMR$k&in~MG-LWN3xjT*x;r(22FFSAi-W<?Vd8SW> zK6|u%##<lQ=j__&>^aYJmc8!t4S_od5AIp>zE0fgPj}>JTeg$SW;)Ib>?4DH@^m_& z%UST5Q9kpZoht(C*lXNgw#l^`_nt^b?X#A>_-$=uN6QPow*=njF3e<c@`d!b2J8i# zxL=&x7YCji_AV5Bx7L0(<CI=Lm;c5+TOJ750dm8dn>%Q~F;Mu12eM#Ops>|m&xfh5 zjhD*;1#fJb3+$^ovT%)a<7Eroj|=2ve=U2+GLC2KDlYvozAOo<ZtbNL&wWmIWo#<o z5B+RmcgePgzTE-)%f2)Z+F@_4FZ;y%*+>2J@ljmjxt~Mq6tB$z|7QYvjwCn4zjC8; zfvn>HrnK=>KJZy?yKj|RH*U?+tRe5t;EKS0WAY>v3=6&Pf(L`W!BkN4ackX%U}YeO zm3DvGARq9uKCs8yPv(AnNoqb;PPVyZTnxo#I=CtzTRg?dJ;DB4gR-AoYxttv7gUVQ z(dXXr&WM-Epv}F?L7Y10%3R<cnF@{xT08h9#&~LNkuUt*99YBN=VX9f_cUAhc3n{M zdtusm#IL>Ny7T&S?QP{=)X24u+}WTnm#_9dnmD<*v7K#fe<V10ZX@?_IjP){Q#ez^ zLLA#?7JE+!<Y!@H+KRsXs=hd$8pt2<RN6a%TzA?n!EM1if}aii4Xf?JF9c7B!Y2pU zQ=Gykxk;Y9nFti)rv!A#Tm3q#x2Mgo=LRPR?VLS)cix=|a9+qaUisvVOb2pY?L2sn zof*`5knilVx6bFuX~&IW?wWsII_By7LclII<ARH1o)nxDT#~i;WTSJxDIm+a8wASL zK^vcvWgS`lKKm5sq4weAuE3tvfi*Qp#y2+H?@XWl7X{XKQxA#Ds5w5&7aP1DDmL^^ zckAv-UG}n}wf8|2DdPM{>E%<Or@r3bIt;xfkByb5Y#o)0OS*B-l{W>4%0YI`mxIrb zoeRyuOSAUTkb}2=4Y?JYap(I`+`iy2xP9THgxlp`18&cL1oGDJB`-8@U-T&9_BZ0U zvXHyzNbiK=_Tl91<%hxT)<+4quRcKSkXz5-4T0zN1%W%$=K}YsvN@1D3yH%svTh;I zBJxV#lhR%uc%CohS>`=|I_N)B*t;wsTiZLs72#X`;;z0jwRfwjpw_%3WA(1$J&Y}6 zc%~fc-NBvaIX@LBIKrPXvaSgh!pC&C?yl4^XZSN(p81|{`Pj3+-pjm?`JC}*8JkUA z?-4j;>&Adh{r4R6J}2;redOR<+nl=p4CTW_;C<?<7=@D;2bja%y5PdVea~jT<NE4u z?Y6YP5YS^UIoI^&_`)u}(C719wLLq<)8{~T;FJ89Mh06a199{Dh&@w*x_zJ7oPMT< zUk@NhU;eO_&*YPfYx?A$_f>OrZJS3IzUg8c+t&niwX*xRUptSyzU?P0K;Fv^Lmt~I zPw>ZQwicIiY(*eWFVAAOi{bh}obYY#TY7U9U$QGE_oq$Ybl|)V0_Eyp+`4|w;&W|) z7lj`36?XSOUrl6;Z283YOM_j(uLkmjO$wXLmke#O7k7E8CcA3<h&4ahDDUORx|~7# z?h5!S2Yw)M=GjcXe8!>mWY*U=_N8slD}vd8Uh5tV_6Da1*9R{N%<;QymalB0!(HY4 z(al~t%T{}C4T>|m+zm?IpZ4HPxi6@5!&Z9TTXLj$P!~^Ru)(~%Ss&0r_tyLny>T{7 z2PL=c6jxl}2cNC2d?aUcU=5quSnus6i|y_CU_&d%UiV<h5r@{6^4*%&ck+$#<F0@$ zt<Dwc<3>F2U!0I#{^9L#{S(ts_R(MVu?w$v1+889u^*rAb!YY3=J~)DoUaY+16<*L zc_3$IGgx;iJ*NfyYxnI)f81FTHy{&7N}W0SRtBv+I)H9puduiDTSta{&fIiR_G(*q zK_E}riIX}f_L6yBHkW_1=|jcmN!=PTZgU2Q*4cl3_S0Qw#@LRGZAz^ShW|fs?k2i+ z#VN~%wv|onvwtoV567mR+26P6hKz0M^bfkaa$C2xNgfo>;_Cb?51eJ3)>v`suD`Lf zd62epb<pNSrbj+o>8ZPJF74ZcD}wU^dk(xu9NzanPRc&E${TUR>8=QKH?+BPYWng( ze$X`&*r)G#Z*S$vE3$x`o4Weu)M7N%t+CJiD>Lq_JNJEE;!Ec0K)cTmdBv|B!@2eC zSpU4qDZrWi+M5ISFMrfH1~OY&<l|&r5VIfizj7CtcV_Hc5wz>+=9hSXYc}u$KeGYf zUzM>z>MsRi`srXUFn7y5bFUsTCkE?-ObyGYzqEfpJC*+uJLPEEy(4}6SO1!Bo)5<4 z!O`7Vtuyx7-p>*KR<Hk`(`SF3Z92&mU-qew>uPfKajf<nq1!vgC-U=xb*9Rm*LOct zXKlOJ{6ug@=Ecl>>8x0p|5ScZgALXzztH_mnm*3HHT~mKSO53JU)fMP&5`wQGiOX} z?a?mXReM$$uexlmy4JB({?Mg(CLSN0AG{`pxpSVFq-k?ML&JA4GVToIvhyL&UYkAg zOuYEDyQ|r`Ay^*R2X$x4w{Od0x$B*ukE;SQ6}kBb0l8!<#`xABd(MclEhEO<7qz$b z&D}m3&@DI0#;ek{o?mlao1Oi=ug#dfIC0ia3UFv_HaMkgPp6g-^r_9&+1;A9c{=SS zht7Im;rC1+X7q@kVyu<vIas+N7ja)QPfwf7)*fr^=QI7{^12XSap5}|>?vFM=h<aE zOCPe=*C+dXvt;Dn^D@3BAg^SzksbB!R{rAz2mEVoy={a(HkCZG%hrYH!&Su`7m7T- zHNg91Am?xI^s;|t2OKH)1!C-85o3A#oS<a0j}N6M&4c%s@r$}S>l9<t!Cb(WZGk*( z_t%=8^Q@6OZ25SwH&DvPadJz?30W)GtQ!PM-`3XGvIqD0kw>^%8}JKC=VaQYC(YqK zqhJ2-Njr~*;m>cICmRP#0`hU={P0C_|5)$tDcvQHjnz)Gdv`hT_g<XW?ah3DZTVDZ z@MHo~W&*aX(@F959BbTn>jQr9-|teYFAd5@9I#(*$!+r+1BIPzDm&V?b;^r}|36^= z(qa3+-zt}jWM3GtV@u#Uu(_+X3+@u@m2tW&7OlSGoB#Y}Z`n0!toUnlB3p*OKT9LU zzFitI$Qiz0I|WB`0bg4F@NVpmKn|=5d}e2_=UnB9HS{kJDt^w8Qnotpug}K*JLrmx zxAzbqXPYs)*deCc#|PGE-xjdze<t>|$DC6BS+_C}gL8sAGEg~cPu(Bl$%oT|iC|5z zHn1OxU+Zve9hv=ga*eO{%mjF~XQ8~xo5SVx&M5P~#b?iZWkv8v@rp0!1An_CpFgdx z;v&PteB;9j!CnI?wfC;<E$+#>yXlWw|AuDX`aMm*<(-aoL8c$`2gwEb*q$X^$ctwO zV#YpaR}MS7a&>bcH^of8E$jNuA#PiEu9Gnxi1pqmE<PsGp9+o*+Veh{J{!n)M)m{> zdu9W?RGa-J`;9%>%QM%?wMUW1Y%YF1Bl%^XKloAnUK3l-2<U0$U6p?AXCqtr$8IsN z=XBX=?L-h0htK6UCiRRKdv@@r<deq+>rZUjr>AY5Qs<5Sdm0YxW%G4G$#`MfD+6{N zjtzWl_3Rs==e$nlNvTU;Yp3@S<%*!5S)0?w7yfWxT=2E!V${1Ro5+$s3K_<5jZ6O5 zvsd4_P<&ml;#1>qia!-k>n6vn`}SrX8!PT|zl}Q%%=3>;TLSa?a;f(H>&SCHb_Z;6 z&I<U(V|^|;HEq7y-|8m+NOZrs(M@jYRgcrn)>b#YN22@QBhbw*y7}u2e>~U|DEOZZ z*y5QWcPbBz&jom^xvH(NcQ@_ITl-H7<bfh*tXm(%^x;|dv)Arov9xz(H=b(v3}ffL zfjo3yUKg-|9OrUpfKOcOJHKy<@HXbFGA1vS7Y7p^D&OSlcVrJ=>CykrroTOXI$IrY z?djm>qM*GGvg9FL7Uv(!_}0K#RoMKt5%So4UQo|x{8Y^9?6orPJA{nN@xBZ^C>1yF zJmSC~TzpsL;s$T>pq>Zp{_f1NVO^l)*XxGw%N65HKju^UeM@sVv<}B_>ek6eaWzi< zYrAoMdw-($yQX{7r}uj@Svp^yvDSvA>GQQ@{7m=tAbDbp{`YiawdVWMuX%be>E_Ee zd!CiCR?iu|{^Qd3td{R3_cQsPOO25aY{LcLHwB7!C;qqc-=Dp0|Niv77m!!Bvg>;~ z9Vet+diVAA-jaUH$@S?U*Q|d@`g7@5Y}>WZ?dIf%T;!kncY=1^xt$KaIs5EnliJy5 zo1DHs`OxlrTh|v?f1jW1KMcxO9JD;_&U!LSN3Fx*Okhq9Z|T}>*c=qstzB$wWzTl9 z-7nTH>&;)$%`feZKR4s8oM(0G+!^GY+SO~jdVN<vCG`aXdlf!R2j>Uh8!kMv{T`~a zJJ2K(M-K*d@9s+5dF9Wj`PXLrrocJw#0~#O)~599Jz`(lFAwCFa!;@$aJQ+=$(fr2 zwuoUX&-!Nv^jlB%eCx@`uTl<k;oh|ICqHm-RKWMe0a;HC_(nIK^4{I_jx3Zn&dwlE zu0Bu=@5%?##?4f4TX01nf9?IgF?;2y@^hVS^cth{2Qx;Vd%-=rBA5$|$wxj|e@C!2 zcv4WGVQ)zLm4S0V9XL-H28zCY=B^FC7{t7xyo$RVVS{nLkneZ7W>e$LoI>uU!BpTL z$0-h{f`!;DN6TjRRIc$+j*02F1>!s%@XI>B;owC9ecIOE5{z0~e$}3eJOA)l^P~L! zy#@F!Clq-pSBnR^B)6*n^0ev7uX7LY#GBHtyyk~k^P`@R?h<E${51i-*bMDDdaT2l zQv03v=>VTmIn;^ccLweL=caF+!k$*2Sc9B_Hs<!=dsT33P&QWX?8}%UX2z<IBYif= z6KCh<fPDGfo}G8b+43h-2j3T3o373HyMnUax>0t@QTvqA>rBzx%81J0`_N^nPYUG7 zx<JXVM?d75@|pD8`49Ex-`AUeN3Z|pUjNQs|AzGOML)Y%_vSy@y@T*Ue%CXKO`Zoh zR=aD})~IWpvmj6CQ1tEbTzFR$%HOwkq<IF2cbk_>yRm1dmgmK>y8_3@MTR{!p60=4 zf63dDvC4DvqsCi3&Pgk;*0X_sqhy)G(YQJMjGM#FxVgz@uC?*ljF*jdF2qm4$8^9R zT)!%ye^-$3ZgdvvPBL%KSe*^Bol)Z(0=5}boB{X1IGtkh@_?>Wf}H_5Ws^I!*0?LS z2mEKNzPLKi?9#XP+~E7;oVYl5WU|Nnj;{6$DPP+0OEP{%VEr+H_?1t%Rrq9nKA$`% z$|ts#KkPF{=j#J&zPYOxr{+toE#KSqt?##IEw0GYW^3_aFCKm%JUCl;cy&-bh^Kuw z1}zUY-tu4%E{lgHX)AbOvzU<4+C7)P&uZ4hgokjY->zrJ&jr>x+UEp6m__Xxyqy*F zxvVj3aR=m`+STM$pZtC<vW0B6mcHfP*q+p7Qyc5r^P3~~{MRvi`1I~<WIubpGmvMK zfw_N^IWeL~aaNrvy2`H8((c=D?+?u*_lJ*AF1>FIoPXz_`e`1t`9}^zwsUu0z?aQI z-6!rEV;2XCIsKUcPjbx}S=QCwD{<&d$Z>056IesO^HB0VE6F$3%DX9j>-lCsInI^b zvDZ1W{@Q>prE+IB?aFg|!F?}hl*$+D<W>K9v(WwcV*iZ+8*uSp@Y;aw&f^V1o&R=D zPVEf%)9#z=jop-ff!$)<&-2R3CuVLs;BSrLiQoF3&GuK`wsO{GT=6|c@vQ!TPoMpl z273d=U4x^IIw_v_&hSJaM%MBJ2ktlW@N-A7HDG7G!yA7>fRCA=;>k|?b_d$W2XtuP z7LeobRIr0QbI#fQSx|PdfqZtzyW(U~+Bh-JKK%A=B#Vu8CdiSe;)M@wzPh*T3{+0? z#~dBTE(*wz%k3IErvvirp#ujc?=@-5d*kNCwdJV%#>t_$@;%{}D{c9CaUic22Wx`0 z0eQ;;wwC|6EZeo&Ga0Z4uV-}qsnm5BIj3wc9b!bU{kRtszP=+E1j_1w{>ndpV})<k z_t~oLzaV{F<Ioy9zM&h_C+pbs&9lGOd@=99t(;%#-ig<Dd+hr+`I=d(;U0Z|vsf(J zHNJk=uGy0{a-?1J$=;gnS%b6PfwSaXO$B1W{<8a$taG;Tsnoc?c_;6xe{%XbsQ%;9 z7oYNv?f$`PYuL{|v9B1a&8f|+tx?xHZEz0NOS}4{u6ExV|E8`!rK_h>Ul6cYk+a%z zz}b6GjB^KnG#CU**~uS#oEQF%OWnqJUB=3nTDL4?{Ww1{W94tHTbwbuP#n_nkNNsw z`6{n#?O$fxI=&U3)_*$V#;jEr|K>iLIrfr)`(N+Ywj7uI4|H?ZlhgX>YplhEIW|8# zC_B~q#?7-+zhY=ipG<As>z5s3sb4;v(Dmh{^<r#Z{^_6C_1&NPVt-*EzGN!KOJ3<I zdk&RTwXXb8lg)mG{bcx@`J*A$*?2>YU6XokfNQ|zoxv3WTb0$pFqcwq4cK-=K<6t1 z&!$o9$!phbNdL5e+`eA>ac0k!fb7iy``wdtvVU7}O0YLj$g+oxxMrtyrE788o=4(x zbudaV*`-&TZug6^l2i9caZz$6vIf{$cv;$)2G+7qIXC#R2z1tQU{A@Q2h8z#Wnf;J z3B*LsTjNeI8wcqt^(?c0Ixt`R$m0)A*>_=pAGygkc~W^=X98Ds9`ILrY29SkUy@p1 zZJthjwLY8m)%tAESL?GyUtRt3@n_<redgHL-XSHs_Nc8<*E)RYJCkZ>Pwm}WO|G+n z2SuFh?Z;!GIf-|CFAwa&t5}h{ketl2;Xbx0V#R+ly?bl7I-Egr>DUmg4Cth9BAD&k z=KDU8vpz8Ato&iPR*Or$=WELwXH9(RFCA$PZFL5fvekO~#@UP)xkH!d99^3Nh288o z$DiqdEa<Npb(ZaGeORA9|8Viq#y@(O2Xa&nv_A6lCEYk%<O4hEd12oAYXf#&6|mb` zakkZXx;5Y{J!~Kc$`5+UY-Q1hx4LuW^F_h-K-=0&gV%O_YwOOX*M7c<?P&p9*|s=P z?mJKo?XpHWoVbyP-!?Xb^p$?><jFC?Y&VC4HNo0I8~Qo;i6%x1$-%xnyw^T$d{yp> zwRrGX8RfS%V!|%mik&@pWpBk92gc6`w8^SGa+lak))NAp%_pxoCC|ISq2$TA`Q(`= zgKlm4AQ#xxo|$p&EF1bZrI9j<Co=Kdw}a111OCh5gmb@mTokaWpCi*5V<T(|lv*=i z-jwe3SuZXVLH<<hKfAx!Q*o(0po?BIa3V+QESK)eD>jpFZRHi2WVE?O4wMhIrZ1no z;)Yzd;bwc+CbQ1BIcwYVZ9hBkE~d^kn~w>~W^$F1RdHZ5h^PJLmj|~5WRQJAK)(38 z*B1qRSQn7{*>KD^bM71C_C1hs9J$|W?7K6jzdo=R*5&h4s-aBzNtX5E_w`v%S36Gj z-)4`y&o~{eZu{Pl`MR6=SNgYP+*%x|C%YO~`b&Z~P9?*-vO!Izx@_Z<e!W}Bcl}YH z;V#IyeF~24RptUQz&{&szAa#rc;Sk##@pP)M;mABT3Plyty?2@azw3&cdf;dy$^<S z>)m5GUJ+PBPT9e(cLaDK!yMbmV9#$hGR*Nwv7Ybt$Z7KBGfv8;)oF`i>r=YJ`$s&K zQTGqI<O5sS?YwLV>Rj-T{FXCqWqn{C{7qcr>?C(%px}Xgw&NnphF|M2=1gu4#QvJV ze!iLGXT_2a%Y!=S^tCbe+0kC(w*_SWMfA+3u6Ow~hqC$N%qgA~^eChF5r>Ks{dC}F zWg!2_Cy(Af_boTR$7(Nb@ImH$d^iXAAeYa@174@Q@k9ClSDpWTfAOJ|zxWn=HqmoR zz((&~c;qKL%5OPG=0q^gf9qTS+jnBRa4E+4DBtMEEBT7puth0bt+#KK&3i3OnGA4U z_xmP;DQqUYVu(kwpugsvjLDI!gNmztVEy`lkNO|$Vr!hv<$=3M+}K<GiPyj6_u=Bx zy}%cI9`5^aKhG*=<l$0|Ra^#XEB(015jnZg-1{F*d=`>>6>sr{_WWzNF%@TdDnFG` zd1{UOOCHGQ@_A9(<nvFi@t>?Sx;9yrL(aXNC(GS{uleK^pX7O-l0Bb1xjUac^JLIn zc`gsw)t;4c?JOJmHl>j=iYNKi-a*9^pHB$*U(XM5yeME(KR+se*tscCYR!B(L-+bX zOvueYS8(t>xblWA6%%~nnI1ar$A|p5HZWd#*QC8RAeVe=+q=SA`${G`Q1;VnO<z8F z#S6J?!^`%rO{V9}YrDR+NBSO2&c0wGkOxZ1ueh)g#CKP~4mJB<7Ld`tC#QQ*hJF1# zczi+dssNY#RphmIYh_d}k+mTZ7p3m5<!Q6U-r^c(P+W_R`8I~fq(2+50nZgrZNLM$ z{JS9_<CTGT!mWWhW48xvUmuWXj2+$!t#MCW94OjgEgg9GGvoHjgW|k$u->J_rrsUA zC%1l1r%#qW_G^!NcdB;>?+S|oe&axy35o}Oc3&9qMJ(!k@coRy-A1o*doKvcRN9#0 z5P#&T<(hS#G3+cI_4Oe37<V>T2Kd2^*gFH&wy!ughu_j`4Sm)tWy4(B#t+4D>3CeX zw{nJE3+0$C{9F^P4eV9q$>gwgfHypghk4&?m<Z}#<kzl1zQ|p9&VDkqmj?E~H28Se z-kbU#g5q%|ZF0p)G5>{t4Rng<_jm2-)YdwW=Gdiejqiofh4*${am_CL%HfKOem^hR zWlt+pe8ifr?Lj>UR;SI5mP38I@M5i+T`vpdmp$av9&KO?4&Y@$t({0)F+ZP7de>Q) z;(H77p!$E@>w9-J@4av`@cjJo2oR^q)K{g(^QpnPfwRP?Is^P~_x{9)y<#(JFMjF! z$?U0oO7|guZ)e;%|1S&JB0k#gn&m;|D6TgKiZ%|S>M{5AIM|oIb#e_C>jUeQr{r&i zs2>|RV`PZKxjh-a=F#f-i+s(Z<^6Yi{SWv0Z|U`)l|Fg&(kU;#A!Gb4KmI!3x9!_I z)!8ezYu_un@A=lgD@J_3_p|xls<T^b{(btb{WtXb%esEc)v``^$@o})uYwQq7<Zlv zRrkO4;vO;IeqV<iHeAxlDY^cQvDUUHrf;ujY+Ij_K7FNAew#nJt4kOAjMqACsCoIM zzqG4Q>T36#@#(H!(bet;<EsL93f~lR>^VPpZ<q78P@3}Wz*z$F@HP`17i<aSfxAa- z&K=-+dqrT(St5gv;;3yep0%yHIq>|yGO%wdsD1R}kM7wZ<_-7XlUi96;G?~B$;Poc zzLzX|ae7n0mP-O-<~IZ@gT=w>z<shNSQ|_P3fuUh;DEn%rb|Cg<#_qQ2K=DY9{S83 zA1Gw77u*rEUE6wn=d0$~T=xchPYuY&p<*6R3*;eLeBodDf<KrG>YYpMjlD5=L11sK z!9UK#itJSZc{>7Y$?30Ikum#s2k+1Q!)Nxgi@j{(S8Een$vPC|FL^Hxj*6xDW8boF z>|Lq<AXpIt{7pB1Q^@aP7Z<pi49E}{@{G*{Wa*Q~Ui@e4!7({yFF$ZGPEOg!OMX_4 z&|!`aIZ`^(9Ja}qfArQGxlf-QP|DVlBTq_>G3{24XVB(2!G`I8kNmc_>?v7tQY^*T znJWK^o8tV;%#ov>51Ah7vew?kIZ4{{0Wao@Gv~^gVvD$x?P`6t;e_q-QoOW}4HRvh zl4qX0ugfCx>?4Oh>x|WYXTTm~_IzWvr+BmH(auNTpO`%Kv-mCFK9X_mJ|ET<AN<CL zF?@V7u;*VA9}CToH*~)B`RMc6=Er^i0{Q6s6BkD2$Him#m@hv(%PT*eu_pxhth+?N zy=Sd84=V%rTJ3N5nBNe%BWHt>>&|oL-IeX$h3J;!?n%!hrS!YI$(Q4$GtHrmrPs65 zeMx7nXLq}PXZqw{7AS1z2N~{}l3|Q3?VX<Pu+P6m0sqLiuH`S?Vc$A=ZXG`Ov^KCF zUvmopyZBu9n>f=o?iu_32>)O}{_21qY$Ri${L@JX`|V}_|9!^J|9tiARd6gukEUnr zO!7e-<wDtasAsHyo1*fj&V1$IqxGGGy)k=uZ#v5gKgFYcKKR|0QG8fe`<<8e8T+Jv zfqX3V8T$+Ibrc_cK3fidquYb0|I_kg&lo=D%a6Cs!^eiq*{hxpnLc<vAI|-;G;+kw z9qzo>-LGG<a>u*V*;CJN^V2~+4<Da)JrC=?s5^vAGVEz(7$>9V+Gl0^3~B8kvz1}5 zF?&5XJ%9f1d&KDX2=^7veKxH)>ig`7w?#qw-eEoN#nqa1fp;Z8hhpDc;By~&;wZlL zxm7Gq4ak&VeYxZ8VAqKOIrj%_@Lo3&DD2s#5kqQ?F8$6;*+PD6xBZ`t-E3sHdYrxW zJXoDI^ee{rujI>v^ZvWthq8^{vacTpeLBlGZNAmnz=gZI&nI3=CJriI`2R!`ukw9d zoU(klmkc>kypz`-o6T5p)VGH%EoZ)OK!$g2_A3u(f2+?OMt0>%%_T*K`HCC4!FT!U zegN^brheAV*IO2nw{(e<f|G^nrQ6=p>vuuN#i4u<e`xP`w!34=nhL~eec)bvW-thF zD+bn>mj^Xgacsxrm$>xTw)bj(y?(9Vk@g^<)46NM@zWpY)0V*9y}6sW21j%*4&;iu z@<goc6Hj-*Ah4gl<$+Rt`uWrH$VShVI$LS}vwNe?COgQKGh|lG>(018W5)*5f!w+$ zU>|$&Qaaen|H(k{wbgvvW&h69tt}Jj^Or3C*4@Ph`Q6H+Qw(d2Y-7smfE`Nl#)fsn zk$iu&y9;VB-|VeCVTZ5VnaADf0sBiPIplq@kz?IiL0?XW9%4hk-^RvgRNR)G{&wh+ zrvJJ0@ddb<3h<0Cw$m+tE(yF7C^%}zy^|_9;%DjC##PCgOZ(j5-yU@!&!T$xZ+)%E z7#%>i*qqe$ccvZ$%3%2a19>Bt#iw$*&XZbx(gkeh|G1hx|1S1aT;v{|Ey&pwJin>s zo4;*j99K18daI_F{}%*&Q&tD^S;3EfOc<87e@;gJeJ1cy_PL|*!|wMrb{ls#Cj$F? z4PxBBpBl4oTz*zOvu$W+*;2VlkNl8B)~xI5dY>`pJyxk)s6F%L6kd)FTK(J8$1VT= zLzIc_vje)F^ZwnGq2at7rPEqEolk9cwKBv>{wsa`#@S;p@I~(8y!FSr>eEZkIJ@XC zyZA5&l)i3yaa(e&HCBCc>|smGSGtdw{}ulWBa{DI0^Ds5-0L%evmh76yz-&?Y-Drw z#eu!mFRq-yQ9j_X&r8{~Gjp#Gt_YqQ7_VGo6MNZ2hB>j<Hm<!msQvWU8snD-OM~sf z4MF9L{omU3?ZZRKzB%nWD{^A_h(6oMb2pq8kTJ@~3?H;})I57DkJv@GJ`TvGzva~W zmNWhttGm7Bj7`Odc5zmEid$S+N9W3b&a&0r!k*g$F*2u^x5vCY)ia^ST6;4!^k1%& z%yyoPIt%00lngN{u5j;XWJbws*N>W~6Nlv!K3Y5IseLD<?R?bpNn4EcaiQ<|D_<@P zoQoBKc;Hj+JSm{#u7IBE+goxjN}EpeeSZ9`&;!9-urW~DcE#Me1$x&7bpBT2vLv;$ zAfK)Y=%Cx$ZNY;98GE|gc~<nN0=eV--xb(PmOEiKkVDg5n><|b*_z2<)EeAaLl1cq z0XZ|lZNb*ycVoA`=ES<@<RHJy$%U1H{KXwRTkg^w=3YN<D(?1^gG*r7ilF$!BhKg} z9|x`c+RJupR|VGA8tWDJ$~YU`r8wXt3<CSev`_ttfc&y;XWG`Xm(Ilj`zC_YO{PMI zwf2<Xem+MrH_oo(GsnLhf^pm|&m29aqwWDVUlPz;F&@QVrXRAGEHSCQH9yYA%0c$k zxoB(WbDZrDC$8+o4Nf2F*pvN8#(o@kmHWG*ug{aY%6)V5#crH@X9!0(25k%$BHO-N zC&#KU&&1rBp9tDq-=6;A?%9z&{KNOSIEu&h3s`gA0@kqcP`dbvulej@liaIkPMX8} zbiRDF2kN~BkJCYM<~-n{<+NSzJ~*89&iz8x^Ru3B<9v1>)}7d{IX2^EuX$y@J8g01 z$H|f7{haa)v&S>Da<HD)%QL3X=bn3GfG?lZt*!SacNv=%&qkbB*S<@+$BirGdxlhw z8*>(GzSfpK7iX^8&u!YzYuaoO+ghi;q}S(z!XNtOg>{pG!ge;{uQ=xiTo~|iOF+)% zz`ZaNxCgw~kyY=i)%SI6@~ZD$Yoh6UPZF0l&h#nlG|x_Ld)c5(E<3d8yddDeLf$AJ z>KuqG9s0N)buKbIlr6@i<kh@0Gitu%<7AwScFj0BrH2gpRCn&Kw8d~P*c2$OfBLu~ z*FJnH;z))uF;T?Q-ioET+Kc<?fStzV8(-;_XA61mmwvHQDvt)k-T}Sj78mr2Grfv_ z`7ZYKs=Wh@^S|ObDlXYJl*yi*LA@`@35C9K&%1gTv2Psj+cQ^rMJ9XOe!2(s*SnN? zdBUc$`TDf!;A_2i%I`Xt@>^lAePk7fB`ZVo`s2NnefGm3m<Z@3SN)2heJ^E`weE^l z!Qw!%zR%mO8Ixy|fntrED?Y?Y4EaoN>l^>9qZ^NWBg^_e#~B*tF1uRW2PRSm!~Y+U zcTw7XePk;$L7fes^OPEE&j`DW^Vc}NYPxaCU%pz$-^#IL(>4eES{YbFzwdP%oBz&C zJr2t<2lUh$vX%r_2KZr%!Vcr?u>PjNXE*-iw&sfuewVC=D`z&cRtI%gX-@>sF@H-Z zzt;q718r#E6RhP=<v;#vJs+&6LmV~+incp_MZj-+<yn8P{pMj)pp>1ZqikYF<)L-t ziyfa{5-biD1;(d?s{*p@x6l4M3)U4sY*6kC`Z~p+?$^q#nT)ZQJfG>G7g$H8LZ>#p zc-s(^@8_hAgR6s4y4Y!7s|&Z}(Dl}UF23^H_#jY5>0O?2b`Aoi*6_VQj)$^I8|pmp zcYW}T;Nn1jd~5KQ;D>^#7=3r}3&F1h%9eob?DY&&aA!=tBp|a}{+JKseNNk)^Xkk@ z2F{DNJLl$rEz7(5qSSoC2cOEnG>06PesUDN8pGSgf%W9}_qMi=+WXvj_LdHQ<5=Mn zy*1~2c>i1!$PGI9UOCMsr8pp`<)HdFye*(hUMb|_V`V@-A14BZ3}eNM_X34oWR{)m zv)22{bYQ)h$WPqM4gE`k(m`j-qc!A-7m&x#ilM#5t@)BohQ4`v*-r;~>=e6_t6#pn zI&H<AF>|d?2XgrUPvkq-be<7x4;BTF5AcV7aj{=q<e<Bnz4go`W4<}@D4%QZ9T^iV za^~AR&X$r{KI8mQYw0>%{ru-&?c;|rvAZe2lQH@CaD5tQzdR6oK97ohaVsBM`}DU2 z#nGi{E0q`O{@vqm`-(@c5u@oqsr8;Q@?mi|h8z9jXnERK1(yfT&$$8Ht!bY-^jI?y zDE9^RjH%i@pK)Gek4u{@G2q+2K+$HCIk91nu{Mv{BM<mpTv?}&ui8gO<u`q^ff$f~ zxG|uo?5Z5$55L)l8yw?<eb%#)e{9+lm}7?=sd;Cy<QXRqU*zow=qUcSr)~e{Kt97D zPzJ;QA2{0=r_E3L`8gBdLLR9Hfnxu218eE7wfHv2#-#zjjPaxHHEYe=*V<vtCEYl= z>{qO{7fN1h7x~2-8}X)3mVTdCF|K)jmJewT`5~{L_r`EX9^IwSem+zj<dU-IKsEGR zb6>z8KF<c_U&Yn)?zCX>h<Sdm3?_m#!P>w+U=M!S!Eb$j>({*fWYgW>KbJA~TeB)) zW33S<rFh?-cFD&F`C?Y_wwDd~HDBX=dRjm(AC?E^?PcqdpmIXnIG;*ht>aUFUCUe9 z-RH)=QT*Y)I1?-5WcK&IG-D40_@TdSa^{MsmJc%9KHn97;19;>+LF1JFMDyQzND-9 zRI=DYo|qmJD4PQ^<gL#&%1mHP&AwXW9=JGA_}AXa_%VM`K<Da!4l=I}l#)Z2m?*6- zI_+B&)V`KqI@mJ^l=`g1-;zVNHHtBFWtVuF<3riUR%f#8)~<PWluq;2u6cWn%>{!% zA=mhh;N&#q!`fh7p!EL+gTKAFB;z&z-_j@V+~B9Pe~|i10Xd%zzAmtqj`wCQf2x0P z`eI!D*QC$)>VHf6yVC!<Uw`K_TAeS*c-!C7>z|)Ky|^R`kN(|&)|S7|^S|cV_L=VQ z6O?{?el}zEY%QDKp0SdR`}RH2+T#Ls`L#IhAJ5+#u%~3H?N!^qK463Rt<N8iNp*0p z?BCqTu(!s~?)`0p)4Fx#8$X`Vjg=2ar(ZGqnJC_sHKAw7{fe~B@uS8EX)A-_|G)Bn z((?Hyy}xttrmoLNXQS-Bz8lB0xyf#BBK7K?jFZ#HqjkPESu*}SKUmm~;qF7-n9rT% z=UXz?=E+^X{w=-!j$Z%j^zqp8eQ|HihF<^i>9eikU4Aa_?BeIA@<ZJ<k7w(B?ov;8 z^{J`(;ZFMLtT*R=FW=tT$*BHYdi^_l{hQLKtJZHzzj6eB&riSn)c@x6={&yK<L`+W zt9V-HZ*~}4+N^s*H^!&Zx2PMdINJMnUplb2wd2#>Se+m1e!CmPAzj6d-2UlqPTrbZ z8PI9&ySq8>p8dI-GS}ws%hPZ9xxCxEs@uCJb;(`T&8_a{);4or$`7m3Rra)VAIV&+ z^S^a#$+hS7M$V6BPVTG^Z~)imAIWi_Sj$#*@hPt^&Ym{kpWN#|uGin6AJ%Nwf4<lM z<Minm1Z-r(?_`V*#>JyJd0#hP>)zdy^<C++xpGW=w)WOs)a$SA^}nIl-=A*?w)Q`m zJ{@Jl@Ac+C)a$=L{asl<6{uejJT15^Q258!HU>{i49r!2^5f2)-0OP%7xntj?e%BU zr{}Q&e(IU>oV4-$ysmy(SI?&Aqr3CZ^MJP3=W}bd&B=#f?&gY*_ojbbH!qfNPoLio z3%~EzPMHq$<-9Y@*LF<KvC~-DtWCFZc04mEJ9b158OF~EtgUs`uY0ok#X<GUzv`34 zfAu8+ncDK9KgO>97#@tx1htnh{jsvUU01fZV`cxd8hPcz=4Pz?czQENC!F7mx$BKR zqZxA-8}lAnHlNUqZED8c#n!d<)$^rYCyv%#5R^R6&;FQq@cx+3BgVwJ_WC-4vDUtm zyRoyHb#))NW6QdA=QZo5MvRrNL9@;|rMDehF=EVfqrcAcqCe*IhOsk)(pS%cHXe2V zw`0zXz3tfA5o69qf8F{KW2bjxJ5!e}PwB>PY{t&$#=f-~duliK%4UpD^uDSY+t7`* zd&S1OcFa4zv6ltx&$aQG&3|*?8R31u=G5QP^|yC5TaCZIt9Pd+!}IJ9KmV2c&zjjl zU3=KCe@j=}tG_3}*-?SJ;0yW14edI!rF&P#tmljR)m?p8SMN>T%K1R<cyidM{?XXy zUeQ<frhi=Ontw&F|B|jxSKWiSx+vq1P2C^AAmepcZ0hEHRwaKTn9h9N>+Jbr{t;p_ z>aLqfTmSZ;_WV}2rtZGY-5UJYnjgxV;!2*?oqt){(*aIj7?Ay<uC6=7o!}lUyGu{? z?Sbl--*tCBzMFqySJ$0YF{)T!-_6f;^?kj%#&77xE9S51`rp>o_+$@`)OU3CYrFb& zWBNbbjo;tZKibtl-qr8v>Nof5@96q(?dr1od%OO-#?;@}jaU8sUBC2I{oZc;-*xr- zd-Vsp{s+7Im%6&Y?|t3)Pj&TAclExmzPqcPHN4gMw~y(+r5nGdtG9J^#iioe?^pb; z?bg@*QT27b@q4>|@m%>*alf;hzpJa?(A9gp`kt;Xo+}<d(2c*ltMBUSar@uY&HwAJ zF1x;~>sP$r-u2(n)upFj|4=voBVAqj^<!QCCwp}pKhJUbt~@c2tLFy~9ChI9<A1y8 zD?cCa8JzC$YyZyjiokvHlHf^!xn03s+56<KeN5^>pxhV?G*Wg31C5lrL)NEFruU*j zpj;KK4vr4KE|>{CQ=(${dFIyCR|M{)i9oJ>HVtiSoFQ%Zzy5|`Wx%eQUz7IQz&eGz z$zkh&K6-Iuz3&-V=biFrGw|5dwVsVL!Kn31yE(preeN|p@|$cny(eE&nN59Mz)p6! zKffu!X`gp8b_91tz`3b^F17p9neg|>UYh#Lf!KU4xx|H1+-M()8!-gjw7jtWgFRl3 z&6xLCGUW&U6#Fg;YOG?*9y~?NkVi4X&Bp`ny}>^Ol^5iSHG35EUkJp5E;;L-)t(Nl zr9)q?Xj{|&+q}1AY)P;z5MzFbp=X=;{l^HfZ%gWl)KdZfi<8sRwr4hI<!?@3z7+4y zfwK5Obuf39r(ZFV!~dz%hbN_#A>Z7^4+i{yO2BqyE-=rA%L2Bp3fQVRZ{d1>owu^9 zjjOSbWlc;N#^QlyU*$i!6+`RVwbqECeK!Z<cu$~+6aRjGgnwltAH=us1Abeb=^oTW z#~uSI#YOolMmT9X=A&^s$aMC_P@b8?M>}Wlxb>MDeovJB(*avHcQw842=c^%4@%wH z?Rvb;1nPF*iuB1GrN8ose6r-wiGflvz(c;&z5j;PC8KhKY~!OiH#Z2B)j>iwEY5?U z6&f7qK4flR#;y+Bbqd|@j&Anf8+ab!xV^W<tL@7XMb2yr@H!im4cnXcy0jJlu1cGC ze0qI=54PCP_c}M$7GLy{+0O4u|LK9}7`<|W?c!%|J>U4XBak0rDjxFY{(xU{Y9dg~ z^Sx}acTZq%#Z3R2z}=&al4-qI;8tB{nI8SQ;H-dd+>IKO^J}}glT!1&d~)_$pV-{` zM887E%AoYh^HIK?ka4Aa!#A7kpAL==&J4(6uYUQ)u4?m>PwcT@j9(ele91eM?XCP) zuN)9taijN+U~BNiKupM0^Rv$fd+aM)j!&B&<F^Im)W3@^pKzws8I=q6+E=pE9P%R< zmj`UCIl7D~Y?UwT19D+&&cn9{_3w*|DXz_x47TB1&bIkryzHX0+IObyJjuy+4gIyI zZM*yR>1*$sc1&)tt9-Mr#^loH0{qig=P=FTeQF<jE;W!+Hpq)R0-V!zPVkEnVBFd0 zKU-F0jIJ*P<UJ!$=9Bk<!;rV?fVhM5ZcM*#-+zug;|sA5A4=IbO5O(-C=aJuIxHn` zXL@DdWZJWV_~6Jp$FAUvKwjf(S)d%we&?w6d-f`|zl|ULbuL@|?q>VT{(k<p_BvZ- zvpY^+m{*LmrN-SYig7xO)8X9ob(FniRr}7gaZ)+^*k(@N)w;IroQ%uK&t;B&cZu?i z!E``JKd)Ne=#}>$N^lpN_Y29ZU-}y5)k5MbM)I&?R2<!tF-6?v&RlRx;GS#mBK&#Y zC^fH^1MXHF+oQOfbDjRP_vW)Q?hftiCikSE{77@CgKW=_l3)4OmorXZ`L-l7%C~wR z)g9aVWlqkNzC-y#uloRJ<K)&k;4{cISRXhi@PpyX&xHFNArJpcgnAF#7RYJb;s|hb zY=Db8ALYMuf#0&b{O`y1|7Y(!;PkAj{2x*v5o8rfC`!mo3TXr>2Gj+fFp~%fs3=iD zL7V^~2_SZqB1MhZSr@SvT-RP#*Rr~b%GxWUC}KeoQLrIa;Q#y1++R33-she7olF+o zzxTs0_nvdlJ@>SGpXYru8PL-yx6H@5Tc7vg-GY7ahvqnNw#m&rA>RRFZTMV6J{&jR z-LoyuGjlN?zWazD_kitTU)#{8kNqsCFb~%zcH(Q!5pv|mIeVAnzglwhX(_^voE!Wl zH`tEOoEvN=X5`NMVH2<{dBTsj_Zn&y+lbej1>)E*3<>CWJm5p0EpUI&5gseBm+OjW z(}e;$k;i7=tLVlSbn~46<GeP?+74tGI~TS0x@#3j?B)I>z9$Q9eralhujnRz#CMTE zdyjOnpXrw*x?l8C&3{IV=|5X~{@q4g_W^z2i}dS6<1>2M_tZ3hXrYhR+*E-x`#%yS zkMaM%L!GcMIVW%2y_{uyV9n>WhWJuDw2KAe!k(=AyawB;XKkOrnEl8hV{%N67-K)* zzeGMhAjA8v*RUQL<}6E(487$T19EtPfDJV4V~l-YkbU%DEd7_%$2k5>|IeC8zh88W z>(Oa`QK4g8zbu`-#`P;&(-zlg&o9!?knNX#UhMbbXSp0V;z?Y{?IMA5^KHoy6Zq(- z=X}tU6U%+7=o^ompnFEygJ&l>Vow@5VoYwnT5|KX(tlk&b1MXL{ty8l@P{$ANewWj zZrKOlp|>hDK0-St^sXCp)@suH%~_M&i`;jdCw%{gd?hd3)wc>O%b2tG&C1*!;xl(; znnUN)1nw*RMkg_3>|8n?j^kFEi*ck5kRiS?ro<kan35C5#AtaLv)5o5v)6zS&m(n? zU-*oE);h1~v^~xdGT3H&a*l1Eb8P$2Yx}Ut_F<FlBPKQbmWZ#AZm^Fv*ufr-Blg*D z?6ck2=Qv`U?Y3R4vt8)3UD#{8u(xIxYsvSwWZY8qtZ4+=v4Zbn_}EL2F57ND&|^Qa z-F{%Z{lIqnf$jKVyIF6$@xgYpA9kY~EE1@}7o?xPTqBx&m?zGUPV@6bA1MB<0y?qJ zx^65#pNKEW(2%jNYc#)gpsy5-Y}D~V@vzS}VB_P8Uh3Ik9<bK;1@CvvyJsGn_(Z<v z-OuPS&-q|IjU4hW`#|9;1&8zU3MFZQ`h^0v5;M*adqd+NIiTN5m|e!?0$!ic2(<aa zB!P7vTQ_>6ZpP>!p6JN?^q09tJ<aupUi4cpW9uaj(Ad9I8QV_x=w+VTLe{>y$H(0S z>eW6V$GtaMSQYp~VQhP_1w2QfvBq-fVb1TS_|AUV#JCY?*+=WdZocn@w!QX?_1x`? z1?1QlIdpkUUDoy^w%F!<H5}GKt<cyD{p>}Le(D4L=<5?WCsB^Q8iCdf|9Ph^kgJ7; zfg1Zx61ac9Eu~A<qpuNY+&_-*M2*=O8)gX5jQ_Xutt~hFP8#Ct9An!mfjB)waC}bD z_%s1uk+DCF0rEVvj}(Yqzd#H)7ye9iy2i0~7_%06uO*JN1@sYP?w35*h(~kWqb<}I zYtIyjD`WOpDtt$SMm-Ik+%5P%S76_x1#BTN)Cc#I_lCwU->b)H%>9FX=;pk|eI3)b zcUNMAee6ve5QtUO0gYYgzdG2CjgB4pnJ2J6vdpoLSYuoCf%(}&Bhc8ZriYqD2j>Sp z=<K8?#}eOTPDE~~0sKZESS*km?0RYWEJ@DU+df$jHX-X;!gh}vjcMo}6qp+j$Qil- zHlhpL`UB10(9te@w)_;0`-HOv^5wizd%Pde97BAnjnTD-fc?ZD9}U)U?@beq7qE4e z03RMSdvkwpFZi=R>yg37yq<knYg<_7_&rl&bn!dfht&J-WKZg))1KJEzT>%P&CgG2 z5BwxI>`6ZGMJ5mb9&qQzxx{YtoL1!UpLYh!Img+zS4zh5wEpeHqkf3#%>ugH=6uJv zCOGTFnOM4>yq0$)kJ)3Y;JmrVe*CbU->Yh}*oBXlMJN7Qm-`%pQzXManNLpF3&f81 z2V!P=cA?ozUzZI3+$MIi$IU|aEzUVc*oV$&Z<Mo+ntpWn{YAs!dzYHVR^nj091rWL z#RK2TZ}y*j5d-Ij9-iZPyvEcb=LJ8yIb)}!GuF+TgVGxIB2MgWTinCLm)hNg@3aF) zy5VP~dA>JSYYrX0+ZSj&Aj}b{Y3@FF3k7Tk$o2`uhP8_X`2K%0?4dC>ai`Me3;19? zJ}bo9wSZmd@;%2h+~<<~k~3n!-snY^T*Ies9w}f0deF(ZcIW+~#1@;lyKNKpac<em z`?c9NT{6)&+k}0tDPn+~-PpwM=^v6THt`I%P2I$4N6AN9MvD{Qr_UC;v5S1#t{5xg z1n`wJNzC#6NkZfi$1}<t^*U8JUigEMYXW=r6|9f^W_|2|KIW{C{$>Gv*hG7nKy5mI zQQmb=eR@9H{6z7Iq4h<ZSi}CT!(P_07yB}YEtd+b1@=Uadx-czyS80FQ8#vx7vzZB z@d7%#$&>5H&+(|&d5QY%H+y*>4L9V3@rpvTKW(`{OiT|ZdLYrg%Cp{aJ49oebKvv9 z-a81+A@-jm_?=9{4Qr6SpWym%J?Nhf4u5C;0?l#0xPxfU)eALdE%zSrWXv;tr$iH1 z+64kOW%*1~1Jnuopp*4rZ-Hkm=RVHk+g<|i!02)ekfDAY19UhB_Jy_7(CGs6zT1z~ zc#<$%XapKDhKF9{?oRQ-t{g97LcF+-;=Fz4S%BZfqLbfyYM$5<ciLis7?7J2RU>aH zcONxL409fki+Nyw=YhJSxqfG8?0g{yxMQOH14LsB-xHua<|3}){&tT1UNyC>ajdvE zTswY-!1H{Zi*?1m$SoEa6Aykb!jO9E2|HrUxc~SLj<eM#u+}{49UlGB!XCoO!V-bp zAV)nC+kOEZ#QNTX=g9ADVLJgIt()_JZq7aHx$m%pW?5o%lMwF)&M|suma|Uw!Vce| z$7noXfWK5AH~8n66IbStalS9s7+>)jo^`V)_F5;VqLcOL91x;j=Fv<1Y3QY$BA|1D zK>a^MI7`4s_E;r&9($QbKQib;FKZW;F*Ng>7jpa5(p!h^_S{o6zgjq3Kp*zi^ikVc z2m4rmxB9eX!|#e>J@%d|upY1vHLVi8<H_o6ljT?w`MZjSM;-Fgh%Y=Nd{5xZLBcG7 z{85t^3N+$9L%^>$3+yphAcyEhma%nmPAyA~&Jxf$B<v-4?XWG<W?4-Q*UCBuvXOgZ zwt#+o<{T~-*q{BrSk5PYp_8*gd(KF=VNYVi8f@i`bPUkvT%nIMU>~}P3qEmo(Q|io ziUsk-_gMn+G<>4|VoY39)R*myaUh-`#^KY713DcC>VH%6jV^LU+_0k;zgSoEhxm8v z&(~Y>Iw&3ZI3PGb?~r2b-A$l({Me61KFKk1G;&Pb(X&W^{d4Vy%mKnQ0T~+pQx{Pu z@_wGJ*O<1GfZyo#^XWp3(Z8J#*PJU_+YNt@Lmt`pNP&H33)lsZI~^X+9Q;Cu^T9p4 zRpDdHJvEu{SLD$(AjJE1NVN56xZ!@~9-RY2jWxtK+d^D8+xQu6gwGkpmdV-}UD!-x zFWaBz?Gy9(Iw-hyILq<9Am_kw<NdQwVE=e7CW`)o;!KYp@qV!F<eIh7PxQcZjntl{ z_=LUj+3VcjBtHK8F0wz40eit?58Ht*^6WLN$FJ!E^5i4RIuG_c$5rARa=eAcF|O>@ z7T3j^L!R~_#g0D5^gAsv#b)g7WOJt)Ay2*7imYQo-1>y01oFUKjtM;1ee@r`{btP1 z&C|PP$Xl*GeC7NhM{bbq6Alz;-lw*XyE(3-F3Cx4jnDaz=6P>q56(I7a_CttkRSN8 zi-pWXuXFxgZA{Fti#1+n9=5<Ehdj^Ncd76_t!vc(Q6R3@3FLB-psC^eld}X(^Z!%H zafSC7{l1+@uTAvXiGFRO-<|0HN%YS}d;iOn!)VXT5`B82n?zr)FD~NxHz)e+M6XKp zV4}B4^yTGe!(u$H3HG0xewOUyL_aLi`z3m2qOVLp8}{i$pPT6K>1Vs5|KCjX7Zd&I zM1L&NA4v2&5`9^spOEN76TNq$cNR@OZX-|w+$F!#&xx3(Mz0XfS#iz2Ry6N|rk^L; zI(RQ+ZaZOW>6wE@Cp|K}FECHzvlHVOH-3j!r2ncMNBW7Pd)<@0Z5v~-ed%YEe#g@D z3}>GAeEONCpH+IEBk<>xo@Wp=cLx2!(o?6<OG<zL((hIJeM-+=fgJY<{ew#X&!s0` z@SD;fRC=CI@K==n;L;yj`ol_pMCl(9dURqZjT|t3pm2?nK73EAUr_ke0oYo=*6)iT zM%c^0@1+q7?tJdowsqHzvQA4k)Rle};6^`lbggLiWd9#X4>d_1$Q`^N1|IJK@O~6{ z<QCqK18*nMJOklhm-zSr|0jvh^9%k@6Q3G}e|_RpxA1?K`1dIM8xr3!{(0hae$aDc z;@j6>B)<LqW#Z#AdTvU5$M)vL=e-sAUx|+m#2g)*4fwxK{9OwFH%Sj?2>IV8KA(}` z|1R-o75*)O&wC^9Dm<52^ZPJ|O|uLC*2Jeak^h7E(TBdm|6`KJN96yM_|zQyKPNtS z8vMT`KJOmz|C;#RL-21)e7?tme|zF{#^LjV<+{gT&MkZ{?#Sm}gTF=M^L_$<V&cyz z{7HeY;f8mf-8JSNhx6?mIM$OTNR1yYa0YlsoFX3YJMrh>Ezh~4#?KU13iuJ%ZdqAt z|MObx!A|ZgYJzsLKwK26Rz5M<N(<?ymVR34?@{`#OTSI&?^*h7OaD)$zgOw+UHa`x zf1lECU;62#pHcc9O21?2cPjnPrN3|K?^pU=)UTGkepkl!nc|sVC;ImS{jH@Z2+;J% z?^<-tDt%w+`_-SKdGsSUyYT0fes1aKm43I<&sWbgAfCwu;*sCu1ngKTkYnm%VP%ec zkhw)^4xQY!<d*tEX0c?T;Y06UXmSs|M6`2{Kj`MXb3Xm-r$(tK=IEKHM~2>Vi~(nf zen#oJSE0Et>HAC19RoeD^z%!<u=I;dzohhS?*b1j^W**Of4KB660mcg-mCH7adD6R z;}w@~-<@)txNES(eOsKUQ{<>W`UjOh%P%YZfzmH8eH;JKGJja<k0?FyW1k~SPaQ&2 z-}H|uJ)i%0w<6Cp>TwT&yzWuzmAiDhfK9CD9vc#fg^ud*7{8E*ZUma=<67QdsQvp( z*7MxaUW*>S6T6rCK7q3dZ-Kz`iF)Pyu)pt;)&CeP0vq4An<FOF@Se(>;|{%7pyQt0 zXO@fnwsEiWZF<`H>tqk_X0~Z_@7HF>UA1qUJ)6QOrrf`dX`3$Yn-v20Irqa~b)Um~ zNZ{QdUR)pJM4j#3MV+COXE%2S@0ZYwxl0&NE&XWE4DLYWxwq)~%tDWDdOl;&^VxxZ z*V1!eLC-Ed_a^jirC(5b;sD>z4DMTK{=S}mpVH$uH1{99pBbCuS&RN7%RX(-iet+B zV@uCF6YCyd`X`irRq0PEJ$XfLZRt-f{pqDYqx4TM{ZmW-^wOVM`e&8??9!iG`twTv zw9;Q#`sbE@ed#YM{R>O~;?lpg^cR=@<)y!*^p}?YRi%GT>0ej+H<bQOrGInj-=dyp zEAgaJSB!bK?xT7ppNt=%G5nwLqNp|~P`3jDHLz6k)BxXIaDJ$#$-)d_nm|3#^eaOD z=I^(7*6v%@Q-3oB>hxsc2?A&MnF4yY5s2+k0`DE<nf=(C^Gjnb=V#|IUa2v)Ov85Q z`$4F&mVNP^G4a5+egWV1E4ER4TNXZcc+W{1vnR3-EV7OR=Zv`VK1d^8ZEGJ?S&L0# z5BrG!)D!-0FPKkkh{wkj+adK{!`Qy@Jr!r2HPZ#`pysJpVu8Qrb9XcX4H@Ei2!z_P z!h8W6kbia=s~f&^$cgtMrV9mR0rBn=@ZY&Xf4rNy6ZxF`K>=Uo((w0`G4DHy@4WNA zb)0asuudTFoJD-1{_ywNf^8TrhW=U07(;SL9QnPMC#vrk*aw@aYxW@a#E=@K#}Dd^ zwZxj5!X6rTz4fiq7=616=;L_#JBtTPF?SOBEKj^<3FsofQ5QKv7rsWm_n0I;xy7DA zfw&P5$BMW<TVOptAxEyukstnlIo?Yd<Qeb)fqP+pVVOYQ+5d2XT02TOS|FDv2*m9a z;Z)%aftvkS;q$_^!cD^N+V~*h5yCOTkZ`halne(?)A+f<%Z1B?_Y0pA_&3;mf64a& z4;5Y|{6zSjFj4F7DeNfB7M2Ky3E2P7ns+Tj@1N)c5`AEzn?x^5^g)RpNc3Q$mnV8f zq92mzgA;v7q7O|pv9Z5$cR0V?S%-;FeJv2;=NFM1WDb`Mbx6(JDv;kP0&zQ{=v6mN zKdi_`o&B0)uZL?c^5=<1Ez<@B&K32DEi~$seVL<Yj=N9k9@h5=>1#BmG2bvyW3MB_ z9P}eav$yYY_U1mvhev6S_0hI|(X2bFtc&sSx|Nzk2D=-9#vMt+X67C(8FbfT_ZZEQ z6LrH4`J+WdI~*hIJf`SEca-TD&DvutYbS|MV~yjBE?O<V+|A5CR=T*8(EB)z8}&4J z4Ffgijtg_p$BT|}?iVlG8sq+W$+G5zvc@rHO<O*mkYuC2p`tJ61AkU&4xP@+iA9g= zp<i>+PH1d9smR$j_9Ld~JXv$rSzEih!`f3?)<*qnMv;*T!~XbOW7FD}HT{~ypLLp# zwt7EJZFqihpOa_mgJ+pzc4}G6`wcOeBXAFFDbSE39&tT;o>o~mS$y9ir)$1b9G}=? zGya}2%GxJ&So`Er);^`f+NX}P_Gul~K7Ew6&uCdIcQ?eC+*|-djeDC|oLTh7{Pv4a z4xU-jNe;M6$ye6(tPZ-)YSD!aXLne4PRlwi>*&|H9dtgsMQ58|=XKC^ev2;rx}d|l z3tQIV7kP4R)2|d}3fRZoQ37|aR1D|gLiM!i0{cFv!@kc=`}RwobIUo5HNY9?ta%UT zdX{+X@jOlVu3uktj&?6TzsUJs?3W(=i~GW(_AW}Ywuil6pgCmnoh{a|AAV-dg`wt{ z^=a%JJ7#>wK<5jk)Atv;UsU!V&8HV9JNvcPxr=^b|75}YJDxMdWB-?={a@PU{x3`W zdmnUOthrj8nEMya)$Huo9BW=)(K|_e*8b}#YcFY8tEC&&Hv7Dy$ol!<?*VGEm-Zn0 z${u8S|0h>98#ou#6Sls($i<p){T`rs8Z}03k!L@vUZZt<rg!{aD;j;TtL)1f8v7#i z`Xb{qLw>F24Vvqe!#B39Mb|<B8>b8G#Tg+6dk9+!_`w~+9LRIi#N#t4pI4FR^W#c^ z8pj9x)%L?Q&l*0X@>z10;B$cOjX-0sLj>MSn9nx)Gd^eZ9D%+3ITKzZ(EM(UZ|LM5 zn$P;=knach`Mwvb$9~o$$NNen&{$7=u^oBl*9rF*@HOg$W)9s?6iyRP7xog!6LHw7 z^tK<LZ9jev34RyTaKrE0jCMay{AB{4pJ~u12<WCgS9q4d9@slmU~lVyX0JYhF@BTJ z0|esGFR;%3V*gx$IMC3~XO!haO+UI;2*k{L#QnAuznA^+Z;3!&XwZ#-P0>z#nJVlp z%oEs?hWsMI@xd>Cr{|;9;}hWf8gh~KVQbWv=ZRgMCx6&M938V*yL`{?+*7CL2-Gh7 zcr7};mi>4p9Vgr@P+R!3OkiIc^a;WY2({-5<o{@a9K`jUxjuota}JPo&iRf88yrJ) zlJh|!>&*Ec>mKaQd3=F-;z!)r%X!6a{Kp2)9X>1<*dJN)*e|e_xwD0%1n!&oeII(Z z5RkLKweLgqzY^Q%`%sAw-+hkF6wx_nj@N3<5qIpd&D7U`fbFgUc-VlS<cwOt7h1eq zE)>lfKp)L^*JNUyqqk-YXNkSNCwAkDbEo0({pQbZ%V4N+H&Ls^j~IhEhaTPu-lUDm z%TpytoEm|4tguR8Z}vJ~K!<twV;+044|XA6o9ncWI4%?>3B+NMfIjkyU#9tgNJE>4 z?6<|EK9HgD@3VMjEf&xL9;?64Q#Wk?cIwG9^6Yo6<e|~&=N&TWq~BJ+e|$nGdrlRe zA)U7h_)J_lgXo|k+b6JYKo}Ib7trZgY4|sC$hOHH64v_JA9Y=bLbb^PHpMw=P;L(Y z&R*==T4)4XmV14P#|t$_eNGjqlgs4zQuV~D5opv1jr$p&LBB9hAfKEAo=NZ`(DNYS zfWSYfj8~{Xw2Y5Xe`FbR-i{H7k8`Wxgipy{;(<@(0RMSLkayl?_7|}K%@ap_RX0rk zTcY2R=zmZ2TNC}ZM87@J?@07J6aB74zdO<IN%VUY{k}xMKhQb<<j3FV@1ya)!h?ka z1#0dg!b63J36B(zC%2q$be$}$6?jK_lJGR)nZh~3`2x?Ji-Z>o7YmmNuM%D-yh(VA z@OI(d!uy2}2_F?cAzUt8A$&pjitr8LD&f1rwZe~u>xCPIn}t<^Yxcx2#zyWh&p~gQ z=zAoZnu+q9<4A9tXx^3MJkO#?Q-_h>A<>+tIL~t@(z_&jw?Lm1#`s2^$F*A}dTOHM z-NSnBs<@uJFVfthk=`!RoUu4RBhfo1dgnxQH^%id6TNGqXC<0@EUxcQ^z1~>Ni=sw zTt6?-%*FWyiC&oKMTzE)itBez^pZsHk!U`*#Pz((m}W29G~Ipc)H6qI!{^?6QTh25 z>Y2MA-f_aE!YKl|&-_L_+JPh8M*8@-Mw}JvKUOrlIS=qA3Wte@Uh2lY{l%lMB5zCa zur;oIsQxX`Qt>_@MfCrnp8Zw}oI!F6jqT`zrk>e{_D%hp7G$IC*hkH>o*p32xjCxH zv)2c;SEK%q0`Gd)3D}1($ZLAS63HX`ArZ_)eawGKzvKiSw$bA+``dST*qddbxijdw zD@-4tG5*pxXUIHI_)l%dGi{YFwgu`J3gmW%z&(y_=Lsu?#|X3wM!E?Ht4ELJkXa@i zEnw>dgbzzUettwfvEXOWshgXGV+8glp2%>wV&j<tx`^wLfXpO;cCp}RF}6iHYMJ|* zb^8hUj4yoxvBEBLz&!E9ZsLQUnF9RT!YTpV(1%UvA~xiuW*>6gl{D;wMi<XS){zH% zpDts#qYe?!MU3_mxF@hX$Fg5MZ04D;t3aHl3fPO?jH3@8qnGEvECD;BKhWLygFUq9 z4>Wf!x%#Laz!!A!vkj}&&k@kiTKrxpXlfYC)e}47kDZM`!++-r|8^5<>sN@+z8}-R z=%I#g705qlVzIzpv>)pZo1`9_hy`&ZX6VO$Xlh8RhWY3qmaNA<`^4ENH`D<7u$y`O zMhCn>A+PZqJ~M}piv;%L|BqmQr-`<H#|s&9PCc?O_Vx+bkDb&lwLov1uxF|8Us_CE z;In-o2D1e6;&Vi;9xM19xz^D~Y}X4k?4#iWI9HJQ!|(j$Dc1asqNzFd#vaZdd(!Zs zVW7so(N}o*Mb2r&7(0mr=K+1pV;el?$)ne>hu0v(o%3-C5--*wi#^02*{e$Y`F@w2 z&lT{4z3?4fzJF}fpm@{*ZN5OA*ayadwd(}d;4krEj6I%@x@U+_9(iVAH+w7<J|Wx5 z8NhDVxCU&4&o=tavt8Ud-09R#_Q&@~-t)gVanD*TvhCRHm{?xh4u1}4)Kjl-7HE9} z`Ew0(e&7+GPihf<c@F>k1#%1D&+?%{Tka6i$dL>0#n^kH`%}{G*mJ%dTjD=QAl~dj zTPYC7SU1+i9QM%2i_{M9JE$IC<_hH8In!{%{e?|@CxKpa&wiGVyheN)w&9y~IkxDh zVGDNC(6^~)>vB2cv&CIARUqc^ykiSzisv46z&XUuEQ7DMml)B;+ulzHd$|i13B=~= zQSJfk=59vTHexRzCyhYES8N{=Tx<B-Cy=ja3#`fcu`aLKQ!<WIJ|~uCU*tL8<g{NP z7sQs_o>s=LhiE%C0<TABpFq6nv6a}szfQ4XFYbKez&^VQ*vGv>9G428kwVvi{a7vj zEP?tbCg|`ScA+cA#m^w(gS|5Ze8DH|!Vd0^PPsr9y$=vRE1MiAzn8EUdtx4uy+X41 z#D3s7;U<BYVE2%~d?V1%>%EY%kFEi1M;?2Z3jZVh#LE5?n>hlx<9tMWh&wjSEOYoy zZkG$}%N#vtjqwVB`)9C>PghU=+4pnBujmgp;SXyXfrhR&f5<a-T0iT&FME7mdvHf) z--rozQ!mV;2Oapu9D1lJ$LI^vLk-0`aSah8O%LD6XQ^K)pp%9^bQ533*os|WEc&Kt zoNYs%{E#okG{<*^#>9{qW3TICnZ`8MkRxJ9%&2Aaavqr{f7tUS*@LcVi_bUbfSBSJ z_S1;XTmipn-h(kZ__t&DhJI`{kC?+_FZeO{#GQt&NdoT(=%FDWWo?I_Q>?W-OR_w+ z(2!^UXb*m{o^{xiWw2$Q;61&THRvKPtfQ?K_zbm`lv$4T{equq8V<*1v3mBTy<c~k z_qRRH7cpjz+@C5CL-sjaa8B?Yd1Q|jXw>R*fqFSt&=$kr6|fdCPh5x<x{ea|79K0$ zD}2r>bw5=Y6v)BN!a4yv{0>SzU?Z~Vq+YPsHg2ggalj7bc*lc|YtWz9;7?rRSg=Qp z|4i}m<E!#@NWDKl?W(c;V6FFphaa|=v+!kYVm>+a{X9!!a?YLn70GZfdHz6+`vvxN ze3{Sj-C7P4U+#<;Uu=l+g}y+bC+9R`PR{U=y#G=luI%GHFeZ1AhYniy37@f<y1ZJ* zy14tuJGJfju>Z3J*Zj#EFA+NFzFhOPPBI_Se6~C8?|jAmyYcHX>FvhGS4z(QyJpF? zZL-fV5s%i%m*;BUx}2A&%e;q6j#~PvYANfZhRDq%fjMf$IiT)2%el5VQ`8pz&Jw)N zHOhK)a^^-mKl%UHkn6y@otJKG;_mRe@vzA;K1X_~#~9<Y3U4R%#Q19+Vr<{+ORO>C z#QLvS*89w}Fa8r(asVyyjd<kI?~vWZ{}1}Ect~sJ3x2lPKAzju5Oe6Fxi<3L0?jQH z*dKl9a_kS$n0mn06~d_kXKJ<JGeG_4XUlZ)*biOYGs}gx{PSF(Cb5%uB7A6jhLF!3 zH|TES^|N%}<1aQTjKiN1Tq8Aq?B5QOCpN@vccD+9Jx;ifj39nIAHE@@EJwVNV~)DP zN8)k1&=!-2YL1xT8+A*}sj+Xi=%uERrA`5N!6JdUoG1UV<p5!Z&@cEbtkM|UXGpNN zc5R2X_~W(IGkdnZ3t+$F!FeMdv~>b=)G9uZlU~lif2N#9n_Pp~xV`*q%i&zj<2!3z z`|CC4`HP+Sh3)XDKX}Uo+I&H(hrgFzt=@9f5OR@6jB0DyH_G+0)@K(RtmhPsw-v}Y zd(!ah@X}*5wPJrCQuz4En0zb~Xvm_Q=Y>K&{BDST>Nx6$#~$d2YrW5b;?t%H)FqAo z_XTI=N(r&HPl)s1(R`$@NHp)masKs*exYdee@ptkKXD#yjQ`k(-yhZG5cim?-{Z$T zesZsImKO`i66+!TemVPhyZ+t|S)ONnR)kMHK3MqP<ISQykDgbRzwf(B!mKAJ=-yi3 z4rXue4{|Ulkm~^<+Id#l0~;f-g?04UjtyHeF7oi0Lnm{SgzL-i^0U4C?m_#-8AE;- z!Sa`D9vk6vmf_>~%aWcmL?gqwx9$_fi+&tc)*v^l$f4_yverD})>n9aMGoGt^*aP( z&avBj{XlbD2m0%x*~hkXZ#%c_`4Z)pv+4Ecm)}pwntp+PVVNgxr)l2toL%Nw3z%Q5 zd2)lj<b-kD?>*X2tPT6^AbEVDroSzN8ufn^xZkc5qHlL-E%p#g^y4S=5`q2k=Npo7 zEg;9deRuCXLsO&3kgwQV_k#)_{mk!PdVGR*3}zPE{oaMXf0CP9=-o=cp!C*{FX;8U zWrZFnJ!gb@&JX<|r9Uk74=*%5cN%umsNFq<2MXU&z#gUkH3D{!XX*<)S|Fp7^e6Em zJ~U#6Esa3qE+y`)flu6sKWDfRXnP6s1kO9p`>VBpX9~YNkw#3|C)#kd=sw|OftcK@ zfOSU-)YWVO+s+kGg$#T33)CpKo-PolsiC(H_C!Y`(EN-(Mq~R$UGjXyFP`Ts1#}My z_z9@h4+`wX9Ru3-Krj2!E*7HC_`p7mz}Pmh7kthxzTq==;4h6>Ge02sIWSG*MFNe# zufQJa0NbcN&OEvJ?!-Iy5xG&`w-SwB8oIFuyJ+lb8a>~W9`=Yi6>GSy)}Po;4d6Rx z$9jfjo5&6K!7b@|_q{^LHBV1#J}jD;kPGT!nLs0-_(`o_BV(xb&k1cYC(qc~2()8I zx{Z9#Ymx60h!g&Erl4K#)5{$3bNvuk8ZqQ^0`ktAV=7k3#a6@5vi(ILE>LT0g|meh z2(%Rf`@0UP+3(8^>Ysc=Un?5>{O@LFYwSJA5B0LEz&Xc0*8Cu?=@$=Kz?ninep!$G zCnmFm$wDL0EJMw5hne;o;xI=bUsDAd{$R%sWrz30pW2>rJ$a;g{g1}5o|^t~SVwJj z+81B3oyNY@BRRqT>w+Hq@1zIY@t^&F64tftPpsz%d4Kl(X;|NF+=jG{wbyHHqyCQq zHFupr4w(B{WiH+~j|k^+k>n*l;Q;ZR>sg|GW|-eXSfu%=qhB;<+4I{Mov!J4rxR=L zHpicHPYrYKZ_wtP`<tYEf%=64`vLOP2(<YEcJ?AOiG^w_1@BF6*^fESJ~TEX1CKr6 zVKaQ5C7cE9VT>Q-l7>yxgKaW@Ec=mv+khTyz<=t>v1Hr`G<c4y_r;#6g6+W{+F0y~ z{`cay_r(5MT<s_Mu%G0ExUVW}@EiZ83CKrZoyY8}V=xw9Z4<WJrWkwda2_1<yTT4~ zYdf$no~axUKf}f=9^8wrPimh0x-Q`pH|ztRBUa4$&V*(z=9@bNpo=`<A2c=R8lc}^ zz+d#!@E3X4y7RFq{<hU*&G&fExnAk933+VAZyL7ZyKSY;Xk)RJJpl0;?ObxEXk*z2 zd+`xpmI*ZcAV%ZihtFJF%<++0zy{YrzI&<h@vx<rn2ty8h$%i%%h{*+JQ<I@x~Y@# zzB|d8fuGcpd;IlTrJjg^bC{p|(8#!s{Z0yxxx9{fbgvfJpLeg_gjloa0>~0;+iBSt z|0qk0I?0kNK+QG+jXmJyb+K;I3pfwJXN|S&pV!8Cby`b&#<I548gvd7y^VSrXJ@&< zyCeDFovL4eKPaGYK(JrVr*nsow9R!#VKX3}#H-udpk{I`Vr`ID&}+WY3;f)pk9R;@ z-ls{<G3!PLK4<%*4&n~jkCtVluju-F%X{>XJazJ~c8*w|*Tl0I_19t@<5#PdtUKNb zfA8_e_v~M%c+}2Xj7Kd$@bVrpKRM>L8i;#zI#ab;Xgf>)sD+XHmN;;?a6j@a;Q2aF zAaB0Mh%0j3{p5%7fWZ3#&%&nk<k{<E9U<?1kZIc|$|2K@95!?#M;&w{M{RZ^M@@Dk zM;yA5qprJ=BQM>^k*99t$ZeY(bAX&R0{Mxu*xXBvNPJjVTa7S3+WQ6hj?eP>qVd&s zbX!CCg>0vqj`tR4qOGR?QG@mPk4Fv0eCGO#cT|*9sy3?AEXVw&)|t-+cPDibYh|~> zb4^Cs+A}oP6)^*@acs}J<MS}fLwAx#ABdl0urIHP&**4Ban7>Q{wOQaj<V<)Dl(0F z8u!a`;qLl5CHgm7E~9KMk1=j{=REdO-{i1Uef&M=+<q;?Nwxg!iTUo+yya`(S=7$q ztje0UbGU0owo^ULtjNcEB-*}9MYfaf`&H!Ibo2L%o#GPhAa0#xYcbrZvZgJDJ62>n z`N_|BW_#NFoKcbOq?_+!I_a+Y%6IK~P4qS2Dg1q2mXG#hAK-h>2!9vIcY}F7?>>Ic z<^A|hGt0;QvOIfslCQ;p?`86u7=u_(JoB<_%t=i@&*8i#>d!t{mfq*Slg~Wwyrvs@ z;@yk<v{B?^eDEvlj`7L9;#ZdM<SV**k*_^pqyA_+wq@PXc65Q-_j%+!uO)7->sno~ zcU}|gBHG3?FUv;TqO3$a%Kkk+KY3TKo!7QljCNjQ+-m2vO|Nr7?=#mXTRWdoHlK-q zoX<PYP0Ua2jCG1*?L4=gefDuqYx&GMs-4F+-BR6AH+v6_BJ=ljX7P7GppN<3)h+ai zEZ&)IW8&{Q{GBfl8^)^(IM0Iu_W+Gt%@L@LSPQXkYUe4+=G;ovu>R4WdwE^$*%xa9 z8$tZs%zUo9_zcK<V0V^}dt~|1o_|>$`+CvO`cCpO4~(;H%tI|cwR0BZ6ZK1dNBzhS zjUw~+bk6*4fzAH;Hh;Hzh<HZ}Jk#)*_vk)>^TnBAo|b>kntVnb$XqP&Z=3jeTAI%u z=W3C_{@3bf0$FGJ^7J!=Z%gy95lt;v{zam()%01SIVYx16^-qtA19i3eba}F#z)ip zi{`TiwPN1l!sA?<w{zh|U--R#tlc`u@w;aI*~M$G7ccs7xoF=t*p7X+fu1?*pht$@ za*P3=$>{m~N6%+Wdh$lkXJtN55f2(UWE^c-FI(&<GN+4<{yZVs{z%a={sW?8{Pz(Z z<3C4qjQ@1eG5%9TV{456E&8`j@N5@#b6w%Z_<ytTqP>?FUi9&Og%|C9W8p>HUsib0 z{__ei`fx_!ML$ju?|&<&#D?!!=x3F_zw~p|lXG%SqX*IVnX=WfMP`cV7{gojZ?Izg zekMAuze;qB+owgxnEi+77%%=^S&Y@oMdzGfP<XbBoIknnV$PpXc+uWR6kfEsDZFU+ z9)%Ze-=*-P{r4=q=)+&izv+s8+*o+{vPi(@s|$~qoA;T*<Gh;pfx_cHHt&sv$9XpI zrG>}$LFPTX@Hp@0onCl+CuQF8g~xqh-r<GEcVp)5UwGUX=Ivg1d_QO2{R)rTGjE&1 z<2yq0{-S>$=Grvx7lqds<gP9}YS(g~7tb{y_Jog#zPp?&e3~cF&oBML(l0LklG5M5 z^m~<lpVBWaJ%8tbo(GlwpG(i#h2NC^pwbVPensgIR*&plfkwSCj<x-$6w3#T-dZw_ zHUI7}o|#=l$MdqS=&0{D{X4yQPHqw%&&ai+<N5fi=&|Mw->3r`zA=t_zd^cVojgx; z^z9j<qi?5(j=nucboA|D(NX_?qN8sML`UCt7CoN6#l3!`-(!nz=jl4p(YJ4jj=uem z=;+%=L`UD=Av*f@TG4U8mxzwOohO<ajL+mJ6`o_xT{l#C(bh*5UbOeX!izTFU%au# z58I4R??BWLaiCE{jH92o>GuIg+kY-P+WlS8(dI9Sj&c5k=oshsijHx9ljs=dmy3@3 zKUZ{)^V172#(8z&MO%+9ylC&Cg%@ppaN$L}=M`SGeFyP2cRuiyXAJ#Jf&3638u?+I z<8k$^8=vz}ijF?NS9J9EjiRHkFBTpBJV$iQ(W#<ijvgmE=I98~V~tDg4#U5g+nLgD zT2m9Ih>rgK{`VXEcfIK7-?v0Z|E>@{n!VV?=V=;oXN+C3zFs3e(XI<bN4uUPI>!BY z(b29$MMt~#6CLBeKy-}z&Z0-N8yne^9^LrC9Yw<r#>_=Kf2n_*8vXdD=s175=;+6L zL`OefBRcwVk?82hvqVQf)`^bw^ElCQ|3@bJA)<Tr8y|gE7z6G>;(>28;=!1?=-;%m zpFf);$6bzG^!um!pSoaIO)kdclO5z@oL<vGF2?Wl4stQBhj);}mqh}8E$ASJ@0Ppe zx9$GM_x5*74*l`H{dt8K-`gKw^bvdFwM?L~C*PgKn%JkZetO}>_x@l0W@PX9-v34M za{W*Td`CuOKgMyt50*7Kw^8P@78&p5`Xk50gMH`?KbPZqWzOreoWH~1^9FN#o}lk5 z{p`|vAL7sa%+k+S{}6%Czwj3n+Uph;+MkojJMz}QxX`oIvwrtN+m0oL_I`U5+V<YR z(0;z{S!h0Ip>MB3`@5OF3(e;>=JzSIzr%Szp~*k<d~U#A`_1=k(2g6QC!iho2Nv4# z;&TS`=mHNeG-nE$&mYV?Kl>Nj`K6|qr<ReYcA&X4pc?_&`KI2XeFyP52AcXoexT6Q z95kPAnD-sNywF>zXP(bJ%==lz81TI{^9L82T8BPFU=8C#1@tj~sK8!~4->Eh-}vlA zgHNr{Qxo*$o}L^dOU`J-mNBvZ`NWZb!}wzn)E+vvC|IeUdVyv?VuTI!dkNI!DFU&A z4~Q#0^2Cz1T3}5h(2!{usF4q1XBlW3b%AY@)uU^+z&?OI$tU}e=eQSjx|=XfSS8pt z_K$MpliIvddo=24*noT^upSy)+iYT=t%L=_T@g28(-yZ$n#14O!sdwEFIwV8UAM)} zHnqhKJJ$)slsr-c>jiQ*N5EgsQI5CQF*lZV*gTeX*wgE}wPRSbW(;di8D$Ok^e>e| zVoW?a<J=`;Z8$fMKWCs{m@go=N+9OF&U5B`meAGBUf4;Tj}_YXrQWEKY!7_w#D4OG z4~;-$f9i2a=;RCY$aeC(ZGZg5u127ByXT3Lt=U9Q+x*1G>_7Ws8*|)~IR?%}qd6M( z5$ou49N*P;^_u_ae<QzWHJ>MmKNj7!+>S+$bJSp<+FfNM`R`Qc-Of`pYXqLJH|db) zy0e~>G~Y{|lTXJ6{hM;GxmRwMZMLP?ykR$J1R8p%BYdy<w7T#c^)%$QeXBfY9X-5< z_Y3x$SaMHys#(X0Ty`VBR&wO(S2Bow8UI>i*3J<o3;DS#*6>|4sGd9w2+IU~ihH)* z8N{P@m*F!&$07kA_<vAvxA6|kdmrx)*fW;;@tGxlwiEx_>?9VyDY59&7~2{lu4mk< zE$g&~ebN70>Gyg0UD<0+nde=oSKZ{_ezHgOvsYc%IYq$ETV$K-<M$OiS4oEW<mV8z zP9EFl*J=*^w+8)xNcy+zu-^5Ko%VGsIkBE;(!=Lr^6fbCnTfLqkFyx}BE}~dUd?~} zLr;ziv21&8vq!cg^L!_8CYA|&hHkSFdwb1&Egqa(Y#wbtVsfHTi$|=fKZczDsgm<< zbo@E!_)A4cTisy?c2awP4LWY?K}Xv?<}*mn`5a3w2Zeb8xfl{^v2o0)_gKqqaiE53 zwdFkJnzLQh4Ep<pMxb#{iAS4l%x_WV<GALB=i6exT6$`B+rCEgH1u$m$J76n(#JWb z4G8Q>56%;q=ld&sC1=p&j5`3{qXfQx!Y+JAW~M;wh$p<|rEk>JoJ;O=>w!;xc&@P) zn}|sxun%kC`T6SaJc!*h1?-|uc$c|-;>a_EdkY(A%wy+}z#8;40?l^^`{8#Z&>De# zxJTv+*o!UXfxX7_p2H^g$~DSa*;T-Q;=V@Ud#tH~--r0V&pyO4I?>0^@;RoKgU?w+ zCqB;-7&9;Sh8*E1F{{-zwUTqj`bmOw%(&Bf<gu+6dF<>(KHndm?5X)f-s66&MAza$ zyldy!Ih>*SlLS70I(Mvrc3!&4na{v1ts{1<ohsNyc<fWNvDZ7&w(nSUQeU<`+8xK^ z;R8ADlqY<~Hv2qUoz?P6{cg&7;v3iZS{JMbz2u(w4+yi%I_k|fkoR6~AO^l?{T!St z9=b-0KXvH6JH>y#<hVCa6lyg|z0}T)<I`v!d%V}C_&F#&K0nJej(1%rpRo~p8i9sS ztlbo!tcTdO>FM>nVk2vu%YKcCZ7(&(+5usXKuo3zZMDE&?CCqf`#4wlwyMZ*2G<M3 zAG@eM<f)Br<kw1Wsc?q^&%TU#*s#{Na@Q{q77FO4;s2n}mUnDyi$8hqRGaL*NMNtF z&*r`ACNBBD!iGk`R>z9m3<<=)Ew;#5p0%r5<f&(TXq$KJw~!LYexk-X_M_P|MSFB( zPg~r5U*RwBFH_YI3iAYXv%h_5v&HjmzK*tcqdjQoQ3%HUS<CzOWMPfKJFCwYc8$mT zoz!f|0Wtf(`W_qo<X&j2huV3o-AkR;Bd>DY5LfDAG<js=S!lZ_IB&H(h<e~o%V&R@ zc)JR`Z`SIl*LOAc9uQ^~efWxA+fEIQ_xmPii@IbV?2Tt&UE$+5pKZu(pMYJocsHyN zJzL0UX>-J&Q@*h&ezwI{;^r7q3#)|MT~3~B`Hy)f{y9#)`snB5Ea@Wd*hp+`BRux0 z**Ml3-LdH0oS!SA55&Avp7427KkpGA;Cdu~u2o`KtJVBoKUH!u?wxF|)fTnk_0(3c z>$wx-`d(|3_0()rdh5dfPPPy;VrO}5AFq3Ht#n}%y88v{-8q8qaX0zmYz+u=1biZ2 zZGO$y9Pd`X&+w0&trxHXTezQUXB=B<cf8|kn^_;v|1#0K8aKpow7O>>&M@!PlN5B{ zw^<MQX!8>t_|^!t`2sey<q!Fq&*;c{*mu0{9(3dDrhG=i?g1g@f4uzcHNKtdYOQRn z#h7}j)s^Ft>yunjUztxV*(1g>K6iM3b&Vq9G5XNe>AOkZUmRoZaQtYC4YkG@+msw| zMttvZrdJ90mwj%lTc640T0?9H1%H<Ivp=3m_P`(8-nJilvB5g#YCK8k)z`7u*Jjgr z$DkHx$7QsfkHy9q&pySH+G+&i8f&2K&f)yj&J}T~oh!#a?@N7f$5IR4mpUAaPqv58 z#r*x}pfFEBUt0{Zi!;gj^8RC~E$7cQN=(-Y_=V5$J>7P~<L`g^g+`#+2G+INOpLjw z(BtP+qcP3v@u4k-_L=*l8+q<Go{N*E)X&H%8nbo|e1Z72)rxH;4(kQ#1D{<JjmG52 zwxF+9UBnt4*tun}bE{-0@3w7m@p)^TcO0e${nL_u;?TC9ygBzd4*6VIj#}PP>js2* zLZ`DqJRL)s)pHDEKB6x2F%)#mq^|DmHh(!Qpb==qy_3CbH1BxCxKUTNyM}$aSK8{0 zIX-W2@6d=DvF%hFZN4~W+#x<sqvfd^UBuXSb;@}+x`^#~>7o|KOBZJ)>Y~P|i(1}@ zZ@eS$X*79>Y<LGpcD_K4cwa<UZLhXkBhIy2qb`{{Q&=g)v(hJ;=662ob)A3=KE`K) z>oq<TT%Xv@nv;a_u$h{*P587{V1IJaFXVm4^ZlAw+1K?N$7ccjMj%I{*+u?3<<W7j z-5dB@%O$z5*@n$+@BZY&&tT%pz0wHyz#8^~SBow8O(!2VXD#BBV>Fgp>|{4S*W!*p zwYay{1hUL^bGDEjt3T9IuV<^*XAgc*D~-U<<xmfOLapX|&4<qd_bGei`;)jJQ_G2C zR?Ev+&V%ojny;LPM&NAVH+7PI^*L+12l0{Gn<ljRI#qLRzH;VjzB&%I^G_UX*ZQ)) zUp+bHZ0C62Lp=6J7k9&K0p6ex<1-+-5n?^?eE~dTgzj35ka67n`C*xOwD|)5w>=w~ zM>jF#nNo`({?_7$zqQ!eUwrKo@SFGWdrTU!bAiUhkC<WSM1lIBD~#pr^=ik~UD~lZ zVnQrxKA$LlE%x|Ui@jq^T(^-wStq&dRj2p=zx<i?o{ANBHF4WkW9n{>K)kq1Rtb*7 zdX1@X>U6X`aQ^sg#?K-S3iAYNc}S?~BY&KInXsYu8INUu_KrDoy<iW2cRnE4o;LmS zC9{Qqy*`VaOK8uvt!;}9euGA!p=Yc<;*;-6>>JIWHk*8I(1pKISEuv7R<e%kdW~Hd zy*~H7KldMX!ktcj=$%6ihkYgfwvXpjukrU@vChULZq&8y>ZZmg7x}sB$^S`0?M$o@ zzZPS1+4h`ajyn~^_{|s1zT>$UHjwYOy-w6z%`a@M`9*%vXCJct#Hv@F=<>S&{`U#k zgzY>dXvAhLx?N8VO4P=x2YWyx(5z=j<F@!^dCmssmHMl#StmaJ*W$ib{8~LZx5RIK zk?B{zTByD6u`jx)2hIbs$oZZc@4xHmwHB}sGy?4(alSJ*eqPT|Tn2<W!j=N{(pHDW zk7vdzfw<;6;e1dBbA?SkUpx=2i#l%0JvCdaaqJru=&5yl<elfAWEgfYU@TCx`Ce%A zAOFzFd0<cLyw@l?CrY-{vvp0;m*a_VwR4J3fOCgW_a0?`;<rj*P2R)4WInz!$NucG z-6(r#x^<6Q++xg$&yY~FubZ`-;#;%>A3E7VJcz}8BpBCqvY#B{m%kJ9-RRo(o~Es9 zzSe9Zbh5{~koCG+46Uo}4B=Pp3=w<y)O;gAV`rb>`foI*v4?%B+0ZEt=wnSI&^EU} zjrOoF+*O>9wm3U>W2rIDl;3F_vqrorg7eMZo$iLUny=+%jrg^@fn0Jg<nxRyG4`5h z7x&;Yff~Xt-jR9V{@=E1o%SRizWe(%#;%<N&d>j*UBsMtVH5d^?>N|pU9*H}SKIlb z_G>vLSI)=!GR9}`o$Dumj^TMd-g{!tasht_1!`kJaJ`Tp*9iMlBgBVT<(i{L$Kp3O zG{Q_F@5TPLz1E6f+pFyvI@&qOu_qplfX}vRtY>7rZNiRd(@COhG3t~L*3T7)Z`)nS zotfi8O->cOo@c-+p|(FUujL56ewH~leqJ`3n<iL4_HBxO_HP9Cj5<5j@jA(}Z_RdM zT06s|)tCKct?yrYY?>#K)3M~SW(#&Z_S7+VSKN!5#(#XQ<*nDV#eV4VIp%Yq{qkPa zOl>b>jqkNsGsj(1^N~61$G?0JVL$$6KDEYOp83dP8@d4Y^Svf@$UTS+(Dn)bi9*dE z$35=>A0B_NgWY|CWgCrYjvwQA&XA?<yq=iC<IL<PK%XSk?7`<+Y&W+(ZSm=3Pc6@! zTkIz<#2<gDmw)IV`7C>Pi;rtM*FSdhS!#PdFvzoWN$s}fax`7j$5Gdean!ZLIO^JQ z9Cht9j=FXpM_u<FM_u<DM_s#&qpq3bsB718)HQ1yb@h#-uKtRyRk|x`&$v$a1kVmX zx2I@49y(5z9-iSfTX;^lJ#X8dZ)>%NIllw*tmB={_vBoSv7LRnFKhdvqnCY&8G5*r zXDil?dRjC5=ZG%m=2Ygei@CX#Ir#I$r{7Jze+Q4>fANubmqx%Ra<jSpn_sb$SYhLW z%AEaMSeawZBJt@LtG}!K>-D+c>5TAB7VEDO&EKOtH`IEs=Z4w><Q+Ymat5O=>L=<t zQ8e@UeWUF?GwR~^zHf@Iby`nssD<5C3+%~wiN@%iBQVeVYOnEge({T+Ye3JSFi+sz z3<+(1!}nd{bB8^gGnv-9mOYW*Lg+@GnsS`IUnAbM9@b+kYuG#P*%q&E<<?3cx!5D* z<^Cxzo!&j|SFS7U1=#A(V9rS=n~4=bU;GS+jeE*2^ZoN|jrfiu`pJK<weA?~6=JY= ziosYuOSv|QfqieYt?k~yHsa{I;XZBzde;FycY4;g<p}$ji+36{&(vAMrt0V1a|X%X zK8mN~{D4Yq$6`M*BR1$?DxHmbS~L9TozLcdD|4*bPkj0Zs_*vsG}c(hSUgDkITjDr zm^jZ7&`q6fYApU)IveSsHN$`28H@cZbHv~P@#zm#|GycFM*BGy%QPO3Sk%tlSYjG; zc2KZ$pkn7L#g1Cc_aL?ml(|9mO&R-aNmc7J&v6-)5a*KoEKhrLH;=`)PIhr$`)=SJ z+jmdxZs2^6W&ar474pfxJ|y|KmGrmWnb@<9kYnyV`0r-$hv&7w8=I>!XRTMg*vvZe zaB#@UAr+hX{hEgsKKo4+h|?6o_N~{LySHChBh-AsM`U{S5uaJxZT`l~E@DJY5~GL8 zf9LhE6r-t{?=}98Tg<C-;`ajf#&_4O&)KHt`*7J$Jn`#@<O?;rxpV8dW<UA6KzyTy zxVPik<@<Wa0o#`evjoS)cgN<){lh};AD-ex?pF!UXFLb1#jl+M_{bCgM@V0zp4JTi z`M2*e@bSyO5~CrZZBOeyvPC!hK2mdzXCpf5*Hq6wvFBO=f3cGsa!<_=*k_)=9w!Pl zyUA%SR+f$D1id>7F&@3@r3Q&3v3Qgm_IWr;WAx4`^PC6nzm<hQSL2Do<~}3QN6rEE z-Ie#>qvb#OC0>t7G2#rg#lP(g@JuG(jWAt^xokU6tRXJD26>s%^WTG6&or&|J%cUQ zO}!HHM&Pqqw5`og>S>BVe2$h;uBT&Ctb9*VSFY{#8vEHvjIkv@BhgoTc1B-(e`0&| z$38aV+n-)*3cG9et|@zEdx-}=5|3jQ1J}-DQ#_Cv5^B2b8@4(JTHY$}d$o}aZN9)+ zZL6oY+Qb&n2sHF`+7~<V^KlYt)YH6on{Ui-A@ph+dy(5lpp9mm_i3{OeS-r24hZ;h zocti43k06K{X!$q?AKWBM*s1n=+|^>jyVU|%2}oP8D^R~p<Z(SCW<#y__<bBx5&4h zb>wSjls)sl_(EGQu<n_{N`bS?bLH_8V9g4l5wH{cZeXC+4F5Uu|NkQP)J&Tn<Z_y@ zNTB^V{C{KM_YZUL%we0Jws?#+=S|p`c=W1=_)w$7e4zBsH?|V5`2Cva;PX8yKik2& zIl^RtJEvD0h%L28-l#ER*$6c9f?p>KZTBSiA$!;AW{vo@yB*(n=I46F7W8;7z8f{- zPZfOUV{`mjOXgW0pK&6Gec<_p55$L<=Y2Pq57;_ez%KISd}F(RuE_Cjvz@s2dR`sJ zMr&y?kL0QrgEivUa!9UfIrJXnsu7@lM?urrm;Hu>+MdjF?tAqQU4Z@O3FLRQJ;rh_ zh{tjP{|5zpC6BI4e8Yyh0^?r&a10x*<sB#LYV(JD;Cmy`h~Y$`*S#IXMr&#4nI!b8 z2OqG>HR8YDd5Cy(gxv&cnDa-B*f*cQHR6q>_Iw}uzNqcZnQx0FK5xpq%5ts0D{7<H z9F145$uoIs1X`}cvDObdoy!KrYOcq&+_~<WVd*>1L7P0bXM4wTZsM6`YumZ1=+Cu1 zp8JmWoNn`-b@=XgN@!xvebX;A0u5ir5)=D~Ue03H+lWVVtj6;$zz=*|D~z@`_fK1l z>_a0N+E`<OEuax-_Ib2@YxO^tTu`6ZHP&<G^~9tRXpRSd_&J4rH5&i(Ibi)*p7rDv zeXd=6Y6NuI4)WS|C-S-Mgh?ayfjsXEo$7%2VY{F4eHs%F)_6au8`FEX<LYy4pBm|# z67;jzDxnrfazYGpd~@C#$?)8@&FE~4QJYTq>=QqOShf+L#`CXXpcdmq+|~$Qk1g=< z+3y5x_K>qDRC0Eb__dh$KFcxL-1hfs&pO#ZRlvU?`3Fs2pjU||S91!F_m;N!I0xBZ zYQX1Xn#SGap1n`3#Ck~lTC81X>|^~}-g>WE-gom{$s#|N`esjj<~<J`gTg#viqK{+ zwGr<RpTTZypRcvtGw8Ow@4Qa2LB{gfxhZ*My>(G5ZGKV{J_l|03c5P2$EQZ%ta{H* zYdGIIw$O2HTb`*4@`wC@&<NCgH*42Qj=DWb#^E#LlQm}T9Dz9DLtES(r+j{}1zx=S zeMaGP52DxiSii=$mpyyk&$_XHb@1hs<V&Z!pch}LeeR!VGvC#%Df`XUST1goA8Ugj z>neV%l77c|y~aF0h$Ho2yR@wJesJzj4f~vy_8~_n3AKIN;>G^lFO3jwA+NpaBCk^f z@_Kr(^NGpMPI+bR8IpI65Sw`d_O!*2*x<9zKlvuUF|NJ(LM+fTP4IVb?1SFgKAeq4 z7>^ikDLusDNg;+$uEcOiGPPXWcE0P6F=#ud+@aJ!?Os5CBhcmxGNbjJwCORw(OOzB zI*G$mv?;NVwb14}du9C-#Tzf*JMEkOY_u<JzJLvF^~<`^*0$BJ*X7)C-kFQ<sf}pb zd|@nkq^<@9;yWOWw{C3qx$W1u5oorzE%vO#CZ9`a>X~}UddNeY9^z%+8jWe}&6-ZR ztDPNU1)n%I0&O%uyniz+edpfeRl6rk?_>cVbG@t;uja=Z@ySV+C&vE%aea{?*7(4^ zljYIlcVXnvxxDbGDZihxmY78vUGd$-bN=_erulmjkFkSw@iUy~;PWocJ<DEmgsB4d zjaRIxvH1e;(Y$Lsb<&+QbF~~$Gq#cV;=?k5hAx@hTDx&A>v~y>tj|nath=?td%Kou zdCR(bjX8UuzuP?&`r#ZrE##onS)f*}d%ecgDm6=tYG(m^;Cn9nObtYzIfLW9f9)({ zkL!uCeaiM}Y9srmh;GYCtTW;PqHokFzHzo{HNH-K{I@MJzQo-zjC}U!#y_vk{^j`N zA7^mBz+BsTB(M0;2sGsJZ<SE<jo8HVGgmaV*CvntS{%@w_eD>ycDChky!MT?5Z^Pg z(=_pdCU$>Mu_kuWW{=6G$8GuO6qj1vtd`E4Z{oJO^S8P8ZL^>AT&sKR@fluU#{KG% zhwt|}Vl^nBV?gj7#~tA@y1IG(qi2pVMVKa#-?kjpY$n(6R|xF4K;Y*eu^aw!0o&OJ z`>@ydlZL~!G)evcZ~O92^mI8sUwt?CLcCY|w5AbgtRKr+iD%S#bzZW5@-rmV>LTi) z<{E)!yV}+vyE)H%r}vAs+S@*_*O>aGUe}Z{v5tIftv!G7oi)t)Z1Vo@GdPy>$a(R3 zME_{-5}ezbFZfuyOKflUkvpdLxdq>Azi-I35NihA@n^GQEcmQ4Rj9=VTlhS(mHGj} z{^QsG@Ba6CetMNZQ89KdbIsT43R%zywE4m$VZ8L*-R$RF)Z)OosGTq5;rl)yRy_OA zF(B0HA6=Y*PM_5|8}V+KCc5oAG0tHxHm{TXWC2@kH-5x>4WDd#xAyW*z*$E3RN=15 zEq93h%lF<|&DCN>4BPTsdlnFr+WkqMb`=%~<cpvG#D;5h-|^h%S?id``x3brZ?B8@ zt>?L0@xe5<bd#ekB}Yxp637p+zy{mXXiS?gAdCIfNRDBz_2!uHyDQKc_sq{s`+|@6 z5H{6E)+_YGK2a0B-dnY^;#!GuBe%qD(q`NP-QHtW8M80v48F&;oDo;}jX*=5xbzwi zbYwl)g$=cRZC9`Rkb9rgcm^8rrwYV=u0T#l+q<ofiHY}EuQBJpU+~_I#+-v*_Ud%^ zP&c*xu%mYO*bctu?-MvH{Qb}~6mZTYcMN9<o0kdX-?mQCxXthJvg6Dy?bsYKAr>{C z$69B^^_lV~>+Gh!IE%H~Cx0si?mya~aFjr9XamB0fpfU8Kn)^$tk9;DTB+5LYlXVt z-5Q<jH&0-{A)#g?`%^b<`)!I3ZF{2A_qyv<p&z!<H1@ZxCkCeo#KC_D)@Y0luV>um zQ(FwpM;C34&}om!n(wvVoP&6$t&<*fjkZ^tKg4rTK=**q2<VHk;QNPXDJbTR7T=oh z)RET{-(G#s@m(t&+2^<iKD6Co)|KB)+Tx4e(e`SKFMAo>(~UsmuHZdA#$+@d*nrJ3 z|1~{re!K3o-?p!&pS!XVXn8MU+?K~qd&Rj<zM!AlJ1f;*uX}PopDi6R@1yP8>AB<D z%W=f7wr6q9o9{4e@|sRIQG;#u;X84fWMVxHiFQq|FZ=YXw>*6}^4RE{A&-tmpv@O1 z3T-)It?Me=;CR(^j^&QPpEUyUY}45m6YL~bjX>KJzwoy~i5hzFWpnR~?b-fL`(hW* z?l!wzBgi-w<9Q}lOD}gzK11xA&kFHGmhTIFMl>9@tJAq)k6P`)cRiyw>m+WRHT-sr z;<$FE(3#^umUGc-9^3Y9yDN~d#iZAL9gne``&xb**+uhbZr@8h1KMiz?qEY({CkZ{ zukruCx^J&><GvUah~Iz^-?19eH0s1>8o7Mu5X;(`fDbz9<o)CvDQ6Gvinezzo=a_e z`1!wHGK~8L{6e1lX_-J{k8aLG+j&8!-#gI7{WO|vy#G7N#vC+7cei^ee8awVV-Nm! ztCwd(x3XJyA&V|Q4{CKpd`}g6i81e{=PCfy<O0Fp$)Ka#xI9j>#|y0KHa@I*YFX25 zoLKY8vZkAOjiuhY^|=>ck?qz;WV`Wgv|8wPewFsC)sok@&9BuuYUkMs81FKS&(oOa z<{W`Kzz^=H^Tl7Ip1FAfF@}GE2Iz_WA<>=exx3Hf*M;)S@q>O&qMw`S=Ouc5qMx7W zixT~UM87c6FG}=_6aA7zzckS=OZ3Hw{+B=xjgmj&@$w)K{jZ6>B+;)3^iYfb+F2jV zvz%vMBlx+aty`Z_F~^q%8}aFtiGEe0UmfTn$=7QBuJGv}dv^bRMyzV}a#Bk^{h2Sn z|5=akL7o-=sENOQkJ;Skd3DKKqu%GAcfz)3Ao8_$YVtWC@GPg*YGf=r(T82*sSp3| zN`1UHyhe8+_g^D)6L;3Uwq;G*x$#}iyvO9g<2HVqOt11h6J9sz&i$ZYpXfIv`i+Tx zQ=q%CYpBJ)$j6S$f?nu1C;HzK{gyxvNxt^%igE2U&wl?N^g+Kh(Qixi+Y|kcM87l9 z?@IK$6aAh<zc<nEOZ58_{eeXPN1{KN=np0OKNJ1oM1LgFA5HYf68&F^{&=E4k?8+U z^d}SjsYG9%=uap5Gl~9eqOVBw|0McziT-?|zmVuJCi+W>{&J$flIX7{`fG{)dZNFP z=x-+a%0z!F(N_g}sO9{u7N7To_;YqXNAUPvvV4}BEcE(ZY|}j;UEHnTmVNpA0Dngm zzay}HwuSeWHd{t}_i412#=W8K?{<2~lkYU{Ugu)H#{SNXxVF6y_!%pa4L)uTo!p<_ zQ2@uwR(xs%8am0%SpE0=P$L~Q>$|(v40);LxAxg+G}-t*(<V!d*{>0Fw1?wD-xe3- z+v?0QcD-32d28F>pGRziM2CNl=O6MT--Wluhr4j0K#pm|-0>$zz8|@x`@$T2e$I(| zb3oWl;O^X1ebYPW!$$JUXH0D2XOH~+i2EXkO~@`6xZ4H=Y(|bf`UQN2&ph(W1RCpB z3iw9-xK`uOI*Gj@PUvBMBhZK+_F?B-fw<7-3&b(o>YAOYIj@-%<fwmq!p=s(F2^8# z?p`E5az78hx0&z4XA7(a{B99^x2~xg;}`bY4h@HGwcW(X`yms3#V7Wp5$h<&I>%-i z0%}nnJ=p(fVGHe!EcWgy>@JY6b;4P~^M%(6?-V{Gd{-C}9#zKbhV4QhzOgs)oGkeF z18cY;XT%V@S^ourhW&d9js-eQM?bvozcf$759F|yzXvBq#F#oDckJ;#fo7lG<2z5J zN%|AN0c+U%C}AgohP?ejzxQIEy{OkM1seO(*q0neUo(v^?^p8yzZ(Jj(1R>`&lYId z>6&2uB7yjv6>5-qY-|Mb!TM7LnqzE#ENh*OWU!evj~8gH87<Gwm-E+X4e^PwI7~E+ zyt5yAy>4%fvrWsy<LAw=Wq*N2UfOKIXX}`zF*LEU&wU!RZzFIHqiu6V)2!cX7Kw+B zoh$K;F=H)tz`jv0=ZhBg*4E)uT*scKktb%v$}wA}F^%&*ad<RxuA!i}FT54%_Y@o# zbP<=VlQWEsoTteGE#DpJA%^&geV&i^tJuSL(qi@40e*D*9d}%<_)XFnABgo7!RwHr zVT0|A=L}nsVQnK|A98KKbDw>z8#@6ySQGzUik~k&zucwR*6n()>sAjx^SqB7;TcM- zxkIRL+t+A}pU&x!#@HM`&#@==wfS$q(c}H7E$>I%dEdWUN;p^Og8r@s#MgITpT?}i z##ak8YL7Ugi=MeB3fS+ujB}h>&mqg+)HL~H@8<|Z!gj(mVX5#v+0m${HN$_7*o9u^ zuc^#q3v=JE%u!R!U0a#s-yAXbgUTE~x5eBKHRoq|%s26A1blMc5U(L2`tzfTZrl6g z%AD=Jt}<tPe^QyVy+74lul8E+^%cFg^=Fki?lxj{LuHPi0b%avJ=il<@<W34-dNF# zJ>&uXeve|GUsPlr%U@RJSaXy3^f#;THfB82e8#BlPG{^_(i_j%uSK_=u?wY(Ry$*l z7vJZI^#cNNSSfIJJqMl7*lFSo30{Z4zmXk{dRjC5=ZHS$ep{Jy9Di4tbM4$xnR8A4 zUUS{XmwRAHaNXTn(QAADP?@tmf2_>eo<C`BtoHo5qSy8Mm&%;a!C!mWlV`$Ei9xN_ zZ>#L%nA~2OBd<Js>A8Hn^_^Ox4G7$ABk#`r!|xCMqT9gpt8H#P`9s==x^4uTpPP)a z*>pUwoE6vB7K%k98lHRK<qFqE=iKZ3JmwzgE9)kzAMJU}`c68S8%+l`u@^O!?H~>{ zete&6)6X5oyA(DYE5vx!?l)=yS?Xz`Vu)VWa1Qzf?mX<YzkY5uh1V&@+<(5S{Qd!r zE<T^}{y-zY)O;hrvrcN(vOG_?A1BF1Y(-xq(C`yE^iU7PZke#X5Ou{^XllcIPOQ6z z3AJ2rj)DDm-Ayhr^LO(7TH6TNzFNQ*uOYU4??djfmG6DxGpKEkDJ^?U)B3hOw4}NR zadNDP<CYS{|Ko&Pg_Q!aCDvP|IdV26P!oF!G~Xk;YmD#ocO|s_u-_wgZ8hNt(cHlX zw4veM-hSIn&-;9&$pz<zJWf@v8uheh_|K7_%k%s+&F8btI~O@ao_h6Jk?3%XbUZt; ze(sTKB-YQ?X^#52OrU;F7~bK|_&-iGw$R^|z%0%tXTUYYS&wm_E_#-*Nbu)+d|E8f zSbwVEb5Bpq9MAYH#@FMEEO8%A_Nhe%9iz#9vdD19w8{GX?k^eQPk&cJ+y71cW9)M- zV*I(sXvClQqCNq?CzU?uU`TwQk8KqEMl`J%{&VB=b5G6pdVa|52Zi-TAI~H9#0T!% zn}rL7-39ERdCj>R>uZ)fPEn6v?0uwwFS`lU3XQYBZL)2ic*yz8PSiO1`cIN?#G^IC zf8O~Xb+5|Y8p&W^r~3l^*mCb;3(rG7JClP(;92GR*VJ(1*@a)oQqRs8lkj;~5~~5h zKCw?;gG?jP<_qMRhW>8$z#jI9aqV{Pq)k|>P;IoY^M(BYzld4CKpoSti(EJcob6iN zqFux`>(1-B@2E5H<9W_k-apHcr|1hd(UuD_{>We}>xuU=fi_>jU)osK3~Jpe0`X#; z_4|&%7Umj(hCDU9oeazVHsTXQuZeNNU;VcsciqI7z2Y9!Gx4CY2k<=nT26WH5VuZs z+P0P$jCC#Nc&ux=^J;5H^Obn9&gWjkuH(dAGnPF$17qEDYRjJ8<dvM&?Coalq)k{G zYZx0&7Iu_Eo<R$ReTDS`p9L2Qv>WtHBEF`-mFUY8{hma>HqjR)`WcBnG0{gR`oKgl zPV{{feT)A7BHDjlqQ8;o4~X8j_{$x2X_~(<(Pt$3xI{lZ(Fcf*`j?32doRu$=bbo{ zr)|@^8*aPf4(b&-_d9BgJT)<0^R+p2o%7d?V{k&E2Ssl!xy1rLgI9j`jyvch@5kb~ z4i;(+`$b=F`^yNAI~O_De_y;9|0@&ykwm{a(Jv9rKE%j6&q^{YL=zMCMV7eG&lgxj ztzYox5g&P$GRNOh(Jv4z^Tt1IZ0mWVk=ZrL64TXXZdRE?2Vm|INzYQz*vC9EnNw(V z^WI9oL|~p=e&r7%`|_Qq_qXngHRt^AQP!~M`QpbouSxWgqIve+N5SB{UnxLupXlkL z;m;`j4yE6*^gES)=hEL-{W{4%;oy;V_bdEeN<XvoyQ+`&^(Fi6o#-tR{hM1i_U}iD z{(7Q6mFTx6`jv^kDACVK^ofanSfck$^vp!hNc4n6|LOM|`*&TUuSxV3iGFXQUzO-5 zC;GTVuT1n2iC&TD0}{P7(Mu9NFVQm-JtNWECVI<6-+s%+@wzq9Hz)e~L|>ces}lW{ zL|>8UPbB(7iGFvY-;(IpCHj&?zc|s)P4qd5ep;eWOY}*JJ}%KK6MaOYS0ws?L@!PB zl0?r-^vp!hNc6Ue-ZIg*|1RY}(Kjdh`b1xw=x-$YibQ`R(H~0myA%DEM87`KmnQmU ziM}Y&7bN<uL_a0b>k_>x(T`2^qY{01qE{sPz(ntt=sgp?FwwIUeZNFcPxQ8lo|x$0 z{C4Ad_+g?ym+1E<`qD(7o9NRMeRQG^P4qsAo}1`@O7sNLJnNq?_&wpq-)!vDm5Kgr zqTiF~HzfL^L_aIhCnkDjqK`=QibNlf=%tBXnCR^jJtfh%{d!~nf1l`^68+OeU!CZ$ zC;Ib={#2qrlIZs(`fZ7RW1?S~=$9q>`H4O+(Pt+5j6|Q3=o1osbfOPW^s+=hAkhmF zy-T9+Et;DBXsFpO3-4or_m^Ld$bCHUt`{%94}Le%UrF@kiT+Tc|2@%{Ci?k_erBTA zCi<8}ACl<(5<NT7_eu0tiT>lw8~gwBM1MEYUrh8z68-i>zdF$`N%WHvy(ZC*Nc7S~ z&r0;Y68-0!HumqvL|>Wc&xod$Ch7x{@4vSsnO7B=$wB6<B=f{XACu@q6TMHO=OlWU zM9)a{ZNJ>u&u=FBGl~9iqTiJ0ixYiTqSuKgPSZjRjx4-;1m1pyw{_snDZCv5?>>dM zW8h6JyqyB?JHHs&cjv(SXyM&A@ZMW^_Y1s#DZE_*@5zNXGw>c;c)JGPio%;N9)9<g zIX?5wDRVQ*Tz{CGT;}kVb+g0VO*fACVxFcZTvvE=iX6PJ79KvMV_unK?{}3sd}nUA zF!!P|M+}&oALgD`=FHR7gi{M|L6L*^Sn=ZhIFRUl6TNGqw@mb(^$#7eWsk7O4-4=9 zf%nP6n=2mjdzCqSenpuh4$SQx=1$dIwD*J}yHAl(H{p;Zvwx9U8f5yC%=ARxp)Vxk zKEF!z4T=7dXl&gx?D6Tsvv1h;Z-r-{;H@pZ=)?Bn#r<#p*~awEqS<fXu;0fEZ@<8M zL0b3JM4y=Ghb8)fiC&QCokU~Dfnm=puOHzxf%lTaTNZea5ik09P@?xr^sGcrPV}#T zy0N|+5`9IY-<;_4MdQmugN+YQG7n1h!bESM=*gndd2G=6yPs@q=Pwie(?nmJ=+7nk z!-;-tqTeVQ8-{`nmloctz<XX=cSfR5Nc2M!{oq6|O7xsW|KYlg<M5M2e>l-EPxK2D zeR`rFljvoMUXtkhCi*^!-X_tv{&*y=r-m55RlHc!7bp7sM6XTsF`~)UBczl5$wfE! z;<7Slo~9=3mey~R=->TlV|#v>=r1SwKNJ1$qOs$I;NvAp=IlhDT-H1<tXWxjCk5Vv z3h(LSvB$GZ|AHdJchvVOGI@@8-1fr}+g1mizbL#lf%nzIdr{#1XW^|2yf+oz1%dZ3 zg?C!uJ-zT=7I>!?-o=4;WZ|6=cuNb<K0m+A;m>`_T+Hw7KN#`xlAz<p!owfpc4^RY zWtlTiQxh&Pyq6UDR|WZZlsWT||Chphb&-R2e&M|)@Xi!3*7~VM=H-&XuGbe?e0y|~ zJ+R2WA?RCDcyA26T?+5qz}u$qE(^R{t{sWf`GNQC!n;U3?D^L+hdu8sb1~PiF1!~O z`Bwz_CziRl7M{8ZD+>=l(f{@!zi*i{5BdJWTVLeh-MjGKBmy1pDs$L)%l9{q?+v1n ziFN#g!h3Phc~x5XnMA)m(U&Ir{6s%VH2c0I>~Tcly)*FkEIilcyMr$~mO1k@HR1Ma zHumr4M1LpIpG)+I6a9unKQGZ|h{liq4mKZMc<&3m2d8y=Bzl`f|Mq(u`*BU8za*M{ zuLyhmN8x=q@GeQ~E-ErH?oUZFtBcIXf}Z6`W{)DnS;LM`l>Sp?4fpIHzB^*$$IBcs zLiX|?^YJ3%b()%RnRxLII49Ao6aAP(AC%}F6FpTlc6_<m^X*~}=i`@GZ@l-{68+&s zzcbO7B>JL6pPA^PL_bnAw*8>kL_7{EyjWv%3-4>ihi{htyQTk$dcKR$UtLbP`8y*z zV~oF3c;6`U-zxo2%R2J+A4SHxG&SL}!m}K_7Zl!S%UXD=3-4MH_;W*<BgPLdbLJtx zXW@OW$ibUlcsB;#pT9lg%YTW7-s{R7dcR-hh#hk`g}G0ZxgVCfo5S3z${h9J?{A)7 zcvlvAVqib$e_LdU?*T>jt6_bA;ayeMU0>#~^Ny=VeE52hzozi;75%pa`S+AL^E5T# z-wF@=Z1eLA@7BOOt?;nJa*rsyUx~+Fe=2j>wy?~7C&*7Pygvut7KKN>S?^E2HR4y? z>&u0AO^|zU;W<yg)*N>50|@A%_RcCY)Q|NaUwA(%^5lSZ6T`YiMTR_k-L{2?pU6)t z^7#9!D@Sa`H|8dXxo?y?=T0IM{;TlfnRsL2`5r;;!os_{=>4mD>|xI}W$tH%hx}26 zcU$1CD7<?Vn~>Y5@bDRXw+Z&{Qs&G<ew)I>FXXok^0$6-<Gb!!(a890u>SJGBj%3h z+Y9f<fp>A?`8=}rnT3b_=-oc-{kSscGm89yg-87&zg1bcLs>^%-2ROb8~;#brWTnU zgUrW^48Eerb0Q~PTIO79?0bIUxsKqiE4(R1FT6(;-j;#)&xMDrj?bLJ!#4A_DZFWc zcgxpDe2MwJrtr27a-S)@nAdj}-aUid%L~sr#^$pM@1KI)s=~Wh;2l<Y_YS;$3U9l> zyI<kmC-5d0p7YDTKl|E<Z_|U^7Yc7i;JvHxoMYC$wD6oacux-c$my)2L*0afgI?zP z!rU%pZi}$zbzdE^E#~{vh3C70JufRf-wE)}EIj@_y>okf;Vl-A{g;OQn=)q}Iu;dP z^m#_%#rpW=SN^s>E-$=TA8#tWSRZE>UaXH}3(x1`0m05CWsW+@K5S9uV!d4T<q_MO zq65D^DqehVdv}o;2r`!>nTv|dgUh}vimbW`Pb_ohvB!~V{fb2Io9O!&9ft-Rb}PJP zWzWOHp7&1c@A%TjKHZS$ZzcNjME_f&&r9^`L?0rW_&+k(yJz7Y9C-a{-Hal0c#!$l z7dN*3vx$C>X!d$|SaVvEIWEx$Cwi|$?~v%*zp$|lKS=Z^MPtJ;!G`w~-kyQ?io)9~ z@Xjr~y#w#a!i(qgL51gfr;hr?i?zB<qNkKKYlH5;etzRMzfSa(qVeUVu;$ZA<{d>Q z=IN5cJ0+}pPT`#_9y)D@$O)&FIrH%6;KExMbo@W|&IG>BqdfPP<k%MBLJ3(6g+z;G zc~9abhJ@f8M~WR20wE#JN>usi*is@(Mv~(=Km#~H+R_UNP_{0)K%pgRaZ4$sP@pYK zFSK-HY3W{C+EVsQ!%pt=|IR$pd&b{6I!+At{_gJ%Jeiqy-g)<#?>k4fyeZN41=^z$ z?dBwRI<2W&@~?kXw;#Fa+#lB7tF;)fcO+iU6}+|`IU{M!H0(Pg(a`IA^9vt6I`_Yk zXg37DpG>rylCHV5rf$jhv}PK*emv0*1R3A@NL|-RpnX`h=+pbN`8(2{+ryq;Otg4D zUz%vo4t!IIc6FfbO0->pwl&eN3AELTc5R?75iQ#Kg%3B*Kc_i)cwX4^*+l!<K>LG4 zdvTz>Gn4h&#4{CmUYzmVns{6z#Qpk2i~253w3#4lW1_tx(4LTJFBc6z?oMm!mYk5* zOheZ{e5mg4Jwe7NM2j){?Zory!1Jm^drhDn%=X=q%}3In*M&XX67BVY)}QTrY&L&n z+Vk^a&zJwO?#C|#+NVW}etazPyfN_nbjEXgHXloSelhHMQpVGp%^#EY{15FR2X9Y% z)h+qfAJpx9Q(C((to^yxqP-tZyl+W7<m=}W?fyV}NuvE)pzTYvUk|iv6YU*=Hk4>b z0_};3_8Wor$V9_le0pbEQ@7-kzhCzWn^^m;u=bX;W*R=cBGIr7{@)J#JJK39vi9z< z_L#J08nTuo+V3PjXkYnY-JbUZ+Gi6DyOI0eAoulY4I5c|Us&6%wV0EqXY)!nKR=uI zYL3j`PcpIZ#}bVi@E!i$4>aoeistP5P~iFdMEh`{{XwFAB+%ZPXm1O&I}`1X0&O<Y zunk=wOKa+uJSVOFLEt}2v>1!WXY)s-Js%HyzViOMAAcNZpAjv}`FP^_lfd)4iS~&= zdsCwQX`nqn(f%yZ_9oh&2ild1_7{P+Ez!_{|DQ~2>Xvk;HFUA|sj&9fzgPFkG;;c( zMEi8&gZ9ou`%Iv{DbfBa(C$vOzYetLCmK4?|2Jt(-IAxIHO?n%zn6OZ@%M?B@6<l= zzQ$PpPBy<koBwh)f4%1D_-K-eUxyOyp95_?+jm9ciFJ8FiL6zL7VGj+iAFro&F_4p z|Bs}P?=Sx2y>+`jo7Vm=^<M})?@m0#j{U@i{yziHs}hg*;oplBE!N{c(PGVxCZ1S} zmn7PklYC@tOte^wk4dzz2EOn8Zrz`+1=_zP+Sdc^j}k4`-dhvx8-edNiS`xI@cDtX zrf$g{T8q9+XY=c_`LnY5C7L5M>RX#={}pU_e75gV*}OBGKk%MLyZ$koe>j`JBb&ck zbL?`R5dZ0nXFQvarafN_c3+tBoR!TVpUoee&6jJA9Wj?*`khAKKA+7$o6SF-%|DRM z-<i#SMRR^v5cd!5M8SV&+<%|bf0t~9*09fihs=Lxj=#qT-F%Dzf1j8B)YSX$*75h$ zq5JQz@pneCf&H}j_ub}XA2#`USJgcJ9l<L#$6l{jG>?C;aFgc#JE`RL37VtF{EyHa zeaK{=eJJx48<z_-{*Lrz!udjvF3e}EUw&f!@5Mf-#@}m02EV)Eb%K_bTrO~as%d_X zdjFl}wHmJzu#tv6rwh=ZEF2d2dyM@8_P$);_i-?05Bx(yuRvqISwKF2=bQ%rwFxg& z{|4a~g*ORr6@Fdd&ttz|_=xZq!q<c!2+O79WZ}ueurMz0GxZ|^KZ7_;^|MiUk}xb> zF6<I!1>UWBetu6lyGy?>NO-dF6yYLaNZ27<COlKPO1MV2K^PIL!d~GPVOp3K4hqi` z?hp<OFB5)7c!lsP;kCjWg<lfhEWAy)Pk4v$PT}3cdxZ}Oe<*xZ__*+=!e0uX5&lN_ z2jO$VzX_X_XYijI^Ly|3eQf+rBz{K*e>al9zep|c_e1%6_d^2t*(H!W{w^qWP!-07 ziPUozs0;E<zIp_5rf?O%J82-ysRiBvq`Js8a;RI^2>bd3{|*9VqI;V_<M&^+vV)q< z?I`mHJ^USTd|4yN?W62fS<KtdI{f_oQTVZ+IrZo{{OHEtUI8D7U%t+q^~Ly+&l%14 zNBP_x`Fbn)IltqMf7nDGuM@~KH2fjI@bNQ$=jVFO(E|^EXLgyuo<jol!W{pI0d#oT zOS?y~@6p!WmbjOAv!{%QI}bVL!RE!}#y$8;4Psv|A6Y#@uYf(v1^bRZe5cOwaY(TL z#2GsBV!gxPtDqq_uWOO!V^e0wD)tK4K`iX^V)nDg`&MZDaP99~#Qw$X;e6X3>h0m$ z)BiB-=@0hs+<Cb6tXjmLs&tTlp25UnEY10yLpy~IVTZuofjxN*v3I2aFEw_qz<EQK zWm}d=#rqJ?Zsf5(E+FGHfjt$0MqTl)L0!p(d0Dm-yYjk3CU+vg`{@qh2YPpyP;a}h z)VNFN7oelpwn4X_eg?#|68*#;Wa2A2sUduc@-!{%x3AcXPqcP?CWdDSoMm#t9&D!P z4qPFiZ?(`Pa9_Y@Uk@i5wps5Qjq$TxzM6Q;<e~S80{O~idk;LIO#dFyk;^(hmhrTc zU)~Ly<(E4zuT^4+y~sv)e&<<d%scUBUqzs??{UIT!8vzLc8bP(C~;vQysm4{Bkv_z zCl12`H8&(|6KGK<He)OKqb|zqL>Hd{kij#LX9M;j$8kUhu{OP;G420WpU7>Q{luBG zO3mLPPzU6jvj)xU?B#rJ7t9AO#+`k{Y^$(Tpb;lz!Mj(uS|Ikw_Sr#yw{TPH$uF{U zIyB!?<hozDSt#SZMRauMGN4%o`;dX|GX&=3lUVT{!Tonv8gozJKlzRKM3?4g3j+f6 zgpXGV_{bVQdW>w3;Ufld{`73lJ4IZ-BAYvw=s{k5_hC*R;(k8&#yP*6C(em!oD+{Y zCw6h}XNvVdD_iFo5&1dKan79|=a0|k8?*VQY<^}oKP#I*Bb%?!<{Ps4@@&2$n^Pyz zUe14<ugd0^XY>AS{-kV99YuMYvpIDe*U!)9)SuVS(|ACK&~xfxM_6ZmX*S=P%`eR6 zPYrY5n}<b{n)&A!_l0#f<Dp&_<3Z+PJkekL+1|#U{LJzE$@S#VEY5-N4EB?Eo+C8w z1D+>-*6=yDncw;Od7*f@7daQJ1>&++SSKKZ#+gJ1_ls@doKs8OM=uxPVay)JLqe}W zV@@3*AKPhs--1s7U!Er1FWf2tYXtg;3pL-JXvB+q10Bf5rWmh^<}_@EkDAifV$L1f zo94bV$#ay6A3Sq;{?dj8)3BEoWfL>zmd)I<sgG(}w=Jwkn~5uYoR`%yhC3I16@eD> z8T~{j_bL8Sd&ChMxxvS=H0PZKp6i6=0y!Yx@bG!$*#hT^z4%8x3<-w>;y~_b#NkB( zw2eZum_<5%ZWZKKq0jS<G#^)wUdIMHy0PODf&5kkVrKicX-p$7#B8uh%pR*X<l!It zY4-@GS2aea<5Lzx_B)sOz#JbA3-*az@tl5_z<Wun&nfs7bKk2uHaL&=)3r2~)@>s> z>=wu)&%Sd7YKPqazmUr{$1#`BS4@bl&x3}=oV${^lkXQKnt6!7^G#fNC*wSj2WoX9 z_2g%TfP7-#BXF*$4`|LGbIYS%;@R+>!aGN#`;5Skot`6$d9yQvojemd1#F<!wh1(! zm9<UcYd<*?$HPx-Z50P%&wKvO>TeQWCt&~O0`<-My#lm$o=wDsIB_n?Z@)l%UoMa* z#@NJtG9<uHW4>8fEs#GN&n9dDtZx*!A9o5@3ojDhCj6E_yw(U^0`hkV$RUQrpE+{y zksg}uL^gIpC;qG<$9GAd2l$97=n>FEu3cZusZ-=y2Q=!FJ>0SQ%@`iW*zEn(oA<+W zs^GoN_-o=}4Sw#Z#rTOAygna1ORzDwgE>CL=iQ{{%LQt}YrM~(6S*<A(Qn(1Z;SDC zipTLlMsDx5qG2;K_X_A|Y<tKbarNBxwR66ROON1qFlRsVh==VWPqvF^*-nA`gF9?U zpl;Ypy=)U`oPYM%*25Z?#VFUaR($IO==l3i0U3aEIVd2<e8dl4;*1SX6o>`-u&-b6 zx$M%IT(SrLA)!~GF$bJYbSxKWoK5@(_{_PzRA?1n;(#sOvpoX#q7xdnpp!X15o2U> z_g4jYc+Tz=&<788I>yM_CeVm6a_lcQA{!k((|2gx>iqy-a(<KWC4pLVzSn4sUCg8H z%-LhxS7?mw#Lu?GT(jQHXL9^Lq1}6zm{>=iUt)nj9fISAUK;bVd$&t;fbHBT_(801 zNj<s1ckZTD0)E+F_$CDUR(xx;jt&|%;T%z0W4f8{Qvd()|5glcRZeL`!jGq(8Xp#1 zn-z^|mEyk(KTDvFsnr32vqqzap!?pV#sM-b0_~!DSJW8yhxbs^*Z_?&^^9E4sY%Av zKlXBlxCgic;YSB_fK6S3W%G=O&Y9dQAQv8N^_u0a5DlBL#W5fr+<)xznsu<>x({iL zP3)tw&vGu&82voEx&QkG#{xT%yH;42#>_c;9lG7{k+aLbLE%i{slpE7JYk&-!v^HP zOB=`4M|<u2cF~dBD{K+gYah18eaJsSfRBCfZD_%V{*8<19~O^&$4+E!(jMQ%wt1E4 zA{Y00)PJUk?bvx%3qI^TTkDQfe221aJTHh_m*8Ar4~<x}7dyx?F`|BmQT!~;96n<G z7y%y{Pp3J1k-1D@A95I@dsvtf*yB3Yu$W)29=X)Ya)E~3hXv%3Q)>8Fo~hI(GWc@_ z$m|oa5B>P&xDXHIqo0~ZALntKK)a#d6}G|a*hy^hOk&?p3dklVrwYW;G~{uP@D07} zqlWpe2^*d%VBerXylCjZN%*pW-^5`=;GEF#f&I|FDIoU_0omyGI6iOTX||@N`Pe$n z{h~2u5Bb|5AfFiMk6u4mRgWL6uNKHNE#`>Nd*;E{D+Tr=dyBxIAA(Ly@vTo_|A$il zLG{E9y|iPIeNGeEw<kFV)IU_&=QfeOJIN+5Q8vDw*JRIKTH6=+V}0Q_^+k*h3)BZO zA}=o!Mg_;6od2rg&AFpKXz*+kB9H#cRly^3ipD<uwbbJ0Z>}5m|0s0g$E3h}BsI2Q z;Eq7|c7Zk^a6a<5U@J9U79aaWZQ3WsxliW925dn;zL)tQdB+kjwgTrv!}&8zULO=V z%bXSNqh5h~f;{dOZWE{z&IGx}zIb;>o5>gZFB0G_yQA{BImgric0N&{y;Pw7kw?R~ zdsG8FlZiFJUV|7j=8R%D{<^-I6R$Y$4s#8Qf2)hLVZT>o>)y*fITY4B9~X^tYd*gx zLB}rk;JfeAevOF_YdZxRd#M*1yoUwH6kh6#^{Rls`CWrg<l_ax)xt@_jRLvAf8W>0 zBCgQcLu?tJEFhmTz98ePiaGkQtxK@K)@|SXEIC6wH31z%g88Uh#{B|1;UibMJmLkN z-ZC6Fa@r%1BO2?(j_(_=nPz*u_bSnN-n~$O2S4c1>)7KT&njej9U6Dy7A2sf{#yd} ze@=k@B+)sOuMx11-`ByjwNHSK68nqY7eQ0QFOQ*<uSW^%g)ZT<iZ{6>U(m?Mn?-|{ zIkvwro6l*E4DKj$zCy6Po3w^~oLQQ6=XO~3)5YIxZJX96f(-J=KH8&`4d^Eh&{6q5 zeX$VvX0rKcHs7Aj*Jtw|%jVzte*MqjlVfzR6s-HTT8p|THIKf<wQDopAAE1&-(GoQ zkohm7JDxqF_X^a*lT{DoD9-~nL8m9z^zhI-UyK3gk3RasoLZ)*M(H^_^ysGVPd)bo z^TE`wO+E2|zA^P@rvBX2WB&#LJNfS9Dc^YT!KVqo^sNUUe5<haI}bj1xv=)T4?cK~ zz`xsbpFo`vLu7Mi9rvG6jAERTi|^>5eyNL(Xg_22&>z$u$A|NbO#8P=WB3%}CA-AO z8a&>6iD>8`o{nvw#_+M1-Z7y*n4gz=>}GD=Cu+P^pr@gSc%2Vq0Pik;CR`_w2W+Aq zSi=u&#+DZey9CQQtTC}g5A9CjN`W(vOx}OE*ES2tfJU6E0yZG~dSOi(TPOR`F(e!k z&`BI<!$SNFyIga4={;tSZ1hq;$fMmOP(SMg*728T8unPXhJ~%zZ5q7jC;rp`^t*%= zLa#u}{lQP~FY||cnil=xjNk)(4sv^e@_|h5J@|+Z&%ZAT#E5vKm$PNN@cBu?zq6oL z7FT3HrA^t`oy#T`oEc=3ud4;>#d?WfT#NZ|oZ|b}7V%%Wh&@^^@*3^oIpDn6-->9o z8-%^Wm4frfxxyFh#eUYQ=X{;mqK`URBj68>I8$Hv;Cn#BC7blzpkFV*`_Gya56%fR z_(w!TPY;6Ch!3`y#y<EXjeR^rBaK+v5AQ`JcR=JLF4S<OQ7=5#pxHiT!FQ5Cebci> zk3HNY)E<qRXYG99sZz@M=I`A2jA0u#J4g6<rvRP$=B_y)AP>FRf)AhWXtecA3BeZX zVypDPbBTD6(<9&;x_1l6{0YG_;XPOTiN}z@93O}gek1duB$L`8CVc{Y==DDMD&pgL z#X9qCX&>^b3*_$-kU{OUAHT2-TRCSJYY(v`7U;-*MHcZx7O_Ph{?VWz3m=IG`M5@q z$O6<b`pAp*BZEEYGz~sz)RJk~0}Z*@IV7R@$o`5z;|%$pV{JJ3A9I0h_V^AO*O)tj z_z)Kw?~v~jUM9%h!e(?{B6&BfXAia!A96zM`UUQ~2Lxh*&otz!6z2UH)EHl^;|`7W zdR6@VyG$lJh&Ore6Yy($@+;Eu>pB4$=+5hdIq%El1UY`L;U6;b9lMBy?Z<BH$3NOV z0y@_TtkEpj=h?KpZm2cnplgQ=M3>`rwZ_y1>pqLv3Gb!JSLcv8`(C5&Tp#%DnBJu^ zjW|?=ST{RGL~dR;)GR&_2iw5haYR1*o|f6uBN}>KPsqJfppg^Xhd;K@>+GWuV|;Ng zF4F>fV}5N1a`H9D1KaWAQh`{)7xRGqPfxNr$Cqi|oA{Vx!%&*%chKe9M_l>>Kk;eC z|BR%E^MPG)AAYfqSnU$>`vbYe4V&-<UigsXcrqrhQZr9u9MAtVlMSw&9<8&_@sjwW zA$vs{+aJemKy>&x|5r#JxpM6zC+1?c=3N53&k}E}aqo-g2RYQpdV%)!^vospzQ>6X zIfn;+p4I4t2l>Pm9{WTr(SKzV{aR|!`Cma^)ER51Odqv$Rf=!SF}AqQxj%VWbGEVR z*@^#ZjfoTI|4V{v0RN&Nnilcaw&J@3?BEWgKAaZ~i*tFkn4AytP2;X*FK2=nV#6*G zu>BhK<LZHZg{Mbg4}J^_#F(1k{5Q)3IV2CLMHV@}K<E`{&YgaJUXeT2iJ8~2=UOTC zUi_n$s8t$%!CMtvM?N2{VIMK%{RAJc3$oZ}J(h18@=QaY`N-d+I~H_dKkaj}pSakc zzt%j~?_0C=S~kBp<L}j+`0_r7OwQS#>0wB$<M$b3+4m2pX--Y~J<v9FiT2a_PJuZw zJV{s~L|*35q0u9Qvjm+M-x;r09JyoOMUd5;hjEPovE%n4;KL39nXWkvi$AxzS-s=+ z75U4acy=udpSKGYfjF3M9Wtd@?=M+H|FFPXMWC@Cnb0f3@sR0SIYsjNgo^|k`iBJS z_y!qTQBSKB|6Qmf>VBP|(kj3{*Dv*lk2w$PoON;=*RbIpfp;Eqwo<r5Q2LAS%ec$1 z_e_C1k=S@n%~I=r&R?(b8UedpON{?jve3_Y_@scn;Bw)K0z95`$Iy_2AJ~OH&gs<x z4cX63{axzG33k%BTd2ns0y@_V$kDH)oBwQvf0`Dx&)tb1<QO{dkkq{C_=eAZ9#Y4w z+a7EuUpGn#c5-K8PoGc|pb_t93B3YxSkGexAOBte4L<K9XUub1(8(qFbIhGr<O6(1 z<TvFLaRJ1Hv&Efget5vRU>@vejvbs$V$RtlPOMb~8oIT7OtQ!|vWR0lvbdAa7qD?C z0eh|yun3#l1@|GmF`w8#LpE})gS<XRdBtAp;Q;|#P7v5n{HX`(jWKKRV&||xtnrij z>J4*rFsClzBZkOiU$b~3`zeXX_ASKV(M2qY=dl1E;BPk;H~k-q1$V$L0`Vda7o_pg zad`N(&@b6EWaqUo(uV)Ua=AcWIZO21A+ZiBn$zIr>`+7GKIVaXz+cW_MWERpddp-? zEmZ~XK*rWfEiy(o_bheJ+<RGvpB|Ww{m{|9*!jn1Y%ROb_^yxp99h^&?l>#hid_F( z2R)ogV$PX?zan5OJ*`sww|+jlH0}`m+}fuxu|ocZX^bp@-ugXp{LV<fWYR3(y0(b+ z6EcKYwz@C=Z><q>)h9gE8o_UBEx*@)m^H$?Vnv`;ivJ#6BYw_xrgcACw`xwUG3R@g zmFjs%d6$4M=Hm?arMda?9CK!PCt&?F^=0eli9V|Ouv}^w{q&|0KilN*|93XwAy3|S zS=z^0<Q#L3)(c(2ll1)O{XD0?T`xQAw@<{9y8V*CS>hdmn4t%oxTiR0(C`l$&r{og zK4|2hb<@w%nD`MN`^1@vJe(bPI-1Z$o|nh{KalvGTlN9$9u%qqc9T2$%>wc(0u35A z*td$tH148!@8K^w;U4K1E)r<iyIYICubS<{$5jGyh$nWjxB3wFYFlA5b}!s(T}6($ zR{@Q6bc{&{`pfPjVnsf?gf*!jOXE)UG~Qd*7o#Oh{z)}NJ~=ZyXNaYJb_^<_(PCbC zKlNu4*08P2e*6L0H7p<lK4g1;Rby<meT{PZ3fr&?8~;y2>N6jg7w-hz5%@(P5uf`! z2WiBBTIM{*b>=jDcitYSF}Wh=HRarSp(kgYIdZm2U_ZKPdHm3~7>Ms;JP&u>wl&&U zuk#IB1T@yS2z%r+agBA(9n5{Zw`9#RrH(iQD+R{G0=DPt+?`_r@s_xjyzDif^G1G% zIkt{VKs))#@3qEQ^ey>S$yyBLYB8RNyDk+)9vbbd=ZeqMfaY9H$p1W7r)r&C-CVMk z=i(OewaQgh>%^aZ=Hp%=uYiUvjrR5x_ZjhO2JWC{YsZsL%}`_1CC^QoZN>iHf>N(l z`$hfIh6Q*WGoCldIbEP3hiAkJ!OufK2cdTh$gc=A;s_0!EQ{PRM+dU0Yvx^PPS2cs zoVtf^i*SpaTCDD|Ypt+O=uEKh*Jw@#w(GyGKrULXAFnm6v2DcMF(wDj3(r1Uo)>&0 zcEpK>9Nw9Tz4PIDMKl_@SSGN?`(v!R?}+nc8*wJ5jx%`z_Qi3&QMAQCtQX^Xxa(3; z*w$!Y{eGc_0gZM1-zWd``-RWG+%HolYd$NEDS2c}&YVZ$MMH=4;`hLqmoBZ7SDxXP zL2cwZn6uAx;!mw$|8yJqi|2&BH0lPM(T$zFH&N?@0(xlZgg@pUI?q#hSbMv^_~p+f zR`uC{pDR31Aa?s@7tg`?jIC<U+H*_Ru1ae&C2JR_wb_!jv(wsK$y!fZJ5aJlUa;lX zZ0%~%t`s;s&fOC<-YF0d?k}(L`KM3dor#~Bawjgv$7d(xF2?7d3zzYcyQp_#i9BrU z6>M8~2@kaO0`1Q9na@7Cr>3b5*9iRNeP4LLhqqtg^P=sg=E%2W#(k52p1egeID5cy zyHrcqyj8%y)q+w~wEA6BKg+j>0%+Lgv$wmT)M=*I_dU9}3yJ+hLA*yVYpP@M_X6@} z;G4(CyT{%xf&1kQfi^6}`^D?zhMYEACtjT`);SY2;!VEE7y6OO89OM#xO#*9#?Kh= zbDyjg)(PyZ3h;Bka^8A{ia?7sjZV%d>)eO8Nm%~*vLZUo`#3M`qaKluZsO1WLv8Hm zoX7px@BOzgvft;w+5YD(vfuYYv;EI+vHwKbiO-JJ3tI4Uo`?;(9T3D?<b*RxJ#hzB z1!^Pam7o2<yF=jF(jzd>d9Y<z=ocyi&Cf{J2Q+f>lM+y2qE;#XyYOscx<=>_P8Em? z`A0v`AAH5;^#V<Q)cZmF!Y0>NUmC|cxI+xCtBTfX))VU#y}N`{1jgvcH}u*ce0ZVc zxi0fqU<>xLZ<WBDnkT;OebGbMYa2V09C9%%&|_OgpfSg0@)_yPY@{v*1?;2YJ8`zH zFFr<FiMjV4eu#UCTSdUvGP}2nj?EH3|DB?SMZBG(3IsLhn0yi!&mB*4d}>-FW`Mk+ zqhE;6K<wdXQN-ALI4`bGbo2?f;d+g&kGvCOd^;o%XY40d@F1IZj}UFcKK9%sP~YZ_ zJjfUqu&W{<i#g!z`3&19^V&}Hpl4XX?}|V(4{P{vr;M(sr&WsomfM8g$YLKc<veiy z`qF$T^~4TZMWC$_I)&(;V}Km?^$OU$RY3k~fmr5yE=lXw?{^^P*hWvxu#Gk3+8&=H zde-2f7O-`jKwHdK^f$AW{n(CN>H<FIt|k1zuP%XRUe4?B;?3hlY|&#si4Q)+IH4QF zI1$SjC-cM{5jWS8<B5-qIYY>ZJkY3DdhR3Qbg~e6T(`uJ{i_7-pXEaC8|(OnFUWd0 zwdgom7VlfwmB%ahi5NkPv1;ZMKBH$)z^B}w+=i9n`BB?IZN!+8ciVt{#3QehA7%|; zPpcYec3$(^i1{q@13k`Ro@45nx^-Q*s#|!FkIhR3>NwAHZd=Ur57Rbsx0r3L=l2En zvX}VaJND-H#qo+CI@-0-b%<@)=sH9O`D&F<>}@BX+*OO&Q~&H*|ICX_z9a2O`{G$T zL$r9;xpvEVeeUpy^~jso4?5wG@xbPoGvEIe(K`jp%WE^*%ex73xsw-rF2{X6$FQ%= zm;AnQ-Ps4`$E)7>S@&Z3&24mUe4gkXd)ww(BscNyKvt{)>WeeARA}e9c!KzBFXQEc zb4XqR`mhN*Z4YzD51X)qHOA<N7vKkd%z17v`t6^e<Je;Rb03MZeT3ihX3t5#hp!SZ z_h+|YA3HP#=!i8(9LnsDIl^D;a2zTc)0&+HYRvoDo5#%dV@LfCsQ*lubAExq=Ycul zF5z_oc3UR094~CbPvVRo;>((2OpZJzFTDHnxdd6nh}iQEiG21lW(^tk6&ulMf5?Gr zmYi6A)EjkCQ`Uv7AEqwXN;7@<5o1T*i5+&~f2=XDMZcQG6TQR|y-S4{Q}!SO9>&g< z<3?OPj&XBt2erOJaNH~pdu@BO{p?#UEHBxQeC#?Fdyr#$@^e+M<Idt9p%!f~vBgL9 zIi|MP=LcSL6L}pg*Ih;H@Oe+JpSm^gv79+__9WpZ;f2DRg!c=!$?>-R_&}cgTqAzg zOFaEqf_?TAdpvfIxdX5n{YwSzDs+<9s1tfSIYJ(1&G|tV^C)YX=C;@8-1o50yJHv6 z0y6O1Jj{Jw>{mP|(MRHjfB1=h-vPrKN87BU*>fbu*f!fA_S%kSvBr*gMjdbB5bdx` z^kE}@S>J%hW%)-Z@rW^qHs$d^2l2oj-xYa0pgUKVZ98mZ)X~cC<w@UC_4YfjGi-0S z&WI&<%V6r)s$VBia{$?nA3e6Q$Im_H#GM`=@ZG+0k8~*FJZDZ9&J=bE*9tcaFBX1L zc(?Ew;VZ(4QaUJ{FI+B+2(v<!HKA2)bZH%1>`SM{j*ZW9J2JLsGMrD#z*poFXXnx9 zi5S_&m{ZpcHWEMbw<`7I(YCf@AN#4d=qEPXu6Av3?P5!`0lV=HJ^0ltV1K+P+qHAK z_T_e#$#?wh1Nt5BcKxA_^OzEscJ#HYgE*Dxh<3-CAa>00g|Xka@_4qZpSvX2?;1Z| zIU~1=<%~1l%xBix^#{J(pFC&8?Re?K=3JlS=Xz_mwyCQaC(DU>!0vYCv9C<tvD!tw zmC1Ric5#2Vl84-5@spp+THacXkLU9SOR(i!;bLJ-I4JO(`JnJO!UMviI`p$ffq#d1 zQh1s0tHSRKpBFki^~@5UA>1syLU^n29^sP$|1SE;y3E%I7Yf%4Q^HGx*9*Tbh-Loy z!}D*c&?hWb5Ac;e$J*JKKf90<??1-az&RKe$er)20gZcw{BB~;kiZ^4+t}x^pKaK^ zL!e(J@QmWVig92cHntlF<nf$xy&#MI&3wY&=#!r-@Z&GO`nv~c`0Mk<KKz7k-{AK+ z_Y?o{6Z^;wwxJ`p4IRzih0E?x_7k7Q?$D*;AwJ6m>|pNac(lXuJ|4Ojd&VA5U1iT& z=Z9S3yK|V=Y&&O#{nY26fM2ch=NgGIjAy#tTwzzMTt%O9o$cyq=b7rb<vQZoF%M_J zzEaCRQ+dqWwT~D!i-Gk}|1s9SqmK1#z@O{lj({F($oe=p(4!sjQg`{?;XS?|*ynM6 zSFna1&F;jQ_dKrc)-v|RS}yZ5-gm^;{^s#L9zJu==02mZS?q~1amsCJx2|}vK;KfK z>>hNCowtXpk3Tz?>q7_noB8Nx7r7~`C;T54h#mfLFGaiAgWX=E$5(iKE@K@cr&&$% z86NwW3&glnKzFpAdO2S4;yZoxEft)fyhfuwY>D;2TCCsWQKNi^j!p4gqW5^*J*Oqv z(O+_h-SK{D_k6F^zCoeYvntP3)YI-c;%Aq{q|9#e;d&$&%&mjDYw)4oVZ0|rAM^Sk zcJ`4x#rh!Lti`&pZQkRvz&?-jyBZ(xKh}iv7X3$NySd{z8~u8?^7y+CQ690tZ`+rj zmE%#*#FDry6?}ekKcF8=T+R@GD?ehs(baAZ_lS2fTU{^h=8%|1TidD4Sbwfda^c!* zRfoh8A6nHR`;R5w{o=O|Yc)QW&)&r88i6W9FLItLTrTVuW`#S2*9dPH-YfjE@J|At zxtDk7@6ZeS|NQ4kVzNVUp2_cUnxlg;{yAPT|30_a1t0b-7m&}KI9vXJ#=Sy*FCj0l zt0<QoN4fAuxvMqL;~)3)yoYC*Q06y#%j}9Z8RZeHr9vy2<hYeh$e^ZL$>2R>F&X&O zN{0X3Y%5>L*J3h`H9kBaTgl}4wwQ0+W36QPd)!vO@!7JK4DxuazM-#`OxBN8CTF0P zOx__Eix+32nGDX%V*5Gk&Gu8TzULn5{eTSaf<b|rJJ!1o|F{c$_PJm1347{yV*Ss3 ztkitHaD^}_+$H?H&?yiHY$&T8<ob^Dd8Y<_|M;EHGKdF0@%+qV+f3GW@#4Q_Asc%v z%g;mh;~#YH0rcRP>x$noNu8mW{n!Mb{fhdLQRWvissB|1cM)fW7@@bBP3Va>*<NyB z9qjcu#u0t!K_7aFZJ9p&#4mh!xcZh!My@Z<ANHb;c-rn5zubrA;u{p4!(1NmITm@y zvAknF6WCm@{rd0c;+^ztVViKJP!(<yeoA<QaG&r&;ZwrD3M!)_#`sGd$PsryZogwd zjZh!(5Zki-?CllUvsG}N#`s2goPk#I`nBH5p6!e5Z}l9-AAF`BTiL+p=2kW!gW6t9 z#<9c&nadWD+3GoJ-<B^T!*@or{9p$)+R8V+16eFSocC5Th~Kfs2OnF>#HVAG$)091 zIqQr0$ysW)pIG{Scqq?N=ajvJ0=doajQV}Bw5VzS8Ig_R>kv4*_{V;1!56?B-{@Tr z6^&_YgiayuH&3&D@Wy?}F4N0>i|oj28yC~j753#ZurJ8MMsk9`jt6t@9eVCP_#B6N z{1)CNHfZfx!gGa}2(K5g86E7ko%q-4`N0`NCwXHWWl$5?$Nh~R?Z|?EsSxEMADb+1 zrN+p^Pke;_!+4*-AM80nSe1He6(7+XZNlENGl`AFG`A7^$)RJ5ERX#hvHoRRL;q5N z`v(2alVjp{mUd&jTry&eb9u<c#&+dlYni-bsiW;dMqc~G8(WCkj?|aMn{|AlC-(5d zhcAvRv4V&DjF{%Ss5i@TjnR`M<oUc|PyJjiE1qdQx6TuIN7*mDP~gtUV@nNT4>Fx| z^m%MM`8hy5Tb9LsVijx3K4O#YCuZnCKcBTMpR?j|)P>Ad!ZHDSe%ShmCGl^j6Z@O_ zh)?)|Uopq<+qbeaMNHxMnMObHw68wX$j|FP#tIqB1!{;s-_N?wP&;{spSTYSoTZ0f zll5mMb#bmhO=2T4wU6jz9pGDhuXX+7gU@h`XY|Q&;eCnPBcH^Ty9%9o{o`Ld^^ZJi z(lJ36@}vDeOW2EVW%c4Suvl%NkC<RPK2RfNwE<7NxwTAW*^fN8*v+~1&o~@=ddD6g zhy^|VvxgYQTF+zSd&)e{)AF<*AD0T$U2aqTUaS9EeQY51wiCOE0d)gxW3(GPBTrsm z6|K|O2%Q4*sgoE7?1pZh+(!I`-}Z1HU{9_q+T|EKo{o)U8fyz#0RPJ5dM~wruf)>z zN33FgV(jsAl|W69i`*|_PvnuuIyK0%r7AcUV`1E(v18|0;9o17EvIZRcVx4@@Oy7= zw{3_&o3K6j$~do!_~%3%L&ud|Q1dY-#4W~^cvA<CJ2I$y?9ZPM(0E>OCRYgXLIc!A zzmV6CZ9&$sP$qM+`tUP~a~Aa@FZvSgBJZBlcMJ9{?r~iqoA?tSe4}P)#0L9-{bfJr z2K`>MEj}yTv_>P>9YR^I;bmXUtM450jBa|LE%d@meRs$L#?<wo0Pk~z=LtV2{Fd-> z;q$`xg+3WkRgc}y39>zQ96Ciq7BYzgbJwMLo9(04;y&cW+M`bJf&KU$YtC!%qc7@! z&$^?X<YTF@N;p9vXSO%ji~PJc+ld7_kRAQP_IBjs1HNFt?@e-MUy$K(?icllU-(Du zb_weRrE$si`W-xuq2q<z+`o2XxLkX!%Q5^>_(*+OFFukx^v1YxUyuXWN4xPuUM`z@ z%;Sc9?$EOOXg7Yu3|+AX@guJh*FH7Tt{>EB?g#tPiH`gX;RilZZ;ZL0(3{r=a*<<R z+va*~b>^_$Ho0Dq75!yDGTS|4#M);pzboUr6uIgUxNDG&Ev}EU9I_tsjvnkJcG&0h z!@K)ZfySNPDWC_xay{%LPOO_Zw;B0ypYL_-L1smuHQT>SYn;ny1O7Qb`Mxf#0s9KC z{lsVH<OJQGZ_}8DEPS^Q_zv&^d)dn#_Ih5?n8sf8dT)ou!2YwhU7xM5nI3FfFVOfm z=epH<&hJZ)^G{^+cW3io&gOS#^PkY1+QxRy2zv1I(fU1|(1<N`-Ywu`ofy7czke~> zalPj7Mn3#FU3Bun`wV-beKq~t)RFd)M9X!q5Wi*8vrY|DGc?{o8J{R1pPXDMS<$vv z>EG3k^Eu7!Gd6D%Xvo5MbXeBg^>2Jr6Q0*JkFuWq?bfp5-aGa0hR40z^baW6j*4{9 zuz?uGxU&b}?IZEO>VMVu`kb&2-yLhm47>5^zOR+@JGYLreP_>mzuIW;Yc<DSWZMsH z{iOckG|x3%@@~zopWbx^??J8E=jbE)$t%wm8vZbbhx39Qc$|mxGo6o2I<bR0)B3qH zi5GL?$GyQAKP?w~7)Kwz@a4J><c~dZ?NezD8*R@o1pXn>(ZOBl_2;H_{!9vMr=>Mw zvMtE-USxZ`GVvDqO}xAhTlVL^)ENK2)*Kx?8_n}88PDNtepA}RckslF_cCOhAy~%6 zL9T7<O?>@{4}UrmUysI)G0!v0`O+8b_VtNoIeZp$-d1VsJoSVzy3EgB%lkx<XB&vq z`$da6`}M@LG3@)9jOX^mvnlZG7LB@GBhZk!K|lxX%lbzbv4gfblQ*C_wUwVy-cjDb z1~q(w2fxhc^MPFA`R)I#|NdLwCD8s&v@Pmivb1rZWAa(8NB{pgo4+r~H2-Tg=S<i) z{QKbN7koRYb<U#spO*GxQ+|iQNA39BQ%n8gkM?}?3yt@HKkvfB-V;-ApSj}?YfqGM zg65HzyN|h_D_t6Y@jn{v{zv)b_+n>nJ8Q@w7WB~<<_2e*F+UrpKH#TuZW$wobHtrx zU!V~`^7nQ9<Av}!o^Sk@#^=ngY<`jEG5%|^`AW@m|Izai)u;86)4Mf~b!Po97CriF zzp)>><C4$0$5`h+qUY?=m*o+<ZRAd4PW=-<=rrO7?R?>-s_kd1|E?TatA3q;Pk@+m zj`%&f*ua>7LmnTI#peNR;TeL>t@dM!_iNa4zf=^@6Zrja4(&`dbYeTcUnk%T_b0K$ z2FK7ne8d1>92@S*9s#?r7x16+1CKxJXjuF{&z!bKbj}IS7}mH`4hg(tqmwo)AjkG| z@Ae6<31kpM$BQwDpG~M+XvpUddYOU(4VmxK!npcD0UsjYT`l;mkNA>bWI>}gdIe%d zOwSUCC3C(9dY3@H&5wWhLp<@BINT(BNgxi$9}|e{N@1^nENo_v{kT$N?vH+9QZNtq z5xU}fl+PaSgc}6%kN?gibwKQ~$$24P{4DUNWEgV!vu!kd_I~@$GZFjogY_o~{GMn0 zBp1+;jl7>0;}-QlqaMGA8S<SU{31Wl)(SfWWHOI+UB*M~sOzf0{b?DOYE10WWqoC` z4r?7Z(T8pLhuzjq{*gmtoi%tJ562T7&KEvhmiW{a=cC!0<ALqO=;ewLXLpsLVIdQF z>x3?WICIaeR8Rh6zR4dv=mN+Y6rg+GX&NuKkGk+a^7pec1l!1MMW9hrwu>0i$T>Np z4GH9iwK0KsQXeO)XAN2KpCaHV^#~95ENguNv34$ex8hU308iY5zpDlEhrBfcw*0Vc zL{FKG<fWO7__COd#EUp^*Wd@W7W0Wt=H!Sq^AZc<f)4I&^hEzVGzah#6XdfWKe)@F z!{6#2qehV*YYrQ$0=ec4P%r;o#IkxpzV+|W*!Gv5OKdbxJlB_{edq$n^S|?sJQ`<{ zI9@MM2VDYoTeoFEFWY~Q=;&W3AP1jbk$ifk`f<(K_h|(bxx}3~at~48mdiS}W0!r1 zG@pH9b+_aqlYd*8{XK$6MV&+E-xsGL3;o>LuK(QsYqiGN;+(slB9BzeKVzxYia_H` z!%qz?6_e!<XYZje+k=h7EUznUU_WS8TjYuw;`vEDaF^Kn*+lJ-hkLXDA2FhlE8oRs zIc6VpYW4xaaX~&d$G9MqcaJh3;a?-*hid~qY<iUzvH8{N$JHY@)&_T#<Fj7lUV$?l z?LABLK7o7M=V2)0K?gk88TXnl^1Pl4G)50LVmJ09n>(0zAsf4h2hRuiVmt;kM-O|c ziDrAx)fzE)O^U(KHHm@G2j>8}W#<7JcHz%!B?o)jJrB2w7hkBi+!x|N^Lu4pzcEH0 z<8xKOme<Laiu!K})bQs7Vn;6Fe^2&3=3BG*0nM??{9n-bnZ$!R?RA<XkDB02LnlVh zOLXshhUO=xb@cXzeehuO1Nx4W8pQ6`H?bQ%=HH%uce+}0Y~gOQ&B%R}=;VXi>`~t< zAO}A8(e}Se-=W&}4{084KN7xUCGW^#-Fl;3(@#n3yu+~mIDz{Hduh})pSRB!-XPz( zCtjlBW*>Eh{nS6rbIvmBeFD$aGCKRvBay|wD}so42UInurgjR9dH#BQy2ji=an5Hb z=Hw9H;Nc8n!>Ix`AfuTr_`p4hjFpMcdRpx{IqmV8*0lHxh7IhaX5J_#ncpOQQ6RQ2 z6=+@3%US<<@sRT}o(DyT=NH67{gm;%B=P*Bc&Hh89uRg3dj<CYQpws?Y3<&UHO@Bs z{zu8$`n2|@k~M0HeQz#VBX87Hmq0E3x(3u-w?MqeK}DdQE<h(I#FrdP<oxr1oRQm# zKqJ;~5d-^(<)Fa+e9tMORRkJ)etD5SoKI?^BGB0L)<yPU8#P`LXzY1g$sT;CHVz9k zYU5NPj|Jx_#sMF49-kM-N-V|S52LRM<m6XmLtY=3q_tlyS>v6TeQz&W!zR}5D_P_I zVeS5swY&y4b~V<-{%roVY`$IdJZ{9$=Qgh)na~hB>T^hle7;{CJIkLCpPz%=kA7xz z&sYX|=AGw>>bb+2uN6)a`qG?wU{A~;cKP|q9(dRnc{H8R;WsoUroX0*&F+EQ63?%f z#C<HSy`yC9inMm5WbMMV_8TQ@#0#5#vt%vL^E>6=b>b!ND-wA2-z7|@`F{0|1#tk^ z3(gDY=$+EV8Rx9P%lV{vOl&y&tc$hbzUbDxBG8caTS-={`(nHJDguo??`mTYHdF)} zdw#o(J?D$BBGB0L?zG4LU^|U?(Iy09|2yK#&-B%4?L8%H+tS+amaJ_|Yws;t<4mCM zeI;vouAkg_bnMq@Z$+Tt-|tDzVs|w<D*}x@?{8xdcUDE9vF8J6PmH5T4Ryi&Q4whD z`CuD*o+ZADKx5DEH`zm7@?8seBK7QA<~b;G@f<vdftqvsNnIAi`VS<t*?WQSgFh4x zzTG5zQK0T$D$r^Iay}%UyhgB}wGWr9JvFU;q-1SvTKj0p+9_%6k4o0^8hM9&6x&gE zAaRLtf@fUty+Hgb0*$!;PcbZ3N6W-l5oqlBSQ~qI@2v<l_I$jJJ><9|(Ae|GC3{$N zp7Dzu{E7JT{P2Fn+9yiZDrxOcOV&20wLdFa^BMm0lC?ZPJ5qjP?5~t;bkp$fFC>T9 zw>n$#{&WuMD*_EUf0^Xu_pte&DV|m}(XaK2KttXqo5+j4^op+{(Ae{-l0C#LzMo+q zH0sIE|BA*m;s8C`2`_Oi<Aol1HJz`Ek7`WrKP{V@o$ZOl^BM8vwR3e^`>T?*ZE5YV zOV&1~wa=EUxpw}hWG%0q-;o@#HJsbCG_MFW;{CT`SnS;Lu2vCf?D@Mk_N)?LMWC_g z@7vfjAijz~W6wXdvF8f$RRkJ){;^~aYd-6jXiQH3Nql*}&Q5FpT(Y)0t$nU!&F|p< zQnJQfguZ_*S<CbFbn(T{Wz<NV@6P5oWpngMO+&u<JW>&8#OL#3SS;T>yD9>WJ^xm+ zr%UvBj{7vP2sHNmd)nhWX@zK=LfrEV%_{<pJ^zvISuUEczxh4yMt~Z*Aa<OEZh>>n z{lGo7Re;_nTr2Dn{GCeVt%yz|7SMMxQNxZe$PQ%j9UUsIZ;i(IjZG5*Jh@H&Y;vjA zu*)`(2ka`l$A}HQ+-ntqhF#FH%X-;QOv-qnN8a2H;_#!kK`IOXv7eZ&6?p$7rT~9I zx3FHI>5tq!$a%unRRVb?4zy#D!@n(CCdW2l&vn9>z`6NP<($t!E3|+;tf5!rA{U&A zUg3IycLMU`+99Xp<d8s|IkU83fqMF)gjCe?*_8Jg>Za`TQorcf@+I-3qf4OOBOnu- zxlhoGPGUwJe^0(5H>dOGQmK9XIV{kKCws8XI+$ZWGC8m8AusNc%bcE=&{J>pJZtHZ zOE1%l@Aw>hY((ad>(7JY_f`RW`UHG}pO}(c>>ysq#1_XBo~i&(jLE5*QzzsF{+$9m z#A&TSt+AI}LMOIg7Qr#ON%IGUT>_tnS^rAO`qiQ%XG|bwjN!%38wBL75U{~x{KlWp zC<kSJW25~hc4dB_B0B!E_EjlGj(=`I{GfkL^on|FiySqptwF63ciKII<AZ!`AqK>W z@sNP*uS+&QIZnjEbqGH-Kpg&;_{c*=pb-<1isviO*kNHp*et9PSi=_L!y03Bqie6g z=N{@DU-(W3Tk)585&u&K?91x}|B=bsH>8C9>?ODC&utW`;cQW-_=OzHu4qid9@goj zAJ_~pboNyQS~FhOh@)foU$Qf|i=1FPXN6ex3dqZ8713zaHhjcxgMdwr9c%WTHS!By zq`IuC9~Y2KPp(!8$ihBi7w>Ci^7B9Pg-!J2?PLMnn*?GF-<1M#(aqh7eBXVn;bXtx zdU9^Dp)9x9gx$WgG;GKnI;{6pjj<0J_5fmxJ{mD0XVE|Wc%?v0u#=kqvVe>`gbyfQ zlj<KQ{FFeQU^{W*`$J+*4V)yb5U_<i9-Fbnb7F!WJfG1omg2lP4r7|5pJ&m#1awPv z@pCom>jeV!Ga}q5ARnFNBHH{i&9@2UlZG6g2l(@Hfjb9VXz=z3&};{B9?0gLb=qNp zeB}JZCho_-IA5(f4Si<`#E$k-;Q|34(95%fcBe2XbP3Q;5r{2(j=AGa?;1FkxRY<& zNGy>}tQemxkRQgk3&j1+ilO(gM%_|R*hr4?89McFNT5!L6?@=gOuMJv73;*2HYC7< zKI((-tB_}!hE4g&%>xonos&0gpxGv9y+SR}o~5yQtq<MagDm!7yJ=^X(8}b9ZGO)~ zk;8uOfp5wubo1Q9wm!kOYS@+zV)Lyehj`i^%Q+rC^K%1oOAe_+-w)_utt+iTXWcRN zzMZ1c*iWsWAYd0`a>>|r>N@Ay=zJr8y+HfhbYFP>YuWs@*_>xVxAvKTMssv9NAK=z z{YuTpMdu9Ce%Rw^+pDubJ8-S$=%-e`tprrme@o#0{G1T|c(Qn-tlRXn|7bhB+_5}^ ze3wJxZh=nE8ok#U1MUj?Q&YcEJ@I4Tzob7C!1@Y-{>0RC2Q%jxMbF(&Pp;X|9r*<P zohE4BYoDl#2le-xkY#!7gV(TKmg_lpEIdz4J?ENvZ|ZY8_XO+Q!MvAXFAaU%`{xVa zQT(abf0xl~)vpt%A8?JpDWFbI6Oa#`dbj=5@+Cr_aIL^uAz#GQeDG`+;K7HT!Wsd& zQQl_FdERg)b2@vW4GZXwyqX^M=dhun6MeorxRZzj_Mr#;H0(5Aq~ljk&tt@1a!aiE zJNcKX2h<QTdxp@P`i<((5jca$hL46%@Z%GH(pWbQn@)hJhCb7goBLG8w_bdm!pC(7 zw8P&_pXI!zg`DV1nH>B#y{fV6K*M?8_?fcf5aqS<7d~WBBV{={QFQ7c))94pPc;2C zx%t?@3m^U2LYdyBqL=A$El|bqaCY&R+|r!CG9ORZI(y3W#k`^eIow0u6XOM)IG4#; zCOVCHQAhdyvbu|TYVGsF@A2Y(L4Hqyx_RG;scXRW=o4oy_Xiq#Y(M^Q7trA~ViaxF zw9rYcoqK5b4$b?zG;ZY=|5he)0eABLggxpx<Ew-X0(0(E<Udn@m-kP4_R@v~Z1(*X z^J-tB@8)%$c(-;8oI_-ltw&w>O09PZzZ+_uGq767?TB|#)YC36@h#(Z%+W`U&|@cO zjUL431%AP^Q}A6;4Py-(Vp>-7?9cb$6SklWJG%rL`rD}&c*|t8sw1j;Ye)UP7+-k* zxlrI4ajEFwDq%$PeZm3Zr-h#rpubK1bJT<PX#6qZ(*pH^+;QOx8b6R|(7Q$Bcl)!p zPB>fOy_|-xuCJIY=bJTn&J~sk{Q`NqB=xRg)@YU&?|A5z=Q>>_8nS5H1<Uk(woWu` zw|w$Pv;1bYNqu(;uWzHisjFTAJ+v|#Tb(t0i0jcd%f_BA;pWVqc6COX`5x<td25H? za>!v>?pw)-agY14C67mpXPHjZc4+U?hhPgj`-NliAAZ})m}Wl~ljqv{nm&&-dxx^m zoEJWG*hlN|c_PN><NclbhwoTw-L~47ybd2BdFaT`6Xy&Y>9LV}jx&(^vs^S9GO*eH z#8@N8>)6pF<o-7E34ZiiUR7h??HbO@jrHc(=68#2fVa$-6A-8t`D~|U=606R^Lw2b zHhaffs<oUS{p`Va{Kf`ii!SFwA2}a%Ec-?86sVoJ?wE;O?9HEH&Gh;?7i~j6zz+1T z64nbHLVO>lmazvr?i5%@4(-{3<-liK_3J>2zyHtLr%LWWWRP>`htE%bXXbM{HB3(% z7N}LfJ9I%*Bc^3^^V?_m%i@BLy59Qlb;kaa1)e`!1!8}xKtq?~#CuE3gV*xf#18hv z+T{Bm^!5ofbif0U1IPvMmD>gQ^7^zs=$2z$?B#PhJ^qu=F5zui4$AE3oG%l+R@J!d zTw1pI^4RXuKI(uR+b-KojG|9VHAhFMK!ZQ8Y3S?+@FF+Y$=X6b>;LY7-_18_ZHvIO zW?VQV+$sF`gg2@OH00Q3=K*_NuU#;y!58bHSMzv}F180B7vmv+&3Nz?JGtY@8+Ql1 zodU7PK7bF86}AiHYnec^{qS}R)CrBBH`ou>kQrrojqj5B1$cmMKn^ziY><O|<j}~U z&pbBZ1HMo*@wt=xg%9MQEDy-BKiJ9{Mqe{t@@9LR@j17grNwd^^|Y?bg?r{y$)zrd zCo#B8pyht}jKwvdp{j_)vx`MF*Dbzr|Jv?$?;Jj-QYXaZSnix-;k9jLezC^y_3~Qu zFOMrVM;u&_+}*qfxweSK!@o!B|DM`P$s(52Hu|;+PZMqso-h2Y@H*j_h2Iq3m!NJw zpZKO<QB<7KSTFE6Z+-^A%b$h8pJgzpQ5WW;#>v%Uwab}t4Q$oe=P=igY}Y&A6)z_D z<Q6=~axZblsW<W+{lpgXi@n60#_wlyu35uI;$RtGTkKvs6y!J_5_8P=(gP`%$8s-G zqpe~~-tqldbH;P7-964Vy8O(D^$^EpXO4YK1;-no`h}{%UDPQw+sB=R|E+lI?_>4f zn@xVO2b;+`y7gm~;(ovensqYfeB@_7w*^_$XkE|3zvr<|G|tEs!cD@>0u6qj4W3Wf zPm5;}JM;Kc)4q$Wlb(8|Zh5yw7Jea%p8Kp!j-QLxNgVX+nu^Z~_|h-XE)i^Nl+PJM zzVGS$tU=HHvX1py>lA)P`kZt8jsDp#bmJp?^((#}#4hw=*Rkp+M%0$|R5kXquAQ8s z8xU_kBb=Y0Za#NsYi#+@hXmqD?>yx>k977f6KL$ge|*=koSJ`zX<Doi17zp*?e%7I zi7jhUE;_41vv_RR8u4ZiXB<113Ndb)7M~Axs^^Ts?{`w30r=yy75Bkw`Tl&B%Z7*j z$c*o>t^@Rx)p?m5{LkZteKg0sOkQ5kk;m^t#N~uS(t<4eWI8sp*YvK$Pae6YpaX2D zUTN6n&!uI4T88=9zh2;+>DP@Nb<W_g3gm;>(%5UeqOYdm8~gIyIR{ZEXEmN}<e_JW zKpdP$WcLd+{Id-7yjL=)f7ix<#?A6+d3kKCH`-{Pn6oICm;rx&U`%YV1vtme&I-J? z2i_=~7yx({YOt$#FTv+-fo6Tg!}_WkH`BS8KGt~#aR>SguGg5xdk41gGh~|IKgi$R z1*Lwr;K45QF()1y1biY+C+K0SuBbg|{JB?jql@_mQcgYp&9sgT_QUg3$#|<^``(!C z;m@g9H}7Wf5xW~i=e+P93k`XliT5OpR|Go0qk`udbYgD(?73IE|4zUb+xaQ+!;8K= z29`ljJj_Rbvf%ho_urFTbp@YoJR;fnW80&=6GdmveNAth$q{qzE&9_^&-X~o`HYEP z__1lfes}KY^|JJJ;c@yi*t>*Z6Fw&F*M-jS1pZs$&HA%2zahL&_@uB?w*9O?4I>wO zh%e*5)N?MG4+>j_WdaQw`vsnp-<5!8tN)+r#e=hj&DRO!1^L94dhZpk7pPNmuth*7 zx(^BLWzO2Luvx$cYJhf+aGn6q4Fb(IOHK1<t*~vUU>#4=_-X-r(f2(W1TVkCZ9+Z1 zRt0Elg=Y!qq+as9-#>=E+Ftl@Cj&KV1lxZg8N>^pn3Dkf9}=(+M%#C`rXG)Lyh;#z zAq!jA3B(GppISpkM++JKTF19xfj!;AdV%(rI#cK)*U*U#Hg>j<2M-OsU5U?smT$Fa zA{CANBl|uX>-VHxno}dE3fMv%Dguq?$4<d{gcfBW7v1=bFZ9SDPMiz&(ipQ3A3KG= zEAi3syHo2lYG_R0xrH3|AsZi;W<Fv=mk@2kCw!+)?HhMMMW99BmTC^qVHVW-1$4() zMA<QR$Tu&xq7z%HLc9CT8}~crmR*rNS~EMyg?W)fOf0veF|FBNd@ygB4QsXTIzL6@ zA%UENia@Ir|E=qA&2%Q(cJ;(!SYVI$QxD`_zuLBVwp^kyeB=pRS??13^I`5e+71CZ z_=pbb&36~~Cvk|jwes7%@RK`oOYDg!4V$qEo2hTkPyF-wo>OnVY5hv|)Dv^$vcDqG zu+{e^@?uTG8*Rnie!=w{eRBP3xp)o{JDx{8L%BQHOT!oPyH_|vK)>$*4T~5?n`|%7 zMB-0;-yhB^z7Th8HxD^{Y2fKjJjB+%LgUWmxpbp|Tw;oDVnEGQ1@tqfF~%QqiY;Bj zKj?Xh{qcU}uD}KwGIt61Y#n!MO#5fqXc~HN7vN<-ckBsDI<k2#<@Y{5qaQ!8h4!Lk z3->AUfCo9tk{sW`y`tgU8iBg<86uXhAMAzCzL9g}*%u9qSjF=R5B?sjoC)oTa<EG- zG<^0TcdkYL%qcm-9{h0a@oZ)d-?0PRdH&<0=W8{_U-q&NKlYZbW0U<S&g{W1X#9Nx z&gM>m_ZsR5J<k#NeS^e_T9NqqdmMgvP8S?sY7m;~^u+yofjCG_;SYO|HIRDF4)VJM z?D6juWz4+<FXN|bfX(bje~-W#F~eu<B$n9EoLG<#Xxju@rTFi{v(I+9Zjga&8fV1* zt=1S_=*JfBsTJybg)PEzISW7f>>q3PLBry1<y`j*&g;0w>|de%*a`nyfq0Okia<jq z@x%_|O>+%Je&-Cou$6XA@!$IQh~7(l%u@~H^#yPJXAiD@;@%}X{+PBkjj<7%nG+9k z3a{nxdAeJ3a*Xf95PovJGL6YGzH!ImC;UAEywokWk{9lh#|iL4Lk@fKlR2>@ZrcP} zrTFhc>~?C7&)9dWV7bmW_Msm?h%<U*W}zqM8$IN#TMXnJJ7Nwhn$wVl57vXus=(ey zXfOJj?S<#WMR+)G<ij!_xd?x5kJyX7#JwWW(EH!CP*#i78@>=@@=M%r3eP6|>l1bf z$iyz<11bUypFu^SRf_*E^!S8)Y6D%!vYq%^5opLPlf$_h7T{$+pYO;gIm3VIzgKYW zXjpnKk?+0Ek?&gMP&0i34Sn$QEN#Y1Jz+1+&uyPyYPeH$c)A2?X<Zug9AKS>Ken6L zQ_tMj^w`7N8^p^RK6VSNpC@qs$O*9^xA=xV^zd<qvOhkbk%c`y0y(g54d-p)nS=~% zBj&D)kA%8FKC!|sc;LqdXyn6o69eqF&+sFcbI%&j5$XdUkdyBdsp0Qb!oNl!eAET; zj`B4v<imr1V*)(HlbG3FY&axPi_YP&##@9(X=5HY|Nitrt)rU;56@ZhfDPD#JZgr9 z4)d^%>_@kdy-MrICVtp?gFxf{f0r;WJWsHWs>a0ZCgIBh`tJ}vpgg@?J@+c|;3LMw zdra{AA9C=0uh1i4>so<**h@2w7!C-?Ahy^CFE!1WM!m6*GZptigNK@-mS`VKwd8ZK zLp07?pMX91Vj0+j?k*wfL?%8wRbV_UAcMGLFa6a5F`_w+_)MJGGbOx4xLjZl{t@Tf z1!ON5sGA>4c|$*Zy#kGA8DnIj$2vF*$hMx%8gmzr+fxPm){ZP>kjE$kn;w(dR2HL^ z;=@MtY!I-MIKD&ix3A=_BG7CXIV2avGp7+B==dWO8gjxu#{iz66o@1C)2JQvVh1+4 zcJI`<M<DO4Ic~(%WBZS+oF}fu8j1EGE80`l-1cZ#Y7g<F9&Z%zhggjW-xQ$t2+(a~ zT(^z*+sqFwHR#QCSO$GF8QiVh*;lBi=7~3TMst1n{6m`*dIaQ=+bad`Eb@J|K+V&f zcVxJ>pl=Yc2fSEyL>yfc$RLNDG1md-fN{UT8fU{Yh|OzCWFXu6i7EPR7xs9~@6^cW za}D`quWJDLU|7H=;?pf$Crk^RMQA4pD}*SwH_f-ICsy|Dbd9Nd)_qUKcgZcHpCksy z7h7y6wxf?cuNSa2{=GHqK@U2pb9l)obL>OrVSz?Gssgeq0*yR#E@|w8A0BLatZX9o z(MNPu1X?cV<T|;KL+mW)<VECQ1M$giBgWVRY=iF^uVG(BpjC?h)}L3@^YsGxMK=CG zL)IYyU*95-*H;V39TJdBzO9cuJk-24%Lz4bSfIr?ogzbtY1AF#O`OgU9M@CZ;OE&5 zfBXzZJkAqN(*T)WX})q1dAUD>+LzZ@^yhJs$Gnw4JzBRvk6(nJ9RBzsJopo9_z8>f zyN+7bSoFd5SCJkX@s*1CTBF9wYK^l;oRL)#Xw;_fsCx=Z{oU1f5oewDOo6)iNrAfM zoD(zlcM9-f|4jn5%bnr*mo&awK+mZe9a-2*yQtn3GO-i6enz2tv#?sgR~mZ<ic$UC zP}4)gxBx%*Cw5T3tigY>K!b0K@WhlG?8Z)b@QsFV*5&wfXJQ+6IG*UiHf({Py2hs) z1RAw>rEr?SImQ<3+aM4({N&I0s+*@l|EOr>8e55_<;UE>=V#Vk8Z*b%s(=ps`m%7R zut~r!c#y|43P11{8u2(?4q$Km{N>LP{i2Tv#B`_N+;e|DPCyQO`A!9SjQKMHeBN^o z{O;)(RJ2Az=IH`5;EkWP&|~}Pv7MOs4)tf3VbSp6j5d70_vnMB#b>q{TWIJZjunB1 z?zj)%p^;m7xvP=AL-0AhUgPKkIbe_NKU-tuP*2nk`Fx}tWgmCR69xP#^Zg{zY4*LR z4d0!=3$)L7FEZ{C{5i{aHFolR!>8>6HNYA%py5|nF{<xpcv!emAeS`zzE|Tj!<=){ zo9w+>W8^eDhxktG7S<Od{VqtI51%dQ)G{)7w{-oEYwUZ481_kDocD)$<UL;FXzzz) zFE(%&Q2*4(O2PIx_W1M$fz~U)J0zITXNTM~CLZ|x9LbORo}qc<rH<Ldd0`Lvd5n0- zF?80U>-aADcm3Q08fO<8@&6OikhdYtq5YkHZ-%=0{gzLUKlGdfWGK{2F4dojAO@>6 zK^Aq3e*A;iHX!?(`tua<aGwFz0kW`tPV4Mt4H|ZLixzbv=YIVe4Rj79oz?;WrCLJ= zHIA>gfu1u>&v~Jz?&-Ow==%ip67xO!b0OHm`6s@t+h%f{?`I$9{d4+rCFsW{>xb9! z=~oHxb8p<8_@Ud59*tS226k&b*1&i5=VkDHwS15CH!E*({z}cMd1{Z(W!SP);4JaX zqp{|n1)(3mh(T3g&iOMB@nlV+ikKi9I|gM3Yp!KzYed_oo>nRTTjyOXI`NFW>zeSc z7abeW2|s#~y`c&JM$zr-71^FmP4=9b_7DSNhd%Db-n5^ZMCVye_Ma_!jQKjn99z9_ zbCZ4NB)$HQvzgv=o9sVNboTTJF*aM8@INW>4`lpLZo+?l;_uJ+FKEL5l*CWHVAtb> zJcbuG+56PAcd*6Ytxfh`B>F_!$C=A@R+{YFCOY+tt!4WzZnAGkbk~@MP3vX2$^J`3 zN2l#{O>b|)ze9BN@%`>f^)c6%mh6G|K!^ULM(%0?`pVAn3emZ5hJ;-LcM&w|9~x&G zJE8Rm=A*We%X<d)R|WL06`m!qhsOOE?_lIO-t?@~!$Y6nmAuzOKQ;CE&)j!6?@-L$ zqnCMq>IYKqy23uzxmW2ork?i~=Df4fpObptWtekc(x0FDr=<R=sV66_Z%aLKVtz^L zc_(1LQ`jnC7ma5rc|q>Z6B^^lyA%HKKF9jgwEhb9)zN*EBcr=#NA^rkkItoOb-Hmr zHrB8_IXPV&89T6V-=W06Kxp8bnHfDaGP-|%ZE7qr7L?tS6IN8rtJ71}dDR7FZ>@nr z(~;4!v6(0YS~R)XH`};R)1&r5J9^)N-BI>|soBvzwUNw<1?tfP(psi}fqIk~VJTWO zJ2BNDd~S4Vb54l!-J{i8=4M8#wUODm(YXV&buV^L%-ve6&W+5~W>Xvqxmac<ruHV5 z*@L6|&)!m>RBIEHQEGL3bZV+LIWkt8t<FsBpPNpRuTGB6&Q9z()WAEvZ~y2_EeV>Q zy0tblH!?GNa3q*EIi1X?PVYZ7JF&OH$E?;g9dD37QyZPby#?FHCT@)!V~3_DC#G&8 z#3TD>CiYFtP28I7@lthidbTz)Igzq#GBs2^Ff&t|nqx6V&#RNu)3+ShKQeo0-|p$j zx_@4pR!J|2t4+-wm?<()y=A02x_`7fF_%t8?YYs?+H((#CP}s1_BX8DwtwH*k+5fC za<akcJrh%-lOr>=y%V!@wUiIjCTpX!$>XA!MyfF>b<*^nk%_64hIvYis)*Aw4JPcH zZaDUPrf2qzHXNQrS&%!ExwW@iH>El^F+EieVL>`DB_C3_Mc8vd&h8t%*>xt;{MpmE zaiy4z%uY^Jlgn^SOohGAJusm}a3JPY&L2!MhlN`7H&#P+baGOB)mxH;P$;#jTPJ3w zr}n9678Yx_Rcrfka-r<Y78}mR0>j?P>D@~1*y!Bo0&)KV9a_0on;V}_*C!Uv>R_X1 zZglsg15g~1nNVGO>y$a2<0P;lZ{wr0<8?ZtkpojYP&&k;`x5cc{^<t(iK+bu=0<KE zoji~<2ExdmndyBEl{zt{$WgsI=<-T7j7_>?RVwFf=A_m&rKuke^{H;J*%6g%QKgY@ zH+NPfG?aOLv+jn-F<<EjZCEIZIZ{;Z4bubZq}Jt5)zZaTpO%>yPuM(HJYk8L4sU%n zJ3g^Tmrrd^DyB%Cnb<qtjI5*)-&%vsvwn=#rOZtq9YfKy7#+RMCr9)x=QiYqX~>PH z<+)*@AvYrAxe+PmM$_`#u+W$rQDSbGhTLcxbED}|xvA5l+w+ujHqVEmPMaF#>2Wk~ zmPeQu@~Bx!9_Oizd2A#fok!L~9yL8Gk9AsRWIeNu4vALkP|W$r=<LY;X$cEw^r-9| z9aJcdLAiDMmfA@1GNQ-EfvIrkPe_9v-{H!d9KBs{5z~5aJV?3^j?Sb)E*AEUN>U?v zEPJv{HeB74wb|Kl{V`p*`zC9*jnt<0PE4iCYjS$;*=NO*0ioe(EJDM2!(~_)H_Gc~ zy>#lv^71^wOIIMq>CEhSy5V&%-kvPkH+J3#?^<b(W-+3AFZYXB*wRQG*>Y~$EPC;h zleWxL_e>t}WiNrnjJtkr!fzs?7T5Xwj{4;;IjO+SuyAqAQ)a89yaze5q8D#Q3-68E zGcPw^nm*uQX`7xe$?{nV^lK{u56tP|vmm6H!n<Hyou$FNM9LlAug^8XqWUz(5Q_HB zt4s69GFz+N5{0DsQ7lnR!6QN=)10o;snMB3TyL%jzx3&mFtv9sJ*BnY@Ho`{7wdEW zh%a2;f#eH(ffVlQ1!BW}y+EG7vlmG5dS0N;U(tc&YkGk+e^oD#8n5dH`uq)-Q+>-d z(Bs(&3#m>PDEU>LuY~KmbSb;C1COum1ybYH-9RsKuJH<A;GVy(6~2bVH-5aBsvT6> zG+uU7({tfsoZfwN@iA$7&z|`=VraYdfj+(JG95dRUbC3!^3Im|2t7BN-iKgmoXqI% z*GIPc8A=B+ygNn;kG9<h_U!SaCtr&x)mheOxOkE8pFUV?_{5^O-r}2x`ulX<fSFo# zdS)ztE%)arJ?O^tB$*lAyYN0gzcw|xuQnE6duM8V_}zVIPBMLB3C6Tus?zg|X<_M1 z{ZUvqBKugcX~SpS+2`srb9mk56N+B_3ulsmI%UsHEyXpl%+!j{ez{F`?wQ)cbE6)~ z#^-vXh5AU8`43+UbAMH^K=Bz|p!iv2%26Ln8W$Fx(21Ts#RK&y*2c0<obx5UFwe{u zM`pGt^JX8|-H?PsvwF;oO{Du{mMKrzln|!V`lO>fe6Ol<Y{HN6g0Wbco}D|izcx}m zwD+JNI!7()v)668#I#SF=8c`#c93EYY1KmQHh-OlbbWE4Q*xUgq3QDuL_Ro<&g@Me zjZBgKdnVE`PPFPl*KvK9KI|@7r<*|G&^ylbOnUcW7mxJ?o*8{$;PYV3pG;s;A&ix6 zovH1c_E$A^K91aiFwy2}`zYFd^PfZDo0~9~z8{M@)3o7W>77<z4eZe+qmS~w)aHpg z9|z_InNtOE6r&ECyz*<of&KcRUW?y<9;}VtqD#_gD5ll%ny=LQyf_VY-wML~A@fXr z?oV+oNR;!PuX*eHmvnagf_|o;FO6TPFPg7Ev|`CA8~6%+#kV#-Q?C?ye(qBom68Vw z;@Ybeq1w!hKA-%cAPjCFotV@YR7<{JOwZamrQ3L7jDnE+`Y`ytg1-Kesj=cUUj?+} zyLHy#iCZUTi*Gd!joe<FnO^dpg1+_{d_ORKK(7|xE(jYhADycz@=4LR3gV`#_yT1_ z8J^MIc5ulz6IJFF4;0<46Vpo`s8hG;1)fVVN%*gVdcoCGV>NxrB~F#yftgu-G~;FI zfGqq*rEg%vhT_IQq}MUMBMub*y|;4j_KN<qqjFYyn&{J1{X$q>C)~U3-l2Pk;i?aI zR0ak%oxOQ)@20+iv4K6Kle4u|b2A5On|4o6>;2Ooa|&90c|EV6tmqkj&V+2dtw*AJ zruX#hCMdHPUQwI5brfr7Hx-{0Mhbd8D`$qqOLTNk8o7DN9beTq@oJ184C6%aD0ukI zo@$JXpKK)l3y&0Amz)>mj!lo~;|Lc+<;a@Cf=&A-JC?j<c-=NWxNM?U(~vJ3*Vd^D z)Q0-#;_11$>3x;8PuDfFY2WDn&FhNMgpSVUGmD`<yNwlJTWmgSVP3pBZQhs&Gd#dH zZzyK<3u*Jcl}dfCBdvGe+L6J@LW6Akhs)~wW@@+U3%~uF`={o{*A#m-=$o7D8y~Cm z-MG8&#<{*5r}}Q3>AUg9z8eSE3@H<vs^c@2?hRKJUlDJb(X}==sxP66Z>D<A?73La z>)DLly)JQ=GdEDXS6gzC>P+kct$S7CTOiGAUm#tSm`K6=GL!V#Z(ZG7C{IqTq-dU% z$(FRBgw4}6uJrU&IQ^S0*0H!{^|_nQ+PvxP%I3@U;-n9sn~E>$czKyEA)Re5zJx3u zFx~4+ntw^VplALpH5Pnj^D}qfys38EoW2U@x|r2B{%19kCdM)zu6mu}v6Dt7ihp#A zo|bymd@*<5K(C*Ji6t*g{C9{@m!<QQT5(Pgs20Y>S*lZ)#PLx)QO*m~hT<Hig}T0} zB^}I98qokI4<x!ynIB|Jao0RgN2Pn<={hS@dpGeSKcmZUa`J*6eahAgPtV?&>4QD> z*X0lPR4Pjz{9w<vicZw*Ar<^>J;j~B=?Z0={nuT`@ju5?dc7C$SkUFT?cR%vJMfZ9 zW%E_FxlQ#4F<+yP)F$VSNT^Qgk=1$vac^|YT{#GszN2o|Q)T;0#2i_zvs}n{)YBw# z5H7?t=_?lu>Bo_}RckZ)>iFsUl4#TXBcO6*ZQXZ?TQa+I^ToyIhE4p`Cw+6!-5Y50 zm3k%|niZA5b%CQStn1RUuAKF0SX`B9%o*z&sP+xa_6<z*4@?SE!qX@E2KMv~T--PC zyuN`K^bM@(8(7;nFxodT*EcZJKQJ<L<UD@LYPYr*UvCnWuE$+-WNBwd=eMsuvb3wC z^E>L6c65GU-3c9?KTx-<qpM@rk)_K!x;oXZ=;&H@(~+g!9bL=SJ))!Q#OseNJ+Y(f zk?J1V(RIp=N0$D#j;>SHJ*uPY@z?YX95}M{$2v}U+3@*S@a@~43wm~sj`iqn(-WCv z+B0y&k)<bfobd6zN0vUe<Ai@2IkNQRjuZZQq$&GIU*&myl^f!J@4c^k4N{9|?*%>e z?*@8!@9o()F{_^!RmXdF*X9n^YEwOLuG}}!qc<rHD&1$dyKCU8V$Z-;KT=g^PSoF$ z?2&BWazW4NTn~@_(W(lxXX?Pd-ReH1({kV08+!DiSwFAQn_<tM$<e(%cUQVE%w!B) zRW4y*?5N!XL%nAW?pNjNDBruS^2*BE{dxl`-o@^&+`X-TaNS`4;6~vrVclTwS$A*i zJuC2RTNvMa-!b|!xFLCP--SIBvpv&OlZSfvD0;9q)-$>X&*#Q#J%jhx?z>2=yKBmM zttZ)9q-x&OO1HjOE?zbr##SLH!Zt9}O6S19A{vj`*)1DXx^)x7!RWic_R9NrSGtG2 zmg>5d`DTq`1_pFn^bf9AlK5ZGpc45LDO4J-|B3lfX%()K!B^hDL|1QLMOVB2yMddy zM}wzqtK9SaQt$dND00z#=Ag1PJyj!qJS|46{76zco0tkkt1EqWL(hTPTF?D8W$-+$ z>NA!Ouu5BBcIs#6x)&(v`==`1dW$+LdxOfsu_;mz21?ZojBP6QXx#;3pR4Wl;d%-# zr5|ak_C}|Q0-WS0{e`KO?h8r`wTJ;lpy_tK@Q+RGotQha^feui__51M&FSvFphsV6 z@!5Zj7od&xV%X55A4%xLu!xk)eOvmPUJsS-XOtMYh|HpPN<|KgZCtp82G<V8+5cwm zJ>aaU?*8F9XJ!_5?cG@K?y~f~z*42&rK}=SL=>^%0t+l<7k8JYU>9oyMPksXSL~vK zCiYGcYw{R1Cbn3jsL^QD#IE~(zvnl<J9C#s&6DT(f8O{1dC$4`ob#)v&Y9C@W@(4@ z!L_Dn%oJ&HY*YNFfWFBT)gL3EqHZ-s=TB-i(?8VNm2^$5$*k?mVy&%n>&8vB*o;ms ztZkZ!Ccd_N2jCMW<@)<0TPcCox>I(BWl-Fz?y{*ZRr9v+Z}xAJ{O-Bx>zcxFc^W(H zA^%<)wf-XoWyAjMq?C4Ld3EmKijGsrHMldj)|j_eQXN<#EO!c*H5OLX)z_7CrViw^ zrkRZ?9L+)FZJa-EUVQ_bD%x(UY-(Z<(AaN&on|D3bu7+erGfw3xp4)XDJ=iDN-?{( zpYl(sUzF0VBX&a=CgjSZB@Ls3Y-V_>cuMii(wX%ON@gx7UXU&BfM2GxuDY%`&9i{c zbmgKs7J+K(a4M&x2C~Iv+2U!LY)M&{$WJ++=-LSFe4ybIy@=>i=My|K0^t*^k3jeY z=W}{cTGj>s)HF9*?1GVE3M0iurDdgyO3IFecVtOfJ-m91)Uw4T_(2HHNhRGe#w;tz z99xoET9O%3k|`?5q)RfHl1y1~rX=0DFqIr8SIKyC0@oUK%$3Qcii@&nO&F`T>a|$h z=v0lRi+Zdj*P-^@no^^iO?O6T8+D{xC3MSe<cmy)YK$MS9lAAqsyLPE$QxBXMx>=3 zhjeORUOuyC&b%_`BDHHP*x}But6x}`s&}VqQXPOT?T{|Y98lJ{C9$j#q)2cf&gRTO zvzN6kC)lOKfTSK=ZqnczQ_xxhrG-7HwWTDq#&Q61Qe}-28}3ty<n`{5s>7-$F1fl~ z^weES-O5Kbt#C2zCH*xy9Vx*`R!EVohzbZ?QGMQWa0Y6NgghuUytZ-Poa)86Eu!1x ziV81ciLz06A`L&x8Zkw&X4jUakfK|T$N%6=#}s>I#96$wcuDa|38Eu+j>uqWKM;LT z&EO7|4Kvb1tEY9Oe-NtI1rBSfpO;BNnzs;Sr#(A+G|{zvtFZ1cN9M5oQPR<IDkk9I zO#iJA5gR52y%SX4c)0yEA17xLTB0*ZTPQB<_urCr@&0#HoEIlrhAbS)67CNtKkEvE z6<;`@<G6<U891@!hI%~yh`!z3f6Hfd)%5~*<|2i~>#4Ib^NS9OcH)H+wI3ATf1)V! zA4zu_UtP-)RdrL>@ipZQ3KXUy{FKG1+-XiU=9&iViQ%SD-PC0mW+S|n;ouqavbIAC zt0Xn45(GP<UGX@AOv=hp5;|LJltJxW4sA1q9nh9V2vhk;gaeNRI|f;0)2O~jt}ntS zsY^qqC&aabQe<{*ufw-!c)X-h)_q%}xJLBv%W%z~m$x(+Sz}M>8hhVy)lFPGNx6wP z=8h>YsMk#EF3amIKS9JR>lpk*E9)s)S<l`wlb7Z#wVC$lh{_r}rBV(BL^~ilWnB^C z?v};<xuoo{;>p>y?W_L18j#K|Q`k}Dez+3Y7iOQ$q)>6$i%@wbZZ!j4L|QIu?8nOm zj|K0j+sJeqUONMapJmN+X3e6OaQBFwTP4cG%Z*rG7h|F^#Iu!&^+T`gc(=us#%-}r zFI}`uAbVDHjyZ}KVI$*J&-Q<7d>6a#&#QXb-G1}+vv$wh5B|N~`O9lI+5v6n9B6lc zVaAJg$9*q)+*a)S$wF%uJi5~E|3#Ni?0)B5RA{%U8nvhGvh3a^w(UhPA7uSqnx@*e zM?H46-R;HwyV(K1e}0nf^ys4%w*RsPb+*sk3zpgakDgLu2flgdRW|+bqBm`a-|fB3 zmMtIjTifrl(=M_0?Tv@nJvR<nYImqRY^>dH>1UH{c<eSO+a2E<bF$sJ`j>Cp?H86j zZTETTFCA^qi|(Cf2W8&xY`2}Xa**BTf@klx?LKba$9D9;yV<t=;PJHGVSKv6h6h~u zsx2O#J;WA$Jn%tlZawg4w)edQU$mVMzXEa8|7oUe|JEse?4I>|{?>MT_!lQ)O{0A5 zu*%Vgj6ZzLxXSUBqq`=7ROXt@u;O&_;F5veiU$`DEH0{uhB+hV&TCpc`Gom3^J`Y5 zxXt5saYkftscx*w4y{7d&9L2e@3W|^u`k;f7n-p}P(KgtBU+&Dm5*=4Qey3*R7tv9 zN&1-5bh;b<#{gn5mBPMII$hkY{e;ouhL0TIu3OXGdF?tJ)1ialk7+ky#OQHIYQ#0n z?e?}i9Q(Ru6S;%CzRPq?1ovPb9GO{PKEJ7UPGdI=)}~?^aKXW;RQJJyQ;Azq|5W$U zBs!F=+A@Q@Y*wQ`LHC7=VyGMPxM4#M*I3jcTHNdBHZ5_kj_1@Hc*+P{Y1Q-RG<9!D zh!Hrs!L8NKQ#q-d%tgGOTs3u&oa9DM8hRygqPw=Hv4@;inH;lK<S;oVMd5_}Y#tk% zUDMDW8^)j`N*ocaXGwLfZkRd~J55uYuxD9@KB;C-d)Wvst!|v#1OLfWr`KXdH=5G) z<ZX{fIOf*qImX5gsOiZ#nc{p%I3LkCf7+Zm9dOKx+3OpX30ekvL3ch82PWs%^kjrH zIW3IiX*U!5^6i^2vaD(9L4Isg&A=%QSqAJrb#84-M14y{bxXveJVcMFa~I{a^sdGM zgW9?Ccsf3gOR!kb&BIc<F%N?@HRT}+i@VKlZ0N>Y)|_r|=FaIRn?&7EHiGEruE|42 z4(-6p5q@F2t;t{mPh`++N~TUNOwX7)HB~+lH|JFO@X1vp4;e9eY*p1^BPL89I&#8c zgZlI$di;nHV<wER95W$RQ9g$^o|?u~`J8!D*o7UOik~3dch0m_c|)q4Z6&p+UmqN- zOQp)|Q&Dp&sctAOpEskh%ITYeJy{G8%CW%M<f^w34G=KUvb&76ig{RxYeZ5e&goiS zS1;#e@C42LI-J6o)?aeg8tH#3imsf|^*G>w1CH$8qel)H*}X^K95A+fkM233GRZcn zdyif@%2C~W^vnUHyZ7jm1IBdk(c1wP-MjZ4-o1N81oWtw(7k)FcIb*~%c|#2>(i@4 zbXj2Y29M(`>W$}qFqFtE?DDB4>H3m%V@bNYG~HN#fYd=b9`>43Q$DS_0mas%N4i(K zV(XOlTXdCW)oBceJF;P-Gnmm;1K3%t!RBTPLxAkYVcE)IIxFc=*0YwAk{+p4WvUVl z4+n|sFzjheV^rtnC@V02!`>A~OiD|!BTZu}i8;&EEr@P%$EnW>ERG(w7;~A$bKR;* zB%azh4D0=rA0+avu$0weg2-V~G|p*XHjRUrA#Q$#DH_+$(F-@YWL0A^W-iZRqzj9c zf$O(qiq>NiEC)IkJzkw+d2`c&BReR@$ul18?OHUqdhry*Q9rjPHy4$)Al!4@_F!SZ zIn`5Y<}{{ogbp)tETu+E#f&zo6$O_UWxBAvgE58X6~l-dvHFDTac1>`8rk{5p{AyE zf5#>}KvVI264N)o4lB>o(gPfcOR4js@oG#fEX9^*%?!*1Ib~_Y6K6A1cnqx?8%kVM zls*2!j!uJ2alx9K?ngVN$UEi>jH<Ak<IFKE<X$?97c5Lm3eyZ`SxYos*hdnFBXl*a z6-?K0N5v=^x1+j7EL=1oqi&LqWi_7ma9K`wDjd&_&#9`dnZsoOlq(7e)l=Jq9TZN> z5gqd2^kdYGlU)6aDA0j-uns9)Wn7nMQ8eOMUt?psaNv|`EIBtV#$AzHFcAxvMny|h zeC4^}J|mqmA9sCbeIPPBZ7Kk?3z-(oz>yS8p_sU6eWa;A#n#0~c92&WXqe9vUWJ3P zF6hdA8k=Ex{q%A-vqIF>Q8mPJ9l7kt6-GXk1oX6;PTi%hIlXY(N$IZBYPj2hV#URf zirV@X89?rN8WZCHjHn8acV+cMOhqG`Fz-dtU<(`D6)5qUC`CTQky<ztc}?U<sswv# zs0L))?NOHYFG>~maJA+hM&Oi5p12ZjPOKVgAyTIe1+~=JSd3#ANNG$>ccBiEOs(%B z<2&texYcX6J1P~m+Sane78xf!U3kn^Gv0!;=pbIdNDEe-Y8F*vsK9kKR1r3A=Hqgl ziIrneDdido3cskZvS<Wa99lJQ;V6rlHE4EGcaUhYXz3`d6c)iIcW?!U97btR7vd7e zMUyMDNSe*hU0m+M&{isKU1bsfh@uIQo>GGzqqcs21E<|}GvwlMqmoq5bdT<-j%Y5V zHzqh2qV3MC<*sPDldHRd`RQ=ap4H*zzM#6HmW}a8s<CkR|3pf<w`dGS=tJ0D@uEtk zCB=<-Q(S||LaMMu!m-q`fP2T<_*}O<w|W|i+&u@F;wVtM5;WN!TBp-$&>kCbvG-(* zcrdXEPnc>utWYj41Wm1-hciHZa+?J?99G5CgG!XuHJsXM(ON*t&7JzXUI-P1yl{l> zu>Dgd*|qH$E7l5*$1N3`c8yrRcgOYEK~1U0ZV)drx6CRV|6s+oVmYPCxSF_i5zu&2 z0C!`oE-=zOE!dfM>Log~c3HY`37dulAr6trsre!Pvc}>x27~T)AeT*Xx@!dUbSq|n z3c60CINc|rVxy!SkIl|Qet8J6IDJ4wV7)h@7tOW9RN**R#O`L|VnP=*Wj;D+xl*y( z+wmZ5v7^7~Dt&vR=i&{y1_yXptkD(NnC{dy$x(RVkEtKogn<XDgM7HkWjlzs0xq+; zwnu6@Pit|yXOyA5xc<kp(kC}FPj=X;!b5*NQ+e4zfj88+vzG2Am&;jBeR?Y~6{iP9 z8O^cgr{wrF?=(?Q%0scd(YX!|_d9unJk^K;yu4AP-R6cFMI46VZtnJpYdMyR#z<2* ztwyVk))CYFFg|UJS-H3=)m7Lp&F*q>tn;U;L@zUlxp1c;apk&UiMu1PpDtoY{X;qF zpX!wus_?Gjn$P-Rv@w%s6b^Nr`1INaZZ}}bHJSW$YMgs6AvLYGu^J~mF(g6X=CY3> z#Lw-upc@>3z8!}aW}s=-BlBqe=)M>Y7C8QAVkqp2BFFvBWnb@d5@{=Ot`8;{GjrMj zXhwL7935*i2N>(7p$*CBI1S~I>xOk8n(oZ{bvHvyKMLhSc3lW=1<`mCXECSMFO*3D zx=oxv!RVr?7U^r?%%o4M<HDJ>nAIX0%vXVAZ_z1JSmk2=0cGgx5~={Ts_3UB%k}76 zO^S@)e>f>ykAIL3@Doqc$NeOVpftsG^Gsp8A7n%XZe@7w5M`TJy%_tBvd4`9Z$s^r z`Dk^zbx4ive}vU-B)Zk;R53QC3OngtH&w&qCS1|Nd<QkJ6`mVN%S|v-nEuHUNIy30 zJJr>vuyiE%RbE2wSbfyd&vX;d=-yVG)*-cyZBhe9&Y9y*qoAGYwx13<*9YerZ_P*^ z^~_|4WwOIFSuBzspRLYL$xh8q%hqJ4XJ@#x@>oJWD3cwT$sU}^j>;aA$&Sus$7IK5 z$7K)Aj?W&Josc~|dqj3(_Q>p{>~WdwQJL(~*g@%1UEZs_PkG<+1IjD<mRB55-m@Z| z?s-6YuO8`iuZr?sy~=y_F7MT^q`bP@M4gn6;PKPOY__tn(_!-)=V3U5(H(D~vpMc| zGh)s&qWLfetPQi%+3e854y|xUbCMRk!+H+S%`#Hc@#YY$AwtFQ!j)ArtI+#rZil3Q zE`+NUgXQF80?IL-MjJxMR9D0W2y|gQl*eX(jw*3elyPQmav|H>uD5r!g}IgM)tr)O zAdYm6D4c|Yxty}|j2-9ls7alQa<?)!$6kol#~SoXjab2T6Hw)H8ePZC`wn~88F&{4 zMugdHRbl%>ILS{=?^P^0#|P_y6{FpICX!Q{Z1$kS9#Qh7kWf~#e1IKBF5Jb#k=zUv zx<(e3V)2@*40_K2Up3Os8LyT<_zo^Sb3~j$Tvx8|#G4Sxxv!IIL}w;b89v%w!-2G` zplS6rjddMZ2+?wbD}fTOIh3S2QZhN|!C3@s53#<w;{L+Blv^Ou!<)T3At9p*4;WuF z4O4kH1$IjnOmH;PirYuWXowK6X;Au*LhN6vbl#dqLP@fGMh_af#mpcvlgwtv6sB=u zZ*>i1i|IEKF}AS%xV#wzQr+6z0j%Q&9bU)95jR!eq8|gpp>A_f<`pfb6rhgpIfiq6 zol&@E4fJ9CCva@3N0D-L&Mvaq2?rc5!)vXKT)zq8;r*yl7FeQwKyH<w9nl;6+*k|5 zXu1)DyQua+m^kQgStQYRRl=xCq7@P_99eiEP9G#E2K`+F!<tRrJVwWKI`J9Hh1jGR zbWJKebeyc9<m%DoG;d8tmt9h+5xF%8te`aNZv2!Q*HGPaVeaxgs_^`{UyGK;a`!<V za&gmyTxYMX+6`}=D&{y<f)1)Ag|aEB=2kY_zg{7(LyZ#3V-eGE>>Jl$O{!zb<dRNN zYNFH3$mP+6%SYllgQ@d5<!%xC){_%Y_n92I7G09i3;pM5I;L>Y#Q$Is3%NSBa0uG_ zf3T1R9mf?OGht!94jz%OypEp(V~qMR(3P37Tlq^&gqs%DyJDF;pObTR^ymrYSvI*R zAcDz--7B@taoi{8Ihq#Y9Y;FJaO&f2DhM5~7nRIeWhuaoP(ZBi6J2rnqcl*a^ouC& zrjai-Ri*MLwvd{pk!>-v1+k`Qq%u)1Ku<?c<Jxemb1E>*=pHekL}ZaLo1IzMbr_c; zWfhVQTZYqIiI5fB=){bhZ9z$GVY^B<#bC2dBp_cDjI#<m;-FM+I^v#$XgwY<&n|3_ zUMbf-N*eSIjbWNnz&fX}_gJnHY&pc|Nw7KGMO+*&jN}IUkepjM<fltY67m}#bkq&f zdqr!*X)x6HSB7{@9F3GgombdpWVEvMqhnmG#bi$?EU%o>$aV2})XH^M9mLI_r|lTe zm{vEYu^G?d2$nCJuu(pKbe0cx?lg?<&KG6ZmJX~KoS}1-!)G#GGDVrA0hd*0j!ijc zuw_ya*)a{zbj%!0dM1rYR)rf>_D_xMHdarMVWi({ODs>B6?Td6hjC|Qx;t_f-BY5S z5X>58;NUriVIAEDPI;<+s?6_k3&Jd{|G%N242NkG!W|;fEYgQ#nK)LnwqrCjj`BA= z(^V13A6C9pB%^_@-MZlf-5iWZ=XC3qy=qM+Dv|bO)n$#DbUt})mtl$HPuRA)WiB_b zGTjsCvfA>pTBHc79F0dOpvvKhNT6#Yv^#^i72UU-7$vA@%Q*Vu1S_&EWbUtJ+M)gw zfupS?mz1X9wx5jcgqq2b_iS{yD0j9i|5#UXd2#>rA<@aKv@7BaV7%{#S6Z5TzAI7* z1eWicGTF6#v>p@B&f!4{%sz9+Lu;nttWoQ1@oCVSX*ed0ZNl6Gc%o#Go))dasWRRj zX5w95bND_lv@FKbs{_W;Jfz5dsJduIfCo-ms7glEiXxJ?RFhp>9wmDM7b|`sy3#zp zt!eAsY9X+wI74wuTj@+;ajRTt=Q*D2+O29zyKRFUCmw^`nl_F%a(uX==e5e1+rh*f z0poZagpcmhxUtPmRdqbFQyNdmM7tHaqa?Cr#OjjnJ%ytH+|n-Ru$2QvJUxS){vVGL z*=!$Wb7Zvh=k9*8_t-TzXmnLwh*@eQXNq_RowG^YG2Fz8hd$hZ18XZ>g&+0PG@=53 zL><=Xd$v*ui9}Cnz^lP{kX+}&ZsLfuA5D0liLCW>j5PcRYguD-vDGv*$i?1At{4Zq zQC@UhDzl>G=wtbBk4<ruMRDii$)#8{XfL<?i!#NXiaWOU@07bulD!mf*>hZ-oiNT6 zp}ptCh7=D;CGmi1Q^j3Mx};0G3@R=!DNiHjvf@EF!#232zM*8vlH&Fy?c101$MJzw zDT<)XJ#rrb(WB-`ok-@2l8&8-Dw~4Wf7UT}h~gNMh{kXvU3_fu(Kx1klKxAU99weq zk}EUfJ1RJEu&uac@Y0f#2BJ?6_RL6FvzB5$(l~}S7bk9`rL@lR@*<v1bUVsq&xIK! z6#r5qiVC<L2bxL7^%*?dR$0ksj9qD6o5|b_)CwRf(VauABSx(_?_1x{MHauxam6<j z7rSEBGHs<qS>k0VtCIfx6Yp`5hS0Io3c;;#FLGF!Sy`E_tVE1>yb=jvT3ltZ=1MV( z!gQ)Vc6#wr3Mut6xAEIq2AJ4sZYr5p-)<W2Q|+;uTh~<I4u>gfSV^67r%*d`+{*`< zCE`+CilyjDI_f02gA1Td)J`v{t?Ph2x;gWw)xgKrY;98)KCpt7A-pZFp&eg~SBhy> znY&Z8mtDg4QaBwjvEXFB6z_j(FAcP$etJ6&{L$b#M7uks7-O?BN9~_GcXcI5Hs5qn z+SIVv)lw;@5*?yl#CF_2FT+~&oSJr=+7+i!MxEpL7PIYgNi5agHQ=6cup)=Vxg6KV zJ06Hrn0)hu%A@hJ0mm{F7e$bk0EEetlU>nqXzdKAr9+g8^%cCfv1ZUsu5oO%FE-vU z#;-sF;NP{ERPo8KW}S~?J!l_SujtqrD{Gjeb#5;`eOu35;u#ui@XWOdj0ue?Fs6+$ zZH*~3rpTCWu#0aDws3baW=CUoGG=FEb}?pGV|FuUcVqT2W=~^&X3Sn0WA-*?A7l14 zW<O(6*!DH1#F$cJ+8I-3OnYNG7}L?1PR4XIrn@n{jp<`dUt{_ibAU1ZjTvCfKw}0O zGuW6R#z5y#V}=<s+?Wx@R2g%iF$Wnl(wKvd8D-2N#*8s$tTE$^In<cLjKOBc;l><c z%tT`*8FQ2|M;mjDF~=Hn95!)`Io_CRW2P80)tG6<OgCl*_CJiNHD;DEvyH*Yg*s#E zjhSc63C1)S(`d|m4m%I=jM>(h{f+5tOc!Ii8dGje+L#{3R2b9Km|n(I8iU=U@x~l! zOpP&f@h*W3-i{yM(%fu3i;q#z7Qt>08^G?EXG6R~z71Y$z6(Cdv@2fQzB@j*@zZQu zuPt8VPP@Yo+O$X80k%CpL9(SS^k{qhi0$O{a<(@<>(mdQ4(*IrtPgZ{fH%OagdLQy zL%n=^pm&h7Bk@A_gY)btZxqT|>}XHzV7&BQ>=Ag)zS>Fn6wp!loYc|ytWIo?#fO59 z#fKfo;G+|LyyNkz`Yv8IUX)Keq=lXCO~<SEr+QOhr+GE7Kl?vqXX4Wd|9f_rHw>Rq zT8vMhiap6o!4CHhhh5?=&DoRj;j#(N&hln?r@_v4b`Cx)IUn|PXV1W=ix$ByfIT#4 zcg73(w{B<PlbWag8}>|mit9}89N4oXd#-n`R{~oKd!F}m*b7><=X<m(yo+F0!d~L+ zD(_-vf8k|dFND3+D}(KcPY8)!j*kIc<+Z~n%CeEY+Pm7j-20W+9d=D*uko(I$JS2q z#>4IedtJ_6>CxT@d&5t%d*P!C>%7}w*TUWcdo%2M*xO-mg}okjBJ2p*D`4+{y~){M zdt<$(JbRYcn(c^>N)_kqZ@iywf9a`h^cuanIosehc*|h-guT|;ZunT$k+4;;+vM3g zd;)QQe2TN)I}COlY=79}a<(r%15pdR5OyBy39xtmAFy|Mcj1E^_uyj{+rh4e-Ot&5 z@X4mTBdbrqi0?XVi|$%1J8lCCT_1moZkye>(&>l53m<uW*R|6PVFfNg2VLOcAg75s zsjZFk8Kz8u(<CuSY!Wl$7G30Gh*Z%L=5#Pl)xtFLZ@_P%S2R%8fQvCxK8}g`5N?S{ zQ%^0SD;si<KbGNFPsmr`Eb~$X?FG;+=@3oSN-Z?>eQ-$1G!Eh@C$4ZaHJVOpppEN+ zn#spoW*fxExS0yp1<SIHOH~oL+T#Dytkfm-wTUFCSL05WKTDBmPg=%7SY((MhUjbE zN<A=_#D_>(8<#7Ifn2oAC-WxxU{06==1W?ggoq)x)`&>4bjhdOj8Sw-2{X(P2MqL; zO6fROQkZs1OIy=?F*oF+6@KNA^h(@uO*1ylb$~ee)ikMjaTTV|{EE&vWvp+?i(b}? zq*G$2Zc<p5Os$ldri`$*#Qa#v$9zd?NK2&#VkseUh;B)dTrq5a0>>#8Skpti$Wupb zrJVC!p-NsU|L<7Fqw<pL7}ES}>1Yb2=B4hKcPVqp6T|u!eF`a;#`nMPYujVp>tAq^ zGS*YlqQl<iRB&#^6jKY#BwHGV2&HU0Tb6){i_O{g9MIZF^mFZbE>vQVa{gqv{}s_F z)7$j$CRl!&XjrVmh1y^`)dJ-`3(0CAr{m9V^$(GzHVE?(%;zE)*=og9+mFoi;Al1< zN1FfY{1+lA5#eXi#4I*{bm0rlLd<lC>tGi}lETr`R@f83(-HH&B1bt1P(6r;+VKb- zX2)87LTT%!TOMf=baXZQyI3bWHwDbk?S*!^U12Y>7u%Kg61&R&!d_~BX;<6J?B(`X z_6mEYy~<|o)pm`&#$Ic$v*+9E?G5%udy~D{uC=$=TkUOjon3Elw|CfI+uztb?Opb6 zdx5>j-fQo(_uB_tT$+@=c9cCBn34D&Vn^5mZGSt!4zz>pU|SV&9%RS3&}g_v+Tjsa zHS~9Z(}C?^_(?0zyU*N<ob>a41@~6`<r1Nf4+M($Z@2|!Xe-=(FdG*1H{Q1q{l461 zbCUw&y=nH~9D*ObI?6#7GZ}u4jF(ISW^?@HA`L&GwG;lw=JI(aLf;^^eeGvaoaEar zqW|5@MChM}pV|6bg8mPLclG#@v?jB}EHy{x^ildu;D<QOFy~g<1K@YE9c^dZ#dfu6 zTW-7A?zV?LIj3_sZvnz{FkhwyF^@ax?IX;C5q2D~kD3i;DEy4$P=5MPMgTv+rlu0} zT{U}~y%I4f79VcUX=-$#esKA*S@bJ#``F$N%g>O-rjw(e=Md`?T7PZUIjFn$+niQ1 z9d8fMgJVstg&y4kIT(v0-LOW|Hxbuw6JdPj660<$vs*~l+c|c&orn16T7D#M2aMd? z01EN{BB$e1g!XAQjmOz35&mBh_o?QToE#%N8_+VWq10l%1bqko7diS#aG$V`MbbNA zDQP>0uX8DUz=aun-i4k(=qdc4_8#+|h5uXpAIG2OCFhO>-|m=={LDdn!Q}_w$}pne z7c(E4Bf)XB)7AwmHTX~{7NPdXqSQn78KmM#`&3>Ihd55kb;oLu=gq*f&5q{Lh-V-P znCbAtb0HSVKzEqi%oR>93-=Bea_Cl^dn4STm=AFcX;cLN5mGf#ER%C`$3!81(C^Dg z@3-b_g!TsS_waXz|B0j2I_atQEkMV(@TCZyZca02nKK;6`36TKy@wsm^B!=z=fl0* zQKP7w_rew!q7TD*T9S*O`$J!de~Fi3uoZJKmg?{UTPIf$NgovPot?*jG3M>B0dqUJ zZiqOA;UNbtbm@Ks?!H)9RMB0q28oYjV(Ah6R1T|D`gc0)9E6U=ss_zOufT2tJztp} zoX*$He$Gel4gYiS?`fCWUpTpQ%{f@p+#PG2p7)@+-{G8+gmY~oEWxGDI|Z}a#)vlG zHbrqL^Ckoig}!l4C*ExBJ{jB&>l>c;d&hf_$vD~}a7W|+M<?0?3zZ&L(^@wd0ey{= zis@GZ{;QY9@??7~y_R4pHm2o=UNm#P;~i={q~JTVV~aHZ+*|<J>GsBaF+jIOm>Y7G z#ktTD7rNZ^f&a4iocB9#qqo8PuZYeM2zSJa;fvm%B8=yaaw$9q@N)cDMEDE6#Zh{G z?%kZr!xQFV^9Z1;%<s(a;rGf>?#H?W&0RUnA6)1S^B4F5bUhSlrguHoa@4HRfcG=I zEBF>V_$;_*dZ%F>%kvJ$qAo^vk>-(RGgcIS*gTCT;Xj*KP1f+ezR#HLt+gj$S$T%N z2Jp=Z;a_9*C!2#$jzXQBKgO)Yx|f*CBVWBI&5h=6@4w8mNY!)ZYDFjfJ6w1#<me2n z<-HB4D$0T9{Q}UX5%29-mpa9s3O+IGur_v}Ssi_FdlgoP)|#gx$-BVvD`mv`)ty*p z@~~c2gv+U+Ee1!2<HD=KV&SP+wA;@ffd!!HSO^+qs<AX&>s^OR>tnyf5VVbb087S$ zyzA^FGZ;&=zw+AIrGCb%3VLC4V4c^=RM-<uC6?Fzj)BrJudhAH9N`~@F0S63Z_l!G z(7>0WX?|orHNW(S1Qo%@_Rsc_AQMb6d->O!%76pD3jZa)e|TcBFlY>hd!Ggy{N01U z`oHyG33>*-g5JSh!QH`L;c?-);aTCAK^+Fw*ZHG^>-}r}ckRVkio4u=YX4!Y@LlqQ zypaJHtbgkksW+lo?_r<vrs0Nhg5BHS$KUAh5&XjY%s%FALc#tL3$Txv-<n6U%hA{L z_uuv3_CE{ynIZN7Gs618%XXFjj=$M|&%ADL$5P)d_C)WW!8gG+;Y7b}c#>PFJ=yCQ zTy12Cyi2fGuy?RykPX^}Yj8`m*tXf<4mK$EZBAX>=8FN1;i+Br=(4VA&7j6g&r3Id zVM~Xlo6&;pEk;Hj>1MGy&P_KTKWwBwX5cjgKkfTzUw&Bnuf0C)OBq~)0d=ICA9Xcd zI_wL6vlW<|9NzQZFk_pG+LoGQhdTy1V<A^;ZW?-|DIHciY|WrGuFHDOXY3#O>x0Jd zrhw^q5`XeGBEByW-UdZZxGTaRp<6t)Xl(PT%vHezJIp&hIMR-+T32<E{lf0*OI(*Y z-vkpa@1kvdrhJ>Av2ym%w7)oWZ^rZP@3%786!da@_jtVT(==AHWY81%MLu)<Axela z`sLo@e>w1V@XmwWS5D@YNb*BFws~yxcEjKG8!I0gGQqAHG|0c%elg&qfV!#WP5(r% zG+2jxT;^i!8hi%7^N6qE^8deY#s%2{*#WGv?NLWGOjoxkEST86I1V~Ker$Job9TU* zL4ATR>|w~&uKp~@j&kyA2Fac9eFybLe(r5%{eIfFsO?y^63?3uvc`Y9W%O$X%|Q*6 z4qF%88LSI74`u&PEcXFuUbkNaQV%TuR5-~0$iEux2>nk~FIV}0Mrz*y#FX{*GoaCY z7ttBk_QW>z4Y)qEAKI@2eh!!r|HSnTzYW$^J&BwxF}sF`Iz5Lt_n~bt9>t|w7_O^g z3zX7bD3e3T9v+Sj`+M7mhxj{ypZ}f1mC!o5d6UyU18uZ5GtB;>{|*C2yX&g0i>a}4 z1L~0J^H2iUA+8s_`5{Z-b$h?z2g_yr;(3b^URQOCojtVk0r%Kb{67VmA#C5fg}+0b z#|CQ#4K*K{-#`O3O)N<Jay8PwGZ=4BPt9MOPy4Q`;uTRGmV`eGS&NO8RnYt(QaoY1 z&oOQ6?9$aE+z<XG;k4$D{NZRD?&_`l6kK04mw~d>+!UM=9vJd!_Ple$tjp8(!STcH zL`v2Sde~iEdsppUwRyznLFW;hM?BV6>?5`zYzQA~`-pwSZXVGP(&vb;A?!Rt+R~Iz zTLX1_-sTbW!`E$fxCY^MRZj)=%}0a}`B%7{zT&SAuS0tJn2-EX!Tw0+(Wo;g24|Ja z3tIur(fCgV=9^%FdD^=PA&#Nv;YKhTGAH=!(C57FPYziZC=K+ci@?)Z`5t-zVm`Bt zl@Bzp_m_r$N4Z_c;hZzP*WLxrC3Xoyvk+p7rWN|@_I%(DZEk|QaqvUioMYL(?!eW9 z6%yb?JNjRQ`Com&nnA4FJDQ&Yq*@*e*@ypq7<x>XbLzg^MbLQ!d!75hOW&a)=VPRk zYdNEWnf@Qcg9hIYp0Ul(Am&;}dD_X4XM*h$Q12z)X4isOp{6lj0_Kl_^aGcL15vJL zLSoIJGs4Eo-+7<;U&CJP&2L^h{5<<`^D5UrJRd$8N($wkb7J_{;IC0UAK}_1t$Xtq z%_Ho~z@8b7ZT=J(UX$;Jo4vOk=YxoewRkEZUVn?iYY=*9o3kDDk8lt1f8kuFlBThe z*D=Zt`Fdt}SL`#Pe-4>)w$O!D!-BER8wZEMhc+8t1<A?b6=6qneK^GbAp9WwD!e&- z!RcnLHCBE&{3D;`Ft2$5^euH|MaqZaBHRZWD_=tywC%ra@VAi+Q+x0TTt#R{tj%9x zU5V*mSM?}3AN5YhorI~Ax;_O`%Z9yMh}D{cL(HB9?2G;e`UJZ@!pt3Jg7#tWw4efM z_q=x;W;5LPaE&aix+3h}ygAsrV4{D&`5d{v!e`$o{o_ae1SccqhlNxlSLkT7C`^O5 z3^C~S(Iz;9>LYWUE5Eva`xlI?`Z!#(?Wc&ZwBSSgFZhFlHvV(rw?o!dZ66E^c#rtd zZXPOv4{dV=>X2c!T8>5D5C7q=!A~IhIsR(~4MdvyqAorIByCi$4pYEYfFh)d?YvWg zw05@p&B2#p&w{bdthtMEUAHYL1cbE$(Dp3Y2_u}g1-F<rE;qM8N7AfEOQhu;{IlS* z;8f7Z6dZ_HXr6*BR!$;lUDX%%;DS@bMWOV|Qaa5+Rq&u^f;HQoZq`*@h8*u(a8$uC z_zSD{38uC?Wr&B>u*S-A^K0NX50yUSh)AczlNqvR5U)pRnZ%ib!wc3`ZRc`(BPfh( zCi3)scxHGf^k60%*a8WCgqCq<utTKr$jIkRd-sCQBWTG#J{S+VbyfR8?+BFgTSzVO zbl-*F14G`f1t<6=PX0Z!uxib=lGc$`?F!nsI%lqS^{0Ykp_7%m@VqX-pkFLl#zk(J zLs9;B;=XN%oQ0G<8L<36v~3IeA@2Md$cIGlx~k*+@BIz#PC{*?3NABK+c7P}f-Agb zi0hQ7_C4>yf{O~4Aua2wE&=Y`f*lI>Echij)U0yhvCYjv--2;S%j-zR6|QwGL_f~f zDV%Ig4^}-`WeP5a1j}U2pz#IlUBp}sS&Tz+u;*Q#O9LfuD7Yz-8{5pg!<B$&sMig` zvBc8m!8XT5Xp*iNMt3wAvJ5zLdu9L37nv`B6C*qd^{$-7wI460j|{f66C$0%9orX! z8jvmFs45)p{bl=aOI5zCCqr-Ta>TA@?))X!d!5NfzK1ysWyO4qR3D@O{2Ig(r+#8P zA+0D_0sO28O0c`&3++Acv5r{qDeGO?l9mr2*Hz&51-rLl=$3+K9cC}C60|T`zzxXB z=~2Fg+@+$dr{s_D$5DKD2W35P3yGQC%<2DSuKSV2LM)9Sw`VtR0{%TT?Eif;uh*P{ zIR(cT+-b^(N^G}oCDQZyycy-ZU*F|@JxsvW%*oGn)O<-j*wx+nu8x(P{&4S+^pBN) zlAq!8_GyVBJZG2o+#!H@YS+we^t0ZmZKNJ%bz_SW^H30kF{IeF+iHmZH64<WwkN?g znMLMzdHF<)fbVaCOKM1lwRB_LO{n*my>k+E{cA^jCT97`p*aP6^|`jQ=l#Z&fahJ? zlO>S#&T*+*S@Dw<<rq8eo(p>KBls3-vOBu(mge{$$^Tz-SHQ=)RQw%-2b#<6^u#`# zw4#>f^vHJo_g}OBe%lQyE=qmBPt(5d?R(6AzyH~lyYIZmbNdb5>z=(DQp@(}x_5T( z-O)O}-6LBpn#b>O*-qQ%dJ~j$s;qq$q=PyMy`}q)9=JZEwxYi9j6+|MZ|=w|g$JVi z?*gWq%7k;<_Vw*mrf*)G;yF^KB>maA)-PwDP|)A?HAx!7*_Mc(4A0y1$5<Dm9U}YK zkPuUoCvaw>e)s8F?)s!h?GkrglTo%67}EX?)45ztV=*5RA6H60fGsNY4Oh7SjuPzc zHs$)cb4CcRHMgJr5;fN;QF|Zs(0aO}Swk4gRJA5e++}(7@DOsf$}2!!aQXI!j9fv& zAuagzv_RKIZTAIpe!=+#@3yGd=h|VAme;%dP%K;0;`_$oD8Uz-M>UU1^s6hnQ(|xX z^R}B1!d|}DrQ6MDIk&k~Y`4YE?h`wZf8dUuw|>XAB@DmOt!L+dL9^zs4w71qqJ>=f zrrDLDY}w{h@}cW7L44lT@&J_8pr{ni3f8!`#4EfD^75;SjO@=q_@o|je)Dy;4wbcz zPGH|gyPxjbA<J!)y}n?Sy|v(0xY%^YUfjSQE5Us$Qna@#%Y<lN5bLW^zW|{Y=4Dsf zNAy$ll)S!z^?^we;`=G)-10-Wl8)IWN%`ko845<b=&86G*A-l!quddNZZi#N8LM-6 zk&=@BeMz6v)uqG??sTQQuKrmibj>fJf99_9bJ134o^k$Wl<Y!x9o(Pe5c-d~$yO}o z|5U*>Ke3Fc`!3|>uDm!m=33DY#l5=Vc6M?(^R&zJUH)DE-39kR=Obtvs<{SvZ2n1F zbLxIVAV1X<K*KT(EhP{0{)tOxiuYafDF6I6dwP#IAB<Dai-5cH`wI$AX>JbFMf-i% z5VZBaZ9d*i{eGwK4{cNZ{d(8fn!o2BB6D_G0nbwG{e3+!VxIVx{?5&J1-lk}-u&73 z^MkLysrdH9<{g7WQJgRMhx_SouWWubuV{a3+jxKY=ELvL|K5D}mTmZEk8jJr-7b&A z^R5mjh6BPggF{`zxU_j2FWWrJ8}yz3{Y!=X%q-1?&DRuE6ullAud(^9@H(XFnSw^} zH+*|S@ZopMf=8Ur!wN2FUKZYhoO~BPi~Ro09{H{3e**5VE*DRKhczSrv*t<78~pp4 zAN%Hr@2+lcc1>p}blu?J2ALbbz4n_M!nMsee}6NeYg?o>^!fmcVqdZ8cx;TX$5z=* z*n*qnHDROcpXN?;DYnTMVPSuTw=cE<9yZt8)#jJjsCvni;P}pcW(p3$zhrMP4`Fk# z#0<7)m?ym+HZU8!qF||QXC`_#`xlvugOzwprNCb1&j_ya_w;`oWX#Dyp-tJedEbA^ z?~BFbpV@h4FFV&%cvsp}%~f`S_d)RY;On3wwDxSX(3@(?{TVp^bbw2rZx@@}gKqXW z!94-f+ukm+%S~x`vA=CF*(<kKd5;E9`X~BF+XKP_{kMa${={H4j=-<>vgR{?Qo!Tz z$Ji;@SYBa{4rY3t{Fz=adl}$v=0fjiTWv1J;~^`sk$D>Oz5=ur9&rQBG4?C}c5|BT zU`vDJ97l<H$80wH`X8EY{Znn<V1X?O-UsJud<1#5x4;hZSNc2KZ!s-i?VaTB8wU1e zQ2v5#>Q~GHdxlT_U-+xNS5b;X?Q14&FT{bIes;0l-X3iqvc2p$|0Z)}a8z)hzZN~v zF?ONp8+;NRV{Z?7*<*r*rk7n{cMD&{_TNH09CNW*>(biApNlf@W!HN9g_nbNg|{ep z*?f(djzi4tf~-Bxoa3+c&kSBQ+xhpH*C4k62Xj`NpN9+V+Hf^ew~JjGzF~@RL~E`0 zroll4I}As=u12Y>_0B|Up0Qv03-MUa)G!Dh^19nwa47M3Ji9a8PQ>0;8m01uKgbS5 zdEMt9i|xp7kh4q8{W!k$fISFDzXqa(9p_(aerJDg4}{LisQ-@kG&{?m;2j?xZ!R<E zVhOi8yw!f_UyCDSo$L%8JnM{uXV-?8S|6o7J?s=zco&BE`gfqs%s^Y3VoJgWTW9O- zDd4ykEoXzBVondgLfY=cQS!U7@%vuzoMpRt*jsD{`;*Pr_8-AZwvD+t=!x`~nWuwO z!}fvoJL5T_W6|nYn!mwsZ{M=r(f;qT{fz}~A<Aiyw><nC+WD`Lazb73pXtpGXX1*P ziB|Sqfc--IU;eA8qdWbfwyS?Huy^@0eS9Gkyf2#@!k6rM!7FG>Q&6u=|5^4`w7vys z3rE<D{kxy?Zm=DK(P7_UhJPPodETz}PP9jvOU&6wZL$A*|1KOWI?=8T*p^n{8Xg}G z439C#L+45y37FxpG%wg+n!nf{;n(nAMUL+Gwt<$_SfXBlQtSh*t8k@%?^@$oXe~w1 zQxdMgL9hdCx3D1S=eG@p+J~^!Fbkc|Y&>9+@^%g9dglji{W=^q+|j=thyBh%j#hZD z`oHt%VykC04tTBbIw61ayk(#)^7;nzeWv>aZ`Ys_d%vB-#c1`Hnnv$Hr2SjFQ}Bj8 z#vB$tZ2lNb4Vv%>%LxC#aHv1b|IQxc7y3_nrv|J24c-EOq5qhD+&*ci`>V{#;OgLL z^AuvgHaH?EwmbO`+k^a({&e%QITuILHrQ9t_BLSqzQk|mKZ4RN^4I&X;TqjwH`>en z8UC%dt^LHFhJJyiVsU731KQ>WxLv|!fO`9j%|XG%{-gd4$j6HT<z6<k{hj@`(7hoz z*bel+w|n@{`mdrCp9o$v*9BP@=M9!EVG(pP{~PSb{y+Rr{BAy5Ws$uZrF90%XoI~1 zI#+m~`Wx+N|55u4B+kP1xW9jfz0hBdg|=o;I)rolR}f>7orbc#0~&6$eL%a~55r0R z?qMM`Eb^L=iv_{r;MHJEc$41@+%4W85KE)q-A@I7Kn-7pc5#}$Al%+RGMtLGfG>6+ z*AIEW_bSW|$f@V=gsb#4dp_do;cvq1rpWd*+Xwrg>=)Rb?5*CU@C<vKw_k9EO`&D) z8T{I8LOiG0g|;#*_67p_7`@7C_FV5ZQ|4V49EDzdvDw4_gNLmy|IdD*J>B2l`y0x0 zlidWaGlC15YLxf&fPRls*#VE$Z36s|x09V0Y_jK>h2T5~|2=Tc9u0jD;Q^y_kr&qN zUy!O^h~XNfeuKTn+zU#v_nzNmhnV%IH_HB895FlByV5YHi!dZu<o(9g?<QOB9gosX z0kgaRmVdVQYwteqJjA>#_#CxajrRHm%4>sNjT*Yg+-gEgp58e2bguV8Fx@<XW!b^O z@o2xZ>@qXk{>JR&U5|y_!-D(0^UamPgJuq{r<ZY<=3?`(yUvdb7MtCIYUq2_)C7B= zC9d{<g?g+F?nIhchi}4NfvtcWgFAwI5jWe<{NP5ktrZ^czz>0^5B?jl_{~<j8f9)R z)49k#9xyMYZLphz`*09x4D?^;bq;!Z=h*8ZcMlGIo)f%{ZP!b~f0@srVVOM_-0ud= zOEJ>5Ev}S%%rAqxL0j!D3r|IVF$?&`ct&$>@K@wzk=NFq5L{>*f^&ht30p32yObP> zG;YRW>-Aw_xHS00&JQ=>(C}*Sw%`+UcDM*zlZ(7M)b$mZ34ewbaW{0cJikKuu{RtX zED4@MDXlWUgY;Bzk3vhj9+cOZJMR^9Gjh7fD+)icSAp{9;3Zsbx7t45ss0LkiFc*< zmtaJAk+rCYK3)TQfH%zJi1ih7O|UBXhiURw;lbHgO{HCrws|==LoUHXV<Aqn^g(a< zfWHVhu_Nsh-Xg?*Io#FW&~P5)$oouiOF*t?QO+obkleRI3wkU6EZc<Az1%&*Mwe|Z zjaq%wKMU90Dsv0;oq>{m6s7x|zYJITiO9=%#QL6n-wqB=vps@oD5VwNS>Rd$ofd8G zi=aD7aVp|(@~wT|f5E@kJB<45f7w3avxxH+bC0<l{b@1c+h89wf3Oq$UqMfqx6b_0 z-!2>!rjW|P(2@ziHuqs0dW9Jl?#eh&Ywwvo!q?4`aQkpSY*Kw-RzTA!;o<%jDD~Uy zyGZjZ_&1`23{w1}>*MD8H=%tm!ARzq@YwJ@v&iq`y=!`)W;fVg;ZBJAWZbuAg#E(7 zSpU8P2aOkk%9>t?(51mTJKwBFY8Rqbcfz=34}YGi3+qGNk#MkNH+!T%8>PO)j6;iE z<PFDm{{nMJxVwEY7-z?YXN2qRq2Zp8+a=sT>;c>&w6Jr+KHdSrZDwz~GCa{=jI=hG zQk3eMVFTj4ESv!U)}R4B8|oCaMPC2lny@zPjFjGPE(p^8fZ%2`5F9-*##@KJ=I6nh z@H9MRaASB9{6RsFfMY+}+rlf&o?#tyEb`Xb5On~JK}S#*;b7ZW_I-0#ct`l_@BqO3 zcpswdF2_NyuGpq;K<`-LuHM~(hr?f@q$YUFAiW6v=M&zu<`3pMJhj|l-goXzUU|5k z_kjug3h!8qF$?^c{V9GYjCGcIo$V6vT!y}6x8QlRGs^$guqk}O+~n;RoP~Nk-S#jU z`ymby{wADfD=@C$vD>}8C%iwJ7tNp0qwW@Tz$4u~&3)ktoI`pbd@!uABg}HI0=2#l z{o7>Z>}0#tbVi7{KbtXrg?$hYbiQXlu+{ca?_?Y!t^kep5Ij0P#@Jv9#zO38U&mwB z{{sFbq?7PKGYdEwJM_fC#m{jhXqBnQfyzS-cpXQDJrjCGACIpdj)%d24)||4RB?rU z-SIVGd-PrNE*{b5qXvy0A1`P^n%9Ewb|<^Z=h)#cJYc|7@Zkca+O9<$AzIWcfc|LP z+XAzl{U=8KyZF2Mqp|X}+<ORlU+(SZFZcHI%luLH5IY(V7_|4t-~rAKz%EBEp6!jr zx1@Uc+t~yBIy252<PU&9#vJS)0)GjfK0nky%0C+6!k`ANxX$e3Z5I@y6-@POosK$F z=a+d8;+WDtz@FeA>YeR3_~Y!a&0@bCebW+ifuoRmk)QR~_?P%g&_mqnuk*)y_c+>v z{$u{*{%iiz{(Fe&Fz*BZTYrK#H24lshzF^*33dpIApf&q-(Vl_bW2^d>rfZ_<CGjz zMYm({w3kA71!5h6np<HG4h{*%1}n@s{K-QaB{3qz$ZawvwoA=SY^T;k?+P;q?kT}K zb2|K!g0q9=!3t=(D7Yb53yqfq1MRN?)7}}J72NB>4+ZFLP?O8?f8F#6?h76Wo&)9O z0PQ1?_VN2*F0{WEuzkE0{8#XY;PT*4!LNe91s{U*&EO*R4NJ^JNbd?$fY!Uh{Kjj8 zUToWNhp@rhJKQH+V$xyHuy@$#4G4z=T49ESRpEAaWOzh4DrEb>bjIVdfIPH65j;#4 z-HYuM=$aYUgtJ0z1y2TZaMb0*@O+GYmKfh3YcCEj3NHyyx7*oOxT;?_tHVCQ<>8s; ziZF`>fUD8lUKh?bw}k7$+u`2{{cG`tf_o6YH$+>5KO0xd1n;j{ym$wF|N9v6j<X-( zemdKnfj;64OS=jG^}*>b%!j1gSh^eGvOO;MFdzxf!X5l~b~)}nq*Y?>Fcf9;3^eRw zFEERsZy~OoGcc!o9lgM8v&1gNb-goEvE0S71hOaMf13Fd<|)*{v_0tDb!J%bkZB*b z34Q^86Y6fM=@^dkH=-S!1`V?TpAarJhofwl<0#QmbAx|6`iwC_#$Rby_>H#GpB793 z_hV)P+RYMka`-ej{}n7Zei(#({pIE~NGu4Ko5lEl9vl>223o!UsJA0vSu%;;<z{S% z?Qp~s<8Z9QL49zqNn+zLYl&$iCtW@i#Q%~!Em;3HbD@2ynVefH8S6Cik&r`Cdepca zEmz$*1`XYh#h3G-!^54Bd>f(^JqA2i*ZIe|7CjACpMi@_A3)^h$c<^ExzZhQVMwUg zJI#b+Z31~7^G>ZACv{1TnueJ6V2+P^FL5ckKfK0aRsJHE5~4IU*rD+5$4GU1=uPS* z5A%(6SLB#uchU4)*Oo3K0j5u|2U-@(frgwk*FYB^)2Go?6+1{C?O<zUZ;1y|aD?L` zjNMg(heyKI9E!Zk0|1JlFH4*nzlTH6c=W)J&Wa+}e0+tYI=VDb{kkyYBaQX{SRk!{ zsU3^^h?MJCJXRO6IxajE7{SB~bvZP|56O`GT{G4lAQwrgFJ6aRnz6V_sOLfGr8a6E zVI=nqi;Up8dQY=PJm*U4a7Y7ol##ph{ef}_Rb1u}N3slS;b%T`zS?PG$?@)-Q0ju$ zfLHI%5+`4{kZ<@H4>fIRh+B^RCaDkMN%Bd{lH5JxCHH?x(YC_SN{@%a_}YjKmjC=V zNu8u=dzSc^&RRU^1TSHxy0FN{S~j?cN*K$}(CVdyv6XGGEpscXR1#NyLbn7jaaYVL z<oi%dcdcOw&<L+ekhY}}s=OS7R4FfMwMlMCm*@~4rb*L<6E2uV+zf#=2yMW8i6&Y0 zC?jA*My1#y$fa>Ap4dwqb{0Z%-(HJx9j}i%?{!yV>_f;$PKKBdwv`Q76Jm(4aGZcw zRj~c3X#`$tg&em!!khm5h(V;pRT*tjF|48SIQBXL5AYpfC)y+JBs>Ouv^~ZiYmc*& z?eQ3KPO($%G+Se*BPKpHi8g}1i)MT0(qT)Q?^=YSE^>XHLh4h8hu8kl#C?l|*&g*; zC4FV|(3|vi#FWvAOk#uA^>yq??l&qgZC~5KG`vKIhOqWHtFTT%lV3_I&;0SaY28qU zR}|aQD%A1=h?gxv+E%_s(LjA`S|}r*NRY4!8drJWMD0#=TnT*W+6o^9AlEj|Wk~8@ z<Oqx5^&u3|AXlk}mzV5}UW^pJ6o_WaD@ipvGWr(jU9=1Z%Y4LqE0On=fLW$eR-{$= z!W;7m%<`A|r#mU3hxF<8eq4W7`cuL6fKgd$osO1A%ajmi-Nr^VO5MiTEknY$3J(ac ziZp5o91Gp5a~5cFwc>G7@8`$~N7-tqV>+%3Y@OLPC{NX(SkhM^jqy(1JAfPUzs+xX z2j(bSjkZaFuTeBsY-s4_a}c-6djhH3(#XquL{g|Mv;AFg|43s}iZ8ZVl~<<UKriJ< zp(UjHs7q<oqIiaBNT<v4B<)Hke~EL6SADF1p*aCK`$w`5m`O;Fwz_M8|H?^IauWC^ z!Ll@@>@{E1GRg5Vgfo5kOFgbaJ<_Z)JdtuN{?rniRSwqcFiD$)dW>rrN19_H7h*c` zn7FG)Z9k%YO)idiJh9qp6~bX>*awW#>9dye;W$E}i<E{1ig}9j+JkUWt4h&Vs28pR zF~kWzLO74otMC`gntL847xOYS3$T>&J5d>Pw}Ux-1H94_TK0Opv(adI@y?bs`DOfl z(2ObQSFVh|%CUWg79o)M0_S7DLh6Y*0#{^gl2VE#my`wF(!4TMe)5VwJUrzDDMcgs zU^odo5-@_NFI3`VUWR4?mNNV*uM9;)>#mleQdx#OCHlntGE^?@ZzQk1uqQyvd}(;= zJ|0Ak_|;dfgc(-+mVQi&`S#D#7IRS7)-;kL)IG7QD^|I;ge85wFs4!Kp)LHdrA$i> z(IfcQ=rMmR8}r3D@+G0IYa~UeyJL@2ta5J&OZtwmI~lQrHN16yOCHf9_#f60%f@^$ zj&UZTt!pGjsJljKS2&heX>Hx&?}>-lX&JwUx9)GrLphos*AdGqKVwbCm4vpgkrbi! zi_)%eEU(g%FG9OVmT_x%>;9HJl%t`H`mM{yvN2zb6Zu$j>l#TBYX3y)^W{}q(nM(2 z$TDsXZ{6RLhjKKOQNMNhST^R1aUvf}Ze1fOLLHPyeZIU(OPWLiuh%hZlVQc>`%Gg# zrk~57;?-}-BXBGm^TjywBq0gMoUu+)gjyJ-UAba;mDcq2!y9kadY*>1=2Krw8gVql ztKX7G;8-^1i*X_!OKx2wDMBrZ(ysbqZ7MBkA~Yyxae6fuZaqYOEh)s&5U+kq9)V-o zm@meOd@Q+jjid<mg(x+uFV?2gk|vSxyh6M}i<bN}F{G5Fuk@Hpqy!(!=gSCQIn^f* z<zlI%cI8UqL_%a3em;@<d_A#V(Zkn-iB-KZq?DwOLxMSpqFmWfmU#7(Jj$iM#-kER zsigLNzF4EgA)J57rG{`EyYeWO{tKR1)f+=fiGA|K&<iT!eBx=6bO}3jD~?DcrIOOI z06Ai<iYMmv9G)CB!mA<0s{gzv*0I8gA*IAVd1B~!6>&cCG)cOI9l8}qB$84|=~#dq zu~x+s^G1XxPW2>18m9l3$f~@+gp~4^TsR*~d~C=~6H93*=E)C<L{cg#9rMQVYaFC8 zY)u@8>LEqwu}j?Rk#$5k0uxe7?6<@cRzohDm|H{2(b5-*q*PKm<|c>g5^mCn@r~dG zR#!DD9Q$ve1<<OAA*IAVd1B}d6>&cCG)cOI9l8}qB;Ifo<&33c0dj1KC+2Svp1kA| zHx4P5zQucAXdN4z7*a~?lP88^8O5ug<jLnEhZ=HGA7PPDUnntOYk2Z}kduq`Btsge z??+a(3QR~TvELG_GKyC}mS8B!l?)3_=pvDfGv*{mtWojAd>Y}2Q$5L$hSmQYS^%w@ z7*a~?lP88^8O5uwJi<+EYld9ppb-i6h2jW~)*7BXpG0y=J+Vg7D_Z{MeGpmIDlj3X z#C}Vx$|zoal@J|Cu4I^8<e(7=^@ZXHj@BBUJb#Yll6qo|qF1zh;C&id)haL{rNn+q ztjZ`}eU%U$Nv>p=T;!k;3H62I2#(eoo;<Haa!Eb0M$s!;B$iLm0%+C5kWylwJTVl@ zC|-T#5pH5zGvp!%jYz036i0Bh*6`$cHIhr}i8YE|(eerEU#x2N985?lvELFK%lw#B zl2gOfOF0@%Lw;P26mcm<a3b-3B$w0^YZSez;}x_3+Sn+hl-MUv3?*d*-;yr8vF7{` zsg$Ep&RDxcM>M62gisj%IFd{1i8Yc>(<uI{XaTgbQAjDVPo5Y`$_TzCU3g>7`5{s% zN28pvc888=N*4*CF#L~5E~zKhNIp&Dt9agAtVrWkS<VttO6<49s*K{*&)1RUN`}eB zSZGutKQ2egaVd{t-}gR@<V1()i8U%L{>Nwmv}$5VDX~wU7>Z>SuYSG`Vp}uhqCOgx zh_yR(L=!IM5elKdM{;pWk{ZdU6!HIo7C@^ehLjTf<cXnJM)B(B>mar@LoVv0QHfZ) zLq{~>QXZiY`Y4i%Q<Bt3KBfEv^)FVW@iG@@2`MG^TVhp4@#^R6NOC2^<YFu|Dv=+T zBjvc1N3kDzk3@2!L-fQN6&C;RXaTfpVn`{mPo5ZxWfZS|z7AqrGvuN^8kLB(J9I=7 zF69vlq0b_@I3-Dq<Wq|HAE5=%s)-?`#6EdqD3(#Y`uRGDZOxF2`e;-l*6z>|O}Lat zD1`nM$;By2Y9yahK0^JA6=^&Z?JOY)CEb=-l~KI<Nts8IOnG5)sSyb;!XznzQ%t_Z zySX&RlF5*U>3<ekjZt7i42hfM(XdceO1YI^@h!O&PhV(^gC+^(OGzq(D|X5Ao|8&) z$GoC9)=tTPMOL*4tdy8eykc9*C|-TxREU0SMl>pK64JOtiX6%n>mkoSqqN7=m{)L0 z`4?UnCRR1X5JP;OSZv7?L!`z=xRtJW#VVZig{E4PP`=c=-j^;VNm+?UV^bZ3<)7~o zdM~o7MPNb<iJRonuuxS>xs_k>Ex8m=UucYjhR_!-Mx_Xzko*-EU#01*jwG+(lp_8= z(E@1I#E@VG&c`ZFW#|jH`1#tBTzKtzZjD7Gls5^fE|DaMa>cropMFgJC+eS&xRm?S zS;2kjD1xC&BarwGk#k~t4&}IGh@sDOpz;es^eaw$r7*UZM)@^8%KL@m6_;{ffS@=D ze*su5Wi&)T-w2$K&xgo=M6Q06U$h9P;*z?P;W$R+ryp~Cf%+#TE>p|)pg0Ln#Iycl zsZB%lW9>pwdW=`DuVYj$B=V|7I2ET@(U=oS1eBkC%stV3?s6b5Q_J?CI0=6aSS;0P zh<?5iIEgpV){-lhQGUS)r{a=Q$#7DdcuFPX_#E|5ytt&ZJt$7XN8sr>vDBs^`h;U6 za1#HW<BmD<L&`5$kyBh!cQPDnP=5MH7^(lSqtxSN+XxXySAAjyibD#=dR3G7#J`!7 zin-#D@(V`vDK6H*7+W*SPycJrxDquk<>Y6GIJ)W+D^MI#IF3OziSO_^shBGcDZgMu zpW+faTxwz|4Jp5iBG)R6`Ofi+%hY}c0mU&)h<{pvB&4uIMiiwht~n>An53`z1gBaF z<?9x{q-4xPPTDse`Avi*y$lgYSADh;f#Q(DPCU{<FNyy?4~jV@q%kW*SaISjMf`kM z;-Tw8#!*d92SdO)SAAk=X*8s;Lq-&(N4STDJLbp_sXoDqKE;WzlzchGl1EY#bDL)3 zJaI`!D1w^l3xrS%Nl4-Nc?RVc--+g=cz#_lv8((^PQ~Txh-KnXoC=1%cZBZ|a;XO_ zIJ%?>#ISNoNa0v-Oi$tj8)NX!$p}z>0aYuZeBE1Wh<V6K`><2;FhZ2Z`w1f)DWnMp z!^$Zkg`K!_VtNuM*ccOslwUBa^*ywVeBG^UQ2u=Ghw*$#toK-ikHwP=^l6U8(=77D zh_(!&k|uca#5m$<lv^|qLvHfTLMVQcg4k6i6$;<`h8)5tzUUHdk`f6wkl+k8G&;>H zr;<F`{FdW+D@P|xh_2EkoP=Vk#6ef-;tO7N#9R#RZ0RaL!>Uhl`8qs&h`Xf`&2*D- zP)>DFLc;Hvx4icZt!PmnbE6z4rYcWTLUH1Y+#Xi3szs@>FBEkpju>jm7sC=#eofnZ zcz*-dx#7}hD(H*8_oLj!RMjRJk%)20&`wcKRIk#KzR0U9oG}!0=EtLW<rjZvyvbr` zODlB33=yk-OeJO-+DuY{IB7@HGAQ@1(?P6gA!S;NmLn9ps!>~`N;$<*3uQRj^2nod zJKH@F-UF_*1BO+*V923V)gu^fIfA7gF~q+U<sz1x<;o;tah}Ml7U5K!V#$~c$MVWA zX(1Que<!%o4g?n2oub^uRMjIGZ8?ICA%-?bIZ?eTne;_M<%CmliY0$C9Lp=eq=og* zH+X0}c-N>V!R+MT@1ay`sf#d4T-=T%^mdesSZ^G^hD2Un;Z&XKlQ$VwSxK|Flw|$C z16SL@J5hdwLcW-)EkiIWA)4PYv#ijGe>2L3=vBEm4Gf9Ay5yW?36Wc{u|C17yl{{w znG)9jX1v94vr7rzXQ+BMyWGvPLRBsF1*0uTC^59zROGG&awa8{VNza>=o$xc8}Uy{ zCBv~iCF-KIZ8og`x8Z6#c-v7)7YzNFTIbRy7?lvsF~pGY)mfDkSU4s8lG9HPVl@uc zqJACTNvL6wrb`W?SyRILf73`S_>&8(UctQ$n$lH|V6^23HiqI*ta*%zCVb&jSK?4v z^~s(L$KuK_Y4Pwr9@64gK&i1#mN-I6d)Z6@hHnqnHwj7o3r=F#nB!-N6tO~$c{ZAj zXnCRwuZ?wY1Cn?|PUED6@M$cnkMcreYN$^+Bvqn;6ymAlC6|_$T)H;8TvPi-V2NW| zXvCLPYy?HD&|12p%kx<O>gMwZMflXEMskZ)9h8g1B8LyCICaF!Kjsh$`Cfu1ajEeo zGX_$$f66_%oJ?DOi=w3b>8crv0N<tbC+H$w^|58pBz0(bENHZ9h?hUz7%y~@5;v(& z_>?=TPjnm|saK8&%z4DizcmiQ(PjOQb?!#IBa)UXl3{`As!?j}iym>~78UD>IT@m! zq)$we<L9O&CYBIN3@0@SHeZ+G=+hM9y-?do5T8EZF7dX62$|>c%`iK8JA1o$yL!9j zD7z!HM-GyJyr~RtBgdPk_QkvS_jl-&SM2-}uheVjLS^`T@Da8HK1ho9;p5-g>*7Ak zTJEU$;Gx$Iq3#hBd-}G7iX5t^*9&h;=#$G)Ur_!#IXVwd*Z!wD;zxS(b9AEFT8?HR zoiYbK#ywqIfp>4zyIg6GG>d(6d7IZFZ>>L}+_JXh>DvGKyzxCgi(DeNR$KVEo1<@8 zTSW6&Qr4C{Q=0VipDcAMB1fMxrJux0n79)Y=zMOKN&3n`AxVd(MlceKxGi}^R<H|l z^3)T@aAMSp(%<qg80DcRF@ibKY)MfL@lS$BF5ygSizSsBYgX;5t2J0PicWIITql|v z9ZU?~gy~#q2da@i-;Agx4hbcns$AkHd6POwosp<>;Zs*Q39<f>s$4sW^~E@H5ifso z6O(K?A|-ATpU)MqKe7H##J6`BL|VuvT8WcXc`l@3LXR7vf+6CGQ$i^<Nxh1r&-z~g z_oPTOA<7AkJ`K4vED$Bs2){}SUhYk?-eg)RccYURm$2xgEL%pbI~l$aG+Hs_k-u;g ze|2=NY_x(CHxh8(3`;(?f@bh0_06!&u2m|x#zStgN|7|)=rlB&xJ5nYG>YDsS3}Bo z9O6#u+kiI_%}BhzO8MfJK@D6VlyuJkKV@Vc@o_U6_{Wh7(fc^w?IgU9yRuL&N~<B| zaYIgG#MRISt8&Vn<cM(_BYAQ&4(e0t9)LEwRL~W?v<GtNc!hXkMUpESG9nR9krH>4 z(;REic((Le{~PVqh+VlQM4ZMg;h2Mzs|{r&ZTXU<h@`|ORON|NK(5D}7PbPBdMrxE z)rL69pM)iLuHTaK80Zqq8u-chL{8haq*3(5F|+<3bFDzRsgHD0BnB5qghzu$E9TmW zUs9rSDx(@yyWlyS8I75aa&JTmM4!xawhSZP;FehxbzJAtOg@nmInhp6G|-j$7nd3s z67Efyqp4hsr8Fs<94DdcA)$u+oAB=3SW+qUMO#wm)lLg*CDupIO;Js?3=<|dYf{pD zQz9iw6{*-|2yc^d=@d7vb)jg>5H4vYN?Bu6h8UWe_>*UiIWB6A4xMmB1Kn#KpSZ%H z`iRq1CBq_ftr1+zLtdujT6Z;xu9%vi#_JrPxWcLWh?5xDO5(6U*BQa_+j$zlNM2_~ zh@!|9DqX36Z3UFSEYfm4eAP$#b!ZtPPRjML0&R3MloQG8@g;*;k~}IW+LAhNa$0VJ z2I><&y4RbV013=+tOH+A1O6shjXzEa`Gxngh^jpJj7*e@%M9zEe7I9MZh<H#6w;1! zJVK#M%1q~yavUuAX_yj~BZa1SL{%QWPY54-Nb-q3TvrYzP5Qp$Ts+jH`h+4>Vq3;1 zeXd~X9*6o@m;5xW|BZG8DB44dz9Ei68fAt%x^hrvgrgHr9ypj)P*U)OS^v&=ROm<j zllugOC^y2(0HUtpz=<3w>}BFsNy-VZE*@x<7$M{&PjEg{pEQhlL>xc#k&iJ;s;JNN z1~`re7uH=x;_<x-$ZxO>E+s&~i2Mdi$&K#2OAU$lRGr{P1iYvB2CwRJg3i(L0;#bf zA7i2E4XFmFMcRafDMw0gSk*zg*ap12SmM(d$s>Q&>y$hFq{Q*7K8b-`qF*=|9ukQr z@k~wch$47NjY#!%lp)Slswm-nGu9|Lx*0bU?d#ka%a}7x%a(FOKp~Z`rcmay;tF2n z$RS|_qOeG101a?j1W%Z}<j#PiCWAmy11SR%l9CeT9)QxJ$v8LPiOZfEXf&4I2(etn zC{{TXACaA>JWPoi;iD_Kq}<lRDobB^n34yrQXa&c;Au(Ka7@z>eaa|@_(~OuLM^#e zMs!HbF-}9OLp9TnC6p?<W4xqF+*p%Jw#8dO<c%0^T@Kg$w)|sVj%GWvJ)kYk4i1}K zm)p@{c6Y2hnVropcmvRG4!5;+IlkivAAQcP%XwIr!>S(M1cf&W<FD&-RJoVg+w5cZ zHT#+UolX}GoKy}f#(UA#a1{&hj`lQf(JB^rlX=5?T65AWN&o-P+kd~_hGQl3hw4r5 zoxEF$WxdJ0*7LO9luP;?Lh@G`tu5t?VdY5rq-qR;S4<3PdW52MjhC>5V_)LdbgBH% zD6RMcwWW1}E-axRaz!GRqK+;3Rc}7Gaw?T_#Kqc@6rrAtFSDuKIrvV}IhLu%_e>E= z#w|LOQz;@Lyp*Dx_(@l|M5l&h&KM)OSX+`Jy3es0mo7r*;@d;#BJ~=MHA+nRuyTnM zA)0erNv(2-PdCY_RK+P>(?h%%QYs^9yxAY$HaZWfCyk+G+@d2+i-bf%cts<nS{mU} z{mQMJN~IKWN>~0^n^06v@Rf=9&a=;YfAF4jdPLLn2*2Q9;r^rdqW32k{ImCx_cB7S z;92C?;PZ_%Z+LGCoA;LYSMTj8Oz$0Ua}J81+{vL3crSXAm^i*oLd=Km>B5ijeC$8m z+W<a|@bvWAt>jZB|MLEhp8j(@kMMW%CEhIhwfBwpEqK4fS;c0YCN-dvgMSa-c%n;4 z;39-C$>AKSg`=D;&<+$Gs$Vz-rxdcqJ2HH~G7WcRUW-zo()9J7=6Un5kG2UM+d8i8 zFeY!nnpk{KYjk?V*}<HS0PolOzEinh3$^w8^%>roAfJV=2GOMO=lvSjzjqG3$UI@5 z1okQXJ1Yu4@7GV8XK=s%os&_L+^^3En18<}y^nW6?v72Exsy9K#vw$&#JLk#+&FiN z{eN5T{%Zek&fSgplGp#ebvGT~y8QoU?&9%L%CHyH>rStxp6+sC?()t5)83Z=##NR3 zpF2z2bcF&18o)`LbR}&{7ij4+(<E)vrcIl)6uOvBl4+YV$%IVO1rdCpST~GFQA9K< zs8~>T1))Ws;NRzt`kqgar)&zYPkpYy{r`UFn=|L$nMsqTNKv^rx%b@j?ce#%a?ibU zu4ya$xrMIG*gn6lcvSZw(pFG5w|C%QWP95RLf*-P-g0GAXS`dZk33kN`<DIxj-zZ* z)Za$ZZrKXko&QF}8G*j-&V9x%oO$PUYDS7V84nHQjfnjB2kf_U>@)T=;aRKgtjyaE z-qMjbB8&#->aSgR?-K>`>S#+@x!U?;DOX!k6xNmy@79-Z1t<5eR^H7Z%zJmlYwKIl z^y|p`R`&ioS6lXyW;^#dYbtt}nS#Qa{zCWu$4^s!D^^+}Ja@^a{P8M26|8eLmY0fj z#^d&EFyw4F8%zTwKJyG*QU*()0{6zLoqh4j79N)N(ZKPFQ@?daqe4Cve;p5>V(geL zHTF1%^!E#<={yUeC5Q1nVX5<8Z;R%+N2&8KBBpak#)A2F^)Te*_I6VPZ1qL<%ep?8 z-tKUa&-_`AX7jcB&?~pMJ6hS-2W^kzm;HfPRQCO_BiHVZa9^_j{&susM*Mcm`x~#6 z&wr&ON-SqD|LXvwtuMPpwztIlE^n-KufM!{q!Opsjo&G~4Bvfy^`yU4pv?P|{!00s zmYaG^%O!nezuQ(=M#9-1%U92&bt6Cd7tV5oAmmC~%3RX)x)($6c;xnI;7S~=<$`IC zCdIQERpgJSH7n1(H|5iEKBXJwi8#S~r<^j!E7jMt@_i8pxNTvGJTUpxl>dc1FCwjc z!R1l5zU7POjfah&Ev4j`YvD_tCMP4nb1gU)E~)%$k!-R1k}YK}5?SU)l6@thEOR5R zZ`lL)IVBzspI?<JJ=!2?V-+>xX0Hk7H)ti_KrCER^ss!Z)?gbNODQ>>8BWZXw8an^ z_L}g{fT1wDTDYXhmsl3t&{#^zG3CvCDQ}A*vi;Y#jvHMqTvFs~%DeATg!HB(w1{_P z?**nAm+JEt$JQ}scxCrp$3*s4v>E<)<PGb$t6ucuBH23*<z0(xZv?H`_>O#|<CUz` zHVv22U>s@FzWn_qi&lL}CUmei3uigX?*jZb3&cADX3o59YucCOhv9A0*083ST4KE| zoaHEz1#1_w?61fvS>E6`-X_+gft%rfNs)7hr<O9;zQO-{U1n);VZKs#2A4XOI#0gi z_Gq9gbEVW>!D?rjb9ZpL&M_L3as_ha+RRbc2o8=Tot4h2%=cvbp2ek|b()5$8<d&F z<@aR$bJT>_d%h>jYuUy*_vo=cuP)5+`jeic{&SYIQnZhA)PKp$QCs`)&J65RiuRRw zD3qdoW)uI2eax%!*k|btww#6DYoDQ~eO~_veqsAazfo&)L)O0B@9m0qmfl$RfAEY~ zJL4b9I~MCUgbe+$SXTxvb&iQVV_lVFt@G+`tuwO4Yqn&>y8M#47;^mED^)V)%MC{N zCp}+6HZV%|>i(oh715nJMtAe&hbK{P9z;)4bhlidR3@rOn;%t{qhUf?uiu52-|q(3 zue&#9&J7cXvQ1Rw%N8!Cgbhz`%or<enG2Rk^7_qKNw}4Cq4OETHgkS5+ZxcygPGhL zvRJv248VS?+TYd^&My_y%0dwN9Tk5qWwx80p9F1ND-gD|vI*pNeZemk8_0A-scqr; z)b8vMztkyPuH+dZw*ND;aKWkwbs7SkJF>hb^AdHk#+N68y8yNFh(V6mhY8J<W_la1 zm87s%QkwtEphlYXC?f-DH8Q{*eFOe^<eAbQhi4ymxbsYyqy>-HvI&KxiRXn21!00E zd<54Xi8WlQo=1Z!go)}Q_$guldy}(9-Jvdr*+~^v6P%%{6zaYeFAeWP-UvKK8RFdM zT%}0$zfK3H-QR$p7S3`S@Uz27P6>t?+k#zA894nWuwA_v+^OzU_p2uYUkW}MC=DzO zov(fpd_aYq3Uz+)4Z-V!Q$pXw&r`pxUtGV@saH3_n7yHWp{qkb3f-qRL5FHJFR)y# zP>!m{{&}@lO%Ijg!>uzzn*di%o718Wg~mF~K}0)DS`bqFxSbQikMp~bR_N|_sY<5} zQ01gpI8GBdwcxy672_4%an5>YlbWT5;)*y!@xb^hyjsb}zvG<!`twOu=r9!;=vwD= zjq`qdj<y%w^oP_vft$f8?YtNq=IjrC7~P?AVvsq;SsB1!GjrAGJP`T<?2f^{EqK&> z7V__fZ>ZfE=K*ytUK?wKC0m?nPKR?CL&-L$2|1k@ble^Mc0eJ$1$i?=ZwYO4ZVM6C z2B}M(yF<Umxy{*%{Um1__Bnwq$VsD<e=u}C&M|Nd0lyL)hT+@`oYClXPlDvFuyw36 zQ`@@5X$tRht`Af87H4^QobyF>6+S{nTa~jJFR70JuWHaNcb>(u4K|d8Hv~_2%A8C1 zkw@nQryX{jfEU%41eH_aR5=$pryx}cTZ^6RoPWn>)E?ny%>cR4*&n#cdCvKnv(QO_ z13lH@+yqO{2$yL+i^GxdXTj+c&OOj~qjL>p^f+%1Ukl8;L({_72FE*z@FmXOuyhz~ zRn8&!W~=i?XE!iMB9<{h<XjY{@8l=6<J9iZ3xMu+idC1hJh06f8n_~~Avgi{O@>z{ zsg<D%!dsmY0sbs@i}MEPJ`VZHdC|dZb@0l$$_Wg2mWGGH8p3u%-d6bWM##7c8qN*( zI1dG{bw1%-qhqfanxEyo1gqu-COV%5%~oJGLFbV3E?A(T`TfW%4xa(PD{va>%!3cp zNGo`TQBf4026;=d)05|E$mQUnoT<SpP@`kOdE9xz`LXj`<oyhCo1CY?GY#I`;F~QN zM*JXjSzsHu?+<PVpGxeF&MxPIaGNg0zdCDzFFG%QI_(T`oIq1J7-$5>cSD<k(ZH5q zBRp~_bRKdRIOjvFt<GZnj|;@Wt2n?2-RhhXI5RLeI0dOKntLg14utBdWnfz1UExn7 zDz`YB5J%(i(&cDG>D<6gfhN52I3Ji>oxcLw=-iLbmL{Q7yHgh!=By5^35?b?uNGI2 z2UZ1c4SXgbwjKb#mmqBkY~2E$p9_YegK{noBm-mN-MF&{SHqx75R}wmH0&>P{sL%~ zGYXI=!1GD`2Ltn*HwEaG-vBlqP`+;22%W}a-ydkj@$}$W=RNSrRHqcYOPw<VrQmRW zXo*va+)~Z^ra(2?A=HyVC1QN6b0F~L(5C{Y2dQ(l6ALa4RtDz>ig7bA44T{%7~|X* zSm%sDNAy6TD!3LpG&+-m52GtMOGnLj0^be9oprF0`y8B0p+hC)C!t*<YRykUaTWgQ zn<oO_LmT^p;C}|k;riFG{aM&lj1u}3(r-Z-{tCAK2K0?6lap|~2JI-V{tI+kfiih1 zFdn>j1lKzc19LpE?nDc=0Xbd48_>FqMa0a+f19%}*arI1PDhZf$mzHmhNxWx&y9CZ zg>7sr$D*a!jF#et;MCwf(DA;&Il*&a!vld)&Z6L#f-})Roa8(g9PP{x&IA4rLgT@6 zNszwREd+Rf8#iNdaIS`|<?#KQV9NPYaGj=Q$)1GB-U`^J;IoL*@kmVs?IN@~kA|X% ziDKwp4eI64ik7wqS3&0(tf+wZ)<Iq+qIq9%LSQ~}S;Lls`gzpKF|cx}8t1$n^uf?_ zSi&18;w15(0_9j-T_5~Fa0)D(=Uj+SVz!~CpB_3GybX11n;ID+b{ZaSb9Sitp<&ML z!TW=s3$_OzgcW0)!@(tpDXGto1kVix(QX_H7CR5aH%px}L(@YO5v5-Z&JTSbx_v$P zjo@_TeLMIac>6Kf8q-l)37@YFjdLCcPE}~3^FP6#K%=Sfz*48&nF0Pu=epo7mKF5a z?5ssAM!h=1cdEP8BGjB>Ckj{${TFS05RZ%6VX;!HKwAs_w?hX;>3Zle7CcS}rJU~s z&w>tR@cnh+1L0FqMomr&bZ!Udo5GD4^xYnehLg@L@R)*jqr;gFZ<L3=5uAzh;ZP%N zy)(?7X{mE{XntrxDC8^*JszxqmtsyW@S>rr5bG;@uCcIim4+M+)rCF+yc0rWoW{^L z)V4z*wiOA)Pn)wd^!v~*v{_9^EA+MFP}^gO%#%aKXam}iW{($x#Ia71>O#DYM47UD zD&d7;**;=1aK<=q4HctjtaN@0iHw&CY85OgMjufJKZ7RBJ|c#AX>-P*kD+(xp!csv zAF&*CH;3w+3E{bb+zOjx=(9O0Srl%E7Q@khUE<t}mbwy<r5GFRMgKK9d?<7{R0jB$ zVb$F5X6W!3w0smEZvrK?n1~wo-OzhcC;kW8u=S?T!Pj{LT9Vf)XLtCiP_=U@w75C+ zbLe`7`bB7w^DFpsDSQ%geurMN8un7ldqdZ#<>6aGO}K?w2~U?fYfx@6V8xsp)e!VM z!@?6GrO_D~X4H-ezdJk@G0_G1`0)5}3(jrM9g6)|3Od{xiiBgRQ!}7LS@=QthaR4W zyrq!HGH8Q_%fqw7V_;!1Bz`%xCVYN)VHj;@cnNaa5V7zc&K=IO@JeS$xEVTZgXV3} z;Uecw=)e)mIPhZsbz%6T@MfG#5P{>IT^O~rU>u_`3P^+*J(W%uq%*FD11F5gAMJF8 z&vUMZ4zmLbp_g*b4MYKFYq=0@Cbb;yybU;w&b8rX;e}2e`s$^qC&alC@s7S(G4jzy z0Q-jUg-F#Q@=GzQs&sA(e<FM{@NdyRZF83J#eJ09O5ie1?hJQ?4~09!_d-kMd?9>4 zsAH%r=Qy)bAGbpPMu%eo#3yJ@K&$-rz)I(2wBqkVKQkWtiRe8qflbt5HMn;`hhm(^ zLk9)=z0fO&^BbW<Ot<aA-AD;S2llcX9O!@%J$2Ay4;6H-cRm1$ao~^y{c8ARl+%mz zN=Q9bZO}d#=bWKPZ+@C^wr*?SNtFOyrSk=FU|%^Jy(h1$Flza7X6&#5V+TepeYwJ^ zalVDvB}Npvf?JL8_y#O>yb<)P96TmQZ}d~=DYVy{;T?_`ThJ43L!DR&432!qLE2{B z3Y~%0u^l>(1JAz!XB(_&bkZsXPV{mbeo^356xabN>{mzW(f(WY%bsl*?JouXJm*|! zJReZ@Mrl0)o}foNL0nBne~D2Ie&n$c@ihbG%lLXJFdV(nXz(BHG@=j2@_WE)2`)m; zMnE{)=V-7Rqy3eT3M}Zv9-<9)v_PjZ7;kRP`ZNYBVz6o|TJ~YUj^mmwdl1LbfSian zo~=9kzm)UAU@^F`l^g8@Fos(M$V&M1%^Ck!1F|N#O~=<NNZtl+9Eq-jj+=rBXG@TG z2-J^v2*Uxp1ZPTZ0=KcqodTIyU<UU;-wGyy$?-?Ab34i=?fh5p6nJ3?crAer)8Lg8 z5E10HKZwz?^E24M*1W}e1S71kVubUxz<&g;*E+8Rml(WVoQaP{#K%hHNPXluX9)U> zVWC>|MxVndW~ja+;#hJkq|lNRpw<5d0^qP2l%wI5lXXNip<Zl5&Lub(I|0zHgwGfs z2q}FB8^(R_P)y^K*I2-}Is2jGsYp!$g^7Y?Xun4T2W=5}iC(85XL|5#j9%*0OdMZ? zE$bC~*^?kcPxFGq7GSX-8WFljmm$Z!_amRa;H`K%6nDDO*6)FYHs?}Y6~hx-GoEOJ zC#Hnn2;VK$F*;1&rJ+t?Qh=lVYeVnH2(A?PPs4KFrLm00IWNE~^h6U{-%8|M5p2To z${;PEUt`YaLLBYW6KRb0V@@#8pnmIItYehE7!jZ^Zp5hXguvm@=3pRnav&P|L{Oo% z-V<1a-ulAunYsm96dvxJ9KItcBj8^I?!_44mf)(ue&+{)xKkTA6nqGtxmw*GoEx|% zR2zN<qx~z<?_C!<5Q+vu81H{87(*{p1wL1W{uT<Om-;xy`JX}`?dEL7&WNz<J{PR? zL00Ok2SdLL=AdUTUk<vkd@HbMlj{x%x$ZFh{{a8qZKbmS+%Iw75iq%UWdYk+z>7I0 z8r#dqVA=C*;A{a8*HwrU*9~gTTz3ib?*Z5Q@IML`KY;Ve8qd%c<7zyx+1gy7CAsdu zg|E!uOv8Dq^9~Qi<KXaP{F|)<G|%emMOtPQ$6w+4H-YMm4#Y%TitR5NZynMXfa6eg z5sse^kI=TdF8$=X_v?Dk)J+*}pqm<pdOr%I{gj6%aXzPU?!uA!S7=T@%G{9>?z-;^ zPeqLWdxqCnGv{ixB*>W^VpQqU<7dTrMg3iuF<OoLAJ=sP>x03-D(9IDrR!3E*~Y-0 zT^a37p6kXn{7h{tbGyK$G?2_tael{jIltq&`!(%}+PiPh#L)bJ%z3!(nPF3kA6CO0 zyg20EfPc2$M%GC>H7;{)O3`(153<EKSUgw43x~5g4{2EsW3=zZk@O<x8_137`ycj= zEX6TSv(}NN__(Iw^eszJXiN$6N=i{Fw%*en>7B0(pOL{7FPKui23&)o5#S^-TB%Er zG0NUqc-!L}aED`hXV<L;M^l0pr$tjSMsqjD===~hUZ_h_V$@<`adT`dHH?dxS;#0r zII|-;O}agl5*&~Aka1^mUH5eOhb72*Bl%t6`C(kwsFfbBgh?&;#vOC3F~8%wEWstX zXLQ{g@qZKk*Lg~icxDriGwyE9#;AeakG|M-8FPssWA1^F#GLCM*0^8JP>9Bc%ACKe zq0-_rPh#|GaP)61LD5)Zl&z4lju6(SG01rXTKrLH@tJqKFZRv?)W$F2{un(oV7y6K zX@D_$9%y7vs4TqLnT%LsZ$)oD9+X;)64$NJT)<d@tDJg3c|T)nG3SI<d7`BWt+kX2 z;}^9X|E|m4if7mL$FJnMZUX!YZDvfl4EH;XX#2pV4x_Sl(8fIOaNP^Fgw4);?Q_PQ zZ1*Fz9dncBnlYLibA*Z3;w97KGoQ7|mLPLn_i61V)7CL3zpZAjc!{-%B`7%#u7Uw+ z@fmaUl4<b;Lt;*1Kyr9A?IB}y6lSd~#G5iPAQ~SIosL;6#^}?|Gmztr0Yk+Y^_C#> z83SI8F^>`$7FePqjx|cWbs}cKm_9}8a#~g+X$h#YwB*EL%u#QqObqPM{P4I4XQMaa z^Rt|I#m%obXBL@jT70HmmoZAcWxFS^D10Acmn}X^P<qf^8P2u`%Alh*iPr2f*!G%y zo=0JZ?xEn1(F3u?H*GIV(A-0@Hs!X5R%>bTy&U~%(fS^Y<?ahek0BZ(Qc>gB9&$Sm z@h-L1br(C|hIH0efpL6fVyVSB2_<S<aNg^=F13CZCAc|Dfgj~z2KP6CKLn-&-@Dn` z$`;=XiDs{?x1`0lSR7@XmC@PeGG)AFb6J9hlfR6K!=8Ex#<3QECDQbk<s|(pG1wk5 zHhG`L>)bN-wuj;^a=I0Bjl}*&P&hF*@uUfUXRd7PFhj@G;m|0|DVi4l(GXiY<98Fk ztWBb^iE>g-#aNwZZno9EJ-ArsN;!TZW1C>{_z>pwT-S^;{2Fc6qYQ&9ZHT#IBv4~1 zM_Yo_D2n+g!BY-86Nm9GB`7by5Jtbx4WEF!RI?lcydFLccaPTZR#vG~ra98@(=cKY z2<N*jj+C*vUW9ui({`E>(sGT>cvqNj6-<_3gNKXcavZ-Bca_^R<J?<A8-Tw9c&!?j zR-T6vl)94EvP@k$9J&~|wginvJhNxxCVjT+vS*VVIr@G4-cV2IeYh8*kIg6(_a=H# z3gXKs)9*vq6(8QJ`yc6Vj0EdLljFMdp&e!9`jB`MyWb5->{=fZ#`aKZf%uSpw%P2x zkm-L28JG_Zk3whTLj$7^y>|M2Xs}FsBO2SdTofLHCu-u;5tvV-Psd>1z{Vv<?%ufM zG8=|#Zd}Spnm(2Jv^l^uvjn7Bh(3KW=0Kvj$2Q{*jF7YA4%c1ntkK-P<Bp9E#~qvS zPoJ_qFmc&}nQi)Xr_+k(F6{M8J4|VOMkw_!1XzD|lH!%Mld<#a+DRMwv-6cN&sWb* z+Goo2pWW8i?R+)bqT>_0|H$nT>)pRXyZgGGW)v&qYHxc)-}uL2M;<c}-)w!483co4 z2LD!gENkW}EUtgd!2H5v20~=az?AnM!aHUljN9vWo}x>{J2n!}$g#ij^x{f-;N{7C z6FZwK)cIpT=KIIhaxc#OqmNxuy%ueyUNUpsx2*%IqpmB<@4Z&-<o(MlVW+*X{>Lp( zmeD}U^q;}j*X_(7@4i;+DD~>EjuPkZS*9{~Ln(!}SGSLO-Ogi=-PcliGNS%f%hYwb z=r28R>}5K`@y}6{tKE)o9sOsulm5+(-G5eFbL~9Ry&C;8@Nqq{U%A+IU3p)VT)E}m z!$|J2jq3+D2BhTIj-Axz^)fxycK5YarvEDC`FiZq1IHS>{7p{(?GYv6eZkC|f6Mh~ zh0nDmpGSGFy<X>R%;x8|yZzn6965Gf*ZZ85QU}(*5R+T~cFMD7y#1-)aO~So;b)Jz zb_%5L{)O;=6<hxi>{P1oI~nqhcHi$4c;`J|OLlU}6vkMgI?8<S#@Ia?J4yR$+iKsp z@ZQ4=uAUaMRpEUGz8`O%O~|;GbJ=WP`)YUO{c^7_UAM1yUi?^Idk8s}c4uJrxbATM zzSe8W9=}g`)mJR$m(SnB9$P9_GkK43VC7?}OzL>pqtuc6IqLShJyJsc@=>ViYz0ie zJq+yuXJ%6REiFFVIuTd7Pjd#=3cPxy^3P#~ln<XX_E+~^_w`bFwQBt9vBmd=y*1wS z8AtB-4VH;&^H%>W(+>YVOQrB#ld<QO>>XcyD@<t=wt_b1kDm>VJ)1tn{8m9AJJ4s? zcenZWJ>N?YW!{+|rhmsxO!J!_dH<I=@}|G{_W;b5tyK3=Oi%UvT8Fj&JlwI`UsCYS zT;9N6#9ve^z8Blq{kz=V@c!L(?c3oT2{-BAA$!M{ynpAL&8Do(`@h4G?;T&}x5>1} zTW=_h+mY*y;K)&8u5eiqBfqRnlv*yPtjzn&0x|u)|J@|6JtSo&ShP{L{4z6;!oMXj zP?oIGX`n53e{(K|w>^7pWNwQtEo(^<Z=aj{)=`;ww9#kyy!I^NIuh0jz9(kx)}%Z* zI^&$Yv4D4}eOVzCh03E)l-ih^ir=pvd2UFg3x%Xv9@TnX0M;~xSu<<JI+VqctdQSq z<yt|CQnV<-zmOF+&a5}A70erm6_z&t&g``kRmW-xTQXZ71Bxn@TORb2w`I28A6zXr zzl<0EOUvvn3#PrboKZD!D@^NE*b4J2()_4mPX6YNDybWb@Vi#I!<6~qYE36r<jxrT ztsr-632RG!Tb0bK<^A`Rrp+xpmN7Qb684n5_SSMz=jv@}?3tE~^3?MD@}OsVCrKKA zTP2<?TpmUOag47`REcK=Lo}523fAHGKFsx6!E0j$J)0j@Y*qZ_VakHE^um$bDq{6t z7J|j2vBH*)g&9kk)0Y*5<y*mAzZDWwyssyW8!c5>fk#GPoaH+)1LF#cf@w>GUa;dd zdclm*q%18a@nkc-$Rho_O_qlJ^_8JEr9p~yp3$7Ocu{6%c9s5BptRV=Vp5x)gLzzC zk?ZKOY{gRR*Es4Cbu~Q(Ew<E!^e0?4Q|rYG)`tdeJX5H|3}?TkhSJY@D|9lyJ2e>M zUvf_Bh)!jCU#=u7pP=S1D-E{sjPb9@FT`15f-52AayIr9(%DEY%-Psupr&->T71s5 z*HfnVGBlKGEVA|(sGJMiV{oigmKax;a@{c23F2=KiDQ0qXz;z`C0l#>o5P4x;!FUI z^lX!n@><B+YkqS$H@h+sx$-xMJj-wK#6q*y0ax*p-yE8?4v5KjHDs-WO`6iItHD?% zJfV*}aomM9fq2i+o*DggY6x+Rm68@KC0+Q)*4S&MVC7oLT(J_rJw2k8TrGi1)yo<s z)=Jw(Su6b-`K=_(SSjV^y0mgI7BK>j)grU%inT~76PdXd*<XP->0c-(^sh0!78%Ps zvF;sXQhuTAwXN_klygf<eqH;@+s4w8`j=~)(VTb1OiN5MWlD=_dYq*d!v7Hbv(9k_ z+5FCzJ<V8LdpFancz@?>;jD9}MPRPC&ha<l^EEeroijZq%g)>vug*y2Z+6IML+0B4 zX2*M<Px~lU>Kxl&^Lyq?^jMP|@@;fo{+79rjjmg)<rTJ(+{{L)#zy{@*=wW0k>B{5 zE3uJR#zynI_r7fOm!a55xniSPD~tB|H+gm@dAaRop}7r1o!f4je4f2!YuZibn=)Ju zEf`g+^z0EKwnbrI<z4s5+cTIEh*0oodxrd$++tacD3v{AC~q_=QrRN#X$X&|MZg-p zzO|3M8s$s%YD6yFa;2IcaydpYw6(BQzxNAC6+g4rDkPP1>HT2FRx4G;10q#4G`8B_ zQu6&$#adIk3ae8R%Z$K;f=45l^L4h=2^pnV24YIKzT^^WM@}u7l|q<H>1KwG*Zz(6 za?6#gv|KyVvvOrTCR9@HM(%jb&B&c2S0be!ja;tNDDf}UGU_i}dqksXMlV@^h^s79 zV&M`HU3lc34@-d5>``U3EO5>YDqZeDj2pzBVOc4r4w0IANq^jel(!Cf%TG$xTdS=e z{*;Mkl@nLPGWUV2bW~HSter+`Bh{R#7dO#sYNmfO(!F{Ko*d~*N@Wc;(Tr6M^?OZ} zN-X+xot`lh>3na?FI6csI+2;ET&abm8=G^VG7o%YtyHefUd#L~nSta=HMaVtO5B-< zHns{6k!m8^-&zsF+DcjWesYl>Sx0r=C{Nr`mW|r+h&!nvq&4jV)3lYPYCO$6yIHBs zGo>ohy)jN%wth;fS}w*?@oTQE+)}l4xt0=gbe0-kw0NMFQmVwQ$TIOe@Uj$Hl<luI zMjO9ZCHL5+=EtqKoR1ViQdg-*egv6P&5s~&spdye;Zn_yAm&J^GJ;G@Nd)D`uSAgX zD=DQ^B`4Rfw%?<7S*loMHm5B#_W9$N*v3Aa@=7=MnVM>4k(QfyU+k08wUNa3zgoY+ zYQ`0&Rq&2xWR^j=Nejrdw=J|5C-ulUrQ2JfV5v$ZkIJzbpD@(^Se1R6oZtSNRlme$ zsk5dp70#3*^4SK7UxS%4q^EOB)kIL?Ql&p_8<bzF#wPkxW=)vGco7drkx$MNL2{SK zryaJXq=)%s4d#r>uIOs&s^lcI9x?K44lS~!Zr~<IBFyAcClhHB)m|;>ea@a9$s^+H zqxT3odu350nW>csqeqOcl0%Phqb!LFZ;q5OpJka*uH*=fX%meXOfF?u3Y$yKBpQW6 zG!wXuMq3A@&yh$X1)pURTl``pNhnM-THohWnELLe5cx)5uk`}q5iOjS?6+RvmZw)= z!p1{i+wbP;o9{IfjmARZPp^p&M7rN=g2SV2Lu?*XUW-iGn;9#aRqt<JPRhRj8LNTL z%T>Z6&REG>U{Z6r7FZqf?Hs}2=jG%LVcKqHdWyiARx*#Pm++js*;#`8*+<vqN_?{7 z8R`0(m*Yy3EGv2cftbs1oj)%}h+XYMR$65qH;w{jla+TQ&6ys~5*XX;ESA?czAbF1 zz310$o1y*k_b9jgI>mA`(Pqj`M*lKHXT}s*Pu(-uE#<{|MejDyIz<|9o#M5rQ+7_u zU#DF6jTvd)c}1C%l4#>xH|^uRqODC#8~d2<d+Xmm()L{{gchz%gjoA{C3E>ouOG-O zsryo!MB7Bxx29Bx$4%^eU0Z3X=#hVX-<lPyX$?2qu5yN%bBkfbgNcL@NV6xGNa*WL z>$89%y~9MLxJ}N^G0C;eF-dxE21l;Uk@0NO>;omuk0QG+`#>3uH)L^K_o8gt)K}MS z*7b5b-WLz)^)Thx6leK5@V$jj{chEXpp$lIT!sVZ`zg;nA7HvP%bizd^V(tZ%vnYx z{@FXRW2J|eeIg^hqP!Kj8SnK8pKUm^-Qn9jT)C6E_4>(78&-YgY~@J(g*<P6E$x)h z^ZrO$Q1g7iYf0bzwSQKh{k3Q&TzT~N*EaXa{k2%)ZDB}B&8&5@UMGK_Pne8G`tGrf zb;RZNTC+}`%e-!#l#cgkBh%!*UUs=p(*|4b>}U($LP9+<_0H6$UAk_W7Qy(RcQDdc z*qpvn-qDD^tq|EVwx?`vD{vOst1~&0?|sUdD_dHzLT$xsQ?^)S?`e$Pl3&<vbLT}I zj=nh4)wkWb&)9`C$HKXH$zBi1cgcwBe+JDQj)na#xw*e2H21v^t8HA5+(+rPrUjED z1bLz)*PZ&FzVKM_@2@R&$kn#5Hv))zyhgS%`Vvh!12H^%N0h5Adr4}_t+S8!VgzcB zeMNy_9Nis*S5u+4_cq=-DtAP3@AkT;N4`@yTAzyF{}D?6_-Q&MduJ;>j=X)rF@A21 z;&($$Z)fgjMDP5g)FfHE-{0E_ZsFc;G`@jp-dwHM8kqN8iZNz4vW0`U)t9*i=Cg-B z7TLo4UrBa<?-;R160a0`$LQ#ME_aABx>>2`O>Hml_qn{o<t_2P%iGNK^cQW%SNf4g zc7<$zCH;OpWqZ9YEzFV1+&`x6zs%(w*1lU9#wV@kcv{|Cw9+N2O$#GeXW&_$@w`_$ zq5gXS?^vO4`IJ2@BmdPH&x;j>TUT#Q7d&gb-|zmK?zes5c9ZUC?qkd>RNsF8`^gr6 z93Q*?)nwCNQ^%O@zr2t1)-3DyP}DHSni*mH>-ac)>6&n}9gS@1Q@nSCh70SMk?ehL z!5MDBkyc&O^7SFFWWU|s5sY{I^7oM}I>}u~zGOoEUtAJ=na@13%?6WadH(3PS>WFL zALg`W#%xT#(vto2#gr_qqiM~>+pCaoCD%I(vk^mV`v$+v_A_FooW1ju9D81fIc8eH z&3*-oS6-VrTi&Me486?cF^-G$*V)W7;UhhFmANkRuEZCrd1f7`@zG1Jonw}3IWESp ztITzahu-^+AHEBWIdn_!wa+~B9t&DSFZ|?bfTU#(-stDIPv+oB@85*}*zI#&J`JFM zjDGh1QY4CY);?2uTR`X4&d`(USgbo8e2?8aYPUH1bi-Izq`!eCc6oKT)*0De+gUPV zoj3Bl^nxwNW7nO02BN#j8=US!n|nNV-3Q`#E444(rPf)$=e`AEIhf~HCdXSN_^T9d zxe+Z^dSz3R+3fSH7X7;xlh5<19=ydE1q+OC)yS4B$>iIwtN7bm!r6K<x(Y*x;q4_? zITv}_T7k&ufSA$>n|8ZBGw++ro2{_4@TAFwx^A6@dZiM}w(z{F&+_J#h06T@d4Sq= zNeHJrd2ZF0okx;Kn6=VMli7^I(hSUe8QS|S)bCTT{!AZPnqL#*%SOwGD;4;4Z1vje zdVNs(*brM&rSyM;iZwJ;*RNMgW0kAcZKzvcjntauIMnk$bE;oj4{$ZGs+ZTSQI)kI zQk8YJbx8B*Nmj4h5UZ8k<@MFE_0{#bSiL%i<C=!`^|6{Y>s3`9{?=6E!1Q`KZCtay zPF2@7RI6$zS6#PE39IT0E34P8uYsuQ3&Cv-xG#$lZCPEtTDD;g|0^|ICy;66X3kpq zYLlBarDmCeDK%><Yd2I?<GiA}zGgknHS23)wKbcdcWrFbMXHvjS7%PO)v#OV&>1E{ zCz-Sl!zf~aD1^#t*q?Kq&DPv;SY5Mb1LRP|+E{({nk+%g(#F>3T;OtbY<=YlwYqx! zin=N#O!Scs)(NA~>bj~8wbg3%hV`+fIIpSRsOpxktgc+I;P$$;kO(&#wbs@`86L=n z=jwH8ZGFuJC|k8|Lv@4py@XE2)mb0cS68ZfF`=P)b&cXd5-Vc$YgI$da@DXN-a}w) zfbjJzAbEXFEy@G2fIOV*FH-9-T3f9)tf{K5Z>X%RuT~cz1TLtlU(Z0>NRo{!YGB32 zn)NFXH?^wh?Ui7!metn5CpBx9)m&J&w!$Q4nZ!9JG20~OAVGrlvk6;2Zw?}0X?3lt zt*K(Et%<F#xuBXTb!*oPWNm%5=1v1@P-`{_CIg-n(E}4(+q({w;V}CgeVRAtz|{75 zSL^Ns@~)jwvgnRk9r4a|Yx|Cw$;947=Zv;w(sBN<worB;P+u^6T;c3FYkLnaYUt_& z??|$>E72KGM%q(d5v1B$p+ll2dSr0#!Pzy*WMT*Cns>%K<ISLqO!;{9w$|vp0)Vpg z)ZT+dvkasu-h6R78BgzwB+||CjzpxjJ(3n}Qk{7Wi{>0Pot8JRGS$|WXz$9ktdD#s zIA{IN)^wyfL)M&X?~1p!rz7$9NO!w+jZrn@xM4~SJF)7c2N&e{vnjEI#5)t6iD*&% zU^qu-l*RjI+IySY_VMV!qM4H;P&yvDII(X}s<Y+nNNZQ5Io{6VY)VAB(}|WyJRM2K zn-VDFcpH>CXIokND2d>lsv7uU2a4GQOk!_yBGHnLbnQ$;I^*p-5|PyQNN1v>Gm(bZ z<4sAHt0qYk(zOo-{qbnDXxS^ls4U%6R9e$eS6+)6(>}`vO`5^f+5!z)x3?xb(<SAy zPp{Q=sJgQ=)!ExSG2Y&?w6}LcJYCt_J1L${Cpx>TdV9-sp{+!s8R3~;)!RD_QGn1y z9CWP%eoLypx3{z<)t+boT}x_DdspfL<Rp^m#73}9w6|Q?+dGx6>F8=rwQuh2os!s# z*lCX^w}9>TI1sl2aeJ!sjXZU?Hv$ExW}<KF?VYUCsm?g0wQf)F*uEXvt?kXp?v}(3 zokUQzcJ1u#o!;8s+SM9QwqA-1sF93cx^EZQCKFxVkk%IOYTkJ%6m3g%?M$`2iK$de zcQSDWxU_ZaGE!0Cw<q?f7@(=9U5Vx{MbD(RE4ZdK)sbjd@XUl%r>X{3M`!D9v=0hC zn%J3WR&_Y1TX(4SpoX8iK}~-kCfXGoGNCJ_F5-1(cS3CfZdd0%1*eoU8WcP-ad$ka z;EBn*TRXeDk%l`;_mCRCDBH8MHJMOwMd=>ctD1lh0}k+jyd(<ofIcEWnd&^i1M~MH zt&hx4C$Hy0Cp($c#h*qpp6-mI_MWXU4szb9)TiBB-JhtSGYPlcN$0)JVfQZQznrhS zo7IcX8v<2oxxyeP@I&`U?vLF>;8L|eutmA*lYw8lzYm-o+!`zoy%hRp__iU#hW>Eq z<?3bEQDOWTWQZE7K0oXS!)_`1tNRzXdwBJTKe>N&f93w#{f+yPz^8*3s?F-I;NH-R z@Vf&q1ybq}_ZRN-;j)oQ)uu+M7u@IFXWa|JZ&mH;=g=;te&${_^b+-)n^sS|Wh0+* z*A9DR$WPso>NLD|zSb#se(H`=wIeSb`LU5-8TkYEyY6G|_uOy0FO1x)TGjt^zvljj zd%3#b{i6G2chsmu?!#`ysD@FyN8K=L(~#f0e{fG!|K~0a{BGDw?)B=M(EerjMR#=3 z!BLN^C)8N=H<vd2w&=mYPt>2?uLXaq{^UM9{157n?gZxr=TGjR0iEvrVU!EJo)HH^ zFS+M9=VR)nE&QT8ZuH;q8u9hci|$#YU&a`;5wGsO<eoqJWfgGF!K)KRcolJ&a}s3g z;*e452Dls}3RMH=V??aZ$8nCDt!Am2YPy=LYH`giqTZk;sZupj%}35?HCl~QBjLW` zaDGSyRRFmg)y52VUFIyb-s6}Igd9dIbLGWgdc5N9&n?DvLr$K-C{gulwVL9Ao}((& z(#&;r=Dbj!*Qgb0m0Fp}8;SEsSYnQb<G|0u)G*B}tb<WP(oY@Ka5-W{D1GJVqu}Y{ z;BVsmKNOTJe;$5P<HK74Hn|wWG@sh=7Y^piud49JR9!|r!OiDL?()AaliH@@YMW{X zf#sMh$#C<Y4fen3Omcm1hNI|`&#$mHAIk`H-A`pWiG~)NobCZk_%h${KBT^cT>di; z#c|f&3^&hdGU98Bnv6P8j+!wY>9etyqvpI(wIH4vRYF~<dem3cN7eg)H%y(WPE$ir zJ5E)_h~`t&>8L9wtCLX8gQ!hs<?Sb`6Hp^YLxEDnQpq6pQED1uIgFY*4mI`Y_cKtV zi&Pn!!VWZ!yVO>dR2QoYVNDGCWEIWXYf+Qdp#@2!=63@75_OT<1H7dL_HMPMz+R7< zo4fB;?^2PY+PiYFC#a*_-<gLWKp9=9-j5^q52_nc&P=V;$DnE`um{ygGEibZgt$0_ zb0fk^xO`dtJ0gVXkLqJkN7pBG{M@DE=b$>Afd~aL4q^|h+p)8S2_uJ<j49?z4jDCp z&vH;V;-Bzf1}YezP@hLE-lguxk$V$x;yU$kCg<~H0{Fu?k^}#TfQR7oDBBKw+M&3c z9Hw@tE3!EX(x}51@K4AP{9lfLOLLhfy-abJO;X+*$){ZYUk2*S)SEShp%I-#LxU~& zR$s{%4aw;;{F_~=PiXMXS^}X$$7VoMCP%njralRJrQW2W_h#^kBaI5Nj;s@#m?7#? zjYXQhnun1rGIP1yf{Y%G_dX0y1V`lU%gXa|uv}>MwI07?C3Re}M0V=4Uu$YEWwirC z8CzD?qV2%oCK7lg>^_~R)HV8wIV^913I-7vPdswxwpne`DVxJwwlk)zg5Y85K@k19 z(*LSJ+p<)hM`GVLL{({hjAW%g4&FBu*hw}Y|L6MX<szt-L5F37*w0thc`ZEK{6cM` zQVTq?F$1fw&c`vompChnX;KT3vmnD^sfNynKWNROEUrl`HVJ(e4y5;MVEnNN?W%uU zoYT@uJMG6gy0+WTf$|1Je?CU8x%(28zx(a<!at<)cVibz!ff7>^3ogl(P=+8Ypslu zJZ}{mHyGXITnMATJj0;`iT-d4!M&a`X~R>_CYNWsou@uqV7G8Xt9)f`;raF2`febp zV=bQvdF4}RWMcJYst`thd4|J;LDJ`r><mAiHx$?nTv{qG#^+T29yREBXDJ^qeSenv z;e+#*<uNhO+l5BWezgl>^p|HiOhlqT+(PhWpc_mtbR~KrrLHpK`#rxsi}5z~4y5;I zuT8@GZXl^+EuVb)8Mx0-YKGpa)76=j%`uwFc`M)spE$W&p}Ue?9J!vM<{&X=5WA6Y z&*UiD^rbi92EUNr<lx`l>c7lh%}^CcR}5k|Iv7^7F*9^DyUN49K;`d-yPUmnKV)E6 zh3IEuHtT5iiFw$C>ZD(vLKyw!84iPO6%0Mky#M3YsE_>}<o>U3tbx}G;W3c5z~bcB zY6}}kDxY5JwYM$}u6E7Lb4j7NImd%FBQI78QRL<c1JVwT-gVyt7VjC<{_a6hDfMoT z)i#-H*^#gD1+-(@EAprdwQIAidPo(*=r7MO7;MY=VU@odo^tlW{g8oO4V3=q{C%wD zGdr(*3iTKBd?psc=r7MOn2kh#xP{<1sr=pWl(QG^hYaj$p!9{b>pO37)>?jiw&ULm zjc4ZiOe}=aU!Gww*b&nmDt|XT<?My~Ap^S_D81iX{aqbv`Q+2D#XQ+sn6ydnOi9}0 z)T#V^Qx>08{*Ci<X0}iuGDj!#b&|uQ$Yg2=(z&yF%oiMUCO&8G*65kT9a`=ton}6F zkxYEM$y}ennf7jSZD~2HXz{(6B3X`xm*M8+A~d;Ngs0_aIS8hO48(Vq8&jMa&h_2V zaiMg}fhpN!4%|Cm-v10bXTQxpcrJ#6$RnTreJs*Ai!cA2%eQ_OX#ZS307U)^mk)S2 zNJ(9<@^|4~=;$vgi*ZmVZ?hR%rn#hiyL|>a@L%-$Oy+EG4yaoT?3Q|9sXJBvPDy6_ zj1O*d74(vgXOsT41$$Cn{$E7?7YDJE>VZMfQJw<j@!9MXkmDmiSL$#+eC9(U|3<W_ z8h0ul@$#{=9ObdI9IwJ-=YPjk&--$D{)1hgfLBXS#6$Aaa6AzY&L^vd*eBy*hJRmy zN3wX071$Tx|1|txh{x8G@sKEgzXb67J-_3uQ{4roypHU^QAY;%3*|Ih?iR#b5IvcP zUmw7OiDI3WV=(W5IUk@0F`%^%%N|tQ@Bli5V=<20A68$+V`rx17}9S$+>D37%}S03 z@wl3=@(4bUu6vt)>?}t<NXCMw_-D#Ie3m$E!t?{RYr;R_Az+x@b??H1U_N~2k$V$x znsn-LCg*<SxbFS>Jq*g_zyIO0$Qi2fhT=sENx811yg9CWH?YF$ZmsW7ND!!{kr#IO z;*O;7gJYfY=7>D$z6l?yvAr0>wJyW)x`w3qUKLZ`9IG|;9S$A>70h1Ep%*V*5N`y| zOz}l0NtqnsGEDVqElE29)(MoyZJM4~qjgGNt`aJy<%O-$x~z?MhcZ$uR4_>;uVszF z%P3<Y({<mbQ*tDX<wqUmUnux8m)V(v1@AQFNqFIfDc3!mNtqmZ--Zy;ffQpjj=>=8 zR84y-UZRl{bC@zYENgDmPBcFiJOpZKPS;qc;}sl#%I1&<A3jr8{+|vW0_AZ5a`?|< z{vOj1Ld|xnIwPa6$aCFZ@XjBcT(2ofpU;CjoB`Qq3}QbEG=&}=7kc=NpB8)ce;ep% z#T#&Z171_g-HnBYhInTIi}~`x9j^$LJcG}(KS!>-M}x~e%8h8QCYO1I9@$wqQ-v`4 z%QGA(uRq*E@Z1N_yk1;jcU`_-X*MrLq1O@&o|nd(_R<^NLfZA6H#lo8zkxk`HoD2V z(8J;W@(hO(c&|U)LU8Y+Ws^2M<!o|!wvZ(S2Jg3e;D*+9`=Ter@;h4Xj}|}I_6d29 z>I+S-d-ZeOLKyw!84eR*Yk#<f;JFW<4L_dOU_v2xH}I(TtruG8WdXr5G~P2IQ6Kk0 z+V!0`IBPAxfjxZoYV5lGJyI$JHykFy-a_#H@|J;aFb|*Kf=AY_`xg8UY_pheQB2!w zL*JjKe)!<5wLJ3aOY!g-3&7$9-BNAUTQVt|V>FfXR*ff6L*vER3Vyk}7jDx+Z8;4* zMSaV(9%VR}WlBR*-W)57DdGv#()cm_SNUZnaIYN8Zy+h7gOM|Eiv`n^lcn>%W@6HY zyPQof&wj|jt_sl)#8xlPBwb4WoJn}4+rRtu@xumoWjIWNr30hzV;Op$`M6ll-rT;@ z#1;I)7=<1_7sixazh3=a4bEE2HJ^Tlwp|`Ri$+Ylt~bZ8zl92>Kxb+`Ud+M|?<~e( zA0Cs#;2%D3!Am!;do_+nyT1n%gL!Dp$KBRyn=0&|zH;%o@w~^AN0T$KhtCy0P5XP$ zTnKLLBd0>}{_+l}{N3=Bvls4%4D4#4^!;h-hY!wL%VT!lqyEB=>%2A=#yE1Wp`VTN zIWlHpsQ1ymNgJMWHn}|eAp^S_D1Bl5`pO-gwU*n!9zM_US=`@)=0b4eBXTMP?=SDu zDt|XT<?My~Ap^S_D1CpL`r(7K*7C@wUyjGP{9&j(d}d10HfK5D{(VyxpHzN-Y}eP@ z6?cJ1%A3P{k;&9{a2KehVZPv)Gx2xee|hGSpy<Gdg7TA>9a(vrG;^>}!Sup*YW;TN zhcY`g?RK5Q$FMVJFE05IVxYtkc&k3Q;^#Dya$QN;9MQpYYXz-9Esa1^npX-x0g@Cx zF``r69MOUJl$V0<1ZrvaX)gN|ci}53Zw_gVzOK6uJOpZKF4MH~AXvCC?YiC^$)~RT zzYIJCDwu@6S#x<ae$*u?<}l^W5iZn~|NQxvKrPMXn#<+*ftjRS{QjCLZ;o&g4GDR( z#`a=dp}AavAF)ZwbtPqUt^o%BMZ;@=ce%zk7}wwjP`SIvEp!wO2{G~n>lUqt93_V` z&E`$J?k$kdf6<FHMn~db16clUI1TjdeND!sz1rR4dr`-7H8?zb(-y;|3|F4-1@^r- z9_{YBUj)ry9$Qn3FGA|^*o<F}hwMT!@$i|;H2h<3{MGcxjOqcLi;ue*j!%OC9*Q2_ z_77bgM`!A*jXik~0{=;h<D@~D{#qnKaRgT8E5=I489yHT-=vB<ST4c84OIfM??N0o z<*({~Uc4$qosac;&hhhr4yXK1@ie?Naf`YQ$J+-mNH`5Rao8X)NLX%L^kW0p&3^^y zv;u2l7;H<Qo63D;!0TL`*RPM>1MyePi$&Ai5MDyU`$_H)tpDLEeB=^oT;RZq;E=#j z7t5I9Q)bb#XU^<ObtDtJ6Umt~`@V?wemsg50Jq71bXr-uEFIB*C6Ni`wUNjjGrGH4 zlj)hwSYfXNs~M`U%^*2g8YxdjETLgw&d~+n0Sv>;o0w3ZoS1BFDs4;eZtgvJZnCxg z;>b*7L}s?9lBpf3$jnrC*Mf{f3;O_T#&?9yQY)8<I-SiKb)wS&!<ELM5jFTLiDZ;E zSXo790k1rRozXH9DT$PAY;B)?4v21B8J$>`9v+#}9B)fvmAsCU=!EH!==2n?XC(B> zbO$GINXK_17C?i8MJ18VSUj#X-Wc!Pk=`0vh?U^59@^r_LRh6!!#@-)Iy*xE;r(Hk zmCO=Z9UXgTaCt*;A6!n++*rD+u`S-wk?33ysjGwmk=<Br4{O*(+FH|k;kgLba%_ty zvC>@|)*x(c@96HDuwcQ2&08lor&1TUCepnJ=W{7Qu8kMb)-M1S)`M$piEJLmRTZoC z@miHSI9t2Oqjuy?^w6xxo41<f7}NW(=-}RHQDvVzqtR%d`QQV`<#LgA`t+)G$FAf| zvTsVIk`bd~Y;Y=ic!(okA>ER#>8@kd&BNmr(yAlg+Ig&6d3cnr!J>_&4XL)ovFoS9 zE~OWE%xXBuu=8;-6{D;r(bT<TI%-a12bM}jdvJDU`NzhV*3R_QWGdbQNY~D@xjbW| ztm&AZ+JzWv<Px7pVc~hX6$|w#Q<3H#Rg@aK0=oN@w7UCD%Icoq9vQFb!jod;a*|R< zXPO$lC*IkP<!mQ4wxgUIqgb$Xs$T0eqSug&bauBB95IV=MzBn2M`x-zkxr*Nbu&|S za0VBQ#hQ{>;j~@1z>*&=S~Orz(HtIS>F5loGP^pn2B=SLq$QO|>(yzYNlSNgA`*{C z^T)=$Kc$urf@dN1ie^dkO~buTiR_H;<_fOttg*%_mvhau@adu@nXoPIZcoRzXI7cz z5}mNX$D<Pqk?L{*K;kOW)tN~2(zvnj>y1VZPTeR4#~x3cEXS(otmx(}2yWaOozWA$ zqoM`tk0v^2c5r3n1ji8js_qB{R6|u{G9wv11UuSonJ#|{+IIQNf+Lf4#B_9I@D5Il zEQV+fSBSb8hqKoTcU|h|W-jWwyIQy~a%08`(W&jJmVNCUQ<OHh?Tt@pZZ4@QX_y>u zO0x=<=@odVHnp~w>(q2C$y?siisg<wTWqdi8Jd!YvgT%tUM69H)X|lm*xVM!e+vJ5 zvCwPR_VRT1_U)~EQ6Equ&0SNaWXflsGo>Zn702?a9VI&^wNfP=JZDa;tBkGYD&eu! zMH5gh%E3gh;0yDhBA0AN6BC&rBoj(@WcgUuSz#9^5*_8qRC9VVO^zp%XSb)y(f^n0 z^=hZIr(_Y`X-IT;rHJE6X2Cup!)a=k_w@A6RA*N?o3`{slqKl&!o_LOVWhD;o<`}X zk(=&nful+~CUkU^bY!n{v4nOi)~s!BZtaLCr(nfeE<Br_iRPfIwJlM;JKotEZ|^Ee zPiGvLV+C6@65e!4I!k2vOp>rK(`#7IAW?HyImbEiuJp{zWjb+5ccQ&HF{x{3XCmG* z6~nmpbUB)8o63N4DRLN!l*tIYrc^pnvS%7wx^g{Uny@D^anGKFfo0V4I?)CxTA@kV z`jiPoHi&3&y7kJ<+7+zjpNJluiF%JworxX}Gv^PCxU3<Ew5-GvhMr_^G+I(oGOPFC zjHY-?MhiwGs$zvdr!4IuD``9zT?NLK?fW8=8z)E72?ldlsxv(k<4!J?9+|udi(9ux z=C!B%7zp<6_Lida*CrG3bRv@ONHn)@-=~+aW{uTrRAVV?jIA+Jjj#zm8_Q>tqiO9@ zy$7eQ2Z}V97=KPX+q8+1=sXKS6Ozqe*wBTR6}29{N>gXNb6*5qIKnX1xo<&aHhLWN z;Jaru=ss6BI8ok5WqO`c=|9fVO;$^y!?Mky%*%(7XhK_ZVq3D6ja)k$!|0^4^bE9b zy|>k5+g=zjVL>E1xhT51EWIG28|4$TqS@k-d>e0Cc+X=}hCX!4!J-A(sA%5TtQY)_ zKuxTIjnKyke@3Jly$Tlp*26<AQ_fY%(cz*Uo#AWji=v*^{-{}LRc~AQq3FcnWhDr# z(izQdtvsYA%t-OPH+yK+R<i2}O+7fRW@cUH&O>W+$AoAk7R~90=0rDJv?#g<EiLPW zc^~x|G6lYj6Qd+jGCZq?N4`H#Yo}G!D3U6fVU?^sSiThXLt6d?k;y2A9X^5cqMLmP zSlZpM;KqY9iBMjX3FEwu_FUoMLCCc+K3Eo|8`@j<_D)1U9qlc}u{GLTvS4y#%kT)c zDJF7@=4NhTO-5w1)HvSrrc>RW7#XoTrWX&d(}Qj-ci)*<usE_7t#wznrnPssHK9x6 zI3}^TwX3XrH*(I+K{C)O<(YoGXnLdp0Vx6^adf?%Ev)lhDYgu_1@XpnSviBZs4_AI z_w-o(Jv}wD0Zj?oEi}p~CH+kUHlFD&wD}Bt`>BI1Y?Nq5M0anK$~AV;!iCLkEsG<O zwXIklAA<+<6V2vsOplegz<y_{d&f@y$V!uymZOs_n&D+3{yGxTL=Y9tS}1o7kX(oQ zDy#TQRwN5*O2D!NSMG;L%E~#8FPa^}NQez2hS_?c96`sNX)QbPL5R*46qGFZkCrl- zXy4Jbb80z|%Q-G7IzO^J(T?v;bR~R_)dLav_(gehss*iZdvad{9eaeeSPEzA<Z{6% zG9{nU*IPn#a%X%G`L&TAuIz4=j}fqUX^UT+m^y{sFjm1&7tL9S*_22nmiWgP13DwT zit}3v7^<e)_qCZWfsw249DtW<Kf4^4<r$Qs*#l-_IZOu!!(hq6?JRw{6^ZadYoJ9k zTFN+T+rGF@EbSX0wRI$+3;Gsti?y^wBq>oW%`c)cbIX<Og3v@yD6c7+*hisYG6w@a z@qTGJl10-Z4LehN7^kUZH_DJ2vh&nmUC?8a2rf8-m7Y?b845?EZ$0qILwLwA9#hYE zVZGCGJQ{hS*9ousj^3hoL?^~Ncf=g0I~uzqS{Cc<jPHx3zJvT}oMqaXNFu~yPT=`$ zmP|awoY2+L*wV^7qLY?lWK0}&GjYn6?(0gVW2%l9=TzdpfFobdGcD7DG>EDKVbvYc z^YVd9G01FA$7-P)s4Kh(wfMXOWPDi5sO0b)Dr^F$JEEnP_zX%+EhA`hWpaBmz9S8l z=R{*rZ*r!a2lihz*GUMu?X565Fp~t6s&t<T@ZU7ENmZ?IU>DT9QKL^;mT@z3{*ykM zl(pktEpP?CrP9@u1o$8wQdJEf)bPVHG1W>RLk6$s&55Zl?PL8h49J_W#p4PU9F|=r zw$x%mD0aDsu0^BFPg6kGACh!xZK{2T{=Noso*?<e)p7VieTb4_>uTJY?Tja5YLf^q zU5&dQX!eArUSmFR6H`}2;kSu(O}k?1je<I*t{G*8>Kt>zHCoTLyv>82i-<c(U!jyk z5p6XuMeqG^b5->+1kBp(T|!J-F7B3lI1oa~JEBu`zkzRbK&uZ3V|FClaapbXQIB3C z)rQMY>f)Q&kU&|e_lZLqx>_39zd*;8<Tj~6-!#NjJ!z-PNDfs2?)f=ff*_mNun)nw zA!Flu{f(XNDZuAyZ8AeBhRf%{Vr}_qezv1=d%QK--I=Id&N5k7j#jrZwY{+|(T0&@ zWfX|@6*V$j%IV>5e(9#N68cu((J*;ghIXlzxqj-JR9B-O{Z=l6$PG|3-KcA8WeoOT zFdd^bGG}eBtfHA4E2>&|x3aZsY}(g|uZyHAt3i3;42))*FK$es^W2_H?WtTr<clzT zO*b~-=I~<NAGf9|S$3Od#PnBHvUaQl=H>+(Ff`nbj-aIxgWztI-|j?a{;F~n1E^}* za%nBXm!q}#D_RRIUJ-Z<-$*fT>Z#cA=PPd<cTxI+{~kSd*B9@8z6L<!)Sim#U%cmS z7aX45y{2KrpQ`V=_qX`&2ej*{82Q`{)$e|$vS|H(J@={oT`ia4D=pcg>Zv&4<;zdp zlDz9%9|=D8%!&&id<(v2BE{NM@!`9!{@qtD_~`e}KKI7);jiA?18F7%dMcLO`ES=e zyYs65cx2pxvu?lU3-?f3qN}H3#U&s3#$zvka&`Uxe)D}D@&EW8_(@RpRJ6rLe?xud z(bnzn{lpEA|L2Pz2S~@`_MVDg)O>7r^&>BoKlZ`O;R`<)zZ#-UsP<I+EuP#KUHRjt z19Li@hl^kQ4C!$1lTP$heEa#Pm$&@w!Q%EAAAaf&&p)>dpRKX=pr>M#vuRVwyu^*8 zo|$#%ic_i&;cF|Is?$?Z_wL7j*wEel)fX;*>e(l*duB4+qH7svX?iN=J%70Do=ZRc z(5~;#du;S?zV%1Sq{z;mit>*h{^oU;Tp9i2@})mI@X0OT?CmYnpq`4-=&2(=`Qq(A zDt^A`z2kR0T?;Erz3!>_!!vLC*}Kc0tNX97kNw4*_`*?e7+QdyiYvE7+n@UGjPK6; zZu!H{JbC6M=#gzIdMf_=C(9eot-Iue`%=HUIdt-~PvavmY*l(H-uICebMD&pjpD8E zdC$)e?mw*>re)fno{C*>`uS-$e}Bo4`B!}QcaQ$%d-&=MTdJOlJ)`3jpItWk7fZhv z9&^$ox8p-TwoU7)82@1JxmVoy#;5kIcxKK!hJIc_d(#B=RQ!47Q^_66mb4yv;NrdC z`oFDzfgWrtdn(?sKl0XhOpd+(nWz7F)1$wfiI4A0l18<sqWHO6R@B}7?fY&z`-3N+ z_o+kphE17neS0c;i=Te$o@v+aOAh<b7uP<X{sFn6hv}(!^8+J(J9FE!Zq@V8ggcvm z_a2bw*1M--ZsM-}zuXy!?w>a-oCvM>u|Q^@1IM2K&Z(VmSrvWiUE7OO|8vTv@I<Cp z=&AVPHIr^?4LTqDihFYJHP`=qF|?Boq^BbO{kegqcdNbMyZ!pFg}(NukHK8i+4NML zcj}=p{phigsf$)Gc-x&7kuQKwdZwO=7w)aQ@a|RbOg*uC(S6r%KN)nHPOPV*z4*GW z$FKh6PoI0|ujWkp<&w1kNq5&%@%+ZmUiRS)tDgMH#u=YX-f+umD4FRRdn#_eymRt< z$Be(`3u7AIwPx1OP9seE(VmL`{htTEcHo6{degTb`Oe8D_goK8vA^x9*!I!~A4vT^ z_`qMLT>hrN?N5z`KXkv`Q}O-JZh7`k?mK^d*J;IL-*sT>b-lfLU3pK%*vY4cPQ9pp z>+=f(%YXROcWvtJ?Q=lTQ}ICYb2IMQ^ibuN?yq0;jb-;w=<O{qwCJfgv}<#C$$#JZ zv2i8Iug$&Yqo0CGdN|TkQCnGYQt$p>-S)N%zIffb88!Ri7#X+pRNS)f54T)iG5V_; z{=D+fSAFT(ViW_0K6<VSP1nl@hyJ1J!2i|8o~?iA;6rGf^tea{K|K{S+n;=7Lh`&{ z-uAwyhE96%g?SmU44Zl?IzF3-KJtwp7yV|%n_sFq^CUDXGQ#Sq`0QIoz56dcOU|74 zw$`=Rg({vy1;IEBRp9-Pl#RPS_1rCQYq|L=|NYEgqm^}4)hhhb6IHcq*Yg#Ks@mEH yp7Eu>)k>Z6kt%#}5MS}Rv*DuEOEJ!yQCVLJc=%eN4CVM~*8KVNFRYj~>;D7N)t@H- diff --git a/boot/ocamllex b/boot/ocamllex index 80acc9ea3a4617fb57efe27eabce0f5292b669fc..7420b7e74b5da17dba0097f54e4e6c861a53d85f 100755 GIT binary patch delta 25499 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 delta 24173 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 S<MVDAGaM1PjyHa-MgBiElzI#R diff --git a/bytecomp/bytelink.ml b/bytecomp/bytelink.ml index c0f8f6a9..2f5c0ec4 100644 --- a/bytecomp/bytelink.ml +++ b/bytecomp/bytelink.ml @@ -42,7 +42,7 @@ let lib_ccobjs = ref [] let lib_ccopts = ref [] let lib_dllibs = ref [] -let add_ccobjs l = +let add_ccobjs origin l = if not !Clflags.no_auto_link then begin if String.length !Clflags.use_runtime = 0 @@ -50,7 +50,8 @@ let add_ccobjs l = then begin if l.lib_custom then Clflags.custom_runtime := true; lib_ccobjs := l.lib_ccobjs @ !lib_ccobjs; - lib_ccopts := l.lib_ccopts @ !lib_ccopts; + let replace_origin = Misc.replace_substring ~before:"$CAMLORIGIN" ~after:origin in + lib_ccopts := List.map replace_origin l.lib_ccopts @ !lib_ccopts; end; lib_dllibs := l.lib_dllibs @ !lib_dllibs end @@ -132,7 +133,7 @@ let scan_file obj_name tolink = seek_in ic pos_toc; let toc = (input_value ic : library) in close_in ic; - add_ccobjs toc; + add_ccobjs (Filename.dirname file_name) toc; let required = List.fold_right (fun compunit reqd -> @@ -196,7 +197,7 @@ let clear_crc_interfaces () = (* Record compilation events *) -let debug_info = ref ([] : (int * LongString.t) list) +let debug_info = ref ([] : (int * Instruct.debug_event list * string list) list) (* Link in a compilation unit *) @@ -207,8 +208,14 @@ let link_compunit ppf output_fun currpos_fun inchan file_name compunit = Symtable.ls_patch_object code_block compunit.cu_reloc; if !Clflags.debug && compunit.cu_debug > 0 then begin seek_in inchan compunit.cu_debug; - let buffer = LongString.input_bytes inchan compunit.cu_debugsize in - debug_info := (currpos_fun(), buffer) :: !debug_info + let debug_event_list : Instruct.debug_event list = input_value inchan in + let debug_dirs : string list = input_value inchan in + let file_path = Filename.dirname (Location.absolute_path file_name) in + let debug_dirs = + if List.mem file_path debug_dirs + then debug_dirs + else file_path :: debug_dirs in + debug_info := (currpos_fun(), debug_event_list, debug_dirs) :: !debug_info end; Array.iter output_fun code_block; if !Clflags.link_everything then @@ -263,9 +270,10 @@ let link_file ppf output_fun currpos_fun = function let output_debug_info oc = output_binary_int oc (List.length !debug_info); List.iter - (fun (ofs, evl) -> + (fun (ofs, evl, debug_dirs) -> output_binary_int oc ofs; - Array.iter (output_bytes oc) evl) + output_value oc evl; + output_value oc debug_dirs) !debug_info; debug_info := [] @@ -309,7 +317,7 @@ let link_bytecode ppf tolink exec_name standalone = Bytesections.init_record outchan; (* The path to the bytecode interpreter (in use_runtime mode) *) if String.length !Clflags.use_runtime > 0 then begin - output_string outchan (make_absolute !Clflags.use_runtime); + output_string outchan ("#!" ^ (make_absolute !Clflags.use_runtime)); output_char outchan '\n'; Bytesections.record outchan "RNTM" end; @@ -572,8 +580,15 @@ let link ppf objfiles output_name = raise x end else begin let basename = Filename.chop_extension output_name in - let c_file = basename ^ ".c" - and obj_file = basename ^ Config.ext_obj in + let c_file = + if !Clflags.output_complete_object + then Filename.temp_file "camlobj" ".c" + else basename ^ ".c" + and obj_file = + if !Clflags.output_complete_object + then Filename.temp_file "camlobj" Config.ext_obj + else basename ^ Config.ext_obj + in if Sys.file_exists c_file then raise(Error(File_exists c_file)); let temps = ref [] in try @@ -581,13 +596,19 @@ let link ppf objfiles output_name = if not (Filename.check_suffix output_name ".c") then begin temps := c_file :: !temps; if Ccomp.compile_file c_file <> 0 then raise(Error Custom_runtime); - if not (Filename.check_suffix output_name Config.ext_obj) then begin + if not (Filename.check_suffix output_name Config.ext_obj) || + !Clflags.output_complete_object then begin temps := obj_file :: !temps; + let mode, c_libs = + if Filename.check_suffix output_name Config.ext_obj + then Ccomp.Partial, "" + else Ccomp.MainDll, Config.bytecomp_c_libraries + in if not ( let runtime_lib = "-lcamlrun" ^ !Clflags.runtime_variant in - Ccomp.call_linker Ccomp.MainDll output_name + Ccomp.call_linker mode output_name ([obj_file] @ List.rev !Clflags.ccobjs @ [runtime_lib]) - Config.bytecomp_c_libraries + c_libs ) then raise (Error Custom_runtime); end end; diff --git a/bytecomp/lambda.ml b/bytecomp/lambda.ml index 5d9fb593..d32ac4fb 100644 --- a/bytecomp/lambda.ml +++ b/bytecomp/lambda.ml @@ -539,10 +539,9 @@ let lam_of_loc kind loc = | Loc_FILE -> Lconst (Const_immstring file) | Loc_MODULE -> let filename = Filename.basename file in - let module_name = - try String.capitalize (Filename.chop_extension filename) - with Invalid_argument _ -> "//"^filename^"//" - in Lconst (Const_immstring module_name) + let name = Env.get_unit_name () in + let module_name = if name = "" then "//"^filename^"//" else name in + Lconst (Const_immstring module_name) | Loc_LOC -> let loc = Printf.sprintf "File %S, line %d, characters %d-%d" file lnum cnum enum in diff --git a/bytecomp/symtable.ml b/bytecomp/symtable.ml index 1cc3a531..a0ce2737 100644 --- a/bytecomp/symtable.ml +++ b/bytecomp/symtable.ml @@ -81,7 +81,9 @@ let num_of_prim name = try find_numtable !c_prim_table name with Not_found -> - if !Clflags.custom_runtime then + if !Clflags.custom_runtime || Config.host <> Config.target + || !Clflags.no_check_prims + then enter_numtable c_prim_table name else begin let symb = diff --git a/bytecomp/translmod.ml b/bytecomp/translmod.ml index a2944f3d..d3c6ca2b 100644 --- a/bytecomp/translmod.ml +++ b/bytecomp/translmod.ml @@ -121,7 +121,7 @@ and wrap_id_pos_list id_pos_list get_field lam = (lam, Ident.empty) id_pos_list in if s == Ident.empty then lam else subst_lambda s lam - + (* Compose two coercions apply_coercion c1 (apply_coercion c2 e) behaves like @@ -405,7 +405,7 @@ and transl_structure fields cc rootpath = function | Tstr_primitive descr -> record_primitive descr.val_val; transl_structure fields cc rootpath rem - | Tstr_type(decls) -> + | Tstr_type decls -> transl_structure fields cc rootpath rem | Tstr_typext(tyext) -> let ids = List.map (fun ext -> ext.ext_id) tyext.tyext_constructors in @@ -596,7 +596,7 @@ let transl_store_structure glob map prims str = | Tstr_primitive descr -> record_primitive descr.val_val; transl_store rootpath subst rem - | Tstr_type(decls) -> + | Tstr_type decls -> transl_store rootpath subst rem | Tstr_typext(tyext) -> let ids = List.map (fun ext -> ext.ext_id) tyext.tyext_constructors in diff --git a/byterun/.depend b/byterun/.depend index 743737d0..ea58393c 100644 --- a/byterun/.depend +++ b/byterun/.depend @@ -1,422 +1,726 @@ -alloc.o: alloc.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h major_gc.h freelist.h memory.h gc.h \ - minor_gc.h stacks.h -array.o: array.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h -backtrace.o: backtrace.c config.h ../config/m.h ../config/s.h \ - compatibility.h mlvalues.h misc.h alloc.h io.h instruct.h intext.h \ - exec.h fix_code.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - startup.h stacks.h sys.h backtrace.h fail.h -callback.o: callback.c callback.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h interp.h instruct.h fix_code.h stacks.h -compact.o: compact.c config.h ../config/m.h ../config/s.h compatibility.h \ - finalise.h roots.h misc.h memory.h gc.h mlvalues.h major_gc.h \ - freelist.h minor_gc.h gc_ctrl.h weak.h -compare.o: compare.c custom.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h -custom.o: custom.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h -debugger.o: debugger.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h debugger.h fail.h fix_code.h \ - instruct.h intext.h io.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h sys.h -dynlink.o: dynlink.c config.h ../config/m.h ../config/s.h compatibility.h \ - alloc.h misc.h mlvalues.h dynlink.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h osdeps.h prims.h -extern.o: extern.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h gc.h intext.h io.h md5.h \ - memory.h major_gc.h freelist.h minor_gc.h reverse.h -fail.o: fail.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h io.h gc.h memory.h major_gc.h \ - freelist.h minor_gc.h printexc.h signals.h stacks.h -finalise.o: finalise.c callback.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h roots.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h signals.h -fix_code.o: fix_code.c config.h ../config/m.h ../config/s.h \ - compatibility.h debugger.h misc.h mlvalues.h fix_code.h instruct.h \ - intext.h io.h md5.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - reverse.h -floats.o: floats.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h reverse.h stacks.h -freelist.o: freelist.c config.h ../config/m.h ../config/s.h \ - compatibility.h freelist.h misc.h mlvalues.h gc.h gc_ctrl.h memory.h \ - major_gc.h minor_gc.h -gc_ctrl.o: gc_ctrl.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h compact.h custom.h finalise.h \ - roots.h memory.h gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h \ - stacks.h -globroots.o: globroots.c memory.h compatibility.h config.h ../config/m.h \ - ../config/s.h gc.h mlvalues.h misc.h major_gc.h freelist.h minor_gc.h \ - roots.h globroots.h -hash.o: hash.c mlvalues.h compatibility.h config.h ../config/m.h \ - ../config/s.h misc.h custom.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h hash.h +alloc.o: alloc.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/major_gc.h caml/freelist.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ + caml/address_class.h caml/mlvalues.h caml/stacks.h caml/memory.h +array.o: array.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h +backtrace.o: backtrace.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/mlvalues.h caml/config.h \ + caml/misc.h caml/alloc.h caml/mlvalues.h caml/io.h caml/instruct.h \ + caml/intext.h caml/io.h caml/exec.h caml/fix_code.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/startup.h caml/exec.h caml/stacks.h \ + caml/memory.h caml/sys.h caml/backtrace.h caml/fail.h +callback.o: callback.c caml/callback.h caml/compatibility.h \ + caml/mlvalues.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/fail.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h caml/interp.h caml/instruct.h caml/fix_code.h \ + caml/stacks.h caml/memory.h +compact.o: compact.c caml/address_class.h caml/misc.h \ + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/mlvalues.h caml/config.h caml/finalise.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/freelist.h caml/gc.h \ + caml/gc_ctrl.h caml/major_gc.h caml/memory.h caml/mlvalues.h \ + caml/roots.h caml/weak.h +compare.o: compare.c caml/custom.h caml/compatibility.h caml/mlvalues.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h caml/misc.h \ + caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/misc.h caml/mlvalues.h +custom.o: custom.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h +debugger.o: debugger.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/config.h caml/debugger.h caml/misc.h caml/fail.h \ + caml/fix_code.h caml/instruct.h caml/intext.h caml/io.h caml/io.h \ + caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/sys.h +dynlink.o: dynlink.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/dynlink.h caml/fail.h caml/mlvalues.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/osdeps.h caml/prims.h \ + caml/signals.h +extern.o: extern.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \ + caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h caml/reverse.h +fail.o: fail.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/io.h caml/gc.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/misc.h caml/mlvalues.h caml/printexc.h caml/signals.h caml/stacks.h \ + caml/memory.h +finalise.o: finalise.c caml/callback.h caml/compatibility.h \ + caml/mlvalues.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/fail.h caml/mlvalues.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/signals.h +fix_code.o: fix_code.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/debugger.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/fix_code.h caml/instruct.h \ + caml/intext.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/misc.h caml/mlvalues.h caml/reverse.h +floats.o: floats.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/mlvalues.h \ + caml/misc.h caml/reverse.h caml/stacks.h caml/memory.h +freelist.o: freelist.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/freelist.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/gc.h caml/gc_ctrl.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/major_gc.h caml/misc.h caml/mlvalues.h +gc_ctrl.o: gc_ctrl.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/compact.h caml/custom.h caml/finalise.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/freelist.h caml/gc.h \ + caml/gc_ctrl.h caml/major_gc.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/stacks.h +globroots.o: globroots.c caml/memory.h caml/compatibility.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/gc.h caml/mlvalues.h \ + caml/misc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/memory.h caml/globroots.h caml/roots.h +hash.o: hash.c caml/mlvalues.h caml/compatibility.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/custom.h \ + caml/mlvalues.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/hash.h instrtrace.o: instrtrace.c -intern.o: intern.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h callback.h custom.h fail.h gc.h intext.h io.h \ - md5.h memory.h major_gc.h freelist.h minor_gc.h reverse.h -interp.o: interp.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h backtrace.h callback.h debugger.h fail.h \ - fix_code.h instrtrace.h instruct.h interp.h major_gc.h freelist.h \ - memory.h gc.h minor_gc.h prims.h signals.h stacks.h jumptbl.h -ints.o: ints.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h intext.h io.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h -io.o: io.c config.h ../config/m.h ../config/s.h compatibility.h alloc.h \ - misc.h mlvalues.h custom.h fail.h io.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h signals.h sys.h -lexing.o: lexing.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h -main.o: main.c misc.h compatibility.h config.h ../config/m.h \ - ../config/s.h mlvalues.h sys.h -major_gc.o: major_gc.c compact.h config.h ../config/m.h ../config/s.h \ - compatibility.h misc.h custom.h mlvalues.h fail.h finalise.h roots.h \ - memory.h gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h weak.h -md5.o: md5.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h md5.h io.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h reverse.h -memory.o: memory.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h freelist.h gc.h gc_ctrl.h major_gc.h memory.h \ - minor_gc.h signals.h -meta.o: meta.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h fix_code.h interp.h intext.h io.h \ - major_gc.h freelist.h memory.h gc.h minor_gc.h prims.h stacks.h -minor_gc.o: minor_gc.c config.h ../config/m.h ../config/s.h \ - compatibility.h fail.h misc.h mlvalues.h finalise.h roots.h memory.h \ - gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h signals.h weak.h -misc.o: misc.c config.h ../config/m.h ../config/s.h compatibility.h \ - misc.h memory.h gc.h mlvalues.h major_gc.h freelist.h minor_gc.h -obj.o: obj.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h gc.h interp.h major_gc.h freelist.h \ - memory.h minor_gc.h prims.h -parsing.o: parsing.c config.h ../config/m.h ../config/s.h compatibility.h \ - mlvalues.h misc.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - alloc.h -prims.o: prims.c mlvalues.h compatibility.h config.h ../config/m.h \ - ../config/s.h misc.h prims.h -printexc.o: printexc.c backtrace.h mlvalues.h compatibility.h config.h \ - ../config/m.h ../config/s.h misc.h callback.h debugger.h fail.h \ - printexc.h -roots.o: roots.c finalise.h roots.h misc.h compatibility.h config.h \ - ../config/m.h ../config/s.h memory.h gc.h mlvalues.h major_gc.h \ - freelist.h minor_gc.h globroots.h stacks.h -signals.o: signals.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h callback.h fail.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h roots.h signals.h signals_machdep.h \ - sys.h -signals_byt.o: signals_byt.c config.h ../config/m.h ../config/s.h \ - compatibility.h memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h \ - minor_gc.h osdeps.h signals.h signals_machdep.h -stacks.o: stacks.c config.h ../config/m.h ../config/s.h compatibility.h \ - fail.h misc.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h -startup.o: startup.c config.h ../config/m.h ../config/s.h compatibility.h \ - alloc.h misc.h mlvalues.h backtrace.h callback.h custom.h debugger.h \ - dynlink.h exec.h fail.h fix_code.h freelist.h gc_ctrl.h instrtrace.h \ - interp.h intext.h io.h memory.h gc.h major_gc.h minor_gc.h osdeps.h \ - prims.h printexc.h reverse.h signals.h stacks.h sys.h startup.h \ - version.h -str.o: str.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h -sys.o: sys.c config.h ../config/m.h ../config/s.h compatibility.h alloc.h \ - misc.h mlvalues.h debugger.h fail.h instruct.h osdeps.h signals.h \ - stacks.h memory.h gc.h major_gc.h freelist.h minor_gc.h sys.h -terminfo.o: terminfo.c config.h ../config/m.h ../config/s.h \ - compatibility.h alloc.h misc.h mlvalues.h fail.h io.h -unix.o: unix.c config.h ../config/m.h ../config/s.h compatibility.h \ - memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h minor_gc.h \ - osdeps.h -weak.o: weak.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h major_gc.h freelist.h memory.h gc.h \ - minor_gc.h -win32.o: win32.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - osdeps.h signals.h sys.h -alloc.d.o: alloc.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h major_gc.h freelist.h memory.h gc.h \ - minor_gc.h stacks.h -array.d.o: array.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h -backtrace.d.o: backtrace.c config.h ../config/m.h ../config/s.h \ - compatibility.h mlvalues.h misc.h alloc.h io.h instruct.h intext.h \ - exec.h fix_code.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - startup.h stacks.h sys.h backtrace.h fail.h -callback.d.o: callback.c callback.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h interp.h instruct.h fix_code.h stacks.h -compact.d.o: compact.c config.h ../config/m.h ../config/s.h compatibility.h \ - finalise.h roots.h misc.h memory.h gc.h mlvalues.h major_gc.h \ - freelist.h minor_gc.h gc_ctrl.h weak.h -compare.d.o: compare.c custom.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h -custom.d.o: custom.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h -debugger.d.o: debugger.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h debugger.h fail.h fix_code.h \ - instruct.h intext.h io.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h sys.h -dynlink.d.o: dynlink.c config.h ../config/m.h ../config/s.h compatibility.h \ - alloc.h misc.h mlvalues.h dynlink.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h osdeps.h prims.h -extern.d.o: extern.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h gc.h intext.h io.h md5.h \ - memory.h major_gc.h freelist.h minor_gc.h reverse.h -fail.d.o: fail.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h io.h gc.h memory.h major_gc.h \ - freelist.h minor_gc.h printexc.h signals.h stacks.h -finalise.d.o: finalise.c callback.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h roots.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h signals.h -fix_code.d.o: fix_code.c config.h ../config/m.h ../config/s.h \ - compatibility.h debugger.h misc.h mlvalues.h fix_code.h instruct.h \ - intext.h io.h md5.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - reverse.h -floats.d.o: floats.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h reverse.h stacks.h -freelist.d.o: freelist.c config.h ../config/m.h ../config/s.h \ - compatibility.h freelist.h misc.h mlvalues.h gc.h gc_ctrl.h memory.h \ - major_gc.h minor_gc.h -gc_ctrl.d.o: gc_ctrl.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h compact.h custom.h finalise.h \ - roots.h memory.h gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h \ - stacks.h -globroots.d.o: globroots.c memory.h compatibility.h config.h ../config/m.h \ - ../config/s.h gc.h mlvalues.h misc.h major_gc.h freelist.h minor_gc.h \ - roots.h globroots.h -hash.d.o: hash.c mlvalues.h compatibility.h config.h ../config/m.h \ - ../config/s.h misc.h custom.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h hash.h -instrtrace.d.o: instrtrace.c instruct.h misc.h compatibility.h config.h \ - ../config/m.h ../config/s.h mlvalues.h opnames.h prims.h stacks.h \ - memory.h gc.h major_gc.h freelist.h minor_gc.h -intern.d.o: intern.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h callback.h custom.h fail.h gc.h intext.h io.h \ - md5.h memory.h major_gc.h freelist.h minor_gc.h reverse.h -interp.d.o: interp.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h backtrace.h callback.h debugger.h fail.h \ - fix_code.h instrtrace.h instruct.h interp.h major_gc.h freelist.h \ - memory.h gc.h minor_gc.h prims.h signals.h stacks.h -ints.d.o: ints.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h intext.h io.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h -io.d.o: io.c config.h ../config/m.h ../config/s.h compatibility.h alloc.h \ - misc.h mlvalues.h custom.h fail.h io.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h signals.h sys.h -lexing.d.o: lexing.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h -main.d.o: main.c misc.h compatibility.h config.h ../config/m.h \ - ../config/s.h mlvalues.h sys.h -major_gc.d.o: major_gc.c compact.h config.h ../config/m.h ../config/s.h \ - compatibility.h misc.h custom.h mlvalues.h fail.h finalise.h roots.h \ - memory.h gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h weak.h -md5.d.o: md5.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h md5.h io.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h reverse.h -memory.d.o: memory.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h freelist.h gc.h gc_ctrl.h major_gc.h memory.h \ - minor_gc.h signals.h -meta.d.o: meta.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h fix_code.h interp.h intext.h io.h \ - major_gc.h freelist.h memory.h gc.h minor_gc.h prims.h stacks.h -minor_gc.d.o: minor_gc.c config.h ../config/m.h ../config/s.h \ - compatibility.h fail.h misc.h mlvalues.h finalise.h roots.h memory.h \ - gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h signals.h weak.h -misc.d.o: misc.c config.h ../config/m.h ../config/s.h compatibility.h \ - misc.h memory.h gc.h mlvalues.h major_gc.h freelist.h minor_gc.h -obj.d.o: obj.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h gc.h interp.h major_gc.h freelist.h \ - memory.h minor_gc.h prims.h -parsing.d.o: parsing.c config.h ../config/m.h ../config/s.h compatibility.h \ - mlvalues.h misc.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - alloc.h -prims.d.o: prims.c mlvalues.h compatibility.h config.h ../config/m.h \ - ../config/s.h misc.h prims.h -printexc.d.o: printexc.c backtrace.h mlvalues.h compatibility.h config.h \ - ../config/m.h ../config/s.h misc.h callback.h debugger.h fail.h \ - printexc.h -roots.d.o: roots.c finalise.h roots.h misc.h compatibility.h config.h \ - ../config/m.h ../config/s.h memory.h gc.h mlvalues.h major_gc.h \ - freelist.h minor_gc.h globroots.h stacks.h -signals.d.o: signals.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h callback.h fail.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h roots.h signals.h signals_machdep.h \ - sys.h -signals_byt.d.o: signals_byt.c config.h ../config/m.h ../config/s.h \ - compatibility.h memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h \ - minor_gc.h osdeps.h signals.h signals_machdep.h -stacks.d.o: stacks.c config.h ../config/m.h ../config/s.h compatibility.h \ - fail.h misc.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h -startup.d.o: startup.c config.h ../config/m.h ../config/s.h compatibility.h \ - alloc.h misc.h mlvalues.h backtrace.h callback.h custom.h debugger.h \ - dynlink.h exec.h fail.h fix_code.h freelist.h gc_ctrl.h instrtrace.h \ - interp.h intext.h io.h memory.h gc.h major_gc.h minor_gc.h osdeps.h \ - prims.h printexc.h reverse.h signals.h stacks.h sys.h startup.h \ - version.h -str.d.o: str.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h -sys.d.o: sys.c config.h ../config/m.h ../config/s.h compatibility.h alloc.h \ - misc.h mlvalues.h debugger.h fail.h instruct.h osdeps.h signals.h \ - stacks.h memory.h gc.h major_gc.h freelist.h minor_gc.h sys.h -terminfo.d.o: terminfo.c config.h ../config/m.h ../config/s.h \ - compatibility.h alloc.h misc.h mlvalues.h fail.h io.h -unix.d.o: unix.c config.h ../config/m.h ../config/s.h compatibility.h \ - memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h minor_gc.h \ - osdeps.h -weak.d.o: weak.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h major_gc.h freelist.h memory.h gc.h \ - minor_gc.h -win32.d.o: win32.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - osdeps.h signals.h sys.h -alloc.pic.o: alloc.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h major_gc.h freelist.h memory.h gc.h \ - minor_gc.h stacks.h -array.pic.o: array.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h -backtrace.pic.o: backtrace.c config.h ../config/m.h ../config/s.h \ - compatibility.h mlvalues.h misc.h alloc.h io.h instruct.h intext.h \ - exec.h fix_code.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - startup.h stacks.h sys.h backtrace.h fail.h -callback.pic.o: callback.c callback.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h interp.h instruct.h fix_code.h stacks.h -compact.pic.o: compact.c config.h ../config/m.h ../config/s.h compatibility.h \ - finalise.h roots.h misc.h memory.h gc.h mlvalues.h major_gc.h \ - freelist.h minor_gc.h gc_ctrl.h weak.h -compare.pic.o: compare.c custom.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h -custom.pic.o: custom.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h -debugger.pic.o: debugger.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h debugger.h fail.h fix_code.h \ - instruct.h intext.h io.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h sys.h -dynlink.pic.o: dynlink.c config.h ../config/m.h ../config/s.h compatibility.h \ - alloc.h misc.h mlvalues.h dynlink.h fail.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h osdeps.h prims.h -extern.pic.o: extern.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h gc.h intext.h io.h md5.h \ - memory.h major_gc.h freelist.h minor_gc.h reverse.h -fail.pic.o: fail.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h io.h gc.h memory.h major_gc.h \ - freelist.h minor_gc.h printexc.h signals.h stacks.h -finalise.pic.o: finalise.c callback.h compatibility.h mlvalues.h config.h \ - ../config/m.h ../config/s.h misc.h fail.h roots.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h signals.h -fix_code.pic.o: fix_code.c config.h ../config/m.h ../config/s.h \ - compatibility.h debugger.h misc.h mlvalues.h fix_code.h instruct.h \ - intext.h io.h md5.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - reverse.h -floats.pic.o: floats.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h reverse.h stacks.h -freelist.pic.o: freelist.c config.h ../config/m.h ../config/s.h \ - compatibility.h freelist.h misc.h mlvalues.h gc.h gc_ctrl.h memory.h \ - major_gc.h minor_gc.h -gc_ctrl.pic.o: gc_ctrl.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h compact.h custom.h finalise.h \ - roots.h memory.h gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h \ - stacks.h -globroots.pic.o: globroots.c memory.h compatibility.h config.h ../config/m.h \ - ../config/s.h gc.h mlvalues.h misc.h major_gc.h freelist.h minor_gc.h \ - roots.h globroots.h -hash.pic.o: hash.c mlvalues.h compatibility.h config.h ../config/m.h \ - ../config/s.h misc.h custom.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h hash.h +intern.o: intern.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/callback.h caml/custom.h caml/fail.h caml/gc.h \ + caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h caml/misc.h caml/reverse.h +interp.o: interp.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/backtrace.h caml/callback.h caml/debugger.h \ + caml/fail.h caml/fix_code.h caml/instrtrace.h caml/instruct.h \ + caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h caml/prims.h caml/signals.h caml/stacks.h caml/memory.h \ + caml/jumptbl.h +ints.o: ints.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/intext.h caml/io.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h +io.o: io.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/io.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/signals.h \ + caml/sys.h +lexing.o: lexing.c caml/fail.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h +main.o: main.c caml/misc.h caml/compatibility.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/misc.h \ + caml/sys.h +major_gc.o: major_gc.c caml/compact.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/misc.h caml/custom.h \ + caml/mlvalues.h caml/config.h caml/fail.h caml/finalise.h caml/roots.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/freelist.h caml/gc.h caml/gc_ctrl.h \ + caml/major_gc.h caml/misc.h caml/mlvalues.h caml/roots.h caml/weak.h +md5.o: md5.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/md5.h caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/mlvalues.h \ + caml/io.h caml/reverse.h +memory.o: memory.c caml/address_class.h caml/misc.h caml/compatibility.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/freelist.h caml/gc.h caml/gc_ctrl.h \ + caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/minor_gc.h caml/address_class.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/signals.h +meta.o: meta.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/config.h caml/fail.h caml/fix_code.h caml/interp.h \ + caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/stacks.h \ + caml/memory.h +minor_gc.o: minor_gc.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/finalise.h caml/roots.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h \ + caml/memory.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/signals.h caml/weak.h +misc.o: misc.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/compatibility.h caml/misc.h caml/config.h caml/memory.h caml/gc.h \ + caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h +obj.o: obj.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/gc.h caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h +parsing.o: parsing.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/mlvalues.h caml/config.h \ + caml/misc.h caml/memory.h caml/gc.h caml/mlvalues.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/alloc.h +prims.o: prims.c caml/mlvalues.h caml/compatibility.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/prims.h +printexc.o: printexc.c caml/backtrace.h caml/mlvalues.h \ + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/callback.h caml/debugger.h \ + caml/fail.h caml/misc.h caml/mlvalues.h caml/printexc.h +roots.o: roots.c caml/finalise.h caml/roots.h caml/misc.h \ + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/memory.h caml/gc.h caml/mlvalues.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/globroots.h caml/major_gc.h caml/memory.h caml/minor_gc.h \ + caml/misc.h caml/mlvalues.h caml/roots.h caml/stacks.h +signals_byt.o: signals_byt.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/memory.h caml/config.h \ + caml/gc.h caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/osdeps.h caml/signals.h \ + caml/signals_machdep.h +signals.o: signals.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/callback.h caml/config.h caml/fail.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/memory.h caml/signals.h caml/signals_machdep.h caml/sys.h +stacks.o: stacks.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/misc.h caml/mlvalues.h caml/stacks.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h +startup.o: startup.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/backtrace.h caml/callback.h \ + caml/custom.h caml/debugger.h caml/dynlink.h caml/exec.h caml/fail.h \ + caml/fix_code.h caml/freelist.h caml/gc_ctrl.h caml/instrtrace.h \ + caml/interp.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/osdeps.h caml/prims.h \ + caml/printexc.h caml/reverse.h caml/signals.h caml/stacks.h \ + caml/memory.h caml/sys.h caml/startup.h caml/exec.h caml/version.h +str.o: str.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/mlvalues.h caml/misc.h +sys.o: sys.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ + caml/mlvalues.h caml/debugger.h caml/fail.h caml/instruct.h \ + caml/mlvalues.h caml/osdeps.h caml/signals.h caml/stacks.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/sys.h +terminfo.o: terminfo.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/fail.h caml/io.h caml/mlvalues.h +unix.o: unix.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/compatibility.h caml/memory.h caml/config.h caml/gc.h \ + caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/misc.h caml/osdeps.h +weak.o: weak.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/major_gc.h caml/freelist.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ + caml/address_class.h caml/mlvalues.h +win32.o: win32.c caml/address_class.h caml/misc.h caml/compatibility.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/osdeps.h caml/signals.h caml/sys.h +alloc.d.o: alloc.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/major_gc.h caml/freelist.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ + caml/address_class.h caml/mlvalues.h caml/stacks.h caml/memory.h +array.d.o: array.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h +backtrace.d.o: backtrace.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/mlvalues.h caml/config.h \ + caml/misc.h caml/alloc.h caml/mlvalues.h caml/io.h caml/instruct.h \ + caml/intext.h caml/io.h caml/exec.h caml/fix_code.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/startup.h caml/exec.h caml/stacks.h \ + caml/memory.h caml/sys.h caml/backtrace.h caml/fail.h +callback.d.o: callback.c caml/callback.h caml/compatibility.h \ + caml/mlvalues.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/fail.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h caml/interp.h caml/instruct.h caml/fix_code.h \ + caml/stacks.h caml/memory.h +compact.d.o: compact.c caml/address_class.h caml/misc.h \ + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/mlvalues.h caml/config.h caml/finalise.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/freelist.h caml/gc.h \ + caml/gc_ctrl.h caml/major_gc.h caml/memory.h caml/mlvalues.h \ + caml/roots.h caml/weak.h +compare.d.o: compare.c caml/custom.h caml/compatibility.h caml/mlvalues.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h caml/misc.h \ + caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/misc.h caml/mlvalues.h +custom.d.o: custom.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h +debugger.d.o: debugger.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/config.h caml/debugger.h caml/misc.h caml/fail.h \ + caml/fix_code.h caml/instruct.h caml/intext.h caml/io.h caml/io.h \ + caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/sys.h +dynlink.d.o: dynlink.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/dynlink.h caml/fail.h caml/mlvalues.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/osdeps.h caml/prims.h \ + caml/signals.h +extern.d.o: extern.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \ + caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h caml/reverse.h +fail.d.o: fail.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/io.h caml/gc.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/misc.h caml/mlvalues.h caml/printexc.h caml/signals.h caml/stacks.h \ + caml/memory.h +finalise.d.o: finalise.c caml/callback.h caml/compatibility.h \ + caml/mlvalues.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/fail.h caml/mlvalues.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/signals.h +fix_code.d.o: fix_code.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/debugger.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/fix_code.h caml/instruct.h \ + caml/intext.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/misc.h caml/mlvalues.h caml/reverse.h +floats.d.o: floats.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/mlvalues.h \ + caml/misc.h caml/reverse.h caml/stacks.h caml/memory.h +freelist.d.o: freelist.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/freelist.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/gc.h caml/gc_ctrl.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/major_gc.h caml/misc.h caml/mlvalues.h +gc_ctrl.d.o: gc_ctrl.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/compact.h caml/custom.h caml/finalise.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/freelist.h caml/gc.h \ + caml/gc_ctrl.h caml/major_gc.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/stacks.h +globroots.d.o: globroots.c caml/memory.h caml/compatibility.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/gc.h caml/mlvalues.h \ + caml/misc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/memory.h caml/globroots.h caml/roots.h +hash.d.o: hash.c caml/mlvalues.h caml/compatibility.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/custom.h \ + caml/mlvalues.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/hash.h +instrtrace.d.o: instrtrace.c caml/instruct.h caml/misc.h \ + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/mlvalues.h caml/misc.h caml/opnames.h \ + caml/prims.h caml/stacks.h caml/mlvalues.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h +intern.d.o: intern.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/callback.h caml/custom.h caml/fail.h caml/gc.h \ + caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h caml/misc.h caml/reverse.h +interp.d.o: interp.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/backtrace.h caml/callback.h caml/debugger.h \ + caml/fail.h caml/fix_code.h caml/instrtrace.h caml/instruct.h \ + caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h caml/prims.h caml/signals.h caml/stacks.h caml/memory.h +ints.d.o: ints.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/intext.h caml/io.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h +io.d.o: io.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/io.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/signals.h \ + caml/sys.h +lexing.d.o: lexing.c caml/fail.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h +main.d.o: main.c caml/misc.h caml/compatibility.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/misc.h \ + caml/sys.h +major_gc.d.o: major_gc.c caml/compact.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/misc.h caml/custom.h \ + caml/mlvalues.h caml/config.h caml/fail.h caml/finalise.h caml/roots.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/freelist.h caml/gc.h caml/gc_ctrl.h \ + caml/major_gc.h caml/misc.h caml/mlvalues.h caml/roots.h caml/weak.h +md5.d.o: md5.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/md5.h caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/mlvalues.h \ + caml/io.h caml/reverse.h +memory.d.o: memory.c caml/address_class.h caml/misc.h caml/compatibility.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/freelist.h caml/gc.h caml/gc_ctrl.h \ + caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/minor_gc.h caml/address_class.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/signals.h +meta.d.o: meta.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/config.h caml/fail.h caml/fix_code.h caml/interp.h \ + caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/stacks.h \ + caml/memory.h +minor_gc.d.o: minor_gc.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/finalise.h caml/roots.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h \ + caml/memory.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/signals.h caml/weak.h +misc.d.o: misc.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/compatibility.h caml/misc.h caml/config.h caml/memory.h caml/gc.h \ + caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h +obj.d.o: obj.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/gc.h caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h +parsing.d.o: parsing.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/mlvalues.h caml/config.h \ + caml/misc.h caml/memory.h caml/gc.h caml/mlvalues.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/alloc.h +prims.d.o: prims.c caml/mlvalues.h caml/compatibility.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/prims.h +printexc.d.o: printexc.c caml/backtrace.h caml/mlvalues.h \ + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/callback.h caml/debugger.h \ + caml/fail.h caml/misc.h caml/mlvalues.h caml/printexc.h +roots.d.o: roots.c caml/finalise.h caml/roots.h caml/misc.h \ + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/memory.h caml/gc.h caml/mlvalues.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/globroots.h caml/major_gc.h caml/memory.h caml/minor_gc.h \ + caml/misc.h caml/mlvalues.h caml/roots.h caml/stacks.h +signals_byt.d.o: signals_byt.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/memory.h caml/config.h \ + caml/gc.h caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/osdeps.h caml/signals.h \ + caml/signals_machdep.h +signals.d.o: signals.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/callback.h caml/config.h caml/fail.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/memory.h caml/signals.h caml/signals_machdep.h caml/sys.h +stacks.d.o: stacks.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/misc.h caml/mlvalues.h caml/stacks.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h +startup.d.o: startup.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/backtrace.h caml/callback.h \ + caml/custom.h caml/debugger.h caml/dynlink.h caml/exec.h caml/fail.h \ + caml/fix_code.h caml/freelist.h caml/gc_ctrl.h caml/instrtrace.h \ + caml/interp.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/osdeps.h caml/prims.h \ + caml/printexc.h caml/reverse.h caml/signals.h caml/stacks.h \ + caml/memory.h caml/sys.h caml/startup.h caml/exec.h caml/version.h +str.d.o: str.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/mlvalues.h caml/misc.h +sys.d.o: sys.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ + caml/mlvalues.h caml/debugger.h caml/fail.h caml/instruct.h \ + caml/mlvalues.h caml/osdeps.h caml/signals.h caml/stacks.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/sys.h +terminfo.d.o: terminfo.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/fail.h caml/io.h caml/mlvalues.h +unix.d.o: unix.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/compatibility.h caml/memory.h caml/config.h caml/gc.h \ + caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/misc.h caml/osdeps.h +weak.d.o: weak.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/major_gc.h caml/freelist.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ + caml/address_class.h caml/mlvalues.h +win32.d.o: win32.c caml/address_class.h caml/misc.h caml/compatibility.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/osdeps.h caml/signals.h caml/sys.h +alloc.pic.o: alloc.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/major_gc.h caml/freelist.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ + caml/address_class.h caml/mlvalues.h caml/stacks.h caml/memory.h +array.pic.o: array.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h +backtrace.pic.o: backtrace.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/mlvalues.h caml/config.h \ + caml/misc.h caml/alloc.h caml/mlvalues.h caml/io.h caml/instruct.h \ + caml/intext.h caml/io.h caml/exec.h caml/fix_code.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/startup.h caml/exec.h caml/stacks.h \ + caml/memory.h caml/sys.h caml/backtrace.h caml/fail.h +callback.pic.o: callback.c caml/callback.h caml/compatibility.h \ + caml/mlvalues.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/fail.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h caml/interp.h caml/instruct.h caml/fix_code.h \ + caml/stacks.h caml/memory.h +compact.pic.o: compact.c caml/address_class.h caml/misc.h \ + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/mlvalues.h caml/config.h caml/finalise.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/freelist.h caml/gc.h \ + caml/gc_ctrl.h caml/major_gc.h caml/memory.h caml/mlvalues.h \ + caml/roots.h caml/weak.h +compare.pic.o: compare.c caml/custom.h caml/compatibility.h caml/mlvalues.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h caml/misc.h \ + caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/misc.h caml/mlvalues.h +custom.pic.o: custom.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h +debugger.pic.o: debugger.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/config.h caml/debugger.h caml/misc.h caml/fail.h \ + caml/fix_code.h caml/instruct.h caml/intext.h caml/io.h caml/io.h \ + caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/sys.h +dynlink.pic.o: dynlink.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/dynlink.h caml/fail.h caml/mlvalues.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/osdeps.h caml/prims.h \ + caml/signals.h +extern.pic.o: extern.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \ + caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h caml/reverse.h +fail.pic.o: fail.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/io.h caml/gc.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/misc.h caml/mlvalues.h caml/printexc.h caml/signals.h caml/stacks.h \ + caml/memory.h +finalise.pic.o: finalise.c caml/callback.h caml/compatibility.h \ + caml/mlvalues.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/fail.h caml/mlvalues.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/signals.h +fix_code.pic.o: fix_code.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/debugger.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/fix_code.h caml/instruct.h \ + caml/intext.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/misc.h caml/mlvalues.h caml/reverse.h +floats.pic.o: floats.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/mlvalues.h \ + caml/misc.h caml/reverse.h caml/stacks.h caml/memory.h +freelist.pic.o: freelist.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/freelist.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/gc.h caml/gc_ctrl.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/major_gc.h caml/misc.h caml/mlvalues.h +gc_ctrl.pic.o: gc_ctrl.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/compact.h caml/custom.h caml/finalise.h \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/freelist.h caml/gc.h \ + caml/gc_ctrl.h caml/major_gc.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/stacks.h +globroots.pic.o: globroots.c caml/memory.h caml/compatibility.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/gc.h caml/mlvalues.h \ + caml/misc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/memory.h caml/globroots.h caml/roots.h +hash.pic.o: hash.c caml/mlvalues.h caml/compatibility.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/custom.h \ + caml/mlvalues.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/hash.h instrtrace.pic.o: instrtrace.c -intern.pic.o: intern.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h callback.h custom.h fail.h gc.h intext.h io.h \ - md5.h memory.h major_gc.h freelist.h minor_gc.h reverse.h -interp.pic.o: interp.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h backtrace.h callback.h debugger.h fail.h \ - fix_code.h instrtrace.h instruct.h interp.h major_gc.h freelist.h \ - memory.h gc.h minor_gc.h prims.h signals.h stacks.h jumptbl.h -ints.pic.o: ints.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h custom.h fail.h intext.h io.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h -io.pic.o: io.c config.h ../config/m.h ../config/s.h compatibility.h alloc.h \ - misc.h mlvalues.h custom.h fail.h io.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h signals.h sys.h -lexing.pic.o: lexing.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h -main.pic.o: main.c misc.h compatibility.h config.h ../config/m.h \ - ../config/s.h mlvalues.h sys.h -major_gc.pic.o: major_gc.c compact.h config.h ../config/m.h ../config/s.h \ - compatibility.h misc.h custom.h mlvalues.h fail.h finalise.h roots.h \ - memory.h gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h weak.h -md5.pic.o: md5.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h md5.h io.h memory.h gc.h major_gc.h \ - freelist.h minor_gc.h reverse.h -memory.pic.o: memory.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h freelist.h gc.h gc_ctrl.h major_gc.h memory.h \ - minor_gc.h signals.h -meta.pic.o: meta.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h fix_code.h interp.h intext.h io.h \ - major_gc.h freelist.h memory.h gc.h minor_gc.h prims.h stacks.h -minor_gc.pic.o: minor_gc.c config.h ../config/m.h ../config/s.h \ - compatibility.h fail.h misc.h mlvalues.h finalise.h roots.h memory.h \ - gc.h major_gc.h freelist.h minor_gc.h gc_ctrl.h signals.h weak.h -misc.pic.o: misc.c config.h ../config/m.h ../config/s.h compatibility.h \ - misc.h memory.h gc.h mlvalues.h major_gc.h freelist.h minor_gc.h -obj.pic.o: obj.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h gc.h interp.h major_gc.h freelist.h \ - memory.h minor_gc.h prims.h -parsing.pic.o: parsing.c config.h ../config/m.h ../config/s.h compatibility.h \ - mlvalues.h misc.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - alloc.h -prims.pic.o: prims.c mlvalues.h compatibility.h config.h ../config/m.h \ - ../config/s.h misc.h prims.h -printexc.pic.o: printexc.c backtrace.h mlvalues.h compatibility.h config.h \ - ../config/m.h ../config/s.h misc.h callback.h debugger.h fail.h \ - printexc.h -roots.pic.o: roots.c finalise.h roots.h misc.h compatibility.h config.h \ - ../config/m.h ../config/s.h memory.h gc.h mlvalues.h major_gc.h \ - freelist.h minor_gc.h globroots.h stacks.h -signals.pic.o: signals.c alloc.h compatibility.h misc.h config.h \ - ../config/m.h ../config/s.h mlvalues.h callback.h fail.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h roots.h signals.h signals_machdep.h \ - sys.h -signals_byt.pic.o: signals_byt.c config.h ../config/m.h ../config/s.h \ - compatibility.h memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h \ - minor_gc.h osdeps.h signals.h signals_machdep.h -stacks.pic.o: stacks.c config.h ../config/m.h ../config/s.h compatibility.h \ - fail.h misc.h mlvalues.h stacks.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h -startup.pic.o: startup.c config.h ../config/m.h ../config/s.h compatibility.h \ - alloc.h misc.h mlvalues.h backtrace.h callback.h custom.h debugger.h \ - dynlink.h exec.h fail.h fix_code.h freelist.h gc_ctrl.h instrtrace.h \ - interp.h intext.h io.h memory.h gc.h major_gc.h minor_gc.h osdeps.h \ - prims.h printexc.h reverse.h signals.h stacks.h sys.h startup.h \ - version.h -str.pic.o: str.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h -sys.pic.o: sys.c config.h ../config/m.h ../config/s.h compatibility.h alloc.h \ - misc.h mlvalues.h debugger.h fail.h instruct.h osdeps.h signals.h \ - stacks.h memory.h gc.h major_gc.h freelist.h minor_gc.h sys.h -terminfo.pic.o: terminfo.c config.h ../config/m.h ../config/s.h \ - compatibility.h alloc.h misc.h mlvalues.h fail.h io.h -unix.pic.o: unix.c config.h ../config/m.h ../config/s.h compatibility.h \ - memory.h gc.h mlvalues.h misc.h major_gc.h freelist.h minor_gc.h \ - osdeps.h -weak.pic.o: weak.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h major_gc.h freelist.h memory.h gc.h \ - minor_gc.h -win32.pic.o: win32.c fail.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - osdeps.h signals.h sys.h +intern.pic.o: intern.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/callback.h caml/custom.h caml/fail.h caml/gc.h \ + caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/mlvalues.h caml/misc.h caml/reverse.h +interp.pic.o: interp.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/backtrace.h caml/callback.h caml/debugger.h \ + caml/fail.h caml/fix_code.h caml/instrtrace.h caml/instruct.h \ + caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/mlvalues.h caml/prims.h caml/signals.h caml/stacks.h caml/memory.h \ + caml/jumptbl.h +ints.pic.o: ints.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/intext.h caml/io.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h +io.pic.o: io.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ + caml/mlvalues.h caml/custom.h caml/fail.h caml/io.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/signals.h \ + caml/sys.h +lexing.pic.o: lexing.c caml/fail.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/mlvalues.h caml/stacks.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h +main.pic.o: main.c caml/misc.h caml/compatibility.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/misc.h \ + caml/sys.h +major_gc.pic.o: major_gc.c caml/compact.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/misc.h caml/custom.h \ + caml/mlvalues.h caml/config.h caml/fail.h caml/finalise.h caml/roots.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/freelist.h caml/gc.h caml/gc_ctrl.h \ + caml/major_gc.h caml/misc.h caml/mlvalues.h caml/roots.h caml/weak.h +md5.pic.o: md5.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/md5.h caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/mlvalues.h \ + caml/io.h caml/reverse.h +memory.pic.o: memory.c caml/address_class.h caml/misc.h caml/compatibility.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/freelist.h caml/gc.h caml/gc_ctrl.h \ + caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/minor_gc.h caml/address_class.h caml/minor_gc.h caml/misc.h \ + caml/mlvalues.h caml/signals.h +meta.pic.o: meta.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/config.h caml/fail.h caml/fix_code.h caml/interp.h \ + caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/stacks.h \ + caml/memory.h +minor_gc.pic.o: minor_gc.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/finalise.h caml/roots.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/gc.h caml/gc_ctrl.h caml/major_gc.h \ + caml/memory.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/signals.h caml/weak.h +misc.pic.o: misc.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/compatibility.h caml/misc.h caml/config.h caml/memory.h caml/gc.h \ + caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h +obj.pic.o: obj.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/gc.h caml/interp.h caml/major_gc.h caml/freelist.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h +parsing.pic.o: parsing.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/mlvalues.h caml/config.h \ + caml/misc.h caml/memory.h caml/gc.h caml/mlvalues.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/alloc.h +prims.pic.o: prims.c caml/mlvalues.h caml/compatibility.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/misc.h caml/prims.h +printexc.pic.o: printexc.c caml/backtrace.h caml/mlvalues.h \ + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/misc.h caml/callback.h caml/debugger.h \ + caml/fail.h caml/misc.h caml/mlvalues.h caml/printexc.h +roots.pic.o: roots.c caml/finalise.h caml/roots.h caml/misc.h \ + caml/compatibility.h caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/memory.h caml/gc.h caml/mlvalues.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/globroots.h caml/major_gc.h caml/memory.h caml/minor_gc.h \ + caml/misc.h caml/mlvalues.h caml/roots.h caml/stacks.h +signals_byt.pic.o: signals_byt.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/memory.h caml/config.h \ + caml/gc.h caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/osdeps.h caml/signals.h \ + caml/signals_machdep.h +signals.pic.o: signals.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/callback.h caml/config.h caml/fail.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/misc.h caml/mlvalues.h caml/roots.h \ + caml/memory.h caml/signals.h caml/signals_machdep.h caml/sys.h +stacks.pic.o: stacks.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/fail.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/misc.h caml/mlvalues.h caml/stacks.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h +startup.pic.o: startup.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/backtrace.h caml/callback.h \ + caml/custom.h caml/debugger.h caml/dynlink.h caml/exec.h caml/fail.h \ + caml/fix_code.h caml/freelist.h caml/gc_ctrl.h caml/instrtrace.h \ + caml/interp.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/osdeps.h caml/prims.h \ + caml/printexc.h caml/reverse.h caml/signals.h caml/stacks.h \ + caml/memory.h caml/sys.h caml/startup.h caml/exec.h caml/version.h +str.pic.o: str.c caml/alloc.h caml/compatibility.h caml/misc.h caml/config.h \ + caml/../../config/m.h caml/../../config/s.h caml/mlvalues.h caml/fail.h \ + caml/mlvalues.h caml/misc.h +sys.pic.o: sys.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/compatibility.h caml/alloc.h caml/misc.h caml/config.h \ + caml/mlvalues.h caml/debugger.h caml/fail.h caml/instruct.h \ + caml/mlvalues.h caml/osdeps.h caml/signals.h caml/stacks.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/sys.h +terminfo.pic.o: terminfo.c caml/config.h caml/../../config/m.h \ + caml/../../config/s.h caml/compatibility.h caml/alloc.h caml/misc.h \ + caml/config.h caml/mlvalues.h caml/fail.h caml/io.h caml/mlvalues.h +unix.pic.o: unix.c caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/compatibility.h caml/memory.h caml/config.h caml/gc.h \ + caml/mlvalues.h caml/misc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/misc.h caml/osdeps.h +weak.pic.o: weak.c caml/alloc.h caml/compatibility.h caml/misc.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/major_gc.h caml/freelist.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/minor_gc.h \ + caml/address_class.h caml/mlvalues.h +win32.pic.o: win32.c caml/address_class.h caml/misc.h caml/compatibility.h \ + caml/config.h caml/../../config/m.h caml/../../config/s.h \ + caml/mlvalues.h caml/fail.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/misc.h \ + caml/osdeps.h caml/signals.h caml/sys.h diff --git a/byterun/.ignore b/byterun/.ignore index 7b178a46..7eab2b62 100644 --- a/byterun/.ignore +++ b/byterun/.ignore @@ -1,8 +1,8 @@ -jumptbl.h +caml/jumptbl.h primitives prims.c -opnames.h -version.h +caml/opnames.h +caml/version.h ocamlrun ocamlrun.exe ocamlrund diff --git a/byterun/Makefile b/byterun/Makefile index 816dd75e..ae57e2a7 100644 --- a/byterun/Makefile +++ b/byterun/Makefile @@ -13,17 +13,14 @@ include Makefile.common -CFLAGS=-DCAML_NAME_SPACE -O $(BYTECCCOMPOPTS) $(IFLEXDIR) +CFLAGS=-DCAML_NAME_SPACE $(BYTECCCOMPOPTS) $(IFLEXDIR) DFLAGS=-DCAML_NAME_SPACE -g -DDEBUG $(BYTECCCOMPOPTS) $(IFLEXDIR) OBJS=$(COMMONOBJS) $(UNIX_OR_WIN32).o main.o DOBJS=$(OBJS:.o=.d.o) instrtrace.d.o PICOBJS=$(OBJS:.o=.pic.o) -SHARED_LIBS_TMP=$(SUPPORTS_SHARED_LIBRARIES:%false=) -SHARED_LIBS_DEPS=$(SHARED_LIBS_TMP:%true=libcamlrun_shared.so) - -all:: $(SHARED_LIBS_DEPS) +all:: all-$(SHARED) ocamlrun$(EXE): libcamlrun.a prims.o $(MKEXE) $(BYTECCLINKOPTS) -o ocamlrun$(EXE) \ @@ -34,42 +31,50 @@ ocamlrund$(EXE): libcamlrund.a prims.o prims.o libcamlrund.a $(BYTECCLIBS) libcamlrun.a: $(OBJS) - ar rc libcamlrun.a $(OBJS) + $(ARCMD) rc libcamlrun.a $(OBJS) $(RANLIB) libcamlrun.a libcamlrund.a: $(DOBJS) - ar rc libcamlrund.a $(DOBJS) + $(ARCMD) rc libcamlrund.a $(DOBJS) $(RANLIB) libcamlrund.a +all-noshared: +.PHONY: all-noshared + +all-shared: libcamlrun_pic.a libcamlrun_shared.so +.PHONY: all-shared + +libcamlrun_pic.a: $(PICOBJS) + ar rc libcamlrun_pic.a $(PICOBJS) + $(RANLIB) libcamlrun_pic.a + libcamlrun_shared.so: $(PICOBJS) $(MKDLL) -o libcamlrun_shared.so $(PICOBJS) $(BYTECCLIBS) -install:: - if test -f libcamlrun_shared.so; then \ - cp libcamlrun_shared.so $(INSTALL_LIBDIR)/libcamlrun_shared.so; fi +install:: install-$(SHARED) -clean:: - rm -f libcamlrun_shared.so +install-noshared: +.PHONY: install-noshared -.SUFFIXES: .d.o .pic.o +install-shared: + cp libcamlrun_shared.so $(INSTALL_LIBDIR)/libcamlrun_shared.so + cp libcamlrun_pic.a $(INSTALL_LIBDIR)/libcamlrun_pic.a + cd $(INSTALL_LIBDIR); $(RANLIB) libcamlrun_pic.a +.PHONY: install-shared -.c.d.o: - ln -s -f $*.c $*.d.c - $(CC) -c $(DFLAGS) $*.d.c - rm $*.d.c +clean:: + rm -f libcamlrun_shared.so libcamlrun_pic.a -.c.pic.o: - ln -s -f $*.c $*.pic.c - $(CC) -c $(CFLAGS) $(SHAREDCCCOMPOPTS) $*.pic.c - rm $*.pic.c +%.d.o: %.c + $(CC) -c $(DFLAGS) $< -o $@ -clean:: - rm -f *.pic.c *.d.c +%.pic.o: %.c + $(CC) -c $(CFLAGS) $(SHAREDCCCOMPOPTS) $< -o $@ -depend : prims.c opnames.h jumptbl.h version.h - -gcc -MM $(BYTECCCOMPOPTS) *.c > .depend - -gcc -MM $(BYTECCCOMPOPTS) -DDEBUG *.c | sed -e 's/\.o/.d.o/' >> .depend - -gcc -MM $(BYTECCCOMPOPTS) *.c | sed -e 's/\.o/.pic.o/' >> .depend +depend : prims.c caml/opnames.h caml/jumptbl.h caml/version.h + -$(CC) -MM $(BYTECCCOMPOPTS) *.c > .depend + -$(CC) -MM $(BYTECCCOMPOPTS) -DDEBUG *.c | sed -e 's/\.o/.d.o/' >> .depend + -$(CC) -MM $(BYTECCCOMPOPTS) *.c | sed -e 's/\.o/.pic.o/' >> .depend .PHONY: depend include .depend diff --git a/byterun/Makefile.common b/byterun/Makefile.common index b6bff219..2c56c43f 100755 --- a/byterun/Makefile.common +++ b/byterun/Makefile.common @@ -12,6 +12,8 @@ ######################################################################### include ../config/Makefile +CAMLRUN ?= ../boot/ocamlrun +CAMLYACC ?= ../boot/ocamlyacc CC=$(BYTECC) @@ -31,7 +33,8 @@ PRIMS=\ dynlink.c backtrace.c PUBLIC_INCLUDES=\ - alloc.h callback.h config.h custom.h fail.h hash.h intext.h \ + address_class.h alloc.h callback.h config.h custom.h fail.h gc.h \ + hash.h intext.h \ memory.h misc.h mlvalues.h printexc.h signals.h compatibility.h \ version.h @@ -56,13 +59,13 @@ INSTALL_LIBDIR=$(DESTDIR)$(LIBDIR) install:: - cp ocamlrun$(EXE) $(INSTALL_BINDIR)/ocamlrun$(EXE) + cp $(CAMLRUN)$(EXE) $(INSTALL_BINDIR)/ocamlrun$(EXE) cp libcamlrun.$(A) $(INSTALL_LIBDIR)/libcamlrun.$(A) cd $(INSTALL_LIBDIR); $(RANLIB) libcamlrun.$(A) if test -d $(INSTALL_LIBDIR)/caml; then : ; \ else mkdir $(INSTALL_LIBDIR)/caml; fi for i in $(PUBLIC_INCLUDES); do \ - sed -f ../tools/cleanup-header $$i > $(INSTALL_LIBDIR)/caml/$$i; \ + sed -f ../tools/cleanup-header caml/$$i > $(INSTALL_LIBDIR)/caml/$$i; \ done cp ld.conf $(INSTALL_LIBDIR)/ld.conf .PHONY: install @@ -72,6 +75,10 @@ install:: install-$(RUNTIMED) install-noruntimed: .PHONY: install-noruntimed +# TODO: when cross-compiling, do not install ocamlrund +# it doesn't hurt to install it, but it's useless and might be confusing +# because it's an executable for the target machine, while we're installing +# binaries for the host. install-runtimed: cp ocamlrund$(EXE) $(INSTALL_BINDIR)/ocamlrund$(EXE) cp libcamlrund.$(A) $(INSTALL_LIBDIR)/libcamlrund.$(A) @@ -96,8 +103,8 @@ primitives : $(PRIMS) | sort | uniq > primitives prims.c : primitives - (echo '#include "mlvalues.h"'; \ - echo '#include "prims.h"'; \ + (echo '#include "caml/mlvalues.h"'; \ + echo '#include "caml/prims.h"'; \ sed -e 's/.*/extern value &();/' primitives; \ echo 'c_primitive caml_builtin_cprim[] = {'; \ sed -e 's/.*/ &,/' primitives; \ @@ -106,23 +113,23 @@ prims.c : primitives sed -e 's/.*/ "&",/' primitives; \ echo ' 0 };') > prims.c -opnames.h : instruct.h +caml/opnames.h : caml/instruct.h sed -e '/\/\*/d' \ -e '/^#/d' \ -e 's/enum /char * names_of_/' \ -e 's/{$$/[] = {/' \ - -e 's/\([[:upper:]][[:upper:]_0-9]*\)/"\1"/g' instruct.h > opnames.h + -e 's/\([[:upper:]][[:upper:]_0-9]*\)/"\1"/g' caml/instruct.h > caml/opnames.h -# jumptbl.h is required only if you have GCC 2.0 or later -jumptbl.h : instruct.h +# caml/jumptbl.h is required only if you have GCC 2.0 or later +caml/jumptbl.h : caml/instruct.h sed -n -e '/^ /s/ \([A-Z]\)/ \&\&lbl_\1/gp' \ - -e '/^}/q' instruct.h > jumptbl.h + -e '/^}/q' caml/instruct.h > caml/jumptbl.h -version.h : ../VERSION ../tools/make-version-header.sh - ../tools/make-version-header.sh ../VERSION > version.h +caml/version.h : ../VERSION ../tools/make-version-header.sh + ../tools/make-version-header.sh ../VERSION > caml/version.h clean :: rm -f ocamlrun$(EXE) ocamlrund$(EXE) *.$(O) *.$(A) *.$(SO) - rm -f primitives prims.c opnames.h jumptbl.h ld.conf - rm -f version.h + rm -f primitives prims.c caml/opnames.h caml/jumptbl.h ld.conf + rm -f caml/version.h .PHONY: clean diff --git a/byterun/Makefile.nt b/byterun/Makefile.nt index af288188..71873f21 100644 --- a/byterun/Makefile.nt +++ b/byterun/Makefile.nt @@ -24,7 +24,7 @@ ocamlrun$(EXE): libcamlrun.$(A) prims.$(O) $(EXTRALIBS) libcamlrun.$(A) ocamlrund$(EXE): libcamlrund.$(A) prims.$(O) main.$(O) - $(MKEXE) -o ocamlrun$(EXE) $(BYTECCDBGCOMPOPTS) prims.$(O) \ + $(MKEXE) -o ocamlrund$(EXE) $(BYTECCDBGCOMPOPTS) prims.$(O) \ $(call SYSLIB,ws2_32) $(EXTRALIBS) libcamlrund.$(A) libcamlrun.$(A): $(OBJS) @@ -33,21 +33,20 @@ libcamlrun.$(A): $(OBJS) libcamlrund.$(A): $(DOBJS) $(call MKLIB,libcamlrund.$(A),$(DOBJS)) -.SUFFIXES: .$(O) .$(DBGO) - -.c.$(O): +%.$(O): %.c $(CC) $(CFLAGS) $(BYTECCCOMPOPTS) -c $< -.c.$(DBGO): - $(CC) $(CFLAGS) $(BYTECCDBGCOMPOPTS) -c $< - mv $*.$(O) $*.$(DBGO) +%.$(DBGO): %.c + $(CC) $(CFLAGS) $(BYTECCDBGCOMPOPTS) -c -o $@ $< .depend.nt: .depend rm -f .depend.win32 - echo "win32.o: win32.c fail.h compatibility.h \\" >> .depend.win32 - echo " misc.h config.h ../config/m.h ../config/s.h \\" >> .depend.win32 - echo " mlvalues.h memory.h gc.h major_gc.h \\" >> .depend.win32 - echo " freelist.h minor_gc.h osdeps.h signals.h" >> .depend.win32 + echo "win32.o: win32.c \\" >> .depend.win32 + echo " caml/fail.h caml/compatibility.h caml/misc.h \\" >> .depend.win32 + echo " caml/config.h ../config/m.h ../config/s.h \\" >> .depend.win32 + echo " caml/mlvalues.h caml/memory.h caml/gc.h \\" >> .depend.win32 + echo " caml/major_gc.h caml/freelist.h caml/minor_gc.h \\" >> .depend.win32 + echo " caml/osdeps.h caml/signals.h" >> .depend.win32 cat .depend >> .depend.win32 sed -e '/\.d\.o/q' -e 's/^\(.*\)\.o:/\1.$$(O) \1.$$(DBGO):/' \ .depend.win32 > .depend.nt diff --git a/byterun/alloc.c b/byterun/alloc.c index 1fc33b55..6544a0c5 100644 --- a/byterun/alloc.c +++ b/byterun/alloc.c @@ -17,12 +17,12 @@ */ #include <string.h> -#include "alloc.h" -#include "custom.h" -#include "major_gc.h" -#include "memory.h" -#include "mlvalues.h" -#include "stacks.h" +#include "caml/alloc.h" +#include "caml/custom.h" +#include "caml/major_gc.h" +#include "caml/memory.h" +#include "caml/mlvalues.h" +#include "caml/stacks.h" #define Setup_for_gc #define Restore_after_gc @@ -184,3 +184,7 @@ CAMLprim value caml_update_dummy(value dummy, value newval) } return Val_unit; } + + + + diff --git a/byterun/array.c b/byterun/array.c index ba6fd701..76713bf8 100644 --- a/byterun/array.c +++ b/byterun/array.c @@ -14,11 +14,11 @@ /* Operations on arrays */ #include <string.h> -#include "alloc.h" -#include "fail.h" -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" +#include "caml/alloc.h" +#include "caml/fail.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" CAMLexport mlsize_t caml_array_length(value array) { diff --git a/byterun/backtrace.c b/byterun/backtrace.c index 76e3ddf5..008b199f 100644 --- a/byterun/backtrace.c +++ b/byterun/backtrace.c @@ -18,24 +18,24 @@ #include <stdlib.h> #include <string.h> -#include "config.h" +#include "caml/config.h" #ifdef HAS_UNISTD #include <unistd.h> #endif -#include "mlvalues.h" -#include "alloc.h" -#include "io.h" -#include "instruct.h" -#include "intext.h" -#include "exec.h" -#include "fix_code.h" -#include "memory.h" -#include "startup.h" -#include "stacks.h" -#include "sys.h" -#include "backtrace.h" -#include "fail.h" +#include "caml/mlvalues.h" +#include "caml/alloc.h" +#include "caml/io.h" +#include "caml/instruct.h" +#include "caml/intext.h" +#include "caml/exec.h" +#include "caml/fix_code.h" +#include "caml/memory.h" +#include "caml/startup.h" +#include "caml/stacks.h" +#include "caml/sys.h" +#include "caml/backtrace.h" +#include "caml/fail.h" CAMLexport int caml_backtrace_active = 0; CAMLexport int caml_backtrace_pos = 0; @@ -133,17 +133,17 @@ void caml_stash_backtrace(value exn, code_t pc, value * sp, int reraise) #define Codet_Val(v) ((code_t)(Long_val(v)<<1)) /* returns the next frame pointer (or NULL if none is available); - updates *sp to point to the following one, and *trapsp to the next + updates *sp to point to the following one, and *trsp to the next trap frame, which we will skip when we reach it */ -code_t caml_next_frame_pointer(value ** sp, value ** trapsp) +code_t caml_next_frame_pointer(value ** sp, value ** trsp) { code_t end_code = (code_t) ((char *) caml_start_code + caml_code_size); while (*sp < caml_stack_high) { code_t *p = (code_t*) (*sp)++; - if(&Trap_pc(*trapsp) == p) { - *trapsp = Trap_link(*trapsp); + if(&Trap_pc(*trsp) == p) { + *trsp = Trap_link(*trsp); continue; } if (*p >= caml_start_code && *p < end_code) return *p; @@ -170,10 +170,10 @@ CAMLprim value caml_get_current_callstack(value max_frames_value) { /* first compute the size of the trace */ { value * sp = caml_extern_sp; - value * trapsp = caml_trapsp; + value * trsp = caml_trapsp; for (trace_size = 0; trace_size < max_frames; trace_size++) { - code_t p = caml_next_frame_pointer(&sp, &trapsp); + code_t p = caml_next_frame_pointer(&sp, &trsp); if (p == NULL) break; } } @@ -183,11 +183,11 @@ CAMLprim value caml_get_current_callstack(value max_frames_value) { /* then collect the trace */ { value * sp = caml_extern_sp; - value * trapsp = caml_trapsp; + value * trsp = caml_trapsp; uintnat trace_pos; for (trace_pos = 0; trace_pos < trace_size; trace_pos++) { - code_t p = caml_next_frame_pointer(&sp, &trapsp); + code_t p = caml_next_frame_pointer(&sp, &trsp); Assert(p != NULL); Field(trace, trace_pos) = Val_Codet(p); } diff --git a/byterun/callback.c b/byterun/callback.c index 5da37ec9..30109851 100644 --- a/byterun/callback.c +++ b/byterun/callback.c @@ -14,19 +14,19 @@ /* Callbacks from C to OCaml */ #include <string.h> -#include "callback.h" -#include "fail.h" -#include "memory.h" -#include "mlvalues.h" +#include "caml/callback.h" +#include "caml/fail.h" +#include "caml/memory.h" +#include "caml/mlvalues.h" #ifndef NATIVE_CODE /* Bytecode callbacks */ -#include "interp.h" -#include "instruct.h" -#include "fix_code.h" -#include "stacks.h" +#include "caml/interp.h" +#include "caml/instruct.h" +#include "caml/fix_code.h" +#include "caml/stacks.h" CAMLexport int caml_callback_depth = 0; @@ -245,3 +245,14 @@ CAMLexport value * caml_named_value(char const *name) } return NULL; } + +CAMLexport void caml_iterate_named_values(caml_named_action f) +{ + int i; + for(i = 0; i < Named_value_size; i++){ + struct named_value * nv; + for (nv = named_value_table[i]; nv != NULL; nv = nv->next) { + f( &nv->val, nv->name ); + } + } +} diff --git a/byterun/caml/address_class.h b/byterun/caml/address_class.h new file mode 100644 index 00000000..f7908b6d --- /dev/null +++ b/byterun/caml/address_class.h @@ -0,0 +1,82 @@ +/***********************************************************************/ +/* */ +/* OCaml */ +/* */ +/* Damien Doligez, projet Para, INRIA Rocquencourt */ +/* */ +/* Copyright 1996 Institut National de Recherche en Informatique et */ +/* en Automatique. All rights reserved. This file is distributed */ +/* under the terms of the GNU Library General Public License, with */ +/* the special exception on linking described in file ../LICENSE. */ +/* */ +/***********************************************************************/ + +/* Classification of addresses for GC and runtime purposes. */ + +#ifndef CAML_ADDRESS_CLASS_H +#define CAML_ADDRESS_CLASS_H + +#include "misc.h" +#include "mlvalues.h" + +/* Use the following macros to test an address for the different classes + it might belong to. */ + +#define Is_young(val) \ + (Assert (Is_block (val)), \ + (addr)(val) < (addr)caml_young_end && (addr)(val) > (addr)caml_young_start) + +#define Is_in_heap(a) (Classify_addr(a) & In_heap) + +#define Is_in_heap_or_young(a) (Classify_addr(a) & (In_heap | In_young)) + +#define Is_in_value_area(a) \ + (Classify_addr(a) & (In_heap | In_young | In_static_data)) + +#define Is_in_code_area(pc) \ + ( ((char *)(pc) >= caml_code_area_start && \ + (char *)(pc) <= caml_code_area_end) \ + || (Classify_addr(pc) & In_code_area) ) + +#define Is_in_static_data(a) (Classify_addr(a) & In_static_data) + +/***********************************************************************/ +/* The rest of this file is private and may change without notice. */ + +extern char *caml_young_start, *caml_young_end; +extern char * caml_code_area_start, * caml_code_area_end; + +#define Not_in_heap 0 +#define In_heap 1 +#define In_young 2 +#define In_static_data 4 +#define In_code_area 8 + +#ifdef ARCH_SIXTYFOUR + +/* 64 bits: Represent page table as a sparse hash table */ +int caml_page_table_lookup(void * addr); +#define Classify_addr(a) (caml_page_table_lookup((void *)(a))) + +#else + +/* 32 bits: Represent page table as a 2-level array */ +#define Pagetable2_log 11 +#define Pagetable2_size (1 << Pagetable2_log) +#define Pagetable1_log (Page_log + Pagetable2_log) +#define Pagetable1_size (1 << (32 - Pagetable1_log)) +CAMLextern unsigned char * caml_page_table[Pagetable1_size]; + +#define Pagetable_index1(a) (((uintnat)(a)) >> Pagetable1_log) +#define Pagetable_index2(a) \ + ((((uintnat)(a)) >> Page_log) & (Pagetable2_size - 1)) +#define Classify_addr(a) \ + caml_page_table[Pagetable_index1(a)][Pagetable_index2(a)] + +#endif + +int caml_page_table_add(int kind, void * start, void * end); +int caml_page_table_remove(int kind, void * start, void * end); +int caml_page_table_initialize(mlsize_t bytesize); + +#endif /* CAML_ADDRESS_CLASS_H */ diff --git a/byterun/alloc.h b/byterun/caml/alloc.h similarity index 100% rename from byterun/alloc.h rename to byterun/caml/alloc.h diff --git a/byterun/backtrace.h b/byterun/caml/backtrace.h similarity index 100% rename from byterun/backtrace.h rename to byterun/caml/backtrace.h diff --git a/byterun/callback.h b/byterun/caml/callback.h similarity index 94% rename from byterun/callback.h rename to byterun/caml/callback.h index ded0b980..ef50945c 100644 --- a/byterun/callback.h +++ b/byterun/caml/callback.h @@ -42,6 +42,8 @@ CAMLextern value caml_callbackN_exn (value closure, int narg, value args[]); #define Extract_exception(v) ((v) & ~3) CAMLextern value * caml_named_value (char const * name); +typedef void (*caml_named_action) (value*, char *); +CAMLextern void caml_iterate_named_values(caml_named_action f); CAMLextern void caml_main (char ** argv); CAMLextern void caml_startup (char ** argv); diff --git a/byterun/compact.h b/byterun/caml/compact.h similarity index 100% rename from byterun/compact.h rename to byterun/caml/compact.h diff --git a/byterun/compare.h b/byterun/caml/compare.h similarity index 100% rename from byterun/compare.h rename to byterun/caml/compare.h diff --git a/byterun/compatibility.h b/byterun/caml/compatibility.h similarity index 100% rename from byterun/compatibility.h rename to byterun/caml/compatibility.h diff --git a/byterun/config.h b/byterun/caml/config.h similarity index 98% rename from byterun/config.h rename to byterun/caml/config.h index f7759885..6f608364 100644 --- a/byterun/config.h +++ b/byterun/caml/config.h @@ -17,8 +17,8 @@ /* <include ../config/m.h> */ /* <include ../config/s.h> */ /* <private> */ -#include "../config/m.h" -#include "../config/s.h" +#include "../../config/m.h" +#include "../../config/s.h" /* </private> */ #ifndef CAML_NAME_SPACE diff --git a/byterun/custom.h b/byterun/caml/custom.h similarity index 100% rename from byterun/custom.h rename to byterun/caml/custom.h diff --git a/byterun/debugger.h b/byterun/caml/debugger.h similarity index 100% rename from byterun/debugger.h rename to byterun/caml/debugger.h diff --git a/byterun/dynlink.h b/byterun/caml/dynlink.h similarity index 100% rename from byterun/dynlink.h rename to byterun/caml/dynlink.h diff --git a/byterun/exec.h b/byterun/caml/exec.h similarity index 100% rename from byterun/exec.h rename to byterun/caml/exec.h diff --git a/byterun/fail.h b/byterun/caml/fail.h similarity index 100% rename from byterun/fail.h rename to byterun/caml/fail.h diff --git a/byterun/finalise.h b/byterun/caml/finalise.h similarity index 100% rename from byterun/finalise.h rename to byterun/caml/finalise.h diff --git a/byterun/fix_code.h b/byterun/caml/fix_code.h similarity index 100% rename from byterun/fix_code.h rename to byterun/caml/fix_code.h diff --git a/byterun/freelist.h b/byterun/caml/freelist.h similarity index 100% rename from byterun/freelist.h rename to byterun/caml/freelist.h diff --git a/byterun/gc.h b/byterun/caml/gc.h similarity index 100% rename from byterun/gc.h rename to byterun/caml/gc.h diff --git a/byterun/gc_ctrl.h b/byterun/caml/gc_ctrl.h similarity index 100% rename from byterun/gc_ctrl.h rename to byterun/caml/gc_ctrl.h diff --git a/byterun/globroots.h b/byterun/caml/globroots.h similarity index 100% rename from byterun/globroots.h rename to byterun/caml/globroots.h diff --git a/byterun/hash.h b/byterun/caml/hash.h similarity index 94% rename from byterun/hash.h rename to byterun/caml/hash.h index 436a8bb1..452a0925 100644 --- a/byterun/hash.h +++ b/byterun/caml/hash.h @@ -18,6 +18,10 @@ #include "mlvalues.h" +#ifdef __cplusplus +extern "C" { +#endif + CAMLextern uint32 caml_hash_mix_uint32(uint32 h, uint32 d); CAMLextern uint32 caml_hash_mix_intnat(uint32 h, intnat d); CAMLextern uint32 caml_hash_mix_int64(uint32 h, int64 d); @@ -25,5 +29,8 @@ CAMLextern uint32 caml_hash_mix_double(uint32 h, double d); CAMLextern uint32 caml_hash_mix_float(uint32 h, float d); CAMLextern uint32 caml_hash_mix_string(uint32 h, value s); - +#ifdef __cplusplus +} #endif + +#endif /* CAML_HASH_H */ diff --git a/byterun/instrtrace.h b/byterun/caml/instrtrace.h similarity index 100% rename from byterun/instrtrace.h rename to byterun/caml/instrtrace.h diff --git a/byterun/instruct.h b/byterun/caml/instruct.h similarity index 100% rename from byterun/instruct.h rename to byterun/caml/instruct.h diff --git a/byterun/int64_emul.h b/byterun/caml/int64_emul.h similarity index 100% rename from byterun/int64_emul.h rename to byterun/caml/int64_emul.h diff --git a/byterun/int64_format.h b/byterun/caml/int64_format.h similarity index 100% rename from byterun/int64_format.h rename to byterun/caml/int64_format.h diff --git a/byterun/int64_native.h b/byterun/caml/int64_native.h similarity index 100% rename from byterun/int64_native.h rename to byterun/caml/int64_native.h diff --git a/byterun/interp.h b/byterun/caml/interp.h similarity index 100% rename from byterun/interp.h rename to byterun/caml/interp.h diff --git a/byterun/intext.h b/byterun/caml/intext.h similarity index 100% rename from byterun/intext.h rename to byterun/caml/intext.h diff --git a/byterun/io.h b/byterun/caml/io.h similarity index 100% rename from byterun/io.h rename to byterun/caml/io.h diff --git a/byterun/major_gc.h b/byterun/caml/major_gc.h similarity index 100% rename from byterun/major_gc.h rename to byterun/caml/major_gc.h diff --git a/byterun/md5.h b/byterun/caml/md5.h similarity index 100% rename from byterun/md5.h rename to byterun/caml/md5.h diff --git a/byterun/memory.h b/byterun/caml/memory.h similarity index 92% rename from byterun/memory.h rename to byterun/caml/memory.h index 9befa873..fe6d7823 100644 --- a/byterun/memory.h +++ b/byterun/caml/memory.h @@ -51,45 +51,7 @@ color_t caml_allocation_color (void *hp); /* void caml_shrink_heap (char *); Only used in compact.c */ /* <private> */ - -#define Not_in_heap 0 -#define In_heap 1 -#define In_young 2 -#define In_static_data 4 -#define In_code_area 8 - -#ifdef ARCH_SIXTYFOUR - -/* 64 bits: Represent page table as a sparse hash table */ -int caml_page_table_lookup(void * addr); -#define Classify_addr(a) (caml_page_table_lookup((void *)(a))) - -#else - -/* 32 bits: Represent page table as a 2-level array */ -#define Pagetable2_log 11 -#define Pagetable2_size (1 << Pagetable2_log) -#define Pagetable1_log (Page_log + Pagetable2_log) -#define Pagetable1_size (1 << (32 - Pagetable1_log)) -CAMLextern unsigned char * caml_page_table[Pagetable1_size]; - -#define Pagetable_index1(a) (((uintnat)(a)) >> Pagetable1_log) -#define Pagetable_index2(a) \ - ((((uintnat)(a)) >> Page_log) & (Pagetable2_size - 1)) -#define Classify_addr(a) \ - caml_page_table[Pagetable_index1(a)][Pagetable_index2(a)] - -#endif - -#define Is_in_value_area(a) \ - (Classify_addr(a) & (In_heap | In_young | In_static_data)) -#define Is_in_heap(a) (Classify_addr(a) & In_heap) -#define Is_in_heap_or_young(a) (Classify_addr(a) & (In_heap | In_young)) - -int caml_page_table_add(int kind, void * start, void * end); -int caml_page_table_remove(int kind, void * start, void * end); -int caml_page_table_initialize(mlsize_t bytesize); - + #ifdef DEBUG #define DEBUG_clear(result, wosize) do{ \ uintnat caml__DEBUG_i; \ diff --git a/byterun/minor_gc.h b/byterun/caml/minor_gc.h similarity index 92% rename from byterun/minor_gc.h rename to byterun/caml/minor_gc.h index 4727826d..d3e8ac50 100644 --- a/byterun/minor_gc.h +++ b/byterun/caml/minor_gc.h @@ -15,7 +15,7 @@ #define CAML_MINOR_GC_H -#include "misc.h" +#include "address_class.h" CAMLextern char *caml_young_start, *caml_young_ptr; CAMLextern char *caml_young_end, *caml_young_limit; @@ -33,10 +33,6 @@ struct caml_ref_table { }; CAMLextern struct caml_ref_table caml_ref_table, caml_weak_ref_table; -#define Is_young(val) \ - (Assert (Is_block (val)), \ - (addr)(val) < (addr)caml_young_end && (addr)(val) > (addr)caml_young_start) - extern void caml_set_minor_heap_size (asize_t); /* size in bytes */ extern void caml_empty_minor_heap (void); CAMLextern void caml_minor_collection (void); diff --git a/byterun/misc.h b/byterun/caml/misc.h similarity index 90% rename from byterun/misc.h rename to byterun/caml/misc.h index 5640980a..db0971d2 100644 --- a/byterun/misc.h +++ b/byterun/caml/misc.h @@ -59,6 +59,17 @@ typedef char * addr; #define CAMLweakdef #endif +#ifdef __cplusplus +extern "C" { +#endif + +/* GC timing hooks. These can be assigned by the user. The hook functions + must not allocate or change the heap in any way. */ +typedef void (*caml_timing_hook) (void); +extern caml_timing_hook caml_major_slice_begin_hook, caml_major_slice_end_hook; +extern caml_timing_hook caml_minor_gc_begin_hook, caml_minor_gc_end_hook; +extern caml_timing_hook caml_finalise_begin_hook, caml_finalise_end_hook; + /* Assertions */ #ifdef DEBUG @@ -152,4 +163,8 @@ extern int caml_snprintf(char * buf, size_t size, const char * format, ...); /* </private> */ +#ifdef __cplusplus +} +#endif + #endif /* CAML_MISC_H */ diff --git a/byterun/mlvalues.h b/byterun/caml/mlvalues.h similarity index 100% rename from byterun/mlvalues.h rename to byterun/caml/mlvalues.h index 268bcfe9..fe4a8f09 100644 --- a/byterun/mlvalues.h +++ b/byterun/caml/mlvalues.h @@ -296,10 +296,10 @@ CAMLextern header_t caml_atom_table[]; extern value caml_global_data; +CAMLextern value caml_set_oo_id(value obj); + #ifdef __cplusplus } #endif -CAMLextern value caml_set_oo_id(value obj); - #endif /* CAML_MLVALUES_H */ diff --git a/byterun/osdeps.h b/byterun/caml/osdeps.h similarity index 100% rename from byterun/osdeps.h rename to byterun/caml/osdeps.h diff --git a/byterun/prims.h b/byterun/caml/prims.h similarity index 100% rename from byterun/prims.h rename to byterun/caml/prims.h diff --git a/byterun/printexc.h b/byterun/caml/printexc.h similarity index 100% rename from byterun/printexc.h rename to byterun/caml/printexc.h diff --git a/byterun/reverse.h b/byterun/caml/reverse.h similarity index 100% rename from byterun/reverse.h rename to byterun/caml/reverse.h diff --git a/byterun/roots.h b/byterun/caml/roots.h similarity index 100% rename from byterun/roots.h rename to byterun/caml/roots.h diff --git a/byterun/signals.h b/byterun/caml/signals.h similarity index 100% rename from byterun/signals.h rename to byterun/caml/signals.h diff --git a/byterun/signals_machdep.h b/byterun/caml/signals_machdep.h similarity index 100% rename from byterun/signals_machdep.h rename to byterun/caml/signals_machdep.h diff --git a/byterun/stacks.h b/byterun/caml/stacks.h similarity index 100% rename from byterun/stacks.h rename to byterun/caml/stacks.h diff --git a/byterun/startup.h b/byterun/caml/startup.h similarity index 100% rename from byterun/startup.h rename to byterun/caml/startup.h diff --git a/byterun/sys.h b/byterun/caml/sys.h similarity index 100% rename from byterun/sys.h rename to byterun/caml/sys.h diff --git a/byterun/ui.h b/byterun/caml/ui.h similarity index 100% rename from byterun/ui.h rename to byterun/caml/ui.h diff --git a/byterun/weak.h b/byterun/caml/weak.h similarity index 100% rename from byterun/weak.h rename to byterun/caml/weak.h diff --git a/byterun/compact.c b/byterun/compact.c index 0afbd9dc..9af9688d 100644 --- a/byterun/compact.c +++ b/byterun/compact.c @@ -13,16 +13,17 @@ #include <string.h> -#include "config.h" -#include "finalise.h" -#include "freelist.h" -#include "gc.h" -#include "gc_ctrl.h" -#include "major_gc.h" -#include "memory.h" -#include "mlvalues.h" -#include "roots.h" -#include "weak.h" +#include "caml/address_class.h" +#include "caml/config.h" +#include "caml/finalise.h" +#include "caml/freelist.h" +#include "caml/gc.h" +#include "caml/gc_ctrl.h" +#include "caml/major_gc.h" +#include "caml/memory.h" +#include "caml/mlvalues.h" +#include "caml/roots.h" +#include "caml/weak.h" extern uintnat caml_percent_free; /* major_gc.c */ extern void caml_shrink_heap (char *); /* memory.c */ @@ -58,7 +59,7 @@ static void invert_pointer_at (word *p) /* Use Ecolor (q) == 0 instead of Is_block (q) because q could be an inverted pointer for an infix header (with Ecolor == 2). */ - if (Ecolor (q) == 0 && (Classify_addr (q) & In_heap)){ + if (Ecolor (q) == 0 && Is_in_heap (q)){ switch (Ecolor (Hd_val (q))){ case 0: case 3: /* Pointer or header: insert in inverted list. */ diff --git a/byterun/compare.c b/byterun/compare.c index 6593ed9a..4e8d25af 100644 --- a/byterun/compare.c +++ b/byterun/compare.c @@ -13,11 +13,11 @@ #include <string.h> #include <stdlib.h> -#include "custom.h" -#include "fail.h" -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" +#include "caml/custom.h" +#include "caml/fail.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" /* Structural comparison on trees. */ diff --git a/byterun/custom.c b/byterun/custom.c index e4f9eaf5..eeb976d9 100644 --- a/byterun/custom.c +++ b/byterun/custom.c @@ -13,11 +13,11 @@ #include <string.h> -#include "alloc.h" -#include "custom.h" -#include "fail.h" -#include "memory.h" -#include "mlvalues.h" +#include "caml/alloc.h" +#include "caml/custom.h" +#include "caml/fail.h" +#include "caml/memory.h" +#include "caml/mlvalues.h" CAMLexport value caml_alloc_custom(struct custom_operations * ops, uintnat size, diff --git a/byterun/debugger.c b/byterun/debugger.c index 6024ed92..41a64b1c 100644 --- a/byterun/debugger.c +++ b/byterun/debugger.c @@ -19,10 +19,10 @@ #include <string.h> -#include "alloc.h" -#include "config.h" -#include "debugger.h" -#include "misc.h" +#include "caml/alloc.h" +#include "caml/config.h" +#include "caml/debugger.h" +#include "caml/misc.h" int caml_debugger_in_use = 0; uintnat caml_event_count; @@ -64,14 +64,14 @@ void caml_debugger_cleanup_fork(void) #include <process.h> #endif -#include "fail.h" -#include "fix_code.h" -#include "instruct.h" -#include "intext.h" -#include "io.h" -#include "mlvalues.h" -#include "stacks.h" -#include "sys.h" +#include "caml/fail.h" +#include "caml/fix_code.h" +#include "caml/instruct.h" +#include "caml/intext.h" +#include "caml/io.h" +#include "caml/mlvalues.h" +#include "caml/stacks.h" +#include "caml/sys.h" static int sock_domain; /* Socket domain for the debugger */ static union { /* Socket address for the debugger */ diff --git a/byterun/dynlink.c b/byterun/dynlink.c index 8b4498b9..6d09a3c0 100644 --- a/byterun/dynlink.c +++ b/byterun/dynlink.c @@ -18,18 +18,19 @@ #include <string.h> #include <fcntl.h> #include <sys/stat.h> -#include "config.h" +#include "caml/config.h" #ifdef HAS_UNISTD #include <unistd.h> #endif -#include "alloc.h" -#include "dynlink.h" -#include "fail.h" -#include "mlvalues.h" -#include "memory.h" -#include "misc.h" -#include "osdeps.h" -#include "prims.h" +#include "caml/alloc.h" +#include "caml/dynlink.h" +#include "caml/fail.h" +#include "caml/mlvalues.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/osdeps.h" +#include "caml/prims.h" +#include "caml/signals.h" #ifndef NATIVE_CODE @@ -119,7 +120,9 @@ static void open_shared_lib(char * name) realname = caml_search_dll_in_path(&caml_shared_libs_path, name); caml_gc_message(0x100, "Loading shared library %s\n", (uintnat) realname); + caml_enter_blocking_section(); handle = caml_dlopen(realname, 1, 1); + caml_leave_blocking_section(); if (handle == NULL) caml_fatal_error_arg2("Fatal error: cannot load shared library %s\n", name, "Reason: %s\n", caml_dlerror()); @@ -202,10 +205,15 @@ CAMLprim value caml_dynlink_open_lib(value mode, value filename) { void * handle; value result; + char * p; caml_gc_message(0x100, "Opening shared library %s\n", (uintnat) String_val(filename)); - handle = caml_dlopen(String_val(filename), Int_val(mode), 1); + p = caml_strdup(String_val(filename)); + caml_enter_blocking_section(); + handle = caml_dlopen(p, Int_val(mode), 1); + caml_leave_blocking_section(); + caml_stat_free(p); if (handle == NULL) caml_failwith(caml_dlerror()); result = caml_alloc_small(1, Abstract_tag); Handle_val(result) = handle; diff --git a/byterun/extern.c b/byterun/extern.c index 33fa89a9..5965b8d5 100644 --- a/byterun/extern.c +++ b/byterun/extern.c @@ -13,20 +13,20 @@ /* Structured output */ -/* The interface of this file is "intext.h" */ +/* The interface of this file is "caml/intext.h" */ #include <string.h> -#include "alloc.h" -#include "custom.h" -#include "fail.h" -#include "gc.h" -#include "intext.h" -#include "io.h" -#include "md5.h" -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" -#include "reverse.h" +#include "caml/alloc.h" +#include "caml/custom.h" +#include "caml/fail.h" +#include "caml/gc.h" +#include "caml/intext.h" +#include "caml/io.h" +#include "caml/md5.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/reverse.h" static uintnat obj_counter; /* Number of objects emitted so far */ static uintnat size_32; /* Size in words of 32-bit block for struct. */ diff --git a/byterun/fail.c b/byterun/fail.c index 148e47a9..7943f9ae 100644 --- a/byterun/fail.c +++ b/byterun/fail.c @@ -15,16 +15,16 @@ #include <stdio.h> #include <stdlib.h> -#include "alloc.h" -#include "fail.h" -#include "io.h" -#include "gc.h" -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" -#include "printexc.h" -#include "signals.h" -#include "stacks.h" +#include "caml/alloc.h" +#include "caml/fail.h" +#include "caml/io.h" +#include "caml/gc.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/printexc.h" +#include "caml/signals.h" +#include "caml/stacks.h" CAMLexport struct longjmp_buffer * caml_external_raise = NULL; value caml_exn_bucket; diff --git a/byterun/finalise.c b/byterun/finalise.c index 15b7a753..b9ce1b1b 100644 --- a/byterun/finalise.c +++ b/byterun/finalise.c @@ -13,11 +13,11 @@ /* Handling of finalised values. */ -#include "callback.h" -#include "fail.h" -#include "mlvalues.h" -#include "roots.h" -#include "signals.h" +#include "caml/callback.h" +#include "caml/fail.h" +#include "caml/mlvalues.h" +#include "caml/roots.h" +#include "caml/signals.h" struct final { value fun; diff --git a/byterun/fix_code.c b/byterun/fix_code.c index 3380dc91..95a7591b 100644 --- a/byterun/fix_code.c +++ b/byterun/fix_code.c @@ -13,21 +13,21 @@ /* Handling of blocks of bytecode (endianness switch, threading). */ -#include "config.h" +#include "caml/config.h" #ifdef HAS_UNISTD #include <unistd.h> #endif -#include "debugger.h" -#include "fix_code.h" -#include "instruct.h" -#include "intext.h" -#include "md5.h" -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" -#include "reverse.h" +#include "caml/debugger.h" +#include "caml/fix_code.h" +#include "caml/instruct.h" +#include "caml/intext.h" +#include "caml/md5.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/reverse.h" code_t caml_start_code; asize_t caml_code_size; @@ -95,33 +95,44 @@ void caml_fixup_endianness(code_t code, asize_t len) char ** caml_instr_table; char * caml_instr_base; -void caml_thread_code (code_t code, asize_t len) +static int* opcode_nargs = NULL; +int* caml_init_opcode_nargs() { - code_t p; - int l [FIRST_UNIMPLEMENTED_OP]; - int i; + if( opcode_nargs == NULL ){ + int* l = (int*)caml_stat_alloc(sizeof(int) * FIRST_UNIMPLEMENTED_OP); + int i; - for (i = 0; i < FIRST_UNIMPLEMENTED_OP; i++) { - l [i] = 0; + for (i = 0; i < FIRST_UNIMPLEMENTED_OP; i++) { + l [i] = 0; + } + /* Instructions with one operand */ + l[PUSHACC] = l[ACC] = l[POP] = l[ASSIGN] = + l[PUSHENVACC] = l[ENVACC] = l[PUSH_RETADDR] = l[APPLY] = + l[APPTERM1] = l[APPTERM2] = l[APPTERM3] = l[RETURN] = + l[GRAB] = l[PUSHGETGLOBAL] = l[GETGLOBAL] = l[SETGLOBAL] = + l[PUSHATOM] = l[ATOM] = l[MAKEBLOCK1] = l[MAKEBLOCK2] = + l[MAKEBLOCK3] = l[MAKEFLOATBLOCK] = l[GETFIELD] = + l[GETFLOATFIELD] = l[SETFIELD] = l[SETFLOATFIELD] = + l[BRANCH] = l[BRANCHIF] = l[BRANCHIFNOT] = l[PUSHTRAP] = + l[C_CALL1] = l[C_CALL2] = l[C_CALL3] = l[C_CALL4] = l[C_CALL5] = + l[CONSTINT] = l[PUSHCONSTINT] = l[OFFSETINT] = + l[OFFSETREF] = l[OFFSETCLOSURE] = l[PUSHOFFSETCLOSURE] = 1; + + /* Instructions with two operands */ + l[APPTERM] = l[CLOSURE] = l[PUSHGETGLOBALFIELD] = + l[GETGLOBALFIELD] = l[MAKEBLOCK] = l[C_CALLN] = + l[BEQ] = l[BNEQ] = l[BLTINT] = l[BLEINT] = l[BGTINT] = l[BGEINT] = + l[BULTINT] = l[BUGEINT] = l[GETPUBMET] = 2; + + opcode_nargs = l; } - /* Instructions with one operand */ - l[PUSHACC] = l[ACC] = l[POP] = l[ASSIGN] = - l[PUSHENVACC] = l[ENVACC] = l[PUSH_RETADDR] = l[APPLY] = - l[APPTERM1] = l[APPTERM2] = l[APPTERM3] = l[RETURN] = - l[GRAB] = l[PUSHGETGLOBAL] = l[GETGLOBAL] = l[SETGLOBAL] = - l[PUSHATOM] = l[ATOM] = l[MAKEBLOCK1] = l[MAKEBLOCK2] = - l[MAKEBLOCK3] = l[MAKEFLOATBLOCK] = l[GETFIELD] = - l[GETFLOATFIELD] = l[SETFIELD] = l[SETFLOATFIELD] = - l[BRANCH] = l[BRANCHIF] = l[BRANCHIFNOT] = l[PUSHTRAP] = - l[C_CALL1] = l[C_CALL2] = l[C_CALL3] = l[C_CALL4] = l[C_CALL5] = - l[CONSTINT] = l[PUSHCONSTINT] = l[OFFSETINT] = - l[OFFSETREF] = l[OFFSETCLOSURE] = l[PUSHOFFSETCLOSURE] = 1; - - /* Instructions with two operands */ - l[APPTERM] = l[CLOSURE] = l[PUSHGETGLOBALFIELD] = - l[GETGLOBALFIELD] = l[MAKEBLOCK] = l[C_CALLN] = - l[BEQ] = l[BNEQ] = l[BLTINT] = l[BLEINT] = l[BGTINT] = l[BGEINT] = - l[BULTINT] = l[BUGEINT] = l[GETPUBMET] = 2; + return opcode_nargs; +} + +void caml_thread_code (code_t code, asize_t len) +{ + code_t p; + int* l = caml_init_opcode_nargs(); len /= sizeof(opcode_t); for (p = code; p < code + len; /*nothing*/) { opcode_t instr = *p; @@ -149,6 +160,13 @@ void caml_thread_code (code_t code, asize_t len) Assert(p == code + len); } +#else + +int* caml_init_opcode_nargs() +{ + return NULL; +} + #endif /* THREADED_CODE */ void caml_set_instruction(code_t pos, opcode_t instr) diff --git a/byterun/floats.c b/byterun/floats.c index 7ff6d89d..de18c333 100644 --- a/byterun/floats.c +++ b/byterun/floats.c @@ -11,20 +11,20 @@ /* */ /***********************************************************************/ -/* The interface of this file is in "mlvalues.h" and "alloc.h" */ +/* The interface of this file is in "caml/mlvalues.h" and "caml/alloc.h" */ #include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> -#include "alloc.h" -#include "fail.h" -#include "memory.h" -#include "mlvalues.h" -#include "misc.h" -#include "reverse.h" -#include "stacks.h" +#include "caml/alloc.h" +#include "caml/fail.h" +#include "caml/memory.h" +#include "caml/mlvalues.h" +#include "caml/misc.h" +#include "caml/reverse.h" +#include "caml/stacks.h" #ifdef _MSC_VER #include <float.h> @@ -150,6 +150,7 @@ CAMLprim value caml_float_of_string(value vs) error: if (buf != parse_buffer) caml_stat_free(buf); caml_failwith("float_of_string"); + return Val_unit; /* not reached */ } CAMLprim value caml_int_of_float(value f) @@ -452,7 +453,8 @@ enum { FP_normal, FP_subnormal, FP_zero, FP_infinite, FP_nan }; CAMLprim value caml_classify_float(value vd) { /* Cygwin 1.3 has problems with fpclassify (PR#1293), so don't use it */ -#if defined(fpclassify) && !defined(__CYGWIN32__) && !defined(__MINGW32__) + /* FIXME Cygwin 1.3 is ancient! Revisit this decision. */ +#if defined(fpclassify) && !defined(__CYGWIN__) && !defined(__MINGW32__) switch (fpclassify(Double_val(vd))) { case FP_NAN: return Val_int(FP_nan); diff --git a/byterun/freelist.c b/byterun/freelist.c index 1bbbc25f..a588a8b7 100644 --- a/byterun/freelist.c +++ b/byterun/freelist.c @@ -18,14 +18,14 @@ #include <string.h> -#include "config.h" -#include "freelist.h" -#include "gc.h" -#include "gc_ctrl.h" -#include "memory.h" -#include "major_gc.h" -#include "misc.h" -#include "mlvalues.h" +#include "caml/config.h" +#include "caml/freelist.h" +#include "caml/gc.h" +#include "caml/gc_ctrl.h" +#include "caml/memory.h" +#include "caml/major_gc.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" /* The free-list is kept sorted by increasing addresses. This makes the merging of adjacent free blocks possible. diff --git a/byterun/gc_ctrl.c b/byterun/gc_ctrl.c index 1ab099da..1f2a0238 100644 --- a/byterun/gc_ctrl.c +++ b/byterun/gc_ctrl.c @@ -11,21 +11,21 @@ /* */ /***********************************************************************/ -#include "alloc.h" -#include "compact.h" -#include "custom.h" -#include "finalise.h" -#include "freelist.h" -#include "gc.h" -#include "gc_ctrl.h" -#include "major_gc.h" -#include "minor_gc.h" -#include "misc.h" -#include "mlvalues.h" +#include "caml/alloc.h" +#include "caml/compact.h" +#include "caml/custom.h" +#include "caml/finalise.h" +#include "caml/freelist.h" +#include "caml/gc.h" +#include "caml/gc_ctrl.h" +#include "caml/major_gc.h" +#include "caml/minor_gc.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" #ifdef NATIVE_CODE #include "stack.h" #else -#include "stacks.h" +#include "caml/stacks.h" #endif #ifndef NATIVE_CODE diff --git a/byterun/globroots.c b/byterun/globroots.c index ded393e8..d3dd9252 100644 --- a/byterun/globroots.c +++ b/byterun/globroots.c @@ -13,11 +13,11 @@ /* Registration of global memory roots */ -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" -#include "roots.h" -#include "globroots.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/roots.h" +#include "caml/globroots.h" /* The sets of global memory roots are represented as skip lists (see William Pugh, "Skip lists: a probabilistic alternative to diff --git a/byterun/hash.c b/byterun/hash.c index f8964265..8663a3db 100644 --- a/byterun/hash.c +++ b/byterun/hash.c @@ -16,10 +16,10 @@ /* The interface of this file is in "mlvalues.h" (for [caml_hash_variant]) and in "hash.h" (for the other exported functions). */ -#include "mlvalues.h" -#include "custom.h" -#include "memory.h" -#include "hash.h" +#include "caml/mlvalues.h" +#include "caml/custom.h" +#include "caml/memory.h" +#include "caml/hash.h" /* The new implementation, based on MurmurHash 3, http://code.google.com/p/smhasher/ */ diff --git a/byterun/instrtrace.c b/byterun/instrtrace.c index 0a19fd2f..712b4636 100644 --- a/byterun/instrtrace.c +++ b/byterun/instrtrace.c @@ -19,12 +19,12 @@ #include <string.h> #include <ctype.h> -#include "instruct.h" -#include "misc.h" -#include "mlvalues.h" -#include "opnames.h" -#include "prims.h" -#include "stacks.h" +#include "caml/instruct.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/opnames.h" +#include "caml/prims.h" +#include "caml/stacks.h" extern code_t caml_start_code; diff --git a/byterun/intern.c b/byterun/intern.c index e0fcc5db..d2943afb 100644 --- a/byterun/intern.c +++ b/byterun/intern.c @@ -13,22 +13,22 @@ /* Structured input, compact format */ -/* The interface of this file is "intext.h" */ +/* The interface of this file is "caml/intext.h" */ #include <string.h> #include <stdio.h> -#include "alloc.h" -#include "callback.h" -#include "custom.h" -#include "fail.h" -#include "gc.h" -#include "intext.h" -#include "io.h" -#include "md5.h" -#include "memory.h" -#include "mlvalues.h" -#include "misc.h" -#include "reverse.h" +#include "caml/alloc.h" +#include "caml/callback.h" +#include "caml/custom.h" +#include "caml/fail.h" +#include "caml/gc.h" +#include "caml/intext.h" +#include "caml/io.h" +#include "caml/md5.h" +#include "caml/memory.h" +#include "caml/mlvalues.h" +#include "caml/misc.h" +#include "caml/reverse.h" static unsigned char * intern_src; /* Reading pointer in block holding input data. */ diff --git a/byterun/interp.c b/byterun/interp.c index 9b682ba6..fd4740b2 100644 --- a/byterun/interp.c +++ b/byterun/interp.c @@ -13,22 +13,22 @@ /* The bytecode interpreter */ #include <stdio.h> -#include "alloc.h" -#include "backtrace.h" -#include "callback.h" -#include "debugger.h" -#include "fail.h" -#include "fix_code.h" -#include "instrtrace.h" -#include "instruct.h" -#include "interp.h" -#include "major_gc.h" -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" -#include "prims.h" -#include "signals.h" -#include "stacks.h" +#include "caml/alloc.h" +#include "caml/backtrace.h" +#include "caml/callback.h" +#include "caml/debugger.h" +#include "caml/fail.h" +#include "caml/fix_code.h" +#include "caml/instrtrace.h" +#include "caml/instruct.h" +#include "caml/interp.h" +#include "caml/major_gc.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/prims.h" +#include "caml/signals.h" +#include "caml/stacks.h" /* Registers for the abstract machine: pc the code pointer @@ -220,7 +220,7 @@ value caml_interprete(code_t prog, asize_t prog_size) #ifdef THREADED_CODE static void * jumptable[] = { -# include "jumptbl.h" +# include "caml/jumptbl.h" }; #endif diff --git a/byterun/ints.c b/byterun/ints.c index d762c761..4a732762 100644 --- a/byterun/ints.c +++ b/byterun/ints.c @@ -13,13 +13,13 @@ #include <stdio.h> #include <string.h> -#include "alloc.h" -#include "custom.h" -#include "fail.h" -#include "intext.h" -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" +#include "caml/alloc.h" +#include "caml/custom.h" +#include "caml/fail.h" +#include "caml/intext.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" static char * parse_sign_and_base(char * p, /*out*/ int * base, diff --git a/byterun/io.c b/byterun/io.c index 5f04a966..11f941dc 100644 --- a/byterun/io.c +++ b/byterun/io.c @@ -18,22 +18,22 @@ #include <limits.h> #include <string.h> #include <sys/types.h> -#include "config.h" +#include "caml/config.h" #ifdef HAS_UNISTD #include <unistd.h> #endif #ifdef __CYGWIN__ #include </usr/include/io.h> #endif -#include "alloc.h" -#include "custom.h" -#include "fail.h" -#include "io.h" -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" -#include "signals.h" -#include "sys.h" +#include "caml/alloc.h" +#include "caml/custom.h" +#include "caml/fail.h" +#include "caml/io.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/signals.h" +#include "caml/sys.h" #ifndef SEEK_SET #define SEEK_SET 0 diff --git a/byterun/lexing.c b/byterun/lexing.c index 22ef6acd..eac302e3 100644 --- a/byterun/lexing.c +++ b/byterun/lexing.c @@ -13,9 +13,9 @@ /* The table-driven automaton for lexers generated by camllex. */ -#include "fail.h" -#include "mlvalues.h" -#include "stacks.h" +#include "caml/fail.h" +#include "caml/mlvalues.h" +#include "caml/stacks.h" struct lexer_buffer { value refill_buff; diff --git a/byterun/main.c b/byterun/main.c index b51c31c5..1ad20280 100644 --- a/byterun/main.c +++ b/byterun/main.c @@ -14,9 +14,9 @@ /* Main entry point (can be overridden by a user-provided main() function that calls caml_main() later). */ -#include "misc.h" -#include "mlvalues.h" -#include "sys.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/sys.h" CAMLextern void caml_main (char **); diff --git a/byterun/major_gc.c b/byterun/major_gc.c index a44c8d90..006da847 100644 --- a/byterun/major_gc.c +++ b/byterun/major_gc.c @@ -13,19 +13,19 @@ #include <limits.h> -#include "compact.h" -#include "custom.h" -#include "config.h" -#include "fail.h" -#include "finalise.h" -#include "freelist.h" -#include "gc.h" -#include "gc_ctrl.h" -#include "major_gc.h" -#include "misc.h" -#include "mlvalues.h" -#include "roots.h" -#include "weak.h" +#include "caml/compact.h" +#include "caml/custom.h" +#include "caml/config.h" +#include "caml/fail.h" +#include "caml/finalise.h" +#include "caml/freelist.h" +#include "caml/gc.h" +#include "caml/gc_ctrl.h" +#include "caml/major_gc.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/roots.h" +#include "caml/weak.h" #if defined (NATIVE_CODE) && defined (NO_NAKED_POINTERS) #define NATIVE_CODE_AND_NO_NAKED_POINTERS @@ -59,6 +59,8 @@ static value *weak_prev; static unsigned long major_gc_counter = 0; #endif +void (*caml_major_gc_hook)(void) = NULL; + static void realloc_gray_vals (void) { value *new; @@ -90,13 +92,6 @@ void caml_darken (value v, value *p /* not used */) { #ifdef NATIVE_CODE_AND_NO_NAKED_POINTERS if (Is_block (v) && Wosize_val (v) > 0) { - /* We insist that naked pointers to outside the heap point to things that - look like values with headers coloured black. This isn't always - strictly necessary but is essential in certain cases---in particular - when the value is allocated in a read-only section. (For the values - where it would be safe it is a performance improvement since we avoid - putting them on the grey list.) */ - CAMLassert (Is_in_heap (v) || Is_black_hd (Hd_val (v))); #else if (Is_block (v) && Is_in_heap (v)) { #endif @@ -107,6 +102,15 @@ void caml_darken (value v, value *p /* not used */) h = Hd_val (v); t = Tag_hd (h); } +#ifdef NATIVE_CODE_AND_NO_NAKED_POINTERS + /* We insist that naked pointers to outside the heap point to things that + look like values with headers coloured black. This isn't always + strictly necessary but is essential in certain cases---in particular + when the value is allocated in a read-only section. (For the values + where it would be safe it is a performance improvement since we avoid + putting them on the grey list.) */ + CAMLassert (Is_in_heap (v) || Is_black_hd (h)); +#endif CAMLassert (!Is_blue_hd (h)); if (Is_white_hd (h)){ if (t < No_scan_tag){ @@ -145,6 +149,7 @@ static void mark_slice (intnat work) int marking_closure = 0; #endif + if (caml_major_slice_begin_hook != NULL) (*caml_major_slice_begin_hook) (); caml_gc_message (0x40, "Marking %ld words\n", work); caml_gc_message (0x40, "Subphase = %ld\n", caml_gc_subphase); gray_vals_ptr = gray_vals_cur; @@ -169,8 +174,6 @@ static void mark_slice (intnat work) be reliably determined, so we always use the page table when marking such values. */ && (!marking_closure || Is_in_heap (child))) { - /* See [caml_darken] for a description of this assertion. */ - CAMLassert (Is_in_heap (child) || Is_black_hd (Hd_val (child))); #else if (Is_block (child) && Is_in_heap (child)) { #endif @@ -189,6 +192,10 @@ static void mark_slice (intnat work) child -= Infix_offset_val(child); hd = Hd_val(child); } +#ifdef NATIVE_CODE_AND_NO_NAKED_POINTERS + /* See [caml_darken] for a description of this assertion. */ + CAMLassert (Is_in_heap (child) || Is_black_hd (hd)); +#endif if (Is_white_hd (hd)){ Hd_val (child) = Grayhd_hd (hd); *gray_vals_ptr++ = child; @@ -307,6 +314,7 @@ static void mark_slice (intnat work) limit = chunk + Chunk_size (chunk); work = 0; caml_fl_size_at_phase_change = caml_fl_cur_size; + if (caml_major_gc_hook) (*caml_major_gc_hook)(); } break; default: Assert (0); @@ -314,6 +322,7 @@ static void mark_slice (intnat work) } } gray_vals_cur = gray_vals_ptr; + if (caml_major_slice_end_hook != NULL) (*caml_major_slice_end_hook) (); } static void sweep_slice (intnat work) @@ -321,6 +330,7 @@ static void sweep_slice (intnat work) char *hp; header_t hd; + if (caml_major_slice_begin_hook != NULL) (*caml_major_slice_begin_hook) (); caml_gc_message (0x40, "Sweeping %ld words\n", work); while (work > 0){ if (caml_gc_sweep_hp < limit){ @@ -359,6 +369,7 @@ static void sweep_slice (intnat work) } } } + if (caml_major_slice_end_hook != NULL) (*caml_major_slice_end_hook) (); } /* The main entry point for the GC. Called after each minor GC. diff --git a/byterun/md5.c b/byterun/md5.c index 10ac76ab..5d748c1a 100644 --- a/byterun/md5.c +++ b/byterun/md5.c @@ -12,13 +12,13 @@ /***********************************************************************/ #include <string.h> -#include "alloc.h" -#include "fail.h" -#include "md5.h" -#include "memory.h" -#include "mlvalues.h" -#include "io.h" -#include "reverse.h" +#include "caml/alloc.h" +#include "caml/fail.h" +#include "caml/md5.h" +#include "caml/memory.h" +#include "caml/mlvalues.h" +#include "caml/io.h" +#include "caml/reverse.h" /* MD5 message digest */ @@ -33,18 +33,16 @@ CAMLprim value caml_md5_string(value str, value ofs, value len) return res; } -CAMLprim value caml_md5_chan(value vchan, value len) +CAMLexport value caml_md5_channel(struct channel *chan, intnat toread) { - CAMLparam2 (vchan, len); - struct channel * chan = Channel(vchan); + CAMLparam0(); struct MD5Context ctx; value res; - intnat toread, read; + intnat read; char buffer[4096]; Lock(chan); caml_MD5Init(&ctx); - toread = Long_val(len); if (toread < 0){ while (1){ read = caml_getblock (chan, buffer, sizeof(buffer)); @@ -66,6 +64,12 @@ CAMLprim value caml_md5_chan(value vchan, value len) CAMLreturn (res); } +CAMLprim value caml_md5_chan(value vchan, value len) +{ + CAMLparam2 (vchan, len); + CAMLreturn (caml_md5_channel(Channel(vchan), Long_val(len))); +} + CAMLexport void caml_md5_block(unsigned char digest[16], void * data, uintnat len) { diff --git a/byterun/memory.c b/byterun/memory.c index 54d91c96..4eb63b40 100644 --- a/byterun/memory.c +++ b/byterun/memory.c @@ -13,17 +13,18 @@ #include <stdlib.h> #include <string.h> -#include "fail.h" -#include "freelist.h" -#include "gc.h" -#include "gc_ctrl.h" -#include "major_gc.h" -#include "memory.h" -#include "major_gc.h" -#include "minor_gc.h" -#include "misc.h" -#include "mlvalues.h" -#include "signals.h" +#include "caml/address_class.h" +#include "caml/fail.h" +#include "caml/freelist.h" +#include "caml/gc.h" +#include "caml/gc_ctrl.h" +#include "caml/major_gc.h" +#include "caml/memory.h" +#include "caml/major_gc.h" +#include "caml/minor_gc.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/signals.h" extern uintnat caml_percent_free; /* major_gc.c */ diff --git a/byterun/meta.c b/byterun/meta.c index e5c6f941..edec4079 100644 --- a/byterun/meta.c +++ b/byterun/meta.c @@ -14,19 +14,19 @@ /* Primitives for the toplevel */ #include <string.h> -#include "alloc.h" -#include "config.h" -#include "fail.h" -#include "fix_code.h" -#include "interp.h" -#include "intext.h" -#include "major_gc.h" -#include "memory.h" -#include "minor_gc.h" -#include "misc.h" -#include "mlvalues.h" -#include "prims.h" -#include "stacks.h" +#include "caml/alloc.h" +#include "caml/config.h" +#include "caml/fail.h" +#include "caml/fix_code.h" +#include "caml/interp.h" +#include "caml/intext.h" +#include "caml/major_gc.h" +#include "caml/memory.h" +#include "caml/minor_gc.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/prims.h" +#include "caml/stacks.h" #ifndef NATIVE_CODE diff --git a/byterun/minor_gc.c b/byterun/minor_gc.c index b15d1e44..4aaec966 100644 --- a/byterun/minor_gc.c +++ b/byterun/minor_gc.c @@ -12,19 +12,19 @@ /***********************************************************************/ #include <string.h> -#include "config.h" -#include "fail.h" -#include "finalise.h" -#include "gc.h" -#include "gc_ctrl.h" -#include "major_gc.h" -#include "memory.h" -#include "minor_gc.h" -#include "misc.h" -#include "mlvalues.h" -#include "roots.h" -#include "signals.h" -#include "weak.h" +#include "caml/config.h" +#include "caml/fail.h" +#include "caml/finalise.h" +#include "caml/gc.h" +#include "caml/gc_ctrl.h" +#include "caml/major_gc.h" +#include "caml/memory.h" +#include "caml/minor_gc.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/roots.h" +#include "caml/signals.h" +#include "caml/weak.h" asize_t caml_minor_heap_size; static void *caml_young_base = NULL; @@ -226,8 +226,11 @@ void caml_oldify_mopup (void) void caml_empty_minor_heap (void) { value **r; + uintnat prev_alloc_words; if (caml_young_ptr != caml_young_end){ + if (caml_minor_gc_begin_hook != NULL) (*caml_minor_gc_begin_hook) (); + prev_alloc_words = caml_allocated_words; caml_in_minor_collection = 1; caml_gc_message (0x02, "<", 0); caml_oldify_local_roots(); @@ -252,8 +255,11 @@ void caml_empty_minor_heap (void) clear_table (&caml_weak_ref_table); caml_gc_message (0x02, ">", 0); caml_in_minor_collection = 0; + caml_stat_promoted_words += caml_allocated_words - prev_alloc_words; + ++ caml_stat_minor_collections; + caml_final_empty_young (); + if (caml_minor_gc_end_hook != NULL) (*caml_minor_gc_end_hook) (); } - caml_final_empty_young (); #ifdef DEBUG { value *p; @@ -271,16 +277,14 @@ void caml_empty_minor_heap (void) */ CAMLexport void caml_minor_collection (void) { - intnat prev_alloc_words = caml_allocated_words; - caml_empty_minor_heap (); - caml_stat_promoted_words += caml_allocated_words - prev_alloc_words; - ++ caml_stat_minor_collections; caml_major_collection_slice (0); caml_force_major_slice = 0; + if (caml_finalise_begin_hook != NULL) (*caml_finalise_begin_hook) (); caml_final_do_calls (); + if (caml_finalise_end_hook != NULL) (*caml_finalise_end_hook) (); caml_empty_minor_heap (); } diff --git a/byterun/misc.c b/byterun/misc.c index 6dc27d5c..a951ee2b 100644 --- a/byterun/misc.c +++ b/byterun/misc.c @@ -14,9 +14,16 @@ #include <stdio.h> #include <string.h> #include <stdarg.h> -#include "config.h" -#include "misc.h" -#include "memory.h" +#include "caml/config.h" +#include "caml/misc.h" +#include "caml/memory.h" + +caml_timing_hook caml_major_slice_begin_hook = NULL; +caml_timing_hook caml_major_slice_end_hook = NULL; +caml_timing_hook caml_minor_gc_begin_hook = NULL; +caml_timing_hook caml_minor_gc_end_hook = NULL; +caml_timing_hook caml_finalise_begin_hook = NULL; +caml_timing_hook caml_finalise_end_hook = NULL; #ifdef DEBUG diff --git a/byterun/obj.c b/byterun/obj.c index b045fee2..ce7ffcd0 100644 --- a/byterun/obj.c +++ b/byterun/obj.c @@ -14,16 +14,16 @@ /* Operations on objects */ #include <string.h> -#include "alloc.h" -#include "fail.h" -#include "gc.h" -#include "interp.h" -#include "major_gc.h" -#include "memory.h" -#include "minor_gc.h" -#include "misc.h" -#include "mlvalues.h" -#include "prims.h" +#include "caml/alloc.h" +#include "caml/fail.h" +#include "caml/gc.h" +#include "caml/interp.h" +#include "caml/major_gc.h" +#include "caml/memory.h" +#include "caml/minor_gc.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/prims.h" CAMLprim value caml_static_alloc(value size) { diff --git a/byterun/parsing.c b/byterun/parsing.c index a857e392..bd51a41e 100644 --- a/byterun/parsing.c +++ b/byterun/parsing.c @@ -15,10 +15,10 @@ #include <stdio.h> #include <string.h> -#include "config.h" -#include "mlvalues.h" -#include "memory.h" -#include "alloc.h" +#include "caml/config.h" +#include "caml/mlvalues.h" +#include "caml/memory.h" +#include "caml/alloc.h" #define ERRCODE 256 diff --git a/byterun/printexc.c b/byterun/printexc.c index a371a71f..7647b3a1 100644 --- a/byterun/printexc.c +++ b/byterun/printexc.c @@ -16,13 +16,13 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> -#include "backtrace.h" -#include "callback.h" -#include "debugger.h" -#include "fail.h" -#include "misc.h" -#include "mlvalues.h" -#include "printexc.h" +#include "caml/backtrace.h" +#include "caml/callback.h" +#include "caml/debugger.h" +#include "caml/fail.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/printexc.h" struct stringbuf { char * ptr; diff --git a/byterun/roots.c b/byterun/roots.c index 43afbedc..f812cd75 100644 --- a/byterun/roots.c +++ b/byterun/roots.c @@ -13,15 +13,15 @@ /* To walk the memory roots for garbage collection */ -#include "finalise.h" -#include "globroots.h" -#include "major_gc.h" -#include "memory.h" -#include "minor_gc.h" -#include "misc.h" -#include "mlvalues.h" -#include "roots.h" -#include "stacks.h" +#include "caml/finalise.h" +#include "caml/globroots.h" +#include "caml/major_gc.h" +#include "caml/memory.h" +#include "caml/minor_gc.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/roots.h" +#include "caml/stacks.h" CAMLexport struct caml__roots_block *caml_local_roots = NULL; diff --git a/byterun/signals.c b/byterun/signals.c index 10f452b4..3d642f19 100644 --- a/byterun/signals.c +++ b/byterun/signals.c @@ -15,17 +15,17 @@ #include <signal.h> #include <errno.h> -#include "alloc.h" -#include "callback.h" -#include "config.h" -#include "fail.h" -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" -#include "roots.h" -#include "signals.h" -#include "signals_machdep.h" -#include "sys.h" +#include "caml/alloc.h" +#include "caml/callback.h" +#include "caml/config.h" +#include "caml/fail.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/roots.h" +#include "caml/signals.h" +#include "caml/signals_machdep.h" +#include "caml/sys.h" #ifndef NSIG #define NSIG 64 diff --git a/byterun/signals_byt.c b/byterun/signals_byt.c index 9703afaa..e9c6c662 100644 --- a/byterun/signals_byt.c +++ b/byterun/signals_byt.c @@ -15,11 +15,11 @@ #include <signal.h> #include <errno.h> -#include "config.h" -#include "memory.h" -#include "osdeps.h" -#include "signals.h" -#include "signals_machdep.h" +#include "caml/config.h" +#include "caml/memory.h" +#include "caml/osdeps.h" +#include "caml/signals.h" +#include "caml/signals_machdep.h" #ifndef NSIG #define NSIG 64 diff --git a/byterun/stacks.c b/byterun/stacks.c index bc2bdc46..94bff0b9 100644 --- a/byterun/stacks.c +++ b/byterun/stacks.c @@ -14,11 +14,11 @@ /* To initialize and resize the stacks */ #include <string.h> -#include "config.h" -#include "fail.h" -#include "misc.h" -#include "mlvalues.h" -#include "stacks.h" +#include "caml/config.h" +#include "caml/fail.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/stacks.h" CAMLexport value * caml_stack_low; CAMLexport value * caml_stack_high; diff --git a/byterun/startup.c b/byterun/startup.c index 36972206..fb6e7778 100644 --- a/byterun/startup.c +++ b/byterun/startup.c @@ -17,41 +17,41 @@ #include <stdlib.h> #include <string.h> #include <fcntl.h> -#include "config.h" +#include "caml/config.h" #ifdef HAS_UNISTD #include <unistd.h> #endif #ifdef _WIN32 #include <process.h> #endif -#include "alloc.h" -#include "backtrace.h" -#include "callback.h" -#include "custom.h" -#include "debugger.h" -#include "dynlink.h" -#include "exec.h" -#include "fail.h" -#include "fix_code.h" -#include "freelist.h" -#include "gc_ctrl.h" -#include "instrtrace.h" -#include "interp.h" -#include "intext.h" -#include "io.h" -#include "memory.h" -#include "minor_gc.h" -#include "misc.h" -#include "mlvalues.h" -#include "osdeps.h" -#include "prims.h" -#include "printexc.h" -#include "reverse.h" -#include "signals.h" -#include "stacks.h" -#include "sys.h" -#include "startup.h" -#include "version.h" +#include "caml/alloc.h" +#include "caml/backtrace.h" +#include "caml/callback.h" +#include "caml/custom.h" +#include "caml/debugger.h" +#include "caml/dynlink.h" +#include "caml/exec.h" +#include "caml/fail.h" +#include "caml/fix_code.h" +#include "caml/freelist.h" +#include "caml/gc_ctrl.h" +#include "caml/instrtrace.h" +#include "caml/interp.h" +#include "caml/intext.h" +#include "caml/io.h" +#include "caml/memory.h" +#include "caml/minor_gc.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/osdeps.h" +#include "caml/prims.h" +#include "caml/printexc.h" +#include "caml/reverse.h" +#include "caml/signals.h" +#include "caml/stacks.h" +#include "caml/sys.h" +#include "caml/startup.h" +#include "caml/version.h" #ifndef O_BINARY #define O_BINARY 0 diff --git a/byterun/str.c b/byterun/str.c index 6effa91a..a72b34c4 100644 --- a/byterun/str.c +++ b/byterun/str.c @@ -17,10 +17,10 @@ #include <ctype.h> #include <stdio.h> #include <stdarg.h> -#include "alloc.h" -#include "fail.h" -#include "mlvalues.h" -#include "misc.h" +#include "caml/alloc.h" +#include "caml/fail.h" +#include "caml/mlvalues.h" +#include "caml/misc.h" #ifdef HAS_LOCALE #include <locale.h> #endif diff --git a/byterun/sys.c b/byterun/sys.c index 03ca1e3e..292f664b 100644 --- a/byterun/sys.c +++ b/byterun/sys.c @@ -25,7 +25,7 @@ #if !_WIN32 #include <sys/wait.h> #endif -#include "config.h" +#include "caml/config.h" #ifdef HAS_UNISTD #include <unistd.h> #endif @@ -39,15 +39,15 @@ #ifdef HAS_GETTIMEOFDAY #include <sys/time.h> #endif -#include "alloc.h" -#include "debugger.h" -#include "fail.h" -#include "instruct.h" -#include "mlvalues.h" -#include "osdeps.h" -#include "signals.h" -#include "stacks.h" -#include "sys.h" +#include "caml/alloc.h" +#include "caml/debugger.h" +#include "caml/fail.h" +#include "caml/instruct.h" +#include "caml/mlvalues.h" +#include "caml/osdeps.h" +#include "caml/signals.h" +#include "caml/stacks.h" +#include "caml/sys.h" static char * error_message(void) { @@ -268,7 +268,7 @@ CAMLprim value caml_sys_getenv(value var) } char * caml_exe_name; -static char ** caml_main_argv; +char ** caml_main_argv; CAMLprim value caml_sys_get_argv(value unit) { diff --git a/byterun/terminfo.c b/byterun/terminfo.c index 04086a3f..1d0fdc42 100644 --- a/byterun/terminfo.c +++ b/byterun/terminfo.c @@ -13,11 +13,11 @@ /* Read and output terminal commands */ -#include "config.h" -#include "alloc.h" -#include "fail.h" -#include "io.h" -#include "mlvalues.h" +#include "caml/config.h" +#include "caml/alloc.h" +#include "caml/fail.h" +#include "caml/io.h" +#include "caml/mlvalues.h" #define Uninitialised (Val_int(0)) #define Bad_term (Val_int(1)) diff --git a/byterun/unix.c b/byterun/unix.c index be2c39b1..38ddee00 100644 --- a/byterun/unix.c +++ b/byterun/unix.c @@ -22,9 +22,9 @@ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> -#include "config.h" +#include "caml/config.h" #ifdef SUPPORT_DYNAMIC_LINKING -#ifdef __CYGWIN32__ +#ifdef __CYGWIN__ #include "flexdll.h" #else #include <dlfcn.h> @@ -38,9 +38,9 @@ #else #include <sys/dir.h> #endif -#include "memory.h" -#include "misc.h" -#include "osdeps.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/osdeps.h" #ifndef S_ISREG #define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) @@ -86,7 +86,7 @@ char * caml_search_in_path(struct ext_table * path, char * name) return caml_strdup(name); } -#ifdef __CYGWIN32__ +#ifdef __CYGWIN__ /* Cygwin needs special treatment because of the implicit ".exe" at the end of executable file names */ @@ -137,7 +137,7 @@ char * caml_search_exe_in_path(char * name) caml_ext_table_init(&path, 8); tofree = caml_decompose_path(&path, getenv("PATH")); -#ifndef __CYGWIN32__ +#ifndef __CYGWIN__ res = caml_search_in_path(&path, name); #else res = cygwin_search_exe_in_path(&path, name); @@ -159,7 +159,7 @@ char * caml_search_dll_in_path(struct ext_table * path, char * name) } #ifdef SUPPORT_DYNAMIC_LINKING -#ifdef __CYGWIN32__ +#ifdef __CYGWIN__ /* Use flexdll */ void * caml_dlopen(char * libname, int for_execution, int global) diff --git a/byterun/weak.c b/byterun/weak.c index 75699671..65da99dc 100644 --- a/byterun/weak.c +++ b/byterun/weak.c @@ -15,11 +15,11 @@ #include <string.h> -#include "alloc.h" -#include "fail.h" -#include "major_gc.h" -#include "memory.h" -#include "mlvalues.h" +#include "caml/alloc.h" +#include "caml/fail.h" +#include "caml/major_gc.h" +#include "caml/memory.h" +#include "caml/mlvalues.h" value caml_weak_list_head = 0; diff --git a/byterun/win32.c b/byterun/win32.c index 67e96832..f26caf8f 100644 --- a/byterun/win32.c +++ b/byterun/win32.c @@ -25,12 +25,13 @@ #include <errno.h> #include <string.h> #include <signal.h> -#include "fail.h" -#include "memory.h" -#include "misc.h" -#include "osdeps.h" -#include "signals.h" -#include "sys.h" +#include "caml/address_class.h" +#include "caml/fail.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/osdeps.h" +#include "caml/signals.h" +#include "caml/sys.h" #include <flexdll.h> @@ -418,14 +419,8 @@ static void caml_reset_stack (void *faulting_address) caml_raise_stack_overflow(); } -extern char * caml_code_area_start, * caml_code_area_end; CAMLextern int caml_is_in_code(void *); -#define Is_in_code_area(pc) \ - ( ((char *)(pc) >= caml_code_area_start && \ - (char *)(pc) <= caml_code_area_end) \ - || (Classify_addr(pc) & In_code_area) ) - static LONG CALLBACK caml_UnhandledExceptionFilter (EXCEPTION_POINTERS* exn_info) { diff --git a/compilerlibs/.gitignore b/compilerlibs/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/config/Makefile.mingw b/config/Makefile.mingw index c2049803..5b4658f7 100644 --- a/config/Makefile.mingw +++ b/config/Makefile.mingw @@ -68,7 +68,7 @@ X11_INCLUDES= X11_LINK= BYTECCRPATH= SUPPORTS_SHARED_LIBRARIES=true -SHAREDCCCOMPOPTS= +SHAREDCCCOMPOPTS=-O MKSHAREDLIBRPATH= NATIVECCPROFOPTS= NATIVECCRPATH= diff --git a/config/Makefile.mingw64 b/config/Makefile.mingw64 index 0a3bdfbd..19a9b943 100644 --- a/config/Makefile.mingw64 +++ b/config/Makefile.mingw64 @@ -68,7 +68,7 @@ X11_INCLUDES= X11_LINK= BYTECCRPATH= SUPPORTS_SHARED_LIBRARIES=true -SHAREDCCCOMPOPTS= +SHAREDCCCOMPOPTS=-O MKSHAREDLIBRPATH= NATIVECCPROFOPTS= NATIVECCRPATH= diff --git a/config/Makefile.msvc b/config/Makefile.msvc index 93cf94b6..e0145102 100644 --- a/config/Makefile.msvc +++ b/config/Makefile.msvc @@ -60,7 +60,7 @@ X11_INCLUDES= X11_LINK= BYTECCRPATH= SUPPORTS_SHARED_LIBRARIES=true -SHAREDCCCOMPOPTS= +SHAREDCCCOMPOPTS=-Ox NATIVECCPROFOPTS= NATIVECCRPATH= ASM=ml -nologo -coff -Cp -c -Fo diff --git a/config/Makefile.msvc64 b/config/Makefile.msvc64 index 1b2e1888..783ce953 100644 --- a/config/Makefile.msvc64 +++ b/config/Makefile.msvc64 @@ -60,7 +60,7 @@ X11_INCLUDES= X11_LINK= BYTECCRPATH= SUPPORTS_SHARED_LIBRARIES=true -SHAREDCCCOMPOPTS= +SHAREDCCCOMPOPTS=-Ox NATIVECCPROFOPTS= NATIVECCRPATH= ASM=ml64 -nologo -Cp -c -Fo diff --git a/config/auto-aux/nanosecond_stat.c b/config/auto-aux/nanosecond_stat.c new file mode 100644 index 00000000..fc92e67b --- /dev/null +++ b/config/auto-aux/nanosecond_stat.c @@ -0,0 +1,28 @@ +/***********************************************************************/ +/* */ +/* OCaml */ +/* */ +/* Jeremie Dimino, Jane Street Group, LLC */ +/* */ +/* Copyright 2015 Institut National de Recherche en Informatique et */ +/* en Automatique. All rights reserved. This file is distributed */ +/* under the terms of the GNU Library General Public License, with */ +/* the special exception on linking described in file ../../LICENSE. */ +/* */ +/***********************************************************************/ + +#define _GNU_SOURCE +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> + +#include "../../otherlibs/unix/nanosecond_stat.h" + +int main() { + struct stat *buf; + double a, m, c; + a = (double)NSEC(buf, a); + m = (double)NSEC(buf, m); + c = (double)NSEC(buf, c); + return 0; +} diff --git a/config/auto-aux/searchpath b/config/auto-aux/searchpath index 79d7fcae..e229ac92 100755 --- a/config/auto-aux/searchpath +++ b/config/auto-aux/searchpath @@ -15,9 +15,18 @@ # Find a program in the path +doprint=false +case $1 in + -p) shift; doprint=true;; + *) ;; +esac + IFS=':' for dir in $PATH; do if test -z "$dir"; then dir=.; fi - if test -f $dir/$1; then exit 0; fi + if test -f $dir/$1 -a -x $dir/$1; then + if $doprint; then echo "$dir/$1"; fi + exit 0 + fi done exit 1 diff --git a/configure b/configure index 3edb9fd2..4ea1498c 100755 --- a/configure +++ b/configure @@ -16,6 +16,7 @@ configure_options="$*" prefix=/usr/local bindir='' +target_bindir='' libdir='' mandir='' manext=1 @@ -77,7 +78,7 @@ wrn() { } err() { - printf "[ERROR!]%b\n" "$*" 1>&3 + printf "[ERROR!] %b\n" "$*" 1>&3 exit 2 } @@ -85,10 +86,6 @@ exec 3>&1 # Parse command-line arguments -if echo "$configure_options" | grep -q -e '--\?[a-zA-Z0-9-]\+='; then - err "Arguments to this script look like '-prefix /foo/bar', not '-prefix=/foo/bar' (note the '=')." -fi - while : ; do case "$1" in "") break;; @@ -96,6 +93,8 @@ while : ; do prefix=$2; shift;; -bindir|--bindir) bindir=$2; shift;; + -target-bindir|--target-bindir) + target_bindir="$2"; shift;; -libdir|--libdir) libdir=$2; shift;; -mandir|--mandir) @@ -155,7 +154,12 @@ while : ; do no_naked_pointers=true;; -no-cfi|--no-cfi) with_cfi=false;; - *) err "Unknown option \"$1\".";; + *) if echo "$1" | grep -q -e '^--\?[a-zA-Z0-9-]\+='; then + err "configure expects arguments of the form '-prefix /foo/bar'," \ + "not '-prefix=/foo/bar' (note the '=')." + else + err "Unknown option \"$1\"." + fi;; esac shift done @@ -236,17 +240,23 @@ else fi inf "Configuring for target $target ..." +if [ x"$host" = x"$target" ]; then + cross_compiler=false +else + cross_compiler=true +fi + # Do we have gcc? if test -z "$ccoption"; then if sh ./searchpath "${TOOLPREF}gcc"; then cc="${TOOLPREF}gcc" else - if test x"$host" = x"$target"; then - cc="cc" - else + if $cross_compiler; then err "No cross-compiler found for ${target}.\n" \ "It should be named ${TOOLPREF}gcc and be in the PATH." + else + cc="cc" fi fi else @@ -374,10 +384,15 @@ case "$bytecc,$target" in *,powerpc-*-aix*) bytecccompopts="-D_XOPEN_SOURCE=500";; *gcc*,*-*-cygwin*) + case $target in + i686-*) flavor=cygwin;; + x86_64-*) flavor=cygwin64;; + *) err "unknown cygwin variant";; + esac bytecccompopts="-fno-defer-pop $gcc_warnings -U_WIN32" dllccompopts="-U_WIN32 -DCAML_DLL" if test $with_sharedlibs = yes; then - flexlink="flexlink -chain cygwin -merge-manifest -stack 16777216" + flexlink="flexlink -chain $flavor -merge-manifest -stack 16777216" flexdir=`$flexlink -where | dos2unix` if test -z "$flexdir"; then wrn "flexlink not found: native shared libraries won't be available." @@ -442,7 +457,7 @@ case $? in 1) err "The C compiler $cc is not ANSI-compliant.\n" \ "You need an ANSI C compiler to build OCaml.";; *) - if test x"$host" != x"$target"; then + if $cross_compiler; then wrn "Unable to compile the test program.\n" \ "This failure is expected for cross-compilation:\n" \ "we will assume the C compiler is ANSI-compliant." @@ -452,29 +467,43 @@ case $? in fi;; esac -# Determine which ocamlrun executable to use; for cross-compilation, a native -# "ocamlrun" executable must be available on the system. -if test x"$target" != x"$host"; then +# For cross-compilation, we need a host-based ocamlrun and ocamlyacc, +# and the user must specify the target BINDIR +if $cross_compiler; then if ! sh ./searchpath ocamlrun; then err "Cross-compilation requires an ocaml runtime environment\n" \ "(the ocamlrun binary). Moreover, its version must be the same\n" \ "as the one you're trying to build (`cut -f1 -d+ < ../../VERSION`)." else - ocaml_system_version=`ocamlrun -version | sed 's/[^0-9]*\([0-9.]\+\).*/\1/'` - ocaml_source_version=`sed -n '1 s/\([0-9\.]\+\).*/\1/ p' < ../../VERSION` + ocaml_system_version=`ocamlrun -version | sed 's/[^0-9]*\([0-9.]*\).*/\1/'` + ocaml_source_version=`sed -n '1 s/\([0-9\.]*\).*/\1/ p' < ../../VERSION` if test x"$ocaml_system_version" != x"$ocaml_source_version"; then err "While you have an ocaml runtime environment, its version\n" \ "($ocaml_system_version) doesn't match the version of these sources\n" \ "($ocaml_source_version)." else - CAMLRUN="ocamlrun" + echo "CAMLRUN=`./searchpath -p ocamlrun`" >> Makefile fi fi -else - CAMLRUN=`cd ../.. && pwd`/boot/ocamlrun -fi -echo "CAMLRUN=$CAMLRUN" >> Makefile + if ! sh ./searchpath ocamlyacc; then + err "Cross-compilation requires an ocamlyacc binary." + else + ocamlyacc 2>/dev/null + if test "$?" -ne 1; then + err "While you have an ocamlyacc binary, it cannot be executed successfully." + else + echo "CAMLYACC=`./searchpath -p ocamlyacc`" >> Makefile + fi + fi + + if [ -z "$target_bindir" ]; then + err "Cross-compilation requires -target-bindir." + else + echo "TARGET_BINDIR=$target_bindir" >> Makefile + fi +fi # cross-compiler + # Check the sizes of data types # OCaml needs a 32 or 64 bit architecture, a 32-bit integer type and @@ -926,6 +955,8 @@ case "$arch,$system" in case "$nativecc" in gcc*) ;; *) cc_profile='-xpg';; esac;; amd64,linux) profiling='prof';; amd64,openbsd) profiling='prof';; + amd64,freebsd) profiling='prof';; + amd64,netbsd) profiling='prof';; amd64,gnu) profiling='prof';; arm,linux*) profiling='prof';; power,elf) profiling='prof';; @@ -967,7 +998,8 @@ if (SHELL=/bin/sh; export SHELL; (./sharpbang || ./sharpbang2) >/dev/null); then "under Cygwin" echo "SHARPBANGSCRIPTS=false" >> Makefile;; *-*-mingw*) - inf "We won't use it, though, because it's on the target platform it would be used and windows doesn't support it." + inf "We won't use it, though, because it's on the target platform " \ + "it would be used and windows doesn't support it." echo "SHARPBANGSCRIPTS=false" >> Makefile;; *) echo "SHARPBANGSCRIPTS=true" >> Makefile;; @@ -1298,6 +1330,15 @@ if sh ./hasgot pwrite; then echo "#define HAS_PWRITE" >> s.h fi +nanosecond_stat=none +for i in 1 2 3; do + if sh ./trycompile -DHAS_NANOSECOND_STAT=$i nanosecond_stat.c; then nanosecond_stat=$i; break; fi +done +if test $nanosecond_stat != "none"; then + inf "stat() supports nanosecond precision." + echo "#define HAS_NANOSECOND_STAT $nanosecond_stat" >> s.h +fi + nargs=none for i in 5 6; do if sh ./trycompile -DNUM_ARGS=${i} gethostbyname.c; then nargs=$i; break; fi @@ -1645,6 +1686,12 @@ if $no_naked_pointers; then echo "#define NO_NAKED_POINTERS" >> m.h fi +# Add Unix-style optimization flag +bytecccompopts="-O $bytecccompopts" +dllcccompopts="-O $dllcccompopts" +nativecccompopts="-O $nativecccompopts" +sharedcccompopts="-O $sharedcccompopts" + # Final twiddling of compiler options to work around known bugs nativeccprofopts="$nativecccompopts" @@ -1673,8 +1720,8 @@ SYSLIB=-l\$(1) #ml let syslib x = "-l"^x;; ### How to build a static library -MKLIB=ar rc \$(1) \$(2); ranlib \$(1) -#ml let mklib out files opts = Printf.sprintf "ar rc %s %s %s; ranlib %s" out opts files out;; +MKLIB=${TOOLPREF}ar rc \$(1) \$(2); ${TOOLPREF}ranlib \$(1) +#ml let mklib out files opts = Printf.sprintf "${TOOLPREF}ar rc %s %s %s; ${TOOLPREF}ranlib %s" out opts files out;; EOF echo "ARCH=$arch" >> Makefile echo "MODEL=$model" >> Makefile @@ -1715,6 +1762,11 @@ echo "MKEXEDEBUGFLAG=$mkexedebugflag" >> Makefile echo "MKDLL=$mksharedlib" >> Makefile echo "MKMAINDLL=$mkmaindll" >> Makefile echo "RUNTIMED=${debugruntime}" >>Makefile +if $shared_libraries_supported; then + echo "SHARED=shared" >>Makefile +else + echo "SHARED=noshared" >>Makefile +fi echo "WITH_DEBUGGER=${with_debugger}" >>Makefile echo "WITH_OCAMLDOC=${with_ocamldoc}" >>Makefile echo "WITH_OCAMLBUILD=${with_ocamlbuild}" >>Makefile diff --git a/debugger/.depend b/debugger/.depend index b6254161..c9a56ac1 100644 --- a/debugger/.depend +++ b/debugger/.depend @@ -16,8 +16,8 @@ int64ops.cmi : lexer.cmi : parser.cmi loadprinter.cmi : ../parsing/longident.cmi dynlink.cmi parameters.cmi : -parser.cmi : parser_aux.cmi ../parsing/longident.cmi parser_aux.cmi : primitives.cmi ../parsing/longident.cmi +parser.cmi : parser_aux.cmi ../parsing/longident.cmi pattern_matching.cmi : ../typing/typedtree.cmi parser_aux.cmi debugcom.cmi pos.cmi : ../bytecomp/instruct.cmi primitives.cmi : $(UNIXDIR)/unix.cmi diff --git a/debugger/Makefile.shared b/debugger/Makefile.shared index fed1d26d..f3859c63 100644 --- a/debugger/Makefile.shared +++ b/debugger/Makefile.shared @@ -11,15 +11,15 @@ ######################################################################### include ../config/Makefile +CAMLRUN ?= ../boot/ocamlrun +CAMLYACC ?= ../boot/ocamlyacc -ROOTDIR=.. -CAMLC=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib +CAMLC=$(CAMLRUN) ../ocamlc -nostdlib -I ../stdlib COMPFLAGS=-warn-error A -safe-string $(INCLUDES) LINKFLAGS=-linkall -I $(UNIXDIR) -CAMLYACC=../boot/ocamlyacc YACCFLAGS= -CAMLLEX=../boot/ocamlrun ../boot/ocamllex -CAMLDEP=../boot/ocamlrun ../tools/ocamldep +CAMLLEX=$(CAMLRUN) ../boot/ocamllex +CAMLDEP=$(CAMLRUN) ../tools/ocamldep DEPFLAGS=$(INCLUDES) INSTALL_BINDIR=$(DESTDIR)$(BINDIR) @@ -32,7 +32,7 @@ OTHEROBJS=\ $(UNIXDIR)/unix.cma \ ../utils/misc.cmo ../utils/config.cmo ../utils/tbl.cmo \ ../utils/clflags.cmo ../utils/consistbl.cmo ../utils/warnings.cmo \ - ../parsing/location.cmo ../parsing/longident.cmo \ + ../parsing/location.cmo ../parsing/longident.cmo ../parsing/docstrings.cmo \ ../parsing/ast_helper.cmo ../parsing/ast_mapper.cmo \ ../typing/ident.cmo ../typing/path.cmo ../typing/types.cmo \ ../typing/btype.cmo ../typing/primitive.cmo ../typing/typedtree.cmo \ diff --git a/debugger/command_line.ml b/debugger/command_line.ml index a4647110..b4f9f693 100644 --- a/debugger/command_line.ml +++ b/debugger/command_line.ml @@ -610,8 +610,12 @@ let instr_break ppf lexbuf = let module_name = convert_module (module_of_longident mdle) in new_breakpoint (try + let ev = event_at_pos module_name 0 in + let ev_pos = + {Lexing.dummy_pos with + pos_fname = (Events.get_pos ev).pos_fname} in let buffer = - try get_buffer Lexing.dummy_pos module_name with + try get_buffer ev_pos module_name with | Not_found -> eprintf "No source file for %s.@." module_name; raise Toplevel diff --git a/debugger/debugcom.ml b/debugger/debugcom.ml index ac91df79..8bfd3aab 100644 --- a/debugger/debugcom.ml +++ b/debugger/debugcom.ml @@ -213,14 +213,16 @@ module Remote_value = | Local obj -> Obj.is_block obj | Remote v -> Obj.is_block (Array.unsafe_get (Obj.magic v : Obj.t array) 0) - let tag = function - | Local obj -> Obj.tag obj - | Remote v -> - output_char !conn.io_out 'H'; - output_remote_value !conn.io_out v; - flush !conn.io_out; - let header = input_binary_int !conn.io_in in - header land 0xFF + let tag obj = + if not (is_block obj) then Obj.int_tag + else match obj with + | Local obj -> Obj.tag obj + | Remote v -> + output_char !conn.io_out 'H'; + output_remote_value !conn.io_out v; + flush !conn.io_out; + let header = input_binary_int !conn.io_in in + header land 0xFF let size = function | Local obj -> Obj.size obj diff --git a/debugger/source.ml b/debugger/source.ml index aa9ec708..fa2b3c7e 100644 --- a/debugger/source.ml +++ b/debugger/source.ml @@ -21,6 +21,8 @@ let source_extensions = [".ml"] (*** Conversion function. ***) let source_of_module pos mdle = + let pos_fname = pos.Lexing.pos_fname in + if Sys.file_exists pos_fname then pos_fname else let is_submodule m m' = let len' = String.length m' in try diff --git a/driver/compenv.ml b/driver/compenv.ml index 82704fd8..e7b4987c 100644 --- a/driver/compenv.ml +++ b/driver/compenv.ml @@ -56,26 +56,28 @@ let first_objfiles = ref [] let last_objfiles = ref [] (* Check validity of module name *) -let check_unit_name ppf filename name = +let is_unit_name name = try begin match name.[0] with | 'A'..'Z' -> () | _ -> - Location.print_warning (Location.in_file filename) ppf - (Warnings.Bad_module_name name); raise Exit; end; for i = 1 to String.length name - 1 do match name.[i] with | 'A'..'Z' | 'a'..'z' | '0'..'9' | '_' | '\'' -> () | _ -> - Location.print_warning (Location.in_file filename) ppf - (Warnings.Bad_module_name name); raise Exit; done; - with Exit -> () + true + with Exit -> false ;; +let check_unit_name ppf filename name = + if not (is_unit_name name) then + Location.print_warning (Location.in_file filename) ppf + (Warnings.Bad_module_name name);; + (* Compute name of module from output file name *) let module_of_filename ppf inputfile outputprefix = let basename = Filename.basename outputprefix in @@ -175,6 +177,7 @@ let read_OCAMLPARAM ppf position = | "verbose" -> set "verbose" [ verbose ] v | "nopervasives" -> set "nopervasives" [ nopervasives ] v | "slash" -> set "slash" [ force_slash ] v (* for ocamldep *) + | "keep-docs" -> set "keep-docs" [ Clflags.keep_docs ] v | "keep-locs" -> set "keep-locs" [ Clflags.keep_locs ] v | "compact" -> clear "compact" [ optimize_for_speed ] v diff --git a/driver/compenv.mli b/driver/compenv.mli index 85d588ef..59cd1012 100644 --- a/driver/compenv.mli +++ b/driver/compenv.mli @@ -10,7 +10,6 @@ (* *) (***********************************************************************) -(* val check_unit_name : Format.formatter -> string -> string -> unit *) val module_of_filename : Format.formatter -> string -> string -> string val output_prefix : string -> string @@ -35,3 +34,10 @@ type readenv_position = Before_args | Before_compile | Before_link val readenv : Format.formatter -> readenv_position -> unit + +(* [is_unit_name name] returns true only if [name] can be used as a + correct module name *) +val is_unit_name : string -> bool +(* [check_unit_name ppf filename name] prints a warning in [filename] + on [ppf] if [name] should not be used as a module name. *) +val check_unit_name : Format.formatter -> string -> string -> unit diff --git a/driver/compile.ml b/driver/compile.ml index 3b5d2ae0..9edfb804 100644 --- a/driver/compile.ml +++ b/driver/compile.ml @@ -60,50 +60,44 @@ let implementation ppf sourcefile outputprefix = let modulename = module_of_filename ppf sourcefile outputprefix in Env.set_unit_name modulename; let env = Compmisc.initial_env() in - if !Clflags.print_types then begin - let comp ast = - ast + try + let (typedtree, coercion) = + Pparse.parse_implementation ~tool_name ppf sourcefile ++ print_if ppf Clflags.dump_parsetree Printast.implementation ++ print_if ppf Clflags.dump_source Pprintast.structure ++ Typemod.type_implementation sourcefile outputprefix modulename env ++ print_if ppf Clflags.dump_typedtree - Printtyped.implementation_with_coercion - ++ (fun _ -> ()); - Warnings.check_fatal (); - Stypes.dump (Some (outputprefix ^ ".annot")) + Printtyped.implementation_with_coercion in - try comp (Pparse.parse_implementation ~tool_name ppf sourcefile) - with x -> - Stypes.dump (Some (outputprefix ^ ".annot")); - raise x - end else begin - let objfile = outputprefix ^ ".cmo" in - let oc = open_out_bin objfile in - let comp ast = - ast - ++ print_if ppf Clflags.dump_parsetree Printast.implementation - ++ print_if ppf Clflags.dump_source Pprintast.structure - ++ Typemod.type_implementation sourcefile outputprefix modulename env - ++ print_if ppf Clflags.dump_typedtree - Printtyped.implementation_with_coercion - ++ Translmod.transl_implementation modulename - ++ print_if ppf Clflags.dump_rawlambda Printlambda.lambda - ++ Simplif.simplify_lambda - ++ print_if ppf Clflags.dump_lambda Printlambda.lambda - ++ Bytegen.compile_implementation modulename - ++ print_if ppf Clflags.dump_instr Printinstr.instrlist - ++ Emitcode.to_file oc modulename objfile; + if !Clflags.print_types then begin Warnings.check_fatal (); - close_out oc; Stypes.dump (Some (outputprefix ^ ".annot")) - in - try comp (Pparse.parse_implementation ~tool_name ppf sourcefile) - with x -> - close_out oc; - remove_file objfile; - Stypes.dump (Some (outputprefix ^ ".annot")); - raise x - end + end else begin + let bytecode = + (typedtree, coercion) + ++ Translmod.transl_implementation modulename + ++ print_if ppf Clflags.dump_rawlambda Printlambda.lambda + ++ Simplif.simplify_lambda + ++ print_if ppf Clflags.dump_lambda Printlambda.lambda + ++ Bytegen.compile_implementation modulename + ++ print_if ppf Clflags.dump_instr Printinstr.instrlist + in + let objfile = outputprefix ^ ".cmo" in + let oc = open_out_bin objfile in + try + bytecode + ++ Emitcode.to_file oc modulename objfile; + Warnings.check_fatal (); + close_out oc; + Stypes.dump (Some (outputprefix ^ ".annot")) + with x -> + close_out oc; + remove_file objfile; + raise x + end + with x -> + Stypes.dump (Some (outputprefix ^ ".annot")); + raise x let c_file name = Location.input_name := name; diff --git a/driver/main.ml b/driver/main.ml index f8358a0c..e3c59c9e 100644 --- a/driver/main.ml +++ b/driver/main.ml @@ -83,6 +83,7 @@ module Options = Main_args.Make_bytecomp_options (struct let _compat_32 = set bytecode_compatible_32 let _config = show_config let _custom = set custom_runtime + let _no_check_prims = set no_check_prims let _dllib s = dllibs := Misc.rev_split_words s @ !dllibs let _dllpath s = dllpaths := !dllpaths @ [s] let _for_pack s = for_package := Some s @@ -92,6 +93,7 @@ module Options = Main_args.Make_bytecomp_options (struct let _impl = impl let _intf = intf let _intf_suffix s = Config.interface_suffix := s + let _keep_docs = set keep_docs let _keep_locs = set keep_locs let _labels = unset classic let _linkall = set link_everything @@ -106,6 +108,8 @@ module Options = Main_args.Make_bytecomp_options (struct let _o s = output_name := Some s let _open s = open_modules := s :: !open_modules let _output_obj () = output_c_object := true; custom_runtime := true + let _output_complete_obj () = + output_c_object := true; output_complete_object := true; custom_runtime := true let _pack = set make_package let _pp s = preprocessor := Some s let _ppx s = first_ppx := s :: !first_ppx @@ -196,3 +200,7 @@ let main () = exit 2 let _ = main () + + + + diff --git a/driver/main_args.ml b/driver/main_args.ml index 7636abe0..f5d7e316 100644 --- a/driver/main_args.ml +++ b/driver/main_args.ml @@ -126,6 +126,10 @@ let mk_intf_suffix_2 f = "-intf_suffix", Arg.String f, "<string> (deprecated) same as -intf-suffix" ;; +let mk_keep_docs f = + "-keep-docs", Arg.Unit f, " Keep documentation strings in .cmi files" +;; + let mk_keep_locs f = "-keep-locs", Arg.Unit f, " Keep locations in .cmi files" ;; @@ -160,6 +164,10 @@ let mk_no_app_funct f = "-no-app-funct", Arg.Unit f, " Deactivate applicative functors" ;; +let mk_no_check_prims f = + "-no-check-prims", Arg.Unit f, " Do not check runtime for primitives" +;; + let mk_no_float_const_prop f = "-no-float-const-prop", Arg.Unit f, " Deactivate constant propagation for floating-point operations" @@ -214,7 +222,12 @@ let mk_open f = "-open", Arg.String f, "<module> Opens the module <module> before typing" let mk_output_obj f = - "-output-obj", Arg.Unit f, " Output a C object file instead of an executable" + "-output-obj", Arg.Unit f, " Output an object file instead of an executable" +;; + +let mk_output_complete_obj f = + "-output-complete-obj", Arg.Unit f, + " Output an object file, including runtime, instead of an executable" ;; let mk_p f = @@ -516,11 +529,13 @@ module type Compiler_options = sig val _impl : string -> unit val _intf : string -> unit val _intf_suffix : string -> unit + val _keep_docs : unit -> unit val _keep_locs : unit -> unit val _linkall : unit -> unit val _noautolink : unit -> unit val _o : string -> unit val _output_obj : unit -> unit + val _output_complete_obj : unit -> unit val _pack : unit -> unit val _pp : string -> unit val _principal : unit -> unit @@ -541,6 +556,7 @@ module type Bytecomp_options = sig include Compiler_options val _compat_32 : unit -> unit val _custom : unit -> unit + val _no_check_prims : unit -> unit val _dllib : string -> unit val _dllpath : string -> unit val _make_runtime : unit -> unit @@ -642,6 +658,7 @@ struct mk_compat_32 F._compat_32; mk_config F._config; mk_custom F._custom; + mk_custom F._no_check_prims; mk_dllib F._dllib; mk_dllpath F._dllpath; mk_dtypes F._annot; @@ -653,6 +670,7 @@ struct mk_intf F._intf; mk_intf_suffix F._intf_suffix; mk_intf_suffix_2 F._intf_suffix; + mk_keep_docs F._keep_docs; mk_keep_locs F._keep_locs; mk_labels F._labels; mk_linkall F._linkall; @@ -661,6 +679,7 @@ struct mk_modern F._labels; mk_no_alias_deps F._no_alias_deps; mk_no_app_funct F._no_app_funct; + mk_no_check_prims F._no_check_prims; mk_noassert F._noassert; mk_noautolink_byt F._noautolink; mk_nolabels F._nolabels; @@ -668,6 +687,7 @@ struct mk_o F._o; mk_open F._open; mk_output_obj F._output_obj; + mk_output_complete_obj F._output_complete_obj; mk_pack_byt F._pack; mk_pp F._pp; mk_ppx F._ppx; @@ -769,6 +789,7 @@ struct mk_inline F._inline; mk_intf F._intf; mk_intf_suffix F._intf_suffix; + mk_keep_docs F._keep_docs; mk_keep_locs F._keep_locs; mk_labels F._labels; mk_linkall F._linkall; @@ -783,6 +804,7 @@ struct mk_o F._o; mk_open F._open; mk_output_obj F._output_obj; + mk_output_complete_obj F._output_complete_obj; mk_p F._p; mk_pack_opt F._pack; mk_pp F._pp; diff --git a/driver/main_args.mli b/driver/main_args.mli index 18ade80b..ddee921d 100644 --- a/driver/main_args.mli +++ b/driver/main_args.mli @@ -62,11 +62,13 @@ module type Compiler_options = sig val _impl : string -> unit val _intf : string -> unit val _intf_suffix : string -> unit + val _keep_docs : unit -> unit val _keep_locs : unit -> unit val _linkall : unit -> unit val _noautolink : unit -> unit val _o : string -> unit val _output_obj : unit -> unit + val _output_complete_obj : unit -> unit val _pack : unit -> unit val _pp : string -> unit val _principal : unit -> unit @@ -88,6 +90,7 @@ module type Bytecomp_options = sig include Compiler_options val _compat_32 : unit -> unit val _custom : unit -> unit + val _no_check_prims : unit -> unit val _dllib : string -> unit val _dllpath : string -> unit val _make_runtime : unit -> unit diff --git a/driver/optcompile.ml b/driver/optcompile.ml index f0ef78d1..9a5f3b93 100644 --- a/driver/optcompile.ml +++ b/driver/optcompile.ml @@ -66,22 +66,16 @@ let implementation ppf sourcefile outputprefix = let cmxfile = outputprefix ^ ".cmx" in let objfile = outputprefix ^ ext_obj in let comp ast = - if !Clflags.print_types - then + let (typedtree, coercion) = ast ++ print_if ppf Clflags.dump_parsetree Printast.implementation ++ print_if ppf Clflags.dump_source Pprintast.structure ++ Typemod.type_implementation sourcefile outputprefix modulename env ++ print_if ppf Clflags.dump_typedtree - Printtyped.implementation_with_coercion - ++ (fun _ -> ()) - else begin - ast - ++ print_if ppf Clflags.dump_parsetree Printast.implementation - ++ print_if ppf Clflags.dump_source Pprintast.structure - ++ Typemod.type_implementation sourcefile outputprefix modulename env - ++ print_if ppf Clflags.dump_typedtree - Printtyped.implementation_with_coercion + Printtyped.implementation_with_coercion + in + if not !Clflags.print_types then begin + (typedtree, coercion) ++ Translmod.transl_store_implementation modulename +++ print_if ppf Clflags.dump_rawlambda Printlambda.lambda +++ Simplif.simplify_lambda diff --git a/driver/optmain.ml b/driver/optmain.ml index 947d4307..0a680ce4 100644 --- a/driver/optmain.ml +++ b/driver/optmain.ml @@ -90,6 +90,7 @@ module Options = Main_args.Make_optcomp_options (struct let _inline n = inline_threshold := n * 8 let _intf = intf let _intf_suffix s = Config.interface_suffix := s + let _keep_docs = set keep_docs let _keep_locs = set keep_locs let _labels = clear classic let _linkall = set link_everything @@ -104,6 +105,8 @@ module Options = Main_args.Make_optcomp_options (struct let _o s = output_name := Some s let _open s = open_modules := s :: !open_modules let _output_obj = set output_c_object + let _output_complete_obj s = + set output_c_object s; set output_complete_object s let _p = set gprofile let _pack = set make_package let _pp s = preprocessor := Some s diff --git a/driver/pparse.ml b/driver/pparse.ml index 4b2553f2..b67c1805 100644 --- a/driver/pparse.ml +++ b/driver/pparse.ml @@ -20,10 +20,7 @@ exception Error of error (* Optionally preprocess a source file *) -let preprocess sourcefile = - match !Clflags.preprocessor with - None -> sourcefile - | Some pp -> +let call_external_preprocessor sourcefile pp = let tmpfile = Filename.temp_file "ocamlpp" "" in let comm = Printf.sprintf "%s %s > %s" pp (Filename.quote sourcefile) tmpfile @@ -34,6 +31,12 @@ let preprocess sourcefile = end; tmpfile +let preprocess sourcefile = + match !Clflags.preprocessor with + None -> sourcefile + | Some pp -> call_external_preprocessor sourcefile pp + + let remove_preprocessed inputfile = match !Clflags.preprocessor with None -> () @@ -124,7 +127,7 @@ let apply_rewriters ?restore ~tool_name magic ast = exception Outdated_version -let file ppf ~tool_name inputfile parse_fun ast_magic = +let open_and_check_magic inputfile ast_magic = let ic = open_in_bin inputfile in let is_ast_file = try @@ -138,6 +141,10 @@ let file ppf ~tool_name inputfile parse_fun ast_magic = Misc.fatal_error "OCaml and preprocessor have incompatible versions" | _ -> false in + (ic, is_ast_file) + +let file ppf ~tool_name inputfile parse_fun ast_magic = + let (ic, is_ast_file) = open_and_check_magic inputfile ast_magic in let ast = try if is_ast_file then begin @@ -159,6 +166,7 @@ let file ppf ~tool_name inputfile parse_fun ast_magic = close_in ic; apply_rewriters ~restore:false ~tool_name ast_magic ast + let report_error ppf = function | CannotRun cmd -> fprintf ppf "Error while running external preprocessor@.\ diff --git a/driver/pparse.mli b/driver/pparse.mli index bcff4e78..64976989 100644 --- a/driver/pparse.mli +++ b/driver/pparse.mli @@ -34,3 +34,8 @@ val report_error : formatter -> error -> unit val parse_implementation: formatter -> tool_name:string -> string -> Parsetree.structure val parse_interface: formatter -> tool_name:string -> string -> Parsetree.signature + +(* [call_external_preprocessor sourcefile pp] *) +val call_external_preprocessor : string -> string -> string +val open_and_check_magic : string -> string -> in_channel * bool +val read_ast : string -> string -> 'a diff --git a/emacs/caml-types.el b/emacs/caml-types.el index 4bc22665..0af667bd 100644 --- a/emacs/caml-types.el +++ b/emacs/caml-types.el @@ -20,6 +20,18 @@ (require 'caml-emacs))) +(defvar caml-types-build-dirs '("_build" "_obuild") + "List of possible compilation directories created by build systems. +It is expected that the files under `caml-types-build-dir' preserve +the paths relative to the parent directory of `caml-types-build-dir'.") +(make-variable-buffer-local 'caml-types-build-dir) + +(defvar caml-annot-dir nil + "A directory, generally relative to the file location, containing the +.annot file. Intended to be set as a local variable in the .ml file. +See \"Specifying File Variables\" in the Emacs info manual.") +(make-variable-buffer-local 'caml-annot-dir) +(put 'caml-annot-dir 'safe-local-variable #'stringp) (defvar caml-types-location-re nil "Regexp to parse *.annot files. @@ -349,21 +361,36 @@ See `caml-types-location-re' for annotation file format. (defun caml-types-parent-dir (d) (file-name-directory (directory-file-name d))) (defun caml-types-locate-type-file (target-path) - (let ((sibling (concat (file-name-sans-extension target-path) ".annot"))) - (if (file-exists-p sibling) - sibling - (let ((project-dir (file-name-directory sibling)) - type-path) - (while (not (file-exists-p - (setq type-path - (expand-file-name - (file-relative-name sibling project-dir) - (expand-file-name "_build" project-dir))))) - (if (equal project-dir (caml-types-parent-dir project-dir)) - (error (concat "No annotation file. " - "You should compile with option \"-annot\"."))) - (setq project-dir (caml-types-parent-dir project-dir))) - type-path)))) + "Given the path to an OCaml file, this function tries to locate +and return the corresponding .annot file." + (let ((sibling (concat (file-name-sans-extension target-path) ".annot"))) + (if (file-exists-p sibling) + sibling + (let* ((dir (file-name-directory sibling))) + (if caml-annot-dir + ;; Use the relative path set by the user + (let* ((annot-dir (expand-file-name caml-annot-dir dir)) + (fname (file-name-nondirectory sibling)) + (path-fname (expand-file-name fname annot-dir))) + (if (file-exists-p path-fname) + path-fname + (error (concat "No annotation file in " caml-annot-dir + ". Compile with option \"-annot\".")))) + ;; Else, try to get the .annot from one of build dirs. + (let* ((is-build (regexp-opt caml-types-build-dirs)) + (project-dir (locate-dominating-file + dir + (lambda(d) (directory-files d nil is-build)))) + (annot + (if project-dir + (locate-file + (file-relative-name sibling project-dir) + (mapcar (lambda(d) (expand-file-name d project-dir)) + caml-types-build-dirs))))) + (if annot + annot + (error (concat "No annotation file. Compile with option " + "\"-annot\" or set `caml-annot-dir'."))))))))) (defun caml-types-date< (date1 date2) (or (< (car date1) (car date2)) diff --git a/experimental/doligez/check-bounds.diff b/experimental/doligez/check-bounds.diff new file mode 100644 index 00000000..c2e07952 --- /dev/null +++ b/experimental/doligez/check-bounds.diff @@ -0,0 +1,149 @@ +Patch taken from: + https://github.com/mshinwell/ocaml/commits/4.02-block-bounds + +diff --git a/asmcomp/cmmgen.ml b/asmcomp/cmmgen.ml +index 01eff9c..b498b58 100644 +--- a/asmcomp/cmmgen.ml ++++ b/asmcomp/cmmgen.ml +@@ -22,6 +22,13 @@ open Clambda + open Cmm + open Cmx_format + ++let do_check_field_access = true ++(* ++ match try Some (Sys.getenv "BOUNDS") with Not_found -> None with ++ | None | Some "" -> false ++ | Some _ -> true ++*) ++ + (* Local binding of complex expressions *) + + let bind name arg fn = +@@ -494,6 +501,35 @@ let get_tag ptr = + let get_size ptr = + Cop(Clsr, [header ptr; Cconst_int 10]) + ++(* Bounds checks upon field access, for debugging the compiler *) ++ ++let check_field_access ptr field_index if_success = ++ if not do_check_field_access then ++ if_success ++ else ++ let field_index = Cconst_int field_index in ++ (* If [ptr] points at an infix header, we need to move it back to the "main" ++ [Closure_tag] header. *) ++ let ptr = ++ Cifthenelse (Cop (Ccmpi Cne, [get_tag ptr; Cconst_int Obj.infix_tag]), ++ ptr, ++ Cop (Csuba, [ptr; ++ Cop (Cmuli, [get_size ptr (* == Infix_offset_val(ptr) *); ++ Cconst_int size_addr])])) ++ in ++ let not_too_small = Cop (Ccmpi Cge, [field_index; Cconst_int 0]) in ++ let not_too_big = Cop (Ccmpi Clt, [field_index; get_size ptr]) in ++ let failure = ++ Cop (Cextcall ("caml_field_access_out_of_bounds_error", typ_addr, false, ++ Debuginfo.none), ++ [ptr; field_index]) ++ in ++ Cifthenelse (not_too_small, ++ Cifthenelse (not_too_big, ++ if_success, ++ failure), ++ failure) ++ + (* Array indexing *) + + let log2_size_addr = Misc.log2 size_addr +@@ -1550,13 +1586,18 @@ and transl_prim_1 p arg dbg = + return_unit(remove_unit (transl arg)) + (* Heap operations *) + | Pfield n -> +- get_field (transl arg) n ++ let ptr = transl arg in ++ let body = get_field ptr n in ++ check_field_access ptr n body + | Pfloatfield n -> + let ptr = transl arg in +- box_float( +- Cop(Cload Double_u, +- [if n = 0 then ptr +- else Cop(Cadda, [ptr; Cconst_int(n * size_float)])])) ++ let body = ++ box_float( ++ Cop(Cload Double_u, ++ [if n = 0 then ptr ++ else Cop(Cadda, [ptr; Cconst_int(n * size_float)])])) ++ in ++ check_field_access ptr n body + | Pint_as_pointer -> + Cop(Cadda, [transl arg; Cconst_int (-1)]) + (* Exceptions *) +@@ -1649,20 +1690,25 @@ and transl_prim_1 p arg dbg = + and transl_prim_2 p arg1 arg2 dbg = + match p with + (* Heap operations *) +- Psetfield(n, ptr) -> +- if ptr then +- return_unit(Cop(Cextcall("caml_modify", typ_void, false,Debuginfo.none), +- [field_address (transl arg1) n; transl arg2])) +- else +- return_unit(set_field (transl arg1) n (transl arg2)) ++ Psetfield(n, is_ptr) -> ++ let ptr = transl arg1 in ++ let body = ++ if is_ptr then ++ Cop(Cextcall("caml_modify", typ_void, false,Debuginfo.none), ++ [field_address ptr n; transl arg2]) ++ else ++ set_field ptr n (transl arg2) ++ in ++ check_field_access ptr n (return_unit body) + | Psetfloatfield n -> + let ptr = transl arg1 in +- return_unit( ++ let body = + Cop(Cstore Double_u, + [if n = 0 then ptr + else Cop(Cadda, [ptr; Cconst_int(n * size_float)]); +- transl_unbox_float arg2])) +- ++ transl_unbox_float arg2]) ++ in ++ check_field_access ptr n (return_unit body) + (* Boolean operations *) + | Psequand -> + Cifthenelse(test_bool(transl arg1), transl arg2, Cconst_int 1) +diff --git a/asmrun/fail.c b/asmrun/fail.c +index cb2c1cb..4f67c74 100644 +--- a/asmrun/fail.c ++++ b/asmrun/fail.c +@@ -15,6 +15,7 @@ + + #include <stdio.h> + #include <signal.h> ++#include <assert.h> + #include "alloc.h" + #include "fail.h" + #include "io.h" +@@ -180,3 +181,20 @@ int caml_is_special_exception(value exn) { + || exn == (value) caml_exn_Assert_failure + || exn == (value) caml_exn_Undefined_recursive_module; + } ++ ++void caml_field_access_out_of_bounds_error(value v_block, intnat index) ++{ ++ assert(Is_block(v_block)); ++ fprintf(stderr, "Fatal error: out-of-bounds access to field %ld ", index); ++ fprintf(stderr, "of block at %p (%s, size %ld, tag %d)\n", ++ (void*) v_block, ++ Is_young(v_block) ? "in minor heap" ++ : Is_in_heap(v_block) ? "in major heap" ++ : Is_in_value_area(v_block) ? "in static data" ++ : "out-of-heap", ++ (long) Wosize_val(v_block), (int) Tag_val(v_block)); ++ fflush(stderr); ++ /* This error may have occurred in places where it is not reasonable to ++ attempt to continue. */ ++ abort(); ++} diff --git a/experimental/doligez/checkheaders b/experimental/doligez/checkheaders new file mode 100755 index 00000000..5de15329 --- /dev/null +++ b/experimental/doligez/checkheaders @@ -0,0 +1,152 @@ +#!/bin/sh + +####################################################################### +# # +# OCaml # +# # +# Damien Doligez, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2011 Institut National de Recherche en Informatique et # +# en Automatique. All rights reserved. This file is distributed # +# under the terms of the Q Public License version 1.0. # +# # +####################################################################### + +( +case $# in + 0) find . -type f -print;; + *) echo $1;; +esac +) | \ +while read f; do +awk -f - "$f" <<\EOF + +function checkline (x) { + return ( $0 ~ ("^.{0,4}" x) ); +} + +function hrule () { + return (checkline("[*#]{69}")); +} + +function blank () { + return (checkline(" {69}")); +} + +function ocaml () { + return (checkline(" {32}OCaml {32}") \ + || checkline(" {35}OCaml {32}") \ + || checkline(" ocamlbuild ") \ + || checkline(" OCamldoc ") \ + ); +} + +function any () { + return (checkline(".{69}")); +} + +function copy1 () { + return (checkline(" Copyright +[-0-9]+ +Institut +National +de +Recherche +en +Informatique +et ")); +} + +function copy2 () { + return (checkline(" en Automatique")); +} + +function err () { + printf ("File \"%s\", line %d:\n", FILENAME, FNR); + printf (" Error: line %d of header is wrong.\n", FNR + offset); + print $0; +} + +function add_ignore_re (x) { + ignore_re[++ignore_re_index] = x; +} + +function add_exception (x) { + exception[++exception_index] = x; +} + +FNR == 1 { + offset = 0; + add_ignore_re("/\\.svn/"); + add_ignore_re("/\\.depend(\\.nt)?$"); + add_ignore_re("/\\.ignore$"); + add_ignore_re("\\.gif$"); + add_ignore_re("/[A-Z]*$"); + add_ignore_re("/README\\.[^/]*$"); + add_ignore_re("/Changes$"); + add_ignore_re("\\.mlpack$"); + add_ignore_re("\\.mllib$"); + add_ignore_re("\\.mltop$"); + add_ignore_re("\\.clib$"); + add_ignore_re("\\.odocl$"); + add_ignore_re("\\.itarget$"); + add_ignore_re("^\\./boot/"); + add_ignore_re("^\\./camlp4/test/"); + add_ignore_re("^\\./camlp4/unmaintained/"); + add_ignore_re("^\\./config/gnu/"); + add_ignore_re("^\\./experimental/"); + add_ignore_re("^\\./ocamlbuild/examples/"); + add_ignore_re("^\\./ocamlbuild/test/"); + add_ignore_re("^\\./testsuite/"); + for (i in ignore_re){ + if (FILENAME ~ ignore_re[i]) { nextfile; } + } + add_exception("./asmrun/m68k.S"); # obsolete + add_exception("./build/camlp4-bootstrap-recipe.txt"); + add_exception("./build/new-build-system"); + add_exception("./ocamlbuild/ChangeLog"); + add_exception("./ocamlbuild/manual/myocamlbuild.ml"); # TeX input file ? + add_exception("./ocamlbuild/manual/trace.out"); # TeX input file + add_exception("./ocamldoc/Changes.txt"); + add_exception("./ocamldoc/ocamldoc.sty"); # public domain + add_exception("./tools/objinfo_helper.c"); # non-INRIA + add_exception("./tools/magic"); # public domain ? + add_exception("./Upgrading"); + add_exception("./win32caml/inriares.h"); # generated + add_exception("./win32caml/ocaml.rc"); # generated + add_exception("./win32caml/resource.h"); # generated + for (i in exception){ + if (FILENAME == exception[i]) { nextfile; } + } +} + +# 1 [!hrule] #! +# 2 [!hrule] empty +# 3 hrule +# 4 [blank] +# 5 ocaml title +# 6 blank +# 7 any author +# 8 [!blank] author +# 9 [!blank] author +#10 blank +#11 copy1 copyright +#12 copy2 copyright +#13 any copyright +#14 [!blank] copyright +#15 [!blank] copyright +#16 blank +#17 hrule + +FNR + offset == 1 && hrule() { ++offset; } +FNR + offset == 2 && hrule() { ++offset; } +FNR + offset == 3 && ! hrule() { err(); nextfile; } +FNR + offset == 4 && ! blank() { ++offset; } +FNR + offset == 5 && ! ocaml() { err(); nextfile; } +FNR + offset == 6 && ! blank() { err(); nextfile; } +FNR + offset == 7 && ! any() { err(); nextfile; } +FNR + offset == 8 && blank() { ++offset; } +FNR + offset == 9 && blank() { ++offset; } +FNR + offset ==10 && ! blank() { err(); nextfile; } +FNR + offset ==11 && ! copy1() { err(); nextfile; } +FNR + offset ==12 && ! copy2() { err(); nextfile; } +FNR + offset ==13 && ! any() { err(); nextfile; } +FNR + offset ==14 && blank() { ++offset; } +FNR + offset ==15 && blank() { ++offset; } +FNR + offset ==16 && ! blank() { err(); nextfile; } +FNR + offset ==17 && ! hrule() { err(); nextfile; } + +EOF +done diff --git a/experimental/frisch/Makefile b/experimental/frisch/Makefile new file mode 100644 index 00000000..89de11f0 --- /dev/null +++ b/experimental/frisch/Makefile @@ -0,0 +1,79 @@ +ROOT=../.. +OCAMLC=$(ROOT)/boot/ocamlrun $(ROOT)/ocamlc -I $(ROOT)/stdlib -I $(ROOT)/parsing -I $(ROOT)/utils -I $(ROOT)/tools -I $(ROOT)/typing -I $(ROOT)/driver -I $(ROOT)/toplevel -w A-4-9-42 +COMMON=$(ROOT)/compilerlibs/ocamlcommon.cma +BYTECMP=$(ROOT)/compilerlibs/ocamlbytecomp.cma +TOPLVL=$(ROOT)/compilerlibs/ocamltoplevel.cma + +clean: + rm -f *.exe *.cm* *~ + +## Detecting unused exported values + +.PHONY: unused_exported_values +unused_exported_values: + $(OCAMLC) -o unused_exported_values.exe $(COMMON) $(ROOT)/tools/tast_iter.cmo unused_exported_values.ml + + +## Conditional compilation based on environment variables + +.PHONY: ifdef +ifdef: + $(OCAMLC) -o ifdef.exe $(COMMON) ifdef.ml + $(OCAMLC) -o test_ifdef.exe -ppx ./ifdef.exe -dsource test_ifdef.ml + ./test_ifdef.exe + +## A proposal for replacing js_of_ocaml Camlp4 syntax extension with +## a -ppx filter + +.PHONY: js_syntax +js_syntax: + $(OCAMLC) -o js_syntax.exe $(COMMON) js_syntax.ml + $(OCAMLC) -o test_ifdef.exe -i -ppx ./js_syntax.exe test_js.ml + + +## A "toy" ocamldoc clone based on .cmti files + +.PHONY: minidoc +minidoc: + $(OCAMLC) -custom -o minidoc.exe $(COMMON) minidoc.ml + $(OCAMLC) -c -bin-annot testdoc.mli + ./minidoc.exe testdoc.cmti + +## Using the OCaml toplevel to evaluate expression during compilation + +.PHONY: eval +eval: + $(OCAMLC) -linkall -o eval.exe $(COMMON) $(BYTECMP) $(TOPLVL) eval.ml + $(OCAMLC) -o test_eval.exe -ppx ./eval.exe test_eval.ml + ./test_eval.exe + +## Example of code generation based on type declarations + +.PHONY: ppx_builder +ppx_builder: + $(OCAMLC) -linkall -o ppx_builder.exe $(COMMON) ppx_builder.ml + $(OCAMLC) -o test_builder.exe -ppx ./ppx_builder.exe -dsource test_builder.ml + +## Import type definitions from other source files (e.g. to avoid code +## duplication between the .ml and .mli files) + +.PHONY: copy_typedef +copy_typedef: + $(OCAMLC) -linkall -o copy_typedef.exe $(COMMON) copy_typedef.ml + $(OCAMLC) -c -ppx ./copy_typedef.exe test_copy_typedef.mli + $(OCAMLC) -o test_copy_typedef.exe -ppx ./copy_typedef.exe -dsource test_copy_typedef.ml + + +## Create mli files from ml files + +.PHONY: nomli +nomli: + $(OCAMLC) -linkall -o nomli.exe $(COMMON) $(BYTECMP) ../../tools/untypeast.cmo ../../tools/tast_iter.cmo nomli.ml + ./nomli.exe test_nomli.ml + +## A port of pa_matches + +.PHONY: matches +matches: + $(OCAMLC) -linkall -o ppx_matches.exe $(COMMON) ppx_matches.ml + $(OCAMLC) -c -dsource -ppx ./ppx_matches.exe test_matches.ml diff --git a/experimental/frisch/copy_typedef.ml b/experimental/frisch/copy_typedef.ml new file mode 100644 index 00000000..baf52de4 --- /dev/null +++ b/experimental/frisch/copy_typedef.ml @@ -0,0 +1,181 @@ +(* + A -ppx rewriter to copy type definitions from the interface into + the implementation. + + In an .ml file, you can write: + + type t = [%copy_typedef] + + and the concrete definition will be copied from the corresponding .mli + file (looking for the type name in the same path). + + The same is available for module types: + + module type S = [%copy_typedef] + + You can also import a definition from an arbitrary .ml/.mli file. + Example: + + type loc = [%copy_typedef "../../parsing/location.mli" t] + + Note: the definitions are imported textually without any substitution. +*) + +module Main : sig end = struct + open Asttypes + open! Location + open Parsetree + + let fatal loc s = + Location.print_error Format.err_formatter loc; + prerr_endline ("** copy_typedef: " ^ Printexc.to_string s); + exit 2 + + class maintain_path = object(this) + inherit Ast_mapper.mapper as super + + val path = [] + + method! module_binding m = {< path = m.pmb_name.txt :: path >} # super_module_binding m + method super_module_binding = super # module_binding + + method! module_declaration m = {< path = m.pmd_name.txt :: path >} # super_module_declaration m + method super_module_declaration = super # module_declaration + + method! module_type_declaration m = {< path = m.pmtd_name.txt :: path >} # super_module_type_declaration m + method super_module_type_declaration = super # module_type_declaration + + method! structure_item s = + let s = + match s.pstr_desc with + | Pstr_type tdecls -> {s with pstr_desc=Pstr_type (List.map (this # tydecl) tdecls)} + | Pstr_modtype mtd -> {s with pstr_desc=Pstr_modtype (this # mtydecl mtd)} + | _ -> s + in + super # structure_item s + + method! signature_item s = + let s = + match s.psig_desc with + | Psig_type tdecls -> {s with psig_desc=Psig_type (List.map (this # tydecl) tdecls)} + | Psig_modtype mtd -> {s with psig_desc=Psig_modtype (this # mtydecl mtd)} + | _ -> s + in + super # signature_item s + + method tydecl x = x + method mtydecl x = x + end + + let memoize f = + let h = Hashtbl.create 16 in + fun x -> + try Hashtbl.find h x + with Not_found -> + let r = f x in + Hashtbl.add h x r; + r + + let from_file file = + let types = Hashtbl.create 16 in + let mtypes = Hashtbl.create 16 in + let collect = object + inherit maintain_path + method! tydecl x = + Hashtbl.add types (path, x.ptype_name.txt) x; + x + method! mtydecl x = + Hashtbl.add mtypes (path, x.pmtd_name.txt) x; + x + end + in + let ic = open_in file in + let lexbuf = Lexing.from_channel ic in + if Filename.check_suffix file ".ml" + then ignore (collect # structure (Parse.implementation lexbuf)) + else if Filename.check_suffix file ".mli" + then ignore (collect # signature (Parse.interface lexbuf)) + else failwith (Printf.sprintf "Unknown extension for %s" file); + close_in ic; + object + method tydecl path name = + try Hashtbl.find types (path, name) + with Not_found -> + failwith + (Printf.sprintf "Cannot find type %s in file %s\n%!" + (String.concat "." (List.rev (name :: path))) file) + + method mtydecl path name = + try Hashtbl.find mtypes (path, name) + with Not_found -> + failwith + (Printf.sprintf "Cannot find module type %s in file %s\n%!" + (String.concat "." (List.rev (name :: path))) file) + end + + let from_file = memoize from_file + + let copy = object(this) + inherit maintain_path as super + + val mutable file = "" + + method source name = function + | PStr [] -> + let file = + if Filename.check_suffix file ".ml" + then (Filename.chop_suffix file ".ml") ^ ".mli" + else if Filename.check_suffix file ".mli" + then (Filename.chop_suffix file ".mli") ^ ".ml" + else failwith "Unknown source extension" + in + file, path, name + | PStr [{pstr_desc=Pstr_eval + ({pexp_desc=Pexp_apply + ({pexp_desc=Pexp_constant(Const_string (file, _)); _}, + ["", {pexp_desc=Pexp_ident{txt=lid;_}; _}]); _}, _); _}] -> + begin match List.rev (Longident.flatten lid) with + | [] -> assert false + | name :: path -> file, path, name + end + | _ -> + failwith "Cannot parse argument" + + method! tydecl = function + | {ptype_kind = Ptype_abstract; + ptype_manifest = + Some{ptyp_desc=Ptyp_extension({txt="copy_typedef";_}, arg); _}; + ptype_name = name; ptype_loc = loc; _ + } -> + begin try + let (file, path, x) = this # source name.txt arg in + {((from_file file) # tydecl path x) + with ptype_name = name; ptype_loc = loc} + with exn -> fatal loc exn + end + | td -> td + + method! mtydecl = function + | {pmtd_type = Some{pmty_desc=Pmty_extension({txt="copy_typedef";_}, arg); + pmty_loc=loc; _}; + pmtd_name = name; _ + } -> + begin try + let (file, path, x) = this # source name.txt arg in + {((from_file file) # mtydecl path x) + with pmtd_name = name} + with exn -> fatal loc exn + end + | td -> td + + method! implementation f x = + file <- f; + super # implementation f x + + method! interface f x = + file <- f; + super # interface f x + end + + let () = Ast_mapper.main copy +end diff --git a/experimental/frisch/eval.ml b/experimental/frisch/eval.ml new file mode 100644 index 00000000..3940b7ea --- /dev/null +++ b/experimental/frisch/eval.ml @@ -0,0 +1,141 @@ +(* A -ppx rewriter which evaluates expressions at compile-time, + using the OCaml toplevel interpreter. + + The following extensions are supported: + + [%eval e] in expression context: the expression e will be evaluated + at compile time, and the resulting value will be inserted as a + constant literal. + + [%%eval.start] as a structure item: forthcoming structure items + until the next [%%eval.stop] will be evaluated at compile time (the + result is ignored) only. + + [%%eval.start both] as a structure item: forthcoming structure + items until the next [%%eval.stop] will be evaluated at compile + time (the result is ignored), but also kept in the compiled unit. + + [%%eval.load "..."] as a structure item: load the specified + .cmo unit or .cma library, so that it can be used in the forthcoming + compile-time components. +*) + + +module Main : sig end = struct + + open Location + open Parsetree + open Ast_helper + open Outcometree + open Ast_helper.Convenience + + let rec lid_of_out_ident = function + | Oide_apply _ -> assert false + | Oide_dot (x, s) -> lid_of_out_ident x ^ "." ^ s + | Oide_ident s -> s + + let rec exp_of_out_value = function + | Oval_string x -> str x + | Oval_int x -> int x + | Oval_char x -> char x + | Oval_float x -> Ast_helper.Convenience.float x + | Oval_list l -> list (List.map exp_of_out_value l) + | Oval_array l -> Exp.array (List.map exp_of_out_value l) + | Oval_constr (c, args) -> constr (lid_of_out_ident c) (List.map exp_of_out_value args) + | Oval_record l -> + record + (List.map + (fun (s, v) -> lid_of_out_ident s, exp_of_out_value v) l) + | v -> + Format.eprintf "[%%eval] cannot map value to expression:@.%a@." + !Toploop.print_out_value + v; + exit 2 + + let empty_str_item = Str.include_ (Mod.structure []) + + let run phr = + try Toploop.execute_phrase true Format.err_formatter phr + with exn -> + Errors.report_error Format.err_formatter exn; + exit 2 + + let get_exp loc = function + | PStr [ {pstr_desc=Pstr_eval (e, _); _} ] -> e + | _ -> + Format.eprintf "%aExpression expected@." + Location.print_error loc; + exit 2 + + let eval _args = + let open Ast_mapper in + let eval_str_items = ref None in + let super = default_mapper in + let my_structure_item this i = + match i.pstr_desc with + | Pstr_extension(({txt="eval.load";loc}, e0), _) -> + let e0 = get_exp loc e0 in + let s = + match get_str e0 with + | Some s -> s + | None -> + Location.print_error Format.err_formatter e0.pexp_loc; + Format.eprintf "string literal expected"; + exit 2 + in + if not (Topdirs.load_file Format.err_formatter s) then begin + Location.print Format.err_formatter e0.pexp_loc; + exit 2; + end; + empty_str_item + | Pstr_extension(({txt="eval.start";_}, + PStr [{pstr_desc=Pstr_eval (e, _);_}] + ), _) when get_lid e = Some "both" -> + eval_str_items := Some true; + empty_str_item + | Pstr_extension(({txt="eval.start";_}, PStr []), _) -> + eval_str_items := Some false; + empty_str_item + | Pstr_extension(({txt="eval.stop";_}, PStr []), _) -> + eval_str_items := None; + empty_str_item + | _ -> + let s = super.structure_item this i in + match !eval_str_items with + | None -> s + | Some both -> + if not (run (Ptop_def [s])) then begin + Location.print_error Format.err_formatter s.pstr_loc; + Format.eprintf "this structure item raised an exception@."; + exit 2 + end; + if both then s else empty_str_item + in + let my_expr this e = + match e.pexp_desc with + | Pexp_extension({txt="eval";loc}, e0) -> + let e0 = get_exp loc e0 in + let last_result = ref None in + let pop = !Toploop.print_out_phrase in + Toploop.print_out_phrase := begin fun _ppf -> function + | Ophr_eval (v, _) -> last_result := Some v + | r -> + Location.print_error Format.err_formatter e.pexp_loc; + Format.eprintf "error while evaluating expression:@.%a@." + pop + r; + exit 2 + end; + assert (run (Ptop_def [Str.eval e0])); + Toploop.print_out_phrase := pop; + let v = match !last_result with None -> assert false | Some v -> v in + with_default_loc e0.pexp_loc (fun () -> exp_of_out_value v) + | _ -> + super.expr this e + in + Toploop.initialize_toplevel_env (); + {super with expr = my_expr; structure_item = my_structure_item} + + + let () = Ast_mapper.run_main eval +end diff --git a/experimental/frisch/extension_points.txt b/experimental/frisch/extension_points.txt new file mode 100644 index 00000000..f9d4e774 --- /dev/null +++ b/experimental/frisch/extension_points.txt @@ -0,0 +1,740 @@ +This file describes the changes on the extension_points branch. + + +=== Attributes + +Attributes are "decorations" of the syntax tree which are ignored by +the type-checker. An attribute is made of an identifier (written id below) +and a payload (written s below). + + * The identifier 'id' can be a lowercase or uppercase identifier + (including OCaml keywords) or a sequence of such atomic identifiers + separated with a dots (whitespaces are allowed around the dots). + In the Parsetree, the identifier is represented as a single string + (without spaces). + + * The payload 's' can be one of three things: + + - An OCaml structure (i.e. a list of structure items). Note that a + structure can be empty or reduced to a single expression. + + [@id] + [@id x + 3] + [@id type t = int] + + - A type expression, prefixed with the ":" character. + + [@id : TYP] + + - A pattern, prefixed with the "?" character, and optionally followed + by a "when" clause: + + [@id ? PAT] + [@id ? PAT when EXPR] + + +Attributes on expressions, type expressions, module expressions, module type expressions, +patterns, class expressions, class type expressions: + + ... [@id s] + +The same syntax [@id s] is also available to add attributes on +constructors and labels in type declarations: + + type t = + | A [@id1] + | B [@id2] of int [@id3] + +Here, id1 (resp. id2) is attached to the constructor A (resp. B) +and id3 is attached to the int type expression. Example on records: + + type t = + { + x [@id1]: int; + mutable y [@id2] [@id3]: string [@id4]; + } + + +Attributes on items: + + ... [@@id s] + + Items designate: + - structure and signature items (for type declarations, recursive modules, class + declarations and class type declarations, each component has its own attributes) + - class fields and class type fields + - each binding in a let declaration (for let structure item, local let-bindings in + expression and class expressions) + + For instance, consider: + + type t1 = ... [@@id1] [@@id2] and t2 = ... [@@id3] [@@id4] + + Here, the attributes on t1 are id1, id23; the attributes on + t2 are id3 and id4. + + Similarly for: + + let x1 = ... [@@id1] [@@id2] and x2 = ... [@@id3] [@@id4] + + +Floating attributes: + + The [@@@id s] form defines an attribute which stands as a + stand-alone signature or structure item (not attached to another + item). + + Example: + + module type S = sig + [@@id1] + type t + [@@id2] + [@@@id3] [@@@id4] + [@@@id5] + type s + [@@id6] + end + + Here, id1, id3, id4, id5 are floating attributes, while + id2 is attached to the type t and id6 is attached to the type s. + +=== Extension nodes + +Extension nodes replace valid components in the syntax tree. They are +normally interpreted and expanded by AST mapper. The type-checker +fails when it encounters such an extension node. An extension node is +made of an identifier (an "LIDENT", written id below) and an optional +expression (written expr below). + +Two syntaxes exist for extension node: + +As expressions, type expressions, module expressions, module type expressions, +patterns, class expressions, class type expressions: + + [%id s] + +As structure item, signature item, class field, class type field: + + [%%id s] + +As other structure item, signature item, class field or class type +field, attributes can be attached to a [%%id s] extension node. + + + +=== Alternative syntax for attributes and extensions on specific kinds of nodes + +All expression constructions starting with a keyword (EXPR = KW REST) support an +alternative syntax for attributes and/or extensions: + + KW[@id s]...[@id s] REST + ----> + EXPR[@id s]...[@id s] + + KW%id REST + ----> + [%id EXPR] + + KW%id[@id s]...[@id s] REST + ----> + [%id EXPR[@id s]...[@id s]] + + +where KW can stand for: + assert + begin + for + fun + function + if + lazy + let + let module + let open + match + new + object + try + while + + +For instance: + +let[@foo] x = 2 in x + 1 ==== (let x = 2 in x + 1)[@foo] +begin[@foo] ... end ==== (begin ... end)[@foo] +match%foo e with ... ==== [%foo match e with ...] + + +The let-binding form of structure items also supports this form: + +let%foo x = ... ==== [%%foo let x = ...] + +=== Quoted strings + +Quoted strings gives a different syntax to write string literals in +OCaml code. This will typically be used to support embedding pieces +of foreign syntax fragments (to be interpret by a -ppx filter or just +a library) in OCaml code. + +The opening delimiter has the form {id| where id is a (possibly empty) +sequence of lowercase letters. The corresponding closing delimiter is +|id} (the same identifier). Contrary to regular OCaml string +literals, quoted strings don't interpret any character in a special +way. + +Example: + +String.length {|\"|} (* returns 2 *) +String.length {foo|\"|foo} (* returns 2 *) + + +The fact that a string literal comes from a quoted string is kept in +the Parsetree representation. The Astypes.Const_string constructor is +now defined as: + + | Const_string of string * string option + +where the "string option" represents the delimiter (None for a string +literal with the regular syntax). + + +=== Representation of attributes in the Parsetree + +Attributes as standalone signature/structure items are represented +by a new constructor: + + | Psig_attribute of attribute + | Pstr_attribute of attribute + +Most other attributes are stored in an extra field in their record: + +and expression = { + ... + pexp_attributes: attribute list; + ... +} +and type_declaration = { + ... + ptype_attributes: attribute list; + ... +} + +In a previous version, attributes on expressions (and types, patterns, +etc) used to be stored as a new constructor. The current choice makes +it easier to pattern match on structured AST fragments while ignoring +attributes. + +For open/include signature/structure items and exception rebind +structure item, the attributes are stored directly in the constructor +of the item: + + | Pstr_open of Longident.t loc * attribute list + + +=== Attributes in the Typedtree + +The Typedtree representation has been updated to follow closely the +Parsetree, and attributes are kept exactly as in the Parsetree. This +can allow external tools to process .cmt/.cmti files and process +attributes in them. An example of a mini-ocamldoc based on this +technique is in experimental/frisch/minidoc.ml. + + +=== Other changes to the parser and Parsetree + +--- Introducing Ast_helper module + +This module simplifies the creation of AST fragments, without having to +touch the concrete type definitions of Parsetree. Record and sum types +are encapsulated in builder functions, with some optional arguments, e.g. +to represent attributes. + +--- Relaxing the syntax for signatures and structures + +It is now possible to start a signature or a structure with a ";;" token and to have two successive ";;" tokens. + +Rationale: + In an intermediate version of this branch, floating attributes shared + the same syntax as item attributes, with the constraints that they + had to appear either at the beginning of their structure or signature, + or after ";;". The relaxation above made is possible to always prefix + a floating attributes by ";;" independently of its context. + + Floating attributes now have a custom syntax [@@@id], but this changes + is harmless, and the same argument holds for toplevel expressions: + it is always possile to write: + + ;; print_endline "bla";; + + without having to care about whether the previous structure item + ends with ";;" or not. + + +-- Relaxing the syntax for exception declarations + +The parser now accepts the same syntax for exceptioon declarations as for constructor declarations, +which permits the GADT syntax: + + exception A : int -> foo + +The type-checker rejects this form. Note that it is also possible to +define exception whose name is () or ::. + +Attributes can be put on the constructor or on the whole declaration: + + exception A[@foo] of int [@@bar] + +Rationale: + One less notion in the Parsetree, more uniform parsing. Also + open the door to existentials in exception constructors. + +--- Relaxing the syntax for recursive modules + +Before: + module X1 : MT1 = M1 and ... and Xn : MTn = Mn + +Now: + module X1 = M1 and ... and Xn = Mn + (with the usual sugar that Xi = (Mi : MTi) can be written as Xi : MTi = Mi + which gives the old syntax) + + The type-checker fails when a module expression is not of + the form (M : MT) + + +Rationale: + +1. More uniform representation in the Parsetree. + +2. The type-checker can be made more clever in the future to support + other forms of module expressions (e.g. functions with an explicit + constraint on its result; or a structure with only type-level + components). + + +--- Turning some tuple or n-ary constructors into records + +Before: + + | Pstr_module of string loc * module_expr + +After: + + | Pstr_module of module_binding +... + and module_binding = + { + pmb_name: string loc; + pmb_expr: module_expr; + pmb_attributes: attribute list; + } + + + +Rationale: + +More self-documented, more robust to future additions (such as +attributes), simplifies some code. + + +--- Keeping names inside value_description and type_declaration + +Before: + + | Psig_type of (string loc * type_declaration) list + + +After: + + | Psig_type of type_declaration list + +.... +and type_declaration = + { ptype_name: string loc; + ... + } + +Rationale: + +More self-documented, simplifies some code. + + +--- Better representation of variance information on type parameters + +Introduced a new type Asttypes.variance to represent variance +(Covariant/Contravariant/Invariant) and use it instead of bool * bool +in Parsetree. Moreover, variance information is now attached +directly to the parameters fields: + + and type_declaration = + { ptype_name: string loc; +- ptype_params: string loc option list; ++ ptype_params: (string loc option * variance) list; + ptype_cstrs: (core_type * core_type * Location.t) list; + ptype_kind: type_kind; + ptype_private: private_flag; + ptype_manifest: core_type option; +- ptype_variance: (bool * bool) list; + ptype_attributes: attribute list; + ptype_loc: Location.t } + + +--- Getting rid of 'Default' case in Astypes.rec_flag + +This constructor was used internally only during the compilation of +default expression for optional arguments, in order to trigger a +subsequent optimization (see PR#5975). This behavior is now +implemented by creating an attribute internally (whose name "#default" +cannot be used in real programs). + +Rationale: + + - Attributes give a way to encode information local to the + type-checker without polluting the definition of the Parsetree. + +--- Simpler and more faithful representation of object types + +- | Ptyp_object of core_field_type list ++ | Ptyp_object of (string * core_type) list * closed_flag + +(and get rid of Parsetree.core_field_type) + +And same in the Typedtree. + +Rationale: + + - More faithful representation of the syntax really supported + (i.e. the ".." can only be the last field). + - One less "concept" in the Parsetree. + + +--- Do not require empty Ptyp_poly nodes in the Parsetree + +The type-checker automatically inserts Ptyp_poly node (with no +variable) where needed. It is still allowed to put empty +Ptyp_poly nodes in the Parsetree. + +Rationale: + + - Less chance that Ast-related code forget to insert those nodes. + +To be discussed: should we segrate simple_poly_type from core_type in the +Parsetree to prevent Ptyp_poly nodes to be inserted in the wrong place? + + +--- Use constructor names closer to concrete syntax + +E.g. Pcf_cstr -> Pcf_constraint. + +Rationale: + + - Make the Parsetree more self-documented. + +--- Merge concrete/virtual val and method constructors + +As in the Typedtree. + +- | Pcf_valvirt of (string loc * mutable_flag * core_type) +- | Pcf_val of (string loc * mutable_flag * override_flag * expression) +- | Pcf_virt of (string loc * private_flag * core_type) +- | Pcf_meth of (string loc * private_flag * override_flag * expression) ++ | Pcf_val of (string loc * mutable_flag * class_field_kind) ++ | Pcf_method of (string loc * private_flag * class_field_kind +... ++and class_field_kind = ++ | Cfk_virtual of core_type ++ | Cfk_concrete of override_flag * expression ++ + +--- Explicit representation of "when" guards + +Replaced the "(pattern * expression) list" argument of Pexp_function, Pexp_match, Pexp_try +with "case list", with case defined as: + + { + pc_lhs: pattern; + pc_guard: expression option; + pc_rhs: expression; + } + +and get rid of Pexp_when. Idem in the Typedtree. + +Rationale: + + - Make it explicit when the guard can appear. + +--- Get rid of "fun p when guard -> e" + +See #5939, #5936. + + +--- Get rid of the location argument on pci_params + +It was only used for error messages, and we get better location using +the location of each parameter variable. + +--- More faithful representation of "with constraint" + +All kinds of "with constraints" used to be represented together with a +Longident.t denoting the constrained identifier. Now, each constraint +keeps its own constrainted identifier, which allows us to express more +invariants in the Parsetree (such as: := constraints cannot be on qualified +identifiers). Also, we avoid mixing in a single Longident.t identifier +which can be LIDENT or UIDENT. + +--- Get rid of the "#c [> `A]" syntax + +See #5936, #5983. + +--- Keep interval patterns in the Parsetree + +They used to be expanded into or-patterns by the parser. It is better to do +the expansion in the type-checker to allow -ppx rewriters to see the interval +patterns. + +Note: Camlp4 parsers still expand interval patterns themselves (TODO?). + +--- Get rid of Pexp_assertfalse + +Do not treat specially "assert false" in the parser any more, but +instead in the type-checker. This simplifies the Parsetree and avoids +a potential source of confusion. Moreove, this ensures that +attributes can be put (and used by ppx rewriters) on the "false" +expressions. This is also more robust, since it checks that the +condition is the constructor "false" after type-checking the condition: + + - if "false" is redefined (as a constructor of a different sum type), + an error will be reported; + + - "extra" layers which are represented as exp_extra in the typedtree + won't break the detection of the "false", e.g. the following will + be recognized as "assert false": + + assert(false : bool) + assert(let open X in false) + +Note: Camlp4's AST still has a special representation for "assert false". + +--- Get rid of the "explicit arity" flag on Pexp_construct/Ppat_construct + +This Boolean was used (only by camlp5?) to indicate that the tuple +(expression/pattern) used as the argument was intended to correspond +to the arity of an n-ary constructor. In particular, this allowed +the revised syntax to distinguish "A x y" from "A (x, y)" (the second one +being wrapped in an extra fake tuple) and get a proper error message +if "A (x, y)" was used with a constructor expecting two arguments. + +The feature has been preserved, but the information that a +Pexp_construct/Ppat_constructo node has an "exact arity" is now +propagated used as am attribute "ocaml.explicit_arity" on that node. + +--- Split Pexp_function into Pexp_function/Pexp_fun + +This reflects more closely the concrete syntax and removes cases of +Parsetree fragments which don't correspond to concrete syntax. + +Typedtree has not been changed. + +Note: Camlp4's AST has not been adapted. + +--- Split Pexp_constraint into Pexp_constraint/Pexp_coerce + +Idem in the Typedtree. + +This reflects more closely the concrete syntax. + +Note: Camlp4's AST has not been adapted. + +--- Accept abstract module type declaration in structures + +Previously, we could declare: + + module type S + +in signatures, but not implementations. To make the syntax, the Parsetree +and the type-checker more uniform, this is now also allowed in structures +(altough this is probably useless in practice). + +=== More TODOs + +- Adapt pprintast to print attributes and extension nodes. +- Adapt Camlp4 (both its parser(s) and its internal representation of OCaml ASTs). +- Consider adding hooks to the type-checker so that custom extension expanders can be registered (a la OCaml Templates). +- Make the Ast_helper module more user-friendly (e.g. with optional arguments and good default values) and/or + expose higher-level convenience functions. +- Document Ast_helper modules. + +=== Use cases + +From https://github.com/gasche/ocaml-syntax-extension-discussion/wiki/Use-Cases + +-- Bisect + + let f x = + match List.map foo [x; a x; b x] with + | [y1; y2; y3] -> tata + | _ -> assert false [@bisect VISIT] + +;;[@@bisect IGNORE-BEGIN] +let unused = () +;;[@@bisect IGNORE-END] + +-- OCamldoc + +val stats : ('a, 'b) t -> statistics +[@@doc + "[Hashtbl.stats tbl] returns statistics about the table [tbl]: + number of buckets, size of the biggest bucket, distribution of + buckets by size." +] +[@@since "4.00.0"] + +;;[@@doc section 6 "Functorial interface"] + +module type HashedType = + sig + type t + [@@doc "The type of the hashtable keys."] + val equal : t -> t -> bool + [@@doc "The equality predicate used to compare keys."] + end + + +-- type-conv, deriving + +type t = { + x : int [@default 42]; + y : int [@default 3] [@sexp_drop_default]; + z : int [@default 3] [@sexp_drop_if z_test]; +} [@@sexp] + + +type r1 = { + r1_l1 : int; + r1_l2 : int; +} [@@deriving (Dump, Eq, Show, Typeable, Pickle, Functor)] + +-- camlp4 map/fold generators + +type variable = string + and term = + | Var of variable + | Lam of variable * term + | App of term * term + + +class map = [%generate_map term] +or: +[%%generate_map map term] + + +-- ocaml-rpc + +type t = { foo [@rpc "type"]: int; bar [@rpc "let"]: int } +[@@ rpc] + +or: + +type t = { foo: int; bar: int } +[@@ rpc ("foo" > "type"), ("bar" > "let")] + + + +-- pa_monad + +begin%monad + a <-- [1; 2; 3]; + b <-- [3; 4; 5]; + return (a + b) +end + +-- pa_lwt + +let%lwt x = start_thread foo +and y = start_other_thread foo in +try%lwt + let%for_lwt (x, y) = waiting_threads in + compute blah +with Killed -> bar + +-- Bolt + +let funct n = + [%log "funct(%d)" n LEVEL DEBUG]; + for i = 1 to n do + print_endline "..." + done + + +-- pre-polyrecord + +let r = [%polyrec x = 1; y = ref None] +let () = [%polyrec r.y <- Some 2] + +-- orakuda + +function%regexp + | "$/^[0-9]+$/" as v -> `Int (int_of_string v#_0) + | "$/^[a-z][A-Za-z0-9_]*$" as v -> `Variable v#_0 + | _ -> failwith "parse error" + +-- bitstring + +let bits = Bitstring.bitstring_of_file "/bin/ls" in +match%bitstring bits with +| [ 0x7f, 8; "ELF", 24, string; (* ELF magic number *) + e_ident, Mul(12,8), bitstring; (* ELF identifier *) + e_type, 16, littleendian; (* object file type *) + e_machine, 16, littleendian (* architecture *) + ] -> + printf "This is an ELF binary, type %d, arch %d\n" + e_type e_machine + +-- sedlex + +let rec token buf = + let%regexp ('a'..'z'|'A'..'Z') = letter in + match%sedlex buf with + | number -> Printf.printf "Number %s\n" (Sedlexing.Latin1.lexeme buf); token buf + | letter, Star ('A'..'Z' | 'a'..'z' | digit) -> Printf.printf "Ident %s\n" (Sedlexing.Latin1.lexeme buf); token buf + | Plus xml_blank -> token buf + | Plus (Chars "+*-/") -> Printf.printf "Op %s\n" (Sedlexing.Latin1.lexeme buf); token buf + | Range(128,255) -> print_endline "Non ASCII" + | eof -> print_endline "EOF" + | _ -> failwith "Unexpected character" + + +-- cppo + +[%%ifdef DEBUG] +[%%define debug(s) = Printf.eprintf "[%S %i] %s\n%!" __FILE__ __LINE__ s] +[%%else] +[%%define debug(s) = ()] +[%%endif] + +debug("test") + + +-- PG'OCaml + +let fetch_users dbh = + [%pgsql dbh "select id, name from users"] + + +-- Macaque + +let names view = [%view {name = t.name}, t <- !view]" + + +-- Cass + +let color1 = [%css{| black |}] +let color2 = [%css{| gray |}] + +let button = [%css{| + .button { + $Css.gradient ~low:color2 ~high:color1$; + color: white; + $Css.top_rounded$; + |}] diff --git a/experimental/frisch/ifdef.ml b/experimental/frisch/ifdef.ml new file mode 100644 index 00000000..6263b59a --- /dev/null +++ b/experimental/frisch/ifdef.ml @@ -0,0 +1,118 @@ +(* This filter implements the following extensions: + + In structures: + + [%%IFDEF X] + ... --> included if the environment variable X is defined + [%%ELSE] + ... --> included if the environment variable X is undefined + [%%END] + + + In expressions: + + [%GETENV X] ---> the string literal representing the compile-time value + of environment variable X + + + In variant type declarations: + + type t = + .. + | C [@IFDEF X] of ... --> the constructor is kept only if X is defined + + + In match clauses (function/match...with/try...with): + + + P when [%IFDEF X] -> E --> the case is kept only if X is defined + +*) + +open Ast_helper +open! Asttypes +open Parsetree +open Longident + +let getenv loc arg = + match arg with + | PStr [{pstr_desc=Pstr_eval({pexp_desc = Pexp_construct ({txt = Lident sym; _}, None); _}, _); _}] -> + (try Sys.getenv sym with Not_found -> "") + | _ -> + Format.eprintf "%a** IFDEF: bad syntax." + Location.print_error loc; + exit 2 + +let empty_str_item = Str.include_ (Mod.structure []) + +let ifdef _args = + let stack = ref [] in + let eval_attributes = + List.for_all + (function + | {txt="IFDEF"; loc}, arg -> getenv loc arg <> "" + | {txt="IFNDEF"; loc}, arg -> getenv loc arg = "" + | _ -> true) + in + let filter_constr cd = eval_attributes cd.pcd_attributes in + let open Ast_mapper in + let super = default_mapper in + { + super with + + type_declaration = + (fun this td -> + let td = + match td with + | {ptype_kind = Ptype_variant cstrs; _} as td -> + {td + with ptype_kind = Ptype_variant(List.filter filter_constr cstrs)} + | td -> td + in + super.type_declaration this td + ); + + cases = + (fun this l -> + let l = + List.fold_right + (fun c rest -> + match c with + | {pc_guard=Some {pexp_desc=Pexp_extension({txt="IFDEF";loc}, arg); _}; _} -> + if getenv loc arg = "" then rest else {c with pc_guard=None} :: rest + | c -> c :: rest + ) l [] + in + super.cases this l + ); + + structure_item = + (fun this i -> + match i.pstr_desc, !stack with + | Pstr_extension(({txt="IFDEF";loc}, arg), _), _ -> + stack := (getenv loc arg <> "") :: !stack; + empty_str_item + | Pstr_extension(({txt="ELSE";loc=_}, _), _), (hd :: tl) -> + stack := not hd :: tl; + empty_str_item + | Pstr_extension(({txt="END";loc=_}, _), _), _ :: tl -> + stack := tl; + empty_str_item + | Pstr_extension(({txt="ELSE"|"END";loc}, _), _), [] -> + Format.printf "%a** IFDEF: mo matching [%%%%IFDEF]" + Location.print_error loc; + exit 2 + | _, (true :: _ | []) -> super.structure_item this i + | _, false :: _ -> empty_str_item + ); + + expr = + (fun this -> function + | {pexp_desc = Pexp_extension({txt="GETENV";loc=l}, arg); + pexp_loc = loc; _} -> + Exp.constant ~loc (Const_string (getenv l arg, None)) + | x -> super.expr this x + ); + } + +let () = Ast_mapper.run_main ifdef diff --git a/experimental/frisch/js_syntax.ml b/experimental/frisch/js_syntax.ml new file mode 100644 index 00000000..fe11cb65 --- /dev/null +++ b/experimental/frisch/js_syntax.ml @@ -0,0 +1,112 @@ +(* This example shows how the AST mapping approach could be used + instead of Camlp4 in order to give a nice syntax for js_of_ocaml + (properties and method calls). The code below overloads regular + syntax for field projection and assignment for Javascript + properties, and (currified) method call for Javascript method + calls. This is enabled under the scope of the [%js ...] extension: + + Get property: [%js o.x] + Set property: [%js o.x <- e] + Method call: [%js o#x e1 e2] + *) + +open Asttypes +open! Location +open Parsetree +open Longident +open Ast_helper +open Ast_helper.Convenience + +(* A few local helper functions to simplify the creation of AST nodes. *) +let apply_ f l = app (evar f) l +let oobject l = Typ.object_ l Open +let annot e t = Exp.constraint_ e t + + +let rnd = Random.State.make [|0x513511d4|] +let random_var () = Format.sprintf "a%08Lx" (Random.State.int64 rnd 0x100000000L : Int64.t) +let fresh_type () = Typ.var (random_var ()) + +let unescape lab = + assert (lab <> ""); + let lab = + if lab.[0] = '_' then String.sub lab 1 (String.length lab - 1) else lab + in + try + let i = String.rindex lab '_' in + if i = 0 then raise Not_found; + String.sub lab 0 i + with Not_found -> + lab + +let method_literal meth = str (unescape meth) + +let access_object loc e m m_typ f = + let open Exp in + with_default_loc loc + (fun () -> + let x = random_var () in + let obj_type = random_var () in + let obj = annot e Typ.(tconstr "Js.t" [alias (oobject []) obj_type]) in + let y = random_var () in + let o = annot (evar y) (Typ.var obj_type) in + let constr = lam (pvar y) (annot (send o m) m_typ) in + let_in [Vb.mk (pvar x) obj; Vb.mk (Pat.any ()) constr] (f (evar x)) + ) + +let method_call loc obj meth args = + let args = List.map (fun e -> (e, fresh_type ())) args in + let ret_type = fresh_type () in + let method_type = + List.fold_right + (fun (_, arg_ty) rem_ty -> Typ.arrow "" arg_ty rem_ty) + args + (tconstr "Js.meth" [ret_type]) + in + access_object loc obj meth method_type + (fun x -> + let args = + List.map (fun (e, t) -> apply_ "Js.Unsafe.inject" [annot e t]) args + in + annot (apply_ "Js.Unsafe.meth_call" [x; method_literal meth; Exp.array args]) ret_type + ) + + +let mapper _args = + let open Ast_mapper in + let rec mk ~js = + let super = default_mapper in + let expr this e = + let loc = e.pexp_loc in + match e.pexp_desc with + | Pexp_extension({txt="js";_}, PStr [{pstr_desc=Pstr_eval (e, _);_}]) -> + let this = mk ~js:true in this.expr this e + + | Pexp_field (o, {txt = Lident meth; loc = _}) when js -> + let o = this.expr this o in + let prop_type = fresh_type () in + let meth_type = tconstr "Js.gen_prop" [oobject ["get", prop_type]] in + access_object loc o meth meth_type + (fun x -> annot (apply_ "Js.Unsafe.get" [x; method_literal meth]) prop_type) + + | Pexp_setfield (o, {txt = Lident meth; loc = _}, e) when js -> + let o = this.expr this o and e = this.expr this e in + let prop_type = fresh_type () in + let meth_type = tconstr "Js.gen_prop" [oobject ["set", Typ.arrow "" prop_type (tconstr "unit" [])]] in + access_object loc o meth meth_type + (fun x -> apply_ "Js.Unsafe.set" [x; method_literal meth; annot e prop_type]) + + | Pexp_apply ({pexp_desc = Pexp_send (o, meth); pexp_loc = loc; _}, args) when js -> + method_call loc o meth (List.map (this.expr this) (List.map snd args)) + + | Pexp_send (o, meth) when js -> + method_call loc o meth [] + + | _ -> + super.expr this e + in + {super with expr} + in + mk ~js:false + +let () = Ast_mapper.run_main mapper diff --git a/experimental/frisch/metaquot_test.ml b/experimental/frisch/metaquot_test.ml new file mode 100644 index 00000000..bbdfe240 --- /dev/null +++ b/experimental/frisch/metaquot_test.ml @@ -0,0 +1,27 @@ +let loc1 = Location.in_file "111" +let loc2 = Location.in_file "222" + +let x = [%expr foobar] +let pat = [%pat? _ as x] + +let e = [%expr fun (x, [%p pat]) -> x + [%e x] + 1] +let () = Format.printf "%a@." (Printast.expression 0) e + +;;[@@metaloc loc2] + +let e = [%expr fun (x, [%p pat]) -> x + [%e x] + 1] [@metaloc loc1] +let () = Format.printf "%a@." (Printast.expression 0) e + +let e = [%expr fun (x, [%p pat]) -> x + [%e x] + 1] +let () = Format.printf "%a@." (Printast.expression 0) e + + +let mytype = [%type: int list] +let s = [%str type t = A of [%t mytype] | B of string] +let () = Format.printf "%a@." Printast.implementation s + + +let f = function + | ([%expr [%e? x] + 1] + | [%expr 1 + [%e? x]]) as e0 -> [%expr succ [%e x]] [@metaloc e0.pexp_loc] + | e -> e diff --git a/experimental/frisch/minidoc.ml b/experimental/frisch/minidoc.ml new file mode 100644 index 00000000..bf37a012 --- /dev/null +++ b/experimental/frisch/minidoc.ml @@ -0,0 +1,72 @@ +open Asttypes +open Parsetree +open Typedtree +open Longident + +let pendings = ref [] + +let doc ppf = function + | ({txt="doc";_}, PStr [{pstr_desc=Pstr_eval(e, _); _}]) -> + begin match e.pexp_desc with + | Pexp_constant(Const_string (s, _)) -> + Format.fprintf ppf " --> %s@." s + | Pexp_apply({pexp_desc=Pexp_ident{txt=Lident "section"}}, + ["", {pexp_desc=Pexp_constant(Const_string (s, _))}]) -> + Format.fprintf ppf " ==== %s ====@." s + | _ -> () + end + | _ -> () + +let rec signature path ppf sg = + List.iter (signature_item path ppf) sg.sig_items + +and signature_item path ppf si = + match si.sig_desc with + | Tsig_value x -> + Format.fprintf ppf " val %s: %a@." x.val_name.txt Printtyp.type_expr x.val_desc.ctyp_type; + List.iter (doc ppf) x.val_attributes + | Tsig_module x -> + begin match x.md_type.mty_desc with + | Tmty_ident (_, {txt=lid}) -> + Format.fprintf ppf " module %s: %a@." x.md_name.txt Printtyp.longident lid + | Tmty_signature sg -> + pendings := `Module (path ^ "." ^ x.md_name.txt, sg) :: !pendings; + Format.fprintf ppf " module %s: ... (see below)@." x.md_name.txt; + | _ -> + Format.fprintf ppf " module %s: ...@." x.md_name.txt; + end; + List.iter (doc ppf) x.md_attributes + | Tsig_type l -> + List.iter (type_declaration ppf) l + | Tsig_attribute x -> + doc ppf x + | _ -> + () + +and type_declaration ppf x = + Format.fprintf ppf " type %s@." x.typ_name.txt; + List.iter (doc ppf) x.typ_attributes + +let component = function + | `Module (path, sg) -> + Format.printf "[[[ Interface for %s ]]]@.%a@." + path (signature path) sg + +let () = + let open Cmt_format in + for i = 1 to Array.length Sys.argv - 1 do + let fn = Sys.argv.(i) in + try + let {cmt_annots; cmt_modname; _} = read_cmt fn in + begin match cmt_annots with + | Interface sg -> component (`Module (cmt_modname, sg)) + | _ -> () + end; + while !pendings <> [] do + let l = List.rev !pendings in + pendings := []; + List.iter component l + done + with exn -> + Format.printf "Cannot read '%s': %s@." fn (Printexc.to_string exn) + done diff --git a/experimental/frisch/nomli.ml b/experimental/frisch/nomli.ml new file mode 100644 index 00000000..6cf34557 --- /dev/null +++ b/experimental/frisch/nomli.ml @@ -0,0 +1,114 @@ +(** Creates an mli from an annotated ml file. *) + +open Path +open Location +open Longident +open Misc +open Parsetree +open Types +open! Typedtree +open Ast_helper + +let mli_attr l = Convenience.find_attr "mli" l + +let map_flatten f l = + List.flatten (List.map f l) + +let is_abstract = function + | PStr [{pstr_desc=Pstr_eval({pexp_desc=Pexp_ident{txt=Lident "abstract"}},_)}] -> true + | _ -> false + +let explicit_type_of_expr = function + | {pexp_desc=Pexp_constraint({pexp_desc=Pexp_ident{txt=Lident id}}, t)} -> [id, t] + | _ -> [] + +let explicit_type = function + | PStr [{pstr_desc=Pstr_eval({pexp_desc=Pexp_tuple el},_)}] -> map_flatten explicit_type_of_expr el + | PStr [{pstr_desc=Pstr_eval(e,_)}] -> explicit_type_of_expr e + | _ -> [] + +let rec structure l : Parsetree.signature = + map_flatten (structure_item l.str_final_env) l.str_items + +and structure_item final_env x : Parsetree.signature = + match x.str_desc with + | Tstr_module {mb_name; mb_expr} -> + begin match module_expr mb_expr with + | Some mty -> [Sig.module_ (Md.mk mb_name mty)] + | None -> [] + end + | Tstr_type l -> + begin match map_flatten type_declaration l with + | [] -> [] + | l -> [Sig.type_ l] + end + | Tstr_value (_, l) -> + map_flatten (value_binding final_env) l + | _ -> + [] + +and module_expr x : Parsetree.module_type option = + match x.mod_desc with + | Tmod_structure l -> + (* No explicit signature: use [@@mli] attributes in the sub-structure to define exported components. *) + begin match structure l with + | [] -> None + | l -> Some (Mty.signature l) + end + | Tmod_constraint (_, _, Tmodtype_explicit mty, _) -> + (* Explicit signature: if non-empty, use it for the mli; if empty, drop the sub-module *) + begin match Untypeast.untype_module_type mty with + | {pmty_desc=Pmty_signature []} -> None + | pmty -> Some pmty + end + | _ -> + None + +and type_declaration x : Parsetree.type_declaration list = + match mli_attr x.typ_attributes with + | None -> [] + | Some attrs -> + let pdecl = Untypeast.untype_type_declaration x in + (* If the declaration is marked with [@@mli abstract], make it abstract *) + let pdecl = if is_abstract attrs then {pdecl with ptype_kind=Ptype_abstract} else pdecl in + [pdecl] + +and value_binding final_env x : Parsetree.signature = + match mli_attr x.vb_attributes with + | None -> [] + | Some attrs -> + match explicit_type attrs with + | [] -> + (* No explicit type, use the inferred type for bound identifiers *) + let ids = let_bound_idents [x] in + List.map + (fun id -> + let ty = typ (Env.find_value (Pident id) final_env).val_type in + Sig.value (Val.mk (mknoloc (Ident.name id)) ty) + ) ids + | l -> + (* Explicit type given with the syntax [@@mli (x1 : ty1), ..., (xn : tyn)] *) + List.map (fun (id, ty) -> Sig.value (Val.mk (mknoloc id) ty)) l + +and typ x : Parsetree.core_type = + (* print the inferred type and parse the result again *) + let t = Printtyp.type_scheme Format.str_formatter x in + let s = Format.flush_str_formatter t in + Parse.core_type (Lexing.from_string s) + +let mli_of_ml ppf sourcefile = + Location.input_name := sourcefile; + Compmisc.init_path false; + let file = chop_extension_if_any sourcefile in + let modulename = String.capitalize(Filename.basename file) in + Env.set_unit_name modulename; + let inputfile = Pparse.preprocess sourcefile in + let env = Compmisc.initial_env() in + let ast = Pparse.file ppf inputfile Parse.implementation Config.ast_impl_magic_number in + let (str, _coerc) = Typemod.type_implementation sourcefile file modulename env ast in + let sg = structure str in + Format.printf "%a@." Pprintast.signature sg + +let () = + mli_of_ml Format.err_formatter Sys.argv.(1) + diff --git a/experimental/frisch/ppx_builder.ml b/experimental/frisch/ppx_builder.ml new file mode 100644 index 00000000..cb866df8 --- /dev/null +++ b/experimental/frisch/ppx_builder.ml @@ -0,0 +1,100 @@ +(* + A toy -ppx rewriter which illustrates code generation based on type + declarations. Here, we create builder function from record and sum + type declarations annotated with attribute [@@builder]: one function + per record type, one function per constructor of a sum type. + + We recognize some special attributes on record fields (or their associated + type) and on constructor argument types: + + - [@label id]: specify a label for the parameter of the builder function + (for records, it is set automatically from the label name + but it can be overridden). + + - [@opt]: the parameter is optional (this assume that the field/argument + has an option type). + + - [@default expr]: the parameter is optional, with a default value + (cannot be used with [@opt]). +*) + +module Main : sig end = struct + open Asttypes + open! Location + open Parsetree + open Ast_helper + open Ast_helper.Convenience + + let fatal loc s = + Location.print_error Format.err_formatter loc; + prerr_endline s; + exit 2 + + let param named name loc attrs = + let default = find_attr_expr "default" attrs in + let opt = has_attr "opt" attrs in + let label = + match find_attr_expr "label" attrs with + | None -> if named then name else "" + | Some e -> + match get_lid e with + | Some s -> s + | None -> fatal e.pexp_loc "'label' attribute must be a string literal" + in + let label = + if default <> None || opt then + if label = "" then fatal loc "Optional arguments must be named" else "?" ^ label + else label + in + if default <> None && opt then fatal loc "Cannot have both 'opt' and 'default' attributes"; + lam ~label ?default (pvar name), (name, evar name) + + let gen_builder tdecl = + if has_attr "builder" tdecl.ptype_attributes then + match tdecl.ptype_kind with + | Ptype_record fields -> + let field pld = + param true pld.pld_name.txt pld.pld_loc (pld.pld_attributes @ pld.pld_type.ptyp_attributes) + in + let fields = List.map field fields in + let body = lam (punit()) (record (List.map snd fields)) in + let f = List.fold_right (fun (f, _) k -> f k) fields body in + let s = Str.value Nonrecursive [Vb.mk (pvar tdecl.ptype_name.txt) f] in + [s] + | Ptype_variant constrs -> + let constr {pcd_name={txt=name;_}; pcd_args=args; _} = + let arg i ty = param false (Printf.sprintf "x%i" i) ty.ptyp_loc ty.ptyp_attributes in + let args = List.mapi arg args in + let body = lam (punit()) (constr name (List.map (fun (_, (_, e)) -> e) args)) in + let f = List.fold_right (fun (f, _) k -> f k) args body in + let s = Str.value Nonrecursive [Vb.mk (pvar (tdecl.ptype_name.txt ^ "_" ^ name)) f] in + s + in + List.map constr constrs + | _ -> [] + else + [] + + let gen_builder tdecl = + with_default_loc tdecl.ptype_loc (fun () -> gen_builder tdecl) + + let builder _args = + let open Ast_mapper in + let super = default_mapper in + {super + with + structure = + (fun this l -> + List.flatten + (List.map + (function + | {pstr_desc = Pstr_type tdecls; _} as i -> + i :: (List.flatten (List.map gen_builder tdecls)) + | i -> [this.structure_item this i] + ) l + ) + ) + } + + let () = Ast_mapper.run_main builder +end diff --git a/experimental/frisch/ppx_matches.ml b/experimental/frisch/ppx_matches.ml new file mode 100644 index 00000000..f6d95347 --- /dev/null +++ b/experimental/frisch/ppx_matches.ml @@ -0,0 +1,29 @@ +(* + Example : List.filter [%matches ? 'a' .. 'z' ] text + Output : List.filter (function 'a' .. 'z' -> true | _ -> false) text +*) + +open Asttypes +open Parsetree +open Ast_helper + +let mapper _args = + let open Ast_mapper in + let super = default_mapper in + {super with + expr = + (fun this e -> + match e.pexp_desc with + | Pexp_extension({txt="matches";_}, PPat (p, guard)) -> + let p = this.pat this p in + let guard = Ast_mapper.map_opt (this.expr this) guard in + Exp.function_ ~loc:e.pexp_loc + [ + Exp.case p ?guard (Convenience.constr "true" []); + Exp.case (Pat.any ()) (Convenience.constr "false" []); + ] + | _ -> super.expr this e + ) + } + +let () = Ast_mapper.run_main mapper diff --git a/experimental/frisch/test_builder.ml b/experimental/frisch/test_builder.ml new file mode 100644 index 00000000..25427309 --- /dev/null +++ b/experimental/frisch/test_builder.ml @@ -0,0 +1,19 @@ +type t = + { + x: int; + y [@label foo]: int; + z [@default 3]: int; + } [@@builder] + +and s = + { + a: string; + b [@opt]: int option; + c: int [@default 2]; + } [@@builder] + +and sum = + | A of int + | B of string * (string [@label str]) + | C of (int [@label i] [@default 0]) * (string [@label s] [@default ""]) + [@@builder] diff --git a/experimental/frisch/test_copy_typedef.ml b/experimental/frisch/test_copy_typedef.ml new file mode 100644 index 00000000..cd774c69 --- /dev/null +++ b/experimental/frisch/test_copy_typedef.ml @@ -0,0 +1,19 @@ +module type S = [%copy_typedef] + +module type T = sig + type t + + module type M = [%copy_typedef] +end + +module M = struct + type t = [%copy_typedef] +end + +type t = [%copy_typedef] + +let _x = M.A +let _y : t = [1; 2] + + +type _loc = [%copy_typedef "../../parsing/location.mli" t] diff --git a/experimental/frisch/test_copy_typedef.mli b/experimental/frisch/test_copy_typedef.mli new file mode 100644 index 00000000..8e137a7d --- /dev/null +++ b/experimental/frisch/test_copy_typedef.mli @@ -0,0 +1,20 @@ +module type S = sig + type t + val x: int +end + +module type T = sig + type t + + module type M = sig + type t = A | B of t + end +end + +module M : sig + type t = + | A + | B of string +end + +type t = int list diff --git a/experimental/frisch/test_eval.ml b/experimental/frisch/test_eval.ml new file mode 100644 index 00000000..c0dfc697 --- /dev/null +++ b/experimental/frisch/test_eval.ml @@ -0,0 +1,37 @@ +[%%eval.load "unix.cma"] + +[%%eval.start both] +(* This type definition will be evaluated at compile time, + but it will be kept in the compiled unit as well. *) +type t = A | B of string +[%%eval.stop] + +[%%eval.start] +(* This is going to be executed at compile time only. *) +let () = print_endline "Now compiling..." +[%%eval.stop] + +let () = + begin match [%eval B "x"] with + | A -> print_endline "A" + | B s -> Printf.printf "B %S\n%!" s + end; + Printf.printf "Home dir at compile time = %s\n" [%eval Sys.getenv "HOME"]; + Printf.printf "Word-size = %i\n" [%eval Sys.word_size]; + Array.iter (Printf.printf "%s;") [%eval Sys.readdir "."]; + print_endline ""; + [%eval print_endline "COUCOU"] + +let () = + let tm = [%eval Unix.(localtime (gettimeofday ()))] in + Printf.printf "This program was compiled in %i\n%!" (1900 + tm.Unix.tm_year) + +let () = + let debug = + [%eval try Some (Sys.getenv "DEBUG") with Not_found -> None] + in + match debug with + | Some x -> Printf.printf "DEBUG %s\n%!" x + | None -> Printf.printf "NODEBUG\n%!" + + diff --git a/experimental/frisch/test_ifdef.ml b/experimental/frisch/test_ifdef.ml new file mode 100644 index 00000000..8a18cdaa --- /dev/null +++ b/experimental/frisch/test_ifdef.ml @@ -0,0 +1,25 @@ +type t = + | A + | DBG [@IFDEF DEBUG] of string + | B + +[%%IFDEF DEBUG] +let debug s = prerr_endline ([%GETENV DEBUG] ^ ":" ^ s) +let x = DBG "xxx" +[%%ELSE] +let debug _ = () +let x = A +[%%END] + +let f = function + | A -> "A" + | DBG s when [%IFDEF DEBUG] -> "DEBUG:" ^ s + | B -> "B" + +let () = debug "ABC" + +let () = + Printf.printf "compiled by user %s in directory %s\n%!" + [%GETENV USER] + [%GETENV PWD] + diff --git a/experimental/frisch/test_js.ml b/experimental/frisch/test_js.ml new file mode 100644 index 00000000..2582a0fb --- /dev/null +++ b/experimental/frisch/test_js.ml @@ -0,0 +1,22 @@ +module Js = struct + type +'a t + type +'a gen_prop + type +'a meth + module Unsafe = struct + type any + let get (_o : 'a t) (_meth : string) = assert false + let set (_o : 'a t) (_meth : string) (_v : 'b) = () + let meth_call (_ : 'a) (_ : string) (_ : any array) : 'b = assert false + let inject _ : any = assert false + end +end + +let foo1 o = + if [%js o.bar] then [%js o.foo1.foo2] else [%js o.foo2] + +let foo2 o = + [%js o.x <- o.x + 1] + + +let foo3 o a = + [%js o#x] + [%js o#y 1 a] diff --git a/experimental/frisch/test_matches.ml b/experimental/frisch/test_matches.ml new file mode 100644 index 00000000..a46a38ba --- /dev/null +++ b/experimental/frisch/test_matches.ml @@ -0,0 +1,3 @@ +let l = List.filter [%matches ? 'a'..'z'] ['a';'A';'X';'x'] + +let f = [%matches ? Some i when i >= 0] diff --git a/experimental/frisch/test_nomli.ml b/experimental/frisch/test_nomli.ml new file mode 100644 index 00000000..affa0767 --- /dev/null +++ b/experimental/frisch/test_nomli.ml @@ -0,0 +1,30 @@ +type t = A | B + [@@mli] + +and s = C | D + [@@mli abstract] + + +module X = struct + type t = X | Y + [@@mli] + and s + + let id x = x + [@@mli] +end + +module Y : sig type t type s end = struct + type t = X | Y + type s = A | B +end + +let f x y = x + y + [@@mli] +and g a b = (a, b) + [@@mli] +and h a b = (a, b) + [@@mli (h : int -> int -> int * int)] + +let (x, y, z) = (1, 2, 3) + [@@mli (x : int), (y : int)] diff --git a/experimental/frisch/testdoc.mli b/experimental/frisch/testdoc.mli new file mode 100644 index 00000000..c22307ae --- /dev/null +++ b/experimental/frisch/testdoc.mli @@ -0,0 +1,29 @@ +[@@doc section "First section"] + +module M : sig + [@@doc section "Public definitions"] + + type t = + | A + | B + + [@@doc section "Internal definitions"] + + val zero: int + [@@doc "A very important integer."] +end + [@@doc "This is an internal module."] + +val incr: int -> int + [@@doc "This function returns the next integer."] + +[@@doc section "Second section"] + +val decr: int -> int + [@@doc "This function returns the previous integer."] + +val is_a: M.t -> bool + [@@doc "This function checks whether its argument is the A constructor."] + +module X: Hashtbl.HashedType + [@@doc "An internal module"] diff --git a/experimental/frisch/unused_exported_values.ml b/experimental/frisch/unused_exported_values.ml new file mode 100644 index 00000000..7b2d2f90 --- /dev/null +++ b/experimental/frisch/unused_exported_values.ml @@ -0,0 +1,63 @@ +(* This tool reports values exported by .mli files but never used in any other module. + It assumes that .mli files are compiled with -keep-locs and .ml files with -bin-annot. + This can be enforced by setting: + + OCAMLPARAM=bin-annot=1,keep-locs=1,_ +*) + + +open Types +open Typedtree + +let vds = ref [] (* all exported value declarations *) +let references = Hashtbl.create 256 (* all value references *) + +let unit fn = + Filename.chop_extension (Filename.basename fn) + +let rec collect_export fn = function + | Sig_value (_, {Types.val_loc; _}) when not val_loc.Location.loc_ghost -> + (* a .cmi file can contain locations from other files. + For instance: + module M : Set.S with type elt = int + will create value definitions whole locations is in set.mli + *) + if unit fn = unit val_loc.Location.loc_start.Lexing.pos_fname then + vds := val_loc :: !vds + | Sig_module (_, {Types.md_type=Mty_signature sg; _}, _) -> List.iter (collect_export fn) sg + | _ -> () + +let collect_references = object + inherit Tast_iter.iter as super + method! expression = function + | {exp_desc = Texp_ident (_, _, {Types.val_loc; _}); exp_loc} -> Hashtbl.add references val_loc exp_loc + | e -> super # expression e +end + +let rec load_file fn = + if Filename.check_suffix fn ".cmi" + && Sys.file_exists (Filename.chop_suffix fn ".cmi" ^ ".mli") then + (* only consider module with an explicit interface *) + let open Cmi_format in +(* Printf.eprintf "Scanning %s\n%!" fn; *) + List.iter (collect_export fn) (read_cmi fn).cmi_sign + else if Filename.check_suffix fn ".cmt" then + let open Cmt_format in +(* Printf.eprintf "Scanning %s\n%!" fn; *) + match read fn with + | (_, Some {cmt_annots = Implementation x; _}) -> collect_references # structure x + | _ -> () (* todo: support partial_implementation? *) + else if (try Sys.is_directory fn with _ -> false) then + Array.iter (fun s -> load_file (Filename.concat fn s)) (Sys.readdir fn) + +let report loc = + if not (Hashtbl.mem references loc) then + Format.printf "%a: unused exported value@." Location.print_loc loc + +let () = + try + for i = 1 to Array.length Sys.argv - 1 do load_file Sys.argv.(i) done; + List.iter report !vds + with exn -> + Location.report_exception Format.err_formatter exn; + exit 2 diff --git a/experimental/garrigue/.cvsignore b/experimental/garrigue/.cvsignore new file mode 100644 index 00000000..4539eb6d --- /dev/null +++ b/experimental/garrigue/.cvsignore @@ -0,0 +1,2 @@ +*.out +*.out2 diff --git a/experimental/garrigue/caml_set_oid.diff b/experimental/garrigue/caml_set_oid.diff new file mode 100644 index 00000000..aaaa160e --- /dev/null +++ b/experimental/garrigue/caml_set_oid.diff @@ -0,0 +1,141 @@ +Index: byterun/intern.c +=================================================================== +--- byterun/intern.c (revision 11929) ++++ byterun/intern.c (working copy) +@@ -27,6 +27,7 @@ + #include "memory.h" + #include "mlvalues.h" + #include "misc.h" ++#include "obj.h" + #include "reverse.h" + + static unsigned char * intern_src; +@@ -139,6 +140,14 @@ + dest = (value *) (intern_dest + 1); + *intern_dest = Make_header(size, tag, intern_color); + intern_dest += 1 + size; ++ /* For objects, we need to freshen the oid */ ++ if (tag == Object_tag) { ++ intern_rec(dest++); ++ intern_rec(dest++); ++ caml_set_oid((value)(dest-2)); ++ size -= 2; ++ if (size == 0) return; ++ } + for(/*nothing*/; size > 1; size--, dest++) + intern_rec(dest); + goto tailcall; +Index: byterun/obj.c +=================================================================== +--- byterun/obj.c (revision 11929) ++++ byterun/obj.c (working copy) +@@ -25,6 +25,7 @@ + #include "minor_gc.h" + #include "misc.h" + #include "mlvalues.h" ++#include "obj.h" + #include "prims.h" + + CAMLprim value caml_static_alloc(value size) +@@ -212,6 +213,16 @@ + return (tag == Field(meths,li) ? Field (meths, li-1) : 0); + } + ++/* Generate ids on the C side, to avoid races */ ++ ++CAMLprim value caml_set_oid (value obj) ++{ ++ static value last_oid = 1; ++ Field(obj,1) = last_oid; ++ last_oid += 2; ++ return obj; ++} ++ + /* these two functions might be useful to an hypothetical JIT */ + + #ifdef CAML_JIT +Index: byterun/obj.h +=================================================================== +--- byterun/obj.h (revision 0) ++++ byterun/obj.h (revision 0) +@@ -0,0 +1,28 @@ ++/***********************************************************************/ ++/* */ ++/* OCaml */ ++/* */ ++/* Jacques Garrigue, projet Cristal, INRIA Rocquencourt */ ++/* */ ++/* Copyright 1996 Institut National de Recherche en Informatique et */ ++/* en Automatique. All rights reserved. This file is distributed */ ++/* under the terms of the GNU Library General Public License, with */ ++/* the special exception on linking described in file ../LICENSE. */ ++/* */ ++/***********************************************************************/ ++ ++/* $Id$ */ ++ ++/* Primitives for the Obj and CamlinternalOO modules */ ++ ++#ifndef CAML_OBJ_H ++#define CAML_OBJ_H ++ ++#include "misc.h" ++#include "mlvalues.h" ++ ++/* Set the OID of an object to a fresh value */ ++/* returns the same object as result */ ++value caml_set_oid (value obj); ++ ++#endif /* CAML_OBJ_H */ +Index: stdlib/camlinternalOO.ml +=================================================================== +--- stdlib/camlinternalOO.ml (revision 11929) ++++ stdlib/camlinternalOO.ml (working copy) +@@ -15,23 +15,15 @@ + + open Obj + +-(**** Object representation ****) ++(**** OID handling ****) + +-let last_id = ref 0 +-let new_id () = +- let id = !last_id in incr last_id; id ++external set_oid : t -> t = "caml_set_oid" "noalloc" + +-let set_id o id = +- let id0 = !id in +- Array.unsafe_set (Obj.magic o : int array) 1 id0; +- id := id0 + 1 +- + (**** Object copy ****) + + let copy o = +- let o = (Obj.obj (Obj.dup (Obj.repr o))) in +- set_id o last_id; +- o ++ let o = Obj.dup (Obj.repr o) in ++ Obj.obj (set_oid o) + + (**** Compression options ****) + (* Parameters *) +@@ -355,8 +347,7 @@ + let obj = Obj.new_block Obj.object_tag table.size in + (* XXX Appel de [caml_modify] *) + Obj.set_field obj 0 (Obj.repr table.methods); +- set_id obj last_id; +- (Obj.obj obj) ++ Obj.obj (set_oid obj) + + let create_object_opt obj_0 table = + if (Obj.magic obj_0 : bool) then obj_0 else begin +@@ -364,8 +355,7 @@ + let obj = Obj.new_block Obj.object_tag table.size in + (* XXX Appel de [caml_modify] *) + Obj.set_field obj 0 (Obj.repr table.methods); +- set_id obj last_id; +- (Obj.obj obj) ++ Obj.obj (set_oid obj) + end + + let rec iter_f obj = diff --git a/experimental/garrigue/coerce.diff b/experimental/garrigue/coerce.diff new file mode 100644 index 00000000..e90e1fc9 --- /dev/null +++ b/experimental/garrigue/coerce.diff @@ -0,0 +1,93 @@ +Index: typing/ctype.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/ctype.ml,v +retrieving revision 1.201 +diff -u -r1.201 ctype.ml +--- typing/ctype.ml 5 Apr 2006 02:28:13 -0000 1.201 ++++ typing/ctype.ml 17 May 2006 23:48:22 -0000 +@@ -490,6 +490,31 @@ + unmark_class_signature sign; + Some reason + ++(* Variant for checking principality *) ++ ++let rec free_nodes_rec ty = ++ let ty = repr ty in ++ if ty.level >= lowest_level then begin ++ if ty.level <= !current_level then raise Exit; ++ ty.level <- pivot_level - ty.level; ++ begin match ty.desc with ++ Tvar -> ++ raise Exit ++ | Tobject (ty, _) -> ++ free_nodes_rec ty ++ | Tfield (_, _, ty1, ty2) -> ++ free_nodes_rec ty1; free_nodes_rec ty2 ++ | Tvariant row -> ++ let row = row_repr row in ++ iter_row free_nodes_rec {row with row_bound = []}; ++ if not (static_row row) then free_nodes_rec row.row_more ++ | _ -> ++ iter_type_expr free_nodes_rec ty ++ end; ++ end ++ ++let has_free_nodes ty = ++ try free_nodes_rec ty; false with Exit -> true + + (**********************) + (* Type duplication *) +Index: typing/ctype.mli +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/ctype.mli,v +retrieving revision 1.54 +diff -u -r1.54 ctype.mli +--- typing/ctype.mli 5 Apr 2006 02:28:13 -0000 1.54 ++++ typing/ctype.mli 17 May 2006 23:48:22 -0000 +@@ -228,6 +228,9 @@ + val closed_class: + type_expr list -> class_signature -> closed_class_failure option + (* Check whether all type variables are bound *) ++val has_free_nodes: type_expr -> bool ++ (* Check whether there are free type variables, or nodes with ++ level lower or equal to !current_level *) + + val unalias: type_expr -> type_expr + val signature_of_class_type: class_type -> class_signature +Index: typing/typecore.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/typecore.ml,v +retrieving revision 1.181 +diff -u -r1.181 typecore.ml +--- typing/typecore.ml 16 Apr 2006 23:28:22 -0000 1.181 ++++ typing/typecore.ml 17 May 2006 23:48:22 -0000 +@@ -1183,12 +1183,29 @@ + let (ty', force) = + Typetexp.transl_simple_type_delayed env sty' + in ++ if !Clflags.principal then begin_def (); + let arg = type_exp env sarg in ++ let has_fv = ++ if !Clflags.principal then begin ++ end_def (); ++ let b = has_free_nodes arg.exp_type in ++ Ctype.unify env arg.exp_type (newvar ()); ++ b ++ end else ++ free_variables arg.exp_type <> [] ++ in + begin match arg.exp_desc, !self_coercion, (repr ty').desc with + Texp_ident(_, {val_kind=Val_self _}), (path,r) :: _, + Tconstr(path',_,_) when Path.same path path' -> + r := sexp.pexp_loc :: !r; + force () ++ | _ when not has_fv -> ++ begin try ++ let force' = subtype env arg.exp_type ty' in ++ force (); force' () ++ with Subtype (tr1, tr2) -> ++ raise(Error(sexp.pexp_loc, Not_subtype(tr1, tr2))) ++ end + | _ -> + let ty, b = enlarge_type env ty' in + force (); diff --git a/experimental/garrigue/countchars.ml b/experimental/garrigue/countchars.ml new file mode 100644 index 00000000..0f14d2fe --- /dev/null +++ b/experimental/garrigue/countchars.ml @@ -0,0 +1,16 @@ +let rec long_lines name n ic = + let l = input_line ic in + if String.length l > 80 then Printf.printf "%s: %d\n%!" name n; + long_lines name (n+1) ic + +let process_file name = + try + let ic = open_in name in + try long_lines name 1 ic + with End_of_file -> close_in ic + with _ ->() + +let () = + for i = 1 to Array.length Sys.argv - 1 do + process_file Sys.argv.(i) + done diff --git a/experimental/garrigue/dirs_multimatch b/experimental/garrigue/dirs_multimatch new file mode 100644 index 00000000..3e444000 --- /dev/null +++ b/experimental/garrigue/dirs_multimatch @@ -0,0 +1 @@ +parsing typing bytecomp driver toplevel diff --git a/experimental/garrigue/dirs_poly b/experimental/garrigue/dirs_poly new file mode 100644 index 00000000..60cb39f1 --- /dev/null +++ b/experimental/garrigue/dirs_poly @@ -0,0 +1 @@ +bytecomp byterun driver parsing stdlib tools toplevel typing utils diff --git a/experimental/garrigue/fixedtypes.ml b/experimental/garrigue/fixedtypes.ml new file mode 100644 index 00000000..aa6e530e --- /dev/null +++ b/experimental/garrigue/fixedtypes.ml @@ -0,0 +1,77 @@ +(* cvs update -r fixedtypes parsing typing *) + +(* recursive types *) +class c = object (self) method m = 1 method s = self end +module type S = sig type t = private #c end;; + +module M : S = struct type t = c end +module type S' = S with type t = c;; + +class d = object inherit c method n = 2 end +module type S2 = S with type t = private #d;; +module M2 : S = struct type t = d end;; +module M3 : S = struct type t = private #d end;; + +module T1 = struct + type ('a,'b) a = [`A of 'a | `B of 'b] + type ('a,'b) b = [`Z | ('a,'b) a] +end +module type T2 = sig + type a and b + val evala : a -> int + val evalb : b -> int +end +module type T3 = sig + type a0 = private [> (a0,b0) T1.a] + and b0 = private [> (a0,b0) T1.b] +end +module type T4 = sig + include T3 + include T2 with type a = a0 and type b = b0 +end +module F(X:T4) = struct + type a = X.a and b = X.b + let a = X.evala (`B `Z) + let b = X.evalb (`A(`B `Z)) + let a2b (x : a) : b = `A x + let b2a (x : b) : a = `B x +end +module M4 = struct + type a = [`A of a | `B of b | `ZA] + and b = [`A of a | `B of b | `Z] + type a0 = a + type b0 = b + let rec eval0 = function + `A a -> evala a + | `B b -> evalb b + and evala : a -> int = function + #T1.a as x -> 1 + eval0 x + | `ZA -> 3 + and evalb : b -> int = function + #T1.a as x -> 1 + eval0 x + | `Z -> 7 +end +module M5 = F(M4) + +module M6 : sig + class ci : int -> + object + val x : int + method x : int + method move : int -> unit + end + type c = private #ci + val create : int -> c +end = struct + class ci x = object + val mutable x : int = x + method x = x + method move d = x <- x+d + end + type c = ci + let create = new ci +end +let f (x : M6.c) = x#move 3; x#x;; + +module M : sig type t = private [> `A of bool] end = + struct type t = [`A of int] end diff --git a/experimental/garrigue/gadt-escape-check.diff b/experimental/garrigue/gadt-escape-check.diff new file mode 100644 index 00000000..3e4a44e2 --- /dev/null +++ b/experimental/garrigue/gadt-escape-check.diff @@ -0,0 +1,519 @@ +Index: typing/env.ml +=================================================================== +--- typing/env.ml (revision 11214) ++++ typing/env.ml (working copy) +@@ -20,6 +20,7 @@ + open Longident + open Path + open Types ++open Btype + + + type error = +@@ -56,7 +57,7 @@ + cltypes: (Path.t * cltype_declaration) Ident.tbl; + summary: summary; + local_constraints: bool; +- level_map: (int * int) list; ++ gadt_instances: (int * TypeSet.t ref) list; + } + + and module_components = module_components_repr Lazy.t +@@ -96,7 +97,7 @@ + modules = Ident.empty; modtypes = Ident.empty; + components = Ident.empty; classes = Ident.empty; + cltypes = Ident.empty; +- summary = Env_empty; local_constraints = false; level_map = [] } ++ summary = Env_empty; local_constraints = false; gadt_instances = [] } + + let diff_keys is_local tbl1 tbl2 = + let keys2 = Ident.keys tbl2 in +@@ -286,13 +287,14 @@ + (* the level is changed when updating newtype definitions *) + if !Clflags.principal then begin + match level, decl.type_newtype_level with +- Some level, Some def_level when level < def_level -> raise Not_found ++ Some level, Some (_, exp_level) when level < exp_level -> raise Not_found + | _ -> () + end; + match decl.type_manifest with + | Some body when decl.type_private = Public + || decl.type_kind <> Type_abstract +- || Btype.has_constr_row body -> (decl.type_params, body) ++ || Btype.has_constr_row body -> ++ (decl.type_params, body, may_map snd decl.type_newtype_level) + (* The manifest type of Private abstract data types without + private row are still considered unknown to the type system. + Hence, this case is caught by the following clause that also handles +@@ -308,7 +310,7 @@ + match decl.type_manifest with + (* The manifest type of Private abstract data types can still get + an approximation using their manifest type. *) +- | Some body -> (decl.type_params, body) ++ | Some body -> (decl.type_params, body, may_map snd decl.type_newtype_level) + | _ -> raise Not_found + + let find_modtype_expansion path env = +@@ -453,32 +455,42 @@ + and lookup_cltype = + lookup (fun env -> env.cltypes) (fun sc -> sc.comp_cltypes) + +-(* Level handling *) ++(* GADT instance tracking *) + +-(* The level map is a list of pairs describing separate segments (lv,lv'), +- lv < lv', organized in decreasing order. +- The definition level is obtained by mapping a level in a segment to the +- high limit of this segment. +- The definition level of a newtype should be greater or equal to +- the highest level of the newtypes in its manifest type. +- *) ++let add_gadt_instance_level lv env = ++ {env with ++ gadt_instances = (lv, ref TypeSet.empty) :: env.gadt_instances} + +-let rec map_level lv = function +- | [] -> lv +- | (lv1, lv2) :: rem -> +- if lv > lv2 then lv else +- if lv >= lv1 then lv2 else map_level lv rem ++let is_Tlink = function {desc = Tlink _} -> true | _ -> false + +-let map_newtype_level env lv = map_level lv env.level_map ++let gadt_instance_level env t = ++ let rec find_instance = function ++ [] -> None ++ | (lv, r) :: rem -> ++ if TypeSet.exists is_Tlink !r then ++ r := TypeSet.fold (fun ty -> TypeSet.add (repr ty)) !r TypeSet.empty; ++ if TypeSet.mem t !r then Some lv else find_instance rem ++ in find_instance env.gadt_instances + +-(* precondition: lv < lv' *) +-let rec add_level lv lv' = function +- | [] -> [lv, lv'] +- | (lv1, lv2) :: rem as l -> +- if lv2 < lv then (lv, lv') :: l else +- if lv' < lv1 then (lv1, lv2) :: add_level lv lv' rem +- else add_level (max lv lv1) (min lv' lv2) rem ++let add_gadt_instances env lv tl = ++ let r = ++ try List.assoc lv env.gadt_instances with Not_found -> assert false in ++ r := List.fold_right TypeSet.add tl !r + ++(* Only use this after expand_head! *) ++let add_gadt_instance_chain env lv t = ++ let r = ++ try List.assoc lv env.gadt_instances with Not_found -> assert false in ++ let rec add_instance t = ++ let t = repr t in ++ if not (TypeSet.mem t !r) then begin ++ r := TypeSet.add t !r; ++ match t.desc with ++ Tconstr (p, _, memo) -> ++ may add_instance (find_expans Private p !memo) ++ | _ -> () ++ end ++ in add_instance t + + (* Expand manifest module type names at the top of the given module type *) + +@@ -497,7 +509,7 @@ + let constructors_of_type ty_path decl = + let handle_variants cstrs = + Datarepr.constructor_descrs +- (Btype.newgenty (Tconstr(ty_path, decl.type_params, ref Mnil))) ++ (newgenty (Tconstr(ty_path, decl.type_params, ref Mnil))) + cstrs decl.type_private + in + match decl.type_kind with +@@ -510,7 +522,7 @@ + match decl.type_kind with + Type_record(labels, rep) -> + Datarepr.label_descrs +- (Btype.newgenty (Tconstr(ty_path, decl.type_params, ref Mnil))) ++ (newgenty (Tconstr(ty_path, decl.type_params, ref Mnil))) + labels rep decl.type_private + | Type_variant _ | Type_abstract -> [] + +@@ -773,14 +785,13 @@ + and add_cltype id ty env = + store_cltype id (Pident id) ty env + +-let add_local_constraint id info mlv env = ++let add_local_constraint id info elv env = + match info with +- {type_manifest = Some ty; type_newtype_level = Some lv} -> +- (* use the newtype level for this definition, lv is the old one *) +- let env = add_type id {info with type_newtype_level = Some mlv} env in +- let level_map = +- if lv < mlv then add_level lv mlv env.level_map else env.level_map in +- { env with local_constraints = true; level_map = level_map } ++ {type_manifest = Some ty; type_newtype_level = Some (lv, _)} -> ++ (* elv is the expansion level, lv is the definition level *) ++ let env = ++ add_type id {info with type_newtype_level = Some (lv, elv)} env in ++ { env with local_constraints = true } + | _ -> assert false + + (* Insertion of bindings by name *) +Index: typing/typecore.ml +=================================================================== +--- typing/typecore.ml (revision 11214) ++++ typing/typecore.ml (working copy) +@@ -1989,6 +1989,7 @@ + end + | Pexp_newtype(name, sbody) -> + (* Create a fake abstract type declaration for name. *) ++ let level = get_current_level () in + let decl = { + type_params = []; + type_arity = 0; +@@ -1996,7 +1997,7 @@ + type_private = Public; + type_manifest = None; + type_variance = []; +- type_newtype_level = Some (get_current_level ()); ++ type_newtype_level = Some (level, level); + } + in + let ty = newvar () in +@@ -2421,6 +2422,7 @@ + begin_def (); + Ident.set_current_time (get_current_level ()); + let lev = Ident.current_time () in ++ let env = Env.add_gadt_instance_level lev env in + Ctype.init_def (lev+1000); + if !Clflags.principal then begin_def (); (* propagation of the argument *) + let ty_arg' = newvar () in +Index: typing/typedecl.ml +=================================================================== +--- typing/typedecl.ml (revision 11214) ++++ typing/typedecl.ml (working copy) +@@ -404,7 +404,7 @@ + else if to_check path' && not (List.mem path' prev_exp) then begin + try + (* Attempt expansion *) +- let (params0, body0) = Env.find_type_expansion path' env in ++ let (params0, body0, _) = Env.find_type_expansion path' env in + let (params, body) = + Ctype.instance_parameterized_type params0 body0 in + begin +Index: typing/types.mli +=================================================================== +--- typing/types.mli (revision 11214) ++++ typing/types.mli (working copy) +@@ -144,9 +144,9 @@ + type_manifest: type_expr option; + type_variance: (bool * bool * bool) list; + (* covariant, contravariant, weakly contravariant *) +- type_newtype_level: int option } ++ type_newtype_level: (int * int) option } ++ (* definition level * expansion level *) + +- + and type_kind = + Type_abstract + | Type_record of +Index: typing/ctype.ml +=================================================================== +--- typing/ctype.ml (revision 11214) ++++ typing/ctype.ml (working copy) +@@ -470,7 +470,7 @@ + free_variables := (ty, real) :: !free_variables + | Tconstr (path, tl, _), Some env -> + begin try +- let (_, body) = Env.find_type_expansion path env in ++ let (_, body, _) = Env.find_type_expansion path env in + if (repr body).level <> generic_level then + free_variables := (ty, real) :: !free_variables + with Not_found -> () +@@ -687,7 +687,7 @@ + try + match (Env.find_type p env).type_newtype_level with + | None -> Path.binding_time p +- | Some x -> x ++ | Some (x, _) -> x + with + | _ -> + (* no newtypes in predef *) +@@ -696,9 +696,13 @@ + let rec update_level env level ty = + let ty = repr ty in + if ty.level > level then begin ++ if !Clflags.principal && Env.has_local_constraints env then begin ++ match Env.gadt_instance_level env ty with ++ Some lv -> if level < lv then raise (Unify [(ty, newvar2 level)]) ++ | None -> () ++ end; + match ty.desc with +- Tconstr(p, tl, abbrev) +- when level < Env.map_newtype_level env (get_level env p) -> ++ Tconstr(p, tl, abbrev) when level < get_level env p -> + (* Try first to replace an abbreviation by its expansion. *) + begin try + (* if is_newtype env p then raise Cannot_expand; *) +@@ -1025,7 +1029,7 @@ + | Some (env, newtype_lev) -> + let existentials = List.map copy cstr.cstr_existentials in + let process existential = +- let decl = new_declaration (Some newtype_lev) None in ++ let decl = new_declaration (Some (newtype_lev, newtype_lev)) None in + let (id, new_env) = + Env.enter_type (get_new_abstract_name ()) decl !env in + env := new_env; +@@ -1271,7 +1275,7 @@ + end; + ty + | None -> +- let (params, body) = ++ let (params, body, lv) = + try find_type_expansion level path env with Not_found -> + raise Cannot_expand + in +@@ -1284,6 +1288,15 @@ + ty.desc <- Tvariant { row with row_name = Some (path, args) } + | _ -> () + end; ++ (* For gadts, remember type as non exportable *) ++ if !Clflags.principal then begin ++ match lv with ++ Some lv -> Env.add_gadt_instances env lv [ty; ty'] ++ | None -> ++ match Env.gadt_instance_level env ty with ++ Some lv -> Env.add_gadt_instances env lv [ty'] ++ | None -> () ++ end; + ty' + end + | _ -> +@@ -1306,15 +1319,7 @@ + let try_expand_once env ty = + let ty = repr ty in + match ty.desc with +- Tconstr (p, _, _) -> +- let ty' = repr (expand_abbrev env ty) in +- if !Clflags.principal then begin +- match (Env.find_type p env).type_newtype_level with +- Some lv when ty.level < Env.map_newtype_level env lv -> +- link_type ty ty' +- | _ -> () +- end; +- ty' ++ Tconstr (p, _, _) -> repr (expand_abbrev env ty) + | _ -> raise Cannot_expand + + let _ = forward_try_expand_once := try_expand_once +@@ -1324,11 +1329,16 @@ + May raise Unify, if a recursion was hidden in the type. *) + let rec try_expand_head env ty = + let ty' = try_expand_once env ty in +- begin try +- try_expand_head env ty' +- with Cannot_expand -> +- ty' +- end ++ let ty'' = ++ try try_expand_head env ty' ++ with Cannot_expand -> ty' ++ in ++ if !Clflags.principal then begin ++ match Env.gadt_instance_level env ty'' with ++ None -> () ++ | Some lv -> Env.add_gadt_instance_chain env lv ty ++ end; ++ ty'' + + (* Expand once the head of a type *) + let expand_head_once env ty = +@@ -1405,7 +1415,7 @@ + *) + let generic_abbrev env path = + try +- let (_, body) = Env.find_type_expansion path env in ++ let (_, body, _) = Env.find_type_expansion path env in + (repr body).level = generic_level + with + Not_found -> +@@ -1742,7 +1752,7 @@ + let reify env t = + let newtype_level = get_newtype_level () in + let create_fresh_constr lev row = +- let decl = new_declaration (Some (newtype_level)) None in ++ let decl = new_declaration (Some (newtype_level, newtype_level)) None in + let name = + let name = get_new_abstract_name () in + if row then name ^ "#row" else name +@@ -2065,7 +2075,7 @@ + update_level !env t1.level t2; + link_type t1 t2 + | (Tconstr (p1, [], a1), Tconstr (p2, [], a2)) +- when Path.same p1 p2 && actual_mode !env = Old ++ when Path.same p1 p2 (* && actual_mode !env = Old *) + (* This optimization assumes that t1 does not expand to t2 + (and conversely), so we fall back to the general case + when any of the types has a cached expansion. *) +@@ -2091,6 +2101,15 @@ + if unify_eq !env t1' t2' then () else + + let t1 = repr t1 and t2 = repr t2 in ++ if !Clflags.principal then begin ++ match Env.gadt_instance_level !env t1',Env.gadt_instance_level !env t2' with ++ Some lv1, Some lv2 -> ++ if lv1 > lv2 then Env.add_gadt_instance_chain !env lv1 t2 else ++ if lv2 > lv2 then Env.add_gadt_instance_chain !env lv2 t1 ++ | Some lv1, None -> Env.add_gadt_instance_chain !env lv1 t2 ++ | None, Some lv2 -> Env.add_gadt_instance_chain !env lv2 t1 ++ | None, None -> () ++ end; + if unify_eq !env t1 t1' || not (unify_eq !env t2 t2') then + unify3 env t1 t1' t2 t2' + else +Index: typing/env.mli +=================================================================== +--- typing/env.mli (revision 11214) ++++ typing/env.mli (working copy) +@@ -33,14 +33,19 @@ + val find_cltype: Path.t -> t -> cltype_declaration + + val find_type_expansion: +- ?use_local:bool -> ?level:int -> Path.t -> t -> type_expr list * type_expr +-val find_type_expansion_opt: Path.t -> t -> type_expr list * type_expr ++ ?use_local:bool -> ?level:int -> Path.t -> t -> ++ type_expr list * type_expr * int option ++val find_type_expansion_opt: ++ Path.t -> t -> type_expr list * type_expr * int option + (* Find the manifest type information associated to a type for the sake + of the compiler's type-based optimisations. *) + val find_modtype_expansion: Path.t -> t -> Types.module_type + + val has_local_constraints: t -> bool +-val map_newtype_level: t -> int -> int ++val add_gadt_instance_level: int -> t -> t ++val gadt_instance_level: t -> type_expr -> int option ++val add_gadt_instances: t -> int -> type_expr list -> unit ++val add_gadt_instance_chain: t -> int -> type_expr -> unit + + (* Lookup by long identifiers *) + +Index: typing/types.ml +=================================================================== +--- typing/types.ml (revision 11214) ++++ typing/types.ml (working copy) +@@ -146,8 +146,8 @@ + type_private: private_flag; + type_manifest: type_expr option; + type_variance: (bool * bool * bool) list; +- type_newtype_level: int option } + (* covariant, contravariant, weakly contravariant *) ++ type_newtype_level: (int * int) option } + + and type_kind = + Type_abstract +Index: testsuite/tests/typing-gadts/test.ml +=================================================================== +--- testsuite/tests/typing-gadts/test.ml (revision 11214) ++++ testsuite/tests/typing-gadts/test.ml (working copy) +@@ -159,17 +159,21 @@ + + let ky x y = ignore (x = y); x ;; + ++let test : type a. a t -> a = ++ function Int -> ky (1 : a) 1 ++;; ++ + let test : type a. a t -> a = fun x -> +- let r = match x with Int -> ky (1 : a) 1 ++ let r = match x with Int -> ky (1 : a) 1 (* fails *) + in r + ;; + let test : type a. a t -> a = fun x -> +- let r = match x with Int -> ky 1 (1 : a) ++ let r = match x with Int -> ky 1 (1 : a) (* fails *) + in r + ;; + let test : type a. a t -> a = fun x -> +- let r = match x with Int -> (1 : a) +- in r (* fails too *) ++ let r = match x with Int -> (1 : a) (* ok! *) ++ in r + ;; + let test : type a. a t -> a = fun x -> + let r : a = match x with Int -> 1 +@@ -178,7 +182,7 @@ + let test2 : type a. a t -> a option = fun x -> + let r = ref None in + begin match x with Int -> r := Some (1 : a) end; +- !r (* normalized to int option *) ++ !r (* ok *) + ;; + let test2 : type a. a t -> a option = fun x -> + let r : a option ref = ref None in +@@ -190,19 +194,19 @@ + let u = ref None in + begin match x with Int -> r := Some 1; u := !r end; + !u +-;; (* fail *) ++;; (* ok (u non-ambiguous) *) + let test2 : type a. a t -> a option = fun x -> + let r : a option ref = ref None in + let u = ref None in + begin match x with Int -> u := Some 1; r := !u end; + !u +-;; (* fail *) ++;; (* fails because u : (int | a) option ref *) + let test2 : type a. a t -> a option = fun x -> + let u = ref None in + let r : a option ref = ref None in + begin match x with Int -> r := Some 1; u := !r end; + !u +-;; (* fail *) ++;; (* ok *) + let test2 : type a. a t -> a option = fun x -> + let u = ref None in + let a = +@@ -210,32 +214,32 @@ + begin match x with Int -> r := Some 1; u := !r end; + !u + in a +-;; (* fail *) ++;; (* ok *) + + (* Effect of external consraints *) + + let f (type a) (x : a t) y = + ignore (y : a); +- let r = match x with Int -> (y : a) in (* fails *) ++ let r = match x with Int -> (y : a) in (* ok *) + r + ;; + let f (type a) (x : a t) y = + let r = match x with Int -> (y : a) in +- ignore (y : a); (* fails *) ++ ignore (y : a); (* ok *) + r + ;; + let f (type a) (x : a t) y = + ignore (y : a); +- let r = match x with Int -> y in ++ let r = match x with Int -> y in (* ok *) + r + ;; + let f (type a) (x : a t) y = + let r = match x with Int -> y in +- ignore (y : a); ++ ignore (y : a); (* ok *) + r + ;; + let f (type a) (x : a t) (y : a) = +- match x with Int -> y (* should return an int! *) ++ match x with Int -> y (* returns 'a *) + ;; + + (* Pattern matching *) +@@ -307,4 +311,4 @@ + | {left=TE TC; right=D [|1.0|]} -> 14 + | {left=TA; right=D 0} -> -1 + | {left=TA; right=D z} -> z +-;; (* warn *) ++;; (* ok *) diff --git a/experimental/garrigue/generative-functors.diff b/experimental/garrigue/generative-functors.diff new file mode 100644 index 00000000..c7786d11 --- /dev/null +++ b/experimental/garrigue/generative-functors.diff @@ -0,0 +1,1008 @@ +Index: boot/ocamlc +=================================================================== +Cannot display: file marked as a binary type. +svn:mime-type = application/octet-stream +Index: boot/ocamldep +=================================================================== +Cannot display: file marked as a binary type. +svn:mime-type = application/octet-stream +Index: boot/ocamllex +=================================================================== +Cannot display: file marked as a binary type. +svn:mime-type = application/octet-stream +Index: camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml +=================================================================== +--- camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml (revision 14301) ++++ camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml (working copy) +@@ -979,7 +979,7 @@ + [ <:module_type@loc<>> -> error loc "abstract/nil module type not allowed here" + | <:module_type@loc< $id:i$ >> -> mkmty loc (Pmty_ident (long_uident i)) + | <:module_type@loc< functor ($n$ : $nt$) -> $mt$ >> -> +- mkmty loc (Pmty_functor (with_loc n loc) (module_type nt) (module_type mt)) ++ mkmty loc (Pmty_functor (with_loc n loc) (Some (module_type nt)) (module_type mt)) + | <:module_type@loc< '$_$ >> -> error loc "module type variable not allowed here" + | <:module_type@loc< sig $sl$ end >> -> + mkmty loc (Pmty_signature (sig_item sl [])) +@@ -1051,7 +1051,7 @@ + | <:module_expr@loc< $me1$ $me2$ >> -> + mkmod loc (Pmod_apply (module_expr me1) (module_expr me2)) + | <:module_expr@loc< functor ($n$ : $mt$) -> $me$ >> -> +- mkmod loc (Pmod_functor (with_loc n loc) (module_type mt) (module_expr me)) ++ mkmod loc (Pmod_functor (with_loc n loc) (Some (module_type mt)) (module_expr me)) + | <:module_expr@loc< struct $sl$ end >> -> + mkmod loc (Pmod_structure (str_item sl [])) + | <:module_expr@loc< ($me$ : $mt$) >> -> +Index: camlp4/Camlp4Top/Rprint.ml +=================================================================== +--- camlp4/Camlp4Top/Rprint.ml (revision 14301) ++++ camlp4/Camlp4Top/Rprint.ml (working copy) +@@ -362,7 +362,10 @@ + | Omty_signature sg -> + fprintf ppf "@[<hv 2>sig@ %a@;<1 -2>end@]" + Toploop.print_out_signature.val sg +- | Omty_functor name mty_arg mty_res -> ++ | Omty_functor _ None mty_res -> ++ fprintf ppf "@[<2>functor@ () ->@ %a@]" ++ print_out_module_type mty_res ++ | Omty_functor name (Some mty_arg) mty_res -> + fprintf ppf "@[<2>functor@ (%s : %a) ->@ %a@]" name + print_out_module_type mty_arg print_out_module_type mty_res + | Omty_abstract -> () ] +Index: camlp4/boot/Camlp4.ml +=================================================================== +--- camlp4/boot/Camlp4.ml (revision 14301) ++++ camlp4/boot/Camlp4.ml (working copy) +@@ -15633,7 +15633,7 @@ + | Ast.MtId (loc, i) -> mkmty loc (Pmty_ident (long_uident i)) + | Ast.MtFun (loc, n, nt, mt) -> + mkmty loc +- (Pmty_functor ((with_loc n loc), (module_type nt), ++ (Pmty_functor ((with_loc n loc), Some (module_type nt), + (module_type mt))) + | Ast.MtQuo (loc, _) -> + error loc "module type variable not allowed here" +@@ -15775,7 +15775,7 @@ + (Pmod_apply ((module_expr me1), (module_expr me2))) + | Ast.MeFun (loc, n, mt, me) -> + mkmod loc +- (Pmod_functor ((with_loc n loc), (module_type mt), ++ (Pmod_functor ((with_loc n loc), Some (module_type mt), + (module_expr me))) + | Ast.MeStr (loc, sl) -> + mkmod loc (Pmod_structure (str_item sl [])) +Index: ocamldoc/odoc_ast.ml +=================================================================== +--- ocamldoc/odoc_ast.ml (revision 14301) ++++ ocamldoc/odoc_ast.ml (working copy) +@@ -1606,18 +1606,25 @@ + + | (Parsetree.Pmod_functor (_, pmodule_type, p_module_expr2), + Typedtree.Tmod_functor (ident, _, mtyp, tt_module_expr2)) -> +- let loc_start = pmodule_type.Parsetree.pmty_loc.Location.loc_start.Lexing.pos_cnum in +- let loc_end = pmodule_type.Parsetree.pmty_loc.Location.loc_end.Lexing.pos_cnum in ++ let loc = match pmodule_type with None -> Location.none ++ | Some pmty -> pmty.Parsetree.pmty_loc in ++ let loc_start = loc.Location.loc_start.Lexing.pos_cnum in ++ let loc_end = loc.Location.loc_end.Lexing.pos_cnum in + let mp_type_code = get_string_of_file loc_start loc_end in + print_DEBUG (Printf.sprintf "mp_type_code=%s" mp_type_code); + let mp_name = Name.from_ident ident in +- let mp_kind = Sig.analyse_module_type_kind env +- current_module_name pmodule_type mtyp.mty_type ++ let mp_kind = ++ match pmodule_type, mtyp with ++ Some pmty, Some mty -> ++ Sig.analyse_module_type_kind env current_module_name pmty ++ mty.mty_type ++ | _ -> Module_type_struct [] + in + let param = + { + mp_name = mp_name ; +- mp_type = Odoc_env.subst_module_type env mtyp.mty_type ; ++ mp_type = Misc.may_map ++ (fun m -> Odoc_env.subst_module_type env m.mty_type) mtyp ; + mp_type_code = mp_type_code ; + mp_kind = mp_kind ; + } +Index: ocamldoc/odoc_env.ml +=================================================================== +--- ocamldoc/odoc_env.ml (revision 14301) ++++ ocamldoc/odoc_env.ml (working copy) +@@ -223,7 +223,7 @@ + | Types.Mty_signature _ -> + t + | Types.Mty_functor (id, mt1, mt2) -> +- Types.Mty_functor (id, iter mt1, iter mt2) ++ Types.Mty_functor (id, Misc.may_map iter mt1, iter mt2) + in + iter t + +Index: ocamldoc/odoc_html.ml +=================================================================== +--- ocamldoc/odoc_html.ml (revision 14301) ++++ ocamldoc/odoc_html.ml (working copy) +@@ -1384,7 +1384,8 @@ + + (** Print html code to display the type of a module parameter.. *) + method html_of_module_parameter_type b m_name p = +- self#html_of_module_type b m_name ~code: p.mp_type_code p.mp_type ++ match p.mp_type with None -> bs b "<code>()</code>" ++ | Some mty -> self#html_of_module_type b m_name ~code: p.mp_type_code mty + + (** Generate a file containing the module type in the given file name. *) + method output_module_type in_title file mtyp = +Index: ocamldoc/odoc_info.mli +=================================================================== +--- ocamldoc/odoc_info.mli (revision 14301) ++++ ocamldoc/odoc_info.mli (working copy) +@@ -434,7 +434,7 @@ + + and module_parameter = Odoc_module.module_parameter = { + mp_name : string ; (** the name *) +- mp_type : Types.module_type ; (** the type *) ++ mp_type : Types.module_type option ; (** the type *) + mp_type_code : string ; (** the original code *) + mp_kind : module_type_kind ; (** the way the parameter was built *) + } +Index: ocamldoc/odoc_man.ml +=================================================================== +--- ocamldoc/odoc_man.ml (revision 14301) ++++ ocamldoc/odoc_man.ml (working copy) +@@ -612,7 +612,7 @@ + (fun (p, desc_opt) -> + bs b ".sp\n"; + bs b ("\""^p.mp_name^"\"\n"); +- self#man_of_module_type b m_name p.mp_type; ++ Misc.may (self#man_of_module_type b m_name) p.mp_type; + bs b "\n"; + ( + match desc_opt with +Index: ocamldoc/odoc_module.ml +=================================================================== +--- ocamldoc/odoc_module.ml (revision 14301) ++++ ocamldoc/odoc_module.ml (working copy) +@@ -46,7 +46,7 @@ + + and module_parameter = { + mp_name : string ; (** the name *) +- mp_type : Types.module_type ; (** the type *) ++ mp_type : Types.module_type option ; (** the type *) + mp_type_code : string ; (** the original code *) + mp_kind : module_type_kind ; (** the way the parameter was built *) + } +Index: ocamldoc/odoc_print.ml +=================================================================== +--- ocamldoc/odoc_print.ml (revision 14301) ++++ ocamldoc/odoc_print.ml (working copy) +@@ -62,7 +62,7 @@ + | Some s -> raise (Use_code s) + ) + | Types.Mty_functor (id, mt1, mt2) -> +- Types.Mty_functor (id, iter mt1, iter mt2) ++ Types.Mty_functor (id, Misc.may_map iter mt1, iter mt2) + in + iter t + +Index: ocamldoc/odoc_sig.ml +=================================================================== +--- ocamldoc/odoc_sig.ml (revision 14301) ++++ ocamldoc/odoc_sig.ml (working copy) +@@ -1082,19 +1082,26 @@ + + | Parsetree.Pmty_functor (_, pmodule_type2, module_type2) -> + ( +- let loc_start = pmodule_type2.Parsetree.pmty_loc.Location.loc_start.Lexing.pos_cnum in +- let loc_end = pmodule_type2.Parsetree.pmty_loc.Location.loc_end.Lexing.pos_cnum in ++ let loc = match pmodule_type2 with None -> Location.none ++ | Some pmty -> pmty.Parsetree.pmty_loc in ++ let loc_start = loc.Location.loc_start.Lexing.pos_cnum in ++ let loc_end = loc.Location.loc_end.Lexing.pos_cnum in + let mp_type_code = get_string_of_file loc_start loc_end in + print_DEBUG (Printf.sprintf "mp_type_code=%s" mp_type_code); + match sig_module_type with + Types.Mty_functor (ident, param_module_type, body_module_type) -> +- let mp_kind = analyse_module_type_kind env +- current_module_name pmodule_type2 param_module_type ++ let mp_kind = ++ match pmodule_type2, param_module_type with ++ Some pmty, Some mty -> ++ analyse_module_type_kind env current_module_name pmty mty ++ | _ -> Module_type_struct [] + in + let param = + { + mp_name = Name.from_ident ident ; +- mp_type = Odoc_env.subst_module_type env param_module_type ; ++ mp_type = ++ Misc.may_map (Odoc_env.subst_module_type env) ++ param_module_type; + mp_type_code = mp_type_code ; + mp_kind = mp_kind ; + } +@@ -1161,17 +1168,23 @@ + ( + match sig_module_type with + Types.Mty_functor (ident, param_module_type, body_module_type) -> +- let loc_start = pmodule_type2.Parsetree.pmty_loc.Location.loc_start.Lexing.pos_cnum in +- let loc_end = pmodule_type2.Parsetree.pmty_loc.Location.loc_end.Lexing.pos_cnum in ++ let loc = match pmodule_type2 with None -> Location.none ++ | Some pmty -> pmty.Parsetree.pmty_loc in ++ let loc_start = loc.Location.loc_start.Lexing.pos_cnum in ++ let loc_end = loc.Location.loc_end.Lexing.pos_cnum in + let mp_type_code = get_string_of_file loc_start loc_end in + print_DEBUG (Printf.sprintf "mp_type_code=%s" mp_type_code); +- let mp_kind = analyse_module_type_kind env +- current_module_name pmodule_type2 param_module_type ++ let mp_kind = ++ match pmodule_type2, param_module_type with ++ Some pmty, Some mty -> ++ analyse_module_type_kind env current_module_name pmty mty ++ | _ -> Module_type_struct [] + in + let param = + { + mp_name = Name.from_ident ident ; +- mp_type = Odoc_env.subst_module_type env param_module_type ; ++ mp_type = Misc.may_map ++ (Odoc_env.subst_module_type env) param_module_type ; + mp_type_code = mp_type_code ; + mp_kind = mp_kind ; + } +Index: ocamldoc/odoc_to_text.ml +=================================================================== +--- ocamldoc/odoc_to_text.ml (revision 14301) ++++ ocamldoc/odoc_to_text.ml (working copy) +@@ -428,8 +428,11 @@ + List + (List.map + (fun (p, desc_opt) -> +- [Code (p.mp_name^" : ")] @ +- (self#text_of_module_type p.mp_type) @ ++ begin match p.mp_type with None -> [Raw ""] ++ | Some mty -> ++ [Code (p.mp_name^" : ")] @ ++ (self#text_of_module_type mty) ++ end @ + (match desc_opt with + None -> [] + | Some t -> (Raw " ") :: t) +Index: parsing/ast_helper.mli +=================================================================== +--- parsing/ast_helper.mli (revision 14301) ++++ parsing/ast_helper.mli (working copy) +@@ -145,7 +145,8 @@ + + val ident: ?loc:loc -> ?attrs:attrs -> lid -> module_type + val signature: ?loc:loc -> ?attrs:attrs -> signature -> module_type +- val functor_: ?loc:loc -> ?attrs:attrs -> str -> module_type -> module_type -> module_type ++ val functor_: ?loc:loc -> ?attrs:attrs -> ++ str -> module_type option -> module_type -> module_type + val with_: ?loc:loc -> ?attrs:attrs -> module_type -> with_constraint list -> module_type + val typeof_: ?loc:loc -> ?attrs:attrs -> module_expr -> module_type + val extension: ?loc:loc -> ?attrs:attrs -> extension -> module_type +@@ -159,7 +160,8 @@ + + val ident: ?loc:loc -> ?attrs:attrs -> lid -> module_expr + val structure: ?loc:loc -> ?attrs:attrs -> structure -> module_expr +- val functor_: ?loc:loc -> ?attrs:attrs -> str -> module_type -> module_expr -> module_expr ++ val functor_: ?loc:loc -> ?attrs:attrs -> ++ str -> module_type option -> module_expr -> module_expr + val apply: ?loc:loc -> ?attrs:attrs -> module_expr -> module_expr -> module_expr + val constraint_: ?loc:loc -> ?attrs:attrs -> module_expr -> module_type -> module_expr + val unpack: ?loc:loc -> ?attrs:attrs -> expression -> module_expr +Index: parsing/ast_mapper.ml +=================================================================== +--- parsing/ast_mapper.ml (revision 14301) ++++ parsing/ast_mapper.ml (working copy) +@@ -161,7 +161,8 @@ + | Pmty_ident s -> ident ~loc ~attrs (map_loc sub s) + | Pmty_signature sg -> signature ~loc ~attrs (sub.signature sub sg) + | Pmty_functor (s, mt1, mt2) -> +- functor_ ~loc ~attrs (map_loc sub s) (sub.module_type sub mt1) ++ functor_ ~loc ~attrs (map_loc sub s) ++ (Misc.may_map (sub.module_type sub) mt1) + (sub.module_type sub mt2) + | Pmty_with (mt, l) -> + with_ ~loc ~attrs (sub.module_type sub mt) +@@ -213,7 +214,8 @@ + | Pmod_ident x -> ident ~loc ~attrs (map_loc sub x) + | Pmod_structure str -> structure ~loc ~attrs (sub.structure sub str) + | Pmod_functor (arg, arg_ty, body) -> +- functor_ ~loc ~attrs (map_loc sub arg) (sub.module_type sub arg_ty) ++ functor_ ~loc ~attrs (map_loc sub arg) ++ (Misc.may_map (sub.module_type sub) arg_ty) + (sub.module_expr sub body) + | Pmod_apply (m1, m2) -> + apply ~loc ~attrs (sub.module_expr sub m1) (sub.module_expr sub m2) +Index: parsing/parser.mly +=================================================================== +--- parsing/parser.mly (revision 14301) ++++ parsing/parser.mly (working copy) +@@ -541,9 +541,13 @@ + | STRUCT structure error + { unclosed "struct" 1 "end" 3 } + | FUNCTOR LPAREN UIDENT COLON module_type RPAREN MINUSGREATER module_expr +- { mkmod(Pmod_functor(mkrhs $3 3, $5, $8)) } ++ { mkmod(Pmod_functor(mkrhs $3 3, Some $5, $8)) } ++ | FUNCTOR LPAREN RPAREN MINUSGREATER module_expr ++ { mkmod(Pmod_functor(mkrhs "()" 3, None, $5)) } + | module_expr LPAREN module_expr RPAREN + { mkmod(Pmod_apply($1, $3)) } ++ | module_expr LPAREN RPAREN ++ { mkmod(Pmod_apply($1, mkmod (Pmod_structure []))) } + | module_expr LPAREN module_expr error + { unclosed "(" 2 ")" 4 } + | LPAREN module_expr COLON module_type RPAREN +@@ -640,7 +644,9 @@ + | COLON module_type EQUAL module_expr + { mkmod(Pmod_constraint($4, $2)) } + | LPAREN UIDENT COLON module_type RPAREN module_binding_body +- { mkmod(Pmod_functor(mkrhs $2 2, $4, $6)) } ++ { mkmod(Pmod_functor(mkrhs $2 2, Some $4, $6)) } ++ | LPAREN RPAREN module_binding_body ++ { mkmod(Pmod_functor(mkrhs "()" 1, None, $3)) } + ; + module_bindings: + module_binding { [$1] } +@@ -662,7 +668,10 @@ + { unclosed "sig" 1 "end" 3 } + | FUNCTOR LPAREN UIDENT COLON module_type RPAREN MINUSGREATER module_type + %prec below_WITH +- { mkmty(Pmty_functor(mkrhs $3 3, $5, $8)) } ++ { mkmty(Pmty_functor(mkrhs $3 3, Some $5, $8)) } ++ | FUNCTOR LPAREN RPAREN MINUSGREATER module_type ++ %prec below_WITH ++ { mkmty(Pmty_functor(mkrhs "()" 2, None, $5)) } + | module_type WITH with_constraints + { mkmty(Pmty_with($1, List.rev $3)) } + | MODULE TYPE OF module_expr %prec below_LBRACKETAT +@@ -724,7 +733,9 @@ + COLON module_type + { $2 } + | LPAREN UIDENT COLON module_type RPAREN module_declaration +- { mkmty(Pmty_functor(mkrhs $2 2, $4, $6)) } ++ { mkmty(Pmty_functor(mkrhs $2 2, Some $4, $6)) } ++ | LPAREN RPAREN module_declaration ++ { mkmty(Pmty_functor(mkrhs "()" 1, None, $3)) } + ; + module_rec_declarations: + module_rec_declaration { [$1] } +Index: parsing/parsetree.mli +=================================================================== +--- parsing/parsetree.mli (revision 14301) ++++ parsing/parsetree.mli (working copy) +@@ -543,7 +543,7 @@ + (* S *) + | Pmty_signature of signature + (* sig ... end *) +- | Pmty_functor of string loc * module_type * module_type ++ | Pmty_functor of string loc * module_type option * module_type + (* functor(X : MT1) -> MT2 *) + | Pmty_with of module_type * with_constraint list + (* MT with ... *) +@@ -637,7 +637,7 @@ + (* X *) + | Pmod_structure of structure + (* struct ... end *) +- | Pmod_functor of string loc * module_type * module_expr ++ | Pmod_functor of string loc * module_type option * module_expr + (* functor(X : MT1) -> ME *) + | Pmod_apply of module_expr * module_expr + (* ME1(ME2) *) +Index: parsing/pprintast.ml +=================================================================== +--- parsing/pprintast.ml (revision 14301) ++++ parsing/pprintast.ml (working copy) +@@ -834,7 +834,9 @@ + | Pmty_signature (s) -> + pp f "@[<hv0>@[<hv2>sig@ %a@]@ end@]" (* "@[<hov>sig@ %a@ end@]" *) + (self#list self#signature_item ) s (* FIXME wrong indentation*) +- | Pmty_functor (s, mt1, mt2) -> ++ | Pmty_functor (_, None, mt2) -> ++ pp f "@[<hov2>functor () ->@ %a@]" self#module_type mt2 ++ | Pmty_functor (s, Some mt1, mt2) -> + pp f "@[<hov2>functor@ (%s@ :@ %a)@ ->@ %a@]" s.txt + self#module_type mt1 self#module_type mt2 + | Pmty_with (mt, l) -> +@@ -940,7 +942,9 @@ + self#module_type mt + | Pmod_ident (li) -> + pp f "%a" self#longident_loc li; +- | Pmod_functor (s, mt, me) -> ++ | Pmod_functor (_, None, me) -> ++ pp f "functor ()@;->@;%a" self#module_expr me ++ | Pmod_functor (s, Some mt, me) -> + pp f "functor@ (%s@ :@ %a)@;->@;%a" + s.txt self#module_type mt self#module_expr me + | Pmod_apply (me1, me2) -> +@@ -1025,7 +1029,8 @@ + | Pstr_module x -> + let rec module_helper me = match me.pmod_desc with + | Pmod_functor(s,mt,me) -> +- pp f "(%s:%a)" s.txt self#module_type mt ; ++ if mt = None then pp f "()" ++ else Misc.may (pp f "(%s:%a)" s.txt self#module_type) mt; + module_helper me + | _ -> me in + pp f "@[<hov2>module %s%a@]" +Index: parsing/printast.ml +=================================================================== +--- parsing/printast.ml (revision 14301) ++++ parsing/printast.ml (working copy) +@@ -576,7 +576,7 @@ + signature i ppf s; + | Pmty_functor (s, mt1, mt2) -> + line i ppf "Pmty_functor %a\n" fmt_string_loc s; +- module_type i ppf mt1; ++ Misc.may (module_type i ppf) mt1; + module_type i ppf mt2; + | Pmty_with (mt, l) -> + line i ppf "Pmty_with\n"; +@@ -670,7 +670,7 @@ + structure i ppf s; + | Pmod_functor (s, mt, me) -> + line i ppf "Pmod_functor %a\n" fmt_string_loc s; +- module_type i ppf mt; ++ Misc.may (module_type i ppf) mt; + module_expr i ppf me; + | Pmod_apply (me1, me2) -> + line i ppf "Pmod_apply\n"; +Index: tools/depend.ml +=================================================================== +--- tools/depend.ml (revision 14301) ++++ tools/depend.ml (working copy) +@@ -201,7 +201,8 @@ + Pmty_ident l -> add bv l + | Pmty_signature s -> add_signature bv s + | Pmty_functor(id, mty1, mty2) -> +- add_modtype bv mty1; add_modtype (StringSet.add id.txt bv) mty2 ++ Misc.may (add_modtype bv) mty1; ++ add_modtype (StringSet.add id.txt bv) mty2 + | Pmty_with(mty, cstrl) -> + add_modtype bv mty; + List.iter +@@ -258,7 +259,7 @@ + Pmod_ident l -> addmodule bv l + | Pmod_structure s -> ignore (add_structure bv s) + | Pmod_functor(id, mty, modl) -> +- add_modtype bv mty; ++ Misc.may (add_modtype bv) mty; + add_module (StringSet.add id.txt bv) modl + | Pmod_apply(mod1, mod2) -> + add_module bv mod1; add_module bv mod2 +Index: tools/tast_iter.ml +=================================================================== +--- tools/tast_iter.ml (revision 14301) ++++ tools/tast_iter.ml (working copy) +@@ -193,7 +193,7 @@ + | Tmty_ident (_path, _) -> () + | Tmty_signature sg -> sub # signature sg + | Tmty_functor (_id, _, mtype1, mtype2) -> +- sub # module_type mtype1; sub # module_type mtype2 ++ Misc.may (sub # module_type) mtype1; sub # module_type mtype2 + | Tmty_with (mtype, list) -> + sub # module_type mtype; + List.iter (fun (_, _, withc) -> sub # with_constraint withc) list +@@ -212,7 +212,7 @@ + | Tmod_ident (_p, _) -> () + | Tmod_structure st -> sub # structure st + | Tmod_functor (_id, _, mtype, mexpr) -> +- sub # module_type mtype; ++ Misc.may (sub # module_type) mtype; + sub # module_expr mexpr + | Tmod_apply (mexp1, mexp2, _) -> + sub # module_expr mexp1; +Index: tools/untypeast.ml +=================================================================== +--- tools/untypeast.ml (revision 14301) ++++ tools/untypeast.ml (working copy) +@@ -376,7 +376,7 @@ + Tmty_ident (_path, lid) -> Pmty_ident (lid) + | Tmty_signature sg -> Pmty_signature (untype_signature sg) + | Tmty_functor (_id, name, mtype1, mtype2) -> +- Pmty_functor (name, untype_module_type mtype1, ++ Pmty_functor (name, Misc.may_map untype_module_type mtype1, + untype_module_type mtype2) + | Tmty_with (mtype, list) -> + Pmty_with (untype_module_type mtype, +@@ -405,7 +405,7 @@ + Tmod_ident (_p, lid) -> Pmod_ident (lid) + | Tmod_structure st -> Pmod_structure (untype_structure st) + | Tmod_functor (_id, name, mtype, mexpr) -> +- Pmod_functor (name, untype_module_type mtype, ++ Pmod_functor (name, Misc.may_map untype_module_type mtype, + untype_module_expr mexpr) + | Tmod_apply (mexp1, mexp2, _) -> + Pmod_apply (untype_module_expr mexp1, untype_module_expr mexp2) +Index: typing/btype.ml +=================================================================== +--- typing/btype.ml (revision 14301) ++++ typing/btype.ml (working copy) +@@ -56,6 +56,9 @@ + let is_Tunivar = function {desc=Tunivar _} -> true | _ -> false + + let dummy_method = "*dummy method*" ++let default_mty = function ++ Some mty -> mty ++ | None -> Mty_signature [] + + (**** Representative of a type ****) + +Index: typing/btype.mli +=================================================================== +--- typing/btype.mli (revision 14301) ++++ typing/btype.mli (working copy) +@@ -39,9 +39,12 @@ + (* Return a fresh marked generic variable *) + *) + ++(**** Types ****) ++ + val is_Tvar: type_expr -> bool + val is_Tunivar: type_expr -> bool + val dummy_method: label ++val default_mty: module_type option -> module_type + + val repr: type_expr -> type_expr + (* Return the canonical representative of a type. *) +Index: typing/env.ml +=================================================================== +--- typing/env.ml (revision 14301) ++++ typing/env.ml (working copy) +@@ -201,7 +201,7 @@ + + and functor_components = { + fcomp_param: Ident.t; (* Formal parameter *) +- fcomp_arg: module_type; (* Argument signature *) ++ fcomp_arg: module_type option; (* Argument signature *) + fcomp_res: module_type; (* Result signature *) + fcomp_env: t; (* Environment in which the result signature makes sense *) + fcomp_subst: Subst.t; (* Prefixing substitution for the result signature *) +@@ -522,7 +522,7 @@ + let (p2, {md_type=mty2}) = lookup_module l2 env in + begin match EnvLazy.force !components_of_module_maker' desc1 with + Functor_comps f -> +- !check_modtype_inclusion env mty2 p2 f.fcomp_arg; ++ Misc.may (!check_modtype_inclusion env mty2 p2) f.fcomp_arg; + (Papply(p1, p2), !components_of_functor_appl' f p1 p2) + | Structure_comps c -> + raise Not_found +@@ -562,7 +562,7 @@ + let p = Papply(p1, p2) in + begin match EnvLazy.force !components_of_module_maker' desc1 with + Functor_comps f -> +- !check_modtype_inclusion env mty2 p2 f.fcomp_arg; ++ Misc.may (!check_modtype_inclusion env mty2 p2) f.fcomp_arg; + let mty = + Subst.modtype (Subst.add_module f.fcomp_param p2 f.fcomp_subst) + f.fcomp_res in +@@ -1120,7 +1120,7 @@ + fcomp_param = param; + (* fcomp_arg must be prefixed eagerly, because it is interpreted + in the outer environment, not in env *) +- fcomp_arg = Subst.modtype sub ty_arg; ++ fcomp_arg = may_map (Subst.modtype sub) ty_arg; + (* fcomp_res is prefixed lazily, because it is interpreted in env *) + fcomp_res = ty_res; + fcomp_env = env; +Index: typing/includemod.ml +=================================================================== +--- typing/includemod.ml (revision 14301) ++++ typing/includemod.ml (working copy) +@@ -168,7 +168,13 @@ + try_modtypes2 env cxt mty1 (Subst.modtype subst mty2) + | (Mty_signature sig1, Mty_signature sig2) -> + signatures env cxt subst sig1 sig2 +- | (Mty_functor(param1, arg1, res1), Mty_functor(param2, arg2, res2)) -> ++ | (Mty_functor(param1, None, res1), Mty_functor(param2, None, res2)) -> ++ begin match modtypes env (Body param1::cxt) subst res1 res2 with ++ Tcoerce_none -> Tcoerce_none ++ | cc -> Tcoerce_functor (Tcoerce_none, cc) ++ end ++ | (Mty_functor(param1, Some arg1, res1), ++ Mty_functor(param2, Some arg2, res2)) -> + let arg2' = Subst.modtype subst arg2 in + let cc_arg = modtypes env (Arg param1::cxt) Subst.identity arg2' arg1 in + let cc_res = +Index: typing/mtype.ml +=================================================================== +--- typing/mtype.ml (revision 14301) ++++ typing/mtype.ml (working copy) +@@ -34,7 +34,8 @@ + match scrape env mty with + Mty_signature sg -> + Mty_signature(strengthen_sig env sg p) +- | Mty_functor(param, arg, res) when !Clflags.applicative_functors -> ++ | Mty_functor(param, arg, res) ++ when !Clflags.applicative_functors && Ident.name param <> "*" -> + Mty_functor(param, arg, strengthen env res (Papply(p, Pident param))) + | mty -> + mty +@@ -105,8 +106,9 @@ + | Mty_functor(param, arg, res) -> + let var_inv = + match va with Co -> Contra | Contra -> Co | Strict -> Strict in +- Mty_functor(param, nondep_mty env var_inv arg, +- nondep_mty (Env.add_module param arg env) va res) ++ Mty_functor(param, Misc.may_map (nondep_mty env var_inv) arg, ++ nondep_mty ++ (Env.add_module param (Btype.default_mty arg) env) va res) + + and nondep_sig env va = function + [] -> [] +@@ -228,3 +230,34 @@ + no_code_needed_sig env rem + | (Sig_exception _ | Sig_class _) :: rem -> + false ++ ++ ++(* Check whether a module type may return types *) ++ ++let rec contains_type env = function ++ Mty_ident path -> ++ (try Misc.may (contains_type env) (Env.find_modtype path env).mtd_type ++ with Not_found -> raise Exit) ++ | Mty_signature sg -> ++ contains_type_sig env sg ++ | Mty_functor (_, _, body) -> ++ contains_type env body ++ ++and contains_type_sig env = List.iter (contains_type_item env) ++ ++and contains_type_item env = function ++ Sig_type (_,({type_manifest = None} | ++ {type_kind = Type_abstract; type_private = Private}),_) ++ | Sig_modtype _ -> ++ raise Exit ++ | Sig_module (_, {md_type = mty}, _) -> ++ contains_type env mty ++ | Sig_value _ ++ | Sig_type _ ++ | Sig_exception _ ++ | Sig_class _ ++ | Sig_class_type _ -> ++ () ++ ++let contains_type env mty = ++ try contains_type env mty; false with Exit -> true +Index: typing/mtype.mli +=================================================================== +--- typing/mtype.mli (revision 14301) ++++ typing/mtype.mli (working copy) +@@ -36,3 +36,4 @@ + val enrich_modtype: Env.t -> Path.t -> module_type -> module_type + val enrich_typedecl: Env.t -> Path.t -> type_declaration -> type_declaration + val type_paths: Env.t -> Path.t -> module_type -> Path.t list ++val contains_type: Env.t -> module_type -> bool +Index: typing/oprint.ml +=================================================================== +--- typing/oprint.ml (revision 14301) ++++ typing/oprint.ml (working copy) +@@ -344,7 +344,9 @@ + let rec print_out_module_type ppf = + function + Omty_abstract -> () +- | Omty_functor (name, mty_arg, mty_res) -> ++ | Omty_functor (_, None, mty_res) -> ++ fprintf ppf "@[<2>functor@ () ->@ %a@]" print_out_module_type mty_res ++ | Omty_functor (name, Some mty_arg, mty_res) -> + fprintf ppf "@[<2>functor@ (%s : %a) ->@ %a@]" name + print_out_module_type mty_arg print_out_module_type mty_res + | Omty_ident id -> fprintf ppf "%a" print_ident id +Index: typing/outcometree.mli +=================================================================== +--- typing/outcometree.mli (revision 14301) ++++ typing/outcometree.mli (working copy) +@@ -75,7 +75,7 @@ + + type out_module_type = + | Omty_abstract +- | Omty_functor of string * out_module_type * out_module_type ++ | Omty_functor of string * out_module_type option * out_module_type + | Omty_ident of out_ident + | Omty_signature of out_sig_item list + and out_sig_item = +Index: typing/printtyp.ml +=================================================================== +--- typing/printtyp.ml (revision 14301) ++++ typing/printtyp.ml (working copy) +@@ -1116,9 +1116,12 @@ + | Mty_signature sg -> + Omty_signature (tree_of_signature sg) + | Mty_functor(param, ty_arg, ty_res) -> +- Omty_functor +- (Ident.name param, tree_of_modtype ty_arg, +- wrap_env (Env.add_module param ty_arg) tree_of_modtype ty_res) ++ let res = ++ match ty_arg with None -> tree_of_modtype ty_res ++ | Some mty -> ++ wrap_env (Env.add_module param mty) tree_of_modtype ty_res ++ in ++ Omty_functor (Ident.name param, may_map tree_of_modtype ty_arg, res) + + and tree_of_signature sg = + wrap_env (fun env -> env) (tree_of_signature_rec !printing_env) sg +Index: typing/printtyped.ml +=================================================================== +--- typing/printtyped.ml (revision 14301) ++++ typing/printtyped.ml (working copy) +@@ -562,7 +562,7 @@ + signature i ppf s; + | Tmty_functor (s, _, mt1, mt2) -> + line i ppf "Pmty_functor \"%a\"\n" fmt_ident s; +- module_type i ppf mt1; ++ Misc.may (module_type i ppf) mt1; + module_type i ppf mt2; + | Tmty_with (mt, l) -> + line i ppf "Pmty_with\n"; +@@ -651,7 +651,7 @@ + structure i ppf s; + | Tmod_functor (s, _, mt, me) -> + line i ppf "Pmod_functor \"%a\"\n" fmt_ident s; +- module_type i ppf mt; ++ Misc.may (module_type i ppf) mt; + module_expr i ppf me; + | Tmod_apply (me1, me2, _) -> + line i ppf "Pmod_apply\n"; +Index: typing/subst.ml +=================================================================== +--- typing/subst.ml (revision 14301) ++++ typing/subst.ml (working copy) +@@ -327,8 +327,8 @@ + Mty_signature(signature s sg) + | Mty_functor(id, arg, res) -> + let id' = Ident.rename id in +- Mty_functor(id', modtype s arg, +- modtype (add_module id (Pident id') s) res) ++ Mty_functor(id', may_map (modtype s) arg, ++ modtype (add_module id (Pident id') s) res) + + and signature s sg = + (* Components of signature may be mutually recursive (e.g. type declarations +Index: typing/typedtree.ml +=================================================================== +--- typing/typedtree.ml (revision 14301) ++++ typing/typedtree.ml (working copy) +@@ -187,7 +187,7 @@ + and module_expr_desc = + Tmod_ident of Path.t * Longident.t loc + | Tmod_structure of structure +- | Tmod_functor of Ident.t * string loc * module_type * module_expr ++ | Tmod_functor of Ident.t * string loc * module_type option * module_expr + | Tmod_apply of module_expr * module_expr * module_coercion + | Tmod_constraint of + module_expr * Types.module_type * module_type_constraint * module_coercion +@@ -253,7 +253,7 @@ + and module_type_desc = + Tmty_ident of Path.t * Longident.t loc + | Tmty_signature of signature +- | Tmty_functor of Ident.t * string loc * module_type * module_type ++ | Tmty_functor of Ident.t * string loc * module_type option * module_type + | Tmty_with of module_type * (Path.t * Longident.t loc * with_constraint) list + | Tmty_typeof of module_expr + +Index: typing/typedtree.mli +=================================================================== +--- typing/typedtree.mli (revision 14301) ++++ typing/typedtree.mli (working copy) +@@ -186,7 +186,7 @@ + and module_expr_desc = + Tmod_ident of Path.t * Longident.t loc + | Tmod_structure of structure +- | Tmod_functor of Ident.t * string loc * module_type * module_expr ++ | Tmod_functor of Ident.t * string loc * module_type option * module_expr + | Tmod_apply of module_expr * module_expr * module_coercion + | Tmod_constraint of + module_expr * Types.module_type * module_type_constraint * module_coercion +@@ -252,7 +252,7 @@ + and module_type_desc = + Tmty_ident of Path.t * Longident.t loc + | Tmty_signature of signature +- | Tmty_functor of Ident.t * string loc * module_type * module_type ++ | Tmty_functor of Ident.t * string loc * module_type option * module_type + | Tmty_with of module_type * (Path.t * Longident.t loc * with_constraint) list + | Tmty_typeof of module_expr + +Index: typing/typedtreeIter.ml +=================================================================== +--- typing/typedtreeIter.ml (revision 14301) ++++ typing/typedtreeIter.ml (working copy) +@@ -383,7 +383,7 @@ + Tmty_ident (path, _) -> () + | Tmty_signature sg -> iter_signature sg + | Tmty_functor (id, _, mtype1, mtype2) -> +- iter_module_type mtype1; iter_module_type mtype2 ++ Misc.may iter_module_type mtype1; iter_module_type mtype2 + | Tmty_with (mtype, list) -> + iter_module_type mtype; + List.iter (fun (path, _, withc) -> +@@ -412,7 +412,7 @@ + Tmod_ident (p, _) -> () + | Tmod_structure st -> iter_structure st + | Tmod_functor (id, _, mtype, mexpr) -> +- iter_module_type mtype; ++ Misc.may iter_module_type mtype; + iter_module_expr mexpr + | Tmod_apply (mexp1, mexp2, _) -> + iter_module_expr mexp1; +Index: typing/typedtreeMap.ml +=================================================================== +--- typing/typedtreeMap.ml (revision 14301) ++++ typing/typedtreeMap.ml (working copy) +@@ -426,7 +426,7 @@ + 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, ++ Tmty_functor (id, name, Misc.may_map map_module_type mtype1, + map_module_type mtype2) + | Tmty_with (mtype, list) -> + Tmty_with (map_module_type mtype, +@@ -456,7 +456,7 @@ + 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, ++ Tmod_functor (id, name, Misc.may_map map_module_type mtype, + map_module_expr mexpr) + | Tmod_apply (mexp1, mexp2, coercion) -> + Tmod_apply (map_module_expr mexp1, map_module_expr mexp2, coercion) +Index: typing/typemod.ml +=================================================================== +--- typing/typemod.ml (revision 14301) ++++ typing/typemod.ml (working copy) +@@ -39,6 +39,7 @@ + | Scoping_pack of Longident.t * type_expr + | Extension of string + | Recursive_module_require_explicit_type ++ | Apply_generative + + exception Error of Location.t * Env.t * error + +@@ -299,8 +300,9 @@ + | Pmty_signature ssg -> + Mty_signature(approx_sig env ssg) + | Pmty_functor(param, sarg, sres) -> +- let arg = approx_modtype env sarg in +- let (id, newenv) = Env.enter_module param.txt arg env in ++ let arg = may_map (approx_modtype env) sarg in ++ let (id, newenv) = ++ Env.enter_module param.txt (Btype.default_mty arg) env in + let res = approx_modtype newenv sres in + Mty_functor(id, arg, res) + | Pmty_with(sbody, constraints) -> +@@ -472,11 +474,13 @@ + mkmty (Tmty_signature sg) (Mty_signature sg.sig_type) env loc + smty.pmty_attributes + | Pmty_functor(param, sarg, sres) -> +- let arg = transl_modtype env sarg in +- let (id, newenv) = Env.enter_module param.txt arg.mty_type env in ++ let arg = Misc.may_map (transl_modtype env) sarg in ++ let ty_arg = Misc.may_map (fun m -> m.mty_type) arg in ++ let (id, newenv) = ++ Env.enter_module param.txt (Btype.default_mty ty_arg) env in + let res = transl_modtype newenv sres in + mkmty (Tmty_functor (id, param, arg, res)) +- (Mty_functor(id, arg.mty_type, res.mty_type)) env loc ++ (Mty_functor(id, ty_arg, res.mty_type)) env loc + smty.pmty_attributes + | Pmty_with(sbody, constraints) -> + let body = transl_modtype env sbody in +@@ -949,11 +953,14 @@ + mod_attributes = smod.pmod_attributes; + mod_loc = smod.pmod_loc } + | Pmod_functor(name, smty, sbody) -> +- let mty = transl_modtype env smty in +- let (id, newenv) = Env.enter_module name.txt mty.mty_type env in +- let body = type_module sttn true None newenv sbody in ++ let mty = may_map (transl_modtype env) smty in ++ let ty_arg = may_map (fun m -> m.mty_type) mty in ++ let (id, newenv), funct_body = ++ match ty_arg with None -> (Ident.create "*", env), false ++ | Some mty -> Env.enter_module name.txt mty env, true in ++ let body = type_module sttn funct_body None newenv sbody in + rm { mod_desc = Tmod_functor(id, name, mty, body); +- mod_type = Mty_functor(id, mty.mty_type, body.mod_type); ++ mod_type = Mty_functor(id, ty_arg, body.mod_type); + mod_env = env; + mod_attributes = smod.pmod_attributes; + mod_loc = smod.pmod_loc } +@@ -964,6 +971,14 @@ + type_module (sttn && path <> None) funct_body None env sfunct in + begin match Mtype.scrape env funct.mod_type with + Mty_functor(param, mty_param, mty_res) as mty_functor -> ++ let generative, mty_param = ++ (mty_param = None, Btype.default_mty mty_param) in ++ if generative then begin ++ if sarg.pmod_desc <> Pmod_structure [] then ++ raise (Error (sfunct.pmod_loc, env, Apply_generative)); ++ if funct_body && Mtype.contains_type env funct.mod_type then ++ raise (Error (smod.pmod_loc, env, Not_allowed_in_functor_body)); ++ end; + let coercion = + try + Includemod.modtypes env arg.mod_type mty_param +@@ -975,6 +990,7 @@ + Subst.modtype (Subst.add_module param path Subst.identity) + mty_res + | None -> ++ if generative then mty_res else + try + Mtype.nondep_supertype + (Env.add_module param arg.mod_type env) param mty_res +@@ -999,8 +1015,6 @@ + } + + | Pmod_unpack sexp -> +- if funct_body then +- raise (Error (smod.pmod_loc, env, Not_allowed_in_functor_body)); + if !Clflags.principal then Ctype.begin_def (); + let exp = Typecore.type_exp env sexp in + if !Clflags.principal then begin +@@ -1025,6 +1039,8 @@ + | _ -> + raise (Error(smod.pmod_loc, env, Not_a_packed_module exp.exp_type)) + in ++ if funct_body && Mtype.contains_type env mty then ++ raise (Error (smod.pmod_loc, env, Not_allowed_in_functor_body)); + rm { mod_desc = Tmod_unpack(exp, mty); + mod_type = mty; + mod_env = env; +@@ -1549,7 +1565,8 @@ + Location.print_filename intf_name + | Not_allowed_in_functor_body -> + fprintf ppf +- "This kind of expression is not allowed within the body of a functor." ++ "@[This expression creates fresh types.@ %s@]" ++ "It is not allowed inside applicative functors." + | With_need_typeconstr -> + fprintf ppf + "Only type constructors with identical parameters can be substituted." +@@ -1570,6 +1587,8 @@ + fprintf ppf "Uninterpreted extension '%s'." s + | Recursive_module_require_explicit_type -> + fprintf ppf "Recursive modules require an explicit module type." ++ | Apply_generative -> ++ fprintf ppf "This is a generative functor. It can only be applied to ()" + + let report_error env ppf err = + Printtyp.wrap_printing_env env (fun () -> report_error ppf err) +Index: typing/typemod.mli +=================================================================== +--- typing/typemod.mli (revision 14301) ++++ typing/typemod.mli (working copy) +@@ -60,6 +60,7 @@ + | Scoping_pack of Longident.t * type_expr + | Extension of string + | Recursive_module_require_explicit_type ++ | Apply_generative + + exception Error of Location.t * Env.t * error + +Index: typing/types.ml +=================================================================== +--- typing/types.ml (revision 14301) ++++ typing/types.ml (working copy) +@@ -264,7 +264,7 @@ + type module_type = + Mty_ident of Path.t + | Mty_signature of signature +- | Mty_functor of Ident.t * module_type * module_type ++ | Mty_functor of Ident.t * module_type option * module_type + + and signature = signature_item list + +Index: typing/types.mli +=================================================================== +--- typing/types.mli (revision 14301) ++++ typing/types.mli (working copy) +@@ -251,7 +251,7 @@ + type module_type = + Mty_ident of Path.t + | Mty_signature of signature +- | Mty_functor of Ident.t * module_type * module_type ++ | Mty_functor of Ident.t * module_type option * module_type + + and signature = signature_item list + diff --git a/experimental/garrigue/impure-functors.diff b/experimental/garrigue/impure-functors.diff new file mode 100644 index 00000000..fd8dba57 --- /dev/null +++ b/experimental/garrigue/impure-functors.diff @@ -0,0 +1,223 @@ +Index: parsing/parser.mly +=================================================================== +--- parsing/parser.mly (revision 14285) ++++ parsing/parser.mly (working copy) +@@ -542,8 +542,12 @@ + { unclosed "struct" 1 "end" 3 } + | FUNCTOR LPAREN UIDENT COLON module_type RPAREN MINUSGREATER module_expr + { mkmod(Pmod_functor(mkrhs $3 3, $5, $8)) } ++ | FUNCTOR LPAREN RPAREN MINUSGREATER module_expr ++ { mkmod(Pmod_functor(mkrhs "*" 3, mkmty (Pmty_signature []), $5)) } + | module_expr LPAREN module_expr RPAREN + { mkmod(Pmod_apply($1, $3)) } ++ | module_expr LPAREN RPAREN ++ { mkmod(Pmod_apply($1, mkmod (Pmod_structure []))) } + | module_expr LPAREN module_expr error + { unclosed "(" 2 ")" 4 } + | LPAREN module_expr COLON module_type RPAREN +@@ -641,6 +645,8 @@ + { mkmod(Pmod_constraint($4, $2)) } + | LPAREN UIDENT COLON module_type RPAREN module_binding_body + { mkmod(Pmod_functor(mkrhs $2 2, $4, $6)) } ++ | LPAREN RPAREN module_binding_body ++ { mkmod(Pmod_functor(mkrhs "*" 1, mkmty(Pmty_signature []), $3)) } + ; + module_bindings: + module_binding { [$1] } +@@ -663,6 +669,9 @@ + | FUNCTOR LPAREN UIDENT COLON module_type RPAREN MINUSGREATER module_type + %prec below_WITH + { mkmty(Pmty_functor(mkrhs $3 3, $5, $8)) } ++ | FUNCTOR LPAREN RPAREN MINUSGREATER module_type ++ %prec below_WITH ++ { mkmty(Pmty_functor(mkrhs "*" 2, mkmty(Pmty_signature []), $5)) } + | module_type WITH with_constraints + { mkmty(Pmty_with($1, List.rev $3)) } + | MODULE TYPE OF module_expr %prec below_LBRACKETAT +@@ -725,6 +734,8 @@ + { $2 } + | LPAREN UIDENT COLON module_type RPAREN module_declaration + { mkmty(Pmty_functor(mkrhs $2 2, $4, $6)) } ++ | LPAREN RPAREN module_declaration ++ { mkmty(Pmty_functor(mkrhs "*" 1, mkmty (Pmty_signature []), $3)) } + ; + module_rec_declarations: + module_rec_declaration { [$1] } +Index: parsing/pprintast.ml +=================================================================== +--- parsing/pprintast.ml (revision 14285) ++++ parsing/pprintast.ml (working copy) +@@ -834,6 +834,8 @@ + | Pmty_signature (s) -> + pp f "@[<hv0>@[<hv2>sig@ %a@]@ end@]" (* "@[<hov>sig@ %a@ end@]" *) + (self#list self#signature_item ) s (* FIXME wrong indentation*) ++ | Pmty_functor ({txt="*"}, mt1, mt2) -> ++ pp f "@[<hov2>functor () ->@ %a@]" self#module_type mt2 + | Pmty_functor (s, mt1, mt2) -> + pp f "@[<hov2>functor@ (%s@ :@ %a)@ ->@ %a@]" s.txt + self#module_type mt1 self#module_type mt2 +@@ -940,6 +942,8 @@ + self#module_type mt + | Pmod_ident (li) -> + pp f "%a" self#longident_loc li; ++ | Pmod_functor ({txt="*"}, mt, me) -> ++ pp f "functor ()@;->@;%a" self#module_expr me + | Pmod_functor (s, mt, me) -> + pp f "functor@ (%s@ :@ %a)@;->@;%a" + s.txt self#module_type mt self#module_expr me +@@ -1025,7 +1029,8 @@ + | Pstr_module x -> + let rec module_helper me = match me.pmod_desc with + | Pmod_functor(s,mt,me) -> +- pp f "(%s:%a)" s.txt self#module_type mt ; ++ if s.txt = "*" then pp f "()" ++ else pp f "(%s:%a)" s.txt self#module_type mt ; + module_helper me + | _ -> me in + pp f "@[<hov2>module %s%a@]" +Index: typing/includemod.ml +=================================================================== +--- typing/includemod.ml (revision 14285) ++++ typing/includemod.ml (working copy) +@@ -35,6 +35,7 @@ + Ident.t * class_declaration * class_declaration * + Ctype.class_match_failure list + | Unbound_modtype_path of Path.t ++ | Impure_functor + + type pos = + Module of Ident.t | Modtype of Ident.t | Arg of Ident.t | Body of Ident.t +@@ -165,6 +166,8 @@ + | (Mty_signature sig1, Mty_signature sig2) -> + signatures env cxt subst sig1 sig2 + | (Mty_functor(param1, arg1, res1), Mty_functor(param2, arg2, res2)) -> ++ if Ident.name param1 = "*" && Ident.name param2 <> "*" then ++ raise (Error [cxt, env, Impure_functor]); + let arg2' = Subst.modtype subst arg2 in + let cc_arg = modtypes env (Arg param1::cxt) Subst.identity arg2' arg1 in + let cc_res = +@@ -422,6 +425,8 @@ + Includeclass.report_error reason + | Unbound_modtype_path path -> + fprintf ppf "Unbound module type %a" Printtyp.path path ++ | Impure_functor -> ++ fprintf ppf "An impure functor cannot be made applicative" + + let rec context ppf = function + Module id :: rem -> +Index: typing/includemod.mli +=================================================================== +--- typing/includemod.mli (revision 14285) ++++ typing/includemod.mli (working copy) +@@ -40,6 +40,7 @@ + Ident.t * class_declaration * class_declaration * + Ctype.class_match_failure list + | Unbound_modtype_path of Path.t ++ | Impure_functor + + type pos = + Module of Ident.t | Modtype of Ident.t | Arg of Ident.t | Body of Ident.t +Index: typing/mtype.ml +=================================================================== +--- typing/mtype.ml (revision 14285) ++++ typing/mtype.ml (working copy) +@@ -34,7 +34,8 @@ + match scrape env mty with + Mty_signature sg -> + Mty_signature(strengthen_sig env sg p) +- | Mty_functor(param, arg, res) when !Clflags.applicative_functors -> ++ | Mty_functor(param, arg, res) ++ when !Clflags.applicative_functors && Ident.name param <> "*" -> + Mty_functor(param, arg, strengthen env res (Papply(p, Pident param))) + | mty -> + mty +Index: typing/oprint.ml +=================================================================== +--- typing/oprint.ml (revision 14285) ++++ typing/oprint.ml (working copy) +@@ -344,6 +344,8 @@ + let rec print_out_module_type ppf = + function + Omty_abstract -> () ++ | Omty_functor ("*", _, mty_res) -> ++ fprintf ppf "@[<2>functor@ () ->@ %a@]" print_out_module_type mty_res + | Omty_functor (name, mty_arg, mty_res) -> + fprintf ppf "@[<2>functor@ (%s : %a) ->@ %a@]" name + print_out_module_type mty_arg print_out_module_type mty_res +Index: typing/typemod.ml +=================================================================== +--- typing/typemod.ml (revision 14285) ++++ typing/typemod.ml (working copy) +@@ -39,6 +39,7 @@ + | Scoping_pack of Longident.t * type_expr + | Extension of string + | Recursive_module_require_explicit_type ++ | Apply_impure + + exception Error of Location.t * Env.t * error + +@@ -950,8 +951,10 @@ + mod_loc = smod.pmod_loc } + | Pmod_functor(name, smty, sbody) -> + let mty = transl_modtype env smty in +- let (id, newenv) = Env.enter_module name.txt mty.mty_type env in +- let body = type_module sttn true None newenv sbody in ++ let (id, newenv), funct_body = ++ if name.txt = "*" then (Ident.create "*", env), false else ++ Env.enter_module name.txt mty.mty_type env, true in ++ let body = type_module sttn funct_body None newenv sbody in + rm { mod_desc = Tmod_functor(id, name, mty, body); + mod_type = Mty_functor(id, mty.mty_type, body.mod_type); + mod_env = env; +@@ -964,6 +967,13 @@ + type_module (sttn && path <> None) funct_body None env sfunct in + begin match Mtype.scrape env funct.mod_type with + Mty_functor(param, mty_param, mty_res) as mty_functor -> ++ let impure = Ident.name param = "*" in ++ if impure then begin ++ if sarg.pmod_desc <> Pmod_structure [] then ++ raise (Error (sfunct.pmod_loc, env, Apply_impure)); ++ if funct_body then ++ raise (Error (smod.pmod_loc, env, Not_allowed_in_functor_body)); ++ end; + let coercion = + try + Includemod.modtypes env arg.mod_type mty_param +@@ -975,6 +985,7 @@ + Subst.modtype (Subst.add_module param path Subst.identity) + mty_res + | None -> ++ if impure then mty_res else + try + Mtype.nondep_supertype + (Env.add_module param arg.mod_type env) param mty_res +@@ -1549,7 +1560,7 @@ + Location.print_filename intf_name + | Not_allowed_in_functor_body -> + fprintf ppf +- "This kind of expression is not allowed within the body of a functor." ++ "This kind of expression is only allowed inside impure functors." + | With_need_typeconstr -> + fprintf ppf + "Only type constructors with identical parameters can be substituted." +@@ -1570,6 +1581,8 @@ + fprintf ppf "Uninterpreted extension '%s'." s + | Recursive_module_require_explicit_type -> + fprintf ppf "Recursive modules require an explicit module type." ++ | Apply_impure -> ++ fprintf ppf "This functor is impure. It can only be applied to ()" + + let report_error env ppf err = + Printtyp.wrap_printing_env env (fun () -> report_error ppf err) +Index: typing/typemod.mli +=================================================================== +--- typing/typemod.mli (revision 14285) ++++ typing/typemod.mli (working copy) +@@ -60,6 +60,7 @@ + | Scoping_pack of Longident.t * type_expr + | Extension of string + | Recursive_module_require_explicit_type ++ | Apply_impure + + exception Error of Location.t * Env.t * error + diff --git a/experimental/garrigue/marshal_objects.diff b/experimental/garrigue/marshal_objects.diff new file mode 100644 index 00000000..bb9b4dd7 --- /dev/null +++ b/experimental/garrigue/marshal_objects.diff @@ -0,0 +1,800 @@ +? bytecomp/alpha_eq.ml +Index: bytecomp/lambda.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/bytecomp/lambda.ml,v +retrieving revision 1.44 +diff -u -r1.44 lambda.ml +--- bytecomp/lambda.ml 25 Aug 2005 15:35:16 -0000 1.44 ++++ bytecomp/lambda.ml 2 Feb 2006 05:08:56 -0000 +@@ -287,9 +287,10 @@ + let compare = compare + end) + +-let free_ids get l = ++let free_ids get used l = + let fv = ref IdentSet.empty in + let rec free l = ++ let old = !fv in + iter free l; + fv := List.fold_right IdentSet.add (get l) !fv; + match l with +@@ -307,17 +308,20 @@ + fv := IdentSet.remove v !fv + | Lassign(id, e) -> + fv := IdentSet.add id !fv ++ | Lifused(id, e) -> ++ if used && not (IdentSet.mem id old) then fv := IdentSet.remove id !fv + | Lvar _ | Lconst _ | Lapply _ + | Lprim _ | Lswitch _ | Lstaticraise _ + | Lifthenelse _ | Lsequence _ | Lwhile _ +- | Lsend _ | Levent _ | Lifused _ -> () ++ | Lsend _ | Levent _ -> () + in free l; !fv + +-let free_variables l = +- free_ids (function Lvar id -> [id] | _ -> []) l ++let free_variables ?(ifused=false) l = ++ free_ids (function Lvar id -> [id] | _ -> []) ifused l + + let free_methods l = +- free_ids (function Lsend(Self, Lvar meth, obj, _) -> [meth] | _ -> []) l ++ free_ids (function Lsend(Self, Lvar meth, obj, _) -> [meth] | _ -> []) ++ false l + + (* Check if an action has a "when" guard *) + let raise_count = ref 0 +Index: bytecomp/lambda.mli +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/bytecomp/lambda.mli,v +retrieving revision 1.42 +diff -u -r1.42 lambda.mli +--- bytecomp/lambda.mli 25 Aug 2005 15:35:16 -0000 1.42 ++++ bytecomp/lambda.mli 2 Feb 2006 05:08:56 -0000 +@@ -177,7 +177,7 @@ + + val iter: (lambda -> unit) -> lambda -> unit + module IdentSet: Set.S with type elt = Ident.t +-val free_variables: lambda -> IdentSet.t ++val free_variables: ?ifused:bool -> lambda -> IdentSet.t + val free_methods: lambda -> IdentSet.t + + val transl_path: Path.t -> lambda +Index: bytecomp/translclass.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/bytecomp/translclass.ml,v +retrieving revision 1.38 +diff -u -r1.38 translclass.ml +--- bytecomp/translclass.ml 13 Aug 2005 20:59:37 -0000 1.38 ++++ bytecomp/translclass.ml 2 Feb 2006 05:08:56 -0000 +@@ -46,6 +46,10 @@ + + let lfield v i = Lprim(Pfield i, [Lvar v]) + ++let ltuple l = Lprim(Pmakeblock(0,Immutable), l) ++ ++let lprim name args = Lapply(oo_prim name, args) ++ + let transl_label l = share (Const_immstring l) + + let rec transl_meth_list lst = +@@ -68,8 +72,8 @@ + Lvar offset])])])) + + let transl_val tbl create name = +- Lapply (oo_prim (if create then "new_variable" else "get_variable"), +- [Lvar tbl; transl_label name]) ++ lprim (if create then "new_variable" else "get_variable") ++ [Lvar tbl; transl_label name] + + let transl_vals tbl create vals rem = + List.fold_right +@@ -82,7 +86,7 @@ + (fun (nm, id) rem -> + try + (nm, id, +- Lapply(oo_prim "get_method", [Lvar tbl; Lvar (Meths.find nm meths)])) ++ lprim "get_method" [Lvar tbl; Lvar (Meths.find nm meths)]) + :: rem + with Not_found -> rem) + inh_meths [] +@@ -97,17 +101,15 @@ + let (inh_init, obj_init, has_init) = init obj' in + if obj_init = lambda_unit then + (inh_init, +- Lapply (oo_prim (if has_init then "create_object_and_run_initializers" +- else"create_object_opt"), +- [obj; Lvar cl])) ++ lprim (if has_init then "create_object_and_run_initializers" ++ else"create_object_opt") ++ [obj; Lvar cl]) + else begin + (inh_init, +- Llet(Strict, obj', +- Lapply (oo_prim "create_object_opt", [obj; Lvar cl]), ++ Llet(Strict, obj', lprim "create_object_opt" [obj; Lvar cl], + Lsequence(obj_init, + if not has_init then Lvar obj' else +- Lapply (oo_prim "run_initializers_opt", +- [obj; Lvar obj'; Lvar cl])))) ++ lprim "run_initializers_opt" [obj; Lvar obj'; Lvar cl]))) + end + + let rec build_object_init cl_table obj params inh_init obj_init cl = +@@ -203,14 +205,13 @@ + + + let bind_method tbl lab id cl_init = +- Llet(StrictOpt, id, Lapply (oo_prim "get_method_label", +- [Lvar tbl; transl_label lab]), ++ Llet(StrictOpt, id, lprim "get_method_label" [Lvar tbl; transl_label lab], + cl_init) + +-let bind_methods tbl meths vals cl_init = +- let methl = Meths.fold (fun lab id tl -> (lab,id) :: tl) meths [] in ++let bind_methods tbl methl vals cl_init = + let len = List.length methl and nvals = List.length vals in +- if len < 2 && nvals = 0 then Meths.fold (bind_method tbl) meths cl_init else ++ if len < 2 && nvals = 0 then ++ List.fold_right (fun (n,i) -> bind_method tbl n i) methl cl_init else + if len = 0 && nvals < 2 then transl_vals tbl true vals cl_init else + let ids = Ident.create "ids" in + let i = ref len in +@@ -229,21 +230,19 @@ + vals' cl_init) + in + Llet(StrictOpt, ids, +- Lapply (oo_prim getter, +- [Lvar tbl; transl_meth_list (List.map fst methl)] @ names), ++ lprim getter ++ ([Lvar tbl; transl_meth_list (List.map fst methl)] @ names), + List.fold_right +- (fun (lab,id) lam -> decr i; Llet(StrictOpt, id, lfield ids !i, lam)) ++ (fun (lab,id) lam -> decr i; Llet(Alias, id, lfield ids !i, lam)) + methl cl_init) + + let output_methods tbl methods lam = + match methods with + [] -> lam + | [lab; code] -> +- lsequence (Lapply(oo_prim "set_method", [Lvar tbl; lab; code])) lam ++ lsequence (lprim "set_method" [Lvar tbl; lab; code]) lam + | _ -> +- lsequence (Lapply(oo_prim "set_methods", +- [Lvar tbl; Lprim(Pmakeblock(0,Immutable), methods)])) +- lam ++ lsequence (lprim "set_methods" [Lvar tbl; ltuple methods]) lam + + let rec ignore_cstrs cl = + match cl.cl_desc with +@@ -266,7 +265,8 @@ + Llet (Strict, obj_init, + Lapply(Lprim(Pfield 1, [lpath]), Lvar cla :: + if top then [Lprim(Pfield 3, [lpath])] else []), +- bind_super cla super cl_init)) ++ bind_super cla super cl_init), ++ [], []) + | _ -> + assert false + end +@@ -278,10 +278,11 @@ + match field with + Cf_inher (cl, vals, meths) -> + let cl_init = output_methods cla methods cl_init in +- let inh_init, cl_init = ++ let (inh_init, cl_init, meths', vals') = + build_class_init cla false + (vals, meths_super cla str.cl_meths meths) + inh_init cl_init msubst top cl in ++ let cl_init = bind_methods cla meths' vals' cl_init in + (inh_init, cl_init, [], values) + | Cf_val (name, id, exp) -> + (inh_init, cl_init, methods, (name, id)::values) +@@ -304,29 +305,37 @@ + (inh_init, cl_init, methods, vals @ values) + | Cf_init exp -> + (inh_init, +- Lsequence(Lapply (oo_prim "add_initializer", +- Lvar cla :: msubst false (transl_exp exp)), ++ Lsequence(lprim "add_initializer" ++ (Lvar cla :: msubst false (transl_exp exp)), + cl_init), + methods, values)) + str.cl_field + (inh_init, cl_init, [], []) + in + let cl_init = output_methods cla methods cl_init in +- (inh_init, bind_methods cla str.cl_meths values cl_init) ++ (* inh_init, bind_methods cla str.cl_meths values cl_init *) ++ let methods = Meths.fold (fun n i l -> (n,i)::l) str.cl_meths [] in ++ (inh_init, cl_init, methods, values) + | Tclass_fun (pat, vals, cl, _) -> +- let (inh_init, cl_init) = ++ let (inh_init, cl_init, methods, values) = + build_class_init cla cstr super inh_init cl_init msubst top cl + in ++ let fv = free_variables ~ifused:true cl_init in ++ let vals = List.filter (fun (id,_) -> IdentSet.mem id fv) vals in + let vals = List.map (function (id, _) -> (Ident.name id, id)) vals in +- (inh_init, transl_vals cla true vals cl_init) ++ (* inh_init, transl_vals cla true vals cl_init *) ++ (inh_init, cl_init, methods, vals @ values) + | Tclass_apply (cl, exprs) -> + build_class_init cla cstr super inh_init cl_init msubst top cl + | Tclass_let (rec_flag, defs, vals, cl) -> +- let (inh_init, cl_init) = ++ let (inh_init, cl_init, methods, values) = + build_class_init cla cstr super inh_init cl_init msubst top cl + in ++ let fv = free_variables ~ifused:true cl_init in ++ let vals = List.filter (fun (id,_) -> IdentSet.mem id fv) vals in + let vals = List.map (function (id, _) -> (Ident.name id, id)) vals in +- (inh_init, transl_vals cla true vals cl_init) ++ (* inh_init, transl_vals cla true vals cl_init *) ++ (inh_init, cl_init, methods, vals @ values) + | Tclass_constraint (cl, vals, meths, concr_meths) -> + let virt_meths = + List.filter (fun lab -> not (Concr.mem lab concr_meths)) meths in +@@ -358,23 +367,34 @@ + cl_init valids in + (inh_init, + Llet (Strict, inh, +- Lapply(oo_prim "inherits", narrow_args @ +- [lpath; Lconst(Const_pointer(if top then 1 else 0))]), ++ lprim "inherits" ++ (narrow_args @ ++ [lpath; Lconst(Const_pointer(if top then 1 else 0))]), + Llet(StrictOpt, obj_init, lfield inh 0, + Llet(Alias, inh_vals, lfield inh 1, +- Llet(Alias, inh_meths, lfield inh 2, cl_init))))) ++ Llet(Alias, inh_meths, lfield inh 2, cl_init)))), ++ [], []) + | _ -> + let core cl_init = + build_class_init cla true super inh_init cl_init msubst top cl + in + if cstr then core cl_init else +- let (inh_init, cl_init) = +- core (Lsequence (Lapply (oo_prim "widen", [Lvar cla]), cl_init)) ++ let (inh_init, cl_init, methods, values) = ++ core (Lsequence (lprim "widen" [Lvar cla], cl_init)) + in +- (inh_init, +- Lsequence(Lapply (oo_prim "narrow", narrow_args), cl_init)) ++ let cl_init = bind_methods cla methods values cl_init in ++ (inh_init, Lsequence(lprim "narrow" narrow_args, cl_init), [], []) + end + ++let build_class_init cla env inh_init obj_init msubst top cl = ++ let inh_init = List.rev inh_init in ++ let (inh_init, cl_init, methods, values) = ++ build_class_init cla true ([],[]) inh_init obj_init msubst top cl in ++ assert (inh_init = []); ++ if IdentSet.mem env (free_variables ~ifused:true cl_init) ++ then bind_methods cla methods (("", env) :: values) cl_init ++ else Llet(Alias, env, lambda_unit, bind_methods cla methods values cl_init) ++ + let rec build_class_lets cl = + match cl.cl_desc with + Tclass_let (rec_flag, defs, vals, cl) -> +@@ -459,16 +479,16 @@ + Strict, new_init, lfunction [obj_init] obj_init', + Llet( + Alias, cla, transl_path path, +- Lprim(Pmakeblock(0, Immutable), +- [Lapply(Lvar new_init, [lfield cla 0]); +- lfunction [table] +- (Llet(Strict, env_init, +- Lapply(lfield cla 1, [Lvar table]), +- lfunction [envs] +- (Lapply(Lvar new_init, +- [Lapply(Lvar env_init, [Lvar envs])])))); +- lfield cla 2; +- lfield cla 3]))) ++ ltuple ++ [Lapply(Lvar new_init, [lfield cla 0]); ++ lfunction [table] ++ (Llet(Strict, env_init, ++ Lapply(lfield cla 1, [Lvar table]), ++ lfunction [envs] ++ (Lapply(Lvar new_init, ++ [Lapply(Lvar env_init, [Lvar envs])])))); ++ lfield cla 2; ++ lfield cla 3])) + with Exit -> + lambda_unit + +@@ -541,7 +561,7 @@ + open CamlinternalOO + let builtin_meths arr self env env2 body = + let builtin, args = builtin_meths self env env2 body in +- if not arr then [Lapply(oo_prim builtin, args)] else ++ if not arr then [lprim builtin args] else + let tag = match builtin with + "get_const" -> GetConst + | "get_var" -> GetVar +@@ -599,7 +619,8 @@ + + (* Prepare for heavy environment handling *) + let tables = Ident.create (Ident.name cl_id ^ "_tables") in +- let (top_env, req) = oo_add_class tables in ++ let table_init = ref None in ++ let (top_env, req) = oo_add_class tables table_init in + let top = not req in + let cl_env, llets = build_class_lets cl in + let new_ids = if top then [] else Env.diff top_env cl_env in +@@ -633,6 +654,7 @@ + begin try + (* Doesn't seem to improve size for bytecode *) + (* if not !Clflags.native_code then raise Not_found; *) ++ if !Clflags.debug then raise Not_found; + builtin_meths arr [self] env env2 (lfunction args body') + with Not_found -> + [lfunction (self :: args) +@@ -665,15 +687,8 @@ + build_object_init_0 cla [] cl copy_env subst_env top ids in + if not (Translcore.check_recursive_lambda ids obj_init) then + raise(Error(cl.cl_loc, Illegal_class_expr)); +- let inh_init' = List.rev inh_init in +- let (inh_init', cl_init) = +- build_class_init cla true ([],[]) inh_init' obj_init msubst top cl +- in +- assert (inh_init' = []); +- let table = Ident.create "table" +- and class_init = Ident.create (Ident.name cl_id ^ "_init") +- and env_init = Ident.create "env_init" +- and obj_init = Ident.create "obj_init" in ++ let cl_init = build_class_init cla env2 inh_init obj_init msubst top cl in ++ let obj_init = Ident.create "obj_init" in + let pub_meths = + List.sort + (fun s s' -> compare (Btype.hash_variant s) (Btype.hash_variant s')) +@@ -685,42 +700,44 @@ + let name' = List.assoc tag rev_map in + if name' <> name then raise(Error(cl.cl_loc, Tags(name, name')))) + tags pub_meths; ++ let pos = cl.cl_loc.Location.loc_end in ++ let filepos = [transl_label pos.Lexing.pos_fname; ++ Lconst(Const_base(Const_int pos.Lexing.pos_cnum))] in + let ltable table lam = +- Llet(Strict, table, +- Lapply (oo_prim "create_table", [transl_meth_list pub_meths]), lam) ++ Llet(Strict, table, lprim "create_table" [transl_meth_list pub_meths], lam) + and ldirect obj_init = + Llet(Strict, obj_init, cl_init, +- Lsequence(Lapply (oo_prim "init_class", [Lvar cla]), ++ Lsequence(lprim "init_class_shared" (Lvar cla :: filepos), + Lapply(Lvar obj_init, [lambda_unit]))) + in + (* Simplest case: an object defined at toplevel (ids=[]) *) + if top && ids = [] then llets (ltable cla (ldirect obj_init)) else + ++ let table = Ident.create "table" ++ and class_init = Ident.create (Ident.name cl_id ^ "_init") ++ and env_init = Ident.create (Ident.name cl_id ^ "_env_init") in ++ let cl_init_fun = Lfunction(Curried, [cla], cl_init) in + let concrete = + ids = [] || + Typeclass.virtual_methods (Ctype.signature_of_class_type cl.cl_type) = [] +- and lclass lam = +- let cl_init = llets (Lfunction(Curried, [cla], cl_init)) in ++ and lclass cl_init lam = + Llet(Strict, class_init, cl_init, lam (free_variables cl_init)) + and lbody fv = + if List.for_all (fun id -> not (IdentSet.mem id fv)) ids then +- Lapply (oo_prim "make_class",[transl_meth_list pub_meths; +- Lvar class_init]) ++ lprim "make_class" ++ (transl_meth_list pub_meths :: Lvar class_init :: filepos) + else + ltable table ( + Llet( + Strict, env_init, Lapply(Lvar class_init, [Lvar table]), +- Lsequence( +- Lapply (oo_prim "init_class", [Lvar table]), +- Lprim(Pmakeblock(0, Immutable), +- [Lapply(Lvar env_init, [lambda_unit]); +- Lvar class_init; Lvar env_init; lambda_unit])))) ++ Lsequence(lprim "init_class_shared" (Lvar table :: filepos), ++ ltuple [Lapply(Lvar env_init, [lambda_unit]); ++ Lvar class_init; Lvar env_init; lambda_unit]))) + and lbody_virt lenvs = +- Lprim(Pmakeblock(0, Immutable), +- [lambda_unit; Lfunction(Curried,[cla], cl_init); lambda_unit; lenvs]) ++ ltuple [lambda_unit; cl_init_fun; lambda_unit; lenvs] + in + (* Still easy: a class defined at toplevel *) +- if top && concrete then lclass lbody else ++ if top && concrete then lclass (llets cl_init_fun) lbody else + if top then llets (lbody_virt lambda_unit) else + + (* Now for the hard stuff: prepare for table cacheing *) +@@ -733,23 +750,16 @@ + let lenv = + let menv = + if !new_ids_meths = [] then lambda_unit else +- Lprim(Pmakeblock(0, Immutable), +- List.map (fun id -> Lvar id) !new_ids_meths) in ++ ltuple (List.map (fun id -> Lvar id) !new_ids_meths) in + if !new_ids_init = [] then menv else +- Lprim(Pmakeblock(0, Immutable), +- menv :: List.map (fun id -> Lvar id) !new_ids_init) ++ ltuple (menv :: List.map (fun id -> Lvar id) !new_ids_init) + and linh_envs = + List.map (fun (_, p) -> Lprim(Pfield 3, [transl_path p])) + (List.rev inh_init) + in + let make_envs lam = + Llet(StrictOpt, envs, +- (if linh_envs = [] then lenv else +- Lprim(Pmakeblock(0, Immutable), lenv :: linh_envs)), +- lam) +- and def_ids cla lam = +- Llet(StrictOpt, env2, +- Lapply (oo_prim "new_variable", [Lvar cla; transl_label ""]), ++ (if linh_envs = [] then lenv else ltuple (lenv :: linh_envs)), + lam) + in + let inh_paths = +@@ -757,46 +767,53 @@ + (fun (_,path) -> List.mem (Path.head path) new_ids) inh_init in + let inh_keys = + List.map (fun (_,p) -> Lprim(Pfield 1, [transl_path p])) inh_paths in +- let lclass lam = +- Llet(Strict, class_init, +- Lfunction(Curried, [cla], def_ids cla cl_init), lam) ++ let lclass_init lam = ++ Llet(Strict, class_init, cl_init_fun, lam) + and lcache lam = + if inh_keys = [] then Llet(Alias, cached, Lvar tables, lam) else +- Llet(Strict, cached, +- Lapply(oo_prim "lookup_tables", +- [Lvar tables; Lprim(Pmakeblock(0, Immutable), inh_keys)]), ++ Llet(Strict, cached, lprim "lookup_tables" [Lvar tables; ltuple inh_keys], + lam) + and lset cached i lam = + Lprim(Psetfield(i, true), [Lvar cached; lam]) + in +- let ldirect () = +- ltable cla +- (Llet(Strict, env_init, def_ids cla cl_init, +- Lsequence(Lapply (oo_prim "init_class", [Lvar cla]), +- lset cached 0 (Lvar env_init)))) +- and lclass_virt () = +- lset cached 0 (Lfunction(Curried, [cla], def_ids cla cl_init)) ++ let ldirect prim pos = ++ ltable cla ( ++ Llet(Strict, env_init, cl_init, ++ Lsequence(lprim prim (Lvar cla :: pos), Lvar env_init))) ++ and lclass_concrete cached = ++ ltuple [Lapply (lfield cached 0, [lenvs]); ++ lfield cached 1; lfield cached 0; lenvs] + in ++ + llets ( +- lcache ( +- Lsequence( +- Lifthenelse(lfield cached 0, lambda_unit, +- if ids = [] then ldirect () else +- if not concrete then lclass_virt () else +- lclass ( +- Lapply (oo_prim "make_class_store", +- [transl_meth_list pub_meths; +- Lvar class_init; Lvar cached]))), + make_envs ( +- if ids = [] then Lapply(lfield cached 0, [lenvs]) else +- Lprim(Pmakeblock(0, Immutable), +- if concrete then +- [Lapply(lfield cached 0, [lenvs]); +- lfield cached 1; +- lfield cached 0; +- lenvs] +- else [lambda_unit; lfield cached 0; lambda_unit; lenvs] +- ))))) ++ if inh_paths = [] && concrete then ++ if ids = [] then begin ++ table_init := Some (ldirect "init_class_shared" filepos); ++ Lapply (Lvar tables, [lenvs]) ++ end else begin ++ let init = ++ lclass cl_init_fun (fun _ -> ++ lprim "make_class_env" ++ (transl_meth_list pub_meths :: Lvar class_init :: filepos)) ++ in table_init := Some init; ++ lclass_concrete tables ++ end ++ else begin ++ lcache ( ++ Lsequence( ++ Lifthenelse(lfield cached 0, lambda_unit, ++ if ids = [] then lset cached 0 (ldirect "init_class" []) else ++ if not concrete then lset cached 0 cl_init_fun else ++ lclass_init ( ++ lprim "make_class_store" ++ [transl_meth_list pub_meths; Lvar class_init; Lvar cached])), ++ llets ( ++ make_envs ( ++ if ids = [] then Lapply(lfield cached 0, [lenvs]) else ++ if concrete then lclass_concrete cached else ++ ltuple [lambda_unit; lfield cached 0; lambda_unit; lenvs])))) ++ end)) + + (* Wrapper for class compilation *) + +Index: bytecomp/translobj.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/bytecomp/translobj.ml,v +retrieving revision 1.9 +diff -u -r1.9 translobj.ml +--- bytecomp/translobj.ml 26 May 2004 11:10:51 -0000 1.9 ++++ bytecomp/translobj.ml 2 Feb 2006 05:08:56 -0000 +@@ -88,7 +88,6 @@ + + (* Insert labels *) + +-let string s = Lconst (Const_base (Const_string s)) + let int n = Lconst (Const_base (Const_int n)) + + let prim_makearray = +@@ -124,8 +123,8 @@ + let top_env = ref Env.empty + let classes = ref [] + +-let oo_add_class id = +- classes := id :: !classes; ++let oo_add_class id init = ++ classes := (id, init) :: !classes; + (!top_env, !cache_required) + + let oo_wrap env req f x = +@@ -141,10 +140,12 @@ + let lambda = f x in + let lambda = + List.fold_left +- (fun lambda id -> ++ (fun lambda (id, init) -> + Llet(StrictOpt, id, +- Lprim(Pmakeblock(0, Mutable), +- [lambda_unit; lambda_unit; lambda_unit]), ++ (match !init with ++ Some lam -> lam ++ | None -> Lprim(Pmakeblock(0, Mutable), ++ [lambda_unit; lambda_unit; lambda_unit])), + lambda)) + lambda !classes + in +Index: bytecomp/translobj.mli +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/bytecomp/translobj.mli,v +retrieving revision 1.6 +diff -u -r1.6 translobj.mli +--- bytecomp/translobj.mli 26 May 2004 11:10:51 -0000 1.6 ++++ bytecomp/translobj.mli 2 Feb 2006 05:08:56 -0000 +@@ -25,4 +25,4 @@ + Ident.t -> int -> ('a -> lambda) -> 'a -> int * lambda + + val oo_wrap: Env.t -> bool -> ('a -> lambda) -> 'a -> lambda +-val oo_add_class: Ident.t -> Env.t * bool ++val oo_add_class: Ident.t -> Lambda.lambda option ref -> Env.t * bool +Index: byterun/compare.h +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/byterun/compare.h,v +retrieving revision 1.2 +diff -u -r1.2 compare.h +--- byterun/compare.h 31 Dec 2003 14:20:35 -0000 1.2 ++++ byterun/compare.h 2 Feb 2006 05:08:56 -0000 +@@ -17,5 +17,6 @@ + #define CAML_COMPARE_H + + CAMLextern int caml_compare_unordered; ++CAMLextern value caml_compare(value, value); + + #endif /* CAML_COMPARE_H */ +Index: byterun/extern.c +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/byterun/extern.c,v +retrieving revision 1.59 +diff -u -r1.59 extern.c +--- byterun/extern.c 4 Jan 2006 16:55:49 -0000 1.59 ++++ byterun/extern.c 2 Feb 2006 05:08:56 -0000 +@@ -411,6 +411,22 @@ + extern_record_location(v); + break; + } ++ case Object_tag: { ++ value field0; ++ mlsize_t i; ++ i = Wosize_val(Field(v, 0)) - 1; ++ field0 = Field(Field(v, 0),i); ++ if (Wosize_val(field0) > 0) { ++ writecode32(CODE_OBJECT, Wosize_hd (hd)); ++ extern_record_location(v); ++ extern_rec(field0); ++ for (i = 1; i < sz - 1; i++) extern_rec(Field(v, i)); ++ v = Field(v, i); ++ goto tailcall; ++ } ++ if (!extern_closures) ++ extern_invalid_argument("output_value: dynamic class"); ++ } /* may fall through */ + default: { + value field0; + mlsize_t i; +Index: byterun/intern.c +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/byterun/intern.c,v +retrieving revision 1.60 +diff -u -r1.60 intern.c +--- byterun/intern.c 22 Sep 2005 14:21:50 -0000 1.60 ++++ byterun/intern.c 2 Feb 2006 05:08:56 -0000 +@@ -28,6 +28,8 @@ + #include "mlvalues.h" + #include "misc.h" + #include "reverse.h" ++#include "callback.h" ++#include "compare.h" + + static unsigned char * intern_src; + /* Reading pointer in block holding input data. */ +@@ -98,6 +100,25 @@ + #define readblock(dest,len) \ + (memmove((dest), intern_src, (len)), intern_src += (len)) + ++static value get_method_table (value key) ++{ ++ static value *classes = NULL; ++ value current; ++ if (classes == NULL) { ++ classes = caml_named_value("caml_oo_classes"); ++ if (classes == NULL) return 0; ++ caml_register_global_root(classes); ++ } ++ for (current = Field(*classes, 0); Is_block(current); ++ current = Field(current, 1)) ++ { ++ value head = Field(current, 0); ++ if (caml_compare(key, Field(head, 0)) == Val_int(0)) ++ return Field(head, 1); ++ } ++ return 0; ++} ++ + static void intern_cleanup(void) + { + if (intern_input_malloced) caml_stat_free(intern_input); +@@ -315,6 +336,24 @@ + Custom_ops_val(v) = ops; + intern_dest += 1 + size; + break; ++ case CODE_OBJECT: ++ size = read32u(); ++ v = Val_hp(intern_dest); ++ *dest = v; ++ if (intern_obj_table != NULL) intern_obj_table[obj_counter++] = v; ++ dest = (value *) (intern_dest + 1); ++ *intern_dest = Make_header(size, Object_tag, intern_color); ++ intern_dest += 1 + size; ++ intern_rec(dest); ++ *dest = get_method_table(*dest); ++ if (*dest == 0) { ++ intern_cleanup(); ++ caml_failwith("input_value: unknown class"); ++ } ++ for(size--, dest++; size > 1; size--, dest++) ++ intern_rec(dest); ++ goto tailcall; ++ + default: + intern_cleanup(); + caml_failwith("input_value: ill-formed message"); +Index: byterun/intext.h +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/byterun/intext.h,v +retrieving revision 1.32 +diff -u -r1.32 intext.h +--- byterun/intext.h 22 Sep 2005 14:21:50 -0000 1.32 ++++ byterun/intext.h 2 Feb 2006 05:08:56 -0000 +@@ -56,6 +56,7 @@ + #define CODE_CODEPOINTER 0x10 + #define CODE_INFIXPOINTER 0x11 + #define CODE_CUSTOM 0x12 ++#define CODE_OBJECT 0x14 + + #if ARCH_FLOAT_ENDIANNESS == 0x76543210 + #define CODE_DOUBLE_NATIVE CODE_DOUBLE_BIG +Index: stdlib/camlinternalOO.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/stdlib/camlinternalOO.ml,v +retrieving revision 1.14 +diff -u -r1.14 camlinternalOO.ml +--- stdlib/camlinternalOO.ml 25 Oct 2005 18:34:07 -0000 1.14 ++++ stdlib/camlinternalOO.ml 2 Feb 2006 05:08:56 -0000 +@@ -305,10 +305,38 @@ + public_methods; + table + ++(* ++let create_table_variables pub_meths priv_meths vars = ++ let tbl = create_table pub_meths in ++ let pub_meths = to_array pub_meths ++ and priv_meths = to_array priv_meths ++ and vars = to_array vars in ++ let len = 2 + Array.length pub_meths + Array.length priv_meths in ++ let res = Array.create len tbl in ++ let mv = new_methods_variables tbl pub_meths vars in ++ Array.blit mv 0 res 1; ++ res ++*) ++ + let init_class table = + inst_var_count := !inst_var_count + table.size - 1; + table.initializers <- List.rev table.initializers; +- resize table (3 + magic table.methods.(1) * 16 / Sys.word_size) ++ let len = 3 + magic table.methods.(1) * 16 / Sys.word_size in ++ (* keep 1 more for extra info *) ++ let len = if len > Array.length table.methods then len else len+1 in ++ resize table len ++ ++let classes = ref [] ++let () = Callback.register "caml_oo_classes" classes ++ ++let init_class_shared table (file : string) (pos : int) = ++ init_class table; ++ let rec unique_pos pos = ++ if List.mem_assoc (file, pos) !classes then unique_pos (pos + 0x100000) ++ else pos in ++ let pos = unique_pos pos in ++ table.methods.(Array.length table.methods - 1) <- Obj.magic (file, pos); ++ classes := ((file, pos), table.methods) :: !classes + + let inherits cla vals virt_meths concr_meths (_, super, _, env) top = + narrow cla vals virt_meths concr_meths; +@@ -319,12 +347,18 @@ + Array.map (fun nm -> get_method cla (get_method_label cla nm)) + (to_array concr_meths)) + +-let make_class pub_meths class_init = ++let make_class pub_meths class_init file pos = + let table = create_table pub_meths in + let env_init = class_init table in +- init_class table; ++ init_class_shared table file pos; + (env_init (Obj.repr 0), class_init, env_init, Obj.repr 0) + ++let make_class_env pub_meths class_init file pos = ++ let table = create_table pub_meths in ++ let env_init = class_init table in ++ init_class_shared table file pos; ++ (env_init, class_init) ++ + type init_table = { mutable env_init: t; mutable class_init: table -> t } + + let make_class_store pub_meths class_init init_table = +Index: stdlib/camlinternalOO.mli +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/stdlib/camlinternalOO.mli,v +retrieving revision 1.9 +diff -u -r1.9 camlinternalOO.mli +--- stdlib/camlinternalOO.mli 25 Oct 2005 18:34:07 -0000 1.9 ++++ stdlib/camlinternalOO.mli 2 Feb 2006 05:08:56 -0000 +@@ -43,14 +43,20 @@ + val add_initializer : table -> (obj -> unit) -> unit + val dummy_table : table + val create_table : string array -> table ++(* val create_table_variables : ++ string array -> string array -> string array -> table *) + val init_class : table -> unit ++val init_class_shared : table -> string -> int -> unit + val inherits : + table -> string array -> string array -> string array -> + (t * (table -> obj -> Obj.t) * t * obj) -> bool -> + (Obj.t * int array * closure array) + val make_class : +- string array -> (table -> Obj.t -> t) -> ++ string array -> (table -> Obj.t -> t) -> string -> int -> + (t * (table -> Obj.t -> t) * (Obj.t -> t) * Obj.t) ++val make_class_env : ++ string array -> (table -> Obj.t -> t) -> string -> int -> ++ (Obj.t -> t) * (table -> Obj.t -> t) + type init_table + val make_class_store : + string array -> (table -> t) -> init_table -> unit diff --git a/experimental/garrigue/module-errors.diff b/experimental/garrigue/module-errors.diff new file mode 100644 index 00000000..2f8c2bc2 --- /dev/null +++ b/experimental/garrigue/module-errors.diff @@ -0,0 +1,403 @@ +Index: typing/includemod.ml +=================================================================== +--- typing/includemod.ml (revision 11161) ++++ typing/includemod.ml (working copy) +@@ -19,7 +19,7 @@ + open Types + open Typedtree + +-type error = ++type symptom = + Missing_field of Ident.t + | Value_descriptions of Ident.t * value_description * value_description + | Type_declarations of Ident.t * type_declaration +@@ -38,6 +38,10 @@ + Ctype.class_match_failure list + | Unbound_modtype_path of Path.t + ++type pos = ++ Module of Ident.t | Modtype of Ident.t | Arg of Ident.t | Body of Ident.t ++type error = pos list * symptom ++ + exception Error of error list + + (* All functions "blah env x1 x2" check that x1 is included in x2, +@@ -46,51 +50,52 @@ + + (* Inclusion between value descriptions *) + +-let value_descriptions env subst id vd1 vd2 = ++let value_descriptions env cxt subst id vd1 vd2 = + let vd2 = Subst.value_description subst vd2 in + try + Includecore.value_descriptions env vd1 vd2 + with Includecore.Dont_match -> +- raise(Error[Value_descriptions(id, vd1, vd2)]) ++ raise(Error[cxt, Value_descriptions(id, vd1, vd2)]) + + (* Inclusion between type declarations *) + +-let type_declarations env subst id decl1 decl2 = ++let type_declarations env cxt subst id decl1 decl2 = + let decl2 = Subst.type_declaration subst decl2 in + let err = Includecore.type_declarations env id decl1 decl2 in +- if err <> [] then raise(Error[Type_declarations(id, decl1, decl2, err)]) ++ if err <> [] then raise(Error[cxt, Type_declarations(id, decl1, decl2, err)]) + + (* Inclusion between exception declarations *) + +-let exception_declarations env subst id decl1 decl2 = ++let exception_declarations env cxt subst id decl1 decl2 = + let decl2 = Subst.exception_declaration subst decl2 in + if Includecore.exception_declarations env decl1 decl2 + then () +- else raise(Error[Exception_declarations(id, decl1, decl2)]) ++ else raise(Error[cxt, Exception_declarations(id, decl1, decl2)]) + + (* Inclusion between class declarations *) + +-let class_type_declarations env subst id decl1 decl2 = ++let class_type_declarations env cxt subst id decl1 decl2 = + let decl2 = Subst.cltype_declaration subst decl2 in + match Includeclass.class_type_declarations env decl1 decl2 with + [] -> () +- | reason -> raise(Error[Class_type_declarations(id, decl1, decl2, reason)]) ++ | reason -> ++ raise(Error[cxt, Class_type_declarations(id, decl1, decl2, reason)]) + +-let class_declarations env subst id decl1 decl2 = ++let class_declarations env cxt subst id decl1 decl2 = + let decl2 = Subst.class_declaration subst decl2 in + match Includeclass.class_declarations env decl1 decl2 with + [] -> () +- | reason -> raise(Error[Class_declarations(id, decl1, decl2, reason)]) ++ | reason -> raise(Error[cxt, Class_declarations(id, decl1, decl2, reason)]) + + (* Expand a module type identifier when possible *) + + exception Dont_match + +-let expand_module_path env path = ++let expand_module_path env cxt path = + try + Env.find_modtype_expansion path env + with Not_found -> +- raise(Error[Unbound_modtype_path path]) ++ raise(Error[cxt, Unbound_modtype_path path]) + + (* Extract name, kind and ident from a signature item *) + +@@ -128,28 +133,29 @@ + Return the restriction that transforms a value of the smaller type + into a value of the bigger type. *) + +-let rec modtypes env subst mty1 mty2 = ++let rec modtypes env cxt subst mty1 mty2 = + try +- try_modtypes env subst mty1 mty2 ++ try_modtypes env cxt subst mty1 mty2 + with + Dont_match -> +- raise(Error[Module_types(mty1, Subst.modtype subst mty2)]) ++ raise(Error[cxt, Module_types(mty1, Subst.modtype subst mty2)]) + | Error reasons -> +- raise(Error(Module_types(mty1, Subst.modtype subst mty2) :: reasons)) ++ raise(Error((cxt, Module_types(mty1, Subst.modtype subst mty2)) ++ :: reasons)) + +-and try_modtypes env subst mty1 mty2 = ++and try_modtypes env cxt subst mty1 mty2 = + match (mty1, mty2) with + (_, Tmty_ident p2) -> +- try_modtypes2 env mty1 (Subst.modtype subst mty2) ++ try_modtypes2 env cxt mty1 (Subst.modtype subst mty2) + | (Tmty_ident p1, _) -> +- try_modtypes env subst (expand_module_path env p1) mty2 ++ try_modtypes env cxt subst (expand_module_path env cxt p1) mty2 + | (Tmty_signature sig1, Tmty_signature sig2) -> +- signatures env subst sig1 sig2 ++ signatures env cxt subst sig1 sig2 + | (Tmty_functor(param1, arg1, res1), Tmty_functor(param2, arg2, res2)) -> + let arg2' = Subst.modtype subst arg2 in +- let cc_arg = modtypes env Subst.identity arg2' arg1 in ++ let cc_arg = modtypes env (Arg param1::cxt) Subst.identity arg2' arg1 in + let cc_res = +- modtypes (Env.add_module param1 arg2' env) ++ modtypes (Env.add_module param1 arg2' env) (Body param1::cxt) + (Subst.add_module param2 (Pident param1) subst) res1 res2 in + begin match (cc_arg, cc_res) with + (Tcoerce_none, Tcoerce_none) -> Tcoerce_none +@@ -158,19 +164,19 @@ + | (_, _) -> + raise Dont_match + +-and try_modtypes2 env mty1 mty2 = ++and try_modtypes2 env cxt mty1 mty2 = + (* mty2 is an identifier *) + match (mty1, mty2) with + (Tmty_ident p1, Tmty_ident p2) when Path.same p1 p2 -> + Tcoerce_none + | (_, Tmty_ident p2) -> +- try_modtypes env Subst.identity mty1 (expand_module_path env p2) ++ try_modtypes env cxt Subst.identity mty1 (expand_module_path env cxt p2) + | (_, _) -> + assert false + + (* Inclusion between signatures *) + +-and signatures env subst sig1 sig2 = ++and signatures env cxt subst sig1 sig2 = + (* Environment used to check inclusion of components *) + let new_env = + Env.add_signature sig1 env in +@@ -202,7 +208,7 @@ + let rec pair_components subst paired unpaired = function + [] -> + begin match unpaired with +- [] -> signature_components new_env subst (List.rev paired) ++ [] -> signature_components new_env cxt subst (List.rev paired) + | _ -> raise(Error unpaired) + end + | item2 :: rem -> +@@ -234,7 +240,7 @@ + ((item1, item2, pos1) :: paired) unpaired rem + with Not_found -> + let unpaired = +- if report then Missing_field id2 :: unpaired else unpaired in ++ if report then (cxt, Missing_field id2) :: unpaired else unpaired in + pair_components subst paired unpaired rem + end in + (* Do the pairing and checking, and return the final coercion *) +@@ -242,65 +248,67 @@ + + (* Inclusion between signature components *) + +-and signature_components env subst = function ++and signature_components env cxt subst = function + [] -> [] + | (Tsig_value(id1, valdecl1), Tsig_value(id2, valdecl2), pos) :: rem -> +- let cc = value_descriptions env subst id1 valdecl1 valdecl2 in ++ let cc = value_descriptions env cxt subst id1 valdecl1 valdecl2 in + begin match valdecl2.val_kind with +- Val_prim p -> signature_components env subst rem +- | _ -> (pos, cc) :: signature_components env subst rem ++ Val_prim p -> signature_components env cxt subst rem ++ | _ -> (pos, cc) :: signature_components env cxt subst rem + end + | (Tsig_type(id1, tydecl1, _), Tsig_type(id2, tydecl2, _), pos) :: rem -> +- type_declarations env subst id1 tydecl1 tydecl2; +- signature_components env subst rem ++ type_declarations env cxt subst id1 tydecl1 tydecl2; ++ signature_components env cxt subst rem + | (Tsig_exception(id1, excdecl1), Tsig_exception(id2, excdecl2), pos) + :: rem -> +- exception_declarations env subst id1 excdecl1 excdecl2; +- (pos, Tcoerce_none) :: signature_components env subst rem ++ exception_declarations env cxt subst id1 excdecl1 excdecl2; ++ (pos, Tcoerce_none) :: signature_components env cxt subst rem + | (Tsig_module(id1, mty1, _), Tsig_module(id2, mty2, _), pos) :: rem -> + let cc = +- modtypes env subst (Mtype.strengthen env mty1 (Pident id1)) mty2 in +- (pos, cc) :: signature_components env subst rem ++ modtypes env (Module id1::cxt) subst ++ (Mtype.strengthen env mty1 (Pident id1)) mty2 in ++ (pos, cc) :: signature_components env cxt subst rem + | (Tsig_modtype(id1, info1), Tsig_modtype(id2, info2), pos) :: rem -> +- modtype_infos env subst id1 info1 info2; +- signature_components env subst rem ++ modtype_infos env cxt subst id1 info1 info2; ++ signature_components env cxt subst rem + | (Tsig_class(id1, decl1, _), Tsig_class(id2, decl2, _), pos) :: rem -> +- class_declarations env subst id1 decl1 decl2; +- (pos, Tcoerce_none) :: signature_components env subst rem ++ class_declarations env cxt subst id1 decl1 decl2; ++ (pos, Tcoerce_none) :: signature_components env cxt subst rem + | (Tsig_cltype(id1, info1, _), Tsig_cltype(id2, info2, _), pos) :: rem -> +- class_type_declarations env subst id1 info1 info2; +- signature_components env subst rem ++ class_type_declarations env cxt subst id1 info1 info2; ++ signature_components env cxt subst rem + | _ -> + assert false + + (* Inclusion between module type specifications *) + +-and modtype_infos env subst id info1 info2 = ++and modtype_infos env cxt subst id info1 info2 = + let info2 = Subst.modtype_declaration subst info2 in ++ let cxt' = Modtype id :: cxt in + try + match (info1, info2) with + (Tmodtype_abstract, Tmodtype_abstract) -> () + | (Tmodtype_manifest mty1, Tmodtype_abstract) -> () + | (Tmodtype_manifest mty1, Tmodtype_manifest mty2) -> +- check_modtype_equiv env mty1 mty2 ++ check_modtype_equiv env cxt' mty1 mty2 + | (Tmodtype_abstract, Tmodtype_manifest mty2) -> +- check_modtype_equiv env (Tmty_ident(Pident id)) mty2 ++ check_modtype_equiv env cxt' (Tmty_ident(Pident id)) mty2 + with Error reasons -> +- raise(Error(Modtype_infos(id, info1, info2) :: reasons)) ++ raise(Error((cxt, Modtype_infos(id, info1, info2)) :: reasons)) + +-and check_modtype_equiv env mty1 mty2 = ++and check_modtype_equiv env cxt mty1 mty2 = + match +- (modtypes env Subst.identity mty1 mty2, +- modtypes env Subst.identity mty2 mty1) ++ (modtypes env cxt Subst.identity mty1 mty2, ++ modtypes env cxt Subst.identity mty2 mty1) + with + (Tcoerce_none, Tcoerce_none) -> () +- | (_, _) -> raise(Error [Modtype_permutation]) ++ | (_, _) -> raise(Error [cxt, Modtype_permutation]) + + (* Simplified inclusion check between module types (for Env) *) + + let check_modtype_inclusion env mty1 path1 mty2 = + try +- ignore(modtypes env Subst.identity ++ ignore(modtypes env [] Subst.identity + (Mtype.strengthen env mty1 path1) mty2) + with Error reasons -> + raise Not_found +@@ -312,16 +320,16 @@ + + let compunit impl_name impl_sig intf_name intf_sig = + try +- signatures Env.initial Subst.identity impl_sig intf_sig ++ signatures Env.initial [] Subst.identity impl_sig intf_sig + with Error reasons -> +- raise(Error(Interface_mismatch(impl_name, intf_name) :: reasons)) ++ raise(Error(([], Interface_mismatch(impl_name, intf_name)) :: reasons)) + +-(* Hide the substitution parameter to the outside world *) ++(* Hide the context and substitution parameters to the outside world *) + +-let modtypes env mty1 mty2 = modtypes env Subst.identity mty1 mty2 +-let signatures env sig1 sig2 = signatures env Subst.identity sig1 sig2 ++let modtypes env mty1 mty2 = modtypes env [] Subst.identity mty1 mty2 ++let signatures env sig1 sig2 = signatures env [] Subst.identity sig1 sig2 + let type_declarations env id decl1 decl2 = +- type_declarations env Subst.identity id decl1 decl2 ++ type_declarations env [] Subst.identity id decl1 decl2 + + (* Error report *) + +@@ -384,9 +392,62 @@ + | Unbound_modtype_path path -> + fprintf ppf "Unbound module type %a" Printtyp.path path + +-let report_error ppf = function +- | [] -> () +- | err :: errs -> +- let print_errs ppf errs = +- List.iter (fun err -> fprintf ppf "@ %a" include_err err) errs in +- fprintf ppf "@[<v>%a%a@]" include_err err print_errs errs ++let rec context ppf = function ++ Module id :: rem -> ++ fprintf ppf "@[<2>module %a%a@]" ident id args rem ++ | Modtype id :: rem -> ++ fprintf ppf "@[<2>module type %a =@ %a@]" ident id context_mty rem ++ | Body x :: rem -> ++ fprintf ppf "functor (%a) ->@ %a" ident x context_mty rem ++ | Arg x :: rem -> ++ fprintf ppf "functor (%a : %a) -> ..." ident x context_mty rem ++ | [] -> ++ fprintf ppf "<here>" ++and context_mty ppf = function ++ (Module _ | Modtype _) :: _ as rem -> ++ fprintf ppf "@[<2>sig@ %a@;<1 -2>end@]" context rem ++ | cxt -> context ppf cxt ++and args ppf = function ++ Body x :: rem -> ++ fprintf ppf "(%a)%a" ident x args rem ++ | Arg x :: rem -> ++ fprintf ppf "(%a :@ %a) : ..." ident x context_mty rem ++ | cxt -> ++ fprintf ppf " :@ %a" context_mty cxt ++ ++let path_of_context = function ++ Module id :: rem -> ++ let rec subm path = function ++ [] -> path ++ | Module id :: rem -> subm (Pdot (path, Ident.name id, -1)) rem ++ | _ -> assert false ++ in subm (Pident id) rem ++ | _ -> assert false ++ ++let context ppf cxt = ++ if cxt = [] then () else ++ if List.for_all (function Module _ -> true | _ -> false) cxt then ++ fprintf ppf "In module %a:@ " path (path_of_context cxt) ++ else ++ fprintf ppf "@[<hv 2>At position@ %a@]@ " context cxt ++ ++let include_err ppf (cxt, err) = ++ fprintf ppf "@[<v>%a%a@]" context (List.rev cxt) include_err err ++ ++let max_size = 500 ++let buffer = String.create max_size ++let is_big obj = ++ try ignore (Marshal.to_buffer buffer 0 max_size obj []); false ++ with _ -> true ++ ++let report_error ppf errs = ++ if errs = [] then () else ++ let (errs , err) = split_last errs in ++ let pe = ref true in ++ let include_err' ppf err = ++ if !Clflags.show_trace || not (is_big err) then ++ fprintf ppf "%a@ " include_err err ++ else if !pe then (fprintf ppf "...@ "; pe := false) ++ in ++ let print_errs ppf = List.iter (include_err' ppf) in ++ fprintf ppf "@[<v>%a%a@]" print_errs errs include_err err +Index: typing/includemod.mli +=================================================================== +--- typing/includemod.mli (revision 11161) ++++ typing/includemod.mli (working copy) +@@ -24,7 +24,7 @@ + val type_declarations: + Env.t -> Ident.t -> type_declaration -> type_declaration -> unit + +-type error = ++type symptom = + Missing_field of Ident.t + | Value_descriptions of Ident.t * value_description * value_description + | Type_declarations of Ident.t * type_declaration +@@ -43,6 +43,10 @@ + Ctype.class_match_failure list + | Unbound_modtype_path of Path.t + ++type pos = ++ Module of Ident.t | Modtype of Ident.t | Arg of Ident.t | Body of Ident.t ++type error = pos list * symptom ++ + exception Error of error list + + val report_error: formatter -> error list -> unit +Index: utils/clflags.ml +=================================================================== +--- utils/clflags.ml (revision 11161) ++++ utils/clflags.ml (working copy) +@@ -53,6 +53,7 @@ + and dllpaths = ref ([] : string list) (* -dllpath *) + and make_package = ref false (* -pack *) + and for_package = ref (None: string option) (* -for-pack *) ++and show_trace = ref false (* -show-trace *) + let dump_parsetree = ref false (* -dparsetree *) + and dump_rawlambda = ref false (* -drawlambda *) + and dump_lambda = ref false (* -dlambda *) +Index: utils/clflags.mli +=================================================================== +--- utils/clflags.mli (revision 11161) ++++ utils/clflags.mli (working copy) +@@ -50,6 +50,7 @@ + val dllpaths : string list ref + val make_package : bool ref + val for_package : string option ref ++val show_trace : bool ref + val dump_parsetree : bool ref + val dump_rawlambda : bool ref + val dump_lambda : bool ref diff --git a/experimental/garrigue/multimatch.diff b/experimental/garrigue/multimatch.diff new file mode 100644 index 00000000..6eb34b72 --- /dev/null +++ b/experimental/garrigue/multimatch.diff @@ -0,0 +1,1418 @@ +Index: parsing/lexer.mll +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/parsing/lexer.mll,v +retrieving revision 1.73 +diff -u -r1.73 lexer.mll +--- parsing/lexer.mll 11 Apr 2005 16:44:26 -0000 1.73 ++++ parsing/lexer.mll 2 Feb 2006 06:28:32 -0000 +@@ -63,6 +63,8 @@ + "match", MATCH; + "method", METHOD; + "module", MODULE; ++ "multifun", MULTIFUN; ++ "multimatch", MULTIMATCH; + "mutable", MUTABLE; + "new", NEW; + "object", OBJECT; +Index: parsing/parser.mly +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/parsing/parser.mly,v +retrieving revision 1.123 +diff -u -r1.123 parser.mly +--- parsing/parser.mly 23 Mar 2005 03:08:37 -0000 1.123 ++++ parsing/parser.mly 2 Feb 2006 06:28:32 -0000 +@@ -257,6 +257,8 @@ + %token MINUSDOT + %token MINUSGREATER + %token MODULE ++%token MULTIFUN ++%token MULTIMATCH + %token MUTABLE + %token <nativeint> NATIVEINT + %token NEW +@@ -325,7 +327,7 @@ + %nonassoc SEMI /* below EQUAL ({lbl=...; lbl=...}) */ + %nonassoc LET /* above SEMI ( ...; let ... in ...) */ + %nonassoc below_WITH +-%nonassoc FUNCTION WITH /* below BAR (match ... with ...) */ ++%nonassoc FUNCTION WITH MULTIFUN /* below BAR (match ... with ...) */ + %nonassoc AND /* above WITH (module rec A: SIG with ... and ...) */ + %nonassoc THEN /* below ELSE (if ... then ...) */ + %nonassoc ELSE /* (if ... then ... else ...) */ +@@ -804,8 +806,12 @@ + { mkexp(Pexp_function("", None, List.rev $3)) } + | FUN labeled_simple_pattern fun_def + { let (l,o,p) = $2 in mkexp(Pexp_function(l, o, [p, $3])) } ++ | MULTIFUN opt_bar match_cases ++ { mkexp(Pexp_multifun(List.rev $3)) } + | MATCH seq_expr WITH opt_bar match_cases +- { mkexp(Pexp_match($2, List.rev $5)) } ++ { mkexp(Pexp_match($2, List.rev $5, false)) } ++ | MULTIMATCH seq_expr WITH opt_bar match_cases ++ { mkexp(Pexp_match($2, List.rev $5, true)) } + | TRY seq_expr WITH opt_bar match_cases + { mkexp(Pexp_try($2, List.rev $5)) } + | TRY seq_expr WITH error +@@ -1318,10 +1324,10 @@ + | simple_core_type2 { Rinherit $1 } + ; + tag_field: +- name_tag OF opt_ampersand amper_type_list +- { Rtag ($1, $3, List.rev $4) } +- | name_tag +- { Rtag ($1, true, []) } ++ name_tag OF opt_ampersand amper_type_list amper_type_pair_list ++ { Rtag ($1, $3, List.rev $4, $5) } ++ | name_tag amper_type_pair_list ++ { Rtag ($1, true, [], $2) } + ; + opt_ampersand: + AMPERSAND { true } +@@ -1331,6 +1337,11 @@ + core_type { [$1] } + | amper_type_list AMPERSAND core_type { $3 :: $1 } + ; ++amper_type_pair_list: ++ AMPERSAND core_type EQUAL core_type amper_type_pair_list ++ { ($2, $4) :: $5 } ++ | /* empty */ ++ { [] } + opt_present: + LBRACKETGREATER name_tag_list RBRACKET { List.rev $2 } + | /* empty */ { [] } +Index: parsing/parsetree.mli +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/parsing/parsetree.mli,v +retrieving revision 1.42 +diff -u -r1.42 parsetree.mli +--- parsing/parsetree.mli 23 Mar 2005 03:08:37 -0000 1.42 ++++ parsing/parsetree.mli 2 Feb 2006 06:28:32 -0000 +@@ -43,7 +43,7 @@ + | Pfield_var + + and row_field = +- Rtag of label * bool * core_type list ++ Rtag of label * bool * core_type list * (core_type * core_type) list + | Rinherit of core_type + + (* XXX Type expressions for the class language *) +@@ -86,7 +86,7 @@ + | Pexp_let of rec_flag * (pattern * expression) list * expression + | Pexp_function of label * expression option * (pattern * expression) list + | Pexp_apply of expression * (label * expression) list +- | Pexp_match of expression * (pattern * expression) list ++ | Pexp_match of expression * (pattern * expression) list * bool + | Pexp_try of expression * (pattern * expression) list + | Pexp_tuple of expression list + | Pexp_construct of Longident.t * expression option * bool +@@ -111,6 +111,7 @@ + | Pexp_lazy of expression + | Pexp_poly of expression * core_type option + | Pexp_object of class_structure ++ | Pexp_multifun of (pattern * expression) list + + (* Value descriptions *) + +Index: parsing/printast.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/parsing/printast.ml,v +retrieving revision 1.29 +diff -u -r1.29 printast.ml +--- parsing/printast.ml 4 Jan 2006 16:55:50 -0000 1.29 ++++ parsing/printast.ml 2 Feb 2006 06:28:32 -0000 +@@ -205,10 +205,14 @@ + line i ppf "Pexp_apply\n"; + expression i ppf e; + list i label_x_expression ppf l; +- | Pexp_match (e, l) -> ++ | Pexp_match (e, l, b) -> + line i ppf "Pexp_match\n"; + expression i ppf e; + list i pattern_x_expression_case ppf l; ++ bool i ppf b ++ | Pexp_multifun l -> ++ line i ppf "Pexp_multifun\n"; ++ list i pattern_x_expression_case ppf l; + | Pexp_try (e, l) -> + line i ppf "Pexp_try\n"; + expression i ppf e; +@@ -653,7 +657,7 @@ + + and label_x_bool_x_core_type_list i ppf x = + match x with +- Rtag (l, b, ctl) -> ++ Rtag (l, b, ctl, cstr) -> + line i ppf "Rtag \"%s\" %s\n" l (string_of_bool b); + list (i+1) core_type ppf ctl + | Rinherit (ct) -> +Index: typing/btype.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/btype.ml,v +retrieving revision 1.38 +diff -u -r1.38 btype.ml +--- typing/btype.ml 4 Jan 2006 16:55:50 -0000 1.38 ++++ typing/btype.ml 2 Feb 2006 06:28:32 -0000 +@@ -66,16 +66,16 @@ + Clink r when !r <> Cunknown -> commu_repr !r + | c -> c + +-let rec row_field_repr_aux tl = function +- Reither(_, tl', _, {contents = Some fi}) -> +- row_field_repr_aux (tl@tl') fi +- | Reither(c, tl', m, r) -> +- Reither(c, tl@tl', m, r) ++let rec row_field_repr_aux tl tl2 = function ++ Reither(_, tl', _, tl2', {contents = Some fi}) -> ++ row_field_repr_aux (tl@tl') (tl2@tl2') fi ++ | Reither(c, tl', m, tl2', r) -> ++ Reither(c, tl@tl', m, tl2@tl2', r) + | Rpresent (Some _) when tl <> [] -> + Rpresent (Some (List.hd tl)) + | fi -> fi + +-let row_field_repr fi = row_field_repr_aux [] fi ++let row_field_repr fi = row_field_repr_aux [] [] fi + + let rec rev_concat l ll = + match ll with +@@ -170,7 +170,8 @@ + (fun (_, fi) -> + match row_field_repr fi with + | Rpresent(Some ty) -> f ty +- | Reither(_, tl, _, _) -> List.iter f tl ++ | Reither(_, tl, _, tl2, _) -> ++ List.iter f tl; List.iter (fun (t1,t2) -> f t1; f t2) tl2 + | _ -> ()) + row.row_fields; + match (repr row.row_more).desc with +@@ -208,15 +209,17 @@ + (fun (l, fi) -> l, + match row_field_repr fi with + | Rpresent(Some ty) -> Rpresent(Some(f ty)) +- | Reither(c, tl, m, e) -> ++ | Reither(c, tl, m, tpl, e) -> + let e = if keep then e else ref None in + let m = if row.row_fixed then fixed else m in + let tl = List.map f tl in ++ let tl1 = List.map (fun (t1,_) -> repr (f t1)) tpl ++ and tl2 = List.map (fun (_,t2) -> repr (f t2)) tpl in + bound := List.filter + (function {desc=Tconstr(_,[],_)} -> false | _ -> true) +- (List.map repr tl) ++ (List.map repr tl @ tl1 @ tl2) + @ !bound; +- Reither(c, tl, m, e) ++ Reither(c, tl, m, List.combine tl1 tl2, e) + | _ -> fi) + row.row_fields in + let name = +Index: typing/ctype.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/ctype.ml,v +retrieving revision 1.200 +diff -u -r1.200 ctype.ml +--- typing/ctype.ml 6 Jan 2006 02:16:24 -0000 1.200 ++++ typing/ctype.ml 2 Feb 2006 06:28:32 -0000 +@@ -340,7 +340,7 @@ + let fi = filter_row_fields erase fi in + match row_field_repr f with + Rabsent -> fi +- | Reither(_,_,false,e) when erase -> set_row_field e Rabsent; fi ++ | Reither(_,_,false,_,e) when erase -> set_row_field e Rabsent; fi + | _ -> p :: fi + + (**************************************) +@@ -1286,6 +1286,10 @@ + + module TypeMap = Map.Make (TypeOps) + ++ ++(* A list of univars which may appear free in a type, but only if generic *) ++let allowed_univars = ref TypeSet.empty ++ + (* Test the occurence of free univars in a type *) + (* that's way too expansive. Must do some kind of cacheing *) + let occur_univar env ty = +@@ -1307,7 +1311,12 @@ + then + match ty.desc with + Tunivar -> +- if not (TypeSet.mem ty bound) then raise (Unify [ty, newgenvar()]) ++ if TypeSet.mem ty bound then () else ++ if TypeSet.mem ty !allowed_univars && ++ (ty.level = generic_level || ++ ty.level = pivot_level - generic_level) ++ then () ++ else raise (Unify [ty, newgenvar()]) + | Tpoly (ty, tyl) -> + let bound = List.fold_right TypeSet.add (List.map repr tyl) bound in + occur_rec bound ty +@@ -1393,6 +1402,7 @@ + with exn -> univar_pairs := old_univars; raise exn + + let univar_pairs = ref [] ++let delayed_conditionals = ref [] + + + (*****************) +@@ -1691,9 +1701,11 @@ + with Not_found -> (h,l)::hl) + (List.map (fun (l,_) -> (hash_variant l, l)) row1.row_fields) + (List.map fst r2)); ++ let fixed1 = row1.row_fixed || rm1.desc <> Tvar ++ and fixed2 = row2.row_fixed || rm2.desc <> Tvar 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 + newgenvar () + in update_level env (min rm1.level rm2.level) more; + let fixed = row1.row_fixed || row2.row_fixed +@@ -1726,18 +1738,18 @@ + let bound = row1.row_bound @ row2.row_bound in + let row0 = {row_fields = []; row_more = more; row_bound = bound; + row_closed = closed; row_fixed = fixed; row_name = name} in +- let set_more row rest = ++ let set_more row row_fixed rest = + let rest = + 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) ++ || closed && row_fixed && 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; + let rm = row_more row in +- if row.row_fixed then ++ if row_fixed then + if row0.row_more == rm then () else + if rm.desc = Tvar then link_type rm row0.row_more else + unify env rm row0.row_more +@@ -1748,11 +1760,11 @@ + in + let md1 = rm1.desc and md2 = rm2.desc in + begin try +- set_more row1 r2; +- set_more row2 r1; ++ set_more row1 fixed1 r2; ++ set_more row2 fixed2 r1; + List.iter + (fun (l,f1,f2) -> +- try unify_row_field env row1.row_fixed row2.row_fixed l f1 f2 ++ try unify_row_field env fixed1 fixed2 row1 row2 l f1 f2 + with Unify trace -> + raise (Unify ((mkvariant [l,f1] true, + mkvariant [l,f2] true) :: trace))) +@@ -1761,13 +1773,13 @@ + log_type rm1; rm1.desc <- md1; log_type rm2; rm2.desc <- md2; raise exn + end + +-and unify_row_field env fixed1 fixed2 l f1 f2 = ++and unify_row_field env fixed1 fixed2 row1 row2 l f1 f2 = + let f1 = row_field_repr f1 and f2 = row_field_repr f2 in + if f1 == f2 then () else + match f1, f2 with + Rpresent(Some t1), Rpresent(Some t2) -> unify env t1 t2 + | Rpresent None, Rpresent None -> () +- | Reither(c1, tl1, m1, e1), Reither(c2, tl2, m2, e2) -> ++ | Reither(c1, tl1, m1, tp1, e1), Reither(c2, tl2, m2, tp2, e2) -> + if e1 == e2 then () else + let redo = + (m1 || m2) && +@@ -1777,32 +1789,70 @@ + List.iter (unify env t1) tl; + !e1 <> None || !e2 <> None + end in +- if redo then unify_row_field env fixed1 fixed2 l f1 f2 else ++ let redo = ++ redo || begin ++ if tp1 = [] && fixed1 then unify_pairs env tp2; ++ if tp2 = [] && fixed2 then unify_pairs env tp1; ++ !e1 <> None || !e2 <> None ++ end ++ in ++ if redo then unify_row_field env fixed1 fixed2 row1 row2 l f1 f2 else + let tl1 = List.map repr tl1 and tl2 = List.map repr tl2 in + let rec remq tl = function [] -> [] + | ty :: tl' -> + if List.memq ty tl then remq tl tl' else ty :: remq tl tl' + in + let tl2' = remq tl2 tl1 and tl1' = remq tl1 tl2 in ++ let repr_pairs = List.map (fun (t1,t2) -> repr t1, repr t2) in ++ let tp1 = repr_pairs tp1 and tp2 = repr_pairs tp2 in ++ let rec rempq tp = function [] -> [] ++ | (t1,t2 as p) :: tp' -> ++ if List.exists (fun (t1',t2') -> t1==t1' && t2==t2') (tp@tp') then ++ rempq tp tp' ++ else p :: rempq tp tp' ++ in ++ let tp1' = ++ if fixed2 then begin ++ delayed_conditionals := ++ (!univar_pairs, tp1, l, row2) :: !delayed_conditionals; ++ [] ++ end else rempq tp2 tp1 ++ and tp2' = ++ if fixed1 then begin ++ delayed_conditionals := ++ (!univar_pairs, tp2, l, row1) :: !delayed_conditionals; ++ [] ++ end else rempq tp1 tp2 ++ in + let e = ref None in +- 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 ++ let f1' = Reither(c1 || c2, tl1', m1 || m2, tp2', e) ++ and f2' = Reither(c1 || c2, tl2', m1 || m2, tp1', 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 + | Rabsent, Rabsent -> () +- | Reither(false, tl, _, e1), Rpresent(Some t2) when not fixed1 -> ++ | Reither(false, tl, _, tp, e1), Rpresent(Some t2) when not fixed1 -> + set_row_field e1 f2; +- (try List.iter (fun t1 -> unify env t1 t2) tl ++ begin try ++ List.iter (fun t1 -> unify env t1 t2) tl; ++ List.iter (fun (t1,t2) -> unify env t1 t2) tp ++ with exn -> e1 := None; raise exn ++ end ++ | Rpresent(Some t1), Reither(false, tl, _, tp, e2) when not fixed2 -> ++ set_row_field e2 f1; ++ begin try ++ List.iter (unify env t1) tl; ++ List.iter (fun (t1,t2) -> unify env t1 t2) tp ++ with exn -> e2 := None; raise exn ++ end ++ | Reither(true, [], _, tpl, e1), Rpresent None when not fixed1 -> ++ set_row_field e1 f2; ++ (try List.iter (fun (t1,t2) -> unify env t1 t2) tpl + with exn -> e1 := None; raise exn) +- | Rpresent(Some t1), Reither(false, tl, _, e2) when not fixed2 -> ++ | Rpresent None, Reither(true, [], _, tpl, e2) when not fixed2 -> + set_row_field e2 f1; +- (try List.iter (unify env t1) tl ++ (try List.iter (fun (t1,t2) -> unify env t1 t2) tpl + with exn -> e2 := None; raise exn) +- | Reither(true, [], _, e1), Rpresent None when not fixed1 -> +- set_row_field e1 f2 +- | Rpresent None, Reither(true, [], _, e2) when not fixed2 -> +- set_row_field e2 f1 + | _ -> raise (Unify []) + + +@@ -1920,6 +1970,166 @@ + (* Matching between type schemes *) + (***********************************) + ++(* Forward declaration (order should be reversed...) *) ++let equal' = ref (fun _ -> failwith "Ctype.equal'") ++ ++let make_generics_univars tyl = ++ let polyvars = ref TypeSet.empty in ++ let rec make_rec ty = ++ let ty = repr ty in ++ if ty.level = generic_level then begin ++ if ty.desc = Tvar then begin ++ log_type ty; ++ ty.desc <- Tunivar; ++ polyvars := TypeSet.add ty !polyvars ++ end ++ else if ty.desc = Tunivar then set_level ty (generic_level - 1); ++ ty.level <- pivot_level - generic_level; ++ iter_type_expr make_rec ty ++ end ++ in ++ List.iter make_rec tyl; ++ List.iter unmark_type tyl; ++ !polyvars ++ ++(* New version of moregeneral, using unification *) ++ ++let copy_cond (p,tpl,l,row) = ++ let row = ++ match repr (copy (newgenty (Tvariant row))) with ++ {desc=Tvariant row} -> row ++ | _ -> assert false ++ and pairs = ++ List.map (fun (t1,t2) -> copy t1, copy t2) tpl in ++ (p, pairs, l, row) ++ ++let get_row_field l row = ++ try row_field_repr (List.assoc l (row_repr row).row_fields) ++ with Not_found -> Rabsent ++ ++let rec check_conditional_list env cdtls pattvars tpls = ++ match cdtls with ++ [] -> ++ let finished = ++ List.for_all (fun (_,t1,t2) -> !equal' env false [t1] [t2]) tpls in ++ if not finished then begin ++ let polyvars = make_generics_univars pattvars in ++ delayed_conditionals := []; ++ allowed_univars := polyvars; ++ List.iter (fun (pairs, ty1, ty2) -> unify_pairs env ty1 ty2 pairs) ++ tpls; ++ check_conditionals env polyvars !delayed_conditionals ++ end ++ | (pairs, tpl1, l, row2 as cond) :: cdtls -> ++ let cont = check_conditional_list env cdtls pattvars in ++ let tpl1 = ++ List.filter (fun (t1,t2) -> not (!equal' env false [t1] [t2])) tpl1 in ++ let included = ++ List.for_all ++ (fun (t1,t2) -> ++ List.exists ++ (fun (_,t1',t2') -> !equal' env false [t1;t2] [t1';t2']) ++ tpls) ++ tpl1 in ++ if included then cont tpls else ++ match get_row_field l row2 with ++ Rpresent _ -> ++ cont (List.map (fun (t1,t2) -> (pairs,t1,t2)) tpl1 @ tpls) ++ | Rabsent -> cont tpls ++ | Reither (c, tl2, _, _, _) -> ++ cont tpls; ++ if c && tl2 <> [] then () (* cannot succeed *) else ++ let (pairs, tpl1, l, row2) = copy_cond cond ++ and tpls = List.map (fun (p,t1,t2) -> p, copy t1, copy t2) tpls ++ and pattvars = List.map copy pattvars ++ and cdtls = List.map copy_cond cdtls in ++ cleanup_types (); ++ let tl2, tpl2, e2 = ++ match get_row_field l row2 with ++ Reither (c, tl2, _, tpl2, e2) -> tl2, tpl2, e2 ++ | _ -> assert false ++ in ++ let snap = Btype.snapshot () in ++ let ok = ++ try ++ begin match tl2 with ++ [] -> ++ set_row_field e2 (Rpresent None) ++ | t::tl -> ++ set_row_field e2 (Rpresent (Some t)); ++ List.iter (unify env t) tl ++ end; ++ List.iter (fun (t1,t2) -> unify_pairs env t1 t2 pairs) tpl2; ++ true ++ with exn -> ++ Btype.backtrack snap; ++ false ++ in ++ (* This is not [cont] : types have been copied *) ++ if ok then ++ check_conditional_list env cdtls pattvars ++ (List.map (fun (t1,t2) -> (pairs,t1,t2)) tpl1 @ tpls) ++ ++and check_conditionals env polyvars cdtls = ++ let cdtls = List.map copy_cond cdtls in ++ let pattvars = ref [] in ++ TypeSet.iter ++ (fun ty -> ++ let ty = repr ty in ++ match ty.desc with ++ Tsubst ty -> ++ let ty = repr ty in ++ begin match ty.desc with ++ Tunivar -> ++ log_type ty; ++ ty.desc <- Tvar; ++ pattvars := ty :: !pattvars ++ | Ttuple [tv;_] -> ++ if tv.desc = Tunivar then ++ (log_type tv; tv.desc <- Tvar; pattvars := ty :: !pattvars) ++ else if tv.desc <> Tvar then assert false ++ | Tvar -> () ++ | _ -> assert false ++ end ++ | _ -> ()) ++ polyvars; ++ cleanup_types (); ++ check_conditional_list env cdtls !pattvars [] ++ ++ ++(* Must empty univar_pairs first *) ++let unify_poly env polyvars subj patt = ++ let old_level = !current_level in ++ current_level := generic_level; ++ delayed_conditionals := []; ++ allowed_univars := polyvars; ++ try ++ unify env subj patt; ++ check_conditionals env polyvars !delayed_conditionals; ++ current_level := old_level; ++ allowed_univars := TypeSet.empty; ++ delayed_conditionals := [] ++ with exn -> ++ current_level := old_level; ++ allowed_univars := TypeSet.empty; ++ delayed_conditionals := []; ++ raise exn ++ ++let moregeneral env _ subj patt = ++ let old_level = !current_level in ++ current_level := generic_level; ++ let subj = instance subj ++ and patt = instance patt in ++ let polyvars = make_generics_univars [patt] in ++ current_level := old_level; ++ let snap = Btype.snapshot () in ++ try ++ unify_poly env polyvars subj patt; ++ true ++ with Unify _ -> ++ Btype.backtrack snap; ++ false ++ + (* + Update the level of [ty]. First check that the levels of generic + variables from the subject are not lowered. +@@ -2072,35 +2282,101 @@ + Rpresent(Some t1), Rpresent(Some t2) -> + moregen inst_nongen type_pairs env t1 t2 + | Rpresent None, Rpresent None -> () +- | Reither(false, tl1, _, e1), Rpresent(Some t2) when not univ -> ++ | Reither(false, tl1, _, [], e1), Rpresent(Some t2) when not univ -> + set_row_field e1 f2; + List.iter (fun t1 -> moregen inst_nongen type_pairs env t1 t2) tl1 +- | Reither(c1, tl1, _, e1), Reither(c2, tl2, m2, e2) -> ++ | Reither(c1, tl1, _, tpl1, e1), Reither(c2, tl2, m2, tpl2, e2) -> + if e1 != e2 then begin + if c1 && not c2 then raise(Unify []); +- set_row_field e1 (Reither (c2, [], m2, e2)); +- if List.length tl1 = List.length tl2 then +- List.iter2 (moregen inst_nongen type_pairs env) tl1 tl2 +- else match tl2 with +- t2 :: _ -> ++ let tpl' = if tpl1 = [] then tpl2 else [] in ++ set_row_field e1 (Reither (c2, [], m2, tpl', e2)); ++ begin match tl2 with ++ [t2] -> + List.iter (fun t1 -> moregen inst_nongen type_pairs env t1 t2) + tl1 +- | [] -> +- if tl1 <> [] then raise (Unify []) ++ | _ -> ++ if List.length tl1 <> List.length tl2 then raise (Unify []); ++ List.iter2 (moregen inst_nongen type_pairs env) tl1 tl2 ++ end; ++ if tpl1 <> [] then ++ delayed_conditionals := ++ (!univar_pairs, tpl1, l, row2) :: !delayed_conditionals + end +- | Reither(true, [], _, e1), Rpresent None when not univ -> ++ | Reither(true, [], _, [], e1), Rpresent None when not univ -> + set_row_field e1 f2 +- | Reither(_, _, _, e1), Rabsent when not univ -> ++ | Reither(_, _, _, [], e1), Rabsent when not univ -> + set_row_field e1 f2 + | Rabsent, Rabsent -> () + | _ -> raise (Unify [])) + pairs + ++let check_conditional env (pairs, tpl1, l, row2) tpls cont = ++ let tpl1 = ++ List.filter (fun (t1,t2) -> not (!equal' env false [t1] [t2])) tpl1 in ++ let included = ++ List.for_all ++ (fun (t1,t2) -> ++ List.exists (fun (t1',t2') -> !equal' env false [t1;t2] [t1';t2']) ++ tpls) ++ tpl1 in ++ if tpl1 = [] || included then cont tpls else ++ match get_row_field l row2 with ++ Rpresent _ -> cont (tpl1 @ tpls) ++ | Rabsent -> cont tpls ++ | Reither (c, tl2, _, tpl2, e2) -> ++ if not c || tl2 = [] then begin ++ let snap = Btype.snapshot () in ++ let ok = ++ try ++ begin match tl2 with ++ [] -> ++ set_row_field e2 (Rpresent None) ++ | t::tl -> ++ set_row_field e2 (Rpresent (Some t)); ++ List.iter (unify env t) tl ++ end; ++ List.iter (fun (t1,t2) -> unify_pairs env t1 t2 pairs) tpl2; ++ true ++ with Unify _ -> false ++ in ++ if ok then cont (tpl1 @ tpls); ++ Btype.backtrack snap ++ end; ++ cont tpls ++ ++let rec check_conditionals inst_nongen env cdtls tpls = ++ match cdtls with ++ [] -> ++ let tpls = ++ List.filter (fun (t1,t2) -> not (!equal' env false [t1] [t2])) tpls in ++ if tpls = [] then () else begin ++ delayed_conditionals := []; ++ let tl1, tl2 = List.split tpls in ++ let type_pairs = TypePairs.create 13 in ++ List.iter2 (moregen false type_pairs env) tl2 tl1; ++ check_conditionals inst_nongen env !delayed_conditionals [] ++ end ++ | cdtl :: cdtls -> ++ check_conditional env cdtl tpls ++ (check_conditionals inst_nongen env cdtls) ++ ++ + (* Must empty univar_pairs first *) + let moregen inst_nongen type_pairs env patt subj = + univar_pairs := []; +- moregen inst_nongen type_pairs env patt subj ++ delayed_conditionals := []; ++ try ++ moregen inst_nongen type_pairs env patt subj; ++ check_conditionals inst_nongen env !delayed_conditionals []; ++ univar_pairs := []; ++ delayed_conditionals := [] ++ with exn -> ++ univar_pairs := []; ++ delayed_conditionals := []; ++ raise exn ++ + ++(* old implementation + (* + Non-generic variable can be instanciated only if [inst_nongen] is + true. So, [inst_nongen] should be set to false if the subject might +@@ -2128,6 +2404,7 @@ + in + current_level := old_level; + res ++*) + + + (* Alternative approach: "rigidify" a type scheme, +@@ -2296,30 +2573,36 @@ + {desc=Tvariant row2} -> eqtype_row rename type_pairs subst env row1 row2 + | _ -> raise Cannot_expand + with Cannot_expand -> ++ let eqtype_rec = eqtype rename type_pairs subst env in + let row1 = row_repr row1 and row2 = row_repr row2 in + let r1, r2, pairs = merge_row_fields row1.row_fields row2.row_fields in + if row1.row_closed <> row2.row_closed + || not row1.row_closed && (r1 <> [] || r2 <> []) + || filter_row_fields false (r1 @ r2) <> [] + then raise (Unify []); +- if not (static_row row1) then +- eqtype rename type_pairs subst env row1.row_more row2.row_more; ++ if not (static_row row1) then eqtype_rec row1.row_more row2.row_more; + List.iter + (fun (_,f1,f2) -> + match row_field_repr f1, row_field_repr f2 with + Rpresent(Some t1), Rpresent(Some t2) -> +- eqtype rename type_pairs subst env t1 t2 +- | Reither(true, [], _, _), Reither(true, [], _, _) -> +- () +- | Reither(false, t1::tl1, _, _), Reither(false, t2::tl2, _, _) -> +- eqtype rename type_pairs subst env t1 t2; ++ eqtype_rec t1 t2 ++ | Reither(true, [], _, tp1, _), Reither(true, [], _, tp2, _) -> ++ List.iter2 ++ (fun (t1,t1') (t2,t2') -> eqtype_rec t1 t2; eqtype_rec t1' t2') ++ tp1 tp2 ++ | Reither(false, t1::tl1, _, tpl1, _), ++ Reither(false, t2::tl2, _, tpl2, _) -> ++ eqtype_rec t1 t2; ++ List.iter2 ++ (fun (t1,t1') (t2,t2') -> eqtype_rec t1 t2; eqtype_rec t1' t2') ++ tpl1 tpl2; + if List.length tl1 = List.length tl2 then + (* if same length allow different types (meaning?) *) +- List.iter2 (eqtype rename type_pairs subst env) tl1 tl2 ++ List.iter2 eqtype_rec tl1 tl2 + else begin + (* otherwise everything must be equal *) +- List.iter (eqtype rename type_pairs subst env t1) tl2; +- List.iter (fun t1 -> eqtype rename type_pairs subst env t1 t2) tl1 ++ List.iter (eqtype_rec t1) tl2; ++ List.iter (fun t1 -> eqtype_rec t1 t2) tl1 + end + | Rpresent None, Rpresent None -> () + | Rabsent, Rabsent -> () +@@ -2334,6 +2617,8 @@ + with + Unify _ -> false + ++let () = equal' := equal ++ + (* Must empty univar_pairs first *) + let eqtype rename type_pairs subst env t1 t2 = + univar_pairs := []; +@@ -2770,14 +3055,14 @@ + (fun (l,f as orig) -> match row_field_repr f with + Rpresent None -> + if posi then +- (l, Reither(true, [], false, ref None)), Unchanged ++ (l, Reither(true, [], false, [], ref None)), Unchanged + else + orig, Unchanged + | Rpresent(Some t) -> + let (t', c) = build_subtype env visited loops posi level' t in + if posi && level > 0 then begin + bound := t' :: !bound; +- (l, Reither(false, [t'], false, ref None)), c ++ (l, Reither(false, [t'], false, [], ref None)), c + end else + (l, Rpresent(Some t')), c + | _ -> assert false) +@@ -2960,11 +3245,11 @@ + List.fold_left + (fun cstrs (_,f1,f2) -> + match row_field_repr f1, row_field_repr f2 with +- (Rpresent None|Reither(true,_,_,_)), Rpresent None -> ++ (Rpresent None|Reither(true,_,_,[],_)), Rpresent None -> + cstrs + | Rpresent(Some t1), Rpresent(Some t2) -> + subtype_rec env ((t1, t2)::trace) t1 t2 cstrs +- | Reither(false, t1::_, _, _), Rpresent(Some t2) -> ++ | Reither(false, t1::_, _, [], _), Rpresent(Some t2) -> + subtype_rec env ((t1, t2)::trace) t1 t2 cstrs + | Rabsent, _ -> cstrs + | _ -> raise Exit) +@@ -2977,11 +3262,11 @@ + (fun cstrs (_,f1,f2) -> + match row_field_repr f1, row_field_repr f2 with + Rpresent None, Rpresent None +- | Reither(true,[],_,_), Reither(true,[],_,_) ++ | Reither(true,[],_,[],_), Reither(true,[],_,[],_) + | Rabsent, Rabsent -> + cstrs + | Rpresent(Some t1), Rpresent(Some t2) +- | Reither(false,[t1],_,_), Reither(false,[t2],_,_) -> ++ | Reither(false,[t1],_,[],_), Reither(false,[t2],_,[],_) -> + subtype_rec env ((t1, t2)::trace) t1 t2 cstrs + | _ -> raise Exit) + cstrs pairs +@@ -3079,16 +3364,26 @@ + let fields = List.map + (fun (l,f) -> + let f = row_field_repr f in l, +- match f with Reither(b, ty::(_::_ as tyl), m, e) -> +- let tyl' = +- List.fold_left +- (fun tyl ty -> +- if List.exists (fun ty' -> equal env false [ty] [ty']) tyl +- then tyl else ty::tyl) +- [ty] tyl ++ match f with Reither(b, tyl, m, tp, e) -> ++ let rem_dbl eq l = ++ List.rev ++ (List.fold_left ++ (fun xs x -> if List.exists (eq x) xs then xs else x::xs) ++ [] l) ++ in ++ let tyl' = rem_dbl (fun t1 t2 -> equal env false [t1] [t2]) tyl ++ and tp' = ++ List.filter ++ (fun (ty1,ty2) -> not (equal env false [ty1] [ty2])) tp ++ in ++ let tp' = ++ rem_dbl ++ (fun (t1,t2) (t1',t2') -> equal env false [t1;t2] [t1';t2']) ++ tp' + in +- if List.length tyl' <= List.length tyl then +- let f = Reither(b, List.rev tyl', m, ref None) in ++ if List.length tyl' < List.length tyl ++ || List.length tp' < List.length tp then ++ let f = Reither(b, tyl', m, tp', ref None) in + set_row_field e f; + f + else f +@@ -3344,9 +3639,9 @@ + List.iter + (fun (l,fi) -> + match row_field_repr fi with +- Reither (c, t1::(_::_ as tl), m, e) -> ++ Reither (c, t1::(_::_ as tl), m, tp, e) -> + List.iter (unify env t1) tl; +- set_row_field e (Reither (c, [t1], m, ref None)) ++ set_row_field e (Reither (c, [t1], m, tp, ref None)) + | _ -> + ()) + row.row_fields; +Index: typing/includecore.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/includecore.ml,v +retrieving revision 1.32 +diff -u -r1.32 includecore.ml +--- typing/includecore.ml 8 Aug 2005 05:40:52 -0000 1.32 ++++ typing/includecore.ml 2 Feb 2006 06:28:32 -0000 +@@ -71,10 +71,10 @@ + (fun (_, f1, f2) -> + match Btype.row_field_repr f1, Btype.row_field_repr f2 with + Rpresent(Some t1), +- (Rpresent(Some t2) | Reither(false, [t2], _, _)) -> ++ (Rpresent(Some t2) | Reither(false,[t2],_,[],_)) -> + to_equal := (t1,t2) :: !to_equal; true +- | Rpresent None, (Rpresent None | Reither(true, [], _, _)) -> true +- | Reither(c1,tl1,_,_), Reither(c2,tl2,_,_) ++ | Rpresent None, (Rpresent None | Reither(true,[],_,[],_)) -> true ++ | Reither(c1,tl1,_,[],_), Reither(c2,tl2,_,[],_) + when List.length tl1 = List.length tl2 && c1 = c2 -> + to_equal := List.combine tl1 tl2 @ !to_equal; true + | Rabsent, (Reither _ | Rabsent) -> true +Index: typing/oprint.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/oprint.ml,v +retrieving revision 1.22 +diff -u -r1.22 oprint.ml +--- typing/oprint.ml 23 Mar 2005 03:08:37 -0000 1.22 ++++ typing/oprint.ml 2 Feb 2006 06:28:33 -0000 +@@ -223,14 +223,18 @@ + print_fields rest ppf [] + | (s, t) :: l -> + fprintf ppf "%s : %a;@ %a" s print_out_type t (print_fields rest) l +-and print_row_field ppf (l, opt_amp, tyl) = ++and print_row_field ppf (l, opt_amp, tyl, tpl) = + let pr_of ppf = + if opt_amp then fprintf ppf " of@ &@ " + else if tyl <> [] then fprintf ppf " of@ " +- else fprintf ppf "" +- in +- fprintf ppf "@[<hv 2>`%s%t%a@]" l pr_of (print_typlist print_out_type " &") +- tyl ++ and pr_tp ppf (t1,t2) = ++ fprintf ppf "@[<hv 2>%a =@ %a@]" ++ print_out_type t1 ++ print_out_type t2 ++ in ++ fprintf ppf "@[<hv 2>`%s%t%a%a@]" l pr_of ++ (print_typlist print_out_type " &") tyl ++ (print_list_init pr_tp (fun ppf -> fprintf ppf " &@ ")) tpl + and print_typlist print_elem sep ppf = + function + [] -> () +Index: typing/outcometree.mli +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/outcometree.mli,v +retrieving revision 1.14 +diff -u -r1.14 outcometree.mli +--- typing/outcometree.mli 23 Mar 2005 03:08:37 -0000 1.14 ++++ typing/outcometree.mli 2 Feb 2006 06:28:33 -0000 +@@ -61,7 +61,8 @@ + bool * out_variant * bool * (string list) option + | Otyp_poly of string list * out_type + and out_variant = +- | Ovar_fields of (string * bool * out_type list) list ++ | Ovar_fields of ++ (string * bool * out_type list * (out_type * out_type) list ) list + | Ovar_name of out_ident * out_type list + + type out_class_type = +Index: typing/parmatch.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/parmatch.ml,v +retrieving revision 1.70 +diff -u -r1.70 parmatch.ml +--- typing/parmatch.ml 24 Mar 2005 17:20:54 -0000 1.70 ++++ typing/parmatch.ml 2 Feb 2006 06:28:33 -0000 +@@ -568,11 +568,11 @@ + List.fold_left + (fun nm (tag,f) -> + match Btype.row_field_repr f with +- | Reither(_, _, false, e) -> ++ | Reither(_, _, false, _, e) -> + (* m=false means that this tag is not explicitly matched *) + Btype.set_row_field e Rabsent; + None +- | Rabsent | Reither (_, _, true, _) | Rpresent _ -> nm) ++ | Rabsent | Reither (_, _, true, _, _) | Rpresent _ -> nm) + row.row_name row.row_fields in + if not row.row_closed || nm != row.row_name then begin + (* this unification cannot fail *) +@@ -605,8 +605,8 @@ + List.for_all + (fun (tag,f) -> + match Btype.row_field_repr f with +- Rabsent | Reither(_, _, false, _) -> true +- | Reither (_, _, true, _) ++ Rabsent | Reither(_, _, false, _, _) -> true ++ | Reither (_, _, true, _, _) + (* m=true, do not discard matched tags, rather warn *) + | Rpresent _ -> List.mem tag fields) + row.row_fields +@@ -739,7 +739,7 @@ + match Btype.row_field_repr f with + Rabsent (* | Reither _ *) -> others + (* This one is called after erasing pattern info *) +- | Reither (c, _, _, _) -> make_other_pat tag c :: others ++ | Reither (c, _, _, _, _) -> make_other_pat tag c :: others + | Rpresent arg -> make_other_pat tag (arg = None) :: others) + [] row.row_fields + with +Index: typing/printtyp.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/printtyp.ml,v +retrieving revision 1.140 +diff -u -r1.140 printtyp.ml +--- typing/printtyp.ml 4 Jan 2006 16:55:50 -0000 1.140 ++++ typing/printtyp.ml 2 Feb 2006 06:28:33 -0000 +@@ -157,9 +157,12 @@ + and raw_field ppf = function + Rpresent None -> fprintf ppf "Rpresent None" + | Rpresent (Some t) -> fprintf ppf "@[<1>Rpresent(Some@,%a)@]" raw_type t +- | Reither (c,tl,m,e) -> +- fprintf ppf "@[<hov1>Reither(%b,@,%a,@,%b,@,@[<1>ref%t@])@]" c +- raw_type_list tl m ++ | Reither (c,tl,m,tpl,e) -> ++ fprintf ppf "@[<hov1>Reither(%b,@,%a,@,%b,@,%a,@,@[<1>ref%t@])@]" ++ c raw_type_list tl m ++ (raw_list ++ (fun ppf (t1,t2) -> ++ fprintf ppf "@[%a,@,%a@]" raw_type t1 raw_type t2)) tpl + (fun ppf -> + match !e with None -> fprintf ppf " None" + | Some f -> fprintf ppf "@,@[<1>(%a)@]" raw_field f) +@@ -219,8 +222,9 @@ + List.for_all + (fun (_, f) -> + match row_field_repr f with +- | Reither(c, l, _, _) -> +- row.row_closed && if c then l = [] else List.length l = 1 ++ | Reither(c, l, _, pl, _) -> ++ row.row_closed && pl = [] && ++ if c then l = [] else List.length l = 1 + | _ -> true) + row.row_fields + +@@ -392,13 +396,16 @@ + + and tree_of_row_field sch (l, f) = + match row_field_repr f with +- | Rpresent None | Reither(true, [], _, _) -> (l, false, []) +- | Rpresent(Some ty) -> (l, false, [tree_of_typexp sch ty]) +- | Reither(c, tyl, _, _) -> +- if c (* contradiction: un constructeur constant qui a un argument *) +- then (l, true, tree_of_typlist sch tyl) +- else (l, false, tree_of_typlist sch tyl) +- | Rabsent -> (l, false, [] (* une erreur, en fait *)) ++ | Rpresent None | Reither(true, [], _, [], _) -> (l, false, [], []) ++ | Rpresent(Some ty) -> (l, false, [tree_of_typexp sch ty], []) ++ | Reither(c, tyl, _, tpl, _) -> ++ let ttpl = ++ List.map ++ (fun (t1,t2) -> tree_of_typexp sch t1, tree_of_typexp sch t2) ++ tpl ++ in ++ (l, c && tpl = [], tree_of_typlist sch tyl, ttpl) ++ | Rabsent -> (l, false, [], [] (* une erreur, en fait *)) + + and tree_of_typlist sch tyl = + List.map (tree_of_typexp sch) tyl +Index: typing/typeclass.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/typeclass.ml,v +retrieving revision 1.85 +diff -u -r1.85 typeclass.ml +--- typing/typeclass.ml 22 Jul 2005 06:42:36 -0000 1.85 ++++ typing/typeclass.ml 2 Feb 2006 06:28:33 -0000 +@@ -727,7 +727,7 @@ + {pexp_loc = loc; pexp_desc = + Pexp_match({pexp_loc = loc; pexp_desc = + Pexp_ident(Longident.Lident"*opt*")}, +- scases)} in ++ scases, false)} in + let sfun = + {pcl_loc = scl.pcl_loc; pcl_desc = + Pcl_fun(l, None, {ppat_loc = loc; ppat_desc = Ppat_var"*opt*"}, +Index: typing/typecore.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/typecore.ml,v +retrieving revision 1.178 +diff -u -r1.178 typecore.ml +--- typing/typecore.ml 6 Jan 2006 02:25:37 -0000 1.178 ++++ typing/typecore.ml 2 Feb 2006 06:28:33 -0000 +@@ -156,15 +156,21 @@ + let field = row_field tag row in + begin match field with + | Rabsent -> assert false +- | Reither (true, [], _, e) when not row.row_closed -> +- set_row_field e (Rpresent None) +- | Reither (false, ty::tl, _, e) when not row.row_closed -> ++ | Reither (true, [], _, tpl, e) when not row.row_closed -> ++ set_row_field e (Rpresent None); ++ List.iter ++ (fun (t1,t2) -> unify_pat pat.pat_env {pat with pat_type=t1} t2) ++ tpl ++ | Reither (false, ty::tl, _, tpl, e) when not row.row_closed -> + set_row_field e (Rpresent (Some ty)); ++ List.iter ++ (fun (t1,t2) -> unify_pat pat.pat_env {pat with pat_type=t1} t2) ++ tpl; + 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 -> +- set_row_field e (Reither (c, [], false, ref None)) ++ | Reither (c, l, true, tpl, e) when not row.row_fixed -> ++ set_row_field e (Reither (c, [], false, [], ref None)) + | _ -> () + end; + (* Force check of well-formedness *) +@@ -307,13 +313,13 @@ + match row_field_repr f with + Rpresent None -> + (l,None) :: pats, +- (l, Reither(true,[], true, ref None)) :: fields ++ (l, Reither(true,[], true, [], ref None)) :: fields + | Rpresent (Some ty) -> + bound := ty :: !bound; + (l, Some {pat_desc=Tpat_any; pat_loc=Location.none; pat_env=env; + pat_type=ty}) + :: pats, +- (l, Reither(false, [ty], true, ref None)) :: fields ++ (l, Reither(false, [ty], true, [], ref None)) :: fields + | _ -> pats, fields) + ([],[]) fields in + let row = +@@ -337,6 +343,18 @@ + pat pats in + rp { r with pat_loc = loc } + ++let rec flatten_or_pat pat = ++ match pat.pat_desc with ++ Tpat_or (p1, p2, _) -> ++ flatten_or_pat p1 @ flatten_or_pat p2 ++ | _ -> ++ [pat] ++ ++let all_variants pat = ++ List.for_all ++ (function {pat_desc=Tpat_variant _} -> true | _ -> false) ++ (flatten_or_pat pat) ++ + let rec find_record_qual = function + | [] -> None + | (Longident.Ldot (modname, _), _) :: _ -> Some modname +@@ -423,7 +441,7 @@ + let arg = may_map (type_pat env) sarg in + let arg_type = match arg with None -> [] | Some arg -> [arg.pat_type] in + let row = { row_fields = +- [l, Reither(arg = None, arg_type, true, ref None)]; ++ [l, Reither(arg = None, arg_type, true, [], ref None)]; + row_bound = arg_type; + row_closed = false; + row_more = newvar (); +@@ -788,7 +806,7 @@ + newty (Tarrow(p, type_option (newvar ()), type_approx env e, Cok)) + | Pexp_function (p,_,(_,e)::_) -> + newty (Tarrow(p, newvar (), type_approx env e, Cok)) +- | Pexp_match (_, (_,e)::_) -> type_approx env e ++ | Pexp_match (_, (_,e)::_, false) -> type_approx env e + | Pexp_try (e, _) -> type_approx env e + | Pexp_tuple l -> newty (Ttuple(List.map (type_approx env) l)) + | Pexp_ifthenelse (_,e,_) -> type_approx env e +@@ -939,17 +957,26 @@ + exp_loc = sexp.pexp_loc; + exp_type = ty_res; + exp_env = env } +- | Pexp_match(sarg, caselist) -> ++ | Pexp_match(sarg, caselist, multi) -> + let arg = type_exp env sarg in + let ty_res = newvar() in + let cases, partial = +- type_cases env arg.exp_type ty_res (Some sexp.pexp_loc) caselist ++ type_cases env arg.exp_type ty_res (Some sexp.pexp_loc) caselist ~multi + in + re { + exp_desc = Texp_match(arg, cases, partial); + exp_loc = sexp.pexp_loc; + exp_type = ty_res; + exp_env = env } ++ | Pexp_multifun caselist -> ++ let ty_arg = newvar() and ty_res = newvar() in ++ let cases, partial = ++ type_cases env ty_arg ty_res (Some sexp.pexp_loc) caselist ~multi:true ++ in ++ { exp_desc = Texp_function (cases, partial); ++ exp_loc = sexp.pexp_loc; ++ exp_type = newty (Tarrow ("", ty_arg, ty_res, Cok)); ++ exp_env = env } + | Pexp_try(sbody, caselist) -> + let body = type_exp env sbody in + let cases, _ = +@@ -1758,7 +1785,7 @@ + {pexp_loc = loc; pexp_desc = + Pexp_match({pexp_loc = loc; pexp_desc = + Pexp_ident(Longident.Lident"*opt*")}, +- scases)} in ++ scases, false)} in + let sfun = + {pexp_loc = sexp.pexp_loc; pexp_desc = + Pexp_function(l, None,[{ppat_loc = loc; ppat_desc = Ppat_var"*opt*"}, +@@ -1864,7 +1891,8 @@ + + (* Typing of match cases *) + +-and type_cases ?in_function env ty_arg ty_res partial_loc caselist = ++and type_cases ?in_function ?(multi=false) ++ env ty_arg ty_res partial_loc caselist = + let ty_arg' = newvar () in + let pattern_force = ref [] in + let pat_env_list = +@@ -1898,10 +1926,64 @@ + let cases = + List.map2 + (fun (pat, ext_env) (spat, sexp) -> +- let exp = type_expect ?in_function ext_env sexp ty_res in +- (pat, exp)) +- pat_env_list caselist +- in ++ let add_variant_case lab row ty_res ty_res' = ++ let fi = List.assoc lab (row_repr row).row_fields in ++ begin match row_field_repr fi with ++ Reither (c, _, m, _, e) -> ++ let row' = ++ { row_fields = ++ [lab, Reither(c,[],false,[ty_res,ty_res'], ref None)]; ++ row_more = newvar (); row_bound = [ty_res; ty_res']; ++ row_closed = false; row_fixed = false; row_name = None } ++ in ++ unify_pat ext_env {pat with pat_type= newty (Tvariant row)} ++ (newty (Tvariant row')) ++ | _ -> ++ unify_exp ext_env ++ { exp_desc = Texp_tuple []; exp_type = ty_res; ++ exp_env = ext_env; exp_loc = sexp.pexp_loc } ++ ty_res' ++ end ++ in ++ pat, ++ match pat.pat_desc with ++ _ when multi && all_variants pat -> ++ let ty_res' = newvar () in ++ List.iter ++ (function {pat_desc=Tpat_variant(lab,_,row)} -> ++ add_variant_case lab row ty_res ty_res' ++ | _ -> assert false) ++ (flatten_or_pat pat); ++ type_expect ?in_function ext_env sexp ty_res' ++ | Tpat_alias (p, id) when multi && all_variants p -> ++ let vd = Env.find_value (Path.Pident id) ext_env in ++ let row' = ++ match repr vd.val_type with ++ {desc=Tvariant row'} -> row' ++ | _ -> assert false ++ in ++ begin_def (); ++ let tv = newvar () in ++ let env = Env.add_value id {vd with val_type=tv} ext_env in ++ let exp = type_exp env sexp in ++ end_def (); ++ generalize exp.exp_type; ++ generalize tv; ++ List.iter ++ (function {pat_desc=Tpat_variant(lab,_,row)}, [tv'; ty'] -> ++ let fi' = List.assoc lab (row_repr row').row_fields in ++ let row' = ++ {row' with row_fields=[lab,fi']; row_more=newvar()} in ++ unify_pat ext_env {pat with pat_type=tv'} ++ (newty (Tvariant row')); ++ add_variant_case lab row ty_res ty' ++ | _ -> assert false) ++ (List.map (fun p -> p, instance_list [tv; exp.exp_type]) ++ (flatten_or_pat p)); ++ {exp with exp_type = instance exp.exp_type} ++ | _ -> ++ type_expect ?in_function ext_env sexp ty_res) ++ pat_env_list caselist in + let partial = + match partial_loc with None -> Partial + | Some loc -> Parmatch.check_partial loc cases +Index: typing/typedecl.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/typedecl.ml,v +retrieving revision 1.75 +diff -u -r1.75 typedecl.ml +--- typing/typedecl.ml 16 Aug 2005 00:48:56 -0000 1.75 ++++ typing/typedecl.ml 2 Feb 2006 06:28:33 -0000 +@@ -432,8 +432,10 @@ + match Btype.row_field_repr f with + Rpresent (Some ty) -> + compute_same ty +- | Reither (_, tyl, _, _) -> +- List.iter compute_same tyl ++ | Reither (_, tyl, _, tpl, _) -> ++ List.iter compute_same tyl; ++ List.iter (compute_variance_rec true true true) ++ (List.map fst tpl @ List.map snd tpl) + | _ -> ()) + row.row_fields; + compute_same row.row_more +@@ -856,8 +858,8 @@ + explain row.row_fields + (fun (l,f) -> match Btype.row_field_repr f with + Rpresent (Some t) -> t +- | Reither (_,[t],_,_) -> t +- | Reither (_,tl,_,_) -> Btype.newgenty (Ttuple tl) ++ | Reither (_,[t],_,_,_) -> t ++ | Reither (_,tl,_,_,_) -> Btype.newgenty (Ttuple tl) + | _ -> Btype.newgenty (Ttuple[])) + "case" (fun (lab,_) -> "`" ^ lab ^ " of ") + | _ -> trivial ty' +Index: typing/types.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/types.ml,v +retrieving revision 1.25 +diff -u -r1.25 types.ml +--- typing/types.ml 9 Dec 2004 12:40:53 -0000 1.25 ++++ typing/types.ml 2 Feb 2006 06:28:33 -0000 +@@ -48,7 +48,9 @@ + + and row_field = + Rpresent of type_expr option +- | Reither of bool * type_expr list * bool * row_field option ref ++ | Reither of ++ bool * type_expr list * bool * ++ (type_expr * type_expr) list * row_field option ref + | Rabsent + + and abbrev_memo = +Index: typing/types.mli +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/types.mli,v +retrieving revision 1.25 +diff -u -r1.25 types.mli +--- typing/types.mli 9 Dec 2004 12:40:53 -0000 1.25 ++++ typing/types.mli 2 Feb 2006 06:28:33 -0000 +@@ -47,7 +47,9 @@ + + and row_field = + Rpresent of type_expr option +- | Reither of bool * type_expr list * bool * row_field option ref ++ | Reither of ++ bool * type_expr list * bool * ++ (type_expr * type_expr) list * row_field option ref + (* 1st true denotes a constant constructor *) + (* 2nd true denotes a tag in a pattern matching, and + is erased later *) +Index: typing/typetexp.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/typetexp.ml,v +retrieving revision 1.54 +diff -u -r1.54 typetexp.ml +--- typing/typetexp.ml 22 Jul 2005 06:42:36 -0000 1.54 ++++ typing/typetexp.ml 2 Feb 2006 06:28:33 -0000 +@@ -207,9 +207,9 @@ + match Btype.row_field_repr f with + | Rpresent (Some ty) -> + bound := ty :: !bound; +- Reither(false, [ty], false, ref None) ++ Reither(false, [ty], false, [], ref None) + | Rpresent None -> +- Reither (true, [], false, ref None) ++ Reither (true, [], false, [], ref None) + | _ -> f) + row.row_fields + in +@@ -273,13 +273,16 @@ + (l, f) :: fields + in + let rec add_field fields = function +- Rtag (l, c, stl) -> ++ Rtag (l, c, stl, stpl) -> + name := None; + let f = match present with + Some present when not (List.mem l present) -> +- let tl = List.map (transl_type env policy) stl in +- bound := tl @ !bound; +- Reither(c, tl, false, ref None) ++ let transl_list = List.map (transl_type env policy) in ++ let tl = transl_list stl in ++ let stpl1, stpl2 = List.split stpl in ++ let tpl1 = transl_list stpl1 and tpl2 = transl_list stpl2 in ++ bound := tl @ tpl1 @ tpl2 @ !bound; ++ Reither(c, tl, false, List.combine tpl1 tpl2, ref None) + | _ -> + if List.length stl > 1 || c && stl <> [] then + raise(Error(styp.ptyp_loc, Present_has_conjunction l)); +@@ -311,9 +314,9 @@ + begin match f with + Rpresent(Some ty) -> + bound := ty :: !bound; +- Reither(false, [ty], false, ref None) ++ Reither(false, [ty], false, [], ref None) + | Rpresent None -> +- Reither(true, [], false, ref None) ++ Reither(true, [], false, [], ref None) + | _ -> + assert false + end +@@ -406,7 +409,8 @@ + {row with row_fixed=true; + row_fields = List.map + (fun (s,f as p) -> match Btype.row_field_repr f with +- Reither (c, tl, m, r) -> s, Reither (c, tl, true, r) ++ Reither (c, tl, m, tpl, r) -> ++ s, Reither (c, tl, true, tpl, r) + | _ -> p) + row.row_fields}; + Btype.iter_row make_fixed_univars row +Index: typing/unused_var.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/unused_var.ml,v +retrieving revision 1.5 +diff -u -r1.5 unused_var.ml +--- typing/unused_var.ml 4 Jan 2006 16:55:50 -0000 1.5 ++++ typing/unused_var.ml 2 Feb 2006 06:28:33 -0000 +@@ -122,9 +122,11 @@ + | Pexp_apply (e, lel) -> + expression ppf tbl e; + List.iter (fun (_, e) -> expression ppf tbl e) lel; +- | Pexp_match (e, pel) -> ++ | Pexp_match (e, pel, _) -> + expression ppf tbl e; + match_pel ppf tbl pel; ++ | Pexp_multifun pel -> ++ match_pel ppf tbl pel; + | Pexp_try (e, pel) -> + expression ppf tbl e; + match_pel ppf tbl pel; +Index: bytecomp/matching.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/bytecomp/matching.ml,v +retrieving revision 1.67 +diff -u -r1.67 matching.ml +--- bytecomp/matching.ml 7 Sep 2005 16:07:48 -0000 1.67 ++++ bytecomp/matching.ml 2 Feb 2006 06:28:33 -0000 +@@ -1991,7 +1991,7 @@ + List.iter + (fun (_, f) -> + match Btype.row_field_repr f with +- Rabsent | Reither(true, _::_, _, _) -> () ++ Rabsent | Reither(true, _::_, _, _, _) -> () + | _ -> incr num_constr) + row.row_fields + else +Index: toplevel/genprintval.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/toplevel/genprintval.ml,v +retrieving revision 1.38 +diff -u -r1.38 genprintval.ml +--- toplevel/genprintval.ml 13 Jun 2005 04:55:53 -0000 1.38 ++++ toplevel/genprintval.ml 2 Feb 2006 06:28:33 -0000 +@@ -293,7 +293,7 @@ + | (l, f) :: fields -> + if Btype.hash_variant l = tag then + match Btype.row_field_repr f with +- | Rpresent(Some ty) | Reither(_,[ty],_,_) -> ++ | Rpresent(Some ty) | Reither(_,[ty],_,_,_) -> + let args = + tree_of_val (depth - 1) (O.field obj 1) ty in + Oval_variant (l, Some args) diff --git a/experimental/garrigue/multimatch.ml b/experimental/garrigue/multimatch.ml new file mode 100644 index 00000000..7c9aa73f --- /dev/null +++ b/experimental/garrigue/multimatch.ml @@ -0,0 +1,158 @@ +(* Simple example *) +let f x = + (multimatch x with `A -> 1 | `B -> true), + (multimatch x with `A -> 1. | `B -> "1");; + +(* OK *) +module M : sig + val f : + [< `A & 'a = int & 'b = float | `B & 'b =string & 'a = bool] -> 'a * 'b +end = struct let f = f end;; + +(* Bad *) +module M : sig + val f : + [< `A & 'a = int & 'b = float | `B & 'b =string & 'a = int] -> 'a * 'b +end = struct let f = f end;; + +(* Should be good! *) +module M : sig + val f : + [< `A & 'a = int * float | `B & 'a = bool * string] -> 'a +end = struct let f = f end;; + +let f = multifun `A|`B as x -> f x;; + +(* Two-level example *) +let f = multifun + `A -> (multifun `C -> 1 | `D -> 1.) + | `B -> (multifun `C -> true | `D -> "1");; + +(* OK *) +module M : sig + val f : + [< `A & 'b = [< `C & 'a = int | `D & 'a = float & 'c = bool] -> 'a + | `B & 'b = [< `C & 'c = bool | `D & 'c = string] -> 'c] -> 'b +end = struct let f = f end;; + +(* Bad *) +module M : sig + val f : + [< `A & 'b = [< `C & 'a = int | `D & 'a = bool] -> 'a + | `B & 'b = [< `C & 'c = bool | `D & 'c = string] -> 'c] -> 'b +end = struct let f = f end;; + +module M : sig + val f : + [< `A & 'b = [< `C & 'a = int | `D] -> 'a + | `B & 'b = [< `C & 'c = bool | `D & 'c = string] -> 'c] -> 'b +end = struct let f = f end;; + + +(* Examples with hidden sharing *) +let r = ref [] +let f = multifun `A -> 1 | `B -> true +let g x = r := [f x];; + +(* Bad! *) +module M : sig + val g : [< `A & 'a = int | `B & 'a = bool] -> unit +end = struct let g = g end;; + +let r = ref [] +let f = multifun `A -> r | `B -> ref [];; +(* Now OK *) +module M : sig + val f : [< `A & 'b = int list ref | `B & 'b = 'c list ref] -> 'b +end = struct let f = f end;; +(* Still OK *) +let l : int list ref = r;; +module M : sig + val f : [< `A & 'b = int list ref | `B & 'b = 'c list ref] -> 'b +end = struct let f = f end;; + + +(* Examples that would need unification *) +let f = multifun `A -> (1, []) | `B -> (true, []) +let g x = fst (f x);; +(* Didn't work, now Ok *) +module M : sig + val g : [< `A & 'a * 'b = int * bool | `B & 'a * 'b = bool * int] -> 'a +end = struct let g = g end;; +let g = multifun (`A|`B) as x -> g x;; + +(* Other examples *) + +let f x = + let a = multimatch x with `A -> 1 | `B -> "1" in + (multifun `A -> print_int | `B -> print_string) x a +;; + +let f = multifun (`A|`B) as x -> f x;; + +type unit_op = [`Set of int | `Move of int] +type int_op = [`Get] + +let op r = + multifun + `Get -> !r + | `Set x -> r := x + | `Move dx -> r := !r + dx +;; + +let rec trace r = function + [] -> [] + | op1 :: ops -> + multimatch op1 with + #int_op as op1 -> + let x = op r op1 in + x :: trace r ops + | #unit_op as op1 -> + op r op1; + trace r ops +;; + +class point x = object + val mutable x : int = x + method get = x + method set y = x <- y + method move dx = x <- x + dx +end;; + +let poly sort coeffs x = + let add, mul, zero = + multimatch sort with + `Int -> (+), ( * ), 0 + | `Float -> (+.), ( *. ), 0. + in + let rec compute = function + [] -> zero + | c :: cs -> add c (mul x (compute cs)) + in + compute coeffs +;; + +module M : sig + val poly : [< `Int & 'a = int | `Float & 'a = float] -> 'a list -> 'a -> 'a +end = struct let poly = poly end;; + +type ('a,'b) num_sort = + 'b constraint 'b = [< `Int & 'a = int | `Float & 'a = float] +module M : sig + val poly : ('a,_) num_sort -> 'a list -> 'a -> 'a +end = struct let poly = poly end;; + + +(* type dispatch *) + +type num = [ `Int | `Float ] +let print0 = multifun + `Int -> print_int + | `Float -> print_float +;; +let print1 = multifun + #num as x -> print0 x + | `List t -> List.iter (print0 t) + | `Pair(t1,t2) -> (fun (x,y) -> print0 t1 x; print0 t2 y) +;; +print1 (`Pair(`Int,`Float)) (1,1.0);; diff --git a/experimental/garrigue/newlabels.ps b/experimental/garrigue/newlabels.ps new file mode 100644 index 00000000..01eac194 --- /dev/null +++ b/experimental/garrigue/newlabels.ps @@ -0,0 +1,1458 @@ +%!PS-Adobe-2.0 +%%Creator: dvipsk 5.78 p1.4 Copyright 1996-98 ASCII Corp.(www-ptex@ascii.co.jp) +%%dvipsk 5.78 Copyright 1998 Radical Eye Software (www.radicaleye.com) +%%Title: newlabels.dvi +%%Pages: 2 0 +%%PageOrder: Ascend +%%BoundingBox: 0 0 596 842 +%%EndComments +%%BeginProcSet: PStoPS 1 15 +userdict begin +[/showpage/erasepage/copypage]{dup where{pop dup load + type/operatortype eq{1 array cvx dup 0 3 index cvx put + bind def}{pop}ifelse}{pop}ifelse}forall +[/letter/legal/executivepage/a4/a4small/b5/com10envelope + /monarchenvelope/c5envelope/dlenvelope/lettersmall/note + /folio/quarto/a5]{dup where{dup wcheck{exch{}put} + {pop{}def}ifelse}{pop}ifelse}forall +/setpagedevice {pop}bind 1 index where{dup wcheck{3 1 roll put} + {pop def}ifelse}{def}ifelse +/PStoPSmatrix matrix currentmatrix def +/PStoPSxform matrix def/PStoPSclip{clippath}def +/defaultmatrix{PStoPSmatrix exch PStoPSxform exch concatmatrix}bind def +/initmatrix{matrix defaultmatrix setmatrix}bind def +/initclip[{matrix currentmatrix PStoPSmatrix setmatrix + [{currentpoint}stopped{$error/newerror false put{newpath}} + {/newpath cvx 3 1 roll/moveto cvx 4 array astore cvx}ifelse] + {[/newpath cvx{/moveto cvx}{/lineto cvx} + {/curveto cvx}{/closepath cvx}pathforall]cvx exch pop} + stopped{$error/errorname get/invalidaccess eq{cleartomark + $error/newerror false put cvx exec}{stop}ifelse}if}bind aload pop + /initclip dup load dup type dup/operatortype eq{pop exch pop} + {dup/arraytype eq exch/packedarraytype eq or + {dup xcheck{exch pop aload pop}{pop cvx}ifelse} + {pop cvx}ifelse}ifelse + {newpath PStoPSclip clip newpath exec setmatrix} bind aload pop]cvx def +/initgraphics{initmatrix newpath initclip 1 setlinewidth + 0 setlinecap 0 setlinejoin []0 setdash 0 setgray + 10 setmiterlimit}bind def +end +%%EndProcSet +%DVIPSCommandLine: dvips -f newlabels +%DVIPSParameters: dpi=300 +%DVIPSSource: TeX output 1999.10.26:1616 +%%BeginProcSet: tex.pro +%! +/TeXDict 300 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N +/X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72 +mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1} +ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale +isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div +hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul +TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if} +forall round exch round exch]setmatrix}N /@landscape{/isls true N}B +/@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B +/FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{ +/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N +string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N +end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{ +/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0] +N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup +length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{ +128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub +get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data +dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N +/rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup +/base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx +0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff +setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff +.1 sub]{ch-image}imagemask restore}B /D{/cc X dup type /stringtype ne{]} +if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup +length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{ +cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin +0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul +add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore userdict +/eop-hook known{eop-hook}if showpage}N /@start{userdict /start-hook +known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X +/IE 256 array N 2 string 0 1 255{IE S dup 360 add 36 4 index cvrs cvn +put}for pop 65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N +/RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley +X /rulex X V}B /V{}B /RV statusdict begin /product where{pop false[ +(Display)(NeXT)(LaserWriter 16/600)]{dup length product length le{dup +length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse} +forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false +RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1 +false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform +round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg +rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail +{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M} +B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{ +4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{ +p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p +a}B /bos{/SS save N}B /eos{SS restore}B end + +%%EndProcSet +TeXDict begin 39158280 55380996 1000 300 300 (newlabels.dvi) +@start +%DVIPSBitmapFont: Fa cmr6 6 2 +/Fa 2 51 df<187898181818181818181818181818FF08107D8F0F> 49 +D<1F00618040C08060C0600060006000C00180030006000C00102020207FC0FFC00B107F +8F0F> I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fb cmmi8 8 4 +/Fb 4 111 df<FFC0FF1C00181C00101C00101C00103800203800203800203800207000 +40700040700040700040E00080E00080E00080E00080E00100E00200E004006008003830 +000FC00018177E9618> 85 D<0300038003000000000000000000000000001C00240046 +0046008C000C0018001800180031003100320032001C0009177F960C> 105 +D<383C1E0044C6630047028100460301008E0703000C0603000C0603000C060300180C06 +00180C0620180C0C20180C0C40301804C0301807001B0E7F8D1F> 109 +D<383C0044C6004702004602008E06000C06000C06000C0600180C00180C401818401818 +80300980300E00120E7F8D15> I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fc cmbx8 8 4 +/Fc 4 111 df<01800780FF80FF80078007800780078007800780078007800780078007 +800780078007800780FFF8FFF80D157D9414> 49 D<387C7C7C3800000000FCFC3C3C3C +3C3C3C3C3C3C3C3CFFFF08187F970B> 105 D<FC7E0FC0FD8730E03E07C0F03E07C0F03C +0780F03C0780F03C0780F03C0780F03C0780F03C0780F03C0780F03C0780F03C0780F0FF +1FE3FCFF1FE3FC1E0F7E8E23> 109 D<FC7C00FD8E003E0F003E0F003C0F003C0F003C0F +003C0F003C0F003C0F003C0F003C0F003C0F00FF3FC0FF3FC0120F7E8E17> I +E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fd cmsy8 8 3 +/Fd 3 93 df<FFFFF0FFFFF014027D881B> 0 D<020002000200C218F2783AE00F800F80 +3AE0F278C2180200020002000D0E7E8E12> 3 D<03F8001FFF003C07806000C0C00060C0 +0060C00060C00060C00060C00060C00060C00060C00060C00060C00060C00060C00060C0 +006040002013137E9218> 92 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fe cmtt12 12 43 +/Fe 43 125 df<01818003C3C003C3C003C3C003C3C003C3C003C3C07FFFF0FFFFF8FFFF +F87FFFF00787800787800787800F8F800F0F000F0F000F0F000F0F007FFFF0FFFFF8FFFF +F87FFFF01E1E001E1E001E1E001E1E001E1E001E1E000C0C00151E7E9D1A> 35 +D<00E00003F00007F8000738000E1C000E1C000E1C000E1C000E38000E39FC0E71FC07F1 +FC07E1C007C1C00781C00783800F83801FC3803DC70078E70070EE00E07E00E07E00E03C +08E03C1CE07E1C70FF1C7FE7F83FC3F80F00E0161E7F9D1A> 38 +D<0038007800F001E003C007800F000E001C001C0038003800700070007000E000E000E0 +00E000E000E000E000E000E000E000700070007000380038001C001C000E000F00078003 +C001E000F8007800380D2878A21A> 40 D<6000F00078003C001E000F000780038001C0 +01C000E000E0007000700070003800380038003800380038003800380038003800700070 +007000E000E001C001C0038007800F001E003C007800F00060000D287CA21A> I<7FFFC0 +FFFFE0FFFFE07FFFC013047D901A> 45 D<00C001C001C003C007C00FC07FC0FDC071C0 +01C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C0 +7FFF7FFF7FFF101E7B9D1A> 49 D<03F8000FFE001FFF803C07C07801E07000E0E00070 +F00070F000706000700000700000700000E00000E00001C00003C0000780000F00001E00 +003C0000780000F00003E00007C0000F00001E00703C00707FFFF0FFFFF07FFFF0141E7D +9D1A> I<03FC000FFF003FFFC03C03E07800E07800707800700000700000700000E00001 +E00007C003FF8003FF0003FFC00003E00000E0000070000078000038000038600038F000 +38F00078E000707000E07E03E03FFFC00FFF0001FC00151E7E9D1A> I<01FC0007FF001F +FFC01F07C03C01E07800F07000707000707000707800F03800E01E03C00FFF8003FE0007 +FF001F8FC03C01E07800F0700070E00038E00038E00038E00038F000787000707800F03E +03E01FFFC007FF0001FC00151E7E9D1A> 56 D<01F00007FC001FFE003E0F0038078070 +03807001C0E001C0E001C0E001E0E000E0E000E0E001E07001E07803E03C0FE01FFFE00F +FCE003F0E00001C00001C00001C0000380600380F00700F00F00F03E007FFC003FF0000F +C000131E7D9D1A> I<3078FCFC78300000000000000000003078FCFC7830061576941A> +I<183C7E7E3C18000000000000000000183C7E7E3E1E0E0E1C3CF8F060071C77941A> I< +0000C00003E00007E0000FC0003F80007E0000FC0003F80007E0000FC0003F80007E0000 +FC0000FC00007E00003F80000FC00007E00003F80000FC00007E00003F80000FC00007E0 +0003E00000C0131A7D9B1A> I<7FFFF0FFFFF8FFFFF87FFFF00000000000000000000000 +007FFFF0FFFFF8FFFFF87FFFF0150C7E941A> I<600000F80000FC00007E00003F80000F +C00007E00003F80000FC00007E00003F80000FC00007E00007E0000FC0003F80007E0000 +FC0003F80007E0000FC0003F80007E0000FC0000F80000600000131A7D9B1A> I<007C38 +01FF3807FFF80F83F81E00F81C0078380078380038700038700038700000E00000E00000 +E00000E00000E00000E00000E00000E000007000007000387000383800383800381C0070 +1E00F00F83E007FFC001FF80007C00151E7E9D1A> 67 D<FE03FEFF03FEFF03FE1D8070 +1D80701DC0701CC0701CC0701CE0701CE0701C60701C70701C70701C30701C38701C3870 +1C18701C1C701C1C701C0C701C0E701C0E701C06701C06701C07701C03701C0370FF81F0 +FF81F0FF80F0171E7F9D1A> 78 D<03F8E00FFEE01FFFE03C07E07801E0F001E0E000E0 +E000E0E000E0E000007000007800003F80001FF80007FF00007FC00007E00000F0000070 +000038000038600038E00038E00038E00070F000F0FE01E0FFFFC0EFFF80E1FE00151E7E +9D1A> 83 D<7FFFFEFFFFFEFFFFFEE0380EE0380EE0380EE0380E003800003800003800 +003800003800003800003800003800003800003800003800003800003800003800003800 +00380000380000380000380000380003FF8003FF8003FF80171E7F9D1A> I<FFFCFFFCFF +FCE000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E0 +00E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000FFFCFFFCFF +FC0E2776A21A> 91 D<FFFCFFFCFFFC001C001C001C001C001C001C001C001C001C001C +001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C +001C001C001C001C001CFFFCFFFCFFFC0E277FA21A> 93 D<1FF0003FFC007FFE00780F +00300700000380000380007F8007FF801FFF803F8380780380700380E00380E00380E003 +80700780780F803FFFFC1FFDFC07F0FC16157D941A> 97 D<7E0000FE00007E00000E00 +000E00000E00000E00000E00000E00000E3E000EFF800FFFE00FC1F00F80700F00380E00 +380E001C0E001C0E001C0E001C0E001C0E001C0E001C0F00380F00780F80F00FC1E00FFF +C00EFF80063E00161E7F9D1A> I<00FF8003FFC00FFFE01F01E03C00C078000070000070 +0000E00000E00000E00000E00000E000007000007000007800703C00701F01F00FFFE003 +FFC000FE0014157D941A> I<000FC0001FC0000FC00001C00001C00001C00001C00001C0 +0001C001F1C007FDC00FFFC01E0FC03C07C07803C07001C0E001C0E001C0E001C0E001C0 +E001C0E001C0E001C07003C07003C03807C03E0FC01FFFF807FDFC01F1F8161E7E9D1A> +I<01F80007FF000FFF801E07C03C01C07800E07000E0E00070E00070FFFFF0FFFFF0FFFF +F0E000007000007000007800703C00701F01F00FFFE003FF8000FE0014157D941A> I<00 +07E0001FF0003FF800787800F03000E00000E00000E00000E0007FFFF0FFFFF0FFFFF000 +E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000 +E00000E00000E0003FFF807FFFC03FFF80151E7F9D1A> I<7E0000FE00007E00000E0000 +0E00000E00000E00000E00000E00000E3E000EFF800FFFC00FC1C00F80E00F00E00E00E0 +0E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E07FC3FC +FFE7FE7FC3FC171E7F9D1A> 104 D<00C00001E00001E00000C000000000000000000000 +0000000000000000007FE0007FE0007FE00000E00000E00000E00000E00000E00000E000 +00E00000E00000E00000E00000E00000E00000E00000E00000E0007FFF80FFFFC07FFF80 +121F7C9E1A> I<7FE000FFE0007FE00000E00000E00000E00000E00000E00000E00000E0 +0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0 +0000E00000E00000E00000E00000E0007FFFC0FFFFE07FFFC0131E7D9D1A> 108 +D<7CE0E000FFFBF8007FFFF8001F1F1C001E1E1C001E1E1C001C1C1C001C1C1C001C1C1C +001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C +007F1F1F00FFBFBF807F1F1F00191580941A> I<7E3E00FEFF807FFFC00FC1C00F80E00F +00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E +00E07FC3FCFFE7FE7FC3FC17157F941A> I<01F00007FC001FFF003E0F803C07807803C0 +7001C0E000E0E000E0E000E0E000E0E000E0E000E0F001E07001C07803C03C07803E0F80 +1FFF0007FC0001F00013157D941A> I<7E3E00FEFF807FFFE00FC1F00F80700F00380E00 +380E001C0E001C0E001C0E001C0E001C0E001C0E001C0F00380F00780F80F00FC1E00FFF +C00EFF800E3E000E00000E00000E00000E00000E00000E00000E00000E00007FC000FFE0 +007FC00016207F941A> I<7F81F8FF8FFC7F9FFE03FE1E03F80C03E00003E00003C00003 +80000380000380000380000380000380000380000380000380000380007FFF00FFFF007F +FF0017157F941A> 114 D<07FB801FFF807FFF80780780E00380E00380E003807800007F +C0001FFC0007FE00003F800007806001C0E001C0E001C0F003C0FC0780FFFF00EFFE00E3 +F80012157C941A> I<0180000380000380000380000380000380000380007FFFE0FFFFE0 +FFFFE0038000038000038000038000038000038000038000038000038000038000038070 +03807003807003807001C1E001FFE000FF80003F00141C7F9B1A> I<7E07E0FE0FE07E07 +E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00 +E00E00E00E01E00F03E007FFFC03FFFE00FCFC17157F941A> I<7F83FCFFC7FE7F83FC0E +00E00E00E00E00E00701C00701C00701C003838003838003838001C70001C70001C70000 +EE0000EE0000EE00007C00007C0000380017157F941A> I<FF83FEFF83FEFF83FE380038 +3800381C00701C00701C00701C38701C7C701C7C700C6C600EEEE00EEEE00EEEE00EEEE0 +0EC6E006C6C007C7C00783C00783C017157F941A> I<7FC7F87FCFFC7FC7F80703C00383 +8003C70001EF0000FE00007C00007800003800007C0000EE0001EE0001C7000383800783 +C00F01C07FC7FCFFC7FE7FC7FC17157F941A> I<7F83FCFFC7FE7F83FC0E00E00E00E007 +00E00701C00701C00381C003838003C38001C38001C70000E70000E70000E60000660000 +6E00003C00003C00003C0000380000380000380000700000700030F00078E00071E0007F +C0003F80001E000017207F941A> I<60F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 +F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F060042775A21A> 124 D +E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Ff cmr8 8 3 +/Ff 3 51 df<003000003000003000003000003000003000003000003000003000003000 +003000FFFFFCFFFFFC003000003000003000003000003000003000003000003000003000 +00300000300016187E931B> 43 D<06000E00FE000E000E000E000E000E000E000E000E +000E000E000E000E000E000E000E000E000E00FFE00B157D9412> 49 +D<0F8030E040708030C038E0384038003800700070006000C00180030006000C08080810 +183FF07FF0FFF00D157E9412> I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fg cmmi12 12 13 +/Fg 13 121 df<0FFFF81FFFFC3FFFF870200040200080200080600000600000600000C0 +0000C00000C00000C00001C0000180000180000380000380000380000700000300001615 +7E9415> 28 D<0000100000002000000020000000200000002000000040000000400000 +004000000040000000800000008000000080000000800000010000000FE00000711C0001 +C10600030203000E0203801C020180180201C0380401C0700401C0700401C0700401C0E0 +080380E0080380E00807006008070070100E0030101C00301038001C10E0000623800001 +FE0000002000000020000000400000004000000040000000400000008000000080000000 +800000008000001A2D7EA21D> 30 D<70F8F8F87005057C840E> 58 +D<70F8FCFC7404040404080810102040060F7C840E> I<00008000018000018000030000 +0300000300000600000600000600000C00000C00000C0000180000180000180000300000 +300000300000600000600000600000C00000C00000C00001800001800001800001800003 +00000300000300000600000600000600000C00000C00000C000018000018000018000030 +0000300000300000600000600000600000C00000C00000C0000011317DA418> 61 +D<00FFFC00000F8000000F0000000F0000001E0000001E0000001E0000001E0000003C00 +00003C0000003C0000003C00000078000000780000007800000078000000F0000000F000 +0000F0000000F0000001E0000001E0000001E0002001E0002003C0004003C0004003C000 +8003C0008007800180078001000780030007800F000F803E00FFFFFE001B227DA121> 76 +D<1FFFFFFE1E01E00E1801E0063001E0062003C0062003C0064003C0044003C004400780 +04800780048007800400078000000F0000000F0000000F0000000F0000001E0000001E00 +00001E0000001E0000003C0000003C0000003C0000003C00000078000000780000007800 +000078000000F0000000F0000000F0000000F0000001F000007FFFC0001F227EA11D> 84 +D<3FFE01FF8003C0003C0003C000300003C0001000078000200007800020000780002000 +07800020000F000040000F000040000F000040000F000040001E000080001E000080001E +000080001E000080003C000100003C000100003C000100003C0001000078000200007800 +020000780002000078000200007000040000F000040000F0000800007000080000700010 +00007000200000380040000038008000001C01000000060600000001F800000021237DA1 +21> I<007E000381000700800E00801C0080380080780100700600FFF800F00000F00000 +E00000E00000E00000E00000E00080E000807003003004001838000FC00011157D9417> +101 D<01E00FC001C001C001C0038003800380038007000700070007000E000E000E000E +001C001C001C001C0038003800380038007000700070007080E100E100E100620062003C +000B237EA20F> 108 D<03C0F004631C04740E08780E08700708700708700F00E00F00E0 +0F00E00F00E00F01C01E01C01E01C01E01C03C03803803803803C07003C0E0072180071E +000700000700000E00000E00000E00000E00001C00001C00001C0000FF8000181F819418 +> 112 D<3C0F004630C04741C08783C08783C08701808700000E00000E00000E00000E00 +001C00001C00001C00001C000038000038000038000038000070000030000012157E9416 +> 114 D<01E0F006310C081A1C101A3C201C3C201C18201C000038000038000038000038 +0000700000700000700000700860E010F0E010F0E020E170404230803C1F0016157E941C +> 120 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fh cmti12 12 22 +/Fh 22 122 df<FFF0FFF0FFE00C037C8B11> 45 D<70F8F8F0E005057A840F> I<00F8 +C00185C00705C00E03800E03801C03803C0380380700780700780700780700F00E00F00E +00F00E00F00E10F01C20701C20703C20305C40308C400F078014157B9419> 97 +D<03C01F8003800380038007000700070007000E000E000E000E001C001CF81D0C1E0E3C +0638073807380F700F700F700F700FE01EE01EE01EE03CE038E038607060E031C01F0010 +237BA216> I<007E0001C1000301800703800E07801C07803C0000380000780000780000 +780000F00000F00000F00000F00000F00100700100700200300C001830000FC00011157B +9416> I<00003C0003F80000380000380000380000700000700000700000700000E00000 +E00000E00000E00001C000F9C00185C00705C00E03800E03801C03803C03803807007807 +00780700780700F00E00F00E00F00E00F00E10F01C20701C20703C20305C40308C400F07 +8016237BA219> I<00F803840E021C023C0238027804F018FFE0F000F000E000E000E000 +E000E002E0026004701830600F800F157A9416> I<00003E0000470000CF00018F000186 +000380000380000380000700000700000700000700000700000E0000FFF0000E00000E00 +000E00001C00001C00001C00001C00001C00003800003800003800003800003800007000 +00700000700000700000700000E00000E00000E00000E00000C00001C00001C000718000 +F18000F300006200003C0000182D82A20F> I<001F180030B800E0B801C07001C0700380 +700780700700E00F00E00F00E00F00E01E01C01E01C01E01C01E01C01E03800E03800E07 +80060B8006170001E700000700000700000E00000E00000E00701C00F01800F0300060E0 +003F8000151F7E9416> I<00C001E001C001C0000000000000000000000000000000001E +002300430043008700870087000E000E001C001C001C0038003800384070807080708071 +0032001C000B217BA00F> 105 D<00F00007E00000E00000E00000E00001C00001C00001 +C00001C0000380000380000380000380000700000701E00702100704700E08F00E10F00E +20600E40001D80001E00001FC0001C7000383800383800381C00381C2070384070384070 +3840701880E01880600F0014237DA216> 107 D<01E00FC001C001C001C0038003800380 +038007000700070007000E000E000E000E001C001C001C001C0038003800380038007000 +700070007100E200E200E200E200640038000B237CA20C> I<1C0F80F8002610C10C0047 +6066060087807807008780780700870070070087007007000E00E00E000E00E00E000E00 +E00E000E00E00E001C01C01C001C01C01C001C01C01C001C01C038203803803840380380 +70403803807080380380308070070031003003001E0023157B9428> I<380F804C30C04E +40608E80708F00708E00708E00701C00E01C00E01C00E01C00E03801C03801C03801C038 +0384700388700308700708700310E003106001E016157B941B> I<007E0001C300038180 +0701C00E01C01C01E03C01E03801E07801E07801E07801E0F003C0F003C0F00380F00780 +700700700E00700C0030180018700007C00013157B9419> I<01C1F002621804741C0878 +0C08700E08700E08701E00E01E00E01E00E01E00E01E01C03C01C03C01C03C01C0780380 +7003807003C0E003C1C0072380071E000700000700000E00000E00000E00000E00001C00 +001C00001C0000FFC000171F7F9419> I<1C1F002620804741C08783C08703C087018087 +00000E00000E00000E00000E00001C00001C00001C00001C000038000038000038000038 +000070000030000012157B9415> 114 D<00FC000183000200800401800C03800C03000C +00000F00000FF00007FC0003FE00003E00000F00000700700700F00600F00600E0040040 +08002030001FC00011157D9414> I<00C001C001C001C001C003800380038003800700FF +F8070007000E000E000E000E001C001C001C001C00380038003800381070207020704070 +8031001E000D1F7C9E10> I<1E0060E02300E0F04380E1F04381C0F08381C0708701C030 +8701C030070380200E0380200E0380200E0380201C0700401C0700401C0700401C070080 +1C0700801C0701001C0F01000C0B02000613840003E0F8001C157B9420> 119 +D<03C1E0046210083470103CF02038F020386020380000700000700000700000700000E0 +0000E00000E00000E02061C040F1C040F1C080E2C100446200383C0014157D9416> I<1E +00302300704380704380E08380E08700E08700E00701C00E01C00E01C00E01C01C03801C +03801C03801C03801C07001C07001C07001C0F000C3E0003CE00000E00000E00001C0060 +1C00F03800F03000E0600080C0004380003E0000141F7B9418> I +E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fi cmbx12 12 20 +/Fi 20 122 df<FFFFFF8000FFFFFFF00007F003FC0007F0007E0007F0003F0007F0001F +8007F0000FC007F00007E007F00007E007F00007F007F00003F007F00003F007F00003F0 +07F00003F807F00003F807F00003F807F00003F807F00003F807F00003F807F00003F807 +F00003F807F00003F807F00003F007F00003F007F00003F007F00007E007F00007E007F0 +000FC007F0001F8007F0003F0007F0007E0007F003FC00FFFFFFF000FFFFFF800025227E +A12B> 68 D<01FE0207FF861F01FE3C007E7C001E78000E78000EF80006F80006FC0006 +FC0000FF0000FFE0007FFF007FFFC03FFFF01FFFF80FFFFC03FFFE003FFE0003FE00007F +00003F00003FC0001FC0001FC0001FE0001EE0001EF0003CFC003CFF00F8C7FFE080FF80 +18227DA11F> 83 D<7FFFFFFF807FFFFFFF807E03F80F807803F807807003F803806003 +F80180E003F801C0E003F801C0C003F800C0C003F800C0C003F800C0C003F800C00003F8 +00000003F800000003F800000003F800000003F800000003F800000003F800000003F800 +000003F800000003F800000003F800000003F800000003F800000003F800000003F80000 +0003F800000003F800000003F800000003F800000003F8000001FFFFF00001FFFFF00022 +227EA127> I<0FFC003FFF807E07C07E03E07E01E07E01F03C01F00001F00001F0003FF0 +03FDF01FC1F03F01F07E01F0FC01F0FC01F0FC01F0FC01F07E02F07E0CF81FF87F07E03F +18167E951B> 97 D<FF000000FF0000001F0000001F0000001F0000001F0000001F0000 +001F0000001F0000001F0000001F0000001F0000001F0000001F0FE0001F3FF8001FE07C +001F803E001F001F001F000F801F000F801F000FC01F000FC01F000FC01F000FC01F000F +C01F000FC01F000FC01F000FC01F000F801F001F801F801F001FC03E001EE07C001C3FF8 +00180FC0001A237EA21F> I<00FF8007FFE00F83F01F03F03E03F07E03F07C01E07C0000 +FC0000FC0000FC0000FC0000FC0000FC00007C00007E00007E00003E00181F00300FC060 +07FFC000FF0015167E9519> I<00FE0007FF800F87C01E01E03E01F07C00F07C00F8FC00 +F8FC00F8FFFFF8FFFFF8FC0000FC0000FC00007C00007C00007E00003E00181F00300FC0 +7003FFC000FF0015167E951A> 101 D<001FC0007FE000F1F001E3F003E3F007C3F007C1 +E007C00007C00007C00007C00007C00007C000FFFE00FFFE0007C00007C00007C00007C0 +0007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C0 +0007C00007C0003FFC003FFC00142380A211> I<01FE0F0007FFBF800F87C7801F03E780 +1E01E0003E01F0003E01F0003E01F0003E01F0003E01F0001E01E0001F03E0000F87C000 +0FFF800009FE000018000000180000001C0000001FFFE0000FFFF80007FFFE001FFFFF00 +3C003F0078000F80F0000780F0000780F0000780F000078078000F003C001E001F007C00 +0FFFF80001FFC00019217F951C> I<1C003E007F007F007F003E001C0000000000000000 +00000000000000FF00FF001F001F001F001F001F001F001F001F001F001F001F001F001F +001F001F001F001F001F00FFE0FFE00B247EA310> 105 D<FF00FF001F001F001F001F00 +1F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00 +1F001F001F001F001F001F001F001F001F00FFE0FFE00B237EA210> 108 +D<FF07F007F000FF1FFC1FFC001F303E303E001F403E403E001F801F801F001F801F801F +001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F +001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F +001F001F001F001F001F001F00FFE0FFE0FFE0FFE0FFE0FFE02B167E9530> I<FF07E000 +FF1FF8001F307C001F403C001F803E001F803E001F003E001F003E001F003E001F003E00 +1F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E00 +1F003E00FFE1FFC0FFE1FFC01A167E951F> I<00FE0007FFC00F83E01E00F03E00F87C00 +7C7C007C7C007CFC007EFC007EFC007EFC007EFC007EFC007EFC007E7C007C7C007C3E00 +F81F01F00F83E007FFC000FE0017167E951C> I<FF0FE000FF3FF8001FE07C001F803E00 +1F001F001F001F801F001F801F000FC01F000FC01F000FC01F000FC01F000FC01F000FC0 +1F000FC01F000FC01F001F801F001F801F803F001FC03E001FE0FC001F3FF8001F0FC000 +1F0000001F0000001F0000001F0000001F0000001F0000001F0000001F000000FFE00000 +FFE000001A207E951F> I<0FF3003FFF00781F00600700E00300E00300F00300FC00007F +E0007FF8003FFE000FFF0001FF00000F80C00780C00380E00380E00380F00700FC0E00EF +FC00C7F00011167E9516> 115 D<01800001800001800001800003800003800007800007 +80000F80003F8000FFFF00FFFF000F80000F80000F80000F80000F80000F80000F80000F +80000F80000F80000F80000F81800F81800F81800F81800F81800F830007C30003FE0000 +F80011207F9F16> I<FF01FE00FF01FE001F003E001F003E001F003E001F003E001F003E +001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E +001F003E001F007E001F00FE000F81BE0007FF3FC001FC3FC01A167E951F> I<FFE07FC0 +FFE07FC00F801C0007C0380003E0700003F0600001F8C00000F98000007F8000003F0000 +001F0000001F8000003FC0000037C0000063E00000C1F00001C0F8000380FC0007007E00 +0E003E00FF80FFE0FF80FFE01B167F951E> 120 D<FFE01FE0FFE01FE01F8007000F8006 +000FC00E0007C00C0007E00C0003E0180003E0180001F0300001F0300000F8600000F860 +00007CC000007CC000007FC000003F8000003F8000001F0000001F0000000E0000000E00 +00000C0000000C00000018000078180000FC380000FC300000FC60000069C000007F8000 +001F0000001B207F951E> I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fj cmsy10 12 15 +/Fj 15 107 df<FFFFFFFCFFFFFFFC1E027C8C27> 0 D<03F0000FFC001FFE003FFF007F +FF807FFF80FFFFC0FFFFC0FFFFC0FFFFC0FFFFC0FFFFC0FFFFC0FFFFC07FFF807FFF803F +FF001FFE000FFC0003F00012147D9519> 15 D<000FFFFC007FFFFC01F0000003800000 +060000000C0000001800000030000000300000006000000060000000C0000000C0000000 +C0000000C0000000C0000000C0000000C0000000C0000000600000006000000030000000 +30000000180000000C000000060000000380000001E00000007FFFFC001FFFFC1E1E7C9A +27> 26 D<00000001800000000001800000000001800000000001800000000000C00000 +000000C000000000006000000000003000000000003000000000001C00000000000E0000 +0000000700FFFFFFFFFFE0FFFFFFFFFFE0000000000700000000000E00000000001C0000 +000000300000000000300000000000600000000000C00000000000C00000000001800000 +00000180000000000180000000000180002B1A7D9832> 33 D<001FFF007FFF01E00003 +80000600000C0000180000300000300000600000600000600000C00000C00000FFFFFFFF +FFFFC00000C000006000006000006000003000003000001800000C000006000003800001 +E000007FFF001FFF181E7C9A21> 50 D<00000300000300000600000600000C00000C00 +00180000180000300000300000600000600000C00000C00000C000018000018000030000 +0300000600000600000C00000C0000180000180000300000300000600000600000C00000 +C0000180000180000300000300000300000600000600000C00000C000018000018000030 +0000300000600000600000C00000400000183079A300> 54 D<C0C0C0C0C0C0C0C0E0E0 +C0C0C0C0C0C0C0C003127D9400> I<00008000018001F980070F000C0300180380180780 +3006C03006C0700CE0600C60600C60600C60E01870E01870E01870E03070E03070E03070 +E06070E06070E06070E06070E0C070E0C070E0C070E18070E180706180606300607300E0 +7300E03300C03600C01E01801E01800C03000F0E000DF800180000180000180000142A7E +A519> 59 D<000100000003000000030000000300000003000000030000000300000003 +000000030000000300000003000000030000000300000003000000030000000300000003 +000000030000000300000003000000030000000300000003000000030000000300000003 +000000030000000300000003000000030000FFFFFFFEFFFFFFFE1F207C9F27> 63 +D<40000040C00000C0C00000C0C00000C0C00000C0C00000C0C00000C0C00000C0C00000 +C0C00000C0C00000C0C00000C0C00000C0C00000C0C00000C0C00000C0C00000C0C00000 +C0C00000C0C00000C0C00000C0C00000C0C00000C0600001806000018030000300180006 +000E001C000780780001FFE000007F80001A1F7D9D21> 91 D<007F800001FFE0000780 +78000E001C0018000600300003006000018060000180C00000C0C00000C0C00000C0C000 +00C0C00000C0C00000C0C00000C0C00000C0C00000C0C00000C0C00000C0C00000C0C000 +00C0C00000C0C00000C0C00000C0C00000C0C00000C0C00000C0C00000C0C00000C0C000 +00C0400000401A1F7D9D21> I<000C0000000C0000001E0000001E0000001E0000003300 +0000330000006180000061800000C0C00000C0C00000C0C0000180600001806000030030 +00030030000300300006001800060018000C000C000C000C000C000C0018000600180006 +003000030030000300600001806000018060000180C00000C0C00000401A1F7D9D21> 94 +D<0003C0001E0000380000700000E00000E00000E00000E00000E00000E00000E00000E0 +0000E00000E00000E00000E00000E00000E00000E00000E00000E00001C0000380000F00 +00F800000F000003800001C00000E00000E00000E00000E00000E00000E00000E00000E0 +0000E00000E00000E00000E00000E00000E00000E00000E00000E000007000003800001E +000003C012317DA419> 102 D<F800000F000003800001C00000E00000E00000E00000E0 +0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0 +0000E000007000003800001E000003C0001E0000380000700000E00000E00000E00000E0 +0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0 +0000E00001C0000380000F0000F8000012317DA419> I<C0C0C0C0C0C0C0C0C0C0C0C0C0 +C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 +02317AA40E> 106 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fk cmr12 12 65 +/Fk 65 125 df<001FC1F00070371800C03E3C01807C3C0380783C070038000700380007 +003800070038000700380007003800070038000700380007003800FFFFFFC00700380007 +003800070038000700380007003800070038000700380007003800070038000700380007 +0038000700380007003800070038000700380007003800070038000700380007003C007F +E1FFC01E2380A21C> 11 D<001FC0000070200000C01000018038000380780007007800 +0700300007000000070000000700000007000000070000000700000007000000FFFFF800 +070078000700380007003800070038000700380007003800070038000700380007003800 +070038000700380007003800070038000700380007003800070038000700380007003800 +070038007FE1FF80192380A21B> I<001FD8000070380000C07800018078000380780007 +0038000700380007003800070038000700380007003800070038000700380007003800FF +FFF800070038000700380007003800070038000700380007003800070038000700380007 +003800070038000700380007003800070038000700380007003800070038000700380007 +003800070038007FF3FF80192380A21B> I<000FC07F00007031C08000E00B004001801E +00E003803E01E007003C01E007001C00C007001C000007001C000007001C000007001C00 +0007001C000007001C000007001C0000FFFFFFFFE007001C01E007001C00E007001C00E0 +07001C00E007001C00E007001C00E007001C00E007001C00E007001C00E007001C00E007 +001C00E007001C00E007001C00E007001C00E007001C00E007001C00E007001C00E00700 +1C00E007001C00E07FF1FFCFFE272380A229> I<70F8FCFC740404040408081010204006 +0F7CA20E> 39 D<00200040008001000300060004000C000C0018001800300030003000 +7000600060006000E000E000E000E000E000E000E000E000E000E000E000E000E000E000 +6000600060007000300030003000180018000C000C000400060003000100008000400020 +0B327CA413> I<800040002000100018000C000400060006000300030001800180018001 +C000C000C000C000E000E000E000E000E000E000E000E000E000E000E000E000E000E000 +C000C000C001C0018001800180030003000600060004000C00180010002000400080000B +327DA413> I<70F8FCFC7404040404080810102040060F7C840E> 44 +D<FFF8FFF80D02808B10> I<70F8F8F87005057C840E> I<01F000071C000C0600180300 +3803803803807001C07001C07001C07001C0F001E0F001E0F001E0F001E0F001E0F001E0 +F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E07001C07001C07001C07803C0 +3803803803801C07000C0600071C0001F00013227EA018> 48 D<008003800F80F38003 +800380038003800380038003800380038003800380038003800380038003800380038003 +800380038003800380038003800380038007C0FFFE0F217CA018> I<03F0000C1C001007 +002007804003C04003C08003E0F003E0F801E0F801E0F801E02003E00003E00003C00003 +C0000780000700000E00001C0000180000300000600000C0000180000100000200200400 +200800201800603000403FFFC07FFFC0FFFFC013217EA018> I<03F8000C1E00100F0020 +07804007C07807C07803C07807C03807C0000780000780000700000F00000C0000380003 +F000001C00000F000007800007800003C00003C00003E02003E07003E0F803E0F803E0F0 +03C04003C0400780200780100F000C1C0003F00013227EA018> I<000300000300000700 +000700000F00001700001700002700006700004700008700018700010700020700060700 +040700080700080700100700200700200700400700C00700FFFFF8000700000700000700 +000700000700000700000700000F80007FF015217FA018> I<70F8F8F870000000000000 +000000000070F8F8F87005157C940E> 58 D<FFFFFFFEFFFFFFFE000000000000000000 +0000000000000000000000000000000000000000000000FFFFFFFEFFFFFFFE1F0C7D9126 +> 61 D<07E01838201C400E800FF00FF00FF00F000F000E001C00380030006000C000C0 +00800080018001000100010001000100010000000000000000000000038007C007C007C0 +038010237DA217> 63 D<0001800000018000000180000003C0000003C0000003C00000 +05E0000005E0000009F0000008F0000008F00000107800001078000010780000203C0000 +203C0000203C0000401E0000401E0000C01F0000800F0000800F0001FFFF800100078001 +000780020003C0020003C0020003C0040001E0040001E0040001E0080000F01C0000F03E +0001F8FF800FFF20237EA225> 65 D<FFFFF8000F800E0007800780078003C0078003E0 +078001E0078001F0078001F0078001F0078001F0078001F0078001E0078003E0078007C0 +07800F8007803E0007FFFE0007800780078003C0078001E0078001F0078000F0078000F8 +078000F8078000F8078000F8078000F8078000F8078001F0078001F0078003E0078007C0 +0F800F00FFFFFC001D227EA123> I<0007E0100038183000E0063001C00170038000F007 +0000F00E0000701E0000701C0000303C0000303C0000307C0000107800001078000010F8 +000000F8000000F8000000F8000000F8000000F8000000F8000000F80000007800000078 +0000107C0000103C0000103C0000101C0000201E0000200E000040070000400380008001 +C0010000E0020000381C000007E0001C247DA223> I<FFFFF0000F801E00078007000780 +0380078001C0078000E0078000F007800078078000780780007C0780003C0780003C0780 +003C0780003E0780003E0780003E0780003E0780003E0780003E0780003E0780003E0780 +003E0780003C0780003C0780007C0780007807800078078000F0078000E0078001E00780 +03C0078007000F801E00FFFFF0001F227EA125> I<FFFFFFC00F8007C0078001C0078000 +C00780004007800040078000600780002007800020078000200780202007802000078020 +0007802000078060000780E00007FFE0000780E000078060000780200007802000078020 +000780200007800000078000000780000007800000078000000780000007800000078000 +00078000000FC00000FFFE00001B227EA120> 70 D<0007F008003C0C1800E0021801C0 +01B8038000F8070000780F0000381E0000381E0000183C0000183C0000187C0000087800 +000878000008F8000000F8000000F8000000F8000000F8000000F8000000F8000000F800 +1FFF780000F8780000787C0000783C0000783C0000781E0000781E0000780F0000780700 +0078038000B801C000B800E00318003C0C080007F00020247DA226> I<FFFC3FFF0FC003 +F0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001 +E0078001E0078001E0078001E0078001E0078001E007FFFFE0078001E0078001E0078001 +E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001 +E0078001E0078001E0078001E00FC003F0FFFC3FFF20227EA125> I<FFFC0FC007800780 +078007800780078007800780078007800780078007800780078007800780078007800780 +07800780078007800780078007800780078007800FC0FFFC0E227EA112> I<FFFC00FF80 +0FC0007C0007800030000780002000078000400007800080000780010000078002000007 +80040000078008000007801000000780200000078040000007808000000781C000000783 +E000000785E000000788F000000790F0000007A078000007C03C000007803C000007801E +000007800F000007800F00000780078000078007C000078003C000078001E000078001E0 +00078000F000078000F8000FC000FC00FFFC07FF8021227EA126> 75 +D<FFFC001F80000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00 +000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00010F00 +010F00010F00010F00030F00030F00020F00060F00060F001E1F007EFFFFFE18227DA11E +> I<FF8007FF07C000F807C0007005E0002004F0002004F0002004780020047C0020043C +0020041E0020041F0020040F002004078020040780200403C0200401E0200401E0200400 +F0200400F8200400782004003C2004003E2004001E2004000F2004000F20040007A00400 +03E0040003E0040001E0040001E0040000E00E0000601F000060FFE0002020227EA125> +78 D<000FE00000783C0000E00E0003C00780078003C00F0001E00E0000E01E0000F03C +0000783C0000787C00007C7C00007C7800003C7800003CF800003EF800003EF800003EF8 +00003EF800003EF800003EF800003EF800003EF800003E7800003C7C00007C7C00007C3C +0000783E0000F81E0000F00F0001E00F0001E0078003C003C0078000E00E0000783C0000 +0FE0001F247DA226> I<FFFFF0000F803C0007800F0007800780078007C0078003C00780 +03E0078003E0078003E0078003E0078003E0078003E0078003C0078007C0078007800780 +0F0007803C0007FFF0000780000007800000078000000780000007800000078000000780 +0000078000000780000007800000078000000780000007800000078000000FC00000FFFC +00001B227EA121> I<FFFFE000000F803C000007800E00000780078000078007C0000780 +03C000078003E000078003E000078003E000078003E000078003E000078003C000078007 +C000078007800007800E000007803C000007FFE000000780700000078038000007801C00 +0007801E000007800E000007800F000007800F000007800F000007800F000007800F8000 +07800F800007800F800007800F808007800FC080078007C0800FC003C100FFFC01E20000 +00007C0021237EA124> 82 D<03F0200C0C601802603001E07000E0600060E00060E000 +60E00020E00020E00020F00000F000007800007F00003FF0001FFE000FFF0003FF80003F +C00007E00001E00000F00000F0000070800070800070800070800070C00060C00060E000 +C0F000C0C80180C6070081FC0014247DA21B> I<7FFFFFF8780780786007801840078008 +4007800840078008C007800C800780048007800480078004800780040007800000078000 +000780000007800000078000000780000007800000078000000780000007800000078000 +000780000007800000078000000780000007800000078000000780000007800000078000 +00078000000FC00001FFFE001E227EA123> I<FFF0007FC01F80001F000F00000C000F80 +000C000780000800078000080003C000100003C000100003C000100001E000200001E000 +200001F000600000F000400000F000400000780080000078008000007C008000003C0100 +00003C010000001E020000001E020000001E020000000F040000000F040000000F8C0000 +000788000000078800000003D000000003D000000003F000000001E000000001E0000000 +00C000000000C000000000C0000022237FA125> 86 D<FFF03FFC03FE1F8007E000F80F +0003C000700F0003C000200F0001E00020078001E00040078001E00040078003F0004003 +C002F0008003C002F0008003C002F0008003E00478018001E00478010001E00478010001 +E0083C010000F0083C020000F0083C020000F0101E02000078101E04000078101E040000 +78200F0400003C200F0800003C200F0800003C600F8800001E40079000001E4007900000 +1E4007D000001F8003F000000F8003E000000F8003E000000F0001E00000070001C00000 +070001C00000060000C0000002000080002F237FA132> I<FEFEC0C0C0C0C0C0C0C0C0C0 +C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0FE +FE07317BA40E> 91 D<FEFE060606060606060606060606060606060606060606060606 +060606060606060606060606060606060606060606FEFE07317FA40E> 93 +D<1FE000303800780C00780E0030070000070000070000070000FF0007C7001E07003C07 +00780700700700F00708F00708F00708F00F087817083C23900FC1E015157E9418> 97 +D<0E0000FE00001E00000E00000E00000E00000E00000E00000E00000E00000E00000E00 +000E00000E00000E1F000E61C00E80600F00300E00380E003C0E001C0E001E0E001E0E00 +1E0E001E0E001E0E001E0E001E0E001C0E003C0E00380F00700C80600C41C0083F001723 +7FA21B> I<01FE000703000C07801C0780380300780000700000F00000F00000F00000F0 +0000F00000F00000F000007000007800403800401C00800C010007060001F80012157E94 +16> I<0000E0000FE00001E00000E00000E00000E00000E00000E00000E00000E00000E0 +0000E00000E00000E001F8E00704E00C02E01C01E03800E07800E07000E0F000E0F000E0 +F000E0F000E0F000E0F000E0F000E07000E07800E03800E01801E00C02E0070CF001F0FE +17237EA21B> I<01FC000707000C03801C01C03801C07801E07000E0F000E0FFFFE0F000 +00F00000F00000F00000F000007000007800203800201C00400E008007030000FC001315 +7F9416> I<003E0000E30001C78003878003078007000007000007000007000007000007 +0000070000070000070000FFF80007000007000007000007000007000007000007000007 +00000700000700000700000700000700000700000700000700000700000700000780007F +F000112380A20F> I<00007003F1980E1E181C0E18380700380700780780780780780780 +7807803807003807001C0E001E1C0033F0002000002000003000003800003FFE001FFFC0 +0FFFE03000F0600030C00018C00018C00018C000186000306000303800E00E038003FE00 +15217F9518> I<0E0000FE00001E00000E00000E00000E00000E00000E00000E00000E00 +000E00000E00000E00000E00000E1F800E60C00E80E00F00700F00700E00700E00700E00 +700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00 +70FFE7FF18237FA21B> I<1C003E003E003E001C00000000000000000000000000000000 +000E007E001E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E +000E000E00FFC00A227FA10E> I<00E001F001F001F000E0000000000000000000000000 +00000000007007F000F00070007000700070007000700070007000700070007000700070 +00700070007000700070007000700070007000706070F0E0F0C061803F000C2C83A10F> +I<0E0000FE00001E00000E00000E00000E00000E00000E00000E00000E00000E00000E00 +000E00000E00000E03FC0E01F00E01C00E01800E02000E04000E08000E10000E38000EF8 +000F1C000E1E000E0E000E07000E07800E03C00E01C00E01E00E00F00E00F8FFE3FE1723 +7FA21A> I<0E00FE001E000E000E000E000E000E000E000E000E000E000E000E000E000E +000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E +00FFE00B237FA20E> I<0E1FC07F00FE60E183801E807201C00F003C00E00F003C00E00E +003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E00 +3800E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E0038 +00E0FFE3FF8FFE27157F942A> I<0E1F80FE60C01E80E00F00700F00700E00700E00700E +00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E +0070FFE7FF18157F941B> I<01FC000707000C01801800C03800E0700070700070F00078 +F00078F00078F00078F00078F00078F000787000707800F03800E01C01C00E0380070700 +01FC0015157F9418> I<0E1F00FE61C00E80600F00700E00380E003C0E003C0E001E0E00 +1E0E001E0E001E0E001E0E001E0E001E0E003C0E003C0E00380F00700E80E00E41C00E3F +000E00000E00000E00000E00000E00000E00000E00000E00000E0000FFE000171F7F941B +> I<01F8200704600E02601C01603801E07800E07800E0F000E0F000E0F000E0F000E0F0 +00E0F000E0F000E07800E07800E03801E01C01E00C02E0070CE001F0E00000E00000E000 +00E00000E00000E00000E00000E00000E00000E0000FFE171F7E941A> I<0E3CFE461E8F +0F0F0F060F000E000E000E000E000E000E000E000E000E000E000E000E000E000F00FFF0 +10157F9413> I<0F8830786018C018C008C008E008F0007F003FE00FF001F8003C801C80 +0C800CC00CC008E018D0308FC00E157E9413> I<02000200020002000600060006000E00 +1E003E00FFFC0E000E000E000E000E000E000E000E000E000E000E000E040E040E040E04 +0E040E040708030801F00E1F7F9E13> I<0E0070FE07F01E00F00E00700E00700E00700E +00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00F00E00F006 +017003827800FC7F18157F941B> I<FF80FE1E00781E00300E00200E0020070040070040 +0780C003808003808001C10001C10000E20000E20000E200007400007400003800003800 +00380000100017157F941A> I<FF8FF87F3E01E03C1C01C0181C01E0180E01E0100E0260 +100E027010070270200704302007043820038438400388184003881C4001C81C8001D00C +8001D00E8000F00F0000E0070000E00700006006000040020020157F9423> I<FF83FE1F +00F00E00C007008007810003830001C20000E400007800007800003800003C00004E0000 +8F000187000103800201C00401E00C00E03E01F0FF03FE17157F941A> I<FF80FE1E0078 +1E00300E00200E00200700400700400780C003808003808001C10001C10000E20000E200 +00E200007400007400003800003800003800001000001000002000002000002000004000 +F04000F08000F180004300003C0000171F7F941A> I<3FFFC0380380300780200700600E +00401C00403C0040380000700000E00001E00001C0000380400700400F00400E00C01C00 +80380080780180700780FFFF8012157F9416> I<FFFFFFFFFFFF3001808C31> 124 +D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fl cmbx12 14.4 19 +/Fl 19 118 df<00007FE0030007FFFC07001FFFFF0F007FF00F9F00FF0001FF01FC0000 +FF03F800007F07F000003F0FE000001F1FC000001F1FC000000F3F8000000F3F80000007 +7F800000077F800000077F00000000FF00000000FF00000000FF00000000FF00000000FF +00000000FF00000000FF00000000FF00000000FF000000007F000000007F800000007F80 +0000073F800000073F800000071FC00000071FC000000E0FE000000E07F000001C03F800 +003C01FC00007800FF0001F0007FF007C0001FFFFF800007FFFE0000007FF00028297CA8 +31> 67 D<FFFFFC0000FFFFFC0000FFFFFC000003FC00000003FC00000003FC00000003 +FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC +00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00 +000003FC00000003FC00000003FC00000003FC0001C003FC0001C003FC0001C003FC0001 +C003FC0003C003FC00038003FC00038003FC00078003FC00078003FC000F8003FC000F80 +03FC001F8003FC007F8003FC01FF00FFFFFFFF00FFFFFFFF00FFFFFFFF0022297EA828> +76 D<0000FFC00000000FFFFC0000003F807F000000FE001FC00001F80007E00003F000 +03F00007E00001F8000FE00001FC001FC00000FE001FC00000FE003F8000007F003F8000 +007F007F8000007F807F0000003F807F0000003F807F0000003F80FF0000003FC0FF0000 +003FC0FF0000003FC0FF0000003FC0FF0000003FC0FF0000003FC0FF0000003FC0FF0000 +003FC0FF0000003FC0FF0000003FC07F0000003F807F8000007F807F8000007F803F8000 +007F003F8000007F001FC00000FE001FC00000FE000FE00001FC0007F00003F80003F800 +07F00001FC000FE00000FE001FC000003FC0FF0000000FFFFC00000000FFC000002A297C +A833> 79 D<FFFFF0007FFFFFFFF0007FFFFFFFF0007FFF03FE000001C001FE00000380 +01FE0000038001FF0000078000FF0000070000FF80000F00007F80000E00007FC0000E00 +003FC0001C00003FC0001C00003FE0003C00001FE0003800001FF0007800000FF0007000 +000FF80070000007F800E0000007F800E0000003FC01C0000003FC01C0000003FE03C000 +0001FE0380000001FF0780000000FF0700000000FF87000000007F8E000000007F8E0000 +00007FDE000000003FDC000000003FFC000000001FF8000000001FF8000000000FF00000 +00000FF0000000000FF00000000007E00000000007E00000000003C00000000003C00000 +30297FA833> 86 D<03FF80000FFFF0001F01FC003F80FE003F807F003F803F003F803F +801F003F8000003F8000003F8000003F8000003F80003FFF8001FC3F800FE03F801F803F +803F003F807E003F80FC003F80FC003F80FC003F80FC003F80FC005F807E00DF803F839F +FC1FFE0FFC03FC03FC1E1B7E9A21> 97 D<FFE00000FFE00000FFE000000FE000000FE0 +00000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE0 +00000FE000000FE1FE000FEFFF800FFE07E00FF803F00FF001F80FE000FC0FE000FC0FE0 +007E0FE0007E0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0 +007F0FE0007E0FE0007E0FE0007E0FE000FC0FE000FC0FF001F80FF803F00F9C0FE00F0F +FF800E01FC00202A7EA925> I<00007FF000007FF000007FF0000007F0000007F0000007 +F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007 +F0003F87F001FFF7F007F03FF00FC00FF01F8007F03F0007F03F0007F07E0007F07E0007 +F07E0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007 +F07E0007F07E0007F03F0007F03F0007F01F800FF00FC01FF007E07FFF01FFE7FF007F87 +FF202A7EA925> 100 D<003FC00001FFF00003E07C000F803E001F801F001F001F003F00 +0F807E000F807E000FC07E000FC0FE0007C0FE0007C0FFFFFFC0FFFFFFC0FE000000FE00 +0000FE0000007E0000007E0000007F0000003F0001C01F0001C00F80038007C0070003F0 +1E0000FFFC00003FE0001A1B7E9A1F> I<0007F8003FFC007E3E01FC7F03F87F03F07F07 +F07F07F03E07F00007F00007F00007F00007F00007F00007F000FFFFC0FFFFC0FFFFC007 +F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007 +F00007F00007F00007F00007F00007F00007F00007F00007F0007FFF807FFF807FFF8018 +2A7EA915> I<FFE00000FFE00000FFE000000FE000000FE000000FE000000FE000000FE0 +00000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE07E000FE1 +FF800FE30FC00FE40FE00FE807E00FF807F00FF007F00FF007F00FE007F00FE007F00FE0 +07F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE0 +07F00FE007F00FE007F00FE007F00FE007F0FFFE3FFFFFFE3FFFFFFE3FFF202A7DA925> +104 D<07000F801FC03FE03FE03FE01FC00F8007000000000000000000000000000000FF +E0FFE0FFE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00F +E00FE00FE00FE00FE00FE0FFFEFFFEFFFE0F2B7EAA12> I<FFE0FFE0FFE00FE00FE00FE0 +0FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0 +0FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0FFFEFFFEFFFE +0F2A7EA912> 108 D<FFC07E00FFC1FF80FFC30FC00FC40FE00FC807E00FD807F00FD007 +F00FD007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007 +F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F0FFFE3F +FFFFFE3FFFFFFE3FFF201B7D9A25> 110 D<003FE00001FFFC0003F07E000FC01F801F80 +0FC03F0007E03F0007E07E0003F07E0003F07E0003F0FE0003F8FE0003F8FE0003F8FE00 +03F8FE0003F8FE0003F8FE0003F8FE0003F87E0003F07E0003F03F0007E03F0007E01F80 +0FC00FC01F8007F07F0001FFFC00003FE0001D1B7E9A22> I<FFE1FE00FFEFFF80FFFE0F +E00FF803F00FF001F80FE001FC0FE000FC0FE000FE0FE000FE0FE0007F0FE0007F0FE000 +7F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007E0FE000FE0FE000FE0FE000 +FC0FE001FC0FF001F80FF807F00FFC0FE00FEFFF800FE1FC000FE000000FE000000FE000 +000FE000000FE000000FE000000FE000000FE000000FE00000FFFE0000FFFE0000FFFE00 +0020277E9A25> I<FFC1F0FFC7FCFFC63E0FCC7F0FD87F0FD07F0FD07F0FF03E0FE0000F +E0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000F +E0000FE0000FE000FFFF00FFFF00FFFF00181B7F9A1B> 114 D<03FE300FFFF03E03F078 +00F07000F0F00070F00070F80070FE0000FFE0007FFF007FFFC03FFFE01FFFF007FFF800 +FFF80007FC0000FCE0007CE0003CF0003CF00038F80038FC0070FF01E0E7FFC0C1FF0016 +1B7E9A1B> I<00E00000E00000E00000E00001E00001E00001E00003E00003E00007E000 +0FE0001FFFE0FFFFE0FFFFE00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE000 +0FE0000FE0000FE0000FE0000FE0000FE0700FE0700FE0700FE0700FE0700FE0700FE070 +07F0E003F0C001FF80007F0014267FA51A> I<FFE07FF0FFE07FF0FFE07FF00FE007F00F +E007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00F +E007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE007F00FE00FF00F +E00FF007E017F003F067FF01FFC7FF007F87FF201B7D9A25> I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fm cmr12 14.4 20 +/Fm 20 118 df<78FCFCFEFE7A02020202040404080810204007127B8510> 44 +D<00200000E00001E0000FE000FFE000F1E00001E00001E00001E00001E00001E00001E0 +0001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E0 +0001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E00001E0 +0001E00003F000FFFFC0FFFFC012287BA71D> 49 D<01FC0007FF000C0FC01803E02001 +F06001F04000F84000F8F800FCFC00FCFC007CFC007CFC007C7800FC0000FC0000F80000 +F80001F00001F00003E00003C0000780000700000E00001C0000380000300000600000C0 +000180000300040200040400080800081000082000183FFFF87FFFF0FFFFF0FFFFF01628 +7DA71D> I<000FC0003FF000F01801C01803803C07007C0F007C0E00381E00003C00003C +00003C0000780000780000780000F83F00F8C1C0F900E0FA0070FA0038FC003CFC001EFC +001EF8001EF8001FF8001FF8001FF8001F78001F78001F78001F78001F3C001E3C001E1C +003C1E003C0E007807007003C1E001FFC0007E0018297EA71D> 54 +D<007E0001FF800781C00F00E01E00703C00383C003878003C78003CF8001EF8001EF800 +1EF8001EF8001FF8001FF8001FF8001F78001F78003F78003F3C003F1C005F0E005F0700 +9F03831F00FC1F00001E00001E00001E00003E00003C00003C0000381C00783E00703E00 +E03C01C01803801C0F000FFE0003F80018297EA71D> 57 D<0000FF00100007FFE03000 +1FC07830003E000C7000F80006F001F00003F003E00001F007C00000F00F800000700F80 +0000701F000000303F000000303E000000303E000000107E000000107E000000107C0000 +0000FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC000000 +00FC00000000FC0000FFFF7C0000FFFF7E000003F07E000001F03E000001F03E000001F0 +3F000001F01F000001F00F800001F00F800001F007C00001F003E00001F001F00002F000 +F80002F0003E000C70001FC038300007FFE0100000FF8000282B7DA92E> 71 +D<01FFFE01FFFE0007E00003E00003E00003E00003E00003E00003E00003E00003E00003 +E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003 +E00003E00003E00003E00003E00003E00003E00003E03003E07803E0FC03E0FC03E0FC03 +C0F807C0400780200F00300E000C3C0003F000172A7DA81E> 74 +D<0001FF0000000F01E000003C0078000078003C0000E0000E0001E0000F0003C0000780 +07800003C00F800003E01F000001F01F000001F03E000000F83E000000F87E000000FC7E +000000FC7C0000007C7C0000007CFC0000007EFC0000007EFC0000007EFC0000007EFC00 +00007EFC0000007EFC0000007EFC0000007EFC0000007E7C0000007C7E000000FC7E0000 +00FC7E000000FC3E000000F83F000001F81F000001F01F000001F00F800003E007800003 +C007C00007C003E0000F8000F0001E000078003C00003C007800000F01E0000001FF0000 +272B7DA92E> 79 D<03FC00000C070000100380003C01C0003E01E0003E00F0001C00F0 +000800F0000000F0000000F0000000F000007FF00003E0F0000F80F0001E00F0003C00F0 +007C00F0007800F040F800F040F800F040F800F040F801F0407C01F0403C0278801E0C7F +8007F01E001A1A7E991D> 97 D<0F000000FF000000FF0000001F0000000F0000000F00 +00000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F00 +00000F0000000F07E0000F1838000F600E000F8007000F8007800F0003C00F0003C00F00 +01E00F0001E00F0001F00F0001F00F0001F00F0001F00F0001F00F0001F00F0001F00F00 +01E00F0001E00F0003E00F0003C00F0003800F8007800E800F000E401C000C303800080F +C0001C2A7EA921> I<007F0001C0E00700100E00781E00F83C00F83C00707C0020780000 +F80000F80000F80000F80000F80000F80000F80000F800007800007C00003C00083C0008 +1E00100E002007006001C180007E00151A7E991A> I<00FC000387800701C00E01E01C00 +E03C00F03C00F0780078780078F80078F80078FFFFF8F80000F80000F80000F80000F800 +007800007800003C00083C00081E00100E002007004001C180007E00151A7E991A> 101 +D<00000F0001FC3080070743800E03C3801E03C1003C01E0003C01E0007C01F0007C01F0 +007C01F0007C01F0007C01F0003C01E0003C01E0001E03C0000E0380001707000011FC00 +0030000000300000003000000030000000180000001FFF80000FFFF00007FFF80018007C +0030001E0070000E0060000700E0000700E0000700E0000700E000070070000E0070000E +0038001C001C0038000781E00000FF000019287E9A1D> 103 D<1E003F003F003F003F00 +1E000000000000000000000000000000000000000F00FF00FF001F000F000F000F000F00 +0F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F00FFF0FFF0 +0C297EA811> 105 D<007E0003C3C00700E00E00701C00383C003C3C003C78001E78001E +F8001FF8001FF8001FF8001FF8001FF8001FF8001FF8001F78001E78001E3C003C3C003C +1C00380E00700700E003C3C0007E00181A7E991D> 111 D<003F010001E0830003804300 +0F0027001E0017001E001F003C000F007C000F007C000F0078000F00F8000F00F8000F00 +F8000F00F8000F00F8000F00F8000F00F8000F007C000F007C000F003C000F003E001F00 +1E001F000F002F0007804F0001C18F00007E0F0000000F0000000F0000000F0000000F00 +00000F0000000F0000000F0000000F0000000F0000000F000000FFF00000FFF01C267E99 +1F> 113 D<0F0F80FF11C0FF23E01F43E00F83E00F81C00F80000F00000F00000F00000F +00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F +00000F8000FFFC00FFFC00131A7E9917> I<07F0801C0D80300380600180E00180E00080 +E00080F00080F800007E00007FE0003FFC001FFE0007FF00003F800007808003C08003C0 +8001C0C001C0C001C0E00180E00380F00300CC0E0083F800121A7E9917> I<0080000080 +000080000080000180000180000180000380000380000780000F80001FFF80FFFF800780 +000780000780000780000780000780000780000780000780000780000780000780000780 +0007804007804007804007804007804007804007804003C08001C08000E100003E001225 +7FA417> I<0F000F00FF00FF00FF00FF001F001F000F000F000F000F000F000F000F000F +000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F +000F000F000F000F000F000F000F001F000F001F0007002F0003804F8001C08FF0007F0F +F01C1A7E9921> I E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fn cmr17 20.74 18 +/Fn 18 119 df<000001FF00008000001FFFE0018000007F007801800001F8000E038000 +03E000070780000FC000018780001F000000CF80003E0000006F80007C0000003F8000F8 +0000003F8001F00000001F8003F00000000F8007E00000000F8007C000000007800FC000 +000007800FC000000007801F8000000003801F8000000003803F8000000003803F000000 +0001803F0000000001807F0000000001807F0000000001807E0000000000007E00000000 +0000FE000000000000FE000000000000FE000000000000FE000000000000FE0000000000 +00FE000000000000FE000000000000FE000000000000FE000000000000FE000000000000 +FE0000000000007E0000000000007E0000000000007F0000000000007F0000000001803F +0000000001803F0000000001803F8000000001801F8000000001801F8000000003000FC0 +00000003000FC0000000030007E0000000060007E0000000060003F0000000060001F000 +00000C0000F80000001800007C0000001800003E0000003000001F0000006000000FC000 +01C0000003E0000380000001F8000E000000007F007C000000001FFFF00000000001FF00 +0000313D7CBB39> 67 D<FFFFFC000000FFFFFC00000003FE0000000001F80000000001 +F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001 +F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001 +F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001 +F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001 +F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001 +F80000000001F80000000001F80000000001F80000006001F80000006001F80000006001 +F80000006001F80000006001F8000000E001F8000000C001F8000000C001F8000000C001 +F8000000C001F8000001C001F8000001C001F8000001C001F8000003C001F8000007C001 +F8000007C001F800000FC001F800003F8001F80000FF8003FC0007FF80FFFFFFFFFF80FF +FFFFFFFF802B3B7CBA32> 76 D<000003FF00000000001E01E000000000F0003C000000 +03C0000F000000078000078000000F000003C000003E000001F000007C000000F80000F8 +0000007C0001F00000003E0001F00000003E0003E00000001F0007E00000001F8007C000 +00000F800FC00000000FC00F8000000007C01F8000000007E01F8000000007E03F000000 +0003F03F0000000003F03F0000000003F07F0000000003F87E0000000001F87E00000000 +01F87E0000000001F8FE0000000001FCFE0000000001FCFE0000000001FCFE0000000001 +FCFE0000000001FCFE0000000001FCFE0000000001FCFE0000000001FCFE0000000001FC +FE0000000001FCFE0000000001FC7E0000000001F87F0000000003F87F0000000003F87F +0000000003F87F0000000003F83F0000000003F03F8000000007F01F8000000007E01F80 +00000007E01FC00000000FE00FC00000000FC007C00000000F8007E00000001F8003E000 +00001F0001F00000003E0001F80000007E0000F80000007C00007C000000F800003E0000 +01F000000F000003C000000780000780000003E0001F00000000F8007C000000001E01E0 +0000000003FF000000363D7CBB3E> 79 D<003F80000001C0F0000003003C000004001E +00000C000F000018000780001C0007C0003E0003C0003F0003E0003F0003E0003F0003E0 +001E0003E000000003E000000003E000000003E00000003FE000000FF3E000007E03E000 +01F803E00003E003E0000FC003E0001F8003E0003F0003E0003E0003E0007E0003E0007E +0003E060FC0003E060FC0003E060FC0003E060FC0007E060FC0007E0607C000BE0607E00 +0BE0603E0011F0C01F0060F0C007C1807F8000FE003E0023257CA427> 97 +D<03E0000000FFE0000000FFE000000007E000000003E000000003E000000003E0000000 +03E000000003E000000003E000000003E000000003E000000003E000000003E000000003 +E000000003E000000003E000000003E000000003E000000003E000000003E000000003E0 +00000003E000000003E03FC00003E0E0780003E3001C0003E6000F0003E800078003F800 +03C003F00001E003E00001F003E00000F003E00000F803E00000F803E00000FC03E00000 +7C03E000007C03E000007E03E000007E03E000007E03E000007E03E000007E03E000007E +03E000007E03E000007E03E000007E03E000007C03E000007C03E00000FC03E00000F803 +E00000F803E00001F003E00001E003F00003E003D80003C003C80007800384000E000383 +001C000381C0F00003003F8000273C7EBB2C> I<0007F800003C0E0000F0018001E000C0 +03C00060078000300F0000701F0000F81F0001F83E0001F83E0001F87E0000F07C000000 +7C000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000 +FC0000007C0000007C0000007E0000003E0000003E00000C1F00000C1F0000180F800018 +0780003003C0006001E000C000F00180003C0E000007F8001E257DA423> I<0007F80000 +3C1E0000F0078001C003C003C001E0078000F00F0000F81F0000781E00007C3E00007C3E +00007C7E00003E7C00003E7C00003EFC00003EFC00003EFFFFFFFEFC000000FC000000FC +000000FC000000FC000000FC0000007C0000007C0000007E0000003E0000003E0000061F +0000060F00000C0F80000C0780001803C0003000E00060007000C0001E07000003FC001F +257EA423> 101 D<0000FC0000078300000E0380001C07C0003C0FC000780FC000F80FC0 +00F8078000F0000001F0000001F0000001F0000001F0000001F0000001F0000001F00000 +01F0000001F0000001F0000001F0000001F0000001F0000001F00000FFFFFC00FFFFFC00 +01F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F00000 +01F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F00000 +01F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F00000 +01F0000001F0000001F0000001F0000001F0000003F800007FFFE0007FFFE0001A3C7FBB +18> I<07000F801FC01FC01FC00F80070000000000000000000000000000000000000000 +0000000000000007C0FFC0FFC00FC007C007C007C007C007C007C007C007C007C007C007 +C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007 +C007C00FE0FFFEFFFE0F397DB815> 105 D<0003800007C0000FE0000FE0000FE00007C0 +000380000000000000000000000000000000000000000000000000000000000000000000 +0000000000000007E000FFE000FFE0000FE00003E00003E00003E00003E00003E00003E0 +0003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E0 +0003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E0 +0003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E0 +7803C0FC07C0FC0780FC0780FC0F00780E00381C000FE000134A82B818> I<07C0FFC0FF +C00FC007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007 +C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007 +C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007 +C00FE0FFFEFFFE0F3C7DBB15> 108 D<03E01FE0003FC000FFE0607C00C0F800FFE0801E +01003C0007E3000F06001E0003E4000F88001F0003E4000F88001F0003E8000790000F00 +03E80007D0000F8003F00007E0000F8003F00007E0000F8003E00007C0000F8003E00007 +C0000F8003E00007C0000F8003E00007C0000F8003E00007C0000F8003E00007C0000F80 +03E00007C0000F8003E00007C0000F8003E00007C0000F8003E00007C0000F8003E00007 +C0000F8003E00007C0000F8003E00007C0000F8003E00007C0000F8003E00007C0000F80 +03E00007C0000F8003E00007C0000F8003E00007C0000F8003E00007C0000F8003E00007 +C0000F8003E00007C0000F8003E00007C0000F8003E00007C0000F8003E00007C0000F80 +07F0000FE0001FC0FFFF81FFFF03FFFEFFFF81FFFF03FFFE3F257EA443> I<03E01FE000 +FFE0607C00FFE0801E0007E3000F0003E4000F8003E4000F8003E800078003E80007C003 +F00007C003F00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E0 +0007C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E000 +07C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007 +C003E00007C003E00007C003E00007C003E00007C007F0000FE0FFFF81FFFFFFFF81FFFF +28257EA42C> I<0007FC0000001C070000007001C00001E000F00003C00078000780003C +000F00001E001F00001F001E00000F003E00000F803E00000F807C000007C07C000007C0 +7C000007C0FC000007E0FC000007E0FC000007E0FC000007E0FC000007E0FC000007E0FC +000007E0FC000007E0FC000007E07C000007C07C000007C07E00000FC03E00000F803E00 +000F801E00000F001F00001F000F00001E000780003C0003C000780001E000F000007001 +C000001C0700000007FC000023257EA427> I<03E03E00FFE0C300FFE1078007E20FC003 +E40FC003E80FC003E8078003E8030003F0000003F0000003F0000003E0000003E0000003 +E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003 +E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003 +E0000003E0000003E0000007F00000FFFFC000FFFFC0001A257EA41E> 114 +D<00FF02000700C6000C002E0010001E0030001E0060000E0060000E00E0000600E00006 +00E0000600F0000600F8000600FC0000007F0000003FF000003FFF80000FFFE00007FFF0 +0001FFFC00003FFE000001FE0000003F00C0001F00C0000F80C0000780E0000380E00003 +80E0000380E0000380F0000300F0000300F8000700F8000600E4000C00E2001800C18070 +00807F800019257DA41F> I<003000000030000000300000003000000030000000300000 +0070000000700000007000000070000000F0000000F0000001F0000001F0000003F00000 +07F000001FFFFE00FFFFFE0001F0000001F0000001F0000001F0000001F0000001F00000 +01F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F00000 +01F0000001F0000001F0000001F0000001F0018001F0018001F0018001F0018001F00180 +01F0018001F0018001F0018001F0018000F0010000F8030000F8030000780200003C0400 +000E08000003F00019357FB41E> I<FFFE000FFFFFFE000FFF07F00007F803E00003E003 +E00001C001F00001C001F000018001F800018000F800030000F8000300007C000600007C +000600007E000600003E000C00003E000C00003F001C00001F001800001F001800000F80 +3000000F803000000FC070000007C060000007C060000003E0C0000003E0C0000003F1C0 +000001F180000001F180000000FB00000000FB00000000FF000000007E000000007E0000 +00003C000000003C000000003C0000000018000028257FA42A> 118 +D E +%EndDVIPSBitmapFont +end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 300dpi +TeXDict begin +%%PaperSize: a4 + +userdict/PStoPSxform PStoPSmatrix matrix currentmatrix + matrix invertmatrix matrix concatmatrix + matrix invertmatrix put +%%EndSetup +%%Page: (0,1) 1 +userdict/PStoPSsaved save put +PStoPSmatrix setmatrix +595.000000 0.271378 translate +90 rotate +0.706651 dup scale +userdict/PStoPSmatrix matrix currentmatrix put +userdict/PStoPSclip{0 0 moveto + 595.000000 0 rlineto 0 842.000000 rlineto -595.000000 0 rlineto + closepath}put initclip +/showpage{}def/copypage{}def/erasepage{}def +PStoPSxform concat +1 0 bop Fn 281 370 a(Cleaner) p 570 370 a(seman) n(tics) p +927 370 a(for) p 1047 370 a(Ob) t(jectiv) n(e) p 1404 +370 a(Lab) r(el) p Fm 717 518 a(Jacques) p 934 518 a(Garrigue) 719 +634 y(Octob) r(er) p 945 634 a(26,) p 1040 634 a(1999) p +Fl 11 836 a(Credits) p Fk 11 929 a(This) p 122 929 a(prop) q(osal) p +319 929 a(con) o(tains) p 510 929 a(ideas) p 632 929 +a(from) p 747 929 a(Damien) p 928 929 a(Doligez) p 1101 +929 a(and) p 1196 929 a(Pierre) p 1340 929 a(W) l(eis.) p +Fl 11 1073 a(Lab) r(els) p 221 1073 a(and) p 351 1073 +a(optionals) p Fk 11 1165 a(Lab) q(els) p 165 1165 a(and) p +259 1165 a(optional) p 449 1165 a(argumen) o(ts) p 687 +1165 a(had) p 781 1165 a(t) o(w) o(o) p 873 1165 a(problems) p +1082 1165 a(in) p 1139 1165 a(Ob) s(jectiv) o(e) p 1360 +1165 a(Lab) q(el.) p Fj 83 1280 a(\017) p Fk 133 1280 +a(They) p 259 1280 a(w) o(ere) p 372 1280 a(not) p 459 +1280 a(fully) p 570 1280 a(coheren) o(t) p 767 1280 a(with) p +878 1280 a(the) p 963 1280 a(original) p 1139 1280 a(call-b) o(y-v) m +(alue) p 1423 1280 a(seman) o(tics) p 1644 1280 a(of) p +1700 1280 a(the) p 1784 1280 a(lan-) 133 1340 y(guage.) p +303 1340 a(In) p 368 1340 a(some) p 495 1340 a(\(subtle\)) p +681 1340 a(cases,) p 823 1340 a(a) p 868 1340 a(side-e\013ect) p +1099 1340 a(migh) o(t) p 1243 1340 a(get) p 1329 1340 +a(dela) o(y) o(ed) p 1508 1340 a(more) p 1635 1340 a(than) p +1753 1340 a(in) p 1814 1340 a(an) 133 1400 y(un) o(t) o(yp) q(ed) p +322 1400 a(seman) o(tics.) p Fj 83 1502 a(\017) p Fk +133 1502 a(F) l(or) p 220 1502 a(optional) p 410 1502 +a(argumen) o(ts,) p 660 1502 a(no) p 728 1502 a(un) o(t) o(yp) q(ed) p +918 1502 a(seman) o(tics) p 1139 1502 a(existed.) 84 +1616 y(This) p 195 1616 a(new) p 295 1616 a(prop) q(osal) p +492 1616 a(corrects) p 674 1616 a(these) p 799 1616 a(t) o(w) o(o) p +891 1616 a(\015a) o(ws.) p Fi 11 1746 a(Syn) n(tax) p +Fk 11 1838 a(W) l(e) p 95 1838 a(k) o(eep) p 206 1838 +a(Ob) s(jectiv) o(e) p 426 1838 a(Lab) q(el's) p 594 +1838 a(syn) o(tax,) p 764 1838 a(except) p 917 1838 a(for) p +991 1838 a(default) p 1155 1838 a(v) m(alues) p 1301 +1838 a(in) p 1357 1838 a(optional) p 1547 1838 a(argumen) o(ts.) p +Fh 329 1944 a(typ) n(expr) p Fk 528 1944 a(::=) p Fg +634 1944 a(:) p 656 1944 a(:) p 678 1944 a(:) p Fj 579 +2004 a(j) p Fh 634 2004 a(typ) n(expr) p Fj 806 2004 +a(!) p Fh 870 2004 a(typ) n(expr) p Fj 579 2064 a(j) p +Fk 634 2064 a([?]) p Fi(lab) r(el) p Fk 801 2064 a(:) p +Fh(typ) n(expr) p Fj 987 2064 a(!) p Fh 1050 2064 a(typ) n(expr) 391 +2124 y(expr) p Fk 528 2124 a(::=) p Fg 634 2124 a(:) p +656 2124 a(:) p 678 2124 a(:) p Fj 579 2185 a(j) p Fh +634 2185 a(expr) p 746 2185 a(lab) n(ele) n(d-expr) p +Ff 991 2163 a(+) p Fj 579 2245 a(j) p Fe 634 2245 a(fun) p +Fj 728 2245 a(f) p Fh(lab) n(ele) n(d-simple-p) n(attern) p +Fj 1209 2245 a(g) p Ff 1234 2227 a(+) p Fk 1280 2245 +a([) p Fe(when) p Fh 1412 2245 a(expr) p Fk 1507 2245 +a(]) p Fj 1535 2245 a(!) p Fh 1599 2245 a(expr) p Fj +579 2305 a(j) p Fe 634 2305 a(function) p Fh 856 2305 +a(lab) n(ele) n(d-p) n(attern) p Fk 1177 2305 a([) p +Fe(when) p Fh 1309 2305 a(expr) p Fk 1404 2305 a(]) p +Fj 1432 2305 a(!) p Fh 1496 2305 a(expr) p Fj 785 2365 +a(f) p Fe(|) p Fh 851 2365 a(lab) n(ele) n(d-p) n(attern) p +Fk 1172 2365 a([) p Fe(when) p Fg 1305 2365 a(expr) p +Fk 1403 2365 a(]) p Fj 1430 2365 a(!) p Fh 1494 2365 +a(expr) p Fj 1589 2365 a(g) p Fd 1614 2347 a(\003) p +Fh 242 2425 a(lab) n(ele) n(d-expr) p Fk 528 2425 a(::=) p +634 2425 a([?]) p Fh(expr) p Fj 579 2486 a(j) p Fk 634 +2486 a([?]) p Fi(lab) r(el) p Fk 801 2486 a(:) p Fh(expr) 182 +2546 y(lab) n(ele) n(d-p) n(attern) p Fk 528 2546 a(::=) p +Fh 634 2546 a(p) n(attern) p Fj 579 2606 a(j) p Fi 634 +2606 a(lab) r(el) p Fk 751 2606 a(:) p Fh(p) n(attern) p +Fj 579 2666 a(j) p Fk 634 2666 a(?[) p Fe(\() p Fh(expr) p +Fe(\)) p Fk(]) p Fi(lab) r(el) p Fk 943 2666 a(:) p Fh +956 2666 a(p) n(attern) p Fk 926 2937 a(1) p eop +PStoPSsaved restore +userdict/PStoPSsaved save put +PStoPSmatrix setmatrix +595.000000 421.271378 translate +90 rotate +0.706651 dup scale +userdict/PStoPSmatrix matrix currentmatrix put +userdict/PStoPSclip{0 0 moveto + 595.000000 0 rlineto 0 842.000000 rlineto -595.000000 0 rlineto + closepath}put initclip +PStoPSxform concat +2 1 bop Fi 11 168 a(Dynamic) p 247 168 a(seman) n(tics) p +Fj 11 261 a(;) p Fk 52 261 a(is) p 101 261 a(a) p 141 +261 a(notation) p 337 261 a(for) p 411 261 a(the) p 495 +261 a(empt) o(y) p 644 261 a(lab) q(el.) 86 366 y(\() p +Fe(fun) p Fi 198 366 a(l) p Fc 214 373 a(i) p Fk 227 +366 a(:) p Fg(x) p Fj 282 366 a(!) p Fg 346 366 a(e) p +Fk(\)) p Fi 404 366 a(l) p Fc 420 373 a(1) p Fk 442 366 +a(:) p Fg 455 366 a(e) p Ff 478 373 a(1) p Fg 506 366 +a(:) p 528 366 a(:) p 550 366 a(:) p Fi 571 366 a(l) p +Fc 587 373 a(n) p Fk 612 366 a(:) p Fg 625 366 a(e) p +Fb 648 373 a(n) p Fj 515 427 a(!) p Fk 579 427 a(\() p +Fg(e) p Fk([) p Fg(e) p Fb 658 434 a(i) p Fg 671 427 +a(=x) p Fk(]) p Fi 752 427 a(l) p Fc 768 434 a(1) p Fk +790 427 a(:) p Fg(e) p Ff 827 434 a(1) p Fg 855 427 a(:) p +877 427 a(:) p 899 427 a(:) p Fi 920 427 a(l) p Fc 936 +434 a(i) p Fd(\000) p Fc(1) p Fk 997 427 a(:) p Fg 1010 +427 a(e) p Fb 1033 434 a(i) p Fd(\000) p Ff(1) p Fi 1108 +427 a(l) p Fc 1124 434 a(i) p Ff(+) p Fc(1) p Fk 1185 +427 a(:) p Fg(e) p Fb 1222 434 a(i) p Ff(+1) p Fg 1289 +427 a(:) p 1311 427 a(:) p 1333 427 a(:) p Fi 1354 427 +a(l) p Fc 1370 434 a(n) p Fk 1395 427 a(:) p Fg 1408 +427 a(e) p Fb 1431 434 a(n) p Fk 86 487 a(\() p Fe(fun) p +Fk 198 487 a(?) p Fi(l) p Fc 237 494 a(i) p Fk 250 487 +a(:) p Fg(x) p Fj 305 487 a(!) p Fg 369 487 a(e) p Fk(\)) p +Fi 427 487 a(l) p Fc 443 494 a(1) p Fk 465 487 a(:) p +Fg 478 487 a(e) p Ff 501 494 a(1) p Fg 529 487 a(:) p +551 487 a(:) p 573 487 a(:) p Fi 594 487 a(l) p Fc 610 +494 a(n) p Fk 635 487 a(:) p Fg 648 487 a(e) p Fb 671 +494 a(n) p Fj 515 547 a(!) p Fg 579 547 a(e) p Fk([) p +Fe(Some) p Fk 717 547 a(\() p Fg(e) p Fb 759 554 a(i) p +Fk 773 547 a(\)) p Fg(=x) p Fk(]) p Fi 874 547 a(l) p +Fc 890 554 a(1) p Fk 912 547 a(:) p Fg 925 547 a(e) p +Ff 948 554 a(1) p Fg 976 547 a(:) p 998 547 a(:) p 1020 +547 a(:) p Fi 1042 547 a(l) p Fc 1058 554 a(i) p Fd(\000) p +Fc(1) p Fk 1118 547 a(:) p Fg(e) p Fb 1155 554 a(i) p +Fd(\000) p Ff(1) p Fi 1230 547 a(l) p Fc 1246 554 a(i) p +Ff(+) p Fc(1) p Fk 1307 547 a(:) p Fg 1320 547 a(e) p +Fb 1343 554 a(i) p Ff(+1) p Fg 1410 547 a(:) p 1432 547 +a(:) p 1454 547 a(:) p Fi 1476 547 a(l) p Fc 1492 554 +a(n) p Fk 1516 547 a(:) p Fg(e) p Fb 1553 554 a(n) p +Fk 86 607 a(\() p Fe(fun) p Fk 198 607 a(?) p Fi(l) p +Fk(:) p Fg 250 607 a(x) p Fj 292 607 a(!) p Fg 356 607 +a(e) p Fk(\)) p Fi 413 607 a(l) p Fc 429 614 a(1) p Fk +451 607 a(:) p Fg(e) p Ff 488 614 a(1) p Fg 516 607 a(:) p +538 607 a(:) p 560 607 a(:) p Fi 581 607 a(l) p Fc 597 +614 a(n) p Fk 621 607 a(:) p Fg(e) p Fb 658 614 a(n) p +Fk 1154 607 a(when) p Fi 1281 607 a(l) p Fc 1297 614 +a(i) p Fk 1324 607 a(=) p Fj 1376 607 a(;) p Fk 1417 +607 a(and) p Fg 1512 607 a(l) p Fj 1541 607 a(62) p 1588 +607 a(f) p Fi(l) p Fc 1629 614 a(1) p Fg 1660 607 a(:) p +1682 607 a(:) p 1704 607 a(:) p Fi 1725 607 a(l) p Fc +1741 614 a(n) p Fj 1765 607 a(g) 515 667 y(!) p Fg 579 +667 a(e) p Fk([) p Fe(None) p Fg 717 667 a(=x) p Fk(]) p +Fi 799 667 a(l) p Fc 815 674 a(1) p Fk 837 667 a(:) p +Fg(e) p Ff 874 674 a(1) p Fg 901 667 a(:) p 923 667 a(:) p +945 667 a(:) p Fi 967 667 a(l) p Fc 983 674 a(n) p Fk +1007 667 a(:) p Fg(e) p Fb 1044 674 a(n) p Fk 86 728 +a(\(\() p Fe(fun) p Fi 217 728 a(l) p Fk(:) p Fg 246 +728 a(x) p Fj 288 728 a(!) p Fg 352 728 a(e) p Fk(\)) p +Fi 409 728 a(l) p Fc 425 735 a(1) p Fk 447 728 a(:) p +Fg(e) p Ff 484 735 a(1) p Fg 511 728 a(:) p 533 728 a(:) p +555 728 a(:) p Fi 577 728 a(l) p Fc 593 735 a(m) p Fk +629 728 a(:) p Fg 642 728 a(e) p Fb 665 735 a(m) p Fk +698 728 a(\)) p Fi 733 728 a(l) p Fc 749 735 a(m) p Ff(+) p +Fc(1) p Fk 833 728 a(:) p Fg 846 728 a(e) p Fb 869 735 +a(m) p Ff(+1) p Fg 955 728 a(:) p 977 728 a(:) p 999 +728 a(:) p Fi 1021 728 a(l) p Fc 1037 735 a(n) p Fk 1061 +728 a(:) p Fg(e) p Fb 1098 735 a(n) p Fk 1373 728 a(when) p +Fi 1501 728 a(l) p Fj 1530 728 a(62) p 1577 728 a(f) p +Fi(l) p Fc 1618 735 a(1) p Fg 1648 728 a(:) p 1670 728 +a(:) p 1692 728 a(:) p Fi 1714 728 a(l) p Fc 1730 735 +a(m) p Fj 1765 728 a(g) 515 788 y(!) p Fk 579 788 a(\() p +Fe(fun) p Fi 691 788 a(l) p Fk(:) p Fg 720 788 a(x) p +Fj 761 788 a(!) p Fg 825 788 a(e) p Fk(\)) p Fi 883 788 +a(l) p Fc 899 795 a(1) p Fk 921 788 a(:) p Fg 934 788 +a(e) p Ff 957 795 a(1) p Fg 985 788 a(:) p 1007 788 a(:) p +1029 788 a(:) p Fi 1051 788 a(l) p Fc 1067 795 a(n) p +Fk 1091 788 a(:) p Fg 1104 788 a(e) p Fb 1127 795 a(n) p +Fk 86 848 a(\(\() p Fe(fun) p Fk 217 848 a(?) p Fi(l) p +Fk(:) p Fg 269 848 a(x) p Fj 311 848 a(!) p Fg 375 848 +a(e) p Fk(\)) p Fi 432 848 a(l) p Fc 448 855 a(1) p Fk +470 848 a(:) p Fg(e) p Ff 507 855 a(1) p Fg 535 848 a(:) p +557 848 a(:) p 579 848 a(:) p Fi 600 848 a(l) p Fc 616 +855 a(m) p Fk 652 848 a(:) p Fg 665 848 a(e) p Fb 688 +855 a(m) p Fk 721 848 a(\)) p Fi 756 848 a(l) p Fc 772 +855 a(m) p Ff(+) p Fc(1) p Fk 856 848 a(:) p Fg 869 848 +a(e) p Fb 892 855 a(m) p Ff(+1) p Fg 978 848 a(:) p 1000 +848 a(:) p 1022 848 a(:) p Fi 1044 848 a(l) p Fc 1060 +855 a(n) p Fk 1084 848 a(:) p Fg(e) p Fb 1121 855 a(n) p +Fk 1261 848 a(when) p Fj 1388 848 a(f) p Fi(l) p Fg(;) p +Fj 1451 848 a(;g) p 1530 848 a(6) m(\\) p 1577 848 a(f) p +Fi(l) p Fc 1618 855 a(1) p Fg 1648 848 a(:) p 1670 848 +a(:) p 1692 848 a(:) p Fi 1714 848 a(l) p Fc 1730 855 +a(m) p Fj 1765 848 a(g) 515 908 y(!) p Fk 579 908 a(\() p +Fe(fun) p Fk 691 908 a(?) p Fi(l) p Fk(:) p Fg 743 908 +a(x) p Fj 785 908 a(!) p Fg 848 908 a(e) p Fk(\)) p Fi +906 908 a(l) p Fc 922 915 a(1) p Fk 944 908 a(:) p Fg(e) p +Ff 981 915 a(1) p Fg 1008 908 a(:) p 1030 908 a(:) p +1052 908 a(:) p Fi 1074 908 a(l) p Fc 1090 915 a(n) p +Fk 1114 908 a(:) p Fg 1127 908 a(e) p Fb 1150 915 a(n) p +Fi 11 1035 a(T) n(yping) p Fk 11 1127 a(Seman) o(tics) p +240 1127 a(are) p 321 1127 a(k) o(ept) p 430 1127 a(throughout) p +685 1127 a(compilation) p 950 1127 a(b) o(y) p 1018 1127 +a(disallo) o(wing) p 1269 1127 a(lab) q(el) p 1387 1127 +a(comm) o(utation) p 1684 1127 a(for) p 1759 1127 a(func-) 11 +1187 y(tion) p 116 1187 a(t) o(yp) q(es.) p 278 1187 +a(Ho) o(w) o(ev) o(er,) p 494 1187 a(the) p 583 1187 +a(original) p 764 1187 a(comfort) p 949 1187 a(of) p +1009 1187 a(out-of-order) p 1283 1187 a(application) p +1540 1187 a(is) p 1594 1187 a(reco) o(v) o(ered) p 1814 +1187 a(b) o(y) 11 1247 y(allo) o(wing) p 207 1247 a(argumen) o(t) p +431 1247 a(reordering) p 670 1247 a(in) p 732 1247 a(application,) p +1005 1247 a(when) p 1138 1247 a(the) p 1227 1247 a(function's) p +1457 1247 a(t) o(yp) q(e) p 1572 1247 a(is) p Fh 1626 +1247 a(wel) r(l) p 1731 1247 a(known) p Fk 11 1308 a(\() p +Fh(c.f.) p Fk 118 1308 a(p) q(olymorphic) p 400 1308 +a(metho) q(ds\).) p Fl 11 1452 a(V) p 56 1452 a(arian) n(ts) p +Fk 11 1544 a(V) l(arian) o(t) p 187 1544 a(t) o(yping,) p +355 1544 a(as) p 417 1544 a(it) p 468 1544 a(is) p 519 +1544 a(presen) o(ted) p 739 1544 a(in) p 798 1544 a(the) p +884 1544 a(user's) p 1022 1544 a(man) o(ual,) p 1210 +1544 a(is) p 1261 1544 a(not) p 1350 1544 a(principal:) p +1576 1544 a(in) p 1635 1544 a(some) p 1760 1544 a(cases) 11 +1605 y(t) o(ypabilit) o(y) p 239 1605 a(of) p 301 1605 +a(an) p 375 1605 a(expression) p 616 1605 a(ma) o(y) p +728 1605 a(dep) q(end) p 904 1605 a(on) p 978 1605 a(the) p +1069 1605 a(order) p 1202 1605 a(in) p 1265 1605 a(whic) o(h) p +1411 1605 a(the) p 1502 1605 a(t) o(yping) p 1660 1605 +a(algorithm) 11 1665 y(pro) q(ceeds.) p Fe 133 1779 a(#) p +184 1779 a(let) p 286 1779 a(f1) p 363 1779 a(\(x) p +440 1779 a(:) p 491 1779 a([<) p 568 1779 a(a) p 620 +1779 a(b\(int\)]\)) p 850 1779 a(=) p 902 1779 a(\(\)) 184 +1839 y(let) p 286 1839 a(f2) p 363 1839 a(\(x) p 440 +1839 a(:) p 491 1839 a([<) p 568 1839 a(a]\)) p 671 1839 +a(=) p 722 1839 a(\(\)) 184 1899 y(let) p 286 1899 a(f3) p +363 1899 a(\(x) p 440 1899 a(:) p 491 1899 a([<) p 568 +1899 a(a) p 620 1899 a(b\(bool\)]\)) p 876 1899 a(=) p +927 1899 a(\(\);;) 133 1960 y(val) p 235 1960 a(f1) p +312 1960 a(:) p 363 1960 a([<) p 440 1960 a(a) p 491 +1960 a(b\(int\)]) p 696 1960 a(->) p 773 1960 a(unit) p +902 1960 a(=) p 953 1960 a(<fun>) 133 2020 y(val) p 235 +2020 a(f2) p 312 2020 a(:) p 363 2020 a([<) p 440 2020 +a(a]) p 517 2020 a(->) p 594 2020 a(unit) p 722 2020 +a(=) p 773 2020 a(<fun>) 133 2080 y(val) p 235 2080 a(f3) p +312 2080 a(:) p 363 2080 a([<) p 440 2080 a(a) p 491 +2080 a(b\(bool\)]) p 722 2080 a(->) p 799 2080 a(unit) p +927 2080 a(=) p 978 2080 a(<fun>) 133 2140 y(#) p 184 +2140 a(fun) p 286 2140 a(x) p 338 2140 a(->) p 414 2140 +a(f1) p 491 2140 a(x;) p 568 2140 a(f2) p 645 2140 a(x;) p +722 2140 a(f3) p 799 2140 a(x;;) 133 2200 y(-) p 184 +2200 a(:) p 235 2200 a([<) p 312 2200 a(a]) p 389 2200 +a(->) p 466 2200 a(unit) p 594 2200 a(=) p 645 2200 a(<fun>) 133 +2260 y(#) p 184 2260 a(fun) p 286 2260 a(x) p 338 2260 +a(->) p 414 2260 a(f1) p 491 2260 a(x;) p 568 2260 a(f3) p +645 2260 a(x;;) 133 2321 y(Character) o(s) p 414 2321 +a(18-19:) 133 2381 y(This) p 261 2381 a(expressio) o(n) p +543 2381 a(has) p 645 2381 a(type) p 773 2381 a([<) p +850 2381 a(a) p 902 2381 a(b\(int\)]) p 1107 2381 a(but) p +1209 2381 a(is) p 1286 2381 a(here) p 1414 2381 a(used) p +1542 2381 a(with) p 1670 2381 a(type) 184 2441 y([<) p +261 2441 a(a) p 312 2441 a(b\(bool\)]) p Fk 84 2555 a(Here) p +204 2555 a(the) p 292 2555 a(constrain) o(t) p 526 2555 +a(in) o(tro) q(duced) p 775 2555 a(b) o(y) p Fe 848 2555 +a(f2) p Fk 920 2555 a(hides) p 1049 2555 a(the) p 1138 +2555 a(constructor) p Fe 1401 2555 a(b) p Fk(,) p 1462 +2555 a(and) p 1562 2555 a(a) o(v) o(oids) p 1714 2555 +a(a) p 1760 2555 a(clash) 11 2615 y(b) q(et) o(w) o(een) p +Fe 199 2615 a(int) p Fk 292 2615 a(and) p Fe 387 2615 +a(bool) p Fk(.) 84 2676 y(An) p 163 2676 a(easy) p 270 +2676 a(w) o(a) o(y) p 369 2676 a(to) p 428 2676 a(solv) o(e) p +547 2676 a(this) p 642 2676 a(w) o(ould) p 784 2676 a(b) q(e) p +850 2676 a(to) p 909 2676 a(restrict) p 1077 2676 a(hiding) p +1226 2676 a(absen) o(t) p 1379 2676 a(lab) q(els) p 1515 +2676 a(to) p 1575 2676 a(generic) p 1739 2676 a(t) o(yp) q(es.) 11 +2736 y(This) p 124 2736 a(w) o(a) o(y) p 224 2736 a(the) p +310 2736 a(second) p 469 2736 a(case) p 574 2736 a(w) o(ould) p +718 2736 a(still) p 814 2736 a(fail,) p 913 2736 a(since) p +Fe 1034 2736 a(x) p Fk 1077 2736 a(has) p 1166 2736 a(a) p +1208 2736 a(monorphic) p 1451 2736 a(t) o(yp) q(e.) p +1584 2736 a(This) p 1697 2736 a(solution) 11 2796 y(w) o(ould) p +153 2796 a(b) q(e) p 219 2796 a(correct) p 382 2796 a(and) p +477 2796 a(principal.) 926 2937 y(2) p eop +PStoPSsaved restore +%%Page: (2,3) 2 +userdict/PStoPSsaved save put +PStoPSmatrix setmatrix +595.000000 0.271378 translate +90 rotate +0.706651 dup scale +userdict/PStoPSmatrix matrix currentmatrix put +userdict/PStoPSclip{0 0 moveto + 595.000000 0 rlineto 0 842.000000 rlineto -595.000000 0 rlineto + closepath}put initclip +/showpage{}def/copypage{}def/erasepage{}def +PStoPSxform concat +3 2 bop Fk 84 168 a(Ho) o(w) o(ev) o(er,) p 293 168 a(one) p +382 168 a(can) p 472 168 a(easily) p 606 168 a(see) p +684 168 a(that) p 789 168 a(this) p 884 168 a(solution) p +1068 168 a(is) p 1117 168 a(coun) o(ter-in) o(tuitiv) o(e.) p +1504 168 a(F) l(or) p 1591 168 a(the) p 1675 168 a(user,) p +Fe 1791 168 a(b) p Fk 1833 168 a(is) 11 229 y(already) p +183 229 a(an) p 250 229 a(imp) q(ossible) p 488 229 a(constructor,) p +759 229 a(and) p 854 229 a(ha) o(ving) p 1011 229 a(a) p +1052 229 a(clash) p 1174 229 a(on) p 1242 229 a(it) p +1291 229 a(is) p 1340 229 a(hard) p 1453 229 a(to) p +1513 229 a(understand.) 84 289 y(Another) p 277 289 a(solution) p +463 289 a(is) p 514 289 a(to) p 575 289 a(go) p 642 289 +a(the) p 728 289 a(opp) q(osite) p 924 289 a(w) o(a) o(y) l(.) p +1044 289 a(T) l(o) p 1117 289 a(accept) p 1271 289 a(more) p +1395 289 a(programs.) p 1634 289 a(This) p 1747 289 a(is) p +1798 289 a(the) 11 349 y(w) o(a) o(y) p 109 349 a(w) o(e) p +181 349 a(explore) p 351 349 a(here,) p 470 349 a(with) p +581 349 a(an) p 649 349 a(unc) o(hanged) p 891 349 a(syn) o(tax.) p +Fi 11 479 a(T) n(yping) p Fk 11 571 a(The) p 114 571 +a(idea) p 220 571 a(is) p 273 571 a(to) p 336 571 a(dela) o(y) p +466 571 a(uni\014cation) p 711 571 a(on) p 782 571 a(constructor) p +1043 571 a(un) o(til) p 1161 571 a(they) p 1274 571 a(are) p +1359 571 a(explicitely) p 1595 571 a(kno) o(wn) p 1753 +571 a(to) p 1816 571 a(b) q(e) 11 631 y(presen) o(t.) p +199 631 a(W) l(e) p 280 631 a(k) o(eep) p 390 631 a(the) p +472 631 a(\() p Fg(T) t(;) p 546 631 a(U;) p 601 631 +a(L) p Fk(\)) p 666 631 a(represen) o(tation) p 983 631 +a(of) p 1036 631 a(v) m(arian) o(t) p 1200 631 a(t) o(yp) q(es,) p +1341 631 a(but) p Fg 1428 631 a(T) p Fk 1478 631 a(is) p +1525 631 a(no) p 1591 631 a(longer) p 1735 631 a(a) p +1774 631 a(map) 11 692 y(from) p 126 692 a(constructors) p +403 692 a(to) p 462 692 a(t) o(yp) q(es,) p 605 692 a(but) p +694 692 a(from) p 809 692 a(constructors) p 1086 692 +a(to) p 1146 692 a(sets) p 1241 692 a(of) p 1297 692 +a(t) o(yp) q(es.) 84 752 y(When) p 230 752 a(w) o(e) p +307 752 a(unify) p 436 752 a(t) o(w) o(o) p 532 752 a(v) m(arian) o(t) p +702 752 a(t) o(yp) q(es,) p 850 752 a(the) p 938 752 +a(\014rst) p 1043 752 a(step) p 1150 752 a(is) p 1204 +752 a(just) p 1305 752 a(to) p 1369 752 a(tak) o(e) p +1479 752 a(the) p 1567 752 a(union) p 1707 752 a(of) p +1767 752 a(b) q(oth) 11 812 y(t) o(yping) p 162 812 a(en) o(vironmen) o +(ts,) p 476 812 a(dropping) p 682 812 a(unnecessary) p +952 812 a(t) o(yp) q(es.) 204 932 y(\() p Fg(T) p Ff +252 939 a(1) p Fg 272 932 a(;) p 294 932 a(U) p Ff 327 +939 a(1) p Fg 346 932 a(;) p 368 932 a(L) p Ff 401 939 +a(1) p Fk 421 932 a(\)) p Fj 451 932 a(^) p Fk 495 932 +a(\() p Fg(T) p Ff 543 939 a(2) p Fg 563 932 a(;) p 585 +932 a(U) p Ff 618 939 a(2) p Fg 637 932 a(;) p 659 932 +a(L) p Ff 692 939 a(2) p Fk 712 932 a(\)) p 745 932 a(=) p +797 932 a(\(\() p Fg(T) p Ff 864 939 a(1) p Fj 883 932 +a(j) p Fb 897 939 a(U) p Fa 921 944 a(1) p Fd 938 939 +a(\\) p Fb(U) p Fa 986 944 a(2) p Fk 1005 932 a(\)) p +Fj 1035 932 a([) p Fk 1079 932 a(\() p Fg(T) p Ff 1127 +939 a(2) p Fj 1146 932 a(j) p Fb 1160 939 a(U) p Fa 1184 +944 a(1) p Fd 1201 939 a(\\) p Fb(U) p Fa 1249 944 a(2) p +Fk 1268 932 a(\)) p Fg(;) p 1309 932 a(U) p Ff 1342 939 +a(1) p Fj 1373 932 a(\\) p Fg 1417 932 a(U) p Ff 1450 +939 a(2) p Fg 1470 932 a(;) p 1492 932 a(L) p Ff 1525 +939 a(1) p Fj 1556 932 a([) p Fg 1600 932 a(L) p Ff 1633 +939 a(2) p Fk 1653 932 a(\)) 84 1042 y(Here) p 203 1042 +a(the) p 291 1042 a(union) p 431 1042 a(of) p 490 1042 +a(t) o(w) o(o) p 587 1042 a(t) o(yping) p 742 1042 a(en) o(vironmen) o +(ts) p 1046 1042 a(is) p 1099 1042 a(the) p 1187 1042 +a(p) q(oin) o(t) o(wise) p 1407 1042 a(union) p 1547 +1042 a(of) p 1606 1042 a(their) p 1727 1042 a(sets) p +1826 1042 a(of) 11 1102 y(t) o(yp) q(es) p 140 1102 a(for) p +214 1102 a(eac) o(h) p 324 1102 a(constructor.) 84 1162 +y(This) p 195 1162 a(\014rst) p 296 1162 a(step) p 399 +1162 a(nev) o(er) p 529 1162 a(fails.) 84 1222 y(In) p +145 1222 a(a) p 186 1222 a(second) p 343 1222 a(step,) p +460 1222 a(structural) p 685 1222 a(constrain) o(ts) p +934 1222 a(are) p 1015 1222 a(enforced) p 1209 1222 a(on) p +1277 1222 a(the) p 1361 1222 a(resulting) p 1562 1222 +a(t) o(yp) q(e) p 1672 1222 a(\() p Fg(T) t(;) p 1746 +1222 a(U;) p 1801 1222 a(L) p Fk(\).) 11 1282 y(First,) p +Fg 144 1282 a(L) p Fk 195 1282 a(should) p 351 1282 a(b) q(e) p +418 1282 a(included) p 614 1282 a(in) p Fg 672 1282 a(U) p +Fk 710 1282 a(.) p 749 1282 a(Then,) p 892 1282 a(for) p +967 1282 a(all) p 1036 1282 a(constructors) p 1314 1282 +a(app) q(earing) p 1542 1282 a(in) p Fg 1600 1282 a(L) p +Fk(,) p 1664 1282 a(the) p 1749 1282 a(set) p 1826 1282 +a(of) 11 1343 y(t) o(yp) q(es) p 136 1343 a(asso) q(ciated) p +365 1343 a(with) p 472 1343 a(eac) o(h) p 578 1343 a(constructor) p +833 1343 a(is) p 878 1343 a(collapsed) p 1084 1343 a(b) o(y) p +1148 1343 a(uni\014cation.) p 1407 1343 a(This) p 1515 +1343 a(can) p 1600 1343 a(b) q(e) p 1663 1343 a(expressed) 11 +1403 y(b) o(y) p 78 1403 a(rewriting) p 287 1403 a(rules,) p +417 1403 a(where) p Fg 558 1403 a(e) p Fk 597 1403 a(is) p +646 1403 a(a) p 687 1403 a(m) o(ulti-equation) p 1015 +1403 a(and) p Fg 1109 1403 a(\036) p Fk 1155 1403 a(a) p +1195 1403 a(set) p 1271 1403 a(of) p 1327 1403 a(m) o(ultiequations) 249 +1509 y(if) p Fg 294 1509 a(L) p Fj 341 1509 a(6\032) p +Fg 393 1509 a(U) p Fk 448 1509 a(then) p 559 1509 a(\() p +Fg(T) t(;) p 633 1509 a(U;) p 688 1509 a(L) p Fk(\)) p +753 1509 a(=) p Fg 805 1509 a(e) p Fj 839 1509 a(^) p +Fg 883 1509 a(\036) p Fj 926 1509 a(\000) p 956 1509 +a(!) p 1020 1509 a(?) p Fk 249 1629 a(if) p Fg 294 1629 +a(l) p Fj 323 1629 a(2) p Fg 370 1629 a(L) p Fk 420 1629 +a(and) p Fg 515 1629 a(T) p Fk 551 1629 a(\() p Fg(l) p +Fk 586 1629 a(\)) p 617 1629 a(=) p Fj 669 1629 a(f) p +Fg(\034) p Ff 715 1636 a(1) p Fg 735 1629 a(;) p 757 +1629 a(:) p 779 1629 a(:) p 801 1629 a(:) p 822 1629 +a(;) p 844 1629 a(\034) p Fb 865 1636 a(n) p Fj 889 1629 +a(g) p Fk 930 1629 a(then) 298 1689 y(\() p Fg(T) t(;) p +372 1689 a(U;) p 427 1689 a(L) p Fk(\)) p 492 1689 a(=) p +Fg 544 1689 a(e) p Fj 577 1689 a(^) p Fg 622 1689 a(\036) p +Fj 664 1689 a(\000) p 695 1689 a(!) p Fk 759 1689 a(\() p +Fg(T) p Fj 814 1689 a(f) p Fg(l) p Fj 867 1689 a(7!) p +Fg 931 1689 a(\034) p Ff 952 1696 a(1) p Fj 972 1689 +a(g) p Fg(;) p 1019 1689 a(U;) p 1074 1689 a(L) p Fk(\)) p +1139 1689 a(=) p Fg 1191 1689 a(e) p Fj 1225 1689 a(^) p +Fg 1269 1689 a(\034) p Ff 1290 1696 a(1) p Fk 1324 1689 +a(=) p Fg 1376 1689 a(:) p 1398 1689 a(:) p 1420 1689 +a(:) p Fk 1447 1689 a(=) p Fg 1498 1689 a(\034) p Fb +1519 1696 a(n) p Fj 1554 1689 a(^) p Fg 1598 1689 a(\036) p +Fk 84 1796 a(Optionally) p 331 1796 a(one) p 425 1796 +a(can) p 519 1796 a(add) p 619 1796 a(rules) p 740 1796 +a(that) p 850 1796 a(remo) o(v) o(e) p 1022 1796 a(a) p +1067 1796 a(constructor) p Fg 1329 1796 a(l) p Fk 1366 +1796 a(from) p Fg 1486 1796 a(U) p Fk 1545 1796 a(if) p +1594 1796 a(the) p 1683 1796 a(equation) 11 1856 y(obtained) p +211 1856 a(from) p Fg 326 1856 a(T) p Fk 362 1856 a(\() p +Fg(l) p Fk 397 1856 a(\)) p 431 1856 a(has) p 518 1856 +a(no) p 586 1856 a(solution.) p 790 1856 a(Suc) o(h) p +908 1856 a(rules) p 1024 1856 a(w) o(ould) p 1167 1856 +a(b) q(e) p 1233 1856 a(sound) p 1374 1856 a(and) p 1469 +1856 a(complete.) p Fi 11 1986 a(Syn) n(tax) p 198 1986 +a(of) p 262 1986 a(t) n(yp) r(es) p Fk 11 2078 a(Thanks) p +188 2078 a(to) p 250 2078 a(the) p 336 2078 a(go) q(o) q(d) p +458 2078 a(prop) q(erties) p 689 2078 a(of) p 747 2078 +a(these) p 874 2078 a(constrain) o(ts,) p 1139 2078 a(the) p +1226 2078 a(surface) p 1392 2078 a(syn) o(tax) p 1551 +2078 a(of) p 1608 2078 a(t) o(yp) q(es) p 1740 2078 a(w) o(ould) 11 +2138 y(only) p 118 2138 a(ha) o(v) o(e) p 230 2138 a(to) p +290 2138 a(b) q(e) p 356 2138 a(sligh) o(tly) p 527 2138 +a(extended.) p Fh 590 2244 a(tag-typ) n(e) p Fk 798 2244 +a(::=) p Fh 904 2244 a(ident) p Fj 849 2304 a(j) p Fh +904 2304 a(ident) p Fe 1031 2304 a(\() p Fh(typ) n(expr-list) p +Fe(\)) p Fh 523 2365 a(typ) n(expr-list) p Fk 798 2365 +a(::=) p Fh 904 2365 a(typ) n(expr) p Fj 849 2425 a(j) p +Fh 904 2425 a(typ) n(expr) p Fe 1078 2425 a(&) p Fh 1120 +2425 a(typ) n(expr-list) p Fk 84 2531 a(Notice) p 234 +2531 a(that) p 336 2531 a(a) p 373 2531 a(0-ary) p 496 +2531 a(constructor) p 751 2531 a(and) p 842 2531 a(an) p +907 2531 a(1-ary) p 1030 2531 a(construtor) p 1262 2531 +a(are) p 1340 2531 a(con) o(tradictory) l(,) p 1648 2531 +a(and) p 1740 2531 a(w) o(ould) 11 2592 y(result) p 146 +2592 a(in) p 203 2592 a(the) p 287 2592 a(absence) p +466 2592 a(of) p 522 2592 a(this) p 617 2592 a(constructor.) 926 +2937 y(3) p eop +PStoPSsaved restore +userdict/PStoPSsaved save put +PStoPSmatrix setmatrix +595.000000 421.271378 translate +90 rotate +0.706651 dup scale +userdict/PStoPSmatrix matrix currentmatrix put +userdict/PStoPSclip{0 0 moveto + 595.000000 0 rlineto 0 842.000000 rlineto -595.000000 0 rlineto + closepath}put initclip +PStoPSxform concat +4 3 bop Fi 11 168 a(Discussion) p Fk 11 261 a(Suc) o(h) p +133 261 a(a) p 179 261 a(c) o(hange) p 345 261 a(has) p +436 261 a(the) p 525 261 a(ma) s(jor) p 672 261 a(adv) m(an) o(tage) p +907 261 a(of) p 967 261 a(b) q(oth) p 1087 261 a(reco) o(v) o(ering) p +1324 261 a(principalit) o(y) p 1589 261 a(and) p 1688 +261 a(a) o(v) o(oiding) 11 321 y(unin) o(tuitiv) o(e) p +266 321 a(error) p 392 321 a(messages.) p 640 321 a(Constrain) o(ts) p +909 321 a(created) p 1087 321 a(in) p 1152 321 a(suc) o(h) p +1269 321 a(a) p 1317 321 a(w) o(a) o(y) p 1423 321 a(are) p +1512 321 a(v) o(ery) p 1626 321 a(ligh) o(t:) p 1772 +321 a(they) 11 381 y(alw) o(a) o(ys) p 165 381 a(app) q(ear) p +325 381 a(inside) p 463 381 a(a) p 502 381 a(v) m(arian) o(t) p +666 381 a(t) o(yp) q(e,) p 788 381 a(and) p 882 381 a(if) p +926 381 a(the) p 1008 381 a(v) m(arian) o(t) p 1172 381 +a(t) o(yp) q(e) p 1281 381 a(do) q(es) p 1390 381 a(not) p +1475 381 a(app) q(ear) p 1635 381 a(in) p 1691 381 a(the) p +1774 381 a(\014nal) 11 441 y(t) o(yp) q(e) p 120 441 +a(sc) o(heme,) p 301 441 a(then) p 412 441 a(the) p 496 +441 a(constrain) o(t) p 725 441 a(can) p 815 441 a(b) q(e) p +881 441 a(discarded) p 1098 441 a(safely) l(.) 84 501 +y(On) p 165 501 a(the) p 249 501 a(other) p 376 501 a(hand,) p +512 501 a(there) p 637 501 a(are) p 718 501 a(t) o(w) o(o) p +810 501 a(dra) o(wbac) o(ks.) p Fj 83 616 a(\017) p Fk +133 616 a(Some) p 259 616 a(errors) p 393 616 a(will) p +482 616 a(b) q(e) p 544 616 a(dela) o(y) o(ed) p 715 +616 a(longer) p 858 616 a(than) p 968 616 a(no) o(w,) p +1080 616 a(un) o(til) p 1191 616 a(a) p 1228 616 a(construtor) p +1460 616 a(is) p 1505 616 a(actually) p 1687 616 a(included) 133 +676 y(in) p Fg 189 676 a(L) p Fk(.) p 258 676 a(It) p +311 676 a(is) p 360 676 a(not) p 446 676 a(clear) p 563 +676 a(ho) o(w) p 665 676 a(damageable) p 930 676 a(it) p +979 676 a(is.) p Fj 83 777 a(\017) p Fk 133 777 a(While) p +272 777 a(t) o(yp) q(e) p 378 777 a(inference) p 579 +777 a(is) p 625 777 a(simple) p 774 777 a(and) p 865 +777 a(costless) p 1036 777 a(for) p 1108 777 a(this) p +1200 777 a(extension,) p 1426 777 a(simpli\014cation) p +1724 777 a(of) p 1776 777 a(con-) 133 838 y(strain) o(ts) p +310 838 a(|marking) p 551 838 a(constructors) p 830 838 +a(with) p 943 838 a(unsolv) m(able) p 1182 838 a(constrain) o(ts) p +1432 838 a(as) p 1494 838 a(absen) o(t,) p 1663 838 a(and) p +1760 838 a(elim-) 133 898 y(inating) p 300 898 a(redundan) o(t) p +536 898 a(t) o(yp) q(es) p 667 898 a(in) p 726 898 a(constrain) o(ts|) p +1025 898 a(is) p 1076 898 a(a) p 1119 898 a(bit) p 1197 +898 a(more) p 1320 898 a(exp) q(ensiv) o(e.) p 1565 898 +a(Also,) p 1691 898 a(allo) o(wing) 133 958 y(suc) o(h) p +244 958 a(constrained) p 506 958 a(t) o(yp) q(es) p 637 +958 a(inside) p 777 958 a(signatures) p 1010 958 a(w) o(ould) p +1154 958 a(mean) p 1286 958 a(ha) o(ving) p 1444 958 +a(to) p 1506 958 a(solv) o(e) p 1627 958 a(a) p 1669 +958 a(matc) o(hing) 133 1018 y(problem,) p 333 1018 a(whic) o(h) p +469 1018 a(is) p 514 1018 a(exp) q(onen) o(tial) p 772 +1018 a(in) p 825 1018 a(the) p 906 1018 a(n) o(um) o(b) q(er) p +1080 1018 a(of) p 1132 1018 a(connected) p 1356 1018 +a(constrain) o(ts) p 1600 1018 a(inside) p 1735 1018 +a(a) p 1772 1018 a(t) o(yp) q(e) 133 1078 y(sc) o(heme.) 84 +1193 y(Reasonably) p 340 1193 a(e\016cien) o(t) p 516 +1193 a(algorithms) p 754 1193 a(exist) p 866 1193 a(to) p +922 1193 a(solv) o(e) p 1038 1193 a(these) p 1159 1193 +a(problems,) p 1379 1193 a(so) p 1435 1193 a(the) p 1515 +1193 a(di\016cult) o(y) p 1715 1193 a(is) p 1760 1193 +a(more) 11 1253 y(in) p 67 1253 a(the) p 151 1253 a(increased) p +363 1253 a(complexit) o(y) p 611 1253 a(of) p 667 1253 +a(the) p 751 1253 a(t) o(yp) q(e-c) o(hec) o(k) o(er) p +1031 1253 a(than) p 1145 1253 a(in) p 1202 1253 a(run-time) p +1402 1253 a(cost.) p Fl 11 1397 a(Other) p 205 1397 a(features) p +Fk 11 1490 a(Ob) s(jectiv) o(e) p 238 1490 a(Lab) q(el) p +380 1490 a(con) o(tains) p 579 1490 a(t) o(w) o(o) p +678 1490 a(other) p 812 1490 a(features:) p 1029 1490 +a(p) q(olymorphic) p 1318 1490 a(metho) q(ds) p 1521 +1490 a(and) p 1623 1490 a(t) o(yp) q(e-driv) o(en) 11 +1550 y(access) p 153 1550 a(of) p 208 1550 a(records.) p +394 1550 a(Both) p 514 1550 a(of) p 568 1550 a(them) p +692 1550 a(use) p 775 1550 a(the) p 857 1550 a(same) p +978 1550 a(metho) q(d) p 1154 1550 a(of) p 1209 1550 +a(enforcing) p 1417 1550 a(principalit) o(y) p 1676 1550 +a(of) p 1730 1550 a(t) o(yping) 11 1610 y(through) p +191 1610 a(tracing) p 351 1610 a(user) p 450 1610 a(pro) o(vided) p +647 1610 a(t) o(yp) q(e) p 752 1610 a(information.) p +1034 1610 a(With) p 1155 1610 a(this) p 1246 1610 a(tracing,) p +1422 1610 a(their) p 1534 1610 a(implem) o(en) n(tation) 11 +1670 y(is) p 60 1670 a(v) o(ery) p 167 1670 a(easy) l(,) p +283 1670 a(but) p 373 1670 a(without) p 554 1670 a(it) p +603 1670 a(they) p 713 1670 a(lo) q(ose) p 834 1670 a(principalit) o(y) +l(.) 84 1730 y(While) p 229 1730 a(these) p 357 1730 +a(features) p 543 1730 a(pro) o(vide) p 720 1730 a(some) p +845 1730 a(comfort) p 1029 1730 a(in) p 1089 1730 a(writing) p +1260 1730 a(user) p 1366 1730 a(programs,) p 1598 1730 +a(they) p 1711 1730 a(are) p 1795 1730 a(not) 11 1791 +y(strictly) p 182 1791 a(necessary) p 403 1791 a(for) p +482 1791 a(the) p 571 1791 a(v) m(arious) p 742 1791 +a(libraries) p 934 1791 a(coming) p 1107 1791 a(with) p +1223 1791 a(O'Labl) p 1391 1791 a(\(LablTk,) p 1602 1791 +a(LablGL) p 1787 1791 a(and) 11 1851 y(LablGTK\).) 926 +2937 y(4) p eop +PStoPSsaved restore +%%Trailer +end +userdict /end-hook known{end-hook}if +%%EOF diff --git a/experimental/garrigue/nongeneral-let.diff b/experimental/garrigue/nongeneral-let.diff new file mode 100644 index 00000000..bcdc69e8 --- /dev/null +++ b/experimental/garrigue/nongeneral-let.diff @@ -0,0 +1,428 @@ +Index: camlp4/Camlp4/Struct/Grammar/Delete.ml +=================================================================== +--- camlp4/Camlp4/Struct/Grammar/Delete.ml (revision 14037) ++++ camlp4/Camlp4/Struct/Grammar/Delete.ml (working copy) +@@ -35,17 +35,17 @@ + open Structure; + + value raise_rule_not_found entry symbols = +- let to_string f x = ++ let to_string : !'a. (_ -> 'a -> _) -> 'a -> _ = fun [f -> fun [x -> + let buff = Buffer.create 128 in + let ppf = Format.formatter_of_buffer buff in + do { + f ppf x; + Format.pp_print_flush ppf (); + Buffer.contents buff +- } in +- let entry = to_string Print.entry entry in +- let symbols = to_string Print.print_rule symbols in +- raise (Rule_not_found (symbols, entry)) ++ }]] in ++ let entry = to_string Print.entry entry in ++ let symbols = to_string Print.print_rule symbols in ++ raise (Rule_not_found (symbols, entry)) + ; + + (* Deleting a rule *) +Index: camlp4/boot/Camlp4.ml +=================================================================== +--- camlp4/boot/Camlp4.ml (revision 14037) ++++ camlp4/boot/Camlp4.ml (working copy) +@@ -18022,7 +18022,7 @@ + open Structure + + let raise_rule_not_found entry symbols = +- let to_string f x = ++ let to_string : 'a. (_ -> 'a -> _) -> 'a -> _ = fun f x -> + let buff = Buffer.create 128 in + let ppf = Format.formatter_of_buffer buff + in +Index: camlp4/Camlp4Filters/Camlp4FoldGenerator.ml +=================================================================== +--- camlp4/Camlp4Filters/Camlp4FoldGenerator.ml (revision 14037) ++++ camlp4/Camlp4Filters/Camlp4FoldGenerator.ml (working copy) +@@ -547,14 +547,18 @@ + + value processor = + let last = ref <:ctyp<>> in +- let generate_class' generator default c s n = ++ let generate_class' ++ : !'a 'b. (_ -> 'a -> _ -> _ -> 'b) -> 'b -> 'a -> _ -> _ -> 'b = ++ fun generator default c s n -> + match s with + [ "Fold" -> generator Fold c last.val n + | "Map" -> generator Map c last.val n + | "FoldMap" -> generator Fold_map c last.val n + | _ -> default ] + in +- let generate_class_from_module_name generator c default m = ++ let generate_class_from_module_name ++ : !'a 'b. (_ -> 'a -> _ -> _ -> 'b) -> 'a -> 'b -> _ -> 'b = ++ fun generator c default m -> + try Scanf.sscanf m "Camlp4%[^G]Generator" begin fun m' -> + try Scanf.sscanf m' "%[^0-9]%d" (generate_class' generator default c) + with [ End_of_file | Scanf.Scan_failure _ -> generate_class' generator default c m' 1 ] +Index: stdlib/arg.ml +=================================================================== +--- stdlib/arg.ml (revision 14037) ++++ stdlib/arg.ml (working copy) +@@ -106,7 +106,7 @@ + let l = Array.length argv in + let b = Buffer.create 200 in + let initpos = !current in +- let stop error = ++ let stop : 'a. _ -> 'a = fun error -> + let progname = if initpos < l then argv.(initpos) else "(?)" in + begin match error with + | Unknown "-help" -> () +Index: stdlib/printf.ml +=================================================================== +--- stdlib/printf.ml (revision 14037) ++++ stdlib/printf.ml (working copy) +@@ -492,7 +492,7 @@ + Don't do this at home, kids. *) + let scan_format fmt args n pos cont_s cont_a cont_t cont_f cont_m = + +- let get_arg spec n = ++ let get_arg : 'a. _ -> _ -> 'a = fun spec n -> + Obj.magic (args.(Sformat.int_of_index (get_index spec n))) in + + let rec scan_positional n widths i = +Index: stdlib/camlinternalOO.ml +=================================================================== +--- stdlib/camlinternalOO.ml (revision 14037) ++++ stdlib/camlinternalOO.ml (working copy) +@@ -349,7 +349,7 @@ + init_table.env_init <- env_init + + let dummy_class loc = +- let undef = fun _ -> raise (Undefined_recursive_module loc) in ++ let undef : 'a 'b.'a -> 'b = fun _ -> raise (Undefined_recursive_module loc) in + (Obj.magic undef, undef, undef, Obj.repr 0) + + (**** Objects ****) +@@ -527,7 +527,7 @@ + | Closure of closure + + let method_impl table i arr = +- let next () = incr i; magic arr.(!i) in ++ let next : 'a. unit -> 'a = fun () -> incr i; magic arr.(!i) in + match next() with + GetConst -> let x : t = next() in get_const x + | GetVar -> let n = next() in get_var n +Index: stdlib/scanf.ml +=================================================================== +--- stdlib/scanf.ml (revision 14037) ++++ stdlib/scanf.ml (working copy) +@@ -1324,10 +1324,11 @@ + + let limr = Array.length rv - 1 in + +- let return v = Obj.magic v () in +- let delay f x () = f x in +- let stack f = delay (return f) in +- let no_stack f _x = f in ++ let return : 'a 'b 'c. ('a -> 'b) -> 'c = fun v -> Obj.magic v () in ++ let delay : 'a 'b. ('a -> 'b) -> 'a -> unit -> 'b = fun f x () -> f x in ++ let stack : 'a 'b 'd 'e. ('a -> 'b) -> 'd -> unit -> 'e = ++ fun f -> delay (return f) in ++ let no_stack : 'a 'b. 'a -> 'b -> 'a = fun f _x -> f in + + let rec scan fmt = + +@@ -1380,7 +1381,8 @@ + scan_conversion skip width_opt prec_opt ir f i + + and scan_conversion skip width_opt prec_opt ir f i = +- let stack = if skip then no_stack else stack in ++ let stack : 'b 'd. (unit -> 'b) -> 'd -> unit -> 'b = ++ if skip then no_stack else stack in + let width = int_of_width_opt width_opt in + let prec = int_of_prec_opt prec_opt in + match Sformat.get fmt i with +Index: typing/typemod.ml +=================================================================== +--- typing/typemod.ml (revision 14037) ++++ typing/typemod.ml (working copy) +@@ -420,7 +420,7 @@ + + (* let signature sg = List.map (fun item -> item.sig_type) sg *) + +-let rec transl_modtype env smty = ++let rec transl_modtype env smty : Typedtree.module_type = + let loc = smty.pmty_loc in + match smty.pmty_desc with + Pmty_ident lid -> +@@ -609,7 +609,7 @@ + List.fold_left + (fun env (id, _, mty) -> Env.add_module id mty.mty_type env) + env curr in +- let transition env_c curr = ++ let transition : 'a. _ -> (_ * _ * 'a) list -> _ = fun env_c curr -> + List.map2 + (fun (_,smty) (id,id_loc,mty) -> (id, id_loc, transl_modtype env_c smty)) + sdecls curr in +Index: typing/typecore.ml +=================================================================== +--- typing/typecore.ml (revision 14037) ++++ typing/typecore.ml (working copy) +@@ -1373,9 +1373,9 @@ + + let ty_arrow gty ty = newty (Tarrow ("", instance_def gty, ty, Cok)) in + +- let bad_conversion fmt i c = ++ let bad_conversion : 'a. string -> int -> char -> 'a = fun fmt i c -> + raise (Error (loc, Env.empty, Bad_conversion (fmt, i, c))) in +- let incomplete_format fmt = ++ let incomplete_format : 'a. string -> 'a = fun fmt -> + raise (Error (loc, Env.empty, Incomplete_format fmt)) in + + let rec type_in_format fmt = +@@ -3238,7 +3238,7 @@ + + (* Typing of let bindings *) + +-and type_let ?(check = fun s -> Warnings.Unused_var s) ++and type_let ?(global=false) ?(check = fun s -> Warnings.Unused_var s) + ?(check_strict = fun s -> Warnings.Unused_var_strict s) + env rec_flag spat_sexp_list scope allow = + begin_def(); +@@ -3368,7 +3368,7 @@ + ) + pat_list + in +- let exp_list = ++ let exp_gen_list = + List.map2 + (fun (spat, sexp) (pat, slot) -> + let sexp = +@@ -3386,9 +3386,12 @@ + let exp = type_expect exp_env sexp ty' in + end_def (); + check_univars env true "definition" exp pat.pat_type vars; +- {exp with exp_type = instance env exp.exp_type} +- | _ -> type_expect exp_env sexp pat.pat_type) ++ {exp with exp_type = instance env exp.exp_type}, true ++ | _ -> ++ type_expect exp_env sexp pat.pat_type, ++ match sexp.pexp_desc with Pexp_ident _ -> true | _ -> false) + spat_sexp_list pat_slot_list in ++ let exp_list, gen_list = List.split exp_gen_list in + current_slot := None; + if is_recursive && not !rec_needed + && Warnings.is_active Warnings.Unused_rec_flag then +@@ -3399,10 +3402,12 @@ + pat_list exp_list; + end_def(); + List.iter2 +- (fun pat exp -> +- if not (is_nonexpansive exp) then ++ (fun pat (exp, gen) -> ++ if not (global || gen) then ++ iter_pattern (fun pat -> generalize_structure pat.pat_type) pat ++ else if not (is_nonexpansive exp) then + iter_pattern (fun pat -> generalize_expansive env pat.pat_type) pat) +- pat_list exp_list; ++ pat_list exp_gen_list; + List.iter + (fun pat -> iter_pattern (fun pat -> generalize pat.pat_type) pat) + pat_list; +@@ -3413,7 +3418,7 @@ + let type_binding env rec_flag spat_sexp_list scope = + Typetexp.reset_type_variables(); + let (pat_exp_list, new_env, unpacks) = +- type_let ++ type_let ~global:true + ~check:(fun s -> Warnings.Unused_value_declaration s) + ~check_strict:(fun s -> Warnings.Unused_value_declaration s) + env rec_flag spat_sexp_list scope false +Index: typing/includecore.ml +=================================================================== +--- typing/includecore.ml (revision 14037) ++++ typing/includecore.ml (working copy) +@@ -123,7 +123,8 @@ + | Record_representation of bool + + let report_type_mismatch0 first second decl ppf err = +- let pr fmt = Format.fprintf ppf fmt in ++ let pr : 'a. ('a, Format.formatter, unit) format -> 'a ++ = fun fmt -> Format.fprintf ppf fmt in + match err with + Arity -> pr "They have different arities" + | Privacy -> pr "A private type would be revealed" +Index: ocamldoc/odoc_html.ml +=================================================================== +--- ocamldoc/odoc_html.ml (revision 14037) ++++ ocamldoc/odoc_html.ml (working copy) +@@ -508,7 +508,7 @@ + bs b "</table>\n" + + method html_of_Index_list b = +- let index_if_not_empty l url m = ++ let index_if_not_empty : 'a. 'a list -> _ = fun l url m -> + match l with + [] -> () + | _ -> bp b "<li><a href=\"%s\">%s</a></li>\n" url m +@@ -977,7 +977,7 @@ + (** A function to build the header of pages. *) + method prepare_header module_list = + let f b ?(nav=None) ?(comments=[]) t = +- let link_if_not_empty l m url = ++ let link_if_not_empty : 'a. 'a list -> _ = fun l m url -> + match l with + [] -> () + | _ -> +Index: bytecomp/translmod.ml +=================================================================== +--- bytecomp/translmod.ml (revision 14037) ++++ bytecomp/translmod.ml (working copy) +@@ -773,7 +773,8 @@ + Lprim(Psetglobal target_name, [Lprim(Pmakeblock(0, Immutable), components)]) + + let transl_store_package component_names target_name coercion = +- let rec make_sequence fn pos arg = ++ let rec make_sequence : 'a. (int -> 'a -> _) -> int -> 'a list -> _ = ++ fun fn pos arg -> + match arg with + [] -> lambda_unit + | hd :: tl -> Lsequence(fn pos hd, make_sequence fn (pos + 1) tl) in +Index: otherlibs/labltk/jpf/jpf_font.ml +=================================================================== +--- otherlibs/labltk/jpf/jpf_font.ml (revision 14037) ++++ otherlibs/labltk/jpf/jpf_font.ml (working copy) +@@ -131,7 +131,7 @@ + } + + let string_of_pattern = +- let pat f = function ++ let pat : 'a. ('a -> string) -> 'a option -> string = fun f -> function + Some x -> f x + | None -> "*" + in +Index: otherlibs/labltk/browser/searchid.ml +=================================================================== +--- otherlibs/labltk/browser/searchid.ml (revision 14037) ++++ otherlibs/labltk/browser/searchid.ml (working copy) +@@ -396,7 +396,7 @@ + let search_string_symbol text = + if text = "" then [] else + let lid = snd (longident_of_string text) [] in +- let try_lookup f k = ++ let try_lookup : 'a. _ -> 'a -> (_ * 'a) list = fun f k -> + try let _ = f lid Env.initial in [lid, k] + with Not_found | Env.Error _ -> [] + in +Index: otherlibs/labltk/browser/setpath.ml +=================================================================== +--- otherlibs/labltk/browser/setpath.ml (revision 14037) ++++ otherlibs/labltk/browser/setpath.ml (working copy) +@@ -117,12 +117,12 @@ + bind_space_toggle dirbox; + bind_space_toggle pathbox; + +- let add_paths _ = ++ let add_paths : 'a. 'a -> unit = fun _ -> + add_to_path pathbox ~base:!current_dir + ~dirs:(List.map (Listbox.curselection dirbox) + ~f:(fun x -> Listbox.get dirbox ~index:x)); + Listbox.selection_clear dirbox ~first:(`Num 0) ~last:`End +- and remove_paths _ = ++ and remove_paths : 'a. 'a -> unit = fun _ -> + remove_path pathbox + ~dirs:(List.map (Listbox.curselection pathbox) + ~f:(fun x -> Listbox.get pathbox ~index:x)) +Index: otherlibs/labltk/browser/viewer.ml +=================================================================== +--- otherlibs/labltk/browser/viewer.ml (revision 14037) ++++ otherlibs/labltk/browser/viewer.ml (working copy) +@@ -507,7 +507,8 @@ + if i < 3 then Listbox.delete box ~first:(`Num 0) ~last:`End + else destroy fm + done; +- let rec firsts n = function [] -> [] ++ let rec firsts : 'a. int -> 'a list -> 'a list = fun n -> function ++ [] -> [] + | a :: l -> if n > 0 then a :: firsts (pred n) l else [] in + shown_paths <- firsts (n-1) shown_paths; + boxes <- firsts (max 3 n) boxes +Index: otherlibs/labltk/frx/frx_req.ml +=================================================================== +--- otherlibs/labltk/frx/frx_req.ml (revision 14037) ++++ otherlibs/labltk/frx/frx_req.ml (working copy) +@@ -40,7 +40,7 @@ + let e = + Entry.create t [Relief Sunken; TextVariable memory; TextWidth len] in + +- let activate _ = ++ let activate : 'a. 'a -> unit = fun _ -> + let v = Entry.get e in + Grab.release t; (* because of wm *) + destroy t; (* so action can call open_simple *) +@@ -77,7 +77,7 @@ + + let waiting = Textvariable.create_temporary t in + +- let activate _ = ++ let activate : 'a. 'a -> unit = fun _ -> + Grab.release t; (* because of wm *) + destroy t; (* so action can call open_simple *) + Textvariable.set waiting "1" in +@@ -125,7 +125,7 @@ + Listbox.insert lb End elements; + + (* activation: we have to break() because we destroy the requester *) +- let activate _ = ++ let activate : 'a. 'a -> unit = fun _ -> + let l = List.map (Listbox.get lb) (Listbox.curselection lb) in + Grab.release t; + destroy t; +Index: otherlibs/labltk/support/rawwidget.ml +=================================================================== +--- otherlibs/labltk/support/rawwidget.ml (revision 14037) ++++ otherlibs/labltk/support/rawwidget.ml (working copy) +@@ -67,7 +67,7 @@ + (* This one is always created by opentk *) + let default_toplevel = + let wname = "." in +- let w = Typed (wname, "toplevel") in ++ let w : 'a. 'a raw_widget = Typed (wname, "toplevel") in + Hashtbl.add table wname w; + w + +@@ -145,7 +145,7 @@ + then "." ^ name + else parentpath ^ "." ^ name + in +- let w = Typed(path,clas) in ++ let w :'a. 'a raw_widget = Typed(path,clas) in + Hashtbl.add table path w; + w + +Index: ocamlbuild/rule.ml +=================================================================== +--- ocamlbuild/rule.ml (revision 14037) ++++ ocamlbuild/rule.ml (working copy) +@@ -260,7 +260,8 @@ + which is deprecated and ignored." + name + in +- let res_add import xs xopt = ++ let res_add : 'b. ('a -> 'b) -> 'a list -> 'a option -> 'b list = ++ fun import xs xopt -> + let init = + match xopt with + | None -> [] +Index: ocamlbuild/main.ml +=================================================================== +--- ocamlbuild/main.ml (revision 14037) ++++ ocamlbuild/main.ml (working copy) +@@ -50,7 +50,7 @@ + let show_documentation () = + let rules = Rule.get_rules () in + let flags = Flags.get_flags () in +- let pp fmt = Log.raw_dprintf (-1) fmt in ++ let pp : 'a. ('a,_,_) format -> 'a = fun fmt -> Log.raw_dprintf (-1) fmt in + List.iter begin fun rule -> + pp "%a@\n@\n" (Rule.pretty_print Resource.print_pattern) rule + end rules; diff --git a/experimental/garrigue/objvariant.diff b/experimental/garrigue/objvariant.diff new file mode 100644 index 00000000..75deb24c --- /dev/null +++ b/experimental/garrigue/objvariant.diff @@ -0,0 +1,354 @@ +? objvariants-3.09.1.diffs +? objvariants.diffs +Index: btype.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/btype.ml,v +retrieving revision 1.37.4.1 +diff -u -r1.37.4.1 btype.ml +--- btype.ml 5 Dec 2005 13:18:42 -0000 1.37.4.1 ++++ btype.ml 16 Jan 2006 02:23:14 -0000 +@@ -177,7 +177,8 @@ + Tvariant row -> iter_row f row + | Tvar | Tunivar | Tsubst _ | Tconstr _ -> + Misc.may (fun (_,l) -> List.iter f l) row.row_name; +- List.iter f row.row_bound ++ List.iter f row.row_bound; ++ List.iter (fun (s,k,t) -> f t) row.row_object + | _ -> assert false + + let iter_type_expr f ty = +@@ -224,7 +225,9 @@ + | Some (path, tl) -> Some (path, List.map f tl) in + { row_fields = fields; row_more = more; + row_bound = !bound; row_fixed = row.row_fixed && fixed; +- row_closed = row.row_closed; row_name = name; } ++ row_closed = row.row_closed; row_name = name; ++ row_object = List.map (fun (s,k,t) -> (s,k,f t)) row.row_object; ++ } + + let rec copy_kind = function + Fvar{contents = Some k} -> copy_kind k +Index: ctype.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/ctype.ml,v +retrieving revision 1.197.2.6 +diff -u -r1.197.2.6 ctype.ml +--- ctype.ml 15 Dec 2005 02:28:38 -0000 1.197.2.6 ++++ ctype.ml 16 Jan 2006 02:23:15 -0000 +@@ -1421,7 +1421,7 @@ + newgenty + (Tvariant + {row_fields = fields; row_closed = closed; row_more = newvar(); +- row_bound = []; row_fixed = false; row_name = None }) ++ row_bound = []; row_fixed = false; row_name = None; row_object=[]}) + + (**** Unification ****) + +@@ -1724,8 +1724,11 @@ + else None + in + let bound = row1.row_bound @ row2.row_bound in ++ let opairs, _, miss2 = associate_fields row1.row_object row2.row_object in ++ let row_object = row1.row_object @ miss2 in + let row0 = {row_fields = []; row_more = more; row_bound = bound; +- row_closed = closed; row_fixed = fixed; row_name = name} in ++ row_closed = closed; row_fixed = fixed; row_name = name; ++ row_object = row_object } in + let set_more row rest = + let rest = + if closed then +@@ -1758,6 +1761,18 @@ + raise (Unify ((mkvariant [l,f1] true, + mkvariant [l,f2] true) :: trace))) + pairs; ++ List.iter (fun (s,_,ty1,_,ty2) -> unify env ty1 ty2) opairs; ++ if row_object <> [] then begin ++ List.iter ++ (fun (l,f) -> ++ match row_field_repr f with ++ Rpresent (Some ty) -> ++ let fi = build_fields generic_level row_object (newgenvar()) in ++ unify env (newgenty (Tobject (fi, ref None))) ty ++ | Rpresent None -> raise (Unify []) ++ | _ -> ()) ++ (row_repr row1).row_fields ++ end; + with exn -> + log_type rm1; rm1.desc <- md1; log_type rm2; rm2.desc <- md2; raise exn + end +@@ -2789,7 +2804,8 @@ + let row = + { row_fields = List.map fst fields; row_more = newvar(); + row_bound = !bound; row_closed = posi; row_fixed = false; +- row_name = if c > Unchanged then None else row.row_name } ++ row_name = if c > Unchanged then None else row.row_name; ++ row_object = [] } + in + (newty (Tvariant row), Changed) + | Tobject (t1, _) -> +Index: oprint.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/oprint.ml,v +retrieving revision 1.22 +diff -u -r1.22 oprint.ml +--- oprint.ml 23 Mar 2005 03:08:37 -0000 1.22 ++++ oprint.ml 16 Jan 2006 02:23:15 -0000 +@@ -185,7 +185,7 @@ + fprintf ppf "@[<2>< %a >@]" (print_fields rest) fields + | Otyp_stuff s -> fprintf ppf "%s" s + | Otyp_var (ng, s) -> fprintf ppf "'%s%s" (if ng then "_" else "") s +- | Otyp_variant (non_gen, row_fields, closed, tags) -> ++ | Otyp_variant (non_gen, row_fields, closed, tags, obj) -> + let print_present ppf = + function + None | Some [] -> () +@@ -198,12 +198,17 @@ + ppf fields + | Ovar_name (id, tyl) -> + fprintf ppf "@[%a%a@]" print_typargs tyl print_ident id ++ and print_object ppf obj = ++ if obj <> [] then ++ fprintf ppf "@ as @[<2>< %a >@]" (print_fields (Some false)) obj + in +- fprintf ppf "%s[%s@[<hv>@[<hv>%a@]%a ]@]" (if non_gen then "_" else "") ++ fprintf ppf "%s[%s@[<hv>@[<hv>%a@]%a%a ]@]" ++ (if non_gen then "_" else "") + (if closed then if tags = None then " " else "< " + else if tags = None then "> " else "? ") + print_fields row_fields + print_present tags ++ print_object obj + | Otyp_alias _ | Otyp_poly _ | Otyp_arrow _ | Otyp_tuple _ as ty -> + fprintf ppf "@[<1>(%a)@]" print_out_type ty + | Otyp_abstract | Otyp_sum _ | Otyp_record _ | Otyp_manifest (_, _) -> () +Index: outcometree.mli +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/outcometree.mli,v +retrieving revision 1.14 +diff -u -r1.14 outcometree.mli +--- outcometree.mli 23 Mar 2005 03:08:37 -0000 1.14 ++++ outcometree.mli 16 Jan 2006 02:23:15 -0000 +@@ -59,6 +59,7 @@ + | Otyp_var of bool * string + | Otyp_variant of + bool * out_variant * bool * (string list) option ++ * (string * out_type) list + | Otyp_poly of string list * out_type + and out_variant = + | Ovar_fields of (string * bool * out_type list) list +Index: printtyp.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/printtyp.ml,v +retrieving revision 1.139.2.2 +diff -u -r1.139.2.2 printtyp.ml +--- printtyp.ml 7 Dec 2005 23:37:27 -0000 1.139.2.2 ++++ printtyp.ml 16 Jan 2006 02:23:15 -0000 +@@ -244,7 +244,10 @@ + visited_objects := px :: !visited_objects; + match row.row_name with + | Some(p, tyl) when namable_row row -> +- List.iter (mark_loops_rec visited) tyl ++ List.iter (mark_loops_rec visited) tyl; ++ if not (static_row row) then ++ List.iter (fun (s,k,t) -> mark_loops_rec visited t) ++ row.row_object + | _ -> + iter_row (mark_loops_rec visited) {row with row_bound = []} + end +@@ -343,25 +346,27 @@ + | _ -> false) + fields in + let all_present = List.length present = List.length fields in ++ let static = row.row_closed && all_present in ++ let obj = ++ if static then [] else ++ List.map (fun (s,k,t) -> (s, tree_of_typexp sch t)) row.row_object ++ in ++ let tags = if all_present then None else Some (List.map fst present) in + begin match row.row_name with + | Some(p, tyl) when namable_row row -> + let id = tree_of_path p in + let args = tree_of_typlist sch tyl in +- if row.row_closed && all_present then ++ if static then + Otyp_constr (id, args) + else + let non_gen = is_non_gen sch px in +- let tags = +- if all_present then None else Some (List.map fst present) in + Otyp_variant (non_gen, Ovar_name(tree_of_path p, args), +- row.row_closed, tags) ++ row.row_closed, tags, obj) + | _ -> +- let non_gen = +- not (row.row_closed && all_present) && is_non_gen sch px in ++ let non_gen = not static && is_non_gen sch px in + let fields = List.map (tree_of_row_field sch) fields in +- let tags = +- if all_present then None else Some (List.map fst present) in +- Otyp_variant (non_gen, Ovar_fields fields, row.row_closed, tags) ++ Otyp_variant (non_gen, Ovar_fields fields, row.row_closed, ++ tags, obj) + end + | Tobject (fi, nm) -> + tree_of_typobject sch fi nm +Index: typecore.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/typecore.ml,v +retrieving revision 1.176.2.2 +diff -u -r1.176.2.2 typecore.ml +--- typecore.ml 11 Dec 2005 09:56:33 -0000 1.176.2.2 ++++ typecore.ml 16 Jan 2006 02:23:15 -0000 +@@ -170,7 +170,8 @@ + (* Force check of well-formedness *) + unify_pat pat.pat_env pat + (newty(Tvariant{row_fields=[]; row_more=newvar(); row_closed=false; +- row_bound=[]; row_fixed=false; row_name=None})); ++ row_bound=[]; row_fixed=false; row_name=None; ++ row_object=[]})); + | _ -> () + + let rec iter_pattern f p = +@@ -251,7 +252,7 @@ + let ty = may_map (build_as_type env) p' in + newty (Tvariant{row_fields=[l, Rpresent ty]; row_more=newvar(); + row_bound=[]; row_name=None; +- row_fixed=false; row_closed=false}) ++ row_fixed=false; row_closed=false; row_object=[]}) + | Tpat_record lpl -> + let lbl = fst(List.hd lpl) in + if lbl.lbl_private = Private then p.pat_type else +@@ -318,7 +319,8 @@ + ([],[]) fields in + let row = + { row_fields = List.rev fields; row_more = newvar(); row_bound = !bound; +- row_closed = false; row_fixed = false; row_name = Some (path, tyl) } ++ row_closed = false; row_fixed = false; row_name = Some (path, tyl); ++ row_object = [] } + in + let ty = newty (Tvariant row) in + let gloc = {loc with Location.loc_ghost=true} in +@@ -428,7 +430,8 @@ + row_closed = false; + row_more = newvar (); + row_fixed = false; +- row_name = None } in ++ row_name = None; ++ row_object = [] } in + rp { + pat_desc = Tpat_variant(l, arg, row); + pat_loc = sp.ppat_loc; +@@ -976,7 +979,8 @@ + row_bound = []; + row_closed = false; + row_fixed = false; +- row_name = None}); ++ row_name = None; ++ row_object = []}); + exp_env = env } + | Pexp_record(lid_sexp_list, opt_sexp) -> + let ty = newvar() in +@@ -1261,8 +1265,30 @@ + assert false + end + | _ -> +- (Texp_send(obj, Tmeth_name met), +- filter_method env met Public obj.exp_type) ++ let obj, met_ty = ++ match expand_head env obj.exp_type with ++ {desc = Tvariant _} -> ++ let exp_ty = newvar () in ++ let met_ty = filter_method env met Public exp_ty in ++ let row = ++ {row_fields=[]; row_more=newvar(); ++ row_bound=[]; row_closed=false; ++ row_fixed=false; row_name=None; ++ row_object=[met, Fpresent, met_ty]} in ++ unify_exp env obj (newty (Tvariant row)); ++ let prim = Primitive.parse_declaration 1 ["%field1"] in ++ let ty = newty(Tarrow("", obj.exp_type, exp_ty, Cok)) in ++ let vd = {val_type = ty; val_kind = Val_prim prim} in ++ let esnd = ++ {exp_desc=Texp_ident(Path.Pident(Ident.create"snd"), vd); ++ exp_loc = Location.none; exp_type = ty; exp_env = env} ++ in ++ ({obj with exp_type = exp_ty; ++ exp_desc = Texp_apply(esnd,[Some obj, Required])}, ++ met_ty) ++ | _ -> (obj, filter_method env met Public obj.exp_type) ++ in ++ (Texp_send(obj, Tmeth_name met), met_ty) + in + if !Clflags.principal then begin + end_def (); +Index: types.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/types.ml,v +retrieving revision 1.25 +diff -u -r1.25 types.ml +--- types.ml 9 Dec 2004 12:40:53 -0000 1.25 ++++ types.ml 16 Jan 2006 02:23:15 -0000 +@@ -44,7 +44,9 @@ + row_bound: type_expr list; + row_closed: bool; + row_fixed: bool; +- row_name: (Path.t * type_expr list) option } ++ row_name: (Path.t * type_expr list) option; ++ row_object: (string * field_kind * type_expr) list; ++ } + + and row_field = + Rpresent of type_expr option +Index: types.mli +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/types.mli,v +retrieving revision 1.25 +diff -u -r1.25 types.mli +--- types.mli 9 Dec 2004 12:40:53 -0000 1.25 ++++ types.mli 16 Jan 2006 02:23:15 -0000 +@@ -43,7 +43,9 @@ + row_bound: type_expr list; + row_closed: bool; + row_fixed: bool; +- row_name: (Path.t * type_expr list) option } ++ row_name: (Path.t * type_expr list) option; ++ row_object: (string * field_kind * type_expr) list; ++ } + + and row_field = + Rpresent of type_expr option +Index: typetexp.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/typetexp.ml,v +retrieving revision 1.54 +diff -u -r1.54 typetexp.ml +--- typetexp.ml 22 Jul 2005 06:42:36 -0000 1.54 ++++ typetexp.ml 16 Jan 2006 02:23:15 -0000 +@@ -215,7 +215,8 @@ + in + let row = { row_closed = true; row_fields = fields; + row_bound = !bound; row_name = Some (path, args); +- row_fixed = false; row_more = newvar () } in ++ row_fixed = false; row_more = newvar (); ++ row_object = [] } in + let static = Btype.static_row row in + let row = + if static then row else +@@ -262,7 +263,7 @@ + let mkfield l f = + newty (Tvariant {row_fields=[l,f]; row_more=newvar(); + row_bound=[]; row_closed=true; +- row_fixed=false; row_name=None}) in ++ row_fixed=false; row_name=None; row_object=[]}) in + let add_typed_field loc l f fields = + try + let f' = List.assoc l fields in +@@ -345,7 +346,7 @@ + let row = + { row_fields = List.rev fields; row_more = newvar (); + row_bound = !bound; row_closed = closed; +- row_fixed = false; row_name = !name } in ++ row_fixed = false; row_name = !name; row_object = [] } in + let static = Btype.static_row row in + let row = + if static then row else diff --git a/experimental/garrigue/objvariant.ml b/experimental/garrigue/objvariant.ml new file mode 100644 index 00000000..3233e03c --- /dev/null +++ b/experimental/garrigue/objvariant.ml @@ -0,0 +1,42 @@ +(* use with [cvs update -r objvariants typing] *) + +let f (x : [> ]) = x#m 3;; +let o = object method m x = x+2 end;; +f (`A o);; +let l = [`A o; `B(object method m x = x -2 method y = 3 end)];; +List.map f l;; +let g = function `A x -> x#m 3 | `B x -> x#y;; +List.map g l;; +fun x -> ignore (x=f); List.map x l;; +fun (x : [< `A of _ | `B of _] -> int) -> ignore (x=f); List.map x l;; + + +class cvar name = + object + method name = name + method print ppf = Format.pp_print_string ppf name + end + +type var = [`Var of cvar] + +class cint n = + object + method n = n + method print ppf = Format.pp_print_int ppf n + end + +class ['a] cadd (e1 : 'a) (e2 : 'a) = + object + constraint 'a = [> ] + method e1 = e1 + method e2 = e2 + method print ppf = Format.fprintf ppf "(%t, %t)" e1#print e2#print + end + +type 'a expr = [var | `Int of cint | `Add of 'a cadd] + +type expr1 = expr1 expr + +let print = Format.printf "%t@." + +let e1 : expr1 = `Add (new cadd (`Var (new cvar "x")) (`Int (new cint 2))) diff --git a/experimental/garrigue/parser-lessminus.diff b/experimental/garrigue/parser-lessminus.diff new file mode 100644 index 00000000..7b535307 --- /dev/null +++ b/experimental/garrigue/parser-lessminus.diff @@ -0,0 +1,77 @@ +Index: parsing/parser.mly +=================================================================== +--- parsing/parser.mly (revision 11929) ++++ parsing/parser.mly (working copy) +@@ -319,6 +319,11 @@ + let polyvars, core_type = varify_constructors newtypes core_type in + (exp, ghtyp(Ptyp_poly(polyvars,core_type))) + ++let no_lessminus = ++ List.map (fun (p,e,b) -> ++ match b with None -> (p,e) ++ | Some loc -> raise (Syntaxerr.Error (Syntaxerr.Other loc))) ++ + %} + + /* Tokens */ +@@ -597,8 +602,9 @@ + structure_item: + LET rec_flag let_bindings + { match $3 with +- [{ ppat_desc = Ppat_any; ppat_loc = _ }, exp] -> mkstr(Pstr_eval exp) +- | _ -> mkstr(Pstr_value($2, List.rev $3)) } ++ [{ ppat_desc = Ppat_any; ppat_loc = _ }, exp, None] -> ++ mkstr(Pstr_eval exp) ++ | _ -> mkstr(Pstr_value($2, no_lessminus (List.rev $3))) } + | EXTERNAL val_ident COLON core_type EQUAL primitive_declaration + { mkstr(Pstr_primitive($2, {pval_type = $4; pval_prim = $6})) } + | TYPE type_declarations +@@ -744,7 +750,7 @@ + | class_simple_expr simple_labeled_expr_list + { mkclass(Pcl_apply($1, List.rev $2)) } + | LET rec_flag let_bindings IN class_expr +- { mkclass(Pcl_let ($2, List.rev $3, $5)) } ++ { mkclass(Pcl_let ($2, no_lessminus (List.rev $3), $5)) } + ; + class_simple_expr: + LBRACKET core_type_comma_list RBRACKET class_longident +@@ -981,9 +987,15 @@ + | simple_expr simple_labeled_expr_list + { mkexp(Pexp_apply($1, List.rev $2)) } + | LET rec_flag let_bindings IN seq_expr +- { mkexp(Pexp_let($2, List.rev $3, $5)) } ++ { match $3 with ++ | [pat, expr, Some loc] when $2 = Nonrecursive -> ++ mkexp(Pexp_apply( ++ {pexp_desc = Pexp_ident(Lident "bind"); pexp_loc = loc}, ++ ["", expr; "", ghexp(Pexp_function("", None, [pat, $5]))])) ++ | bindings -> ++ mkexp(Pexp_let($2, no_lessminus (List.rev $3), $5)) } + | LET DOT simple_expr let_binding IN seq_expr +- { let (pat, expr) = $4 in ++ { let (pat, expr, _) = $4 in + mkexp(Pexp_apply($3, ["", expr; "", ghexp(Pexp_function("", None, [pat, $6]))])) } + | LET MODULE UIDENT module_binding IN seq_expr + { mkexp(Pexp_letmodule($3, $4, $6)) } +@@ -1197,14 +1209,17 @@ + ; + let_binding: + val_ident fun_binding +- { (mkpatvar $1 1, $2) } ++ { (mkpatvar $1 1, $2, None) } + | val_ident COLON typevar_list DOT core_type EQUAL seq_expr +- { (ghpat(Ppat_constraint(mkpatvar $1 1, ghtyp(Ptyp_poly($3,$5)))), $7) } ++ { (ghpat(Ppat_constraint(mkpatvar $1 1, ghtyp(Ptyp_poly($3,$5)))), $7, ++ None) } + | val_ident COLON TYPE lident_list DOT core_type EQUAL seq_expr + { let exp, poly = wrap_type_annotation $4 $6 $8 in +- (ghpat(Ppat_constraint(mkpatvar $1 1, poly)), exp) } ++ (ghpat(Ppat_constraint(mkpatvar $1 1, poly)), exp, None) } + | pattern EQUAL seq_expr +- { ($1, $3) } ++ { ($1, $3, None) } ++ | pattern LESSMINUS seq_expr ++ { ($1, $3, Some (rhs_loc 2)) } + ; + fun_binding: + strict_binding diff --git a/experimental/garrigue/pattern-local-types.diff b/experimental/garrigue/pattern-local-types.diff new file mode 100644 index 00000000..0e6f00a2 --- /dev/null +++ b/experimental/garrigue/pattern-local-types.diff @@ -0,0 +1,467 @@ +Index: typing/typecore.ml +=================================================================== +--- typing/typecore.ml (revision 13003) ++++ typing/typecore.ml (working copy) +@@ -61,6 +61,7 @@ + | Not_a_packed_module of type_expr + | Recursive_local_constraint of (type_expr * type_expr) list + | Unexpected_existential ++ | Pattern_newtype_non_closed of string * type_expr + + exception Error of Location.t * error + +@@ -121,7 +122,7 @@ + | Pexp_function (_, eo, pel) -> + may expr eo; List.iter (fun (_, e) -> expr e) pel + | Pexp_apply (e, lel) -> expr e; List.iter (fun (_, e) -> expr e) lel +- | Pexp_let (_, pel, e) ++ | Pexp_let (_, pel, e) -> expr e; List.iter (fun (_, e) -> expr e) pel + | Pexp_match (e, pel) + | Pexp_try (e, pel) -> expr e; List.iter (fun (_, e) -> expr e) pel + | Pexp_array el +@@ -1454,7 +1455,7 @@ + + let duplicate_ident_types loc caselist env = + let caselist = +- List.filter (fun (pat, _) -> contains_gadt env pat) caselist in ++ List.filter (fun ((_,pat), _) -> contains_gadt env pat) caselist in + let idents = all_idents (List.map snd caselist) in + List.fold_left + (fun env s -> +@@ -1552,7 +1553,7 @@ + exp_env = env } + | Pexp_let(Nonrecursive, [spat, sval], sbody) when contains_gadt env spat -> + type_expect ?in_function env +- {sexp with pexp_desc = Pexp_match (sval, [spat, sbody])} ++ {sexp with pexp_desc = Pexp_match (sval, [([],spat), sbody])} + ty_expected + | Pexp_let(rec_flag, spat_sexp_list, sbody) -> + let scp = +@@ -1572,20 +1573,21 @@ + exp_env = env } + | Pexp_function (l, Some default, [spat, sbody]) -> + let default_loc = default.pexp_loc in +- let scases = [ ++ let scases = [([], + {ppat_loc = default_loc; + ppat_desc = + Ppat_construct + (mknoloc (Longident.(Ldot (Lident "*predef*", "Some"))), + Some {ppat_loc = default_loc; + ppat_desc = Ppat_var (mknoloc "*sth*")}, +- false)}, ++ false)}), + {pexp_loc = default_loc; + pexp_desc = Pexp_ident(mknoloc (Longident.Lident "*sth*"))}; ++ ([], + {ppat_loc = default_loc; + ppat_desc = Ppat_construct + (mknoloc (Longident.(Ldot (Lident "*predef*", "None"))), +- None, false)}, ++ None, false)}), + default; + ] in + let smatch = { +@@ -1603,10 +1605,10 @@ + pexp_desc = + Pexp_function ( + l, None, +- [ {ppat_loc = loc; +- ppat_desc = Ppat_var (mknoloc "*opt*")}, ++ [ ([], {ppat_loc = loc; ++ ppat_desc = Ppat_var (mknoloc "*opt*")}), + {pexp_loc = loc; +- pexp_desc = Pexp_let(Default, [spat, smatch], sbody); ++ pexp_desc = Pexp_let(Default, [snd spat, smatch], sbody); + } + ] + ) +@@ -2733,10 +2735,10 @@ + and type_cases ?in_function env ty_arg ty_res partial_flag loc caselist = + (* ty_arg is _fully_ generalized *) + let dont_propagate, has_gadts = +- let patterns = List.map fst caselist in ++ let patterns = List.map (fun ((_,p),_) -> p) caselist in + List.exists contains_polymorphic_variant patterns, +- List.exists (contains_gadt env) patterns in +-(* prerr_endline ( if has_gadts then "contains gadt" else "no gadt"); *) ++ List.exists (contains_gadt env) patterns || ++ List.exists (fun ((l,_),_) -> l <> []) caselist in + let ty_arg, ty_res, env = + if has_gadts && not !Clflags.principal then + correct_levels ty_arg, correct_levels ty_res, +@@ -2761,9 +2763,21 @@ + Printtyp.raw_type_expr ty_arg; *) + let pat_env_list = + List.map +- (fun (spat, sexp) -> ++ (fun ((stypes,spat), sexp) -> + let loc = sexp.pexp_loc in + if !Clflags.principal then begin_def (); (* propagation of pattern *) ++ (* For local types *) ++ if stypes <> [] then begin_def (); ++ let lev' = get_current_level () in ++ let types = List.map (fun name -> name, newvar ~name ()) stypes in ++ let env = ++ List.fold_left (fun env (name, manifest) -> ++ (* "Vanishing" definition *) ++ let decl = new_declaration ~manifest (lev',lev') in ++ snd (Env.enter_type name decl env)) ++ env types ++ in ++ (* Type the pattern itself *) + let scope = Some (Annot.Idef loc) in + let (pat, ext_env, force, unpacks) = + let partial = +@@ -2773,14 +2787,42 @@ + in type_pattern ~lev env spat scope ty_arg + in + pattern_force := force @ !pattern_force; ++ (* For local types *) ++ let ext_env = ++ List.fold_left (fun env (name, ty) -> ++ let ty = expand_head env ty in ++ match ty.desc with ++ Tconstr ((Path.Pident id as p), [], _) when ++ let decl = Env.find_type p env in ++ decl.type_newtype_level = Some (lev, lev) && ++ decl.type_kind = Type_abstract -> ++ let (id', env) = ++ Env.enter_type name (new_declaration (lev, lev)) env in ++ let manifest = newconstr (Path.Pident id') [] in ++ (* Make previous existential "vanish" *) ++ Env.add_type id (new_declaration ~manifest (lev',lev')) env ++ | _ -> ++ if free_variables ty <> [] then ++ raise (Error (spat.ppat_loc, ++ Pattern_newtype_non_closed (name,ty))); ++ let manifest = correct_levels ty in ++ let decl = new_declaration ~manifest (lev, lev) in ++ snd (Env.enter_type name decl env)) ++ ext_env types ++ in ++ if stypes <> [] then begin ++ end_def (); ++ iter_pattern (fun p -> unify_pat ext_env p (newvar())) pat; ++ end; ++ (* Principality *) + let pat = + if !Clflags.principal then begin + end_def (); + iter_pattern (fun {pat_type=t} -> generalize_structure t) pat; +- { pat with pat_type = instance env pat.pat_type } ++ { pat with pat_type = instance ext_env pat.pat_type } + end else pat + in +- unify_pat env pat ty_arg'; ++ unify_pat ext_env pat ty_arg'; + (pat, (ext_env, unpacks))) + caselist in + (* Check for polymorphic variants to close *) +@@ -2802,7 +2844,7 @@ + let in_function = if List.length caselist = 1 then in_function else None in + let cases = + List.map2 +- (fun (pat, (ext_env, unpacks)) (spat, sexp) -> ++ (fun (pat, (ext_env, unpacks)) ((stypes,spat), sexp) -> + let sexp = wrap_unpacks sexp unpacks in + let ty_res' = + if !Clflags.principal then begin +@@ -2811,8 +2853,8 @@ + end_def (); + generalize_structure ty; ty + end +- else if contains_gadt env spat then correct_levels ty_res +- else ty_res in ++ else if contains_gadt env spat || stypes <> [] ++ then correct_levels ty_res else ty_res in + (* Format.printf "@[%i %i, ty_res' =@ %a@]@." lev (get_current_level()) + Printtyp.raw_type_expr ty_res'; *) + let exp = type_expect ?in_function ext_env sexp ty_res' in +@@ -3218,6 +3260,11 @@ + | Unexpected_existential -> + fprintf ppf + "Unexpected existential" ++ | Pattern_newtype_non_closed (name, ty) -> ++ reset_and_mark_loops ty; ++ fprintf ppf ++ "@[In this pattern, local type %s has been inferred as@ %a@ %s@]" ++ name type_expr ty "It should not contain variables." + + let () = + Env.add_delayed_check_forward := add_delayed_check +Index: typing/ctype.mli +=================================================================== +--- typing/ctype.mli (revision 13003) ++++ typing/ctype.mli (working copy) +@@ -140,6 +140,9 @@ + the parameters [pi] and returns the corresponding instance of + [t]. Exception [Cannot_apply] is raised in case of failure. *) + ++val new_declaration: ++ ?manifest:type_expr -> ?loc:Location.t -> (int * int) -> type_declaration ++ + val expand_head_once: Env.t -> type_expr -> type_expr + val expand_head: Env.t -> type_expr -> type_expr + val try_expand_once_opt: Env.t -> type_expr -> type_expr +Index: typing/typeclass.ml +=================================================================== +--- typing/typeclass.ml (revision 13003) ++++ typing/typeclass.ml (working copy) +@@ -347,8 +347,8 @@ + let mkid s = mkloc s self_loc in + { pexp_desc = + Pexp_function ("", None, +- [mkpat (Ppat_alias (mkpat (Ppat_var (mkid "self-*")), +- mkid ("self-" ^ cl_num))), ++ [([],mkpat (Ppat_alias (mkpat (Ppat_var (mkid "self-*")), ++ mkid ("self-" ^ cl_num)))), + expr]); + pexp_loc = expr.pexp_loc } + +@@ -836,15 +836,15 @@ + | Pcl_fun (l, Some default, spat, sbody) -> + let loc = default.pexp_loc in + let scases = +- [{ppat_loc = loc; ppat_desc = Ppat_construct ( ++ [([], {ppat_loc = loc; ppat_desc = Ppat_construct ( + mknoloc (Longident.(Ldot (Lident"*predef*", "Some"))), + Some{ppat_loc = loc; ppat_desc = Ppat_var (mknoloc "*sth*")}, +- false)}, ++ false)}), + {pexp_loc = loc; pexp_desc = + Pexp_ident(mknoloc (Longident.Lident"*sth*"))}; +- {ppat_loc = loc; ppat_desc = ++ ([], {ppat_loc = loc; ppat_desc = + Ppat_construct(mknoloc (Longident.(Ldot (Lident"*predef*", "None"))), +- None, false)}, ++ None, false)}), + default] in + let smatch = + {pexp_loc = loc; pexp_desc = +Index: typing/ctype.ml +=================================================================== +--- typing/ctype.ml (revision 13003) ++++ typing/ctype.ml (working copy) +@@ -696,6 +696,7 @@ + Path.binding_time p + + let rec update_level env level ty = ++ (* Format.eprintf "update_level %d %a@." level !Btype.print_raw ty; *) + let ty = repr ty in + if ty.level > level then begin + if Env.has_local_constraints env then begin +@@ -1043,7 +1044,7 @@ + reified_var_counter := Vars.add s index !reified_var_counter; + Printf.sprintf "%s#%d" s index + +-let new_declaration newtype manifest = ++let new_declaration ?manifest ?(loc=Location.none) newtype = + { + type_params = []; + type_arity = 0; +@@ -1051,7 +1052,7 @@ + type_private = Public; + type_manifest = manifest; + type_variance = []; +- type_newtype_level = newtype; ++ type_newtype_level = Some newtype; + type_loc = Location.none; + } + +@@ -1060,7 +1061,7 @@ + | None -> () + | Some (env, newtype_lev) -> + let process existential = +- let decl = new_declaration (Some (newtype_lev, newtype_lev)) None in ++ let decl = new_declaration (newtype_lev, newtype_lev) in + let name = + match repr existential with + {desc = Tvar (Some name)} -> name +@@ -1808,7 +1809,7 @@ + let reify env t = + let newtype_level = get_newtype_level () in + let create_fresh_constr lev name = +- let decl = new_declaration (Some (newtype_level, newtype_level)) None in ++ let decl = new_declaration (newtype_level, newtype_level) in + let name = get_new_abstract_name name in + let (id, new_env) = Env.enter_type name decl !env in + let t = newty2 lev (Tconstr (Path.Pident id,[],ref Mnil)) in +@@ -2039,7 +2040,7 @@ + let add_gadt_equation env source destination = + let destination = duplicate_type destination in + let source_lev = find_newtype_level !env (Path.Pident source) in +- let decl = new_declaration (Some source_lev) (Some destination) in ++ let decl = new_declaration ~manifest:destination source_lev in + let newtype_level = get_newtype_level () in + env := Env.add_local_constraint source decl newtype_level !env; + cleanup_abbrev () +Index: typing/typecore.mli +=================================================================== +--- typing/typecore.mli (revision 13003) ++++ typing/typecore.mli (working copy) +@@ -103,6 +103,7 @@ + | Not_a_packed_module of type_expr + | Recursive_local_constraint of (type_expr * type_expr) list + | Unexpected_existential ++ | Pattern_newtype_non_closed of string * type_expr + + exception Error of Location.t * error + +Index: testsuite/tests/typing-gadts/test.ml.reference +=================================================================== +--- testsuite/tests/typing-gadts/test.ml.reference (revision 13003) ++++ testsuite/tests/typing-gadts/test.ml.reference (working copy) +@@ -293,4 +293,18 @@ + # type 'a ty = Int : int -> int ty + # val f : 'a ty -> 'a = <fun> + # val g : 'a ty -> 'a = <fun> ++# - : unit -> unit list = <fun> ++# - : unit list = [] ++# Characters 17-19: ++ function type a. () -> ();; (* fail *) ++ ^^ ++Error: In this pattern, local type a has been inferred as 'a ++ It should not contain variables. ++# type t = D : 'a * ('a -> int) -> t ++# val f : t -> int = <fun> ++# Characters 42-43: ++ let f = function type b. D ((x:b), f) -> (f:t->int) x;; (* fail *) ++ ^ ++Error: This expression has type b -> int ++ but an expression was expected of type t -> int + # +Index: testsuite/tests/typing-gadts/test.ml +=================================================================== +--- testsuite/tests/typing-gadts/test.ml (revision 13003) ++++ testsuite/tests/typing-gadts/test.ml (working copy) +@@ -512,3 +512,15 @@ + let g : type a. a ty -> a = + let () = () in + fun x -> match x with Int y -> y;; ++ ++(* Implicit type declarations in patterns *) ++ ++(* alias *) ++function type a. (() : a) -> ([] : a list);; ++(function type a. (() : a) -> ([] : a list)) ();; ++function type a. () -> ();; (* fail *) ++ ++(* existential *) ++type t = D : 'a * ('a -> int) -> t;; ++let f = function type b. D ((x:b), f) -> (f:b->int) x;; ++let f = function type b. D ((x:b), f) -> (f:t->int) x;; (* fail *) +Index: testsuite/tests/typing-gadts/test.ml.principal.reference +=================================================================== +--- testsuite/tests/typing-gadts/test.ml.principal.reference (revision 13003) ++++ testsuite/tests/typing-gadts/test.ml.principal.reference (working copy) +@@ -306,4 +306,18 @@ + # type 'a ty = Int : int -> int ty + # val f : 'a ty -> 'a = <fun> + # val g : 'a ty -> 'a = <fun> ++# - : unit -> unit list = <fun> ++# - : unit list = [] ++# Characters 17-19: ++ function type a. () -> ();; (* fail *) ++ ^^ ++Error: In this pattern, local type a has been inferred as 'a ++ It should not contain variables. ++# type t = D : 'a * ('a -> int) -> t ++# val f : t -> int = <fun> ++# Characters 42-43: ++ let f = function type b. D ((x:b), f) -> (f:t->int) x;; (* fail *) ++ ^ ++Error: This expression has type b -> int ++ but an expression was expected of type t -> int + # +Index: parsing/parser.mly +=================================================================== +--- parsing/parser.mly (revision 13003) ++++ parsing/parser.mly (working copy) +@@ -967,7 +967,7 @@ + | FUNCTION opt_bar match_cases + { mkexp(Pexp_function("", None, List.rev $3)) } + | FUN labeled_simple_pattern fun_def +- { let (l,o,p) = $2 in mkexp(Pexp_function(l, o, [p, $3])) } ++ { let (l,o,p) = $2 in mkexp(Pexp_function(l, o, [([],p), $3])) } + | FUN LPAREN TYPE LIDENT RPAREN fun_def + { mkexp(Pexp_newtype($4, $6)) } + | MATCH seq_expr WITH opt_bar match_cases +@@ -1187,18 +1187,18 @@ + EQUAL seq_expr + { $2 } + | labeled_simple_pattern fun_binding +- { let (l, o, p) = $1 in ghexp(Pexp_function(l, o, [p, $2])) } ++ { let (l, o, p) = $1 in ghexp(Pexp_function(l, o, [([],p), $2])) } + | LPAREN TYPE LIDENT RPAREN fun_binding + { mkexp(Pexp_newtype($3, $5)) } + ; + match_cases: +- pattern match_action { [$1, $2] } +- | match_cases BAR pattern match_action { ($3, $4) :: $1 } ++ match_pattern match_action { [$1, $2] } ++ | match_cases BAR match_pattern match_action { ($3, $4) :: $1 } + ; + fun_def: + match_action { $1 } + | labeled_simple_pattern fun_def +- { let (l,o,p) = $1 in ghexp(Pexp_function(l, o, [p, $2])) } ++ { let (l,o,p) = $1 in ghexp(Pexp_function(l, o, [([],p), $2])) } + | LPAREN TYPE LIDENT RPAREN fun_def + { mkexp(Pexp_newtype($3, $5)) } + ; +@@ -1245,6 +1245,10 @@ + + /* Patterns */ + ++match_pattern: ++ pattern { [], $1 } ++ | TYPE lident_list DOT pattern { $2, $4 } ++; + pattern: + simple_pattern + { $1 } +Index: parsing/parsetree.mli +=================================================================== +--- parsing/parsetree.mli (revision 13003) ++++ parsing/parsetree.mli (working copy) +@@ -90,10 +90,11 @@ + Pexp_ident of Longident.t loc + | Pexp_constant of constant + | Pexp_let of rec_flag * (pattern * expression) list * expression +- | Pexp_function of label * expression option * (pattern * expression) list ++ | Pexp_function of ++ label * expression option * ((string list * pattern) * expression) list + | Pexp_apply of expression * (label * expression) list +- | Pexp_match of expression * (pattern * expression) list +- | Pexp_try of expression * (pattern * expression) list ++ | Pexp_match of expression * ((string list * pattern) * expression) list ++ | Pexp_try of expression * ((string list * pattern) * expression) list + | Pexp_tuple of expression list + | Pexp_construct of Longident.t loc * expression option * bool + | Pexp_variant of label * expression option +@@ -104,7 +105,8 @@ + | Pexp_ifthenelse of expression * expression * expression option + | Pexp_sequence of expression * expression + | Pexp_while of expression * expression +- | Pexp_for of string loc * expression * expression * direction_flag * expression ++ | Pexp_for of ++ string loc * expression * expression * direction_flag * expression + | Pexp_constraint of expression * core_type option * core_type option + | Pexp_when of expression * expression + | Pexp_send of expression * string +Index: parsing/printast.ml +=================================================================== +--- parsing/printast.ml (revision 13003) ++++ parsing/printast.ml (working copy) +@@ -686,8 +686,9 @@ + line i ppf "%a\n" fmt_longident li; + pattern (i+1) ppf p; + +-and pattern_x_expression_case i ppf (p, e) = ++and pattern_x_expression_case i ppf ((l,p), e) = + line i ppf "<case>\n"; ++ list (i+1) string ppf l; + pattern (i+1) ppf p; + expression (i+1) ppf e; + diff --git a/experimental/garrigue/printers.ml b/experimental/garrigue/printers.ml new file mode 100644 index 00000000..c80c42d6 --- /dev/null +++ b/experimental/garrigue/printers.ml @@ -0,0 +1,11 @@ +(* $Id$ *) + +open Types + +let ignore_abbrevs ppf ab = + let s = match ab with + Mnil -> "Mnil" + | Mlink _ -> "Mlink _" + | Mcons _ -> "Mcons _" + in + Format.pp_print_string ppf s diff --git a/experimental/garrigue/propagation-to-patterns.diff b/experimental/garrigue/propagation-to-patterns.diff new file mode 100644 index 00000000..642d986f --- /dev/null +++ b/experimental/garrigue/propagation-to-patterns.diff @@ -0,0 +1,212 @@ +Index: Changes +=================================================================== +--- Changes (revision 13157) ++++ Changes (working copy) +@@ -1,6 +1,11 @@ + Next version + ------------ + ++Type system: ++- Propagate type information towards pattern-matching, even in the presence ++ of polymorphic variants (discarding only information about possibly-present ++ constructors) ++ + Compilers: + - PR#5861: raise an error when multiple private keywords are used in type declarations + - PR#5634: parsetree rewriter (-ppx flag) +Index: typing/typecore.ml +=================================================================== +--- typing/typecore.ml (revision 13157) ++++ typing/typecore.ml (working copy) +@@ -326,7 +326,7 @@ + | _ -> assert false + in + begin match row_field tag row with +- | Rabsent -> assert false ++ | Rabsent -> () (* assert false *) + | Reither (true, [], _, e) when not row.row_closed -> + set_row_field e (Rpresent None) + | Reither (false, ty::tl, _, e) when not row.row_closed -> +@@ -1657,6 +1657,28 @@ + sexp unpacks + + (* Helpers for type_cases *) ++ ++let contains_variant_either ty = ++ let rec loop ty = ++ let ty = repr ty in ++ if ty.level >= lowest_level then begin ++ mark_type_node ty; ++ match ty.desc with ++ Tvariant row -> ++ let row = row_repr row in ++ if not row.row_fixed then ++ List.iter ++ (fun (_,f) -> ++ match row_field_repr f with Reither _ -> raise Exit | _ -> ()) ++ row.row_fields; ++ iter_row loop row ++ | _ -> ++ iter_type_expr loop ty ++ end ++ in ++ try loop ty; unmark_type ty; false ++ with Exit -> unmark_type ty; true ++ + let iter_ppat f p = + match p.ppat_desc with + | Ppat_any | Ppat_var _ | Ppat_constant _ +@@ -1690,6 +1712,24 @@ + in + try loop p; false with Exit -> true + ++let check_absent_variant env = ++ iter_pattern ++ (function {pat_desc = Tpat_variant (s, arg, row)} as pat -> ++ let row = row_repr !row in ++ if List.exists (fun (s',fi) -> s = s' && row_field_repr fi <> Rabsent) ++ row.row_fields ++ then () else ++ let ty_arg = ++ match arg with None -> [] | Some p -> [correct_levels p.pat_type] in ++ let row' = {row_fields = [s, Reither(arg=None,ty_arg,true,ref None)]; ++ row_more = newvar (); row_bound = (); ++ row_closed = false; row_fixed = false; row_name = None} in ++ (* Should fail *) ++ unify_pat env {pat with pat_type = newty (Tvariant row')} ++ (correct_levels pat.pat_type) ++ | _ -> ()) ++ ++ + let dummy_expr = {pexp_desc = Pexp_tuple []; pexp_loc = Location.none} + + (* Duplicate types of values in the environment *) +@@ -3037,16 +3077,20 @@ + + and type_cases ?in_function env ty_arg ty_res partial_flag loc caselist = + (* ty_arg is _fully_ generalized *) +- let dont_propagate, has_gadts = +- let patterns = List.map fst caselist in +- List.exists contains_polymorphic_variant patterns, +- List.exists (contains_gadt env) patterns in ++ let patterns = List.map fst caselist in ++ let erase_either = ++ List.exists contains_polymorphic_variant patterns ++ && contains_variant_either ty_arg ++ and has_gadts = List.exists (contains_gadt env) patterns in + (* prerr_endline ( if has_gadts then "contains gadt" else "no gadt"); *) +- let ty_arg, ty_res, env = ++ let ty_arg = ++ if (has_gadts || erase_either) && not !Clflags.principal ++ then correct_levels ty_arg else ty_arg ++ and ty_res, env = + if has_gadts && not !Clflags.principal then +- correct_levels ty_arg, correct_levels ty_res, +- duplicate_ident_types loc caselist env +- else ty_arg, ty_res, env in ++ correct_levels ty_res, duplicate_ident_types loc caselist env ++ else ty_res, env ++ in + let lev, env = + if has_gadts then begin + (* raise level for existentials *) +@@ -3072,10 +3116,10 @@ + let scope = Some (Annot.Idef loc) in + let (pat, ext_env, force, unpacks) = + let partial = +- if !Clflags.principal then Some false else None in +- let ty_arg = +- if dont_propagate then newvar () else instance ?partial env ty_arg +- in type_pattern ~lev env spat scope ty_arg ++ if !Clflags.principal || erase_either ++ then Some false else None in ++ let ty_arg = instance ?partial env ty_arg in ++ type_pattern ~lev env spat scope ty_arg + in + pattern_force := force @ !pattern_force; + let pat = +@@ -3134,7 +3178,11 @@ + else + Partial + in +- add_delayed_check (fun () -> Parmatch.check_unused env cases); ++ add_delayed_check ++ (fun () -> ++ List.iter (fun (pat, (env, _)) -> check_absent_variant env pat) ++ pat_env_list; ++ Parmatch.check_unused env cases); + if has_gadts then begin + end_def (); + (* Ensure that existential types do not escape *) +Index: typing/ctype.ml +=================================================================== +--- typing/ctype.ml (revision 13157) ++++ typing/ctype.ml (working copy) +@@ -981,6 +981,25 @@ + if keep then more else newty more.desc + | _ -> assert false + in ++ (* Open row if partial for pattern and contains Reither *) ++ let more', row = ++ match partial with ++ Some (free_univars, false) when row.row_closed ++ && not row.row_fixed && TypeSet.is_empty (free_univars ty) -> ++ let not_reither (_, f) = ++ match row_field_repr f with ++ Reither _ -> false ++ | _ -> true ++ in ++ if List.for_all not_reither row.row_fields ++ then (more', row) else ++ (newty2 (if keep then more.level else !current_level) ++ (Tvar None), ++ {row_fields = List.filter not_reither row.row_fields; ++ row_more = more; row_bound = (); ++ row_closed = false; row_fixed = false; row_name = None}) ++ | _ -> (more', row) ++ in + (* Register new type first for recursion *) + more.desc <- Tsubst(newgenty(Ttuple[more';t])); + (* Return a new copy *) +Index: testsuite/tests/typing-gadts/test.ml.reference +=================================================================== +--- testsuite/tests/typing-gadts/test.ml.reference (revision 13157) ++++ testsuite/tests/typing-gadts/test.ml.reference (working copy) +@@ -62,11 +62,11 @@ + ^^^^^^^^ + Error: This pattern matches values of type int t + but a pattern was expected which matches values of type s t +-# Characters 224-237: +- | `A, BoolLit _ -> () +- ^^^^^^^^^^^^^ +-Error: This pattern matches values of type ([? `A ] as 'a) * bool t +- but a pattern was expected which matches values of type 'a * int t ++# module Polymorphic_variants : ++ sig ++ type _ t = IntLit : int -> int t | BoolLit : bool -> bool t ++ val eval : [ `A ] * 's t -> unit ++ end + # module Propagation : + sig + type _ t = IntLit : int -> int t | BoolLit : bool -> bool t +Index: testsuite/tests/typing-gadts/test.ml.principal.reference +=================================================================== +--- testsuite/tests/typing-gadts/test.ml.principal.reference (revision 13157) ++++ testsuite/tests/typing-gadts/test.ml.principal.reference (working copy) +@@ -62,11 +62,11 @@ + ^^^^^^^^ + Error: This pattern matches values of type int t + but a pattern was expected which matches values of type s t +-# Characters 224-237: +- | `A, BoolLit _ -> () +- ^^^^^^^^^^^^^ +-Error: This pattern matches values of type ([? `A ] as 'a) * bool t +- but a pattern was expected which matches values of type 'a * int t ++# module Polymorphic_variants : ++ sig ++ type _ t = IntLit : int -> int t | BoolLit : bool -> bool t ++ val eval : [ `A ] * 's t -> unit ++ end + # Characters 299-300: + | BoolLit b -> b + ^ diff --git a/experimental/garrigue/show_types.diff b/experimental/garrigue/show_types.diff new file mode 100644 index 00000000..f59105ee --- /dev/null +++ b/experimental/garrigue/show_types.diff @@ -0,0 +1,419 @@ +Index: parsing/printast.mli +=================================================================== +--- parsing/printast.mli (revision 13955) ++++ parsing/printast.mli (working copy) +@@ -16,3 +16,4 @@ + val interface : formatter -> signature_item list -> unit;; + val implementation : formatter -> structure_item list -> unit;; + val top_phrase : formatter -> toplevel_phrase -> unit;; ++val string_of_kind : ident_kind -> string;; +Index: parsing/pprintast.ml +=================================================================== +--- parsing/pprintast.ml (revision 13955) ++++ parsing/pprintast.ml (working copy) +@@ -1192,8 +1192,10 @@ + | Pdir_none -> () + | Pdir_string (s) -> pp f "@ %S" s + | Pdir_int (i) -> pp f "@ %d" i +- | Pdir_ident (li) -> pp f "@ %a" self#longident li +- | Pdir_bool (b) -> pp f "@ %s" (string_of_bool b)) ++ | Pdir_ident {txt=li} -> pp f "@ %a" self#longident li ++ | Pdir_bool (b) -> pp f "@ %s" (string_of_bool b) ++ | Pdir_show (k, {txt=li}) -> ++ pp f "@ %s %a" (Printast.string_of_kind k) self#longident li) + + method toplevel_phrase f x = + match x with +Index: parsing/parser.mly +=================================================================== +--- parsing/parser.mly (revision 13955) ++++ parsing/parser.mly (working copy) +@@ -516,9 +516,9 @@ + | SEMISEMI EOF { [] } + | SEMISEMI seq_expr use_file_tail { Ptop_def[mkstrexp $2] :: $3 } + | SEMISEMI structure_item use_file_tail { Ptop_def[$2] :: $3 } +- | SEMISEMI toplevel_directive use_file_tail { $2 :: $3 } + | structure_item use_file_tail { Ptop_def[$1] :: $2 } +- | toplevel_directive use_file_tail { $1 :: $2 } ++ | SEMISEMI toplevel_directive SEMISEMI use_file_tail { $2 :: $4 } ++ | toplevel_directive SEMISEMI use_file_tail { $1 :: $3 } + ; + + /* Module expressions */ +@@ -1779,16 +1779,26 @@ + | FALSE { Lident "false" } + | TRUE { Lident "true" } + ; ++ident_kind: ++ VAL { Pkind_val } ++ | TYPE { Pkind_type } ++ | EXCEPTION { Pkind_exception } ++ | MODULE { Pkind_module } ++ | MODULE TYPE { Pkind_modtype } ++ | CLASS { Pkind_class } ++ | CLASS TYPE { Pkind_cltype } ++; + + /* Toplevel directives */ + + toplevel_directive: +- SHARP ident { Ptop_dir($2, Pdir_none) } +- | SHARP ident STRING { Ptop_dir($2, Pdir_string $3) } +- | SHARP ident INT { Ptop_dir($2, Pdir_int $3) } +- | SHARP ident val_longident { Ptop_dir($2, Pdir_ident $3) } +- | SHARP ident FALSE { Ptop_dir($2, Pdir_bool false) } +- | SHARP ident TRUE { Ptop_dir($2, Pdir_bool true) } ++ SHARP ident { Ptop_dir($2, Pdir_none) } ++ | SHARP ident STRING { Ptop_dir($2, Pdir_string $3) } ++ | SHARP ident INT { Ptop_dir($2, Pdir_int $3) } ++ | SHARP ident val_longident { Ptop_dir($2, Pdir_ident (mkrhs $3 3)) } ++ | SHARP ident ident_kind any_longident { Ptop_dir($2, Pdir_show ($3, mkrhs $4 4)) } ++ | SHARP ident FALSE { Ptop_dir($2, Pdir_bool false) } ++ | SHARP ident TRUE { Ptop_dir($2, Pdir_bool true) } + ; + + /* Miscellaneous */ +Index: parsing/parsetree.mli +=================================================================== +--- parsing/parsetree.mli (revision 13955) ++++ parsing/parsetree.mli (working copy) +@@ -294,6 +294,15 @@ + + (* Toplevel phrases *) + ++type ident_kind = ++ Pkind_val ++ | Pkind_type ++ | Pkind_exception ++ | Pkind_module ++ | Pkind_modtype ++ | Pkind_class ++ | Pkind_cltype ++ + type toplevel_phrase = + Ptop_def of structure + | Ptop_dir of string * directive_argument +@@ -302,5 +311,6 @@ + Pdir_none + | Pdir_string of string + | Pdir_int of int +- | Pdir_ident of Longident.t ++ | Pdir_ident of Longident.t Location.loc ++ | Pdir_show of ident_kind * Longident.t Location.loc + | Pdir_bool of bool +Index: parsing/printast.ml +=================================================================== +--- parsing/printast.ml (revision 13955) ++++ parsing/printast.ml (working copy) +@@ -737,6 +737,16 @@ + core_type (i+1) ppf ct + ;; + ++let string_of_kind = function ++ Pkind_val -> "val" ++ | Pkind_type -> "type" ++ | Pkind_exception -> "exception" ++ | Pkind_module -> "module" ++ | Pkind_modtype -> "module type" ++ | Pkind_class -> "class" ++ | Pkind_cltype -> "class type" ++;; ++ + let rec toplevel_phrase i ppf x = + match x with + | Ptop_def (s) -> +@@ -751,7 +761,9 @@ + | Pdir_none -> line i ppf "Pdir_none\n" + | Pdir_string (s) -> line i ppf "Pdir_string \"%s\"\n" s; + | Pdir_int (i) -> line i ppf "Pdir_int %d\n" i; +- | Pdir_ident (li) -> line i ppf "Pdir_ident %a\n" fmt_longident li; ++ | Pdir_ident {txt=li} -> line i ppf "Pdir_ident %a\n" fmt_longident li; ++ | Pdir_show (kind,{txt=li}) -> ++ line i ppf "Pdir_show %s %a\n" (string_of_kind kind) fmt_longident li; + | Pdir_bool (b) -> line i ppf "Pdir_bool %s\n" (string_of_bool b); + ;; + +Index: toplevel/opttoploop.ml +=================================================================== +--- toplevel/opttoploop.ml (revision 13955) ++++ toplevel/opttoploop.ml (working copy) +@@ -53,6 +53,7 @@ + | Directive_string of (string -> unit) + | Directive_int of (int -> unit) + | Directive_ident of (Longident.t -> unit) ++ | Directive_show of (ident_kind -> Longident.t -> unit) + | Directive_bool of (bool -> unit) + + +@@ -270,6 +271,7 @@ + | (Directive_string f, Pdir_string s) -> f s; true + | (Directive_int f, Pdir_int n) -> f n; true + | (Directive_ident f, Pdir_ident lid) -> f lid; true ++ | (Directive_show f, Pdir_show (kind,lid)) -> f kind lid; true + | (Directive_bool f, Pdir_bool b) -> f b; true + | (_, _) -> + fprintf ppf "Wrong type of argument for directive `%s'.@." dir_name; +Index: toplevel/topdirs.ml +=================================================================== +--- toplevel/topdirs.ml (revision 13955) ++++ toplevel/topdirs.ml (working copy) +@@ -15,6 +15,7 @@ + open Format + open Misc + open Longident ++open Parsetree + open Types + open Cmo_format + open Trace +@@ -191,9 +192,9 @@ + Ctype.generalize ty_arg; + ty_arg + +-let find_printer_type ppf lid = ++let find_printer_type ppf {Location.loc; txt=lid} = + try +- let (path, desc) = Env.lookup_value lid !toplevel_env in ++ let (path, desc) = Typetexp.find_value !toplevel_env loc lid in + let (ty_arg, is_old_style) = + try + (match_printer_type ppf desc "printer_type_new", false) +@@ -201,12 +202,12 @@ + (match_printer_type ppf desc "printer_type_old", true) in + (ty_arg, path, is_old_style) + with +- | Not_found -> +- fprintf ppf "Unbound value %a.@." Printtyp.longident lid; ++ Typetexp.Error _ as exn -> ++ Errors.report_error ppf exn; + raise Exit + | Ctype.Unify _ -> + fprintf ppf "%a has a wrong type for a printing function.@." +- Printtyp.longident lid; ++ Printtyp.longident lid; + raise Exit + + let dir_install_printer ppf lid = +@@ -227,7 +228,7 @@ + begin try + remove_printer path + with Not_found -> +- fprintf ppf "No printer named %a.@." Printtyp.longident lid ++ fprintf ppf "No printer named %a.@." Printtyp.longident lid.Location.txt + end + with Exit -> () + +@@ -244,9 +245,9 @@ + get_code_pointer + (Obj.repr (fun arg -> Trace.print_trace (current_environment()) arg)) + +-let dir_trace ppf lid = ++let dir_trace ppf {Location.loc; txt=lid} = + try +- let (path, desc) = Env.lookup_value lid !toplevel_env in ++ let (path, desc) = Typetexp.find_value !toplevel_env loc lid in + (* Check if this is a primitive *) + match desc.val_kind with + | Val_prim p -> +@@ -278,11 +279,11 @@ + fprintf ppf "%a is now traced.@." Printtyp.longident lid + end else fprintf ppf "%a is not a function.@." Printtyp.longident lid + with +- | Not_found -> fprintf ppf "Unbound value %a.@." Printtyp.longident lid ++ Typetexp.Error _ as exn -> Errors.report_error ppf exn + +-let dir_untrace ppf lid = ++let dir_untrace ppf {Location.loc; txt=lid} = + try +- let (path, desc) = Env.lookup_value lid !toplevel_env in ++ let (path, desc) = Typetexp.find_value !toplevel_env loc lid in + let rec remove = function + | [] -> + fprintf ppf "%a was not traced.@." Printtyp.longident lid; +@@ -295,7 +296,7 @@ + end else f :: remove rem in + traced_functions := remove !traced_functions + with +- | Not_found -> fprintf ppf "Unbound value %a.@." Printtyp.longident lid ++ Typetexp.Error _ as exn -> Errors.report_error ppf exn + + let dir_untrace_all ppf () = + List.iter +@@ -305,10 +306,74 @@ + !traced_functions; + traced_functions := [] + ++(* Warnings *) ++ + let parse_warnings ppf iserr s = + try Warnings.parse_options iserr s + with Arg.Bad err -> fprintf ppf "%s.@." err + ++(* Typing information *) ++ ++let rec trim_modtype = function ++ Mty_signature _ -> Mty_signature [] ++ | Mty_functor (id, mty, mty') -> ++ Mty_functor (id, mty, trim_modtype mty') ++ | Mty_ident _ as mty -> mty ++ ++let trim_signature = function ++ Mty_signature sg -> ++ Mty_signature ++ (List.map ++ (function ++ Sig_module (id, mty, rs) -> ++ Sig_module (id, trim_modtype mty, rs) ++ (*| Sig_modtype (id, Modtype_manifest mty) -> ++ Sig_modtype (id, Modtype_manifest (trim_modtype mty))*) ++ | item -> item) ++ sg) ++ | mty -> mty ++ ++let dir_show ppf kind {Location.loc; txt=lid} = ++ let env = !Toploop.toplevel_env in ++ try ++ let id = ++ let s = match lid with ++ Longident.Lident s -> s ++ | Longident.Ldot (_,s) -> s ++ | Longident.Lapply _ -> failwith "invalid" ++ in Ident.create_persistent s ++ in ++ let item = ++ match kind with ++ Pkind_val -> ++ let path, desc = Typetexp.find_value env loc lid in ++ Sig_value (id, desc) ++ | Pkind_type -> ++ let path, desc = Typetexp.find_type env loc lid in ++ Sig_type (id, desc, Trec_not) ++ | Pkind_exception -> ++ let desc = Typetexp.find_constructor env loc lid in ++ Sig_exception (id, {exn_args=desc.cstr_args; exn_loc=Location.none}) ++ | Pkind_module -> ++ let path, desc = Typetexp.find_module env loc lid in ++ Sig_module (id, trim_signature desc, Trec_not) ++ | Pkind_modtype -> ++ let path, desc = Typetexp.find_modtype env loc lid in ++ Sig_modtype (id, desc) ++ | Pkind_class -> ++ let path, desc = Typetexp.find_class env loc lid in ++ Sig_class (id, desc, Trec_not) ++ | Pkind_cltype -> ++ let path, desc = Typetexp.find_class_type env loc lid in ++ Sig_class_type (id, desc, Trec_not) ++ in ++ fprintf ppf "%a@." Printtyp.signature [item] ++ with ++ Not_found -> ++ fprintf ppf "Unknown %s.@." (Printast.string_of_kind kind) ++ | Failure "invalid" -> ++ fprintf ppf "Invalid path %a@." Printtyp.longident lid ++ + let _ = + Hashtbl.add directive_table "trace" (Directive_ident (dir_trace std_out)); + Hashtbl.add directive_table "untrace" (Directive_ident (dir_untrace std_out)); +@@ -337,4 +402,7 @@ + (Directive_string (parse_warnings std_out false)); + + Hashtbl.add directive_table "warn_error" +- (Directive_string (parse_warnings std_out true)) ++ (Directive_string (parse_warnings std_out true)); ++ ++ Hashtbl.add directive_table "show" ++ (Directive_show (dir_show std_out)) +Index: toplevel/toploop.ml +=================================================================== +--- toplevel/toploop.ml (revision 13955) ++++ toplevel/toploop.ml (working copy) +@@ -25,7 +25,8 @@ + | Directive_none of (unit -> unit) + | Directive_string of (string -> unit) + | Directive_int of (int -> unit) +- | Directive_ident of (Longident.t -> unit) ++ | Directive_ident of (Longident.t Location.loc -> unit) ++ | Directive_show of (ident_kind -> Longident.t Location.loc -> unit) + | Directive_bool of (bool -> unit) + + (* The table of toplevel value bindings and its accessors *) +@@ -280,6 +281,7 @@ + | (Directive_string f, Pdir_string s) -> f s; true + | (Directive_int f, Pdir_int n) -> f n; true + | (Directive_ident f, Pdir_ident lid) -> f lid; true ++ | (Directive_show f, Pdir_show (kind,lid)) -> f kind lid; true + | (Directive_bool f, Pdir_bool b) -> f b; true + | (_, _) -> + fprintf ppf "Wrong type of argument for directive `%s'.@." dir_name; +Index: toplevel/topdirs.mli +=================================================================== +--- toplevel/topdirs.mli (revision 13955) ++++ toplevel/topdirs.mli (working copy) +@@ -20,11 +20,12 @@ + val dir_cd : string -> unit + val dir_load : formatter -> string -> unit + val dir_use : formatter -> string -> unit +-val dir_install_printer : formatter -> Longident.t -> unit +-val dir_remove_printer : formatter -> Longident.t -> unit +-val dir_trace : formatter -> Longident.t -> unit +-val dir_untrace : formatter -> Longident.t -> unit ++val dir_install_printer : formatter -> Longident.t Location.loc -> unit ++val dir_remove_printer : formatter -> Longident.t Location.loc -> unit ++val dir_trace : formatter -> Longident.t Location.loc -> unit ++val dir_untrace : formatter -> Longident.t Location.loc -> unit + val dir_untrace_all : formatter -> unit -> unit ++val dir_show : formatter -> Parsetree.ident_kind -> Longident.t Location.loc -> unit + + type 'a printer_type_new = Format.formatter -> 'a -> unit + type 'a printer_type_old = 'a -> unit +Index: toplevel/toploop.mli +=================================================================== +--- toplevel/toploop.mli (revision 13955) ++++ toplevel/toploop.mli (working copy) +@@ -37,7 +37,8 @@ + | Directive_none of (unit -> unit) + | Directive_string of (string -> unit) + | Directive_int of (int -> unit) +- | Directive_ident of (Longident.t -> unit) ++ | Directive_ident of (Longident.t Location.loc -> unit) ++ | Directive_show of (Parsetree.ident_kind -> Longident.t Location.loc -> unit) + | Directive_bool of (bool -> unit) + + val directive_table : (string, directive_fun) Hashtbl.t +Index: tools/Makefile.shared +=================================================================== +--- tools/Makefile.shared (revision 13955) ++++ tools/Makefile.shared (working copy) +@@ -210,6 +210,7 @@ + ../parsing/location.cmo \ + ../parsing/longident.cmo \ + ../parsing/lexer.cmo \ ++ ../parsing/printast.cmo \ + ../parsing/pprintast.cmo \ + ../typing/ident.cmo \ + ../typing/path.cmo \ +Index: camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml +=================================================================== +--- camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml (revision 13955) ++++ camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml (working copy) +@@ -1229,7 +1229,7 @@ + | ExInt _ i -> Pdir_int (int_of_string i) + | <:expr< True >> -> Pdir_bool True + | <:expr< False >> -> Pdir_bool False +- | e -> Pdir_ident (ident_noloc (ident_of_expr e)) ] ++ | e -> Pdir_ident (ident (ident_of_expr e)) ] + ; + + value phrase = +Index: camlp4/boot/Camlp4.ml +=================================================================== +--- camlp4/boot/Camlp4.ml (revision 13955) ++++ camlp4/boot/Camlp4.ml (working copy) +@@ -15686,7 +15686,7 @@ + | ExInt (_, i) -> Pdir_int (int_of_string i) + | Ast.ExId (_, (Ast.IdUid (_, "True"))) -> Pdir_bool true + | Ast.ExId (_, (Ast.IdUid (_, "False"))) -> Pdir_bool false +- | e -> Pdir_ident (ident_noloc (ident_of_expr e)) ++ | e -> Pdir_ident (ident (ident_of_expr e)) + + let phrase = + function diff --git a/experimental/garrigue/tests.ml b/experimental/garrigue/tests.ml new file mode 100644 index 00000000..c39d152f --- /dev/null +++ b/experimental/garrigue/tests.ml @@ -0,0 +1,22 @@ +(* $Id$ *) + +let f1 = function `a x -> x=1 | `b -> true +let f2 = function `a x -> x | `b -> true +let f3 = function `b -> true +let f x = f1 x && f2 x + +let sub s ?:pos{=0} ?:len{=String.length s - pos} () = + String.sub s pos len + +let cCAMLtoTKpack_options w = function + `After v1 -> "-after" + | `Anchor v1 -> "-anchor" + | `Before v1 -> "-before" + | `Expand v1 -> "-expand" + | `Fill v1 -> "-fill" + | `In v1 -> "-in" + | `Ipadx v1 -> "-ipadx" + | `Ipady v1 -> "-ipady" + | `Padx v1 -> "-padx" + | `Pady v1 -> "-pady" + | `Side v1 -> "-side" diff --git a/experimental/garrigue/valvirt.diff b/experimental/garrigue/valvirt.diff new file mode 100644 index 00000000..2cf55742 --- /dev/null +++ b/experimental/garrigue/valvirt.diff @@ -0,0 +1,2349 @@ +Index: utils/warnings.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/utils/warnings.ml,v +retrieving revision 1.23 +diff -u -r1.23 warnings.ml +--- utils/warnings.ml 15 Sep 2005 03:09:26 -0000 1.23 ++++ utils/warnings.ml 5 Apr 2006 02:25:59 -0000 +@@ -26,7 +26,7 @@ + | Statement_type (* S *) + | Unused_match (* U *) + | Unused_pat +- | Hide_instance_variable of string (* V *) ++ | Instance_variable_override of string (* V *) + | Illegal_backslash (* X *) + | Implicit_public_methods of string list + | Unerasable_optional_argument +@@ -54,7 +54,7 @@ + | Statement_type -> 's' + | Unused_match + | Unused_pat -> 'u' +- | Hide_instance_variable _ -> 'v' ++ | Instance_variable_override _ -> 'v' + | Illegal_backslash + | Implicit_public_methods _ + | Unerasable_optional_argument +@@ -126,9 +126,9 @@ + String.concat " " + ("the following methods are overridden \ + by the inherited class:\n " :: slist) +- | Hide_instance_variable lab -> +- "this definition of an instance variable " ^ lab ^ +- " hides a previously\ndefined instance variable of the same name." ++ | Instance_variable_override lab -> ++ "the instance variable " ^ lab ^ " is overridden.\n" ^ ++ "The behaviour changed in ocaml 3.10 (previous behaviour was hiding.)" + | Partial_application -> + "this function application is partial,\n\ + maybe some arguments are missing." +Index: utils/warnings.mli +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/utils/warnings.mli,v +retrieving revision 1.16 +diff -u -r1.16 warnings.mli +--- utils/warnings.mli 15 Sep 2005 03:09:26 -0000 1.16 ++++ utils/warnings.mli 5 Apr 2006 02:25:59 -0000 +@@ -26,7 +26,7 @@ + | Statement_type (* S *) + | Unused_match (* U *) + | Unused_pat +- | Hide_instance_variable of string (* V *) ++ | Instance_variable_override of string (* V *) + | Illegal_backslash (* X *) + | Implicit_public_methods of string list + | Unerasable_optional_argument +Index: parsing/parser.mly +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/parsing/parser.mly,v +retrieving revision 1.123 +diff -u -r1.123 parser.mly +--- parsing/parser.mly 23 Mar 2005 03:08:37 -0000 1.123 ++++ parsing/parser.mly 5 Apr 2006 02:25:59 -0000 +@@ -623,6 +623,8 @@ + { [] } + | class_fields INHERIT class_expr parent_binder + { Pcf_inher ($3, $4) :: $1 } ++ | class_fields VAL virtual_value ++ { Pcf_valvirt $3 :: $1 } + | class_fields VAL value + { Pcf_val $3 :: $1 } + | class_fields virtual_method +@@ -638,14 +640,20 @@ + AS LIDENT + { Some $2 } + | /* empty */ +- {None} ++ { None } ++; ++virtual_value: ++ MUTABLE VIRTUAL label COLON core_type ++ { $3, Mutable, $5, symbol_rloc () } ++ | VIRTUAL mutable_flag label COLON core_type ++ { $3, $2, $5, symbol_rloc () } + ; + value: +- mutable_flag label EQUAL seq_expr +- { $2, $1, $4, symbol_rloc () } +- | mutable_flag label type_constraint EQUAL seq_expr +- { $2, $1, (let (t, t') = $3 in ghexp(Pexp_constraint($5, t, t'))), +- symbol_rloc () } ++ mutable_flag label EQUAL seq_expr ++ { $2, $1, $4, symbol_rloc () } ++ | mutable_flag label type_constraint EQUAL seq_expr ++ { $2, $1, (let (t, t') = $3 in ghexp(Pexp_constraint($5, t, t'))), ++ symbol_rloc () } + ; + virtual_method: + METHOD PRIVATE VIRTUAL label COLON poly_type +@@ -711,8 +719,12 @@ + | class_sig_fields CONSTRAINT constrain { Pctf_cstr $3 :: $1 } + ; + value_type: +- mutable_flag label COLON core_type +- { $2, $1, Some $4, symbol_rloc () } ++ VIRTUAL mutable_flag label COLON core_type ++ { $3, $2, Virtual, $5, symbol_rloc () } ++ | MUTABLE virtual_flag label COLON core_type ++ { $3, Mutable, $2, $5, symbol_rloc () } ++ | label COLON core_type ++ { $1, Immutable, Concrete, $3, symbol_rloc () } + ; + method_type: + METHOD private_flag label COLON poly_type +Index: parsing/parsetree.mli +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/parsing/parsetree.mli,v +retrieving revision 1.42 +diff -u -r1.42 parsetree.mli +--- parsing/parsetree.mli 23 Mar 2005 03:08:37 -0000 1.42 ++++ parsing/parsetree.mli 5 Apr 2006 02:25:59 -0000 +@@ -152,7 +152,7 @@ + + and class_type_field = + Pctf_inher of class_type +- | Pctf_val of (string * mutable_flag * core_type option * Location.t) ++ | Pctf_val of (string * mutable_flag * virtual_flag * core_type * Location.t) + | Pctf_virt of (string * private_flag * core_type * Location.t) + | Pctf_meth of (string * private_flag * core_type * Location.t) + | Pctf_cstr of (core_type * core_type * Location.t) +@@ -179,6 +179,7 @@ + + and class_field = + Pcf_inher of class_expr * string option ++ | Pcf_valvirt of (string * mutable_flag * core_type * Location.t) + | Pcf_val of (string * mutable_flag * expression * Location.t) + | Pcf_virt of (string * private_flag * core_type * Location.t) + | Pcf_meth of (string * private_flag * expression * Location.t) +Index: parsing/printast.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/parsing/printast.ml,v +retrieving revision 1.29 +diff -u -r1.29 printast.ml +--- parsing/printast.ml 4 Jan 2006 16:55:50 -0000 1.29 ++++ parsing/printast.ml 5 Apr 2006 02:25:59 -0000 +@@ -353,10 +353,11 @@ + | Pctf_inher (ct) -> + line i ppf "Pctf_inher\n"; + class_type i ppf ct; +- | Pctf_val (s, mf, cto, loc) -> ++ | Pctf_val (s, mf, vf, ct, loc) -> + line i ppf +- "Pctf_val \"%s\" %a %a\n" s fmt_mutable_flag mf fmt_location loc; +- option i core_type ppf cto; ++ "Pctf_val \"%s\" %a %a %a\n" s ++ fmt_mutable_flag mf fmt_virtual_flag vf fmt_location loc; ++ core_type (i+1) ppf ct; + | Pctf_virt (s, pf, ct, loc) -> + line i ppf + "Pctf_virt \"%s\" %a %a\n" s fmt_private_flag pf fmt_location loc; +@@ -428,6 +429,10 @@ + line i ppf "Pcf_inher\n"; + class_expr (i+1) ppf ce; + option (i+1) string ppf so; ++ | Pcf_valvirt (s, mf, ct, loc) -> ++ line i ppf ++ "Pcf_valvirt \"%s\" %a %a\n" s fmt_mutable_flag mf fmt_location loc; ++ core_type (i+1) ppf ct; + | Pcf_val (s, mf, e, loc) -> + line i ppf + "Pcf_val \"%s\" %a %a\n" s fmt_mutable_flag mf fmt_location loc; +Index: typing/btype.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/btype.ml,v +retrieving revision 1.38 +diff -u -r1.38 btype.ml +--- typing/btype.ml 4 Jan 2006 16:55:50 -0000 1.38 ++++ typing/btype.ml 5 Apr 2006 02:25:59 -0000 +@@ -330,7 +330,7 @@ + + let unmark_class_signature sign = + unmark_type sign.cty_self; +- Vars.iter (fun l (m, t) -> unmark_type t) sign.cty_vars ++ Vars.iter (fun l (m, v, t) -> unmark_type t) sign.cty_vars + + let rec unmark_class_type = + function +Index: typing/ctype.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/ctype.ml,v +retrieving revision 1.200 +diff -u -r1.200 ctype.ml +--- typing/ctype.ml 6 Jan 2006 02:16:24 -0000 1.200 ++++ typing/ctype.ml 5 Apr 2006 02:25:59 -0000 +@@ -857,7 +857,7 @@ + Tcty_signature + {cty_self = copy sign.cty_self; + cty_vars = +- Vars.map (function (mut, ty) -> (mut, copy ty)) sign.cty_vars; ++ Vars.map (function (m, v, ty) -> (m, v, copy ty)) sign.cty_vars; + cty_concr = sign.cty_concr; + cty_inher = + List.map (fun (p,tl) -> (p, List.map copy tl)) sign.cty_inher} +@@ -2354,10 +2354,11 @@ + | CM_Val_type_mismatch of string * (type_expr * type_expr) list + | CM_Meth_type_mismatch of string * (type_expr * type_expr) list + | CM_Non_mutable_value of string ++ | CM_Non_concrete_value of string + | CM_Missing_value of string + | CM_Missing_method of string + | CM_Hide_public of string +- | CM_Hide_virtual of string ++ | CM_Hide_virtual of string * string + | CM_Public_method of string + | CM_Private_method of string + | CM_Virtual_method of string +@@ -2390,8 +2391,8 @@ + end) + pairs; + Vars.iter +- (fun lab (mut, ty) -> +- let (mut', ty') = Vars.find lab sign1.cty_vars in ++ (fun lab (mut, v, ty) -> ++ let (mut', v', ty') = Vars.find lab sign1.cty_vars in + try moregen true type_pairs env ty' ty with Unify trace -> + raise (Failure [CM_Val_type_mismatch + (lab, expand_trace env trace)])) +@@ -2437,7 +2438,7 @@ + end + in + if Concr.mem lab sign1.cty_concr then err +- else CM_Hide_virtual lab::err) ++ else CM_Hide_virtual ("method", lab) :: err) + miss1 [] + in + let missing_method = List.map (fun (m, _, _) -> m) miss2 in +@@ -2455,11 +2456,13 @@ + in + let error = + Vars.fold +- (fun lab (mut, ty) err -> ++ (fun lab (mut, vr, ty) err -> + try +- let (mut', ty') = Vars.find lab sign1.cty_vars in ++ let (mut', vr', ty') = Vars.find lab sign1.cty_vars in + if mut = Mutable && mut' <> Mutable then + CM_Non_mutable_value lab::err ++ else if vr = Concrete && vr' <> Concrete then ++ CM_Non_concrete_value lab::err + else + err + with Not_found -> +@@ -2467,6 +2470,14 @@ + sign2.cty_vars error + in + let error = ++ Vars.fold ++ (fun lab (_,vr,_) err -> ++ if vr = Virtual && not (Vars.mem lab sign2.cty_vars) then ++ CM_Hide_virtual ("instance variable", lab) :: err ++ else err) ++ sign1.cty_vars error ++ in ++ let error = + List.fold_right + (fun e l -> + if List.mem e missing_method then l else CM_Virtual_method e::l) +@@ -2516,8 +2527,8 @@ + end) + pairs; + Vars.iter +- (fun lab (mut, ty) -> +- let (mut', ty') = Vars.find lab sign1.cty_vars in ++ (fun lab (_, _, ty) -> ++ let (_, _, ty') = Vars.find lab sign1.cty_vars in + try eqtype true type_pairs subst env ty ty' with Unify trace -> + raise (Failure [CM_Val_type_mismatch + (lab, expand_trace env trace)])) +@@ -2554,7 +2565,7 @@ + end + in + if Concr.mem lab sign1.cty_concr then err +- else CM_Hide_virtual lab::err) ++ else CM_Hide_virtual ("method", lab) :: err) + miss1 [] + in + let missing_method = List.map (fun (m, _, _) -> m) miss2 in +@@ -2578,11 +2589,13 @@ + in + let error = + Vars.fold +- (fun lab (mut, ty) err -> ++ (fun lab (mut, vr, ty) err -> + try +- let (mut', ty') = Vars.find lab sign1.cty_vars in ++ let (mut', vr', ty') = Vars.find lab sign1.cty_vars in + if mut = Mutable && mut' <> Mutable then + CM_Non_mutable_value lab::err ++ else if vr = Concrete && vr' <> Concrete then ++ CM_Non_concrete_value lab::err + else + err + with Not_found -> +@@ -2590,6 +2603,14 @@ + sign2.cty_vars error + in + let error = ++ Vars.fold ++ (fun lab (_,vr,_) err -> ++ if vr = Virtual && not (Vars.mem lab sign2.cty_vars) then ++ CM_Hide_virtual ("instance variable", lab) :: err ++ else err) ++ sign1.cty_vars error ++ in ++ let error = + List.fold_right + (fun e l -> + if List.mem e missing_method then l else CM_Virtual_method e::l) +@@ -3279,7 +3300,7 @@ + let nondep_class_signature env id sign = + { cty_self = nondep_type_rec env id sign.cty_self; + cty_vars = +- Vars.map (function (m, t) -> (m, nondep_type_rec env id t)) ++ Vars.map (function (m, v, t) -> (m, v, nondep_type_rec env id t)) + sign.cty_vars; + cty_concr = sign.cty_concr; + cty_inher = +Index: typing/ctype.mli +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/ctype.mli,v +retrieving revision 1.53 +diff -u -r1.53 ctype.mli +--- typing/ctype.mli 9 Dec 2004 12:40:53 -0000 1.53 ++++ typing/ctype.mli 5 Apr 2006 02:25:59 -0000 +@@ -170,10 +170,11 @@ + | CM_Val_type_mismatch of string * (type_expr * type_expr) list + | CM_Meth_type_mismatch of string * (type_expr * type_expr) list + | CM_Non_mutable_value of string ++ | CM_Non_concrete_value of string + | CM_Missing_value of string + | CM_Missing_method of string + | CM_Hide_public of string +- | CM_Hide_virtual of string ++ | CM_Hide_virtual of string * string + | CM_Public_method of string + | CM_Private_method of string + | CM_Virtual_method of string +Index: typing/includeclass.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/includeclass.ml,v +retrieving revision 1.7 +diff -u -r1.7 includeclass.ml +--- typing/includeclass.ml 6 Mar 2000 22:11:57 -0000 1.7 ++++ typing/includeclass.ml 5 Apr 2006 02:25:59 -0000 +@@ -78,14 +78,17 @@ + | CM_Non_mutable_value lab -> + fprintf ppf + "@[The non-mutable instance variable %s cannot become mutable@]" lab ++ | CM_Non_concrete_value lab -> ++ fprintf ppf ++ "@[The virtual instance variable %s cannot become concrete@]" lab + | CM_Missing_value lab -> + fprintf ppf "@[The first class type has no instance variable %s@]" lab + | CM_Missing_method lab -> + fprintf ppf "@[The first class type has no method %s@]" lab + | CM_Hide_public lab -> + fprintf ppf "@[The public method %s cannot be hidden@]" lab +- | CM_Hide_virtual lab -> +- fprintf ppf "@[The virtual method %s cannot be hidden@]" lab ++ | CM_Hide_virtual (k, lab) -> ++ fprintf ppf "@[The virtual %s %s cannot be hidden@]" k lab + | CM_Public_method lab -> + fprintf ppf "@[The public method %s cannot become private" lab + | CM_Virtual_method lab -> +Index: typing/oprint.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/oprint.ml,v +retrieving revision 1.22 +diff -u -r1.22 oprint.ml +--- typing/oprint.ml 23 Mar 2005 03:08:37 -0000 1.22 ++++ typing/oprint.ml 5 Apr 2006 02:25:59 -0000 +@@ -291,8 +291,10 @@ + fprintf ppf "@[<2>method %s%s%s :@ %a@]" + (if priv then "private " else "") (if virt then "virtual " else "") + name !out_type ty +- | Ocsg_value (name, mut, ty) -> +- fprintf ppf "@[<2>val %s%s :@ %a@]" (if mut then "mutable " else "") ++ | Ocsg_value (name, mut, vr, ty) -> ++ fprintf ppf "@[<2>val %s%s%s :@ %a@]" ++ (if mut then "mutable " else "") ++ (if vr then "virtual " else "") + name !out_type ty + + let out_class_type = ref print_out_class_type +Index: typing/outcometree.mli +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/outcometree.mli,v +retrieving revision 1.14 +diff -u -r1.14 outcometree.mli +--- typing/outcometree.mli 23 Mar 2005 03:08:37 -0000 1.14 ++++ typing/outcometree.mli 5 Apr 2006 02:25:59 -0000 +@@ -71,7 +71,7 @@ + and out_class_sig_item = + | Ocsg_constraint of out_type * out_type + | Ocsg_method of string * bool * bool * out_type +- | Ocsg_value of string * bool * out_type ++ | Ocsg_value of string * bool * bool * out_type + + type out_module_type = + | Omty_abstract +Index: typing/printtyp.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/printtyp.ml,v +retrieving revision 1.140 +diff -u -r1.140 printtyp.ml +--- typing/printtyp.ml 4 Jan 2006 16:55:50 -0000 1.140 ++++ typing/printtyp.ml 5 Apr 2006 02:26:00 -0000 +@@ -650,7 +650,7 @@ + Ctype.flatten_fields (Ctype.object_fields sign.cty_self) + in + List.iter (fun met -> mark_loops (method_type met)) fields; +- Vars.iter (fun _ (_, ty) -> mark_loops ty) sign.cty_vars ++ Vars.iter (fun _ (_, _, ty) -> mark_loops ty) sign.cty_vars + | Tcty_fun (_, ty, cty) -> + mark_loops ty; + prepare_class_type params cty +@@ -682,13 +682,15 @@ + csil (tree_of_constraints params) + in + let all_vars = +- Vars.fold (fun l (m, t) all -> (l, m, t) :: all) sign.cty_vars [] in ++ Vars.fold (fun l (m, v, t) all -> (l, m, v, t) :: all) sign.cty_vars [] ++ in + (* Consequence of PR#3607: order of Map.fold has changed! *) + let all_vars = List.rev all_vars in + let csil = + List.fold_left +- (fun csil (l, m, t) -> +- Ocsg_value (l, m = Mutable, tree_of_typexp sch t) :: csil) ++ (fun csil (l, m, v, t) -> ++ Ocsg_value (l, m = Mutable, v = Virtual, tree_of_typexp sch t) ++ :: csil) + csil all_vars + in + let csil = +@@ -763,7 +765,9 @@ + List.exists + (fun (lab, _, ty) -> + not (lab = dummy_method || Concr.mem lab sign.cty_concr)) +- fields in ++ fields ++ || Vars.fold (fun _ (_,vr,_) b -> vr = Virtual || b) sign.cty_vars false ++ in + + Osig_class_type + (virt, Ident.name id, +Index: typing/subst.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/subst.ml,v +retrieving revision 1.49 +diff -u -r1.49 subst.ml +--- typing/subst.ml 4 Jan 2006 16:55:50 -0000 1.49 ++++ typing/subst.ml 5 Apr 2006 02:26:00 -0000 +@@ -178,7 +178,8 @@ + + let class_signature s sign = + { cty_self = typexp s sign.cty_self; +- cty_vars = Vars.map (function (m, t) -> (m, typexp s t)) sign.cty_vars; ++ cty_vars = ++ Vars.map (function (m, v, t) -> (m, v, typexp s t)) sign.cty_vars; + cty_concr = sign.cty_concr; + cty_inher = + List.map (fun (p, tl) -> (type_path s p, List.map (typexp s) tl)) +Index: typing/typeclass.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/typeclass.ml,v +retrieving revision 1.85 +diff -u -r1.85 typeclass.ml +--- typing/typeclass.ml 22 Jul 2005 06:42:36 -0000 1.85 ++++ typing/typeclass.ml 5 Apr 2006 02:26:00 -0000 +@@ -24,7 +24,7 @@ + + type error = + Unconsistent_constraint of (type_expr * type_expr) list +- | Method_type_mismatch of string * (type_expr * type_expr) list ++ | Field_type_mismatch of string * string * (type_expr * type_expr) list + | Structure_expected of class_type + | Cannot_apply of class_type + | Apply_wrong_label of label +@@ -36,7 +36,7 @@ + | Unbound_class_type_2 of Longident.t + | Abbrev_type_clash of type_expr * type_expr * type_expr + | Constructor_type_mismatch of string * (type_expr * type_expr) list +- | Virtual_class of bool * string list ++ | Virtual_class of bool * string list * string list + | Parameter_arity_mismatch of Longident.t * int * int + | Parameter_mismatch of (type_expr * type_expr) list + | Bad_parameters of Ident.t * type_expr * type_expr +@@ -49,6 +49,7 @@ + | Non_collapsable_conjunction of + Ident.t * Types.class_declaration * (type_expr * type_expr) list + | Final_self_clash of (type_expr * type_expr) list ++ | Mutability_mismatch of string * mutable_flag + + exception Error of Location.t * error + +@@ -90,7 +91,7 @@ + generalize_class_type cty + | Tcty_signature {cty_self = sty; cty_vars = vars; cty_inher = inher} -> + Ctype.generalize sty; +- Vars.iter (fun _ (_, ty) -> Ctype.generalize ty) vars; ++ Vars.iter (fun _ (_, _, ty) -> Ctype.generalize ty) vars; + List.iter (fun (_,tl) -> List.iter Ctype.generalize tl) inher + | Tcty_fun (_, ty, cty) -> + Ctype.generalize ty; +@@ -152,7 +153,7 @@ + | Tcty_signature sign -> + Ctype.closed_schema sign.cty_self + && +- Vars.fold (fun _ (_, ty) cc -> Ctype.closed_schema ty && cc) ++ Vars.fold (fun _ (_, _, ty) cc -> Ctype.closed_schema ty && cc) + sign.cty_vars + true + | Tcty_fun (_, ty, cty) -> +@@ -172,7 +173,7 @@ + limited_generalize rv cty + | Tcty_signature sign -> + Ctype.limited_generalize rv sign.cty_self; +- Vars.iter (fun _ (_, ty) -> Ctype.limited_generalize rv ty) ++ Vars.iter (fun _ (_, _, ty) -> Ctype.limited_generalize rv ty) + sign.cty_vars; + List.iter (fun (_, tl) -> List.iter (Ctype.limited_generalize rv) tl) + sign.cty_inher +@@ -201,11 +202,25 @@ + Env.add_value id {val_type = ty; val_kind = Val_unbound} par_env) + + (* Enter an instance variable in the environment *) +-let enter_val cl_num vars lab mut ty val_env met_env par_env = +- let (id, val_env, met_env, par_env) as result = +- enter_met_env lab (Val_ivar (mut, cl_num)) ty val_env met_env par_env ++let enter_val cl_num vars inh lab mut virt ty val_env met_env par_env loc = ++ let (id, virt) = ++ try ++ let (id, mut', virt', ty') = Vars.find lab !vars in ++ if mut' <> mut then raise (Error(loc, Mutability_mismatch(lab, mut))); ++ Ctype.unify val_env (Ctype.instance ty) (Ctype.instance ty'); ++ (if not inh then Some id else None), ++ (if virt' = Concrete then virt' else virt) ++ with ++ Ctype.Unify tr -> ++ raise (Error(loc, Field_type_mismatch("instance variable", lab, tr))) ++ | Not_found -> None, virt ++ in ++ let (id, _, _, _) as result = ++ match id with Some id -> (id, val_env, met_env, par_env) ++ | None -> ++ enter_met_env lab (Val_ivar (mut, cl_num)) ty val_env met_env par_env + in +- vars := Vars.add lab (id, mut, ty) !vars; ++ vars := Vars.add lab (id, mut, virt, ty) !vars; + result + + let inheritance self_type env concr_meths warn_meths loc parent = +@@ -218,7 +233,7 @@ + with Ctype.Unify trace -> + match trace with + _::_::_::({desc = Tfield(n, _, _, _)}, _)::rem -> +- raise(Error(loc, Method_type_mismatch (n, rem))) ++ raise(Error(loc, Field_type_mismatch ("method", n, rem))) + | _ -> + assert false + end; +@@ -243,7 +258,7 @@ + in + let ty = transl_simple_type val_env false sty in + try Ctype.unify val_env ty ty' with Ctype.Unify trace -> +- raise(Error(loc, Method_type_mismatch (lab, trace))) ++ raise(Error(loc, Field_type_mismatch ("method", lab, trace))) + + let delayed_meth_specs = ref [] + +@@ -253,7 +268,7 @@ + in + let unif ty = + try Ctype.unify val_env ty ty' with Ctype.Unify trace -> +- raise(Error(loc, Method_type_mismatch (lab, trace))) ++ raise(Error(loc, Field_type_mismatch ("method", lab, trace))) + in + match sty.ptyp_desc, priv with + Ptyp_poly ([],sty), Public -> +@@ -279,6 +294,15 @@ + + (*******************************) + ++let add_val env loc lab (mut, virt, ty) val_sig = ++ let virt = ++ try ++ let (mut', virt', ty') = Vars.find lab val_sig in ++ if virt' = Concrete then virt' else virt ++ with Not_found -> virt ++ in ++ Vars.add lab (mut, virt, ty) val_sig ++ + let rec class_type_field env self_type meths (val_sig, concr_meths, inher) = + function + Pctf_inher sparent -> +@@ -293,25 +317,12 @@ + parent + in + let val_sig = +- Vars.fold +- (fun lab (mut, ty) val_sig -> Vars.add lab (mut, ty) val_sig) +- cl_sig.cty_vars val_sig +- in ++ Vars.fold (add_val env sparent.pcty_loc) cl_sig.cty_vars val_sig in + (val_sig, concr_meths, inher) + +- | Pctf_val (lab, mut, sty_opt, loc) -> +- let (mut, ty) = +- match sty_opt with +- None -> +- let (mut', ty) = +- try Vars.find lab val_sig with Not_found -> +- raise(Error(loc, Unbound_val lab)) +- in +- (if mut = Mutable then mut' else Immutable), ty +- | Some sty -> +- mut, transl_simple_type env false sty +- in +- (Vars.add lab (mut, ty) val_sig, concr_meths, inher) ++ | Pctf_val (lab, mut, virt, sty, loc) -> ++ let ty = transl_simple_type env false sty in ++ (add_val env loc lab (mut, virt, ty) val_sig, concr_meths, inher) + + | Pctf_virt (lab, priv, sty, loc) -> + declare_method env meths self_type lab priv sty loc; +@@ -397,7 +408,7 @@ + + let rec class_field cl_num self_type meths vars + (val_env, met_env, par_env, fields, concr_meths, warn_meths, +- inh_vals, inher) = ++ warn_vals, inher) = + function + Pcf_inher (sparent, super) -> + let parent = class_expr cl_num val_env par_env sparent in +@@ -411,18 +422,23 @@ + parent.cl_type + in + (* Variables *) +- let (val_env, met_env, par_env, inh_vars, inh_vals) = ++ let (val_env, met_env, par_env, inh_vars, warn_vals) = + Vars.fold +- (fun lab (mut, ty) (val_env, met_env, par_env, inh_vars, inh_vals) -> ++ (fun lab info (val_env, met_env, par_env, inh_vars, warn_vals) -> ++ let mut, vr, ty = info in + let (id, val_env, met_env, par_env) = +- enter_val cl_num vars lab mut ty val_env met_env par_env ++ enter_val cl_num vars true lab mut vr ty val_env met_env par_env ++ sparent.pcl_loc + in +- if StringSet.mem lab inh_vals then +- Location.prerr_warning sparent.pcl_loc +- (Warnings.Hide_instance_variable lab); +- (val_env, met_env, par_env, (lab, id) :: inh_vars, +- StringSet.add lab inh_vals)) +- cl_sig.cty_vars (val_env, met_env, par_env, [], inh_vals) ++ let warn_vals = ++ if vr = Virtual then warn_vals else ++ if StringSet.mem lab warn_vals then ++ (Location.prerr_warning sparent.pcl_loc ++ (Warnings.Instance_variable_override lab); warn_vals) ++ else StringSet.add lab warn_vals ++ in ++ (val_env, met_env, par_env, (lab, id) :: inh_vars, warn_vals)) ++ cl_sig.cty_vars (val_env, met_env, par_env, [], warn_vals) + in + (* Inherited concrete methods *) + let inh_meths = +@@ -443,11 +459,26 @@ + in + (val_env, met_env, par_env, + lazy(Cf_inher (parent, inh_vars, inh_meths))::fields, +- concr_meths, warn_meths, inh_vals, inher) ++ concr_meths, warn_meths, warn_vals, inher) ++ ++ | Pcf_valvirt (lab, mut, styp, loc) -> ++ if !Clflags.principal then Ctype.begin_def (); ++ let ty = Typetexp.transl_simple_type val_env false styp in ++ if !Clflags.principal then begin ++ Ctype.end_def (); ++ Ctype.generalize_structure ty ++ end; ++ let (id, val_env, met_env', par_env) = ++ enter_val cl_num vars false lab mut Virtual ty ++ val_env met_env par_env loc ++ in ++ (val_env, met_env', par_env, ++ lazy(Cf_val (lab, id, None, met_env' == met_env)) :: fields, ++ concr_meths, warn_meths, StringSet.remove lab warn_vals, inher) + + | Pcf_val (lab, mut, sexp, loc) -> +- if StringSet.mem lab inh_vals then +- Location.prerr_warning loc (Warnings.Hide_instance_variable lab); ++ if StringSet.mem lab warn_vals then ++ Location.prerr_warning loc (Warnings.Instance_variable_override lab); + if !Clflags.principal then Ctype.begin_def (); + let exp = + try type_exp val_env sexp with Ctype.Unify [(ty, _)] -> +@@ -457,17 +488,19 @@ + Ctype.end_def (); + Ctype.generalize_structure exp.exp_type + end; +- let (id, val_env, met_env, par_env) = +- enter_val cl_num vars lab mut exp.exp_type val_env met_env par_env +- in +- (val_env, met_env, par_env, lazy(Cf_val (lab, id, exp)) :: fields, +- concr_meths, warn_meths, inh_vals, inher) ++ let (id, val_env, met_env', par_env) = ++ enter_val cl_num vars false lab mut Concrete exp.exp_type ++ val_env met_env par_env loc ++ in ++ (val_env, met_env', par_env, ++ lazy(Cf_val (lab, id, Some exp, met_env' == met_env)) :: fields, ++ concr_meths, warn_meths, StringSet.add lab warn_vals, inher) + + | Pcf_virt (lab, priv, sty, loc) -> + virtual_method val_env meths self_type lab priv sty loc; + let warn_meths = Concr.remove lab warn_meths in + (val_env, met_env, par_env, fields, concr_meths, warn_meths, +- inh_vals, inher) ++ warn_vals, inher) + + | Pcf_meth (lab, priv, expr, loc) -> + let (_, ty) = +@@ -493,7 +526,7 @@ + end + | _ -> assert false + with Ctype.Unify trace -> +- raise(Error(loc, Method_type_mismatch (lab, trace))) ++ raise(Error(loc, Field_type_mismatch ("method", lab, trace))) + end; + let meth_expr = make_method cl_num expr in + (* backup variables for Pexp_override *) +@@ -510,12 +543,12 @@ + Cf_meth (lab, texp) + end in + (val_env, met_env, par_env, field::fields, +- Concr.add lab concr_meths, Concr.add lab warn_meths, inh_vals, inher) ++ Concr.add lab concr_meths, Concr.add lab warn_meths, warn_vals, inher) + + | Pcf_cstr (sty, sty', loc) -> + type_constraint val_env sty sty' loc; + (val_env, met_env, par_env, fields, concr_meths, warn_meths, +- inh_vals, inher) ++ warn_vals, inher) + + | Pcf_let (rec_flag, sdefs, loc) -> + let (defs, val_env) = +@@ -545,7 +578,7 @@ + ([], met_env, par_env) + in + (val_env, met_env, par_env, lazy(Cf_let(rec_flag, defs, vals))::fields, +- concr_meths, warn_meths, inh_vals, inher) ++ concr_meths, warn_meths, warn_vals, inher) + + | Pcf_init expr -> + let expr = make_method cl_num expr in +@@ -562,7 +595,7 @@ + Cf_init texp + end in + (val_env, met_env, par_env, field::fields, +- concr_meths, warn_meths, inh_vals, inher) ++ concr_meths, warn_meths, warn_vals, inher) + + and class_structure cl_num final val_env met_env loc (spat, str) = + (* Environment for substructures *) +@@ -616,7 +649,7 @@ + Ctype.unify val_env self_type (Ctype.newvar ()); + let sign = + {cty_self = public_self; +- cty_vars = Vars.map (function (id, mut, ty) -> (mut, ty)) !vars; ++ cty_vars = Vars.map (fun (id, mut, vr, ty) -> (mut, vr, ty)) !vars; + cty_concr = concr_meths; + cty_inher = inher} in + let methods = get_methods self_type in +@@ -628,7 +661,11 @@ + be modified after this point *) + Ctype.close_object self_type; + let mets = virtual_methods {sign with cty_self = self_type} in +- if mets <> [] then raise(Error(loc, Virtual_class(true, mets))); ++ let vals = ++ Vars.fold ++ (fun name (mut, vr, ty) l -> if vr = Virtual then name :: l else l) ++ sign.cty_vars [] in ++ if mets <> [] then raise(Error(loc, Virtual_class(true, mets, vals))); + let self_methods = + List.fold_right + (fun (lab,kind,ty) rem -> +@@ -1135,9 +1172,14 @@ + in + + if cl.pci_virt = Concrete then begin +- match virtual_methods (Ctype.signature_of_class_type typ) with +- [] -> () +- | mets -> raise(Error(cl.pci_loc, Virtual_class(define_class, mets))) ++ let sign = Ctype.signature_of_class_type typ in ++ let mets = virtual_methods sign in ++ let vals = ++ Vars.fold ++ (fun name (mut, vr, ty) l -> if vr = Virtual then name :: l else l) ++ sign.cty_vars [] in ++ if mets <> [] || vals <> [] then ++ raise(Error(cl.pci_loc, Virtual_class(true, mets, vals))); + end; + + (* Misc. *) +@@ -1400,10 +1442,10 @@ + Printtyp.report_unification_error ppf trace + (fun ppf -> fprintf ppf "Type") + (fun ppf -> fprintf ppf "is not compatible with type") +- | Method_type_mismatch (m, trace) -> ++ | Field_type_mismatch (k, m, trace) -> + Printtyp.report_unification_error ppf trace + (function ppf -> +- fprintf ppf "The method %s@ has type" m) ++ fprintf ppf "The %s %s@ has type" k m) + (function ppf -> + fprintf ppf "but is expected to have type") + | Structure_expected clty -> +@@ -1451,15 +1493,20 @@ + fprintf ppf "The expression \"new %s\" has type" c) + (function ppf -> + fprintf ppf "but is used with type") +- | Virtual_class (cl, mets) -> ++ | Virtual_class (cl, mets, vals) -> + let print_mets ppf mets = + List.iter (function met -> fprintf ppf "@ %s" met) mets in + let cl_mark = if cl then "" else " type" in ++ let missings = ++ match mets, vals with ++ [], _ -> "variables" ++ | _, [] -> "methods" ++ | _ -> "methods and variables" ++ in + fprintf ppf +- "@[This class%s should be virtual@ \ +- @[<2>The following methods are undefined :%a@] +- @]" +- cl_mark print_mets mets ++ "@[This class%s should be virtual.@ \ ++ @[<2>The following %s are undefined :%a@]@]" ++ cl_mark missings print_mets (mets @ vals) + | Parameter_arity_mismatch(lid, expected, provided) -> + fprintf ppf + "@[The class constructor %a@ expects %i type argument(s),@ \ +@@ -1532,3 +1579,10 @@ + fprintf ppf "This object is expected to have type") + (function ppf -> + fprintf ppf "but has actually type") ++ | Mutability_mismatch (lab, mut) -> ++ let mut1, mut2 = ++ if mut = Immutable then "mutable", "immutable" ++ else "immutable", "mutable" in ++ fprintf ppf ++ "@[The instance variable is %s,@ it cannot be redefined as %s@]" ++ mut1 mut2 +Index: typing/typeclass.mli +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/typeclass.mli,v +retrieving revision 1.18 +diff -u -r1.18 typeclass.mli +--- typing/typeclass.mli 1 Dec 2003 00:32:11 -0000 1.18 ++++ typing/typeclass.mli 5 Apr 2006 02:26:00 -0000 +@@ -49,7 +49,7 @@ + + type error = + Unconsistent_constraint of (type_expr * type_expr) list +- | Method_type_mismatch of string * (type_expr * type_expr) list ++ | Field_type_mismatch of string * string * (type_expr * type_expr) list + | Structure_expected of class_type + | Cannot_apply of class_type + | Apply_wrong_label of label +@@ -61,7 +61,7 @@ + | Unbound_class_type_2 of Longident.t + | Abbrev_type_clash of type_expr * type_expr * type_expr + | Constructor_type_mismatch of string * (type_expr * type_expr) list +- | Virtual_class of bool * string list ++ | Virtual_class of bool * string list * string list + | Parameter_arity_mismatch of Longident.t * int * int + | Parameter_mismatch of (type_expr * type_expr) list + | Bad_parameters of Ident.t * type_expr * type_expr +@@ -74,6 +74,7 @@ + | Non_collapsable_conjunction of + Ident.t * Types.class_declaration * (type_expr * type_expr) list + | Final_self_clash of (type_expr * type_expr) list ++ | Mutability_mismatch of string * mutable_flag + + exception Error of Location.t * error + +Index: typing/typecore.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/typecore.ml,v +retrieving revision 1.178 +diff -u -r1.178 typecore.ml +--- typing/typecore.ml 6 Jan 2006 02:25:37 -0000 1.178 ++++ typing/typecore.ml 5 Apr 2006 02:26:00 -0000 +@@ -611,11 +611,11 @@ + List.for_all + (function + Cf_meth _ -> true +- | Cf_val (_,_,e) -> incr count; is_nonexpansive e ++ | Cf_val (_,_,e,_) -> incr count; is_nonexpansive_opt e + | Cf_init e -> is_nonexpansive e + | Cf_inher _ | Cf_let _ -> false) + fields && +- Vars.fold (fun _ (mut,_) b -> decr count; b && mut = Immutable) ++ Vars.fold (fun _ (mut,_,_) b -> decr count; b && mut = Immutable) + vars true && + !count = 0 + | _ -> false +@@ -1356,7 +1356,7 @@ + (path_self, _) -> + let type_override (lab, snewval) = + begin try +- let (id, _, ty) = Vars.find lab !vars in ++ let (id, _, _, ty) = Vars.find lab !vars in + (Path.Pident id, type_expect env snewval (instance ty)) + with + Not_found -> +Index: typing/typecore.mli +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/typecore.mli,v +retrieving revision 1.37 +diff -u -r1.37 typecore.mli +--- typing/typecore.mli 4 Mar 2005 14:51:31 -0000 1.37 ++++ typing/typecore.mli 5 Apr 2006 02:26:00 -0000 +@@ -38,7 +38,8 @@ + string -> type_expr -> Env.t -> Env.t -> Env.t -> Parsetree.pattern -> + Typedtree.pattern * + (Ident.t * type_expr) Meths.t ref * +- (Ident.t * Asttypes.mutable_flag * type_expr) Vars.t ref * ++ (Ident.t * Asttypes.mutable_flag * Asttypes.virtual_flag * type_expr) ++ Vars.t ref * + Env.t * Env.t * Env.t + val type_expect: + ?in_function:(Location.t * type_expr) -> +Index: typing/typedtree.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/typedtree.ml,v +retrieving revision 1.36 +diff -u -r1.36 typedtree.ml +--- typing/typedtree.ml 25 Nov 2003 09:20:43 -0000 1.36 ++++ typing/typedtree.ml 5 Apr 2006 02:26:00 -0000 +@@ -106,7 +106,7 @@ + + and class_field = + Cf_inher of class_expr * (string * Ident.t) list * (string * Ident.t) list +- | Cf_val of string * Ident.t * expression ++ | Cf_val of string * Ident.t * expression option * bool + | Cf_meth of string * expression + | Cf_let of rec_flag * (pattern * expression) list * + (Ident.t * expression) list +@@ -140,7 +140,8 @@ + | Tstr_recmodule of (Ident.t * module_expr) list + | Tstr_modtype of Ident.t * module_type + | Tstr_open of Path.t +- | Tstr_class of (Ident.t * int * string list * class_expr) list ++ | Tstr_class of ++ (Ident.t * int * string list * class_expr * virtual_flag) list + | Tstr_cltype of (Ident.t * cltype_declaration) list + | Tstr_include of module_expr * Ident.t list + +Index: typing/typedtree.mli +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/typedtree.mli,v +retrieving revision 1.34 +diff -u -r1.34 typedtree.mli +--- typing/typedtree.mli 25 Nov 2003 09:20:43 -0000 1.34 ++++ typing/typedtree.mli 5 Apr 2006 02:26:00 -0000 +@@ -107,7 +107,8 @@ + and class_field = + Cf_inher of class_expr * (string * Ident.t) list * (string * Ident.t) list + (* Inherited instance variables and concrete methods *) +- | Cf_val of string * Ident.t * expression ++ | Cf_val of string * Ident.t * expression option * bool ++ (* None = virtual, true = override *) + | Cf_meth of string * expression + | Cf_let of rec_flag * (pattern * expression) list * + (Ident.t * expression) list +@@ -141,7 +142,8 @@ + | Tstr_recmodule of (Ident.t * module_expr) list + | Tstr_modtype of Ident.t * module_type + | Tstr_open of Path.t +- | Tstr_class of (Ident.t * int * string list * class_expr) list ++ | Tstr_class of ++ (Ident.t * int * string list * class_expr * virtual_flag) list + | Tstr_cltype of (Ident.t * cltype_declaration) list + | Tstr_include of module_expr * Ident.t list + +Index: typing/typemod.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/typemod.ml,v +retrieving revision 1.73 +diff -u -r1.73 typemod.ml +--- typing/typemod.ml 8 Aug 2005 09:41:51 -0000 1.73 ++++ typing/typemod.ml 5 Apr 2006 02:26:00 -0000 +@@ -17,6 +17,7 @@ + open Misc + open Longident + open Path ++open Asttypes + open Parsetree + open Types + open Typedtree +@@ -667,8 +668,9 @@ + let (classes, new_env) = Typeclass.class_declarations env cl in + let (str_rem, sig_rem, final_env) = type_struct new_env srem in + (Tstr_class +- (List.map (fun (i, _,_,_,_,_,_,_, s, m, c) -> +- (i, s, m, c)) classes) :: ++ (List.map (fun (i, d, _,_,_,_,_,_, s, m, c) -> ++ let vf = if d.cty_new = None then Virtual else Concrete in ++ (i, s, m, c, vf)) classes) :: + Tstr_cltype + (List.map (fun (_,_, i, d, _,_,_,_,_,_,_) -> (i, d)) classes) :: + Tstr_type +Index: typing/types.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/types.ml,v +retrieving revision 1.25 +diff -u -r1.25 types.ml +--- typing/types.ml 9 Dec 2004 12:40:53 -0000 1.25 ++++ typing/types.ml 5 Apr 2006 02:26:00 -0000 +@@ -90,7 +90,8 @@ + | Val_prim of Primitive.description (* Primitive *) + | Val_ivar of mutable_flag * string (* Instance variable (mutable ?) *) + | Val_self of (Ident.t * type_expr) Meths.t ref * +- (Ident.t * Asttypes.mutable_flag * type_expr) Vars.t ref * ++ (Ident.t * Asttypes.mutable_flag * ++ Asttypes.virtual_flag * type_expr) Vars.t ref * + string * type_expr + (* Self *) + | Val_anc of (string * Ident.t) list * string +@@ -156,7 +157,8 @@ + + and class_signature = + { cty_self: type_expr; +- cty_vars: (Asttypes.mutable_flag * type_expr) Vars.t; ++ cty_vars: ++ (Asttypes.mutable_flag * Asttypes.virtual_flag * type_expr) Vars.t; + cty_concr: Concr.t; + cty_inher: (Path.t * type_expr list) list } + +Index: typing/types.mli +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/types.mli,v +retrieving revision 1.25 +diff -u -r1.25 types.mli +--- typing/types.mli 9 Dec 2004 12:40:53 -0000 1.25 ++++ typing/types.mli 5 Apr 2006 02:26:00 -0000 +@@ -91,7 +91,8 @@ + | Val_prim of Primitive.description (* Primitive *) + | Val_ivar of mutable_flag * string (* Instance variable (mutable ?) *) + | Val_self of (Ident.t * type_expr) Meths.t ref * +- (Ident.t * Asttypes.mutable_flag * type_expr) Vars.t ref * ++ (Ident.t * Asttypes.mutable_flag * ++ Asttypes.virtual_flag * type_expr) Vars.t ref * + string * type_expr + (* Self *) + | Val_anc of (string * Ident.t) list * string +@@ -158,7 +159,8 @@ + + and class_signature = + { cty_self: type_expr; +- cty_vars: (Asttypes.mutable_flag * type_expr) Vars.t; ++ cty_vars: ++ (Asttypes.mutable_flag * Asttypes.virtual_flag * type_expr) Vars.t; + cty_concr: Concr.t; + cty_inher: (Path.t * type_expr list) list } + +Index: typing/unused_var.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/typing/unused_var.ml,v +retrieving revision 1.5 +diff -u -r1.5 unused_var.ml +--- typing/unused_var.ml 4 Jan 2006 16:55:50 -0000 1.5 ++++ typing/unused_var.ml 5 Apr 2006 02:26:00 -0000 +@@ -245,7 +245,7 @@ + match cf with + | Pcf_inher (ce, _) -> class_expr ppf tbl ce; + | Pcf_val (_, _, e, _) -> expression ppf tbl e; +- | Pcf_virt _ -> () ++ | Pcf_virt _ | Pcf_valvirt _ -> () + | Pcf_meth (_, _, e, _) -> expression ppf tbl e; + | Pcf_cstr _ -> () + | Pcf_let (recflag, pel, _) -> let_pel ppf tbl recflag pel None; +Index: bytecomp/translclass.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/bytecomp/translclass.ml,v +retrieving revision 1.38 +diff -u -r1.38 translclass.ml +--- bytecomp/translclass.ml 13 Aug 2005 20:59:37 -0000 1.38 ++++ bytecomp/translclass.ml 5 Apr 2006 02:26:00 -0000 +@@ -133,10 +133,10 @@ + (fun _ -> lambda_unit) cl + in + (inh_init, lsequence obj_init' obj_init, true) +- | Cf_val (_, id, exp) -> ++ | Cf_val (_, id, Some exp, _) -> + (inh_init, lsequence (set_inst_var obj id exp) obj_init, + has_init) +- | Cf_meth _ -> ++ | Cf_meth _ | Cf_val _ -> + (inh_init, obj_init, has_init) + | Cf_init _ -> + (inh_init, obj_init, true) +@@ -213,27 +213,17 @@ + if len < 2 && nvals = 0 then Meths.fold (bind_method tbl) meths cl_init else + if len = 0 && nvals < 2 then transl_vals tbl true vals cl_init else + let ids = Ident.create "ids" in +- let i = ref len in +- let getter, names, cl_init = +- match vals with [] -> "get_method_labels", [], cl_init +- | (_,id0)::vals' -> +- incr i; +- let i = ref (List.length vals) in +- "new_methods_variables", +- [transl_meth_list (List.map fst vals)], +- Llet(Strict, id0, lfield ids 0, +- List.fold_right +- (fun (name,id) rem -> +- decr i; +- Llet(Alias, id, Lprim(Poffsetint !i, [Lvar id0]), rem)) +- vals' cl_init) ++ let i = ref (len + nvals) in ++ let getter, names = ++ if nvals = 0 then "get_method_labels", [] else ++ "new_methods_variables", [transl_meth_list (List.map fst vals)] + in + Llet(StrictOpt, ids, + Lapply (oo_prim getter, + [Lvar tbl; transl_meth_list (List.map fst methl)] @ names), + List.fold_right + (fun (lab,id) lam -> decr i; Llet(StrictOpt, id, lfield ids !i, lam)) +- methl cl_init) ++ (methl @ vals) cl_init) + + let output_methods tbl methods lam = + match methods with +@@ -283,8 +273,9 @@ + (vals, meths_super cla str.cl_meths meths) + inh_init cl_init msubst top cl in + (inh_init, cl_init, [], values) +- | Cf_val (name, id, exp) -> +- (inh_init, cl_init, methods, (name, id)::values) ++ | Cf_val (name, id, exp, over) -> ++ let values = if over then values else (name, id) :: values in ++ (inh_init, cl_init, methods, values) + | Cf_meth (name, exp) -> + let met_code = msubst true (transl_exp exp) in + let met_code = +@@ -342,27 +333,24 @@ + assert (Path.same path path'); + let lpath = transl_path path in + let inh = Ident.create "inh" +- and inh_vals = Ident.create "vals" +- and inh_meths = Ident.create "meths" ++ and ofs = List.length vals + 1 + and valids, methids = super in + let cl_init = + List.fold_left + (fun init (nm, id, _) -> +- Llet(StrictOpt, id, lfield inh_meths (index nm concr_meths), ++ Llet(StrictOpt, id, lfield inh (index nm concr_meths + ofs), + init)) + cl_init methids in + let cl_init = + List.fold_left + (fun init (nm, id) -> +- Llet(StrictOpt, id, lfield inh_vals (index nm vals), init)) ++ Llet(StrictOpt, id, lfield inh (index nm vals + 1), init)) + cl_init valids in + (inh_init, + Llet (Strict, inh, + Lapply(oo_prim "inherits", narrow_args @ + [lpath; Lconst(Const_pointer(if top then 1 else 0))]), +- Llet(StrictOpt, obj_init, lfield inh 0, +- Llet(Alias, inh_vals, lfield inh 1, +- Llet(Alias, inh_meths, lfield inh 2, cl_init))))) ++ Llet(StrictOpt, obj_init, lfield inh 0, cl_init))) + | _ -> + let core cl_init = + build_class_init cla true super inh_init cl_init msubst top cl +@@ -397,12 +385,16 @@ + XXX Il devrait etre peu couteux d'ecrire des classes : + class c x y = d e f + *) +-let rec transl_class_rebind obj_init cl = ++let rec transl_class_rebind obj_init cl vf = + match cl.cl_desc with + Tclass_ident path -> ++ if vf = Concrete then begin ++ try if (Env.find_class path cl.cl_env).cty_new = None then raise Exit ++ with Not_found -> raise Exit ++ end; + (path, obj_init) + | Tclass_fun (pat, _, cl, partial) -> +- let path, obj_init = transl_class_rebind obj_init cl in ++ let path, obj_init = transl_class_rebind obj_init cl vf in + let build params rem = + let param = name_pattern "param" [pat, ()] in + Lfunction (Curried, param::params, +@@ -414,14 +406,14 @@ + Lfunction (Curried, params, rem) -> build params rem + | rem -> build [] rem) + | Tclass_apply (cl, oexprs) -> +- let path, obj_init = transl_class_rebind obj_init cl in ++ let path, obj_init = transl_class_rebind obj_init cl vf in + (path, transl_apply obj_init oexprs) + | Tclass_let (rec_flag, defs, vals, cl) -> +- let path, obj_init = transl_class_rebind obj_init cl in ++ let path, obj_init = transl_class_rebind obj_init cl vf in + (path, Translcore.transl_let rec_flag defs obj_init) + | Tclass_structure _ -> raise Exit + | Tclass_constraint (cl', _, _, _) -> +- let path, obj_init = transl_class_rebind obj_init cl' in ++ let path, obj_init = transl_class_rebind obj_init cl' vf in + let rec check_constraint = function + Tcty_constr(path', _, _) when Path.same path path' -> () + | Tcty_fun (_, _, cty) -> check_constraint cty +@@ -430,21 +422,21 @@ + check_constraint cl.cl_type; + (path, obj_init) + +-let rec transl_class_rebind_0 self obj_init cl = ++let rec transl_class_rebind_0 self obj_init cl vf = + match cl.cl_desc with + Tclass_let (rec_flag, defs, vals, cl) -> +- let path, obj_init = transl_class_rebind_0 self obj_init cl in ++ let path, obj_init = transl_class_rebind_0 self obj_init cl vf in + (path, Translcore.transl_let rec_flag defs obj_init) + | _ -> +- let path, obj_init = transl_class_rebind obj_init cl in ++ let path, obj_init = transl_class_rebind obj_init cl vf in + (path, lfunction [self] obj_init) + +-let transl_class_rebind ids cl = ++let transl_class_rebind ids cl vf = + try + let obj_init = Ident.create "obj_init" + and self = Ident.create "self" in + let obj_init0 = lapply (Lvar obj_init) [Lvar self] in +- let path, obj_init' = transl_class_rebind_0 self obj_init0 cl in ++ let path, obj_init' = transl_class_rebind_0 self obj_init0 cl vf in + if not (Translcore.check_recursive_lambda ids obj_init') then + raise(Error(cl.cl_loc, Illegal_class_expr)); + let id = (obj_init' = lfunction [self] obj_init0) in +@@ -592,9 +584,9 @@ + *) + + +-let transl_class ids cl_id arity pub_meths cl = ++let transl_class ids cl_id arity pub_meths cl vflag = + (* First check if it is not only a rebind *) +- let rebind = transl_class_rebind ids cl in ++ let rebind = transl_class_rebind ids cl vflag in + if rebind <> lambda_unit then rebind else + + (* Prepare for heavy environment handling *) +@@ -696,9 +688,7 @@ + (* Simplest case: an object defined at toplevel (ids=[]) *) + if top && ids = [] then llets (ltable cla (ldirect obj_init)) else + +- let concrete = +- ids = [] || +- Typeclass.virtual_methods (Ctype.signature_of_class_type cl.cl_type) = [] ++ let concrete = (vflag = Concrete) + and lclass lam = + let cl_init = llets (Lfunction(Curried, [cla], cl_init)) in + Llet(Strict, class_init, cl_init, lam (free_variables cl_init)) +@@ -800,11 +790,11 @@ + + (* Wrapper for class compilation *) + +-let transl_class ids cl_id arity pub_meths cl = +- oo_wrap cl.cl_env false (transl_class ids cl_id arity pub_meths) cl ++let transl_class ids cl_id arity pub_meths cl vf = ++ oo_wrap cl.cl_env false (transl_class ids cl_id arity pub_meths cl) vf + + let () = +- transl_object := (fun id meths cl -> transl_class [] id 0 meths cl) ++ transl_object := (fun id meths cl -> transl_class [] id 0 meths cl Concrete) + + (* Error report *) + +Index: bytecomp/translclass.mli +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/bytecomp/translclass.mli,v +retrieving revision 1.11 +diff -u -r1.11 translclass.mli +--- bytecomp/translclass.mli 12 Aug 2004 12:55:11 -0000 1.11 ++++ bytecomp/translclass.mli 5 Apr 2006 02:26:00 -0000 +@@ -16,7 +16,8 @@ + open Lambda + + val transl_class : +- Ident.t list -> Ident.t -> int -> string list -> class_expr -> lambda;; ++ Ident.t list -> Ident.t -> ++ int -> string list -> class_expr -> Asttypes.virtual_flag -> lambda;; + + type error = Illegal_class_expr | Tags of string * string + +Index: bytecomp/translmod.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/bytecomp/translmod.ml,v +retrieving revision 1.51 +diff -u -r1.51 translmod.ml +--- bytecomp/translmod.ml 12 Aug 2004 12:55:11 -0000 1.51 ++++ bytecomp/translmod.ml 5 Apr 2006 02:26:00 -0000 +@@ -317,10 +317,10 @@ + | Tstr_open path :: rem -> + transl_structure fields cc rootpath rem + | Tstr_class cl_list :: rem -> +- let ids = List.map (fun (i, _, _, _) -> i) cl_list in ++ let ids = List.map (fun (i, _, _, _, _) -> i) cl_list in + Lletrec(List.map +- (fun (id, arity, meths, cl) -> +- (id, transl_class ids id arity meths cl)) ++ (fun (id, arity, meths, cl, vf) -> ++ (id, transl_class ids id arity meths cl vf)) + cl_list, + transl_structure (List.rev ids @ fields) cc rootpath rem) + | Tstr_cltype cl_list :: rem -> +@@ -414,11 +414,11 @@ + | Tstr_open path :: rem -> + transl_store subst rem + | Tstr_class cl_list :: rem -> +- let ids = List.map (fun (i, _, _, _) -> i) cl_list in ++ let ids = List.map (fun (i, _, _, _, _) -> i) cl_list in + let lam = + Lletrec(List.map +- (fun (id, arity, meths, cl) -> +- (id, transl_class ids id arity meths cl)) ++ (fun (id, arity, meths, cl, vf) -> ++ (id, transl_class ids id arity meths cl vf)) + cl_list, + store_idents ids) in + Lsequence(subst_lambda subst lam, +@@ -485,7 +485,7 @@ + | Tstr_modtype(id, decl) :: rem -> defined_idents rem + | Tstr_open path :: rem -> defined_idents rem + | Tstr_class cl_list :: rem -> +- List.map (fun (i, _, _, _) -> i) cl_list @ defined_idents rem ++ List.map (fun (i, _, _, _, _) -> i) cl_list @ defined_idents rem + | Tstr_cltype cl_list :: rem -> defined_idents rem + | Tstr_include(modl, ids) :: rem -> ids @ defined_idents rem + +@@ -603,14 +603,14 @@ + | Tstr_class cl_list -> + (* we need to use unique names for the classes because there might + be a value named identically *) +- let ids = List.map (fun (i, _, _, _) -> i) cl_list in ++ let ids = List.map (fun (i, _, _, _, _) -> i) cl_list in + List.iter set_toplevel_unique_name ids; + Lletrec(List.map +- (fun (id, arity, meths, cl) -> +- (id, transl_class ids id arity meths cl)) ++ (fun (id, arity, meths, cl, vf) -> ++ (id, transl_class ids id arity meths cl vf)) + cl_list, + make_sequence +- (fun (id, _, _, _) -> toploop_setvalue_id id) ++ (fun (id, _, _, _, _) -> toploop_setvalue_id id) + cl_list) + | Tstr_cltype cl_list -> + lambda_unit +Index: driver/main_args.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/driver/main_args.ml,v +retrieving revision 1.48 +diff -u -r1.48 main_args.ml +--- driver/main_args.ml 4 Jan 2006 16:55:49 -0000 1.48 ++++ driver/main_args.ml 5 Apr 2006 02:26:00 -0000 +@@ -136,11 +136,11 @@ + \032 E/e enable/disable fragile match\n\ + \032 F/f enable/disable partially applied function\n\ + \032 L/l enable/disable labels omitted in application\n\ +- \032 M/m enable/disable overridden method\n\ ++ \032 M/m enable/disable overridden methods\n\ + \032 P/p enable/disable partial match\n\ + \032 S/s enable/disable non-unit statement\n\ + \032 U/u enable/disable unused match case\n\ +- \032 V/v enable/disable hidden instance variable\n\ ++ \032 V/v enable/disable overridden instance variables\n\ + \032 Y/y enable/disable suspicious unused variables\n\ + \032 Z/z enable/disable all other unused variables\n\ + \032 X/x enable/disable all other warnings\n\ +Index: driver/optmain.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/driver/optmain.ml,v +retrieving revision 1.87 +diff -u -r1.87 optmain.ml +--- driver/optmain.ml 4 Jan 2006 16:55:49 -0000 1.87 ++++ driver/optmain.ml 5 Apr 2006 02:26:00 -0000 +@@ -173,7 +173,7 @@ + \032 P/p enable/disable partial match\n\ + \032 S/s enable/disable non-unit statement\n\ + \032 U/u enable/disable unused match case\n\ +- \032 V/v enable/disable hidden instance variables\n\ ++ \032 V/v enable/disable overridden instance variables\n\ + \032 Y/y enable/disable suspicious unused variables\n\ + \032 Z/z enable/disable all other unused variables\n\ + \032 X/x enable/disable all other warnings\n\ +Index: stdlib/camlinternalOO.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/stdlib/camlinternalOO.ml,v +retrieving revision 1.14 +diff -u -r1.14 camlinternalOO.ml +--- stdlib/camlinternalOO.ml 25 Oct 2005 18:34:07 -0000 1.14 ++++ stdlib/camlinternalOO.ml 5 Apr 2006 02:26:00 -0000 +@@ -206,7 +206,11 @@ + (table.methods_by_name, table.methods_by_label, table.hidden_meths, + table.vars, virt_meth_labs, vars) + :: table.previous_states; +- table.vars <- Vars.empty; ++ table.vars <- ++ Vars.fold ++ (fun lab info tvars -> ++ if List.mem lab vars then Vars.add lab info tvars else tvars) ++ table.vars Vars.empty; + let by_name = ref Meths.empty in + let by_label = ref Labs.empty in + List.iter2 +@@ -255,9 +259,11 @@ + index + + let new_variable table name = +- let index = new_slot table in +- table.vars <- Vars.add name index table.vars; +- index ++ try Vars.find name table.vars ++ with Not_found -> ++ let index = new_slot table in ++ table.vars <- Vars.add name index table.vars; ++ index + + let to_array arr = + if arr = Obj.magic 0 then [||] else arr +@@ -265,16 +271,17 @@ + let new_methods_variables table meths vals = + let meths = to_array meths in + let nmeths = Array.length meths and nvals = Array.length vals in +- let index = new_variable table vals.(0) in +- let res = Array.create (nmeths + 1) index in +- for i = 1 to nvals - 1 do ignore (new_variable table vals.(i)) done; ++ let res = Array.create (nmeths + nvals) 0 in + for i = 0 to nmeths - 1 do +- res.(i+1) <- get_method_label table meths.(i) ++ res.(i) <- get_method_label table meths.(i) ++ done; ++ for i = 0 to nvals - 1 do ++ res.(i+nmeths) <- new_variable table vals.(i) + done; + res + + let get_variable table name = +- Vars.find name table.vars ++ try Vars.find name table.vars with Not_found -> assert false + + let get_variables table names = + Array.map (get_variable table) names +@@ -315,9 +322,12 @@ + let init = + if top then super cla env else Obj.repr (super cla) in + widen cla; +- (init, Array.map (get_variable cla) (to_array vals), +- Array.map (fun nm -> get_method cla (get_method_label cla nm)) +- (to_array concr_meths)) ++ Array.concat ++ [[| repr init |]; ++ magic (Array.map (get_variable cla) (to_array vals) : int array); ++ Array.map ++ (fun nm -> repr (get_method cla (get_method_label cla nm) : closure)) ++ (to_array concr_meths) ] + + let make_class pub_meths class_init = + let table = create_table pub_meths in +Index: stdlib/camlinternalOO.mli +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/stdlib/camlinternalOO.mli,v +retrieving revision 1.9 +diff -u -r1.9 camlinternalOO.mli +--- stdlib/camlinternalOO.mli 25 Oct 2005 18:34:07 -0000 1.9 ++++ stdlib/camlinternalOO.mli 5 Apr 2006 02:26:00 -0000 +@@ -46,8 +46,7 @@ + val init_class : table -> unit + val inherits : + table -> string array -> string array -> string array -> +- (t * (table -> obj -> Obj.t) * t * obj) -> bool -> +- (Obj.t * int array * closure array) ++ (t * (table -> obj -> Obj.t) * t * obj) -> bool -> Obj.t array + val make_class : + string array -> (table -> Obj.t -> t) -> + (t * (table -> Obj.t -> t) * (Obj.t -> t) * Obj.t) +@@ -79,6 +78,7 @@ + + (** {6 Builtins to reduce code size} *) + ++(* + val get_const : t -> closure + val get_var : int -> closure + val get_env : int -> int -> closure +@@ -103,6 +103,7 @@ + val send_var : tag -> int -> int -> closure + val send_env : tag -> int -> int -> int -> closure + val send_meth : tag -> label -> int -> closure ++*) + + type impl = + GetConst +Index: stdlib/sys.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/stdlib/sys.ml,v +retrieving revision 1.142 +diff -u -r1.142 sys.ml +--- stdlib/sys.ml 22 Mar 2006 12:39:39 -0000 1.142 ++++ stdlib/sys.ml 5 Apr 2006 02:26:00 -0000 +@@ -78,4 +78,4 @@ + + (* OCaml version string, must be in the format described in sys.mli. *) + +-let ocaml_version = "3.10+dev4 (2006-03-22)";; ++let ocaml_version = "3.10+dev5 (2006-04-05)";; +Index: tools/depend.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/tools/depend.ml,v +retrieving revision 1.9 +diff -u -r1.9 depend.ml +--- tools/depend.ml 23 Mar 2005 03:08:37 -0000 1.9 ++++ tools/depend.ml 5 Apr 2006 02:26:00 -0000 +@@ -87,7 +87,7 @@ + + and add_class_type_field bv = function + Pctf_inher cty -> add_class_type bv cty +- | Pctf_val(_, _, oty, _) -> add_opt add_type bv oty ++ | Pctf_val(_, _, _, ty, _) -> add_type bv ty + | Pctf_virt(_, _, ty, _) -> add_type bv ty + | Pctf_meth(_, _, ty, _) -> add_type bv ty + | Pctf_cstr(ty1, ty2, _) -> add_type bv ty1; add_type bv ty2 +@@ -280,6 +280,7 @@ + and add_class_field bv = function + Pcf_inher(ce, _) -> add_class_expr bv ce + | Pcf_val(_, _, e, _) -> add_expr bv e ++ | Pcf_valvirt(_, _, ty, _) + | Pcf_virt(_, _, ty, _) -> add_type bv ty + | Pcf_meth(_, _, e, _) -> add_expr bv e + | Pcf_cstr(ty1, ty2, _) -> add_type bv ty1; add_type bv ty2 +Index: tools/ocamlprof.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/tools/ocamlprof.ml,v +retrieving revision 1.38 +diff -u -r1.38 ocamlprof.ml +--- tools/ocamlprof.ml 24 Mar 2005 17:20:54 -0000 1.38 ++++ tools/ocamlprof.ml 5 Apr 2006 02:26:00 -0000 +@@ -328,7 +328,7 @@ + rewrite_patexp_list iflag spat_sexp_list + | Pcf_init sexp -> + rewrite_exp iflag sexp +- | Pcf_virt _ | Pcf_cstr _ -> () ++ | Pcf_valvirt _ | Pcf_virt _ | Pcf_cstr _ -> () + + and rewrite_class_expr iflag cexpr = + match cexpr.pcl_desc with +Index: otherlibs/labltk/browser/searchpos.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/otherlibs/labltk/browser/searchpos.ml,v +retrieving revision 1.48 +diff -u -r1.48 searchpos.ml +--- otherlibs/labltk/browser/searchpos.ml 23 Mar 2005 03:08:37 -0000 1.48 ++++ otherlibs/labltk/browser/searchpos.ml 5 Apr 2006 02:26:01 -0000 +@@ -141,9 +141,8 @@ + List.iter cfl ~f: + begin function + Pctf_inher cty -> search_pos_class_type cty ~pos ~env +- | Pctf_val (_, _, Some ty, loc) -> ++ | Pctf_val (_, _, _, ty, loc) -> + if in_loc loc ~pos then search_pos_type ty ~pos ~env +- | Pctf_val _ -> () + | Pctf_virt (_, _, ty, loc) -> + if in_loc loc ~pos then search_pos_type ty ~pos ~env + | Pctf_meth (_, _, ty, loc) -> +@@ -675,7 +674,7 @@ + | Tstr_modtype _ -> () + | Tstr_open _ -> () + | Tstr_class l -> +- List.iter l ~f:(fun (id, _, _, cl) -> search_pos_class_expr cl ~pos) ++ List.iter l ~f:(fun (id, _, _, cl, _) -> search_pos_class_expr cl ~pos) + | Tstr_cltype _ -> () + | Tstr_include (m, _) -> search_pos_module_expr m ~pos + end +@@ -685,7 +684,8 @@ + begin function + Cf_inher (cl, _, _) -> + search_pos_class_expr cl ~pos +- | Cf_val (_, _, exp) -> search_pos_expr exp ~pos ++ | Cf_val (_, _, Some exp, _) -> search_pos_expr exp ~pos ++ | Cf_val _ -> () + | Cf_meth (_, exp) -> search_pos_expr exp ~pos + | Cf_let (_, pel, iel) -> + List.iter pel ~f: +Index: ocamldoc/Makefile +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/ocamldoc/Makefile,v +retrieving revision 1.61 +diff -u -r1.61 Makefile +--- ocamldoc/Makefile 4 Jan 2006 16:55:49 -0000 1.61 ++++ ocamldoc/Makefile 5 Apr 2006 02:26:01 -0000 +@@ -31,7 +31,7 @@ + MKDIR=mkdir -p + CP=cp -f + OCAMLDOC=ocamldoc +-OCAMLDOC_RUN=sh ./runocamldoc $(SUPPORTS_SHARED_LIBRARIES) ++OCAMLDOC_RUN=./ocamldoc.opt #sh ./runocamldoc $(SUPPORTS_SHARED_LIBRARIES) + OCAMLDOC_OPT=$(OCAMLDOC).opt + OCAMLDOC_LIBCMA=odoc_info.cma + OCAMLDOC_LIBCMI=odoc_info.cmi +@@ -188,12 +188,12 @@ + ../otherlibs/num/num.mli + + all: exe lib +- $(MAKE) manpages + + exe: $(OCAMLDOC) + lib: $(OCAMLDOC_LIBCMA) $(OCAMLDOC_LIBCMI) $(ODOC_TEST) + + opt.opt: exeopt libopt ++ $(MAKE) manpages + exeopt: $(OCAMLDOC_OPT) + libopt: $(OCAMLDOC_LIBCMXA) $(OCAMLDOC_LIBCMI) + debug: +Index: ocamldoc/odoc_ast.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/ocamldoc/odoc_ast.ml,v +retrieving revision 1.27 +diff -u -r1.27 odoc_ast.ml +--- ocamldoc/odoc_ast.ml 4 Jan 2006 16:55:49 -0000 1.27 ++++ ocamldoc/odoc_ast.ml 5 Apr 2006 02:26:01 -0000 +@@ -88,7 +88,7 @@ + ident_type_decl_list + | Typedtree.Tstr_class info_list -> + List.iter +- (fun ((id,_,_,_) as ci) -> ++ (fun ((id,_,_,_,_) as ci) -> + Hashtbl.add table (C (Name.from_ident id)) + (Typedtree.Tstr_class [ci])) + info_list +@@ -146,7 +146,7 @@ + + let search_class_exp table name = + match Hashtbl.find table (C name) with +- | (Typedtree.Tstr_class [(_,_,_,ce)]) -> ++ | (Typedtree.Tstr_class [(_,_,_,ce,_)]) -> + ( + try + let type_decl = search_type_declaration table name in +@@ -184,7 +184,7 @@ + let rec iter = function + | [] -> + raise Not_found +- | Typedtree.Cf_val (_, ident, exp) :: q ++ | Typedtree.Cf_val (_, ident, Some exp, _) :: q + when Name.from_ident ident = name -> + exp.Typedtree.exp_type + | _ :: q -> +@@ -523,7 +523,8 @@ + p_clexp.Parsetree.pcl_loc.Location.loc_end.Lexing.pos_cnum + q + +- | (Parsetree.Pcf_val (label, mutable_flag, expression, loc)) :: q -> ++ | (Parsetree.Pcf_val (label, mutable_flag, _, loc) | ++ Parsetree.Pcf_valvirt (label, mutable_flag, _, loc)) :: q -> + let complete_name = Name.concat current_class_name label in + let (info_opt, ele_comments) = get_comments_in_class last_pos loc.Location.loc_start.Lexing.pos_cnum in + let type_exp = +Index: ocamldoc/odoc_sig.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/ocamldoc/odoc_sig.ml,v +retrieving revision 1.37 +diff -u -r1.37 odoc_sig.ml +--- ocamldoc/odoc_sig.ml 4 Jan 2006 16:55:50 -0000 1.37 ++++ ocamldoc/odoc_sig.ml 5 Apr 2006 02:26:01 -0000 +@@ -107,7 +107,7 @@ + | _ -> assert false + + let search_attribute_type name class_sig = +- let (_, type_expr) = Types.Vars.find name class_sig.Types.cty_vars in ++ let (_, _, type_expr) = Types.Vars.find name class_sig.Types.cty_vars in + type_expr + + let search_method_type name class_sig = +@@ -269,7 +269,7 @@ + [] -> pos_limit + | ele2 :: _ -> + match ele2 with +- Parsetree.Pctf_val (_, _, _, loc) ++ Parsetree.Pctf_val (_, _, _, _, loc) + | Parsetree.Pctf_virt (_, _, _, loc) + | Parsetree.Pctf_meth (_, _, _, loc) + | Parsetree.Pctf_cstr (_, _, loc) -> loc.Location.loc_start.Lexing.pos_cnum +@@ -330,7 +330,7 @@ + in + ([], ele_comments) + +- | Parsetree.Pctf_val (name, mutable_flag, _, loc) :: q -> ++ | Parsetree.Pctf_val (name, mutable_flag, _, _, loc) :: q -> + (* of (string * mutable_flag * core_type option * Location.t)*) + let (comment_opt, eles_comments) = get_comments_in_class last_pos loc.Location.loc_start.Lexing.pos_cnum in + let complete_name = Name.concat current_class_name name in +Index: camlp4/camlp4/ast2pt.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/camlp4/camlp4/ast2pt.ml,v +retrieving revision 1.36 +diff -u -r1.36 ast2pt.ml +--- camlp4/camlp4/ast2pt.ml 29 Jun 2005 04:11:26 -0000 1.36 ++++ camlp4/camlp4/ast2pt.ml 5 Apr 2006 02:26:01 -0000 +@@ -244,6 +244,7 @@ + ; + value mkmutable m = if m then Mutable else Immutable; + value mkprivate m = if m then Private else Public; ++value mkvirtual m = if m then Virtual else Concrete; + value mktrecord (loc, n, m, t) = + (n, mkmutable m, ctyp (mkpolytype t), mkloc loc); + value mkvariant (loc, c, tl) = (c, List.map ctyp tl, mkloc loc); +@@ -862,8 +863,8 @@ + | CgInh loc ct -> [Pctf_inher (class_type ct) :: l] + | CgMth loc s pf t -> + [Pctf_meth (s, mkprivate pf, ctyp (mkpolytype t), mkloc loc) :: l] +- | CgVal loc s b t -> +- [Pctf_val (s, mkmutable b, Some (ctyp t), mkloc loc) :: l] ++ | CgVal loc s b v t -> ++ [Pctf_val (s, mkmutable b, mkvirtual v, ctyp t, mkloc loc) :: l] + | CgVir loc s b t -> + [Pctf_virt (s, mkprivate b, ctyp (mkpolytype t), mkloc loc) :: l] ] + and class_expr = +@@ -907,7 +908,9 @@ + [Pcf_meth (s, mkprivate b, e, mkloc loc) :: l] + | CrVal loc s b e -> [Pcf_val (s, mkmutable b, expr e, mkloc loc) :: l] + | CrVir loc s b t -> +- [Pcf_virt (s, mkprivate b, ctyp (mkpolytype t), mkloc loc) :: l] ] ++ [Pcf_virt (s, mkprivate b, ctyp (mkpolytype t), mkloc loc) :: l] ++ | CrVvr loc s b t -> ++ [Pcf_valvirt (s, mkmutable b, ctyp t, mkloc loc) :: l] ] + ; + + value interf ast = List.fold_right sig_item ast []; +Index: camlp4/camlp4/mLast.mli +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/camlp4/camlp4/mLast.mli,v +retrieving revision 1.18 +diff -u -r1.18 mLast.mli +--- camlp4/camlp4/mLast.mli 29 Jun 2005 04:11:26 -0000 1.18 ++++ camlp4/camlp4/mLast.mli 5 Apr 2006 02:26:01 -0000 +@@ -180,7 +180,7 @@ + | CgDcl of loc and list class_sig_item + | CgInh of loc and class_type + | CgMth of loc and string and bool and ctyp +- | CgVal of loc and string and bool and ctyp ++ | CgVal of loc and string and bool and bool and ctyp + | CgVir of loc and string and bool and ctyp ] + and class_expr = + [ CeApp of loc and class_expr and expr +@@ -196,7 +196,8 @@ + | CrIni of loc and expr + | CrMth of loc and string and bool and expr and option ctyp + | CrVal of loc and string and bool and expr +- | CrVir of loc and string and bool and ctyp ] ++ | CrVir of loc and string and bool and ctyp ++ | CrVvr of loc and string and bool and ctyp ] + ; + + external loc_of_ctyp : ctyp -> loc = "%field0"; +Index: camlp4/camlp4/reloc.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/camlp4/camlp4/reloc.ml,v +retrieving revision 1.18 +diff -u -r1.18 reloc.ml +--- camlp4/camlp4/reloc.ml 29 Jun 2005 04:11:26 -0000 1.18 ++++ camlp4/camlp4/reloc.ml 5 Apr 2006 02:26:01 -0000 +@@ -350,7 +350,7 @@ + | CgDcl loc x1 -> let nloc = floc loc in CgDcl nloc (List.map (class_sig_item floc sh) x1) + | CgInh loc x1 -> let nloc = floc loc in CgInh nloc (class_type floc sh x1) + | CgMth loc x1 x2 x3 -> let nloc = floc loc in CgMth nloc x1 x2 (ctyp floc sh x3) +- | CgVal loc x1 x2 x3 -> let nloc = floc loc in CgVal nloc x1 x2 (ctyp floc sh x3) ++ | CgVal loc x1 x2 x3 x4 -> let nloc = floc loc in CgVal nloc x1 x2 x3 (ctyp floc sh x4) + | CgVir loc x1 x2 x3 -> let nloc = floc loc in CgVir nloc x1 x2 (ctyp floc sh x3) ] + and class_expr floc sh = + self where rec self = +@@ -377,5 +377,6 @@ + | CrMth loc x1 x2 x3 x4 -> + let nloc = floc loc in CrMth nloc x1 x2 (expr floc sh x3) (option_map (ctyp floc sh) x4) + | CrVal loc x1 x2 x3 -> let nloc = floc loc in CrVal nloc x1 x2 (expr floc sh x3) +- | CrVir loc x1 x2 x3 -> let nloc = floc loc in CrVir nloc x1 x2 (ctyp floc sh x3) ] ++ | CrVir loc x1 x2 x3 -> let nloc = floc loc in CrVir nloc x1 x2 (ctyp floc sh x3) ++ | CrVvr loc x1 x2 x3 -> let nloc = floc loc in CrVvr nloc x1 x2 (ctyp floc sh x3) ] + ; +Index: camlp4/etc/pa_o.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/camlp4/etc/pa_o.ml,v +retrieving revision 1.66 +diff -u -r1.66 pa_o.ml +--- camlp4/etc/pa_o.ml 29 Jun 2005 04:11:26 -0000 1.66 ++++ camlp4/etc/pa_o.ml 5 Apr 2006 02:26:01 -0000 +@@ -1037,8 +1037,14 @@ + class_str_item: + [ [ "inherit"; ce = class_expr; pb = OPT [ "as"; i = LIDENT -> i ] -> + <:class_str_item< inherit $ce$ $opt:pb$ >> +- | "val"; mf = OPT "mutable"; lab = label; e = cvalue_binding -> +- <:class_str_item< value $opt:o2b mf$ $lab$ = $e$ >> ++ | "val"; "mutable"; lab = label; e = cvalue_binding -> ++ <:class_str_item< value mutable $lab$ = $e$ >> ++ | "val"; lab = label; e = cvalue_binding -> ++ <:class_str_item< value $lab$ = $e$ >> ++ | "val"; "mutable"; "virtual"; lab = label; ":"; t = ctyp -> ++ <:class_str_item< value virtual mutable $lab$ : $t$ >> ++ | "val"; "virtual"; mf = OPT "mutable"; lab = label; ":"; t = ctyp -> ++ <:class_str_item< value virtual $opt:o2b mf$ $lab$ : $t$ >> + | "method"; "private"; "virtual"; l = label; ":"; t = poly_type -> + <:class_str_item< method virtual private $l$ : $t$ >> + | "method"; "virtual"; "private"; l = label; ":"; t = poly_type -> +@@ -1087,8 +1093,9 @@ + ; + class_sig_item: + [ [ "inherit"; cs = class_signature -> <:class_sig_item< inherit $cs$ >> +- | "val"; mf = OPT "mutable"; l = label; ":"; t = ctyp -> +- <:class_sig_item< value $opt:o2b mf$ $l$ : $t$ >> ++ | "val"; mf = OPT "mutable"; vf = OPT "virtual"; ++ l = label; ":"; t = ctyp -> ++ <:class_sig_item< value $opt:o2b mf$ $opt:o2b vf$ $l$ : $t$ >> + | "method"; "private"; "virtual"; l = label; ":"; t = poly_type -> + <:class_sig_item< method virtual private $l$ : $t$ >> + | "method"; "virtual"; "private"; l = label; ":"; t = poly_type -> +Index: camlp4/etc/pr_o.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/camlp4/etc/pr_o.ml,v +retrieving revision 1.51 +diff -u -r1.51 pr_o.ml +--- camlp4/etc/pr_o.ml 5 Jan 2006 10:44:29 -0000 1.51 ++++ camlp4/etc/pr_o.ml 5 Apr 2006 02:26:01 -0000 +@@ -1768,10 +1768,11 @@ + [: `S LR "method"; private_flag pf; `label lab; + `S LR ":" :]; + `ctyp t "" k :] +- | MLast.CgVal _ lab mf t -> ++ | MLast.CgVal _ lab mf vf t -> + fun curr next dg k -> + [: `HVbox +- [: `S LR "val"; mutable_flag mf; `label lab; `S LR ":" :]; ++ [: `S LR "val"; mutable_flag mf; virtual_flag vf; ++ `label lab; `S LR ":" :]; + `ctyp t "" k :] + | MLast.CgVir _ lab pf t -> + fun curr next dg k -> +Index: camlp4/meta/pa_r.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/camlp4/meta/pa_r.ml,v +retrieving revision 1.64 +diff -u -r1.64 pa_r.ml +--- camlp4/meta/pa_r.ml 29 Jun 2005 04:11:26 -0000 1.64 ++++ camlp4/meta/pa_r.ml 5 Apr 2006 02:26:01 -0000 +@@ -658,7 +658,9 @@ + | "inherit"; ce = class_expr; pb = OPT as_lident -> + <:class_str_item< inherit $ce$ $opt:pb$ >> + | "value"; mf = OPT "mutable"; lab = label; e = cvalue_binding -> +- <:class_str_item< value $opt:o2b mf$ $lab$ = $e$ >> ++ <:class_str_item< value $opt:o2b mf$ $lab$ = $e$ >> ++ | "value"; "virtual"; mf = OPT "mutable"; l = label; ":"; t = ctyp -> ++ <:class_str_item< value virtual $opt:o2b mf$ $l$ : $t$ >> + | "method"; "virtual"; pf = OPT "private"; l = label; ":"; t = ctyp -> + <:class_str_item< method virtual $opt:o2b pf$ $l$ : $t$ >> + | "method"; pf = OPT "private"; l = label; topt = OPT polyt; +@@ -701,8 +703,9 @@ + [ [ "declare"; st = LIST0 [ s = class_sig_item; ";" -> s ]; "end" -> + <:class_sig_item< declare $list:st$ end >> + | "inherit"; cs = class_type -> <:class_sig_item< inherit $cs$ >> +- | "value"; mf = OPT "mutable"; l = label; ":"; t = ctyp -> +- <:class_sig_item< value $opt:o2b mf$ $l$ : $t$ >> ++ | "value"; mf = OPT "mutable"; vf = OPT "virtual"; ++ l = label; ":"; t = ctyp -> ++ <:class_sig_item< value $opt:o2b mf$ $opt:o2b vf$ $l$ : $t$ >> + | "method"; "virtual"; pf = OPT "private"; l = label; ":"; t = ctyp -> + <:class_sig_item< method virtual $opt:o2b pf$ $l$ : $t$ >> + | "method"; pf = OPT "private"; l = label; ":"; t = ctyp -> +Index: camlp4/meta/q_MLast.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/camlp4/meta/q_MLast.ml,v +retrieving revision 1.60 +diff -u -r1.60 q_MLast.ml +--- camlp4/meta/q_MLast.ml 29 Jun 2005 04:11:26 -0000 1.60 ++++ camlp4/meta/q_MLast.ml 5 Apr 2006 02:26:01 -0000 +@@ -947,6 +947,8 @@ + Qast.Node "CrDcl" [Qast.Loc; st] + | "inherit"; ce = class_expr; pb = SOPT as_lident -> + Qast.Node "CrInh" [Qast.Loc; ce; pb] ++ | "value"; "virtual"; mf = SOPT "mutable"; l = label; ":"; t = ctyp -> ++ Qast.Node "CrVvr" [Qast.Loc; l; o2b mf; t] + | "value"; mf = SOPT "mutable"; lab = label; e = cvalue_binding -> + Qast.Node "CrVal" [Qast.Loc; lab; o2b mf; e] + | "method"; "virtual"; pf = SOPT "private"; l = label; ":"; t = ctyp -> +@@ -992,8 +994,9 @@ + [ [ "declare"; st = SLIST0 [ s = class_sig_item; ";" -> s ]; "end" -> + Qast.Node "CgDcl" [Qast.Loc; st] + | "inherit"; cs = class_type -> Qast.Node "CgInh" [Qast.Loc; cs] +- | "value"; mf = SOPT "mutable"; l = label; ":"; t = ctyp -> +- Qast.Node "CgVal" [Qast.Loc; l; o2b mf; t] ++ | "value"; mf = SOPT "mutable"; vf = SOPT "virtual"; ++ l = label; ":"; t = ctyp -> ++ Qast.Node "CgVal" [Qast.Loc; l; o2b mf; o2b vf; t] + | "method"; "virtual"; pf = SOPT "private"; l = label; ":"; t = ctyp -> + Qast.Node "CgVir" [Qast.Loc; l; o2b pf; t] + | "method"; pf = SOPT "private"; l = label; ":"; t = ctyp -> +Index: camlp4/ocaml_src/camlp4/ast2pt.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/camlp4/ocaml_src/camlp4/ast2pt.ml,v +retrieving revision 1.36 +diff -u -r1.36 ast2pt.ml +--- camlp4/ocaml_src/camlp4/ast2pt.ml 29 Jun 2005 04:11:26 -0000 1.36 ++++ camlp4/ocaml_src/camlp4/ast2pt.ml 5 Apr 2006 02:26:01 -0000 +@@ -227,6 +227,7 @@ + ;; + let mkmutable m = if m then Mutable else Immutable;; + let mkprivate m = if m then Private else Public;; ++let mkvirtual m = if m then Virtual else Concrete;; + let mktrecord (loc, n, m, t) = + n, mkmutable m, ctyp (mkpolytype t), mkloc loc + ;; +@@ -878,8 +879,8 @@ + | CgInh (loc, ct) -> Pctf_inher (class_type ct) :: l + | CgMth (loc, s, pf, t) -> + Pctf_meth (s, mkprivate pf, ctyp (mkpolytype t), mkloc loc) :: l +- | CgVal (loc, s, b, t) -> +- Pctf_val (s, mkmutable b, Some (ctyp t), mkloc loc) :: l ++ | CgVal (loc, s, b, v, t) -> ++ Pctf_val (s, mkmutable b, mkvirtual v, ctyp t, mkloc loc) :: l + | CgVir (loc, s, b, t) -> + Pctf_virt (s, mkprivate b, ctyp (mkpolytype t), mkloc loc) :: l + and class_expr = +@@ -923,6 +924,8 @@ + | CrVal (loc, s, b, e) -> Pcf_val (s, mkmutable b, expr e, mkloc loc) :: l + | CrVir (loc, s, b, t) -> + Pcf_virt (s, mkprivate b, ctyp (mkpolytype t), mkloc loc) :: l ++ | CrVvr (loc, s, b, t) -> ++ Pcf_valvirt (s, mkmutable b, ctyp t, mkloc loc) :: l + ;; + + let interf ast = List.fold_right sig_item ast [];; +Index: camlp4/ocaml_src/camlp4/mLast.mli +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/camlp4/ocaml_src/camlp4/mLast.mli,v +retrieving revision 1.20 +diff -u -r1.20 mLast.mli +--- camlp4/ocaml_src/camlp4/mLast.mli 29 Jun 2005 04:11:26 -0000 1.20 ++++ camlp4/ocaml_src/camlp4/mLast.mli 5 Apr 2006 02:26:01 -0000 +@@ -180,7 +180,7 @@ + | CgDcl of loc * class_sig_item list + | CgInh of loc * class_type + | CgMth of loc * string * bool * ctyp +- | CgVal of loc * string * bool * ctyp ++ | CgVal of loc * string * bool * bool * ctyp + | CgVir of loc * string * bool * ctyp + and class_expr = + CeApp of loc * class_expr * expr +@@ -197,6 +197,7 @@ + | CrMth of loc * string * bool * expr * ctyp option + | CrVal of loc * string * bool * expr + | CrVir of loc * string * bool * ctyp ++ | CrVvr of loc * string * bool * ctyp + ;; + + external loc_of_ctyp : ctyp -> loc = "%field0";; +Index: camlp4/ocaml_src/camlp4/reloc.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/camlp4/ocaml_src/camlp4/reloc.ml,v +retrieving revision 1.20 +diff -u -r1.20 reloc.ml +--- camlp4/ocaml_src/camlp4/reloc.ml 29 Jun 2005 04:11:26 -0000 1.20 ++++ camlp4/ocaml_src/camlp4/reloc.ml 5 Apr 2006 02:26:01 -0000 +@@ -430,8 +430,8 @@ + let nloc = floc loc in CgInh (nloc, class_type floc sh x1) + | CgMth (loc, x1, x2, x3) -> + let nloc = floc loc in CgMth (nloc, x1, x2, ctyp floc sh x3) +- | CgVal (loc, x1, x2, x3) -> +- let nloc = floc loc in CgVal (nloc, x1, x2, ctyp floc sh x3) ++ | CgVal (loc, x1, x2, x3, x4) -> ++ let nloc = floc loc in CgVal (nloc, x1, x2, x3, ctyp floc sh x4) + | CgVir (loc, x1, x2, x3) -> + let nloc = floc loc in CgVir (nloc, x1, x2, ctyp floc sh x3) + in +@@ -478,6 +478,8 @@ + let nloc = floc loc in CrVal (nloc, x1, x2, expr floc sh x3) + | CrVir (loc, x1, x2, x3) -> + let nloc = floc loc in CrVir (nloc, x1, x2, ctyp floc sh x3) ++ | CrVvr (loc, x1, x2, x3) -> ++ let nloc = floc loc in CrVvr (nloc, x1, x2, ctyp floc sh x3) + in + self + ;; +Index: camlp4/ocaml_src/meta/pa_r.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/camlp4/ocaml_src/meta/pa_r.ml,v +retrieving revision 1.59 +diff -u -r1.59 pa_r.ml +--- camlp4/ocaml_src/meta/pa_r.ml 29 Jun 2005 04:11:26 -0000 1.59 ++++ camlp4/ocaml_src/meta/pa_r.ml 5 Apr 2006 02:26:01 -0000 +@@ -2161,6 +2161,15 @@ + (fun (t : 'ctyp) _ (l : 'label) (pf : string option) _ _ + (_loc : Lexing.position * Lexing.position) -> + (MLast.CrVir (_loc, l, o2b pf, t) : 'class_str_item)); ++ [Gramext.Stoken ("", "value"); Gramext.Stoken ("", "virtual"); ++ Gramext.Sopt (Gramext.Stoken ("", "mutable")); ++ Gramext.Snterm (Grammar.Entry.obj (label : 'label Grammar.Entry.e)); ++ Gramext.Stoken ("", ":"); ++ Gramext.Snterm (Grammar.Entry.obj (ctyp : 'ctyp Grammar.Entry.e))], ++ Gramext.action ++ (fun (t : 'ctyp) _ (l : 'label) (mf : string option) _ _ ++ (_loc : Lexing.position * Lexing.position) -> ++ (MLast.CrVvr (_loc, l, o2b mf, t) : 'class_str_item)); + [Gramext.Stoken ("", "value"); + Gramext.Sopt (Gramext.Stoken ("", "mutable")); + Gramext.Snterm (Grammar.Entry.obj (label : 'label Grammar.Entry.e)); +@@ -2338,13 +2347,15 @@ + (MLast.CgVir (_loc, l, o2b pf, t) : 'class_sig_item)); + [Gramext.Stoken ("", "value"); + Gramext.Sopt (Gramext.Stoken ("", "mutable")); ++ Gramext.Sopt (Gramext.Stoken ("", "virtual")); + Gramext.Snterm (Grammar.Entry.obj (label : 'label Grammar.Entry.e)); + Gramext.Stoken ("", ":"); + Gramext.Snterm (Grammar.Entry.obj (ctyp : 'ctyp Grammar.Entry.e))], + Gramext.action +- (fun (t : 'ctyp) _ (l : 'label) (mf : string option) _ ++ (fun (t : 'ctyp) _ (l : 'label) (vf : string option) ++ (mf : string option) _ + (_loc : Lexing.position * Lexing.position) -> +- (MLast.CgVal (_loc, l, o2b mf, t) : 'class_sig_item)); ++ (MLast.CgVal (_loc, l, o2b mf, o2b vf, t) : 'class_sig_item)); + [Gramext.Stoken ("", "inherit"); + Gramext.Snterm + (Grammar.Entry.obj (class_type : 'class_type Grammar.Entry.e))], +Index: camlp4/ocaml_src/meta/q_MLast.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/camlp4/ocaml_src/meta/q_MLast.ml,v +retrieving revision 1.65 +diff -u -r1.65 q_MLast.ml +--- camlp4/ocaml_src/meta/q_MLast.ml 12 Jan 2006 08:54:21 -0000 1.65 ++++ camlp4/ocaml_src/meta/q_MLast.ml 5 Apr 2006 02:26:01 -0000 +@@ -3152,9 +3152,9 @@ + Gramext.action + (fun (x : string) + (_loc : Lexing.position * Lexing.position) -> +- (Qast.Str x : 'e__17))])], ++ (Qast.Str x : 'e__18))])], + Gramext.action +- (fun (a : 'e__17 option) ++ (fun (a : 'e__18 option) + (_loc : Lexing.position * Lexing.position) -> + (Qast.Option a : 'a_opt)); + [Gramext.Snterm +@@ -3191,9 +3191,9 @@ + Gramext.action + (fun (x : string) + (_loc : Lexing.position * Lexing.position) -> +- (Qast.Str x : 'e__16))])], ++ (Qast.Str x : 'e__17))])], + Gramext.action +- (fun (a : 'e__16 option) ++ (fun (a : 'e__17 option) + (_loc : Lexing.position * Lexing.position) -> + (Qast.Option a : 'a_opt)); + [Gramext.Snterm +@@ -3216,9 +3216,9 @@ + Gramext.action + (fun (x : string) + (_loc : Lexing.position * Lexing.position) -> +- (Qast.Str x : 'e__15))])], ++ (Qast.Str x : 'e__16))])], + Gramext.action +- (fun (a : 'e__15 option) ++ (fun (a : 'e__16 option) + (_loc : Lexing.position * Lexing.position) -> + (Qast.Option a : 'a_opt)); + [Gramext.Snterm +@@ -3235,6 +3235,31 @@ + (_loc : Lexing.position * Lexing.position) -> + (Qast.Node ("CrVal", [Qast.Loc; lab; o2b mf; e]) : + 'class_str_item)); ++ [Gramext.Stoken ("", "value"); Gramext.Stoken ("", "virtual"); ++ Gramext.srules ++ [[Gramext.Sopt ++ (Gramext.srules ++ [[Gramext.Stoken ("", "mutable")], ++ Gramext.action ++ (fun (x : string) ++ (_loc : Lexing.position * Lexing.position) -> ++ (Qast.Str x : 'e__15))])], ++ Gramext.action ++ (fun (a : 'e__15 option) ++ (_loc : Lexing.position * Lexing.position) -> ++ (Qast.Option a : 'a_opt)); ++ [Gramext.Snterm ++ (Grammar.Entry.obj (a_opt : 'a_opt Grammar.Entry.e))], ++ Gramext.action ++ (fun (a : 'a_opt) (_loc : Lexing.position * Lexing.position) -> ++ (a : 'a_opt))]; ++ Gramext.Snterm (Grammar.Entry.obj (label : 'label Grammar.Entry.e)); ++ Gramext.Stoken ("", ":"); ++ Gramext.Snterm (Grammar.Entry.obj (ctyp : 'ctyp Grammar.Entry.e))], ++ Gramext.action ++ (fun (t : 'ctyp) _ (l : 'label) (mf : 'a_opt) _ _ ++ (_loc : Lexing.position * Lexing.position) -> ++ (Qast.Node ("CrVvr", [Qast.Loc; l; o2b mf; t]) : 'class_str_item)); + [Gramext.Stoken ("", "inherit"); + Gramext.Snterm + (Grammar.Entry.obj (class_expr : 'class_expr Grammar.Entry.e)); +@@ -3366,9 +3391,9 @@ + Gramext.action + (fun _ (csf : 'class_sig_item) + (_loc : Lexing.position * Lexing.position) -> +- (csf : 'e__18))])], ++ (csf : 'e__19))])], + Gramext.action +- (fun (a : 'e__18 list) ++ (fun (a : 'e__19 list) + (_loc : Lexing.position * Lexing.position) -> + (Qast.List a : 'a_list)); + [Gramext.Snterm +@@ -3446,9 +3471,9 @@ + Gramext.action + (fun (x : string) + (_loc : Lexing.position * Lexing.position) -> +- (Qast.Str x : 'e__22))])], ++ (Qast.Str x : 'e__24))])], + Gramext.action +- (fun (a : 'e__22 option) ++ (fun (a : 'e__24 option) + (_loc : Lexing.position * Lexing.position) -> + (Qast.Option a : 'a_opt)); + [Gramext.Snterm +@@ -3471,9 +3496,9 @@ + Gramext.action + (fun (x : string) + (_loc : Lexing.position * Lexing.position) -> +- (Qast.Str x : 'e__21))])], ++ (Qast.Str x : 'e__23))])], + Gramext.action +- (fun (a : 'e__21 option) ++ (fun (a : 'e__23 option) + (_loc : Lexing.position * Lexing.position) -> + (Qast.Option a : 'a_opt)); + [Gramext.Snterm +@@ -3496,9 +3521,26 @@ + Gramext.action + (fun (x : string) + (_loc : Lexing.position * Lexing.position) -> +- (Qast.Str x : 'e__20))])], ++ (Qast.Str x : 'e__21))])], + Gramext.action +- (fun (a : 'e__20 option) ++ (fun (a : 'e__21 option) ++ (_loc : Lexing.position * Lexing.position) -> ++ (Qast.Option a : 'a_opt)); ++ [Gramext.Snterm ++ (Grammar.Entry.obj (a_opt : 'a_opt Grammar.Entry.e))], ++ Gramext.action ++ (fun (a : 'a_opt) (_loc : Lexing.position * Lexing.position) -> ++ (a : 'a_opt))]; ++ Gramext.srules ++ [[Gramext.Sopt ++ (Gramext.srules ++ [[Gramext.Stoken ("", "virtual")], ++ Gramext.action ++ (fun (x : string) ++ (_loc : Lexing.position * Lexing.position) -> ++ (Qast.Str x : 'e__22))])], ++ Gramext.action ++ (fun (a : 'e__22 option) + (_loc : Lexing.position * Lexing.position) -> + (Qast.Option a : 'a_opt)); + [Gramext.Snterm +@@ -3510,9 +3552,10 @@ + Gramext.Stoken ("", ":"); + Gramext.Snterm (Grammar.Entry.obj (ctyp : 'ctyp Grammar.Entry.e))], + Gramext.action +- (fun (t : 'ctyp) _ (l : 'label) (mf : 'a_opt) _ ++ (fun (t : 'ctyp) _ (l : 'label) (vf : 'a_opt) (mf : 'a_opt) _ + (_loc : Lexing.position * Lexing.position) -> +- (Qast.Node ("CgVal", [Qast.Loc; l; o2b mf; t]) : 'class_sig_item)); ++ (Qast.Node ("CgVal", [Qast.Loc; l; o2b mf; o2b vf; t]) : ++ 'class_sig_item)); + [Gramext.Stoken ("", "inherit"); + Gramext.Snterm + (Grammar.Entry.obj (class_type : 'class_type Grammar.Entry.e))], +@@ -3531,9 +3574,9 @@ + Gramext.action + (fun _ (s : 'class_sig_item) + (_loc : Lexing.position * Lexing.position) -> +- (s : 'e__19))])], ++ (s : 'e__20))])], + Gramext.action +- (fun (a : 'e__19 list) ++ (fun (a : 'e__20 list) + (_loc : Lexing.position * Lexing.position) -> + (Qast.List a : 'a_list)); + [Gramext.Snterm +@@ -3556,9 +3599,9 @@ + Gramext.action + (fun (x : string) + (_loc : Lexing.position * Lexing.position) -> +- (Qast.Str x : 'e__23))])], ++ (Qast.Str x : 'e__25))])], + Gramext.action +- (fun (a : 'e__23 option) ++ (fun (a : 'e__25 option) + (_loc : Lexing.position * Lexing.position) -> + (Qast.Option a : 'a_opt)); + [Gramext.Snterm +@@ -3593,9 +3636,9 @@ + Gramext.action + (fun (x : string) + (_loc : Lexing.position * Lexing.position) -> +- (Qast.Str x : 'e__24))])], ++ (Qast.Str x : 'e__26))])], + Gramext.action +- (fun (a : 'e__24 option) ++ (fun (a : 'e__26 option) + (_loc : Lexing.position * Lexing.position) -> + (Qast.Option a : 'a_opt)); + [Gramext.Snterm +@@ -3713,9 +3756,9 @@ + Gramext.action + (fun (x : string) + (_loc : Lexing.position * Lexing.position) -> +- (Qast.Str x : 'e__25))])], ++ (Qast.Str x : 'e__27))])], + Gramext.action +- (fun (a : 'e__25 option) ++ (fun (a : 'e__27 option) + (_loc : Lexing.position * Lexing.position) -> + (Qast.Option a : 'a_opt)); + [Gramext.Snterm +@@ -3922,9 +3965,9 @@ + Gramext.action + (fun (x : string) + (_loc : Lexing.position * Lexing.position) -> +- (Qast.Str x : 'e__26))])], ++ (Qast.Str x : 'e__28))])], + Gramext.action +- (fun (a : 'e__26 option) ++ (fun (a : 'e__28 option) + (_loc : Lexing.position * Lexing.position) -> + (Qast.Option a : 'a_opt)); + [Gramext.Snterm +@@ -4390,9 +4433,9 @@ + Gramext.action + (fun _ (e : 'expr) + (_loc : Lexing.position * Lexing.position) -> +- (e : 'e__29))])], ++ (e : 'e__31))])], + Gramext.action +- (fun (a : 'e__29 list) ++ (fun (a : 'e__31 list) + (_loc : Lexing.position * Lexing.position) -> + (Qast.List a : 'a_list)); + [Gramext.Snterm +@@ -4425,9 +4468,9 @@ + Gramext.action + (fun _ (e : 'expr) + (_loc : Lexing.position * Lexing.position) -> +- (e : 'e__28))])], ++ (e : 'e__30))])], + Gramext.action +- (fun (a : 'e__28 list) ++ (fun (a : 'e__30 list) + (_loc : Lexing.position * Lexing.position) -> + (Qast.List a : 'a_list)); + [Gramext.Snterm +@@ -4454,9 +4497,9 @@ + Gramext.action + (fun _ (e : 'expr) + (_loc : Lexing.position * Lexing.position) -> +- (e : 'e__27))])], ++ (e : 'e__29))])], + Gramext.action +- (fun (a : 'e__27 list) ++ (fun (a : 'e__29 list) + (_loc : Lexing.position * Lexing.position) -> + (Qast.List a : 'a_list)); + [Gramext.Snterm +@@ -4547,9 +4590,9 @@ + Gramext.action + (fun _ (cf : 'class_str_item) + (_loc : Lexing.position * Lexing.position) -> +- (cf : 'e__30))])], ++ (cf : 'e__32))])], + Gramext.action +- (fun (a : 'e__30 list) ++ (fun (a : 'e__32 list) + (_loc : Lexing.position * Lexing.position) -> + (Qast.List a : 'a_list)); + [Gramext.Snterm +@@ -4592,9 +4635,9 @@ + Gramext.action + (fun _ (csf : 'class_sig_item) + (_loc : Lexing.position * Lexing.position) -> +- (csf : 'e__32))])], ++ (csf : 'e__34))])], + Gramext.action +- (fun (a : 'e__32 list) ++ (fun (a : 'e__34 list) + (_loc : Lexing.position * Lexing.position) -> + (Qast.List a : 'a_list)); + [Gramext.Snterm +@@ -4623,9 +4666,9 @@ + Gramext.action + (fun _ (csf : 'class_sig_item) + (_loc : Lexing.position * Lexing.position) -> +- (csf : 'e__31))])], ++ (csf : 'e__33))])], + Gramext.action +- (fun (a : 'e__31 list) ++ (fun (a : 'e__33 list) + (_loc : Lexing.position * Lexing.position) -> + (Qast.List a : 'a_list)); + [Gramext.Snterm +Index: camlp4/top/rprint.ml +=================================================================== +RCS file: /net/yquem/devel/caml/repository/csl/camlp4/top/rprint.ml,v +retrieving revision 1.18 +diff -u -r1.18 rprint.ml +--- camlp4/top/rprint.ml 29 Jun 2005 04:11:26 -0000 1.18 ++++ camlp4/top/rprint.ml 5 Apr 2006 02:26:01 -0000 +@@ -288,8 +288,9 @@ + fprintf ppf "@[<2>method %s%s%s :@ %a;@]" + (if priv then "private " else "") (if virt then "virtual " else "") + name Toploop.print_out_type.val ty +- | Ocsg_value name mut ty -> +- fprintf ppf "@[<2>value %s%s :@ %a;@]" (if mut then "mutable " else "") ++ | Ocsg_value name mut virt ty -> ++ fprintf ppf "@[<2>value %s%s%s :@ %a;@]" ++ (if mut then "mutable " else "") (if virt then "virtual " else "") + name Toploop.print_out_type.val ty ] + ; + diff --git a/experimental/garrigue/variable-names-Tvar.diff b/experimental/garrigue/variable-names-Tvar.diff new file mode 100644 index 00000000..99ff6a24 --- /dev/null +++ b/experimental/garrigue/variable-names-Tvar.diff @@ -0,0 +1,1656 @@ +Index: VERSION +=================================================================== +--- VERSION (リビジョン 11207) ++++ VERSION (作業コピー) +@@ -1,4 +1,4 @@ +-3.13.0+dev6 (2011-07-29) ++3.13.0+dev7 (2011-09-22) + + # The version string is the first line of this file. + # It must be in the format described in stdlib/sys.mli +Index: typing/typemod.ml +=================================================================== +--- typing/typemod.ml (リビジョン 11207) ++++ typing/typemod.ml (作業コピー) +@@ -764,7 +764,7 @@ + Location.prerr_warning smod.pmod_loc + (Warnings.Not_principal "this module unpacking"); + modtype_of_package env smod.pmod_loc p nl tl +- | {desc = Tvar} -> ++ | {desc = Tvar _} -> + raise (Typecore.Error + (smod.pmod_loc, Typecore.Cannot_infer_signature)) + | _ -> +Index: typing/typetexp.ml +=================================================================== +--- typing/typetexp.ml (リビジョン 11207) ++++ typing/typetexp.ml (作業コピー) +@@ -150,7 +150,7 @@ + if strict then raise Already_bound; + v + with Not_found -> +- let v = new_global_var() in ++ let v = new_global_var ~name () in + type_variables := Tbl.add name v !type_variables; + v + +@@ -165,8 +165,8 @@ + Tpoly _ -> ty + | _ -> Ctype.newty (Tpoly (ty, [])) + +-let new_pre_univar () = +- let v = newvar () in pre_univars := v :: !pre_univars; v ++let new_pre_univar ?name () = ++ let v = newvar ?name () in pre_univars := v :: !pre_univars; v + + let rec swap_list = function + x :: y :: l -> y :: x :: swap_list l +@@ -190,7 +190,8 @@ + instance (fst(Tbl.find name !used_variables)) + with Not_found -> + let v = +- if policy = Univars then new_pre_univar () else newvar () in ++ if policy = Univars then new_pre_univar ~name () else newvar ~name () ++ in + used_variables := Tbl.add name (v, styp.ptyp_loc) !used_variables; + v + end +@@ -333,7 +334,14 @@ + end_def (); + generalize_structure t; + end; +- instance t ++ let t = instance t in ++ let px = Btype.proxy t in ++ begin match px.desc with ++ | Tvar None -> Btype.log_type px; px.desc <- Tvar (Some alias) ++ | Tunivar None -> Btype.log_type px; px.desc <- Tunivar (Some alias) ++ | _ -> () ++ end; ++ t + end + | Ptyp_variant(fields, closed, present) -> + let name = ref None in +@@ -388,7 +396,7 @@ + {desc=Tvariant row}, _ when Btype.static_row row -> + let row = Btype.row_repr row in + row.row_fields +- | {desc=Tvar}, Some(p, _) -> ++ | {desc=Tvar _}, Some(p, _) -> + raise(Error(sty.ptyp_loc, Unbound_type_constructor_2 p)) + | _ -> + raise(Error(sty.ptyp_loc, Not_a_variant ty)) +@@ -431,7 +439,7 @@ + newty (Tvariant row) + | Ptyp_poly(vars, st) -> + begin_def(); +- let new_univars = List.map (fun name -> name, newvar()) vars in ++ let new_univars = List.map (fun name -> name, newvar ~name ()) vars in + let old_univars = !univars in + univars := new_univars @ !univars; + let ty = transl_type env policy st in +@@ -443,10 +451,12 @@ + (fun tyl (name, ty1) -> + let v = Btype.proxy ty1 in + if deep_occur v ty then begin +- if v.level <> Btype.generic_level || v.desc <> Tvar then +- raise (Error (styp.ptyp_loc, Cannot_quantify (name, v))); +- v.desc <- Tunivar; +- v :: tyl ++ match v.desc with ++ Tvar name when v.level = Btype.generic_level -> ++ v.desc <- Tunivar name; ++ v :: tyl ++ | _ -> ++ raise (Error (styp.ptyp_loc, Cannot_quantify (name, v))) + end else tyl) + [] new_univars + in +@@ -483,7 +493,7 @@ + match ty.desc with + | Tvariant row -> + let row = Btype.row_repr row in +- if (Btype.row_more row).desc = Tunivar then ++ if Btype.is_Tunivar (Btype.row_more row) then + ty.desc <- Tvariant + {row with row_fixed=true; + row_fields = List.map +@@ -512,7 +522,7 @@ + then try + r := (loc, v, Tbl.find name !type_variables) :: !r + with Not_found -> +- if fixed && (repr ty).desc = Tvar then ++ if fixed && Btype.is_Tvar (repr ty) then + raise(Error(loc, Unbound_type_variable ("'"^name))); + let v2 = new_global_var () in + r := (loc, v, v2) :: !r; +@@ -552,8 +562,10 @@ + List.fold_left + (fun acc v -> + let v = repr v in +- if v.level <> Btype.generic_level || v.desc <> Tvar then acc +- else (v.desc <- Tunivar ; v :: acc)) ++ match v.desc with ++ Tvar name when v.level = Btype.generic_level -> ++ v.desc <- Tunivar name; v :: acc ++ | _ -> acc) + [] !pre_univars + in + make_fixed_univars typ; +@@ -635,8 +647,8 @@ + fprintf ppf "The type variable name %s is not allowed in programs" name + | Cannot_quantify (name, v) -> + fprintf ppf "This type scheme cannot quantify '%s :@ %s." name +- (if v.desc = Tvar then "it escapes this scope" else +- if v.desc = Tunivar then "it is aliased to another variable" ++ (if Btype.is_Tvar v then "it escapes this scope" else ++ if Btype.is_Tunivar v then "it is aliased to another variable" + else "it is not a variable") + | Multiple_constraints_on_type s -> + fprintf ppf "Multiple constraints for type %s" s +Index: typing/btype.ml +=================================================================== +--- typing/btype.ml (リビジョン 11207) ++++ typing/btype.ml (作業コピー) +@@ -35,9 +35,9 @@ + let new_id = ref (-1) + + let newty2 level desc = +- incr new_id; { desc = desc; level = level; id = !new_id } ++ incr new_id; { desc; level; id = !new_id } + let newgenty desc = newty2 generic_level desc +-let newgenvar () = newgenty Tvar ++let newgenvar ?name () = newgenty (Tvar name) + (* + let newmarkedvar level = + incr new_id; { desc = Tvar; level = pivot_level - level; id = !new_id } +@@ -46,6 +46,11 @@ + { desc = Tvar; level = pivot_level - generic_level; id = !new_id } + *) + ++(**** Check some types ****) ++ ++let is_Tvar = function {desc=Tvar _} -> true | _ -> false ++let is_Tunivar = function {desc=Tunivar _} -> true | _ -> false ++ + (**** Representative of a type ****) + + let rec field_kind_repr = +@@ -139,7 +144,7 @@ + let rec proxy_obj ty = + match ty.desc with + Tfield (_, _, _, ty) | Tlink ty -> proxy_obj ty +- | Tvar | Tunivar | Tconstr _ -> ty ++ | Tvar _ | Tunivar _ | Tconstr _ -> ty + | Tnil -> ty0 + | _ -> assert false + in proxy_obj ty +@@ -180,13 +185,13 @@ + row.row_fields; + match (repr row.row_more).desc with + Tvariant row -> iter_row f row +- | Tvar | Tunivar | Tsubst _ | Tconstr _ -> ++ | Tvar _ | Tunivar _ | Tsubst _ | Tconstr _ -> + Misc.may (fun (_,l) -> List.iter f l) row.row_name + | _ -> assert false + + let iter_type_expr f ty = + match ty.desc with +- Tvar -> () ++ Tvar _ -> () + | Tarrow (_, ty1, ty2, _) -> f ty1; f ty2 + | Ttuple l -> List.iter f l + | Tconstr (_, l, _) -> List.iter f l +@@ -198,7 +203,7 @@ + | Tnil -> () + | Tlink ty -> f ty + | Tsubst ty -> f ty +- | Tunivar -> () ++ | Tunivar _ -> () + | Tpoly (ty, tyl) -> f ty; List.iter f tyl + | Tpackage (_, _, l) -> List.iter f l + +@@ -239,13 +244,13 @@ + encoding during substitution *) + let rec norm_univar ty = + match ty.desc with +- Tunivar | Tsubst _ -> ty ++ Tunivar _ | Tsubst _ -> ty + | Tlink ty -> norm_univar ty + | Ttuple (ty :: _) -> norm_univar ty + | _ -> assert false + + let rec copy_type_desc f = function +- Tvar -> Tvar ++ Tvar _ -> Tvar None (* forget the name *) + | Tarrow (p, ty1, ty2, c)-> Tarrow (p, f ty1, f ty2, copy_commu c) + | Ttuple l -> Ttuple (List.map f l) + | Tconstr (p, l, _) -> Tconstr (p, List.map f l, ref Mnil) +@@ -258,7 +263,7 @@ + | Tnil -> Tnil + | Tlink ty -> copy_type_desc f ty.desc + | Tsubst ty -> assert false +- | Tunivar -> Tunivar ++ | Tunivar _ as ty -> ty (* keep the name *) + | Tpoly (ty, tyl) -> + let tyl = List.map (fun x -> norm_univar (f x)) tyl in + Tpoly (f ty, tyl) +@@ -447,7 +452,7 @@ + | Cuniv of type_expr option ref * type_expr option + + let undo_change = function +- Ctype (ty, desc) -> ty.desc <- desc ++ Ctype (ty, desc) -> ty.desc <- desc + | Clevel (ty, level) -> ty.level <- level + | Cname (r, v) -> r := v + | Crow (r, v) -> r := v +@@ -474,7 +479,22 @@ + + let log_type ty = + if ty.id <= !last_snapshot then log_change (Ctype (ty, ty.desc)) +-let link_type ty ty' = log_type ty; ty.desc <- Tlink ty' ++let link_type ty ty' = ++ log_type ty; ++ let desc = ty.desc in ++ ty.desc <- Tlink ty'; ++ (* Name is a user-supplied name for this unification variable (obtained ++ * through a type annotation for instance). *) ++ match desc, ty'.desc with ++ Tvar name, Tvar name' -> ++ begin match name, name' with ++ | Some _, None -> log_type ty'; ty'.desc <- Tvar name ++ | None, Some _ -> () ++ | Some _, Some _ -> ++ if ty.level < ty'.level then (log_type ty'; ty'.desc <- Tvar name) ++ | None, None -> () ++ end ++ | _ -> () + (* ; assert (check_memorized_abbrevs ()) *) + (* ; check_expans [] ty' *) + let set_level ty level = +Index: typing/typecore.ml +=================================================================== +--- typing/typecore.ml (リビジョン 11207) ++++ typing/typecore.ml (作業コピー) +@@ -633,7 +633,7 @@ + List.iter generalize vars; + let instantiated tv = + let tv = expand_head !env tv in +- tv.desc <> Tvar || tv.level <> generic_level in ++ not (is_Tvar tv) || tv.level <> generic_level in + if List.exists instantiated vars then + raise (Error(loc, Polymorphic_label (lid_of_label label))) + end; +@@ -1126,7 +1126,7 @@ + Tarrow (l, _, ty_res, _) -> + list_labels_aux env (ty::visited) (l::ls) ty_res + | _ -> +- List.rev ls, ty.desc = Tvar ++ List.rev ls, is_Tvar ty + + let list_labels env ty = list_labels_aux env [] [] ty + +@@ -1142,9 +1142,10 @@ + (fun t -> + let t = repr t in + generalize t; +- if t.desc = Tvar && t.level = generic_level then +- (log_type t; t.desc <- Tunivar; true) +- else false) ++ match t.desc with ++ Tvar name when t.level = generic_level -> ++ log_type t; t.desc <- Tunivar name; true ++ | _ -> false) + vars in + if List.length vars = List.length vars' then () else + let ty = newgenty (Tpoly(repr exp.exp_type, vars')) +@@ -1158,7 +1159,7 @@ + match (expand_head env exp.exp_type).desc with + | Tarrow _ -> + Location.prerr_warning exp.exp_loc Warnings.Partial_application +- | Tvar -> () ++ | Tvar _ -> () + | Tconstr (p, _, _) when Path.same p Predef.path_unit -> () + | _ -> + if statement then +@@ -1742,7 +1743,7 @@ + let (id, typ) = + filter_self_method env met Private meths privty + in +- if (repr typ).desc = Tvar then ++ if is_Tvar (repr typ) then + Location.prerr_warning loc + (Warnings.Undeclared_virtual_method met); + (Texp_send(obj, Tmeth_val id), typ) +@@ -1797,7 +1798,7 @@ + Location.prerr_warning loc + (Warnings.Not_principal "this use of a polymorphic method"); + snd (instance_poly false tl ty) +- | {desc = Tvar} as ty -> ++ | {desc = Tvar _} as ty -> + let ty' = newvar () in + unify env (instance ty) (newty(Tpoly(ty',[]))); + (* if not !Clflags.nolabels then +@@ -1979,7 +1980,7 @@ + end_def (); + check_univars env false "method" exp ty_expected vars; + re { exp with exp_type = instance ty } +- | Tvar -> ++ | 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; +@@ -2038,7 +2039,7 @@ + Location.prerr_warning loc + (Warnings.Not_principal "this module packing"); + (p, nl, tl) +- | {desc = Tvar} -> ++ | {desc = Tvar _} -> + raise (Error (loc, Cannot_infer_signature)) + | _ -> + raise (Error (loc, Not_a_packed_module ty_expected)) +@@ -2128,7 +2129,7 @@ + ty_fun + | Tarrow (l,_,ty_res',_) when l = "" || !Clflags.classic -> + args, ty_fun, no_labels ty_res' +- | Tvar -> args, ty_fun, false ++ | Tvar _ -> args, ty_fun, false + | _ -> [], texp.exp_type, false + in + let args, ty_fun', simple_res = make_args [] texp.exp_type in +@@ -2192,7 +2193,7 @@ + let (ty1, ty2) = + let ty_fun = expand_head env ty_fun in + match ty_fun.desc with +- Tvar -> ++ Tvar _ -> + let t1 = newvar () and t2 = newvar () in + let not_identity = function + Texp_ident(_,{val_kind=Val_prim +@@ -2335,7 +2336,7 @@ + begin match (expand_head env exp.exp_type).desc with + | Tarrow _ -> + Location.prerr_warning exp.exp_loc Warnings.Partial_application +- | Tvar -> ++ | Tvar _ -> + add_delayed_check (fun () -> check_application_result env false exp) + | _ -> () + end; +@@ -2404,9 +2405,9 @@ + | Tarrow _ -> + Location.prerr_warning loc Warnings.Partial_application + | Tconstr (p, _, _) when Path.same p Predef.path_unit -> () +- | Tvar when ty.level > tv.level -> ++ | Tvar _ when ty.level > tv.level -> + Location.prerr_warning loc Warnings.Nonreturning_statement +- | Tvar -> ++ | Tvar _ -> + add_delayed_check (fun () -> check_application_result env true exp) + | _ -> + Location.prerr_warning loc Warnings.Statement_type +Index: typing/btype.mli +=================================================================== +--- typing/btype.mli (リビジョン 11207) ++++ typing/btype.mli (作業コピー) +@@ -23,7 +23,7 @@ + (* Create a type *) + val newgenty: type_desc -> type_expr + (* Create a generic type *) +-val newgenvar: unit -> type_expr ++val newgenvar: ?name:string -> unit -> type_expr + (* Return a fresh generic variable *) + + (* Use Tsubst instead +@@ -33,6 +33,9 @@ + (* Return a fresh marked generic variable *) + *) + ++val is_Tvar: type_expr -> bool ++val is_Tunivar: type_expr -> bool ++ + val repr: type_expr -> type_expr + (* Return the canonical representative of a type. *) + +Index: typing/ctype.mli +=================================================================== +--- typing/ctype.mli (リビジョン 11207) ++++ typing/ctype.mli (作業コピー) +@@ -41,9 +41,10 @@ + (* This pair of functions is only used in Typetexp *) + + val newty: type_desc -> type_expr +-val newvar: unit -> type_expr ++val newvar: ?name:string -> unit -> type_expr ++val newvar2: ?name:string -> int -> type_expr + (* Return a fresh variable *) +-val new_global_var: unit -> type_expr ++val new_global_var: ?name:string -> unit -> type_expr + (* Return a fresh variable, bound at toplevel + (as type variables ['a] in type constraints). *) + val newobj: type_expr -> type_expr +Index: typing/datarepr.ml +=================================================================== +--- typing/datarepr.ml (リビジョン 11207) ++++ typing/datarepr.ml (作業コピー) +@@ -28,7 +28,7 @@ + if ty.level >= lowest_level then begin + ty.level <- pivot_level - ty.level; + match ty.desc with +- | Tvar -> ++ | Tvar _ -> + ret := TypeSet.add ty !ret + | Tvariant row -> + let row = row_repr row in +Index: typing/typeclass.ml +=================================================================== +--- typing/typeclass.ml (リビジョン 11207) ++++ typing/typeclass.ml (作業コピー) +@@ -532,7 +532,7 @@ + (Typetexp.transl_simple_type val_env false sty) ty + end; + begin match (Ctype.repr ty).desc with +- Tvar -> ++ Tvar _ -> + let ty' = Ctype.newvar () in + Ctype.unify val_env (Ctype.newty (Tpoly (ty', []))) ty; + Ctype.unify val_env (type_approx val_env sbody) ty' +Index: typing/typedecl.ml +=================================================================== +--- typing/typedecl.ml (リビジョン 11207) ++++ typing/typedecl.ml (作業コピー) +@@ -111,7 +111,7 @@ + | _ -> + raise (Error (loc, Bad_fixed_type "is not an object or variant")) + in +- if rv.desc <> Tvar then ++ if not (Btype.is_Tvar rv) then + raise (Error (loc, Bad_fixed_type "has no row variable")); + rv.desc <- Tconstr (p, decl.type_params, ref Mnil) + +@@ -503,7 +503,7 @@ + compute_same row.row_more + | Tpoly (ty, _) -> + compute_same ty +- | Tvar | Tnil | Tlink _ | Tunivar -> () ++ | Tvar _ | Tnil | Tlink _ | Tunivar _ -> () + | Tpackage (_, _, tyl) -> + List.iter (compute_variance_rec true true true) tyl + end +@@ -546,7 +546,7 @@ + in + List.iter2 + (fun (ty, co, cn, ct) (c, n) -> +- if ty.desc <> Tvar then begin ++ if not (Btype.is_Tvar ty) then begin + co := c; cn := n; ct := n; + compute_variance env tvl2 c n n ty + end) +@@ -571,7 +571,7 @@ + + let rec anonymous env ty = + match (Ctype.expand_head env ty).desc with +- | Tvar -> false ++ | Tvar _ -> false + | Tobject (fi, _) -> + let _, rv = Ctype.flatten_fields fi in anonymous env rv + | Tvariant row -> +Index: typing/types.mli +=================================================================== +--- typing/types.mli (リビジョン 11207) ++++ typing/types.mli (作業コピー) +@@ -24,7 +24,7 @@ + mutable id: int } + + and type_desc = +- Tvar ++ Tvar of string option + | Tarrow of label * type_expr * type_expr * commutable + | Ttuple of type_expr list + | Tconstr of Path.t * type_expr list * abbrev_memo ref +@@ -34,7 +34,7 @@ + | Tlink of type_expr + | Tsubst of type_expr (* for copying *) + | Tvariant of row_desc +- | Tunivar ++ | Tunivar of string option + | Tpoly of type_expr * type_expr list + | Tpackage of Path.t * string list * type_expr list + +Index: typing/ctype.ml +=================================================================== +--- typing/ctype.ml (リビジョン 11207) ++++ typing/ctype.ml (作業コピー) +@@ -153,9 +153,9 @@ + let newty desc = newty2 !current_level desc + let new_global_ty desc = newty2 !global_level desc + +-let newvar () = newty2 !current_level Tvar +-let newvar2 level = newty2 level Tvar +-let new_global_var () = newty2 !global_level Tvar ++let newvar ?name () = newty2 !current_level (Tvar name) ++let newvar2 ?name level = newty2 level (Tvar name) ++let new_global_var ?name () = newty2 !global_level (Tvar name) + + let newobj fields = newty (Tobject (fields, ref None)) + +@@ -297,14 +297,12 @@ + + let opened_object ty = + match (object_row ty).desc with +- | Tvar -> true +- | Tunivar -> true +- | Tconstr _ -> true +- | _ -> false ++ | Tvar _ | Tunivar _ | Tconstr _ -> true ++ | _ -> false + + let concrete_object ty = + match (object_row ty).desc with +- | Tvar -> false ++ | Tvar _ -> false + | _ -> true + + (**** Close an object ****) +@@ -313,7 +311,7 @@ + let rec close ty = + let ty = repr ty in + match ty.desc with +- Tvar -> ++ Tvar _ -> + link_type ty (newty2 ty.level Tnil) + | Tfield(_, _, _, ty') -> close ty' + | _ -> assert false +@@ -329,7 +327,7 @@ + let ty = repr ty in + match ty.desc with + Tfield (_, _, _, ty) -> find ty +- | Tvar -> ty ++ | Tvar _ -> ty + | _ -> assert false + in + match (repr ty).desc with +@@ -434,7 +432,7 @@ + let level = ty.level in + ty.level <- pivot_level - level; + match ty.desc with +- Tvar when level <> generic_level -> ++ Tvar _ when level <> generic_level -> + raise Non_closed + | Tfield(_, kind, t1, t2) -> + if field_kind_repr kind = Fpresent then +@@ -468,7 +466,7 @@ + if ty.level >= lowest_level then begin + ty.level <- pivot_level - ty.level; + begin match ty.desc, !really_closed with +- Tvar, _ -> ++ Tvar _, _ -> + free_variables := (ty, real) :: !free_variables + | Tconstr (path, tl, _), Some env -> + begin try +@@ -639,7 +637,7 @@ + let rec generalize_structure var_level ty = + let ty = repr ty in + if ty.level <> generic_level then begin +- if ty.desc = Tvar && ty.level > var_level then ++ if is_Tvar ty && ty.level > var_level then + set_level ty var_level + else if ty.level > !current_level then begin + set_level ty generic_level; +@@ -858,7 +856,7 @@ + TypeHash.add node_univars inv.inv_type (ref(TypeSet.singleton univ)); + List.iter (add_univar univ) inv.inv_parents + in +- TypeHash.iter (fun ty inv -> if ty.desc = Tunivar then add_univar ty inv) ++ TypeHash.iter (fun ty inv -> if is_Tunivar ty then add_univar ty inv) + inverted; + fun ty -> + try !(TypeHash.find node_univars ty) with Not_found -> TypeSet.empty +@@ -913,7 +911,7 @@ + if keep then ty.level else !current_level + else generic_level + in +- if forget <> generic_level then newty2 forget Tvar else ++ if forget <> generic_level then newty2 forget (Tvar None) else + let desc = ty.desc in + save_desc ty desc; + let t = newvar() in (* Stub *) +@@ -959,7 +957,7 @@ + | Tconstr _ -> + if keep then save_desc more more.desc; + copy more +- | Tvar | Tunivar -> ++ | Tvar _ | Tunivar _ -> + save_desc more more.desc; + if keep then more else newty more.desc + | _ -> assert false +@@ -1117,7 +1115,7 @@ + t + else try + let t, bound_t = List.assq ty visited in +- let dl = if ty.desc = Tunivar then [] else diff_list bound bound_t in ++ let dl = if is_Tunivar ty then [] else diff_list bound bound_t in + if dl <> [] && conflicts univars dl then raise Not_found; + t + with Not_found -> begin +@@ -1134,14 +1132,14 @@ + let row = row_repr row0 in + let more = repr row.row_more in + (* We shall really check the level on the row variable *) +- let keep = more.desc = Tvar && more.level <> generic_level in ++ let keep = is_Tvar more && more.level <> generic_level in + let more' = copy_rec more in +- let fixed' = fixed && (repr more').desc = Tvar in ++ let fixed' = fixed && is_Tvar (repr more') in + let row = copy_row copy_rec fixed' row keep more' in + Tvariant row + | Tpoly (t1, tl) -> + let tl = List.map repr tl in +- let tl' = List.map (fun t -> newty Tunivar) tl in ++ let tl' = List.map (fun t -> newty t.desc) tl in + let bound = tl @ bound in + let visited = + List.map2 (fun ty t -> ty,(t,bound)) tl tl' @ visited in +@@ -1395,7 +1393,7 @@ + let rec full_expand env ty = + let ty = repr (expand_head env ty) in + match ty.desc with +- Tobject (fi, {contents = Some (_, v::_)}) when (repr v).desc = Tvar -> ++ Tobject (fi, {contents = Some (_, v::_)}) when is_Tvar (repr v) -> + newty2 ty.level (Tobject (fi, ref None)) + | _ -> + ty +@@ -1570,8 +1568,8 @@ + true + then + match ty.desc with +- Tunivar -> +- if not (TypeSet.mem ty bound) then raise (Unify [ty, newgenvar()]) ++ Tunivar _ -> ++ if not (TypeSet.mem ty bound) then raise (Unify [ty, newgenvar ()]) + | Tpoly (ty, tyl) -> + let bound = List.fold_right TypeSet.add (List.map repr tyl) bound in + occur_rec bound ty +@@ -1620,7 +1618,7 @@ + Tpoly (t, tl) -> + if List.exists (fun t -> TypeSet.mem (repr t) family) tl then () + else occur t +- | Tunivar -> ++ | Tunivar _ -> + if TypeSet.mem t family then raise Occur + | Tconstr (_, [], _) -> () + | Tconstr (p, tl, _) -> +@@ -1784,7 +1782,7 @@ + t + end; + iter_type_expr (iterator visited) ty +- | Tvar -> ++ | Tvar _ -> + let t = create_fresh_constr ty.level false in + link_type ty t + | _ -> +@@ -1862,8 +1860,8 @@ + let t2 = repr t2 in + if t1 == t2 then () else + match (t1.desc, t2.desc) with +- | (Tvar, _) +- | (_, Tvar) -> ++ | (Tvar _, _) ++ | (_, Tvar _) -> + fatal_error "types should not include variables" + | (Tconstr (p1, [], _), Tconstr (p2, [], _)) when Path.same p1 p2 -> + () +@@ -1877,7 +1875,7 @@ + with Not_found -> + TypePairs.add type_pairs (t1', t2') (); + match (t1'.desc, t2'.desc) with +- (Tvar, Tvar) -> ++ (Tvar _, Tvar _) -> + fatal_error "types should not include variables" + | (Tarrow (l1, t1, u1, _), Tarrow (l2, t2, u2, _)) when l1 = l2 + || !Clflags.classic && not (is_optional l1 || is_optional l2) -> +@@ -1903,7 +1901,7 @@ + | (Tpoly (t1, tl1), Tpoly (t2, tl2)) -> + enter_poly env univar_pairs t1 tl1 t2 tl2 + (mcomp type_pairs subst env) +- | (Tunivar, Tunivar) -> ++ | (Tunivar _, Tunivar _) -> + unify_univar t1' t2' !univar_pairs + | (_, _) -> + raise (Unify []) +@@ -2048,21 +2046,21 @@ + try + type_changed := true; + match (t1.desc, t2.desc) with +- (Tvar, Tconstr _) when deep_occur t1 t2 -> ++ (Tvar _, Tconstr _) when deep_occur t1 t2 -> + unify2 env t1 t2 +- | (Tconstr _, Tvar) when deep_occur t2 t1 -> ++ | (Tconstr _, Tvar _) when deep_occur t2 t1 -> + unify2 env t1 t2 +- | (Tvar, _) -> ++ | (Tvar _, _) -> + occur !env t1 t2; + occur_univar !env t2; + link_type t1 t2; + update_level !env t1.level t2 +- | (_, Tvar) -> ++ | (_, Tvar _) -> + occur !env t2 t1; + occur_univar !env t1; + link_type t2 t1; + update_level !env t2.level t1 +- | (Tunivar, Tunivar) -> ++ | (Tunivar _, Tunivar _) -> + unify_univar t1 t2 !univar_pairs; + update_level !env t1.level t2; + link_type t1 t2 +@@ -2104,7 +2102,7 @@ + (* Assumes either [t1 == t1'] or [t2 != t2'] *) + let d1 = t1'.desc and d2 = t2'.desc in + match (d1, d2) with (* handle univars specially *) +- (Tunivar, Tunivar) -> ++ (Tunivar _, Tunivar _) -> + unify_univar t1' t2' !univar_pairs; + update_level !env t1'.level t2'; + link_type t1' t2' +@@ -2127,12 +2125,12 @@ + | Old -> f () (* old_link was already called *) + in + match d1, d2 with +- | Tvar,_ -> ++ | Tvar _, _ -> + occur !env t1 t2'; + occur_univar !env t2; + update_level !env t1'.level t2; + link_type t1' t2; +- | _, Tvar -> ++ | _, Tvar _ -> + occur !env t2 t1'; + occur_univar !env t1; + update_level !env t2'.level t1; +@@ -2149,8 +2147,8 @@ + add_type_equality t1' t2' end; + try + begin match (d1, d2) with +- | (Tvar, _) +- | (_, Tvar) -> ++ | (Tvar _, _) ++ | (_, Tvar _) -> + (* cases taken care of *) + assert false + | (Tarrow (l1, t1, u1, c1), Tarrow (l2, t2, u2, c2)) when l1 = l2 +@@ -2214,8 +2212,9 @@ + (* Type [t2'] may have been instantiated by [unify_fields] *) + (* XXX One should do some kind of unification... *) + begin match (repr t2').desc with +- Tobject (_, {contents = Some (_, va::_)}) +- when let va = repr va in List.mem va.desc [Tvar; Tunivar; Tnil] -> ++ Tobject (_, {contents = Some (_, va::_)}) when ++ (match (repr va).desc with ++ Tvar _|Tunivar _|Tnil -> true | _ -> false) -> + () + | Tobject (_, nm2) -> + set_name nm2 !nm1 +@@ -2290,16 +2289,32 @@ + raise (Unify []); + List.iter2 (unify env) tl1 tl2 + ++(* Build a fresh row variable for unification *) ++and make_rowvar level use1 rest1 use2 rest2 = ++ let set_name ty name = ++ match ty.desc with ++ Tvar None -> log_type ty; ty.desc <- Tvar name ++ | _ -> () ++ in ++ let name = ++ match rest1.desc, rest2.desc with ++ Tvar (Some _ as name1), Tvar (Some _ as name2) -> ++ if rest1.level <= rest2.level then name1 else name2 ++ | Tvar (Some _ as name), _ -> ++ if use2 then set_name rest2 name; name ++ | _, Tvar (Some _ as name) -> ++ if use1 then set_name rest2 name; name ++ | _ -> None ++ in ++ if use1 then rest1 else ++ if use2 then rest2 else newvar2 ?name level ++ + and unify_fields env ty1 ty2 = (* Optimization *) + let (fields1, rest1) = flatten_fields ty1 + and (fields2, rest2) = flatten_fields ty2 in + let (pairs, miss1, miss2) = associate_fields fields1 fields2 in + let l1 = (repr ty1).level and l2 = (repr ty2).level in +- let va = +- if miss1 = [] then rest2 +- else if miss2 = [] then rest1 +- else newty2 (min l1 l2) Tvar +- in ++ let va = make_rowvar (min l1 l2) (miss2=[]) rest1 (miss1=[]) rest2 in + let d1 = rest1.desc and d2 = rest2.desc in + try + unify env (build_fields l1 miss1 va) rest2; +@@ -2390,7 +2405,7 @@ + let rm = row_more row in + if row.row_fixed then + if row0.row_more == rm then () else +- if rm.desc = Tvar then link_type rm row0.row_more else ++ if is_Tvar rm then link_type rm row0.row_more else + unify env rm row0.row_more + else + let ty = newty2 generic_level (Tvariant {row0 with row_fields = rest}) in +@@ -2489,7 +2504,7 @@ + let t1 = repr t1 and t2 = repr t2 in + if t1 == t2 then () else + match t1.desc with +- Tvar -> ++ Tvar _ -> + begin try + occur env t1 t2; + update_level env t1.level t2; +@@ -2527,7 +2542,7 @@ + let rec filter_arrow env t l = + let t = expand_head_unif env t in + match t.desc with +- Tvar -> ++ Tvar _ -> + let lv = t.level in + let t1 = newvar2 lv and t2 = newvar2 lv in + let t' = newty2 lv (Tarrow (l, t1, t2, Cok)) in +@@ -2543,7 +2558,7 @@ + let rec filter_method_field env name priv ty = + let ty = repr ty in + match ty.desc with +- Tvar -> ++ Tvar _ -> + let level = ty.level in + let ty1 = newvar2 level and ty2 = newvar2 level in + let ty' = newty2 level (Tfield (name, +@@ -2570,7 +2585,7 @@ + let rec filter_method env name priv ty = + let ty = expand_head_unif env ty in + match ty.desc with +- Tvar -> ++ Tvar _ -> + let ty1 = newvar () in + let ty' = newobj ty1 in + update_level env ty.level ty'; +@@ -2606,7 +2621,7 @@ + let rec occur ty = + let ty = repr ty in + if ty.level > level then begin +- if ty.desc = Tvar && ty.level >= generic_level - 1 then raise Occur; ++ if is_Tvar ty && ty.level >= generic_level - 1 then raise Occur; + ty.level <- pivot_level - ty.level; + match ty.desc with + Tvariant row when static_row row -> +@@ -2636,7 +2651,7 @@ + + try + match (t1.desc, t2.desc) with +- (Tvar, _) when may_instantiate inst_nongen t1 -> ++ (Tvar _, _) when may_instantiate inst_nongen t1 -> + moregen_occur env t1.level t2; + occur env t1 t2; + link_type t1 t2 +@@ -2653,7 +2668,7 @@ + with Not_found -> + TypePairs.add type_pairs (t1', t2') (); + match (t1'.desc, t2'.desc) with +- (Tvar, _) when may_instantiate inst_nongen t1' -> ++ (Tvar _, _) when may_instantiate inst_nongen t1' -> + moregen_occur env t1'.level t2; + link_type t1' t2 + | (Tarrow (l1, t1, u1, _), Tarrow (l2, t2, u2, _)) when l1 = l2 +@@ -2684,7 +2699,7 @@ + | (Tpoly (t1, tl1), Tpoly (t2, tl2)) -> + enter_poly env univar_pairs t1 tl1 t2 tl2 + (moregen inst_nongen type_pairs env) +- | (Tunivar, Tunivar) -> ++ | (Tunivar _, Tunivar _) -> + unify_univar t1' t2' !univar_pairs + | (_, _) -> + raise (Unify []) +@@ -2725,7 +2740,7 @@ + let row1 = row_repr row1 and row2 = row_repr row2 in + let rm1 = repr row1.row_more and rm2 = repr row2.row_more in + if rm1 == rm2 then () else +- let may_inst = rm1.desc = Tvar && may_instantiate inst_nongen rm1 in ++ let may_inst = is_Tvar rm1 && may_instantiate inst_nongen rm1 in + let r1, r2, pairs = merge_row_fields row1.row_fields row2.row_fields in + let r1, r2 = + if row2.row_closed then +@@ -2735,9 +2750,9 @@ + if r1 <> [] || row1.row_closed && (not row2.row_closed || r2 <> []) + then raise (Unify []); + begin match rm1.desc, rm2.desc with +- Tunivar, Tunivar -> ++ Tunivar _, Tunivar _ -> + unify_univar rm1 rm2 !univar_pairs +- | Tunivar, _ | _, Tunivar -> ++ | Tunivar _, _ | _, Tunivar _ -> + raise (Unify []) + | _ when static_row row1 -> () + | _ when may_inst -> +@@ -2828,13 +2843,13 @@ + if ty.level >= lowest_level then begin + ty.level <- pivot_level - ty.level; + match ty.desc with +- | Tvar -> ++ | Tvar _ -> + if not (List.memq ty !vars) then vars := ty :: !vars + | Tvariant row -> + let row = row_repr row in + let more = repr row.row_more in +- if more.desc = Tvar && not row.row_fixed then begin +- let more' = newty2 more.level Tvar in ++ if is_Tvar more && not row.row_fixed 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')) + end; +@@ -2857,7 +2872,7 @@ + (fun ty -> + let ty = expand_head env ty in + if List.memq ty !tyl then false else +- (tyl := ty :: !tyl; ty.desc = Tvar)) ++ (tyl := ty :: !tyl; is_Tvar ty)) + vars + + let matches env ty ty' = +@@ -2901,7 +2916,7 @@ + + try + match (t1.desc, t2.desc) with +- (Tvar, Tvar) when rename -> ++ (Tvar _, Tvar _) when rename -> + begin try + normalize_subst subst; + if List.assq t1 !subst != t2 then raise (Unify []) +@@ -2922,7 +2937,7 @@ + with Not_found -> + TypePairs.add type_pairs (t1', t2') (); + match (t1'.desc, t2'.desc) with +- (Tvar, Tvar) when rename -> ++ (Tvar _, Tvar _) when rename -> + begin try + normalize_subst subst; + if List.assq t1' !subst != t2' then raise (Unify []) +@@ -2956,7 +2971,7 @@ + | (Tpoly (t1, tl1), Tpoly (t2, tl2)) -> + enter_poly env univar_pairs t1 tl1 t2 tl2 + (eqtype rename type_pairs subst env) +- | (Tunivar, Tunivar) -> ++ | (Tunivar _, Tunivar _) -> + unify_univar t1' t2' !univar_pairs + | (_, _) -> + raise (Unify []) +@@ -3405,7 +3420,7 @@ + let rec build_subtype env visited loops posi level t = + let t = repr t in + match t.desc with +- Tvar -> ++ Tvar _ -> + if posi then + try + let t' = List.assq t loops in +@@ -3454,13 +3469,13 @@ + as this occurence might break the occur check. + XXX not clear whether this correct anyway... *) + if List.exists (deep_occur ty) tl1 then raise Not_found; +- ty.desc <- Tvar; ++ ty.desc <- Tvar None; + let t'' = newvar () in + let loops = (ty, t'') :: loops in + (* May discard [visited] as level is going down *) + let (ty1', c) = + build_subtype env [t'] loops posi (pred_enlarge level') ty1 in +- assert (t''.desc = Tvar); ++ assert (is_Tvar t''); + let nm = + if c > Equiv || deep_occur ty ty1' then None else Some(p,tl1) in + t''.desc <- Tobject (ty1', ref nm); +@@ -3559,7 +3574,7 @@ + let (t1', c) = build_subtype env visited loops posi level t1 in + if c > Unchanged then (newty (Tpoly(t1', tl)), c) + else (t, Unchanged) +- | Tunivar | Tpackage _ -> ++ | Tunivar _ | Tpackage _ -> + (t, Unchanged) + + let enlarge_type env ty = +@@ -3623,7 +3638,7 @@ + with Not_found -> + TypePairs.add subtypes (t1, t2) (); + match (t1.desc, t2.desc) with +- (Tvar, _) | (_, Tvar) -> ++ (Tvar _, _) | (_, Tvar _) -> + (trace, t1, t2, !univar_pairs)::cstrs + | (Tarrow(l1, t1, u1, _), Tarrow(l2, t2, u2, _)) when l1 = l2 + || !Clflags.classic && not (is_optional l1 || is_optional l2) -> +@@ -3659,7 +3674,7 @@ + | (Tconstr(p1, tl1, _), _) when private_abbrev env p1 -> + subtype_rec env trace (expand_abbrev_opt env t1) t2 cstrs + | (Tobject (f1, _), Tobject (f2, _)) +- when (object_row f1).desc = Tvar && (object_row f2).desc = Tvar -> ++ when is_Tvar (object_row f1) && is_Tvar (object_row f2) -> + (* Same row variable implies same object. *) + (trace, t1, t2, !univar_pairs)::cstrs + | (Tobject (f1, _), Tobject (f2, _)) -> +@@ -3731,7 +3746,7 @@ + match more1.desc, more2.desc with + Tconstr(p1,_,_), Tconstr(p2,_,_) when Path.same p1 p2 -> + subtype_rec env ((more1,more2)::trace) more1 more2 cstrs +- | (Tvar|Tconstr _), (Tvar|Tconstr _) ++ | (Tvar _|Tconstr _), (Tvar _|Tconstr _) + when row1.row_closed && r1 = [] -> + List.fold_left + (fun cstrs (_,f1,f2) -> +@@ -3745,7 +3760,7 @@ + | Rabsent, _ -> cstrs + | _ -> raise Exit) + cstrs pairs +- | Tunivar, Tunivar ++ | Tunivar _, Tunivar _ + when row1.row_closed = row2.row_closed && r1 = [] && r2 = [] -> + let cstrs = + subtype_rec env ((more1,more2)::trace) more1 more2 cstrs in +@@ -3789,19 +3804,19 @@ + match ty.desc with + Tfield (s, k, t1, t2) -> + newty2 ty.level (Tfield (s, k, t1, unalias_object t2)) +- | Tvar | Tnil -> ++ | Tvar _ | Tnil -> + newty2 ty.level ty.desc +- | Tunivar -> ++ | Tunivar _ -> + ty + | Tconstr _ -> +- newty2 ty.level Tvar ++ newvar2 ty.level + | _ -> + assert false + + let unalias ty = + let ty = repr ty in + match ty.desc with +- Tvar | Tunivar -> ++ Tvar _ | Tunivar _ -> + ty + | Tvariant row -> + let row = row_repr row in +@@ -3875,7 +3890,7 @@ + set_name nm None + else let v' = repr v in + begin match v'.desc with +- | Tvar|Tunivar -> ++ | Tvar _ | Tunivar _ -> + if v' != v then set_name nm (Some (n, v' :: l)) + | Tnil -> + log_type ty; ty.desc <- Tconstr (n, l, ref Mnil) +@@ -3917,7 +3932,7 @@ + + let rec nondep_type_rec env id ty = + match ty.desc with +- Tvar | Tunivar -> ty ++ Tvar _ | Tunivar _ -> ty + | Tlink ty -> nondep_type_rec env id ty + | _ -> try TypeHash.find nondep_hash ty + with Not_found -> +@@ -3987,7 +4002,7 @@ + + let unroll_abbrev id tl ty = + let ty = repr ty and path = Path.Pident id in +- if (ty.desc = Tvar) || (List.exists (deep_occur ty) tl) ++ if is_Tvar ty || (List.exists (deep_occur ty) tl) + || is_object_type path then + ty + else +Index: typing/printtyp.ml +=================================================================== +--- typing/printtyp.ml (リビジョン 11207) ++++ typing/printtyp.ml (作業コピー) +@@ -109,6 +109,10 @@ + | Mcons (priv, p, t1, t2, rem) -> p :: list_of_memo rem + | Mlink rem -> list_of_memo !rem + ++let print_name ppf = function ++ None -> fprintf ppf "None" ++ | Some name -> fprintf ppf "\"%s\"" name ++ + let visited = ref [] + let rec raw_type ppf ty = + let ty = safe_repr [] ty in +@@ -119,7 +123,7 @@ + end + and raw_type_list tl = raw_list raw_type tl + and raw_type_desc ppf = function +- Tvar -> fprintf ppf "Tvar" ++ Tvar name -> fprintf ppf "Tvar %a" print_name name + | Tarrow(l,t1,t2,c) -> + fprintf ppf "@[<hov1>Tarrow(%s,@,%a,@,%a,@,%s)@]" + l raw_type t1 raw_type t2 +@@ -143,7 +147,7 @@ + | Tnil -> fprintf ppf "Tnil" + | Tlink t -> fprintf ppf "@[<1>Tlink@,%a@]" raw_type t + | Tsubst t -> fprintf ppf "@[<1>Tsubst@,%a@]" raw_type t +- | Tunivar -> fprintf ppf "Tunivar" ++ | Tunivar name -> fprintf ppf "Tunivar %a" print_name name + | Tpoly (t, tl) -> + fprintf ppf "@[<hov1>Tpoly(@,%a,@,%a)@]" + raw_type t +@@ -189,28 +193,61 @@ + + let names = ref ([] : (type_expr * string) list) + let name_counter = ref 0 ++let named_vars = ref ([] : string list) + +-let reset_names () = names := []; name_counter := 0 ++let reset_names () = names := []; name_counter := 0; named_vars := [] ++let add_named_var ty = ++ match ty.desc with ++ Tvar (Some name) | Tunivar (Some name) -> ++ if List.mem name !named_vars then () else ++ named_vars := name :: !named_vars ++ | _ -> () + +-let new_name () = ++let rec new_name () = + let name = + if !name_counter < 26 + then String.make 1 (Char.chr(97 + !name_counter)) + else String.make 1 (Char.chr(97 + !name_counter mod 26)) ^ + string_of_int(!name_counter / 26) in + incr name_counter; +- name ++ if List.mem name !named_vars ++ || List.exists (fun (_, name') -> name = name') !names ++ then new_name () ++ else name + + let name_of_type t = ++ (* We've already been through repr at this stage, so t is our representative ++ of the union-find class. *) + try List.assq t !names with Not_found -> +- let name = new_name () in ++ let name = ++ match t.desc with ++ Tvar (Some name) | Tunivar (Some name) -> ++ (* Some part of the type we've already printed has assigned another ++ * unification variable to that name. We want to keep the name, so try ++ * adding a number until we find a name that's not taken. *) ++ let current_name = ref name in ++ let i = ref 0 in ++ while List.exists (fun (_, name') -> !current_name = name') !names do ++ current_name := name ^ (string_of_int !i); ++ i := !i + 1; ++ done; ++ !current_name ++ | _ -> ++ (* No name available, create a new one *) ++ new_name () ++ in + names := (t, name) :: !names; + name + + let check_name_of_type t = ignore(name_of_type t) + ++let remove_names tyl = ++ let tyl = List.map repr tyl in ++ names := List.filter (fun (ty,_) -> not (List.memq ty tyl)) !names ++ ++ + let non_gen_mark sch ty = +- if sch && ty.desc = Tvar && ty.level <> generic_level then "_" else "" ++ if sch && is_Tvar ty && ty.level <> generic_level then "_" else "" + + let print_name_of_type sch ppf t = + fprintf ppf "'%s%s" (non_gen_mark sch t) (name_of_type t) +@@ -225,9 +262,13 @@ + let is_aliased ty = List.memq (proxy ty) !aliased + let add_alias ty = + let px = proxy ty in +- if not (is_aliased px) then aliased := px :: !aliased ++ if not (is_aliased px) then begin ++ aliased := px :: !aliased; ++ add_named_var px ++ end ++ + let aliasable ty = +- match ty.desc with Tvar | Tunivar | Tpoly _ -> false | _ -> true ++ match ty.desc with Tvar _ | Tunivar _ | Tpoly _ -> false | _ -> true + + let namable_row row = + row.row_name <> None && +@@ -245,7 +286,7 @@ + if List.memq px visited && aliasable ty then add_alias px else + let visited = px :: visited in + match ty.desc with +- | Tvar -> () ++ | Tvar _ -> add_named_var ty + | Tarrow(_, ty1, ty2, _) -> + mark_loops_rec visited ty1; mark_loops_rec visited ty2 + | Ttuple tyl -> List.iter (mark_loops_rec visited) tyl +@@ -290,7 +331,7 @@ + | Tpoly (ty, tyl) -> + List.iter (fun t -> add_alias t) tyl; + mark_loops_rec visited ty +- | Tunivar -> () ++ | Tunivar _ -> add_named_var ty + + let mark_loops ty = + normalize_type Env.empty ty; +@@ -322,7 +363,7 @@ + + let pr_typ () = + match ty.desc with +- | Tvar -> ++ | Tvar _ -> + Otyp_var (is_non_gen sch ty, name_of_type ty) + | Tarrow(l, ty1, ty2, _) -> + let pr_arrow l ty1 ty2 = +@@ -387,16 +428,22 @@ + | Tpoly (ty, []) -> + tree_of_typexp sch ty + | Tpoly (ty, tyl) -> ++ (*let print_names () = ++ List.iter (fun (_, name) -> prerr_string (name ^ " ")) !names; ++ prerr_string "; " in *) + let tyl = List.map repr tyl in +- (* let tyl = List.filter is_aliased tyl in *) + if tyl = [] then tree_of_typexp sch ty else begin + let old_delayed = !delayed in ++ (* Make the names delayed, so that the real type is ++ printed once when used as proxy *) + List.iter add_delayed tyl; + let tl = List.map name_of_type tyl in + let tr = Otyp_poly (tl, tree_of_typexp sch ty) in ++ (* Forget names when we leave scope *) ++ remove_names tyl; + delayed := old_delayed; tr + end +- | Tunivar -> ++ | Tunivar _ -> + Otyp_var (false, name_of_type ty) + | Tpackage (p, n, tyl) -> + Otyp_module (Path.name p, n, tree_of_typlist sch tyl) +@@ -446,13 +493,13 @@ + end + + and is_non_gen sch ty = +- sch && ty.desc = Tvar && ty.level <> generic_level ++ sch && is_Tvar ty && ty.level <> generic_level + + and tree_of_typfields sch rest = function + | [] -> + let rest = + match rest.desc with +- | Tvar | Tunivar -> Some (is_non_gen sch rest) ++ | Tvar _ | Tunivar _ -> Some (is_non_gen sch rest) + | Tconstr _ -> Some false + | Tnil -> None + | _ -> fatal_error "typfields (1)" +@@ -564,7 +611,7 @@ + let vari = + List.map2 + (fun ty (co,cn,ct) -> +- if abstr || (repr ty).desc <> Tvar then (co,cn) else (true,true)) ++ if abstr || not (is_Tvar (repr ty)) then (co,cn) else (true,true)) + decl.type_params decl.type_variance + in + (Ident.name id, +@@ -645,16 +692,18 @@ + + let method_type (_, kind, ty) = + match field_kind_repr kind, repr ty with +- Fpresent, {desc=Tpoly(ty, _)} -> ty +- | _ , ty -> ty ++ Fpresent, {desc=Tpoly(ty, tyl)} -> (ty, tyl) ++ | _ , ty -> (ty, []) + + let tree_of_metho sch concrete csil (lab, kind, ty) = + if lab <> dummy_method then begin + let kind = field_kind_repr kind in + let priv = kind <> Fpresent in + let virt = not (Concr.mem lab concrete) in +- let ty = method_type (lab, kind, ty) in +- Ocsg_method (lab, priv, virt, tree_of_typexp sch ty) :: csil ++ let (ty, tyl) = method_type (lab, kind, ty) in ++ let tty = tree_of_typexp sch ty in ++ remove_names tyl; ++ Ocsg_method (lab, priv, virt, tty) :: csil + end + else csil + +@@ -662,7 +711,7 @@ + | Tcty_constr (p, tyl, cty) -> + let sty = Ctype.self_type cty in + if List.memq (proxy sty) !visited_objects +- || List.exists (fun ty -> (repr ty).desc <> Tvar) params ++ || not (List.for_all is_Tvar params) + || List.exists (deep_occur sty) tyl + then prepare_class_type params cty + else List.iter mark_loops tyl +@@ -675,7 +724,7 @@ + let (fields, _) = + Ctype.flatten_fields (Ctype.object_fields sign.cty_self) + in +- List.iter (fun met -> mark_loops (method_type met)) fields; ++ List.iter (fun met -> mark_loops (fst (method_type met))) fields; + Vars.iter (fun _ (_, _, ty) -> mark_loops ty) sign.cty_vars + | Tcty_fun (_, ty, cty) -> + mark_loops ty; +@@ -686,7 +735,7 @@ + | Tcty_constr (p', tyl, cty) -> + let sty = Ctype.self_type cty in + if List.memq (proxy sty) !visited_objects +- || List.exists (fun ty -> (repr ty).desc <> Tvar) params ++ || not (List.for_all is_Tvar params) + then + tree_of_class_type sch params cty + else +@@ -743,7 +792,7 @@ + (match tree_of_typexp true param with + Otyp_var (_, s) -> s + | _ -> "?"), +- if (repr param).desc = Tvar then (true, true) else variance ++ if is_Tvar (repr param) then (true, true) else variance + + let tree_of_class_params params = + let tyl = tree_of_typlist true params in +@@ -890,7 +939,7 @@ + | {desc = Tvariant row} as t when (row_repr row).row_name <> None -> + newty2 t.level + (Tvariant {(row_repr row) with row_name = None; +- row_more = newty2 (row_more row).level Tvar}) ++ row_more = newvar2 (row_more row).level}) + | _ -> t + + let prepare_expansion (t, t') = +@@ -913,9 +962,9 @@ + let has_explanation unif t3 t4 = + match t3.desc, t4.desc with + Tfield _, _ | _, Tfield _ +- | Tunivar, Tvar | Tvar, Tunivar ++ | Tunivar _, Tvar _ | Tvar _, Tunivar _ + | Tvariant _, Tvariant _ -> true +- | Tconstr (p, _, _), Tvar | Tvar, Tconstr (p, _, _) -> ++ | Tconstr (p, _, _), Tvar _ | Tvar _, Tconstr (p, _, _) -> + unif && min t3.level t4.level < Path.binding_time p + | _ -> false + +@@ -931,21 +980,21 @@ + + let explanation unif t3 t4 ppf = + match t3.desc, t4.desc with +- | Tfield _, Tvar | Tvar, Tfield _ -> ++ | Tfield _, Tvar _ | Tvar _, Tfield _ -> + fprintf ppf "@,Self type cannot escape its class" +- | Tconstr (p, tl, _), Tvar ++ | Tconstr (p, tl, _), Tvar _ + when unif && (tl = [] || t4.level < Path.binding_time p) -> + fprintf ppf + "@,@[The type constructor@;<1 2>%a@ would escape its scope@]" + path p +- | Tvar, Tconstr (p, tl, _) ++ | Tvar _, Tconstr (p, tl, _) + when unif && (tl = [] || t3.level < Path.binding_time p) -> + fprintf ppf + "@,@[The type constructor@;<1 2>%a@ would escape its scope@]" + path p +- | Tvar, Tunivar | Tunivar, Tvar -> ++ | Tvar _, Tunivar _ | Tunivar _, Tvar _ -> + fprintf ppf "@,The universal variable %a would escape its scope" +- type_expr (if t3.desc = Tunivar then t3 else t4) ++ type_expr (if is_Tunivar t3 then t3 else t4) + | Tfield (lab, _, _, _), _ + | _, Tfield (lab, _, _, _) when lab = dummy_method -> + fprintf ppf +Index: typing/includecore.ml +=================================================================== +--- typing/includecore.ml (リビジョン 11207) ++++ typing/includecore.ml (作業コピー) +@@ -61,7 +61,7 @@ + Tvariant row1, Tvariant row2 when is_absrow env (Btype.row_more row2) -> + let row1 = Btype.row_repr row1 and row2 = Btype.row_repr row2 in + Ctype.equal env true (ty1::params1) (row2.row_more::params2) && +- (match row1.row_more with {desc=Tvar|Tconstr _} -> true | _ -> false) && ++ (match row1.row_more with {desc=Tvar _|Tconstr _} -> true | _ -> false) && + let r1, r2, pairs = + Ctype.merge_row_fields row1.row_fields row2.row_fields in + (not row2.row_closed || +@@ -91,7 +91,7 @@ + let (fields2,rest2) = Ctype.flatten_fields fi2 in + Ctype.equal env true (ty1::params1) (rest2::params2) && + let (fields1,rest1) = Ctype.flatten_fields fi1 in +- (match rest1 with {desc=Tnil|Tvar|Tconstr _} -> true | _ -> false) && ++ (match rest1 with {desc=Tnil|Tvar _|Tconstr _} -> true | _ -> false) && + let pairs, miss1, miss2 = Ctype.associate_fields fields1 fields2 in + miss2 = [] && + let tl1, tl2 = +@@ -251,7 +251,7 @@ + let encode_val (mut, ty) rem = + begin match mut with + Asttypes.Mutable -> Predef.type_unit +- | Asttypes.Immutable -> Btype.newgenty Tvar ++ | Asttypes.Immutable -> Btype.newgenvar () + end + ::ty::rem + +Index: typing/subst.ml +=================================================================== +--- typing/subst.ml (リビジョン 11207) ++++ typing/subst.ml (作業コピー) +@@ -71,16 +71,19 @@ + let reset_for_saving () = new_id := -1 + + let newpersty desc = +- decr new_id; { desc = desc; level = generic_level; id = !new_id } ++ decr new_id; ++ { desc = desc; level = generic_level; id = !new_id } + + (* Similar to [Ctype.nondep_type_rec]. *) + let rec typexp s ty = + let ty = repr ty in + match ty.desc with +- Tvar | Tunivar -> ++ Tvar _ | Tunivar _ -> + if s.for_saving || ty.id < 0 then ++ let desc = match ty.desc with (* Tvar _ -> Tvar None *) | d -> d in + let ty' = +- if s.for_saving then newpersty ty.desc else newty2 ty.level ty.desc ++ if s.for_saving then newpersty desc ++ else newty2 ty.level desc + in + save_desc ty ty.desc; ty.desc <- Tsubst ty'; ty' + else ty +@@ -94,7 +97,7 @@ + let desc = ty.desc in + save_desc ty desc; + (* Make a stub *) +- let ty' = if s.for_saving then newpersty Tvar else newgenvar () in ++ let ty' = if s.for_saving then newpersty (Tvar None) else newgenvar () in + ty.desc <- Tsubst ty'; + ty'.desc <- + begin match desc with +@@ -127,10 +130,10 @@ + match more.desc with + Tsubst ty -> ty + | Tconstr _ -> typexp s more +- | Tunivar | Tvar -> ++ | Tunivar _ | Tvar _ -> + save_desc more more.desc; + if s.for_saving then newpersty more.desc else +- if dup && more.desc <> Tunivar then newgenvar () else more ++ if dup && is_Tvar more then newgenty more.desc else more + | _ -> assert false + in + (* Register new type first for recursion *) +Index: typing/types.ml +=================================================================== +--- typing/types.ml (リビジョン 11207) ++++ typing/types.ml (作業コピー) +@@ -25,7 +25,7 @@ + mutable id: int } + + and type_desc = +- Tvar ++ Tvar of string option + | Tarrow of label * type_expr * type_expr * commutable + | Ttuple of type_expr list + | Tconstr of Path.t * type_expr list * abbrev_memo ref +@@ -35,7 +35,7 @@ + | Tlink of type_expr + | Tsubst of type_expr (* for copying *) + | Tvariant of row_desc +- | Tunivar ++ | Tunivar of string option + | Tpoly of type_expr * type_expr list + | Tpackage of Path.t * string list * type_expr list + +Index: ocamldoc/odoc_str.ml +=================================================================== +--- ocamldoc/odoc_str.ml (リビジョン 11207) ++++ ocamldoc/odoc_str.ml (作業コピー) +@@ -31,7 +31,7 @@ + | Types.Tlink t2 | Types.Tsubst t2 -> is_arrow_type t2 + | Types.Ttuple _ + | Types.Tconstr _ +- | Types.Tvar | Types.Tunivar | Types.Tobject _ | Types.Tpoly _ ++ | Types.Tvar _ | Types.Tunivar _ | Types.Tobject _ | Types.Tpoly _ + | Types.Tfield _ | Types.Tnil | Types.Tvariant _ | Types.Tpackage _ -> false + + let raw_string_of_type_list sep type_list = +@@ -43,7 +43,7 @@ + | Types.Tlink t2 | Types.Tsubst t2 -> need_parent t2 + | Types.Tconstr _ -> + false +- | Types.Tvar | Types.Tunivar | Types.Tobject _ | Types.Tpoly _ ++ | Types.Tvar _ | Types.Tunivar _ | Types.Tobject _ | Types.Tpoly _ + | Types.Tfield _ | Types.Tnil | Types.Tvariant _ | Types.Tpackage _ -> false + in + let print_one_type variance t = +Index: ocamldoc/odoc_value.ml +=================================================================== +--- ocamldoc/odoc_value.ml (リビジョン 11207) ++++ ocamldoc/odoc_value.ml (作業コピー) +@@ -77,13 +77,13 @@ + | Types.Tsubst texp -> + iter texp + | Types.Tpoly (texp, _) -> iter texp +- | Types.Tvar ++ | Types.Tvar _ + | Types.Ttuple _ + | Types.Tconstr _ + | Types.Tobject _ + | Types.Tfield _ + | Types.Tnil +- | Types.Tunivar ++ | Types.Tunivar _ + | Types.Tpackage _ + | Types.Tvariant _ -> + [] +Index: ocamldoc/odoc_misc.ml +=================================================================== +--- ocamldoc/odoc_misc.ml (リビジョン 11207) ++++ ocamldoc/odoc_misc.ml (作業コピー) +@@ -478,8 +478,8 @@ + match t with + | Types.Tconstr(path, [ty], _) when Path.same path Predef.path_option -> ty.Types.desc + | Types.Tconstr _ +- | Types.Tvar +- | Types.Tunivar ++ | Types.Tvar _ ++ | Types.Tunivar _ + | Types.Tpoly _ + | Types.Tarrow _ + | Types.Ttuple _ +Index: bytecomp/typeopt.ml +=================================================================== +--- bytecomp/typeopt.ml (リビジョン 11207) ++++ bytecomp/typeopt.ml (作業コピー) +@@ -50,7 +50,7 @@ + + let array_element_kind env ty = + match scrape env ty with +- | Tvar | Tunivar -> ++ | Tvar _ | Tunivar _ -> + Pgenarray + | Tconstr(p, args, abbrev) -> + if Path.same p Predef.path_int || Path.same p Predef.path_char then +Index: bytecomp/translcore.ml +=================================================================== +--- bytecomp/translcore.ml (リビジョン 11207) ++++ bytecomp/translcore.ml (作業コピー) +@@ -780,12 +780,13 @@ + begin match e.exp_type.desc with + (* the following may represent a float/forward/lazy: need a + forward_tag *) +- | Tvar | Tlink _ | Tsubst _ | Tunivar ++ | Tvar _ | Tlink _ | Tsubst _ | Tunivar _ + | Tpoly(_,_) | Tfield(_,_,_,_) -> + Lprim(Pmakeblock(Obj.forward_tag, Immutable), [transl_exp e]) + (* the following cannot be represented as float/forward/lazy: + optimize *) +- | Tarrow(_,_,_,_) | Ttuple _ | Tpackage _ | Tobject(_,_) | Tnil | Tvariant _ ++ | Tarrow(_,_,_,_) | Ttuple _ | Tpackage _ | Tobject(_,_) | Tnil ++ | Tvariant _ + -> transl_exp e + (* optimize predefined types (excepted float) *) + | Tconstr(_,_,_) -> +Index: testsuite/tests/lib-hashtbl/htbl.ml +=================================================================== +--- testsuite/tests/lib-hashtbl/htbl.ml (リビジョン 11207) ++++ testsuite/tests/lib-hashtbl/htbl.ml (作業コピー) +@@ -76,7 +76,7 @@ + struct + type key = M.key + type 'a t = (key, 'a) Hashtbl.t +- let create = Hashtbl.create ++ let create s = Hashtbl.create s + let clear = Hashtbl.clear + let copy = Hashtbl.copy + let add = Hashtbl.add +Index: toplevel/genprintval.ml +=================================================================== +--- toplevel/genprintval.ml (リビジョン 11207) ++++ toplevel/genprintval.ml (作業コピー) +@@ -180,7 +180,7 @@ + find_printer env ty obj + with Not_found -> + match (Ctype.repr ty).desc with +- | Tvar -> ++ | Tvar _ | Tunivar _ -> + Oval_stuff "<poly>" + | Tarrow(_, ty1, ty2, _) -> + Oval_stuff "<fun>" +@@ -327,8 +327,6 @@ + fatal_error "Printval.outval_of_value" + | Tpoly (ty, _) -> + tree_of_val (depth - 1) obj ty +- | Tunivar -> +- Oval_stuff "<poly>" + | Tpackage _ -> + Oval_stuff "<module>" + end +Index: otherlibs/labltk/browser/searchid.ml +=================================================================== +--- otherlibs/labltk/browser/searchid.ml (リビジョン 11207) ++++ otherlibs/labltk/browser/searchid.ml (作業コピー) +@@ -101,7 +101,7 @@ + + let rec equal ~prefix t1 t2 = + match (repr t1).desc, (repr t2).desc with +- Tvar, Tvar -> true ++ Tvar _, Tvar _ -> true + | Tvariant row1, Tvariant row2 -> + let row1 = row_repr row1 and row2 = row_repr row2 in + let fields1 = filter_row_fields false row1.row_fields +@@ -144,7 +144,7 @@ + + let rec included ~prefix t1 t2 = + match (repr t1).desc, (repr t2).desc with +- Tvar, _ -> true ++ Tvar _, _ -> true + | Tvariant row1, Tvariant row2 -> + let row1 = row_repr row1 and row2 = row_repr row2 in + let fields1 = filter_row_fields false row1.row_fields diff --git a/experimental/garrigue/variable-names.ml b/experimental/garrigue/variable-names.ml new file mode 100644 index 00000000..f3c7771a --- /dev/null +++ b/experimental/garrigue/variable-names.ml @@ -0,0 +1,4 @@ +let f (x : < a:int; .. > as 'me1) = (x : < b:bool; .. > as 'me2);; +let f (x : < a:int; .. > as 'me1) = (x : < a:int; b:bool; .. > as 'me2);; +let f (x : [> `A of int] as 'me1) = (x : [> `B of bool] as 'me2);; +let f (x : [> `A of int] as 'me1) = (x : [`A of int | `B of 'me2] as 'me2);; diff --git a/experimental/garrigue/varunion.ml b/experimental/garrigue/varunion.ml new file mode 100644 index 00000000..41dca65f --- /dev/null +++ b/experimental/garrigue/varunion.ml @@ -0,0 +1,435 @@ +(* cvs update -r varunion parsing typing bytecomp toplevel *) + +type t = private [> ];; +type u = private [> ] ~ [t];; +type v = [t | u];; +let f x = (x : t :> v);; + +(* bad *) +module Mix(X: sig type t = private [> ] end) + (Y: sig type t = private [> ] end) = + struct type t = [X.t | Y.t] end;; + +(* bad *) +module Mix(X: sig type t = private [> `A of int ] end) + (Y: sig type t = private [> `A of bool] ~ [X.t] end) = + struct type t = [X.t | Y.t] end;; + +(* ok *) +module Mix(X: sig type t = private [> `A of int ] end) + (Y: sig type t = private [> `A of int] ~ [X.t] end) = + struct type t = [X.t | Y.t] end;; + +(* bad *) +module Mix(X: sig type t = private [> `A of int ] end) + (Y: sig type t = private [> `B of bool] ~ [X.t] end) = + struct type t = [X.t | Y.t] end;; + +type 'a t = private [> `L of 'a] ~ [`L];; + +(* ok *) +module Mix(X: sig type t = private [> `A of int ] ~ [`B] end) + (Y: sig type t = private [> `B of bool] ~ [X.t] end) = + struct type t = [X.t | Y.t] let is_t = function #t -> true | _ -> false end;; + +module Mix(X: sig type t = private [> `A of int ] ~ [`B] end) + (Y: sig type t = private [> `B of bool] ~ [X.t] end) = + struct + type t = [X.t | Y.t] + let which = function #X.t -> `X | #Y.t -> `Y + end;; + +module Mix(I: sig type t = private [> ] ~ [`A;`B] end) + (X: sig type t = private [> I.t | `A of int ] ~ [`B] end) + (Y: sig type t = private [> I.t | `B of bool] ~ [X.t] end) = + struct + type t = [X.t | Y.t] + let which = function #X.t -> `X | #Y.t -> `Y + end;; + +(* ok *) +module M = + Mix(struct type t = [`C of char] end) + (struct type t = [`A of int | `C of char] end) + (struct type t = [`B of bool | `C of char] end);; + +(* bad *) +module M = + Mix(struct type t = [`B of bool] end) + (struct type t = [`A of int | `B of bool] end) + (struct type t = [`B of bool | `C of char] end);; + +(* ok *) +module M1 = struct type t = [`A of int | `C of char] end +module M2 = struct type t = [`B of bool | `C of char] end +module I = struct type t = [`C of char] end +module M = Mix(I)(M1)(M2) ;; + +let c = (`C 'c' : M.t) ;; + +module M(X : sig type t = private [> `A] end) = + struct let f (#X.t as x) = x end;; + +(* code generation *) +type t = private [> `A ] ~ [`B];; +match `B with #t -> 1 | `B -> 2;; + +module M : sig type t = private [> `A of int | `B] ~ [`C] end = + struct type t = [`A of int | `B | `D of bool] end;; +let f = function (`C | #M.t) -> 1+1 ;; +let f = function (`A _ | `B #M.t) -> 1+1 ;; + +(* expression *) +module Mix(X:sig type t = private [> ] val show: t -> string end) + (Y:sig type t = private [> ] ~ [X.t] val show: t -> string end) = + struct + type t = [X.t | Y.t] + let show : t -> string = function + #X.t as x -> X.show x + | #Y.t as y -> Y.show y + end;; + +module EStr = struct + type t = [`Str of string] + let show (`Str s) = s +end +module EInt = struct + type t = [`Int of int] + let show (`Int i) = string_of_int i +end +module M = Mix(EStr)(EInt);; + +module type T = sig type t = private [> ] val show: t -> string end +module Mix(X:T)(Y:T with type t = private [> ] ~ [X.t]) : + T with type t = [X.t | Y.t] = + struct + type t = [X.t | Y.t] + let show = function + #X.t as x -> X.show x + | #Y.t as y -> Y.show y + end;; +module M = Mix(EStr)(EInt);; + +(* deep *) +module M : sig type t = private [> `A] end = struct type t = [`A] end +module M' : sig type t = private [> ] end = struct type t = [M.t | `A] end;; + +(* bad *) +type t = private [> ] +type u = private [> `A of int] ~ [t] ;; + +(* ok *) +type t = private [> `A of int] +type u = private [> `A of int] ~ [t] ;; + +module F(X: sig + type t = private [> ] ~ [`A;`B;`C;`D] + type u = private [> `A|`B|`C] ~ [t; `D] +end) : sig type v = private [< X.t | X.u | `D] end = struct + open X + let f = function #u -> 1 | #t -> 2 | `D -> 3 + let g = function #u|#t|`D -> 2 + type v = [t|u|`D] +end + +(* ok *) +module M = struct type t = private [> `A] end;; +module M' : sig type t = private [> ] ~ [`A] end = M;; + +(* ok *) +module type T = sig type t = private [> ] ~ [`A] end;; +module type T' = T with type t = private [> `A];; + +(* ok *) +type t = private [> ] ~ [`A] +let f = function `A x -> x | #t -> 0 +type t' = private [< `A of int | t];; + +(* should be ok *) +module F(X:sig end) : + sig type t = private [> ] type u = private [> ] ~ [t] end = + struct type t = [ `A] type u = [`B] end +module M = F(String) +let f = function #M.t -> 1 | #M.u -> 2 +let f = function #M.t -> 1 | _ -> 2 +type t = [M.t | M.u] +let f = function #t -> 1 | _ -> 2;; +module G(X : sig type t = private [> ] type u = private [> ] ~ [t] end) = + struct let f = function #X.t -> 1 | _ -> 2 end;; +module M1 = G(struct module N = F(String) type t = N.t type u = N.u end) ;; +module M1 = G(struct type t = M.t type u = M.u end) ;; +(* bad *) +let f = function #F(String).t -> 1 | _ -> 2;; +type t = [F(String).t | M.u] +let f = function #t -> 1 | _ -> 2;; +module N : sig type t = private [> ] end = + struct type t = [F(String).t | M.u] end;; + +(* compatibility improvement *) +type a = [`A of int | `B] +type b = [`A of bool | `B] +type c = private [> ] ~ [a;b] +let f = function #c -> 1 | `A x -> truncate x +type d = private [> ] ~ [a] +let g = function #d -> 1 | `A x -> truncate x;; + + +(* Expression Problem: functorial form *) + +type num = [ `Num of int ] + +module type Exp = sig + type t = private [> num] + val eval : t -> t + val show : t -> string +end + +module Num(X : Exp) = struct + type t = num + let eval (`Num _ as x) : X.t = x + let show (`Num n) = string_of_int n +end + +type 'a add = [ `Add of 'a * 'a ] + +module Add(X : Exp with type t = private [> num | 'a add] as 'a) = struct + type t = X.t add + let show (`Add(e1, e2) : t) = "("^ X.show e1 ^"+"^ X.show e2 ^")" + let eval (`Add(e1, e2) : t) = + let e1 = X.eval e1 and e2 = X.eval e2 in + match e1, e2 with + `Num n1, `Num n2 -> `Num (n1+n2) + | `Num 0, e | e, `Num 0 -> e + | e12 -> `Add e12 +end + +type 'a mul = [`Mul of 'a * 'a] + +module Mul(X : Exp with type t = private [> num | 'a mul] as 'a) = struct + type t = X.t mul + let show (`Mul(e1, e2) : t) = "("^ X.show e1 ^"*"^ X.show e2 ^")" + let eval (`Mul(e1, e2) : t) = + let e1 = X.eval e1 and e2 = X.eval e2 in + match e1, e2 with + `Num n1, `Num n2 -> `Num (n1*n2) + | `Num 0, e | e, `Num 0 -> `Num 0 + | `Num 1, e | e, `Num 1 -> e + | e12 -> `Mul e12 +end + +module Ext(X : sig type t = private [> ] end)(Y : sig type t end) = struct + module type S = + sig + type t = private [> ] ~ [ X.t ] + val eval : t -> Y.t + val show : t -> string + end +end + +module Dummy = struct type t = [`Dummy] end + +module Mix(E : Exp)(E1 : Ext(Dummy)(E).S)(E2 : Ext(E1)(E).S) = + struct + type t = [E1.t | E2.t] + let eval = function + #E1.t as x -> E1.eval x + | #E2.t as x -> E2.eval x + let show = function + #E1.t as x -> E1.show x + | #E2.t as x -> E2.show x + end + +module rec EAdd : (Exp with type t = [num | EAdd.t add]) = + Mix(EAdd)(Num(EAdd))(Add(EAdd)) + +(* A bit heavy: one must pass E to everybody *) +module rec E : Exp with type t = [num | E.t add | E.t mul] = + Mix(E)(Mix(E)(Num(E))(Add(E)))(Mul(E)) + +let e = E.eval (`Add(`Mul(`Num 2,`Num 3),`Num 1)) + +(* Alternatives *) +(* Direct approach, no need of Mix *) +module rec E : (Exp with type t = [num | E.t add | E.t mul]) = + struct + module E1 = Num(E) + module E2 = Add(E) + module E3 = Mul(E) + type t = E.t + let show = function + | #num as x -> E1.show x + | #add as x -> E2.show x + | #mul as x -> E3.show x + let eval = function + | #num as x -> E1.eval x + | #add as x -> E2.eval x + | #mul as x -> E3.eval x + end + +(* Do functor applications in Mix *) +module type T = sig type t = private [> ] end +module type Tnum = sig type t = private [> num] end + +module Ext(E : Tnum) = struct + module type S = functor (Y : Exp with type t = E.t) -> + sig + type t = private [> num] + val eval : t -> Y.t + val show : t -> string + end +end + +module Ext'(E : Tnum)(X : T) = struct + module type S = functor (Y : Exp with type t = E.t) -> + sig + type t = private [> ] ~ [ X.t ] + val eval : t -> Y.t + val show : t -> string + end +end + +module Mix(E : Exp)(F1 : Ext(E).S)(F2 : Ext'(E)(F1(E)).S) = + struct + module E1 = F1(E) + module E2 = F2(E) + type t = [E1.t | E2.t] + let eval = function + #E1.t as x -> E1.eval x + | #E2.t as x -> E2.eval x + let show = function + #E1.t as x -> E1.show x + | #E2.t as x -> E2.show x + end + +module Join(E : Exp)(F1 : Ext(E).S)(F2 : Ext'(E)(F1(E)).S) + (E' : Exp with type t = E.t) = + Mix(E)(F1)(F2) + +module rec EAdd : (Exp with type t = [num | EAdd.t add]) = + Mix(EAdd)(Num)(Add) + +module rec EMul : (Exp with type t = [num | EMul.t mul]) = + Mix(EMul)(Num)(Mul) + +module rec E : (Exp with type t = [num | E.t add | E.t mul]) = + Mix(E)(Join(E)(Num)(Add))(Mul) + +(* Linear extension by the end: not so nice *) +module LExt(X : T) = struct + module type S = + sig + type t + val eval : t -> X.t + val show : t -> string + end +end +module LNum(E: Exp)(X : LExt(E).S with type t = private [> ] ~ [num]) = + struct + type t = [num | X.t] + let show = function + `Num n -> string_of_int n + | #X.t as x -> X.show x + let eval = function + #num as x -> x + | #X.t as x -> X.eval x + end +module LAdd(E : Exp with type t = private [> num | 'a add] as 'a) + (X : LExt(E).S with type t = private [> ] ~ [add]) = + struct + type t = [E.t add | X.t] + let show = function + `Add(e1,e2) -> "("^ E.show e1 ^"+"^ E.show e2 ^")" + | #X.t as x -> X.show x + let eval = function + `Add(e1,e2) -> + let e1 = E.eval e1 and e2 = E.eval e2 in + begin match e1, e2 with + `Num n1, `Num n2 -> `Num (n1+n2) + | `Num 0, e | e, `Num 0 -> e + | e12 -> `Add e12 + end + | #X.t as x -> X.eval x + end +module LEnd = struct + type t = [`Dummy] + let show `Dummy = "" + let eval `Dummy = `Dummy +end +module rec L : Exp with type t = [num | L.t add | `Dummy] = + LAdd(L)(LNum(L)(LEnd)) + +(* Back to first form, but add map *) + +module Num(X : Exp) = struct + type t = num + let map f x = x + let eval1 (`Num _ as x) : X.t = x + let show (`Num n) = string_of_int n +end + +module Add(X : Exp with type t = private [> num | 'a add] as 'a) = struct + type t = X.t add + let show (`Add(e1, e2) : t) = "("^ X.show e1 ^"+"^ X.show e2 ^")" + let map f (`Add(e1, e2) : t) = `Add(f e1, f e2) + let eval1 (`Add(e1, e2) as e : t) = + match e1, e2 with + `Num n1, `Num n2 -> `Num (n1+n2) + | `Num 0, e | e, `Num 0 -> e + | _ -> e +end + +module Mul(X : Exp with type t = private [> num | 'a mul] as 'a) = struct + type t = X.t mul + let show (`Mul(e1, e2) : t) = "("^ X.show e1 ^"*"^ X.show e2 ^")" + let map f (`Mul(e1, e2) : t) = `Mul(f e1, f e2) + let eval1 (`Mul(e1, e2) as e : t) = + match e1, e2 with + `Num n1, `Num n2 -> `Num (n1*n2) + | `Num 0, e | e, `Num 0 -> `Num 0 + | `Num 1, e | e, `Num 1 -> e + | _ -> e +end + +module Ext(X : sig type t = private [> ] end)(Y : sig type t end) = struct + module type S = + sig + type t = private [> ] ~ [ X.t ] + val map : (Y.t -> Y.t) -> t -> t + val eval1 : t -> Y.t + val show : t -> string + end +end + +module Mix(E : Exp)(E1 : Ext(Dummy)(E).S)(E2 : Ext(E1)(E).S) = + struct + type t = [E1.t | E2.t] + let map f = function + #E1.t as x -> (E1.map f x : E1.t :> t) + | #E2.t as x -> (E2.map f x : E2.t :> t) + let eval1 = function + #E1.t as x -> E1.eval1 x + | #E2.t as x -> E2.eval1 x + let show = function + #E1.t as x -> E1.show x + | #E2.t as x -> E2.show x + end + +module type ET = sig + type t + val map : (t -> t) -> t -> t + val eval1 : t -> t + val show : t -> string +end + +module Fin(E : ET) = struct + include E + let rec eval e = eval1 (map eval e) +end + +module rec EAdd : (Exp with type t = [num | EAdd.t add]) = + Fin(Mix(EAdd)(Num(EAdd))(Add(EAdd))) + +module rec E : Exp with type t = [num | E.t add | E.t mul] = + Fin(Mix(E)(Mix(E)(Num(E))(Add(E)))(Mul(E))) + +let e = E.eval (`Add(`Mul(`Num 2,`Num 3),`Num 1)) diff --git a/experimental/garrigue/with-module-type.diff b/experimental/garrigue/with-module-type.diff new file mode 100644 index 00000000..2b99c1f9 --- /dev/null +++ b/experimental/garrigue/with-module-type.diff @@ -0,0 +1,530 @@ +Index: typing/typemod.ml +=================================================================== +--- typing/typemod.ml (revision 13947) ++++ typing/typemod.ml (working copy) +@@ -80,6 +80,9 @@ + Typedtree.module_expr * Types.module_type) ref + = ref (fun env m -> assert false) + ++let transl_modtype_fwd = ++ ref (fun env m -> (assert false : Typedtree.module_type)) ++ + (* Merge one "with" constraint in a signature *) + + let rec add_rec_types env = function +@@ -191,6 +194,21 @@ + merge env (extract_sig env loc mty) namelist None in + (path_concat id path, lid, tcstr), + Sig_module(id, Mty_signature newsg, rs) :: rem ++ | (Sig_modtype(id, mtd) :: rem, [s], Pwith_modtype pmty) ++ when Ident.name id = s -> ++ let mty = !transl_modtype_fwd initial_env pmty in ++ let mtd' = Modtype_manifest mty.mty_type in ++ Includemod.modtype_declarations env id mtd' mtd; ++ (Pident id, lid, Twith_modtype (Tmodtype_manifest mty)), ++ Sig_modtype(id, mtd') :: rem ++ | (Sig_modtype(id, mtd) :: rem, [s], Pwith_modtypesubst pmty) ++ when Ident.name id = s -> ++ let mty = !transl_modtype_fwd initial_env pmty in ++ let mtd' = Modtype_manifest mty.mty_type in ++ Includemod.modtype_declarations env id mtd' mtd; ++ real_id := Some id; ++ (Pident id, lid, Twith_modtypesubst (Tmodtype_manifest mty)), ++ rem + | (item :: rem, _, _) -> + let (cstr, items) = merge (Env.add_item item env) rem namelist row_id + in +@@ -233,6 +251,12 @@ + let (path, _) = Typetexp.find_module initial_env loc lid.txt in + let sub = Subst.add_module id path Subst.identity in + Subst.signature sub sg ++ | [s], Pwith_modtypesubst pmty -> ++ let id = ++ match !real_id with None -> assert false | Some id -> id in ++ let mty = !transl_modtype_fwd initial_env pmty in ++ let sub = Subst.add_modtype id mty.mty_type Subst.identity in ++ Subst.signature sub sg + | _ -> + sg + in +@@ -649,6 +673,8 @@ + check_recmod_typedecls env2 sdecls dcl2; + (dcl2, env2) + ++let () = transl_modtype_fwd := transl_modtype ++ + (* Try to convert a module expression to a module path. *) + + exception Not_a_path +Index: typing/typedtreeMap.ml +=================================================================== +--- typing/typedtreeMap.ml (revision 13947) ++++ typing/typedtreeMap.ml (working copy) +@@ -457,6 +457,9 @@ + | Twith_typesubst decl -> Twith_typesubst (map_type_declaration decl) + | Twith_module (path, lid) -> cstr + | Twith_modsubst (path, lid) -> cstr ++ | Twith_modtype decl -> Twith_modtype (map_modtype_declaration decl) ++ | Twith_modtypesubst decl -> ++ Twith_modtypesubst (map_modtype_declaration decl) + in + Map.leave_with_constraint cstr + +Index: typing/typedtree.ml +=================================================================== +--- typing/typedtree.ml (revision 13947) ++++ typing/typedtree.ml (working copy) +@@ -255,6 +255,8 @@ + | Twith_module of Path.t * Longident.t loc + | Twith_typesubst of type_declaration + | Twith_modsubst of Path.t * Longident.t loc ++ | Twith_modtype of modtype_declaration ++ | Twith_modtypesubst of modtype_declaration + + and core_type = + (* mutable because of [Typeclass.declare_method] *) +Index: typing/typedtree.mli +=================================================================== +--- typing/typedtree.mli (revision 13947) ++++ typing/typedtree.mli (working copy) +@@ -254,6 +254,8 @@ + | Twith_module of Path.t * Longident.t loc + | Twith_typesubst of type_declaration + | Twith_modsubst of Path.t * Longident.t loc ++ | Twith_modtype of modtype_declaration ++ | Twith_modtypesubst of modtype_declaration + + and core_type = + (* mutable because of [Typeclass.declare_method] *) +Index: typing/includemod.ml +=================================================================== +--- typing/includemod.ml (revision 13947) ++++ typing/includemod.ml (working copy) +@@ -346,10 +346,10 @@ + + (* Hide the context and substitution parameters to the outside world *) + +-let modtypes env mty1 mty2 = modtypes env [] Subst.identity mty1 mty2 +-let signatures env sig1 sig2 = signatures env [] Subst.identity sig1 sig2 +-let type_declarations env id decl1 decl2 = +- type_declarations env [] Subst.identity id decl1 decl2 ++let modtypes env = modtypes env [] Subst.identity ++let signatures env = signatures env [] Subst.identity ++let type_declarations env = type_declarations env [] Subst.identity ++let modtype_declarations env = modtype_infos env [] Subst.identity + + (* Error report *) + +Index: typing/typedtreeIter.ml +=================================================================== +--- typing/typedtreeIter.ml (revision 13947) ++++ typing/typedtreeIter.ml (working copy) +@@ -408,6 +408,8 @@ + | Twith_module _ -> () + | Twith_typesubst decl -> iter_type_declaration decl + | Twith_modsubst _ -> () ++ | Twith_modtype decl -> iter_modtype_declaration decl ++ | Twith_modtypesubst decl -> iter_modtype_declaration decl + end; + Iter.leave_with_constraint cstr; + +Index: typing/includemod.mli +=================================================================== +--- typing/includemod.mli (revision 13947) ++++ typing/includemod.mli (working copy) +@@ -21,6 +21,8 @@ + val compunit: string -> signature -> string -> signature -> module_coercion + val type_declarations: + Env.t -> Ident.t -> type_declaration -> type_declaration -> unit ++val modtype_declarations: ++ Env.t -> Ident.t -> modtype_declaration -> modtype_declaration -> unit + + type symptom = + Missing_field of Ident.t +Index: typing/printtyped.ml +=================================================================== +--- typing/printtyped.ml (revision 13947) ++++ typing/printtyped.ml (working copy) +@@ -608,6 +608,12 @@ + type_declaration (i+1) ppf td; + | Twith_module (li,_) -> line i ppf "Pwith_module %a\n" fmt_path li; + | Twith_modsubst (li,_) -> line i ppf "Pwith_modsubst %a\n" fmt_path li; ++ | Twith_modtype (td) -> ++ line i ppf "Pwith_modtype\n"; ++ modtype_declaration (i+1) ppf td; ++ | Twith_modtypesubst (td) -> ++ line i ppf "Pwith_modtypesubst\n"; ++ modtype_declaration (i+1) ppf td; + + and module_expr i ppf x = + line i ppf "module_expr %a\n" fmt_location x.mod_loc; +Index: experimental/garrigue/with-module-type.diffs +=================================================================== +--- experimental/garrigue/with-module-type.diffs (revision 13947) ++++ experimental/garrigue/with-module-type.diffs (working copy) +@@ -1,95 +1,53 @@ +-Index: parsing/parser.mly +-=================================================================== +---- parsing/parser.mly (revision 12005) +-+++ parsing/parser.mly (working copy) +-@@ -1504,6 +1504,10 @@ +- { ($2, Pwith_module $4) } +- | MODULE mod_longident COLONEQUAL mod_ext_longident +- { ($2, Pwith_modsubst $4) } +-+ | MODULE TYPE mod_longident EQUAL module_type +-+ { ($3, Pwith_modtype $5) } +-+ | MODULE TYPE mod_longident COLONEQUAL module_type +-+ { ($3, Pwith_modtypesubst $5) } +- ; +- with_type_binder: +- EQUAL { Public } +-Index: parsing/parsetree.mli +-=================================================================== +---- parsing/parsetree.mli (revision 12005) +-+++ parsing/parsetree.mli (working copy) +-@@ -239,6 +239,8 @@ +- | Pwith_module of Longident.t +- | Pwith_typesubst of type_declaration +- | Pwith_modsubst of Longident.t +-+ | Pwith_modtype of module_type +-+ | Pwith_modtypesubst of module_type +- +- (* Value expressions for the module language *) +- +-Index: parsing/printast.ml +-=================================================================== +---- parsing/printast.ml (revision 12005) +-+++ parsing/printast.ml (working copy) +-@@ -575,6 +575,12 @@ +- type_declaration (i+1) ppf td; +- | Pwith_module (li) -> line i ppf "Pwith_module %a\n" fmt_longident li; +- | Pwith_modsubst (li) -> line i ppf "Pwith_modsubst %a\n" fmt_longident li; +-+ | Pwith_modtype (mty) -> +-+ line i ppf "Pwith_modtype\n"; +-+ module_type (i+1) ppf mty; +-+ | Pwith_modtypesubst (mty) -> +-+ line i ppf "Pwith_modtype\n"; +-+ module_type (i+1) ppf mty; +- +- and module_expr i ppf x = +- line i ppf "module_expr %a\n" fmt_location x.pmod_loc; + Index: typing/typemod.ml + =================================================================== +---- typing/typemod.ml (revision 12005) ++--- typing/typemod.ml (revision 13947) + +++ typing/typemod.ml (working copy) +-@@ -74,6 +74,8 @@ +- : (Env.t -> Parsetree.module_expr -> module_type) ref ++@@ -80,6 +80,9 @@ ++ Typedtree.module_expr * Types.module_type) ref + = ref (fun env m -> assert false) + +-+let transl_modtype_fwd = ref (fun env m -> assert false) +++let transl_modtype_fwd = +++ ref (fun env m -> (assert false : Typedtree.module_type)) + + + (* Merge one "with" constraint in a signature *) + + let rec add_rec_types env = function +-@@ -163,6 +165,19 @@ +- ignore(Includemod.modtypes env newmty mty); +- real_id := Some id; +- make_next_first rs rem +-+ | (Tsig_modtype(id, mtd) :: rem, [s], Pwith_modtype pmty) ++@@ -191,6 +194,21 @@ ++ merge env (extract_sig env loc mty) namelist None in ++ (path_concat id path, lid, tcstr), ++ Sig_module(id, Mty_signature newsg, rs) :: rem +++ | (Sig_modtype(id, mtd) :: rem, [s], Pwith_modtype pmty) + + when Ident.name id = s -> + + let mty = !transl_modtype_fwd initial_env pmty in +-+ let mtd' = Tmodtype_manifest mty in +++ let mtd' = Modtype_manifest mty.mty_type in + + Includemod.modtype_declarations env id mtd' mtd; +-+ Tsig_modtype(id, mtd') :: rem +-+ | (Tsig_modtype(id, mtd) :: rem, [s], Pwith_modtypesubst pmty) +++ (Pident id, lid, Twith_modtype (Tmodtype_manifest mty)), +++ Sig_modtype(id, mtd') :: rem +++ | (Sig_modtype(id, mtd) :: rem, [s], Pwith_modtypesubst pmty) + + when Ident.name id = s -> + + let mty = !transl_modtype_fwd initial_env pmty in +-+ let mtd' = Tmodtype_manifest mty in +++ let mtd' = Modtype_manifest mty.mty_type in + + Includemod.modtype_declarations env id mtd' mtd; + + real_id := Some id; +++ (Pident id, lid, Twith_modtypesubst (Tmodtype_manifest mty)), + + rem +- | (Tsig_module(id, mty, rs) :: rem, s :: namelist, _) +- when Ident.name id = s -> +- let newsg = merge env (extract_sig env loc mty) namelist None in +-@@ -200,6 +215,12 @@ +- let (path, _) = Typetexp.find_module initial_env loc lid in ++ | (item :: rem, _, _) -> ++ let (cstr, items) = merge (Env.add_item item env) rem namelist row_id ++ in ++@@ -233,6 +251,12 @@ ++ let (path, _) = Typetexp.find_module initial_env loc lid.txt in + let sub = Subst.add_module id path Subst.identity in + Subst.signature sub sg + + | [s], Pwith_modtypesubst pmty -> + + let id = + + match !real_id with None -> assert false | Some id -> id in + + let mty = !transl_modtype_fwd initial_env pmty in +-+ let sub = Subst.add_modtype id mty Subst.identity in +++ let sub = Subst.add_modtype id mty.mty_type Subst.identity in + + Subst.signature sub sg + | _ -> +- sg +- with Includemod.Error explanation -> +-@@ -499,6 +520,8 @@ ++ sg ++ in ++@@ -649,6 +673,8 @@ + check_recmod_typedecls env2 sdecls dcl2; + (dcl2, env2) + +@@ -98,11 +56,51 @@ + (* Try to convert a module expression to a module path. *) + + exception Not_a_path ++Index: typing/typedtreeMap.ml ++=================================================================== ++--- typing/typedtreeMap.ml (revision 13947) +++++ typing/typedtreeMap.ml (working copy) ++@@ -457,6 +457,9 @@ ++ | Twith_typesubst decl -> Twith_typesubst (map_type_declaration decl) ++ | Twith_module (path, lid) -> cstr ++ | Twith_modsubst (path, lid) -> cstr +++ | Twith_modtype decl -> Twith_modtype (map_modtype_declaration decl) +++ | Twith_modtypesubst decl -> +++ Twith_modtypesubst (map_modtype_declaration decl) ++ in ++ Map.leave_with_constraint cstr ++ ++Index: typing/typedtree.ml ++=================================================================== ++--- typing/typedtree.ml (revision 13947) +++++ typing/typedtree.ml (working copy) ++@@ -255,6 +255,8 @@ ++ | Twith_module of Path.t * Longident.t loc ++ | Twith_typesubst of type_declaration ++ | Twith_modsubst of Path.t * Longident.t loc +++ | Twith_modtype of modtype_declaration +++ | Twith_modtypesubst of modtype_declaration ++ ++ and core_type = ++ (* mutable because of [Typeclass.declare_method] *) ++Index: typing/typedtree.mli ++=================================================================== ++--- typing/typedtree.mli (revision 13947) +++++ typing/typedtree.mli (working copy) ++@@ -254,6 +254,8 @@ ++ | Twith_module of Path.t * Longident.t loc ++ | Twith_typesubst of type_declaration ++ | Twith_modsubst of Path.t * Longident.t loc +++ | Twith_modtype of modtype_declaration +++ | Twith_modtypesubst of modtype_declaration ++ ++ and core_type = ++ (* mutable because of [Typeclass.declare_method] *) + Index: typing/includemod.ml + =================================================================== +---- typing/includemod.ml (revision 12005) ++--- typing/includemod.ml (revision 13947) + +++ typing/includemod.ml (working copy) +-@@ -326,10 +326,10 @@ ++@@ -346,10 +346,10 @@ + + (* Hide the context and substitution parameters to the outside world *) + +@@ -117,11 +115,24 @@ + + (* Error report *) + ++Index: typing/typedtreeIter.ml ++=================================================================== ++--- typing/typedtreeIter.ml (revision 13947) +++++ typing/typedtreeIter.ml (working copy) ++@@ -408,6 +408,8 @@ ++ | Twith_module _ -> () ++ | Twith_typesubst decl -> iter_type_declaration decl ++ | Twith_modsubst _ -> () +++ | Twith_modtype decl -> iter_modtype_declaration decl +++ | Twith_modtypesubst decl -> iter_modtype_declaration decl ++ end; ++ Iter.leave_with_constraint cstr; ++ + Index: typing/includemod.mli + =================================================================== +---- typing/includemod.mli (revision 12005) ++--- typing/includemod.mli (revision 13947) + +++ typing/includemod.mli (working copy) +-@@ -23,6 +23,8 @@ ++@@ -21,6 +21,8 @@ + val compunit: string -> signature -> string -> signature -> module_coercion + val type_declarations: + Env.t -> Ident.t -> type_declaration -> type_declaration -> unit +@@ -130,53 +141,20 @@ + + type symptom = + Missing_field of Ident.t +-Index: testsuite/tests/typing-modules/Test.ml.reference ++Index: typing/printtyped.ml + =================================================================== +---- testsuite/tests/typing-modules/Test.ml.reference (revision 12005) +-+++ testsuite/tests/typing-modules/Test.ml.reference (working copy) +-@@ -6,4 +6,12 @@ +- # type -'a t +- class type c = object method m : [ `A ] t end +- # module M : sig val v : (#c as 'a) -> 'a end +-+# module type S = sig module type T module F : functor (X : T) -> T end +-+# module type T0 = sig type t end +-+# module type S1 = sig module type T = T0 module F : functor (X : T) -> T end +-+# module type S2 = sig module F : functor (X : T0) -> T0 end +-+# module type S3 = +-+ sig +-+ module F : functor (X : sig type t = int end) -> sig type t = int end +-+ end +- # +-Index: testsuite/tests/typing-modules/Test.ml.principal.reference +-=================================================================== +---- testsuite/tests/typing-modules/Test.ml.principal.reference (revision 12005) +-+++ testsuite/tests/typing-modules/Test.ml.principal.reference (working copy) +-@@ -6,4 +6,12 @@ +- # type -'a t +- class type c = object method m : [ `A ] t end +- # module M : sig val v : (#c as 'a) -> 'a end +-+# module type S = sig module type T module F : functor (X : T) -> T end +-+# module type T0 = sig type t end +-+# module type S1 = sig module type T = T0 module F : functor (X : T) -> T end +-+# module type S2 = sig module F : functor (X : T0) -> T0 end +-+# module type S3 = +-+ sig +-+ module F : functor (X : sig type t = int end) -> sig type t = int end +-+ end +- # +-Index: testsuite/tests/typing-modules/Test.ml +-=================================================================== +---- testsuite/tests/typing-modules/Test.ml (revision 12005) +-+++ testsuite/tests/typing-modules/Test.ml (working copy) +-@@ -9,3 +9,11 @@ +- class type c = object method m : [ `A ] t end;; +- module M : sig val v : (#c as 'a) -> 'a end = +- struct let v x = ignore (x :> c); x end;; +-+ +-+(* with module type *) +-+ +-+module type S = sig module type T module F(X:T) : T end;; +-+module type T0 = sig type t end;; +-+module type S1 = S with module type T = T0;; +-+module type S2 = S with module type T := T0;; +-+module type S3 = S with module type T := sig type t = int end;; ++--- typing/printtyped.ml (revision 13947) +++++ typing/printtyped.ml (working copy) ++@@ -608,6 +608,12 @@ ++ type_declaration (i+1) ppf td; ++ | Twith_module (li,_) -> line i ppf "Pwith_module %a\n" fmt_path li; ++ | Twith_modsubst (li,_) -> line i ppf "Pwith_modsubst %a\n" fmt_path li; +++ | Twith_modtype (td) -> +++ line i ppf "Pwith_modtype\n"; +++ modtype_declaration (i+1) ppf td; +++ | Twith_modtypesubst (td) -> +++ line i ppf "Pwith_modtypesubst\n"; +++ modtype_declaration (i+1) ppf td; ++ ++ and module_expr i ppf x = ++ line i ppf "module_expr %a\n" fmt_location x.mod_loc; +Index: parsing/pprintast.ml +=================================================================== +--- parsing/pprintast.ml (revision 13947) ++++ parsing/pprintast.ml (working copy) +@@ -847,18 +847,28 @@ + (self#list self#type_var_option ~sep:"," ~first:"(" ~last:")") + ls self#longident_loc li self#type_declaration td + | Pwith_module (li2) -> +- pp f "module %a =@ %a" self#longident_loc li self#longident_loc li2; ++ pp f "module %a =@ %a" ++ self#longident_loc li self#longident_loc li2 + | Pwith_typesubst ({ptype_params=ls;_} as td) -> + pp f "type@ %a %a :=@ %a" + (self#list self#type_var_option ~sep:"," ~first:"(" ~last:")") + ls self#longident_loc li + self#type_declaration td + | Pwith_modsubst (li2) -> +- pp f "module %a :=@ %a" self#longident_loc li self#longident_loc li2 in ++ pp f "module %a :=@ %a" ++ self#longident_loc li self#longident_loc li2 ++ | Pwith_modtype mty -> ++ pp f "module type %a =@ %a" ++ self#longident_loc li self#module_type mty ++ | Pwith_modtypesubst mty -> ++ pp f "module type %a :=@ %a" ++ self#longident_loc li self#module_type mty ++ in + (match l with + | [] -> pp f "@[<hov2>%a@]" self#module_type mt + | _ -> pp f "@[<hov2>(%a@ with@ %a)@]" +- self#module_type mt (self#list longident_x_with_constraint ~sep:"@ and@ ") l ) ++ self#module_type mt ++ (self#list longident_x_with_constraint ~sep:"@ and@ ") l ) + | Pmty_typeof me -> + pp f "@[<hov2>module@ type@ of@ %a@]" + self#module_expr me +Index: parsing/parser.mly +=================================================================== +--- parsing/parser.mly (revision 13947) ++++ parsing/parser.mly (working copy) +@@ -1506,6 +1506,10 @@ + { (mkrhs $2 2, Pwith_module (mkrhs $4 4)) } + | MODULE UIDENT COLONEQUAL mod_ext_longident + { (mkrhs (Lident $2) 2, Pwith_modsubst (mkrhs $4 4)) } ++ | MODULE TYPE mty_longident EQUAL module_type ++ { (mkrhs $3 3, Pwith_modtype $5) } ++ | MODULE TYPE ident COLONEQUAL module_type ++ { (mkrhs (Lident $3) 3, Pwith_modtypesubst $5) } + ; + with_type_binder: + EQUAL { Public } +Index: parsing/ast_mapper.ml +=================================================================== +--- parsing/ast_mapper.ml (revision 13947) ++++ parsing/ast_mapper.ml (working copy) +@@ -164,6 +164,8 @@ + | Pwith_module s -> Pwith_module (map_loc sub s) + | Pwith_typesubst d -> Pwith_typesubst (sub # type_declaration d) + | Pwith_modsubst s -> Pwith_modsubst (map_loc sub s) ++ | Pwith_modtype m -> Pwith_modtype (sub # module_type m) ++ | Pwith_modtypesubst m -> Pwith_modtypesubst (sub # module_type m) + + let mk_item ?(loc = Location.none) x = {psig_desc = x; psig_loc = loc} + +Index: parsing/parsetree.mli +=================================================================== +--- parsing/parsetree.mli (revision 13947) ++++ parsing/parsetree.mli (working copy) +@@ -256,6 +256,8 @@ + | Pwith_module of Longident.t loc + | Pwith_typesubst of type_declaration + | Pwith_modsubst of Longident.t loc ++ | Pwith_modtype of module_type ++ | Pwith_modtypesubst of module_type + + (* Value expressions for the module language *) + +Index: parsing/printast.ml +=================================================================== +--- parsing/printast.ml (revision 13947) ++++ parsing/printast.ml (working copy) +@@ -590,6 +590,12 @@ + type_declaration (i+1) ppf td; + | Pwith_module li -> line i ppf "Pwith_module %a\n" fmt_longident_loc li; + | Pwith_modsubst li -> line i ppf "Pwith_modsubst %a\n" fmt_longident_loc li; ++ | Pwith_modtype (mty) -> ++ line i ppf "Pwith_modtype\n"; ++ module_type (i+1) ppf mty; ++ | Pwith_modtypesubst (mty) -> ++ line i ppf "Pwith_modtype\n"; ++ module_type (i+1) ppf mty; + + and module_expr i ppf x = + line i ppf "module_expr %a\n" fmt_location x.pmod_loc; diff --git a/lex/.depend b/lex/.depend index 455421e7..10f90c22 100644 --- a/lex/.depend +++ b/lex/.depend @@ -3,8 +3,8 @@ compact.cmi : lexgen.cmi cset.cmi : lexer.cmi : parser.cmi lexgen.cmi : syntax.cmi -output.cmi : syntax.cmi lexgen.cmi compact.cmi common.cmi outputbis.cmi : syntax.cmi lexgen.cmi common.cmi +output.cmi : syntax.cmi lexgen.cmi compact.cmi common.cmi parser.cmi : syntax.cmi syntax.cmi : cset.cmi table.cmi : @@ -22,10 +22,10 @@ main.cmo : syntax.cmi parser.cmi outputbis.cmi output.cmi lexgen.cmi \ lexer.cmi cset.cmi compact.cmi common.cmi main.cmx : syntax.cmx parser.cmx outputbis.cmx output.cmx lexgen.cmx \ lexer.cmx cset.cmx compact.cmx common.cmx -output.cmo : lexgen.cmi compact.cmi common.cmi output.cmi -output.cmx : lexgen.cmx compact.cmx common.cmx output.cmi outputbis.cmo : lexgen.cmi common.cmi outputbis.cmi outputbis.cmx : lexgen.cmx common.cmx outputbis.cmi +output.cmo : lexgen.cmi compact.cmi common.cmi output.cmi +output.cmx : lexgen.cmx compact.cmx common.cmx output.cmi parser.cmo : syntax.cmi cset.cmi parser.cmi parser.cmx : syntax.cmx cset.cmx parser.cmi syntax.cmo : cset.cmi syntax.cmi diff --git a/lex/Makefile b/lex/Makefile index cb5df8b4..3691cb2b 100644 --- a/lex/Makefile +++ b/lex/Makefile @@ -11,13 +11,17 @@ ######################################################################### # The lexer generator -CAMLC=../boot/ocamlrun ../boot/ocamlc -strict-sequence -nostdlib -I ../boot -CAMLOPT=../boot/ocamlrun ../ocamlopt -nostdlib -I ../stdlib +include ../config/Makefile +CAMLRUN ?= ../boot/ocamlrun +CAMLYACC ?= ../boot/ocamlyacc + +CAMLC=$(CAMLRUN) ../boot/ocamlc -strict-sequence -nostdlib -I ../boot +CAMLOPT=$(CAMLRUN) ../ocamlopt -nostdlib -I ../stdlib COMPFLAGS=-w +33..39 -warn-error A -bin-annot -safe-string -CAMLYACC=../boot/ocamlyacc +LINKFLAGS= YACCFLAGS=-v -CAMLLEX=../boot/ocamlrun ../boot/ocamllex -CAMLDEP=../boot/ocamlrun ../tools/ocamldep +CAMLLEX=$(CAMLRUN) ../boot/ocamllex +CAMLDEP=$(CAMLRUN) ../tools/ocamldep OBJS=cset.cmo syntax.cmo parser.cmo lexer.cmo table.cmo lexgen.cmo \ diff --git a/lex/Makefile.nt b/lex/Makefile.nt index 38c71f2e..6bd85604 100644 --- a/lex/Makefile.nt +++ b/lex/Makefile.nt @@ -13,15 +13,16 @@ # The lexer generator include ../config/Makefile +CAMLRUN ?= ../boot/ocamlrun +CAMLYACC ?= ../boot/ocamlyacc -CAMLC=../boot/ocamlrun ../boot/ocamlc -I ../boot -CAMLOPT=../boot/ocamlrun ../ocamlopt -I ../stdlib +CAMLC=$(CAMLRUN) ../boot/ocamlc -I ../boot +CAMLOPT=$(CAMLRUN) ../ocamlopt -I ../stdlib COMPFLAGS=-warn-error A LINKFLAGS= -CAMLYACC=../boot/ocamlyacc YACCFLAGS=-v -CAMLLEX=../boot/ocamlrun ../boot/ocamllex -CAMLDEP=../boot/ocamlrun ../tools/ocamldep +CAMLLEX=$(CAMLRUN) ../boot/ocamllex +CAMLDEP=$(CAMLRUN) ../tools/ocamldep DEPFLAGS= OBJS=cset.cmo syntax.cmo parser.cmo lexer.cmo table.cmo lexgen.cmo \ diff --git a/man/ocaml.m b/man/ocaml.m index 79f81df0..5c839ea6 100644 --- a/man/ocaml.m +++ b/man/ocaml.m @@ -81,9 +81,9 @@ If the given directory starts with .BR + , it is taken relative to the standard library directory. For instance, -.B \-I\ +camlp4 +.B \-I\ +compiler-libs adds the subdirectory -.B camlp4 +.B compiler-libs of the standard library to the search path. .IP Directories can also be added to the search path once the toplevel diff --git a/man/ocamlc.m b/man/ocamlc.m index 090f1c68..adb28092 100644 --- a/man/ocamlc.m +++ b/man/ocamlc.m @@ -191,8 +191,12 @@ linking with this library automatically adds back the options as if they had been provided on the command line, unless the .B -noautolink -option is given. -.TP +option is given. Additionally, a substring +.B $CAMLORIGIN +inside a +.BR \ \-ccopt +options will be replaced by the full path to the .cma library, +excluding the filename. .B \-absname Show absolute filenames in error messages. .TP @@ -350,9 +354,9 @@ If the given directory starts with .BR + , it is taken relative to the standard library directory. For instance, -.B \-I\ +camlp4 +.B \-I\ +compiler-libs adds the subdirectory -.B camlp4 +.B compiler-libs of the standard library to the search path. .TP .BI \-impl \ filename @@ -370,6 +374,9 @@ Recognize file names ending with .I string as interface files (instead of the default .mli). .TP +.B \-keep-docs +Keep documentation strings in generated .cmi files. +.TP .B \-keep-locs Keep locations in generated .cmi files. .TP @@ -745,7 +752,7 @@ have type \ \ Non-returning statement. 22 -\ \ Camlp4 warning. +\ \ Preprocessor warning. 23 \ \ Useless record @@ -825,6 +832,21 @@ mutually recursive types. 45 \ \ Open statement shadows an already defined label or constructor. +46 +\ \ Error in environment variable. + +47 +\ \ Illegal attribute payload. + +48 +\ \ Implicit elimination of optional arguments. + +49 +\ \ Missing cmi file when looking up module alias. + +50 +\ \ Unexpected documentation comment. + The letters stand for the following sets of warnings. Any letter not mentioned here corresponds to the empty set. @@ -878,7 +900,7 @@ mentioned here corresponds to the empty set. .IP The default setting is -.BR \-w\ +a\-4\-6\-7\-9\-27\-29\-32..39\-41..42\-44\-45 . +.BR \-w\ +a\-4\-6\-7\-9\-27\-29\-32..39\-41\-42\-44\-45\-48\-50 . Note that warnings .BR 5 \ and \ 10 are not always triggered, depending on the internals of the type checker. @@ -907,7 +929,8 @@ compiling your program with later versions of OCaml when they add new warnings or modify existing warnings. The default setting is -.B \-warn\-error\ -a (all warnings are non-fatal). +.B \-warn\-error \-a +(all warnings are non-fatal). .TP .B \-warn\-help Show the description of all available warning numbers. diff --git a/man/ocamlopt.m b/man/ocamlopt.m index fb20ca99..a541e598 100644 --- a/man/ocamlopt.m +++ b/man/ocamlopt.m @@ -153,7 +153,12 @@ linking with this library automatically adds back the options as if they had been provided on the command line, unless the .B \-noautolink -option is given. +option is given. Additionally, a substring +.B $CAMLORIGIN +inside a +.BR \ \-ccopt +options will be replaced by the full path to the .cma library, +excluding the filename. .TP .B \-absname Show absolute filenames in error messages. @@ -260,9 +265,9 @@ If the given directory starts with .BR + , it is taken relative to the standard library directory. For instance, -.B \-I\ +camlp4 +.B \-I\ +compiler-libs adds the subdirectory -.B camlp4 +.B compiler-libs of the standard library to the search path. .TP .BI \-impl \ filename @@ -299,6 +304,9 @@ Recognize file names ending with as interface files (instead of the default .mli). .TP .B \-keep-locs +Keep documentation strings in generated .cmi files. +.TP +.B \-keep-locs Keep locations in generated .cmi files. .TP .B \-labels @@ -595,7 +603,8 @@ compiling your program with later versions of OCaml when they add new warnings or modify existing warnings. The default setting is -.B \-warn\-error\ -a (all warnings are non-fatal). +.B \-warn\-error \-a +(all warnings are non-fatal). .TP .B \-warn\-help Show the description of all available warning numbers. diff --git a/man/ocamlrun.m b/man/ocamlrun.m index ea467ea4..810f5258 100644 --- a/man/ocamlrun.m +++ b/man/ocamlrun.m @@ -193,6 +193,9 @@ Calling of finalisation functions. Startup messages (loading the bytecode executable file, resolving shared libraries). +.BR 0x200 +Computation of compaction-triggering condition. + The multiplier is .BR k , .BR M ,\ or diff --git a/ocamlbuild/.depend b/ocamlbuild/.depend index 3b67d873..d6dda722 100644 --- a/ocamlbuild/.depend +++ b/ocamlbuild/.depend @@ -8,9 +8,9 @@ exit_codes.cmi : fda.cmi : slurp.cmi findlib.cmi : signatures.cmi command.cmi flags.cmi : tags.cmi command.cmi -glob.cmi : signatures.cmi glob_ast.cmi bool.cmi glob_ast.cmi : bool.cmi glob_lexer.cmi : glob_ast.cmi +glob.cmi : signatures.cmi glob_ast.cmi bool.cmi hooks.cmi : hygiene.cmi : slurp.cmi lexers.cmi : loc.cmi glob.cmi @@ -20,17 +20,17 @@ main.cmi : my_std.cmi : signatures.cmi my_unix.cmi : ocaml_arch.cmi : signatures.cmi command.cmi +ocamlbuild_executor.cmi : +ocamlbuildlight.cmi : +ocamlbuild.cmi : +ocamlbuild_plugin.cmi : +ocamlbuild_unix_plugin.cmi : +ocamlbuild_where.cmi : ocaml_compiler.cmi : tags.cmi rule.cmi pathname.cmi command.cmi ocaml_dependencies.cmi : pathname.cmi ocaml_specific.cmi : ocaml_tools.cmi : tags.cmi rule.cmi pathname.cmi command.cmi ocaml_utils.cmi : tags.cmi pathname.cmi command.cmi -ocamlbuild.cmi : -ocamlbuild_executor.cmi : -ocamlbuild_plugin.cmi : -ocamlbuild_unix_plugin.cmi : -ocamlbuild_where.cmi : -ocamlbuildlight.cmi : options.cmi : slurp.cmi signatures.cmi command.cmi param_tags.cmi : tags.cmi loc.cmi pathname.cmi : signatures.cmi @@ -75,12 +75,12 @@ findlib.cmx : my_unix.cmx my_std.cmx lexers.cmx const.cmx command.cmx \ findlib.cmi flags.cmo : tags.cmi param_tags.cmi log.cmi command.cmi bool.cmi flags.cmi flags.cmx : tags.cmx param_tags.cmx log.cmx command.cmx bool.cmx flags.cmi -glob.cmo : my_std.cmi glob_lexer.cmi glob_ast.cmi bool.cmi glob.cmi -glob.cmx : my_std.cmx glob_lexer.cmx glob_ast.cmx bool.cmx glob.cmi glob_ast.cmo : bool.cmi glob_ast.cmi glob_ast.cmx : bool.cmx glob_ast.cmi glob_lexer.cmo : glob_ast.cmi bool.cmi glob_lexer.cmi glob_lexer.cmx : glob_ast.cmx bool.cmx glob_lexer.cmi +glob.cmo : my_std.cmi glob_lexer.cmi glob_ast.cmi bool.cmi glob.cmi +glob.cmx : my_std.cmx glob_lexer.cmx glob_ast.cmx bool.cmx glob.cmi hooks.cmo : hooks.cmi hooks.cmx : hooks.cmi hygiene.cmo : slurp.cmi shell.cmi pathname.cmi options.cmi my_std.cmi \ @@ -111,6 +111,22 @@ my_unix.cmo : my_std.cmi my_unix.cmi my_unix.cmx : my_std.cmx my_unix.cmi ocaml_arch.cmo : pathname.cmi my_std.cmi command.cmi ocaml_arch.cmi ocaml_arch.cmx : pathname.cmx my_std.cmx command.cmx ocaml_arch.cmi +ocamlbuild_config.cmo : +ocamlbuild_config.cmx : +ocamlbuild_executor.cmo : ocamlbuild_executor.cmi +ocamlbuild_executor.cmx : ocamlbuild_executor.cmi +ocamlbuildlight.cmo : ocamlbuildlight.cmi +ocamlbuildlight.cmx : ocamlbuildlight.cmi +ocamlbuild.cmo : ocamlbuild_unix_plugin.cmi ocamlbuild.cmi +ocamlbuild.cmx : ocamlbuild_unix_plugin.cmx ocamlbuild.cmi +ocamlbuild_plugin.cmo : ocamlbuild_plugin.cmi +ocamlbuild_plugin.cmx : ocamlbuild_plugin.cmi +ocamlbuild_unix_plugin.cmo : ocamlbuild_executor.cmi my_unix.cmi my_std.cmi \ + exit_codes.cmi ocamlbuild_unix_plugin.cmi +ocamlbuild_unix_plugin.cmx : ocamlbuild_executor.cmx my_unix.cmx my_std.cmx \ + exit_codes.cmx ocamlbuild_unix_plugin.cmi +ocamlbuild_where.cmo : ocamlbuild_config.cmo ocamlbuild_where.cmi +ocamlbuild_where.cmx : ocamlbuild_config.cmx ocamlbuild_where.cmi ocaml_compiler.cmo : tools.cmi tags.cmi rule.cmi resource.cmi pathname.cmi \ options.cmi ocaml_utils.cmi ocaml_dependencies.cmi ocaml_arch.cmi \ my_std.cmi log.cmi command.cmi ocaml_compiler.cmi @@ -141,22 +157,6 @@ ocaml_utils.cmo : tools.cmi tags.cmi pathname.cmi param_tags.cmi options.cmi \ ocaml_utils.cmx : tools.cmx tags.cmx pathname.cmx param_tags.cmx options.cmx \ my_std.cmx log.cmx lexers.cmx flags.cmx const.cmx command.cmx \ ocaml_utils.cmi -ocamlbuild.cmo : ocamlbuild_unix_plugin.cmi ocamlbuild.cmi -ocamlbuild.cmx : ocamlbuild_unix_plugin.cmx ocamlbuild.cmi -ocamlbuild_config.cmo : -ocamlbuild_config.cmx : -ocamlbuild_executor.cmo : ocamlbuild_executor.cmi -ocamlbuild_executor.cmx : ocamlbuild_executor.cmi -ocamlbuild_plugin.cmo : ocamlbuild_plugin.cmi -ocamlbuild_plugin.cmx : ocamlbuild_plugin.cmi -ocamlbuild_unix_plugin.cmo : ocamlbuild_executor.cmi my_unix.cmi my_std.cmi \ - exit_codes.cmi ocamlbuild_unix_plugin.cmi -ocamlbuild_unix_plugin.cmx : ocamlbuild_executor.cmx my_unix.cmx my_std.cmx \ - exit_codes.cmx ocamlbuild_unix_plugin.cmi -ocamlbuild_where.cmo : ocamlbuild_config.cmo ocamlbuild_where.cmi -ocamlbuild_where.cmx : ocamlbuild_config.cmx ocamlbuild_where.cmi -ocamlbuildlight.cmo : ocamlbuildlight.cmi -ocamlbuildlight.cmx : ocamlbuildlight.cmi options.cmo : shell.cmi ocamlbuild_where.cmi ocamlbuild_config.cmo \ my_std.cmi log.cmi lexers.cmi const.cmo command.cmi options.cmi options.cmx : shell.cmx ocamlbuild_where.cmx ocamlbuild_config.cmx \ diff --git a/ocamlbuild/Makefile b/ocamlbuild/Makefile index b40d0ead..d302d206 100644 --- a/ocamlbuild/Makefile +++ b/ocamlbuild/Makefile @@ -11,13 +11,14 @@ ######################################################################### include ../config/Makefile +CAMLRUN ?= ../boot/ocamlrun +CAMLYACC ?= ../boot/ocamlyacc ROOTDIR = .. -OCAMLRUN = $(ROOTDIR)/boot/ocamlrun -OCAMLC = $(OCAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib -OCAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib -OCAMLDEP = $(OCAMLRUN) $(ROOTDIR)/tools/ocamldep -OCAMLLEX = $(OCAMLRUN) $(ROOTDIR)/boot/ocamllex +OCAMLC = $(CAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib +OCAMLOPT = $(CAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib +OCAMLDEP = $(CAMLRUN) $(ROOTDIR)/tools/ocamldep +OCAMLLEX = $(CAMLRUN) $(ROOTDIR)/boot/ocamllex CP = cp COMPFLAGS= -warn-error A -w L -w R -w Z -I ../otherlibs/$(UNIXLIB) -safe-string LINKFLAGS= -I ../otherlibs/$(UNIXLIB) @@ -125,9 +126,11 @@ ocamlbuildlib.cmxa: ocamlbuild_pack.cmx $(EXTRA_CMX) # The packs -ocamlbuild_pack.cmo ocamlbuild_pack.cmi: $(PACK_CMO) +ocamlbuild_pack.cmo: $(PACK_CMO) $(OCAMLC) -pack $(PACK_CMO) -o ocamlbuild_pack.cmo +ocamlbuild_pack.cmi: ocamlbuild_pack.cmo + ocamlbuild_pack.cmx: $(PACK_CMX) $(OCAMLOPT) -pack $(PACK_CMX) -o ocamlbuild_pack.cmx @@ -135,13 +138,14 @@ ocamlbuild_pack.cmx: $(PACK_CMX) ocamlbuild_config.ml: ../config/Makefile (echo 'let bindir = "$(BINDIR)"'; \ - echo 'let libdir = "$(LIBDIR)"'; \ - echo 'let supports_shared_libraries = $(SUPPORTS_SHARED_LIBRARIES)';\ - echo 'let a = "$(A)"'; \ - echo 'let o = "$(O)"'; \ - echo 'let so = "$(SO)"'; \ - echo 'let exe = "$(EXE)"'; \ - ) > ocamlbuild_config.ml + echo 'let libdir = "$(LIBDIR)"'; \ + echo 'let supports_shared_libraries = $(SUPPORTS_SHARED_LIBRARIES)';\ + echo 'let a = "$(A)"'; \ + echo 'let o = "$(O)"'; \ + echo 'let so = "$(SO)"'; \ + echo 'let ext_dll = "$(EXT_DLL)"'; \ + echo 'let exe = "$(EXE)"'; \ + ) > ocamlbuild_config.ml clean:: rm -f ocamlbuild_config.ml beforedepend:: ocamlbuild_config.ml diff --git a/ocamlbuild/Makefile.noboot b/ocamlbuild/Makefile.noboot deleted file mode 100644 index 313e5689..00000000 --- a/ocamlbuild/Makefile.noboot +++ /dev/null @@ -1,227 +0,0 @@ -#(***********************************************************************) -#(* *) -#(* ocamlbuild *) -#(* *) -#(* Wojciech Meyer *) -#(* *) -#(* Copyright 2012 Institut National de Recherche en Informatique et *) -#(* en Automatique. All rights reserved. This file is distributed *) -#(* under the terms of the Q Public License version 1.0. *) -#(* *) -#(***********************************************************************) - -# This file removes the dependency on ocamlbuild itself, thus removes need -# for bootstrap. The base for this Makefile was ocamldoc Makefile. - -include ../config/Makefile - -# Various commands and dir -########################## - -ROOTDIR = .. -OCAMLRUN = $(ROOTDIR)/boot/ocamlrun -OCAMLC = $(OCAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib -OCAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib -OCAMLDEP = $(OCAMLRUN) $(ROOTDIR)/tools/ocamldep -OCAMLLEX = $(OCAMLRUN) $(ROOTDIR)/boot/ocamllex -OCAMLLIB = $(LIBDIR) -OCAMLBIN = $(BINDIR) - -# For installation -############## -MKDIR=mkdir -p -CP=cp -f -OCAMLBUILD=ocamlbuild -OCAMLBUILD_OPT=$(OCAMLBUILD).opt -OCAMLBUILD_LIBCMA=ocamlbuildlib.cma -OCAMLBUILD_LIBCMI=ocamlbuildlib.cmi -OCAMLBUILD_LIBCMXA=ocamlbuild.cmxa -OCAMLBUILD_LIBA=ocamlbuild.$(A) -INSTALL_LIBDIR=$(DESTDIR)$(OCAMLLIB)/ocamlbuild -INSTALL_CUSTOMDIR=$(INSTALL_LIBDIR)/custom -INSTALL_BINDIR=$(DESTDIR)$(OCAMLBIN) - -INSTALL_MLIS= -INSTALL_CMIS=$(INSTALL_MLIS:.mli=.cmi) - -# Compilation -############# -OCAMLSRCDIR=.. -INCLUDES_DEP= - -INCLUDES_NODEP= -I $(OCAMLSRCDIR)/stdlib \ - -I $(OCAMLSRCDIR)/otherlibs/str \ - -I $(OCAMLSRCDIR)/otherlibs/dynlink \ - -I $(OCAMLSRCDIR)/otherlibs/$(UNIXLIB) - -INCLUDES=$(INCLUDES_DEP) $(INCLUDES_NODEP) - -COMPFLAGS=$(INCLUDES) -warn-error A -safe-string -LINKFLAGS=$(INCLUDES) - -CMOFILES_PACK= \ - ocamlbuild_Myocamlbuild_config.cmo \ - discard_printf.cmo \ - my_std.cmo \ - bool.cmo \ - glob_ast.cmo \ - glob_lexer.cmo \ - glob.cmo \ - lexers.cmo \ - my_unix.cmo \ - tags.cmo \ - display.cmo \ - log.cmo \ - param_tags.cmo \ - shell.cmo \ - slurp.cmo \ - ocamlbuild_where.cmo \ - command.cmo \ - options.cmo \ - pathname.cmo \ - digest_cache.cmo \ - resource.cmo \ - rule.cmo \ - flags.cmo \ - solver.cmo \ - report.cmo \ - ocaml_arch.cmo \ - hygiene.cmo \ - configuration.cmo \ - tools.cmo \ - fda.cmo \ - plugin.cmo \ - ocaml_utils.cmo \ - ocaml_dependencies.cmo \ - ocaml_compiler.cmo \ - ocaml_tools.cmo \ - hooks.cmo \ - findlib.cmo \ - ocaml_specific.cmo \ - exit_codes.cmo \ - main.cmo - -BASE_CMOFILES= ocamlbuild_executor.cmo \ - ocamlbuild_unix_plugin.cmo - -INSTALL_LIBFILES = $(BASE_CMOFILES) \ - $(BASE_CMOFILES:.cmo=.cmi) \ - $(OCAMLBUILD_LIBCMA) \ - $(OCAMLBUILD).cmo \ - $(OCAMLBUILD)_pack.cmi - -INSTALL_BINFILES = $(OCAMLBUILD) - -CMXFILES= $(CMOFILES:.cmo=.cmx) - -CMXFILES_PACK= $(CMOFILES_PACK:.cmo=.cmx) -CMIFILES_PACK= $(CMOFILES_PACK:.cmo=.cmi) signatures.cmi - -EXECMOFILES_PACK= $(CMOFILES_PACK) -EXECMXFILES_PACK= $(EXECMOFILES_PACK:.cmo=.cmx) -EXECMIFILES_PACK= $(EXECMOFILES_PACK:.cmo=.cmi) - -LIBCMOFILES_PACK= $(CMOFILES_PACK) -LIBCMXFILES_PACK= $(LIBCMOFILES_PACK:.cmo=.cmx) -LIBCMIFILES_PACK= $(LIBCMOFILES_PACK:.cmo=.cmi) - -# Les cmo et cmx de la distrib OCAML -OCAMLCMOFILES= -OCAMLCMXFILES=$(OCAMLCMOFILES_PACK:.cmo=.cmx) - -all: exe lib -opt: $(OCAMLBUILD).native -exe: $(OCAMLBUILD) -lib: $(OCAMLBUILD_LIBCMA) - -opt.opt: exeopt libopt -exeopt: $(OCAMLBUILD_OPT) -libopt: $(OCAMLBUILD_LIBCMXA) $(OCAMLBUILD_LIBCMI) - -debug: - $(MAKE) OCAMLPP="" - -$(OCAMLBUILD)_pack.cmo: $(CMOFILES_PACK) $(CMIFILES_PACK) - $(OCAMLC) -pack -o $@ $(LINKFLAGS) $(OCAMLCMOFILES_PACK) $(EXECMOFILES_PACK) signatures.mli - -$(OCAMLBUILD)_pack.cmx: $(EXECMXFILES_PACK) - $(OCAMLOPT) -pack -o $@ $(LINKFLAGS) $(OCAMLCMOFILES_PACK) $(EXECMXFILES_PACK) - -$(OCAMLBUILD): $(OCAMLBUILD)_pack.cmo $(CMOFILES) $(OCAMLBUILD).cmo $(BASE_CMOFILES) - $(OCAMLC) -o $@ unix.cma $(LINKFLAGS) $(OCAMLBUILD)_pack.cmo $(CMOFILES) - -$(OCAMLBUILD).native: $(OCAMLBUILD)_pack.cmx $(CMXFILES) - $(OCAMLOPT) -o $@ $(LINKFLAGS) $(CMXFILES) - -$(OCAMLBUILD_LIBCMA): $(LIBCMOFILES_PACK) - $(OCAMLC) -a -o $@ $(LINKFLAGS) $(OCAMLSRCDIR)/tools/depend.cmo $(LIBCMOFILES_PACK) -$(OCAMLBUILD_LIBCMXA): $(LIBCMXFILES) - $(OCAMLOPT) -a -o $@ $(LINKFLAGS) $(OCAMLSRCDIR)/tools/depend.cmx $(LIBCMXFILES) - -# generic rules : -################# - -.SUFFIXES: .mll .mly .ml .mli .cmo .cmi .cmx .cmxs - -.ml.cmo: - $(OCAMLC) $(OCAMLPP) $(COMPFLAGS) -c $< - -.mli.cmi: - $(OCAMLC) $(OCAMLPP) $(COMPFLAGS) -c $< - -.ml.cmx: - $(OCAMLOPT) $(OCAMLPP) $(COMPFLAGS) -c $< - -.ml.cmxs: - $(OCAMLOPT) -shared -o $@ $(OCAMLPP) $(COMPFLAGS) $< - -.mll.ml: - $(OCAMLLEX) $< - -.mly.ml: - $(OCAMLYACC) -v $< - -.mly.mli: - $(OCAMLYACC) -v $< - -# Installation targets -###################### -install: dummy - if test -d $(INSTALL_BINDIR); then : ; else $(MKDIR) $(INSTALL_BINDIR); fi - if test -d $(INSTALL_LIBDIR); then : ; else $(MKDIR) $(INSTALL_LIBDIR); fi - if test -d $(INSTALL_CUSTOMDIR); then : ; else $(MKDIR) $(INSTALL_CUSTOMDIR); fi - $(CP) $(OCAMLBUILD) $(INSTALL_BINDIR)/$(OCAMLBUILD)$(EXE) - $(CP) $(INSTALL_LIBFILES) $(INSTALL_LIBDIR) - $(CP) $(INSTALL_BINFILES) $(INSTALL_BINDIR) - -installopt: - if test -f $(OCAMLBUILD_OPT) ; then $(MAKE) installopt_really ; fi - -installopt_really: - if test -d $(INSTALL_BINDIR); then : ; else $(MKDIR) $(INSTALL_BINDIR); fi - if test -d $(INSTALL_LIBDIR); then : ; else $(MKDIR) $(INSTALL_LIBDIR); fi - $(CP) ocamlbuild.hva $(OCAMLBUILD_LIBA) $(OCAMLBUILD_LIBCMXA) $(INSTALL_LIBDIR) - $(CP) $(INSTALL_MLIS) $(INSTALL_CMIS) $(INSTALL_LIBDIR) - - -# backup, clean and depend : -############################ - -clean:: dummy - @rm -f *~ \#*\# - @rm -f $(OCAMLBUILD) $(OCAMLBUILD_OPT) *.cma *.cmxa *.cmo *.cmi *.cmx *.$(A) *.$(O) - @rm -f glob_lexer.ml lexers.ml - -depend:: - $(OCAMLDEP) $(INCLUDES_DEP) *.mli *.mll *.mly *.ml > .depend - -dummy: - -include .depend - -# Additional rules -glob_lexer.cmo: glob_lexer.cmi -lexers.cmo: lexers.cmi - -glob_lexer.cmx: glob_lexer.cmi -lexers.cmx: lexers.cmi diff --git a/ocamlbuild/command.ml b/ocamlbuild/command.ml index fc6e07cf..79e2a1dc 100644 --- a/ocamlbuild/command.ml +++ b/ocamlbuild/command.ml @@ -125,7 +125,7 @@ let virtual_solver virtual_command = (* On Windows, we need to also check for the ".exe" version of the file. *) let file_or_exe_exists file = - sys_file_exists file || (Sys.os_type = "Win32" && sys_file_exists (file ^ ".exe")) + sys_file_exists file || ((Sys.win32 || Sys.cygwin) && sys_file_exists (file ^ ".exe")) let search_in_path cmd = (* Try to find [cmd] in path [path]. *) @@ -393,6 +393,9 @@ let pdep tags ptag deps = Param_tags.declare ptag (fun param -> dep (Param_tags.make ptag param :: tags) (deps param)) +let list_all_deps () = + !all_deps_of_tags + (* let to_string_for_digest x = let rec cmd_of_spec = diff --git a/ocamlbuild/command.mli b/ocamlbuild/command.mli index 18547a45..a28c7519 100644 --- a/ocamlbuild/command.mli +++ b/ocamlbuild/command.mli @@ -46,4 +46,6 @@ val dep : Tags.elt list -> pathname list -> unit val pdep : Tags.elt list -> Tags.elt -> (string -> pathname list) -> unit +val list_all_deps : unit -> (Tags.t * pathname list) list + val file_or_exe_exists: string -> bool diff --git a/ocamlbuild/configuration.ml b/ocamlbuild/configuration.ml index 6290e60a..bc50a010 100644 --- a/ocamlbuild/configuration.ml +++ b/ocamlbuild/configuration.ml @@ -81,10 +81,11 @@ let tag_any tags = let check_tags_usage useful_tags = let check_tag (tag, loc) = if not (Tags.mem tag useful_tags) then - Log.eprintf "%aWarning: the tag %S is not used in any flag declaration, \ - so it will have no effect; it may be a typo. Otherwise use \ - `mark_tag_used` in your myocamlbuild.ml to disable \ - this warning." + + Log.eprintf "%aWarning: the tag %S is not used in any flag or dependency \ + declaration, so it will have no effect; it may be a typo. \ + Otherwise you can use `mark_tag_used` in your myocamlbuild.ml \ + to disable this warning." Loc.print_loc loc tag in let check_conf (_, values) = diff --git a/ocamlbuild/main.ml b/ocamlbuild/main.ml index 07ca9c06..d59a450b 100644 --- a/ocamlbuild/main.ml +++ b/ocamlbuild/main.ml @@ -25,7 +25,6 @@ exception Exit_build_error of string exception Exit_silently let clean () = - Log.finish (); Shell.rm_rf !Options.build_dir; if !Options.make_links then begin let entry = @@ -34,6 +33,7 @@ let clean () = in Slurp.force (Resource.clean_up_links entry) end; + Log.finish (); raise Exit_silently ;; @@ -57,7 +57,7 @@ let show_documentation () = they should be marked as useful, to avoid the "unused tag" warning. *) let builtin_useful_tags = Tags.of_list [ - "include"; "traverse"; "not_hygienic"; + "include"; "traverse"; "not_hygienic"; "precious"; "pack"; "ocamlmklib"; "native"; "thread"; "nopervasives"; "use_menhir"; "ocamldep"; "thread"; @@ -67,6 +67,8 @@ let builtin_useful_tags = let proceed () = Hooks.call_hook Hooks.Before_options; Options.init (); + Options.include_dirs := List.map Pathname.normalize !Options.include_dirs; + Options.exclude_dirs := List.map Pathname.normalize !Options.exclude_dirs; if !Options.must_clean then clean (); Hooks.call_hook Hooks.After_options; let options_wd = Sys.getcwd () in @@ -74,7 +76,7 @@ let proceed () = (* If we are in the first run before launching the plugin, we should skip the user-visible operations (hygiene) that may need information from the plugin to run as the user expects it. - + Note that we don't need to disable the [Hooks] call as they are no-ops anyway, before any plugin has registered hooks. *) Plugin.we_need_a_plugin () && not !Options.just_plugin in @@ -91,6 +93,8 @@ let proceed () = <**/*.cmo>: ocaml, byte\n\ <**/*.cmi>: ocaml, byte, native\n\ <**/*.cmx>: ocaml, native\n\ + <**/*.mly>: infer\n\ + <**/.svn>|\".bzr\"|\".hg\"|\".git\"|\"_darcs\": -traverse\n\ "; List.iter @@ -201,7 +205,14 @@ let proceed () = raise Exit_silently end; - let all_tags = Tags.union builtin_useful_tags (Flags.get_used_tags ()) in + let all_tags = + let builtin = builtin_useful_tags in + let used_in_flags = Flags.get_used_tags () in + let used_in_deps = + List.fold_left (fun acc (tags, _deps) -> Tags.union acc tags) + Tags.empty (Command.list_all_deps ()) + in + Tags.union builtin (Tags.union used_in_flags used_in_deps) in Configuration.check_tags_usage all_tags; Digest_cache.init (); @@ -263,10 +274,10 @@ let proceed () = else () with - | Ocaml_dependencies.Circular_dependencies(seen, p) -> + | Ocaml_dependencies.Circular_dependencies(cycle, p) -> raise (Exit_build_error - (sbprintf "@[<2>Circular dependencies: %S already seen in@ %a@]@." p pp_l seen)) + (sbprintf "@[<2>Circular dependencies: %S already seen in@ %a@]@." p pp_l cycle)) ;; open Exit_codes;; diff --git a/ocamlbuild/my_unix.ml b/ocamlbuild/my_unix.ml index fa1c5d45..5bfbee01 100644 --- a/ocamlbuild/my_unix.ml +++ b/ocamlbuild/my_unix.ml @@ -84,6 +84,12 @@ let rec readlink x = if sys_file_exists x then try let y = readlinkcmd x in + let y = + if Filename.is_relative y then + Filename.concat (Filename.dirname x) y + else + y + in if (lstat y).stat_file_kind = FK_dir then raise Link_to_directories_not_supported else y with Failure(_) -> raise Not_a_link else raise No_such_file diff --git a/ocamlbuild/ocaml_compiler.ml b/ocamlbuild/ocaml_compiler.ml index c270a7f6..7526598f 100644 --- a/ocamlbuild/ocaml_compiler.ml +++ b/ocamlbuild/ocaml_compiler.ml @@ -156,7 +156,7 @@ let byte_compile_ocaml_interf mli cmi env build = let compile_ocaml_interf mli cmi env build = let mli = env mli and cmi = env cmi in prepare_compile build mli; - let tags = tags_of_pathname mli++"interf" in + let tags = tags_of_pathname mli++"interf" in let comp_c = if Tags.mem "native" tags then ocamlopt_c else ocamlc_c in comp_c tags mli cmi @@ -266,6 +266,9 @@ let byte_link = byte_link_gen ocamlc_link_prog let byte_output_obj = byte_link_gen ocamlc_link_prog (fun tags -> tags++"ocaml"++"link"++"byte"++"output_obj") +let byte_output_shared = byte_link_gen ocamlc_link_prog + (fun tags -> tags++"ocaml"++"link"++"byte"++"output_obj"++"output_shared") + let byte_library_link = byte_link_gen byte_lib_linker byte_lib_linker_tags let byte_debug_link_gen = @@ -286,6 +289,9 @@ let native_link x = native_link_gen ocamlopt_link_prog let native_output_obj x = native_link_gen ocamlopt_link_prog (fun tags -> tags++"ocaml"++"link"++"native"++"output_obj") x +let native_output_shared x = native_link_gen ocamlopt_link_prog + (fun tags -> tags++"ocaml"++"link"++"native"++"output_obj"++"output_shared") x + let native_library_link x = native_link_gen native_lib_linker native_lib_linker_tags x diff --git a/ocamlbuild/ocaml_compiler.mli b/ocamlbuild/ocaml_compiler.mli index 38206e5a..0c951abd 100644 --- a/ocamlbuild/ocaml_compiler.mli +++ b/ocamlbuild/ocaml_compiler.mli @@ -43,11 +43,13 @@ val link_gen : string -> string -> Rule.action val byte_link : string -> string -> Rule.action val byte_output_obj : string -> string -> Rule.action +val byte_output_shared : string -> string -> Rule.action val byte_library_link : string -> string -> Rule.action val byte_debug_link : string -> string -> Rule.action val byte_debug_library_link : string -> string -> Rule.action val native_link : string -> string -> Rule.action val native_output_obj : string -> string -> Rule.action +val native_output_shared : string -> string -> Rule.action val native_library_link : string -> string -> Rule.action val native_shared_library_link : ?tags:(string list) -> string -> string -> Rule.action val native_profile_link : string -> string -> Rule.action diff --git a/ocamlbuild/ocaml_dependencies.ml b/ocamlbuild/ocaml_dependencies.ml index de2c11fa..f62eb7d4 100644 --- a/ocamlbuild/ocaml_dependencies.ml +++ b/ocamlbuild/ocaml_dependencies.ml @@ -194,12 +194,51 @@ module Make (I : INPUT) = struct let dependencies_of x = try SMap.find x !*dependencies with Not_found -> Resources.empty in - let needed = ref [] in - let seen = ref [] in + let refine_cycle files starting_file = + (* We are looking for a cycle starting from [fn], included in + [files]; we'll simply use a DFS which builds a path until it + finds a circularity. + + Note that if there is at least one cycle going through [fn], + calling [dfs path fn] will return it no matter what [path] is + (it may just not be the shortest possible cycle). This means + that if [dfs path fn] returns [None], [fn] is a dead-end that + should never be explored again. + *) + let dead_ends = ref Resources.empty in + let rec dfs path fn = + let through_dep f = function + | Some _ as cycle -> cycle + | None -> + if List.mem f path + then (* we have found a cycle *) + Some (List.rev path) + else if not (Resources.mem f files) + then + (* the neighbor is not in the set of paths known to have a cycle *) + None + else + (* look for cycles going through this neighbor *) + dfs (f :: path) f + in + if Resources.mem fn !dead_ends then None + else match Resources.fold through_dep (dependencies_of fn) None with + | Some _ as cycle -> cycle + | None -> dead_ends := Resources.add fn !dead_ends; None + in + match dfs [] starting_file with + | None -> Resources.elements files + | Some cycle -> cycle + in + + let needed_in_order = ref [] in + let needed = ref Resources.empty in + let seen = ref Resources.empty in let rec aux fn = - if sys_file_exists fn && not (List.mem fn !needed) then begin - if List.mem fn !seen then raise (Circular_dependencies (!seen, fn)); - seen := fn :: !seen; + if sys_file_exists fn && not (Resources.mem fn !needed) then begin + if Resources.mem fn !seen then + raise (Circular_dependencies (refine_cycle !seen fn, fn)); + seen := Resources.add fn !seen; Resources.iter begin fun f -> if sys_file_exists f then if Filename.check_suffix f ".cmi" then @@ -210,11 +249,14 @@ module Make (I : INPUT) = struct else () else aux f end (dependencies_of fn); - needed := fn :: !needed + needed := Resources.add fn !needed; + needed_in_order := fn :: !needed_in_order end in List.iter aux fns; - mydprintf "caml_transitive_closure:@ %a ->@ %a" pp_l fns pp_l !needed; - List.rev !needed + mydprintf "caml_transitive_closure:@ %a ->@ %a" + pp_l fns pp_l !needed_in_order; + List.rev !needed_in_order + end diff --git a/ocamlbuild/ocaml_specific.ml b/ocamlbuild/ocaml_specific.ml index 79517a86..18ae0944 100644 --- a/ocamlbuild/ocaml_specific.ml +++ b/ocamlbuild/ocaml_specific.ml @@ -61,7 +61,9 @@ let x_p_dll = "%.p"-.-ext_dll;; (* -output-obj targets *) let x_byte_c = "%.byte.c";; let x_byte_o = "%.byte"-.-ext_obj;; +let x_byte_so = "%.byte"-.-ext_dll;; let x_native_o = "%.native"-.-ext_obj;; +let x_native_so = "%.native"-.-ext_dll;; rule "target files" ~dep:"%.itarget" @@ -221,6 +223,15 @@ rule "ocaml: cmo* -> byte.c" ~dep:"%.cmo" (Ocaml_compiler.byte_output_obj "%.cmo" x_byte_c);; +rule "ocaml: cmo* -> byte.(so|dll|dylib)" + ~prod:x_byte_so + ~dep:"%.cmo" + ~doc:"The foo.byte.so target, or foo.byte.dll under Windows, \ + or foo.byte.dylib under Mac OS X will produce a shared library file + by passing the -output-obj and -cclib -shared options \ + to the OCaml compiler. See also foo.native.{so,dll,dylib}." + (Ocaml_compiler.byte_output_shared "%.cmo" x_byte_so);; + rule "ocaml: p.cmx* & p.o* -> p.native" ~prod:"%.p.native" ~deps:["%.p.cmx"; x_p_o] @@ -239,6 +250,11 @@ rule "ocaml: cmx* & o* -> native.(o|obj)" ~deps:["%.cmx"; x_o] (Ocaml_compiler.native_output_obj "%.cmx" x_native_o);; +rule "ocaml: cmx* & o* -> native.(so|dll|dylib)" + ~prod:x_native_so + ~deps:["%.cmx"; x_o] + (Ocaml_compiler.native_output_shared "%.cmx" x_native_so);; + rule "ocaml: mllib & d.cmo* -> d.cma" ~prod:"%.d.cma" ~dep:"%.mllib" @@ -527,11 +543,22 @@ end;; flag ["ocaml"; "ocamlyacc"] (atomize !Options.ocaml_yaccflags);; flag ["ocaml"; "menhir"] (atomize !Options.ocaml_yaccflags);; flag ["ocaml"; "doc"] (atomize !Options.ocaml_docflags);; +flag ["ocaml"; "ocamllex"] (atomize !Options.ocaml_lexflags);; (* Tell menhir to explain conflicts *) flag [ "ocaml" ; "menhir" ; "explain" ] (S[A "--explain"]);; +flag [ "ocaml" ; "menhir" ; "infer" ] (S[A "--infer"]);; -flag ["ocaml"; "ocamllex"] (atomize !Options.ocaml_lexflags);; +(* Define two ocamlbuild flags [only_tokens] and [external_tokens(Foo)] + which correspond to menhir's [--only-tokens] and [--external-tokens Foo]. + When they are used, these flags should be passed both to [menhir] and to + [menhir --raw-depend]. *) +let () = + List.iter begin fun mode -> + flag [ mode; "only_tokens" ] (S[A "--only-tokens"]); + pflag [ mode ] "external_tokens" (fun name -> + S[A "--external-tokens"; A name]); + end [ "menhir"; "menhir_ocamldep" ];; (* Tell ocamllex to generate ml code *) flag [ "ocaml" ; "ocamllex" ; "generate_ml" ] (S[A "-ml"]);; @@ -558,6 +585,15 @@ let () = (* Ocamlfind will link the archives for us. *) flag ["ocaml"; "link"; "program"] & A"-linkpkg"; flag ["ocaml"; "link"; "toplevel"] & A"-linkpkg"; + flag ["ocaml"; "link"; "output_obj"] & A"-linkpkg"; + + (* "program" will make sure that -linkpkg is passed when compiling + whole-programs (.byte and .native); but it is occasionally + useful to pass -linkpkg when building archives for example + (.cma and .cmxa); the "linkpkg" flag allows user to request it + explicitly. *) + flag ["ocaml"; "link"; "linkpkg"] & A"-linkpkg"; + pflag ["ocaml"; "link"] "dontlink" (fun pkg -> S[A"-dontlink"; A pkg]); let all_tags = [ ["ocaml"; "byte"; "compile"]; @@ -616,6 +652,8 @@ let () = (fun param -> S [A "-open"; A param]); pflag ["ocaml"; "compile"] "open" (fun param -> S [A "-open"; A param]); + pflag ["ocaml"; "link"] "runtime_variant" + (fun param -> S [A "-runtime-variant"; A param]); () let camlp4_flags camlp4s = @@ -666,8 +704,11 @@ flag ["ocaml"; "debug"; "pack"; "byte"] (A "-g");; flag ["ocaml"; "debug"; "compile"; "native"] (A "-g");; flag ["ocaml"; "debug"; "link"; "native"; "program"] (A "-g");; flag ["ocaml"; "debug"; "pack"; "native"] (A "-g");; +flag ["c"; "debug"; "compile"] (A "-g"); +flag ["c"; "debug"; "link"] (A "-g"); flag ["ocaml"; "link"; "native"; "output_obj"] (A"-output-obj");; flag ["ocaml"; "link"; "byte"; "output_obj"] (A"-output-obj");; +flag ["ocaml"; "link"; "output_shared"] & (S[A"-cclib"; A"-shared"]);; flag ["ocaml"; "dtypes"; "compile"] (A "-dtypes");; flag ["ocaml"; "annot"; "compile"] (A "-annot");; flag ["ocaml"; "annot"; "pack"] (A "-annot");; @@ -694,6 +735,7 @@ flag ["ocaml"; "compile"; "no_alias_deps";] (A "-no-alias-deps");; flag ["ocaml"; "compile"; "strict_formats";] (A "-strict-formats");; flag ["ocaml"; "native"; "compile"; "opaque";] (A "-opaque");; flag ["ocaml"; "native"; "compile"; "no_float_const_prop";] (A "-no-float-const-prop"); +flag ["ocaml"; "compile"; "keep_docs";] (A "-keep-docs"); flag ["ocaml"; "compile"; "keep_locs";] (A "-keep-locs"); flag ["ocaml"; "absname"; "compile"] (A "-absname");; flag ["ocaml"; "absname"; "infer_interface"] (A "-absname");; diff --git a/ocamlbuild/ocaml_tools.ml b/ocamlbuild/ocaml_tools.ml index f4019c7a..be6fed38 100644 --- a/ocamlbuild/ocaml_tools.ml +++ b/ocamlbuild/ocaml_tools.ml @@ -73,7 +73,7 @@ let menhir_modular menhir_base mlypack mlypack_depends env build = let tags = tags++"ocaml"++"parser"++"menhir" in Cmd(S[menhir ; A "--ocamlc"; Quote(S[!Options.ocamlc; T ocamlc_tags; ocaml_include_flags mlypack]); - T tags ; A "--infer" ; A "--base" ; Px menhir_base ; atomize_paths files]) + T tags ; A "--base" ; Px menhir_base ; atomize_paths files]) let ocamldep_command arg out env _build = let arg = env arg and out = env out in @@ -99,14 +99,14 @@ let infer_interface ml mli env build = let menhir mly env build = let mly = env mly in + let ml = Pathname.update_extension "ml" mly in let menhir = if !Options.ocamlyacc = N then V"MENHIR" else !Options.ocamlyacc in - let tags = tags_of_pathname mly in - let ocamlc_tags = tags++"ocaml"++"byte"++"compile" in - let menhir_tags = tags++"ocaml"++"parser"++"menhir" in + let ocamlc_tags = tags_of_pathname ml ++"ocaml"++"byte"++"compile" in + let menhir_tags = tags_of_pathname mly ++"ocaml"++"parser"++"menhir" in Ocaml_compiler.prepare_compile build mly; Cmd(S[menhir; A"--ocamlc"; Quote(S[!Options.ocamlc; T ocamlc_tags; ocaml_include_flags mly]); - T menhir_tags; A"--infer"; Px mly]) + T menhir_tags; Px mly]) let ocamldoc_c tags arg odoc = let tags = tags++"ocaml" in diff --git a/ocamlbuild/ocamlbuild_unix_plugin.ml b/ocamlbuild/ocamlbuild_unix_plugin.ml index 9966c4dc..2ed88b99 100644 --- a/ocamlbuild/ocamlbuild_unix_plugin.ml +++ b/ocamlbuild/ocamlbuild_unix_plugin.ml @@ -72,13 +72,22 @@ let execute_many = in Ocamlbuild_executor.execute ~exit +(* Ocamlbuild code assumes throughout that [readlink] will return a file name + relative to the current directory. Let's make it so. *) +let myunixreadlink x = + let y = Unix.readlink x in + if Filename.is_relative y then + Filename.concat (Filename.dirname x) y + else + y + let setup () = implem.is_degraded <- false; implem.stdout_isatty <- stdout_isatty; implem.gettimeofday <- Unix.gettimeofday; implem.report_error <- report_error; implem.execute_many <- execute_many; - implem.readlink <- Unix.readlink; + implem.readlink <- myunixreadlink; implem.run_and_open <- run_and_open; implem.at_exit_once <- at_exit_once; implem.is_link <- is_link; diff --git a/ocamlbuild/options.ml b/ocamlbuild/options.ml index 5193b9b9..3d4393d3 100644 --- a/ocamlbuild/options.ml +++ b/ocamlbuild/options.ml @@ -101,7 +101,9 @@ let show_documentation = ref false let recursive = ref false let ext_lib = ref Ocamlbuild_config.a let ext_obj = ref Ocamlbuild_config.o -let ext_dll = ref Ocamlbuild_config.so +let ext_dll = + let s = Ocamlbuild_config.ext_dll in + ref (String.sub s 1 (String.length s - 1)) let exe = ref Ocamlbuild_config.exe let targets_internal = ref [] diff --git a/ocamlbuild/test/good-output b/ocamlbuild/test/good-output new file mode 100644 index 00000000..b140dab3 --- /dev/null +++ b/ocamlbuild/test/good-output @@ -0,0 +1,1473 @@ + _____ _ ____ +|_ _|__ ___| |_|___ \ + | |/ _ \/ __| __| __) | + | | __/\__ \ |_ / __/ + |_|\___||___/\__|_____| + +ocamldep.opt -modules toto.ml > toto.ml.depends +ocamldep.opt -modules tata.mli > tata.mli.depends +ocamldep.opt -modules titi.ml > titi.ml.depends +ocamldep.opt -modules tutu.mli > tutu.mli.depends +ocamlc.opt -c -o tata.cmi tata.mli +ocamlc.opt -c -o titi.cmo titi.ml +ocamlc.opt -c -o tutu.cmi tutu.mli +ocamlc.opt -c -o toto.cmo toto.ml +ocamldep.opt -modules tata.ml > tata.ml.depends +ocamldep.opt -modules tutu.ml > tutu.ml.depends +ocamldep.opt -modules tyty.mli > tyty.mli.depends +ocamldep.opt -pp camlp4o.opt -modules vivi.ml > vivi.ml.depends +ocamlc.opt -c -o tyty.cmi tyty.mli +ocamlc.opt -c -pp camlp4o.opt -o vivi.cmo vivi.ml +ocamlc.opt -c -o tata.cmo tata.ml +ocamlc.opt -c -o tutu.cmo tutu.ml +ocamlc.opt tata.cmo titi.cmo vivi.cmo tutu.cmo toto.cmo -o toto.byte +ocamlopt.opt -c -pp camlp4o.opt -o vivi.cmx vivi.ml +ocamlopt.opt -c -o tata.cmx tata.ml +ocamlopt.opt -c -o titi.cmx titi.ml +ocamlopt.opt -c -o tutu.cmx tutu.ml +ocamlopt.opt -c -o toto.cmx toto.ml +ocamlopt.opt tata.cmx titi.cmx vivi.cmx tutu.cmx toto.cmx -o toto.native +Warning: Using -- only run the last target +toto.native: /home/danmey/src/ocaml-trunk/ocamlbuild/test/test2/_build/toto.native: Hello world!!! +Tutu.tutu => 1 +Tata.tata => "TATA2" +[cache hit] ocamldep.opt -modules toto.ml > toto.ml.depends +[cache hit] ocamldep.opt -modules tata.mli > tata.mli.depends +[cache hit] ocamlc.opt -c -o tata.cmi tata.mli +[cache hit] ocamldep.opt -modules titi.ml > titi.ml.depends +[cache hit] ocamlc.opt -c -o titi.cmo titi.ml +[cache hit] ocamldep.opt -modules tutu.mli > tutu.mli.depends +[cache hit] ocamlc.opt -c -o tutu.cmi tutu.mli +[cache hit] ocamlc.opt -c -o toto.cmo toto.ml +[cache hit] ocamldep.opt -modules tata.ml > tata.ml.depends +[cache hit] ocamlc.opt -c -o tata.cmo tata.ml +[cache hit] ocamldep.opt -modules tutu.ml > tutu.ml.depends +[cache hit] ocamldep.opt -modules tyty.mli > tyty.mli.depends +[cache hit] ocamlc.opt -c -o tyty.cmi tyty.mli +[cache hit] ocamldep.opt -pp camlp4o.opt -modules vivi.ml > vivi.ml.depends +[cache hit] ocamlc.opt -c -pp camlp4o.opt -o vivi.cmo vivi.ml +[cache hit] ocamlc.opt -c -o tutu.cmo tutu.ml +[cache hit] ocamlc.opt tata.cmo titi.cmo vivi.cmo tutu.cmo toto.cmo -o toto.byte +[cache hit] ocamlopt.opt -c -o tata.cmx tata.ml +[cache hit] ocamlopt.opt -c -o titi.cmx titi.ml +[cache hit] ocamlopt.opt -c -pp camlp4o.opt -o vivi.cmx vivi.ml +[cache hit] ocamlopt.opt -c -o tutu.cmx tutu.ml +[cache hit] ocamlopt.opt -c -o toto.cmx toto.ml +[cache hit] ocamlopt.opt tata.cmx titi.cmx vivi.cmx tutu.cmx toto.cmx -o toto.native +Warning: Using -- only run the last target +toto.native: /home/danmey/src/ocaml-trunk/ocamlbuild/test/test2/_build/toto.native: Hello world!!! +Tutu.tutu => 1 +Tata.tata => "TATA2" +ocamldep.opt -pp camlp4o.opt -modules vivi.ml > vivi.ml.depends +ocamlc.opt -c -pp camlp4o.opt -o vivi.cmo vivi.ml +ocamlc.opt tata.cmo titi.cmo vivi.cmo tutu.cmo toto.cmo -o toto.byte +ocamlopt.opt -c -pp camlp4o.opt -o vivi.cmx vivi.ml +ocamlopt.opt tata.cmx titi.cmx vivi.cmx tutu.cmx toto.cmx -o toto.native +Warning: Using -- only run the last target +toto.native: /home/danmey/src/ocaml-trunk/ocamlbuild/test/test2/_build/toto.native: Hello world!!! +Tutu.tutu => 1 +Tata.tata => "TATA2" +[cache hit] ocamldep.opt -modules toto.ml > toto.ml.depends +[cache hit] ocamldep.opt -modules tata.mli > tata.mli.depends +[cache hit] ocamlc.opt -c -o tata.cmi tata.mli +[cache hit] ocamldep.opt -modules titi.ml > titi.ml.depends +[cache hit] ocamlc.opt -c -o titi.cmo titi.ml +[cache hit] ocamldep.opt -modules tutu.mli > tutu.mli.depends +[cache hit] ocamlc.opt -c -o tutu.cmi tutu.mli +[cache hit] ocamlc.opt -c -o toto.cmo toto.ml +[cache hit] ocamldep.opt -modules tata.ml > tata.ml.depends +[cache hit] ocamlc.opt -c -o tata.cmo tata.ml +[cache hit] ocamldep.opt -modules tutu.ml > tutu.ml.depends +[cache hit] ocamldep.opt -modules tyty.mli > tyty.mli.depends +[cache hit] ocamlc.opt -c -o tyty.cmi tyty.mli +[cache hit] ocamldep.opt -pp camlp4o.opt -modules vivi.ml > vivi.ml.depends +[cache hit] ocamlc.opt -c -pp camlp4o.opt -o vivi.cmo vivi.ml +[cache hit] ocamlc.opt -c -o tutu.cmo tutu.ml +[cache hit] ocamlc.opt tata.cmo titi.cmo vivi.cmo tutu.cmo toto.cmo -o toto.byte +[cache hit] ocamlopt.opt -c -o tata.cmx tata.ml +[cache hit] ocamlopt.opt -c -o titi.cmx titi.ml +[cache hit] ocamlopt.opt -c -pp camlp4o.opt -o vivi.cmx vivi.ml +[cache hit] ocamlopt.opt -c -o tutu.cmx tutu.ml +[cache hit] ocamlopt.opt -c -o toto.cmx toto.ml +[cache hit] ocamlopt.opt tata.cmx titi.cmx vivi.cmx tutu.cmx toto.cmx -o toto.native +Warning: Using -- only run the last target +toto.native: /home/danmey/src/ocaml-trunk/ocamlbuild/test/test2/_build/toto.native: Hello world!!! +Tutu.tutu => 1 +Tata.tata => "TATA2" +ocamldep.opt -pp camlp4o.opt -modules vivi.ml > vivi.ml.depends +ocamlc.opt -c -pp camlp4o.opt -o vivi.cmo vivi.ml +ocamlc.opt -c -o tutu.cmo tutu.ml +ocamlc.opt tata.cmo titi.cmo vivi.cmo tutu.cmo toto.cmo -o toto.byte +ocamlopt.opt -c -pp camlp4o.opt -o vivi.cmx vivi.ml +ocamlopt.opt -c -o tutu.cmx tutu.ml +ocamlopt.opt -c -o toto.cmx toto.ml +ocamlopt.opt tata.cmx titi.cmx vivi.cmx tutu.cmx toto.cmx -o toto.native +Warning: Using -- only run the last target +toto.native: /home/danmey/src/ocaml-trunk/ocamlbuild/test/test2/_build/toto.native: Hello world!!! +Tutu.tutu => 2 +Tata.tata => "TATA2" +[cache hit] ocamldep.opt -modules toto.ml > toto.ml.depends +[cache hit] ocamldep.opt -modules tata.mli > tata.mli.depends +[cache hit] ocamlc.opt -c -o tata.cmi tata.mli +[cache hit] ocamldep.opt -modules titi.ml > titi.ml.depends +[cache hit] ocamlc.opt -c -o titi.cmo titi.ml +[cache hit] ocamldep.opt -modules tutu.mli > tutu.mli.depends +[cache hit] ocamlc.opt -c -o tutu.cmi tutu.mli +[cache hit] ocamlc.opt -c -o toto.cmo toto.ml +[cache hit] ocamldep.opt -modules tata.ml > tata.ml.depends +[cache hit] ocamlc.opt -c -o tata.cmo tata.ml +[cache hit] ocamldep.opt -modules tutu.ml > tutu.ml.depends +[cache hit] ocamldep.opt -modules tyty.mli > tyty.mli.depends +[cache hit] ocamlc.opt -c -o tyty.cmi tyty.mli +[cache hit] ocamldep.opt -pp camlp4o.opt -modules vivi.ml > vivi.ml.depends +[cache hit] ocamlc.opt -c -pp camlp4o.opt -o vivi.cmo vivi.ml +[cache hit] ocamlc.opt -c -o tutu.cmo tutu.ml +[cache hit] ocamlc.opt tata.cmo titi.cmo vivi.cmo tutu.cmo toto.cmo -o toto.byte +[cache hit] ocamlopt.opt -c -o tata.cmx tata.ml +[cache hit] ocamlopt.opt -c -o titi.cmx titi.ml +[cache hit] ocamlopt.opt -c -pp camlp4o.opt -o vivi.cmx vivi.ml +[cache hit] ocamlopt.opt -c -o tutu.cmx tutu.ml +[cache hit] ocamlopt.opt -c -o toto.cmx toto.ml +[cache hit] ocamlopt.opt tata.cmx titi.cmx vivi.cmx tutu.cmx toto.cmx -o toto.native +Warning: Using -- only run the last target +toto.native: /home/danmey/src/ocaml-trunk/ocamlbuild/test/test2/_build/toto.native: Hello world!!! +Tutu.tutu => 2 +Tata.tata => "TATA2" + _____ _ _____ +|_ _|__ ___| |_|___ / + | |/ _ \/ __| __| |_ \ + | | __/\__ \ |_ ___) | + |_|\___||___/\__|____/ + +ocamldep.opt -modules a.mli > a.mli.depends +ocamlc.opt -c -o a.cmi a.mli +ocamldep.opt -modules a.ml > a.ml.depends +ocamldep.opt -modules b.mli > b.mli.depends +ocamlc.opt -c -o b.cmi b.mli +ocamlc.opt -c -o a.cmo a.ml +ocamldep.opt -modules b.ml > b.ml.depends +ocamldep.opt -modules c.mli > c.mli.depends +ocamlc.opt -c -o c.cmi c.mli +ocamlc.opt -c -o b.cmo b.ml +ocamldep.opt -modules c.ml > c.ml.depends +ocamldep.opt -modules d.mli > d.mli.depends +ocamlc.opt -c -o d.cmi d.mli +ocamlc.opt -c -o c.cmo c.ml +ocamldep.opt -modules d.ml > d.ml.depends +ocamldep.opt -modules e.mli > e.mli.depends +ocamlc.opt -c -o e.cmi e.mli +ocamlc.opt -c -o d.cmo d.ml +ocamldep.opt -modules e.ml > e.ml.depends +ocamldep.opt -modules f.mli > f.mli.depends +ocamlc.opt -c -o f.cmi f.mli +ocamlc.opt -c -o e.cmo e.ml +ocamldep.opt -modules f.ml > f.ml.depends +ocamlc.opt -c -o f.cmo f.ml +ocamlc.opt unix.cma f.cmo e.cmo d.cmo c.cmo b.cmo a.cmo -o a.byte +ocamlopt.opt -c -o f.cmx f.ml +ocamlopt.opt -c -o e.cmx e.ml +ocamlopt.opt -c -o d.cmx d.ml +ocamlopt.opt -c -o c.cmx c.ml +ocamlopt.opt -c -o b.cmx b.ml +ocamlopt.opt -c -o a.cmx a.ml +ocamlopt.opt unix.cmxa f.cmx e.cmx d.cmx c.cmx b.cmx a.cmx -o a.native +ocamldoc.opt -dump a.odoc a.mli +ocamldoc.opt -dump b.odoc b.mli +ocamldoc.opt -dump c.odoc c.mli +ocamldoc.opt -dump d.odoc d.mli +ocamldoc.opt -dump e.odoc e.mli +ocamldoc.opt -dump f.odoc f.mli +rm -rf proj.docdir +mkdir -p proj.docdir +ocamldoc.opt -load a.odoc -load b.odoc -load c.odoc -load d.odoc -load e.odoc -load f.odoc -html -d proj.docdir +[cache hit] ocamldep.opt -modules a.mli > a.mli.depends +[cache hit] ocamlc.opt -c -o a.cmi a.mli +[cache hit] ocamldep.opt -modules a.ml > a.ml.depends +[cache hit] ocamldep.opt -modules b.mli > b.mli.depends +[cache hit] ocamlc.opt -c -o b.cmi b.mli +[cache hit] ocamlc.opt -c -o a.cmo a.ml +[cache hit] ocamldep.opt -modules b.ml > b.ml.depends +[cache hit] ocamldep.opt -modules c.mli > c.mli.depends +[cache hit] ocamlc.opt -c -o c.cmi c.mli +[cache hit] ocamlc.opt -c -o b.cmo b.ml +[cache hit] ocamldep.opt -modules c.ml > c.ml.depends +[cache hit] ocamldep.opt -modules d.mli > d.mli.depends +[cache hit] ocamlc.opt -c -o d.cmi d.mli +[cache hit] ocamlc.opt -c -o c.cmo c.ml +[cache hit] ocamldep.opt -modules d.ml > d.ml.depends +[cache hit] ocamldep.opt -modules e.mli > e.mli.depends +[cache hit] ocamlc.opt -c -o e.cmi e.mli +[cache hit] ocamlc.opt -c -o d.cmo d.ml +[cache hit] ocamldep.opt -modules e.ml > e.ml.depends +[cache hit] ocamldep.opt -modules f.mli > f.mli.depends +[cache hit] ocamlc.opt -c -o f.cmi f.mli +[cache hit] ocamlc.opt -c -o e.cmo e.ml +[cache hit] ocamldep.opt -modules f.ml > f.ml.depends +[cache hit] ocamlc.opt -c -o f.cmo f.ml +[cache hit] ocamlc.opt unix.cma f.cmo e.cmo d.cmo c.cmo b.cmo a.cmo -o a.byte +[cache hit] ocamlopt.opt -c -o f.cmx f.ml +[cache hit] ocamlopt.opt -c -o e.cmx e.ml +[cache hit] ocamlopt.opt -c -o d.cmx d.ml +[cache hit] ocamlopt.opt -c -o c.cmx c.ml +[cache hit] ocamlopt.opt -c -o b.cmx b.ml +[cache hit] ocamlopt.opt -c -o a.cmx a.ml +[cache hit] ocamlopt.opt unix.cmxa f.cmx e.cmx d.cmx c.cmx b.cmx a.cmx -o a.native +[cache hit] ocamldoc.opt -dump a.odoc a.mli +[cache hit] ocamldoc.opt -dump b.odoc b.mli +[cache hit] ocamldoc.opt -dump c.odoc c.mli +[cache hit] ocamldoc.opt -dump d.odoc d.mli +[cache hit] ocamldoc.opt -dump e.odoc e.mli +[cache hit] ocamldoc.opt -dump f.odoc f.mli +[cache hit] rm -rf proj.docdir +[cache hit] mkdir -p proj.docdir +[cache hit] ocamldoc.opt -load a.odoc -load b.odoc -load c.odoc -load d.odoc -load e.odoc -load f.odoc -html -d proj.docdir + _____ _ _ _ +|_ _|__ ___| |_| || | + | |/ _ \/ __| __| || |_ + | | __/\__ \ |_|__ _| + |_|\___||___/\__| |_| + +aa.mli.depends +aa.mli +aa.ml.depends +bb.ml.depends +bb.ml +aa.ml +aa.byte +bb.ml +aa.ml +aa.native +[cache hit] aa.mli.depends +[cache hit] aa.mli +[cache hit] aa.ml.depends +[cache hit] bb.ml.depends +[cache hit] bb.ml +[cache hit] aa.ml +[cache hit] aa.byte +[cache hit] bb.ml +[cache hit] aa.ml +[cache hit] aa.native + _____ _ ____ +|_ _|__ ___| |_| ___| + | |/ _ \/ __| __|___ \ + | | __/\__ \ |_ ___) | + |_|\___||___/\__|____/ + +ocamldep.opt -modules d.ml > d.ml.depends +ocamldep.opt -modules a.mli > a.mli.depends +ocamlc.opt -c -o a.cmi a.mli +ocamldep.opt -modules a.ml > a.ml.depends +ocamldep.opt -modules stack.ml > stack.ml.depends +ocamlc.opt -c -o stack.cmo stack.ml +ocamldep.opt -modules b.ml > b.ml.depends +ocamlc.opt -c -o a.cmo a.ml +ocamlc.opt -c -o b.cmo b.ml +ocamlc.opt -pack a.cmo b.cmo -o c.cmo +ocamlc.opt -c -o d.cmo d.ml +ocamlc.opt stack.cmo c.cmo d.cmo -o d.byte ++ /home/danmey/src/ocaml-trunk/bin/ocamlc.opt stack.cmo c.cmo d.cmo -o d.byte +File "stack.cmo", line 1: +Warning 31: files stack.cmo and /home/danmey/src/ocaml-trunk/lib/ocaml/stdlib.cma(Stack) both define a module named Stack +ocamlopt.opt -c -o stack.cmx stack.ml +ocamlopt.opt -c -for-pack C -o a.cmx a.ml +ocamlopt.opt -c -for-pack C -o b.cmx b.ml +ocamlopt.opt -pack a.cmx b.cmx -o c.cmx ; then rm -f c.mli ; else rm -f c.mli ; exit 1; fi +ocamlopt.opt -c -o d.cmx d.ml +ocamlopt.opt stack.cmx c.cmx d.cmx -o d.native +[cache hit] ocamldep.opt -modules d.ml > d.ml.depends +[cache hit] ocamldep.opt -modules a.mli > a.mli.depends +[cache hit] ocamlc.opt -c -o a.cmi a.mli +[cache hit] ocamldep.opt -modules a.ml > a.ml.depends +[cache hit] ocamldep.opt -modules stack.ml > stack.ml.depends +[cache hit] ocamlc.opt -c -o stack.cmo stack.ml +[cache hit] ocamlc.opt -c -o a.cmo a.ml +[cache hit] ocamldep.opt -modules b.ml > b.ml.depends +[cache hit] ocamlc.opt -c -o b.cmo b.ml +[cache hit] ocamlc.opt -pack a.cmo b.cmo -o c.cmo +[cache hit] ocamlc.opt -c -o d.cmo d.ml +[cache hit] ocamlc.opt stack.cmo c.cmo d.cmo -o d.byte +[cache hit] ocamlopt.opt -c -o stack.cmx stack.ml +[cache hit] ocamlopt.opt -c -for-pack C -o a.cmx a.ml +[cache hit] ocamlopt.opt -c -for-pack C -o b.cmx b.ml +[cache hit] ocamlopt.opt -pack a.cmx b.cmx -o c.cmx ; then rm -f c.mli ; else rm -f c.mli ; exit 1; fi +[cache hit] ocamlopt.opt -c -o d.cmx d.ml +[cache hit] ocamlopt.opt stack.cmx c.cmx d.cmx -o d.native + _____ _ __ +|_ _|__ ___| |_ / /_ + | |/ _ \/ __| __| '_ \ + | | __/\__ \ |_| (_) | + |_|\___||___/\__|\___/ + +ocamldep.opt -modules main.mli > main.mli.depends +ocamlc.opt -c -o main.cmi main.mli +ocamldep.opt -modules main.ml > main.ml.depends +ocamldep.opt -modules a.mli > a.mli.depends +ocamldep.opt -modules d.mli > d.mli.depends +ocamlc.opt -c -o a.cmi a.mli +ocamlc.opt -c -o d.cmi d.mli +ocamlc.opt -c -o main.cmo main.ml +ocamldep.opt -modules a.ml > a.ml.depends +ocamldep.opt -modules b.mli > b.mli.depends +ocamlc.opt -c -o b.cmi b.mli +ocamldep.opt -modules d.ml > d.ml.depends +ocamlc.opt -c -o a.cmo a.ml +ocamlc.opt -c -o d.cmo d.ml +ocamldep.opt -modules b.ml > b.ml.depends +ocamlc.opt -c -o b.cmo b.ml +ocamlc.opt d.cmo b.cmo a.cmo main.cmo -o main.byte +[cache hit] ocamldep.opt -modules main.mli > main.mli.depends +[cache hit] ocamlc.opt -c -o main.cmi main.mli +[cache hit] ocamldep.opt -modules main.ml > main.ml.depends +[cache hit] ocamldep.opt -modules a.mli > a.mli.depends +[cache hit] ocamlc.opt -c -o a.cmi a.mli +[cache hit] ocamldep.opt -modules d.mli > d.mli.depends +[cache hit] ocamlc.opt -c -o d.cmi d.mli +[cache hit] ocamlc.opt -c -o main.cmo main.ml +[cache hit] ocamldep.opt -modules a.ml > a.ml.depends +[cache hit] ocamldep.opt -modules b.mli > b.mli.depends +[cache hit] ocamlc.opt -c -o b.cmi b.mli +[cache hit] ocamlc.opt -c -o a.cmo a.ml +[cache hit] ocamldep.opt -modules d.ml > d.ml.depends +[cache hit] ocamlc.opt -c -o d.cmo d.ml +[cache hit] ocamldep.opt -modules b.ml > b.ml.depends +[cache hit] ocamlc.opt -c -o b.cmo b.ml +[cache hit] ocamlc.opt d.cmo b.cmo a.cmo main.cmo -o main.byte +ocamldep.opt -modules d.mli > d.mli.depends +ocamlc.opt -c -o d.cmi d.mli +ocamlc.opt -c -o main.cmo main.ml +ocamldep.opt -modules b.mli > b.mli.depends ++ /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules b.mli > b.mli.depends +File "b.mli", line 13, characters 0-2: +Error: Syntax error +Command exited with code 2. +ocamldep.opt -modules b.mli > b.mli.depends +ocamlc.opt -c -o b.cmi b.mli +ocamlc.opt -c -o d.cmo d.ml +ocamlc.opt -c -o b.cmo b.ml +ocamlc.opt d.cmo b.cmo a.cmo main.cmo -o main.byte +[cache hit] ocamldep.opt -modules main.mli > main.mli.depends +[cache hit] ocamlc.opt -c -o main.cmi main.mli +[cache hit] ocamldep.opt -modules main.ml > main.ml.depends +[cache hit] ocamldep.opt -modules a.mli > a.mli.depends +[cache hit] ocamlc.opt -c -o a.cmi a.mli +[cache hit] ocamldep.opt -modules d.mli > d.mli.depends +[cache hit] ocamlc.opt -c -o d.cmi d.mli +[cache hit] ocamlc.opt -c -o main.cmo main.ml +[cache hit] ocamldep.opt -modules a.ml > a.ml.depends +[cache hit] ocamldep.opt -modules b.mli > b.mli.depends +[cache hit] ocamlc.opt -c -o b.cmi b.mli +[cache hit] ocamlc.opt -c -o a.cmo a.ml +[cache hit] ocamldep.opt -modules d.ml > d.ml.depends +[cache hit] ocamlc.opt -c -o d.cmo d.ml +[cache hit] ocamldep.opt -modules b.ml > b.ml.depends +[cache hit] ocamlc.opt -c -o b.cmo b.ml +[cache hit] ocamlc.opt d.cmo b.cmo a.cmo main.cmo -o main.byte +PASS + _____ _ _____ +|_ _|__ ___| ||___ | + | |/ _ \/ __| __| / / + | | __/\__ \ |_ / / + |_|\___||___/\__/_/ + +ocamlbuild.cmx -o myocamlbuild +/home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules bb.mli > bb.mli.depends +/home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o bb.cmi bb.mli +/home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules bb.ml > bb.ml.depends +/home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules cc.ml > cc.ml.depends +/home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules aa.ml > aa.ml.depends +/home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules c2.mli > c2.mli.depends +/home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o aa.cmo aa.ml +/home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o c2.cmi c2.mli +/home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o bb.cmo bb.ml +/home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o cc.cmo cc.ml +/home/danmey/src/ocaml-trunk/bin/ocamlc.opt -a bb.cmo cc.cmo -o bbcc.cma +/home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules main.ml > main.ml.depends +/home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules c3.ml > c3.ml.depends +/home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o c3.cmo c3.ml +/home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o main.cmo main.ml +/home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules cool_plugin.ml > cool_plugin.ml.depends +/home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o cool_plugin.cmo cool_plugin.ml +/home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules c2.ml > c2.ml.depends +/home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o c2.cmo c2.ml +/home/danmey/src/ocaml-trunk/bin/ocamlc.opt aa.cmo c2.cmo bbcc.cma c3.cmo main.cmo cool_plugin.cmo -o main.byte +/home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o bb.cmx bb.ml +/home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o aa.cmx aa.ml +/home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o c2.cmx c2.ml +/home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o cc.cmx cc.ml +/home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -a bb.cmx cc.cmx -o bbcc.cmxa +/home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o c3.cmx c3.ml +/home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o main.cmx main.ml +/home/danmey/src/ocaml-trunk/bin/ocamlopt.opt aa.cmx c2.cmx bbcc.cmxa c3.cmx main.cmx -o main.native +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules bb.mli > bb.mli.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o bb.cmi bb.mli +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules bb.ml > bb.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o bb.cmo bb.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules cc.ml > cc.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules aa.ml > aa.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o aa.cmo aa.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules c2.mli > c2.mli.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o c2.cmi c2.mli +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o cc.cmo cc.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -a bb.cmo cc.cmo -o bbcc.cma +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules main.ml > main.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules c3.ml > c3.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o c3.cmo c3.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o main.cmo main.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules cool_plugin.ml > cool_plugin.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o cool_plugin.cmo cool_plugin.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules c2.ml > c2.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o c2.cmo c2.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt aa.cmo c2.cmo bbcc.cma c3.cmo main.cmo cool_plugin.cmo -o main.byte +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o bb.cmx bb.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o aa.cmx aa.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o c2.cmx c2.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o cc.cmx cc.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -a bb.cmx cc.cmx -o bbcc.cmxa +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o c3.cmx c3.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o main.cmx main.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt aa.cmx c2.cmx bbcc.cmxa c3.cmx main.cmx -o main.native +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules bb.mli > bb.mli.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o bb.cmi bb.mli +/home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules bb.ml > bb.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules cc.ml > cc.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules aa.ml > aa.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o aa.cmo aa.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules c2.mli > c2.mli.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o c2.cmi c2.mli +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o cc.cmo cc.ml +/home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o bb.cmo bb.ml +/home/danmey/src/ocaml-trunk/bin/ocamlc.opt -a bb.cmo cc.cmo -o bbcc.cma +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules main.ml > main.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules c3.ml > c3.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o c3.cmo c3.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o main.cmo main.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules cool_plugin.ml > cool_plugin.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o cool_plugin.cmo cool_plugin.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules c2.ml > c2.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o c2.cmo c2.ml +/home/danmey/src/ocaml-trunk/bin/ocamlc.opt aa.cmo c2.cmo bbcc.cma c3.cmo main.cmo cool_plugin.cmo -o main.byte +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o aa.cmx aa.ml +/home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o bb.cmx bb.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o c2.cmx c2.ml +/home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o cc.cmx cc.ml +/home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -a bb.cmx cc.cmx -o bbcc.cmxa +/home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o c3.cmx c3.ml +/home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o main.cmx main.ml +/home/danmey/src/ocaml-trunk/bin/ocamlopt.opt aa.cmx c2.cmx bbcc.cmxa c3.cmx main.cmx -o main.native +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules bb.mli > bb.mli.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o bb.cmi bb.mli +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules bb.ml > bb.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o bb.cmo bb.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules cc.ml > cc.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules aa.ml > aa.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o aa.cmo aa.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules c2.mli > c2.mli.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o c2.cmi c2.mli +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o cc.cmo cc.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -a bb.cmo cc.cmo -o bbcc.cma +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules main.ml > main.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules c3.ml > c3.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o c3.cmo c3.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o main.cmo main.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules cool_plugin.ml > cool_plugin.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o cool_plugin.cmo cool_plugin.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules c2.ml > c2.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o c2.cmo c2.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt aa.cmo c2.cmo bbcc.cma c3.cmo main.cmo cool_plugin.cmo -o main.byte +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o bb.cmx bb.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o aa.cmx aa.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o c2.cmx c2.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o cc.cmx cc.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -a bb.cmx cc.cmx -o bbcc.cmxa +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o c3.cmx c3.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o main.cmx main.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt aa.cmx c2.cmx bbcc.cmxa c3.cmx main.cmx -o main.native +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules bb.mli > bb.mli.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o bb.cmi bb.mli +/home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules bb.ml > bb.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules cc.ml > cc.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules aa.ml > aa.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o aa.cmo aa.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules c2.mli > c2.mli.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o c2.cmi c2.mli +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o cc.cmo cc.ml +/home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o bb.cmo bb.ml +/home/danmey/src/ocaml-trunk/bin/ocamlc.opt -a bb.cmo cc.cmo -o bbcc.cma +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules main.ml > main.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules c3.ml > c3.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o c3.cmo c3.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o main.cmo main.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules cool_plugin.ml > cool_plugin.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o cool_plugin.cmo cool_plugin.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules c2.ml > c2.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o c2.cmo c2.ml +/home/danmey/src/ocaml-trunk/bin/ocamlc.opt aa.cmo c2.cmo bbcc.cma c3.cmo main.cmo cool_plugin.cmo -o main.byte +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o aa.cmx aa.ml +/home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o bb.cmx bb.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o c2.cmx c2.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o cc.cmx cc.ml +/home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -a bb.cmx cc.cmx -o bbcc.cmxa +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o c3.cmx c3.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o main.cmx main.ml +/home/danmey/src/ocaml-trunk/bin/ocamlopt.opt aa.cmx c2.cmx bbcc.cmxa c3.cmx main.cmx -o main.native +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules bb.mli > bb.mli.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o bb.cmi bb.mli +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules bb.ml > bb.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o bb.cmo bb.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules cc.ml > cc.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules aa.ml > aa.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o aa.cmo aa.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules c2.mli > c2.mli.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o c2.cmi c2.mli +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o cc.cmo cc.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -a bb.cmo cc.cmo -o bbcc.cma +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules main.ml > main.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules c3.ml > c3.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o c3.cmo c3.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o main.cmo main.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules cool_plugin.ml > cool_plugin.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o cool_plugin.cmo cool_plugin.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules c2.ml > c2.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o c2.cmo c2.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt aa.cmo c2.cmo bbcc.cma c3.cmo main.cmo cool_plugin.cmo -o main.byte +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o bb.cmx bb.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o aa.cmx aa.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o c2.cmx c2.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o cc.cmx cc.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -a bb.cmx cc.cmx -o bbcc.cmxa +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o c3.cmx c3.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o main.cmx main.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt aa.cmx c2.cmx bbcc.cmxa c3.cmx main.cmx -o main.native + _____ _ ___ +|_ _|__ ___| |_( _ ) + | |/ _ \/ __| __/ _ \ + | | __/\__ \ || (_) | + |_|\___||___/\__\___/ + +ocamlbuild.cmx -o myocamlbuild +/home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules a.ml > a.ml.depends +/home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules myconfig.ml > myconfig.ml.depends +/home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o myconfig.cmo myconfig.ml +/home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o a.cmo a.ml +/home/danmey/src/ocaml-trunk/bin/ocamlc.opt myconfig.cmo a.cmo -o a.byte +/home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o myconfig.cmx myconfig.ml +/home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o a.cmx a.ml +/home/danmey/src/ocaml-trunk/bin/ocamlopt.opt myconfig.cmx a.cmx -o a.native +cp -p a.byte a +cp -p a.native a.opt +cp -p a.byte bin/a.byte +cp -p bin/a.byte bin/a +cp -p a.native bin/a.native +cp -p bin/a.native bin/a.opt +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules a.ml > a.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules myconfig.ml > myconfig.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o myconfig.cmo myconfig.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -o a.cmo a.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt myconfig.cmo a.cmo -o a.byte +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o myconfig.cmx myconfig.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -o a.cmx a.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt myconfig.cmx a.cmx -o a.native +[cache hit] cp -p a.byte a +[cache hit] cp -p a.native a.opt +[cache hit] cp -p a.byte bin/a.byte +[cache hit] cp -p bin/a.byte bin/a +[cache hit] cp -p a.native bin/a.native +[cache hit] cp -p bin/a.native bin/a.opt + _____ _ ___ +|_ _|__ ___| |_ / _ \ + | |/ _ \/ __| __| (_) | + | | __/\__ \ |_ \__, | + |_|\___||___/\__| /_/ + +Globexp for "\"hello\"" OK +Globexp for "<hello>" OK +Globexp for "<hel*lo>" OK +Globexp for "<a> and <b> or <c>" OK +Globexp for "<a> titi" OK +Glob.eval "<[a]>" "a" = true OK +Glob.eval "<[a]>" "b" = false OK +Glob.eval "<[a]>" "a" = true OK +Glob.eval "<[a]>" "b" = false OK +Glob.eval "<[a]>" "a" = true OK +Glob.eval "<[a]>" "b" = false OK +Glob.eval "<[a-z]>" "a" = true OK +Glob.eval "<[a-z]>" "e" = true OK +Glob.eval "<[a-z]>" "k" = true OK +Glob.eval "<[a-z]>" "z" = true OK +Glob.eval "<[a-z]>" "0" = false OK +Glob.eval "<[a-z]>" "A" = false OK +Glob.eval "<[a-z]>" "~" = false OK +Glob.eval "<[a-z]>" "a" = true OK +Glob.eval "<[a-z]>" "e" = true OK +Glob.eval "<[a-z]>" "k" = true OK +Glob.eval "<[a-z]>" "z" = true OK +Glob.eval "<[a-z]>" "0" = false OK +Glob.eval "<[a-z]>" "A" = false OK +Glob.eval "<[a-z]>" "~" = false OK +Glob.eval "<[a-z]>" "a" = true OK +Glob.eval "<[a-z]>" "e" = true OK +Glob.eval "<[a-z]>" "k" = true OK +Glob.eval "<[a-z]>" "z" = true OK +Glob.eval "<[a-z]>" "0" = false OK +Glob.eval "<[a-z]>" "A" = false OK +Glob.eval "<[a-z]>" "~" = false OK +Glob.eval "<[a-z][0-9]>" "a0" = true OK +Glob.eval "<[a-z][0-9]>" "b9" = true OK +Glob.eval "<[a-z][0-9]>" "a00" = false OK +Glob.eval "<[a-z][0-9]>" "a0a" = false OK +Glob.eval "<[a-z][0-9]>" "b0a" = false OK +Glob.eval "<[a-z][0-9]>" "isduis" = false OK +Glob.eval "<[a-z][0-9]>" "" = false OK +Glob.eval "<[a-z][0-9]>" "a0" = true OK +Glob.eval "<[a-z][0-9]>" "b9" = true OK +Glob.eval "<[a-z][0-9]>" "a00" = false OK +Glob.eval "<[a-z][0-9]>" "a0a" = false OK +Glob.eval "<[a-z][0-9]>" "b0a" = false OK +Glob.eval "<[a-z][0-9]>" "isduis" = false OK +Glob.eval "<[a-z][0-9]>" "" = false OK +Glob.eval "<[a-z][0-9]>" "a0" = true OK +Glob.eval "<[a-z][0-9]>" "b9" = true OK +Glob.eval "<[a-z][0-9]>" "a00" = false OK +Glob.eval "<[a-z][0-9]>" "a0a" = false OK +Glob.eval "<[a-z][0-9]>" "b0a" = false OK +Glob.eval "<[a-z][0-9]>" "isduis" = false OK +Glob.eval "<[a-z][0-9]>" "" = false OK +Glob.eval "<hello>" "hello" = true OK +Glob.eval "<hello>" "helli" = false OK +Glob.eval "<hello>" "hello" = true OK +Glob.eval "<hello>" "helli" = false OK +Glob.eval "<hello>" "hello" = true OK +Glob.eval "<hello>" "helli" = false OK +Glob.eval "\"hello\"" "hello" = true OK +Glob.eval "\"hello\"" "heidi" = false OK +Glob.eval "\"hello\"" "hello" = true OK +Glob.eval "\"hello\"" "heidi" = false OK +Glob.eval "\"hello\"" "hello" = true OK +Glob.eval "\"hello\"" "heidi" = false OK +Glob.eval "<*>" "" = true OK +Glob.eval "<*>" "a" = true OK +Glob.eval "<*>" "ax" = true OK +Glob.eval "<*>" "" = true OK +Glob.eval "<*>" "a" = true OK +Glob.eval "<*>" "ax" = true OK +Glob.eval "<*>" "" = true OK +Glob.eval "<*>" "a" = true OK +Glob.eval "<*>" "ax" = true OK +Glob.eval "<a*b>" "ab" = true OK +Glob.eval "<a*b>" "acb" = true OK +Glob.eval "<a*b>" "axxxxxb" = true OK +Glob.eval "<a*b>" "ababbababb" = true OK +Glob.eval "<a*b>" "abx" = false OK +Glob.eval "<a*b>" "xxxxxab" = false OK +Glob.eval "<a*b>" "xab" = false OK +Glob.eval "<a*b>" "ab" = true OK +Glob.eval "<a*b>" "acb" = true OK +Glob.eval "<a*b>" "axxxxxb" = true OK +Glob.eval "<a*b>" "ababbababb" = true OK +Glob.eval "<a*b>" "abx" = false OK +Glob.eval "<a*b>" "xxxxxab" = false OK +Glob.eval "<a*b>" "xab" = false OK +Glob.eval "<a*b>" "ab" = true OK +Glob.eval "<a*b>" "acb" = true OK +Glob.eval "<a*b>" "axxxxxb" = true OK +Glob.eval "<a*b>" "ababbababb" = true OK +Glob.eval "<a*b>" "abx" = false OK +Glob.eval "<a*b>" "xxxxxab" = false OK +Glob.eval "<a*b>" "xab" = false OK +Glob.eval "<*.ml>" "hello.ml" = true OK +Glob.eval "<*.ml>" ".ml" = true OK +Glob.eval "<*.ml>" "ml" = false OK +Glob.eval "<*.ml>" "" = false OK +Glob.eval "<*.ml>" "toto.mli" = false OK +Glob.eval "<*.ml>" "hello.ml" = true OK +Glob.eval "<*.ml>" ".ml" = true OK +Glob.eval "<*.ml>" "ml" = false OK +Glob.eval "<*.ml>" "" = false OK +Glob.eval "<*.ml>" "toto.mli" = false OK +Glob.eval "<*.ml>" "hello.ml" = true OK +Glob.eval "<*.ml>" ".ml" = true OK +Glob.eval "<*.ml>" "ml" = false OK +Glob.eval "<*.ml>" "" = false OK +Glob.eval "<*.ml>" "toto.mli" = false OK +Glob.eval "<a>" "a" = true OK +Glob.eval "<a>" "" = false OK +Glob.eval "<a>" "aa" = false OK +Glob.eval "<a>" "ba" = false OK +Glob.eval "<a>" "ab" = false OK +Glob.eval "<a>" "abaa" = false OK +Glob.eval "<a>" "a" = true OK +Glob.eval "<a>" "" = false OK +Glob.eval "<a>" "aa" = false OK +Glob.eval "<a>" "ba" = false OK +Glob.eval "<a>" "ab" = false OK +Glob.eval "<a>" "abaa" = false OK +Glob.eval "<a>" "a" = true OK +Glob.eval "<a>" "" = false OK +Glob.eval "<a>" "aa" = false OK +Glob.eval "<a>" "ba" = false OK +Glob.eval "<a>" "ab" = false OK +Glob.eval "<a>" "abaa" = false OK +Glob.eval "<ab>" "ab" = true OK +Glob.eval "<ab>" "" = false OK +Glob.eval "<ab>" "abab" = false OK +Glob.eval "<ab>" "aba" = false OK +Glob.eval "<ab>" "abx" = false OK +Glob.eval "<ab>" "ab" = true OK +Glob.eval "<ab>" "" = false OK +Glob.eval "<ab>" "abab" = false OK +Glob.eval "<ab>" "aba" = false OK +Glob.eval "<ab>" "abx" = false OK +Glob.eval "<ab>" "ab" = true OK +Glob.eval "<ab>" "" = false OK +Glob.eval "<ab>" "abab" = false OK +Glob.eval "<ab>" "aba" = false OK +Glob.eval "<ab>" "abx" = false OK +Glob.eval "<ab?c>" "abac" = true OK +Glob.eval "<ab?c>" "abxc" = true OK +Glob.eval "<ab?c>" "abab" = false OK +Glob.eval "<ab?c>" "ababab" = false OK +Glob.eval "<ab?c>" "ababa" = false OK +Glob.eval "<ab?c>" "abac" = true OK +Glob.eval "<ab?c>" "abxc" = true OK +Glob.eval "<ab?c>" "abab" = false OK +Glob.eval "<ab?c>" "ababab" = false OK +Glob.eval "<ab?c>" "ababa" = false OK +Glob.eval "<ab?c>" "abac" = true OK +Glob.eval "<ab?c>" "abxc" = true OK +Glob.eval "<ab?c>" "abab" = false OK +Glob.eval "<ab?c>" "ababab" = false OK +Glob.eval "<ab?c>" "ababa" = false OK +Glob.eval "<*ab?cd*>" "123abecd345" = true OK +Glob.eval "<*ab?cd*>" "abccd" = true OK +Glob.eval "<*ab?cd*>" "abccd345" = true OK +Glob.eval "<*ab?cd*>" "ababcababccdab" = true OK +Glob.eval "<*ab?cd*>" "abcd" = false OK +Glob.eval "<*ab?cd*>" "aaaaabcdababcd" = false OK +Glob.eval "<*ab?cd*>" "123abecd345" = true OK +Glob.eval "<*ab?cd*>" "abccd" = true OK +Glob.eval "<*ab?cd*>" "abccd345" = true OK +Glob.eval "<*ab?cd*>" "ababcababccdab" = true OK +Glob.eval "<*ab?cd*>" "abcd" = false OK +Glob.eval "<*ab?cd*>" "aaaaabcdababcd" = false OK +Glob.eval "<*ab?cd*>" "123abecd345" = true OK +Glob.eval "<*ab?cd*>" "abccd" = true OK +Glob.eval "<*ab?cd*>" "abccd345" = true OK +Glob.eval "<*ab?cd*>" "ababcababccdab" = true OK +Glob.eval "<*ab?cd*>" "abcd" = false OK +Glob.eval "<*ab?cd*>" "aaaaabcdababcd" = false OK +Glob.eval "<*this*is*a*test*>" "this is a test" = true OK +Glob.eval "<*this*is*a*test*>" "You know this is a test really" = true OK +Glob.eval "<*this*is*a*test*>" "thisisatest" = true OK +Glob.eval "<*this*is*a*test*>" "thisatest" = false OK +Glob.eval "<*this*is*a*test*>" "this is a test" = true OK +Glob.eval "<*this*is*a*test*>" "You know this is a test really" = true OK +Glob.eval "<*this*is*a*test*>" "thisisatest" = true OK +Glob.eval "<*this*is*a*test*>" "thisatest" = false OK +Glob.eval "<*this*is*a*test*>" "this is a test" = true OK +Glob.eval "<*this*is*a*test*>" "You know this is a test really" = true OK +Glob.eval "<*this*is*a*test*>" "thisisatest" = true OK +Glob.eval "<*this*is*a*test*>" "thisatest" = false OK +Glob.eval "<b*>" "bxx" = true OK +Glob.eval "<b*>" "bx" = true OK +Glob.eval "<b*>" "aaab" = false OK +Glob.eval "<b*>" "" = false OK +Glob.eval "<b*>" "bxx" = true OK +Glob.eval "<b*>" "bx" = true OK +Glob.eval "<b*>" "aaab" = false OK +Glob.eval "<b*>" "" = false OK +Glob.eval "<b*>" "bxx" = true OK +Glob.eval "<b*>" "bx" = true OK +Glob.eval "<b*>" "aaab" = false OK +Glob.eval "<b*>" "" = false OK +Glob.eval "<*>" "" = true OK +Glob.eval "<*>" "a" = true OK +Glob.eval "<*>" "aaa" = true OK +Glob.eval "<*>" "aaaaa" = true OK +Glob.eval "<*>" "" = true OK +Glob.eval "<*>" "a" = true OK +Glob.eval "<*>" "aaa" = true OK +Glob.eval "<*>" "aaaaa" = true OK +Glob.eval "<*>" "" = true OK +Glob.eval "<*>" "a" = true OK +Glob.eval "<*>" "aaa" = true OK +Glob.eval "<*>" "aaaaa" = true OK +Glob.eval "<?>" "a" = true OK +Glob.eval "<?>" "" = false OK +Glob.eval "<?>" "aaa" = false OK +Glob.eval "<?>" "aaaaa" = false OK +Glob.eval "<?>" "a" = true OK +Glob.eval "<?>" "" = false OK +Glob.eval "<?>" "aaa" = false OK +Glob.eval "<?>" "aaaaa" = false OK +Glob.eval "<?>" "a" = true OK +Glob.eval "<?>" "" = false OK +Glob.eval "<?>" "aaa" = false OK +Glob.eval "<?>" "aaaaa" = false OK +Glob.eval "<{a,b}>" "a" = true OK +Glob.eval "<{a,b}>" "b" = true OK +Glob.eval "<{a,b}>" "" = false OK +Glob.eval "<{a,b}>" "aa" = false OK +Glob.eval "<{a,b}>" "ab" = false OK +Glob.eval "<{a,b}>" "ba" = false OK +Glob.eval "<{a,b}>" "bb" = false OK +Glob.eval "<{a,b}>" "c" = false OK +Glob.eval "<{a,b}>" "a" = true OK +Glob.eval "<{a,b}>" "b" = true OK +Glob.eval "<{a,b}>" "" = false OK +Glob.eval "<{a,b}>" "aa" = false OK +Glob.eval "<{a,b}>" "ab" = false OK +Glob.eval "<{a,b}>" "ba" = false OK +Glob.eval "<{a,b}>" "bb" = false OK +Glob.eval "<{a,b}>" "c" = false OK +Glob.eval "<{a,b}>" "a" = true OK +Glob.eval "<{a,b}>" "b" = true OK +Glob.eval "<{a,b}>" "" = false OK +Glob.eval "<{a,b}>" "aa" = false OK +Glob.eval "<{a,b}>" "ab" = false OK +Glob.eval "<{a,b}>" "ba" = false OK +Glob.eval "<{a,b}>" "bb" = false OK +Glob.eval "<{a,b}>" "c" = false OK +Glob.eval "<toto.{ml,mli}>" "toto.ml" = true OK +Glob.eval "<toto.{ml,mli}>" "toto.mli" = true OK +Glob.eval "<toto.{ml,mli}>" "toto." = false OK +Glob.eval "<toto.{ml,mli}>" "toto.mll" = false OK +Glob.eval "<toto.{ml,mli}>" "toto.ml" = true OK +Glob.eval "<toto.{ml,mli}>" "toto.mli" = true OK +Glob.eval "<toto.{ml,mli}>" "toto." = false OK +Glob.eval "<toto.{ml,mli}>" "toto.mll" = false OK +Glob.eval "<toto.{ml,mli}>" "toto.ml" = true OK +Glob.eval "<toto.{ml,mli}>" "toto.mli" = true OK +Glob.eval "<toto.{ml,mli}>" "toto." = false OK +Glob.eval "<toto.{ml,mli}>" "toto.mll" = false OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "acf" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "acg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "adf" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "adg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "aef" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "aeg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bcf" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bcg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bdf" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bdg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bef" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "beg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "afg" = false OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "af" = false OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "aee" = false OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "acf" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "acg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "adf" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "adg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "aef" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "aeg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bcf" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bcg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bdf" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bdg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bef" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "beg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "afg" = false OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "af" = false OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "aee" = false OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "acf" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "acg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "adf" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "adg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "aef" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "aeg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bcf" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bcg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bdf" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bdg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bef" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "beg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "afg" = false OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "af" = false OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "aee" = false OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "a.ml" = true OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "b.ml" = true OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "a.mli" = true OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "hello.ml" = false OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "a.mli.x" = false OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "a.ml" = true OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "b.ml" = true OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "a.mli" = true OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "hello.ml" = false OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "a.mli.x" = false OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "a.ml" = true OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "b.ml" = true OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "a.mli" = true OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "hello.ml" = false OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "a.mli.x" = false OK +Glob.eval "<*>" "alpha" = true OK +Glob.eval "<*>" "beta" = true OK +Glob.eval "<*>" "alpha/beta" = false OK +Glob.eval "<*>" "gamma/delta" = false OK +Glob.eval "<*>" "alpha" = true OK +Glob.eval "<*>" "beta" = true OK +Glob.eval "<*>" "alpha/beta" = false OK +Glob.eval "<*>" "gamma/delta" = false OK +Glob.eval "<*>" "alpha" = true OK +Glob.eval "<*>" "beta" = true OK +Glob.eval "<*>" "alpha/beta" = false OK +Glob.eval "<*>" "gamma/delta" = false OK +Glob.eval "<alpha/**/beta>" "alpha/beta" = true OK +Glob.eval "<alpha/**/beta>" "alpha/gamma/beta" = true OK +Glob.eval "<alpha/**/beta>" "alpha/gamma/delta/beta" = true OK +Glob.eval "<alpha/**/beta>" "alpha" = false OK +Glob.eval "<alpha/**/beta>" "beta" = false OK +Glob.eval "<alpha/**/beta>" "gamma/delta" = false OK +Glob.eval "<alpha/**/beta>" "alpha/beta" = true OK +Glob.eval "<alpha/**/beta>" "alpha/gamma/beta" = true OK +Glob.eval "<alpha/**/beta>" "alpha/gamma/delta/beta" = true OK +Glob.eval "<alpha/**/beta>" "alpha" = false OK +Glob.eval "<alpha/**/beta>" "beta" = false OK +Glob.eval "<alpha/**/beta>" "gamma/delta" = false OK +Glob.eval "<alpha/**/beta>" "alpha/beta" = true OK +Glob.eval "<alpha/**/beta>" "alpha/gamma/beta" = true OK +Glob.eval "<alpha/**/beta>" "alpha/gamma/delta/beta" = true OK +Glob.eval "<alpha/**/beta>" "alpha" = false OK +Glob.eval "<alpha/**/beta>" "beta" = false OK +Glob.eval "<alpha/**/beta>" "gamma/delta" = false OK +Glob.eval "<**/*.ml>" "toto.ml" = true OK +Glob.eval "<**/*.ml>" "toto/tata.ml" = true OK +Glob.eval "<**/*.ml>" "alpha/gamma/delta/beta.ml" = true OK +Glob.eval "<**/*.ml>" "toto.mli" = false OK +Glob.eval "<**/*.ml>" "toto.ml" = true OK +Glob.eval "<**/*.ml>" "toto/tata.ml" = true OK +Glob.eval "<**/*.ml>" "alpha/gamma/delta/beta.ml" = true OK +Glob.eval "<**/*.ml>" "toto.mli" = false OK +Glob.eval "<**/*.ml>" "toto.ml" = true OK +Glob.eval "<**/*.ml>" "toto/tata.ml" = true OK +Glob.eval "<**/*.ml>" "alpha/gamma/delta/beta.ml" = true OK +Glob.eval "<**/*.ml>" "toto.mli" = false OK +Glob.eval "<toto/**>" "toto/" = true OK +Glob.eval "<toto/**>" "toto/tata" = true OK +Glob.eval "<toto/**>" "toto/alpha/gamma/delta/beta.ml" = true OK +Glob.eval "<toto/**>" "toto" = true OK +Glob.eval "<toto/**>" "toto2/tata" = false OK +Glob.eval "<toto/**>" "tata/titi" = false OK +Glob.eval "<toto/**>" "toto/" = true OK +Glob.eval "<toto/**>" "toto/tata" = true OK +Glob.eval "<toto/**>" "toto/alpha/gamma/delta/beta.ml" = true OK +Glob.eval "<toto/**>" "toto" = true OK +Glob.eval "<toto/**>" "toto2/tata" = false OK +Glob.eval "<toto/**>" "tata/titi" = false OK +Glob.eval "<toto/**>" "toto/" = true OK +Glob.eval "<toto/**>" "toto/tata" = true OK +Glob.eval "<toto/**>" "toto/alpha/gamma/delta/beta.ml" = true OK +Glob.eval "<toto/**>" "toto" = true OK +Glob.eval "<toto/**>" "toto2/tata" = false OK +Glob.eval "<toto/**>" "tata/titi" = false OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "libfoo.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "src/bar/libfoo.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "otherlibs/unix/libunix.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "otherlibsliblib/unlibix/libunix.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "libfoo/libbar.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "src/libfoo/boo/libbar.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "bar" = None OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "libbar/foo.a" = None OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "libfoo.b.a" = None OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "libfoo.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "src/bar/libfoo.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "otherlibs/unix/libunix.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "otherlibsliblib/unlibix/libunix.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "libfoo/libbar.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "src/libfoo/boo/libbar.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "bar" = None OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "libbar/foo.a" = None OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "libfoo.b.a" = None OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "libfoo.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "src/bar/libfoo.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "otherlibs/unix/libunix.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "otherlibsliblib/unlibix/libunix.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "libfoo/libbar.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "src/libfoo/boo/libbar.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "bar" = None OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "libbar/foo.a" = None OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "libfoo.b.a" = None OK + _____ _ _ ___ +|_ _|__ ___| |_/ |/ _ \ + | |/ _ \/ __| __| | | | | + | | __/\__ \ |_| | |_| | + |_|\___||___/\__|_|\___/ + +Globexp for "\"hello\"" OK +Globexp for "<hello>" OK +Globexp for "<hel*lo>" OK +Globexp for "<a> and <b> or <c>" OK +Globexp for "<a> titi" OK +Glob.eval "<[a]>" "a" = true OK +Glob.eval "<[a]>" "b" = false OK +Glob.eval "<[a]>" "a" = true OK +Glob.eval "<[a]>" "b" = false OK +Glob.eval "<[a]>" "a" = true OK +Glob.eval "<[a]>" "b" = false OK +Glob.eval "<[a-z]>" "a" = true OK +Glob.eval "<[a-z]>" "e" = true OK +Glob.eval "<[a-z]>" "k" = true OK +Glob.eval "<[a-z]>" "z" = true OK +Glob.eval "<[a-z]>" "0" = false OK +Glob.eval "<[a-z]>" "A" = false OK +Glob.eval "<[a-z]>" "~" = false OK +Glob.eval "<[a-z]>" "a" = true OK +Glob.eval "<[a-z]>" "e" = true OK +Glob.eval "<[a-z]>" "k" = true OK +Glob.eval "<[a-z]>" "z" = true OK +Glob.eval "<[a-z]>" "0" = false OK +Glob.eval "<[a-z]>" "A" = false OK +Glob.eval "<[a-z]>" "~" = false OK +Glob.eval "<[a-z]>" "a" = true OK +Glob.eval "<[a-z]>" "e" = true OK +Glob.eval "<[a-z]>" "k" = true OK +Glob.eval "<[a-z]>" "z" = true OK +Glob.eval "<[a-z]>" "0" = false OK +Glob.eval "<[a-z]>" "A" = false OK +Glob.eval "<[a-z]>" "~" = false OK +Glob.eval "<[a-z][0-9]>" "a0" = true OK +Glob.eval "<[a-z][0-9]>" "b9" = true OK +Glob.eval "<[a-z][0-9]>" "a00" = false OK +Glob.eval "<[a-z][0-9]>" "a0a" = false OK +Glob.eval "<[a-z][0-9]>" "b0a" = false OK +Glob.eval "<[a-z][0-9]>" "isduis" = false OK +Glob.eval "<[a-z][0-9]>" "" = false OK +Glob.eval "<[a-z][0-9]>" "a0" = true OK +Glob.eval "<[a-z][0-9]>" "b9" = true OK +Glob.eval "<[a-z][0-9]>" "a00" = false OK +Glob.eval "<[a-z][0-9]>" "a0a" = false OK +Glob.eval "<[a-z][0-9]>" "b0a" = false OK +Glob.eval "<[a-z][0-9]>" "isduis" = false OK +Glob.eval "<[a-z][0-9]>" "" = false OK +Glob.eval "<[a-z][0-9]>" "a0" = true OK +Glob.eval "<[a-z][0-9]>" "b9" = true OK +Glob.eval "<[a-z][0-9]>" "a00" = false OK +Glob.eval "<[a-z][0-9]>" "a0a" = false OK +Glob.eval "<[a-z][0-9]>" "b0a" = false OK +Glob.eval "<[a-z][0-9]>" "isduis" = false OK +Glob.eval "<[a-z][0-9]>" "" = false OK +Glob.eval "<hello>" "hello" = true OK +Glob.eval "<hello>" "helli" = false OK +Glob.eval "<hello>" "hello" = true OK +Glob.eval "<hello>" "helli" = false OK +Glob.eval "<hello>" "hello" = true OK +Glob.eval "<hello>" "helli" = false OK +Glob.eval "\"hello\"" "hello" = true OK +Glob.eval "\"hello\"" "heidi" = false OK +Glob.eval "\"hello\"" "hello" = true OK +Glob.eval "\"hello\"" "heidi" = false OK +Glob.eval "\"hello\"" "hello" = true OK +Glob.eval "\"hello\"" "heidi" = false OK +Glob.eval "<*>" "" = true OK +Glob.eval "<*>" "a" = true OK +Glob.eval "<*>" "ax" = true OK +Glob.eval "<*>" "" = true OK +Glob.eval "<*>" "a" = true OK +Glob.eval "<*>" "ax" = true OK +Glob.eval "<*>" "" = true OK +Glob.eval "<*>" "a" = true OK +Glob.eval "<*>" "ax" = true OK +Glob.eval "<a*b>" "ab" = true OK +Glob.eval "<a*b>" "acb" = true OK +Glob.eval "<a*b>" "axxxxxb" = true OK +Glob.eval "<a*b>" "ababbababb" = true OK +Glob.eval "<a*b>" "abx" = false OK +Glob.eval "<a*b>" "xxxxxab" = false OK +Glob.eval "<a*b>" "xab" = false OK +Glob.eval "<a*b>" "ab" = true OK +Glob.eval "<a*b>" "acb" = true OK +Glob.eval "<a*b>" "axxxxxb" = true OK +Glob.eval "<a*b>" "ababbababb" = true OK +Glob.eval "<a*b>" "abx" = false OK +Glob.eval "<a*b>" "xxxxxab" = false OK +Glob.eval "<a*b>" "xab" = false OK +Glob.eval "<a*b>" "ab" = true OK +Glob.eval "<a*b>" "acb" = true OK +Glob.eval "<a*b>" "axxxxxb" = true OK +Glob.eval "<a*b>" "ababbababb" = true OK +Glob.eval "<a*b>" "abx" = false OK +Glob.eval "<a*b>" "xxxxxab" = false OK +Glob.eval "<a*b>" "xab" = false OK +Glob.eval "<*.ml>" "hello.ml" = true OK +Glob.eval "<*.ml>" ".ml" = true OK +Glob.eval "<*.ml>" "ml" = false OK +Glob.eval "<*.ml>" "" = false OK +Glob.eval "<*.ml>" "toto.mli" = false OK +Glob.eval "<*.ml>" "hello.ml" = true OK +Glob.eval "<*.ml>" ".ml" = true OK +Glob.eval "<*.ml>" "ml" = false OK +Glob.eval "<*.ml>" "" = false OK +Glob.eval "<*.ml>" "toto.mli" = false OK +Glob.eval "<*.ml>" "hello.ml" = true OK +Glob.eval "<*.ml>" ".ml" = true OK +Glob.eval "<*.ml>" "ml" = false OK +Glob.eval "<*.ml>" "" = false OK +Glob.eval "<*.ml>" "toto.mli" = false OK +Glob.eval "<a>" "a" = true OK +Glob.eval "<a>" "" = false OK +Glob.eval "<a>" "aa" = false OK +Glob.eval "<a>" "ba" = false OK +Glob.eval "<a>" "ab" = false OK +Glob.eval "<a>" "abaa" = false OK +Glob.eval "<a>" "a" = true OK +Glob.eval "<a>" "" = false OK +Glob.eval "<a>" "aa" = false OK +Glob.eval "<a>" "ba" = false OK +Glob.eval "<a>" "ab" = false OK +Glob.eval "<a>" "abaa" = false OK +Glob.eval "<a>" "a" = true OK +Glob.eval "<a>" "" = false OK +Glob.eval "<a>" "aa" = false OK +Glob.eval "<a>" "ba" = false OK +Glob.eval "<a>" "ab" = false OK +Glob.eval "<a>" "abaa" = false OK +Glob.eval "<ab>" "ab" = true OK +Glob.eval "<ab>" "" = false OK +Glob.eval "<ab>" "abab" = false OK +Glob.eval "<ab>" "aba" = false OK +Glob.eval "<ab>" "abx" = false OK +Glob.eval "<ab>" "ab" = true OK +Glob.eval "<ab>" "" = false OK +Glob.eval "<ab>" "abab" = false OK +Glob.eval "<ab>" "aba" = false OK +Glob.eval "<ab>" "abx" = false OK +Glob.eval "<ab>" "ab" = true OK +Glob.eval "<ab>" "" = false OK +Glob.eval "<ab>" "abab" = false OK +Glob.eval "<ab>" "aba" = false OK +Glob.eval "<ab>" "abx" = false OK +Glob.eval "<ab?c>" "abac" = true OK +Glob.eval "<ab?c>" "abxc" = true OK +Glob.eval "<ab?c>" "abab" = false OK +Glob.eval "<ab?c>" "ababab" = false OK +Glob.eval "<ab?c>" "ababa" = false OK +Glob.eval "<ab?c>" "abac" = true OK +Glob.eval "<ab?c>" "abxc" = true OK +Glob.eval "<ab?c>" "abab" = false OK +Glob.eval "<ab?c>" "ababab" = false OK +Glob.eval "<ab?c>" "ababa" = false OK +Glob.eval "<ab?c>" "abac" = true OK +Glob.eval "<ab?c>" "abxc" = true OK +Glob.eval "<ab?c>" "abab" = false OK +Glob.eval "<ab?c>" "ababab" = false OK +Glob.eval "<ab?c>" "ababa" = false OK +Glob.eval "<*ab?cd*>" "123abecd345" = true OK +Glob.eval "<*ab?cd*>" "abccd" = true OK +Glob.eval "<*ab?cd*>" "abccd345" = true OK +Glob.eval "<*ab?cd*>" "ababcababccdab" = true OK +Glob.eval "<*ab?cd*>" "abcd" = false OK +Glob.eval "<*ab?cd*>" "aaaaabcdababcd" = false OK +Glob.eval "<*ab?cd*>" "123abecd345" = true OK +Glob.eval "<*ab?cd*>" "abccd" = true OK +Glob.eval "<*ab?cd*>" "abccd345" = true OK +Glob.eval "<*ab?cd*>" "ababcababccdab" = true OK +Glob.eval "<*ab?cd*>" "abcd" = false OK +Glob.eval "<*ab?cd*>" "aaaaabcdababcd" = false OK +Glob.eval "<*ab?cd*>" "123abecd345" = true OK +Glob.eval "<*ab?cd*>" "abccd" = true OK +Glob.eval "<*ab?cd*>" "abccd345" = true OK +Glob.eval "<*ab?cd*>" "ababcababccdab" = true OK +Glob.eval "<*ab?cd*>" "abcd" = false OK +Glob.eval "<*ab?cd*>" "aaaaabcdababcd" = false OK +Glob.eval "<*this*is*a*test*>" "this is a test" = true OK +Glob.eval "<*this*is*a*test*>" "You know this is a test really" = true OK +Glob.eval "<*this*is*a*test*>" "thisisatest" = true OK +Glob.eval "<*this*is*a*test*>" "thisatest" = false OK +Glob.eval "<*this*is*a*test*>" "this is a test" = true OK +Glob.eval "<*this*is*a*test*>" "You know this is a test really" = true OK +Glob.eval "<*this*is*a*test*>" "thisisatest" = true OK +Glob.eval "<*this*is*a*test*>" "thisatest" = false OK +Glob.eval "<*this*is*a*test*>" "this is a test" = true OK +Glob.eval "<*this*is*a*test*>" "You know this is a test really" = true OK +Glob.eval "<*this*is*a*test*>" "thisisatest" = true OK +Glob.eval "<*this*is*a*test*>" "thisatest" = false OK +Glob.eval "<b*>" "bxx" = true OK +Glob.eval "<b*>" "bx" = true OK +Glob.eval "<b*>" "aaab" = false OK +Glob.eval "<b*>" "" = false OK +Glob.eval "<b*>" "bxx" = true OK +Glob.eval "<b*>" "bx" = true OK +Glob.eval "<b*>" "aaab" = false OK +Glob.eval "<b*>" "" = false OK +Glob.eval "<b*>" "bxx" = true OK +Glob.eval "<b*>" "bx" = true OK +Glob.eval "<b*>" "aaab" = false OK +Glob.eval "<b*>" "" = false OK +Glob.eval "<*>" "" = true OK +Glob.eval "<*>" "a" = true OK +Glob.eval "<*>" "aaa" = true OK +Glob.eval "<*>" "aaaaa" = true OK +Glob.eval "<*>" "" = true OK +Glob.eval "<*>" "a" = true OK +Glob.eval "<*>" "aaa" = true OK +Glob.eval "<*>" "aaaaa" = true OK +Glob.eval "<*>" "" = true OK +Glob.eval "<*>" "a" = true OK +Glob.eval "<*>" "aaa" = true OK +Glob.eval "<*>" "aaaaa" = true OK +Glob.eval "<?>" "a" = true OK +Glob.eval "<?>" "" = false OK +Glob.eval "<?>" "aaa" = false OK +Glob.eval "<?>" "aaaaa" = false OK +Glob.eval "<?>" "a" = true OK +Glob.eval "<?>" "" = false OK +Glob.eval "<?>" "aaa" = false OK +Glob.eval "<?>" "aaaaa" = false OK +Glob.eval "<?>" "a" = true OK +Glob.eval "<?>" "" = false OK +Glob.eval "<?>" "aaa" = false OK +Glob.eval "<?>" "aaaaa" = false OK +Glob.eval "<{a,b}>" "a" = true OK +Glob.eval "<{a,b}>" "b" = true OK +Glob.eval "<{a,b}>" "" = false OK +Glob.eval "<{a,b}>" "aa" = false OK +Glob.eval "<{a,b}>" "ab" = false OK +Glob.eval "<{a,b}>" "ba" = false OK +Glob.eval "<{a,b}>" "bb" = false OK +Glob.eval "<{a,b}>" "c" = false OK +Glob.eval "<{a,b}>" "a" = true OK +Glob.eval "<{a,b}>" "b" = true OK +Glob.eval "<{a,b}>" "" = false OK +Glob.eval "<{a,b}>" "aa" = false OK +Glob.eval "<{a,b}>" "ab" = false OK +Glob.eval "<{a,b}>" "ba" = false OK +Glob.eval "<{a,b}>" "bb" = false OK +Glob.eval "<{a,b}>" "c" = false OK +Glob.eval "<{a,b}>" "a" = true OK +Glob.eval "<{a,b}>" "b" = true OK +Glob.eval "<{a,b}>" "" = false OK +Glob.eval "<{a,b}>" "aa" = false OK +Glob.eval "<{a,b}>" "ab" = false OK +Glob.eval "<{a,b}>" "ba" = false OK +Glob.eval "<{a,b}>" "bb" = false OK +Glob.eval "<{a,b}>" "c" = false OK +Glob.eval "<toto.{ml,mli}>" "toto.ml" = true OK +Glob.eval "<toto.{ml,mli}>" "toto.mli" = true OK +Glob.eval "<toto.{ml,mli}>" "toto." = false OK +Glob.eval "<toto.{ml,mli}>" "toto.mll" = false OK +Glob.eval "<toto.{ml,mli}>" "toto.ml" = true OK +Glob.eval "<toto.{ml,mli}>" "toto.mli" = true OK +Glob.eval "<toto.{ml,mli}>" "toto." = false OK +Glob.eval "<toto.{ml,mli}>" "toto.mll" = false OK +Glob.eval "<toto.{ml,mli}>" "toto.ml" = true OK +Glob.eval "<toto.{ml,mli}>" "toto.mli" = true OK +Glob.eval "<toto.{ml,mli}>" "toto." = false OK +Glob.eval "<toto.{ml,mli}>" "toto.mll" = false OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "acf" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "acg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "adf" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "adg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "aef" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "aeg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bcf" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bcg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bdf" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bdg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bef" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "beg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "afg" = false OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "af" = false OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "aee" = false OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "acf" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "acg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "adf" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "adg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "aef" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "aeg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bcf" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bcg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bdf" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bdg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bef" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "beg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "afg" = false OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "af" = false OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "aee" = false OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "acf" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "acg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "adf" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "adg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "aef" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "aeg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bcf" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bcg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bdf" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bdg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "bef" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "beg" = true OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "afg" = false OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "af" = false OK +Glob.eval "<{a,b}{c,[de]}{f,g}>" "aee" = false OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "a.ml" = true OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "b.ml" = true OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "a.mli" = true OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "hello.ml" = false OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "a.mli.x" = false OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "a.ml" = true OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "b.ml" = true OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "a.mli" = true OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "hello.ml" = false OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "a.mli.x" = false OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "a.ml" = true OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "b.ml" = true OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "a.mli" = true OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "hello.ml" = false OK +Glob.eval "(<*.ml> or <*.mli>) and not \"hello.ml\"" "a.mli.x" = false OK +Glob.eval "<*>" "alpha" = true OK +Glob.eval "<*>" "beta" = true OK +Glob.eval "<*>" "alpha/beta" = false OK +Glob.eval "<*>" "gamma/delta" = false OK +Glob.eval "<*>" "alpha" = true OK +Glob.eval "<*>" "beta" = true OK +Glob.eval "<*>" "alpha/beta" = false OK +Glob.eval "<*>" "gamma/delta" = false OK +Glob.eval "<*>" "alpha" = true OK +Glob.eval "<*>" "beta" = true OK +Glob.eval "<*>" "alpha/beta" = false OK +Glob.eval "<*>" "gamma/delta" = false OK +Glob.eval "<alpha/**/beta>" "alpha/beta" = true OK +Glob.eval "<alpha/**/beta>" "alpha/gamma/beta" = true OK +Glob.eval "<alpha/**/beta>" "alpha/gamma/delta/beta" = true OK +Glob.eval "<alpha/**/beta>" "alpha" = false OK +Glob.eval "<alpha/**/beta>" "beta" = false OK +Glob.eval "<alpha/**/beta>" "gamma/delta" = false OK +Glob.eval "<alpha/**/beta>" "alpha/beta" = true OK +Glob.eval "<alpha/**/beta>" "alpha/gamma/beta" = true OK +Glob.eval "<alpha/**/beta>" "alpha/gamma/delta/beta" = true OK +Glob.eval "<alpha/**/beta>" "alpha" = false OK +Glob.eval "<alpha/**/beta>" "beta" = false OK +Glob.eval "<alpha/**/beta>" "gamma/delta" = false OK +Glob.eval "<alpha/**/beta>" "alpha/beta" = true OK +Glob.eval "<alpha/**/beta>" "alpha/gamma/beta" = true OK +Glob.eval "<alpha/**/beta>" "alpha/gamma/delta/beta" = true OK +Glob.eval "<alpha/**/beta>" "alpha" = false OK +Glob.eval "<alpha/**/beta>" "beta" = false OK +Glob.eval "<alpha/**/beta>" "gamma/delta" = false OK +Glob.eval "<**/*.ml>" "toto.ml" = true OK +Glob.eval "<**/*.ml>" "toto/tata.ml" = true OK +Glob.eval "<**/*.ml>" "alpha/gamma/delta/beta.ml" = true OK +Glob.eval "<**/*.ml>" "toto.mli" = false OK +Glob.eval "<**/*.ml>" "toto.ml" = true OK +Glob.eval "<**/*.ml>" "toto/tata.ml" = true OK +Glob.eval "<**/*.ml>" "alpha/gamma/delta/beta.ml" = true OK +Glob.eval "<**/*.ml>" "toto.mli" = false OK +Glob.eval "<**/*.ml>" "toto.ml" = true OK +Glob.eval "<**/*.ml>" "toto/tata.ml" = true OK +Glob.eval "<**/*.ml>" "alpha/gamma/delta/beta.ml" = true OK +Glob.eval "<**/*.ml>" "toto.mli" = false OK +Glob.eval "<toto/**>" "toto/" = true OK +Glob.eval "<toto/**>" "toto/tata" = true OK +Glob.eval "<toto/**>" "toto/alpha/gamma/delta/beta.ml" = true OK +Glob.eval "<toto/**>" "toto" = true OK +Glob.eval "<toto/**>" "toto2/tata" = false OK +Glob.eval "<toto/**>" "tata/titi" = false OK +Glob.eval "<toto/**>" "toto/" = true OK +Glob.eval "<toto/**>" "toto/tata" = true OK +Glob.eval "<toto/**>" "toto/alpha/gamma/delta/beta.ml" = true OK +Glob.eval "<toto/**>" "toto" = true OK +Glob.eval "<toto/**>" "toto2/tata" = false OK +Glob.eval "<toto/**>" "tata/titi" = false OK +Glob.eval "<toto/**>" "toto/" = true OK +Glob.eval "<toto/**>" "toto/tata" = true OK +Glob.eval "<toto/**>" "toto/alpha/gamma/delta/beta.ml" = true OK +Glob.eval "<toto/**>" "toto" = true OK +Glob.eval "<toto/**>" "toto2/tata" = false OK +Glob.eval "<toto/**>" "tata/titi" = false OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "libfoo.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "src/bar/libfoo.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "otherlibs/unix/libunix.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "otherlibsliblib/unlibix/libunix.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "libfoo/libbar.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "src/libfoo/boo/libbar.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "bar" = None OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "libbar/foo.a" = None OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "libfoo.b.a" = None OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "libfoo.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "src/bar/libfoo.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "otherlibs/unix/libunix.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "otherlibsliblib/unlibix/libunix.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "libfoo/libbar.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "src/libfoo/boo/libbar.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "bar" = None OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "libbar/foo.a" = None OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "libfoo.b.a" = None OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "libfoo.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "src/bar/libfoo.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "otherlibs/unix/libunix.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "otherlibsliblib/unlibix/libunix.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "libfoo/libbar.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "src/libfoo/boo/libbar.a" OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "bar" = None OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "libbar/foo.a" = None OK +Resource.matchit "%(path:<**/>)lib%(libname:<*> and not <*.*>).a" "libfoo.b.a" = None OK + _____ _ _ _ +|_ _|__ ___| |_/ / | + | |/ _ \/ __| __| | | + | | __/\__ \ |_| | | + |_|\___||___/\__|_|_| + +ocamlbuild.cmx -o myocamlbuild +/home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules a/aa.mli > a/aa.mli.depends +/home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -I a -I b -o a/aa.cmi a/aa.mli +/home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules a/aa.ml > a/aa.ml.depends +/home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules b/bb.ml > b/bb.ml.depends +/home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -I b -I a -o b/bb.cmo b/bb.ml +/home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -I a -I b -o a/aa.cmo a/aa.ml +/home/danmey/src/ocaml-trunk/bin/ocamlc.opt -a b/bb.cmo -o b/libb.cma +/home/danmey/src/ocaml-trunk/bin/ocamlc.opt b/libb.cma a/aa.cmo -o a/aa.byte +/home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -I b -I a -o b/bb.cmx b/bb.ml +/home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -I a -I b -o a/aa.cmx a/aa.ml +/home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -a b/bb.cmx -o b/libb.cmxa +/home/danmey/src/ocaml-trunk/bin/ocamlopt.opt b/libb.cmxa a/aa.cmx -o a/aa.native +looks if libs are there +_build/b/libb.a +_build/b/libb.cma +_build/b/libb.cmxa +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules a/aa.mli > a/aa.mli.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -I a -I b -o a/aa.cmi a/aa.mli +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules a/aa.ml > a/aa.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamldep.opt -modules b/bb.ml > b/bb.ml.depends +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -I b -I a -o b/bb.cmo b/bb.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -c -I a -I b -o a/aa.cmo a/aa.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt -a b/bb.cmo -o b/libb.cma +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlc.opt b/libb.cma a/aa.cmo -o a/aa.byte +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -I b -I a -o b/bb.cmx b/bb.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -c -I a -I b -o a/aa.cmx a/aa.ml +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt -a b/bb.cmx -o b/libb.cmxa +[cache hit] /home/danmey/src/ocaml-trunk/bin/ocamlopt.opt b/libb.cmxa a/aa.cmx -o a/aa.native + _____ _ _ ____ +|_ _|__ ___| |_/ |___ \ + | |/ _ \/ __| __| | __) | + | | __/\__ \ |_| |/ __/ + |_|\___||___/\__|_|_____| + +ocamldep.opt -modules Main.ml > Main.ml.depends +Packed.ml.depends +Lib.mli.depends +Lib.mli +Packed.ml +Packed.cmo -o Pack.cmo +ocamlc.opt -c -I lib -o Main.cmo Main.ml +Lib.ml.depends +Lib.ml +Packed.ml +Packed.cmx -o Pack.cmx ; then rm -f Pack.mli ; else rm -f Pack.mli ; exit 1; fi +ocamlopt.opt -c -I lib -o Main.cmx Main.ml +Lib.cmx Pack.cmx Main.cmx -o Main.native +Lib.ml +Lib.cmo Pack.cmo Main.cmo -o Main.byte +looks if executable are there +_build/Main.byte +_build/Main.byte +_build/Main.native + _____ _ __ ___ _ _ +|_ _|__ ___| |_ \ \ / (_)_ __| |_ _ _ __ _| | + | |/ _ \/ __| __| \ \ / /| | '__| __| | | |/ _` | | + | | __/\__ \ |_ \ V / | | | | |_| |_| | (_| | | + |_|\___||___/\__| \_/ |_|_| \__|\__,_|\__,_|_| + + _____ _ +|_ _|_ _ _ __ __ _ ___| |_ ___ + | |/ _` | '__/ _` |/ _ \ __/ __| + | | (_| | | | (_| | __/ |_\__ \ + |_|\__,_|_| \__, |\___|\__|___/ + |___/ diff --git a/ocamlbuild/test/runtest.sh b/ocamlbuild/test/runtest.sh new file mode 100755 index 00000000..600f4232 --- /dev/null +++ b/ocamlbuild/test/runtest.sh @@ -0,0 +1,56 @@ +######################################################################### +# # +# OCaml # +# # +# Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2007 Institut National de Recherche en Informatique et # +# en Automatique. All rights reserved. This file is distributed # +# under the terms of the Q Public License version 1.0. # +# # +######################################################################### + +#!/bin/sh +set -e +cd `dirname $0` + +export OCB=$PWD/../../_build/ocamlbuild/ocamlbuild.native + +myfiglet() { + figlet $@ | sed 's/ *$//' +} + +if figlet ""; then + BANNER=myfiglet +else + echo "Install figlet to have a better output, press enter to continue with echo" + read + BANNER=echo +fi + +HERE=`pwd` + +$BANNER Test2 +./test2/test.sh $@ +$BANNER Test3 +./test3/test.sh $@ +$BANNER Test4 +./test4/test.sh $@ +$BANNER Test5 +./test5/test.sh $@ +$BANNER Test6 +./test6/test.sh $@ +$BANNER Test7 +./test7/test.sh $@ +$BANNER Test8 +./test8/test.sh $@ +$BANNER Test9 +./test9/test.sh $@ +$BANNER Test10 +./test10/test.sh $@ +$BANNER Test11 +./test11/test.sh $@ +$BANNER Test12 +./test12/test.sh $@ +$BANNER Test Virtual Targets +./test_virtual/test.sh $@ diff --git a/ocamlbuild/test/test1/foo.ml b/ocamlbuild/test/test1/foo.ml new file mode 100644 index 00000000..304c7649 --- /dev/null +++ b/ocamlbuild/test/test1/foo.ml @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +module MA1 = A1 diff --git a/ocamlbuild/test/test10/dbdi b/ocamlbuild/test/test10/dbdi new file mode 100644 index 00000000..a6b99728 --- /dev/null +++ b/ocamlbuild/test/test10/dbdi @@ -0,0 +1,24 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +#load "discard_printf.cmo";; +#load "debug.cmo";; +#load "unix.cma";; +#load "str.cma";; +#load "my_unix.cmo";; +#load "bool.cmo";; +#load "glob_ast.cmo";; +#load "glob_lexer.cmo";; +#load "glob.cmo";; +#load "lexers.cmo";; +#load "my_std.cmo";; +#load "tags.cmo";; diff --git a/ocamlbuild/test/test10/test.sh b/ocamlbuild/test/test10/test.sh new file mode 100755 index 00000000..2ff23404 --- /dev/null +++ b/ocamlbuild/test/test10/test.sh @@ -0,0 +1,18 @@ +######################################################################### +# # +# OCaml # +# # +# Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2007 Institut National de Recherche en Informatique et # +# en Automatique. All rights reserved. This file is distributed # +# under the terms of the Q Public License version 1.0. # +# # +######################################################################### + +#!/bin/sh +set -e +set -x +cd `dirname $0`/../.. +$OCB -quiet -build-dir _buildtest -no-links test/test9/testglob.native +./_buildtest/test/test9/testglob.native diff --git a/ocamlbuild/test/test11/_tags b/ocamlbuild/test/test11/_tags new file mode 100644 index 00000000..82387432 --- /dev/null +++ b/ocamlbuild/test/test11/_tags @@ -0,0 +1,14 @@ +######################################################################### +# # +# OCaml # +# # +# Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2007 Institut National de Recherche en Informatique et # +# en Automatique. All rights reserved. This file is distributed # +# under the terms of the Q Public License version 1.0. # +# # +######################################################################### + +# a comment +"a/aa.byte" or "a/aa.native": use_libb diff --git a/ocamlbuild/test/test11/a/aa.ml b/ocamlbuild/test/test11/a/aa.ml new file mode 100644 index 00000000..d373383d --- /dev/null +++ b/ocamlbuild/test/test11/a/aa.ml @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +let bar = 3 + List.length Bb.foo diff --git a/ocamlbuild/test/test11/a/aa.mli b/ocamlbuild/test/test11/a/aa.mli new file mode 100644 index 00000000..45d2d6fd --- /dev/null +++ b/ocamlbuild/test/test11/a/aa.mli @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +val bar : int diff --git a/ocamlbuild/test/test11/b/bb.ml b/ocamlbuild/test/test11/b/bb.ml new file mode 100644 index 00000000..f5cce236 --- /dev/null +++ b/ocamlbuild/test/test11/b/bb.ml @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +let foo = [2.2] diff --git a/ocamlbuild/test/test11/b/libb.mllib b/ocamlbuild/test/test11/b/libb.mllib new file mode 100644 index 00000000..d0acbb70 --- /dev/null +++ b/ocamlbuild/test/test11/b/libb.mllib @@ -0,0 +1 @@ +Bb diff --git a/ocamlbuild/test/test11/myocamlbuild.ml b/ocamlbuild/test/test11/myocamlbuild.ml new file mode 100644 index 00000000..5a018c20 --- /dev/null +++ b/ocamlbuild/test/test11/myocamlbuild.ml @@ -0,0 +1,17 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +open Ocamlbuild_plugin;; +dispatch begin function +| After_rules -> ocaml_lib "b/libb" +| _ -> () +end diff --git a/ocamlbuild/test/test11/test.sh b/ocamlbuild/test/test11/test.sh new file mode 100755 index 00000000..989d051d --- /dev/null +++ b/ocamlbuild/test/test11/test.sh @@ -0,0 +1,25 @@ +######################################################################### +# # +# OCaml # +# # +# Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2007 Institut National de Recherche en Informatique et # +# en Automatique. All rights reserved. This file is distributed # +# under the terms of the Q Public License version 1.0. # +# # +######################################################################### + +#!/bin/sh +cd `dirname $0` +set -e +set -x +CMDOTPS="" # -- command args +BUILD="$OCB -I a -I b aa.byte aa.native -no-skip -classic-display $@" +BUILD1="$BUILD $CMDOPTS" +BUILD2="$BUILD -verbose 0 -nothing-should-be-rebuilt $CMDOPTS" +rm -rf _build +$BUILD1 +echo looks if libs are there +ls _build/b/libb.cma _build/b/libb.cmxa _build/b/libb.a +$BUILD2 diff --git a/ocamlbuild/test/test2/_tags b/ocamlbuild/test/test2/_tags new file mode 100644 index 00000000..5db64505 --- /dev/null +++ b/ocamlbuild/test/test2/_tags @@ -0,0 +1,15 @@ +######################################################################### +# # +# OCaml # +# # +# Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2007 Institut National de Recherche en Informatique et # +# en Automatique. All rights reserved. This file is distributed # +# under the terms of the Q Public License version 1.0. # +# # +######################################################################### + +"vivi.ml": camlp4o + +# , some_useless_tag, \ more_useless_tags diff --git a/ocamlbuild/test/test2/tata.ml b/ocamlbuild/test/test2/tata.ml new file mode 100644 index 00000000..2b777f07 --- /dev/null +++ b/ocamlbuild/test/test2/tata.ml @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +let tata = "TATA2" diff --git a/ocamlbuild/test/test2/tata.mli b/ocamlbuild/test/test2/tata.mli new file mode 100644 index 00000000..3fb12338 --- /dev/null +++ b/ocamlbuild/test/test2/tata.mli @@ -0,0 +1,14 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* a comment *) +val tata : string diff --git a/ocamlbuild/test/test2/test.sh b/ocamlbuild/test/test2/test.sh new file mode 100755 index 00000000..0843ce42 --- /dev/null +++ b/ocamlbuild/test/test2/test.sh @@ -0,0 +1,30 @@ +######################################################################### +# # +# OCaml # +# # +# Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2007 Institut National de Recherche en Informatique et # +# en Automatique. All rights reserved. This file is distributed # +# under the terms of the Q Public License version 1.0. # +# # +######################################################################### + +#!/bin/sh +cd `dirname $0` +set -e +set -x +CMDOPTS="-- -help" +BUILD="$OCB toto.byte toto.native -no-skip -classic-display $@" +BUILD1="$BUILD $CMDOPTS" +BUILD2="$BUILD -verbose 0 -nothing-should-be-rebuilt $CMDOPTS" +rm -rf _build +cp vivi1.ml vivi.ml +$BUILD1 +$BUILD2 +cp vivi2.ml vivi.ml +$BUILD1 +$BUILD2 +cp vivi3.ml vivi.ml +$BUILD1 +$BUILD2 diff --git a/ocamlbuild/test/test2/titi.ml b/ocamlbuild/test/test2/titi.ml new file mode 100644 index 00000000..95dc139c --- /dev/null +++ b/ocamlbuild/test/test2/titi.ml @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +let titi = [] diff --git a/ocamlbuild/test/test2/toto.ml b/ocamlbuild/test/test2/toto.ml new file mode 100644 index 00000000..d0a99c16 --- /dev/null +++ b/ocamlbuild/test/test2/toto.ml @@ -0,0 +1,17 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +let i = Tutu.tutu + 10 +let s = Tata.tata ^ ".ml" +let l = 3 :: Titi.titi +let () = Format.printf "toto.native: %s: Hello world!!!@." Sys.argv.(0) +let () = Format.printf "Tutu.tutu => %d@.Tata.tata => %S@." Tutu.tutu Tata.tata diff --git a/ocamlbuild/test/test2/tutu.ml b/ocamlbuild/test/test2/tutu.ml new file mode 100644 index 00000000..e5c5a95a --- /dev/null +++ b/ocamlbuild/test/test2/tutu.ml @@ -0,0 +1,14 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +let tutu = (Array.length Vivi.vivi : Tyty.t) +let tutu' = 2.0 +. float_of_int tutu diff --git a/ocamlbuild/test/test2/tutu.mli b/ocamlbuild/test/test2/tutu.mli new file mode 100644 index 00000000..bbcd6f88 --- /dev/null +++ b/ocamlbuild/test/test2/tutu.mli @@ -0,0 +1,15 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* a comment *) +val tutu : int +val tutu' : float diff --git a/ocamlbuild/test/test2/tyty.mli b/ocamlbuild/test/test2/tyty.mli new file mode 100644 index 00000000..cfd91160 --- /dev/null +++ b/ocamlbuild/test/test2/tyty.mli @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +type t = int diff --git a/ocamlbuild/test/test2/vivi1.ml b/ocamlbuild/test/test2/vivi1.ml new file mode 100644 index 00000000..78aaf09d --- /dev/null +++ b/ocamlbuild/test/test2/vivi1.ml @@ -0,0 +1,14 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +let rec p i = [< '1; '2; p (i + 1) >] +let vivi = [|2|] diff --git a/ocamlbuild/test/test2/vivi2.ml b/ocamlbuild/test/test2/vivi2.ml new file mode 100644 index 00000000..dd14288f --- /dev/null +++ b/ocamlbuild/test/test2/vivi2.ml @@ -0,0 +1,14 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +let rec p i = [< '1; '2; p (i + 1) >] +let vivi = [|3|] diff --git a/ocamlbuild/test/test2/vivi3.ml b/ocamlbuild/test/test2/vivi3.ml new file mode 100644 index 00000000..89c4bc33 --- /dev/null +++ b/ocamlbuild/test/test2/vivi3.ml @@ -0,0 +1,14 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +let rec p i = [< '1; '2; p (i + 1) >] +let vivi = [|2.1; 1.1|] diff --git a/ocamlbuild/test/test3/_tags b/ocamlbuild/test/test3/_tags new file mode 100644 index 00000000..b2018471 --- /dev/null +++ b/ocamlbuild/test/test3/_tags @@ -0,0 +1,13 @@ +######################################################################### +# # +# OCaml # +# # +# Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2007 Institut National de Recherche en Informatique et # +# en Automatique. All rights reserved. This file is distributed # +# under the terms of the Q Public License version 1.0. # +# # +######################################################################### + +"a.byte" or "a.native": use_unix diff --git a/ocamlbuild/test/test3/a.ml b/ocamlbuild/test/test3/a.ml new file mode 100644 index 00000000..8943491c --- /dev/null +++ b/ocamlbuild/test/test3/a.ml @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +module X = B diff --git a/ocamlbuild/test/test3/a.mli b/ocamlbuild/test/test3/a.mli new file mode 100644 index 00000000..2978f3bc --- /dev/null +++ b/ocamlbuild/test/test3/a.mli @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* Nothing *) diff --git a/ocamlbuild/test/test3/b.ml b/ocamlbuild/test/test3/b.ml new file mode 100644 index 00000000..2074ea5c --- /dev/null +++ b/ocamlbuild/test/test3/b.ml @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +module X = C diff --git a/ocamlbuild/test/test3/b.mli b/ocamlbuild/test/test3/b.mli new file mode 100644 index 00000000..289f91f3 --- /dev/null +++ b/ocamlbuild/test/test3/b.mli @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* nothing *) diff --git a/ocamlbuild/test/test3/c.ml b/ocamlbuild/test/test3/c.ml new file mode 100644 index 00000000..5a161603 --- /dev/null +++ b/ocamlbuild/test/test3/c.ml @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +module X = D diff --git a/ocamlbuild/test/test3/c.mli b/ocamlbuild/test/test3/c.mli new file mode 100644 index 00000000..289f91f3 --- /dev/null +++ b/ocamlbuild/test/test3/c.mli @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* nothing *) diff --git a/ocamlbuild/test/test3/d.ml b/ocamlbuild/test/test3/d.ml new file mode 100644 index 00000000..8b96630e --- /dev/null +++ b/ocamlbuild/test/test3/d.ml @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +module X = E diff --git a/ocamlbuild/test/test3/d.mli b/ocamlbuild/test/test3/d.mli new file mode 100644 index 00000000..289f91f3 --- /dev/null +++ b/ocamlbuild/test/test3/d.mli @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* nothing *) diff --git a/ocamlbuild/test/test3/e.ml b/ocamlbuild/test/test3/e.ml new file mode 100644 index 00000000..3ac83e48 --- /dev/null +++ b/ocamlbuild/test/test3/e.ml @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +module X = F diff --git a/ocamlbuild/test/test3/e.mli b/ocamlbuild/test/test3/e.mli new file mode 100644 index 00000000..289f91f3 --- /dev/null +++ b/ocamlbuild/test/test3/e.mli @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* nothing *) diff --git a/ocamlbuild/test/test3/f.ml b/ocamlbuild/test/test3/f.ml new file mode 100644 index 00000000..7c1ae8d4 --- /dev/null +++ b/ocamlbuild/test/test3/f.ml @@ -0,0 +1,14 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* nothing *) +let _ = Unix.stat diff --git a/ocamlbuild/test/test3/f.mli b/ocamlbuild/test/test3/f.mli new file mode 100644 index 00000000..289f91f3 --- /dev/null +++ b/ocamlbuild/test/test3/f.mli @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* nothing *) diff --git a/ocamlbuild/test/test3/proj.odocl b/ocamlbuild/test/test3/proj.odocl new file mode 100644 index 00000000..532c7203 --- /dev/null +++ b/ocamlbuild/test/test3/proj.odocl @@ -0,0 +1 @@ +A B C D E F diff --git a/ocamlbuild/test/test3/test.sh b/ocamlbuild/test/test3/test.sh new file mode 100755 index 00000000..d3b28526 --- /dev/null +++ b/ocamlbuild/test/test3/test.sh @@ -0,0 +1,23 @@ +######################################################################### +# # +# OCaml # +# # +# Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2007 Institut National de Recherche en Informatique et # +# en Automatique. All rights reserved. This file is distributed # +# under the terms of the Q Public License version 1.0. # +# # +######################################################################### + +#!/bin/sh +cd `dirname $0` +set -e +set -x +CMDOTPS="" # -- command args +BUILD="$OCB a.byte a.native proj.docdir/index.html -no-skip -classic-display $@" +BUILD1="$BUILD $CMDOPTS" +BUILD2="$BUILD -verbose 0 -nothing-should-be-rebuilt $CMDOPTS" +rm -rf _build +$BUILD1 +$BUILD2 diff --git a/ocamlbuild/test/test4/_tags b/ocamlbuild/test/test4/_tags new file mode 100644 index 00000000..f381c675 --- /dev/null +++ b/ocamlbuild/test/test4/_tags @@ -0,0 +1,14 @@ +######################################################################### +# # +# OCaml # +# # +# Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2007 Institut National de Recherche en Informatique et # +# en Automatique. All rights reserved. This file is distributed # +# under the terms of the Q Public License version 1.0. # +# # +######################################################################### + +# a comment +"a/aa.byte" or "a/aa.native": use_str diff --git a/ocamlbuild/test/test4/a/aa.ml b/ocamlbuild/test/test4/a/aa.ml new file mode 100644 index 00000000..d373383d --- /dev/null +++ b/ocamlbuild/test/test4/a/aa.ml @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +let bar = 3 + List.length Bb.foo diff --git a/ocamlbuild/test/test4/a/aa.mli b/ocamlbuild/test/test4/a/aa.mli new file mode 100644 index 00000000..45d2d6fd --- /dev/null +++ b/ocamlbuild/test/test4/a/aa.mli @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +val bar : int diff --git a/ocamlbuild/test/test4/b/bb.ml b/ocamlbuild/test/test4/b/bb.ml new file mode 100644 index 00000000..65777877 --- /dev/null +++ b/ocamlbuild/test/test4/b/bb.ml @@ -0,0 +1,14 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +let r = Str.regexp "r" +let foo = [2.2] diff --git a/ocamlbuild/test/test4/test.sh b/ocamlbuild/test/test4/test.sh new file mode 100755 index 00000000..46b7129d --- /dev/null +++ b/ocamlbuild/test/test4/test.sh @@ -0,0 +1,23 @@ +######################################################################### +# # +# OCaml # +# # +# Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2007 Institut National de Recherche en Informatique et # +# en Automatique. All rights reserved. This file is distributed # +# under the terms of the Q Public License version 1.0. # +# # +######################################################################### + +#!/bin/sh +cd `dirname $0` +set -e +set -x +CMDOTPS="" # -- command args +BUILD="$OCB -I a -I b aa.byte aa.native -no-skip -classic-display $@" +BUILD1="$BUILD $CMDOPTS" +BUILD2="$BUILD -verbose 0 -nothing-should-be-rebuilt $CMDOPTS" +rm -rf _build +$BUILD1 +$BUILD2 diff --git a/ocamlbuild/test/test5/_tags b/ocamlbuild/test/test5/_tags new file mode 100644 index 00000000..daa80725 --- /dev/null +++ b/ocamlbuild/test/test5/_tags @@ -0,0 +1,13 @@ +######################################################################### +# # +# OCaml # +# # +# Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2007 Institut National de Recherche en Informatique et # +# en Automatique. All rights reserved. This file is distributed # +# under the terms of the Q Public License version 1.0. # +# # +######################################################################### + +"a.cmx" or "b.cmx": for-pack(C) diff --git a/ocamlbuild/test/test5/a.ml b/ocamlbuild/test/test5/a.ml new file mode 100644 index 00000000..89039068 --- /dev/null +++ b/ocamlbuild/test/test5/a.ml @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +let a = 42 + Stack.stack diff --git a/ocamlbuild/test/test5/a.mli b/ocamlbuild/test/test5/a.mli new file mode 100644 index 00000000..c263e150 --- /dev/null +++ b/ocamlbuild/test/test5/a.mli @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +val a : int diff --git a/ocamlbuild/test/test5/b.ml b/ocamlbuild/test/test5/b.ml new file mode 100644 index 00000000..72ec04e9 --- /dev/null +++ b/ocamlbuild/test/test5/b.ml @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +let b = A.a + 1 diff --git a/ocamlbuild/test/test5/c.mlpack b/ocamlbuild/test/test5/c.mlpack new file mode 100644 index 00000000..5decc2b6 --- /dev/null +++ b/ocamlbuild/test/test5/c.mlpack @@ -0,0 +1 @@ +A B diff --git a/ocamlbuild/test/test5/d.ml b/ocamlbuild/test/test5/d.ml new file mode 100644 index 00000000..171ecf5a --- /dev/null +++ b/ocamlbuild/test/test5/d.ml @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +Format.printf "C.B.b = %d@." C.B.b diff --git a/ocamlbuild/test/test5/stack.ml b/ocamlbuild/test/test5/stack.ml new file mode 100644 index 00000000..0acc39d3 --- /dev/null +++ b/ocamlbuild/test/test5/stack.ml @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +let stack = 42 diff --git a/ocamlbuild/test/test5/test.sh b/ocamlbuild/test/test5/test.sh new file mode 100755 index 00000000..30bba5ce --- /dev/null +++ b/ocamlbuild/test/test5/test.sh @@ -0,0 +1,23 @@ +######################################################################### +# # +# OCaml # +# # +# Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2007 Institut National de Recherche en Informatique et # +# en Automatique. All rights reserved. This file is distributed # +# under the terms of the Q Public License version 1.0. # +# # +######################################################################### + +#!/bin/sh +cd `dirname $0` +set -e +set -x +CMDOPTS="" # -- command args +BUILD="$OCB d.byte d.native -no-skip -classic-display $@" +BUILD1="$BUILD $CMDOPTS" +BUILD2="$BUILD -verbose 0 -nothing-should-be-rebuilt $CMDOPTS" +rm -rf _build +$BUILD1 +$BUILD2 diff --git a/ocamlbuild/test/test6/a.ml b/ocamlbuild/test/test6/a.ml new file mode 100644 index 00000000..045a8047 --- /dev/null +++ b/ocamlbuild/test/test6/a.ml @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +let a = B.b diff --git a/ocamlbuild/test/test6/a.mli b/ocamlbuild/test/test6/a.mli new file mode 100644 index 00000000..a8f98ba8 --- /dev/null +++ b/ocamlbuild/test/test6/a.mli @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +val a : 'a -> 'a diff --git a/ocamlbuild/test/test6/b.ml b/ocamlbuild/test/test6/b.ml new file mode 100644 index 00000000..de477cef --- /dev/null +++ b/ocamlbuild/test/test6/b.ml @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +let b = D.d diff --git a/ocamlbuild/test/test6/b.mli b/ocamlbuild/test/test6/b.mli new file mode 100644 index 00000000..5f545ae6 --- /dev/null +++ b/ocamlbuild/test/test6/b.mli @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +val b : 'a -> 'a diff --git a/ocamlbuild/test/test6/b.mli.v1 b/ocamlbuild/test/test6/b.mli.v1 new file mode 100644 index 00000000..5f545ae6 --- /dev/null +++ b/ocamlbuild/test/test6/b.mli.v1 @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +val b : 'a -> 'a diff --git a/ocamlbuild/test/test6/b.mli.v2 b/ocamlbuild/test/test6/b.mli.v2 new file mode 100644 index 00000000..ede11d29 --- /dev/null +++ b/ocamlbuild/test/test6/b.mli.v2 @@ -0,0 +1,14 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +.... +val b : 'a -> 'a diff --git a/ocamlbuild/test/test6/d.ml b/ocamlbuild/test/test6/d.ml new file mode 100644 index 00000000..db9a453c --- /dev/null +++ b/ocamlbuild/test/test6/d.ml @@ -0,0 +1,14 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +type t +let d x = x diff --git a/ocamlbuild/test/test6/d.mli b/ocamlbuild/test/test6/d.mli new file mode 100644 index 00000000..496f5992 --- /dev/null +++ b/ocamlbuild/test/test6/d.mli @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +val d : 'a -> 'a diff --git a/ocamlbuild/test/test6/d.mli.v1 b/ocamlbuild/test/test6/d.mli.v1 new file mode 100644 index 00000000..26b952ce --- /dev/null +++ b/ocamlbuild/test/test6/d.mli.v1 @@ -0,0 +1,14 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +type t +val d : 'a -> 'a diff --git a/ocamlbuild/test/test6/d.mli.v2 b/ocamlbuild/test/test6/d.mli.v2 new file mode 100644 index 00000000..496f5992 --- /dev/null +++ b/ocamlbuild/test/test6/d.mli.v2 @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +val d : 'a -> 'a diff --git a/ocamlbuild/test/test6/main.ml b/ocamlbuild/test/test6/main.ml new file mode 100644 index 00000000..6d20a21d --- /dev/null +++ b/ocamlbuild/test/test6/main.ml @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +A.a 2. +. D.d 1. diff --git a/ocamlbuild/test/test6/main.mli b/ocamlbuild/test/test6/main.mli new file mode 100644 index 00000000..289f91f3 --- /dev/null +++ b/ocamlbuild/test/test6/main.mli @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* nothing *) diff --git a/ocamlbuild/test/test6/test.sh b/ocamlbuild/test/test6/test.sh new file mode 100755 index 00000000..8fb2e67e --- /dev/null +++ b/ocamlbuild/test/test6/test.sh @@ -0,0 +1,37 @@ +######################################################################### +# # +# OCaml # +# # +# Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2007 Institut National de Recherche en Informatique et # +# en Automatique. All rights reserved. This file is distributed # +# under the terms of the Q Public License version 1.0. # +# # +######################################################################### + +#!/bin/sh +cd `dirname $0` +set -x +rm -rf _build +CMDOPTS="" # -- command args +BUILD="$OCB -no-skip main.byte -classic-display $@" +BUILD1="$BUILD $CMDOPTS" +BUILD2="$BUILD -verbose 0 -nothing-should-be-rebuilt $CMDOPTS" +cp b.mli.v1 b.mli +cp d.mli.v1 d.mli +$BUILD1 +$BUILD2 +cp b.mli.v2 b.mli +cp d.mli.v2 d.mli +$BUILD1 +cp b.mli.v1 b.mli +if $BUILD1; then + if $BUILD2; then + echo PASS + else + echo "FAIL (-nothing-should-be-rebuilt)" + fi +else + echo FAIL +fi diff --git a/ocamlbuild/test/test7/_tags b/ocamlbuild/test/test7/_tags new file mode 100644 index 00000000..ec07803c --- /dev/null +++ b/ocamlbuild/test/test7/_tags @@ -0,0 +1,13 @@ +######################################################################### +# # +# OCaml # +# # +# Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2007 Institut National de Recherche en Informatique et # +# en Automatique. All rights reserved. This file is distributed # +# under the terms of the Q Public License version 1.0. # +# # +######################################################################### + +"main.byte": my_cool_plugin diff --git a/ocamlbuild/test/test7/aa.ml b/ocamlbuild/test/test7/aa.ml new file mode 100644 index 00000000..c4521f0d --- /dev/null +++ b/ocamlbuild/test/test7/aa.ml @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +let aa = "aa" diff --git a/ocamlbuild/test/test7/bb.mli b/ocamlbuild/test/test7/bb.mli new file mode 100644 index 00000000..63af4358 --- /dev/null +++ b/ocamlbuild/test/test7/bb.mli @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +val bb : int diff --git a/ocamlbuild/test/test7/bb1.ml b/ocamlbuild/test/test7/bb1.ml new file mode 100644 index 00000000..0b18853a --- /dev/null +++ b/ocamlbuild/test/test7/bb1.ml @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +let bb = 43 diff --git a/ocamlbuild/test/test7/bb2.ml b/ocamlbuild/test/test7/bb2.ml new file mode 100644 index 00000000..25221836 --- /dev/null +++ b/ocamlbuild/test/test7/bb2.ml @@ -0,0 +1,15 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +let bb = 43 +let f x = x + 1 +let () = incr (ref 0) diff --git a/ocamlbuild/test/test7/bb3.ml b/ocamlbuild/test/test7/bb3.ml new file mode 100644 index 00000000..11e3b9e1 --- /dev/null +++ b/ocamlbuild/test/test7/bb3.ml @@ -0,0 +1,15 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +let bb = 43 +let f x = x + 1 +let () = incr (ref 1) diff --git a/ocamlbuild/test/test7/bbcc.mllib b/ocamlbuild/test/test7/bbcc.mllib new file mode 100644 index 00000000..a97a0e6c --- /dev/null +++ b/ocamlbuild/test/test7/bbcc.mllib @@ -0,0 +1 @@ +Bb Cc diff --git a/ocamlbuild/test/test7/c2.ml b/ocamlbuild/test/test7/c2.ml new file mode 100644 index 00000000..d15ee418 --- /dev/null +++ b/ocamlbuild/test/test7/c2.ml @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +let c2 = 12 diff --git a/ocamlbuild/test/test7/c2.mli b/ocamlbuild/test/test7/c2.mli new file mode 100644 index 00000000..9ec012b2 --- /dev/null +++ b/ocamlbuild/test/test7/c2.mli @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +val c2 : int diff --git a/ocamlbuild/test/test7/c3.ml b/ocamlbuild/test/test7/c3.ml new file mode 100644 index 00000000..1596a100 --- /dev/null +++ b/ocamlbuild/test/test7/c3.ml @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +let c3 = Bb.bb + 13 diff --git a/ocamlbuild/test/test7/cc.ml b/ocamlbuild/test/test7/cc.ml new file mode 100644 index 00000000..1cba0473 --- /dev/null +++ b/ocamlbuild/test/test7/cc.ml @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +let cc = (String.length Aa.aa) + Bb.bb + C2.c2 diff --git a/ocamlbuild/test/test7/cool_plugin.ml b/ocamlbuild/test/test7/cool_plugin.ml new file mode 100644 index 00000000..b5400a54 --- /dev/null +++ b/ocamlbuild/test/test7/cool_plugin.ml @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +print_endline "I am a cool plugin" diff --git a/ocamlbuild/test/test7/main.ml b/ocamlbuild/test/test7/main.ml new file mode 100644 index 00000000..817ef569 --- /dev/null +++ b/ocamlbuild/test/test7/main.ml @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +let main = String.length Aa.aa - Bb.bb - C3.c3 - Cc.cc - 1 diff --git a/ocamlbuild/test/test7/myocamlbuild.ml b/ocamlbuild/test/test7/myocamlbuild.ml new file mode 100644 index 00000000..1d33e0bf --- /dev/null +++ b/ocamlbuild/test/test7/myocamlbuild.ml @@ -0,0 +1,19 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +open Ocamlbuild_plugin;; +dispatch begin function +| After_rules -> + use_lib "main" "bbcc"; + dep ["ocaml"; "link"; "byte"; "my_cool_plugin"] ["cool_plugin.cmo"]; +| _ -> () +end diff --git a/ocamlbuild/test/test7/test.sh b/ocamlbuild/test/test7/test.sh new file mode 100755 index 00000000..1d4eb1b5 --- /dev/null +++ b/ocamlbuild/test/test7/test.sh @@ -0,0 +1,30 @@ +######################################################################### +# # +# OCaml # +# # +# Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2007 Institut National de Recherche en Informatique et # +# en Automatique. All rights reserved. This file is distributed # +# under the terms of the Q Public License version 1.0. # +# # +######################################################################### + +#!/bin/sh +cd `dirname $0` +set -e +set -x +CMDOPTS="" # -- command args +BUILD="$OCB bbcc.cma main.byte bbcc.cmxa main.native -no-skip -classic-display $@" +BUILD1="$BUILD $CMDARGS" +BUILD2="$BUILD -verbose 0 -nothing-should-be-rebuilt $CMDARGS" +rm -rf _build +cp bb1.ml bb.ml +$BUILD1 +$BUILD2 +cp bb2.ml bb.ml +$BUILD1 -verbose 0 +$BUILD2 +cp bb3.ml bb.ml +$BUILD1 -verbose 0 +$BUILD2 diff --git a/ocamlbuild/test/test8/a.ml b/ocamlbuild/test/test8/a.ml new file mode 100644 index 00000000..c333d438 --- /dev/null +++ b/ocamlbuild/test/test8/a.ml @@ -0,0 +1,13 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +print_endline Myconfig.version;; diff --git a/ocamlbuild/test/test8/myocamlbuild.ml b/ocamlbuild/test/test8/myocamlbuild.ml new file mode 100644 index 00000000..52330ec6 --- /dev/null +++ b/ocamlbuild/test/test8/myocamlbuild.ml @@ -0,0 +1,28 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +open Ocamlbuild_plugin;; +let version = "0.1";; +dispatch begin function + | After_rules -> + rule "myconfig.ml" + ~prod:"myconfig.ml" + begin fun _ _ -> + Echo(["let version = \""; version; "\";;\n"], "myconfig.ml") + end; + + copy_rule "copy byte-code executables" "%(path).byte" "%(path:not <**/*.*>)"; + copy_rule "copy native executables" "%(path).native" "%(path:not <**/*.*>).opt"; + copy_rule "copy binaries to bin" "%(basename).%(extension)" + "bin/%(basename).%(extension:<{byte,native}>)"; + | _ -> () +end diff --git a/ocamlbuild/test/test8/test.sh b/ocamlbuild/test/test8/test.sh new file mode 100755 index 00000000..9b57933c --- /dev/null +++ b/ocamlbuild/test/test8/test.sh @@ -0,0 +1,23 @@ +######################################################################### +# # +# OCaml # +# # +# Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2007 Institut National de Recherche en Informatique et # +# en Automatique. All rights reserved. This file is distributed # +# under the terms of the Q Public License version 1.0. # +# # +######################################################################### + +#!/bin/sh +cd `dirname $0` +set -e +set -x +CMDOPTS="" # -- command args +BUILD="$OCB a.byte a.native a a.opt bin/a bin/a.opt -no-skip -classic-display $@" +BUILD1="$BUILD $CMDOPTS" +BUILD2="$BUILD -verbose 0 -nothing-should-be-rebuilt $CMDOPTS" +rm -rf _build +$BUILD1 +$BUILD2 diff --git a/ocamlbuild/test/test9/dbgl b/ocamlbuild/test/test9/dbgl new file mode 100644 index 00000000..78290948 --- /dev/null +++ b/ocamlbuild/test/test9/dbgl @@ -0,0 +1,22 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +#load "unix.cma";; +#load "str.cma";; +#load "discard_printf.cmo";; +#load "debug.cmo";; +#load "bool.cmo";; +#load "glob_ast.cmo";; +#load "glob_lexer.cmo";; +#load "my_unix.cmo";; +#use "glob.ml";; +#install_printer print_is;; diff --git a/ocamlbuild/test/test9/test.sh b/ocamlbuild/test/test9/test.sh new file mode 100755 index 00000000..aaed954c --- /dev/null +++ b/ocamlbuild/test/test9/test.sh @@ -0,0 +1,18 @@ +######################################################################### +# # +# OCaml # +# # +# Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2007 Institut National de Recherche en Informatique et # +# en Automatique. All rights reserved. This file is distributed # +# under the terms of the Q Public License version 1.0. # +# # +######################################################################### + +#!/bin/sh +set -e +set -x +cd `dirname $0`/../.. +$OCB -quiet -build-dir _buildtest -no-links test/test9/testglob.native $@ +./_buildtest/test/test9/testglob.native diff --git a/ocamlbuild/test/test9/testglob.ml b/ocamlbuild/test/test9/testglob.ml new file mode 100644 index 00000000..77778731 --- /dev/null +++ b/ocamlbuild/test/test9/testglob.ml @@ -0,0 +1,146 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* Testglob *) + +open Bool;; +open Glob;; + +let yep f x = + try + ignore (f x); + true + with + | _ -> false +;; + +let tests1 = [ + "\"hello\"", true; + "<hello>", true; + "<hel*lo>", true; + "<a> and <b> or <c>", true; + "<a> titi", false +];; + +let tests2 = [ + "<[a]>", ["a"], ["b"]; + "<[a-z]>", ["a";"e";"k";"z"], ["0";"A";"~"]; + "<[a-z][0-9]>", ["a0";"b9"], ["a00";"a0a";"b0a";"isduis";""]; + "<hello>", ["hello"], ["helli"]; + "\"hello\"", ["hello"], ["heidi"]; + "<*>", ["";"a";"ax"], []; + "<a*b>", ["ab";"acb";"axxxxxb";"ababbababb"], ["abx";"xxxxxab";"xab"]; + "<*.ml>", ["hello.ml";".ml"], ["ml"; ""; "toto.mli"]; + "<a>", ["a"], ["";"aa";"ba";"ab";"abaa"]; + "<ab>", ["ab"], ["";"abab";"aba";"abx"]; + "<ab?c>", ["abac";"abxc"], ["abab";"ababab";"ababa"]; + "<*ab?cd*>", ["123abecd345";"abccd";"abccd345";"ababcababccdab"], ["abcd";"aaaaabcdababcd"]; + "<*this*is*a*test*>", ["this is a test";"You know this is a test really";"thisisatest"], ["thisatest"]; + "<b*>", ["bxx";"bx"], ["aaab";""]; + "<*>", ["";"a";"aaa";"aaaaa"], []; + "<?>", ["a"],["";"aaa";"aaaaa"]; + "<{a,b}>", ["a";"b"],["";"aa";"ab";"ba";"bb";"c"]; + "<toto.{ml,mli}>", ["toto.ml";"toto.mli"],["toto.";"toto.mll"]; + "<{a,b}{c,[de]}{f,g}>", ["acf";"acg";"adf";"adg";"aef";"aeg";"bcf";"bcg";"bdf";"bdg";"bef";"beg"], + ["afg";"af";"aee"]; + "(<*.ml> or <*.mli>) and not \"hello.ml\"", + ["a.ml"; "b.ml"; "a.mli"], + ["hello.ml"; "a.mli.x"]; + "<*>", ["alpha";"beta"], ["alpha/beta";"gamma/delta"]; + "<alpha/**/beta>", ["alpha/beta";"alpha/gamma/beta";"alpha/gamma/delta/beta"], + ["alpha";"beta";"gamma/delta"]; + "<**/*.ml>", ["toto.ml";"toto/tata.ml";"alpha/gamma/delta/beta.ml"], + ["toto.mli"]; + "<toto/**>", ["toto/";"toto/tata";"toto/alpha/gamma/delta/beta.ml";"toto"], + ["toto2/tata"; "tata/titi"] +];; + +let tests3 = [ + "%(path:<**/>)lib%(libname:<*> and not <*.*>).a", + ["libfoo.a","","foo"; + "src/bar/libfoo.a","src/bar/","foo"; + "otherlibs/unix/libunix.a","otherlibs/unix/","unix"; + "otherlibsliblib/unlibix/libunix.a","otherlibsliblib/unlibix/","unix"; + "libfoo/libbar.a","libfoo/","bar"; + "src/libfoo/boo/libbar.a","src/libfoo/boo/","bar"; + ], + ["bar"; "libbar/foo.a"; "libfoo.b.a"] +];; + +let _ = + let times = 3 in + List.iter + begin fun (str, ast) -> + let ast' = yep Glob.parse str in + if ast <> ast' then + begin + Printf.printf "Globexp parsing failed for %S.\n%!" str; + exit 1 + end + else + Printf.printf "Globexp for %S OK\n%!" str + end + tests1; + List.iter + begin fun (gstr, yes, no) -> + let globber = Glob.parse gstr in + let check polarity = + List.iter + begin fun y -> + if Glob.eval globber y = polarity then + Printf.printf "Glob.eval %S %S = %b OK\n%!" gstr y polarity + else + begin + Printf.printf "Glob.eval %S %S = %b FAIL\n%!" gstr y (not polarity); + exit 1 + end + end + in + for k = 1 to times do + check true yes; + check false no + done + end + tests2; + List.iter begin fun (str, yes, no) -> + let resource = Resource.import_pattern str in + for k = 1 to times do + List.iter begin fun (y, path, libname) -> + let resource' = Resource.import y in + match Resource.matchit resource resource' with + | Some env -> + let path' = Resource.subst env "%(path)" in + let libname' = Resource.subst env "%(libname)" in + if path' = path && libname = libname' then + Printf.printf "Resource.matchit %S %S OK\n%!" str y + else begin + Printf.printf "Resource.matchit %S %S FAIL\n%!" str y; + exit 1 + end + | None -> + begin + Printf.printf "Resource.matchit %S %S = None FAIL\n%!" str y; + exit 1 + end + end yes; + List.iter begin fun y -> + let resource' = Resource.import y in + if Resource.matchit resource resource' = None then + Printf.printf "Resource.matchit %S %S = None OK\n%!" str y + else begin + Printf.printf "Resource.matchit %S %S <> None FAIL\n%!" str y; + exit 1 + end + end no + done + end tests3 +;; diff --git a/ocamlbuild/test/test_virtual/foo.itarget b/ocamlbuild/test/test_virtual/foo.itarget new file mode 100644 index 00000000..257cc564 --- /dev/null +++ b/ocamlbuild/test/test_virtual/foo.itarget @@ -0,0 +1 @@ +foo diff --git a/ocamlbuild/test/test_virtual/foo1 b/ocamlbuild/test/test_virtual/foo1 new file mode 100644 index 00000000..1715acd6 --- /dev/null +++ b/ocamlbuild/test/test_virtual/foo1 @@ -0,0 +1 @@ +foo1 diff --git a/ocamlbuild/test/test_virtual/foo2 b/ocamlbuild/test/test_virtual/foo2 new file mode 100644 index 00000000..54b060ee --- /dev/null +++ b/ocamlbuild/test/test_virtual/foo2 @@ -0,0 +1 @@ +foo2 diff --git a/ocamlbuild/test/test_virtual/myocamlbuild.ml b/ocamlbuild/test/test_virtual/myocamlbuild.ml new file mode 100644 index 00000000..049628fa --- /dev/null +++ b/ocamlbuild/test/test_virtual/myocamlbuild.ml @@ -0,0 +1,23 @@ +(***********************************************************************) +(* *) +(* ocamlbuild *) +(* *) +(* Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2007 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +open Ocamlbuild_plugin;; +dispatch begin function + | After_rules -> + rule "copy foo" + ~prod:"bar" + ~dep:"foo.otarget" + begin fun _env _build -> + cp "foo" "bar" + end + | _ -> () +end diff --git a/ocamlbuild/test/test_virtual/test.sh b/ocamlbuild/test/test_virtual/test.sh new file mode 100755 index 00000000..9960c83f --- /dev/null +++ b/ocamlbuild/test/test_virtual/test.sh @@ -0,0 +1,28 @@ +######################################################################### +# # +# OCaml # +# # +# Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt # +# # +# Copyright 2007 Institut National de Recherche en Informatique et # +# en Automatique. All rights reserved. This file is distributed # +# under the terms of the Q Public License version 1.0. # +# # +######################################################################### + +#!/bin/sh +cd `dirname $0` +set -e +set -x +CMDOPTS="" # -- command args +BUILD="$OCB bar -no-skip -classic-display $@" +BUILD1="$BUILD $CMDOPTS" +BUILD2="$BUILD -verbose 0 -nothing-should-be-rebuilt $CMDOPTS" +rm -rf _build +cp foo1 foo +$BUILD1 +$BUILD2 +cp foo2 foo +$BUILD1 -verbose 0 +$BUILD2 +rm foo diff --git a/ocamlbuild/testsuite/internal.ml b/ocamlbuild/testsuite/internal.ml index d0071543..9b48af52 100644 --- a/ocamlbuild/testsuite/internal.ml +++ b/ocamlbuild/testsuite/internal.ml @@ -160,6 +160,13 @@ let () = test "OutputObj" ~tree:[T.f "hello.ml" ~content:"print_endline \"Hello, World!\""] ~targets:("hello.byte.o",["hello.byte.c";"hello.native.o"]) ();; +let () = test "OutputShared" + ~options:[`no_ocamlfind] + ~description:"output_shared targets for native and bytecode (PR #6733)" + ~tree:[T.f "hello.ml" ~content:"print_endline \"Hello, World!\""; + T.f "_tags" ~content:"<*.so>: runtime_variant(_pic)"] + ~targets:("hello.byte.so",["hello.native.so"]) ();; + let () = test "StrictSequenceFlag" ~options:[`no_ocamlfind; `quiet] ~description:"strict_sequence tag" diff --git a/ocamldoc/.depend b/ocamldoc/.depend index b98bb57f..6c729e32 100644 --- a/ocamldoc/.depend +++ b/ocamldoc/.depend @@ -1,11 +1,3 @@ -odoc.cmo : ../typing/typedtree.cmi odoc_messages.cmo odoc_info.cmi \ - odoc_global.cmi odoc_gen.cmi odoc_config.cmi odoc_args.cmi \ - odoc_analyse.cmi ../utils/misc.cmi ../utils/config.cmi \ - ../utils/clflags.cmi -odoc.cmx : ../typing/typedtree.cmx odoc_messages.cmx odoc_info.cmx \ - odoc_global.cmx odoc_gen.cmx odoc_config.cmx odoc_args.cmx \ - odoc_analyse.cmx ../utils/misc.cmx ../utils/config.cmx \ - ../utils/clflags.cmx odoc_analyse.cmo : ../utils/warnings.cmi ../typing/types.cmi \ ../typing/typemod.cmi ../typing/typedtree.cmi ../parsing/syntaxerr.cmi \ ../driver/pparse.cmi ../parsing/parse.cmi odoc_types.cmi odoc_text.cmi \ @@ -52,6 +44,8 @@ odoc_class.cmo : ../typing/types.cmi odoc_value.cmo odoc_types.cmi \ odoc_parameter.cmo odoc_name.cmi odoc_class.cmx : ../typing/types.cmx odoc_value.cmx odoc_types.cmx \ odoc_parameter.cmx odoc_name.cmx +odoc_comments_global.cmo : odoc_comments_global.cmi +odoc_comments_global.cmx : odoc_comments_global.cmi odoc_comments.cmo : odoc_types.cmi odoc_text.cmi odoc_see_lexer.cmo \ odoc_parser.cmi odoc_misc.cmi odoc_messages.cmo odoc_merge.cmi \ odoc_lexer.cmo odoc_global.cmi odoc_cross.cmi odoc_comments_global.cmi \ @@ -60,8 +54,6 @@ odoc_comments.cmx : odoc_types.cmx odoc_text.cmx odoc_see_lexer.cmx \ odoc_parser.cmx odoc_misc.cmx odoc_messages.cmx odoc_merge.cmx \ odoc_lexer.cmx odoc_global.cmx odoc_cross.cmx odoc_comments_global.cmx \ odoc_comments.cmi -odoc_comments_global.cmo : odoc_comments_global.cmi -odoc_comments_global.cmx : odoc_comments_global.cmi odoc_config.cmo : ../utils/config.cmi odoc_config.cmi odoc_config.cmx : ../utils/config.cmx odoc_config.cmi odoc_control.cmo : @@ -150,6 +142,14 @@ odoc_misc.cmo : ../typing/types.cmi ../typing/predef.cmi ../typing/path.cmi \ odoc_misc.cmx : ../typing/types.cmx ../typing/predef.cmx ../typing/path.cmx \ odoc_types.cmx odoc_messages.cmx ../parsing/longident.cmx \ ../typing/ctype.cmx ../typing/btype.cmx odoc_misc.cmi +odoc.cmo : ../typing/typedtree.cmi odoc_messages.cmo odoc_info.cmi \ + odoc_global.cmi odoc_gen.cmi odoc_config.cmi odoc_args.cmi \ + odoc_analyse.cmi ../utils/misc.cmi ../utils/config.cmi \ + ../utils/clflags.cmi +odoc.cmx : ../typing/typedtree.cmx odoc_messages.cmx odoc_info.cmx \ + odoc_global.cmx odoc_gen.cmx odoc_config.cmx odoc_args.cmx \ + odoc_analyse.cmx ../utils/misc.cmx ../utils/config.cmx \ + ../utils/clflags.cmx odoc_module.cmo : ../typing/types.cmi odoc_value.cmo odoc_types.cmi \ odoc_type.cmo odoc_name.cmi odoc_extension.cmo odoc_exception.cmo \ odoc_class.cmo @@ -212,12 +212,12 @@ odoc_texi.cmo : ../typing/types.cmi odoc_to_text.cmo odoc_messages.cmo \ odoc_info.cmi ../parsing/asttypes.cmi odoc_texi.cmx : ../typing/types.cmx odoc_to_text.cmx odoc_messages.cmx \ odoc_info.cmx ../parsing/asttypes.cmi +odoc_text_lexer.cmo : odoc_text_parser.cmi odoc_misc.cmi +odoc_text_lexer.cmx : odoc_text_parser.cmx odoc_misc.cmx odoc_text.cmo : odoc_types.cmi odoc_text_parser.cmi odoc_text_lexer.cmo \ odoc_text.cmi odoc_text.cmx : odoc_types.cmx odoc_text_parser.cmx odoc_text_lexer.cmx \ odoc_text.cmi -odoc_text_lexer.cmo : odoc_text_parser.cmi odoc_misc.cmi -odoc_text_lexer.cmx : odoc_text_parser.cmx odoc_misc.cmx odoc_text_parser.cmo : odoc_types.cmi odoc_misc.cmi odoc_text_parser.cmi odoc_text_parser.cmx : odoc_types.cmx odoc_misc.cmx odoc_text_parser.cmi odoc_to_text.cmo : odoc_module.cmo odoc_messages.cmo odoc_info.cmi @@ -236,8 +236,8 @@ odoc_analyse.cmi : odoc_module.cmo odoc_global.cmi odoc_args.cmi : odoc_gen.cmi odoc_ast.cmi : ../typing/types.cmi ../typing/typedtree.cmi \ ../parsing/parsetree.cmi odoc_sig.cmi odoc_name.cmi odoc_module.cmo -odoc_comments.cmi : odoc_types.cmi odoc_module.cmo odoc_comments_global.cmi : +odoc_comments.cmi : odoc_types.cmi odoc_module.cmo odoc_config.cmi : odoc_cross.cmi : odoc_types.cmi odoc_module.cmo odoc_dag2html.cmi : odoc_info.cmi diff --git a/ocamldoc/Makefile b/ocamldoc/Makefile index 7a487c6c..7c6d9885 100644 --- a/ocamldoc/Makefile +++ b/ocamldoc/Makefile @@ -11,16 +11,16 @@ #(***********************************************************************) include ../config/Makefile +CAMLRUN ?= ../boot/ocamlrun +CAMLYACC ?= ../boot/ocamlyacc # Various commands and dir ########################## ROOTDIR = .. -OCAMLRUN = $(ROOTDIR)/boot/ocamlrun -OCAMLC = $(OCAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib -OCAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib -OCAMLDEP = $(OCAMLRUN) $(ROOTDIR)/tools/ocamldep -OCAMLLEX = $(OCAMLRUN) $(ROOTDIR)/boot/ocamllex -OCAMLYACC = $(ROOTDIR)/yacc/ocamlyacc +OCAMLC = $(CAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib +OCAMLOPT = $(CAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib +OCAMLDEP = $(CAMLRUN) $(ROOTDIR)/tools/ocamldep +OCAMLLEX = $(CAMLRUN) $(ROOTDIR)/boot/ocamllex OCAMLLIB = $(LIBDIR) OCAMLBIN = $(BINDIR) @@ -233,10 +233,10 @@ odoc_see_lexer.ml: odoc_see_lexer.mll $(OCAMLLEX) $< .mly.ml: - $(OCAMLYACC) -v $< + $(CAMLYACC) -v $< .mly.mli: - $(OCAMLYACC) -v $< + $(CAMLYACC) -v $< # Installation targets ###################### @@ -343,8 +343,8 @@ clean:: dummy @rm -f generators/*.cm[aiox] generators/*.$(A) generators/*.$(O) generators/*.cmx[as] depend:: - $(OCAMLYACC) odoc_text_parser.mly - $(OCAMLYACC) odoc_parser.mly + $(CAMLYACC) odoc_text_parser.mly + $(CAMLYACC) odoc_parser.mly $(OCAMLLEX) odoc_text_lexer.mll $(OCAMLLEX) odoc_lexer.mll $(OCAMLLEX) odoc_ocamlhtml.mll diff --git a/ocamldoc/Makefile.nt b/ocamldoc/Makefile.nt index 22cd36eb..9c009596 100644 --- a/ocamldoc/Makefile.nt +++ b/ocamldoc/Makefile.nt @@ -11,16 +11,16 @@ #(***********************************************************************) include ../config/Makefile +CAMLRUN ?= ../boot/ocamlrun +CAMLYACC ?= ../boot/ocamlyacc # Various commands and dir ########################## ROOTDIR = .. -OCAMLRUN = $(ROOTDIR)/boot/ocamlrun -OCAMLC = $(OCAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib -OCAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib -OCAMLDEP = $(OCAMLRUN) $(ROOTDIR)/tools/ocamldep -OCAMLLEX = $(OCAMLRUN) $(ROOTDIR)/boot/ocamllex -OCAMLYACC = $(ROOTDIR)/yacc/ocamlyacc +OCAMLC = $(CAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib +OCAMLOPT = $(CAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib +OCAMLDEP = $(CAMLRUN) $(ROOTDIR)/tools/ocamldep +OCAMLLEX = $(CAMLRUN) $(ROOTDIR)/boot/ocamllex OCAMLLIB = $(LIBDIR) OCAMLBIN = $(BINDIR) @@ -202,10 +202,10 @@ odoc_see_lexer.ml: odoc_see_lexer.mll $(OCAMLLEX) $< .mly.ml: - $(OCAMLYACC) -v $< + $(CAMLYACC) -v $< .mly.mli: - $(OCAMLYACC) -v $< + $(CAMLYACC) -v $< # Installation targets ###################### @@ -240,8 +240,8 @@ clean:: dummy @rm -f generators/*.cm[aiox] generators/*.$(A) generators/*.$(O) generators/*.cmx[as] depend:: - $(OCAMLYACC) odoc_text_parser.mly - $(OCAMLYACC) odoc_parser.mly + $(CAMLYACC) odoc_text_parser.mly + $(CAMLYACC) odoc_parser.mly $(OCAMLLEX) odoc_text_lexer.mll $(OCAMLLEX) odoc_lexer.mll $(OCAMLLEX) odoc_ocamlhtml.mll diff --git a/ocamldoc/odoc_ast.ml b/ocamldoc/odoc_ast.ml index 358a71a5..2e6d1ded 100644 --- a/ocamldoc/odoc_ast.ml +++ b/ocamldoc/odoc_ast.ml @@ -1181,8 +1181,7 @@ module Analyser = | Parsetree.Pstr_type name_typedecl_list -> (* of (string * type_declaration) list *) - (* we start by extending the environment *) - let new_env = + let extended_env = List.fold_left (fun acc_env {Parsetree.ptype_name = { txt = name }} -> let complete_name = Name.concat current_module_name name in @@ -1191,6 +1190,16 @@ module Analyser = env name_typedecl_list in + let env = + let is_nonrec = + List.exists + (fun td -> + List.exists (fun (n, _) -> n.txt = "nonrec") + td.Parsetree.ptype_attributes) + name_typedecl_list + in + if is_nonrec then env else extended_env + in let rec f ?(first=false) maybe_more_acc last_pos name_type_decl_list = match name_type_decl_list with [] -> (maybe_more_acc, []) @@ -1220,7 +1229,7 @@ module Analyser = get_comments_in_module last_pos loc_start in let kind = Sig.get_type_kind - new_env name_comment_list + env name_comment_list tt_type_decl.Types.type_kind in let new_end = loc_end + maybe_more in @@ -1232,7 +1241,7 @@ module Analyser = List.map2 (fun p v -> let (co, cn) = Types.Variance.get_upper v in - (Odoc_env.subst_type new_env p, co, cn)) + (Odoc_env.subst_type env p, co, cn)) tt_type_decl.Types.type_params tt_type_decl.Types.type_variance ; ty_kind = kind ; @@ -1241,7 +1250,7 @@ module Analyser = (match tt_type_decl.Types.type_manifest with None -> None | Some t -> - Some (Sig.manifest_structure new_env name_comment_list t)); + Some (Sig.manifest_structure env name_comment_list t)); ty_loc = { loc_impl = Some loc ; loc_inter = None } ; ty_code = ( @@ -1262,7 +1271,7 @@ module Analyser = (maybe_more3, ele_comments @ ((Element_type t) :: eles)) in let (maybe_more, eles) = f ~first: true 0 loc.Location.loc_start.Lexing.pos_cnum name_typedecl_list in - (maybe_more, new_env, eles) + (maybe_more, extended_env, eles) | Parsetree.Pstr_typext tyext -> (* we get the extension declaration in the typed tree *) @@ -1709,7 +1718,11 @@ module Analyser = } in match (p_module_expr.Parsetree.pmod_desc, tt_module_expr.Typedtree.mod_desc) with - (Parsetree.Pmod_ident longident, Typedtree.Tmod_ident (path, _)) -> + (Parsetree.Pmod_ident longident, Typedtree.Tmod_ident (path, _)) + | (Parsetree.Pmod_ident longident, + Typedtree.Tmod_constraint + ({Typedtree.mod_desc = Typedtree.Tmod_ident (path, _)}, _, _, _)) + -> let alias_name = Odoc_env.full_module_name env (Name.from_path path) in { m_base with m_kind = Module_alias { ma_name = alias_name ; ma_module = None ; } } @@ -1859,6 +1872,7 @@ module Analyser = (*DEBUG*) | Parsetree.Pmod_apply _ -> "Pmod_apply" (*DEBUG*) | Parsetree.Pmod_constraint _ -> "Pmod_constraint" (*DEBUG*) | Parsetree.Pmod_unpack _ -> "Pmod_unpack" + (*DEBUG*) | Parsetree.Pmod_extension _ -> "Pmod_extension" (*DEBUG*)in (*DEBUG*)let s_typed = (*DEBUG*) match typedtree with diff --git a/ocamldoc/odoc_name.ml b/ocamldoc/odoc_name.ml index bdb1f58c..296331ad 100644 --- a/ocamldoc/odoc_name.ml +++ b/ocamldoc/odoc_name.ml @@ -28,6 +28,7 @@ let infix_chars = [ '|' ; ':' ; '~' ; '!' ; + '#' ; ] type t = string diff --git a/ocamldoc/odoc_sig.ml b/ocamldoc/odoc_sig.ml index e41cf2b8..a10837ff 100644 --- a/ocamldoc/odoc_sig.ml +++ b/ocamldoc/odoc_sig.ml @@ -723,8 +723,7 @@ module Analyser = (maybe_more, new_env, [ Element_exception e ]) | Parsetree.Psig_type name_type_decl_list -> - (* we start by extending the environment *) - let new_env = + let extended_env = List.fold_left (fun acc_env td -> let complete_name = Name.concat current_module_name td.Parsetree.ptype_name.txt in @@ -733,6 +732,16 @@ module Analyser = env name_type_decl_list in + let env = + let is_nonrec = + List.exists + (fun td -> + List.exists (fun (n, _) -> n.txt = "nonrec") + td.Parsetree.ptype_attributes) + name_type_decl_list + in + if is_nonrec then env else extended_env + in let rec f ?(first=false) acc_maybe_more last_pos name_type_decl_list = match name_type_decl_list with [] -> @@ -768,7 +777,7 @@ module Analyser = raise (Failure (Odoc_messages.type_not_found current_module_name name.txt)) in (* get the type kind with the associated comments *) - let type_kind = get_type_kind new_env name_comment_list sig_type_decl.Types.type_kind in + let type_kind = get_type_kind env name_comment_list sig_type_decl.Types.type_kind in let loc_start = type_decl.Parsetree.ptype_loc.Location.loc_start.Lexing.pos_cnum in let new_end = type_decl.Parsetree.ptype_loc.Location.loc_end.Lexing.pos_cnum + maybe_more in (* associate the comments to each constructor and build the [Type.t_type] *) @@ -779,7 +788,7 @@ module Analyser = ty_parameters = List.map2 (fun p v -> let (co, cn) = Types.Variance.get_upper v in - (Odoc_env.subst_type new_env p,co, cn)) + (Odoc_env.subst_type env p,co, cn)) sig_type_decl.Types.type_params sig_type_decl.Types.type_variance; ty_kind = type_kind; @@ -814,7 +823,7 @@ module Analyser = (new_maybe_more, (ele_comments @ [Element_type new_type]) @ eles) in let (maybe_more, types) = f ~first: true 0 pos_start_ele name_type_decl_list in - (maybe_more, new_env, types) + (maybe_more, extended_env, types) | Parsetree.Psig_open _ -> (* A VOIR *) let ele_comments = match comment_opt with diff --git a/otherlibs/Makefile b/otherlibs/Makefile index 397497dd..3ca2a487 100644 --- a/otherlibs/Makefile +++ b/otherlibs/Makefile @@ -13,10 +13,10 @@ # Common Makefile for otherlibs on the Unix ports -CAMLC=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib -CAMLOPT=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlopt -nostdlib \ +CAMLC=$(CAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib +CAMLOPT=$(CAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib \ -I $(ROOTDIR)/stdlib -CFLAGS=-I$(ROOTDIR)/byterun -O $(SHAREDCCCOMPOPTS) $(EXTRACFLAGS) +CFLAGS=-I$(ROOTDIR)/byterun $(SHAREDCCCOMPOPTS) $(EXTRACFLAGS) include ../Makefile.shared # Note .. is the current directory (this makefile is included from diff --git a/otherlibs/Makefile.shared b/otherlibs/Makefile.shared index 9bed5f76..cb8bf174 100644 --- a/otherlibs/Makefile.shared +++ b/otherlibs/Makefile.shared @@ -15,10 +15,11 @@ ROOTDIR=../.. include $(ROOTDIR)/config/Makefile +CAMLRUN ?= $(ROOTDIR)/boot/ocamlrun +CAMLYACC ?= $(ROOTDIR)/boot/ocamlyacc # Compilation options CC=$(BYTECC) -CAMLRUN=$(ROOTDIR)/boot/ocamlrun COMPFLAGS=-w +33..39 -warn-error A -bin-annot -g -safe-string $(EXTRACAMLFLAGS) MKLIB=$(CAMLRUN) $(ROOTDIR)/tools/ocamlmklib diff --git a/otherlibs/bigarray/.depend b/otherlibs/bigarray/.depend index 889328a3..b4649586 100644 --- a/otherlibs/bigarray/.depend +++ b/otherlibs/bigarray/.depend @@ -1,21 +1,26 @@ -bigarray_stubs.o: bigarray_stubs.c ../../byterun/alloc.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h bigarray.h \ - ../../byterun/config.h ../../byterun/mlvalues.h ../../byterun/custom.h \ - ../../byterun/fail.h ../../byterun/intext.h ../../byterun/io.h \ - ../../byterun/hash.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h -mmap_unix.o: mmap_unix.c bigarray.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/mlvalues.h ../../byterun/config.h ../../byterun/misc.h \ - ../../byterun/custom.h ../../byterun/mlvalues.h ../../byterun/fail.h \ - ../../byterun/io.h ../../byterun/sys.h ../../byterun/signals.h -mmap_win32.o: mmap_win32.c bigarray.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/mlvalues.h ../../byterun/config.h ../../byterun/misc.h \ - ../../byterun/alloc.h ../../byterun/mlvalues.h ../../byterun/custom.h \ - ../../byterun/fail.h ../../byterun/sys.h ../unix/unixsupport.h +bigarray_stubs.o: bigarray_stubs.c ../../byterun/caml/alloc.h \ + ../../byterun/caml/misc.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/mlvalues.h bigarray.h ../../byterun/caml/config.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/custom.h \ + ../../byterun/caml/fail.h ../../byterun/caml/intext.h \ + ../../byterun/caml/io.h ../../byterun/caml/hash.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h +mmap_unix.o: mmap_unix.c bigarray.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/config.h \ + ../../byterun/caml/misc.h ../../byterun/caml/custom.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/io.h ../../byterun/caml/sys.h \ + ../../byterun/caml/signals.h +mmap_win32.o: mmap_win32.c bigarray.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/config.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/custom.h \ + ../../byterun/caml/fail.h ../../byterun/caml/sys.h ../unix/unixsupport.h bigarray.cmi : bigarray.cmo : bigarray.cmi bigarray.cmx : bigarray.cmi diff --git a/otherlibs/bigarray/Makefile b/otherlibs/bigarray/Makefile index 3f8c52f2..3bcc7a40 100644 --- a/otherlibs/bigarray/Makefile +++ b/otherlibs/bigarray/Makefile @@ -21,7 +21,7 @@ HEADERS=bigarray.h include ../Makefile depend: - gcc -MM $(CFLAGS) *.c > .depend - ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend + $(CC) -MM $(CFLAGS) *.c > .depend + $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/bigarray/Makefile.nt b/otherlibs/bigarray/Makefile.nt index db5ed605..baeaa7a1 100644 --- a/otherlibs/bigarray/Makefile.nt +++ b/otherlibs/bigarray/Makefile.nt @@ -21,7 +21,7 @@ HEADERS=bigarray.h include ../Makefile.nt depend: - gcc -MM $(CFLAGS) *.c > .depend - ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend + $(CC) -MM $(CFLAGS) *.c > .depend + $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/bigarray/bigarray.h b/otherlibs/bigarray/bigarray.h index c10e20cf..23bde233 100644 --- a/otherlibs/bigarray/bigarray.h +++ b/otherlibs/bigarray/bigarray.h @@ -15,10 +15,10 @@ #define CAML_BIGARRAY_H #ifndef CAML_NAME_SPACE -#include "compatibility.h" +#include "caml/compatibility.h" #endif -#include "config.h" -#include "mlvalues.h" +#include "caml/config.h" +#include "caml/mlvalues.h" typedef signed char caml_ba_int8; typedef unsigned char caml_ba_uint8; @@ -106,10 +106,18 @@ struct caml_ba_array { #define CAMLBAextern CAMLextern #endif +#ifdef __cplusplus +extern "C" { +#endif + CAMLBAextern value caml_ba_alloc(int flags, int num_dims, void * data, intnat * dim); CAMLBAextern value caml_ba_alloc_dims(int flags, int num_dims, void * data, ... /*dimensions, with type intnat */); CAMLBAextern uintnat caml_ba_byte_size(struct caml_ba_array * b); +#ifdef __cplusplus +} #endif + +#endif /* CAML_BIGARRAY_H */ diff --git a/otherlibs/bigarray/bigarray.mli b/otherlibs/bigarray/bigarray.mli index b3016a71..6bde90a9 100644 --- a/otherlibs/bigarray/bigarray.mli +++ b/otherlibs/bigarray/bigarray.mli @@ -452,7 +452,11 @@ module Genarray : the initial call to [map_file]. Therefore, you should make sure no other process modifies the mapped file while you're accessing it, or a SIGBUS signal may be raised. This happens, for instance, if the - file is shrinked. *) + file is shrunk. + + This function raises [Sys_error] in the case of any errors from the + underlying system calls. [Invalid_argument] or [Failure] may be + raised in cases where argument validation fails. *) end diff --git a/otherlibs/bigarray/bigarray_stubs.c b/otherlibs/bigarray/bigarray_stubs.c index 7e63cbf4..c98a92f0 100644 --- a/otherlibs/bigarray/bigarray_stubs.c +++ b/otherlibs/bigarray/bigarray_stubs.c @@ -14,14 +14,14 @@ #include <stddef.h> #include <stdarg.h> #include <string.h> -#include "alloc.h" +#include "caml/alloc.h" #include "bigarray.h" -#include "custom.h" -#include "fail.h" -#include "intext.h" -#include "hash.h" -#include "memory.h" -#include "mlvalues.h" +#include "caml/custom.h" +#include "caml/fail.h" +#include "caml/intext.h" +#include "caml/hash.h" +#include "caml/memory.h" +#include "caml/mlvalues.h" #define int8 caml_ba_int8 #define uint8 caml_ba_uint8 diff --git a/otherlibs/bigarray/mmap_unix.c b/otherlibs/bigarray/mmap_unix.c index cdcfe3ce..027b1e5c 100644 --- a/otherlibs/bigarray/mmap_unix.c +++ b/otherlibs/bigarray/mmap_unix.c @@ -18,12 +18,12 @@ #include <stddef.h> #include <string.h> #include "bigarray.h" -#include "custom.h" -#include "fail.h" -#include "io.h" -#include "mlvalues.h" -#include "sys.h" -#include "signals.h" +#include "caml/custom.h" +#include "caml/fail.h" +#include "caml/io.h" +#include "caml/mlvalues.h" +#include "caml/sys.h" +#include "caml/signals.h" extern int caml_ba_element_size[]; /* from bigarray_stubs.c */ diff --git a/otherlibs/bigarray/mmap_win32.c b/otherlibs/bigarray/mmap_win32.c index cd9da4af..5d7ec6bb 100644 --- a/otherlibs/bigarray/mmap_win32.c +++ b/otherlibs/bigarray/mmap_win32.c @@ -15,11 +15,11 @@ #include <stdio.h> #include <string.h> #include "bigarray.h" -#include "alloc.h" -#include "custom.h" -#include "fail.h" -#include "mlvalues.h" -#include "sys.h" +#include "caml/alloc.h" +#include "caml/custom.h" +#include "caml/fail.h" +#include "caml/mlvalues.h" +#include "caml/sys.h" #include "unixsupport.h" extern int caml_ba_element_size[]; /* from bigarray_stubs.c */ diff --git a/otherlibs/dynlink/Makefile b/otherlibs/dynlink/Makefile index 6284a528..acff7a7a 100644 --- a/otherlibs/dynlink/Makefile +++ b/otherlibs/dynlink/Makefile @@ -13,15 +13,18 @@ # Makefile for the dynamic link library +# FIXME reduce redundancy by including ../Makefile + include ../../config/Makefile +CAMLRUN ?= ../../boot/ocamlrun +CAMLYACC ?= ../../boot/ocamlyacc ROOTDIR = ../.. -OCAMLRUN = $(ROOTDIR)/boot/ocamlrun -OCAMLC = $(OCAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib -OCAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib +OCAMLC = $(CAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib +OCAMLOPT = $(CAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib INCLUDES=-I ../../utils -I ../../typing -I ../../bytecomp -I ../../asmcomp -COMPFLAGS=-w +33..39 -warn-error A -bin-annot -safe-string \ +COMPFLAGS=-w +33..39 -warn-error A -bin-annot -g -safe-string \ -I ../../stdlib $(INCLUDES) OBJS=dynlinkaux.cmo dynlink.cmo @@ -32,7 +35,7 @@ COMPILEROBJS=\ ../../utils/terminfo.cmo ../../utils/warnings.cmo \ ../../parsing/asttypes.cmi \ ../../parsing/location.cmo ../../parsing/longident.cmo \ - ../../parsing/ast_helper.cmo \ + ../../parsing/docstrings.cmo ../../parsing/ast_helper.cmo \ ../../parsing/ast_mapper.cmo \ ../../typing/ident.cmo ../../typing/path.cmo \ ../../typing/primitive.cmo ../../typing/types.cmo \ @@ -69,7 +72,7 @@ dynlink.cmx: dynlink.cmi natdynlink.ml rm -f dynlink.mlopt extract_crc: dynlink.cma extract_crc.cmo - $(OCAMLC) $(COMPFLAGS) -o extract_crc dynlink.cma extract_crc.cmo + $(OCAMLC) -o extract_crc dynlink.cma extract_crc.cmo INSTALL_LIBDIR=$(DESTDIR)$(LIBDIR) diff --git a/otherlibs/graph/.depend b/otherlibs/graph/.depend index ab9faa61..ec14b350 100644 --- a/otherlibs/graph/.depend +++ b/otherlibs/graph/.depend @@ -1,103 +1,70 @@ -color.o: color.c libgraph.h \ - \ - \ - \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h \ - -draw.o: draw.c libgraph.h \ - \ - \ - \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h -dump_img.o: dump_img.c libgraph.h \ - \ - \ - \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h image.h \ - ../../byterun/alloc.h ../../byterun/mlvalues.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h -events.o: events.c libgraph.h \ - \ - \ - \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/signals.h -fill.o: fill.c libgraph.h \ - \ - \ - \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h -image.o: image.c libgraph.h \ - \ - \ - \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h image.h \ - ../../byterun/alloc.h ../../byterun/mlvalues.h ../../byterun/custom.h -make_img.o: make_img.c libgraph.h \ - \ - \ - \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h image.h \ - ../../byterun/memory.h ../../byterun/gc.h ../../byterun/mlvalues.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h -open.o: open.c libgraph.h \ - \ - \ - \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/callback.h ../../byterun/fail.h \ - ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h -point_col.o: point_col.c libgraph.h \ - \ - \ - \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h -sound.o: sound.c libgraph.h \ - \ - \ - \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h -subwindow.o: subwindow.c libgraph.h \ - \ - \ - \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h -text.o: text.c libgraph.h \ - \ - \ - \ - ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h +color.o: color.c libgraph.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h +draw.o: draw.c libgraph.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h +dump_img.o: dump_img.c libgraph.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h image.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h +events.o: events.c libgraph.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/signals.h +fill.o: fill.c libgraph.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h +image.o: image.c libgraph.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h image.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/custom.h +make_img.o: make_img.c libgraph.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h image.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h +open.o: open.c libgraph.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/callback.h \ + ../../byterun/caml/fail.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h +point_col.o: point_col.c libgraph.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h +sound.o: sound.c libgraph.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h +subwindow.o: subwindow.c libgraph.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h +text.o: text.c libgraph.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h graphics.cmi : graphicsX11.cmi : graphics.cmo : graphics.cmi diff --git a/otherlibs/graph/Makefile b/otherlibs/graph/Makefile index 9586f1c4..850e0251 100644 --- a/otherlibs/graph/Makefile +++ b/otherlibs/graph/Makefile @@ -26,7 +26,7 @@ EXTRACFLAGS=$(X11_INCLUDES) include ../Makefile depend: - gcc -MM $(CFLAGS) *.c | sed -e 's, /[^ ]*\.h,,g' > .depend - ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend + $(CC) -MM $(CFLAGS) *.c | sed -e 's, /[^ ]*\.h,,g' > .depend + $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/graph/draw.c b/otherlibs/graph/draw.c index dc657875..195860fa 100644 --- a/otherlibs/graph/draw.c +++ b/otherlibs/graph/draw.c @@ -12,7 +12,7 @@ /***********************************************************************/ #include "libgraph.h" -#include <alloc.h> +#include <caml/alloc.h> value caml_gr_plot(value vx, value vy) { diff --git a/otherlibs/graph/dump_img.c b/otherlibs/graph/dump_img.c index 4ba5c066..26f81607 100644 --- a/otherlibs/graph/dump_img.c +++ b/otherlibs/graph/dump_img.c @@ -13,8 +13,8 @@ #include "libgraph.h" #include "image.h" -#include <alloc.h> -#include <memory.h> +#include <caml/alloc.h> +#include <caml/memory.h> value caml_gr_dump_image(value image) { diff --git a/otherlibs/graph/events.c b/otherlibs/graph/events.c index 94bd8bc4..a8fe119b 100644 --- a/otherlibs/graph/events.c +++ b/otherlibs/graph/events.c @@ -13,8 +13,8 @@ #include <signal.h> #include "libgraph.h" -#include <alloc.h> -#include <signals.h> +#include <caml/alloc.h> +#include <caml/signals.h> #include <sys/types.h> #include <sys/time.h> #ifdef HAS_SYS_SELECT_H diff --git a/otherlibs/graph/fill.c b/otherlibs/graph/fill.c index 1e2965f1..8dc2f877 100644 --- a/otherlibs/graph/fill.c +++ b/otherlibs/graph/fill.c @@ -12,7 +12,7 @@ /***********************************************************************/ #include "libgraph.h" -#include <memory.h> +#include <caml/memory.h> value caml_gr_fill_rect(value vx, value vy, value vw, value vh) { diff --git a/otherlibs/graph/image.c b/otherlibs/graph/image.c index 31693bbd..12588bf7 100644 --- a/otherlibs/graph/image.c +++ b/otherlibs/graph/image.c @@ -13,8 +13,8 @@ #include "libgraph.h" #include "image.h" -#include <alloc.h> -#include <custom.h> +#include <caml/alloc.h> +#include <caml/custom.h> static void caml_gr_free_image(value im) { diff --git a/otherlibs/graph/libgraph.h b/otherlibs/graph/libgraph.h index e75ee801..9b2972bc 100644 --- a/otherlibs/graph/libgraph.h +++ b/otherlibs/graph/libgraph.h @@ -14,7 +14,7 @@ #include <stdio.h> #include <X11/Xlib.h> #include <X11/Xutil.h> -#include <mlvalues.h> +#include <caml/mlvalues.h> struct canvas { int w, h; /* Dimensions of the drawable */ diff --git a/otherlibs/graph/make_img.c b/otherlibs/graph/make_img.c index 932d4605..b9c4bfca 100644 --- a/otherlibs/graph/make_img.c +++ b/otherlibs/graph/make_img.c @@ -13,7 +13,7 @@ #include "libgraph.h" #include "image.h" -#include <memory.h> +#include <caml/memory.h> value caml_gr_make_image(value m) { diff --git a/otherlibs/graph/open.c b/otherlibs/graph/open.c index 14a00eaf..e8d26acf 100644 --- a/otherlibs/graph/open.c +++ b/otherlibs/graph/open.c @@ -15,10 +15,10 @@ #include <fcntl.h> #include <signal.h> #include "libgraph.h" -#include <alloc.h> -#include <callback.h> -#include <fail.h> -#include <memory.h> +#include <caml/alloc.h> +#include <caml/callback.h> +#include <caml/fail.h> +#include <caml/memory.h> #ifdef HAS_UNISTD #include <unistd.h> #endif diff --git a/otherlibs/graph/text.c b/otherlibs/graph/text.c index 8ac422d5..7450df89 100644 --- a/otherlibs/graph/text.c +++ b/otherlibs/graph/text.c @@ -12,7 +12,7 @@ /***********************************************************************/ #include "libgraph.h" -#include <alloc.h> +#include <caml/alloc.h> XFontStruct * caml_gr_font = NULL; diff --git a/otherlibs/num/.depend b/otherlibs/num/.depend index 51b180f5..c885abf0 100644 --- a/otherlibs/num/.depend +++ b/otherlibs/num/.depend @@ -1,21 +1,23 @@ -bng.o: bng.c bng.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/compatibility.h bng_amd64.c \ - bng_digit.c bng_amd64.o: bng_amd64.c bng_arm64.o: bng_arm64.c +bng.o: bng.c bng.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/compatibility.h bng_amd64.c bng_digit.c bng_digit.o: bng_digit.c bng_ia32.o: bng_ia32.c bng_ppc.o: bng_ppc.c bng_sparc.o: bng_sparc.c -nat_stubs.o: nat_stubs.c ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/config.h ../../byterun/custom.h ../../byterun/intext.h \ - ../../byterun/io.h ../../byterun/fail.h ../../byterun/hash.h \ - ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/mlvalues.h bng.h nat.h +nat_stubs.o: nat_stubs.c ../../byterun/caml/alloc.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/config.h ../../byterun/caml/custom.h \ + ../../byterun/caml/intext.h ../../byterun/caml/io.h \ + ../../byterun/caml/fail.h ../../byterun/caml/hash.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/mlvalues.h bng.h nat.h arith_flags.cmi : arith_status.cmi : big_int.cmi : nat.cmi diff --git a/otherlibs/num/Makefile b/otherlibs/num/Makefile index e5bcb97c..e08e0294 100644 --- a/otherlibs/num/Makefile +++ b/otherlibs/num/Makefile @@ -31,7 +31,7 @@ bng.$(O): bng.h bng_digit.c \ bng_amd64.c bng_ia32.c bng_ppc.c bng_sparc.c depend: - gcc -MM $(CFLAGS) *.c > .depend - ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend + $(CC) -MM $(CFLAGS) *.c > .depend + $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/num/bng.c b/otherlibs/num/bng.c index 0483ef51..585e434e 100644 --- a/otherlibs/num/bng.c +++ b/otherlibs/num/bng.c @@ -14,7 +14,7 @@ /* $Id$ */ #include "bng.h" -#include "config.h" +#include "caml/config.h" #if defined(__GNUC__) && BNG_ASM_LEVEL > 0 #if defined(BNG_ARCH_ia32) diff --git a/otherlibs/num/bng.h b/otherlibs/num/bng.h index 19f2e2b9..527bee6a 100644 --- a/otherlibs/num/bng.h +++ b/otherlibs/num/bng.h @@ -14,7 +14,7 @@ /* $Id$ */ #include <string.h> -#include "config.h" +#include "caml/config.h" typedef uintnat bngdigit; typedef bngdigit * bng; diff --git a/otherlibs/num/nat.ml b/otherlibs/num/nat.ml index 90cb471c..5ea5fda7 100644 --- a/otherlibs/num/nat.ml +++ b/otherlibs/num/nat.ml @@ -318,6 +318,12 @@ let digits = "0123456789ABCDEF" A la fin de la boucle i-1 est la plus grande puissance de la base qui tient sur un seul digit et j est la plus grande puissance de la base qui tient sur un int. + + This function returns [(pmax, pint)] where: + [pmax] is the index of the digit of [power_base] that contains the + the maximum power of [base] that fits in a digit. This is also one + less than the exponent of that power. + [pint] is the exponent of the maximum power of [base] that fits in an [int]. *) let make_power_base base power_base = let i = ref 0 @@ -329,7 +335,7 @@ let make_power_base base power_base = power_base (pred !i) 1 power_base 0) done; - while !j <= !i && is_digit_int power_base !j do incr j done; + while !j < !i - 1 && is_digit_int power_base !j do incr j done; (!i - 2, !j) (* diff --git a/otherlibs/num/nat_stubs.c b/otherlibs/num/nat_stubs.c index 9a62759f..ae109ac9 100644 --- a/otherlibs/num/nat_stubs.c +++ b/otherlibs/num/nat_stubs.c @@ -13,14 +13,14 @@ /* $Id$ */ -#include "alloc.h" -#include "config.h" -#include "custom.h" -#include "intext.h" -#include "fail.h" -#include "hash.h" -#include "memory.h" -#include "mlvalues.h" +#include "caml/alloc.h" +#include "caml/config.h" +#include "caml/custom.h" +#include "caml/intext.h" +#include "caml/fail.h" +#include "caml/hash.h" +#include "caml/memory.h" +#include "caml/mlvalues.h" #include "bng.h" #include "nat.h" diff --git a/otherlibs/num/num.ml b/otherlibs/num/num.ml index 67499e26..924e9eab 100644 --- a/otherlibs/num/num.ml +++ b/otherlibs/num/num.ml @@ -160,57 +160,71 @@ let floor_num = function | Big_int bi as n -> n | Ratio r -> num_of_big_int (floor_ratio r) -(* The function [quo_num] is equivalent to - - let quo_num x y = floor_num (div_num x y);; +(* Coercion with ratio type *) +let ratio_of_num = function + Int i -> ratio_of_int i +| Big_int bi -> ratio_of_big_int bi +| Ratio r -> r +;; - However, this definition is vastly inefficient (cf PR #3473): - we define here a better way of computing the same thing. - *) -let quo_num n1 n2 = - match n1 with - | Int i1 -> - begin match n2 with - | Int i2 -> Int (i1 / i2) - | Big_int bi2 -> num_of_big_int (div_big_int (big_int_of_int i1) bi2) - | Ratio r2 -> num_of_big_int (floor_ratio (div_int_ratio i1 r2)) end +(* Euclidean division and remainder. The specification is: - | Big_int bi1 -> - begin match n2 with - | Int i2 -> num_of_big_int (div_big_int bi1 (big_int_of_int i2)) - | Big_int bi2 -> num_of_big_int (div_big_int bi1 bi2) - | Ratio r2 -> num_of_big_int (floor_ratio (div_big_int_ratio bi1 r2)) end + a = b * quo_num a b + mod_num a b + quo_num a b is an integer (Z) + 0 <= mod_num a b < |b| - | Ratio r1 -> - begin match n2 with - | Int i2 -> num_of_big_int (floor_ratio (div_ratio_int r1 i2)) - | Big_int bi2 -> num_of_big_int (floor_ratio (div_ratio_big_int r1 bi2)) - | Ratio r2 -> num_of_big_int (floor_ratio (div_ratio r1 r2)) end -;; +A correct but slow implementation is: -(* The function [mod_num] is equivalent to: + quo_num a b = + if b >= 0 then floor_num (div_num a b) + else minus_num (floor_num (div_num a (minus_num b))) - let mod_num x y = sub_num x (mult_num y (quo_num x y));; + mod_num a b = + sub_num a (mult_num b (quo_num a b)) - However, as for [quo_num] above, this definition is inefficient: + However, this definition is vastly inefficient (cf PR #3473): we define here a better way of computing the same thing. - *) -let mod_num n1 n2 = - match n1 with - | Int i1 -> - begin match n2 with - | Int i2 -> Int (i1 mod i2) - | Big_int bi2 -> num_of_big_int (mod_big_int (big_int_of_int i1) bi2) - | Ratio _r2 -> sub_num n1 (mult_num n2 (quo_num n1 n2)) end - | Big_int bi1 -> - begin match n2 with - | Int i2 -> num_of_big_int (mod_big_int bi1 (big_int_of_int i2)) - | Big_int bi2 -> num_of_big_int (mod_big_int bi1 bi2) - | Ratio _r2 -> sub_num n1 (mult_num n2 (quo_num n1 n2)) end + PR#6753: the previous implementation was based on + quo_num a b = floor_num (div_num a b) + which is incorrect for negative b. +*) - | Ratio _r1 -> sub_num n1 (mult_num n2 (quo_num n1 n2)) -;; +let quo_num n1 n2 = + match n1, n2 with + | Int i1, Int i2 -> + let q = i1 / i2 and r = i1 mod i2 in + Int (if r >= 0 then q else if i2 > 0 then q - 1 else q + 1) + | Int i1, Big_int bi2 -> + num_of_big_int (div_big_int (big_int_of_int i1) bi2) + | Int i1, Ratio r2 -> + num_of_big_int (report_sign_ratio r2 + (floor_ratio (div_int_ratio i1 (abs_ratio r2)))) + | Big_int bi1, Int i2 -> + num_of_big_int (div_big_int bi1 (big_int_of_int i2)) + | Big_int bi1, Big_int bi2 -> + num_of_big_int (div_big_int bi1 bi2) + | Big_int bi1, Ratio r2 -> + num_of_big_int (report_sign_ratio r2 + (floor_ratio (div_big_int_ratio bi1 (abs_ratio r2)))) + | Ratio r1, _ -> + let r2 = ratio_of_num n2 in + num_of_big_int (report_sign_ratio r2 + (floor_ratio (div_ratio r1 (abs_ratio r2)))) + +let mod_num n1 n2 = + match n1, n2 with + | Int i1, Int i2 -> + let r = i1 mod i2 in + Int (if r >= 0 then r else if i2 > 0 then r + i2 else r - i2) + | Int i1, Big_int bi2 -> + num_of_big_int (mod_big_int (big_int_of_int i1) bi2) + | Big_int bi1, Int i2 -> + num_of_big_int (mod_big_int bi1 (big_int_of_int i2)) + | Big_int bi1, Big_int bi2 -> + num_of_big_int (mod_big_int bi1 bi2) + | _, _ -> + sub_num n1 (mult_num n2 (quo_num n1 n2)) let power_num_int a b = match (a,b) with ((Int i), n) -> @@ -368,13 +382,6 @@ let big_int_of_num = function | Big_int bi -> bi | Ratio r -> big_int_of_ratio r -(* Coercion with ratio type *) -let ratio_of_num = function - Int i -> ratio_of_int i -| Big_int bi -> ratio_of_big_int bi -| Ratio r -> r -;; - let string_of_big_int_for_num bi = if !approx_printing_flag then approx_big_int !floating_precision bi diff --git a/otherlibs/str/.depend b/otherlibs/str/.depend index 5be8377c..1d224311 100644 --- a/otherlibs/str/.depend +++ b/otherlibs/str/.depend @@ -1,9 +1,11 @@ -strstubs.o: strstubs.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/fail.h +strstubs.o: strstubs.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h ../../byterun/caml/fail.h str.cmi : str.cmo : str.cmi str.cmx : str.cmi diff --git a/otherlibs/str/Makefile b/otherlibs/str/Makefile index 509be62a..93b2bf95 100644 --- a/otherlibs/str/Makefile +++ b/otherlibs/str/Makefile @@ -27,7 +27,7 @@ str.cmo: str.cmi str.cmx: str.cmi depend: - gcc -MM $(CFLAGS) *.c > .depend - ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend + $(CC) -MM $(CFLAGS) *.c > .depend + $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/str/strstubs.c b/otherlibs/str/strstubs.c index 9de349a9..6c928704 100644 --- a/otherlibs/str/strstubs.c +++ b/otherlibs/str/strstubs.c @@ -13,10 +13,10 @@ #include <string.h> #include <ctype.h> -#include <mlvalues.h> -#include <alloc.h> -#include <memory.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/memory.h> +#include <caml/fail.h> /* The backtracking NFA interpreter */ diff --git a/otherlibs/systhreads/.depend b/otherlibs/systhreads/.depend index 85add2e5..b9e1cabc 100644 --- a/otherlibs/systhreads/.depend +++ b/otherlibs/systhreads/.depend @@ -1,14 +1,17 @@ -st_stubs.o: st_stubs.c ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/backtrace.h ../../byterun/callback.h \ - ../../byterun/custom.h ../../byterun/fail.h ../../byterun/io.h \ - ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/printexc.h ../../byterun/roots.h \ - ../../byterun/memory.h ../../byterun/signals.h ../../byterun/stacks.h \ - ../../byterun/sys.h threads.h st_posix.h +st_stubs.o: st_stubs.c ../../byterun/caml/alloc.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/backtrace.h ../../byterun/caml/callback.h \ + ../../byterun/caml/custom.h ../../byterun/caml/fail.h \ + ../../byterun/caml/io.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h ../../byterun/caml/misc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/printexc.h \ + ../../byterun/caml/roots.h ../../byterun/caml/memory.h \ + ../../byterun/caml/signals.h ../../byterun/caml/stacks.h \ + ../../byterun/caml/sys.h threads.h st_posix.h condition.cmi : mutex.cmi event.cmi : mutex.cmi : diff --git a/otherlibs/systhreads/Makefile b/otherlibs/systhreads/Makefile index f24af23b..942a7b78 100644 --- a/otherlibs/systhreads/Makefile +++ b/otherlibs/systhreads/Makefile @@ -12,13 +12,15 @@ ######################################################################### include ../../config/Makefile +CAMLRUN ?= ../../boot/ocamlrun +CAMLYACC ?= ../../boot/ocamlyacc ROOTDIR=../.. -CAMLC=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlc -nostdlib \ +CAMLC=$(CAMLRUN) $(ROOTDIR)/ocamlc -nostdlib \ -I $(ROOTDIR)/stdlib -I $(ROOTDIR)/otherlibs/unix -CAMLOPT=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlopt -nostdlib \ +CAMLOPT=$(CAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib \ -I $(ROOTDIR)/stdlib -I $(ROOTDIR)/otherlibs/unix -MKLIB=../../boot/ocamlrun ../../tools/ocamlmklib +MKLIB=$(CAMLRUN) ../../tools/ocamlmklib COMPFLAGS=-w +33..39 -warn-error A -g -bin-annot -safe-string BYTECODE_C_OBJS=st_stubs_b.o @@ -34,7 +36,7 @@ libthreads.a: $(BYTECODE_C_OBJS) $(MKLIB) -o threads $(BYTECODE_C_OBJS) $(PTHREAD_LINK) st_stubs_b.o: st_stubs.c st_posix.h - $(BYTECC) -O -I../../byterun $(BYTECCCOMPOPTS) $(SHAREDCCCOMPOPTS) \ + $(BYTECC) -I../../byterun $(BYTECCCOMPOPTS) $(SHAREDCCCOMPOPTS) \ -c st_stubs.c mv st_stubs.o st_stubs_b.o @@ -44,7 +46,7 @@ libthreadsnat.a: $(NATIVECODE_C_OBJS) $(AR) rc libthreadsnat.a $(NATIVECODE_C_OBJS) st_stubs_n.o: st_stubs.c st_posix.h - $(NATIVECC) -O -I../../asmrun -I../../byterun $(NATIVECCCOMPOPTS) \ + $(NATIVECC) -I../../asmrun -I../../byterun $(NATIVECCCOMPOPTS) \ $(SHAREDCCCOMPOPTS) -DNATIVE_CODE -DTARGET_$(ARCH) \ -DSYS_$(SYSTEM) -c st_stubs.c mv st_stubs.o st_stubs_n.o @@ -106,7 +108,7 @@ installopt: $(CAMLOPT) -c $(COMPFLAGS) $< depend: $(GENFILES) - -gcc -MM -I../../byterun *.c > .depend - ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend + -$(CC) -MM -I../../byterun *.c > .depend + $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/systhreads/Makefile.nt b/otherlibs/systhreads/Makefile.nt index 34117614..22fb1c71 100644 --- a/otherlibs/systhreads/Makefile.nt +++ b/otherlibs/systhreads/Makefile.nt @@ -12,12 +12,14 @@ ######################################################################### include ../../config/Makefile +CAMLRUN ?= ../../boot/ocamlrun +CAMLYACC ?= ../../boot/ocamlyacc # Compilation options -CAMLC=../../boot/ocamlrun ../../ocamlc -I ../../stdlib -I ../win32unix -CAMLOPT=../../boot/ocamlrun ../../ocamlopt -I ../../stdlib -I ../win32unix +CAMLC=$(CAMLRUN) ../../ocamlc -I ../../stdlib -I ../win32unix +CAMLOPT=$(CAMLRUN) ../../ocamlopt -I ../../stdlib -I ../win32unix COMPFLAGS=-w +33 -warn-error A -g -MKLIB=../../boot/ocamlrun ../../tools/ocamlmklib +MKLIB=$(CAMLRUN) ../../tools/ocamlmklib CFLAGS=-I../../byterun $(EXTRACFLAGS) CAMLOBJS=thread.cmo mutex.cmo condition.cmo event.cmo threadUnix.cmo @@ -32,7 +34,7 @@ all: lib$(LIBNAME).$(A) $(LIBNAME).cma $(CMIFILES) allopt: lib$(LIBNAME).$(A) $(LIBNAME).cmxa $(LIBNAME).cmxs $(CMIFILES) $(LIBNAME).cma: $(CAMLOBJS) - $(MKLIB) -o $(LIBNAME) -ocamlc "../../boot/ocamlrun ../../ocamlc" \ + $(MKLIB) -o $(LIBNAME) -ocamlc "$(CAMLRUN) ../../ocamlc" \ -linkall $(CAMLOBJS) $(LINKOPTS) lib$(LIBNAME).$(A): $(COBJS) @@ -46,7 +48,7 @@ st_stubs_b.$(O): st_stubs.c st_win32.h $(LIBNAME).cmxa: $(CAMLOBJS:.cmo=.cmx) $(MKLIB) -o $(LIBNAME)nat \ - -ocamlopt "../../boot/ocamlrun ../../ocamlopt" -linkall \ + -ocamlopt "$(CAMLRUN) ../../ocamlopt" -linkall \ $(CAMLOBJS:.cmo=.cmx) $(LINKOPTS) mv $(LIBNAME)nat.cmxa $(LIBNAME).cmxa mv $(LIBNAME)nat.$(A) $(LIBNAME).$(A) diff --git a/otherlibs/systhreads/st_posix.h b/otherlibs/systhreads/st_posix.h index e0bc65e4..1d87a229 100644 --- a/otherlibs/systhreads/st_posix.h +++ b/otherlibs/systhreads/st_posix.h @@ -80,7 +80,12 @@ static void st_thread_exit(void) static void st_thread_kill(st_thread_id thr) { +#if !defined(__ANDROID__) + /* pthread_cancel is unsafe, as it does not allow the thread an opportunity + to free shared resources such as mutexes. Thus, it is not implemented + in Android's libc. */ pthread_cancel(thr); +#endif } /* Scheduling hints */ @@ -322,8 +327,10 @@ static void * caml_thread_tick(void * arg) /* Block all signals so that we don't try to execute an OCaml signal handler*/ sigfillset(&mask); pthread_sigmask(SIG_BLOCK, &mask, NULL); +#if !defined(__ANDROID__) /* Allow async cancellation */ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); +#endif while(1) { /* select() seems to be the most efficient way to suspend the thread for sub-second intervals */ @@ -340,6 +347,15 @@ static void * caml_thread_tick(void * arg) /* "At fork" processing */ +#if defined(__ANDROID__) +/* Android's libc does not include declaration of pthread_atfork; + however, it implements it since API level 10 (Gingerbread). + The reason for the omission is that Android (GUI) applications + are not supposed to fork at all, however this workaround is still + included in case OCaml is used for an Android CLI utility. */ +int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void)); +#endif + static int st_atfork(void (*fn)(void)) { return pthread_atfork(NULL, NULL, fn); diff --git a/otherlibs/systhreads/st_stubs.c b/otherlibs/systhreads/st_stubs.c index dd99c736..eab89ab4 100644 --- a/otherlibs/systhreads/st_stubs.c +++ b/otherlibs/systhreads/st_stubs.c @@ -11,24 +11,24 @@ /* */ /***********************************************************************/ -#include "alloc.h" -#include "backtrace.h" -#include "callback.h" -#include "custom.h" -#include "fail.h" -#include "io.h" -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" -#include "printexc.h" -#include "roots.h" -#include "signals.h" +#include "caml/alloc.h" +#include "caml/backtrace.h" +#include "caml/callback.h" +#include "caml/custom.h" +#include "caml/fail.h" +#include "caml/io.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/printexc.h" +#include "caml/roots.h" +#include "caml/signals.h" #ifdef NATIVE_CODE #include "stack.h" #else -#include "stacks.h" +#include "caml/stacks.h" #endif -#include "sys.h" +#include "caml/sys.h" #include "threads.h" /* Initial size of bytecode stack when a thread is created (4 Ko) */ diff --git a/otherlibs/systhreads/threads.h b/otherlibs/systhreads/threads.h index 6a97b251..616138da 100644 --- a/otherlibs/systhreads/threads.h +++ b/otherlibs/systhreads/threads.h @@ -14,6 +14,10 @@ #ifndef CAML_THREADS_H #define CAML_THREADS_H +#ifdef __cplusplus +extern "C" { +#endif + CAMLextern void caml_enter_blocking_section (void); CAMLextern void caml_leave_blocking_section (void); #define caml_acquire_runtime_system caml_leave_blocking_section @@ -55,4 +59,8 @@ CAMLextern int caml_c_thread_unregister(void); Both functions return 1 on success, 0 on error. */ +#ifdef __cplusplus +} +#endif + #endif /* CAML_THREADS_H */ diff --git a/otherlibs/threads/.depend b/otherlibs/threads/.depend index 3a6c7f02..2b70d942 100644 --- a/otherlibs/threads/.depend +++ b/otherlibs/threads/.depend @@ -1,14 +1,17 @@ -scheduler.o: scheduler.c ../../byterun/alloc.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/backtrace.h ../../byterun/callback.h \ - ../../byterun/config.h ../../byterun/fail.h ../../byterun/io.h \ - ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/misc.h \ - ../../byterun/mlvalues.h ../../byterun/printexc.h ../../byterun/roots.h \ - ../../byterun/memory.h ../../byterun/signals.h ../../byterun/stacks.h \ - ../../byterun/sys.h +scheduler.o: scheduler.c ../../byterun/caml/alloc.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/backtrace.h ../../byterun/caml/callback.h \ + ../../byterun/caml/config.h ../../byterun/caml/fail.h \ + ../../byterun/caml/io.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h ../../byterun/caml/misc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/printexc.h \ + ../../byterun/caml/roots.h ../../byterun/caml/memory.h \ + ../../byterun/caml/signals.h ../../byterun/caml/stacks.h \ + ../../byterun/caml/sys.h condition.cmi : mutex.cmi event.cmi : mutex.cmi : diff --git a/otherlibs/threads/Makefile b/otherlibs/threads/Makefile index 4b783333..de789afd 100644 --- a/otherlibs/threads/Makefile +++ b/otherlibs/threads/Makefile @@ -11,15 +11,19 @@ # # ######################################################################### +# FIXME reduce redundancy by including ../Makefile + include ../../config/Makefile +CAMLRUN ?= ../../boot/ocamlrun +CAMLYACC ?= ../../boot/ocamlyacc CC=$(BYTECC) -CFLAGS=-I../../byterun -O $(BYTECCCOMPOPTS) $(SHAREDCCCOMPOPTS) -g +CFLAGS=-I../../byterun $(BYTECCCOMPOPTS) $(SHAREDCCCOMPOPTS) -g ROOTDIR=../.. -CAMLC=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlc -nostdlib \ +CAMLC=$(CAMLRUN) $(ROOTDIR)/ocamlc -nostdlib \ -I $(ROOTDIR)/stdlib -I $(ROOTDIR)/otherlibs/unix -MKLIB=../../boot/ocamlrun ../../tools/ocamlmklib -COMPFLAGS=-w +33..39 -warn-error A -bin-annot -safe-string +MKLIB=$(CAMLRUN) ../../tools/ocamlmklib +COMPFLAGS=-w +33..39 -warn-error A -bin-annot -g -safe-string C_OBJS=scheduler.o @@ -121,7 +125,7 @@ installopt: $(CAMLC) -c $(COMPFLAGS) $< depend: - gcc -MM $(CFLAGS) *.c > .depend - ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend + $(CC) -MM $(CFLAGS) *.c > .depend + $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/threads/scheduler.c b/otherlibs/threads/scheduler.c index 45ef854d..585a8903 100644 --- a/otherlibs/threads/scheduler.c +++ b/otherlibs/threads/scheduler.c @@ -17,20 +17,20 @@ #include <stdlib.h> #include <stdio.h> -#include "alloc.h" -#include "backtrace.h" -#include "callback.h" -#include "config.h" -#include "fail.h" -#include "io.h" -#include "memory.h" -#include "misc.h" -#include "mlvalues.h" -#include "printexc.h" -#include "roots.h" -#include "signals.h" -#include "stacks.h" -#include "sys.h" +#include "caml/alloc.h" +#include "caml/backtrace.h" +#include "caml/callback.h" +#include "caml/config.h" +#include "caml/fail.h" +#include "caml/io.h" +#include "caml/memory.h" +#include "caml/misc.h" +#include "caml/mlvalues.h" +#include "caml/printexc.h" +#include "caml/roots.h" +#include "caml/signals.h" +#include "caml/stacks.h" +#include "caml/sys.h" #if ! (defined(HAS_SELECT) && \ defined(HAS_SETITIMER) && \ diff --git a/otherlibs/unix/.depend b/otherlibs/unix/.depend index 85eee1b8..4f6a6387 100644 --- a/otherlibs/unix/.depend +++ b/otherlibs/unix/.depend @@ -1,506 +1,644 @@ -accept.o: accept.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h \ - socketaddr.h ../../byterun/misc.h -access.o: access.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h -addrofstr.o: addrofstr.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/fail.h \ - unixsupport.h socketaddr.h ../../byterun/misc.h -alarm.o: alarm.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h -bind.o: bind.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h socketaddr.h \ - ../../byterun/misc.h -chdir.o: chdir.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h -chmod.o: chmod.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h -chown.o: chown.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h -chroot.o: chroot.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h -close.o: close.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h \ - ../../byterun/signals.h ../../byterun/mlvalues.h unixsupport.h -closedir.o: closedir.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h -connect.o: connect.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h ../../byterun/signals.h unixsupport.h \ - socketaddr.h ../../byterun/misc.h -cst2constr.o: cst2constr.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/fail.h ../../byterun/mlvalues.h \ - cst2constr.h -cstringv.o: cstringv.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h -dup.o: dup.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h -dup2.o: dup2.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h -envir.o: envir.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h -errmsg.o: errmsg.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h -execv.o: execv.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h -execve.o: execve.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h -execvp.o: execvp.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h -exit.o: exit.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h -fchmod.o: fchmod.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h ../../byterun/signals.h unixsupport.h -fchown.o: fchown.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h ../../byterun/signals.h unixsupport.h -fcntl.o: fcntl.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h -fork.o: fork.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h \ - ../../byterun/debugger.h ../../byterun/mlvalues.h unixsupport.h -ftruncate.o: ftruncate.c ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h ../../byterun/io.h ../../byterun/signals.h \ - unixsupport.h -getaddrinfo.o: getaddrinfo.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/misc.h ../../byterun/signals.h \ - unixsupport.h cst2constr.h socketaddr.h -getcwd.o: getcwd.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h unixsupport.h -getegid.o: getegid.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h unixsupport.h -geteuid.o: geteuid.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h unixsupport.h -getgid.o: getgid.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h -getgr.o: getgr.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/fail.h \ - ../../byterun/mlvalues.h ../../byterun/alloc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h unixsupport.h -getgroups.o: getgroups.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h unixsupport.h -gethost.o: gethost.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h \ - socketaddr.h ../../byterun/misc.h -gethostname.o: gethostname.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h unixsupport.h -getlogin.o: getlogin.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - unixsupport.h -getnameinfo.o: getnameinfo.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h \ - socketaddr.h ../../byterun/misc.h -getpeername.o: getpeername.c ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h socketaddr.h \ - ../../byterun/misc.h -getpid.o: getpid.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h -getppid.o: getppid.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h unixsupport.h -getproto.o: getproto.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h unixsupport.h -getpw.o: getpw.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/fail.h unixsupport.h -getserv.o: getserv.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h unixsupport.h -getsockname.o: getsockname.c ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h socketaddr.h \ - ../../byterun/misc.h -gettimeofday.o: gettimeofday.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h unixsupport.h -getuid.o: getuid.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h -gmtime.o: gmtime.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h unixsupport.h -initgroups.o: initgroups.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h unixsupport.h -isatty.o: isatty.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h -itimer.o: itimer.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h unixsupport.h -kill.o: kill.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/fail.h \ - ../../byterun/mlvalues.h unixsupport.h ../../byterun/signals.h -link.o: link.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h -listen.o: listen.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h -lockf.o: lockf.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h ../../byterun/signals.h unixsupport.h -lseek.o: lseek.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/io.h ../../byterun/signals.h \ - unixsupport.h -mkdir.o: mkdir.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h -mkfifo.o: mkfifo.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h -nice.o: nice.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h -open.o: open.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/misc.h ../../byterun/signals.h \ - unixsupport.h -opendir.o: opendir.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/alloc.h \ - ../../byterun/signals.h unixsupport.h -pipe.o: pipe.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h unixsupport.h -putenv.o: putenv.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/mlvalues.h unixsupport.h -read.o: read.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h -readdir.o: readdir.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/fail.h ../../byterun/mlvalues.h \ - ../../byterun/alloc.h ../../byterun/signals.h unixsupport.h -readlink.o: readlink.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/alloc.h \ - ../../byterun/fail.h ../../byterun/signals.h unixsupport.h -rename.o: rename.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h -rewinddir.o: rewinddir.c ../../byterun/fail.h \ - ../../byterun/compatibility.h ../../byterun/misc.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h -rmdir.o: rmdir.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h -select.o: select.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h -sendrecv.o: sendrecv.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h \ - socketaddr.h ../../byterun/misc.h -setgid.o: setgid.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h -setgroups.o: setgroups.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h unixsupport.h -setsid.o: setsid.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h -setuid.o: setuid.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h -shutdown.o: shutdown.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h -signals.o: signals.c ../../byterun/alloc.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/mlvalues.h \ - ../../byterun/signals.h unixsupport.h -sleep.o: sleep.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h \ - ../../byterun/signals.h ../../byterun/mlvalues.h unixsupport.h -socket.o: socket.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h unixsupport.h -socketaddr.o: socketaddr.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/memory.h ../../byterun/gc.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h unixsupport.h \ - socketaddr.h ../../byterun/misc.h -socketpair.o: socketpair.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h unixsupport.h -sockopt.o: sockopt.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/alloc.h \ - ../../byterun/fail.h unixsupport.h socketaddr.h ../../byterun/misc.h -stat.o: stat.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/alloc.h \ - ../../byterun/signals.h unixsupport.h cst2constr.h ../../byterun/io.h -strofaddr.o: strofaddr.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h unixsupport.h socketaddr.h ../../byterun/misc.h -symlink.o: symlink.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h -termios.o: termios.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/fail.h unixsupport.h -time.o: time.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h unixsupport.h -times.o: times.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h unixsupport.h -truncate.o: truncate.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h ../../byterun/fail.h \ - ../../byterun/signals.h ../../byterun/io.h unixsupport.h -umask.o: umask.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h unixsupport.h -unixsupport.o: unixsupport.c ../../byterun/mlvalues.h \ - ../../byterun/compatibility.h ../../byterun/config.h \ - ../../byterun/../config/m.h ../../byterun/../config/s.h \ - ../../byterun/misc.h ../../byterun/alloc.h ../../byterun/mlvalues.h \ - ../../byterun/callback.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/fail.h unixsupport.h \ - cst2constr.h -unlink.o: unlink.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h -utimes.o: utimes.c ../../byterun/fail.h ../../byterun/compatibility.h \ - ../../byterun/misc.h ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/mlvalues.h \ - ../../byterun/mlvalues.h ../../byterun/memory.h ../../byterun/gc.h \ - ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h -wait.o: wait.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/alloc.h \ - ../../byterun/mlvalues.h ../../byterun/fail.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/major_gc.h ../../byterun/freelist.h \ - ../../byterun/minor_gc.h ../../byterun/signals.h unixsupport.h -write.o: write.c ../../byterun/mlvalues.h ../../byterun/compatibility.h \ - ../../byterun/config.h ../../byterun/../config/m.h \ - ../../byterun/../config/s.h ../../byterun/misc.h ../../byterun/memory.h \ - ../../byterun/gc.h ../../byterun/mlvalues.h ../../byterun/major_gc.h \ - ../../byterun/freelist.h ../../byterun/minor_gc.h \ - ../../byterun/signals.h unixsupport.h -unix.cmi : +accept.o: accept.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h +access.o: access.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h ../../byterun/caml/signals.h \ + unixsupport.h +addrofstr.o: addrofstr.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/fail.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h +alarm.o: alarm.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +bind.o: bind.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h +chdir.o: chdir.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h +chmod.o: chmod.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h +chown.o: chown.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h +chroot.o: chroot.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h +close.o: close.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/signals.h \ + ../../byterun/caml/mlvalues.h unixsupport.h +closedir.o: closedir.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h +connect.o: connect.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/signals.h unixsupport.h \ + socketaddr.h ../../byterun/caml/misc.h +cst2constr.o: cst2constr.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/fail.h \ + ../../byterun/caml/mlvalues.h cst2constr.h +cstringv.o: cstringv.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h +dup2.o: dup2.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +dup.o: dup.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +envir.o: envir.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h +errmsg.o: errmsg.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h +execv.o: execv.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h +execve.o: execve.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h +execvp.o: execvp.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h +exit.o: exit.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +fchmod.o: fchmod.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/signals.h unixsupport.h +fchown.o: fchown.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/signals.h unixsupport.h +fcntl.o: fcntl.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h +fork.o: fork.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/debugger.h \ + ../../byterun/caml/mlvalues.h unixsupport.h +ftruncate.o: ftruncate.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/io.h \ + ../../byterun/caml/signals.h unixsupport.h +getaddrinfo.o: getaddrinfo.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/misc.h ../../byterun/caml/signals.h unixsupport.h \ + cst2constr.h socketaddr.h +getcwd.o: getcwd.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h +getegid.o: getegid.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +geteuid.o: geteuid.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +getgid.o: getgid.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +getgr.o: getgr.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/fail.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h +getgroups.o: getgroups.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h +gethost.o: gethost.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h +gethostname.o: gethostname.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h +getlogin.o: getlogin.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h unixsupport.h +getnameinfo.o: getnameinfo.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h +getpeername.o: getpeername.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h +getpid.o: getpid.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +getppid.o: getppid.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +getproto.o: getproto.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h +getpw.o: getpw.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h ../../byterun/caml/fail.h \ + unixsupport.h +getserv.o: getserv.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h +getsockname.o: getsockname.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h +gettimeofday.o: gettimeofday.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h +getuid.o: getuid.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +gmtime.o: gmtime.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h +initgroups.o: initgroups.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h +isatty.o: isatty.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +itimer.o: itimer.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h +kill.o: kill.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/fail.h \ + ../../byterun/caml/mlvalues.h unixsupport.h ../../byterun/caml/signals.h +link.o: link.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h +listen.o: listen.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h +lockf.o: lockf.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/signals.h unixsupport.h +lseek.o: lseek.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/io.h \ + ../../byterun/caml/signals.h unixsupport.h +mkdir.o: mkdir.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h +mkfifo.o: mkfifo.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h ../../byterun/caml/signals.h \ + unixsupport.h +nice.o: nice.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +open.o: open.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h ../../byterun/caml/misc.h \ + ../../byterun/caml/signals.h unixsupport.h +opendir.o: opendir.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/alloc.h ../../byterun/caml/signals.h unixsupport.h +pipe.o: pipe.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h unixsupport.h +putenv.o: putenv.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/mlvalues.h unixsupport.h +read.o: read.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h +readdir.o: readdir.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/fail.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/signals.h unixsupport.h +readlink.o: readlink.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/alloc.h ../../byterun/caml/fail.h \ + ../../byterun/caml/signals.h unixsupport.h +rename.o: rename.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h +rewinddir.o: rewinddir.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h +rmdir.o: rmdir.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h +select.o: select.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h +sendrecv.o: sendrecv.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h +setgid.o: setgid.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +setgroups.o: setgroups.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + unixsupport.h +setsid.o: setsid.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h +setuid.o: setuid.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +shutdown.o: shutdown.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h +signals.o: signals.c ../../byterun/caml/alloc.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/fail.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/signals.h unixsupport.h +sleep.o: sleep.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/signals.h \ + ../../byterun/caml/mlvalues.h unixsupport.h +socketaddr.o: socketaddr.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h unixsupport.h socketaddr.h \ + ../../byterun/caml/misc.h +socket.o: socket.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h unixsupport.h +socketpair.o: socketpair.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h +sockopt.o: sockopt.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/alloc.h ../../byterun/caml/fail.h unixsupport.h \ + socketaddr.h ../../byterun/caml/misc.h +stat.o: stat.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/alloc.h ../../byterun/caml/signals.h \ + ../../byterun/caml/io.h unixsupport.h cst2constr.h nanosecond_stat.h +strofaddr.o: strofaddr.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h \ + socketaddr.h ../../byterun/caml/misc.h +symlink.o: symlink.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h ../../byterun/caml/signals.h \ + unixsupport.h +termios.o: termios.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h unixsupport.h +time.o: time.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h unixsupport.h +times.o: times.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h unixsupport.h +truncate.o: truncate.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/fail.h ../../byterun/caml/signals.h \ + ../../byterun/caml/io.h unixsupport.h +umask.o: umask.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h unixsupport.h +unixsupport.o: unixsupport.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/callback.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/fail.h unixsupport.h cst2constr.h +unlink.o: unlink.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h +utimes.o: utimes.c ../../byterun/caml/fail.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/misc.h \ + ../../byterun/caml/config.h ../../byterun/caml/../../config/m.h \ + ../../byterun/caml/../../config/s.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/major_gc.h \ + ../../byterun/caml/freelist.h ../../byterun/caml/minor_gc.h \ + ../../byterun/caml/address_class.h ../../byterun/caml/signals.h \ + unixsupport.h +wait.o: wait.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/alloc.h \ + ../../byterun/caml/mlvalues.h ../../byterun/caml/fail.h \ + ../../byterun/caml/memory.h ../../byterun/caml/gc.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h +write.o: write.c ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/compatibility.h ../../byterun/caml/config.h \ + ../../byterun/caml/../../config/m.h ../../byterun/caml/../../config/s.h \ + ../../byterun/caml/misc.h ../../byterun/caml/memory.h \ + ../../byterun/caml/gc.h ../../byterun/caml/mlvalues.h \ + ../../byterun/caml/major_gc.h ../../byterun/caml/freelist.h \ + ../../byterun/caml/minor_gc.h ../../byterun/caml/address_class.h \ + ../../byterun/caml/signals.h unixsupport.h unixLabels.cmi : unix.cmi -unix.cmo : unix.cmi -unix.cmx : unix.cmi +unix.cmi : unixLabels.cmo : unix.cmi unixLabels.cmi unixLabels.cmx : unix.cmx unixLabels.cmi +unix.cmo : unix.cmi +unix.cmx : unix.cmi diff --git a/otherlibs/unix/Makefile b/otherlibs/unix/Makefile index 5f4d72b8..faebd3f5 100644 --- a/otherlibs/unix/Makefile +++ b/otherlibs/unix/Makefile @@ -41,7 +41,7 @@ HEADERS=unixsupport.h socketaddr.h include ../Makefile depend: - gcc -MM $(CFLAGS) *.c > .depend - ../../boot/ocamlrun ../../tools/ocamldep *.mli *.ml >> .depend + $(CC) -MM $(CFLAGS) *.c > .depend + $(CAMLRUN) ../../tools/ocamldep *.mli *.ml >> .depend include .depend diff --git a/otherlibs/unix/accept.c b/otherlibs/unix/accept.c index 183b8e86..3fd01918 100644 --- a/otherlibs/unix/accept.c +++ b/otherlibs/unix/accept.c @@ -11,11 +11,11 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/access.c b/otherlibs/unix/access.c index 7df4f9c5..28c26b82 100644 --- a/otherlibs/unix/access.c +++ b/otherlibs/unix/access.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #ifdef HAS_UNISTD diff --git a/otherlibs/unix/addrofstr.c b/otherlibs/unix/addrofstr.c index e17841f9..c4bd2e72 100644 --- a/otherlibs/unix/addrofstr.c +++ b/otherlibs/unix/addrofstr.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/fail.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/alarm.c b/otherlibs/unix/alarm.c index 30472765..eb92a682 100644 --- a/otherlibs/unix/alarm.c +++ b/otherlibs/unix/alarm.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_alarm(value t) diff --git a/otherlibs/unix/bind.c b/otherlibs/unix/bind.c index e3d0046c..4ea75c21 100644 --- a/otherlibs/unix/bind.c +++ b/otherlibs/unix/bind.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <fail.h> -#include <mlvalues.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/chdir.c b/otherlibs/unix/chdir.c index 0d5326a0..24732111 100644 --- a/otherlibs/unix/chdir.c +++ b/otherlibs/unix/chdir.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_chdir(value path) diff --git a/otherlibs/unix/chmod.c b/otherlibs/unix/chmod.c index 90dd6024..2d3f30fe 100644 --- a/otherlibs/unix/chmod.c +++ b/otherlibs/unix/chmod.c @@ -13,9 +13,9 @@ #include <sys/types.h> #include <sys/stat.h> -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_chmod(value path, value perm) diff --git a/otherlibs/unix/chown.c b/otherlibs/unix/chown.c index 697f4477..6c9e896a 100644 --- a/otherlibs/unix/chown.c +++ b/otherlibs/unix/chown.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_chown(value path, value uid, value gid) diff --git a/otherlibs/unix/chroot.c b/otherlibs/unix/chroot.c index b41c09ff..c30a0da9 100644 --- a/otherlibs/unix/chroot.c +++ b/otherlibs/unix/chroot.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_chroot(value path) diff --git a/otherlibs/unix/close.c b/otherlibs/unix/close.c index 8a56c413..aff8911f 100644 --- a/otherlibs/unix/close.c +++ b/otherlibs/unix/close.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_close(value fd) diff --git a/otherlibs/unix/closedir.c b/otherlibs/unix/closedir.c index 4196acd4..5e8008d5 100644 --- a/otherlibs/unix/closedir.c +++ b/otherlibs/unix/closedir.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #include <errno.h> #include <sys/types.h> diff --git a/otherlibs/unix/connect.c b/otherlibs/unix/connect.c index ed8b12c3..b4b3e19c 100644 --- a/otherlibs/unix/connect.c +++ b/otherlibs/unix/connect.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <fail.h> -#include <mlvalues.h> -#include <signals.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> +#include <caml/signals.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/cst2constr.c b/otherlibs/unix/cst2constr.c index f27cace7..87721ce3 100644 --- a/otherlibs/unix/cst2constr.c +++ b/otherlibs/unix/cst2constr.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/fail.h> #include "cst2constr.h" value cst_to_constr(int n, int *tbl, int size, int deflt) diff --git a/otherlibs/unix/cstringv.c b/otherlibs/unix/cstringv.c index d8541100..0e614918 100644 --- a/otherlibs/unix/cstringv.c +++ b/otherlibs/unix/cstringv.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> #include "unixsupport.h" char ** cstringvect(value arg) diff --git a/otherlibs/unix/dup.c b/otherlibs/unix/dup.c index 36e3efac..c6e9dcf2 100644 --- a/otherlibs/unix/dup.c +++ b/otherlibs/unix/dup.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_dup(value fd) diff --git a/otherlibs/unix/dup2.c b/otherlibs/unix/dup2.c index c5018022..fd9ea3d2 100644 --- a/otherlibs/unix/dup2.c +++ b/otherlibs/unix/dup2.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #ifdef HAS_DUP2 diff --git a/otherlibs/unix/envir.c b/otherlibs/unix/envir.c index 4b189334..366608b6 100644 --- a/otherlibs/unix/envir.c +++ b/otherlibs/unix/envir.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> #ifndef _WIN32 extern char ** environ; diff --git a/otherlibs/unix/errmsg.c b/otherlibs/unix/errmsg.c index 5df3e1e7..0f610e9d 100644 --- a/otherlibs/unix/errmsg.c +++ b/otherlibs/unix/errmsg.c @@ -13,8 +13,8 @@ #include <errno.h> #include <string.h> -#include <mlvalues.h> -#include <alloc.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> extern int error_table[]; diff --git a/otherlibs/unix/execv.c b/otherlibs/unix/execv.c index ee59fa48..9a775489 100644 --- a/otherlibs/unix/execv.c +++ b/otherlibs/unix/execv.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> #include "unixsupport.h" extern char ** cstringvect(); diff --git a/otherlibs/unix/execve.c b/otherlibs/unix/execve.c index 62b2d2c9..92171c2d 100644 --- a/otherlibs/unix/execve.c +++ b/otherlibs/unix/execve.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> #include "unixsupport.h" extern char ** cstringvect(); diff --git a/otherlibs/unix/execvp.c b/otherlibs/unix/execvp.c index 8e28fa06..ce6900ab 100644 --- a/otherlibs/unix/execvp.c +++ b/otherlibs/unix/execvp.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> #include "unixsupport.h" extern char ** cstringvect(); diff --git a/otherlibs/unix/exit.c b/otherlibs/unix/exit.c index 94f5fb5e..cfc4e16c 100644 --- a/otherlibs/unix/exit.c +++ b/otherlibs/unix/exit.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_exit(value n) diff --git a/otherlibs/unix/fchmod.c b/otherlibs/unix/fchmod.c index 711097eb..11578ff2 100644 --- a/otherlibs/unix/fchmod.c +++ b/otherlibs/unix/fchmod.c @@ -13,9 +13,9 @@ #include <sys/types.h> #include <sys/stat.h> -#include <fail.h> -#include <mlvalues.h> -#include <signals.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> +#include <caml/signals.h> #include "unixsupport.h" #ifdef HAS_FCHMOD diff --git a/otherlibs/unix/fchown.c b/otherlibs/unix/fchown.c index 2a6746ca..24872ec8 100644 --- a/otherlibs/unix/fchown.c +++ b/otherlibs/unix/fchown.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <fail.h> -#include <mlvalues.h> -#include <signals.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> +#include <caml/signals.h> #include "unixsupport.h" #ifdef HAS_FCHMOD diff --git a/otherlibs/unix/fcntl.c b/otherlibs/unix/fcntl.c index 886c12de..c89e9a6f 100644 --- a/otherlibs/unix/fcntl.c +++ b/otherlibs/unix/fcntl.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <fail.h> -#include <mlvalues.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #ifdef HAS_UNISTD #include <unistd.h> diff --git a/otherlibs/unix/fork.c b/otherlibs/unix/fork.c index b21d80c6..ac0d6772 100644 --- a/otherlibs/unix/fork.c +++ b/otherlibs/unix/fork.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <debugger.h> +#include <caml/mlvalues.h> +#include <caml/debugger.h> #include "unixsupport.h" CAMLprim value unix_fork(value unit) diff --git a/otherlibs/unix/ftruncate.c b/otherlibs/unix/ftruncate.c index ec494ba5..08a4a775 100644 --- a/otherlibs/unix/ftruncate.c +++ b/otherlibs/unix/ftruncate.c @@ -12,10 +12,10 @@ /***********************************************************************/ #include <sys/types.h> -#include <fail.h> -#include <mlvalues.h> -#include <io.h> -#include <signals.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> +#include <caml/io.h> +#include <caml/signals.h> #include "unixsupport.h" #ifdef HAS_UNISTD #include <unistd.h> diff --git a/otherlibs/unix/getaddrinfo.c b/otherlibs/unix/getaddrinfo.c index 28d8903a..28179343 100644 --- a/otherlibs/unix/getaddrinfo.c +++ b/otherlibs/unix/getaddrinfo.c @@ -12,12 +12,12 @@ /***********************************************************************/ #include <string.h> -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> -#include <memory.h> -#include <misc.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/memory.h> +#include <caml/misc.h> +#include <caml/signals.h> #include "unixsupport.h" #include "cst2constr.h" diff --git a/otherlibs/unix/getcwd.c b/otherlibs/unix/getcwd.c index 8d1b8e50..043c96b6 100644 --- a/otherlibs/unix/getcwd.c +++ b/otherlibs/unix/getcwd.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> #include "unixsupport.h" #if !defined (_WIN32) && !macintosh diff --git a/otherlibs/unix/getegid.c b/otherlibs/unix/getegid.c index b1977ec9..c0ab2b39 100644 --- a/otherlibs/unix/getegid.c +++ b/otherlibs/unix/getegid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_getegid(value unit) diff --git a/otherlibs/unix/geteuid.c b/otherlibs/unix/geteuid.c index 9bf89714..095d3fe1 100644 --- a/otherlibs/unix/geteuid.c +++ b/otherlibs/unix/geteuid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_geteuid(value unit) diff --git a/otherlibs/unix/getgid.c b/otherlibs/unix/getgid.c index 8cfe3ddb..8a4991a5 100644 --- a/otherlibs/unix/getgid.c +++ b/otherlibs/unix/getgid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_getgid(value unit) diff --git a/otherlibs/unix/getgr.c b/otherlibs/unix/getgr.c index d1e610d8..14338ccf 100644 --- a/otherlibs/unix/getgr.c +++ b/otherlibs/unix/getgr.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <fail.h> -#include <alloc.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/fail.h> +#include <caml/alloc.h> +#include <caml/memory.h> #include "unixsupport.h" #include <stdio.h> #include <grp.h> diff --git a/otherlibs/unix/getgroups.c b/otherlibs/unix/getgroups.c index 6d420b5e..84cd4540 100644 --- a/otherlibs/unix/getgroups.c +++ b/otherlibs/unix/getgroups.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> #ifdef HAS_GETGROUPS diff --git a/otherlibs/unix/gethost.c b/otherlibs/unix/gethost.c index 8d5bb03f..d5220415 100644 --- a/otherlibs/unix/gethost.c +++ b/otherlibs/unix/gethost.c @@ -12,11 +12,11 @@ /***********************************************************************/ #include <string.h> -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/gethostname.c b/otherlibs/unix/gethostname.c index 77b183cb..a3aba574 100644 --- a/otherlibs/unix/gethostname.c +++ b/otherlibs/unix/gethostname.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> #ifndef _WIN32 #include <sys/param.h> #endif diff --git a/otherlibs/unix/getlogin.c b/otherlibs/unix/getlogin.c index 27a508e0..7f40e442 100644 --- a/otherlibs/unix/getlogin.c +++ b/otherlibs/unix/getlogin.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> #include "unixsupport.h" #include <errno.h> diff --git a/otherlibs/unix/getnameinfo.c b/otherlibs/unix/getnameinfo.c index d7dddb3f..d4663957 100644 --- a/otherlibs/unix/getnameinfo.c +++ b/otherlibs/unix/getnameinfo.c @@ -12,11 +12,11 @@ /***********************************************************************/ #include <string.h> -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #if defined(HAS_SOCKETS) && defined(HAS_IPV6) diff --git a/otherlibs/unix/getpeername.c b/otherlibs/unix/getpeername.c index 9692202c..183b210d 100644 --- a/otherlibs/unix/getpeername.c +++ b/otherlibs/unix/getpeername.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <fail.h> -#include <mlvalues.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/getpid.c b/otherlibs/unix/getpid.c index cf4c3f90..4cf46e4c 100644 --- a/otherlibs/unix/getpid.c +++ b/otherlibs/unix/getpid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_getpid(value unit) diff --git a/otherlibs/unix/getppid.c b/otherlibs/unix/getppid.c index 616393b4..8c30a77a 100644 --- a/otherlibs/unix/getppid.c +++ b/otherlibs/unix/getppid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_getppid(value unit) diff --git a/otherlibs/unix/getproto.c b/otherlibs/unix/getproto.c index 291a71da..b89cbba4 100644 --- a/otherlibs/unix/getproto.c +++ b/otherlibs/unix/getproto.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/memory.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/getpw.c b/otherlibs/unix/getpw.c index 0061ca80..82fb4d8f 100644 --- a/otherlibs/unix/getpw.c +++ b/otherlibs/unix/getpw.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <memory.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/memory.h> +#include <caml/fail.h> #include "unixsupport.h" #include <pwd.h> diff --git a/otherlibs/unix/getserv.c b/otherlibs/unix/getserv.c index de91cbe0..deb5f147 100644 --- a/otherlibs/unix/getserv.c +++ b/otherlibs/unix/getserv.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/memory.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/getsockname.c b/otherlibs/unix/getsockname.c index 69e20ccc..b28cfd14 100644 --- a/otherlibs/unix/getsockname.c +++ b/otherlibs/unix/getsockname.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <fail.h> -#include <mlvalues.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/gettimeofday.c b/otherlibs/unix/gettimeofday.c index f6a8615e..9cbfbeaa 100644 --- a/otherlibs/unix/gettimeofday.c +++ b/otherlibs/unix/gettimeofday.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> #include "unixsupport.h" #ifdef HAS_GETTIMEOFDAY diff --git a/otherlibs/unix/getuid.c b/otherlibs/unix/getuid.c index f51722a5..7d0ce399 100644 --- a/otherlibs/unix/getuid.c +++ b/otherlibs/unix/getuid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_getuid(value unit) diff --git a/otherlibs/unix/gmtime.c b/otherlibs/unix/gmtime.c index c8f6ac11..566f174f 100644 --- a/otherlibs/unix/gmtime.c +++ b/otherlibs/unix/gmtime.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/memory.h> #include "unixsupport.h" #include <time.h> #include <errno.h> diff --git a/otherlibs/unix/initgroups.c b/otherlibs/unix/initgroups.c index e9541e5a..ca3ed4c9 100644 --- a/otherlibs/unix/initgroups.c +++ b/otherlibs/unix/initgroups.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> #ifdef HAS_INITGROUPS diff --git a/otherlibs/unix/isatty.c b/otherlibs/unix/isatty.c index 800afc46..935c39d4 100644 --- a/otherlibs/unix/isatty.c +++ b/otherlibs/unix/isatty.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_isatty(value fd) diff --git a/otherlibs/unix/itimer.c b/otherlibs/unix/itimer.c index 537c2d9e..f1950264 100644 --- a/otherlibs/unix/itimer.c +++ b/otherlibs/unix/itimer.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/memory.h> #include "unixsupport.h" #ifdef HAS_SETITIMER diff --git a/otherlibs/unix/kill.c b/otherlibs/unix/kill.c index b3f7d887..c0f74d48 100644 --- a/otherlibs/unix/kill.c +++ b/otherlibs/unix/kill.c @@ -11,11 +11,11 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/fail.h> #include "unixsupport.h" #include <signal.h> -#include <signals.h> +#include <caml/signals.h> CAMLprim value unix_kill(value pid, value signal) { diff --git a/otherlibs/unix/link.c b/otherlibs/unix/link.c index c71118a5..0ec42f5f 100644 --- a/otherlibs/unix/link.c +++ b/otherlibs/unix/link.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_link(value path1, value path2) diff --git a/otherlibs/unix/listen.c b/otherlibs/unix/listen.c index 26b0185b..38efc9fd 100644 --- a/otherlibs/unix/listen.c +++ b/otherlibs/unix/listen.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <fail.h> -#include <mlvalues.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/lockf.c b/otherlibs/unix/lockf.c index 813a4f7f..aeaf4513 100644 --- a/otherlibs/unix/lockf.c +++ b/otherlibs/unix/lockf.c @@ -13,9 +13,9 @@ #include <errno.h> #include <fcntl.h> -#include <fail.h> -#include <mlvalues.h> -#include <signals.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> +#include <caml/signals.h> #include "unixsupport.h" #if defined(F_GETLK) && defined(F_SETLK) && defined(F_SETLKW) diff --git a/otherlibs/unix/lseek.c b/otherlibs/unix/lseek.c index 826d84f2..5a7b7770 100644 --- a/otherlibs/unix/lseek.c +++ b/otherlibs/unix/lseek.c @@ -13,10 +13,10 @@ #include <errno.h> #include <sys/types.h> -#include <mlvalues.h> -#include <alloc.h> -#include <io.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/io.h> +#include <caml/signals.h> #include "unixsupport.h" #ifdef HAS_UNISTD diff --git a/otherlibs/unix/mkdir.c b/otherlibs/unix/mkdir.c index d72a066c..6b9c76e6 100644 --- a/otherlibs/unix/mkdir.c +++ b/otherlibs/unix/mkdir.c @@ -13,9 +13,9 @@ #include <sys/types.h> #include <sys/stat.h> -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_mkdir(value path, value perm) diff --git a/otherlibs/unix/mkfifo.c b/otherlibs/unix/mkfifo.c index a00bcf2d..07481385 100644 --- a/otherlibs/unix/mkfifo.c +++ b/otherlibs/unix/mkfifo.c @@ -13,10 +13,10 @@ #include <sys/types.h> #include <sys/stat.h> -#include <fail.h> -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #ifdef HAS_MKFIFO diff --git a/otherlibs/unix/nanosecond_stat.h b/otherlibs/unix/nanosecond_stat.h new file mode 100644 index 00000000..c1a648ef --- /dev/null +++ b/otherlibs/unix/nanosecond_stat.h @@ -0,0 +1,25 @@ +/***********************************************************************/ +/* */ +/* OCaml */ +/* */ +/* Jeremie Dimino, Jane Street Group, LLC */ +/* */ +/* Copyright 2015 Institut National de Recherche en Informatique et */ +/* en Automatique. All rights reserved. This file is distributed */ +/* under the terms of the GNU Library General Public License, with */ +/* the special exception on linking described in file ../../LICENSE. */ +/* */ +/***********************************************************************/ + +/* This file is used by the configure test program nanosecond_stat.c + and stat.c in this directory */ + +#if HAS_NANOSECOND_STAT == 1 +# define NSEC(buf, field) buf->st_##field##tim.tv_nsec +#elif HAS_NANOSECOND_STAT == 2 +# define NSEC(buf, field) buf->st_##field##timespec.tv_nsec +#elif HAS_NANOSECOND_STAT == 3 +# define NSEC(buf, field) buf->st_##field##timensec +#else +# define NSEC(buf, field) 0 +#endif diff --git a/otherlibs/unix/nice.c b/otherlibs/unix/nice.c index d0956a16..e8f4f2b0 100644 --- a/otherlibs/unix/nice.c +++ b/otherlibs/unix/nice.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #include <errno.h> #ifdef HAS_UNISTD diff --git a/otherlibs/unix/open.c b/otherlibs/unix/open.c index 32c332f2..1bad2c5b 100644 --- a/otherlibs/unix/open.c +++ b/otherlibs/unix/open.c @@ -11,11 +11,11 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <memory.h> -#include <misc.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/memory.h> +#include <caml/misc.h> +#include <caml/signals.h> #include "unixsupport.h" #include <string.h> #ifdef HAS_UNISTD diff --git a/otherlibs/unix/opendir.c b/otherlibs/unix/opendir.c index 9cb6829c..bdf031b3 100644 --- a/otherlibs/unix/opendir.c +++ b/otherlibs/unix/opendir.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> -#include <alloc.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/alloc.h> +#include <caml/signals.h> #include "unixsupport.h" #include <sys/types.h> #ifdef HAS_DIRENT diff --git a/otherlibs/unix/pipe.c b/otherlibs/unix/pipe.c index 7c6b1438..5f8f23da 100644 --- a/otherlibs/unix/pipe.c +++ b/otherlibs/unix/pipe.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> #include "unixsupport.h" CAMLprim value unix_pipe(value unit) diff --git a/otherlibs/unix/putenv.c b/otherlibs/unix/putenv.c index 28ad962f..ccb8f1ab 100644 --- a/otherlibs/unix/putenv.c +++ b/otherlibs/unix/putenv.c @@ -14,9 +14,9 @@ #include <stdlib.h> #include <string.h> -#include <fail.h> -#include <memory.h> -#include <mlvalues.h> +#include <caml/fail.h> +#include <caml/memory.h> +#include <caml/mlvalues.h> #include "unixsupport.h" diff --git a/otherlibs/unix/read.c b/otherlibs/unix/read.c index 3bbd0b47..14305d37 100644 --- a/otherlibs/unix/read.c +++ b/otherlibs/unix/read.c @@ -12,9 +12,9 @@ /***********************************************************************/ #include <string.h> -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_read(value fd, value buf, value ofs, value len) diff --git a/otherlibs/unix/readdir.c b/otherlibs/unix/readdir.c index e6daf5f6..4c309268 100644 --- a/otherlibs/unix/readdir.c +++ b/otherlibs/unix/readdir.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <fail.h> -#include <alloc.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/fail.h> +#include <caml/alloc.h> +#include <caml/signals.h> #include "unixsupport.h" #include <errno.h> #include <sys/types.h> diff --git a/otherlibs/unix/readlink.c b/otherlibs/unix/readlink.c index 5706ba03..836718d1 100644 --- a/otherlibs/unix/readlink.c +++ b/otherlibs/unix/readlink.c @@ -11,11 +11,11 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> -#include <alloc.h> -#include <fail.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/signals.h> #ifdef HAS_SYMLINK diff --git a/otherlibs/unix/rename.c b/otherlibs/unix/rename.c index 78da7094..78e0846c 100644 --- a/otherlibs/unix/rename.c +++ b/otherlibs/unix/rename.c @@ -12,9 +12,9 @@ /***********************************************************************/ #include <stdio.h> -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_rename(value path1, value path2) diff --git a/otherlibs/unix/rewinddir.c b/otherlibs/unix/rewinddir.c index 17cc639f..c3771323 100644 --- a/otherlibs/unix/rewinddir.c +++ b/otherlibs/unix/rewinddir.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <fail.h> -#include <mlvalues.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #include <errno.h> #include <sys/types.h> diff --git a/otherlibs/unix/rmdir.c b/otherlibs/unix/rmdir.c index 12d521a7..20359ce6 100644 --- a/otherlibs/unix/rmdir.c +++ b/otherlibs/unix/rmdir.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_rmdir(value path) diff --git a/otherlibs/unix/select.c b/otherlibs/unix/select.c index 12d8cc55..23c48024 100644 --- a/otherlibs/unix/select.c +++ b/otherlibs/unix/select.c @@ -11,11 +11,11 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #ifdef HAS_SELECT diff --git a/otherlibs/unix/sendrecv.c b/otherlibs/unix/sendrecv.c index 679dde3c..7d251a43 100644 --- a/otherlibs/unix/sendrecv.c +++ b/otherlibs/unix/sendrecv.c @@ -12,11 +12,11 @@ /***********************************************************************/ #include <string.h> -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/setgid.c b/otherlibs/unix/setgid.c index 8e635aa4..b7204745 100644 --- a/otherlibs/unix/setgid.c +++ b/otherlibs/unix/setgid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_setgid(value gid) diff --git a/otherlibs/unix/setgroups.c b/otherlibs/unix/setgroups.c index 2279a6b3..7284b735 100644 --- a/otherlibs/unix/setgroups.c +++ b/otherlibs/unix/setgroups.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/memory.h> #ifdef HAS_SETGROUPS diff --git a/otherlibs/unix/setsid.c b/otherlibs/unix/setsid.c index 252b85c4..92814eba 100644 --- a/otherlibs/unix/setsid.c +++ b/otherlibs/unix/setsid.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <fail.h> -#include <mlvalues.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #ifdef HAS_UNISTD #include <unistd.h> diff --git a/otherlibs/unix/setuid.c b/otherlibs/unix/setuid.c index 8a2a8074..c8a9c622 100644 --- a/otherlibs/unix/setuid.c +++ b/otherlibs/unix/setuid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_setuid(value uid) diff --git a/otherlibs/unix/shutdown.c b/otherlibs/unix/shutdown.c index c428afbd..1ceafd6e 100644 --- a/otherlibs/unix/shutdown.c +++ b/otherlibs/unix/shutdown.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <fail.h> -#include <mlvalues.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/signals.c b/otherlibs/unix/signals.c index d4d97ef0..d30a70db 100644 --- a/otherlibs/unix/signals.c +++ b/otherlibs/unix/signals.c @@ -14,11 +14,11 @@ #include <errno.h> #include <signal.h> -#include <alloc.h> -#include <fail.h> -#include <memory.h> -#include <mlvalues.h> -#include <signals.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/memory.h> +#include <caml/mlvalues.h> +#include <caml/signals.h> #include "unixsupport.h" #ifndef NSIG diff --git a/otherlibs/unix/sleep.c b/otherlibs/unix/sleep.c index 58affd39..a39c5f82 100644 --- a/otherlibs/unix/sleep.c +++ b/otherlibs/unix/sleep.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_sleep(value t) diff --git a/otherlibs/unix/socket.c b/otherlibs/unix/socket.c index 9e23231a..9cf3ed3a 100644 --- a/otherlibs/unix/socket.c +++ b/otherlibs/unix/socket.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <fail.h> -#include <mlvalues.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/socketaddr.c b/otherlibs/unix/socketaddr.c index 24babcab..2f4bdadf 100644 --- a/otherlibs/unix/socketaddr.c +++ b/otherlibs/unix/socketaddr.c @@ -12,9 +12,9 @@ /***********************************************************************/ #include <string.h> -#include <mlvalues.h> -#include <alloc.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/memory.h> #include <errno.h> #include "unixsupport.h" diff --git a/otherlibs/unix/socketaddr.h b/otherlibs/unix/socketaddr.h index cf25e2f9..0077daea 100644 --- a/otherlibs/unix/socketaddr.h +++ b/otherlibs/unix/socketaddr.h @@ -11,7 +11,10 @@ /* */ /***********************************************************************/ -#include "misc.h" +#ifndef CAML_SOCKETADDR_H +#define CAML_SOCKETADDR_H + +#include "caml/misc.h" #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> @@ -33,6 +36,10 @@ typedef socklen_t socklen_param_type; typedef int socklen_param_type; #endif +#ifdef __cplusplus +extern "C" { +#endif + extern void get_sockaddr (value mladdr, union sock_addr_union * addr /*out*/, socklen_param_type * addr_len /*out*/); @@ -45,3 +52,9 @@ CAMLexport value alloc_inet_addr (struct in_addr * inaddr); CAMLexport value alloc_inet6_addr (struct in6_addr * inaddr); #define GET_INET6_ADDR(v) (*((struct in6_addr *) (v))) #endif + +#ifdef __cplusplus +} +#endif + +#endif /* CAML_SOCKETADDR_H */ diff --git a/otherlibs/unix/socketpair.c b/otherlibs/unix/socketpair.c index 301ebf86..4f85f9a6 100644 --- a/otherlibs/unix/socketpair.c +++ b/otherlibs/unix/socketpair.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/sockopt.c b/otherlibs/unix/sockopt.c index b6167ebf..8137e42c 100644 --- a/otherlibs/unix/sockopt.c +++ b/otherlibs/unix/sockopt.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> -#include <alloc.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/alloc.h> +#include <caml/fail.h> #include "unixsupport.h" #ifdef HAS_SOCKETS @@ -194,6 +194,7 @@ unix_getsockopt_aux(char * name, switch (ty) { case TYPE_BOOL: + return Val_bool(optval.i); case TYPE_INT: return Val_int(optval.i); case TYPE_LINGER: diff --git a/otherlibs/unix/stat.c b/otherlibs/unix/stat.c index f6d8c06d..f938645a 100644 --- a/otherlibs/unix/stat.c +++ b/otherlibs/unix/stat.c @@ -12,15 +12,15 @@ /***********************************************************************/ #include <errno.h> -#include <mlvalues.h> -#include <memory.h> -#include <alloc.h> -#include <signals.h> -#include "unixsupport.h" -#include "cst2constr.h" #include <sys/types.h> #include <sys/stat.h> -#include <io.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/alloc.h> +#include <caml/signals.h> +#include <caml/io.h> +#include "unixsupport.h" +#include "cst2constr.h" #ifndef S_IFLNK #define S_IFLNK 0 @@ -48,9 +48,11 @@ static value stat_aux(int use_64, struct stat *buf) CAMLparam0(); CAMLlocal5(atime, mtime, ctime, offset, v); - atime = copy_double((double) buf->st_atime); - mtime = copy_double((double) buf->st_mtime); - ctime = copy_double((double) buf->st_ctime); + #include "nanosecond_stat.h" + atime = caml_copy_double((double) buf->st_atime + (NSEC(buf, a) / 1000000000.0)); + mtime = caml_copy_double((double) buf->st_mtime + (NSEC(buf, m) / 1000000000.0)); + ctime = caml_copy_double((double) buf->st_ctime + (NSEC(buf, c) / 1000000000.0)); + #undef NSEC offset = use_64 ? Val_file_offset(buf->st_size) : Val_int (buf->st_size); v = alloc_small(12, 0); Field (v, 0) = Val_int (buf->st_dev); diff --git a/otherlibs/unix/strofaddr.c b/otherlibs/unix/strofaddr.c index 5381bc31..c4ea6bad 100644 --- a/otherlibs/unix/strofaddr.c +++ b/otherlibs/unix/strofaddr.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> #include "unixsupport.h" #ifdef HAS_SOCKETS diff --git a/otherlibs/unix/symlink.c b/otherlibs/unix/symlink.c index d1dbf37c..dbbd2665 100644 --- a/otherlibs/unix/symlink.c +++ b/otherlibs/unix/symlink.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <fail.h> -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #ifdef HAS_SYMLINK diff --git a/otherlibs/unix/termios.c b/otherlibs/unix/termios.c index 9dd168ae..40173737 100644 --- a/otherlibs/unix/termios.c +++ b/otherlibs/unix/termios.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> #include "unixsupport.h" #ifdef HAS_TERMIOS @@ -90,17 +90,22 @@ static long terminal_io_descr[] = { #undef cflags #undef lflags -struct speedtable_entry ; - static struct { speed_t speed; int baud; } speedtable[] = { + + /* standard speeds */ + {B0, 0}, {B50, 50}, {B75, 75}, {B110, 110}, {B134, 134}, {B150, 150}, +#ifdef B200 + /* Shouldn't need to be ifdef'd but I'm not sure it's available everywhere. */ + {B200, 200}, +#endif {B300, 300}, {B600, 600}, {B1200, 1200}, @@ -110,6 +115,8 @@ static struct { {B9600, 9600}, {B19200, 19200}, {B38400, 38400}, + + /* usual extensions */ #ifdef B57600 {B57600, 57600}, #endif @@ -119,7 +126,66 @@ static struct { #ifdef B230400 {B230400, 230400}, #endif - {B0, 0} + + /* Linux extensions */ +#ifdef B460800 + {B460800, 460800}, +#endif +#ifdef B500000 + {B500000, 500000}, +#endif +#ifdef B576000 + {B576000, 576000}, +#endif +#ifdef B921600 + {B921600, 921600}, +#endif +#ifdef B1000000 + {B1000000, 1000000}, +#endif +#ifdef B1152000 + {B1152000, 1152000}, +#endif +#ifdef B1500000 + {B1500000, 1500000}, +#endif +#ifdef B2000000 + {B2000000, 2000000}, +#endif +#ifdef B2500000 + {B2500000, 2500000}, +#endif +#ifdef B3000000 + {B3000000, 3000000}, +#endif +#ifdef B3500000 + {B3500000, 3500000}, +#endif +#ifdef B4000000 + {B4000000, 4000000}, +#endif + + /* MacOS extensions */ +#ifdef B7200 + {B7200, 7200}, +#endif +#ifdef B14400 + {B14400, 14400}, +#endif +#ifdef B28800 + {B28800, 28800}, +#endif +#ifdef B76800 + {B76800, 76800}, +#endif + + /* Cygwin extensions (in addition to the Linux ones) */ +#ifdef B128000 + {B128000, 128000}, +#endif +#ifdef B256000 + {B256000, 256000}, +#endif }; #define NSPEEDS (sizeof(speedtable) / sizeof(speedtable[0])) diff --git a/otherlibs/unix/time.c b/otherlibs/unix/time.c index 042a1f60..495adb66 100644 --- a/otherlibs/unix/time.c +++ b/otherlibs/unix/time.c @@ -12,8 +12,8 @@ /***********************************************************************/ #include <time.h> -#include <mlvalues.h> -#include <alloc.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> #include "unixsupport.h" CAMLprim value unix_time(value unit) diff --git a/otherlibs/unix/times.c b/otherlibs/unix/times.c index 8ab6006d..8760ad2a 100644 --- a/otherlibs/unix/times.c +++ b/otherlibs/unix/times.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/memory.h> #include "unixsupport.h" #include <time.h> #include <sys/types.h> diff --git a/otherlibs/unix/truncate.c b/otherlibs/unix/truncate.c index 520320eb..62683fcf 100644 --- a/otherlibs/unix/truncate.c +++ b/otherlibs/unix/truncate.c @@ -12,11 +12,11 @@ /***********************************************************************/ #include <sys/types.h> -#include <mlvalues.h> -#include <memory.h> -#include <fail.h> -#include <signals.h> -#include <io.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/fail.h> +#include <caml/signals.h> +#include <caml/io.h> #include "unixsupport.h" #ifdef HAS_UNISTD #include <unistd.h> diff --git a/otherlibs/unix/umask.c b/otherlibs/unix/umask.c index 311e4ed9..9b88f105 100644 --- a/otherlibs/unix/umask.c +++ b/otherlibs/unix/umask.c @@ -13,7 +13,7 @@ #include <sys/types.h> #include <sys/stat.h> -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_umask(value perm) diff --git a/otherlibs/unix/unixsupport.c b/otherlibs/unix/unixsupport.c index f1df3fc7..6c7171fd 100644 --- a/otherlibs/unix/unixsupport.c +++ b/otherlibs/unix/unixsupport.c @@ -11,11 +11,11 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <callback.h> -#include <memory.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/callback.h> +#include <caml/memory.h> +#include <caml/fail.h> #include "unixsupport.h" #include "cst2constr.h" #include <errno.h> diff --git a/otherlibs/unix/unixsupport.h b/otherlibs/unix/unixsupport.h index a8065d97..d4312ab4 100644 --- a/otherlibs/unix/unixsupport.h +++ b/otherlibs/unix/unixsupport.h @@ -11,10 +11,17 @@ /* */ /***********************************************************************/ +#ifndef CAML_UNIXSUPPORT_H +#define CAML_UNIXSUPPORT_H + #ifdef HAS_UNISTD #include <unistd.h> #endif +#ifdef __cplusplus +extern "C" { +#endif + #define Nothing ((value) 0) extern value unix_error_of_code (int errcode); @@ -25,3 +32,9 @@ extern void uerror (char * cmdname, value arg) Noreturn; #define UNIX_BUFFER_SIZE 65536 #define DIR_Val(v) *((DIR **) &Field(v, 0)) + +#ifdef __cplusplus +} +#endif + +#endif /* CAML_UNIXSUPPORT_H */ diff --git a/otherlibs/unix/unlink.c b/otherlibs/unix/unlink.c index ae63f69a..687c69c2 100644 --- a/otherlibs/unix/unlink.c +++ b/otherlibs/unix/unlink.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_unlink(value path) diff --git a/otherlibs/unix/utimes.c b/otherlibs/unix/utimes.c index 0c3b77d1..bf2ae2fb 100644 --- a/otherlibs/unix/utimes.c +++ b/otherlibs/unix/utimes.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <fail.h> -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/fail.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #ifdef HAS_UTIME diff --git a/otherlibs/unix/wait.c b/otherlibs/unix/wait.c index 81f36839..a8eb42b7 100644 --- a/otherlibs/unix/wait.c +++ b/otherlibs/unix/wait.c @@ -11,11 +11,11 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <fail.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/fail.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #include <sys/types.h> diff --git a/otherlibs/unix/write.c b/otherlibs/unix/write.c index d6fe4093..d6842d9f 100644 --- a/otherlibs/unix/write.c +++ b/otherlibs/unix/write.c @@ -13,9 +13,9 @@ #include <errno.h> #include <string.h> -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #ifndef EAGAIN diff --git a/otherlibs/win32graph/dib.c b/otherlibs/win32graph/dib.c index 100beba3..26fccf7f 100644 --- a/otherlibs/win32graph/dib.c +++ b/otherlibs/win32graph/dib.c @@ -42,9 +42,9 @@ #include <windows.h> -#include <memory.h> +#include <caml/memory.h> #include <string.h> -#include <io.h> +#include <caml/io.h> #include <stdio.h> // Size of window extra bytes (we store a handle to a PALINFO structure). diff --git a/otherlibs/win32graph/draw.c b/otherlibs/win32graph/draw.c index 11426734..99e1c5c7 100644 --- a/otherlibs/win32graph/draw.c +++ b/otherlibs/win32graph/draw.c @@ -12,12 +12,12 @@ /***********************************************************************/ #include <math.h> -#include "mlvalues.h" -#include "alloc.h" -#include "fail.h" +#include "caml/mlvalues.h" +#include "caml/alloc.h" +#include "caml/fail.h" #include "libgraph.h" -#include "custom.h" -#include "memory.h" +#include "caml/custom.h" +#include "caml/memory.h" HDC gcMetaFile; int grdisplay_mode; diff --git a/otherlibs/win32graph/events.c b/otherlibs/win32graph/events.c index 81242729..837e53ac 100755 --- a/otherlibs/win32graph/events.c +++ b/otherlibs/win32graph/events.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include "mlvalues.h" -#include "alloc.h" +#include "caml/mlvalues.h" +#include "caml/alloc.h" #include "libgraph.h" #include <windows.h> diff --git a/otherlibs/win32graph/open.c b/otherlibs/win32graph/open.c index ded2e28a..e9d10cad 100644 --- a/otherlibs/win32graph/open.c +++ b/otherlibs/win32graph/open.c @@ -13,10 +13,10 @@ #include <fcntl.h> #include <signal.h> -#include "mlvalues.h" -#include "fail.h" +#include "caml/mlvalues.h" +#include "caml/fail.h" #include "libgraph.h" -#include "callback.h" +#include "caml/callback.h" #include <windows.h> static value gr_reset(void); @@ -112,7 +112,7 @@ int DoRegisterClass(void) WNDCLASS wc; memset(&wc,0,sizeof(WNDCLASS)); - wc.style = CS_HREDRAW|CS_VREDRAW |CS_DBLCLKS|CS_OWNDC ; + wc.style = CS_HREDRAW|CS_VREDRAW|CS_OWNDC ; wc.lpfnWndProc = (WNDPROC)GraphicsWndProc; wc.hInstance = hInst; wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); diff --git a/otherlibs/win32unix/accept.c b/otherlibs/win32unix/accept.c index f2e14467..f705f0f0 100644 --- a/otherlibs/win32unix/accept.c +++ b/otherlibs/win32unix/accept.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #include <mswsock.h> // for SO_OPENTYPE and SO_SYNCHRONOUS_NONALERT #include "socketaddr.h" diff --git a/otherlibs/win32unix/bind.c b/otherlibs/win32unix/bind.c index bc092308..4b1d3def 100644 --- a/otherlibs/win32unix/bind.c +++ b/otherlibs/win32unix/bind.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #include "socketaddr.h" diff --git a/otherlibs/win32unix/channels.c b/otherlibs/win32unix/channels.c index 1e7e823a..b6350e17 100644 --- a/otherlibs/win32unix/channels.c +++ b/otherlibs/win32unix/channels.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <io.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/io.h> +#include <caml/memory.h> #include "unixsupport.h" #include <fcntl.h> diff --git a/otherlibs/win32unix/close.c b/otherlibs/win32unix/close.c index 20b131b0..7f8da29d 100644 --- a/otherlibs/win32unix/close.c +++ b/otherlibs/win32unix/close.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" -#include <io.h> +#include <caml/io.h> extern int _close(int); diff --git a/otherlibs/win32unix/close_on.c b/otherlibs/win32unix/close_on.c index 9ba342ed..7a316abc 100644 --- a/otherlibs/win32unix/close_on.c +++ b/otherlibs/win32unix/close_on.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #include <windows.h> diff --git a/otherlibs/win32unix/connect.c b/otherlibs/win32unix/connect.c index 190eb742..37cdbdaa 100644 --- a/otherlibs/win32unix/connect.c +++ b/otherlibs/win32unix/connect.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/signals.h> #include "unixsupport.h" #include "socketaddr.h" diff --git a/otherlibs/win32unix/createprocess.c b/otherlibs/win32unix/createprocess.c index 0e1e37a2..9766df5c 100644 --- a/otherlibs/win32unix/createprocess.c +++ b/otherlibs/win32unix/createprocess.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #include <windows.h> -#include <osdeps.h> +#include <caml/osdeps.h> static int win_has_console(void); diff --git a/otherlibs/win32unix/dup.c b/otherlibs/win32unix/dup.c index 76cbdf67..5db19e30 100644 --- a/otherlibs/win32unix/dup.c +++ b/otherlibs/win32unix/dup.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_dup(value fd) diff --git a/otherlibs/win32unix/dup2.c b/otherlibs/win32unix/dup2.c index 5f19710c..51842077 100644 --- a/otherlibs/win32unix/dup2.c +++ b/otherlibs/win32unix/dup2.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" extern int _dup2(int, int); diff --git a/otherlibs/win32unix/errmsg.c b/otherlibs/win32unix/errmsg.c index c3bc19c6..6107abc3 100644 --- a/otherlibs/win32unix/errmsg.c +++ b/otherlibs/win32unix/errmsg.c @@ -14,8 +14,8 @@ #include <stdio.h> #include <errno.h> #include <string.h> -#include <mlvalues.h> -#include <alloc.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> #include "unixsupport.h" extern int error_table[]; diff --git a/otherlibs/win32unix/getpeername.c b/otherlibs/win32unix/getpeername.c index ad6674bf..3467e03f 100644 --- a/otherlibs/win32unix/getpeername.c +++ b/otherlibs/win32unix/getpeername.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #include "socketaddr.h" diff --git a/otherlibs/win32unix/getpid.c b/otherlibs/win32unix/getpid.c index 65c8828a..06d95356 100644 --- a/otherlibs/win32unix/getpid.c +++ b/otherlibs/win32unix/getpid.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" extern value val_process_id; diff --git a/otherlibs/win32unix/getsockname.c b/otherlibs/win32unix/getsockname.c index 1e28f4b2..21e9d063 100644 --- a/otherlibs/win32unix/getsockname.c +++ b/otherlibs/win32unix/getsockname.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #include "socketaddr.h" diff --git a/otherlibs/win32unix/gettimeofday.c b/otherlibs/win32unix/gettimeofday.c index 573821fd..f4e25b5f 100644 --- a/otherlibs/win32unix/gettimeofday.c +++ b/otherlibs/win32unix/gettimeofday.c @@ -11,44 +11,20 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> #include <time.h> #include "unixsupport.h" -#ifdef HAS_MKTIME -static double initial_time = 0; /* 0 means uninitialized */ -#else -static time_t initial_time = 0; /* 0 means uninitialized */ -#endif -static DWORD initial_tickcount; +/* Unix epoch as a Windows timestamp in hundreds of ns */ +#define epoch_ft 116444736000000000.0; CAMLprim value unix_gettimeofday(value unit) { - DWORD tickcount = GetTickCount(); - SYSTEMTIME st; - struct tm tm; - if (initial_time == 0 || tickcount < initial_tickcount) { - initial_tickcount = tickcount; -#ifdef HAS_MKTIME - GetLocalTime(&st); - tm.tm_sec = st.wSecond; - tm.tm_min = st.wMinute; - tm.tm_hour = st.wHour; - tm.tm_mday = st.wDay; - tm.tm_mon = st.wMonth - 1; - tm.tm_year = st.wYear - 1900; - tm.tm_wday = 0; - tm.tm_yday = 0; - tm.tm_isdst = -1; - initial_time = ((double) mktime(&tm) + (double) st.wMilliseconds * 1e-3); -#else - initial_time = time(NULL); -#endif - return copy_double((double) initial_time); - } else { - return copy_double((double) initial_time + - (double) (tickcount - initial_tickcount) * 1e-3); - } + FILETIME ft; + double tm; + GetSystemTimeAsFileTime(&ft); + tm = *(uint64 *)&ft - epoch_ft; /* shift to Epoch-relative time */ + return copy_double(tm * 1e-7); /* tm is in 100ns */ } diff --git a/otherlibs/win32unix/link.c b/otherlibs/win32unix/link.c index 97748ba2..93d21508 100644 --- a/otherlibs/win32unix/link.c +++ b/otherlibs/win32unix/link.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/fail.h> #include "unixsupport.h" #include <windows.h> diff --git a/otherlibs/win32unix/listen.c b/otherlibs/win32unix/listen.c index 9602a373..767db61d 100644 --- a/otherlibs/win32unix/listen.c +++ b/otherlibs/win32unix/listen.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_listen(sock, backlog) diff --git a/otherlibs/win32unix/lockf.c b/otherlibs/win32unix/lockf.c index 6e6ca0ad..9c705a67 100644 --- a/otherlibs/win32unix/lockf.c +++ b/otherlibs/win32unix/lockf.c @@ -15,12 +15,12 @@ #include <errno.h> #include <fcntl.h> -#include <mlvalues.h> -#include <memory.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/fail.h> #include "unixsupport.h" #include <stdio.h> -#include <signals.h> +#include <caml/signals.h> #ifndef INVALID_SET_FILE_POINTER #define INVALID_SET_FILE_POINTER (-1) diff --git a/otherlibs/win32unix/lseek.c b/otherlibs/win32unix/lseek.c index 5306331c..6c30a62a 100644 --- a/otherlibs/win32unix/lseek.c +++ b/otherlibs/win32unix/lseek.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> #include "unixsupport.h" #ifdef HAS_UNISTD diff --git a/otherlibs/win32unix/mkdir.c b/otherlibs/win32unix/mkdir.c index 998b32ba..21bca10c 100644 --- a/otherlibs/win32unix/mkdir.c +++ b/otherlibs/win32unix/mkdir.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_mkdir(path, perm) diff --git a/otherlibs/win32unix/nonblock.c b/otherlibs/win32unix/nonblock.c index a9aaeca5..4001beca 100755 --- a/otherlibs/win32unix/nonblock.c +++ b/otherlibs/win32unix/nonblock.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_set_nonblock(socket) diff --git a/otherlibs/win32unix/open.c b/otherlibs/win32unix/open.c index afb8d0fb..f9e9df21 100644 --- a/otherlibs/win32unix/open.c +++ b/otherlibs/win32unix/open.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> #include "unixsupport.h" #include <fcntl.h> diff --git a/otherlibs/win32unix/pipe.c b/otherlibs/win32unix/pipe.c index fe553778..88debb02 100644 --- a/otherlibs/win32unix/pipe.c +++ b/otherlibs/win32unix/pipe.c @@ -11,9 +11,9 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> -#include <alloc.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/alloc.h> #include "unixsupport.h" #include <fcntl.h> diff --git a/otherlibs/win32unix/read.c b/otherlibs/win32unix/read.c index e7a2b38d..d65683cc 100644 --- a/otherlibs/win32unix/read.c +++ b/otherlibs/win32unix/read.c @@ -12,9 +12,9 @@ /***********************************************************************/ #include <string.h> -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_read(value fd, value buf, value ofs, value vlen) diff --git a/otherlibs/win32unix/rename.c b/otherlibs/win32unix/rename.c index b8c0f3ed..ad46ead2 100644 --- a/otherlibs/win32unix/rename.c +++ b/otherlibs/win32unix/rename.c @@ -12,7 +12,7 @@ /***********************************************************************/ #include <stdio.h> -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" CAMLprim value unix_rename(value path1, value path2) diff --git a/otherlibs/win32unix/select.c b/otherlibs/win32unix/select.c index d4afe498..0e21db89 100644 --- a/otherlibs/win32unix/select.c +++ b/otherlibs/win32unix/select.c @@ -11,11 +11,11 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <memory.h> -#include <fail.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/memory.h> +#include <caml/fail.h> +#include <caml/signals.h> #include "winworker.h" #include <stdio.h> #include "windbug.h" diff --git a/otherlibs/win32unix/sendrecv.c b/otherlibs/win32unix/sendrecv.c index 32532553..5957f6ed 100644 --- a/otherlibs/win32unix/sendrecv.c +++ b/otherlibs/win32unix/sendrecv.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #include "socketaddr.h" diff --git a/otherlibs/win32unix/shutdown.c b/otherlibs/win32unix/shutdown.c index 2d5707a3..96023111 100644 --- a/otherlibs/win32unix/shutdown.c +++ b/otherlibs/win32unix/shutdown.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" static int shutdown_command_table[] = { diff --git a/otherlibs/win32unix/sleep.c b/otherlibs/win32unix/sleep.c index 28e60e40..6d630d20 100644 --- a/otherlibs/win32unix/sleep.c +++ b/otherlibs/win32unix/sleep.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_sleep(t) diff --git a/otherlibs/win32unix/socket.c b/otherlibs/win32unix/socket.c index ad8165b2..9385e82e 100644 --- a/otherlibs/win32unix/socket.c +++ b/otherlibs/win32unix/socket.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "unixsupport.h" #include <mswsock.h> // for SO_OPENTYPE and SO_SYNCHRONOUS_NONALERT diff --git a/otherlibs/win32unix/socketaddr.h b/otherlibs/win32unix/socketaddr.h index fde691ec..f3b6caf0 100644 --- a/otherlibs/win32unix/socketaddr.h +++ b/otherlibs/win32unix/socketaddr.h @@ -11,7 +11,10 @@ /* */ /***********************************************************************/ -#include "misc.h" +#ifndef CAML_SOCKETADDR_H +#define CAML_SOCKETADDR_H + +#include "caml/misc.h" union sock_addr_union { struct sockaddr s_gen; @@ -29,6 +32,10 @@ typedef socklen_t socklen_param_type; typedef int socklen_param_type; #endif +#ifdef __cplusplus +extern "C" { +#endif + extern void get_sockaddr (value mladdr, union sock_addr_union * addr /*out*/, socklen_param_type * addr_len /*out*/); @@ -41,3 +48,9 @@ CAMLprim value alloc_inet_addr (struct in_addr * inaddr); CAMLexport value alloc_inet6_addr (struct in6_addr * inaddr); #define GET_INET6_ADDR(v) (*((struct in6_addr *) (v))) #endif + +#ifdef __cplusplus +} +#endif + +#endif /* CAML_SOCKETADDR_H */ diff --git a/otherlibs/win32unix/sockopt.c b/otherlibs/win32unix/sockopt.c index eefa9a30..aebc517a 100644 --- a/otherlibs/win32unix/sockopt.c +++ b/otherlibs/win32unix/sockopt.c @@ -12,10 +12,10 @@ /***********************************************************************/ #include <errno.h> -#include <mlvalues.h> -#include <memory.h> -#include <alloc.h> -#include <fail.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/alloc.h> +#include <caml/fail.h> #include "unixsupport.h" #include "socketaddr.h" diff --git a/otherlibs/win32unix/startup.c b/otherlibs/win32unix/startup.c index 65aedc6a..be66c8a8 100644 --- a/otherlibs/win32unix/startup.c +++ b/otherlibs/win32unix/startup.c @@ -14,7 +14,7 @@ #include <stdio.h> #include <fcntl.h> #include <stdlib.h> -#include <mlvalues.h> +#include <caml/mlvalues.h> #include "winworker.h" #include "windbug.h" diff --git a/otherlibs/win32unix/stat.c b/otherlibs/win32unix/stat.c index 56b45d03..46fc9841 100644 --- a/otherlibs/win32unix/stat.c +++ b/otherlibs/win32unix/stat.c @@ -12,9 +12,9 @@ /***********************************************************************/ #include <errno.h> -#include <mlvalues.h> -#include <memory.h> -#include <alloc.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/alloc.h> #include "unixsupport.h" #include "cst2constr.h" #define _INTEGRAL_MAX_BITS 64 diff --git a/otherlibs/win32unix/system.c b/otherlibs/win32unix/system.c index 13d5658e..202dcd08 100644 --- a/otherlibs/win32unix/system.c +++ b/otherlibs/win32unix/system.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> -#include <alloc.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/alloc.h> +#include <caml/signals.h> #include "unixsupport.h" #include <process.h> #include <stdio.h> diff --git a/otherlibs/win32unix/times.c b/otherlibs/win32unix/times.c index e6b5ab0a..e97d3a5c 100644 --- a/otherlibs/win32unix/times.c +++ b/otherlibs/win32unix/times.c @@ -11,8 +11,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> #include "unixsupport.h" #include <windows.h> diff --git a/otherlibs/win32unix/unixsupport.c b/otherlibs/win32unix/unixsupport.c index f954dfc9..5c606e0d 100644 --- a/otherlibs/win32unix/unixsupport.c +++ b/otherlibs/win32unix/unixsupport.c @@ -12,12 +12,12 @@ /***********************************************************************/ #include <stddef.h> -#include <mlvalues.h> -#include <callback.h> -#include <alloc.h> -#include <memory.h> -#include <fail.h> -#include <custom.h> +#include <caml/mlvalues.h> +#include <caml/callback.h> +#include <caml/alloc.h> +#include <caml/memory.h> +#include <caml/fail.h> +#include <caml/custom.h> #include "unixsupport.h" #include "cst2constr.h" #include <errno.h> diff --git a/otherlibs/win32unix/unixsupport.h b/otherlibs/win32unix/unixsupport.h index b8f8acad..b8efb278 100644 --- a/otherlibs/win32unix/unixsupport.h +++ b/otherlibs/win32unix/unixsupport.h @@ -11,6 +11,9 @@ /* */ /***********************************************************************/ +#ifndef CAML_UNIXSUPPORT_H +#define CAML_UNIXSUPPORT_H + #define WIN32_LEAN_AND_MEAN #include <wtypes.h> #include <winbase.h> @@ -24,6 +27,10 @@ #include <wspiapi.h> #endif +#ifdef __cplusplus +extern "C" { +#endif + struct filedescr { union { HANDLE handle; @@ -62,3 +69,9 @@ extern value unix_freeze_buffer (value); #define FLAGS_FD_IS_BLOCKING (1<<0) #define UNIX_BUFFER_SIZE 65536 + +#ifdef __cplusplus +} +#endif + +#endif /* CAML_UNIXSUPPORT_H */ diff --git a/otherlibs/win32unix/windir.c b/otherlibs/win32unix/windir.c index 7a08e510..ef952aa9 100644 --- a/otherlibs/win32unix/windir.c +++ b/otherlibs/win32unix/windir.c @@ -11,11 +11,11 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <memory.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> #include <errno.h> -#include <alloc.h> -#include <fail.h> +#include <caml/alloc.h> +#include <caml/fail.h> #include "unixsupport.h" CAMLprim value win_findfirst(name) diff --git a/otherlibs/win32unix/winwait.c b/otherlibs/win32unix/winwait.c index 0436072f..510a16fe 100644 --- a/otherlibs/win32unix/winwait.c +++ b/otherlibs/win32unix/winwait.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" #include <windows.h> #include <sys/types.h> diff --git a/otherlibs/win32unix/winworker.c b/otherlibs/win32unix/winworker.c index f8ef33e1..bcd5947a 100644 --- a/otherlibs/win32unix/winworker.c +++ b/otherlibs/win32unix/winworker.c @@ -11,10 +11,10 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <alloc.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/alloc.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "winworker.h" #include "winlist.h" #include "windbug.h" diff --git a/otherlibs/win32unix/write.c b/otherlibs/win32unix/write.c index 65f82ccb..dc0ae91b 100644 --- a/otherlibs/win32unix/write.c +++ b/otherlibs/win32unix/write.c @@ -13,9 +13,9 @@ #include <errno.h> #include <string.h> -#include <mlvalues.h> -#include <memory.h> -#include <signals.h> +#include <caml/mlvalues.h> +#include <caml/memory.h> +#include <caml/signals.h> #include "unixsupport.h" CAMLprim value unix_write(value fd, value buf, value vofs, value vlen) diff --git a/parsing/ast_helper.ml b/parsing/ast_helper.ml index 47c7bd33..b84cda8c 100644 --- a/parsing/ast_helper.ml +++ b/parsing/ast_helper.ml @@ -14,6 +14,7 @@ open Asttypes open Parsetree +open Docstrings type lid = Longident.t loc type str = string loc @@ -169,6 +170,10 @@ module Sig = struct let class_type ?loc a = mk ?loc (Psig_class_type a) let extension ?loc ?(attrs = []) a = mk ?loc (Psig_extension (a, attrs)) let attribute ?loc a = mk ?loc (Psig_attribute a) + let text txt = + List.map + (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds)) + txt end module Str = struct @@ -189,6 +194,10 @@ module Str = struct let include_ ?loc a = mk ?loc (Pstr_include a) let extension ?loc ?(attrs = []) a = mk ?loc (Pstr_extension (a, attrs)) let attribute ?loc a = mk ?loc (Pstr_attribute a) + let text txt = + List.map + (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds)) + txt end module Cl = struct @@ -225,13 +234,13 @@ module Cty = struct end module Ctf = struct - let mk ?(loc = !default_loc) ?(attrs = []) d = + let mk ?(loc = !default_loc) ?(attrs = []) + ?(docs = empty_docs) d = { pctf_desc = d; pctf_loc = loc; - pctf_attributes = attrs; + pctf_attributes = add_docs_attrs docs attrs; } - let attr d a = {d with pctf_attributes = d.pctf_attributes @ [a]} let inherit_ ?loc ?attrs a = mk ?loc ?attrs (Pctf_inherit a) let val_ ?loc ?attrs a b c d = mk ?loc ?attrs (Pctf_val (a, b, c, d)) @@ -239,16 +248,23 @@ module Ctf = struct let constraint_ ?loc ?attrs a b = mk ?loc ?attrs (Pctf_constraint (a, b)) let extension ?loc ?attrs a = mk ?loc ?attrs (Pctf_extension a) let attribute ?loc a = mk ?loc (Pctf_attribute a) + let text txt = + List.map + (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds)) + txt + + let attr d a = {d with pctf_attributes = d.pctf_attributes @ [a]} + end module Cf = struct - let mk ?(loc = !default_loc) ?(attrs = []) d = + let mk ?(loc = !default_loc) ?(attrs = []) + ?(docs = empty_docs) d = { pcf_desc = d; pcf_loc = loc; - pcf_attributes = attrs; + pcf_attributes = add_docs_attrs docs attrs; } - let attr d a = {d with pcf_attributes = d.pcf_attributes @ [a]} let inherit_ ?loc ?attrs a b c = mk ?loc ?attrs (Pcf_inherit (a, b, c)) let val_ ?loc ?attrs a b c = mk ?loc ?attrs (Pcf_val (a, b, c)) @@ -257,96 +273,117 @@ module Cf = struct let initializer_ ?loc ?attrs a = mk ?loc ?attrs (Pcf_initializer a) let extension ?loc ?attrs a = mk ?loc ?attrs (Pcf_extension a) let attribute ?loc a = mk ?loc (Pcf_attribute a) + let text txt = + List.map + (fun ds -> attribute ~loc:(docstring_loc ds) (text_attr ds)) + txt let virtual_ ct = Cfk_virtual ct let concrete o e = Cfk_concrete (o, e) + + let attr d a = {d with pcf_attributes = d.pcf_attributes @ [a]} + end module Val = struct - let mk ?(loc = !default_loc) ?(attrs = []) ?(prim = []) name typ = + let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs) + ?(prim = []) name typ = { pval_name = name; pval_type = typ; - pval_attributes = attrs; + pval_attributes = add_docs_attrs docs attrs; pval_loc = loc; pval_prim = prim; } end module Md = struct - let mk ?(loc = !default_loc) ?(attrs = []) name typ = + let mk ?(loc = !default_loc) ?(attrs = []) + ?(docs = empty_docs) ?(text = []) name typ = { pmd_name = name; pmd_type = typ; - pmd_attributes = attrs; + pmd_attributes = + add_text_attrs text (add_docs_attrs docs attrs); pmd_loc = loc; } end module Mtd = struct - let mk ?(loc = !default_loc) ?(attrs = []) ?typ name = + let mk ?(loc = !default_loc) ?(attrs = []) + ?(docs = empty_docs) ?(text = []) ?typ name = { pmtd_name = name; pmtd_type = typ; - pmtd_attributes = attrs; + pmtd_attributes = + add_text_attrs text (add_docs_attrs docs attrs); pmtd_loc = loc; } end module Mb = struct - let mk ?(loc = !default_loc) ?(attrs = []) name expr = + let mk ?(loc = !default_loc) ?(attrs = []) + ?(docs = empty_docs) ?(text = []) name expr = { pmb_name = name; pmb_expr = expr; - pmb_attributes = attrs; + pmb_attributes = + add_text_attrs text (add_docs_attrs docs attrs); pmb_loc = loc; } end module Opn = struct - let mk ?(loc = !default_loc) ?(attrs = []) ?(override = Fresh) lid = + let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs) + ?(override = Fresh) lid = { popen_lid = lid; popen_override = override; popen_loc = loc; - popen_attributes = attrs; + popen_attributes = add_docs_attrs docs attrs; } end module Incl = struct - let mk ?(loc = !default_loc) ?(attrs = []) mexpr = + let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs) mexpr = { pincl_mod = mexpr; pincl_loc = loc; - pincl_attributes = attrs; + pincl_attributes = add_docs_attrs docs attrs; } + end module Vb = struct - let mk ?(loc = !default_loc) ?(attrs = []) pat expr = + let mk ?(loc = !default_loc) ?(attrs = []) ?(docs = empty_docs) + ?(text = []) pat expr = { pvb_pat = pat; pvb_expr = expr; - pvb_attributes = attrs; + pvb_attributes = + add_text_attrs text (add_docs_attrs docs attrs); pvb_loc = loc; } end module Ci = struct - let mk ?(loc = !default_loc) ?(attrs = []) ?(virt = Concrete) ?(params = []) - name expr = + let mk ?(loc = !default_loc) ?(attrs = []) + ?(docs = empty_docs) ?(text = []) + ?(virt = Concrete) ?(params = []) name expr = { pci_virt = virt; pci_params = params; pci_name = name; pci_expr = expr; - pci_attributes = attrs; + pci_attributes = + add_text_attrs text (add_docs_attrs docs attrs); pci_loc = loc; } end module Type = struct let mk ?(loc = !default_loc) ?(attrs = []) + ?(docs = empty_docs) ?(text = []) ?(params = []) ?(cstrs = []) ?(kind = Ptype_abstract) @@ -360,65 +397,73 @@ module Type = struct ptype_kind = kind; ptype_private = priv; ptype_manifest = manifest; - ptype_attributes = attrs; + ptype_attributes = + add_text_attrs text (add_docs_attrs docs attrs); ptype_loc = loc; } - let constructor ?(loc = !default_loc) ?(attrs = []) ?(args = []) ?res name = + let constructor ?(loc = !default_loc) ?(attrs = []) ?(info = empty_info) + ?(args = []) ?res name = { pcd_name = name; pcd_args = args; pcd_res = res; pcd_loc = loc; - pcd_attributes = attrs; + pcd_attributes = add_info_attrs info attrs; } - let field ?(loc = !default_loc) ?(attrs = []) ?(mut = Immutable) name typ = + let field ?(loc = !default_loc) ?(attrs = []) ?(info = empty_info) + ?(mut = Immutable) name typ = { pld_name = name; pld_mutable = mut; pld_type = typ; pld_loc = loc; - pld_attributes = attrs; + pld_attributes = add_info_attrs info attrs; } + end (** Type extensions *) module Te = struct - let mk ?(attrs = []) ?(params = []) ?(priv = Public) path constructors = + let mk ?(attrs = []) ?(docs = empty_docs) + ?(params = []) ?(priv = Public) path constructors = { ptyext_path = path; ptyext_params = params; ptyext_constructors = constructors; ptyext_private = priv; - ptyext_attributes = attrs; + ptyext_attributes = add_docs_attrs docs attrs; } - let constructor ?(loc = !default_loc) ?(attrs = []) name kind = + let constructor ?(loc = !default_loc) ?(attrs = []) + ?(docs = empty_docs) ?(info = empty_info) name kind = { pext_name = name; pext_kind = kind; pext_loc = loc; - pext_attributes = attrs; + pext_attributes = add_docs_attrs docs (add_info_attrs info attrs); } - let decl ?(loc = !default_loc) ?(attrs = []) ?(args = []) ?res name = + let decl ?(loc = !default_loc) ?(attrs = []) + ?(docs = empty_docs) ?(info = empty_info) ?(args = []) ?res name = { pext_name = name; pext_kind = Pext_decl(args, res); pext_loc = loc; - pext_attributes = attrs; + pext_attributes = add_docs_attrs docs (add_info_attrs info attrs); } - let rebind ?(loc = !default_loc) ?(attrs = []) name lid = + let rebind ?(loc = !default_loc) ?(attrs = []) + ?(docs = empty_docs) ?(info = empty_info) name lid = { pext_name = name; pext_kind = Pext_rebind lid; pext_loc = loc; - pext_attributes = attrs; + pext_attributes = add_docs_attrs docs (add_info_attrs info attrs); } -end +end module Csig = struct let mk self fields = @@ -435,3 +480,4 @@ module Cstr = struct pcstr_fields = fields; } end + diff --git a/parsing/ast_helper.mli b/parsing/ast_helper.mli index b9b04f82..4dc96169 100644 --- a/parsing/ast_helper.mli +++ b/parsing/ast_helper.mli @@ -14,6 +14,7 @@ open Parsetree open Asttypes +open Docstrings type lid = Longident.t loc type str = string loc @@ -24,6 +25,7 @@ type attrs = attribute list val default_loc: loc ref (** Default value for all optional location arguments. *) + val with_default_loc: loc -> (unit -> 'a) -> 'a (** Set the [default_loc] within the scope of the execution of the provided function. *) @@ -146,27 +148,38 @@ module Exp: (** Value declarations *) module Val: sig - val mk: ?loc:loc -> ?attrs:attrs -> ?prim:string list -> str -> core_type -> value_description + val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> + ?prim:string list -> str -> core_type -> value_description end (** Type declarations *) module Type: sig - val mk: ?loc:loc -> ?attrs:attrs -> ?params:(core_type * variance) list -> ?cstrs:(core_type * core_type * loc) list -> ?kind:type_kind -> ?priv:private_flag -> ?manifest:core_type -> str -> type_declaration - - val constructor: ?loc:loc -> ?attrs:attrs -> ?args:core_type list -> ?res:core_type -> str -> constructor_declaration - val field: ?loc:loc -> ?attrs:attrs -> ?mut:mutable_flag -> str -> core_type -> label_declaration + val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text -> + ?params:(core_type * variance) list -> ?cstrs:(core_type * core_type * loc) list -> + ?kind:type_kind -> ?priv:private_flag -> ?manifest:core_type -> str -> + type_declaration + + val constructor: ?loc:loc -> ?attrs:attrs -> ?info:info -> + ?args:core_type list -> ?res:core_type -> str -> constructor_declaration + val field: ?loc:loc -> ?attrs:attrs -> ?info:info -> + ?mut:mutable_flag -> str -> core_type -> label_declaration end (** Type extensions *) module Te: sig - val mk: ?attrs:attrs -> ?params:(core_type * variance) list -> ?priv:private_flag -> lid -> extension_constructor list -> type_extension + val mk: ?attrs:attrs -> ?docs:docs -> + ?params:(core_type * variance) list -> ?priv:private_flag -> + lid -> extension_constructor list -> type_extension - val constructor: ?loc:loc -> ?attrs:attrs -> str -> extension_constructor_kind -> extension_constructor + val constructor: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?info:info -> + str -> extension_constructor_kind -> extension_constructor - val decl: ?loc:loc -> ?attrs:attrs -> ?args:core_type list -> ?res:core_type -> str -> extension_constructor - val rebind: ?loc:loc -> ?attrs:attrs -> str -> lid -> extension_constructor + val decl: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?info:info -> + ?args:core_type list -> ?res:core_type -> str -> extension_constructor + val rebind: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?info:info -> + str -> lid -> extension_constructor end (** {2 Module language} *) @@ -221,6 +234,7 @@ module Sig: val class_type: ?loc:loc -> class_type_declaration list -> signature_item val extension: ?loc:loc -> ?attrs:attrs -> extension -> signature_item val attribute: ?loc:loc -> attribute -> signature_item + val text: text -> signature_item list end (** Structure items *) @@ -243,43 +257,49 @@ module Str: val include_: ?loc:loc -> include_declaration -> structure_item val extension: ?loc:loc -> ?attrs:attrs -> extension -> structure_item val attribute: ?loc:loc -> attribute -> structure_item + val text: text -> structure_item list end (** Module declarations *) module Md: sig - val mk: ?loc:loc -> ?attrs:attrs -> str -> module_type -> module_declaration + val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text -> + str -> module_type -> module_declaration end (** Module type declarations *) module Mtd: sig - val mk: ?loc:loc -> ?attrs:attrs -> ?typ:module_type -> str -> module_type_declaration + val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text -> + ?typ:module_type -> str -> module_type_declaration end (** Module bindings *) module Mb: sig - val mk: ?loc:loc -> ?attrs:attrs -> str -> module_expr -> module_binding + val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text -> + str -> module_expr -> module_binding end (* Opens *) module Opn: sig - val mk: ?loc: loc -> ?attrs:attrs -> ?override:override_flag -> lid -> open_description + val mk: ?loc: loc -> ?attrs:attrs -> ?docs:docs -> + ?override:override_flag -> lid -> open_description end (* Includes *) module Incl: sig - val mk: ?loc: loc -> ?attrs:attrs -> 'a -> 'a include_infos + val mk: ?loc: loc -> ?attrs:attrs -> ?docs:docs -> 'a -> 'a include_infos end (** Value bindings *) module Vb: sig - val mk: ?loc: loc -> ?attrs:attrs -> pattern -> expression -> value_binding + val mk: ?loc: loc -> ?attrs:attrs -> ?docs:docs -> ?text:text -> + pattern -> expression -> value_binding end @@ -300,7 +320,8 @@ module Cty: (** Class type fields *) module Ctf: sig - val mk: ?loc:loc -> ?attrs:attrs -> class_type_field_desc -> class_type_field + val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> + class_type_field_desc -> class_type_field val attr: class_type_field -> attribute -> class_type_field val inherit_: ?loc:loc -> ?attrs:attrs -> class_type -> class_type_field @@ -309,6 +330,7 @@ module Ctf: val constraint_: ?loc:loc -> ?attrs:attrs -> core_type -> core_type -> class_type_field val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_type_field val attribute: ?loc:loc -> attribute -> class_type_field + val text: text -> class_type_field list end (** Class expressions *) @@ -329,7 +351,7 @@ module Cl: (** Class fields *) module Cf: sig - val mk: ?loc:loc -> ?attrs:attrs -> class_field_desc -> class_field + val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> class_field_desc -> class_field val attr: class_field -> attribute -> class_field val inherit_: ?loc:loc -> ?attrs:attrs -> override_flag -> class_expr -> string option -> class_field @@ -339,15 +361,19 @@ module Cf: val initializer_: ?loc:loc -> ?attrs:attrs -> expression -> class_field val extension: ?loc:loc -> ?attrs:attrs -> extension -> class_field val attribute: ?loc:loc -> attribute -> class_field + val text: text -> class_field list val virtual_: core_type -> class_field_kind val concrete: override_flag -> expression -> class_field_kind + end (** Classes *) module Ci: sig - val mk: ?loc:loc -> ?attrs:attrs -> ?virt:virtual_flag -> ?params:(core_type * variance) list -> str -> 'a -> 'a class_infos + val mk: ?loc:loc -> ?attrs:attrs -> ?docs:docs -> ?text:text -> + ?virt:virtual_flag -> ?params:(core_type * variance) list -> + str -> 'a -> 'a class_infos end (** Class signatures *) diff --git a/parsing/ast_mapper.ml b/parsing/ast_mapper.ml index 669d0144..d57dabb9 100644 --- a/parsing/ast_mapper.ml +++ b/parsing/ast_mapper.ml @@ -174,6 +174,7 @@ module CT = struct let map sub {pcty_loc = loc; pcty_desc = desc; pcty_attributes = attrs} = let open Cty in let loc = sub.location sub loc in + let attrs = sub.attributes sub attrs in match desc with | Pcty_constr (lid, tys) -> constr ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tys) @@ -186,6 +187,7 @@ module CT = struct = let open Ctf in let loc = sub.location sub loc in + let attrs = sub.attributes sub attrs in match desc with | Pctf_inherit ct -> inherit_ ~loc ~attrs (sub.class_type sub ct) | Pctf_val (s, m, v, t) -> val_ ~loc ~attrs s m v (sub.typ sub t) @@ -410,6 +412,7 @@ module CE = struct let map sub {pcl_loc = loc; pcl_desc = desc; pcl_attributes = attrs} = let open Cl in let loc = sub.location sub loc in + let attrs = sub.attributes sub attrs in match desc with | Pcl_constr (lid, tys) -> constr ~loc ~attrs (map_loc sub lid) (List.map (sub.typ sub) tys) @@ -437,6 +440,7 @@ module CE = struct let map_field sub {pcf_desc = desc; pcf_loc = loc; pcf_attributes = attrs} = let open Cf in let loc = sub.location sub loc in + let attrs = sub.attributes sub attrs in match desc with | Pcf_inherit (o, ce, s) -> inherit_ ~loc ~attrs o (sub.class_expr sub ce) s | Pcf_val (s, m, k) -> val_ ~loc ~attrs (map_loc sub s) m (map_kind sub k) diff --git a/parsing/docstrings.ml b/parsing/docstrings.ml new file mode 100644 index 00000000..389f6cf7 --- /dev/null +++ b/parsing/docstrings.ml @@ -0,0 +1,344 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Leo White *) +(* *) +(* Copyright 1996 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +open Location + +(* Docstrings *) + +(* A docstring is "attached" if it has been inserted in the AST. This + is used for generating unexpected docstring warnings. *) +type ds_attached = + | Unattached (* Not yet attached anything.*) + | Info (* Attached to a field or constructor. *) + | Docs (* Attached to an item or as floating text. *) + +(* A docstring is "associated" with an item if there are no blank lines between + them. This is used for generating docstring ambiguity warnings. *) +type ds_associated = + | Zero (* Not associated with an item *) + | One (* Associated with one item *) + | Many (* Associated with multiple items (ambiguity) *) + +type docstring = + { ds_body: string; + ds_loc: Location.t; + mutable ds_attached: ds_attached; + mutable ds_associated: ds_associated; } + +(* List of docstrings *) + +let docstrings : docstring list ref = ref [] + +(* Warn for unused and ambiguous docstrings *) + +let warn_bad_docstrings () = + if Warnings.is_active (Warnings.Bad_docstring true) then begin + List.iter + (fun ds -> + match ds.ds_attached with + | Info -> () + | Unattached -> + prerr_warning ds.ds_loc (Warnings.Bad_docstring true) + | Docs -> + match ds.ds_associated with + | Zero | One -> () + | Many -> + prerr_warning ds.ds_loc (Warnings.Bad_docstring false)) + (List.rev !docstrings) +end + +(* Docstring constructors and descturctors *) + +let docstring body loc = + let ds = + { ds_body = body; + ds_loc = loc; + ds_attached = Unattached; + ds_associated = Zero; } + in + docstrings := ds :: !docstrings; + ds + +let docstring_body ds = ds.ds_body + +let docstring_loc ds = ds.ds_loc + +(* Docstrings attached to items *) + +type docs = + { docs_pre: docstring option; + docs_post: docstring option; } + +let empty_docs = { docs_pre = None; docs_post = None } + +let doc_loc = {txt = "ocaml.doc"; loc = Location.none} + +let docs_attr ds = + let open Asttypes in + let open Parsetree in + let exp = + { pexp_desc = Pexp_constant (Const_string(ds.ds_body, None)); + pexp_loc = ds.ds_loc; + pexp_attributes = []; } + in + let item = + { pstr_desc = Pstr_eval (exp, []); pstr_loc = exp.pexp_loc } + in + (doc_loc, PStr [item]) + +let add_docs_attrs docs attrs = + let attrs = + match docs.docs_pre with + | None -> attrs + | Some ds -> docs_attr ds :: attrs + in + let attrs = + match docs.docs_post with + | None -> attrs + | Some ds -> attrs @ [docs_attr ds] + in + attrs + +(* Docstrings attached to consturctors or fields *) + +type info = docstring option + +let empty_info = None + +let info_attr = docs_attr + +let add_info_attrs info attrs = + let attrs = + match info with + | None -> attrs + | Some ds -> attrs @ [info_attr ds] + in + attrs + +(* Docstrings not attached to a specifc item *) + +type text = docstring list + +let empty_text = [] + +let text_loc = {txt = "ocaml.text"; loc = Location.none} + +let text_attr ds = + let open Asttypes in + let open Parsetree in + let exp = + { pexp_desc = Pexp_constant (Const_string(ds.ds_body, None)); + pexp_loc = ds.ds_loc; + pexp_attributes = []; } + in + let item = + { pstr_desc = Pstr_eval (exp, []); pstr_loc = exp.pexp_loc } + in + (text_loc, PStr [item]) + +let add_text_attrs dsl attrs = + (List.map text_attr dsl) @ attrs + +(* Find the first non-info docstring in a list, attach it and return it *) +let get_docstring ~info dsl = + let rec loop = function + | [] -> None + | {ds_attached = Info; _} :: rest -> loop rest + | ds :: rest -> + ds.ds_attached <- if info then Info else Docs; + Some ds + in + loop dsl + +(* Find all the non-info docstrings in a list, attach them and return them *) +let get_docstrings dsl = + let rec loop acc = function + | [] -> List.rev acc + | {ds_attached = Info; _} :: rest -> loop acc rest + | ds :: rest -> + ds.ds_attached <- Docs; + loop (ds :: acc) rest + in + loop [] dsl + +(* "Associate" all the docstrings in a list *) +let associate_docstrings dsl = + List.iter + (fun ds -> + match ds.ds_associated with + | Zero -> ds.ds_associated <- One + | (One | Many) -> ds.ds_associated <- Many) + dsl + +(* Map from positions to pre docstrings *) + +let pre_table : (Lexing.position, docstring list) Hashtbl.t = + Hashtbl.create 50 + +let set_pre_docstrings pos dsl = + if dsl <> [] then Hashtbl.add pre_table pos dsl + +let get_pre_docs pos = + try + let dsl = Hashtbl.find pre_table pos in + associate_docstrings dsl; + get_docstring ~info:false dsl + with Not_found -> None + +let mark_pre_docs pos = + try + let dsl = Hashtbl.find pre_table pos in + associate_docstrings dsl + with Not_found -> () + +(* Map from positions to post docstrings *) + +let post_table : (Lexing.position, docstring list) Hashtbl.t = + Hashtbl.create 50 + +let set_post_docstrings pos dsl = + if dsl <> [] then Hashtbl.add post_table pos dsl + +let get_post_docs pos = + try + let dsl = Hashtbl.find post_table pos in + associate_docstrings dsl; + get_docstring ~info:false dsl + with Not_found -> None + +let mark_post_docs pos = + try + let dsl = Hashtbl.find post_table pos in + associate_docstrings dsl + with Not_found -> () + +let get_info pos = + try + let dsl = Hashtbl.find post_table pos in + get_docstring ~info:true dsl + with Not_found -> None + +(* Map from positions to floating docstrings *) + +let floating_table : (Lexing.position, docstring list) Hashtbl.t = + Hashtbl.create 50 + +let set_floating_docstrings pos dsl = + if dsl <> [] then Hashtbl.add floating_table pos dsl + +let get_text pos = + try + let dsl = Hashtbl.find floating_table pos in + get_docstrings dsl + with Not_found -> [] + +(* Maps from positions to extra docstrings *) + +let pre_extra_table : (Lexing.position, docstring list) Hashtbl.t = + Hashtbl.create 50 + +let set_pre_extra_docstrings pos dsl = + if dsl <> [] then Hashtbl.add pre_extra_table pos dsl + +let get_pre_extra_text pos = + try + let dsl = Hashtbl.find pre_extra_table pos in + get_docstrings dsl + with Not_found -> [] + +let post_extra_table : (Lexing.position, docstring list) Hashtbl.t = + Hashtbl.create 50 + +let set_post_extra_docstrings pos dsl = + if dsl <> [] then Hashtbl.add post_extra_table pos dsl + +let get_post_extra_text pos = + try + let dsl = Hashtbl.find post_extra_table pos in + get_docstrings dsl + with Not_found -> [] + +(* Docstrings from parser actions *) + +let symbol_docs () = + { docs_pre = get_pre_docs (Parsing.symbol_start_pos ()); + docs_post = get_post_docs (Parsing.symbol_end_pos ()); } + +let symbol_docs_lazy () = + let p1 = Parsing.symbol_start_pos () in + let p2 = Parsing.symbol_end_pos () in + lazy { docs_pre = get_pre_docs p1; + docs_post = get_post_docs p2; } + +let rhs_docs pos1 pos2 = + { docs_pre = get_pre_docs (Parsing.rhs_start_pos pos1); + docs_post = get_post_docs (Parsing.rhs_end_pos pos2); } + +let rhs_docs_lazy pos1 pos2 = + let p1 = Parsing.rhs_start_pos pos1 in + let p2 = Parsing.rhs_end_pos pos2 in + lazy { docs_pre = get_pre_docs p1; + docs_post = get_post_docs p2; } + +let mark_symbol_docs () = + mark_pre_docs (Parsing.symbol_start_pos ()); + mark_post_docs (Parsing.symbol_end_pos ()) + +let mark_rhs_docs pos1 pos2 = + mark_pre_docs (Parsing.rhs_start_pos pos1); + mark_post_docs (Parsing.rhs_end_pos pos2) + +let symbol_info () = + get_info (Parsing.symbol_end_pos ()) + +let rhs_info pos = + get_info (Parsing.rhs_end_pos pos) + +let symbol_text () = + get_text (Parsing.symbol_start_pos ()) + +let symbol_text_lazy () = + let pos = Parsing.symbol_start_pos () in + lazy (get_text pos) + +let rhs_text pos = + get_text (Parsing.rhs_start_pos pos) + +let rhs_text_lazy pos = + let pos = Parsing.rhs_start_pos pos in + lazy (get_text pos) + +let symbol_pre_extra_text () = + get_pre_extra_text (Parsing.symbol_start_pos ()) + +let symbol_post_extra_text () = + get_post_extra_text (Parsing.symbol_end_pos ()) + +let rhs_pre_extra_text pos = + get_pre_extra_text (Parsing.rhs_start_pos pos) + +let rhs_post_extra_text pos = + get_post_extra_text (Parsing.rhs_end_pos pos) + + +(* (Re)Initialise all comment state *) + +let init () = + docstrings := []; + Hashtbl.reset pre_table; + Hashtbl.reset post_table; + Hashtbl.reset floating_table; + Hashtbl.reset pre_extra_table; + Hashtbl.reset post_extra_table + + + diff --git a/parsing/docstrings.mli b/parsing/docstrings.mli new file mode 100644 index 00000000..e8737850 --- /dev/null +++ b/parsing/docstrings.mli @@ -0,0 +1,148 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Leo White *) +(* *) +(* Copyright 1996 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(** (Re)Initialise all docstring state *) +val init : unit -> unit + +(** Emit warnings for unattached and ambiguous docstrings *) +val warn_bad_docstrings : unit -> unit + +(** {3 Docstrings} *) + +(** Documentation comments *) +type docstring + +(** Create a docstring *) +val docstring : string -> Location.t -> docstring + +(** Get the text of a docstring *) +val docstring_body : docstring -> string + +(** Get the location of a docstring *) +val docstring_loc : docstring -> Location.t + +(** {3 Set functions} + + These functions are used by the lexer to associate docstrings to + the locations of tokens. *) + +(** Docstrings immediately preceding a token *) +val set_pre_docstrings : Lexing.position -> docstring list -> unit + +(** Docstrings immediately following a token *) +val set_post_docstrings : Lexing.position -> docstring list -> unit + +(** Docstrings not immediately adjacent to a token *) +val set_floating_docstrings : Lexing.position -> docstring list -> unit + +(** Docstrings immediately following the token which precedes this one *) +val set_pre_extra_docstrings : Lexing.position -> docstring list -> unit + +(** Docstrings immediately preceding the token which follows this one *) +val set_post_extra_docstrings : Lexing.position -> docstring list -> unit + +(** {3 Items} + + The {!docs} type represents documentation attached to an item. *) + +type docs = + { docs_pre: docstring option; + docs_post: docstring option; } + +val empty_docs : docs + +val docs_attr : docstring -> Parsetree.attribute + +(** Convert item documentation to attributes and add them to an + attribute list *) +val add_docs_attrs : docs -> Parsetree.attributes -> Parsetree.attributes + +(** Fetch the item documentation for the current symbol. This also + marks this documentation (for ambiguity warnings). *) +val symbol_docs : unit -> docs +val symbol_docs_lazy : unit -> docs Lazy.t + +(** Fetch the item documentation for the symbols between two + positions. This also marks this documentation (for ambiguity + warnings). *) +val rhs_docs : int -> int -> docs +val rhs_docs_lazy : int -> int -> docs Lazy.t + +(** Mark the item documentation for the current symbol (for ambiguity + warnings). *) +val mark_symbol_docs : unit -> unit + +(** Mark as associated the item documentation for the symbols between + two positions (for ambiguity warnings) *) +val mark_rhs_docs : int -> int -> unit + +(** {3 Fields and constructors} + + The {!info} type represents documentation attached to a field or + constructor. *) + +type info = docstring option + +val empty_info : info + +val info_attr : docstring -> Parsetree.attribute + +(** Convert field info to attributes and add them to an + attribute list *) +val add_info_attrs : info -> Parsetree.attributes -> Parsetree.attributes + +(** Fetch the field info for the current symbol. *) +val symbol_info : unit -> info + +(** Fetch the field info following the symbol at a given position. *) +val rhs_info : int -> info + +(** {3 Unattached comments} + + The {!text} type represents documentation which is not attached to + anything. *) + +type text = docstring list + +val empty_text : text + +val text_attr : docstring -> Parsetree.attribute + +(** Convert text to attributes and add them to an attribute list *) +val add_text_attrs : text -> Parsetree.attributes -> Parsetree.attributes + +(** Fetch the text preceding the current symbol. *) +val symbol_text : unit -> text +val symbol_text_lazy : unit -> text Lazy.t + +(** Fetch the text preceding the symbol at the given position. *) +val rhs_text : int -> text +val rhs_text_lazy : int -> text Lazy.t + +(** {3 Extra text} + + There may be additional text attached to the delimiters of a block + (e.g. [struct] and [end]). This is fetched by the following + functions, which are applied to the contents of the block rather + than the delimiters. *) + +(** Fetch additional text preceding the current symbol *) +val symbol_pre_extra_text : unit -> text + +(** Fetch additional text following the current symbol *) +val symbol_post_extra_text : unit -> text + +(** Fetch additional text preceding the symbol at the given position *) +val rhs_pre_extra_text : int -> text + +(** Fetch additional text following the symbol at the given position *) +val rhs_post_extra_text : int -> text diff --git a/parsing/lexer.mli b/parsing/lexer.mli index 9898e971..4878a36e 100644 --- a/parsing/lexer.mli +++ b/parsing/lexer.mli @@ -49,10 +49,7 @@ by the parser, as [preprocessor lexer lexbuf] where [lexer] is the lexing function. When a preprocessor is configured by calling [set_preprocessor], the lexer -changes its behavior: -- It accepts backslash-newline as a token-separating blank. -- It emits an EOL token for every newline except those preceeded by backslash - and those in strings or comments. +changes its behavior to accept backslash-newline as a token-separating blank. *) val set_preprocessor : diff --git a/parsing/lexer.mll b/parsing/lexer.mll index 237b4476..ad716781 100644 --- a/parsing/lexer.mll +++ b/parsing/lexer.mll @@ -63,6 +63,7 @@ let keyword_table = "module", MODULE; "mutable", MUTABLE; "new", NEW; + "nonrec", NONREC; "object", OBJECT; "of", OF; "open", OPEN; @@ -132,6 +133,16 @@ let is_in_string = ref false let in_string () = !is_in_string let print_warnings = ref true +let with_comment_buffer comment lexbuf = + let start_loc = Location.curr lexbuf in + comment_start_loc := [start_loc]; + reset_string_buffer (); + let end_loc = comment lexbuf in + let s = get_stored_string () in + reset_string_buffer (); + let loc = { start_loc with Location.loc_end = end_loc.Location.loc_end } in + s, loc + (* To translate escape sequences *) let char_for_backslash = function @@ -218,6 +229,8 @@ let update_loc lexbuf file line absolute chars = let preprocessor = ref None +let escaped_newlines = ref false + (* Warn about Latin-1 characters used in idents *) let warn_latin1 lexbuf = @@ -225,6 +238,17 @@ let warn_latin1 lexbuf = (Warnings.Deprecated "ISO-Latin1 characters in identifiers") ;; +let comment_list = ref [] + +let add_comment com = + comment_list := com :: !comment_list + +let add_docstring_comment ds = + let com = (Docstrings.docstring_body ds, Docstrings.docstring_loc ds) in + add_comment com + +let comments () = List.rev !comment_list + (* Error report *) open Format @@ -287,19 +311,14 @@ let float_literal = rule token = parse | "\\" newline { - match !preprocessor with - | None -> + if not !escaped_newlines then raise (Error(Illegal_character (Lexing.lexeme_char lexbuf 0), - Location.curr lexbuf)) - | Some _ -> - update_loc lexbuf None 1 false 0; - token lexbuf } + Location.curr lexbuf)); + update_loc lexbuf None 1 false 0; + token lexbuf } | newline { update_loc lexbuf None 1 false 0; - match !preprocessor with - | None -> token lexbuf - | Some _ -> EOL - } + EOL } | blank + { token lexbuf } | "_" @@ -386,26 +405,27 @@ rule token = parse raise (Error(Illegal_escape esc, Location.curr lexbuf)) } | "(*" - { let start_loc = Location.curr lexbuf in - comment_start_loc := [start_loc]; - reset_string_buffer (); - let end_loc = comment lexbuf in - let s = get_stored_string () in - reset_string_buffer (); - COMMENT (s, { start_loc with - Location.loc_end = end_loc.Location.loc_end }) - } + { let s, loc = with_comment_buffer comment lexbuf in + COMMENT (s, loc) } + | "(**" + { let s, loc = with_comment_buffer comment lexbuf in + DOCSTRING (Docstrings.docstring s loc) } + | "(**" ('*'+) as stars + { let s, loc = + with_comment_buffer + (fun lexbuf -> + store_string ("*" ^ stars); + comment lexbuf) + lexbuf + in + COMMENT (s, loc) } | "(*)" - { let loc = Location.curr lexbuf in - if !print_warnings then - Location.prerr_warning loc Warnings.Comment_start; - comment_start_loc := [loc]; - reset_string_buffer (); - let end_loc = comment lexbuf in - let s = get_stored_string () in - reset_string_buffer (); - COMMENT (s, { loc with Location.loc_end = end_loc.Location.loc_end }) - } + { if !print_warnings then + Location.prerr_warning (Location.curr lexbuf) Warnings.Comment_start; + let s, loc = with_comment_buffer comment lexbuf in + COMMENT (s, loc) } + | "(*" ('*'*) as stars "*)" + { COMMENT (stars, Location.curr lexbuf) } | "*)" { let loc = Location.curr lexbuf in Location.prerr_warning loc Warnings.Comment_not_end; @@ -483,6 +503,8 @@ rule token = parse | '%' { PERCENT } | ['*' '/' '%'] symbolchar * { INFIXOP3(Lexing.lexeme lexbuf) } + | '#' (symbolchar | '#') + + { SHARPOP(Lexing.lexeme lexbuf) } | eof { EOF } | _ { raise (Error(Illegal_character (Lexing.lexeme_char lexbuf 0), @@ -654,24 +676,98 @@ and skip_sharp_bang = parse | None -> token lexbuf | Some (_init, preprocess) -> preprocess token lexbuf - let last_comments = ref [] - let rec token lexbuf = - match token_with_comments lexbuf with - COMMENT (s, comment_loc) -> - last_comments := (s, comment_loc) :: !last_comments; - token lexbuf - | tok -> tok - let comments () = List.rev !last_comments + type newline_state = + | NoLine (* There have been no blank lines yet. *) + | NewLine + (* There have been no blank lines, and the previous + token was a newline. *) + | BlankLine (* There have been blank lines. *) + + type doc_state = + | Initial (* There have been no docstrings yet *) + | After of docstring list + (* There have been docstrings, none of which were + preceeded by a blank line *) + | Before of docstring list * docstring list * docstring list + (* There have been docstrings, some of which were + preceeded by a blank line *) + + and docstring = Docstrings.docstring + + let token lexbuf = + let post_pos = lexeme_end_p lexbuf in + let attach lines docs pre_pos = + let open Docstrings in + match docs, lines with + | Initial, _ -> () + | After a, (NoLine | NewLine) -> + set_post_docstrings post_pos (List.rev a); + set_pre_docstrings pre_pos a; + | After a, BlankLine -> + set_post_docstrings post_pos (List.rev a); + set_pre_extra_docstrings pre_pos (List.rev a) + | Before(a, f, b), (NoLine | NewLine) -> + set_post_docstrings post_pos (List.rev a); + set_post_extra_docstrings post_pos + (List.rev_append f (List.rev b)); + set_floating_docstrings pre_pos (List.rev f); + set_pre_extra_docstrings pre_pos (List.rev a); + set_pre_docstrings pre_pos b + | Before(a, f, b), BlankLine -> + set_post_docstrings post_pos (List.rev a); + set_post_extra_docstrings post_pos + (List.rev_append f (List.rev b)); + set_floating_docstrings pre_pos + (List.rev_append f (List.rev b)); + set_pre_extra_docstrings pre_pos (List.rev a) + in + let rec loop lines docs lexbuf = + match token_with_comments lexbuf with + | COMMENT (s, loc) -> + add_comment (s, loc); + let lines' = + match lines with + | NoLine -> NoLine + | NewLine -> NoLine + | BlankLine -> BlankLine + in + loop lines' docs lexbuf + | EOL -> + let lines' = + match lines with + | NoLine -> NewLine + | NewLine -> BlankLine + | BlankLine -> BlankLine + in + loop lines' docs lexbuf + | DOCSTRING doc -> + add_docstring_comment doc; + let docs' = + match docs, lines with + | Initial, (NoLine | NewLine) -> After [doc] + | Initial, BlankLine -> Before([], [], [doc]) + | After a, (NoLine | NewLine) -> After (doc :: a) + | After a, BlankLine -> Before (a, [], [doc]) + | Before(a, f, b), (NoLine | NewLine) -> Before(a, f, doc :: b) + | Before(a, f, b), BlankLine -> Before(a, b @ f, [doc]) + in + loop NoLine docs' lexbuf + | tok -> + attach lines docs (lexeme_start_p lexbuf); + tok + in + loop NoLine Initial lexbuf let init () = is_in_string := false; - last_comments := []; comment_start_loc := []; + comment_list := []; match !preprocessor with | None -> () | Some (init, _preprocess) -> init () let set_preprocessor init preprocess = + escaped_newlines := true; preprocessor := Some (init, preprocess) } diff --git a/parsing/location.ml b/parsing/location.ml index 174377ee..a4910bdc 100644 --- a/parsing/location.ml +++ b/parsing/location.ml @@ -72,6 +72,22 @@ let status = ref Terminfo.Uninitialised let num_loc_lines = ref 0 (* number of lines already printed after input *) +let print_updating_num_loc_lines ppf f arg = + let open Format in + let out_functions = pp_get_formatter_out_functions ppf () in + let out_string str start len = + let rec count i c = + if i = start + len then c + else if String.get str i = '\n' then count (succ i) (succ c) + else count (succ i) c in + num_loc_lines := !num_loc_lines + count start 0 ; + out_functions.out_string str start len in + pp_set_formatter_out_functions ppf + { out_functions with out_string } ; + f ppf arg ; + pp_print_flush ppf (); + pp_set_formatter_out_functions ppf out_functions + (* Highlight the locations using standout mode. *) let highlight_terminfo ppf num_lines lb locs = @@ -261,20 +277,21 @@ let print_error ppf loc = let print_error_cur_file ppf = print_error ppf (in_file !input_name);; -let print_warning loc ppf w = +let default_warning_printer loc ppf w = if Warnings.is_active w then begin - let printw ppf w = - let n = Warnings.print ppf w in - num_loc_lines := !num_loc_lines + n - in print ppf loc; - fprintf ppf "Warning %a@." printw w; - pp_print_flush ppf (); - incr num_loc_lines; + fprintf ppf "Warning %a@." Warnings.print w end ;; -let prerr_warning loc w = print_warning loc err_formatter w;; +let warning_printer = ref default_warning_printer ;; + +let print_warning loc ppf w = + print_updating_num_loc_lines ppf (!warning_printer loc) w +;; + +let formatter_for_warnings = ref err_formatter;; +let prerr_warning loc w = print_warning loc !formatter_for_warnings w;; let echo_eof () = print_newline (); @@ -317,7 +334,7 @@ let error_of_exn exn = in loop !error_of_exn -let rec report_error ppf ({loc; msg; sub; if_highlight} as err) = +let rec default_error_reporter ppf ({loc; msg; sub; if_highlight} as err) = let highlighted = if if_highlight <> "" then let rec collect_locs locs {loc; sub; if_highlight; _} = @@ -333,10 +350,16 @@ let rec report_error ppf ({loc; msg; sub; if_highlight} as err) = else begin print ppf loc; Format.pp_print_string ppf msg; - List.iter (fun err -> Format.fprintf ppf "@\n@[<2>%a@]" report_error err) + List.iter (fun err -> Format.fprintf ppf "@\n@[<2>%a@]" default_error_reporter err) sub end +let error_reporter = ref default_error_reporter + +let report_error ppf err = + print_updating_num_loc_lines ppf !error_reporter err +;; + let error_of_printer loc print x = let buf = Buffer.create 64 in let ppf = Format.formatter_of_buffer buf in diff --git a/parsing/location.mli b/parsing/location.mli index 1a7feeb4..77b754f7 100644 --- a/parsing/location.mli +++ b/parsing/location.mli @@ -29,11 +29,14 @@ type t = { val none : t (** An arbitrary value of type [t]; describes an empty ghost range. *) -val in_file : string -> t;; + +val in_file : string -> t (** Return an empty ghost range located in a given file. *) + val init : Lexing.lexbuf -> string -> unit (** Set the file name and line number of the [lexbuf] to be the start of the named file. *) + val curr : Lexing.lexbuf -> t (** Get the location of the current token from the [lexbuf]. *) @@ -52,10 +55,17 @@ val print_loc: formatter -> t -> unit val print_error: formatter -> t -> unit val print_error_cur_file: formatter -> unit val print_warning: t -> formatter -> Warnings.t -> unit +val formatter_for_warnings : formatter ref val prerr_warning: t -> Warnings.t -> unit val echo_eof: unit -> unit val reset: unit -> unit +val warning_printer : (t -> formatter -> Warnings.t -> unit) ref +(** Hook for intercepting warnings. *) + +val default_warning_printer : t -> formatter -> Warnings.t -> unit +(** Original warning printer for use in hooks. *) + val highlight_locations: formatter -> t list -> bool type 'a loc = { @@ -115,5 +125,11 @@ val register_error_of_exn: (exn -> error option) -> unit val report_error: formatter -> error -> unit +val error_reporter : (formatter -> error -> unit) ref +(** Hook for intercepting error reports. *) + +val default_error_reporter : formatter -> error -> unit +(** Original error reporter for use in hooks. *) + val report_exception: formatter -> exn -> unit (* Reraise the exception if it is unknown. *) diff --git a/parsing/parse.ml b/parsing/parse.ml index 2f4926ff..0941bf80 100644 --- a/parsing/parse.ml +++ b/parsing/parse.ml @@ -34,9 +34,11 @@ let maybe_skip_phrase lexbuf = let wrap parsing_fun lexbuf = try + Docstrings.init (); Lexer.init (); let ast = parsing_fun Lexer.token lexbuf in Parsing.clear_parser(); + Docstrings.warn_bad_docstrings (); ast with | Lexer.Error(Lexer.Illegal_character _, _) as err diff --git a/parsing/parser.mly b/parsing/parser.mly index ba8e98e6..863651c7 100644 --- a/parsing/parser.mly +++ b/parsing/parser.mly @@ -18,6 +18,7 @@ open Asttypes open Longident open Parsetree open Ast_helper +open Docstrings let mktyp d = Typ.mk ~loc:(symbol_rloc()) d let mkpat d = Pat.mk ~loc:(symbol_rloc()) d @@ -28,8 +29,10 @@ let mkmod d = Mod.mk ~loc:(symbol_rloc()) d let mkstr d = Str.mk ~loc:(symbol_rloc()) d let mkclass d = Cl.mk ~loc:(symbol_rloc()) d let mkcty d = Cty.mk ~loc:(symbol_rloc()) d -let mkctf d = Ctf.mk ~loc:(symbol_rloc()) d -let mkcf d = Cf.mk ~loc:(symbol_rloc()) d +let mkctf ?attrs ?docs d = + Ctf.mk ~loc:(symbol_rloc()) ?attrs ?docs d +let mkcf ?attrs ?docs d = + Cf.mk ~loc:(symbol_rloc()) ?attrs ?docs d let mkrhs rhs pos = mkloc rhs (rhs_loc pos) let mkoption d = @@ -283,11 +286,115 @@ let wrap_exp_attrs body (ext, attrs) = let mkexp_attrs d attrs = wrap_exp_attrs (mkexp d) attrs -let mkcf_attrs d attrs = - Cf.mk ~loc:(symbol_rloc()) ~attrs d - -let mkctf_attrs d attrs = - Ctf.mk ~loc:(symbol_rloc()) ~attrs d +let text_str pos = Str.text (rhs_text pos) +let text_sig pos = Sig.text (rhs_text pos) +let text_cstr pos = Cf.text (rhs_text pos) +let text_csig pos = Ctf.text (rhs_text pos) +let text_def pos = [Ptop_def (Str.text (rhs_text pos))] + +let extra_text text pos items = + let pre_extras = rhs_pre_extra_text pos in + let post_extras = rhs_post_extra_text pos in + text pre_extras @ items @ text post_extras + +let extra_str pos items = extra_text Str.text pos items +let extra_sig pos items = extra_text Sig.text pos items +let extra_cstr pos items = extra_text Cf.text pos items +let extra_csig pos items = extra_text Ctf.text pos items +let extra_def pos items = + extra_text (fun txt -> [Ptop_def (Str.text txt)]) pos items + +let add_nonrec rf attrs pos = + match rf with + | Recursive -> attrs + | Nonrecursive -> + let name = { txt = "nonrec"; loc = rhs_loc pos } in + (name, PStr []) :: attrs + +type let_binding = + { lb_pattern: pattern; + lb_expression: expression; + lb_attributes: attributes; + lb_docs: docs Lazy.t; + lb_text: text Lazy.t; + lb_loc: Location.t; } + +type let_bindings = + { lbs_bindings: let_binding list; + lbs_rec: rec_flag; + lbs_extension: string Asttypes.loc option; + lbs_attributes: attributes; + lbs_loc: Location.t } + +let mklb (p, e) attrs = + { lb_pattern = p; + lb_expression = e; + lb_attributes = attrs; + lb_docs = symbol_docs_lazy (); + lb_text = symbol_text_lazy (); + lb_loc = symbol_rloc (); } + +let mklbs (ext, attrs) rf lb = + { lbs_bindings = [lb]; + lbs_rec = rf; + lbs_extension = ext ; + lbs_attributes = attrs; + lbs_loc = symbol_rloc (); } + +let addlb lbs lb = + { lbs with lbs_bindings = lb :: lbs.lbs_bindings } + +let val_of_let_bindings lbs = + let str = + match lbs.lbs_bindings with + | [ {lb_pattern = { ppat_desc = Ppat_any; ppat_loc = _ }; _} as lb ] -> + let exp = wrap_exp_attrs lb.lb_expression + (None, lbs.lbs_attributes) in + mkstr (Pstr_eval (exp, lb.lb_attributes)) + | bindings -> + if lbs.lbs_attributes <> [] then + raise Syntaxerr.(Error(Not_expecting(lbs.lbs_loc, "attributes"))); + let bindings = + List.map + (fun lb -> + Vb.mk ~loc:lb.lb_loc ~attrs:lb.lb_attributes + ~docs:(Lazy.force lb.lb_docs) + ~text:(Lazy.force lb.lb_text) + lb.lb_pattern lb.lb_expression) + bindings + in + mkstr(Pstr_value(lbs.lbs_rec, List.rev bindings)) + in + match lbs.lbs_extension with + | None -> str + | Some id -> ghstr (Pstr_extension((id, PStr [str]), [])) + +let expr_of_let_bindings lbs body = + let bindings = + List.map + (fun lb -> + if lb.lb_attributes <> [] then + raise Syntaxerr.(Error(Not_expecting(lb.lb_loc, "item attribute"))); + Vb.mk ~loc:lb.lb_loc lb.lb_pattern lb.lb_expression) + lbs.lbs_bindings + in + mkexp_attrs (Pexp_let(lbs.lbs_rec, List.rev bindings, body)) + (lbs.lbs_extension, lbs.lbs_attributes) + +let class_of_let_bindings lbs body = + let bindings = + List.map + (fun lb -> + if lb.lb_attributes <> [] then + raise Syntaxerr.(Error(Not_expecting(lb.lb_loc, "item attribute"))); + Vb.mk ~loc:lb.lb_loc lb.lb_pattern lb.lb_expression) + lbs.lbs_bindings + in + if lbs.lbs_extension <> None then + raise Syntaxerr.(Error(Not_expecting(lbs.lbs_loc, "extension"))); + if lbs.lbs_attributes <> [] then + raise Syntaxerr.(Error(Not_expecting(lbs.lbs_loc, "attributes"))); + mkclass(Pcl_let (lbs.lbs_rec, List.rev bindings, body)) %} @@ -372,6 +479,7 @@ let mkctf_attrs d attrs = %token MUTABLE %token <nativeint> NATIVEINT %token NEW +%token NONREC %token OBJECT %token OF %token OPEN @@ -393,6 +501,7 @@ let mkctf_attrs d attrs = %token SEMI %token SEMISEMI %token SHARP +%token <string> SHARPOP %token SIG %token STAR %token <string * string option> STRING @@ -411,6 +520,7 @@ let mkctf_attrs d attrs = %token WHILE %token WITH %token <string * Location.t> COMMENT +%token <Docstrings.docstring> DOCSTRING %token EOL @@ -470,6 +580,7 @@ The precedences must be listed from low to high. %nonassoc prec_constr_appl /* above AS BAR COLONCOLON COMMA */ %nonassoc below_SHARP %nonassoc SHARP /* simple_expr/toplevel_directive */ +%left SHARPOP %nonassoc below_DOT %nonassoc DOT /* Finally, the first tokens of simple_expr are above everything else. */ @@ -500,38 +611,52 @@ The precedences must be listed from low to high. /* Entry points */ implementation: - structure EOF { $1 } + structure EOF { extra_str 1 $1 } ; interface: - signature EOF { $1 } + signature EOF { extra_sig 1 $1 } ; toplevel_phrase: - top_structure SEMISEMI { Ptop_def $1 } + top_structure SEMISEMI { Ptop_def (extra_str 1 $1) } | toplevel_directive SEMISEMI { $1 } | EOF { raise End_of_file } ; top_structure: - seq_expr post_item_attributes { [mkstrexp $1 $2] } - | top_structure_tail { $1 } + seq_expr post_item_attributes + { (text_str 1) @ [mkstrexp $1 $2] } + | top_structure_tail + { $1 } ; top_structure_tail: /* empty */ { [] } - | structure_item top_structure_tail { $1 :: $2 } + | structure_item top_structure_tail { (text_str 1) @ $1 :: $2 } ; use_file: + use_file_body { extra_def 1 $1 } +; +use_file_body: use_file_tail { $1 } | seq_expr post_item_attributes use_file_tail - { Ptop_def[mkstrexp $1 $2] :: $3 } + { (text_def 1) @ Ptop_def[mkstrexp $1 $2] :: $3 } ; use_file_tail: - EOF { [] } - | SEMISEMI EOF { [] } + EOF + { [] } + | SEMISEMI EOF + { text_def 1 } | SEMISEMI seq_expr post_item_attributes use_file_tail - { Ptop_def[mkstrexp $2 $3] :: $4 } - | SEMISEMI structure_item use_file_tail { Ptop_def[$2] :: $3 } - | SEMISEMI toplevel_directive use_file_tail { $2 :: $3 } - | structure_item use_file_tail { Ptop_def[$1] :: $2 } - | toplevel_directive use_file_tail { $1 :: $2 } + { mark_rhs_docs 2 3; + (text_def 1) @ (text_def 2) @ Ptop_def[mkstrexp $2 $3] :: $4 } + | SEMISEMI structure_item use_file_tail + { (text_def 1) @ (text_def 2) @ Ptop_def[$2] :: $3 } + | SEMISEMI toplevel_directive use_file_tail + { mark_rhs_docs 2 3; + (text_def 1) @ (text_def 2) @ $2 :: $3 } + | structure_item use_file_tail + { (text_def 1) @ Ptop_def[$1] :: $2 } + | toplevel_directive use_file_tail + { mark_rhs_docs 1 1; + (text_def 1) @ $1 :: $2 } ; parse_core_type: core_type EOF { $1 } @@ -568,7 +693,7 @@ module_expr: mod_longident { mkmod(Pmod_ident (mkrhs $1 1)) } | STRUCT structure END - { mkmod(Pmod_structure($2)) } + { mkmod(Pmod_structure(extra_str 2 $2)) } | STRUCT structure error { unclosed "struct" 1 "end" 3 } | FUNCTOR functor_args MINUSGREATER module_expr @@ -613,62 +738,50 @@ module_expr: ; structure: - seq_expr post_item_attributes structure_tail { mkstrexp $1 $2 :: $3 } + seq_expr post_item_attributes structure_tail + { mark_rhs_docs 1 2; + (text_str 1) @ mkstrexp $1 $2 :: $3 } | structure_tail { $1 } ; structure_tail: /* empty */ { [] } - | SEMISEMI structure { $2 } - | structure_item structure_tail { $1 :: $2 } + | SEMISEMI structure { (text_str 1) @ $2 } + | structure_item structure_tail { (text_str 1) @ $1 :: $2 } ; structure_item: - LET ext_attributes rec_flag let_bindings - { - match $4 with - [ {pvb_pat = { ppat_desc = Ppat_any; ppat_loc = _ }; - pvb_expr = exp; pvb_attributes = attrs}] -> - let exp = wrap_exp_attrs exp $2 in - mkstr(Pstr_eval (exp, attrs)) - | l -> - let str = mkstr(Pstr_value($3, List.rev l)) in - let (ext, attrs) = $2 in - if attrs <> [] then not_expecting 2 "attribute"; - match ext with - | None -> str - | Some id -> ghstr (Pstr_extension((id, PStr [str]), [])) - } - | EXTERNAL val_ident COLON core_type EQUAL primitive_declaration - post_item_attributes - { mkstr - (Pstr_primitive (Val.mk (mkrhs $2 2) $4 - ~prim:$6 ~attrs:$7 ~loc:(symbol_rloc ()))) } - | TYPE type_declarations - { mkstr(Pstr_type (List.rev $2) ) } - | TYPE str_type_extension - { mkstr(Pstr_typext $2) } - | EXCEPTION str_exception_declaration - { mkstr(Pstr_exception $2) } - | MODULE module_binding - { mkstr(Pstr_module $2) } - | MODULE REC module_bindings - { mkstr(Pstr_recmodule(List.rev $3)) } - | MODULE TYPE ident post_item_attributes - { mkstr(Pstr_modtype (Mtd.mk (mkrhs $3 3) - ~attrs:$4 ~loc:(symbol_rloc()))) } - | MODULE TYPE ident EQUAL module_type post_item_attributes - { mkstr(Pstr_modtype (Mtd.mk (mkrhs $3 3) - ~typ:$5 ~attrs:$6 ~loc:(symbol_rloc()))) } + let_bindings + { val_of_let_bindings $1 } + | primitive_declaration + { mkstr (Pstr_primitive $1) } + | type_declarations + { mkstr(Pstr_type (List.rev $1)) } + | str_type_extension + { mkstr(Pstr_typext $1) } + | str_exception_declaration + { mkstr(Pstr_exception $1) } + | module_binding + { mkstr(Pstr_module $1) } + | rec_module_bindings + { mkstr(Pstr_recmodule(List.rev $1)) } + | module_type_declaration + { mkstr(Pstr_modtype $1) } | open_statement { mkstr(Pstr_open $1) } - | CLASS class_declarations - { mkstr(Pstr_class (List.rev $2)) } - | CLASS TYPE class_type_declarations - { mkstr(Pstr_class_type (List.rev $3)) } - | INCLUDE module_expr post_item_attributes - { mkstr(Pstr_include (Incl.mk $2 ~attrs:$3 ~loc:(symbol_rloc()))) } + | class_declarations + { mkstr(Pstr_class (List.rev $1)) } + | class_type_declarations + { mkstr(Pstr_class_type (List.rev $1)) } + | str_include_statement + { mkstr(Pstr_include $1) } | item_extension post_item_attributes - { mkstr(Pstr_extension ($1, $2)) } + { mkstr(Pstr_extension ($1, (add_docs_attrs (symbol_docs ()) $2))) } | floating_attribute - { mkstr(Pstr_attribute $1) } + { mark_symbol_docs (); + mkstr(Pstr_attribute $1) } +; +str_include_statement: + INCLUDE module_expr post_item_attributes + { Incl.mk $2 ~attrs:$3 + ~loc:(symbol_rloc()) ~docs:(symbol_docs ()) } ; module_binding_body: EQUAL module_expr @@ -678,13 +791,24 @@ module_binding_body: | functor_arg module_binding_body { mkmod(Pmod_functor(fst $1, snd $1, $2)) } ; -module_bindings: - module_binding { [$1] } - | module_bindings AND module_binding { $3 :: $1 } -; module_binding: - UIDENT module_binding_body post_item_attributes - { Mb.mk (mkrhs $1 1) $2 ~attrs:$3 ~loc:(symbol_rloc ()) } + MODULE UIDENT module_binding_body post_item_attributes + { Mb.mk (mkrhs $2 2) $3 ~attrs:$4 + ~loc:(symbol_rloc ()) ~docs:(symbol_docs ()) } +; +rec_module_bindings: + rec_module_binding { [$1] } + | rec_module_bindings and_module_binding { $2 :: $1 } +; +rec_module_binding: + MODULE REC UIDENT module_binding_body post_item_attributes + { Mb.mk (mkrhs $3 3) $4 ~attrs:$5 + ~loc:(symbol_rloc ()) ~docs:(symbol_docs ()) } +; +and_module_binding: + AND UIDENT module_binding_body post_item_attributes + { Mb.mk (mkrhs $2 2) $3 ~attrs:$4 ~loc:(symbol_rloc ()) + ~text:(symbol_text ()) ~docs:(symbol_docs ()) } ; /* Module types */ @@ -693,7 +817,7 @@ module_type: mty_longident { mkmty(Pmty_ident (mkrhs $1 1)) } | SIG signature END - { mkmty(Pmty_signature $2) } + { mkmty(Pmty_signature (extra_sig 2 $2)) } | SIG signature error { unclosed "sig" 1 "end" 3 } | FUNCTOR functor_args MINUSGREATER module_type @@ -717,90 +841,112 @@ module_type: ; signature: /* empty */ { [] } - | SEMISEMI signature { $2 } - | signature_item signature { $1 :: $2 } + | SEMISEMI signature { (text_sig 1) @ $2 } + | signature_item signature { (text_sig 1) @ $1 :: $2 } ; signature_item: - VAL val_ident COLON core_type post_item_attributes - { mksig(Psig_value - (Val.mk (mkrhs $2 2) $4 ~attrs:$5 ~loc:(symbol_rloc()))) } - | EXTERNAL val_ident COLON core_type EQUAL primitive_declaration - post_item_attributes - { mksig(Psig_value - (Val.mk (mkrhs $2 2) $4 ~prim:$6 ~attrs:$7 - ~loc:(symbol_rloc()))) } - | TYPE type_declarations - { mksig(Psig_type (List.rev $2)) } - | TYPE sig_type_extension - { mksig(Psig_typext $2) } - | EXCEPTION sig_exception_declaration - { mksig(Psig_exception $2) } - | MODULE UIDENT module_declaration post_item_attributes - { mksig(Psig_module (Md.mk (mkrhs $2 2) - $3 ~attrs:$4 ~loc:(symbol_rloc()))) } - | MODULE UIDENT EQUAL mod_longident post_item_attributes - { mksig(Psig_module (Md.mk (mkrhs $2 2) - (Mty.alias ~loc:(rhs_loc 4) (mkrhs $4 4)) - ~attrs:$5 - ~loc:(symbol_rloc()) - )) } - | MODULE REC module_rec_declarations - { mksig(Psig_recmodule (List.rev $3)) } - | MODULE TYPE ident post_item_attributes - { mksig(Psig_modtype (Mtd.mk (mkrhs $3 3) - ~attrs:$4 ~loc:(symbol_rloc()))) } - | MODULE TYPE ident EQUAL module_type post_item_attributes - { mksig(Psig_modtype (Mtd.mk (mkrhs $3 3) ~typ:$5 - ~loc:(symbol_rloc()) - ~attrs:$6)) } + value_description + { mksig(Psig_value $1) } + | primitive_declaration + { mksig(Psig_value $1) } + | type_declarations + { mksig(Psig_type (List.rev $1)) } + | sig_type_extension + { mksig(Psig_typext $1) } + | sig_exception_declaration + { mksig(Psig_exception $1) } + | module_declaration + { mksig(Psig_module $1) } + | module_alias + { mksig(Psig_module $1) } + | rec_module_declarations + { mksig(Psig_recmodule (List.rev $1)) } + | module_type_declaration + { mksig(Psig_modtype $1) } | open_statement { mksig(Psig_open $1) } - | INCLUDE module_type post_item_attributes %prec below_WITH - { mksig(Psig_include (Incl.mk $2 ~attrs:$3 ~loc:(symbol_rloc()))) } - | CLASS class_descriptions - { mksig(Psig_class (List.rev $2)) } - | CLASS TYPE class_type_declarations - { mksig(Psig_class_type (List.rev $3)) } + | sig_include_statement + { mksig(Psig_include $1) } + | class_descriptions + { mksig(Psig_class (List.rev $1)) } + | class_type_declarations + { mksig(Psig_class_type (List.rev $1)) } | item_extension post_item_attributes - { mksig(Psig_extension ($1, $2)) } + { mksig(Psig_extension ($1, (add_docs_attrs (symbol_docs ()) $2))) } | floating_attribute - { mksig(Psig_attribute $1) } + { mark_symbol_docs (); + mksig(Psig_attribute $1) } ; open_statement: | OPEN override_flag mod_longident post_item_attributes - { Opn.mk (mkrhs $3 3) ~override:$2 ~attrs:$4 ~loc:(symbol_rloc()) } + { Opn.mk (mkrhs $3 3) ~override:$2 ~attrs:$4 + ~loc:(symbol_rloc()) ~docs:(symbol_docs ()) } ; -module_declaration: +sig_include_statement: + INCLUDE module_type post_item_attributes %prec below_WITH + { Incl.mk $2 ~attrs:$3 + ~loc:(symbol_rloc()) ~docs:(symbol_docs ()) } +; +module_declaration_body: COLON module_type { $2 } - | LPAREN UIDENT COLON module_type RPAREN module_declaration + | LPAREN UIDENT COLON module_type RPAREN module_declaration_body { mkmty(Pmty_functor(mkrhs $2 2, Some $4, $6)) } - | LPAREN RPAREN module_declaration + | LPAREN RPAREN module_declaration_body { mkmty(Pmty_functor(mkrhs "*" 1, None, $3)) } ; -module_rec_declarations: - module_rec_declaration { [$1] } - | module_rec_declarations AND module_rec_declaration { $3 :: $1 } -; -module_rec_declaration: - UIDENT COLON module_type post_item_attributes - { Md.mk (mkrhs $1 1) $3 ~attrs:$4 ~loc:(symbol_rloc()) } +module_declaration: + MODULE UIDENT module_declaration_body post_item_attributes + { Md.mk (mkrhs $2 2) $3 ~attrs:$4 + ~loc:(symbol_rloc()) ~docs:(symbol_docs ()) } +; +module_alias: + MODULE UIDENT EQUAL mod_longident post_item_attributes + { Md.mk (mkrhs $2 2) + (Mty.alias ~loc:(rhs_loc 4) (mkrhs $4 4)) ~attrs:$5 + ~loc:(symbol_rloc()) ~docs:(symbol_docs ()) } +; +rec_module_declarations: + rec_module_declaration { [$1] } + | rec_module_declarations and_module_declaration { $2 :: $1 } +; +rec_module_declaration: + MODULE REC UIDENT COLON module_type post_item_attributes + { Md.mk (mkrhs $3 3) $5 ~attrs:$6 + ~loc:(symbol_rloc()) ~docs:(symbol_docs ()) } +; +and_module_declaration: + AND UIDENT COLON module_type post_item_attributes + { Md.mk (mkrhs $2 2) $4 ~attrs:$5 ~loc:(symbol_rloc()) + ~text:(symbol_text()) ~docs:(symbol_docs()) } +; +module_type_declaration_body: + /* empty */ { None } + | EQUAL module_type { Some $2 } +; +module_type_declaration: + MODULE TYPE ident module_type_declaration_body post_item_attributes + { Mtd.mk (mkrhs $3 3) ?typ:$4 ~attrs:$5 + ~loc:(symbol_rloc()) ~docs:(symbol_docs ()) } ; - /* Class expressions */ class_declarations: - class_declarations AND class_declaration { $3 :: $1 } - | class_declaration { [$1] } + class_declaration { [$1] } + | class_declarations and_class_declaration { $2 :: $1 } ; class_declaration: - virtual_flag class_type_parameters LIDENT class_fun_binding + CLASS virtual_flag class_type_parameters LIDENT class_fun_binding post_item_attributes - { - Ci.mk (mkrhs $3 3) $4 - ~virt:$1 ~params:$2 - ~attrs:$5 ~loc:(symbol_rloc ()) - } + { Ci.mk (mkrhs $4 4) $5 ~virt:$2 ~params:$3 ~attrs:$6 + ~loc:(symbol_rloc ()) ~docs:(symbol_docs ()) } +; +and_class_declaration: + AND virtual_flag class_type_parameters LIDENT class_fun_binding + post_item_attributes + { Ci.mk (mkrhs $4 4) $5 ~virt:$2 ~params:$3 + ~attrs:$6 ~loc:(symbol_rloc ()) + ~text:(symbol_text ()) ~docs:(symbol_docs ()) } ; class_fun_binding: EQUAL class_expr @@ -827,8 +973,8 @@ class_expr: { $2 } | class_simple_expr simple_labeled_expr_list { mkclass(Pcl_apply($1, List.rev $2)) } - | LET rec_flag let_bindings_no_attrs IN class_expr - { mkclass(Pcl_let ($2, List.rev $3, $5)) } + | let_bindings IN class_expr + { class_of_let_bindings $1 $3 } | class_expr attribute { Cl.attr $1 $2 } | extension @@ -840,7 +986,7 @@ class_simple_expr: | class_longident { mkclass(Pcl_constr(mkrhs $1 1, [])) } | OBJECT class_structure END - { mkclass(Pcl_structure($2)) } + { mkclass(Pcl_structure $2) } | OBJECT class_structure error { unclosed "object" 1 "end" 3 } | LPAREN class_expr COLON class_type RPAREN @@ -853,8 +999,8 @@ class_simple_expr: { unclosed "(" 1 ")" 3 } ; class_structure: - class_self_pattern class_fields - { Cstr.mk $1 (List.rev $2) } + | class_self_pattern class_fields + { Cstr.mk $1 (extra_cstr 2 (List.rev $2)) } ; class_self_pattern: LPAREN pattern RPAREN @@ -868,23 +1014,24 @@ class_fields: /* empty */ { [] } | class_fields class_field - { $2 :: $1 } + { $2 :: (text_cstr 2) @ $1 } ; class_field: | INHERIT override_flag class_expr parent_binder post_item_attributes - { mkcf_attrs (Pcf_inherit ($2, $3, $4)) $5 } + { mkcf (Pcf_inherit ($2, $3, $4)) ~attrs:$5 ~docs:(symbol_docs ()) } | VAL value post_item_attributes - { mkcf_attrs (Pcf_val $2) $3 } + { mkcf (Pcf_val $2) ~attrs:$3 ~docs:(symbol_docs ()) } | METHOD method_ post_item_attributes - { mkcf_attrs (Pcf_method $2) $3 } + { mkcf (Pcf_method $2) ~attrs:$3 ~docs:(symbol_docs ()) } | CONSTRAINT constrain_field post_item_attributes - { mkcf_attrs (Pcf_constraint $2) $3 } + { mkcf (Pcf_constraint $2) ~attrs:$3 ~docs:(symbol_docs ()) } | INITIALIZER seq_expr post_item_attributes - { mkcf_attrs (Pcf_initializer $2) $3 } + { mkcf (Pcf_initializer $2) ~attrs:$3 ~docs:(symbol_docs ()) } | item_extension post_item_attributes - { mkcf_attrs (Pcf_extension $1) $2 } + { mkcf (Pcf_extension $1) ~attrs:$2 ~docs:(symbol_docs ()) } | floating_attribute - { mkcf (Pcf_attribute $1) } + { mark_symbol_docs (); + mkcf (Pcf_attribute $1) } ; parent_binder: AS LIDENT @@ -959,7 +1106,7 @@ class_signature: ; class_sig_body: class_self_type class_sig_fields - { Csig.mk $1 (List.rev $2) } + { Csig.mk $1 (extra_csig 2 (List.rev $2)) } ; class_self_type: LPAREN core_type RPAREN @@ -969,24 +1116,25 @@ class_self_type: ; class_sig_fields: /* empty */ { [] } -| class_sig_fields class_sig_field { $2 :: $1 } +| class_sig_fields class_sig_field { $2 :: (text_csig 2) @ $1 } ; class_sig_field: INHERIT class_signature post_item_attributes - { mkctf_attrs (Pctf_inherit $2) $3 } + { mkctf (Pctf_inherit $2) ~attrs:$3 ~docs:(symbol_docs ()) } | VAL value_type post_item_attributes - { mkctf_attrs (Pctf_val $2) $3 } + { mkctf (Pctf_val $2) ~attrs:$3 ~docs:(symbol_docs ()) } | METHOD private_virtual_flags label COLON poly_type post_item_attributes { let (p, v) = $2 in - mkctf_attrs (Pctf_method ($3, p, v, $5)) $6 + mkctf (Pctf_method ($3, p, v, $5)) ~attrs:$6 ~docs:(symbol_docs ()) } | CONSTRAINT constrain_field post_item_attributes - { mkctf_attrs (Pctf_constraint $2) $3 } + { mkctf (Pctf_constraint $2) ~attrs:$3 ~docs:(symbol_docs ()) } | item_extension post_item_attributes - { mkctf_attrs (Pctf_extension $1) $2 } + { mkctf (Pctf_extension $1) ~attrs:$2 ~docs:(symbol_docs ()) } | floating_attribute - { mkctf(Pctf_attribute $1) } + { mark_symbol_docs (); + mkctf(Pctf_attribute $1) } ; value_type: VIRTUAL mutable_flag label COLON core_type @@ -1003,30 +1151,38 @@ constrain_field: core_type EQUAL core_type { $1, $3 } ; class_descriptions: - class_descriptions AND class_description { $3 :: $1 } - | class_description { [$1] } + class_description { [$1] } + | class_descriptions and_class_description { $2 :: $1 } ; class_description: - virtual_flag class_type_parameters LIDENT COLON class_type + CLASS virtual_flag class_type_parameters LIDENT COLON class_type post_item_attributes - { - Ci.mk (mkrhs $3 3) $5 - ~virt:$1 ~params:$2 - ~attrs:$6 ~loc:(symbol_rloc ()) - } + { Ci.mk (mkrhs $4 4) $6 ~virt:$2 ~params:$3 ~attrs:$7 + ~loc:(symbol_rloc ()) ~docs:(symbol_docs ()) } +; +and_class_description: + AND virtual_flag class_type_parameters LIDENT COLON class_type + post_item_attributes + { Ci.mk (mkrhs $4 4) $6 ~virt:$2 ~params:$3 + ~attrs:$7 ~loc:(symbol_rloc ()) + ~text:(symbol_text ()) ~docs:(symbol_docs ()) } ; class_type_declarations: - class_type_declarations AND class_type_declaration { $3 :: $1 } - | class_type_declaration { [$1] } + class_type_declaration { [$1] } + | class_type_declarations and_class_type_declaration { $2 :: $1 } ; class_type_declaration: - virtual_flag class_type_parameters LIDENT EQUAL class_signature - post_item_attributes - { - Ci.mk (mkrhs $3 3) $5 - ~virt:$1 ~params:$2 - ~attrs:$6 ~loc:(symbol_rloc ()) - } + CLASS TYPE virtual_flag class_type_parameters LIDENT EQUAL + class_signature post_item_attributes + { Ci.mk (mkrhs $5 5) $7 ~virt:$3 ~params:$4 ~attrs:$8 + ~loc:(symbol_rloc ()) ~docs:(symbol_docs ()) } +; +and_class_type_declaration: + AND virtual_flag class_type_parameters LIDENT EQUAL + class_signature post_item_attributes + { Ci.mk (mkrhs $4 4) $6 ~virt:$2 ~params:$3 + ~attrs:$7 ~loc:(symbol_rloc ()) + ~text:(symbol_text ()) ~docs:(symbol_docs ()) } ; /* Core expressions */ @@ -1082,8 +1238,8 @@ expr: { $1 } | simple_expr simple_labeled_expr_list { mkexp(Pexp_apply($1, List.rev $2)) } - | LET ext_attributes rec_flag let_bindings_no_attrs IN seq_expr - { mkexp_attrs (Pexp_let($3, List.rev $4, $6)) $2 } + | let_bindings IN seq_expr + { expr_of_let_bindings $1 $3 } | LET MODULE ext_attributes UIDENT module_binding_body IN seq_expr { mkexp_attrs (Pexp_letmodule(mkrhs $4 4, $5, $7)) $3 } | LET OPEN override_flag ext_attributes mod_longident IN seq_expr @@ -1276,6 +1432,8 @@ simple_expr: { unclosed "{<" 3 ">}" 6 } | simple_expr SHARP label { mkexp(Pexp_send($1, $3)) } + | simple_expr SHARPOP simple_expr + { mkinfix $1 $2 $3 } | LPAREN MODULE module_expr RPAREN { mkexp (Pexp_pack $3) } | LPAREN MODULE module_expr COLON package_type RPAREN @@ -1317,32 +1475,11 @@ label_expr: label_ident: LIDENT { ($1, mkexp(Pexp_ident(mkrhs (Lident $1) 1))) } ; -let_bindings: - let_binding { [$1] } - | let_bindings AND let_binding { $3 :: $1 } -; -let_bindings_no_attrs: - let_bindings { - let l = $1 in - List.iter - (fun vb -> - if vb.pvb_attributes <> [] then - raise Syntaxerr.(Error(Not_expecting(vb.pvb_loc,"item attribute"))) - ) - l; - l - } - lident_list: LIDENT { [$1] } | LIDENT lident_list { $1 :: $2 } ; -let_binding: - let_binding_ post_item_attributes { - let (p, e) = $1 in Vb.mk ~loc:(symbol_rloc()) ~attrs:$2 p e - } -; -let_binding_: +let_binding_body: val_ident fun_binding { (mkpatvar $1 1, $2) } | val_ident COLON typevar_list DOT core_type EQUAL seq_expr @@ -1357,6 +1494,18 @@ let_binding_: | simple_pattern_not_ident COLON core_type EQUAL seq_expr { (ghpat(Ppat_constraint($1, $3)), $5) } ; +let_bindings: + let_binding { $1 } + | let_bindings and_let_binding { addlb $1 $2 } +; +let_binding: + LET ext_attributes rec_flag let_binding_body post_item_attributes + { mklbs $2 $3 (mklb $4 $5) } +; +and_let_binding: + AND let_binding_body post_item_attributes + { mklb $2 $3 } +; fun_binding: strict_binding { $1 } @@ -1539,27 +1688,49 @@ lbl_pattern: { (mkrhs $1 1, pat_of_label $1 1) } ; +/* Value descriptions */ + +value_description: + VAL val_ident COLON core_type post_item_attributes + { Val.mk (mkrhs $2 2) $4 ~attrs:$5 + ~loc:(symbol_rloc()) ~docs:(symbol_docs ()) } +; + /* Primitive declarations */ -primitive_declaration: +primitive_declaration_body: STRING { [fst $1] } - | STRING primitive_declaration { fst $1 :: $2 } + | STRING primitive_declaration_body { fst $1 :: $2 } +; +primitive_declaration: + EXTERNAL val_ident COLON core_type EQUAL primitive_declaration_body + post_item_attributes + { Val.mk (mkrhs $2 2) $4 ~prim:$6 ~attrs:$7 + ~loc:(symbol_rloc ()) ~docs:(symbol_docs ()) } ; /* Type declarations */ type_declarations: type_declaration { [$1] } - | type_declarations AND type_declaration { $3 :: $1 } + | type_declarations and_type_declaration { $2 :: $1 } ; type_declaration: - optional_type_parameters LIDENT type_kind constraints post_item_attributes - { let (kind, priv, manifest) = $3 in - Type.mk (mkrhs $2 2) - ~params:$1 ~cstrs:(List.rev $4) - ~kind ~priv ?manifest ~attrs:$5 ~loc:(symbol_rloc()) - } + TYPE nonrec_flag optional_type_parameters LIDENT type_kind constraints + post_item_attributes + { let (kind, priv, manifest) = $5 in + Type.mk (mkrhs $4 4) ~params:$3 ~cstrs:(List.rev $6) ~kind + ~priv ?manifest ~attrs:(add_nonrec $2 $7 2) + ~loc:(symbol_rloc ()) ~docs:(symbol_docs ()) } +; +and_type_declaration: + AND optional_type_parameters LIDENT type_kind constraints + post_item_attributes + { let (kind, priv, manifest) = $4 in + Type.mk (mkrhs $3 3) ~params:$2 ~cstrs:(List.rev $5) + ~kind ~priv ?manifest ~attrs:$6 ~loc:(symbol_rloc ()) + ~text:(symbol_text ()) ~docs:(symbol_docs ()) } ; constraints: constraints CONSTRAINT constrain { $3 :: $1 } @@ -1576,18 +1747,16 @@ type_kind: { (Ptype_variant(List.rev $2), Public, None) } | EQUAL PRIVATE constructor_declarations { (Ptype_variant(List.rev $3), Private, None) } - | EQUAL private_flag BAR constructor_declarations - { (Ptype_variant(List.rev $4), $2, None) } | EQUAL DOTDOT { (Ptype_open, Public, None) } - | EQUAL private_flag LBRACE label_declarations opt_semi RBRACE - { (Ptype_record(List.rev $4), $2, None) } - | EQUAL core_type EQUAL private_flag opt_bar constructor_declarations - { (Ptype_variant(List.rev $6), $4, Some $2) } + | EQUAL private_flag LBRACE label_declarations RBRACE + { (Ptype_record $4, $2, None) } + | EQUAL core_type EQUAL private_flag constructor_declarations + { (Ptype_variant(List.rev $5), $4, Some $2) } | EQUAL core_type EQUAL DOTDOT { (Ptype_open, Public, Some $2) } - | EQUAL core_type EQUAL private_flag LBRACE label_declarations opt_semi RBRACE - { (Ptype_record(List.rev $6), $4, Some $2) } + | EQUAL core_type EQUAL private_flag LBRACE label_declarations RBRACE + { (Ptype_record $6, $4, Some $2) } ; optional_type_parameters: /*empty*/ { [] } @@ -1628,41 +1797,46 @@ type_parameter_list: | type_parameter_list COMMA type_parameter { $3 :: $1 } ; constructor_declarations: - constructor_declaration { [$1] } - | constructor_declarations BAR constructor_declaration { $3 :: $1 } + constructor_declaration { [$1] } + | bar_constructor_declaration { [$1] } + | constructor_declarations bar_constructor_declaration { $2 :: $1 } ; constructor_declaration: - | constr_ident attributes generalized_constructor_arguments + | constr_ident generalized_constructor_arguments attributes { - let args,res = $3 in - Type.constructor (mkrhs $1 1) ~args ?res ~loc:(symbol_rloc()) ~attrs:$2 + let args,res = $2 in + Type.constructor (mkrhs $1 1) ~args ?res ~attrs:$3 + ~loc:(symbol_rloc()) ~info:(symbol_info ()) } ; -str_exception_declaration: - | extension_constructor_declaration post_item_attributes +bar_constructor_declaration: + | BAR constr_ident generalized_constructor_arguments attributes { - let ext = $1 in - {ext with pext_attributes = ext.pext_attributes @ $2} - } - | extension_constructor_rebind post_item_attributes - { - let ext = $1 in - {ext with pext_attributes = ext.pext_attributes @ $2} + let args,res = $3 in + Type.constructor (mkrhs $2 2) ~args ?res ~attrs:$4 + ~loc:(symbol_rloc()) ~info:(symbol_info ()) } ; +str_exception_declaration: + | sig_exception_declaration { $1 } + | EXCEPTION constr_ident EQUAL constr_longident attributes + post_item_attributes + { Te.rebind (mkrhs $2 2) (mkrhs $4 4) ~attrs:($5 @ $6) + ~loc:(symbol_rloc()) ~docs:(symbol_docs ()) } +; sig_exception_declaration: - | extension_constructor_declaration post_item_attributes - { - let ext = $1 in - {ext with pext_attributes = ext.pext_attributes @ $2} - } + | EXCEPTION constr_ident generalized_constructor_arguments attributes + post_item_attributes + { let args, res = $3 in + Te.decl (mkrhs $2 2) ~args ?res ~attrs:($4 @ $5) + ~loc:(symbol_rloc()) ~docs:(symbol_docs ()) } ; generalized_constructor_arguments: /*empty*/ { ([],None) } - | OF core_type_list { (List.rev $2,None) } - | COLON core_type_list MINUSGREATER simple_core_type + | OF core_type_list_no_attr { (List.rev $2,None) } + | COLON core_type_list_no_attr MINUSGREATER simple_core_type_no_attr { (List.rev $2,Some $4) } - | COLON simple_core_type + | COLON simple_core_type_no_attr { ([],Some $2) } ; @@ -1670,50 +1844,82 @@ generalized_constructor_arguments: label_declarations: label_declaration { [$1] } - | label_declarations SEMI label_declaration { $3 :: $1 } + | label_declaration_semi { [$1] } + | label_declaration_semi label_declarations { $1 :: $2 } ; label_declaration: - mutable_flag label attributes COLON poly_type + mutable_flag label COLON poly_type_no_attr attributes { - Type.field (mkrhs $2 2) $5 ~mut:$1 ~attrs:$3 ~loc:(symbol_rloc()) + Type.field (mkrhs $2 2) $4 ~mut:$1 ~attrs:$5 + ~loc:(symbol_rloc()) ~info:(symbol_info ()) + } +; +label_declaration_semi: + mutable_flag label COLON poly_type_no_attr attributes SEMI attributes + { + let info = + match rhs_info 5 with + | Some _ as info_before_semi -> info_before_semi + | None -> symbol_info () + in + Type.field (mkrhs $2 2) $4 ~mut:$1 ~attrs:($5 @ $7) + ~loc:(symbol_rloc()) ~info } ; /* Type Extensions */ str_type_extension: - optional_type_parameters type_longident - PLUSEQ private_flag opt_bar str_extension_constructors post_item_attributes - { Te.mk (mkrhs $2 2) (List.rev $6) - ~params:$1 ~priv:$4 ~attrs:$7 } + TYPE nonrec_flag optional_type_parameters type_longident + PLUSEQ private_flag str_extension_constructors post_item_attributes + { if $2 <> Recursive then not_expecting 2 "nonrec flag"; + Te.mk (mkrhs $4 4) (List.rev $7) ~params:$3 ~priv:$6 + ~attrs:$8 ~docs:(symbol_docs ()) } ; sig_type_extension: - optional_type_parameters type_longident - PLUSEQ private_flag opt_bar sig_extension_constructors post_item_attributes - { Te.mk (mkrhs $2 2) (List.rev $6) - ~params:$1 ~priv:$4 ~attrs:$7 } + TYPE nonrec_flag optional_type_parameters type_longident + PLUSEQ private_flag sig_extension_constructors post_item_attributes + { if $2 <> Recursive then not_expecting 2 "nonrec flag"; + Te.mk (mkrhs $4 4) (List.rev $7) ~params:$3 ~priv:$6 + ~attrs:$8 ~docs:(symbol_docs ()) } ; str_extension_constructors: extension_constructor_declaration { [$1] } + | bar_extension_constructor_declaration { [$1] } | extension_constructor_rebind { [$1] } - | str_extension_constructors BAR extension_constructor_declaration - { $3 :: $1 } - | str_extension_constructors BAR extension_constructor_rebind - { $3 :: $1 } + | bar_extension_constructor_rebind { [$1] } + | str_extension_constructors bar_extension_constructor_declaration + { $2 :: $1 } + | str_extension_constructors bar_extension_constructor_rebind + { $2 :: $1 } ; sig_extension_constructors: extension_constructor_declaration { [$1] } - | sig_extension_constructors BAR extension_constructor_declaration - { $3 :: $1 } + | bar_extension_constructor_declaration { [$1] } + | sig_extension_constructors bar_extension_constructor_declaration + { $2 :: $1 } ; extension_constructor_declaration: - | constr_ident attributes generalized_constructor_arguments + | constr_ident generalized_constructor_arguments attributes + { let args, res = $2 in + Te.decl (mkrhs $1 1) ~args ?res ~attrs:$3 + ~loc:(symbol_rloc()) ~info:(symbol_info ()) } +; +bar_extension_constructor_declaration: + | BAR constr_ident generalized_constructor_arguments attributes { let args, res = $3 in - Te.decl (mkrhs $1 1) ~args ?res ~loc:(symbol_rloc()) ~attrs:$2 } + Te.decl (mkrhs $2 2) ~args ?res ~attrs:$4 + ~loc:(symbol_rloc()) ~info:(symbol_info ()) } ; extension_constructor_rebind: - | constr_ident attributes EQUAL constr_longident - { Te.rebind (mkrhs $1 1) (mkrhs $4 4) ~loc:(symbol_rloc()) ~attrs:$2 } + | constr_ident EQUAL constr_longident attributes + { Te.rebind (mkrhs $1 1) (mkrhs $3 3) ~attrs:$4 + ~loc:(symbol_rloc()) ~info:(symbol_info ()) } +; +bar_extension_constructor_rebind: + | BAR constr_ident EQUAL constr_longident attributes + { Te.rebind (mkrhs $2 2) (mkrhs $4 4) ~attrs:$5 + ~loc:(symbol_rloc()) ~info:(symbol_info ()) } ; /* "with" constraints (additional type equations over signature components) */ @@ -1723,7 +1929,7 @@ with_constraints: | with_constraints AND with_constraint { $3 :: $1 } ; with_constraint: - TYPE type_parameters label_longident with_type_binder core_type constraints + TYPE type_parameters label_longident with_type_binder core_type_no_attr constraints { Pwith_type (mkrhs $3 3, (Type.mk (mkrhs (Longident.last $3) 3) @@ -1734,7 +1940,7 @@ with_constraint: ~loc:(symbol_rloc()))) } /* used label_longident instead of type_longident to disallow functor applications in type path */ - | TYPE type_parameters label COLONEQUAL core_type + | TYPE type_parameters label COLONEQUAL core_type_no_attr { Pwith_typesubst (Type.mk (mkrhs $3 3) ~params:$2 @@ -1762,10 +1968,22 @@ poly_type: | typevar_list DOT core_type { mktyp(Ptyp_poly(List.rev $1, $3)) } ; +poly_type_no_attr: + core_type_no_attr + { $1 } + | typevar_list DOT core_type_no_attr + { mktyp(Ptyp_poly(List.rev $1, $3)) } +; /* Core types */ core_type: + core_type_no_attr + { $1 } + | core_type attribute + { Typ.attr $1 $2 } +; +core_type_no_attr: core_type2 { $1 } | core_type2 AS QUOTE ident @@ -1789,8 +2007,6 @@ simple_core_type: { $1 } | LPAREN core_type_comma_list RPAREN %prec below_SHARP { match $2 with [sty] -> sty | _ -> raise Parse_error } - | simple_core_type attribute - { Typ.attr $1 $2 } ; simple_core_type_no_attr: @@ -1864,8 +2080,8 @@ row_field: | simple_core_type { Rinherit $1 } ; tag_field: - name_tag attributes OF opt_ampersand amper_type_list - { Rtag ($1, $2, $4, List.rev $5) } + name_tag OF opt_ampersand amper_type_list attributes + { Rtag ($1, $5, $3, List.rev $4) } | name_tag attributes { Rtag ($1, $2, true, []) } ; @@ -1874,8 +2090,8 @@ opt_ampersand: | /* empty */ { false } ; amper_type_list: - core_type { [$1] } - | amper_type_list AMPERSAND core_type { $3 :: $1 } + core_type_no_attr { [$1] } + | amper_type_list AMPERSAND core_type_no_attr { $3 :: $1 } ; name_tag_list: name_tag { [$1] } @@ -1910,7 +2126,7 @@ meth_list: | DOTDOT { [], Open } ; field: - label attributes COLON poly_type { ($1, $2, $4) } + label COLON poly_type_no_attr attributes { ($1, $4, $3) } ; label: LIDENT { $1 } @@ -1961,6 +2177,7 @@ operator: | INFIXOP2 { $1 } | INFIXOP3 { $1 } | INFIXOP4 { $1 } + | SHARPOP { $1 } | BANG { "!" } | PLUS { "+" } | PLUSDOT { "+." } @@ -2050,6 +2267,10 @@ rec_flag: /* empty */ { Nonrecursive } | REC { Recursive } ; +nonrec_flag: + /* empty */ { Recursive } + | NONREC { Nonrecursive } +; direction_flag: TO { Upto } | DOWNTO { Downto } diff --git a/parsing/parsetree.mli b/parsing/parsetree.mli index a66317f4..295e3eaa 100644 --- a/parsing/parsetree.mli +++ b/parsing/parsetree.mli @@ -36,7 +36,7 @@ and attributes = attribute list and payload = | PStr of structure | PTyp of core_type (* : T *) - | PPat of pattern * expression option (* : P or : P when E *) + | PPat of pattern * expression option (* ? P or ? P when E *) (** {2 Core language} *) diff --git a/parsing/pprintast.ml b/parsing/pprintast.ml index 7dea70c5..5e9b9455 100644 --- a/parsing/pprintast.ml +++ b/parsing/pprintast.ml @@ -197,9 +197,14 @@ class printer ()= object(self:'self) | Virtual -> pp f "virtual@;" (* trailing space added *) - method rec_flag f = function + method rec_flag f rf = + match rf with | Nonrecursive -> () | Recursive -> pp f "rec " + method nonrec_flag f rf = + match rf with + | Nonrecursive -> pp f "nonrec " + | Recursive -> () method direction_flag f = function | Upto -> pp f "to@ " | Downto -> pp f "downto@ " @@ -268,12 +273,12 @@ class printer ()= object(self:'self) | Ptyp_variant (l, closed, low) -> let type_variant_helper f x = match x with - | Rtag (l, attrs, _, ctl) -> pp f "@[<2>%a%a%a@]" self#string_quot l - self#attributes attrs + | Rtag (l, attrs, _, ctl) -> pp f "@[<2>%a%a@;%a@]" self#string_quot l (fun f l -> match l with |[] -> () | _ -> pp f "@;of@;%a" (self#list self#core_type ~sep:"&") ctl) ctl + self#attributes attrs | Rinherit ct -> self#core_type f ct in pp f "@[<2>[%a%a]@]" (fun f l @@ -363,7 +368,8 @@ class printer ()= object(self:'self) | None -> pp f "%a@;"self#longident_loc li ) | _ -> self#simple_pattern f x method simple_pattern (f:Format.formatter) (x:pattern) :unit = - match x.ppat_desc with + if x.ppat_attributes <> [] then self#pattern f x + else match x.ppat_desc with | Ppat_construct (({txt=Lident ("()"|"[]" as x);_}), _) -> pp f "%s" x | Ppat_any -> pp f "_"; | Ppat_var ({txt = txt;_}) -> protect_ident f txt @@ -397,6 +403,7 @@ class printer ()= object(self:'self) pp f "@[<2>(lazy@;%a)@]" self#pattern1 p | Ppat_exception p -> pp f "@[<2>exception@;%a@]" self#pattern1 p + | Ppat_extension e -> self#extension f e | _ -> self#paren true self#pattern f x method label_exp f (l,opt,p) = @@ -608,7 +615,7 @@ class printer ()= object(self:'self) pp f "@[<hov2>assert@ %a@]" self#simple_expr e | Pexp_lazy (e) -> pp f "@[<hov2>lazy@ %a@]" self#simple_expr e - (* Pexp_poly: impossible but we should print it anyway, rather than assert false *) + (* Pexp_poly: impossible but we should print it anyway, rather than assert false *) | Pexp_poly (e, None) -> pp f "@[<hov2>!poly!@ %a@]" self#simple_expr e | Pexp_poly (e, Some ct) -> @@ -1222,13 +1229,24 @@ class printer ()= object(self:'self) [] -> () | l -> pp f "%a " (self#list self#type_param ~first:"(" ~last:")" ~sep:",") l method type_def_list f l = - let type_decl kwd f x = + let rf = + let is_nonrec = + List.exists + (fun td -> + List.exists (fun (n, _) -> n.txt = "nonrec") + td.ptype_attributes) + l + in + if is_nonrec then Nonrecursive else Recursive + in + let type_decl kwd rf f x = let eq = if (x.ptype_kind = Ptype_abstract) && (x.ptype_manifest = None) then "" else " =" in - pp f "@[<2>%s %a%s%s%a@]%a" kwd + pp f "@[<2>%s %a%a%s%s%a@]%a" kwd + self#nonrec_flag rf self#type_params x.ptype_params x.ptype_name.txt eq self#type_declaration x @@ -1236,10 +1254,10 @@ class printer ()= object(self:'self) in match l with | [] -> assert false - | [x] -> type_decl "type" f x + | [x] -> type_decl "type" rf f x | x :: xs -> pp f "@[<v>%a@,%a@]" - (type_decl "type") x - (self#list ~sep:"@," (type_decl "and")) xs + (type_decl "type" rf) x + (self#list ~sep:"@," (type_decl "and" Recursive)) xs method type_declaration f x = let priv f = match x.ptype_private with @@ -1252,25 +1270,30 @@ class printer ()= object(self:'self) | Some y -> pp f "@;%a" self#core_type y in let constructor_declaration f pcd = - match pcd.pcd_res with - | None -> + match pcd.pcd_args, pcd.pcd_res with + | _, None -> pp f "|@;%s%a%a" pcd.pcd_name.txt - self#attributes pcd.pcd_attributes (fun f -> function | [] -> () | l -> pp f "@;of@;%a" (self#list self#core_type1 ~sep:"*@;") l) pcd.pcd_args - | Some x -> - pp f "|@;%s%a:@;%a" pcd.pcd_name.txt self#attributes pcd.pcd_attributes - (self#list self#core_type1 ~sep:"@;->@;") (pcd.pcd_args@[x]) + | [], Some x -> + pp f "|@;%s:@;%a%a" pcd.pcd_name.txt + self#core_type1 x + self#attributes pcd.pcd_attributes + | args, Some x -> + pp f "|@;%s:@;%a@;->@;%a%a" pcd.pcd_name.txt + (self#list self#core_type1 ~sep:"*@;") args + self#core_type1 x + self#attributes pcd.pcd_attributes in let label_declaration f pld = - pp f "@[<2>%a%s%a:@;%a;@]" + pp f "@[<2>%a%s:@;%a%a;@]" self#mutable_flag pld.pld_mutable pld.pld_name.txt - self#attributes pld.pld_attributes self#core_type pld.pld_type + self#attributes pld.pld_attributes in let repr f = let intro f = @@ -1290,7 +1313,7 @@ class printer ()= object(self:'self) let constraints f = self#list ~first:"@ " (fun f (ct1,ct2,_) -> - pp f "@[<hov2>constraint@ %a@ =@ %a@]" + pp f "@[<hov2> constraint@ %a@ =@ %a@]" self#core_type ct1 self#core_type ct2) f x.ptype_cstrs in diff --git a/parsing/pprintast.mli b/parsing/pprintast.mli index 13e3d09a..45556b84 100644 --- a/parsing/pprintast.mli +++ b/parsing/pprintast.mli @@ -80,6 +80,7 @@ class printer : method payload : Format.formatter -> Parsetree.payload -> unit method private_flag : Format.formatter -> Asttypes.private_flag -> unit method rec_flag : Format.formatter -> Asttypes.rec_flag -> unit + method nonrec_flag : Format.formatter -> Asttypes.rec_flag -> unit method reset : 'b method reset_semi : 'b diff --git a/parsing/printast.ml b/parsing/printast.ml index f0472bcd..cb94856a 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -640,7 +640,7 @@ and signature_item i ppf x = | Psig_value vd -> line i ppf "Psig_value\n"; value_description i ppf vd; - | Psig_type (l) -> + | Psig_type l -> line i ppf "Psig_type\n"; list i type_declaration ppf l; | Psig_typext te -> @@ -875,7 +875,7 @@ and directive_argument i ppf x = match x with | Pdir_none -> line i ppf "Pdir_none\n" | Pdir_string (s) -> line i ppf "Pdir_string \"%s\"\n" s; - | Pdir_int (i) -> line i ppf "Pdir_int %d\n" i; + | Pdir_int (n) -> line i ppf "Pdir_int %d\n" n; | Pdir_ident (li) -> line i ppf "Pdir_ident %a\n" fmt_longident li; | Pdir_bool (b) -> line i ppf "Pdir_bool %s\n" (string_of_bool b); ;; diff --git a/stdlib/.depend b/stdlib/.depend index 96f95082..11f21a8f 100644 --- a/stdlib/.depend +++ b/stdlib/.depend @@ -1,12 +1,12 @@ arg.cmi : -array.cmi : arrayLabels.cmi : +array.cmi : buffer.cmi : -bytes.cmi : bytesLabels.cmi : +bytes.cmi : callback.cmi : -camlinternalFormat.cmi : camlinternalFormatBasics.cmi buffer.cmi camlinternalFormatBasics.cmi : +camlinternalFormat.cmi : camlinternalFormatBasics.cmi buffer.cmi camlinternalLazy.cmi : camlinternalMod.cmi : obj.cmi camlinternalOO.cmi : obj.cmi @@ -22,8 +22,8 @@ int32.cmi : int64.cmi : lazy.cmi : lexing.cmi : -list.cmi : listLabels.cmi : +list.cmi : map.cmi : marshal.cmi : moreLabels.cmi : set.cmi map.cmi hashtbl.cmi @@ -43,32 +43,32 @@ stack.cmi : stdLabels.cmi : stringLabels.cmi listLabels.cmi bytesLabels.cmi \ arrayLabels.cmi stream.cmi : -string.cmi : stringLabels.cmi : +string.cmi : sys.cmi : weak.cmi : hashtbl.cmi arg.cmo : sys.cmi string.cmi printf.cmi list.cmi buffer.cmi array.cmi \ arg.cmi arg.cmx : sys.cmx string.cmx printf.cmx list.cmx buffer.cmx array.cmx \ arg.cmi -array.cmo : array.cmi -array.cmx : array.cmi arrayLabels.cmo : array.cmi arrayLabels.cmi arrayLabels.cmx : array.cmx arrayLabels.cmi +array.cmo : array.cmi +array.cmx : array.cmi buffer.cmo : sys.cmi string.cmi bytes.cmi buffer.cmi buffer.cmx : sys.cmx string.cmx bytes.cmx buffer.cmi -bytes.cmo : pervasives.cmi list.cmi char.cmi bytes.cmi -bytes.cmx : pervasives.cmx list.cmx char.cmx bytes.cmi bytesLabels.cmo : bytes.cmi bytesLabels.cmi bytesLabels.cmx : bytes.cmx bytesLabels.cmi +bytes.cmo : pervasives.cmi list.cmi char.cmi bytes.cmi +bytes.cmx : pervasives.cmx list.cmx char.cmx bytes.cmi callback.cmo : obj.cmi callback.cmi callback.cmx : obj.cmx callback.cmi +camlinternalFormatBasics.cmo : camlinternalFormatBasics.cmi +camlinternalFormatBasics.cmx : camlinternalFormatBasics.cmi camlinternalFormat.cmo : sys.cmi string.cmi char.cmi \ camlinternalFormatBasics.cmi bytes.cmi buffer.cmi camlinternalFormat.cmi camlinternalFormat.cmx : sys.cmx string.cmx char.cmx \ camlinternalFormatBasics.cmx bytes.cmx buffer.cmx camlinternalFormat.cmi -camlinternalFormatBasics.cmo : camlinternalFormatBasics.cmi -camlinternalFormatBasics.cmx : camlinternalFormatBasics.cmi camlinternalLazy.cmo : obj.cmi camlinternalLazy.cmi camlinternalLazy.cmx : obj.cmx camlinternalLazy.cmi camlinternalMod.cmo : obj.cmi camlinternalOO.cmi array.cmi \ @@ -111,10 +111,10 @@ lazy.cmo : obj.cmi camlinternalLazy.cmi lazy.cmi lazy.cmx : obj.cmx camlinternalLazy.cmx lazy.cmi lexing.cmo : sys.cmi string.cmi bytes.cmi array.cmi lexing.cmi lexing.cmx : sys.cmx string.cmx bytes.cmx array.cmx lexing.cmi -list.cmo : list.cmi -list.cmx : list.cmi listLabels.cmo : list.cmi listLabels.cmi listLabels.cmx : list.cmx listLabels.cmi +list.cmo : list.cmi +list.cmx : list.cmi map.cmo : map.cmi map.cmx : map.cmi marshal.cmo : bytes.cmi marshal.cmi @@ -157,18 +157,18 @@ sort.cmo : array.cmi sort.cmi sort.cmx : array.cmx sort.cmi stack.cmo : list.cmi stack.cmi stack.cmx : list.cmx stack.cmi +std_exit.cmo : +std_exit.cmx : stdLabels.cmo : stringLabels.cmi listLabels.cmi bytesLabels.cmi \ arrayLabels.cmi stdLabels.cmi stdLabels.cmx : stringLabels.cmx listLabels.cmx bytesLabels.cmx \ arrayLabels.cmx stdLabels.cmi -std_exit.cmo : -std_exit.cmx : stream.cmo : string.cmi obj.cmi list.cmi lazy.cmi bytes.cmi stream.cmi stream.cmx : string.cmx obj.cmx list.cmx lazy.cmx bytes.cmx stream.cmi -string.cmo : pervasives.cmi list.cmi bytes.cmi string.cmi -string.cmx : pervasives.cmx list.cmx bytes.cmx string.cmi stringLabels.cmo : string.cmi stringLabels.cmi stringLabels.cmx : string.cmx stringLabels.cmi +string.cmo : pervasives.cmi list.cmi bytes.cmi string.cmi +string.cmx : pervasives.cmx list.cmx bytes.cmx string.cmi sys.cmo : sys.cmi sys.cmx : sys.cmi weak.cmo : sys.cmi obj.cmi hashtbl.cmi array.cmi weak.cmi @@ -177,24 +177,24 @@ arg.cmo : sys.cmi string.cmi printf.cmi list.cmi buffer.cmi array.cmi \ arg.cmi arg.p.cmx : sys.p.cmx string.p.cmx printf.p.cmx list.p.cmx buffer.p.cmx array.p.cmx \ arg.cmi -array.cmo : array.cmi -array.p.cmx : array.cmi arrayLabels.cmo : array.cmi arrayLabels.cmi arrayLabels.p.cmx : array.p.cmx arrayLabels.cmi +array.cmo : array.cmi +array.p.cmx : array.cmi buffer.cmo : sys.cmi string.cmi bytes.cmi buffer.cmi buffer.p.cmx : sys.p.cmx string.p.cmx bytes.p.cmx buffer.cmi -bytes.cmo : pervasives.cmi list.cmi char.cmi bytes.cmi -bytes.p.cmx : pervasives.p.cmx list.p.cmx char.p.cmx bytes.cmi bytesLabels.cmo : bytes.cmi bytesLabels.cmi bytesLabels.p.cmx : bytes.p.cmx bytesLabels.cmi +bytes.cmo : pervasives.cmi list.cmi char.cmi bytes.cmi +bytes.p.cmx : pervasives.p.cmx list.p.cmx char.p.cmx bytes.cmi callback.cmo : obj.cmi callback.cmi callback.p.cmx : obj.p.cmx callback.cmi +camlinternalFormatBasics.cmo : camlinternalFormatBasics.cmi +camlinternalFormatBasics.p.cmx : camlinternalFormatBasics.cmi camlinternalFormat.cmo : sys.cmi string.cmi char.cmi \ camlinternalFormatBasics.cmi bytes.cmi buffer.cmi camlinternalFormat.cmi camlinternalFormat.p.cmx : sys.p.cmx string.p.cmx char.p.cmx \ camlinternalFormatBasics.p.cmx bytes.p.cmx buffer.p.cmx camlinternalFormat.cmi -camlinternalFormatBasics.cmo : camlinternalFormatBasics.cmi -camlinternalFormatBasics.p.cmx : camlinternalFormatBasics.cmi camlinternalLazy.cmo : obj.cmi camlinternalLazy.cmi camlinternalLazy.p.cmx : obj.p.cmx camlinternalLazy.cmi camlinternalMod.cmo : obj.cmi camlinternalOO.cmi array.cmi \ @@ -237,10 +237,10 @@ lazy.cmo : obj.cmi camlinternalLazy.cmi lazy.cmi lazy.p.cmx : obj.p.cmx camlinternalLazy.p.cmx lazy.cmi lexing.cmo : sys.cmi string.cmi bytes.cmi array.cmi lexing.cmi lexing.p.cmx : sys.p.cmx string.p.cmx bytes.p.cmx array.p.cmx lexing.cmi -list.cmo : list.cmi -list.p.cmx : list.cmi listLabels.cmo : list.cmi listLabels.cmi listLabels.p.cmx : list.p.cmx listLabels.cmi +list.cmo : list.cmi +list.p.cmx : list.cmi map.cmo : map.cmi map.p.cmx : map.cmi marshal.cmo : bytes.cmi marshal.cmi @@ -283,18 +283,18 @@ sort.cmo : array.cmi sort.cmi sort.p.cmx : array.p.cmx sort.cmi stack.cmo : list.cmi stack.cmi stack.p.cmx : list.p.cmx stack.cmi +std_exit.cmo : +std_exit.p.cmx : stdLabels.cmo : stringLabels.cmi listLabels.cmi bytesLabels.cmi \ arrayLabels.cmi stdLabels.cmi stdLabels.p.cmx : stringLabels.p.cmx listLabels.p.cmx bytesLabels.p.cmx \ arrayLabels.p.cmx stdLabels.cmi -std_exit.cmo : -std_exit.p.cmx : stream.cmo : string.cmi obj.cmi list.cmi lazy.cmi bytes.cmi stream.cmi stream.p.cmx : string.p.cmx obj.p.cmx list.p.cmx lazy.p.cmx bytes.p.cmx stream.cmi -string.cmo : pervasives.cmi list.cmi bytes.cmi string.cmi -string.p.cmx : pervasives.p.cmx list.p.cmx bytes.p.cmx string.cmi stringLabels.cmo : string.cmi stringLabels.cmi stringLabels.p.cmx : string.p.cmx stringLabels.cmi +string.cmo : pervasives.cmi list.cmi bytes.cmi string.cmi +string.p.cmx : pervasives.p.cmx list.p.cmx bytes.p.cmx string.cmi sys.cmo : sys.cmi sys.p.cmx : sys.cmi weak.cmo : sys.cmi obj.cmi hashtbl.cmi array.cmi weak.cmi diff --git a/stdlib/.ignore b/stdlib/.ignore index ad1b04e1..20d8653f 100644 --- a/stdlib/.ignore +++ b/stdlib/.ignore @@ -1,5 +1,7 @@ camlheader +target_camlheader camlheaderd +target_camlheaderd camlheader_ur labelled-* caml diff --git a/stdlib/Makefile b/stdlib/Makefile index 37f9a5f0..92fa3740 100644 --- a/stdlib/Makefile +++ b/stdlib/Makefile @@ -45,23 +45,28 @@ installopt-prof: stdlib.p.cmxa: $(OBJS:.cmo=.p.cmx) $(CAMLOPT) -a -o stdlib.p.cmxa $(OBJS:.cmo=.p.cmx) -camlheader camlheaderd camlheader_ur: header.c ../config/Makefile +camlheader target_camlheader camlheaderd target_camlheaderd camlheader_ur: \ + header.c ../config/Makefile if $(SHARPBANGSCRIPTS); then \ echo '#!$(BINDIR)/ocamlrun' > camlheader && \ + echo '#!$(TARGET_BINDIR)/ocamlrun' > target_camlheader && \ echo '#!$(BINDIR)/ocamlrund' > camlheaderd && \ + echo '#!$(TARGET_BINDIR)/ocamlrund' > target_camlheaderd && \ echo '#!' | tr -d '\012' > camlheader_ur; \ else \ - $(BYTECC) $(BYTECCCOMPOPTS) $(BYTECCLINKOPTS) \ - -DRUNTIME_NAME='"$(BINDIR)/ocamlrun"' \ - header.c -o tmpheader$(EXE) && \ - strip tmpheader$(EXE) && \ - mv tmpheader$(EXE) camlheader && \ - cp camlheader camlheader_ur && \ - $(BYTECC) $(BYTECCCOMPOPTS) $(BYTECCLINKOPTS) \ - -DRUNTIME_NAME='"$(BINDIR)/ocamlrund"' \ - header.c -o tmpheader$(EXE) && \ - strip tmpheader$(EXE) && \ - mv tmpheader$(EXE) camlheaderd; \ + for suff in '' d; do \ + $(BYTECC) $(BYTECCCOMPOPTS) $(BYTECCLINKOPTS) \ + -DRUNTIME_NAME='"$(BINDIR)/ocamlrun'$$suff'"' \ + header.c -o tmpheader$(EXE) && \ + strip tmpheader$(EXE) && \ + mv tmpheader$(EXE) camlheader$$suff && \ + $(BYTECC) $(BYTECCCOMPOPTS) $(BYTECCLINKOPTS) \ + -DRUNTIME_NAME='"$(TARGET_BINDIR)/ocamlrun'$$suff'"' \ + header.c -o tmpheader$(EXE) && \ + strip tmpheader$(EXE) && \ + mv tmpheader$(EXE) target_camlheader$$suff; \ + done && \ + cp camlheader camlheader_ur; \ fi .PHONY: all allopt allopt-noprof allopt-prof install installopt diff --git a/stdlib/Makefile.nt b/stdlib/Makefile.nt index 590701bf..5bc2e0ed 100644 --- a/stdlib/Makefile.nt +++ b/stdlib/Makefile.nt @@ -18,19 +18,21 @@ allopt: stdlib.cmxa std_exit.cmx installopt: cp stdlib.cmxa stdlib.$(A) std_exit.$(O) *.cmx $(INSTALL_LIBDIR) -camlheader camlheader_ur: headernt.c ../config/Makefile +camlheader target_camlheader camlheader_ur: headernt.c ../config/Makefile $(BYTECC) $(BYTECCCOMPOPTS) -c -I../byterun \ -DRUNTIME_NAME='"ocamlrun"' headernt.c $(MKEXE) -o tmpheader.exe headernt.$(O) $(EXTRALIBS) rm -f camlheader.exe mv tmpheader.exe camlheader + cp camlheader target_camlheader cp camlheader camlheader_ur -camlheaderd: headernt.c ../config/Makefile +camlheaderd target_camlheaderd: headernt.c ../config/Makefile $(BYTECC) $(BYTECCCOMPOPTS) -c -I../byterun \ -DRUNTIME_NAME='"ocamlrund"' headernt.c $(MKEXE) -o tmpheader.exe headernt.$(O) $(EXTRALIBS) mv tmpheader.exe camlheaderd + cp camlheaderd target_camlheaderd # TODO: do not call flexlink to build tmpheader.exe (we don't need # the export table) diff --git a/stdlib/Makefile.shared b/stdlib/Makefile.shared index 54de337c..8bc6e1bc 100755 --- a/stdlib/Makefile.shared +++ b/stdlib/Makefile.shared @@ -12,14 +12,17 @@ ######################################################################### include ../config/Makefile -RUNTIME=../boot/ocamlrun +CAMLRUN ?= ../boot/ocamlrun +CAMLYACC ?= ../boot/ocamlyacc +TARGET_BINDIR ?= $(BINDIR) + COMPILER=../ocamlc -CAMLC=$(RUNTIME) $(COMPILER) +CAMLC=$(CAMLRUN) $(COMPILER) COMPFLAGS=-strict-sequence -w +33..39 -g -warn-error A -bin-annot -nostdlib \ -safe-string OPTCOMPILER=../ocamlopt -CAMLOPT=$(RUNTIME) $(OPTCOMPILER) -CAMLDEP=../boot/ocamlrun ../tools/ocamldep +CAMLOPT=$(CAMLRUN) $(OPTCOMPILER) +CAMLDEP=$(CAMLRUN) ../tools/ocamldep OBJS=camlinternalFormatBasics.cmo pervasives.cmo $(OTHERS) OTHERS=array.cmo list.cmo char.cmo bytes.cmo string.cmo sys.cmo \ @@ -37,19 +40,20 @@ OTHERS=array.cmo list.cmo char.cmo bytes.cmo string.cmo sys.cmo \ arrayLabels.cmo listLabels.cmo bytesLabels.cmo \ stringLabels.cmo moreLabels.cmo stdLabels.cmo -all: stdlib.cma std_exit.cmo camlheader camlheader_ur +all: stdlib.cma std_exit.cmo camlheader target_camlheader camlheader_ur INSTALL_LIBDIR=$(DESTDIR)$(LIBDIR) install: install-$(RUNTIMED) - cp stdlib.cma std_exit.cmo *.cmi *.mli *.ml camlheader camlheader_ur \ + cp stdlib.cma std_exit.cmo *.cmi *.mli *.ml camlheader_ur \ $(INSTALL_LIBDIR) + cp target_camlheader $(INSTALL_LIBDIR)/camlheader install-noruntimed: .PHONY: install-noruntimed -install-runtimed: camlheaderd - cp camlheaderd $(INSTALL_LIBDIR) +install-runtimed: target_camlheaderd + cp target_camlheaderd $(INSTALL_LIBDIR)/camlheaderd .PHONY: install-runtimed stdlib.cma: $(OBJS) @@ -65,7 +69,7 @@ clean:: rm -f sys.ml clean:: - rm -f camlheader camlheader_ur camlheaderd + rm -f camlheader target_camlheader camlheader_ur target_camlheaderd .SUFFIXES: .mli .ml .cmi .cmo .cmx .p.cmx diff --git a/stdlib/array.ml b/stdlib/array.ml index 1990a78b..243eeade 100644 --- a/stdlib/array.ml +++ b/stdlib/array.ml @@ -29,6 +29,10 @@ external make_float: int -> float array = "caml_make_float_vect" let init l f = if l = 0 then [||] else + if l < 0 then invalid_arg "Array.init" + (* See #6575. We could also check for maximum array size, but this depends + on whether we create a float array or a regular one... *) + else let res = create l (f 0) in for i = 1 to pred l do unsafe_set res i (f i) diff --git a/stdlib/array.mli b/stdlib/array.mli index 99de0c80..7580f7e7 100644 --- a/stdlib/array.mli +++ b/stdlib/array.mli @@ -154,7 +154,8 @@ val fold_right : ('b -> 'a -> 'a) -> 'b array -> 'a -> 'a external make_float: int -> float array = "caml_make_float_vect" (** [Array.make_float n] returns a fresh float array of length [n], - with uninitialized data. *) + with uninitialized data. + @since 4.02 *) (** {6 Sorting} *) diff --git a/stdlib/arrayLabels.mli b/stdlib/arrayLabels.mli index 0d046378..f42853c8 100644 --- a/stdlib/arrayLabels.mli +++ b/stdlib/arrayLabels.mli @@ -17,24 +17,24 @@ external length : 'a array -> int = "%array_length" (** Return the length (number of elements) of the given array. *) external get : 'a array -> int -> 'a = "%array_safe_get" -(** [Array.get a n] returns the element number [n] of array [a]. +(** [ArrayLabels.get a n] returns the element number [n] of array [a]. The first element has number 0. - The last element has number [Array.length a - 1]. - You can also write [a.(n)] instead of [Array.get a n]. + The last element has number [ArrayLabels.length a - 1]. + You can also write [a.(n)] instead of [ArrayLabels.get a n]. Raise [Invalid_argument "index out of bounds"] - if [n] is outside the range 0 to [(Array.length a - 1)]. *) + if [n] is outside the range 0 to [(ArrayLabels.length a - 1)]. *) external set : 'a array -> int -> 'a -> unit = "%array_safe_set" -(** [Array.set a n x] modifies array [a] in place, replacing +(** [ArrayLabels.set a n x] modifies array [a] in place, replacing element number [n] with [x]. - You can also write [a.(n) <- x] instead of [Array.set a n x]. + You can also write [a.(n) <- x] instead of [ArrayLabels.set a n x]. Raise [Invalid_argument "index out of bounds"] - if [n] is outside the range 0 to [Array.length a - 1]. *) + if [n] is outside the range 0 to [ArrayLabels.length a - 1]. *) external make : int -> 'a -> 'a array = "caml_make_vect" -(** [Array.make n x] returns a fresh array of length [n], +(** [ArrayLabels.make n x] returns a fresh array of length [n], initialized with [x]. All the elements of this new array are initially physically equal to [x] (in the sense of the [==] predicate). @@ -51,9 +51,9 @@ external create : int -> 'a -> 'a array = "caml_make_vect" (** @deprecated [ArrayLabels.create] is an alias for {!ArrayLabels.make}. *) val init : int -> f:(int -> 'a) -> 'a array -(** [Array.init n f] returns a fresh array of length [n], +(** [ArrayLabels.init n f] returns a fresh array of length [n], with element number [i] initialized to the result of [f i]. - In other terms, [Array.init n f] tabulates the results of [f] + In other terms, [ArrayLabels.init n f] tabulates the results of [f] applied to the integers [0] to [n-1]. Raise [Invalid_argument] if [n < 0] or [n > Sys.max_array_length]. @@ -61,7 +61,7 @@ val init : int -> f:(int -> 'a) -> 'a array size is only [Sys.max_array_length / 2].*) val make_matrix : dimx:int -> dimy:int -> 'a -> 'a array array -(** [Array.make_matrix dimx dimy e] returns a two-dimensional array +(** [ArrayLabels.make_matrix dimx dimy e] returns a two-dimensional array (an array of arrays) with first dimension [dimx] and second dimension [dimy]. All the elements of this new matrix are initially physically equal to [e]. @@ -79,27 +79,27 @@ val create_matrix : dimx:int -> dimy:int -> 'a -> 'a array array {!ArrayLabels.make_matrix}. *) val append : 'a array -> 'a array -> 'a array -(** [Array.append v1 v2] returns a fresh array containing the +(** [ArrayLabels.append v1 v2] returns a fresh array containing the concatenation of the arrays [v1] and [v2]. *) val concat : 'a array list -> 'a array -(** Same as [Array.append], but concatenates a list of arrays. *) +(** Same as [ArrayLabels.append], but concatenates a list of arrays. *) val sub : 'a array -> pos:int -> len:int -> 'a array -(** [Array.sub a start len] returns a fresh array of length [len], +(** [ArrayLabels.sub a start len] returns a fresh array of length [len], containing the elements number [start] to [start + len - 1] of array [a]. Raise [Invalid_argument "Array.sub"] if [start] and [len] do not designate a valid subarray of [a]; that is, if - [start < 0], or [len < 0], or [start + len > Array.length a]. *) + [start < 0], or [len < 0], or [start + len > ArrayLabels.length a]. *) val copy : 'a array -> 'a array -(** [Array.copy a] returns a copy of [a], that is, a fresh array +(** [ArrayLabels.copy a] returns a copy of [a], that is, a fresh array containing the same elements as [a]. *) val fill : 'a array -> pos:int -> len:int -> 'a -> unit -(** [Array.fill a ofs len x] modifies the array [a] in place, +(** [ArrayLabels.fill a ofs len x] modifies the array [a] in place, storing [x] in elements number [ofs] to [ofs + len - 1]. Raise [Invalid_argument "Array.fill"] if [ofs] and [len] do not @@ -108,7 +108,7 @@ val fill : 'a array -> pos:int -> len:int -> 'a -> unit val blit : src:'a array -> src_pos:int -> dst:'a array -> dst_pos:int -> len:int -> unit -(** [Array.blit v1 o1 v2 o2 len] copies [len] elements +(** [ArrayLabels.blit v1 o1 v2 o2 len] copies [len] elements from array [v1], starting at element number [o1], to array [v2], starting at element number [o2]. It works correctly even if [v1] and [v2] are the same array, and the source and @@ -119,21 +119,21 @@ val blit : designate a valid subarray of [v2]. *) val to_list : 'a array -> 'a list -(** [Array.to_list a] returns the list of all the elements of [a]. *) +(** [ArrayLabels.to_list a] returns the list of all the elements of [a]. *) val of_list : 'a list -> 'a array -(** [Array.of_list l] returns a fresh array containing the elements +(** [ArrayLabels.of_list l] returns a fresh array containing the elements of [l]. *) val iter : f:('a -> unit) -> 'a array -> unit -(** [Array.iter f a] applies function [f] in turn to all +(** [ArrayLabels.iter f a] applies function [f] in turn to all the elements of [a]. It is equivalent to - [f a.(0); f a.(1); ...; f a.(Array.length a - 1); ()]. *) + [f a.(0); f a.(1); ...; f a.(ArrayLabels.length a - 1); ()]. *) val map : f:('a -> 'b) -> 'a array -> 'b array -(** [Array.map f a] applies function [f] to all the elements of [a], +(** [ArrayLabels.map f a] applies function [f] to all the elements of [a], and builds an array with the results returned by [f]: - [[| f a.(0); f a.(1); ...; f a.(Array.length a - 1) |]]. *) + [[| f a.(0); f a.(1); ...; f a.(ArrayLabels.length a - 1) |]]. *) val iteri : f:(int -> 'a -> unit) -> 'a array -> unit (** Same as {!ArrayLabels.iter}, but the @@ -146,12 +146,12 @@ val mapi : f:(int -> 'a -> 'b) -> 'a array -> 'b array and the element itself as second argument. *) val fold_left : f:('a -> 'b -> 'a) -> init:'a -> 'b array -> 'a -(** [Array.fold_left f x a] computes +(** [ArrayLabels.fold_left f x a] computes [f (... (f (f x a.(0)) a.(1)) ...) a.(n-1)], where [n] is the length of the array [a]. *) val fold_right : f:('b -> 'a -> 'a) -> 'b array -> init:'a -> 'a -(** [Array.fold_right f a x] computes +(** [ArrayLabels.fold_right f a x] computes [f a.(0) (f a.(1) ( ... (f a.(n-1) x) ...))], where [n] is the length of the array [a]. *) @@ -166,9 +166,9 @@ val sort : cmp:('a -> 'a -> int) -> 'a array -> unit and a negative integer if the first is smaller (see below for a complete specification). For example, {!Pervasives.compare} is a suitable comparison function, provided there are no floating-point - NaN values in the data. After calling [Array.sort], the + NaN values in the data. After calling [ArrayLabels.sort], the array is sorted in place in increasing order. - [Array.sort] is guaranteed to run in constant heap space + [ArrayLabels.sort] is guaranteed to run in constant heap space and (at most) logarithmic stack space. The current implementation uses Heap Sort. It runs in constant @@ -180,7 +180,7 @@ val sort : cmp:('a -> 'a -> int) -> 'a array -> unit - [cmp x y] > 0 if and only if [cmp y x] < 0 - if [cmp x y] >= 0 and [cmp y z] >= 0 then [cmp x z] >= 0 - When [Array.sort] returns, [a] contains the same elements as before, + When [ArrayLabels.sort] returns, [a] contains the same elements as before, reordered in such a way that for all i and j valid indices of [a] : - [cmp a.(i) a.(j)] >= 0 if and only if i >= j *) @@ -196,8 +196,8 @@ val stable_sort : cmp:('a -> 'a -> int) -> 'a array -> unit *) val fast_sort : cmp:('a -> 'a -> int) -> 'a array -> unit -(** Same as {!Array.sort} or {!Array.stable_sort}, whichever is faster - on typical input. +(** Same as {!ArrayLabels.sort} or {!ArrayLabels.stable_sort}, whichever is + faster on typical input. *) diff --git a/stdlib/buffer.mli b/stdlib/buffer.mli index e7ce8b99..962f6bc7 100644 --- a/stdlib/buffer.mli +++ b/stdlib/buffer.mli @@ -38,11 +38,12 @@ val create : int -> t val contents : t -> string (** Return a copy of the current contents of the buffer. - The buffer itself is unchanged. *) + The buffer itself is unchanged. *) val to_bytes : t -> bytes (** Return a copy of the current contents of the buffer. - The buffer itself is unchanged. *) + The buffer itself is unchanged. + @since 4.02 *) val sub : t -> int -> int -> string (** [Buffer.sub b off len] returns (a copy of) the bytes from the @@ -85,7 +86,8 @@ val add_string : t -> string -> unit (** [add_string b s] appends the string [s] at the end of the buffer [b]. *) val add_bytes : t -> bytes -> unit -(** [add_string b s] appends the string [s] at the end of the buffer [b]. *) +(** [add_string b s] appends the string [s] at the end of the buffer [b]. + @since 4.02 *) val add_substring : t -> string -> int -> int -> unit (** [add_substring b s ofs len] takes [len] characters from offset @@ -93,7 +95,8 @@ val add_substring : t -> string -> int -> int -> unit val add_subbytes : t -> bytes -> int -> int -> unit (** [add_substring b s ofs len] takes [len] characters from offset - [ofs] in byte sequence [s] and appends them at the end of the buffer [b]. *) + [ofs] in byte sequence [s] and appends them at the end of the buffer [b]. + @since 4.02 *) val add_substitute : t -> (string -> string) -> string -> unit (** [add_substitute b f s] appends the string pattern [s] at the end diff --git a/stdlib/bytesLabels.mli b/stdlib/bytesLabels.mli index d48d95f5..04043182 100644 --- a/stdlib/bytesLabels.mli +++ b/stdlib/bytesLabels.mli @@ -11,7 +11,9 @@ (* *) (***********************************************************************) -(** Byte sequence operations. *) +(** Byte sequence operations. + @since 4.02.0 + *) external length : bytes -> int = "%string_length" (** Return the length (number of bytes) of the argument. *) diff --git a/stdlib/camlinternalFormat.ml b/stdlib/camlinternalFormat.ml index 40d76678..569f4ca3 100644 --- a/stdlib/camlinternalFormat.ml +++ b/stdlib/camlinternalFormat.ml @@ -475,6 +475,7 @@ fun buf fmtty -> match fmtty with | Bool_ty rest -> buffer_add_string buf "%B"; bprint_fmtty buf rest; | Alpha_ty rest -> buffer_add_string buf "%a"; bprint_fmtty buf rest; | Theta_ty rest -> buffer_add_string buf "%t"; bprint_fmtty buf rest; + | Any_ty rest -> buffer_add_string buf "%?"; bprint_fmtty buf rest; | Reader_ty rest -> buffer_add_string buf "%r"; bprint_fmtty buf rest; | Ignored_reader_ty rest -> @@ -492,6 +493,12 @@ fun buf fmtty -> match fmtty with (***) +let rec int_of_custom_arity : type a b c . + (a, b, c) custom_arity -> int = + function + | Custom_zero -> 0 + | Custom_succ x -> 1 + int_of_custom_arity x + (* Print a complete format in a buffer. *) let bprint_fmt buf fmt = let rec fmtiter : type a b c d e f . @@ -537,6 +544,12 @@ let bprint_fmt buf fmt = | Theta rest -> buffer_add_char buf '%'; bprint_ignored_flag buf ign_flag; buffer_add_char buf 't'; fmtiter rest false; + | Custom (arity, _, rest) -> + for _i = 1 to int_of_custom_arity arity do + buffer_add_char buf '%'; bprint_ignored_flag buf ign_flag; + buffer_add_char buf '?'; + done; + fmtiter rest false; | Reader rest -> buffer_add_char buf '%'; bprint_ignored_flag buf ign_flag; buffer_add_char buf 'r'; fmtiter rest false; @@ -623,6 +636,7 @@ let rec symm : type a1 b1 c1 d1 e1 f1 a2 b2 c2 d2 e2 f2 . | String_ty rest -> String_ty (symm rest) | Theta_ty rest -> Theta_ty (symm rest) | Alpha_ty rest -> Alpha_ty (symm rest) + | Any_ty rest -> Any_ty (symm rest) | Reader_ty rest -> Reader_ty (symm rest) | Ignored_reader_ty rest -> Ignored_reader_ty (symm rest) | Format_arg_ty (ty, rest) -> @@ -695,6 +709,11 @@ let rec fmtty_rel_det : type a1 b c d1 e1 f1 a2 d2 e2 f2 . (fun Refl -> let Refl = fa Refl in Refl), (fun Refl -> let Refl = af Refl in Refl), ed, de + | Any_ty rest -> + let fa, af, ed, de = fmtty_rel_det rest in + (fun Refl -> let Refl = fa Refl in Refl), + (fun Refl -> let Refl = af Refl in Refl), + ed, de | Reader_ty rest -> let fa, af, ed, de = fmtty_rel_det rest in (fun Refl -> let Refl = fa Refl in Refl), @@ -765,6 +784,10 @@ and trans : type | Theta_ty _, _ -> assert false | _, Theta_ty _ -> assert false + | Any_ty rest1, Any_ty rest2 -> Any_ty (trans rest1 rest2) + | Any_ty _, _ -> assert false + | _, Any_ty _ -> assert false + | Reader_ty rest1, Reader_ty rest2 -> Reader_ty (trans rest1 rest2) | Reader_ty _, _ -> assert false | _, Reader_ty _ -> assert false @@ -835,6 +858,7 @@ fun fmtty -> match fmtty with | Bool rest -> Bool_ty (fmtty_of_fmt rest) | Alpha rest -> Alpha_ty (fmtty_of_fmt rest) | Theta rest -> Theta_ty (fmtty_of_fmt rest) + | Custom (arity, _, rest) -> fmtty_of_custom arity (fmtty_of_fmt rest) | Reader rest -> Reader_ty (fmtty_of_fmt rest) | Format_arg (_, ty, rest) -> @@ -856,6 +880,13 @@ fun fmtty -> match fmtty with | End_of_format -> End_of_fmtty +and fmtty_of_custom : type x y a b c d e f . + (a, x, y) custom_arity -> (a, b, c, d, e, f) fmtty -> + (y, b, c, d, e, f) fmtty = +fun arity fmtty -> match arity with + | Custom_zero -> fmtty + | Custom_succ arity -> Any_ty (fmtty_of_custom arity fmtty) + (* Extract the fmtty of an ignored parameter followed by the rest of the format. *) and fmtty_of_ignored_format : type x y a b c d e f . @@ -1315,15 +1346,16 @@ let format_of_aconv iconv c = (* Generate the format_float first argument form a float_conv. *) let format_of_fconv fconv prec = - let prec = abs prec in - let symb = if fconv = Float_F then 'g' else char_of_fconv fconv in - let buf = buffer_create 16 in - buffer_add_char buf '%'; - bprint_fconv_flag buf fconv; - buffer_add_char buf '.'; - buffer_add_string buf (string_of_int prec); - buffer_add_char buf symb; - buffer_contents buf + if fconv = Float_F then "%.12g" else + let prec = abs prec in + let symb = char_of_fconv fconv in + let buf = buffer_create 16 in + buffer_add_char buf '%'; + bprint_fconv_flag buf fconv; + buffer_add_char buf '.'; + buffer_add_string buf (string_of_int prec); + buffer_add_char buf symb; + buffer_contents buf (* Convert an integer to a string according to a conversion. *) let convert_int iconv n = format_int (format_of_iconv iconv) n @@ -1403,6 +1435,8 @@ fun k o acc fmt -> match fmt with fun f x -> make_printf k o (Acc_delay (acc, fun o -> f o x)) rest | Theta rest -> fun f -> make_printf k o (Acc_delay (acc, f)) rest + | Custom (arity, f, rest) -> + make_custom k o acc rest arity (f ()) | Reader _ -> (* This case is impossible, by typing of formats. *) (* Indeed, since printf and co. take a format4 as argument, the 'd and 'e @@ -1502,6 +1536,7 @@ fun k o acc fmtty fmt -> match fmtty with | Bool_ty rest -> fun _ -> make_from_fmtty k o acc rest fmt | Alpha_ty rest -> fun _ _ -> make_from_fmtty k o acc rest fmt | Theta_ty rest -> fun _ -> make_from_fmtty k o acc rest fmt + | Any_ty rest -> fun _ -> make_from_fmtty k o acc rest fmt | Reader_ty _ -> assert false | Ignored_reader_ty _ -> assert false | Format_arg_ty (_, rest) -> fun _ -> make_from_fmtty k o acc rest fmt @@ -1628,6 +1663,16 @@ and make_float_padding_precision : type x y a b c d e f . let str = fix_padding padty w (convert_float fconv p x) in make_printf k o (Acc_data_string (acc, str)) fmt +and make_custom : type x y a b c d e f . + (b -> (b, c) acc -> f) -> b -> (b, c) acc -> + (a, b, c, d, e, f) fmt -> + (a, x, y) custom_arity -> x -> y = + fun k o acc rest arity f -> match arity with + | Custom_zero -> make_printf k o (Acc_data_string (acc, f)) rest + | Custom_succ arity -> + fun x -> + make_custom k o acc rest arity (f x) + (******************************************************************************) (* Continuations for make_printf *) @@ -1806,7 +1851,7 @@ let fmt_ebb_of_string ?legacy_behavior str = let legacy_behavior = match legacy_behavior with | Some flag -> flag | None -> true - (** When this flag is enabled, the format parser tries to behave as + (* When this flag is enabled, the format parser tries to behave as the <4.02 implementations, in particular it ignores most benine nonsensical format. When the flag is disabled, it will reject any format that is not accepted by the specification. diff --git a/stdlib/camlinternalFormatBasics.ml b/stdlib/camlinternalFormatBasics.ml index f45f434c..4e5db73d 100644 --- a/stdlib/camlinternalFormatBasics.ml +++ b/stdlib/camlinternalFormatBasics.ml @@ -65,6 +65,12 @@ type ('a, 'b) precision = only accept an optional number as precision option (no extra argument) *) type prec_option = int option +(* see the Custom format combinator *) +type ('a, 'b, 'c) custom_arity = + | Custom_zero : ('a, string, 'a) custom_arity + | Custom_succ : ('a, 'b, 'c) custom_arity -> + ('a, 'x -> 'b, 'x -> 'c) custom_arity + (***) (* Relational format types @@ -306,6 +312,11 @@ and ('a1, 'b1, 'c1, 'd1, 'e1, 'f1, 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel -> (('b1 -> 'c1) -> 'a1, 'b1, 'c1, 'd1, 'e1, 'f1, ('b2 -> 'c2) -> 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel + | Any_ty : (* Used for custom formats *) + ('a1, 'b1, 'c1, 'd1, 'e1, 'f1, + 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel -> + ('x -> 'a1, 'b1, 'c1, 'd1, 'e1, 'f1, + 'x -> 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel (* Scanf specific constructor. *) | Reader_ty : (* %r *) @@ -417,6 +428,32 @@ and ('a, 'b, 'c, 'd, 'e, 'f) fmt = ('a, 'b, 'c, 'd, 'y, 'x) ignored * ('x, 'b, 'c, 'y, 'e, 'f) fmt -> ('a, 'b, 'c, 'd, 'e, 'f) fmt + (* Custom printing format (PR#6452, GPR#140) + + We include a type Custom of "custom converters", where an + arbitrary function can be used to convert one or more + arguments. There is no syntax for custom converters, it is only + inteded for custom processors that wish to rely on the + stdlib-defined format GADTs. + + For instance a pre-processor could choose to interpret strings + prefixed with ["!"] as format strings where [%{{ ... }}] is + a special form to pass a to_string function, so that one could + write: + + {[ + type t = { x : int; y : int } + + let string_of_t t = Printf.sprintf "{ x = %d; y = %d }" t.x t.y + + Printf.printf !"t = %{{string_of_t}}" { x = 42; y = 42 } + ]} + *) + | Custom : + ('a, 'x, 'y) custom_arity * (unit -> 'x) * ('a, 'b, 'c, 'd, 'e, 'f) fmt -> + ('y, 'b, 'c, 'd, 'e, 'f) fmt + + (* end of a format specification *) | End_of_format : ('f, 'b, 'c, 'e, 'e, 'f) fmt @@ -490,6 +527,8 @@ let rec erase_rel : type a b c d e f g h i j k l . Alpha_ty (erase_rel rest) | Theta_ty rest -> Theta_ty (erase_rel rest) + | Any_ty rest -> + Any_ty (erase_rel rest) | Reader_ty rest -> Reader_ty (erase_rel rest) | Ignored_reader_ty rest -> @@ -543,6 +582,8 @@ fun fmtty1 fmtty2 -> match fmtty1 with Alpha_ty (concat_fmtty rest fmtty2) | Theta_ty rest -> Theta_ty (concat_fmtty rest fmtty2) + | Any_ty rest -> + Any_ty (concat_fmtty rest fmtty2) | Reader_ty rest -> Reader_ty (concat_fmtty rest fmtty2) | Ignored_reader_ty rest -> @@ -588,6 +629,8 @@ fun fmt1 fmt2 -> match fmt1 with Alpha (concat_fmt rest fmt2) | Theta rest -> Theta (concat_fmt rest fmt2) + | Custom (arity, f, rest) -> + Custom (arity, f, concat_fmt rest fmt2) | Reader rest -> Reader (concat_fmt rest fmt2) | Flush rest -> diff --git a/stdlib/camlinternalFormatBasics.mli b/stdlib/camlinternalFormatBasics.mli index 4e579f3a..80866e83 100644 --- a/stdlib/camlinternalFormatBasics.mli +++ b/stdlib/camlinternalFormatBasics.mli @@ -29,6 +29,11 @@ type ('a, 'b) precision = type prec_option = int option +type ('a, 'b, 'c) custom_arity = + | Custom_zero : ('a, string, 'a) custom_arity + | Custom_succ : ('a, 'b, 'c) custom_arity -> + ('a, 'x -> 'b, 'x -> 'c) custom_arity + type block_type = Pp_hbox | Pp_vbox | Pp_hvbox | Pp_hovbox | Pp_box | Pp_fits type formatting_lit = @@ -121,6 +126,11 @@ and ('a1, 'b1, 'c1, 'd1, 'e1, 'f1, 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel -> (('b1 -> 'c1) -> 'a1, 'b1, 'c1, 'd1, 'e1, 'f1, ('b2 -> 'c2) -> 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel +| Any_ty : (* Used for custom formats *) + ('a1, 'b1, 'c1, 'd1, 'e1, 'f1, + 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel -> + ('x -> 'a1, 'b1, 'c1, 'd1, 'e1, 'f1, + 'x -> 'a2, 'b2, 'c2, 'd2, 'e2, 'f2) fmtty_rel (* Scanf specific constructor. *) | Reader_ty : (* %r *) @@ -234,6 +244,11 @@ and ('a, 'b, 'c, 'd, 'e, 'f) fmt = ('a, 'b, 'c, 'd, 'y, 'x) ignored * ('x, 'b, 'c, 'y, 'e, 'f) fmt -> ('a, 'b, 'c, 'd, 'e, 'f) fmt +(* Custom printing format *) +| Custom : + ('a, 'x, 'y) custom_arity * (unit -> 'x) * ('a, 'b, 'c, 'd, 'e, 'f) fmt -> + ('y, 'b, 'c, 'd, 'e, 'f) fmt + | End_of_format : ('f, 'b, 'c, 'e, 'e, 'f) fmt diff --git a/stdlib/digest.ml b/stdlib/digest.ml index 14cb4ebd..695a01dc 100644 --- a/stdlib/digest.ml +++ b/stdlib/digest.ml @@ -34,9 +34,9 @@ let subbytes b ofs len = substring (Bytes.unsafe_to_string b) ofs len let file filename = let ic = open_in_bin filename in - let d = channel ic (-1) in - close_in ic; - d + match channel ic (-1) with + | d -> close_in ic; d + | exception e -> close_in ic; raise e let output chan digest = output_string chan digest diff --git a/stdlib/digest.mli b/stdlib/digest.mli index 583d2a46..9227cd7d 100644 --- a/stdlib/digest.mli +++ b/stdlib/digest.mli @@ -37,7 +37,8 @@ val string : string -> t (** Return the digest of the given string. *) val bytes : bytes -> t -(** Return the digest of the given byte sequence. *) +(** Return the digest of the given byte sequence. + @since 4.02.0 *) val substring : string -> int -> int -> t (** [Digest.substring s ofs len] returns the digest of the substring @@ -45,7 +46,8 @@ val substring : string -> int -> int -> t val subbytes : bytes -> int -> int -> t (** [Digest.subbytes s ofs len] returns the digest of the subsequence - of [s] starting at index [ofs] and containing [len] bytes. *) + of [s] starting at index [ofs] and containing [len] bytes. + @since 4.02.0 *) external channel : in_channel -> int -> t = "caml_md5_chan" (** If [len] is nonnegative, [Digest.channel ic len] reads [len] diff --git a/stdlib/format.ml b/stdlib/format.ml index 5e206e11..1d196a51 100644 --- a/stdlib/format.ml +++ b/stdlib/format.ml @@ -976,6 +976,12 @@ let flush_str_formatter () = s ;; +let flush_buf_formatter buf ppf = + pp_flush_queue ppf false; + let s = Buffer.contents buf in + Buffer.reset buf; + s + (************************************************************** Basic functions on the standard formatter @@ -1176,12 +1182,11 @@ let printf fmt = fprintf std_formatter fmt let eprintf fmt = fprintf err_formatter fmt let ksprintf k (Format (fmt, _)) = + let b = Buffer.create 512 in + let ppf = formatter_of_buffer b in let k' () acc = - let b = Buffer.create 512 in - let ppf = formatter_of_buffer b in strput_acc ppf acc; - pp_flush_queue ppf false; - k (Buffer.contents b) in + k (flush_buf_formatter b ppf) in make_printf k' () End_of_acc fmt let sprintf fmt = @@ -1194,7 +1199,7 @@ let asprintf (Format (fmt, _)) = = fun ppf acc -> output_acc ppf acc; pp_flush_queue ppf false; - Buffer.contents b in + flush_buf_formatter b ppf in make_printf k' ppf End_of_acc fmt (************************************************************** diff --git a/stdlib/format.mli b/stdlib/format.mli index 541ffbe3..05e153b2 100644 --- a/stdlib/format.mli +++ b/stdlib/format.mli @@ -74,7 +74,7 @@ (** {6 Boxes} *) -val open_box : int -> unit;; +val open_box : int -> unit (** [open_box d] opens a new pretty-printing box with offset [d]. This box is the general purpose pretty-printing box. @@ -86,41 +86,41 @@ val open_box : int -> unit;; When a new line is printed in the box, [d] is added to the current indentation. *) -val close_box : unit -> unit;; +val close_box : unit -> unit (** Closes the most recently opened pretty-printing box. *) (** {6 Formatting functions} *) -val print_string : string -> unit;; +val print_string : string -> unit (** [print_string str] prints [str] in the current box. *) -val print_as : int -> string -> unit;; +val print_as : int -> string -> unit (** [print_as len str] prints [str] in the current box. The pretty-printer formats [str] as if it were of length [len]. *) -val print_int : int -> unit;; +val print_int : int -> unit (** Prints an integer in the current box. *) -val print_float : float -> unit;; +val print_float : float -> unit (** Prints a floating point number in the current box. *) -val print_char : char -> unit;; +val print_char : char -> unit (** Prints a character in the current box. *) -val print_bool : bool -> unit;; +val print_bool : bool -> unit (** Prints a boolean in the current box. *) (** {6 Break hints} *) -val print_space : unit -> unit;; +val print_space : unit -> unit (** [print_space ()] is used to separate items (typically to print a space between two words). It indicates that the line may be split at this point. It either prints one space or splits the line. It is equivalent to [print_break 1 0]. *) -val print_cut : unit -> unit;; +val print_cut : unit -> unit (** [print_cut ()] is used to mark a good break position. It indicates that the line may be split at this point. It either prints nothing or splits the line. @@ -128,7 +128,7 @@ val print_cut : unit -> unit;; point, without printing spaces or adding indentation. It is equivalent to [print_break 0 0]. *) -val print_break : int -> int -> unit;; +val print_break : int -> int -> unit (** Inserts a break hint in a pretty-printing box. [print_break nspaces offset] indicates that the line may be split (a newline character is printed) at this point, @@ -138,25 +138,25 @@ val print_break : int -> int -> unit;; the current indentation. If the line is not split, [nspaces] spaces are printed. *) -val print_flush : unit -> unit;; +val print_flush : unit -> unit (** Flushes the pretty printer: all opened boxes are closed, and all pending text is displayed. *) -val print_newline : unit -> unit;; +val print_newline : unit -> unit (** Equivalent to [print_flush] followed by a new line. *) -val force_newline : unit -> unit;; +val force_newline : unit -> unit (** Forces a newline in the current box. Not the normal way of pretty-printing, you should prefer break hints. *) -val print_if_newline : unit -> unit;; +val print_if_newline : unit -> unit (** Executes the next formatting command if the preceding line has just been split. Otherwise, ignore the next formatting command. *) (** {6 Margin} *) -val set_margin : int -> unit;; +val set_margin : int -> unit (** [set_margin d] sets the value of the right margin to [d] (in characters): this value is used to detect line overflows that leads to split lines. @@ -164,12 +164,12 @@ val set_margin : int -> unit;; If [d] is too large, the right margin is set to the maximum admissible value (which is greater than [10^9]). *) -val get_margin : unit -> int;; +val get_margin : unit -> int (** Returns the position of the right margin. *) (** {6 Maximum indentation limit} *) -val set_max_indent : int -> unit;; +val set_max_indent : int -> unit (** [set_max_indent d] sets the value of the maximum indentation limit to [d] (in characters): once this limit is reached, boxes are rejected to the left, @@ -178,32 +178,32 @@ val set_max_indent : int -> unit;; If [d] is too large, the limit is set to the maximum admissible value (which is greater than [10^9]). *) -val get_max_indent : unit -> int;; +val get_max_indent : unit -> int (** Return the value of the maximum indentation limit (in characters). *) (** {6 Formatting depth: maximum number of boxes allowed before ellipsis} *) -val set_max_boxes : int -> unit;; +val set_max_boxes : int -> unit (** [set_max_boxes max] sets the maximum number of boxes simultaneously opened. Material inside boxes nested deeper is printed as an ellipsis (more precisely as the text returned by [get_ellipsis_text ()]). Nothing happens if [max] is smaller than 2. *) -val get_max_boxes : unit -> int;; +val get_max_boxes : unit -> int (** Returns the maximum number of boxes allowed before ellipsis. *) -val over_max_boxes : unit -> bool;; +val over_max_boxes : unit -> bool (** Tests if the maximum number of boxes allowed have already been opened. *) (** {6 Advanced formatting} *) -val open_hbox : unit -> unit;; +val open_hbox : unit -> unit (** [open_hbox ()] opens a new pretty-printing box. This box is 'horizontal': the line is not split in this box (new lines may still occur inside boxes nested deeper). *) -val open_vbox : int -> unit;; +val open_vbox : int -> unit (** [open_vbox d] opens a new pretty-printing box with offset [d]. This box is 'vertical': every break hint inside this @@ -211,7 +211,7 @@ val open_vbox : int -> unit;; When a new line is printed in the box, [d] is added to the current indentation. *) -val open_hvbox : int -> unit;; +val open_hvbox : int -> unit (** [open_hvbox d] opens a new pretty-printing box with offset [d]. This box is 'horizontal-vertical': it behaves as an @@ -220,7 +220,7 @@ val open_hvbox : int -> unit;; When a new line is printed in the box, [d] is added to the current indentation. *) -val open_hovbox : int -> unit;; +val open_hovbox : int -> unit (** [open_hovbox d] opens a new pretty-printing box with offset [d]. This box is 'horizontal or vertical': break hints @@ -231,13 +231,13 @@ val open_hovbox : int -> unit;; (** {6 Tabulations} *) -val open_tbox : unit -> unit;; +val open_tbox : unit -> unit (** Opens a tabulation box. *) -val close_tbox : unit -> unit;; +val close_tbox : unit -> unit (** Closes the most recently opened tabulation box. *) -val print_tbreak : int -> int -> unit;; +val print_tbreak : int -> int -> unit (** Break hint in a tabulation box. [print_tbreak spaces offset] moves the insertion point to the next tabulation ([spaces] being added to this position). @@ -249,24 +249,24 @@ val print_tbreak : int -> int -> unit;; If a new line is printed, [offset] is added to the current indentation. *) -val set_tab : unit -> unit;; +val set_tab : unit -> unit (** Sets a tabulation mark at the current insertion point. *) -val print_tab : unit -> unit;; +val print_tab : unit -> unit (** [print_tab ()] is equivalent to [print_tbreak 0 0]. *) (** {6 Ellipsis} *) -val set_ellipsis_text : string -> unit;; +val set_ellipsis_text : string -> unit (** Set the text of the ellipsis printed when too many boxes are opened (a single dot, [.], by default). *) -val get_ellipsis_text : unit -> string;; +val get_ellipsis_text : unit -> string (** Return the text of the ellipsis. *) (** {6:tags Semantics Tags} *) -type tag = string;; +type tag = string (** {i Semantics tags} (or simply {e tags}) are used to decorate printed entities for user's defined purposes, e.g. setting font and giving size @@ -315,38 +315,42 @@ type tag = string;; Tag marking and tag printing functions are user definable and can be set by calling [set_formatter_tag_functions]. *) -val open_tag : tag -> unit;; +val open_tag : tag -> unit (** [open_tag t] opens the tag named [t]; the [print_open_tag] function of the formatter is called with [t] as argument; the tag marker [mark_open_tag t] will be flushed into the output device of the formatter. *) -val close_tag : unit -> unit;; +val close_tag : unit -> unit (** [close_tag ()] closes the most recently opened tag [t]. In addition, the [print_close_tag] function of the formatter is called with [t] as argument. The marker [mark_close_tag t] will be flushed into the output device of the formatter. *) -val set_tags : bool -> unit;; +val set_tags : bool -> unit (** [set_tags b] turns on or off the treatment of tags (default is off). *) -val set_print_tags : bool -> unit;; -val set_mark_tags : bool -> unit;; -(** [set_print_tags b] turns on or off the printing of tags, while - [set_mark_tags b] turns on or off the output of tag markers. *) -val get_print_tags : unit -> bool;; -val get_mark_tags : unit -> bool;; -(** Return the current status of tags printing and tags marking. *) + +val set_print_tags : bool -> unit +(**[set_print_tags b] turns on or off the printing of tags. *) + +val set_mark_tags : bool -> unit +(** [set_mark_tags b] turns on or off the output of tag markers. *) + +val get_print_tags : unit -> bool +(** Return the current status of tags printing. *) + +val get_mark_tags : unit -> bool +(** Return the current status of tags marking. *) (** {6 Redirecting the standard formatter output} *) -val set_formatter_out_channel : Pervasives.out_channel -> unit;; +val set_formatter_out_channel : Pervasives.out_channel -> unit (** Redirect the pretty-printer output to the given channel. (All the output functions of the standard formatter are set to the default output functions printing to the given channel.) *) val set_formatter_output_functions : (string -> int -> int -> unit) -> (unit -> unit) -> unit -;; (** [set_formatter_output_functions out flush] redirects the pretty-printer output functions to the functions [out] and [flush]. @@ -362,7 +366,6 @@ val set_formatter_output_functions : val get_formatter_output_functions : unit -> (string -> int -> int -> unit) * (unit -> unit) -;; (** Return the current output functions of the pretty-printer. *) (** {6:meaning Changing the meaning of standard formatter pretty printing} *) @@ -378,9 +381,9 @@ type formatter_out_functions = { out_newline : unit -> unit; out_spaces : int -> unit; } -;; -val set_formatter_out_functions : formatter_out_functions -> unit;; + +val set_formatter_out_functions : formatter_out_functions -> unit (** [set_formatter_out_functions f] Redirect the pretty-printer output to the functions [f.out_string] and [f.out_flush] as described in @@ -397,7 +400,7 @@ val set_formatter_out_functions : formatter_out_functions -> unit;; default values for [f.out_space] and [f.out_newline] are [f.out_string (String.make n ' ') 0 n] and [f.out_string "\n" 0 1]. *) -val get_formatter_out_functions : unit -> formatter_out_functions;; +val get_formatter_out_functions : unit -> formatter_out_functions (** Return the current output functions of the pretty-printer, including line breaking and indentation functions. Useful to record the current setting and restore it afterwards. *) @@ -410,7 +413,6 @@ type formatter_tag_functions = { print_open_tag : tag -> unit; print_close_tag : tag -> unit; } -;; (** The tag handling functions specific to a formatter: [mark] versions are the 'tag marking' functions that associate a string marker to a tag in order for the pretty-printing engine to flush @@ -418,7 +420,7 @@ type formatter_tag_functions = { [print] versions are the 'tag printing' functions that can perform regular printing when a tag is closed or opened. *) -val set_formatter_tag_functions : formatter_tag_functions -> unit;; +val set_formatter_tag_functions : formatter_tag_functions -> unit (** [set_formatter_tag_functions tag_funs] changes the meaning of opening and closing tags to use the functions in [tag_funs]. @@ -434,12 +436,12 @@ val set_formatter_tag_functions : formatter_tag_functions -> unit;; called at tag opening and tag closing time, to output regular material in the pretty-printer queue. *) -val get_formatter_tag_functions : unit -> formatter_tag_functions;; +val get_formatter_tag_functions : unit -> formatter_tag_functions (** Return the current tag functions of the pretty-printer. *) (** {6 Multiple formatted output} *) -type formatter;; +type formatter (** Abstract data corresponding to a pretty-printer (also called a formatter) and all its machinery. @@ -457,40 +459,39 @@ type formatter;; (convenient to output material to strings for instance). *) -val formatter_of_out_channel : out_channel -> formatter;; +val formatter_of_out_channel : out_channel -> formatter (** [formatter_of_out_channel oc] returns a new formatter that writes to the corresponding channel [oc]. *) -val std_formatter : formatter;; +val std_formatter : formatter (** The standard formatter used by the formatting functions above. It is defined as [formatter_of_out_channel stdout]. *) -val err_formatter : formatter;; +val err_formatter : formatter (** A formatter to use with formatting functions below for output to standard error. It is defined as [formatter_of_out_channel stderr]. *) -val formatter_of_buffer : Buffer.t -> formatter;; +val formatter_of_buffer : Buffer.t -> formatter (** [formatter_of_buffer b] returns a new formatter writing to buffer [b]. As usual, the formatter has to be flushed at the end of pretty printing, using [pp_print_flush] or [pp_print_newline], to display all the pending material. *) -val stdbuf : Buffer.t;; +val stdbuf : Buffer.t (** The string buffer in which [str_formatter] writes. *) -val str_formatter : formatter;; +val str_formatter : formatter (** A formatter to use with formatting functions below for output to the [stdbuf] string buffer. [str_formatter] is defined as [formatter_of_buffer stdbuf]. *) -val flush_str_formatter : unit -> string;; +val flush_str_formatter : unit -> string (** Returns the material printed with [str_formatter], flushes the formatter and resets the corresponding buffer. *) val make_formatter : (string -> int -> int -> unit) -> (unit -> unit) -> formatter -;; (** [make_formatter out flush] returns a new formatter that writes according to the output function [out], and the flushing function [flush]. For instance, a formatter to the [Pervasives.out_channel] [oc] is returned by @@ -498,67 +499,66 @@ val make_formatter : (** {6 Basic functions to use with formatters} *) -val pp_open_hbox : formatter -> unit -> unit;; -val pp_open_vbox : formatter -> int -> unit;; -val pp_open_hvbox : formatter -> int -> unit;; -val pp_open_hovbox : formatter -> int -> unit;; -val pp_open_box : formatter -> int -> unit;; -val pp_close_box : formatter -> unit -> unit;; -val pp_open_tag : formatter -> string -> unit;; -val pp_close_tag : formatter -> unit -> unit;; -val pp_print_string : formatter -> string -> unit;; -val pp_print_as : formatter -> int -> string -> unit;; -val pp_print_int : formatter -> int -> unit;; -val pp_print_float : formatter -> float -> unit;; -val pp_print_char : formatter -> char -> unit;; -val pp_print_bool : formatter -> bool -> unit;; -val pp_print_break : formatter -> int -> int -> unit;; -val pp_print_cut : formatter -> unit -> unit;; -val pp_print_space : formatter -> unit -> unit;; -val pp_force_newline : formatter -> unit -> unit;; -val pp_print_flush : formatter -> unit -> unit;; -val pp_print_newline : formatter -> unit -> unit;; -val pp_print_if_newline : formatter -> unit -> unit;; -val pp_open_tbox : formatter -> unit -> unit;; -val pp_close_tbox : formatter -> unit -> unit;; -val pp_print_tbreak : formatter -> int -> int -> unit;; -val pp_set_tab : formatter -> unit -> unit;; -val pp_print_tab : formatter -> unit -> unit;; -val pp_set_tags : formatter -> bool -> unit;; -val pp_set_print_tags : formatter -> bool -> unit;; -val pp_set_mark_tags : formatter -> bool -> unit;; -val pp_get_print_tags : formatter -> unit -> bool;; -val pp_get_mark_tags : formatter -> unit -> bool;; -val pp_set_margin : formatter -> int -> unit;; -val pp_get_margin : formatter -> unit -> int;; -val pp_set_max_indent : formatter -> int -> unit;; -val pp_get_max_indent : formatter -> unit -> int;; -val pp_set_max_boxes : formatter -> int -> unit;; -val pp_get_max_boxes : formatter -> unit -> int;; -val pp_over_max_boxes : formatter -> unit -> bool;; -val pp_set_ellipsis_text : formatter -> string -> unit;; -val pp_get_ellipsis_text : formatter -> unit -> string;; +val pp_open_hbox : formatter -> unit -> unit +val pp_open_vbox : formatter -> int -> unit +val pp_open_hvbox : formatter -> int -> unit +val pp_open_hovbox : formatter -> int -> unit +val pp_open_box : formatter -> int -> unit +val pp_close_box : formatter -> unit -> unit +val pp_open_tag : formatter -> string -> unit +val pp_close_tag : formatter -> unit -> unit +val pp_print_string : formatter -> string -> unit +val pp_print_as : formatter -> int -> string -> unit +val pp_print_int : formatter -> int -> unit +val pp_print_float : formatter -> float -> unit +val pp_print_char : formatter -> char -> unit +val pp_print_bool : formatter -> bool -> unit +val pp_print_break : formatter -> int -> int -> unit +val pp_print_cut : formatter -> unit -> unit +val pp_print_space : formatter -> unit -> unit +val pp_force_newline : formatter -> unit -> unit +val pp_print_flush : formatter -> unit -> unit +val pp_print_newline : formatter -> unit -> unit +val pp_print_if_newline : formatter -> unit -> unit +val pp_open_tbox : formatter -> unit -> unit +val pp_close_tbox : formatter -> unit -> unit +val pp_print_tbreak : formatter -> int -> int -> unit +val pp_set_tab : formatter -> unit -> unit +val pp_print_tab : formatter -> unit -> unit +val pp_set_tags : formatter -> bool -> unit +val pp_set_print_tags : formatter -> bool -> unit +val pp_set_mark_tags : formatter -> bool -> unit +val pp_get_print_tags : formatter -> unit -> bool +val pp_get_mark_tags : formatter -> unit -> bool +val pp_set_margin : formatter -> int -> unit +val pp_get_margin : formatter -> unit -> int +val pp_set_max_indent : formatter -> int -> unit +val pp_get_max_indent : formatter -> unit -> int +val pp_set_max_boxes : formatter -> int -> unit +val pp_get_max_boxes : formatter -> unit -> int +val pp_over_max_boxes : formatter -> unit -> bool +val pp_set_ellipsis_text : formatter -> string -> unit +val pp_get_ellipsis_text : formatter -> unit -> string val pp_set_formatter_out_channel : formatter -> Pervasives.out_channel -> unit -;; + val pp_set_formatter_output_functions : formatter -> (string -> int -> int -> unit) -> (unit -> unit) -> unit -;; + val pp_get_formatter_output_functions : formatter -> unit -> (string -> int -> int -> unit) * (unit -> unit) -;; + val pp_set_formatter_tag_functions : formatter -> formatter_tag_functions -> unit -;; + val pp_get_formatter_tag_functions : formatter -> unit -> formatter_tag_functions -;; + val pp_set_formatter_out_functions : formatter -> formatter_out_functions -> unit -;; + val pp_get_formatter_out_functions : formatter -> unit -> formatter_out_functions -;; (** These functions are the basic ones: usual functions operating on the standard formatter are defined via partial evaluation of these primitives. For instance, @@ -587,7 +587,7 @@ val pp_print_text : formatter -> string -> unit (** {6 [printf] like functions for pretty-printing.} *) -val fprintf : formatter -> ('a, formatter, unit) format -> 'a;; +val fprintf : formatter -> ('a, formatter, unit) format -> 'a (** [fprintf ff fmt arg1 ... argN] formats the arguments [arg1] to [argN] according to the format string [fmt], and outputs the resulting string on @@ -656,13 +656,13 @@ val fprintf : formatter -> ('a, formatter, unit) format -> 'a;; *) -val printf : ('a, formatter, unit) format -> 'a;; +val printf : ('a, formatter, unit) format -> 'a (** Same as [fprintf] above, but output on [std_formatter]. *) -val eprintf : ('a, formatter, unit) format -> 'a;; +val eprintf : ('a, formatter, unit) format -> 'a (** Same as [fprintf] above, but output on [err_formatter]. *) -val sprintf : ('a, unit, string) format -> 'a;; +val sprintf : ('a, unit, string) format -> 'a (** Same as [printf] above, but instead of printing on a formatter, returns a string containing the result of formatting the arguments. Note that the pretty-printer queue is flushed at the end of {e each @@ -678,7 +678,7 @@ val sprintf : ('a, unit, string) format -> 'a;; pretty-printing returns the desired string. *) -val asprintf : ('a, formatter, unit, string) format4 -> 'a;; +val asprintf : ('a, formatter, unit, string) format4 -> 'a (** Same as [printf] above, but instead of printing on a formatter, returns a string containing the result of formatting the arguments. The type of [asprintf] is general enough to interact nicely with [%a] @@ -686,7 +686,7 @@ val asprintf : ('a, formatter, unit, string) format4 -> 'a;; @since 4.01.0 *) -val ifprintf : formatter -> ('a, formatter, unit) format -> 'a;; +val ifprintf : formatter -> ('a, formatter, unit) format -> 'a (** Same as [fprintf] above, but does not print anything. Useful to ignore some material when conditionally printing. @since 3.10.0 @@ -696,19 +696,17 @@ val ifprintf : formatter -> ('a, formatter, unit) format -> 'a;; val kfprintf : (formatter -> 'a) -> formatter -> ('b, formatter, unit, 'a) format4 -> 'b -;; (** Same as [fprintf] above, but instead of returning immediately, passes the formatter to its first argument at the end of printing. *) val ikfprintf : (formatter -> 'a) -> formatter -> ('b, formatter, unit, 'a) format4 -> 'b -;; (** Same as [kfprintf] above, but does not print anything. Useful to ignore some material when conditionally printing. @since 3.12.0 *) -val ksprintf : (string -> 'a) -> ('b, unit, string, 'a) format4 -> 'b;; +val ksprintf : (string -> 'a) -> ('b, unit, string, 'a) format4 -> 'b (** Same as [sprintf] above, but instead of returning the string, passes it to the first argument. *) @@ -716,7 +714,6 @@ val ksprintf : (string -> 'a) -> ('b, unit, string, 'a) format4 -> 'b;; val bprintf : Buffer.t -> ('a, formatter, unit) format -> 'a [@@ocaml.deprecated] -;; (** @deprecated This function is error prone. Do not use it. If you need to print to some buffer [b], you must first define a @@ -725,7 +722,6 @@ val bprintf : Buffer.t -> ('a, formatter, unit) format -> 'a val kprintf : (string -> 'a) -> ('b, unit, string, 'a) format4 -> 'b [@@ocaml.deprecated "Use Format.ksprintf instead."] -;; (** @deprecated An alias for [ksprintf]. *) val set_all_formatter_output_functions : @@ -735,9 +731,7 @@ val set_all_formatter_output_functions : spaces:(int -> unit) -> unit [@@ocaml.deprecated "Use Format.set_formatter_out_functions instead."] -;; -(** @deprecated Subsumed by [set_formatter_out_functions]. -*) +(** @deprecated Subsumed by [set_formatter_out_functions]. *) val get_all_formatter_output_functions : unit -> @@ -746,22 +740,17 @@ val get_all_formatter_output_functions : (unit -> unit) * (int -> unit) [@@ocaml.deprecated "Use Format.get_formatter_out_functions instead."] -;; -(** @deprecated Subsumed by [get_formatter_out_functions]. -*) +(** @deprecated Subsumed by [get_formatter_out_functions]. *) + val pp_set_all_formatter_output_functions : formatter -> out:(string -> int -> int -> unit) -> flush:(unit -> unit) -> newline:(unit -> unit) -> spaces:(int -> unit) -> unit [@@ocaml.deprecated "Use Format.pp_set_formatter_out_functions instead."] -;; -(** @deprecated Subsumed by [pp_set_formatter_out_functions]. -*) +(** @deprecated Subsumed by [pp_set_formatter_out_functions]. *) val pp_get_all_formatter_output_functions : formatter -> unit -> (string -> int -> int -> unit) * (unit -> unit) * (unit -> unit) * (int -> unit) [@@ocaml.deprecated "Use Format.pp_get_formatter_out_functions instead."] -;; -(** @deprecated Subsumed by [pp_get_formatter_out_functions]. -*) +(** @deprecated Subsumed by [pp_get_formatter_out_functions]. *) diff --git a/stdlib/gc.mli b/stdlib/gc.mli index f86a1e68..a37edc67 100644 --- a/stdlib/gc.mli +++ b/stdlib/gc.mli @@ -113,8 +113,8 @@ type control = - [0x020] Change of GC parameters. - [0x040] Computation of major GC slice size. - [0x080] Calling of finalisation functions. - - [0x100] Bytecode executable search at start-up. - - [0x200] Computation of compaction triggering condition. + - [0x100] Bytecode executable and shared library search at start-up. + - [0x200] Computation of compaction-triggering condition. Default: 0. *) mutable max_overhead : int; @@ -221,9 +221,10 @@ val finalise : ('a -> unit) -> 'a -> unit Anything reachable from the closure of finalisation functions is considered reachable, so the following code will not work as expected: - - [ let v = ... in Gc.finalise (fun x -> ...) v ] + - [ let v = ... in Gc.finalise (fun x -> ... v ...) v ] - Instead you should write: + Instead you should make sure that [v] is not in the closure of + the finalisation function by writing: - [ let f = fun x -> ... ;; let v = ... in Gc.finalise f v ] diff --git a/stdlib/hashtbl.mli b/stdlib/hashtbl.mli index 0c3e4999..386f5a6c 100644 --- a/stdlib/hashtbl.mli +++ b/stdlib/hashtbl.mli @@ -345,7 +345,9 @@ val hash_param : int -> int -> 'a -> int hashing. Hashing performs a breadth-first, left-to-right traversal of the structure [x], stopping after [meaningful] meaningful nodes were encountered, or [total] nodes (meaningful or not) were - encountered. Meaningful nodes are: integers; floating-point + encountered. If [total] as specified by the user exceeds a certain + value, currently 256, then it is capped to that value. + Meaningful nodes are: integers; floating-point numbers; strings; characters; booleans; and constant constructors. Larger values of [meaningful] and [total] means that more nodes are taken into account to compute the final hash value, diff --git a/stdlib/header.c b/stdlib/header.c index cb3d9953..b8d02ea1 100644 --- a/stdlib/header.c +++ b/stdlib/header.c @@ -23,8 +23,8 @@ #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> -#include "../byterun/mlvalues.h" -#include "../byterun/exec.h" +#include "../byterun/caml/mlvalues.h" +#include "../byterun/caml/exec.h" char * default_runtime_path = RUNTIME_NAME; @@ -40,7 +40,7 @@ char * default_runtime_path = RUNTIME_NAME; #define SEEK_END 2 #endif -#ifndef __CYGWIN32__ +#ifndef __CYGWIN__ /* Normal Unix search path function */ diff --git a/stdlib/headernt.c b/stdlib/headernt.c index aa113ac9..e95223db 100644 --- a/stdlib/headernt.c +++ b/stdlib/headernt.c @@ -15,8 +15,8 @@ #define WIN32_LEAN_AND_MEAN #include <windows.h> -#include "mlvalues.h" -#include "exec.h" +#include "caml/mlvalues.h" +#include "caml/exec.h" #ifndef __MINGW32__ #pragma comment(linker , "/entry:headerentry") diff --git a/stdlib/list.mli b/stdlib/list.mli index 5b88f229..93219597 100644 --- a/stdlib/list.mli +++ b/stdlib/list.mli @@ -279,7 +279,8 @@ val fast_sort : ('a -> 'a -> int) -> 'a list -> 'a list on typical input. *) val sort_uniq : ('a -> 'a -> int) -> 'a list -> 'a list -(** Same as {!List.sort}, but also remove duplicates. *) +(** Same as {!List.sort}, but also remove duplicates. + @since 4.02.0 *) val merge : ('a -> 'a -> int) -> 'a list -> 'a list -> 'a list (** Merge two lists: diff --git a/stdlib/listLabels.mli b/stdlib/listLabels.mli index 8cf65147..7404fd00 100644 --- a/stdlib/listLabels.mli +++ b/stdlib/listLabels.mli @@ -50,7 +50,7 @@ val append : 'a list -> 'a list -> 'a list operator is not tail-recursive either. *) val rev_append : 'a list -> 'a list -> 'a list -(** [List.rev_append l1 l2] reverses [l1] and concatenates it to [l2]. +(** [ListLabels.rev_append l1 l2] reverses [l1] and concatenates it to [l2]. This is equivalent to {!ListLabels.rev}[ l1 @ l2], but [rev_append] is tail-recursive and more efficient. *) @@ -69,40 +69,40 @@ val flatten : 'a list list -> 'a list val iter : f:('a -> unit) -> 'a list -> unit -(** [List.iter f [a1; ...; an]] applies function [f] in turn to +(** [ListLabels.iter f [a1; ...; an]] applies function [f] in turn to [a1; ...; an]. It is equivalent to [begin f a1; f a2; ...; f an; () end]. *) val iteri : f:(int -> 'a -> unit) -> 'a list -> unit -(** Same as {!List.iter}, but the function is applied to the index of +(** Same as {!ListLabels.iter}, but the function is applied to the index of the element as first argument (counting from 0), and the element itself as second argument. @since 4.00.0 *) val map : f:('a -> 'b) -> 'a list -> 'b list -(** [List.map f [a1; ...; an]] applies function [f] to [a1, ..., an], +(** [ListLabels.map f [a1; ...; an]] applies function [f] to [a1, ..., an], and builds the list [[f a1; ...; f an]] with the results returned by [f]. Not tail-recursive. *) val mapi : f:(int -> 'a -> 'b) -> 'a list -> 'b list -(** Same as {!List.map}, but the function is applied to the index of +(** Same as {!ListLabels.map}, but the function is applied to the index of the element as first argument (counting from 0), and the element itself as second argument. @since 4.00.0 *) val rev_map : f:('a -> 'b) -> 'a list -> 'b list -(** [List.rev_map f l] gives the same result as +(** [ListLabels.rev_map f l] gives the same result as {!ListLabels.rev}[ (]{!ListLabels.map}[ f l)], but is tail-recursive and more efficient. *) val fold_left : f:('a -> 'b -> 'a) -> init:'a -> 'b list -> 'a -(** [List.fold_left f a [b1; ...; bn]] is +(** [ListLabels.fold_left f a [b1; ...; bn]] is [f (... (f (f a b1) b2) ...) bn]. *) val fold_right : f:('a -> 'b -> 'b) -> 'a list -> init:'b -> 'b -(** [List.fold_right f [a1; ...; an] b] is +(** [ListLabels.fold_right f [a1; ...; an] b] is [f a1 (f a2 (... (f an b) ...))]. Not tail-recursive. *) @@ -110,32 +110,32 @@ val fold_right : f:('a -> 'b -> 'b) -> 'a list -> init:'b -> 'b val iter2 : f:('a -> 'b -> unit) -> 'a list -> 'b list -> unit -(** [List.iter2 f [a1; ...; an] [b1; ...; bn]] calls in turn +(** [ListLabels.iter2 f [a1; ...; an] [b1; ...; bn]] calls in turn [f a1 b1; ...; f an bn]. Raise [Invalid_argument] if the two lists have different lengths. *) val map2 : f:('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list -(** [List.map2 f [a1; ...; an] [b1; ...; bn]] is +(** [ListLabels.map2 f [a1; ...; an] [b1; ...; bn]] is [[f a1 b1; ...; f an bn]]. Raise [Invalid_argument] if the two lists have different lengths. Not tail-recursive. *) val rev_map2 : f:('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list -(** [List.rev_map2 f l1 l2] gives the same result as +(** [ListLabels.rev_map2 f l1 l2] gives the same result as {!ListLabels.rev}[ (]{!ListLabels.map2}[ f l1 l2)], but is tail-recursive and more efficient. *) val fold_left2 : f:('a -> 'b -> 'c -> 'a) -> init:'a -> 'b list -> 'c list -> 'a -(** [List.fold_left2 f a [b1; ...; bn] [c1; ...; cn]] is +(** [ListLabels.fold_left2 f a [b1; ...; bn] [c1; ...; cn]] is [f (... (f (f a b1 c1) b2 c2) ...) bn cn]. Raise [Invalid_argument] if the two lists have different lengths. *) val fold_right2 : f:('a -> 'b -> 'c -> 'c) -> 'a list -> 'b list -> init:'c -> 'c -(** [List.fold_right2 f [a1; ...; an] [b1; ...; bn] c] is +(** [ListLabels.fold_right2 f [a1; ...; an] [b1; ...; bn] c] is [f a1 b1 (f a2 b2 (... (f an bn c) ...))]. Raise [Invalid_argument] if the two lists have different lengths. Not tail-recursive. *) @@ -259,7 +259,7 @@ val sort : cmp:('a -> 'a -> int) -> 'a list -> 'a list a complete specification). For example, {!Pervasives.compare} is a suitable comparison function. The resulting list is sorted in increasing order. - [List.sort] is guaranteed to run in constant heap space + [ListLabels.sort] is guaranteed to run in constant heap space (in addition to the size of the result list) and logarithmic stack space. @@ -277,8 +277,8 @@ val stable_sort : cmp:('a -> 'a -> int) -> 'a list -> 'a list *) val fast_sort : cmp:('a -> 'a -> int) -> 'a list -> 'a list -(** Same as {!List.sort} or {!List.stable_sort}, whichever is faster - on typical input. *) +(** Same as {!ListLabels.sort} or {!ListLabels.stable_sort}, whichever is + faster on typical input. *) val merge : cmp:('a -> 'a -> int) -> 'a list -> 'a list -> 'a list (** Merge two lists: diff --git a/stdlib/marshal.mli b/stdlib/marshal.mli index 9dfdd162..4f0ed49b 100644 --- a/stdlib/marshal.mli +++ b/stdlib/marshal.mli @@ -114,7 +114,8 @@ external to_bytes : (** [Marshal.to_bytes v flags] returns a byte sequence containing the representation of [v]. The [flags] argument has the same meaning as for - {!Marshal.to_channel}. *) + {!Marshal.to_channel}. + @since 4.02.0 *) external to_string : 'a -> extern_flags list -> string = "caml_output_value_to_string" @@ -141,7 +142,8 @@ val from_bytes : bytes -> int -> 'a like {!Marshal.from_channel} does, except that the byte representation is not read from a channel, but taken from the byte sequence [buff], starting at position [ofs]. - The byte sequence is not mutated. *) + The byte sequence is not mutated. + @since 4.02.0 *) val from_string : string -> int -> 'a (** Same as [from_bytes] but take a string as argument instead of a diff --git a/stdlib/obj.ml b/stdlib/obj.ml index ac9695cd..5cb970b8 100644 --- a/stdlib/obj.ml +++ b/stdlib/obj.ml @@ -37,6 +37,9 @@ let marshal (obj : t) = let unmarshal str pos = (Marshal.from_bytes str pos, pos + Marshal.total_size str pos) +let first_non_constant_constructor_tag = 0 +let last_non_constant_constructor_tag = 245 + let lazy_tag = 246 let closure_tag = 247 let object_tag = 248 diff --git a/stdlib/obj.mli b/stdlib/obj.mli index 3395fa86..6d06312b 100644 --- a/stdlib/obj.mli +++ b/stdlib/obj.mli @@ -36,6 +36,9 @@ external truncate : t -> int -> unit = "caml_obj_truncate" external add_offset : t -> Int32.t -> t = "caml_obj_add_offset" (* @since 3.12.0 *) +val first_non_constant_constructor_tag : int +val last_non_constant_constructor_tag : int + val lazy_tag : int val closure_tag : int val object_tag : int diff --git a/stdlib/pervasives.mli b/stdlib/pervasives.mli index 64138291..f2b684ff 100644 --- a/stdlib/pervasives.mli +++ b/stdlib/pervasives.mli @@ -147,39 +147,55 @@ external ( or ) : bool -> bool -> bool = "%sequor" external __LOC__ : string = "%loc_LOC" (** [__LOC__] returns the location at which this expression appears in the file currently being parsed by the compiler, with the standard - error format of OCaml: "File %S, line %d, characters %d-%d" *) + error format of OCaml: "File %S, line %d, characters %d-%d". + @since 4.02.0 + *) external __FILE__ : string = "%loc_FILE" (** [__FILE__] returns the name of the file currently being - parsed by the compiler. *) + parsed by the compiler. + @since 4.02.0 +*) external __LINE__ : int = "%loc_LINE" (** [__LINE__] returns the line number at which this expression - appears in the file currently being parsed by the compiler. *) + appears in the file currently being parsed by the compiler. + @since 4.02.0 + *) external __MODULE__ : string = "%loc_MODULE" (** [__MODULE__] returns the module name of the file being - parsed by the compiler. *) + parsed by the compiler. + @since 4.02.0 + *) external __POS__ : string * int * int * int = "%loc_POS" (** [__POS__] returns a tuple [(file,lnum,cnum,enum)], corresponding to the location at which this expression appears in the file currently being parsed by the compiler. [file] is the current filename, [lnum] the line number, [cnum] the character position in - the line and [enum] the last character position in the line. *) + the line and [enum] the last character position in the line. + @since 4.02.0 + *) external __LOC_OF__ : 'a -> string * 'a = "%loc_LOC" (** [__LOC_OF__ expr] returns a pair [(loc, expr)] where [loc] is the location of [expr] in the file currently being parsed by the compiler, with the standard error format of OCaml: "File %S, line - %d, characters %d-%d" *) + %d, characters %d-%d". + @since 4.02.0 + *) external __LINE_OF__ : 'a -> int * 'a = "%loc_LINE" (** [__LINE__ expr] returns a pair [(line, expr)], where [line] is the line number at which the expression [expr] appears in the file - currently being parsed by the compiler. *) + currently being parsed by the compiler. + @since 4.02.0 + *) external __POS_OF__ : 'a -> (string * int * int * int) * 'a = "%loc_POS" -(** [__POS_OF__ expr] returns a pair [(expr,loc)], where [loc] is a +(** [__POS_OF__ expr] returns a pair [(loc,expr)], where [loc] is a tuple [(file,lnum,cnum,enum)] corresponding to the location at which the expression [expr] appears in the file currently being parsed by the compiler. [file] is the current filename, [lnum] the line number, [cnum] the character position in the line and [enum] - the last character position in the line. *) + the last character position in the line. + @since 4.02.0 + *) (** {6 Composition operators} *) @@ -594,7 +610,8 @@ val print_string : string -> unit (** Print a string on standard output. *) val print_bytes : bytes -> unit -(** Print a byte sequence on standard output. *) +(** Print a byte sequence on standard output. + @since 4.02.0 *) val print_int : int -> unit (** Print an integer, in decimal, on standard output. *) @@ -621,7 +638,8 @@ val prerr_string : string -> unit (** Print a string on standard error. *) val prerr_bytes : bytes -> unit -(** Print a byte sequence on standard error. *) +(** Print a byte sequence on standard error. + @since 4.02.0 *) val prerr_int : int -> unit (** Print an integer, in decimal, on standard error. *) @@ -708,7 +726,8 @@ val output_string : out_channel -> string -> unit (** Write the string on the given output channel. *) val output_bytes : out_channel -> bytes -> unit -(** Write the byte sequence on the given output channel. *) +(** Write the byte sequence on the given output channel. + @since 4.02.0 *) val output : out_channel -> bytes -> int -> int -> unit (** [output oc buf pos len] writes [len] characters from byte sequence [buf], @@ -718,7 +737,8 @@ val output : out_channel -> bytes -> int -> int -> unit val output_substring : out_channel -> string -> int -> int -> unit (** Same as [output] but take a string as argument instead of - a byte sequence. *) + a byte sequence. + @since 4.02.0 *) val output_byte : out_channel -> int -> unit (** Write one 8-bit integer (as the single character with that code) @@ -838,7 +858,8 @@ val really_input_string : in_channel -> int -> string (** [really_input_string ic len] reads [len] characters from channel [ic] and returns them in a new string. Raise [End_of_file] if the end of file is reached before [len] - characters have been read. *) + characters have been read. + @since 4.02.0 *) val input_byte : in_channel -> int (** Same as {!Pervasives.input_char}, but return the 8-bit integer representing diff --git a/stdlib/printexc.mli b/stdlib/printexc.mli index 6bffe174..c347b991 100644 --- a/stdlib/printexc.mli +++ b/stdlib/printexc.mli @@ -145,7 +145,11 @@ val set_uncaught_exception_handler: (exn -> raw_backtrace -> unit) -> unit {!Pervasives.at_exit} have already been called. Because of this you must make sure any output channel [fn] writes on is flushed. - If [fn] raises an exception, it is ignored. + Also note that exceptions raised by user code in the interactive toplevel + are not passed to this function as they are caught by the toplevel itself. + + If [fn] raises an exception, both the exceptions passed to [fn] and raised + by [fn] will be printed with their respective backtrace. @since 4.02.0 *) @@ -177,6 +181,8 @@ val backtrace_slots : raw_backtrace -> backtrace_slot array option debug information ([-g]) - the program is a bytecode program that has not been linked with debug information enabled ([ocamlc -g]) + + @since 4.02.0 *) type location = { @@ -243,6 +249,8 @@ type raw_backtrace_slot elements are equal, then they represent the same source location (the converse is not necessarily true in presence of inlining, for example). + + @since 4.02.0 *) val raw_backtrace_length : raw_backtrace -> int diff --git a/stdlib/printf.mli b/stdlib/printf.mli index 4a725665..573414ec 100644 --- a/stdlib/printf.mli +++ b/stdlib/printf.mli @@ -136,7 +136,7 @@ val ifprintf : 'a -> ('b, 'a, unit) format -> 'b (** Formatted output functions with continuations. *) val kfprintf : (out_channel -> 'a) -> out_channel -> - ('b, out_channel, unit, 'a) format4 -> 'b;; + ('b, out_channel, unit, 'a) format4 -> 'b (** Same as [fprintf], but instead of returning immediately, passes the out channel to its first argument at the end of printing. @since 3.09.0 @@ -144,20 +144,19 @@ val kfprintf : (out_channel -> 'a) -> out_channel -> val ikfprintf : (out_channel -> 'a) -> out_channel -> ('b, out_channel, unit, 'a) format4 -> 'b -;; (** Same as [kfprintf] above, but does not print anything. Useful to ignore some material when conditionally printing. @since 4.0 *) -val ksprintf : (string -> 'a) -> ('b, unit, string, 'a) format4 -> 'b;; +val ksprintf : (string -> 'a) -> ('b, unit, string, 'a) format4 -> 'b (** Same as [sprintf] above, but instead of returning the string, passes it to the first argument. @since 3.09.0 *) val kbprintf : (Buffer.t -> 'a) -> Buffer.t -> - ('b, Buffer.t, unit, 'a) format4 -> 'b;; + ('b, Buffer.t, unit, 'a) format4 -> 'b (** Same as [bprintf], but instead of returning immediately, passes the buffer to its first argument at the end of printing. @since 3.10.0 diff --git a/stdlib/scanf.ml b/stdlib/scanf.ml index 1372c41a..08fc9aba 100644 --- a/stdlib/scanf.ml +++ b/stdlib/scanf.ml @@ -1029,6 +1029,7 @@ fun k fmt -> match fmt with | Flush rest -> take_format_readers k rest | String_literal (_, rest) -> take_format_readers k rest | Char_literal (_, rest) -> take_format_readers k rest + | Custom (_, _, rest) -> take_format_readers k rest | Scan_char_set (_, _, rest) -> take_format_readers k rest | Scan_get_counter (_, rest) -> take_format_readers k rest @@ -1068,6 +1069,7 @@ fun k fmtty fmt -> match fmtty with | Bool_ty rest -> take_fmtty_format_readers k rest fmt | Alpha_ty rest -> take_fmtty_format_readers k rest fmt | Theta_ty rest -> take_fmtty_format_readers k rest fmt + | Any_ty rest -> take_fmtty_format_readers k rest fmt | Format_arg_ty (_, rest) -> take_fmtty_format_readers k rest fmt | End_of_fmtty -> take_format_readers k fmt | Format_subst_ty (ty1, ty2, rest) -> @@ -1125,6 +1127,12 @@ fun ib fmt readers -> match fmt with let scan width _ ib = scan_string (Some stp) width ib in let str_rest = String_literal (str, rest) in pad_prec_scanf ib str_rest readers pad No_precision scan token_string + | String (pad, Formatting_gen (Open_tag (Format (fmt', _)), rest)) -> + let scan width _ ib = scan_string (Some '{') width ib in + pad_prec_scanf ib (concat_fmt fmt' rest) readers pad No_precision scan token_string + | String (pad, Formatting_gen (Open_box (Format (fmt', _)), rest)) -> + let scan width _ ib = scan_string (Some '[') width ib in + pad_prec_scanf ib (concat_fmt fmt' rest) readers pad No_precision scan token_string | String (pad, rest) -> let scan width _ ib = scan_string None width ib in pad_prec_scanf ib rest readers pad No_precision scan token_string @@ -1163,6 +1171,8 @@ fun ib fmt readers -> match fmt with invalid_arg "scanf: bad conversion \"%a\"" | Theta _ -> invalid_arg "scanf: bad conversion \"%t\"" + | Custom _ -> + invalid_arg "scanf: bad conversion \"%?\" (custom converter)" | Reader fmt_rest -> let Cons (reader, readers_rest) = readers in let x = reader ib in diff --git a/stdlib/scanf.mli b/stdlib/scanf.mli index 297d6f2d..f065c461 100644 --- a/stdlib/scanf.mli +++ b/stdlib/scanf.mli @@ -83,7 +83,7 @@ module Scanning : sig -type in_channel;; +type in_channel (** The notion of input channel for the [Scanf] module: those channels provide all the machinery necessary to read from a given [Pervasives.in_channel] value. @@ -93,7 +93,7 @@ type in_channel;; @since 3.12.0 *) -type scanbuf = in_channel;; +type scanbuf = in_channel (** The type of scanning buffers. A scanning buffer is the source from which a formatted input function gets characters. The scanning buffer holds the current state of the scan, plus a function to get the next char from the @@ -105,7 +105,7 @@ type scanbuf = in_channel;; character yet to be read. *) -val stdin : in_channel;; +val stdin : in_channel (** The standard input notion for the [Scanf] module. [Scanning.stdin] is the formatted input channel attached to [Pervasives.stdin]. @@ -118,12 +118,12 @@ val stdin : in_channel;; @since 3.12.0 *) -type file_name = string;; +type file_name = string (** A convenient alias to designate a file name. @since 4.00.0 *) -val open_in : file_name -> in_channel;; +val open_in : file_name -> in_channel (** [Scanning.open_in fname] returns a formatted input channel for bufferized reading in text mode from file [fname]. @@ -135,31 +135,32 @@ val open_in : file_name -> in_channel;; @since 3.12.0 *) -val open_in_bin : file_name -> in_channel;; +val open_in_bin : file_name -> in_channel (** [Scanning.open_in_bin fname] returns a formatted input channel for bufferized reading in binary mode from file [fname]. @since 3.12.0 *) -val close_in : in_channel -> unit;; +val close_in : in_channel -> unit (** Closes the [Pervasives.in_channel] associated with the given [Scanning.in_channel] formatted input channel. @since 3.12.0 *) -val from_file : file_name -> in_channel;; +val from_file : file_name -> in_channel (** An alias for [open_in] above. *) -val from_file_bin : string -> in_channel;; + +val from_file_bin : string -> in_channel (** An alias for [open_in_bin] above. *) -val from_string : string -> in_channel;; +val from_string : string -> in_channel (** [Scanning.from_string s] returns a formatted input channel which reads from the given string. Reading starts from the first character in the string. The end-of-input condition is set when the end of the string is reached. *) -val from_function : (unit -> char) -> in_channel;; +val from_function : (unit -> char) -> in_channel (** [Scanning.from_function f] returns a formatted input channel with the given function as its reading method. @@ -169,39 +170,39 @@ val from_function : (unit -> char) -> in_channel;; end-of-input condition by raising the exception [End_of_file]. *) -val from_channel : Pervasives.in_channel -> in_channel;; +val from_channel : Pervasives.in_channel -> in_channel (** [Scanning.from_channel ic] returns a formatted input channel which reads from the regular input channel [ic] argument, starting at the current reading position. *) -val end_of_input : in_channel -> bool;; +val end_of_input : in_channel -> bool (** [Scanning.end_of_input ic] tests the end-of-input condition of the given formatted input channel. *) -val beginning_of_input : in_channel -> bool;; +val beginning_of_input : in_channel -> bool (** [Scanning.beginning_of_input ic] tests the beginning of input condition of the given formatted input channel. *) -val name_of_input : in_channel -> string;; +val name_of_input : in_channel -> string (** [Scanning.name_of_input ic] returns the name of the character source for the formatted input channel [ic]. @since 3.09.0 *) -val stdib : in_channel;; +val stdib : in_channel (** A deprecated alias for [Scanning.stdin], the scanning buffer reading from [Pervasives.stdin]. *) -end;; +end (** {6 Type of formatted input functions} *) type ('a, 'b, 'c, 'd) scanner = - ('a, Scanning.in_channel, 'b, 'c, 'a -> 'd, 'd) format6 -> 'c;; + ('a, Scanning.in_channel, 'b, 'c, 'a -> 'd, 'd) format6 -> 'c (** The type of formatted input scanners: [('a, 'b, 'c, 'd) scanner] is the type of a formatted input function that reads from some formatted input channel according to some format string; more @@ -223,14 +224,14 @@ type ('a, 'b, 'c, 'd) scanner = @since 3.10.0 *) -exception Scan_failure of string;; +exception Scan_failure of string (** The exception that formatted input functions raise when the input cannot be read according to the given format. *) (** {6 The general formatted input function} *) -val bscanf : Scanning.in_channel -> ('a, 'b, 'c, 'd) scanner;; +val bscanf : Scanning.in_channel -> ('a, 'b, 'c, 'd) scanner (** [bscanf ic fmt r1 ... rN f] reads arguments for the function [f], from the formatted input channel [ic], according to the format string [fmt], and applies [f] to these values. @@ -453,7 +454,7 @@ val bscanf : Scanning.in_channel -> ('a, 'b, 'c, 'd) scanner;; (** {6 Specialised formatted input functions} *) -val fscanf : Pervasives.in_channel -> ('a, 'b, 'c, 'd) scanner;; +val fscanf : Pervasives.in_channel -> ('a, 'b, 'c, 'd) scanner (** Same as {!Scanf.bscanf}, but reads from the given regular input channel. Warning: since all formatted input functions operate from a {e formatted @@ -467,17 +468,17 @@ val fscanf : Pervasives.in_channel -> ('a, 'b, 'c, 'd) scanner;; scanning from the same regular input channel. *) -val sscanf : string -> ('a, 'b, 'c, 'd) scanner;; +val sscanf : string -> ('a, 'b, 'c, 'd) scanner (** Same as {!Scanf.bscanf}, but reads from the given string. *) -val scanf : ('a, 'b, 'c, 'd) scanner;; +val scanf : ('a, 'b, 'c, 'd) scanner (** Same as {!Scanf.bscanf}, but reads from the predefined formatted input channel {!Scanf.Scanning.stdin} that is connected to [Pervasives.stdin]. *) val kscanf : Scanning.in_channel -> (Scanning.in_channel -> exn -> 'd) -> - ('a, 'b, 'c, 'd) scanner;; + ('a, 'b, 'c, 'd) scanner (** Same as {!Scanf.bscanf}, but takes an additional function argument [ef] that is called in case of error: if the scanning process or some conversion fails, the scanning function aborts and calls the @@ -488,18 +489,20 @@ val kscanf : val ksscanf : string -> (Scanning.in_channel -> exn -> 'd) -> ('a, 'b, 'c, 'd) scanner -(** Same as {!Scanf.kscanf} but reads from the given string. *) +(** Same as {!Scanf.kscanf} but reads from the given string. + @since 4.02.0 *) val kfscanf : Pervasives.in_channel -> (Scanning.in_channel -> exn -> 'd) -> ('a, 'b, 'c, 'd) scanner -(** Same as {!Scanf.kscanf}, but reads from the given regular input channel. *) +(** Same as {!Scanf.kscanf}, but reads from the given regular input channel. + @since 4.02.0 *) (** {6 Reading format strings from input} *) val bscanf_format : Scanning.in_channel -> ('a, 'b, 'c, 'd, 'e, 'f) format6 -> - (('a, 'b, 'c, 'd, 'e, 'f) format6 -> 'g) -> 'g;; + (('a, 'b, 'c, 'd, 'e, 'f) format6 -> 'g) -> 'g (** [bscanf_format ic fmt f] reads a format string token from the formatted input channel [ic], according to the given format string [fmt], and applies [f] to the resulting format string value. @@ -510,14 +513,14 @@ val bscanf_format : val sscanf_format : string -> ('a, 'b, 'c, 'd, 'e, 'f) format6 -> - (('a, 'b, 'c, 'd, 'e, 'f) format6 -> 'g) -> 'g;; + (('a, 'b, 'c, 'd, 'e, 'f) format6 -> 'g) -> 'g (** Same as {!Scanf.bscanf_format}, but reads from the given string. @since 3.09.0 *) val format_from_string : string -> - ('a, 'b, 'c, 'd, 'e, 'f) format6 -> ('a, 'b, 'c, 'd, 'e, 'f) format6;; + ('a, 'b, 'c, 'd, 'e, 'f) format6 -> ('a, 'b, 'c, 'd, 'e, 'f) format6 (** [format_from_string s fmt] converts a string argument to a format string, according to the given format string [fmt]. Raise [Scan_failure] if [s], considered as a format string, does not @@ -525,7 +528,7 @@ val format_from_string : @since 3.10.0 *) -val unescaped : string -> string;; +val unescaped : string -> string (** Return a copy of the argument with escape sequences, following the lexical conventions of OCaml, replaced by their corresponding special characters. If there is no escape sequence in the diff --git a/stdlib/stream.mli b/stdlib/stream.mli index 85a84610..1957cf60 100644 --- a/stdlib/stream.mli +++ b/stdlib/stream.mli @@ -47,7 +47,8 @@ val of_string : string -> char t (** Return the stream of the characters of the string parameter. *) val of_bytes : bytes -> char t -(** Return the stream of the characters of the bytes parameter. *) +(** Return the stream of the characters of the bytes parameter. + @since 4.02.0 *) val of_channel : in_channel -> char t (** Return the stream of the characters read from the input channel. *) diff --git a/testsuite/makefiles/Makefile.one b/testsuite/makefiles/Makefile.one index 9f95b365..11c227ee 100644 --- a/testsuite/makefiles/Makefile.one +++ b/testsuite/makefiles/Makefile.one @@ -48,7 +48,8 @@ compile: $(ML_FILES) $(CMO_FILES) $(MAIN_MODULE).cmo @if $(BYTECODE_ONLY); then : ; else \ rm -f program.native program.native.exe; \ $(MAKE) $(CMX_FILES) $(MAIN_MODULE).cmx; \ - $(OCAMLOPT) $(ADD_COMPFLAGS) -o program.native$(EXE) $(O_FILES) \ + $(OCAMLOPT) $(ADD_COMPFLAGS) $(ADD_OPTCOMPFLAGS) \ + -o program.native$(EXE) $(O_FILES) \ $(CMXA_FILES) $(CMX_FILES) $(ADD_CMX_FILES) \ $(MAIN_MODULE).cmx; \ fi diff --git a/testsuite/makefiles/Makefile.toplevel b/testsuite/makefiles/Makefile.toplevel index 46acb3d7..284465fe 100644 --- a/testsuite/makefiles/Makefile.toplevel +++ b/testsuite/makefiles/Makefile.toplevel @@ -12,10 +12,10 @@ default: @for file in *.ml; do \ - $(OCAML) $(TOPFLAGS) <$$file 2>&1 \ + TERM=dumb $(OCAML) $(TOPFLAGS) <$$file 2>&1 \ | grep -v '^ OCaml version' > $$file.result; \ if [ -f $$file.principal.reference ]; then \ - $(OCAML) $(TOPFLAGS) -principal <$$file 2>&1 \ + TERM=dumb $(OCAML) $(TOPFLAGS) -principal <$$file 2>&1 \ | grep -v '^ OCaml version' > $$file.principal.result; \ fi; \ done diff --git a/testsuite/tests/asmcomp/mainarith.c b/testsuite/tests/asmcomp/mainarith.c index d102c16d..94ff371e 100644 --- a/testsuite/tests/asmcomp/mainarith.c +++ b/testsuite/tests/asmcomp/mainarith.c @@ -16,7 +16,7 @@ #include <stdlib.h> #include <string.h> -#include "../../../byterun/config.h" +#include "../../../byterun/caml/config.h" #define FMT ARCH_INTNAT_PRINTF_FORMAT void caml_ml_array_bound_error(void) diff --git a/testsuite/tests/asmcomp/sparc.S b/testsuite/tests/asmcomp/sparc.S index ea029573..f2b9ce20 100644 --- a/testsuite/tests/asmcomp/sparc.S +++ b/testsuite/tests/asmcomp/sparc.S @@ -10,7 +10,7 @@ /* */ /***********************************************************************/ -#if defined(SYS_solaris) || defined(SYS_elf) +#if defined(SYS_solaris) || defined(SYS_linux) #define Call_gen_code call_gen_code #define Caml_c_call caml_c_call #else diff --git a/testsuite/tests/basic-manyargs/manyargsprim.c b/testsuite/tests/basic-manyargs/manyargsprim.c index 65e9cf5e..55fbc2e0 100644 --- a/testsuite/tests/basic-manyargs/manyargsprim.c +++ b/testsuite/tests/basic-manyargs/manyargsprim.c @@ -10,7 +10,7 @@ /* */ /***********************************************************************/ -#include "mlvalues.h" +#include "caml/mlvalues.h" #include "stdio.h" value manyargs(value a, value b, value c, value d, value e, value f, diff --git a/testsuite/tests/basic/divint.ml b/testsuite/tests/basic/divint.ml index 52d14b9c..60f09962 100644 --- a/testsuite/tests/basic/divint.ml +++ b/testsuite/tests/basic/divint.ml @@ -74,6 +74,7 @@ let do_test divisor (df: nativeint -> nativeint) (mf: nativeint -> nativeint) = end let _ = + printf "1 int\n"; WithInt.do_test 1 (fun x -> x / 1)(fun x -> x mod 1); printf "2 int\n"; WithInt.do_test 2 (fun x -> x / 2)(fun x -> x mod 2); printf "3 int\n"; WithInt.do_test 3 (fun x -> x / 3)(fun x -> x mod 3); printf "4 int\n"; WithInt.do_test 4 (fun x -> x / 4)(fun x -> x mod 4); @@ -88,9 +89,11 @@ let _ = printf "55 int\n"; WithInt.do_test 55 (fun x -> x / 55)(fun x -> x mod 55); printf "125 int\n"; WithInt.do_test 125 (fun x -> x / 125)(fun x -> x mod 125); printf "625 int\n"; WithInt.do_test 625 (fun x -> x / 625)(fun x -> x mod 625); + printf "-1 int\n"; WithInt.do_test (-1) (fun x -> x / (-1))(fun x -> x mod (-1)); printf "-2 int\n"; WithInt.do_test (-2) (fun x -> x / (-2))(fun x -> x mod (-2)); printf "-3 int\n"; WithInt.do_test (-3) (fun x -> x / (-3))(fun x -> x mod (-3)); + printf "1 nat\n"; WithNat.do_test 1 (fun x -> Nativeint.div x 1n)(fun x -> Nativeint.rem x 1n); printf "2 nat\n"; WithNat.do_test 2 (fun x -> Nativeint.div x 2n)(fun x -> Nativeint.rem x 2n); printf "3 nat\n"; WithNat.do_test 3 (fun x -> Nativeint.div x 3n)(fun x -> Nativeint.rem x 3n); printf "4 nat\n"; WithNat.do_test 4 (fun x -> Nativeint.div x 4n)(fun x -> Nativeint.rem x 4n); @@ -105,8 +108,12 @@ let _ = printf "55 nat\n"; WithNat.do_test 55 (fun x -> Nativeint.div x 55n)(fun x -> Nativeint.rem x 55n); printf "125 nat\n"; WithNat.do_test 125 (fun x -> Nativeint.div x 125n)(fun x -> Nativeint.rem x 125n); printf "625 nat\n"; WithNat.do_test 625 (fun x -> Nativeint.div x 625n)(fun x -> Nativeint.rem x 625n); + printf "-1 nat\n"; WithNat.do_test (-1) (fun x -> Nativeint.div x (-1n))(fun x -> Nativeint.rem x (-1n)); printf "-2 nat\n"; WithNat.do_test (-2) (fun x -> Nativeint.div x (-2n))(fun x -> Nativeint.rem x (-2n)); printf "-3 nat\n"; WithNat.do_test (-3) (fun x -> Nativeint.div x (-3n))(fun x -> Nativeint.rem x (-3n)); if !error then printf "TEST FAILED.\n" else printf "Test passed.\n" +(* PR#6879 *) +let f n = assert (1 mod n = 0) +let () = f 1 diff --git a/testsuite/tests/basic/divint.reference b/testsuite/tests/basic/divint.reference index 4aa1e211..e9a6387f 100644 --- a/testsuite/tests/basic/divint.reference +++ b/testsuite/tests/basic/divint.reference @@ -1,3 +1,4 @@ +1 int 2 int 3 int 4 int @@ -12,8 +13,10 @@ 55 int 125 int 625 int +-1 int -2 int -3 int +1 nat 2 nat 3 nat 4 nat @@ -28,6 +31,7 @@ 55 nat 125 nat 625 nat +-1 nat -2 nat -3 nat Test passed. diff --git a/testsuite/tests/callback/Makefile b/testsuite/tests/callback/Makefile index 58b5ed8a..d89c5326 100644 --- a/testsuite/tests/callback/Makefile +++ b/testsuite/tests/callback/Makefile @@ -31,9 +31,9 @@ common: run-byte: common @printf " ... testing 'bytecode':" @$(OCAMLC) $(COMPFLAGS) -c tcallback.ml - @$(OCAMLC) $(COMPFLAGS) -o ./program -custom unix.cma \ + @$(OCAMLC) $(COMPFLAGS) -o ./program$(EXE) -custom unix.cma \ callbackprim.$(O) tcallback.cmo - @./program >bytecode.result + @./program$(EXE) >bytecode.result @$(DIFF) reference bytecode.result \ && echo " => passed" || echo " => failed" @@ -42,9 +42,9 @@ run-opt: common @if $(BYTECODE_ONLY); then : ; else \ printf " ... testing 'native':"; \ $(OCAMLOPT) $(COMPFLAGS) -c tcallback.ml; \ - $(OCAMLOPT) $(COMPFLAGS) -o ./program unix.cmxa callbackprim.$(O) \ - tcallback.cmx; \ - ./program >native.result; \ + $(OCAMLOPT) $(COMPFLAGS) -o ./program$(EXE) unix.cmxa \ + callbackprim.$(O) tcallback.cmx; \ + ./program$(EXE) >native.result; \ $(DIFF) reference native.result \ && echo " => passed" || echo " => failed"; \ fi @@ -54,6 +54,6 @@ promote: defaultpromote .PHONY: clean clean: defaultclean - @rm -f *.result ./program + @rm -f *.result ./program$(EXE) include $(BASEDIR)/makefiles/Makefile.common diff --git a/testsuite/tests/callback/callbackprim.c b/testsuite/tests/callback/callbackprim.c index f3c59811..71a123d1 100644 --- a/testsuite/tests/callback/callbackprim.c +++ b/testsuite/tests/callback/callbackprim.c @@ -10,9 +10,9 @@ /* */ /***********************************************************************/ -#include "mlvalues.h" -#include "memory.h" -#include "callback.h" +#include "caml/mlvalues.h" +#include "caml/memory.h" +#include "caml/callback.h" value mycallback1(value fun, value arg) { diff --git a/testsuite/tests/embedded/Makefile b/testsuite/tests/embedded/Makefile index a8de4dc0..088b0216 100644 --- a/testsuite/tests/embedded/Makefile +++ b/testsuite/tests/embedded/Makefile @@ -18,16 +18,12 @@ default: $(MAKE) run .PHONY: compile -compile: caml - @$(OCAMLC) -ccopt -I -ccopt . cmstub.c - @$(OCAMLC) -ccopt -I -ccopt . cmmain.c +compile: + @$(OCAMLC) -ccopt -I -ccopt $(CTOPDIR)/byterun cmstub.c + @$(OCAMLC) -ccopt -I -ccopt $(CTOPDIR)/byterun cmmain.c @$(OCAMLC) -c cmcaml.ml @$(OCAMLC) -custom -o program cmstub.$(O) cmcaml.cmo cmmain.$(O) -caml: - @mkdir -p caml || : - @cp -f $(TOPDIR)/byterun/*.h caml/ - .PHONY: run run: @printf " ... testing 'cmmain':" @@ -41,6 +37,5 @@ promote: defaultpromote .PHONY: clean clean: defaultclean @rm -f *.result program - @rm -rf caml include $(BASEDIR)/makefiles/Makefile.common diff --git a/testsuite/tests/float-unboxing/Makefile b/testsuite/tests/float-unboxing/Makefile new file mode 100644 index 00000000..68524118 --- /dev/null +++ b/testsuite/tests/float-unboxing/Makefile @@ -0,0 +1,7 @@ +BASEDIR=../.. +MODULES= +MAIN_MODULE=float_subst_boxed_number +ADD_OPTCOMPFLAGS=-inline 20 + +include $(BASEDIR)/makefiles/Makefile.one +include $(BASEDIR)/makefiles/Makefile.common diff --git a/testsuite/tests/float-unboxing/float_subst_boxed_number.ml b/testsuite/tests/float-unboxing/float_subst_boxed_number.ml new file mode 100644 index 00000000..f77620ec --- /dev/null +++ b/testsuite/tests/float-unboxing/float_subst_boxed_number.ml @@ -0,0 +1,26 @@ +module PR_6686 = struct + type t = + | A of float + | B of (int * int) + + let rec foo = function + | A x -> x + | B (x, y) -> float x +. float y + + let (_ : float) = foo (A 4.) +end + +module PR_6770 = struct + type t = + | Constant of float + | Exponent of (float * float) + + let to_string = function + | Exponent (_b, _e) -> + ignore _b; + ignore _e; + "" + | Constant _ -> "" + + let _ = to_string (Constant 4.) +end diff --git a/testsuite/tests/float-unboxing/float_subst_boxed_number.reference b/testsuite/tests/float-unboxing/float_subst_boxed_number.reference new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/tests/gc-roots/globrootsprim.c b/testsuite/tests/gc-roots/globrootsprim.c index f7bb32ce..5c540acf 100644 --- a/testsuite/tests/gc-roots/globrootsprim.c +++ b/testsuite/tests/gc-roots/globrootsprim.c @@ -13,10 +13,10 @@ /* For testing global root registration */ -#include "mlvalues.h" -#include "memory.h" -#include "alloc.h" -#include "gc.h" +#include "caml/mlvalues.h" +#include "caml/memory.h" +#include "caml/alloc.h" +#include "caml/gc.h" struct block { value header; value v; }; diff --git a/testsuite/tests/lib-bigarray-2/bigarrfstub.c b/testsuite/tests/lib-bigarray-2/bigarrfstub.c index 35408284..72872987 100644 --- a/testsuite/tests/lib-bigarray-2/bigarrfstub.c +++ b/testsuite/tests/lib-bigarray-2/bigarrfstub.c @@ -11,7 +11,7 @@ /***********************************************************************/ #include <stdio.h> -#include <mlvalues.h> +#include <caml/mlvalues.h> #include <bigarray.h> extern void filltab_(void); diff --git a/testsuite/tests/lib-dynlink-bytecode/Makefile b/testsuite/tests/lib-dynlink-bytecode/Makefile index 832e367e..f9b1c6f9 100644 --- a/testsuite/tests/lib-dynlink-bytecode/Makefile +++ b/testsuite/tests/lib-dynlink-bytecode/Makefile @@ -24,10 +24,10 @@ default: fi .PHONY: compile -compile: caml +compile: @$(OCAMLC) -c registry.ml @for file in stub*.c; do \ - $(OCAMLC) -ccopt -I -ccopt . -c $$file; \ + $(OCAMLC) -ccopt -I -ccopt $(CTOPDIR)/byterun/caml -c $$file; \ $(OCAMLMKLIB) -o `echo $$file | sed -e 's/stub/plug/' -e 's/\.c//'` \ `basename $$file c`$(O); \ done @@ -43,10 +43,6 @@ compile: caml @$(OCAMLC) -o custom$(EXE) -custom -linkall registry.cmo plug2.cma \ plug1.cma -I . -caml: - @mkdir -p caml || : - @cp -f $(TOPDIR)/byterun/*.h caml/ - .PHONY: run run: @printf " ... testing 'main'" @@ -70,6 +66,5 @@ promote: defaultpromote .PHONY: clean clean: defaultclean @rm -f main static custom custom.exe *.result marshal.data - @rm -rf caml include $(BASEDIR)/makefiles/Makefile.common diff --git a/testsuite/tests/lib-dynlink-native/Makefile b/testsuite/tests/lib-dynlink-native/Makefile index f4f9d099..f27438c2 100644 --- a/testsuite/tests/lib-dynlink-native/Makefile +++ b/testsuite/tests/lib-dynlink-native/Makefile @@ -102,14 +102,11 @@ mypack.cmx: packed1.cmx mylib.cmxa: plugin.cmx plugin2.cmx @$(OCAMLOPT) $(COMPFLAGS) -a -o mylib.cmxa plugin.cmx plugin2.cmx -factorial.$(O): factorial.c caml - @$(OCAMLOPT) -c -ccopt "$(SHAREDCCCOMPOPTS)" -ccopt -I -ccopt . \ +factorial.$(O): factorial.c + @$(OCAMLOPT) -c -ccopt "$(SHAREDCCCOMPOPTS)" -ccopt -I \ + -ccopt $(TOPDIR)/byterun/caml \ factorial.c -caml: - @mkdir -p caml || : - @cp $(TOPDIR)/byterun/*.h caml/ - .PHONY: promote promote: @cp result reference @@ -120,6 +117,5 @@ clean: defaultclean @rm -f *.a *.lib @rm -f sub/*.so sub/*.o sub/*.cm* sub/*.s sub/*.asm sub/*.obj @rm -f marshal.data - @rm -rf caml include $(BASEDIR)/makefiles/Makefile.common diff --git a/testsuite/tests/lib-format/pr6824.ml b/testsuite/tests/lib-format/pr6824.ml new file mode 100644 index 00000000..aa5e7eed --- /dev/null +++ b/testsuite/tests/lib-format/pr6824.ml @@ -0,0 +1,7 @@ +let f = Format.sprintf "[%i]";; +print_endline (f 1);; +print_endline (f 2);; + +let f = Format.asprintf "[%i]";; +print_endline (f 1);; +print_endline (f 2);; diff --git a/testsuite/tests/lib-format/pr6824.reference b/testsuite/tests/lib-format/pr6824.reference new file mode 100644 index 00000000..69035c76 --- /dev/null +++ b/testsuite/tests/lib-format/pr6824.reference @@ -0,0 +1,6 @@ +[1] +[2] +[1] +[2] + +All tests succeeded. diff --git a/testsuite/tests/lib-hashtbl/htbl.ml b/testsuite/tests/lib-hashtbl/htbl.ml index 655191a8..bd5f33a6 100644 --- a/testsuite/tests/lib-hashtbl/htbl.ml +++ b/testsuite/tests/lib-hashtbl/htbl.ml @@ -193,7 +193,7 @@ let _ = printf "-- Random integers, narrow range\n%!"; TI2.test (random_integers 100_000 1_000); let d = - try file_data "/usr/share/dict/words" with Sys_error _ -> string_data in + try file_data "../../LICENSE" with Sys_error _ -> string_data in printf "-- Strings, generic interface\n%!"; TS1.test d; printf "-- Strings, functorial interface\n%!"; diff --git a/testsuite/tests/lib-marshal/intextaux.c b/testsuite/tests/lib-marshal/intextaux.c index 924b896e..03688462 100644 --- a/testsuite/tests/lib-marshal/intextaux.c +++ b/testsuite/tests/lib-marshal/intextaux.c @@ -10,8 +10,8 @@ /* */ /***********************************************************************/ -#include <mlvalues.h> -#include <intext.h> +#include <caml/mlvalues.h> +#include <caml/intext.h> value marshal_to_block(value vbuf, value vlen, value v, value vflags) { diff --git a/testsuite/tests/lib-scanf/tscanf.ml b/testsuite/tests/lib-scanf/tscanf.ml index 33054b66..056bd5c7 100644 --- a/testsuite/tests/lib-scanf/tscanf.ml +++ b/testsuite/tests/lib-scanf/tscanf.ml @@ -1268,7 +1268,12 @@ sscanf "Hello \n" "%s%s%_1[ ]\n" (fun s1 s2 -> sscanf "Hello\nWorld!" "%s\n%s%!" (fun s1 s2 -> s1 = "Hello" && s2 = "World!") && sscanf "Hello\nWorld!" "%s\n%s@!%!" (fun s1 s2 -> - s1 = "Hello" && s2 = "World") + s1 = "Hello" && s2 = "World") && + (* PR#6791 *) + sscanf "Hello{foo}" "%s@{%s" (fun s1 s2 -> + s1 = "Hello" && s2 = "foo}") && + sscanf "Hello[foo]" "%s@[%s" (fun s1 s2 -> + s1 = "Hello" && s2 = "foo]") ;; test (test52 ()) diff --git a/testsuite/tests/misc/weaklifetime.ml b/testsuite/tests/misc/weaklifetime.ml new file mode 100644 index 00000000..d6b23f3d --- /dev/null +++ b/testsuite/tests/misc/weaklifetime.ml @@ -0,0 +1,74 @@ +(*************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Damien Doligez, Jane Street Group, LLC *) +(* *) +(* Copyright 2015 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(*************************************************************************) + +Random.init 12345;; + +let size = 1000;; + +type block = int array;; + +type objdata = + | Present of block + | Absent of int (* GC count at time of erase *) +;; + +type bunch = { + objs : objdata array; + wp : block Weak.t; +};; + +let data = + Array.init size (fun i -> + let n = 1 + Random.int size in + { + objs = Array.make n (Absent 0); + wp = Weak.create n; + } + ) +;; + +let gccount () = (Gc.quick_stat ()).Gc.major_collections;; + +(* Check the correctness condition on the data at (i,j): + 1. if the block is present, the weak pointer must be full + 2. if the block was removed at GC n, and the weak pointer is still + full, then the current GC must be at most n+1. + + Then modify the data in one of the following ways: + 1. if the block and weak pointer are absent, fill them + 2. if the block and weak pointer are present, randomly erase the block +*) +let check_and_change i j = + let gc1 = gccount () in + match data.(i).objs.(j), Weak.check data.(i).wp j with + | Present x, false -> assert false + | Absent n, true -> assert (gc1 <= n+1) + | Absent _, false -> + let x = Array.make (1 + Random.int 10) 42 in + data.(i).objs.(j) <- Present x; + Weak.set data.(i).wp j (Some x); + | Present _, true -> + if Random.int 10 = 0 then begin + data.(i).objs.(j) <- Absent gc1; + let gc2 = gccount () in + if gc1 <> gc2 then data.(i).objs.(j) <- Absent gc2; + end +;; + +let dummy = ref [||];; + +while gccount () < 20 do + dummy := Array.make (Random.int 300) 0; + let i = Random.int size in + let j = Random.int (Array.length data.(i).objs) in + check_and_change i j; +done diff --git a/testsuite/tests/misc/weaklifetime.reference b/testsuite/tests/misc/weaklifetime.reference new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/tests/prim-bigstring/bigstring_access.ml b/testsuite/tests/prim-bigstring/bigstring_access.ml index 8fad87b1..512181f0 100644 --- a/testsuite/tests/prim-bigstring/bigstring_access.ml +++ b/testsuite/tests/prim-bigstring/bigstring_access.ml @@ -63,40 +63,57 @@ let () = assert_bound_check3 caml_bigstring_set_32 empty_s 0 0l; assert_bound_check3 caml_bigstring_set_64 empty_s 0 0L +external bswap16: int -> int = "%bswap16" +external bswap32: int32 -> int32 = "%bswap_int32" +external bswap64: int64 -> int64 = "%bswap_int64" +let swap16 x = + if Sys.big_endian + then bswap16 x + else x + +let swap32 x = + if Sys.big_endian + then bswap32 x + else x + +let swap64 x = + if Sys.big_endian + then bswap64 x + else x let () = - caml_bigstring_set_16 s 0 0x1234; + caml_bigstring_set_16 s 0 (swap16 0x1234); Printf.printf "%x %x %x\n%!" - (caml_bigstring_get_16 s 0) - (caml_bigstring_get_16 s 1) - (caml_bigstring_get_16 s 2); - caml_bigstring_set_16 s 0 0xFEDC; + (swap16 (caml_bigstring_get_16 s 0)) + (swap16 (caml_bigstring_get_16 s 1)) + (swap16 (caml_bigstring_get_16 s 2)); + caml_bigstring_set_16 s 0 (swap16 0xFEDC); Printf.printf "%x %x %x\n%!" - (caml_bigstring_get_16 s 0) - (caml_bigstring_get_16 s 1) - (caml_bigstring_get_16 s 2) + (swap16 (caml_bigstring_get_16 s 0)) + (swap16 (caml_bigstring_get_16 s 1)) + (swap16 (caml_bigstring_get_16 s 2)) let () = - caml_bigstring_set_32 s 0 0x12345678l; + caml_bigstring_set_32 s 0 (swap32 0x12345678l); Printf.printf "%lx %lx %lx\n%!" - (caml_bigstring_get_32 s 0) - (caml_bigstring_get_32 s 1) - (caml_bigstring_get_32 s 2); - caml_bigstring_set_32 s 0 0xFEDCBA09l; + (swap32 (caml_bigstring_get_32 s 0)) + (swap32 (caml_bigstring_get_32 s 1)) + (swap32 (caml_bigstring_get_32 s 2)); + caml_bigstring_set_32 s 0 (swap32 0xFEDCBA09l); Printf.printf "%lx %lx %lx\n%!" - (caml_bigstring_get_32 s 0) - (caml_bigstring_get_32 s 1) - (caml_bigstring_get_32 s 2) + (swap32 (caml_bigstring_get_32 s 0)) + (swap32 (caml_bigstring_get_32 s 1)) + (swap32 (caml_bigstring_get_32 s 2)) let () = - caml_bigstring_set_64 s 0 0x1234567890ABCDEFL; + caml_bigstring_set_64 s 0 (swap64 0x1234567890ABCDEFL); Printf.printf "%Lx %Lx %Lx\n%!" - (caml_bigstring_get_64 s 0) - (caml_bigstring_get_64 s 1) - (caml_bigstring_get_64 s 2); - caml_bigstring_set_64 s 0 0xFEDCBA0987654321L; + (swap64 (caml_bigstring_get_64 s 0)) + (swap64 (caml_bigstring_get_64 s 1)) + (swap64 (caml_bigstring_get_64 s 2)); + caml_bigstring_set_64 s 0 (swap64 0xFEDCBA0987654321L); Printf.printf "%Lx %Lx %Lx\n%!" - (caml_bigstring_get_64 s 0) - (caml_bigstring_get_64 s 1) - (caml_bigstring_get_64 s 2) + (swap64 (caml_bigstring_get_64 s 0)) + (swap64 (caml_bigstring_get_64 s 1)) + (swap64 (caml_bigstring_get_64 s 2)) diff --git a/testsuite/tests/prim-bigstring/string_access.ml b/testsuite/tests/prim-bigstring/string_access.ml index 3afcc6c5..48964c0b 100644 --- a/testsuite/tests/prim-bigstring/string_access.ml +++ b/testsuite/tests/prim-bigstring/string_access.ml @@ -50,40 +50,57 @@ let () = assert_bound_check3 caml_string_set_32 empty_s 0 0l; assert_bound_check3 caml_string_set_64 empty_s 0 0L +external bswap16: int -> int = "%bswap16" +external bswap32: int32 -> int32 = "%bswap_int32" +external bswap64: int64 -> int64 = "%bswap_int64" +let swap16 x = + if Sys.big_endian + then bswap16 x + else x + +let swap32 x = + if Sys.big_endian + then bswap32 x + else x + +let swap64 x = + if Sys.big_endian + then bswap64 x + else x let () = - caml_string_set_16 s 0 0x1234; + caml_string_set_16 s 0 (swap16 0x1234); Printf.printf "%x %x %x\n%!" - (caml_string_get_16 s 0) - (caml_string_get_16 s 1) - (caml_string_get_16 s 2); - caml_string_set_16 s 0 0xFEDC; + (swap16 (caml_string_get_16 s 0)) + (swap16 (caml_string_get_16 s 1)) + (swap16 (caml_string_get_16 s 2)); + caml_string_set_16 s 0 (swap16 0xFEDC); Printf.printf "%x %x %x\n%!" - (caml_string_get_16 s 0) - (caml_string_get_16 s 1) - (caml_string_get_16 s 2) + (swap16 (caml_string_get_16 s 0)) + (swap16 (caml_string_get_16 s 1)) + (swap16 (caml_string_get_16 s 2)) let () = - caml_string_set_32 s 0 0x12345678l; + caml_string_set_32 s 0 (swap32 0x12345678l); Printf.printf "%lx %lx %lx\n%!" - (caml_string_get_32 s 0) - (caml_string_get_32 s 1) - (caml_string_get_32 s 2); - caml_string_set_32 s 0 0xFEDCBA09l; + (swap32 (caml_string_get_32 s 0)) + (swap32 (caml_string_get_32 s 1)) + (swap32 (caml_string_get_32 s 2)); + caml_string_set_32 s 0 (swap32 0xFEDCBA09l); Printf.printf "%lx %lx %lx\n%!" - (caml_string_get_32 s 0) - (caml_string_get_32 s 1) - (caml_string_get_32 s 2) + (swap32 (caml_string_get_32 s 0)) + (swap32 (caml_string_get_32 s 1)) + (swap32 (caml_string_get_32 s 2)) let () = - caml_string_set_64 s 0 0x1234567890ABCDEFL; + caml_string_set_64 s 0 (swap64 0x1234567890ABCDEFL); Printf.printf "%Lx %Lx %Lx\n%!" - (caml_string_get_64 s 0) - (caml_string_get_64 s 1) - (caml_string_get_64 s 2); - caml_string_set_64 s 0 0xFEDCBA0987654321L; + (swap64 (caml_string_get_64 s 0)) + (swap64 (caml_string_get_64 s 1)) + (swap64 (caml_string_get_64 s 2)); + caml_string_set_64 s 0 (swap64 0xFEDCBA0987654321L); Printf.printf "%Lx %Lx %Lx\n%!" - (caml_string_get_64 s 0) - (caml_string_get_64 s 1) - (caml_string_get_64 s 2) + (swap64 (caml_string_get_64 s 0)) + (swap64 (caml_string_get_64 s 1)) + (swap64 (caml_string_get_64 s 2)) diff --git a/testsuite/tests/typing-extensions/open_types.ml.reference b/testsuite/tests/typing-extensions/open_types.ml.reference index 841a94ba..e639c9df 100644 --- a/testsuite/tests/typing-extensions/open_types.ml.reference +++ b/testsuite/tests/typing-extensions/open_types.ml.reference @@ -13,21 +13,21 @@ type bar += Bar of int (* Error: type is not open *) ^^^^^^^^^^ Error: Cannot extend type definition bar -# Characters 6-20: +# Characters 1-20: type baz = bar = .. (* Error: type kinds don't match *) - ^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^ Error: This variant or record definition does not match that of type bar Their kinds differ. # type 'a foo = .. -# Characters 6-32: +# Characters 1-32: type ('a, 'b) bar = 'a foo = .. (* Error: arrities do not match *) - ^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: This variant or record definition does not match that of type 'a foo They have different arities. # type ('a, 'b) foo = .. -# Characters 6-38: +# Characters 1-38: type ('a, 'b) bar = ('a, 'a) foo = .. (* Error: constraints do not match *) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: This variant or record definition does not match that of type ('a, 'a) foo Their constraints differ. @@ -77,7 +77,7 @@ Error: Signature mismatch: Warning 8: this pattern-matching is not exhaustive. Here is an example of a value that is not matched: _ -Matching over values of open types must include +Matching over values of extensible variant types must include a wild card pattern in order to be exhaustive. type foo = .. type foo += Foo diff --git a/testsuite/tests/typing-gadts/pr5985.ml.reference b/testsuite/tests/typing-gadts/pr5985.ml.reference index af6154dd..4c29f6da 100644 --- a/testsuite/tests/typing-gadts/pr5985.ml.reference +++ b/testsuite/tests/typing-gadts/pr5985.ml.reference @@ -1,43 +1,43 @@ -# Characters 92-115: +# Characters 88-115: type _ t = T : 'a -> 'a s t - ^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In this definition, a type variable cannot be deduced from the type parameters. # * * * Characters 140-141: module F (S : sig type #'a s end) = struct ^ Error: Syntax error -# * * * * * Characters 296-374: - ........['a] c x = +# * * * * * Characters 290-374: + ..class ['a] c x = object constraint 'a = 'b T.t val x' : 'b = x method x = x' end Error: In this definition, a type variable cannot be deduced from the type parameters. -# Characters 83-128: +# Characters 79-128: type 'x t = A of 'a constraint 'x = [< `X of 'a ] ;; (* fail *) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In this definition, a type variable cannot be deduced from the type parameters. # Characters 36-37: let A x = A x in ^ Error: Unbound constructor A -# Characters 4-37: +# Characters 0-37: type 'a t = A : 'a -> [< `X of 'a ] t;; (* fail *) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In this definition, a type variable cannot be deduced from the type parameters. # type (_, _) eq = Eq : ('a, 'a) eq # val eq : 'a = <poly> # val eq : ('a Queue.t, 'b Queue.t) eq = Eq -# Characters 4-33: +# Characters 0-33: type _ t = T : 'a -> 'a Queue.t t;; (* fail *) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In this definition, a type variable cannot be deduced from the type parameters. -# * * * * Characters 254-277: +# * * * * Characters 250-277: type _ t = T : 'a -> 'a s t - ^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In this definition, a type variable cannot be deduced from the type parameters. # Characters 59-60: @@ -50,17 +50,17 @@ Error: Unbound module type S ^ Error: Syntax error # * * * * type 'a q = Q -# Characters 5-36: +# Characters 0-36: type +'a t = 'b constraint 'a = 'b q;; - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In this definition, a type variable has a variance that cannot be deduced from the type parameters. It was expected to be unrestricted, but it is covariant. # type 'a t = T of 'a # type +'a s = 'b constraint 'a = 'b t -# Characters 5-36: +# Characters 0-36: type -'a s = 'b constraint 'a = 'b t;; (* fail *) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In this definition, a type variable has a variance that is not reflected by its occurrence in type parameters. It was expected to be contravariant, but it is covariant. @@ -68,9 +68,9 @@ Error: In this definition, a type variable has a variance that # type 'a t = T of ('a -> 'a) # type -'a s = 'b constraint 'a = 'b t # type +'a s = 'b constraint 'a = 'b q t -# Characters 5-38: +# Characters 0-38: type +'a s = 'b constraint 'a = 'b t q;; (* fail *) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In this definition, a type variable has a variance that cannot be deduced from the type parameters. It was expected to be unrestricted, but it is covariant. @@ -81,9 +81,9 @@ Error: In this definition, a type variable has a variance that method virtual add : 'a -> unit end # type +'a t = unit constraint 'a = 'b list -# Characters 4-27: +# Characters 0-27: type _ g = G : 'a -> 'a t g;; (* fail *) - ^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In this definition, a type variable cannot be deduced from the type parameters. # diff --git a/testsuite/tests/typing-gadts/pr6690.ml b/testsuite/tests/typing-gadts/pr6690.ml new file mode 100644 index 00000000..46ece4b2 --- /dev/null +++ b/testsuite/tests/typing-gadts/pr6690.ml @@ -0,0 +1,28 @@ +type 'a visit_action + +type insert + +type 'a local_visit_action + +type ('a, 'result, 'visit_action) context = + | Local : ('a, ('a * insert) as 'result, 'a local_visit_action) context + | Global : ('a, 'a, 'a visit_action) context +;; + +let vexpr (type visit_action) : (_, _, visit_action) context -> _ -> visit_action = + function + | Local -> fun _ -> raise Exit + | Global -> fun _ -> raise Exit +;; + +let vexpr (type visit_action) : ('a, 'result, visit_action) context -> 'a -> visit_action = + function + | Local -> fun _ -> raise Exit + | Global -> fun _ -> raise Exit +;; + +let vexpr (type result) (type visit_action) : (unit, result, visit_action) context -> unit -> visit_action = + function + | Local -> fun _ -> raise Exit + | Global -> fun _ -> raise Exit +;; diff --git a/testsuite/tests/typing-gadts/pr6690.ml.principal.reference b/testsuite/tests/typing-gadts/pr6690.ml.principal.reference new file mode 100644 index 00000000..2ff16245 --- /dev/null +++ b/testsuite/tests/typing-gadts/pr6690.ml.principal.reference @@ -0,0 +1,23 @@ + +# type 'a visit_action +type insert +type 'a local_visit_action +type ('a, 'result, 'visit_action) context = + Local : ('a, 'a * insert, 'a local_visit_action) context + | Global : ('a, 'a, 'a visit_action) context +# Characters 133-139: + | Global -> fun _ -> raise Exit + ^^^^^^ +Error: This pattern matches values of type (ex#1, ex#1, visit_action) context + but a pattern was expected which matches values of type + (ex#0, ex#0 * insert, visit_action) context + Type ex#1 is not compatible with type ex#0 +# Characters 141-147: + | Global -> fun _ -> raise Exit + ^^^^^^ +Error: This pattern matches values of type (ex#3, ex#3, visit_action) context + but a pattern was expected which matches values of type + (ex#2, ex#2 * insert, visit_action) context + Type ex#3 is not compatible with type ex#2 +# val vexpr : (unit, 'a, 'b) context -> unit -> 'b = <fun> +# diff --git a/testsuite/tests/typing-gadts/pr6690.ml.reference b/testsuite/tests/typing-gadts/pr6690.ml.reference new file mode 100644 index 00000000..086f3237 --- /dev/null +++ b/testsuite/tests/typing-gadts/pr6690.ml.reference @@ -0,0 +1,27 @@ + +# type 'a visit_action +type insert +type 'a local_visit_action +type ('a, 'result, 'visit_action) context = + Local : ('a, 'a * insert, 'a local_visit_action) context + | Global : ('a, 'a, 'a visit_action) context +# Characters 11-162: + ..........(type visit_action) : (_, _, visit_action) context -> _ -> visit_action = + function + | Local -> fun _ -> raise Exit + | Global -> fun _ -> raise Exit +Error: This expression has type (ex#0, ex#0 * insert, 'a) context -> 'b -> 'a + but an expression was expected of type + (ex#0, ex#0 * insert, 'a) context -> 'b -> 'a + The type constructor ex#0 would escape its scope +# Characters 11-170: + ..........(type visit_action) : ('a, 'result, visit_action) context -> 'a -> visit_action = + function + | Local -> fun _ -> raise Exit + | Global -> fun _ -> raise Exit +Error: This expression has type (a#0, a#0 * insert, 'a) context -> a#0 -> 'a + but an expression was expected of type + (a#0, a#0 * insert, 'a) context -> a#0 -> 'a + The type constructor a#0 would escape its scope +# val vexpr : (unit, 'a, 'b) context -> unit -> 'b = <fun> +# diff --git a/testsuite/tests/typing-gadts/pr6817.ml b/testsuite/tests/typing-gadts/pr6817.ml new file mode 100644 index 00000000..73c1f635 --- /dev/null +++ b/testsuite/tests/typing-gadts/pr6817.ml @@ -0,0 +1,24 @@ +module A = struct + type nil = Cstr + end +open A +;; + +type _ s = + | Nil : nil s + | Cons : 't s -> ('h -> 't) s + +type ('stack, 'typ) var = + | Head : (('typ -> _) s, 'typ) var + | Tail : ('tail s, 'typ) var -> ((_ -> 'tail) s, 'typ) var + +type _ lst = + | CNil : nil lst + | CCons : 'h * ('t lst) -> ('h -> 't) lst +;; + +let rec get_var : type stk ret. (stk s, ret) var -> stk lst -> ret = fun n s -> + match n, s with + | Head, CCons (h, _) -> h + | Tail n', CCons (_, t) -> get_var n' t +;; diff --git a/testsuite/tests/typing-gadts/pr6817.ml.reference b/testsuite/tests/typing-gadts/pr6817.ml.reference new file mode 100644 index 00000000..ec47bcc9 --- /dev/null +++ b/testsuite/tests/typing-gadts/pr6817.ml.reference @@ -0,0 +1,9 @@ + +# module A : sig type nil = Cstr end +# type _ s = Nil : A.nil s | Cons : 't s -> ('h -> 't) s +type ('stack, 'typ) var = + Head : (('typ -> 'a) s, 'typ) var + | Tail : ('tail s, 'typ) var -> (('b -> 'tail) s, 'typ) var +type _ lst = CNil : A.nil lst | CCons : 'h * 't lst -> ('h -> 't) lst +# val get_var : ('stk s, 'ret) var -> 'stk lst -> 'ret = <fun> +# diff --git a/testsuite/tests/typing-gadts/test.ml b/testsuite/tests/typing-gadts/test.ml index 2f0bb919..f4f23e0e 100644 --- a/testsuite/tests/typing-gadts/test.ml +++ b/testsuite/tests/typing-gadts/test.ml @@ -91,6 +91,12 @@ module Exhaustive = end ;; +module PR6862 = struct + class c (Some x) = object method x : int = x end + type _ opt = Just : 'a -> 'a opt | Nothing : 'a opt + class d (Just x) = object method x : int = x end +end;; + module Existential_escape = struct type _ t = C : int -> int t @@ -157,6 +163,13 @@ module Normal_constrs = struct let f = function A -> 1 | B -> 2 end;; +module PR6849 = struct + type 'a t = Foo : int t + + let f : int -> int = function + Foo -> 5 +end;; + type _ t = Int : int t ;; let ky x y = ignore (x = y); x ;; diff --git a/testsuite/tests/typing-gadts/test.ml.principal.reference b/testsuite/tests/typing-gadts/test.ml.principal.reference index fd9fb350..cba7f347 100644 --- a/testsuite/tests/typing-gadts/test.ml.principal.reference +++ b/testsuite/tests/typing-gadts/test.ml.principal.reference @@ -47,6 +47,24 @@ module Nonexhaustive : type 'a v = Foo : t -> t v | Bar : u -> u v val same_type : 's v * 's v -> bool end +# Characters 34-42: + class c (Some x) = object method x : int = x end + ^^^^^^^^ +Warning 8: this pattern-matching is not exhaustive. +Here is an example of a value that is not matched: +None +Characters 139-147: + class d (Just x) = object method x : int = x end + ^^^^^^^^ +Warning 8: this pattern-matching is not exhaustive. +Here is an example of a value that is not matched: +Nothing +module PR6862 : + sig + class c : int option -> object method x : int end + type _ opt = Just : 'a -> 'a opt | Nothing : 'a opt + class d : int opt -> object method x : int end + end # Characters 118-119: let eval (D x) = x ^ @@ -75,6 +93,11 @@ Error: This expression has type bool but an expression was expected of type s ^ Error: This pattern matches values of type b but a pattern was expected which matches values of type a +# Characters 89-92: + Foo -> 5 + ^^^ +Error: This pattern matches values of type 'a t + but a pattern was expected which matches values of type int # type _ t = Int : int t # val ky : 'a -> 'a -> 'a = <fun> # val test : 'a t -> 'a = <fun> diff --git a/testsuite/tests/typing-gadts/test.ml.reference b/testsuite/tests/typing-gadts/test.ml.reference index a5faa02c..a3ea98d1 100644 --- a/testsuite/tests/typing-gadts/test.ml.reference +++ b/testsuite/tests/typing-gadts/test.ml.reference @@ -47,6 +47,24 @@ module Nonexhaustive : type 'a v = Foo : t -> t v | Bar : u -> u v val same_type : 's v * 's v -> bool end +# Characters 34-42: + class c (Some x) = object method x : int = x end + ^^^^^^^^ +Warning 8: this pattern-matching is not exhaustive. +Here is an example of a value that is not matched: +None +Characters 139-147: + class d (Just x) = object method x : int = x end + ^^^^^^^^ +Warning 8: this pattern-matching is not exhaustive. +Here is an example of a value that is not matched: +Nothing +module PR6862 : + sig + class c : int option -> object method x : int end + type _ opt = Just : 'a -> 'a opt | Nothing : 'a opt + class d : int opt -> object method x : int end + end # Characters 118-119: let eval (D x) = x ^ @@ -76,6 +94,11 @@ Error: This pattern matches values of type int t ^ Error: This variant pattern is expected to have type a The constructor B does not belong to type a +# Characters 89-92: + Foo -> 5 + ^^^ +Error: This pattern matches values of type 'a t + but a pattern was expected which matches values of type int # type _ t = Int : int t # val ky : 'a -> 'a -> 'a = <fun> # val test : 'a t -> 'a = <fun> diff --git a/testsuite/tests/typing-gadts/yallop_bugs.ml.principal.reference b/testsuite/tests/typing-gadts/yallop_bugs.ml.principal.reference index ddae4d24..b9f0cac9 100644 --- a/testsuite/tests/typing-gadts/yallop_bugs.ml.principal.reference +++ b/testsuite/tests/typing-gadts/yallop_bugs.ml.principal.reference @@ -3,9 +3,9 @@ let f (Refl : (a T.t, b T.t) eq) = (x :> b) ^^^^^^^^ Error: Type a is not a subtype of b -# Characters 36-67: +# Characters 31-67: type (_, +_) eq = Refl : ('a, 'a) eq - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In this GADT definition, the variance of some parameter cannot be checked # Characters 115-175: diff --git a/testsuite/tests/typing-gadts/yallop_bugs.ml.reference b/testsuite/tests/typing-gadts/yallop_bugs.ml.reference index ddae4d24..b9f0cac9 100644 --- a/testsuite/tests/typing-gadts/yallop_bugs.ml.reference +++ b/testsuite/tests/typing-gadts/yallop_bugs.ml.reference @@ -3,9 +3,9 @@ let f (Refl : (a T.t, b T.t) eq) = (x :> b) ^^^^^^^^ Error: Type a is not a subtype of b -# Characters 36-67: +# Characters 31-67: type (_, +_) eq = Refl : ('a, 'a) eq - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In this GADT definition, the variance of some parameter cannot be checked # Characters 115-175: diff --git a/testsuite/tests/typing-misc/constraints.ml.reference b/testsuite/tests/typing-misc/constraints.ml.reference index 83a3dc1f..41a324c6 100644 --- a/testsuite/tests/typing-misc/constraints.ml.reference +++ b/testsuite/tests/typing-misc/constraints.ml.reference @@ -7,16 +7,16 @@ Error: Constraints are not satisfied in this type. [ `A of 'a ] t t as 'a should be an instance of ([ `A of 'b t t ] as 'b) t -# Characters 5-27: +# Characters 1-27: type 'a t = [`A of 'a t t];; (* fails *) - ^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In the definition of t, type 'a t t should be 'a t # type 'a t = [ `A of 'a t t ] constraint 'a = 'a t # type 'a t = [ `A of 'a t ] constraint 'a = 'a t # type 'a t = 'a constraint 'a = [ `A of 'a ] -# Characters 47-52: +# Characters 43-52: type 'a v = [`A of u v] constraint 'a = t and t = u and u = t;; (* fails *) - ^^^^^ + ^^^^^^^^^ Error: The type abbreviation t is cyclic # type 'a t = 'a # Characters 11-21: @@ -26,9 +26,9 @@ Error: This alias is bound to type 'a t = 'a but is used as an instance of type 'a The type variable 'a occurs inside 'a # val f : 'a t -> 'a -> bool = <fun> -# Characters 83-122: +# Characters 80-122: and 'o abs constraint 'o = 'o is_an_object - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: The definition of abs contains a cycle: 'a is_an_object as 'a # diff --git a/testsuite/tests/typing-misc/polyvars.ml b/testsuite/tests/typing-misc/polyvars.ml index 00dacf75..de8cb221 100644 --- a/testsuite/tests/typing-misc/polyvars.ml +++ b/testsuite/tests/typing-misc/polyvars.ml @@ -5,3 +5,11 @@ let f x = ignore (match x with `A|`B -> 1); ignore (x : [`A]);; let f (x : [< `A | `B]) = match x with `A | `B | `C -> 0;; (* warn *) let f (x : [`A | `B]) = match x with `A | `B | `C -> 0;; (* fail *) + +(* PR#6787 *) +let revapply x f = f x;; + +let f x (g : [< `Foo]) = + let y = `Bar x, g in + revapply y (fun ((`Bar i), _) -> i);; +(* f : 'a -> [< `Foo ] -> 'a *) diff --git a/testsuite/tests/typing-misc/polyvars.ml.principal.reference b/testsuite/tests/typing-misc/polyvars.ml.principal.reference index bc0741ab..6732640e 100644 --- a/testsuite/tests/typing-misc/polyvars.ml.principal.reference +++ b/testsuite/tests/typing-misc/polyvars.ml.principal.reference @@ -29,4 +29,6 @@ val f : [< `A | `B ] -> int = <fun> Error: This pattern matches values of type [? `C ] but a pattern was expected which matches values of type [ `A | `B ] The second variant type does not allow tag(s) `C -# +# val revapply : 'a -> ('a -> 'b) -> 'b = <fun> +# val f : 'a -> [< `Foo ] -> 'a = <fun> +# diff --git a/testsuite/tests/typing-misc/polyvars.ml.reference b/testsuite/tests/typing-misc/polyvars.ml.reference index 27c4cd43..751b02fc 100644 --- a/testsuite/tests/typing-misc/polyvars.ml.reference +++ b/testsuite/tests/typing-misc/polyvars.ml.reference @@ -29,4 +29,6 @@ val f : [< `A | `B ] -> int = <fun> Error: This pattern matches values of type [? `C ] but a pattern was expected which matches values of type [ `A | `B ] The second variant type does not allow tag(s) `C -# +# val revapply : 'a -> ('a -> 'b) -> 'b = <fun> +# val f : 'a -> [< `Foo ] -> 'a = <fun> +# diff --git a/testsuite/tests/typing-misc/wellfounded.ml b/testsuite/tests/typing-misc/wellfounded.ml new file mode 100644 index 00000000..b33adc5e --- /dev/null +++ b/testsuite/tests/typing-misc/wellfounded.ml @@ -0,0 +1,11 @@ +(* PR#6768 *) + +type _ prod = Prod : ('a * 'y) prod;; + +let f : type t. t prod -> _ = function Prod -> + let module M = + struct + type d = d * d + end + in () +;; diff --git a/testsuite/tests/typing-misc/wellfounded.ml.principal.reference b/testsuite/tests/typing-misc/wellfounded.ml.principal.reference new file mode 100644 index 00000000..04bf5586 --- /dev/null +++ b/testsuite/tests/typing-misc/wellfounded.ml.principal.reference @@ -0,0 +1,7 @@ + +# type _ prod = Prod : ('a * 'y) prod +# Characters 82-96: + type d = d * d + ^^^^^^^^^^^^^^ +Error: The type abbreviation d is cyclic +# diff --git a/testsuite/tests/typing-misc/wellfounded.ml.reference b/testsuite/tests/typing-misc/wellfounded.ml.reference new file mode 100644 index 00000000..04bf5586 --- /dev/null +++ b/testsuite/tests/typing-misc/wellfounded.ml.reference @@ -0,0 +1,7 @@ + +# type _ prod = Prod : ('a * 'y) prod +# Characters 82-96: + type d = d * d + ^^^^^^^^^^^^^^ +Error: The type abbreviation d is cyclic +# diff --git a/testsuite/tests/typing-objects/Exemples.ml.principal.reference b/testsuite/tests/typing-objects/Exemples.ml.principal.reference index 2b12a7d9..f0f3812e 100644 --- a/testsuite/tests/typing-objects/Exemples.ml.principal.reference +++ b/testsuite/tests/typing-objects/Exemples.ml.principal.reference @@ -24,8 +24,8 @@ # val get_x : < get_x : 'a; .. > -> 'a = <fun> # val set_x : < set_x : 'a; .. > -> 'a = <fun> # - : int list = [10; 5] -# Characters 7-96: - ......ref x_init = object +# Characters 1-96: + class ref x_init = object val mutable x = x_init method get = x method set y = x <- y diff --git a/testsuite/tests/typing-objects/Exemples.ml.reference b/testsuite/tests/typing-objects/Exemples.ml.reference index 7cbd68ec..085a9e92 100644 --- a/testsuite/tests/typing-objects/Exemples.ml.reference +++ b/testsuite/tests/typing-objects/Exemples.ml.reference @@ -24,8 +24,8 @@ # val get_x : < get_x : 'a; .. > -> 'a = <fun> # val set_x : < set_x : 'a; .. > -> 'a = <fun> # - : int list = [10; 5] -# Characters 7-96: - ......ref x_init = object +# Characters 1-96: + class ref x_init = object val mutable x = x_init method get = x method set y = x <- y diff --git a/testsuite/tests/typing-objects/Tests.ml.principal.reference b/testsuite/tests/typing-objects/Tests.ml.principal.reference index e5d9bb8d..6c944944 100644 --- a/testsuite/tests/typing-objects/Tests.ml.principal.reference +++ b/testsuite/tests/typing-objects/Tests.ml.principal.reference @@ -4,8 +4,8 @@ = <fun> # class ['a] c : unit -> object constraint 'a = int method f : int c end and ['a] d : unit -> object constraint 'a = int method f : int c end -# Characters 238-275: - ........d () = object +# Characters 234-275: + ....and d () = object inherit ['a] c () end.. Error: Some type variables are unbound in this type: @@ -19,8 +19,8 @@ and ['a] d : unit -> object constraint 'a = int #c end # * class ['a] c : 'a -> object ('a) constraint 'a = < f : 'a; .. > method f : 'a end # - : ('a c as 'a) -> 'a = <fun> -# * Characters 134-176: - ......x () = object +# * Characters 128-176: + class x () = object method virtual f : int end.. Error: This class should be virtual. The following methods are undefined : f @@ -29,8 +29,8 @@ Error: This class should be virtual. The following methods are undefined : f ^^^^^^^^ Error: This pattern cannot match self: it only matches values of type < f : int > -# Characters 38-110: - ......['a] c () = object +# Characters 32-110: + class ['a] c () = object constraint 'a = int method f x = (x : bool c) end.. @@ -51,17 +51,17 @@ Error: The abbreviation c is used with parameters bool c method f : 'a -> 'b -> unit end # val x : '_a list ref = {contents = []} -# Characters 6-50: - ......['a] c () = object +# Characters 0-50: + class ['a] c () = object method f = (x : 'a) end.. Error: The type of this class, class ['a] c : unit -> object constraint 'a = '_b list ref method f : 'a end, contains type variables that cannot be generalized -# Characters 24-52: +# Characters 20-52: type 'a c = <f : 'a c; g : 'a d> - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In the definition of d, type int c should be 'a c # type 'a c = < f : 'a c; g : 'a d > and 'a d = < f : 'a c > @@ -69,14 +69,14 @@ and 'a d = < f : 'a c > and 'a d = < f : int c > # type 'a u = < x : 'a > and 'a t = 'a t u -# Characters 18-32: +# Characters 15-32: and 'a t = 'a t u;; - ^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^ Error: The type abbreviation t is cyclic # type 'a u = 'a -# Characters 5-18: +# Characters 0-18: type t = t u * t u;; - ^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^ Error: The type abbreviation t is cyclic # type t = < x : 'a > as 'a # type 'a u = 'a @@ -217,8 +217,8 @@ class e : # * * * * * * * * * * * * * * * * * * * * * module M : sig class c : unit -> object method xc : int end end # class d : unit -> object val x : int method xc : int method xd : int end # - : int * int = (1, 2) -# Characters 7-154: - ......virtual ['a] matrix (sz, init : int * 'a) = object +# Characters 1-154: + class virtual ['a] matrix (sz, init : int * 'a) = object val m = Array.make_matrix sz sz init method add (mtx : 'a matrix) = (mtx#m.(0).(0) : 'a) end.. diff --git a/testsuite/tests/typing-objects/Tests.ml.reference b/testsuite/tests/typing-objects/Tests.ml.reference index ed4df922..57628351 100644 --- a/testsuite/tests/typing-objects/Tests.ml.reference +++ b/testsuite/tests/typing-objects/Tests.ml.reference @@ -4,8 +4,8 @@ = <fun> # class ['a] c : unit -> object constraint 'a = int method f : 'a c end and ['a] d : unit -> object constraint 'a = int method f : 'a c end -# Characters 238-275: - ........d () = object +# Characters 234-275: + ....and d () = object inherit ['a] c () end.. Error: Some type variables are unbound in this type: @@ -19,8 +19,8 @@ and ['a] d : unit -> object constraint 'a = int #c end # * class ['a] c : 'a -> object ('a) constraint 'a = < f : 'a; .. > method f : 'a end # - : ('a c as 'a) -> 'a = <fun> -# * Characters 134-176: - ......x () = object +# * Characters 128-176: + class x () = object method virtual f : int end.. Error: This class should be virtual. The following methods are undefined : f @@ -29,8 +29,8 @@ Error: This class should be virtual. The following methods are undefined : f ^^^^^^^^ Error: This pattern cannot match self: it only matches values of type < f : int > -# Characters 38-110: - ......['a] c () = object +# Characters 32-110: + class ['a] c () = object constraint 'a = int method f x = (x : bool c) end.. @@ -51,17 +51,17 @@ Error: The abbreviation c is used with parameters bool c method f : 'a -> 'b -> unit end # val x : '_a list ref = {contents = []} -# Characters 6-50: - ......['a] c () = object +# Characters 0-50: + class ['a] c () = object method f = (x : 'a) end.. Error: The type of this class, class ['a] c : unit -> object constraint 'a = '_b list ref method f : 'a end, contains type variables that cannot be generalized -# Characters 24-52: +# Characters 20-52: type 'a c = <f : 'a c; g : 'a d> - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In the definition of d, type int c should be 'a c # type 'a c = < f : 'a c; g : 'a d > and 'a d = < f : 'a c > @@ -69,14 +69,14 @@ and 'a d = < f : 'a c > and 'a d = < f : int c > # type 'a u = < x : 'a > and 'a t = 'a t u -# Characters 18-32: +# Characters 15-32: and 'a t = 'a t u;; - ^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^ Error: The type abbreviation t is cyclic # type 'a u = 'a -# Characters 5-18: +# Characters 0-18: type t = t u * t u;; - ^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^ Error: The type abbreviation t is cyclic # type t = < x : 'a > as 'a # type 'a u = 'a @@ -217,8 +217,8 @@ class e : # * * * * * * * * * * * * * * * * * * * * * module M : sig class c : unit -> object method xc : int end end # class d : unit -> object val x : int method xc : int method xd : int end # - : int * int = (1, 2) -# Characters 7-154: - ......virtual ['a] matrix (sz, init : int * 'a) = object +# Characters 1-154: + class virtual ['a] matrix (sz, init : int * 'a) = object val m = Array.make_matrix sz sz init method add (mtx : 'a matrix) = (mtx#m.(0).(0) : 'a) end.. diff --git a/testsuite/tests/typing-poly/poly.ml.principal.reference b/testsuite/tests/typing-poly/poly.ml.principal.reference index 53acb415..4de2912d 100644 --- a/testsuite/tests/typing-poly/poly.ml.principal.reference +++ b/testsuite/tests/typing-poly/poly.ml.principal.reference @@ -169,9 +169,9 @@ val f4 : id -> int * bool = <fun> # class c : object method m : #id -> int * bool end # class id2 : object method id : 'a -> 'a method mono : int -> int end # val app : int * bool = (1, true) -# Characters 4-25: +# Characters 0-25: type 'a foo = 'a foo list - ^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^ Error: The type abbreviation foo is cyclic # class ['a] bar : 'a -> object end # type 'a foo = 'a foo bar @@ -271,9 +271,9 @@ Error: The universal type variable 'a cannot be generalized: type 'b alist = < visit : 'a. ('a, 'b) list_visitor -> 'a > class type ct = object ('a) method fold : ('b -> 'a -> 'b) -> 'b -> 'b end type t = { f : 'a 'b. ('b -> (#ct as 'a) -> 'b) -> 'b; } -# Characters 20-25: +# Characters 15-25: type t = u and u = t;; - ^^^^^ + ^^^^^^^^^^ Error: The type abbreviation t is cyclic # class ['a] a : object constraint 'a = [> `A of 'a a ] end type t = [ `A of t a ] @@ -301,9 +301,9 @@ Error: Constraints are not satisfied in this type. Type 'a u t should be an instance of g t # type 'a u = 'a constraint 'a = g and 'a v = 'a u t constraint 'a = g -# Characters 38-58: +# Characters 34-58: type 'a u = < m : 'a v > and 'a v = 'a list u;; - ^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^ Error: In the definition of v, type 'a list u should be 'a u # type 'a t = 'a type 'a u = A of 'a t @@ -346,9 +346,9 @@ Characters 21-24: ^^^ Warning 11: this match case is unused. - : int * [< `B ] -> int = <fun> -# Characters 69-135: +# Characters 64-135: type ('a, 'b) a = 'a -> unit constraint 'a = [> `B of ('a, 'b) b as 'b] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: Constraints are not satisfied in this type. Type ([> `B of 'a ], 'a) b as 'a @@ -640,9 +640,9 @@ Error: This field value has type unit -> unit which is less general than # Exception: Pervasives.Exit. # Exception: Pervasives.Exit. # Exception: Pervasives.Exit. -# Characters 20-44: +# Characters 16-44: type 'x t = < f : 'y. 'y t >;; - ^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In the definition of t, type 'y t should be 'x t # val using_match : bool -> int * ('a -> 'a) = <fun> # - : ('a -> 'a) * ('b -> 'b) = (<fun>, <fun>) diff --git a/testsuite/tests/typing-poly/poly.ml.reference b/testsuite/tests/typing-poly/poly.ml.reference index 9929020d..8855c1f6 100644 --- a/testsuite/tests/typing-poly/poly.ml.reference +++ b/testsuite/tests/typing-poly/poly.ml.reference @@ -161,9 +161,9 @@ Error: This expression has type bool but an expression was expected of type # class c : object method m : #id -> int * bool end # class id2 : object method id : 'a -> 'a method mono : int -> int end # val app : int * bool = (1, true) -# Characters 4-25: +# Characters 0-25: type 'a foo = 'a foo list - ^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^ Error: The type abbreviation foo is cyclic # class ['a] bar : 'a -> object end # type 'a foo = 'a foo bar @@ -254,9 +254,9 @@ Error: The universal type variable 'a cannot be generalized: type 'b alist = < visit : 'a. ('a, 'b) list_visitor -> 'a > class type ct = object ('a) method fold : ('b -> 'a -> 'b) -> 'b -> 'b end type t = { f : 'a 'b. ('b -> (#ct as 'a) -> 'b) -> 'b; } -# Characters 20-25: +# Characters 15-25: type t = u and u = t;; - ^^^^^ + ^^^^^^^^^^ Error: The type abbreviation t is cyclic # class ['a] a : object constraint 'a = [> `A of 'a a ] end type t = [ `A of t a ] @@ -284,9 +284,9 @@ Error: Constraints are not satisfied in this type. Type 'a u t should be an instance of g t # type 'a u = 'a constraint 'a = g and 'a v = 'a u t constraint 'a = g -# Characters 38-58: +# Characters 34-58: type 'a u = < m : 'a v > and 'a v = 'a list u;; - ^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^ Error: In the definition of v, type 'a list u should be 'a u # type 'a t = 'a type 'a u = A of 'a t @@ -329,9 +329,9 @@ Characters 21-24: ^^^ Warning 11: this match case is unused. - : int * [< `B ] -> int = <fun> -# Characters 69-135: +# Characters 64-135: type ('a, 'b) a = 'a -> unit constraint 'a = [> `B of ('a, 'b) b as 'b] - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: Constraints are not satisfied in this type. Type ([> `B of 'a ], 'a) b as 'a @@ -598,9 +598,9 @@ Error: This field value has type unit -> unit which is less general than # Exception: Pervasives.Exit. # Exception: Pervasives.Exit. # Exception: Pervasives.Exit. -# Characters 20-44: +# Characters 16-44: type 'x t = < f : 'y. 'y t >;; - ^^^^^^^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: In the definition of t, type 'y t should be 'x t # val using_match : bool -> int * ('a -> 'a) = <fun> # - : ('a -> 'a) * ('b -> 'b) = (<fun>, <fun>) diff --git a/testsuite/tests/typing-private/private.ml.principal.reference b/testsuite/tests/typing-private/private.ml.principal.reference index 96b1d759..db933583 100644 --- a/testsuite/tests/typing-private/private.ml.principal.reference +++ b/testsuite/tests/typing-private/private.ml.principal.reference @@ -84,9 +84,9 @@ Error: Signature mismatch: # module M1 : sig type t = M.t val mk : int -> t end # module M2 : sig type t = M.t val mk : int -> t end # module M3 : sig type t = M.t val mk : int -> t end -# Characters 26-44: +# Characters 21-44: type t = M.t = T of int - ^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^ Error: This variant or record definition does not match that of type M.t A private type would be revealed. # module M5 : sig type t = M.t = private T of int val mk : int -> t end diff --git a/testsuite/tests/typing-private/private.ml.reference b/testsuite/tests/typing-private/private.ml.reference index cb1573ed..341bc936 100644 --- a/testsuite/tests/typing-private/private.ml.reference +++ b/testsuite/tests/typing-private/private.ml.reference @@ -84,9 +84,9 @@ Error: Signature mismatch: # module M1 : sig type t = M.t val mk : int -> t end # module M2 : sig type t = M.t val mk : int -> t end # module M3 : sig type t = M.t val mk : int -> t end -# Characters 26-44: +# Characters 21-44: type t = M.t = T of int - ^^^^^^^^^^^^^^^^^^ + ^^^^^^^^^^^^^^^^^^^^^^^ Error: This variant or record definition does not match that of type M.t A private type would be revealed. # module M5 : sig type t = M.t = private T of int val mk : int -> t end diff --git a/testsuite/tests/typing-rectypes-bugs/pr6870_bad.ml b/testsuite/tests/typing-rectypes-bugs/pr6870_bad.ml new file mode 100644 index 00000000..ed834605 --- /dev/null +++ b/testsuite/tests/typing-rectypes-bugs/pr6870_bad.ml @@ -0,0 +1,2 @@ +module type T = sig type 'a t end +module Fix (T : T) = struct type r = ('r T.t as 'r) end diff --git a/testsuite/tests/typing-short-paths/pr6836.ml b/testsuite/tests/typing-short-paths/pr6836.ml new file mode 100644 index 00000000..121bc463 --- /dev/null +++ b/testsuite/tests/typing-short-paths/pr6836.ml @@ -0,0 +1,6 @@ +type t = [`A | `B];; +type 'a u = t;; +let a : [< int u] = `A;; + +type 'a s = 'a;; +let b : [< t s] = `B;; diff --git a/testsuite/tests/typing-short-paths/pr6836.ml.reference b/testsuite/tests/typing-short-paths/pr6836.ml.reference new file mode 100644 index 00000000..3f8c6dbd --- /dev/null +++ b/testsuite/tests/typing-short-paths/pr6836.ml.reference @@ -0,0 +1,7 @@ + +# type t = [ `A | `B ] +# type 'a u = t +# val a : [< int u > `A ] = `A +# type 'a s = 'a +# val b : [< t > `B ] = `B +# diff --git a/testsuite/tests/typing-short-paths/short-paths.ml b/testsuite/tests/typing-short-paths/short-paths.ml index a9812f4f..5d691aca 100644 --- a/testsuite/tests/typing-short-paths/short-paths.ml +++ b/testsuite/tests/typing-short-paths/short-paths.ml @@ -52,3 +52,6 @@ module N2 = struct type u = v and v = M1.v end;; module type PR6566 = sig type t = string end;; module PR6566 = struct type t = int end;; module PR6566' : PR6566 = PR6566;; + +module A = struct module B = struct type t = T end end;; +module M2 = struct type u = A.B.t type foo = int type v = A.B.t end;; diff --git a/testsuite/tests/typing-short-paths/short-paths.ml.reference b/testsuite/tests/typing-short-paths/short-paths.ml.reference index 53309ad3..b45fdd0d 100644 --- a/testsuite/tests/typing-short-paths/short-paths.ml.reference +++ b/testsuite/tests/typing-short-paths/short-paths.ml.reference @@ -80,4 +80,6 @@ Error: Signature mismatch: type t = int is not included in type t = bytes +# module A : sig module B : sig type t = T end end +# module M2 : sig type u = A.B.t type foo = int type v = u end # diff --git a/testsuite/tests/typing-warnings/pr6872.ml b/testsuite/tests/typing-warnings/pr6872.ml new file mode 100644 index 00000000..6eba3e70 --- /dev/null +++ b/testsuite/tests/typing-warnings/pr6872.ml @@ -0,0 +1,9 @@ +exception A;; +type a = A;; + +A;; +raise A;; +fun (A : a) -> ();; +function Not_found -> 1 | A -> 2 | _ -> 3;; +try raise A with A -> 2;; + diff --git a/testsuite/tests/typing-warnings/pr6872.ml.principal.reference b/testsuite/tests/typing-warnings/pr6872.ml.principal.reference new file mode 100644 index 00000000..0227cfd9 --- /dev/null +++ b/testsuite/tests/typing-warnings/pr6872.ml.principal.reference @@ -0,0 +1,35 @@ + +# exception A +# type a = A +# Characters 1-2: + A;; + ^ +Warning 41: A belongs to several types: a exn +The first one was selected. Please disambiguate if this is wrong. +- : a = A +# Characters 6-7: + raise A;; + ^ +Warning 42: this use of A required disambiguation. +Exception: A. +# - : a -> unit = <fun> +# Characters 26-27: + function Not_found -> 1 | A -> 2 | _ -> 3;; + ^ +Warning 41: A belongs to several types: a exn +The first one was selected. Please disambiguate if this is wrong. +Characters 26-27: + function Not_found -> 1 | A -> 2 | _ -> 3;; + ^ +Error: This pattern matches values of type a + but a pattern was expected which matches values of type exn +# Characters 10-11: + try raise A with A -> 2;; + ^ +Warning 42: this use of A required disambiguation. +Characters 17-18: + try raise A with A -> 2;; + ^ +Warning 42: this use of A required disambiguation. +- : int = 2 +# diff --git a/testsuite/tests/typing-warnings/pr6872.ml.reference b/testsuite/tests/typing-warnings/pr6872.ml.reference new file mode 100644 index 00000000..7aeebbeb --- /dev/null +++ b/testsuite/tests/typing-warnings/pr6872.ml.reference @@ -0,0 +1,30 @@ + +# exception A +# type a = A +# Characters 1-2: + A;; + ^ +Warning 41: A belongs to several types: a exn +The first one was selected. Please disambiguate if this is wrong. +- : a = A +# Characters 6-7: + raise A;; + ^ +Warning 42: this use of A required disambiguation. +Exception: A. +# - : a -> unit = <fun> +# Characters 26-27: + function Not_found -> 1 | A -> 2 | _ -> 3;; + ^ +Warning 42: this use of A required disambiguation. +- : exn -> int = <fun> +# Characters 10-11: + try raise A with A -> 2;; + ^ +Warning 42: this use of A required disambiguation. +Characters 17-18: + try raise A with A -> 2;; + ^ +Warning 42: this use of A required disambiguation. +- : int = 2 +# diff --git a/testsuite/tests/typing-warnings/unused_types.ml b/testsuite/tests/typing-warnings/unused_types.ml new file mode 100644 index 00000000..afe7d4cf --- /dev/null +++ b/testsuite/tests/typing-warnings/unused_types.ml @@ -0,0 +1,18 @@ +module Unused : sig +end = struct + type unused = int +end +;; + +module Unused_nonrec : sig +end = struct + type nonrec used = int + type nonrec unused = used +end +;; + +module Unused_rec : sig +end = struct + type unused = A of unused +end +;; diff --git a/testsuite/tests/typing-warnings/unused_types.ml.reference b/testsuite/tests/typing-warnings/unused_types.ml.reference new file mode 100644 index 00000000..d515c24e --- /dev/null +++ b/testsuite/tests/typing-warnings/unused_types.ml.reference @@ -0,0 +1,21 @@ + +# Characters 35-52: + type unused = int + ^^^^^^^^^^^^^^^^^ +Warning 34: unused type unused. +module Unused : sig end +# Characters 68-93: + type nonrec unused = used + ^^^^^^^^^^^^^^^^^^^^^^^^^ +Warning 34: unused type unused. +module Unused_nonrec : sig end +# Characters 40-65: + type unused = A of unused + ^^^^^^^^^^^^^^^^^^^^^^^^^ +Warning 34: unused type unused. +Characters 40-65: + type unused = A of unused + ^^^^^^^^^^^^^^^^^^^^^^^^^ +Warning 37: unused constructor A. +module Unused_rec : sig end +# diff --git a/testsuite/tests/utils/Makefile b/testsuite/tests/utils/Makefile index 4b7ab0dd..1d508680 100644 --- a/testsuite/tests/utils/Makefile +++ b/testsuite/tests/utils/Makefile @@ -18,3 +18,5 @@ CMO_FILES+="misc.cmo" include $(BASEDIR)/makefiles/Makefile.several include $(BASEDIR)/makefiles/Makefile.common + +BYTECODE_ONLY=true diff --git a/tools/.depend b/tools/.depend index c33f5c6f..810c439b 100644 --- a/tools/.depend +++ b/tools/.depend @@ -59,10 +59,10 @@ ocamldep.cmx : ../driver/pparse.cmx ../parsing/parsetree.cmi \ ../parsing/parse.cmx ../utils/misc.cmx ../parsing/longident.cmx \ ../parsing/location.cmx depend.cmx ../utils/config.cmx \ ../driver/compenv.cmx ../utils/clflags.cmx -ocamlmklib.cmo : ocamlmklibconfig.cmo -ocamlmklib.cmx : ocamlmklibconfig.cmx ocamlmklibconfig.cmo : ocamlmklibconfig.cmx : +ocamlmklib.cmo : ocamlmklibconfig.cmo +ocamlmklib.cmx : ocamlmklibconfig.cmx ocamlmktop.cmo : ../utils/ccomp.cmi ocamlmktop.cmx : ../utils/ccomp.cmx ocamloptp.cmo : ../driver/main_args.cmi diff --git a/tools/Makefile.shared b/tools/Makefile.shared index 25174344..0b90cd32 100644 --- a/tools/Makefile.shared +++ b/tools/Makefile.shared @@ -11,8 +11,9 @@ ######################################################################### include ../config/Makefile +CAMLRUN ?= ../boot/ocamlrun +CAMLYACC ?= ../boot/ocamlyacc -CAMLRUN=../boot/ocamlrun CAMLC=$(CAMLRUN) ../boot/ocamlc -nostdlib -I ../boot CAMLOPT=$(CAMLRUN) ../ocamlopt -nostdlib -I ../stdlib CAMLLEX=$(CAMLRUN) ../boot/ocamllex @@ -37,7 +38,7 @@ opt.opt: ocamldep.opt read_cmt.opt CAMLDEP_OBJ=depend.cmo ocamldep.cmo CAMLDEP_IMPORTS=misc.cmo config.cmo clflags.cmo terminfo.cmo \ - warnings.cmo location.cmo longident.cmo \ + warnings.cmo location.cmo longident.cmo docstrings.cmo \ syntaxerr.cmo ast_helper.cmo parser.cmo lexer.cmo parse.cmo \ ccomp.cmo ast_mapper.cmo pparse.cmo compenv.cmo @@ -67,7 +68,7 @@ install:: CSLPROF=ocamlprof.cmo CSLPROF_IMPORTS=misc.cmo config.cmo clflags.cmo terminfo.cmo \ - warnings.cmo location.cmo longident.cmo \ + warnings.cmo location.cmo longident.cmo docstrings.cmo \ syntaxerr.cmo ast_helper.cmo parser.cmo lexer.cmo parse.cmo ocamlprof: $(CSLPROF) profiling.cmo @@ -160,7 +161,7 @@ clean:: # Insert labels following an interface file (upgrade 3.02 to 3.03) ADDLABELS_IMPORTS=misc.cmo config.cmo clflags.cmo terminfo.cmo \ - warnings.cmo location.cmo longident.cmo \ + warnings.cmo location.cmo longident.cmo docstrings.cmo \ syntaxerr.cmo ast_helper.cmo parser.cmo lexer.cmo parse.cmo addlabels: addlabels.cmo @@ -205,6 +206,7 @@ READ_CMT= \ ../utils/clflags.cmo \ ../parsing/location.cmo \ ../parsing/longident.cmo \ + ../parsing/docstrings.cmo \ ../parsing/lexer.cmo \ ../parsing/pprintast.cmo \ ../parsing/ast_helper.cmo \ @@ -257,7 +259,7 @@ dumpobj: $(DUMPOBJ) clean:: rm -f dumpobj -opnames.ml: ../byterun/instruct.h +opnames.ml: ../byterun/caml/instruct.h unset LC_ALL || : ; \ unset LC_CTYPE || : ; \ unset LC_COLLATE LANG || : ; \ @@ -267,7 +269,7 @@ opnames.ml: ../byterun/instruct.h -e 's/.*};$$/ |]/' \ -e 's/\([A-Z][A-Z_0-9a-z]*\)/"\1"/g' \ -e 's/,/;/g' \ - ../byterun/instruct.h > opnames.ml + ../byterun/caml/instruct.h > opnames.ml clean:: rm -f opnames.ml @@ -276,8 +278,15 @@ beforedepend:: opnames.ml # Display info on compiled files +ifeq "$(CCOMPTYPE)" "msvc" +CCOUT = -Fe +else +EMPTY = +CCOUT = -o $(EMPTY) +endif + objinfo_helper$(EXE): objinfo_helper.c ../config/s.h - $(BYTECC) -o objinfo_helper$(EXE) $(BYTECCCOMPOPTS) \ + $(BYTECC) $(CCOUT)objinfo_helper$(EXE) $(BYTECCCOMPOPTS) \ objinfo_helper.c $(LIBBFD_LINK) OBJINFO=../compilerlibs/ocamlcommon.cma \ diff --git a/tools/eqparsetree.ml b/tools/eqparsetree.ml index 128453e0..4c699e99 100644 --- a/tools/eqparsetree.ml +++ b/tools/eqparsetree.ml @@ -273,12 +273,13 @@ let rec eq_structure_item_desc : | (Pstr_primitive (a0, a1), Pstr_primitive (b0, b1)) -> (Asttypes.eq_loc eq_string (a0, b0)) && (eq_value_description (a1, b1)) - | (Pstr_type a0, Pstr_type b0) -> + | (Pstr_type (a0, a1), Pstr_type (b0, b1)) -> + (Asttypes.eq_rec_flag (a0, b0)) && eq_list (fun ((a0, a1), (b0, b1)) -> (Asttypes.eq_loc eq_string (a0, b0)) && (eq_type_declaration (a1, b1))) - (a0, b0) + (a1, b1) | (Pstr_exception (a0, a1), Pstr_exception (b0, b1)) -> (Asttypes.eq_loc eq_string (a0, b0)) && (eq_exception_declaration (a1, b1)) @@ -359,12 +360,13 @@ and eq_signature_item_desc : | (Psig_value (a0, a1), Psig_value (b0, b1)) -> (Asttypes.eq_loc eq_string (a0, b0)) && (eq_value_description (a1, b1)) - | (Psig_type a0, Psig_type b0) -> + | (Psig_type (a0, a1), Psig_type (b0, b1)) -> + (Asttypes.eq_rec_flag (a0, b0)) && eq_list (fun ((a0, a1), (b0, b1)) -> (Asttypes.eq_loc eq_string (a0, b0)) && (eq_type_declaration (a1, b1))) - (a0, b0) + (a1, b1) | (Psig_exception (a0, a1), Psig_exception (b0, b1)) -> (Asttypes.eq_loc eq_string (a0, b0)) && (eq_exception_declaration (a1, b1)) diff --git a/tools/objinfo_helper.c b/tools/objinfo_helper.c index a8c79bd3..4a76cff1 100644 --- a/tools/objinfo_helper.c +++ b/tools/objinfo_helper.c @@ -10,8 +10,8 @@ /***********************************************************************/ #include "../config/s.h" -#include "../byterun/mlvalues.h" -#include "../byterun/alloc.h" +#include "../byterun/caml/mlvalues.h" +#include "../byterun/caml/alloc.h" #include <stdio.h> #ifdef HAS_LIBBFD @@ -24,6 +24,12 @@ #include <bfd.h> #undef PACKAGE +#ifdef __APPLE__ +#define plugin_header_sym "_caml_plugin_header" +#else +#define plugin_header_sym "caml_plugin_header" +#endif + int main(int argc, char ** argv) { bfd *fd; @@ -74,14 +80,14 @@ int main(int argc, char ** argv) sym_count = bfd_canonicalize_dynamic_symtab (fd, symbol_table); for (i = 0; i < sym_count; i++) { - if (strcmp(symbol_table[i]->name, "caml_plugin_header") == 0) { + if (strcmp(symbol_table[i]->name, plugin_header_sym) == 0) { printf("%ld\n", (long) (offset + symbol_table[i]->value)); bfd_close(fd); return 0; } } - fprintf(stderr, "Error: missing symbol caml_plugin_header\n"); + fprintf(stderr, "Error: missing symbol %s\n", plugin_header_sym); bfd_close(fd); return 2; } diff --git a/tools/ocamlcp.ml b/tools/ocamlcp.ml index 51559aea..26ced6c5 100644 --- a/tools/ocamlcp.ml +++ b/tools/ocamlcp.ml @@ -61,12 +61,14 @@ module Options = Main_args.Make_bytecomp_options (struct let _impl s = with_impl := true; option_with_arg "-impl" s let _intf s = with_intf := true; option_with_arg "-intf" s let _intf_suffix s = option_with_arg "-intf-suffix" s + let _keep_docs = option "-keep-docs" let _keep_locs = option "-keep-locs" let _labels = option "-labels" let _linkall = option "-linkall" let _make_runtime = option "-make-runtime" let _no_alias_deps = option "-no-alias-deps" let _no_app_funct = option "-no-app-funct" + let _no_check_prims = option "-no-check-prims" let _noassert = option "-noassert" let _nolabels = option "-nolabels" let _noautolink = option "-noautolink" @@ -74,6 +76,7 @@ module Options = Main_args.Make_bytecomp_options (struct let _o s = option_with_arg "-o" s let _open s = option_with_arg "-open" s let _output_obj = option "-output-obj" + let _output_complete_obj = option "-output-complete-obj" let _pack = option "-pack" let _pp _s = incompatible "-pp" let _ppx _s = incompatible "-ppx" diff --git a/tools/ocamlmklib.ml b/tools/ocamlmklib.ml index 77ae57be..23a273ec 100644 --- a/tools/ocamlmklib.ml +++ b/tools/ocamlmklib.ml @@ -27,14 +27,17 @@ and caml_opts = ref [] (* -ccopt to pass to ocamlc, ocamlopt *) and dynlink = ref supports_shared_libraries and failsafe = ref false (* whether to fall back on static build only *) and c_libs = ref [] (* libs to pass to mksharedlib and ocamlc -cclib *) -and c_Lopts = ref [] (* options to pass to mksharedlib and ocamlc -cclib *) -and c_opts = ref [] (* options to pass to mksharedlib and ocamlc -ccopt *) +and c_Lopts = ref [] (* options to pass to mksharedlib and ocamlc -cclib *) +and c_opts = ref [] (* options to pass to mksharedlib and ocamlc -ccopt *) and ld_opts = ref [] (* options to pass only to the linker *) and ocamlc = ref (compiler_path "ocamlc") +and ocamlc_opts = ref [] (* options to pass only to ocamlc *) and ocamlopt = ref (compiler_path "ocamlopt") +and ocamlopt_opts = ref [] (* options to pass only to ocamlc *) and output = ref "a" (* Output name for OCaml part of library *) and output_c = ref "" (* Output name for C part of library *) and rpath = ref [] (* rpath options *) +and debug = ref false (* -g option *) and verbose = ref false let starts_with s pref = @@ -84,6 +87,8 @@ let parse_arguments argv = caml_opts := next_arg () :: "-I" :: !caml_opts else if s = "-failsafe" then failsafe := true + else if s = "-g" then + debug := true else if s = "-h" || s = "-help" || s = "--help" then raise (Bad_argument "") else if s = "-ldopt" then @@ -96,10 +101,14 @@ let parse_arguments argv = (c_Lopts := s :: !c_Lopts; let l = chop_prefix s "-L" in if not (Filename.is_relative l) then rpath := l :: !rpath) + else if s = "-ocamlcflags" then + ocamlc_opts := next_arg () :: !ocamlc_opts else if s = "-ocamlc" then ocamlc := next_arg () else if s = "-ocamlopt" then ocamlopt := next_arg () + else if s = "-ocamloptflags" then + ocamlopt_opts := next_arg () :: !ocamlopt_opts else if s = "-o" then output := next_arg() else if s = "-oc" then @@ -148,7 +157,8 @@ Usage: ocamlmklib [options] <.cmo|.cma|.cmx|.cmxa|.ml|.mli|.o|.a|.obj|.lib|\ \nOptions are:\ \n -cclib <lib> C library passed to ocamlc -a or ocamlopt -a only\ \n -ccopt <opt> C option passed to ocamlc -a or ocamlopt -a only\ -\n -custom disable dynamic loading\ +\n -custom Disable dynamic loading\ +\n -g Build with debug information\ \n -dllpath <dir> Add <dir> to the run-time search path for DLLs\ \n -F<dir> Specify a framework directory (MacOSX)\ \n -framework <name> Use framework <name> (MacOSX)\ @@ -162,7 +172,9 @@ Usage: ocamlmklib [options] <.cmo|.cma|.cmx|.cmxa|.ml|.mli|.o|.a|.obj|.lib|\ \n -l<lib> Specify a dependent C library\ \n -L<dir> Add <dir> to the path searched for C libraries\ \n -ocamlc <cmd> Use <cmd> in place of \"ocamlc\"\ +\n -ocamlcflags <opt> Pass <opt> to ocamlc\ \n -ocamlopt <cmd> Use <cmd> in place of \"ocamlopt\"\ +\n -ocamloptflags <opt> Pass <opt> to ocamlopt\ \n -o <name> Generated OCaml library is named <name>.cma or <name>.cmxa\ \n -oc <name> Generated C library is named dll<name>.so or lib<name>.a\ \n -rpath <dir> Same as -dllpath <dir>\ @@ -229,8 +241,9 @@ let build_libs () = if !c_objs <> [] then begin if !dynlink then begin let retcode = command - (Printf.sprintf "%s -o %s %s %s %s %s %s" + (Printf.sprintf "%s %s -o %s %s %s %s %s %s" mkdll + (if !debug then "-g" else "") (prepostfix "dll" !output_c ext_dll) (String.concat " " !c_objs) (String.concat " " !c_opts) @@ -248,9 +261,11 @@ let build_libs () = end; if !bytecode_objs <> [] then scommand - (sprintf "%s -a %s -o %s.cma %s %s -dllib -l%s -cclib -l%s %s %s %s %s" + (sprintf "%s -a %s %s %s -o %s.cma %s %s -dllib -l%s -cclib -l%s %s %s %s %s" (transl_path !ocamlc) + (if !debug then "-g" else "") (if !dynlink then "" else "-custom") + (String.concat " " !ocamlc_opts) !output (String.concat " " !caml_opts) (String.concat " " !bytecode_objs) @@ -262,8 +277,10 @@ let build_libs () = (String.concat " " !caml_libs)); if !native_objs <> [] then scommand - (sprintf "%s -a -o %s.cmxa %s %s -cclib -l%s %s %s %s %s" + (sprintf "%s -a %s %s -o %s.cmxa %s %s -cclib -l%s %s %s %s %s" (transl_path !ocamlopt) + (if !debug then "-g" else "") + (String.concat " " !ocamlopt_opts) !output (String.concat " " !caml_opts) (String.concat " " !native_objs) diff --git a/tools/ocamloptp.ml b/tools/ocamloptp.ml index 0b788843..fd15fe59 100644 --- a/tools/ocamloptp.ml +++ b/tools/ocamloptp.ml @@ -61,6 +61,7 @@ module Options = Main_args.Make_optcomp_options (struct let _inline n = option_with_int "-inline" n let _intf s = with_intf := true; option_with_arg "-intf" s let _intf_suffix s = option_with_arg "-intf-suffix" s + let _keep_docs = option "-keep-docs" let _keep_locs = option "-keep-locs" let _labels = option "-labels" let _linkall = option "-linkall" @@ -75,6 +76,7 @@ module Options = Main_args.Make_optcomp_options (struct let _o s = option_with_arg "-o" s let _open s = option_with_arg "-open" s let _output_obj = option "-output-obj" + let _output_complete_obj = option "-output-complete-obj" let _p = option "-p" let _pack = option "-pack" let _pp _s = incompatible "-pp" diff --git a/tools/untypeast.ml b/tools/untypeast.ml index 7641c91d..a8b992ef 100644 --- a/tools/untypeast.ml +++ b/tools/untypeast.ml @@ -624,7 +624,7 @@ and untype_class_field cf = in let exp = remove_fun_self exp in Pcf_method (lab, priv, Cfk_concrete (o, untype_expression exp)) - | Tcf_initializer exp -> + | Tcf_initializer exp -> let remove_fun_self = function | { exp_desc = Texp_function("", [case], _) } when is_self_pat case.c_lhs && case.c_guard = None -> case.c_rhs | e -> e diff --git a/toplevel/genprintval.ml b/toplevel/genprintval.ml index 27f45a2d..3144594f 100644 --- a/toplevel/genprintval.ml +++ b/toplevel/genprintval.ml @@ -37,11 +37,25 @@ module type EVALPATH = val same_value: valu -> valu -> bool end +type ('a, 'b) gen_printer = + | Zero of 'b + | Succ of ('a -> ('a, 'b) gen_printer) + module type S = sig type t val install_printer : Path.t -> Types.type_expr -> (formatter -> t -> unit) -> unit + val install_generic_printer : + Path.t -> Path.t -> + (int -> (int -> t -> Outcometree.out_value, + t -> Outcometree.out_value) gen_printer) -> + unit + val install_generic_printer' : + Path.t -> Path.t -> + (formatter -> t -> unit, + formatter -> t -> unit) gen_printer -> + unit val remove_printer : Path.t -> unit val outval_of_untyped_exception : t -> Outcometree.out_value val outval_of_value : @@ -50,8 +64,12 @@ module type S = Env.t -> t -> type_expr -> Outcometree.out_value end -module ObjTbl = Hashtbl.Make(struct - type t = Obj.t +module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct + + type t = O.t + + module ObjTbl = Hashtbl.Make(struct + type t = O.t let equal = (==) let hash x = try @@ -59,9 +77,6 @@ module ObjTbl = Hashtbl.Make(struct with exn -> 0 end) -module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct - - type t = O.t (* Given an exception value, we cannot recover its type, hence we cannot print its arguments in general. @@ -104,47 +119,74 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct (* The user-defined printers. Also used for some builtin types. *) + type printer = + | Simple of Types.type_expr * (O.t -> Outcometree.out_value) + | Generic of Path.t * (int -> (int -> O.t -> Outcometree.out_value, + O.t -> Outcometree.out_value) gen_printer) + let printers = ref ([ - Pident(Ident.create "print_int"), Predef.type_int, - (fun x -> Oval_int (O.obj x : int)); - Pident(Ident.create "print_float"), Predef.type_float, - (fun x -> Oval_float (O.obj x : float)); - Pident(Ident.create "print_char"), Predef.type_char, - (fun x -> Oval_char (O.obj x : char)); - Pident(Ident.create "print_string"), Predef.type_string, - (fun x -> Oval_string (O.obj x : string)); - Pident(Ident.create "print_int32"), Predef.type_int32, - (fun x -> Oval_int32 (O.obj x : int32)); - Pident(Ident.create "print_nativeint"), Predef.type_nativeint, - (fun x -> Oval_nativeint (O.obj x : nativeint)); - Pident(Ident.create "print_int64"), Predef.type_int64, - (fun x -> Oval_int64 (O.obj x : int64)) - ] : (Path.t * type_expr * (O.t -> Outcometree.out_value)) list) + ( Pident(Ident.create "print_int"), + Simple (Predef.type_int, + (fun x -> Oval_int (O.obj x : int))) ); + ( Pident(Ident.create "print_float"), + Simple (Predef.type_float, + (fun x -> Oval_float (O.obj x : float))) ); + ( Pident(Ident.create "print_char"), + Simple (Predef.type_char, + (fun x -> Oval_char (O.obj x : char))) ); + ( Pident(Ident.create "print_string"), + Simple (Predef.type_string, + (fun x -> Oval_string (O.obj x : string))) ); + ( Pident(Ident.create "print_int32"), + Simple (Predef.type_int32, + (fun x -> Oval_int32 (O.obj x : int32))) ); + ( Pident(Ident.create "print_nativeint"), + Simple (Predef.type_nativeint, + (fun x -> Oval_nativeint (O.obj x : nativeint))) ); + ( Pident(Ident.create "print_int64"), + Simple (Predef.type_int64, + (fun x -> Oval_int64 (O.obj x : int64)) )) + ] : (Path.t * printer) list) + + let exn_printer ppf path = + fprintf ppf "<printer %a raised an exception>" Printtyp.path path + + let out_exn path = + Oval_printer (fun ppf -> exn_printer ppf path) let install_printer path ty fn = let print_val ppf obj = - try fn ppf obj with - | exn -> - fprintf ppf "<printer %a raised an exception>" Printtyp.path path in + try fn ppf obj with exn -> exn_printer ppf path in let printer obj = Oval_printer (fun ppf -> print_val ppf obj) in - printers := (path, ty, printer) :: !printers + printers := (path, Simple (ty, printer)) :: !printers + + let install_generic_printer function_path constr_path fn = + printers := (function_path, Generic (constr_path, fn)) :: !printers + + let install_generic_printer' function_path ty_path fn = + let rec build gp depth = + match gp with + | Zero fn -> + let out_printer obj = + let printer ppf = + try fn ppf obj with _ -> exn_printer ppf function_path in + Oval_printer printer in + Zero out_printer + | Succ fn -> + let print_val fn_arg = + let print_arg ppf o = + !Oprint.out_value ppf (fn_arg (depth+1) o) in + build (fn print_arg) depth in + Succ print_val in + printers := (function_path, Generic (ty_path, build fn)) :: !printers let remove_printer path = let rec remove = function | [] -> raise Not_found - | (p, ty, fn as printer) :: rem -> + | ((p, _) as printer) :: rem -> if Path.same p path then rem else printer :: remove rem in printers := remove !printers - let find_printer env ty = - let rec find = function - | [] -> raise Not_found - | (name, sch, printer) :: remainder -> - if Ctype.moregeneral env false sch ty - then printer - else find remainder - in find !printers - (* Print a constructor or label, giving it the same prefix as the type it comes from. Attempt to omit the prefix if the type comes from a module that has been opened. *) @@ -184,8 +226,8 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct let nested_values = ObjTbl.create 8 in let nest_gen err f depth obj ty = - let repr = Obj.repr obj in - if not (Obj.is_block repr) then + let repr = obj in + if not (O.is_block repr) then f depth obj ty else if ObjTbl.mem nested_values repr then @@ -205,7 +247,7 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct if !printer_steps < 0 || depth < 0 then Oval_ellipsis else begin try - find_printer env ty obj + find_printer depth env ty obj with Not_found -> match (Ctype.repr ty).desc with | Tvar _ | Tunivar _ -> @@ -258,12 +300,58 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct Oval_array [] | Tconstr (path, [ty_arg], _) when Path.same path Predef.path_lazy_t -> - if Lazy.is_val (O.obj obj) - then let v = - nest tree_of_val depth (Lazy.force (O.obj obj)) ty_arg - in - Oval_constr (Oide_ident "lazy", [v]) - else Oval_stuff "<lazy>" + let obj_tag = O.tag obj in + (* Lazy values are represented in three possible ways: + + 1. a lazy thunk that is not yet forced has tag + Obj.lazy_tag + + 2. a lazy thunk that has just been forced has tag + Obj.forward_tag; its first field is the forced + result, which we can print + + 3. when the GC moves a forced trunk with forward_tag, + or when a thunk is directly created from a value, + we get a third representation where the value is + directly exposed, without the Obj.forward_tag + (if its own tag is not ambiguous, that is neither + lazy_tag nor forward_tag) + + Note that using Lazy.is_val and Lazy.force would be + unsafe, because they use the Obj.* functions rather + than the O.* functions of the functor argument, and + would thus crash if called from the toplevel + (debugger/printval instantiates Genprintval.Make with + an Obj module talking over a socket). + *) + if obj_tag = Obj.lazy_tag then Oval_stuff "<lazy>" + else begin + let forced_obj = + if obj_tag = Obj.forward_tag then O.field obj 0 else obj + in + (* calling oneself recursively on forced_obj risks + having a false positive for cycle detection; + indeed, in case (3) above, the value is stored + as-is instead of being wrapped in a forward + pointer. It means that, for (lazy "foo"), we have + forced_obj == obj + and it is easy to wrongly print (lazy <cycle>) in such + a case (PR#6669). + + Unfortunately, there is a corner-case that *is* + a real cycle: using -rectypes one can define + let rec x = lazy x + which creates a Forward_tagged block that points to + itself. For this reason, we still "nest" + (detect head cycles) on forward tags. + *) + let v = + if obj_tag = Obj.forward_tag + then nest tree_of_val depth forced_obj ty_arg + else tree_of_val depth forced_obj ty_arg + in + Oval_constr (Oide_ident "lazy", [v]) + end | Tconstr(path, ty_list, _) -> begin try let decl = Env.find_type path env in @@ -416,6 +504,35 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct | None -> Oval_stuff "<extension>" + and find_printer depth env ty = + let rec find = function + | [] -> raise Not_found + | (name, Simple (sch, printer)) :: remainder -> + if Ctype.moregeneral env false sch ty + then printer + else find remainder + | (name, Generic (path, fn)) :: remainder -> + begin match (Ctype.expand_head env ty).desc with + | Tconstr (p, args, _) when Path.same p path -> + begin try apply_generic_printer path (fn depth) args + with _ -> (fun obj -> out_exn path) end + | _ -> find remainder end in + find !printers + + and apply_generic_printer path printer args = + match (printer, args) with + | (Zero fn, []) -> (fun (obj : O.t)-> try fn obj with _ -> out_exn path) + | (Succ fn, arg :: args) -> + let printer = fn (fun depth obj -> tree_of_val depth obj arg) in + apply_generic_printer path printer args + | _ -> + (fun obj -> + let printer ppf = + fprintf ppf "<internal error: incorrect arity for '%a'>" + Printtyp.path path in + Oval_printer printer) + + in nest tree_of_val max_depth obj ty end diff --git a/toplevel/genprintval.mli b/toplevel/genprintval.mli index 3f7b85ab..1c2ec471 100644 --- a/toplevel/genprintval.mli +++ b/toplevel/genprintval.mli @@ -33,11 +33,28 @@ module type EVALPATH = val same_value: valu -> valu -> bool end +type ('a, 'b) gen_printer = + | Zero of 'b + | Succ of ('a -> ('a, 'b) gen_printer) + module type S = sig type t val install_printer : Path.t -> Types.type_expr -> (formatter -> t -> unit) -> unit + val install_generic_printer : + Path.t -> Path.t -> + (int -> (int -> t -> Outcometree.out_value, + t -> Outcometree.out_value) gen_printer) -> + unit + val install_generic_printer' : + Path.t -> Path.t -> + (formatter -> t -> unit, + formatter -> t -> unit) gen_printer -> + unit + (** [install_generic_printer' function_path constructor_path printer] + function_path is used to remove the printer. *) + val remove_printer : Path.t -> unit val outval_of_untyped_exception : t -> Outcometree.out_value val outval_of_value : diff --git a/toplevel/opttoploop.ml b/toplevel/opttoploop.ml index 9e9e3d74..d21860a8 100644 --- a/toplevel/opttoploop.ml +++ b/toplevel/opttoploop.ml @@ -136,7 +136,7 @@ let load_lambda ppf (size, lam) = else Filename.temp_file ("caml" ^ !phrase_name) ext_dll in let fn = Filename.chop_extension dll in - Asmgen.compile_implementation ~toplevel:need_symbol fn ppf (size, lam); + Asmgen.compile_implementation ~toplevel:need_symbol fn ppf (size, slam); Asmlink.call_linker_shared [fn ^ ext_obj] dll; Sys.remove (fn ^ ext_obj); diff --git a/toplevel/topdirs.ml b/toplevel/topdirs.ml index 4773c3f0..42fe0a5d 100644 --- a/toplevel/topdirs.ml +++ b/toplevel/topdirs.ml @@ -185,17 +185,40 @@ let _ = Hashtbl.add directive_table "mod_use" (* Install, remove a printer *) +let filter_arrow ty = + let ty = Ctype.expand_head !toplevel_env ty in + match ty.desc with + | Tarrow (lbl, l, r, _) when not (Btype.is_optional lbl) -> Some (l, r) + | _ -> None + +let rec extract_last_arrow desc = + match filter_arrow desc with + | None -> raise (Ctype.Unify []) + | Some (_, r as res) -> + try extract_last_arrow r + with Ctype.Unify _ -> res + +let extract_target_type ty = fst (extract_last_arrow ty) +let extract_target_parameters ty = + let ty = extract_target_type ty |> Ctype.expand_head !toplevel_env in + match ty.desc with + | Tconstr (path, (_ :: _ as args), _) + when Ctype.all_distinct_vars !toplevel_env args -> Some (path, args) + | _ -> None + type 'a printer_type_new = Format.formatter -> 'a -> unit type 'a printer_type_old = 'a -> unit -let match_printer_type ppf desc typename = +let printer_type ppf typename = let (printer_type, _) = try Env.lookup_type (Ldot(Lident "Topdirs", typename)) !toplevel_env with Not_found -> fprintf ppf "Cannot find type Topdirs.%s.@." typename; raise Exit in - Ctype.init_def(Ident.current_time()); + printer_type + +let match_simple_printer_type ppf desc printer_type = Ctype.begin_def(); let ty_arg = Ctype.newvar() in Ctype.unify !toplevel_env @@ -203,16 +226,45 @@ let match_printer_type ppf desc typename = (Ctype.instance_def desc.val_type); Ctype.end_def(); Ctype.generalize ty_arg; - ty_arg + (ty_arg, None) + +let match_generic_printer_type ppf desc path args printer_type = + Ctype.begin_def(); + let args = List.map (fun _ -> Ctype.newvar ()) args in + let ty_target = Ctype.newty (Tconstr (path, args, ref Mnil)) in + let ty_args = + List.map (fun ty_var -> Ctype.newconstr printer_type [ty_var]) args in + let ty_expected = + List.fold_right + (fun ty_arg ty -> Ctype.newty (Tarrow ("", ty_arg, ty, Cunknown))) + ty_args (Ctype.newconstr printer_type [ty_target]) in + Ctype.unify !toplevel_env + ty_expected + (Ctype.instance_def desc.val_type); + Ctype.end_def(); + Ctype.generalize ty_expected; + if not (Ctype.all_distinct_vars !toplevel_env args) then + raise (Ctype.Unify []); + (ty_expected, Some (path, ty_args)) + +let match_printer_type ppf desc = + let printer_type_new = printer_type ppf "printer_type_new" in + let printer_type_old = printer_type ppf "printer_type_old" in + Ctype.init_def(Ident.current_time()); + match extract_target_parameters desc.val_type with + | None -> + (try + (match_simple_printer_type ppf desc printer_type_new, false) + with Ctype.Unify _ -> + (match_simple_printer_type ppf desc printer_type_old, true)) + | Some (path, args) -> + (* only 'new' style is available for generic printers *) + match_generic_printer_type ppf desc path args printer_type_new, false let find_printer_type ppf lid = try let (path, desc) = Env.lookup_value lid !toplevel_env in - let (ty_arg, is_old_style) = - try - (match_printer_type ppf desc "printer_type_new", false) - with Ctype.Unify _ -> - (match_printer_type ppf desc "printer_type_old", true) in + let (ty_arg, is_old_style) = match_printer_type ppf desc in (ty_arg, path, is_old_style) with | Not_found -> @@ -225,14 +277,30 @@ let find_printer_type ppf lid = let dir_install_printer ppf lid = try - let (ty_arg, path, is_old_style) = find_printer_type ppf lid in + let ((ty_arg, ty), path, is_old_style) = + find_printer_type ppf lid in let v = eval_path !toplevel_env path in - let print_function = - if is_old_style then - (fun formatter repr -> Obj.obj v (Obj.obj repr)) - else - (fun formatter repr -> Obj.obj v formatter (Obj.obj repr)) in - install_printer path ty_arg print_function + match ty with + | None -> + let print_function = + if is_old_style then + (fun formatter repr -> Obj.obj v (Obj.obj repr)) + else + (fun formatter repr -> Obj.obj v formatter (Obj.obj repr)) in + install_printer path ty_arg print_function + | Some (ty_path, ty_args) -> + let rec build v = function + | [] -> + let print_function = + if is_old_style then + (fun formatter repr -> Obj.obj v (Obj.obj repr)) + else + (fun formatter repr -> Obj.obj v formatter (Obj.obj repr)) in + Zero print_function + | _ :: args -> + Succ + (fun fn -> build ((Obj.obj v : _ -> Obj.t) fn) args) in + install_generic_printer' path ty_path (build v ty_args) with Exit -> () let dir_remove_printer ppf lid = @@ -361,7 +429,8 @@ let show_prim to_sig ppf lid = in let id = Ident.create_persistent s in let sg = to_sig env loc id lid in - fprintf ppf "@[%a@]@." Printtyp.signature sg + Printtyp.wrap_printing_env env + (fun () -> fprintf ppf "@[%a@]@." Printtyp.signature sg) with | Not_found -> fprintf ppf "@[Unknown element.@]@." diff --git a/toplevel/toploop.ml b/toplevel/toploop.ml index 9fa802ca..a3cb06b0 100644 --- a/toplevel/toploop.ml +++ b/toplevel/toploop.ml @@ -96,7 +96,13 @@ let outval_of_value env obj ty = let print_value env obj ppf ty = !print_out_value ppf (outval_of_value env obj ty) +type ('a, 'b) gen_printer = ('a, 'b) Genprintval.gen_printer = + | Zero of 'b + | Succ of ('a -> ('a, 'b) gen_printer) + let install_printer = Printer.install_printer +let install_generic_printer = Printer.install_generic_printer +let install_generic_printer' = Printer.install_generic_printer' let remove_printer = Printer.remove_printer (* Hooks for parsing functions *) @@ -468,6 +474,7 @@ let initialize_toplevel_env () = exception PPerror let loop ppf = + Location.formatter_for_warnings := ppf; fprintf ppf " OCaml version %s@.@." Config.version; initialize_toplevel_env (); let lb = Lexing.from_function refill_lexbuf in diff --git a/toplevel/toploop.mli b/toplevel/toploop.mli index 1867c001..6638d769 100644 --- a/toplevel/toploop.mli +++ b/toplevel/toploop.mli @@ -71,8 +71,19 @@ val eval_path: Env.t -> Path.t -> Obj.t val print_value: Env.t -> Obj.t -> formatter -> Types.type_expr -> unit val print_untyped_exception: formatter -> Obj.t -> unit +type ('a, 'b) gen_printer = + | Zero of 'b + | Succ of ('a -> ('a, 'b) gen_printer) + val install_printer : Path.t -> Types.type_expr -> (formatter -> Obj.t -> unit) -> unit +val install_generic_printer : + Path.t -> Path.t -> + (int -> (int -> Obj.t -> Outcometree.out_value, + Obj.t -> Outcometree.out_value) gen_printer) -> unit +val install_generic_printer' : + Path.t -> Path.t -> (formatter -> Obj.t -> unit, + formatter -> Obj.t -> unit) gen_printer -> unit val remove_printer : Path.t -> unit val max_printer_depth: int ref diff --git a/typing/ctype.ml b/typing/ctype.ml index 78852a43..d1ff9da5 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -1055,20 +1055,25 @@ let rec copy ?env ?partial ?keep_names ty = (* Open row if partial for pattern and contains Reither *) let more', row = match partial with - Some (free_univars, false) when row.row_closed - && not row.row_fixed && TypeSet.is_empty (free_univars ty) -> + Some (free_univars, false) -> + let more' = + if more.id != more'.id then more' else + let lv = if keep then more.level else !current_level in + newty2 lv (Tvar None) + in let not_reither (_, f) = match row_field_repr f with Reither _ -> false | _ -> true in - if List.for_all not_reither row.row_fields - then (more', row) else - (newty2 (if keep then more.level else !current_level) - (Tvar None), - {row_fields = List.filter not_reither row.row_fields; - row_more = more; row_bound = (); - row_closed = false; row_fixed = false; row_name = None}) + if row.row_closed && not row.row_fixed + && TypeSet.is_empty (free_univars ty) + && not (List.for_all not_reither row.row_fields) then + (more', + {row_fields = List.filter not_reither row.row_fields; + row_more = more'; row_bound = (); + row_closed = false; row_fixed = false; row_name = None}) + else (more', row) | _ -> (more', row) in (* Register new type first for recursion *) @@ -1662,10 +1667,11 @@ exception Occur let rec occur_rec env visited ty0 ty = if ty == ty0 then raise Occur; + let occur_ok = !Clflags.recursive_types && is_contractive env ty in match ty.desc with Tconstr(p, tl, abbrev) -> begin try - if List.memq ty visited || !Clflags.recursive_types then raise Occur; + if occur_ok || List.memq ty visited then raise Occur; iter_type_expr (occur_rec env (ty::visited) ty0) ty with Occur -> try let ty' = try_expand_head try_expand_once env ty in @@ -1676,15 +1682,15 @@ let rec occur_rec env visited ty0 ty = match ty'.desc with Tobject _ | Tvariant _ -> () | _ -> - if not !Clflags.recursive_types then + if not (!Clflags.recursive_types && is_contractive env ty') then iter_type_expr (occur_rec env (ty'::visited) ty0) ty' with Cannot_expand -> - if not !Clflags.recursive_types then raise Occur + if not occur_ok then raise Occur end | Tobject _ | Tvariant _ -> () | _ -> - if not !Clflags.recursive_types then + if not occur_ok then iter_type_expr (occur_rec env visited ty0) ty let type_changed = ref false (* trace possible changes to the studied type *) @@ -2052,8 +2058,11 @@ let rec mcomp type_pairs env t1 t2 = | (Tconstr (p1, tl1, _), Tconstr (p2, tl2, _)) -> mcomp_type_decl type_pairs env p1 p2 tl1 tl2 | (Tconstr (p, _, _), _) | (_, Tconstr (p, _, _)) -> - let decl = Env.find_type p env in - if non_aliasable p decl then raise (Unify []) + begin try + let decl = Env.find_type p env in + if non_aliasable p decl || is_datatype decl then raise (Unify []) + with Not_found -> () + end (* | (Tpackage (p1, n1, tl1), Tpackage (p2, n2, tl2)) when n1 = n2 -> mcomp_list type_pairs env tl1 tl2 diff --git a/typing/ctype.mli b/typing/ctype.mli index 37daf3a4..36cb186f 100644 --- a/typing/ctype.mli +++ b/typing/ctype.mli @@ -144,6 +144,7 @@ val try_expand_once_opt: Env.t -> type_expr -> type_expr val expand_head_opt: Env.t -> type_expr -> type_expr (** The compiler's own version of [expand_head] necessary for type-based optimisations. *) + val full_expand: Env.t -> type_expr -> type_expr val extract_concrete_typedecl: Env.t -> type_expr -> Path.t * Path.t * type_declaration diff --git a/typing/env.ml b/typing/env.ml index 7df15660..b11be4d8 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -58,6 +58,7 @@ type error = | Inconsistent_import of string * string * string | Need_recursive_types of string * string | Missing_module of Location.t * Path.t * Path.t + | Illegal_value_name of Location.t * string exception Error of error @@ -69,6 +70,7 @@ module EnvLazy : sig val force : ('a -> 'b) -> ('a,'b) t -> 'b val create : 'a -> ('a,'b) t val is_val : ('a,'b) t -> bool + val get_arg : ('a,'b) t -> 'a option end = struct @@ -95,6 +97,9 @@ end = struct let is_val x = match !x with Done _ -> true | _ -> false + let get_arg x = + match !x with Thunk a -> Some a | _ -> None + let create x = let x = ref (Thunk x) in x @@ -336,6 +341,12 @@ let check_consistency ps = (* Reading persistent structures from .cmi files *) +let save_pers_struct crc ps = + let modname = ps.ps_name in + Hashtbl.add persistent_structures modname (Some ps); + Consistbl.set crc_units modname crc ps.ps_filename; + add_import modname + let read_pers_struct modname filename = let cmi = read_cmi filename in let name = cmi.cmi_name in @@ -377,6 +388,10 @@ let find_pers_struct ?(check=true) name = | Some None -> raise Not_found | Some (Some sg) -> sg | None -> + (* PR#6843: record the weak dependency ([add_import]) even if + the [find_in_path_uncap] call below fails to find the .cmi, + to help make builds more deterministic. *) + add_import name; let filename = try find_in_path_uncap !load_path (name ^ ".cmi") with Not_found -> @@ -414,6 +429,9 @@ let reset_cache_toplevel () = let set_unit_name name = current_unit := name +let get_unit_name () = + !current_unit + (* Lookup by identifier *) let rec find_module_descr path env = @@ -423,7 +441,7 @@ let rec find_module_descr path env = let (p, desc) = EnvTbl.find_same id env.components in desc with Not_found -> - if Ident.persistent id + if Ident.persistent id && not (Ident.name id = !current_unit) then (find_pers_struct (Ident.name id)).ps_comps else raise Not_found end @@ -487,7 +505,7 @@ let find_module ~alias path env = let (p, data) = EnvTbl.find_same id env.modules in data with Not_found -> - if Ident.persistent id then + if Ident.persistent id && not (Ident.name id = !current_unit) then let ps = find_pers_struct (Ident.name id) in md (Mty_signature(ps.ps_sig)) else raise Not_found @@ -927,20 +945,38 @@ let lookup_cltype lid env = (* Iter on an environment (ignoring the body of functors and not yet evaluated structures) *) -let iter_env proj1 proj2 f env = +type iter_cont = unit -> unit +let iter_env_cont = ref [] + +let rec scrape_alias_safe env mty = + match mty with + | Mty_alias (Pident id) when Ident.persistent id -> false + | Mty_alias path -> (* PR#6600: find_module may raise Not_found *) + scrape_alias_safe env (find_module path env).md_type + | _ -> true + +let iter_env proj1 proj2 f env () = Ident.iter (fun id (x,_) -> f (Pident id) x) (proj1 env); let rec iter_components path path' mcomps = - (* if EnvLazy.is_val mcomps then *) - match EnvLazy.force !components_of_module_maker' mcomps with - Structure_comps comps -> - Tbl.iter - (fun s (d, n) -> f (Pdot (path, s, n)) (Pdot (path', s, n), d)) - (proj2 comps); - Tbl.iter - (fun s (c, n) -> - iter_components (Pdot (path, s, n)) (Pdot (path', s, n)) c) - comps.comp_components - | Functor_comps _ -> () + let cont () = + let safe = + match EnvLazy.get_arg mcomps with + None -> true + | Some (env, sub, path, mty) -> + try scrape_alias_safe env mty with Not_found -> false + in + if not safe then () else + match EnvLazy.force !components_of_module_maker' mcomps with + Structure_comps comps -> + Tbl.iter + (fun s (d, n) -> f (Pdot (path, s, n)) (Pdot (path', s, n), d)) + (proj2 comps); + Tbl.iter + (fun s (c, n) -> + iter_components (Pdot (path, s, n)) (Pdot (path', s, n)) c) + comps.comp_components + | Functor_comps _ -> () + in iter_env_cont := (path, cont) :: !iter_env_cont in Hashtbl.iter (fun s pso -> @@ -953,6 +989,13 @@ let iter_env proj1 proj2 f env = (fun id ((path, comps), _) -> iter_components (Pident id) path comps) env.components +let run_iter_cont l = + iter_env_cont := []; + List.iter (fun c -> c ()) l; + let cont = List.rev !iter_env_cont in + iter_env_cont := []; + cont + let iter_types f = iter_env (fun env -> env.types) (fun sc -> sc.comp_types) f let same_types env1 env2 = @@ -1296,7 +1339,20 @@ and check_usage loc id warn tbl = (fun () -> if not !used then Location.prerr_warning loc (warn name)) end; +and check_value_name name loc = + (* Note: we could also check here general validity of the + identifier, to protect against bad identifiers forged by -pp or + -ppx preprocessors. *) + + if String.length name > 0 && (name.[0] = '#') then + for i = 1 to String.length name - 1 do + if name.[i] = '#' then + raise (Error(Illegal_value_name(loc, name))) + done + + and store_value ?check slot id path decl env renv = + check_value_name (Ident.name id) decl.val_loc; may (fun f -> check_usage decl.val_loc id f value_declarations) check; { env with values = EnvTbl.add "value" slot id (path, decl) env.values renv.values; @@ -1643,9 +1699,7 @@ let save_signature_with_imports sg modname filename imports = ps_flags = cmi.cmi_flags; ps_crcs_checked = false; } in - Hashtbl.add persistent_structures modname (Some ps); - Consistbl.set crc_units modname crc filename; - add_import modname; + save_pers_struct crc ps; sg with exn -> close_out oc; @@ -1808,11 +1862,16 @@ let report_error ppf = function fprintf ppf "@]@ @[%s@ %s@ %s.@]@]" "The compiled interface for module" (Ident.name (Path.head path2)) "was not found" + | Illegal_value_name(_loc, name) -> + fprintf ppf "'%s' is not a valid value identifier." + name let () = Location.register_error_of_exn (function - | Error (Missing_module (loc, _, _) as err) when loc <> Location.none -> + | Error (Missing_module (loc, _, _) + | Illegal_value_name (loc, _) + as err) when loc <> Location.none -> Some (Location.error_of_printer loc report_error err) | Error err -> Some (Location.error_of_printer_file report_error err) | _ -> None diff --git a/typing/env.mli b/typing/env.mli index ed2f6f1c..e894557e 100644 --- a/typing/env.mli +++ b/typing/env.mli @@ -37,9 +37,11 @@ type type_descriptions = constructor_description list * label_description list (* For short-paths *) +type iter_cont val iter_types: (Path.t -> Path.t * (type_declaration * type_descriptions) -> unit) -> - t -> unit + t -> iter_cont +val run_iter_cont: iter_cont list -> (Path.t * iter_cont) list val same_types: t -> t -> bool val used_persistent: unit -> Concr.t val find_shadowed_types: Path.t -> t -> Path.t list @@ -145,6 +147,7 @@ val reset_cache_toplevel: unit -> unit (* Remember the name of the current compilation unit. *) val set_unit_name: string -> unit +val get_unit_name: unit -> string (* Read, save a signature to/from a file *) @@ -189,6 +192,7 @@ type error = | Inconsistent_import of string * string * string | Need_recursive_types of string * string | Missing_module of Location.t * Path.t * Path.t + | Illegal_value_name of Location.t * string exception Error of error @@ -256,3 +260,4 @@ val fold_cltypes: (** Utilities *) val scrape_alias: t -> module_type -> module_type +val check_value_name: string -> Location.t -> unit diff --git a/typing/oprint.ml b/typing/oprint.ml index 994d9327..4f482325 100644 --- a/typing/oprint.ml +++ b/typing/oprint.ml @@ -419,7 +419,10 @@ and print_out_sig_item ppf = name !out_module_type mty | Osig_type(td, rs) -> print_out_type_decl - (if rs = Orec_next then "and" else "type") + (match rs with + | Orec_not -> "type nonrec" + | Orec_first -> "type" + | Orec_next -> "and") ppf td | Osig_value (name, ty, prims) -> let kwd = if prims = [] then "val" else "external" in diff --git a/typing/parmatch.ml b/typing/parmatch.ml index 6732be7a..c2c7ceba 100644 --- a/typing/parmatch.ml +++ b/typing/parmatch.ml @@ -210,7 +210,8 @@ and pretty_cdr ppf v = match v.pat_desc with | _ -> pretty_val ppf v and pretty_arg ppf v = match v.pat_desc with -| Tpat_construct (_,_,_::_) -> fprintf ppf "(%a)" pretty_val v +| Tpat_construct (_,_,_::_) +| Tpat_variant (_, Some _, _) -> fprintf ppf "(%a)" pretty_val v | _ -> pretty_val ppf v and pretty_or ppf v = match v.pat_desc with @@ -1811,8 +1812,8 @@ let do_check_partial ?pred exhaust loc casel pss = match pss with let errmsg = match v.pat_desc with Tpat_construct (_, {cstr_name="*extension*"}, _) -> - "_\nMatching over values of open types must include\n\ - a wild card pattern in order to be exhaustive." + "_\nMatching over values of extensible variant types must include\n\ + a wild card pattern in order to be exhaustive." | _ -> try let buf = Buffer.create 16 in let fmt = formatter_of_buffer buf in diff --git a/typing/parmatch.mli b/typing/parmatch.mli index 947f16fa..dfd955a8 100644 --- a/typing/parmatch.mli +++ b/typing/parmatch.mli @@ -53,7 +53,6 @@ val complete_constrs : pattern -> constructor_tag list -> constructor_description list val pressure_variants: Env.t -> pattern list -> unit -val check_partial: Location.t -> case list -> partial val check_partial_gadt: ((string, constructor_description) Hashtbl.t -> (string, label_description) Hashtbl.t -> diff --git a/typing/printtyp.ml b/typing/printtyp.ml index 920c28b5..52fddd47 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -202,6 +202,10 @@ let () = Btype.print_raw := raw_type_expr type param_subst = Id | Nth of int | Map of int list +let is_nth = function + Nth _ -> true + | _ -> false + let compose l1 = function | Id -> Map l1 | Map l2 -> Map (List.map (List.nth l1) l2) @@ -216,6 +220,8 @@ let apply_subst s1 tyl = type best_path = Paths of Path.t list | Best of Path.t let printing_env = ref Env.empty +let printing_depth = ref 0 +let printing_cont = ref ([] : Env.iter_cont list) let printing_old = ref Env.empty let printing_pers = ref Concr.empty module Path2 = struct @@ -232,7 +238,7 @@ module Path2 = struct | _ -> Pervasives.compare p1 p2 end module PathMap = Map.Make(Path2) -let printing_map = ref (Lazy.from_val PathMap.empty) +let printing_map = ref PathMap.empty let same_type t t' = repr t == repr t' @@ -287,24 +293,24 @@ let set_printing_env env = (* printf "Reset printing_map@."; *) printing_old := env; printing_pers := Env.used_persistent (); - printing_map := lazy begin - (* printf "Recompute printing_map.@."; *) - let map = ref PathMap.empty in + printing_map := PathMap.empty; + printing_depth := 0; + (* printf "Recompute printing_map.@."; *) + let cont = Env.iter_types (fun p (p', decl) -> let (p1, s1) = normalize_type_path env p' ~cache:true in (* Format.eprintf "%a -> %a = %a@." path p path p' path p1 *) if s1 = Id then try - let r = PathMap.find p1 !map in + let r = PathMap.find p1 !printing_map in match !r with Paths l -> r := Paths (p :: l) - | Best _ -> assert false + | Best p' -> r := Paths [p; p'] (* assert false *) with Not_found -> - map := PathMap.add p1 (ref (Paths [p])) !map) - env; - !map - end + printing_map := PathMap.add p1 (ref (Paths [p])) !printing_map) + env in + printing_cont := [cont]; end let wrap_printing_env env f = @@ -347,10 +353,14 @@ let best_type_path p = then (p, Id) else let (p', s) = normalize_type_path !printing_env p in - let p'' = - try get_best_path (PathMap.find p' (Lazy.force !printing_map)) - with Not_found -> p' - in + let get_path () = get_best_path (PathMap.find p' !printing_map) in + while !printing_cont <> [] && + try ignore (get_path ()); false with Not_found -> true + do + printing_cont := List.map snd (Env.run_iter_cont !printing_cont); + incr printing_depth; + done; + let p'' = try get_path () with Not_found -> p' in (* Format.eprintf "%a = %a -> %a@." path p path p' path p''; *) (p'', s) @@ -437,7 +447,7 @@ let aliasable ty = match ty.desc with Tvar _ | Tunivar _ | Tpoly _ -> false | Tconstr (p, _, _) -> - (match best_type_path p with (_, Nth _) -> false | _ -> true) + not (is_nth (snd (best_type_path p))) | _ -> true let namable_row row = @@ -556,12 +566,10 @@ let rec tree_of_typexp sch ty = | Ttuple tyl -> Otyp_tuple (tree_of_typlist sch tyl) | Tconstr(p, tyl, abbrev) -> - begin match best_type_path p with - (_, Nth n) -> tree_of_typexp sch (List.nth tyl n) - | (p', s) -> - let tyl' = apply_subst s tyl in - Otyp_constr (tree_of_path p', tree_of_typlist sch tyl') - end + let p', s = best_type_path p in + let tyl' = apply_subst s tyl in + if is_nth s then tree_of_typexp sch (List.hd tyl') else + Otyp_constr (tree_of_path p', tree_of_typlist sch tyl') | Tvariant row -> let row = row_repr row in let fields = @@ -580,17 +588,22 @@ let rec tree_of_typexp sch ty = begin match row.row_name with | Some(p, tyl) when namable_row row -> let (p', s) = best_type_path p in - assert (s = Id); let id = tree_of_path p' in - let args = tree_of_typlist sch tyl in + let args = tree_of_typlist sch (apply_subst s tyl) in if row.row_closed && all_present then - Otyp_constr (id, args) + if is_nth s then List.hd args else Otyp_constr (id, args) else let non_gen = is_non_gen sch px in let tags = if all_present then None else Some (List.map fst present) in - Otyp_variant (non_gen, Ovar_name(id, args), - row.row_closed, tags) + let inh = + match args with + [Otyp_constr (i, a)] when is_nth s -> Ovar_name (i, a) + | _ -> + (* fallback case, should change outcometree... *) + Ovar_name (tree_of_path p, tree_of_typlist sch tyl) + in + Otyp_variant (non_gen, inh, row.row_closed, tags) | _ -> let non_gen = not (row.row_closed && all_present) && is_non_gen sch px in @@ -1136,7 +1149,7 @@ let dummy = let hide_rec_items = function | Sig_type(id, decl, rs) ::rem - when rs <> Trec_next && not !Clflags.real_paths -> + when rs = Trec_first && not !Clflags.real_paths -> let rec get_ids = function Sig_type (id, _, Trec_next) :: rem -> id :: get_ids rem @@ -1165,15 +1178,17 @@ let rec tree_of_modtype = function Omty_alias (tree_of_path p) and tree_of_signature sg = - wrap_env (fun env -> env) (tree_of_signature_rec !printing_env) sg + wrap_env (fun env -> env) (tree_of_signature_rec !printing_env false) sg -and tree_of_signature_rec env' = function +and tree_of_signature_rec env' in_type_group = function [] -> [] | item :: rem -> - begin match item with - Sig_type (_, _, rs) when rs <> Trec_next -> () - | _ -> set_printing_env env' - end; + let in_type_group = + match in_type_group, item with + true, Sig_type (_, _, Trec_next) -> true + | _, Sig_type (_, _, (Trec_not | Trec_first)) -> set_printing_env env'; true + | _ -> set_printing_env env'; false + in let (sg, rem) = filter_rem_sig item rem in let trees = match item with @@ -1197,7 +1212,7 @@ and tree_of_signature_rec env' = function [tree_of_cltype_declaration id decl rs] in let env' = Env.add_signature (item :: sg) env' in - trees @ tree_of_signature_rec env' rem + trees @ tree_of_signature_rec env' in_type_group rem and tree_of_modtype_declaration id decl = let mty = diff --git a/typing/stypes.ml b/typing/stypes.ml index e1f4557a..1f89e744 100644 --- a/typing/stypes.ml +++ b/typing/stypes.ml @@ -198,6 +198,10 @@ let dump filename = | Some filename -> open_out filename in sort_filter_phrases (); ignore (List.fold_left (print_info pp) Location.none info); + begin match filename with + | None -> () + | Some _ -> close_out pp + end; phrases := []; end else begin annotations := []; diff --git a/typing/subst.ml b/typing/subst.ml index 2e84be01..c9b18e26 100644 --- a/typing/subst.ml +++ b/typing/subst.ml @@ -42,11 +42,22 @@ let remove_loc = let open Ast_mapper in {default_mapper with location = (fun _this _loc -> Location.none)} -let attrs s x = - if s.for_saving && not !Clflags.keep_locs - then remove_loc.Ast_mapper.attributes remove_loc x - else x +let is_not_doc = function + | ({Location.txt = "ocaml.doc"}, _) -> false + | ({Location.txt = "ocaml.text"}, _) -> false + | ({Location.txt = "doc"}, _) -> false + | ({Location.txt = "text"}, _) -> false + | _ -> true +let attrs s x = + let x = + if s.for_saving && not !Clflags.keep_docs then + List.filter is_not_doc x + else x + in + if s.for_saving && not !Clflags.keep_locs + then remove_loc.Ast_mapper.attributes remove_loc x + else x let rec module_path s = function Pident id as p -> @@ -306,7 +317,7 @@ let extension_constructor s ext = ext_args = List.map (typexp s) ext.ext_args; ext_ret_type = may_map (typexp s) ext.ext_ret_type; ext_private = ext.ext_private; - ext_attributes = ext.ext_attributes; + ext_attributes = attrs s ext.ext_attributes; ext_loc = if s.for_saving then Location.none else ext.ext_loc; } in cleanup_types (); diff --git a/typing/subst.mli b/typing/subst.mli index a197f82f..7f6870e9 100644 --- a/typing/subst.mli +++ b/typing/subst.mli @@ -51,6 +51,8 @@ val modtype: t -> module_type -> module_type val signature: t -> signature -> signature val modtype_declaration: t -> modtype_declaration -> modtype_declaration val module_declaration: t -> module_declaration -> module_declaration +val typexp : t -> Types.type_expr -> Types.type_expr +val class_signature: t -> class_signature -> class_signature (* Composition of substitutions: apply (compose s1 s2) x = apply s2 (apply s1 x) *) diff --git a/typing/typeclass.ml b/typing/typeclass.ml index 33b776be..a29ddddb 100644 --- a/typing/typeclass.ml +++ b/typing/typeclass.ml @@ -944,7 +944,7 @@ and class_expr cl_num val_env met_env scl = | _ -> true in let partial = - Parmatch.check_partial pat.pat_loc + Typecore.check_partial val_env pat.pat_type pat.pat_loc [{c_lhs=pat; c_guard=None; c_rhs = (* Dummy expression *) diff --git a/typing/typecore.ml b/typing/typecore.ml index b173d99c..95af7ae6 100644 --- a/typing/typecore.ml +++ b/typing/typecore.ml @@ -282,6 +282,7 @@ let extract_concrete_record env ty = let extract_concrete_variant env ty = match extract_concrete_typedecl env ty with (p0, p, {type_kind=Type_variant cstrs}) -> (p0, p, cstrs) + | (p0, p, {type_kind=Type_open}) -> (p0, p, []) | _ -> raise Not_found let extract_label_names sexp env ty = @@ -887,7 +888,7 @@ let unify_head_only loc env ty constr = | Tconstr(p,args,m) -> ty_res.desc <- Tconstr(p,List.map (fun _ -> newvar ()) args,m); enforce_constraints env ty_res; - unify_pat_types loc env ty ty_res + unify_pat_types loc env ty_res ty | _ -> assert false (* Typing of patterns *) @@ -1241,6 +1242,9 @@ let partial_pred ~lev env expected_ty constrs labels p = backtrack snap; None +let check_partial ?(lev=get_current_level ()) env expected_ty = + Parmatch.check_partial_gadt (partial_pred ~lev env expected_ty) + let rec iter3 f lst1 lst2 lst3 = match lst1,lst2,lst3 with | x1::xs1,x2::xs2,x3::xs3 -> @@ -2859,6 +2863,7 @@ and type_format loc str env = | Bool_ty rest -> mk_constr "Bool_ty" [ mk_fmtty rest ] | Alpha_ty rest -> mk_constr "Alpha_ty" [ mk_fmtty rest ] | Theta_ty rest -> mk_constr "Theta_ty" [ mk_fmtty rest ] + | Any_ty rest -> mk_constr "Any_ty" [ mk_fmtty rest ] | Reader_ty rest -> mk_constr "Reader_ty" [ mk_fmtty rest ] | Ignored_reader_ty rest -> mk_constr "Ignored_reader_ty" [ mk_fmtty rest ] @@ -2978,6 +2983,10 @@ and type_format loc str env = mk_constr "Ignored_param" [ mk_ignored ign; mk_fmt rest ] | End_of_format -> mk_constr "End_of_format" [] + | Custom _ -> + (* Custom formatters have no syntax so they will never appear + in formats parsed from strings. *) + assert false in let legacy_behavior = not !Clflags.strict_formats in let Fmt_EBB fmt = fmt_ebb_of_string ~legacy_behavior str in @@ -3518,7 +3527,7 @@ and type_cases ?in_function env ty_arg ty_res partial_flag loc caselist = end; let partial = if partial_flag then - Parmatch.check_partial_gadt (partial_pred ~lev env ty_arg) loc cases + check_partial ~lev env ty_arg loc cases else Partial in @@ -3696,7 +3705,8 @@ and type_let ?(check = fun s -> Warnings.Unused_var s) Location.prerr_warning (List.hd spat_sexp_list).pvb_pat.ppat_loc Warnings.Unused_rec_flag; List.iter2 - (fun pat exp -> ignore(Parmatch.check_partial pat.pat_loc [case pat exp])) + (fun pat exp -> + ignore(check_partial env pat.pat_type pat.pat_loc [case pat exp])) pat_list exp_list; end_def(); List.iter2 diff --git a/typing/typecore.mli b/typing/typecore.mli index 4ce6b1fc..ee16c3b7 100644 --- a/typing/typecore.mli +++ b/typing/typecore.mli @@ -41,6 +41,9 @@ val type_self_pattern: (Ident.t * Asttypes.mutable_flag * Asttypes.virtual_flag * type_expr) Vars.t ref * Env.t * Env.t * Env.t +val check_partial: + ?lev:int -> Env.t -> type_expr -> + Location.t -> Typedtree.case list -> Typedtree.partial val type_expect: ?in_function:(Location.t * type_expr) -> Env.t -> Parsetree.expression -> type_expr -> Typedtree.expression diff --git a/typing/typedecl.ml b/typing/typedecl.ml index ecad00f3..2fdda9dc 100644 --- a/typing/typedecl.ml +++ b/typing/typedecl.ml @@ -512,7 +512,7 @@ let check_well_founded env loc path to_check ty = (* Will be detected by check_recursion *) Btype.backtrack snap in - check ty TypeSet.empty ty + Ctype.wrap_trace_gadt_instances env (check ty TypeSet.empty) ty let check_well_founded_manifest env loc path decl = if decl.type_manifest = None then () else @@ -969,8 +969,8 @@ let name_recursion sdecl id decl = else decl | _ -> decl -(* Translate a set of mutually recursive type declarations *) -let transl_type_decl env sdecl_list = +(* Translate a set of type declarations, mutually recursive or not *) +let transl_type_decl env rec_flag sdecl_list = (* Add dummy types for fixed rows *) let fixed_types = List.filter is_fixed_type sdecl_list in let sdecl_list = @@ -996,29 +996,35 @@ let transl_type_decl env sdecl_list = Ctype.init_def(Ident.current_time()); Ctype.begin_def(); (* Enter types. *) - let temp_env = List.fold_left2 enter_type env sdecl_list id_list in + let temp_env = + match rec_flag with + | Asttypes.Nonrecursive -> env + | Asttypes.Recursive -> List.fold_left2 enter_type env sdecl_list id_list + in (* Translate each declaration. *) let current_slot = ref None in let warn_unused = Warnings.is_active (Warnings.Unused_type_declaration "") in let id_slots id = - if not warn_unused then id, None - else - (* See typecore.ml for a description of the algorithm used - to detect unused declarations in a set of recursive definitions. *) - let slot = ref [] in - let td = Env.find_type (Path.Pident id) temp_env in - let name = Ident.name id in - Env.set_type_used_callback - name td - (fun old_callback -> - match !current_slot with - | Some slot -> slot := (name, td) :: !slot - | None -> - List.iter (fun (name, d) -> Env.mark_type_used env name d) - (get_ref slot); - old_callback () - ); - id, Some slot + match rec_flag with + | Asttypes.Recursive when warn_unused -> + (* See typecore.ml for a description of the algorithm used + to detect unused declarations in a set of recursive definitions. *) + let slot = ref [] in + let td = Env.find_type (Path.Pident id) temp_env in + let name = Ident.name id in + Env.set_type_used_callback + name td + (fun old_callback -> + match !current_slot with + | Some slot -> slot := (name, td) :: !slot + | None -> + List.iter (fun (name, d) -> Env.mark_type_used env name d) + (get_ref slot); + old_callback () + ); + id, Some slot + | Asttypes.Recursive | Asttypes.Nonrecursive -> + id, None in let transl_declaration name_sdecl (id, slot) = current_slot := slot; transl_declaration temp_env name_sdecl id in @@ -1036,9 +1042,13 @@ let transl_type_decl env sdecl_list = decls env in (* Update stubs *) - List.iter2 - (fun id sdecl -> update_type temp_env newenv id sdecl.ptype_loc) - id_list sdecl_list; + begin match rec_flag with + | Asttypes.Nonrecursive -> () + | Asttypes.Recursive -> + List.iter2 + (fun id sdecl -> update_type temp_env newenv id sdecl.ptype_loc) + id_list sdecl_list + end; (* Generalize type declarations. *) Ctype.end_def(); List.iter (fun (_, decl) -> generalize_decl decl) decls; diff --git a/typing/typedecl.mli b/typing/typedecl.mli index 45267495..8be29fe2 100644 --- a/typing/typedecl.mli +++ b/typing/typedecl.mli @@ -16,7 +16,7 @@ open Types open Format val transl_type_decl: - Env.t -> Parsetree.type_declaration list -> + Env.t -> Asttypes.rec_flag -> Parsetree.type_declaration list -> Typedtree.type_declaration list * Env.t val transl_exception: diff --git a/typing/typedtreeIter.ml b/typing/typedtreeIter.ml index 3d1a19fa..4b829067 100644 --- a/typing/typedtreeIter.ml +++ b/typing/typedtreeIter.ml @@ -23,7 +23,6 @@ module type IteratorArgument = sig val enter_structure : structure -> unit val enter_value_description : value_description -> unit - val enter_type_declaration : type_declaration -> unit val enter_type_extension : type_extension -> unit val enter_extension_constructor : extension_constructor -> unit val enter_pattern : pattern -> unit @@ -50,7 +49,6 @@ module type IteratorArgument = sig val leave_structure : structure -> unit val leave_value_description : value_description -> unit - val leave_type_declaration : type_declaration -> unit val leave_type_extension : type_extension -> unit val leave_extension_constructor : extension_constructor -> unit val leave_pattern : pattern -> unit @@ -79,6 +77,11 @@ module type IteratorArgument = sig val leave_binding : value_binding -> unit val leave_bindings : rec_flag -> unit + val enter_type_declarations : rec_flag -> unit + val enter_type_declaration : type_declaration -> unit + val leave_type_declaration : type_declaration -> unit + val leave_type_declarations : rec_flag -> unit + end module MakeIterator(Iter : IteratorArgument) : sig @@ -133,7 +136,7 @@ module MakeIterator(Iter : IteratorArgument) : sig | Tstr_value (rec_flag, list) -> iter_bindings rec_flag list | Tstr_primitive vd -> iter_value_description vd - | Tstr_type list -> List.iter iter_type_declaration list + | Tstr_type list -> iter_type_declarations list | Tstr_typext tyext -> iter_type_extension tyext | Tstr_exception ext -> iter_extension_constructor ext | Tstr_module x -> iter_module_binding x @@ -188,6 +191,21 @@ module MakeIterator(Iter : IteratorArgument) : sig option iter_core_type decl.typ_manifest; Iter.leave_type_declaration decl + and iter_type_declarations decls = + let rec_flag = + let is_nonrec = + List.exists + (fun td -> + List.exists (fun (n, _) -> n.txt = "nonrec") + td.typ_attributes) + decls + in + if is_nonrec then Nonrecursive else Recursive + in + Iter.enter_type_declarations rec_flag; + List.iter iter_type_declaration decls; + Iter.leave_type_declarations rec_flag + and iter_extension_constructor ext = Iter.enter_extension_constructor ext; begin match ext.ext_kind with @@ -353,7 +371,7 @@ module MakeIterator(Iter : IteratorArgument) : sig Tsig_value vd -> iter_value_description vd | Tsig_type list -> - List.iter iter_type_declaration list + iter_type_declarations list | Tsig_exception ext -> iter_extension_constructor ext | Tsig_typext tyext -> @@ -590,7 +608,6 @@ module DefaultIteratorArgument = struct let enter_structure _ = () let enter_value_description _ = () - let enter_type_declaration _ = () let enter_type_extension _ = () let enter_extension_constructor _ = () let enter_pattern _ = () @@ -618,7 +635,6 @@ module DefaultIteratorArgument = struct let leave_structure _ = () let leave_value_description _ = () - let leave_type_declaration _ = () let leave_type_extension _ = () let leave_extension_constructor _ = () let leave_pattern _ = () @@ -649,4 +665,9 @@ module DefaultIteratorArgument = struct let enter_bindings _ = () let leave_bindings _ = () - end + let enter_type_declaration _ = () + let leave_type_declaration _ = () + + let enter_type_declarations _ = () + let leave_type_declarations _ = () +end diff --git a/typing/typedtreeIter.mli b/typing/typedtreeIter.mli index 547fc5c3..921afb7d 100644 --- a/typing/typedtreeIter.mli +++ b/typing/typedtreeIter.mli @@ -17,7 +17,6 @@ open Typedtree module type IteratorArgument = sig val enter_structure : structure -> unit val enter_value_description : value_description -> unit - val enter_type_declaration : type_declaration -> unit val enter_type_extension : type_extension -> unit val enter_extension_constructor : extension_constructor -> unit val enter_pattern : pattern -> unit @@ -44,7 +43,6 @@ module type IteratorArgument = sig val leave_structure : structure -> unit val leave_value_description : value_description -> unit - val leave_type_declaration : type_declaration -> unit val leave_type_extension : type_extension -> unit val leave_extension_constructor : extension_constructor -> unit val leave_pattern : pattern -> unit @@ -73,6 +71,11 @@ module type IteratorArgument = sig val leave_binding : value_binding -> unit val leave_bindings : rec_flag -> unit + val enter_type_declarations : rec_flag -> unit + val enter_type_declaration : type_declaration -> unit + val leave_type_declaration : type_declaration -> unit + val leave_type_declarations : rec_flag -> unit + end module MakeIterator : diff --git a/typing/typemod.ml b/typing/typemod.ml index a053d53a..bd5ed813 100644 --- a/typing/typemod.ml +++ b/typing/typemod.ml @@ -120,15 +120,16 @@ let rec make_params n = function [] -> [] | _ :: l -> ("a" ^ string_of_int n) :: make_params (n+1) l -let make_next_first rs rem = - if rs = Trec_first then - match rem with - Sig_type (id, decl, Trec_next) :: rem -> - Sig_type (id, decl, Trec_first) :: rem - | Sig_module (id, mty, Trec_next) :: rem -> - Sig_module (id, mty, Trec_first) :: rem - | _ -> rem - else rem +let update_rec_next rs rem = + match rs with + Trec_next -> rem + | Trec_first | Trec_not -> + match rem with + Sig_type (id, decl, Trec_next) :: rem -> + Sig_type (id, decl, rs) :: rem + | Sig_module (id, mty, Trec_next) :: rem -> + Sig_module (id, mty, rs) :: rem + | _ -> rem let sig_item desc typ env loc = { Typedtree.sig_desc = desc; sig_loc = loc; sig_env = env @@ -207,7 +208,7 @@ let merge_constraint initial_env loc sg constr = check_type_decl env sdecl.ptype_loc id row_id newdecl decl rs rem; real_id := Some id; (Pident id, lid, Twith_typesubst tdecl), - make_next_first rs rem + update_rec_next rs rem | (Sig_module(id, md, rs) :: rem, [s], Pwith_module (_, lid')) when Ident.name id = s -> let path, md' = Typetexp.find_module initial_env loc lid'.txt in @@ -223,7 +224,7 @@ let merge_constraint initial_env loc sg constr = ignore(Includemod.modtypes env newmd.md_type md.md_type); real_id := Some id; (Pident id, lid, Twith_modsubst (path, lid')), - make_next_first rs rem + update_rec_next rs rem | (Sig_module(id, md, rs) :: rem, s :: namelist, _) when Ident.name id = s -> let ((path, path_loc, tcstr), newsg) = @@ -284,20 +285,35 @@ let map_rec fn decls rem = | [] -> rem | d1 :: dl -> fn Trec_first d1 :: map_end (fn Trec_next) dl rem -let map_rec' = map_rec -(* -let rec map_rec' fn decls rem = +let map_rec_type ~rec_flag fn decls rem = match decls with - | (id,_ as d1) :: dl when Btype.is_row_name (Ident.name id) -> - fn Trec_not d1 :: map_rec' fn dl rem - | _ -> map_rec fn decls rem -*) + | [] -> rem + | d1 :: dl -> + let first = + match rec_flag with + | Recursive -> Trec_first + | Nonrecursive -> Trec_not + in + fn first d1 :: map_end (fn Trec_next) dl rem -let rec map_rec'' fn decls rem = +let rec map_rec_type_with_row_types ~rec_flag fn decls rem = match decls with - | d1 :: dl when Btype.is_row_name (Ident.name d1.typ_id) -> - fn Trec_not d1 :: map_rec'' fn dl rem - | _ -> map_rec fn decls rem + | [] -> rem + | d1 :: dl -> + if Btype.is_row_name (Ident.name d1.typ_id) then + fn Trec_not d1 :: map_rec_type_with_row_types ~rec_flag fn dl rem + else + map_rec_type ~rec_flag fn decls rem + +let rec_flag_of_ptype_declarations tds = + let is_nonrec = + List.exists + (fun td -> + List.exists (fun (n, _) -> n.txt = "nonrec") + td.ptype_attributes) + tds + in + if is_nonrec then Nonrecursive else Recursive (* Add type extension flags to extension contructors *) let map_ext fn exts rem = @@ -348,9 +364,11 @@ and approx_sig env ssg = | item :: srem -> match item.psig_desc with | Psig_type sdecls -> + let rec_flag = rec_flag_of_ptype_declarations sdecls in let decls = Typedecl.approx_type_decl env sdecls in let rem = approx_sig env srem in - map_rec' (fun rs (id, info) -> Sig_type(id, info, rs)) decls rem + map_rec_type ~rec_flag + (fun rs (id, info) -> Sig_type(id, info, rs)) decls rem | Psig_module pmd -> let md = approx_module_declaration env pmd in let (id, newenv) = @@ -561,15 +579,16 @@ and transl_signature env sg = else Sig_value(tdesc.val_id, tdesc.val_val) :: rem), final_env | Psig_type sdecls -> + let rec_flag = rec_flag_of_ptype_declarations sdecls in List.iter (fun decl -> check_name "type" type_names decl.ptype_name) sdecls; - let (decls, newenv) = Typedecl.transl_type_decl env sdecls in + let (decls, newenv) = Typedecl.transl_type_decl env rec_flag sdecls in let (trem, rem, final_env) = transl_sig newenv srem in mksig (Tsig_type decls) env loc :: trem, - map_rec'' (fun rs td -> - Sig_type(td.typ_id, td.typ_type, rs)) decls rem, + map_rec_type_with_row_types ~rec_flag + (fun rs td -> Sig_type(td.typ_id, td.typ_type, rs)) decls rem, final_env | Psig_typext styext -> let (tyext, newenv) = @@ -851,6 +870,9 @@ let rec path_of_module mexp = path_of_module mexp | _ -> raise Not_a_path +let path_of_module mexp = + try Some (path_of_module mexp) with Not_a_path -> None + (* Check that all core type schemes in a structure are closed *) let rec closed_modtype = function @@ -1115,7 +1137,7 @@ let rec type_module ?(alias=false) sttn funct_body anchor env smod = mod_loc = smod.pmod_loc } | Pmod_apply(sfunct, sarg) -> let arg = type_module true funct_body None env sarg in - let path = try Some (path_of_module arg) with Not_a_path -> None in + let path = path_of_module arg in let funct = type_module (sttn && path <> None) funct_body None env sfunct in begin match Env.scrape_alias env funct.mod_type with @@ -1235,12 +1257,14 @@ and type_structure ?(toplevel = false) funct_body anchor env sstr scope = let (desc, newenv) = Typedecl.transl_value_decl env loc sdesc in Tstr_primitive desc, [Sig_value(desc.val_id, desc.val_val)], newenv | Pstr_type sdecls -> + let rec_flag = rec_flag_of_ptype_declarations sdecls in List.iter (fun decl -> check_name "type" type_names decl.ptype_name) sdecls; - let (decls, newenv) = Typedecl.transl_type_decl env sdecls in + let (decls, newenv) = Typedecl.transl_type_decl env rec_flag sdecls in Tstr_type decls, - map_rec'' (fun rs info -> Sig_type(info.typ_id, info.typ_type, rs)) + map_rec_type_with_row_types ~rec_flag + (fun rs info -> Sig_type(info.typ_id, info.typ_type, rs)) decls [], enrich_type_decls anchor decls env newenv | Pstr_typext styext -> diff --git a/typing/typemod.mli b/typing/typemod.mli index 88950178..9f8e6170 100644 --- a/typing/typemod.mli +++ b/typing/typemod.mli @@ -35,9 +35,13 @@ val check_nongen_schemes: val type_open_: ?toplevel:bool -> Asttypes.override_flag -> Env.t -> Location.t -> Longident.t Asttypes.loc -> Path.t * Env.t - +val modtype_of_package: + Env.t -> Location.t -> + Path.t -> Longident.t list -> type_expr list -> module_type val simplify_signature: signature -> signature +val path_of_module : Typedtree.module_expr -> Path.t option + val save_signature: string -> Typedtree.signature -> string -> string -> Env.t -> Types.signature_item list -> unit diff --git a/typing/types.ml b/typing/types.ml index 8d3982ed..6ab98419 100644 --- a/typing/types.ml +++ b/typing/types.ml @@ -297,9 +297,9 @@ and modtype_declaration = } and rec_status = - Trec_not (* not recursive *) + Trec_not (* first in a nonrecursive group *) | Trec_first (* first in a recursive group *) - | Trec_next (* not first in a recursive group *) + | Trec_next (* not first in a recursive/nonrecursive group *) and ext_status = Text_first (* first constructor of an extension *) diff --git a/typing/types.mli b/typing/types.mli index c3999826..fd7ef100 100644 --- a/typing/types.mli +++ b/typing/types.mli @@ -287,9 +287,9 @@ and modtype_declaration = } and rec_status = - Trec_not (* not recursive *) + Trec_not (* first in a nonrecursive group *) | Trec_first (* first in a recursive group *) - | Trec_next (* not first in a recursive group *) + | Trec_next (* not first in a recursive/nonrecursive group *) and ext_status = Text_first (* first constructor in an extension *) diff --git a/typing/typetexp.ml b/typing/typetexp.ml index 523d435b..605366bc 100644 --- a/typing/typetexp.ml +++ b/typing/typetexp.ml @@ -240,6 +240,7 @@ let find_class env loc lid = r let find_value env loc lid = + Env.check_value_name (Longident.last lid) loc; let (path, decl) as r = find_component Env.lookup_value (fun lid -> Unbound_value lid) env loc lid in diff --git a/utils/ccomp.ml b/utils/ccomp.ml index bbc8e3f0..5871f689 100644 --- a/utils/ccomp.ml +++ b/utils/ccomp.ml @@ -51,13 +51,14 @@ let quote_optfile = function let compile_file name = command (Printf.sprintf - "%s -c %s %s %s %s" + "%s -c %s %s %s %s %s" (match !Clflags.c_compiler with | Some cc -> cc | None -> if !Clflags.native_code then Config.native_c_compiler else Config.bytecomp_c_compiler) + (if !Clflags.debug then "-g" else "") (String.concat " " (List.rev !Clflags.all_ccopts)) (quote_prefixed "-I" (List.rev !Clflags.include_dirs)) (Clflags.std_include_flag "-I") @@ -97,14 +98,22 @@ type link_mode = | MainDll | Partial +let remove_Wl cclibs = + cclibs |> List.map (fun cclib -> + (* -Wl,-foo,bar -> -foo bar *) + if String.length cclib >= 4 && "-Wl," = String.sub cclib 0 4 then + String.map (function ',' -> ' ' | c -> c) + (String.sub cclib 4 (String.length cclib - 4)) + else cclib) + let call_linker mode output_name files extra = - let files = quote_files files in let cmd = if mode = Partial then - Printf.sprintf "%s%s %s %s" + Printf.sprintf "%s%s %s %s %s" Config.native_pack_linker (Filename.quote output_name) - files + (quote_prefixed "-L" !Config.load_path) + (quote_files (remove_Wl files)) extra else Printf.sprintf "%s -o %s %s %s %s %s %s %s" @@ -120,7 +129,7 @@ let call_linker mode output_name files extra = "" (*(Clflags.std_include_flag "-I")*) (quote_prefixed "-L" !Config.load_path) (String.concat " " (List.rev !Clflags.all_ccopts)) - files + (quote_files files) extra in command cmd = 0 diff --git a/utils/clflags.ml b/utils/clflags.ml index 57834ccf..864d6888 100644 --- a/utils/clflags.ml +++ b/utils/clflags.ml @@ -26,8 +26,10 @@ and debug = ref false (* -g *) and fast = ref false (* -unsafe *) and link_everything = ref false (* -linkall *) and custom_runtime = ref false (* -custom *) +and no_check_prims = ref false (* -no-check-prims *) and bytecode_compatible_32 = ref false (* -compat-32 *) and output_c_object = ref false (* -output-obj *) +and output_complete_object = ref false (* -output-complete-obj *) and all_ccopts = ref ([] : string list) (* -ccopt *) and classic = ref false (* -nolabels *) and nopervasives = ref false (* -nopervasives *) @@ -108,5 +110,6 @@ let dlcode = ref true (* not -nodynlink *) let runtime_variant = ref "";; (* -runtime-variant *) +let keep_docs = ref false (* -keep-docs *) let keep_locs = ref false (* -keep-locs *) let unsafe_string = ref true;; (* -safe-string / -unsafe-string *) diff --git a/utils/clflags.mli b/utils/clflags.mli index 7e51cf33..aeed7d97 100644 --- a/utils/clflags.mli +++ b/utils/clflags.mli @@ -23,8 +23,10 @@ val debug : bool ref val fast : bool ref val link_everything : bool ref val custom_runtime : bool ref +val no_check_prims : bool ref val bytecode_compatible_32 : bool ref val output_c_object : bool ref +val output_complete_object : bool ref val all_ccopts : string list ref val classic : bool ref val nopervasives : bool ref @@ -91,6 +93,7 @@ val shared : bool ref val dlcode : bool ref val runtime_variant : string ref val force_slash : bool ref +val keep_docs : bool ref val keep_locs : bool ref val unsafe_string : bool ref val opaque : bool ref diff --git a/utils/misc.ml b/utils/misc.ml index 2eb8088e..2e785327 100644 --- a/utils/misc.ml +++ b/utils/misc.ml @@ -202,6 +202,17 @@ let search_substring pat str start = else search (i+1) 0 in search start 0 +let replace_substring ~before ~after str = + let rec search acc curr = + match search_substring before str curr with + | next -> + let prefix = String.sub str curr (next - curr) in + search (prefix :: acc) (next + String.length before) + | exception Not_found -> + let suffix = String.sub str curr (String.length str - curr) in + List.rev (suffix :: acc) + in String.concat after (search [] 0) + let rev_split_words s = let rec split1 res i = if i >= String.length s then res else begin diff --git a/utils/misc.mli b/utils/misc.mli index 5168a6a9..cec1b80b 100644 --- a/utils/misc.mli +++ b/utils/misc.mli @@ -101,6 +101,10 @@ val search_substring: string -> string -> int -> int at offset [start] in [str]. Raise [Not_found] if [pat] does not occur. *) +val replace_substring: before:string -> after:string -> string -> string + (* [search_substring ~before ~after str] replaces all occurences + of [before] with [after] in [str] and returns the resulting string. *) + val rev_split_words: string -> string list (* [rev_split_words s] splits [s] in blank-separated words, and return the list of words in reverse order. *) diff --git a/utils/warnings.ml b/utils/warnings.ml index 103789c4..a613b934 100644 --- a/utils/warnings.ml +++ b/utils/warnings.ml @@ -67,6 +67,7 @@ type t = | Attribute_payload of string * string (* 47 *) | Eliminated_optional_arguments of string list (* 48 *) | No_cmi_file of string (* 49 *) + | Bad_docstring of bool (* 50 *) ;; (* If you remove a warning, leave a hole in the numbering. NEVER change @@ -125,9 +126,10 @@ let number = function | Attribute_payload _ -> 47 | Eliminated_optional_arguments _ -> 48 | No_cmi_file _ -> 49 + | Bad_docstring _ -> 50 ;; -let last_warning_number = 49 +let last_warning_number = 50 (* Must be the max number returned by the [number] function. *) let letter = function @@ -240,7 +242,7 @@ let parse_options errflag s = current := {error; active} (* If you change these, don't forget to change them in man/ocamlc.m *) -let defaults_w = "+a-4-6-7-9-27-29-32..39-41..42-44-45-48";; +let defaults_w = "+a-4-6-7-9-27-29-32..39-41..42-44-45-48-50";; let defaults_warn_error = "-a";; let () = parse_options false defaults_w;; @@ -384,6 +386,9 @@ let message = function (String.concat ", " sl) | No_cmi_file s -> "no cmi file was found in path for module " ^ s + | Bad_docstring unattached -> + if unattached then "unattached documentation comment (ignored)" + else "ambiguous documentation comment" ;; let nerrors = ref 0;; @@ -391,19 +396,9 @@ let nerrors = ref 0;; let print ppf w = let msg = message w in let num = number w in - let newlines = ref 0 in - for i = 0 to String.length msg - 1 do - if msg.[i] = '\n' then incr newlines; - done; - let out_functions = Format.pp_get_formatter_out_functions ppf () in - let countnewline x = incr newlines; out_functions.Format.out_newline x in - Format.pp_set_formatter_out_functions ppf - {out_functions with Format.out_newline = countnewline}; Format.fprintf ppf "%d: %s" num msg; Format.pp_print_flush ppf (); - Format.pp_set_formatter_out_functions ppf out_functions; - if (!current).error.(num) then incr nerrors; - !newlines + if (!current).error.(num) then incr nerrors ;; exception Errors of int;; @@ -474,24 +469,25 @@ let descriptions = 43, "Nonoptional label applied as optional."; 44, "Open statement shadows an already defined identifier."; 45, "Open statement shadows an already defined label or constructor."; - 46, "Illegal environment variable."; + 46, "Error in environment variable."; 47, "Illegal attribute payload."; 48, "Implicit elimination of optional arguments."; - 49, "Absent cmi file when looking up module alias."; + 49, "Missing cmi file when looking up module alias."; + 50, "Unexpected documentation comment."; ] ;; let help_warnings () = List.iter (fun (i, s) -> Printf.printf "%3i %s\n" i s) descriptions; - print_endline " A All warnings."; + print_endline " A all warnings"; for i = Char.code 'b' to Char.code 'z' do let c = Char.chr i in match letter c with | [] -> () | [n] -> - Printf.printf " %c Synonym for warning %i.\n" (Char.uppercase c) n + Printf.printf " %c warning %i\n" (Char.uppercase c) n | l -> - Printf.printf " %c Set of warnings %s.\n" + Printf.printf " %c warnings %s.\n" (Char.uppercase c) (String.concat ", " (List.map string_of_int l)) done; diff --git a/utils/warnings.mli b/utils/warnings.mli index edfd732c..ffd943fa 100644 --- a/utils/warnings.mli +++ b/utils/warnings.mli @@ -62,6 +62,7 @@ type t = | Attribute_payload of string * string (* 47 *) | Eliminated_optional_arguments of string list (* 48 *) | No_cmi_file of string (* 49 *) + | Bad_docstring of bool (* 50 *) ;; val parse_options : bool -> string -> unit;; @@ -72,9 +73,7 @@ val is_error : t -> bool;; val defaults_w : string;; val defaults_warn_error : string;; -val print : formatter -> t -> int;; - (* returns the number of newlines in the printed string *) - +val print : formatter -> t -> unit;; exception Errors of int;; diff --git a/yacc/Makefile b/yacc/Makefile index f5b37e00..e7acf869 100644 --- a/yacc/Makefile +++ b/yacc/Makefile @@ -15,7 +15,7 @@ include ../config/Makefile CC=$(BYTECC) -CFLAGS=-O -DNDEBUG $(BYTECCCOMPOPTS) +CFLAGS=-DNDEBUG $(BYTECCCOMPOPTS) OBJS= closure.o error.o lalr.o lr0.o main.o mkpar.o output.o reader.o \ skeleton.o symtab.o verbose.o warshall.o diff --git a/yacc/Makefile.nt b/yacc/Makefile.nt index 32caa41e..9537365a 100644 --- a/yacc/Makefile.nt +++ b/yacc/Makefile.nt @@ -29,9 +29,7 @@ version.h : ../VERSION clean: rm -f *.$(O) ocamlyacc.exe *~ version.h -.SUFFIXES: .c .$(O) - -.c.$(O): +%.$(O): %.c $(BYTECC) -DNDEBUG -DNO_UNIX $(BYTECCCOMPOPTS) -c $< depend: -- 2.30.2

T#~fCoWHmTLEK@`@r!cNf*G8?L%ZhPhW2KSnSqi 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